[
  {
    "path": ".gitignore",
    "content": "*.ipch\r\n*.suo\r\n*.user\r\n*.sdf\r\n*.opensdf\r\n*.exe\r\n*.pdb\r\n*.vs\r\n*.VC.db\r\nbuild/bin/\r\nbuild/*.o\r\nbuild/*.log\r\nbuild/msvc16/*.log\r\nbuild/msvc16/obj/\r\nbuild/msvc15/*.log\r\nbuild/msvc15/obj/\r\nbuild/msvc14/*.log\r\nbuild/msvc14/obj/\r\nbuild/msvc12/*.log\r\nbuild/msvc12/obj/\r\nbuild/msvc11/*.log\r\nbuild/msvc11/obj/\r\nbuild/xcode/build/\r\n.idea/\r\ncmake-build*/\r\ntests/fuzztests/fuzztests.log\r\nbenchmarks/benchmarks.log\r\ntests/CDSChecker/*.o\r\ntests/CDSChecker/*.log\r\ntests/CDSChecker/model-checker/\r\ntests/relacy/freelist.exe\r\ntests/relacy/spmchash.exe\r\ntests/relacy/log.txt\r\n"
  },
  {
    "path": "CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.9)\nproject(concurrentqueue VERSION 1.0.0)\n\ninclude(GNUInstallDirs)\ninclude(CMakePackageConfigHelpers)\n\nadd_library(${PROJECT_NAME} INTERFACE)\n\ntarget_include_directories(${PROJECT_NAME} \n        INTERFACE \n                $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>\n                $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/>\n)\n\ninstall(TARGETS ${PROJECT_NAME} \n    EXPORT ${PROJECT_NAME}Targets\n)\n\nwrite_basic_package_version_file(\n        ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake\n    VERSION \n        ${PROJECT_VERSION}\n    COMPATIBILITY AnyNewerVersion\n    ARCH_INDEPENDENT\n)\n\nconfigure_package_config_file(${PROJECT_NAME}Config.cmake.in\n                ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake\n        INSTALL_DESTINATION \n                ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}/\n)\n\ninstall(EXPORT \n                ${PROJECT_NAME}Targets\n        FILE\n                ${PROJECT_NAME}Targets.cmake\n        NAMESPACE \n                \"${PROJECT_NAME}::\"\n        DESTINATION\n                ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}\n        COMPONENT\n                Devel\n)\n\ninstall(\n        FILES\n                ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake\n                ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake\n        DESTINATION\n                ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}\n        COMPONENT\n                Devel\n)\n\ninstall(\n        FILES \n                blockingconcurrentqueue.h \n                concurrentqueue.h \n                lightweightsemaphore.h \n                LICENSE.md\n        DESTINATION \n                ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/moodycamel\n)\n\nset(CPACK_PACKAGE_NAME ${PROJECT_NAME})\nset(CPACK_PACKAGE_VENDOR \"Cameron Desrochers <cameron@moodycamel.com>\")\nset(CPACK_PACKAGE_DESCRIPTION_SUMMARY \"An industrial-strength lock-free queue for C++.\")\nset(CPACK_PACKAGE_VERSION \"${PROJECT_VERSION}\")\nset(CPACK_PACKAGE_VERSION_MAJOR \"${PROJECT_VERSION_MAJOR}\")\nset(CPACK_PACKAGE_VERSION_MINOR \"${PROJECT_VERSION_MINOR}\")\nset(CPACK_PACKAGE_VERSION_PATCH \"${PROJECT_VERSION_PATCH}\")\nset(CPACK_DEBIAN_PACKAGE_MAINTAINER ${CPACK_PACKAGE_VENDOR})\nset(CPACK_GENERATOR \"RPM;DEB\")\n\ninclude(CPack)\n"
  },
  {
    "path": "LICENSE.md",
    "content": "This license file applies to everything in this repository except that which\nis explicitly annotated as being written by other authors, i.e. the Boost\nqueue (included in the benchmarks for comparison), Intel's TBB library (ditto),\ndlib::pipe (ditto),\nthe CDSChecker tool (used for verification), the Relacy model checker (ditto),\nand Jeff Preshing's semaphore implementation (used in the blocking queue) which\nhas a zlib license (embedded in lightweightsempahore.h).\n\n---\n\nSimplified BSD License:\n\nCopyright (c) 2013-2016, Cameron Desrochers.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n- Redistributions of source code must retain the above copyright notice, this list of\nconditions and the following disclaimer.\n- Redistributions in binary form must reproduce the above copyright notice, this list of\nconditions and the following disclaimer in the documentation and/or other materials\nprovided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL\nTHE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\nOF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\nHOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR\nTORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\nEVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n---\n\nI have also chosen to dual-license under the Boost Software License as an alternative to\nthe Simplified BSD license above:\n\nBoost Software License - Version 1.0 - August 17th, 2003\n\nPermission is hereby granted, free of charge, to any person or organization\nobtaining a copy of the software and accompanying documentation covered by\nthis license (the \"Software\") to use, reproduce, display, distribute,\nexecute, and transmit the Software, and to prepare derivative works of the\nSoftware, and to permit third-parties to whom the Software is furnished to\ndo so, all subject to the following:\n\nThe copyright notices in the Software and this entire statement, including\nthe above license grant, this restriction and the following disclaimer,\nmust be included in all copies of the Software, in whole or in part, and\nall derivative works of the Software, unless such copies or derivative\nworks are solely in the form of machine-executable object code generated by\na source language processor.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT\nSHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE\nFOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,\nARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\nDEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# moodycamel::ConcurrentQueue<T>\r\n\r\nAn industrial-strength lock-free queue for C++.\r\n\r\nNote: If all you need is a single-producer, single-consumer queue, I have [one of those too][spsc].\r\n\r\n## Features\r\n\r\n- Knock-your-socks-off [blazing fast performance][benchmarks].\r\n- Single-header implementation. Just drop it in your project.\r\n- Fully thread-safe lock-free queue. Use concurrently from any number of threads.\r\n- C++11 implementation -- elements are moved (instead of copied) where possible.\r\n- Templated, obviating the need to deal exclusively with pointers -- memory is managed for you.\r\n- No artificial limitations on element types or maximum count.\r\n- Memory can be allocated once up-front, or dynamically as needed.\r\n- Fully portable (no assembly; all is done through standard C++11 primitives).\r\n- Supports super-fast bulk operations.\r\n- Includes a low-overhead blocking version (BlockingConcurrentQueue).\r\n- Exception safe.\r\n\r\n## Reasons to use\r\n\r\nThere are not that many full-fledged lock-free queues for C++. Boost has one, but it's limited to objects with trivial\r\nassignment operators and trivial destructors, for example.\r\nIntel's TBB queue isn't lock-free, and requires trivial constructors too.\r\nThere're many academic papers that implement lock-free queues in C++, but usable source code is\r\nhard to find, and tests even more so.\r\n\r\nThis queue not only has less limitations than others (for the most part), but [it's also faster][benchmarks].\r\nIt's been fairly well-tested, and offers advanced features like **bulk enqueueing/dequeueing**\r\n(which, with my new design, is much faster than one element at a time, approaching and even surpassing\r\nthe speed of a non-concurrent queue even under heavy contention).\r\n\r\nIn short, there was a lock-free queue shaped hole in the C++ open-source universe, and I set out\r\nto fill it with the fastest, most complete, and well-tested design and implementation I could.\r\nThe result is `moodycamel::ConcurrentQueue` :-)\r\n\r\n## Reasons *not* to use\r\n\r\nThe fastest synchronization of all is the kind that never takes place. Fundamentally,\r\nconcurrent data structures require some synchronization, and that takes time. Every effort\r\nwas made, of course, to minimize the overhead, but if you can avoid sharing data between\r\nthreads, do so!\r\n\r\nWhy use concurrent data structures at all, then? Because they're gosh darn convenient! (And, indeed,\r\nsometimes sharing data concurrently is unavoidable.)\r\n\r\nMy queue is **not linearizable** (see the next section on high-level design). The foundations of\r\nits design assume that producers are independent; if this is not the case, and your producers\r\nco-ordinate amongst themselves in some fashion, be aware that the elements won't necessarily\r\ncome out of the queue in the same order they were put in *relative to the ordering formed by that co-ordination*\r\n(but they will still come out in the order they were put in by any *individual* producer). If this affects\r\nyour use case, you may be better off with another implementation; either way, it's an important limitation\r\nto be aware of.\r\n\r\nMy queue is also **not NUMA aware**, and does a lot of memory re-use internally, meaning it probably doesn't\r\nscale particularly well on NUMA architectures; however, I don't know of any other lock-free queue that *is*\r\nNUMA aware (except for [SALSA][salsa], which is very cool, but has no publicly available implementation that I know of).\r\n\r\nFinally, the queue is **not sequentially consistent**; there *is* a happens-before relationship between when an element is put\r\nin the queue and when it comes out, but other things (such as pumping the queue until it's empty) require more thought\r\nto get right in all eventualities, because explicit memory ordering may have to be done to get the desired effect. In other words,\r\nit can sometimes be difficult to use the queue correctly. This is why it's a good idea to follow the [samples][samples.md] where possible.\r\nOn the other hand, the upside of this lack of sequential consistency is better performance.\r\n\r\n## High-level design\r\n\r\nElements are stored internally using contiguous blocks instead of linked lists for better performance.\r\nThe queue is made up of a collection of sub-queues, one for each producer. When a consumer\r\nwants to dequeue an element, it checks all the sub-queues until it finds one that's not empty.\r\nAll of this is largely transparent to the user of the queue, however -- it mostly just works<sup>TM</sup>.\r\n\r\nOne particular consequence of this design, however, (which seems to be non-intuitive) is that if two producers\r\nenqueue at the same time, there is no defined ordering between the elements when they're later dequeued.\r\nNormally this is fine, because even with a fully linearizable queue there'd be a race between the producer\r\nthreads and so you couldn't rely on the ordering anyway. However, if for some reason you do extra explicit synchronization\r\nbetween the two producer threads yourself, thus defining a total order between enqueue operations, you might expect\r\nthat the elements would come out in the same total order, which is a guarantee my queue does not offer. At that\r\npoint, though, there semantically aren't really two separate producers, but rather one that happens to be spread\r\nacross multiple threads. In this case, you can still establish a total ordering with my queue by creating\r\na single producer token, and using that from both threads to enqueue (taking care to synchronize access to the token,\r\nof course, but there was already extra synchronization involved anyway).\r\n\r\nI've written a more detailed [overview of the internal design][blog], as well as [the full\r\nnitty-gritty details of the design][design], on my blog. Finally, the\r\n[source][source] itself is available for perusal for those interested in its implementation.\r\n\r\n## Basic use\r\n\r\nThe entire queue's implementation is contained in **one header**, [`concurrentqueue.h`][concurrentqueue.h].\r\nSimply download and include that to use the queue. The blocking version is in a separate header,\r\n[`blockingconcurrentqueue.h`][blockingconcurrentqueue.h], that depends on [`concurrentqueue.h`][concurrentqueue.h] and\r\n[`lightweightsemaphore.h`][lightweightsemaphore.h]. The implementation makes use of certain key C++11 features,\r\nso it requires a relatively recent compiler (e.g. VS2012+ or g++ 4.8; note that g++ 4.6 has a known bug with `std::atomic`\r\nand is thus not supported). The algorithm implementations themselves are platform independent.\r\n\r\nUse it like you would any other templated queue, with the exception that you can use\r\nit from many threads at once :-)\r\n\r\nSimple example:\r\n\r\n```C++\r\n#include \"concurrentqueue.h\"\r\n\r\nmoodycamel::ConcurrentQueue<int> q;\r\nq.enqueue(25);\r\n\r\nint item;\r\nbool found = q.try_dequeue(item);\r\nassert(found && item == 25);\r\n```\r\n\r\nDescription of basic methods:\r\n- `ConcurrentQueue(size_t initialSizeEstimate)`\r\n      Constructor which optionally accepts an estimate of the number of elements the queue will hold\r\n- `enqueue(T&& item)`\r\n      Enqueues one item, allocating extra space if necessary\r\n- `try_enqueue(T&& item)`\r\n      Enqueues one item, but only if enough memory is already allocated\r\n- `try_dequeue(T& item)`\r\n      Dequeues one item, returning true if an item was found or false if the queue appeared empty\r\n\r\nNote that it is up to the user to ensure that the queue object is completely constructed before\r\nbeing used by any other threads (this includes making the memory effects of construction\r\nvisible, possibly via a memory barrier). Similarly, it's important that all threads have\r\nfinished using the queue (and the memory effects have fully propagated) before it is\r\ndestructed.\r\n\r\nThere's usually two versions of each method, one \"explicit\" version that takes a user-allocated per-producer or\r\nper-consumer token, and one \"implicit\" version that works without tokens. Using the explicit methods is almost\r\nalways faster (though not necessarily by a huge factor). Apart from performance, the primary distinction between them\r\nis their sub-queue allocation behaviour for enqueue operations: Using the implicit enqueue methods causes an\r\nautomatically-allocated thread-local producer sub-queue to be allocated.\r\nExplicit producers, on the other hand, are tied directly to their tokens' lifetimes (but are recycled internally).\r\n\r\nIn order to avoid the number of sub-queues growing without bound, implicit producers are marked for reuse once\r\ntheir thread exits. However, this is not supported on all platforms. If using the queue from short-lived threads,\r\nit is recommended to use explicit producer tokens instead.\r\n\r\nFull API (pseudocode):\r\n\r\n\t# Allocates more memory if necessary\r\n\tenqueue(item) : bool\r\n\tenqueue(prod_token, item) : bool\r\n\tenqueue_bulk(item_first, count) : bool\r\n\tenqueue_bulk(prod_token, item_first, count) : bool\r\n\t\r\n\t# Fails if not enough memory to enqueue\r\n\ttry_enqueue(item) : bool\r\n\ttry_enqueue(prod_token, item) : bool\r\n\ttry_enqueue_bulk(item_first, count) : bool\r\n\ttry_enqueue_bulk(prod_token, item_first, count) : bool\r\n\t\r\n\t# Attempts to dequeue from the queue (never allocates)\r\n\ttry_dequeue(item&) : bool\r\n\ttry_dequeue(cons_token, item&) : bool\r\n\ttry_dequeue_bulk(item_first, max) : size_t\r\n\ttry_dequeue_bulk(cons_token, item_first, max) : size_t\r\n\t\r\n\t# If you happen to know which producer you want to dequeue from\r\n\ttry_dequeue_from_producer(prod_token, item&) : bool\r\n\ttry_dequeue_bulk_from_producer(prod_token, item_first, max) : size_t\r\n\t\r\n\t# A not-necessarily-accurate count of the total number of elements\r\n\tsize_approx() : size_t\r\n\r\n## Blocking version\r\n\r\nAs mentioned above, a full blocking wrapper of the queue is provided that adds\r\n`wait_dequeue` and `wait_dequeue_bulk` methods in addition to the regular interface.\r\nThis wrapper is extremely low-overhead, but slightly less fast than the non-blocking\r\nqueue (due to the necessary bookkeeping involving a lightweight semaphore).\r\n\r\nThere are also timed versions that allow a timeout to be specified (either in microseconds\r\nor with a `std::chrono` object).\r\n\r\nThe only major caveat with the blocking version is that you must be careful not to\r\ndestroy the queue while somebody is waiting on it. This generally means you need to\r\nknow for certain that another element is going to come along before you call one of\r\nthe blocking methods. (To be fair, the non-blocking version cannot be destroyed while\r\nin use either, but it can be easier to coordinate the cleanup.)\r\n\r\nBlocking example:\r\n\r\n```C++\r\n#include \"blockingconcurrentqueue.h\"\r\n\r\nmoodycamel::BlockingConcurrentQueue<int> q;\r\nstd::thread producer([&]() {\r\n    for (int i = 0; i != 100; ++i) {\r\n        std::this_thread::sleep_for(std::chrono::milliseconds(i % 10));\r\n        q.enqueue(i);\r\n    }\r\n});\r\nstd::thread consumer([&]() {\r\n    for (int i = 0; i != 100; ++i) {\r\n        int item;\r\n        q.wait_dequeue(item);\r\n        assert(item == i);\r\n        \r\n        if (q.wait_dequeue_timed(item, std::chrono::milliseconds(5))) {\r\n            ++i;\r\n            assert(item == i);\r\n        }\r\n    }\r\n});\r\nproducer.join();\r\nconsumer.join();\r\n\r\nassert(q.size_approx() == 0);\r\n```\r\n\r\n## Advanced features\r\n\r\n#### Tokens\r\n\r\nThe queue can take advantage of extra per-producer and per-consumer storage if\r\nit's available to speed up its operations. This takes the form of \"tokens\":\r\nYou can create a consumer token and/or a producer token for each thread or task\r\n(tokens themselves are not thread-safe), and use the methods that accept a token\r\nas their first parameter:\r\n\r\n```C++\r\nmoodycamel::ConcurrentQueue<int> q;\r\n\r\nmoodycamel::ProducerToken ptok(q);\r\nq.enqueue(ptok, 17);\r\n\r\nmoodycamel::ConsumerToken ctok(q);\r\nint item;\r\nq.try_dequeue(ctok, item);\r\nassert(item == 17);\r\n```\r\n\r\nIf you happen to know which producer you want to consume from (e.g. in\r\na single-producer, multi-consumer scenario), you can use the `try_dequeue_from_producer`\r\nmethods, which accept a producer token instead of a consumer token, and cut some overhead.\r\n\r\nNote that tokens work with the blocking version of the queue too.\r\n\r\nWhen producing or consuming many elements, the most efficient way is to:\r\n\r\n1. Use the bulk methods of the queue with tokens\r\n2. Failing that, use the bulk methods without tokens\r\n3. Failing that, use the single-item methods with tokens\r\n4. Failing that, use the single-item methods without tokens\r\n\r\nHaving said that, don't create tokens willy-nilly -- ideally there would be\r\none token (of each kind) per thread. The queue will work with what it is\r\ngiven, but it performs best when used with tokens.\r\n\r\nNote that tokens aren't actually tied to any given thread; it's not technically\r\nrequired that they be local to the thread, only that they be used by a single\r\nproducer/consumer at a time.\r\n\r\n#### Bulk operations\r\n\r\nThanks to the [novel design][blog] of the queue, it's just as easy to enqueue/dequeue multiple\r\nitems as it is to do one at a time. This means that overhead can be cut drastically for\r\nbulk operations. Example syntax:\r\n\r\n```C++\r\nmoodycamel::ConcurrentQueue<int> q;\r\n\r\nint items[] = { 1, 2, 3, 4, 5 };\r\nq.enqueue_bulk(items, 5);\r\n\r\nint results[5];     // Could also be any iterator\r\nsize_t count = q.try_dequeue_bulk(results, 5);\r\nfor (size_t i = 0; i != count; ++i) {\r\n    assert(results[i] == items[i]);\r\n}\r\n```\r\n\r\n#### Preallocation (correctly using `try_enqueue`)\r\n\r\n`try_enqueue`, unlike just plain `enqueue`, will never allocate memory. If there's not enough room in the\r\nqueue, it simply returns false. The key to using this method properly, then, is to ensure enough space is\r\npre-allocated for your desired maximum element count.\r\n\r\nThe constructor accepts a count of the number of elements that it should reserve space for. Because the\r\nqueue works with blocks of elements, however, and not individual elements themselves, the value to pass\r\nin order to obtain an effective number of pre-allocated element slots is non-obvious.\r\n\r\nFirst, be aware that the count passed is rounded up to the next multiple of the block size. Note that the\r\ndefault block size is 32 (this can be changed via the traits). Second, once a slot in a block has been\r\nenqueued to, that slot cannot be re-used until the rest of the block has been completely filled\r\nup and then completely emptied. This affects the number of blocks you need in order to account for the\r\noverhead of partially-filled blocks. Third, each producer (whether implicit or explicit) claims and recycles\r\nblocks in a different manner, which again affects the number of blocks you need to account for a desired number of\r\nusable slots.\r\n\r\nSuppose you want the queue to be able to hold at least `N` elements at any given time. Without delving too\r\ndeep into the rather arcane implementation details, here are some simple formulas for the number of elements\r\nto request for pre-allocation in such a case. Note the division is intended to be arithmetic division and not\r\ninteger division (in order for `ceil()` to work).\r\n\r\nFor explicit producers (using tokens to enqueue):\r\n\r\n```C++\r\n(ceil(N / BLOCK_SIZE) + 1) * MAX_NUM_PRODUCERS * BLOCK_SIZE\r\n```\r\n\r\nFor implicit producers (no tokens):\r\n\r\n```C++\r\n(ceil(N / BLOCK_SIZE) - 1 + 2 * MAX_NUM_PRODUCERS) * BLOCK_SIZE\r\n```\r\n\r\nWhen using mixed producer types:\r\n\r\n```C++\r\n((ceil(N / BLOCK_SIZE) - 1) * (MAX_EXPLICIT_PRODUCERS + 1) + 2 * (MAX_IMPLICIT_PRODUCERS + MAX_EXPLICIT_PRODUCERS)) * BLOCK_SIZE\r\n```\r\n\r\nIf these formulas seem rather inconvenient, you can use the constructor overload that accepts the minimum\r\nnumber of elements (`N`) and the maximum number of explicit and implicit producers directly, and let it do the\r\ncomputation for you.\r\n\r\nIn addition to blocks, there are other internal data structures that require allocating memory if they need to resize (grow).\r\nIf using `try_enqueue` exclusively, the initial sizes may be exceeded, causing subsequent `try_enqueue` operations to fail.\r\nSpecifically, the `INITIAL_IMPLICIT_PRODUCER_HASH_SIZE` trait limits the number of implicit producers that can be active at once\r\nbefore the internal hash needs resizing. Along the same lines, the `IMPLICIT_INITIAL_INDEX_SIZE` trait limits the number of\r\nunconsumed elements that an implicit producer can insert before its internal hash needs resizing. Similarly, the\r\n`EXPLICIT_INITIAL_INDEX_SIZE` trait limits the number of unconsumed elements that an explicit producer can insert before its\r\ninternal hash needs resizing. In order to avoid hitting these limits when using `try_enqueue`, it is crucial to adjust the\r\ninitial sizes in the traits appropriately, in addition to sizing the number of blocks properly as outlined above.\r\n\r\nFinally, it's important to note that because the queue is only eventually consistent and takes advantage of\r\nweak memory ordering for speed, there's always a possibility that under contention `try_enqueue` will fail\r\neven if the queue is correctly pre-sized for the desired number of elements. (e.g. A given thread may think that\r\nthe queue's full even when that's no longer the case.) So no matter what, you still need to handle the failure\r\ncase (perhaps looping until it succeeds), unless you don't mind dropping elements.\r\n\r\n#### Exception safety\r\n\r\nThe queue is exception safe, and will never become corrupted if used with a type that may throw exceptions.\r\nThe queue itself never throws any exceptions (operations fail gracefully (return false) if memory allocation\r\nfails instead of throwing `std::bad_alloc`).\r\n\r\nIt is important to note that the guarantees of exception safety only hold if the element type never throws\r\nfrom its destructor, and that any iterators passed into the queue (for bulk operations) never throw either.\r\nNote that in particular this means `std::back_inserter` iterators must be used with care, since the vector\r\nbeing inserted into may need to allocate and throw a `std::bad_alloc` exception from inside the iterator;\r\nso be sure to reserve enough capacity in the target container first if you do this.\r\n\r\nThe guarantees are presently as follows:\r\n- Enqueue operations are rolled back completely if an exception is thrown from an element's constructor.\r\n  For bulk enqueue operations, this means that elements are copied instead of moved (in order to avoid\r\n  having only some objects moved in the event of an exception). Non-bulk enqueues always use\r\n  the move constructor if one is available.\r\n- If the assignment operator throws during a dequeue operation (both single and bulk), the element(s) are\r\n  considered dequeued regardless. In such a case, the dequeued elements are all properly destructed before\r\n  the exception is propagated, but there's no way to get the elements themselves back.\r\n- Any exception that is thrown is propagated up the call stack, at which point the queue is in a consistent\r\n  state.\r\n\r\nNote: If any of your type's copy constructors/move constructors/assignment operators don't throw, be sure\r\nto annotate them with `noexcept`; this will avoid the exception-checking overhead in the queue where possible\r\n(even with zero-cost exceptions, there's still a code size impact that has to be taken into account).\r\n\r\n#### Traits\r\n\r\nThe queue also supports a traits template argument which defines various types, constants,\r\nand the memory allocation and deallocation functions that are to be used by the queue. The typical pattern\r\nto providing your own traits is to create a class that inherits from the default traits\r\nand override only the values you wish to change. Example:\r\n\r\n```C++\r\nstruct MyTraits : public moodycamel::ConcurrentQueueDefaultTraits\r\n{\r\n\tstatic const size_t BLOCK_SIZE = 256;\t\t// Use bigger blocks\r\n};\r\n\r\nmoodycamel::ConcurrentQueue<int, MyTraits> q;\r\n```\r\n\r\n#### How to dequeue types without calling the constructor\r\n\r\nThe normal way to dequeue an item is to pass in an existing object by reference, which\r\nis then assigned to internally by the queue (using the move-assignment operator if possible).\r\nThis can pose a problem for types that are\r\nexpensive to construct or don't have a default constructor; fortunately, there is a simple\r\nworkaround: Create a wrapper class that copies the memory contents of the object when it\r\nis assigned by the queue (a poor man's move, essentially). Note that this only works if\r\nthe object contains no internal pointers. Example:\r\n\r\n```C++\r\nstruct MyObjectMover {\r\n    inline void operator=(MyObject&& obj) {\r\n        std::memcpy(data, &obj, sizeof(MyObject));\r\n        \r\n        // TODO: Cleanup obj so that when it's destructed by the queue\r\n        // it doesn't corrupt the data of the object we just moved it into\r\n    }\r\n\r\n    inline MyObject& obj() { return *reinterpret_cast<MyObject*>(data); }\r\n\r\nprivate:\r\n    align(alignof(MyObject)) char data[sizeof(MyObject)];\r\n};\r\n```\r\n\r\nA less dodgy alternative, if moves are cheap but default construction is not, is to use a\r\nwrapper that defers construction until the object is assigned, enabling use of the move\r\nconstructor:\r\n\r\n```C++\r\nstruct MyObjectMover {\r\n    inline void operator=(MyObject&& x) {\r\n        new (data) MyObject(std::move(x));\r\n        created = true;\r\n    }\r\n\r\n    inline MyObject& obj() {\r\n        assert(created);\r\n        return *reinterpret_cast<MyObject*>(data);\r\n    }\r\n\r\n    ~MyObjectMover() {\r\n        if (created)\r\n            obj().~MyObject();\r\n    }\r\n\r\nprivate:\r\n    align(alignof(MyObject)) char data[sizeof(MyObject)];\r\n    bool created = false;\r\n};\r\n```\r\n\r\n## Samples\r\n\r\nThere are some more detailed samples [here][samples.md]. The source of\r\nthe [unit tests][unittest-src] and [benchmarks][benchmark-src] are available for reference as well.\r\n\r\n## Benchmarks\r\n\r\nSee my blog post for some [benchmark results][benchmarks] (including versus `boost::lockfree::queue` and `tbb::concurrent_queue`),\r\nor run the benchmarks yourself (requires MinGW and certain GnuWin32 utilities to build on Windows, or a recent\r\ng++ on Linux):\r\n\r\n```Shell\r\ncd build\r\nmake benchmarks\r\nbin/benchmarks\r\n```\r\n\r\nThe short version of the benchmarks is that it's so fast (especially the bulk methods), that if you're actually\r\nusing the queue to *do* anything, the queue won't be your bottleneck.\r\n\r\n## Tests (and bugs)\r\n\r\nI've written quite a few unit tests as well as a randomized long-running fuzz tester. I also ran the\r\ncore queue algorithm through the [CDSChecker][cdschecker] C++11 memory model model checker. Some of the\r\ninner algorithms were tested separately using the [Relacy][relacy] model checker, and full integration\r\ntests were also performed with Relacy.\r\nI've tested\r\non Linux (Fedora 19) and Windows (7), but only on x86 processors so far (Intel and AMD). The code was\r\nwritten to be platform-independent, however, and should work across all processors and OSes.\r\n\r\nDue to the complexity of the implementation and the difficult-to-test nature of lock-free code in general,\r\nthere may still be bugs. If anyone is seeing buggy behaviour, I'd like to hear about it! (Especially if\r\na unit test for it can be cooked up.) Just open an issue on GitHub.\r\n\t\r\n## Using vcpkg\r\nYou can download and install `moodycamel::ConcurrentQueue` using the [vcpkg](https://github.com/Microsoft/vcpkg) dependency manager:\r\n\r\n```Shell\r\ngit clone https://github.com/Microsoft/vcpkg.git\r\ncd vcpkg\r\n./bootstrap-vcpkg.sh\r\n./vcpkg integrate install\r\nvcpkg install concurrentqueue\r\n```\r\n\t\r\nThe `moodycamel::ConcurrentQueue` port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please [create an issue or pull request](https://github.com/Microsoft/vcpkg) on the vcpkg repository.\r\n\r\n## License\r\n\r\nI'm releasing the source of this repository (with the exception of third-party code, i.e. the Boost queue\r\n(used in the benchmarks for comparison), Intel's TBB library (ditto), CDSChecker, Relacy, and Jeff Preshing's\r\ncross-platform semaphore, which all have their own licenses)\r\nunder a simplified BSD license. I'm also dual-licensing under the Boost Software License.\r\nSee the [LICENSE.md][license] file for more details.\r\n\r\nNote that lock-free programming is a patent minefield, and this code may very\r\nwell violate a pending patent (I haven't looked), though it does not to my present knowledge.\r\nI did design and implement this queue from scratch.\r\n\r\n## Diving into the code\r\n\r\nIf you're interested in the source code itself, it helps to have a rough idea of how it's laid out. This\r\nsection attempts to describe that.\r\n\r\nThe queue is formed of several basic parts (listed here in roughly the order they appear in the source). There's the\r\nhelper functions (e.g. for rounding to a power of 2). There's the default traits of the queue, which contain the\r\nconstants and malloc/free functions used by the queue. There's the producer and consumer tokens. Then there's the queue's\r\npublic API itself, starting with the constructor, destructor, and swap/assignment methods. There's the public enqueue methods,\r\nwhich are all wrappers around a small set of private enqueue methods found later on. There's the dequeue methods, which are\r\ndefined inline and are relatively straightforward.\r\n\r\nThen there's all the main internal data structures. First, there's a lock-free free list, used for recycling spent blocks (elements\r\nare enqueued to blocks internally). Then there's the block structure itself, which has two different ways of tracking whether\r\nit's fully emptied or not (remember, given two parallel consumers, there's no way to know which one will finish first) depending on where it's used.\r\nThen there's a small base class for the two types of internal SPMC producer queues (one for explicit producers that holds onto memory\r\nbut attempts to be faster, and one for implicit ones which attempt to recycle more memory back into the parent but is a little slower).\r\nThe explicit producer is defined first, then the implicit one. They both contain the same general four methods: One to enqueue, one to\r\ndequeue, one to enqueue in bulk, and one to dequeue in bulk. (Obviously they have constructors and destructors too, and helper methods.)\r\nThe main difference between them is how the block handling is done (they both use the same blocks, but in different ways, and map indices\r\nto them in different ways).\r\n\r\nFinally, there's the miscellaneous internal methods: There's the ones that handle the initial block pool (populated when the queue is constructed),\r\nand an abstract block pool that comprises the initial pool and any blocks on the free list. There's ones that handle the producer list\r\n(a lock-free add-only linked list of all the producers in the system). There's ones that handle the implicit producer lookup table (which\r\nis really a sort of specialized TLS lookup). And then there's some helper methods for allocating and freeing objects, and the data members\r\nof the queue itself, followed lastly by the free-standing swap functions.\r\n\r\n\r\n[blog]: http://moodycamel.com/blog/2014/a-fast-general-purpose-lock-free-queue-for-c++\r\n[design]: http://moodycamel.com/blog/2014/detailed-design-of-a-lock-free-queue\r\n[samples.md]: https://github.com/cameron314/concurrentqueue/blob/master/samples.md\r\n[source]: https://github.com/cameron314/concurrentqueue\r\n[concurrentqueue.h]: https://github.com/cameron314/concurrentqueue/blob/master/concurrentqueue.h\r\n[blockingconcurrentqueue.h]: https://github.com/cameron314/concurrentqueue/blob/master/blockingconcurrentqueue.h\r\n[lightweightsemaphore.h]: https://github.com/cameron314/concurrentqueue/blob/master/lightweightsemaphore.h\r\n[unittest-src]: https://github.com/cameron314/concurrentqueue/tree/master/tests/unittests\r\n[benchmarks]: http://moodycamel.com/blog/2014/a-fast-general-purpose-lock-free-queue-for-c++#benchmarks\r\n[benchmark-src]: https://github.com/cameron314/concurrentqueue/tree/master/benchmarks\r\n[license]: https://github.com/cameron314/concurrentqueue/blob/master/LICENSE.md\r\n[cdschecker]: http://demsky.eecs.uci.edu/c11modelchecker.html\r\n[relacy]: http://www.1024cores.net/home/relacy-race-detector\r\n[spsc]: https://github.com/cameron314/readerwriterqueue\r\n[salsa]: https://iditkeidar.com/wp-content/uploads/files/ftp/spaa049-gidron.pdf\r\n"
  },
  {
    "path": "benchmarks/benchmarks.cpp",
    "content": "// ©2013-2014 Cameron Desrochers.\n// Distributed under the simplified BSD license (see the LICENSE file that\n// should have come with this file).\n\n// Benchmarks for moodycamel::ConcurrentQueue.\n// Provides comparative timings of various operations under\n// highly artificial circumstances. You've been warned :-)\n\n#include <cstdio>\n#include <cstring>\n#include <string>\n#include <cstdint>\n#include <cmath>\n#include <cstdarg>\n#include <fstream>\n#include <ctime>\n#include <random>\n#include <vector>\n#include <map>\n#include <cassert>\n#include <thread>\n#include <algorithm>\n#include <cctype>\n\n#include \"../blockingconcurrentqueue.h\"\n#include \"lockbasedqueue.h\"\n#include \"simplelockfree.h\"\n#include \"boostqueue.h\"\n\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wdeprecated-declarations\"\n// this uses an old version of OS memory fences on OSX\n#include \"tbbqueue.h\"\n#pragma clang diagnostic pop\n\n#include \"stdqueue.h\"\n#include \"dlibqueue.h\"\n#include \"../tests/common/simplethread.h\"\n#include \"../tests/common/systemtime.h\"\n#include \"cpuid.h\"\n\nusing namespace moodycamel;\n\n\ntypedef std::minstd_rand RNG_t;\n\nbool precise = false;\n\n\nenum benchmark_type_t\n{\n\tbench_balanced,\n\tbench_only_enqueue,\n\tbench_only_enqueue_prealloc,\n\tbench_only_enqueue_bulk,\n\tbench_only_enqueue_bulk_prealloc,\n\tbench_only_dequeue,\n\tbench_only_dequeue_bulk,\n\tbench_mostly_enqueue,\n\tbench_mostly_enqueue_bulk,\n\tbench_mostly_dequeue,\n\tbench_mostly_dequeue_bulk,\n\tbench_spmc,\n\tbench_spmc_preproduced,\n\tbench_mpsc,\n\tbench_empty_dequeue,\n\tbench_enqueue_dequeue_pairs,\n\tbench_heavy_concurrent,\n\t\n\tBENCHMARK_TYPE_COUNT\n};\n\nconst char BENCHMARK_SHORT_NAMES[BENCHMARK_TYPE_COUNT][32] = {\n\t\"balanced\",\n\t\"only_enqueue\",\n\t\"only_enqueue_prealloc\",\n\t\"only_enqueue_bulk\",\n\t\"only_enqueue_bulk_prealloc\",\n\t\"only_dequeue\",\n\t\"only_dequeue_bulk\",\n\t\"mostly_enqueue\",\n\t\"mostly_enqueue_bulk\",\n\t\"mostly_dequeue\",\n\t\"mostly_dequeue_bulk\",\n\t\"spmc\",\n\t\"spmc_preproduced\",\n\t\"mpsc\",\n\t\"empty_dequeue\",\n\t\"enqueue_dequeue_pairs\",\n\t\"heavy_concurrent\"\n};\n\nconst char BENCHMARK_NAMES[BENCHMARK_TYPE_COUNT][64] = {\n\t\"balanced\",\n\t\"only enqueue\",\n\t\"only enqueue (pre-allocated)\",\n\t\"only enqueue bulk\",\n\t\"only enqueue bulk (pre-allocated)\",\n\t\"only dequeue\",\n\t\"only dequeue bulk\",\n\t\"mostly enqueue\",\n\t\"mostly enqueue bulk\",\n\t\"mostly dequeue\",\n\t\"mostly dequeue bulk\",\n\t\"single-producer, multi-consumer\",\n\t\"single-producer, multi-consumer (pre-produced)\",\n\t\"multi-producer, single-consumer\",\n\t\"dequeue from empty\",\n\t\"enqueue-dequeue pairs\",\n\t\"heavy concurrent\"\n};\n\nconst char BENCHMARK_DESCS[BENCHMARK_TYPE_COUNT][256] = {\n\t\"Measures the average operation speed with multiple symmetrical threads\\n  under reasonable load -- small random intervals between accesses\",\n\t\"Measures the average operation speed when all threads are producers\",\n\t\"Measures the average operation speed when all threads are producers,\\n  and the queue has been stretched out first\",\n\t\"Measures the average speed of enqueueing an item in bulk when all threads are producers\",\n\t\"Measures the average speed of enqueueing an item in bulk when all threads are producers,\\n  and the queue has been stretched out first\",\n\t\"Measures the average operation speed when all threads are consumers\",\n\t\"Measures the average speed of dequeueing an item in bulk when all threads are consumers\",\n\t\"Measures the average operation speed when most threads are enqueueing\",\n\t\"Measures the average speed of enqueueing an item in bulk under light contention\",\n\t\"Measures the average operation speed when most threads are dequeueing\",\n\t\"Measures the average speed of dequeueing an item in bulk under light contention\",\n\t\"Measures the average speed of dequeueing with only one producer, but multiple consumers\",\n\t\"Measures the average speed of dequeueing from a queue pre-filled by one thread\",\n\t\"Measures the average speed of dequeueing with only one consumer, but multiple producers\",\n\t\"Measures the average speed of attempting to dequeue from an empty queue\\n  (that eight separate threads had at one point enqueued to)\",\n\t\"Measures the average operation speed with each thread doing an enqueue\\n  followed by a dequeue\",\n\t\"Measures the average operation speed with many threads under heavy load\"\n};\n\nconst char BENCHMARK_SINGLE_THREAD_NOTES[BENCHMARK_TYPE_COUNT][256] = {\n\t\"\",\n\t\"\",\n\t\"\",\n\t\"\",\n\t\"\",\n\t\"\",\n\t\"\",\n\t\"\",\n\t\"\",\n\t\"\",\n\t\"\",\n\t\"\",\n\t\"\",\n\t\"\",\n\t\"No contention -- measures raw failed dequeue speed on empty queue\",\n\t\"No contention -- measures speed of immediately dequeueing the item that was just enqueued\",\n\t\"\"\n};\n\nint BENCHMARK_THREADS_MEASURED[BENCHMARK_TYPE_COUNT] = {\n\t0,\t// measures nthreads\n\t0,\n\t0,\n\t0,\n\t0,\n\t0,\n\t0,\n\t0,\n\t0,\n\t0,\n\t0,\n\t-1,\t// nthreads - 1\n\t0,\n\t1,\t// 1\n\t0,\n\t0,\n\t0,\n};\n\nint BENCHMARK_THREADS[BENCHMARK_TYPE_COUNT][9] = {\n\t{ 2, 3, 4,  8, 12, 16, 32,  0, 0 },\n\t{ 1, 2, 4,  8, 12, 16, 32, 48, 0 },\n\t{ 1, 2, 4,  8, 32,  0,  0,  0, 0 },\n\t{ 1, 2, 4,  8, 12, 16, 32, 48, 0 },\n\t{ 1, 2, 4,  8, 32,  0,  0,  0, 0 },\n\t{ 1, 2, 4,  8, 12, 16, 32, 48, 0 },\n\t{ 1, 2, 4,  8, 12, 16, 32, 48, 0 },\n\t{ 2, 4, 8, 32,  0,  0,  0,  0, 0 },\n\t{ 2, 4, 8, 32,  0,  0,  0,  0, 0 },\n\t{ 2, 4, 8,  0,  0,  0,  0,  0, 0 },\n\t{ 2, 4, 8,  0,  0,  0,  0,  0, 0 },\n\t{ 2, 4, 8, 16,  0,  0,  0,  0, 0 },\n\t{ 1, 3, 7, 15,  0,  0,  0,  0, 0 },\n\t{ 2, 4, 8, 16,  0,  0,  0,  0, 0 },\n\t{ 1, 2, 8, 32,  0,  0,  0,  0, 0 },\n\t{ 1, 2, 4,  8, 32,  0,  0,  0, 0 },\n\t{ 2, 3, 4,  8, 12, 16, 32, 48, 0 },\n};\n\nenum queue_id_t\n{\n\tqueue_moodycamel_ConcurrentQueue,\n\tqueue_moodycamel_BlockingConcurrentQueue,\n\tqueue_boost,\n\tqueue_tbb,\n\tqueue_simplelockfree,\n\tqueue_lockbased,\n\tqueue_std,\n\tqueue_dlib,\n\tQUEUE_COUNT\n};\n\nconst char QUEUE_NAMES[QUEUE_COUNT][64] = {\n\t\"moodycamel::ConcurrentQueue\",\n\t\"moodycamel::BlockingConcurrentQueue\",\n\t\"boost::lockfree::queue\",\n\t\"tbb::concurrent_queue\",\n\t\"SimpleLockFreeQueue\",\n\t\"LockBasedQueue\",\n\t\"std::queue\",\n\t\"dlib::pipe\"\n};\n\nconst char QUEUE_SUMMARY_NOTES[QUEUE_COUNT][128] = {\n\t\"including bulk\",\n\t\"including bulk\",\n\t\"\",\n\t\"\",\n\t\"\",\n\t\"\",\n\t\"single thread only\",\n\t\"\"\n};\n\nconst bool QUEUE_TOKEN_SUPPORT[QUEUE_COUNT] = {\n\ttrue,\n\ttrue,\n\tfalse,\n\tfalse,\n\tfalse,\n\tfalse,\n\tfalse,\n\tfalse\n};\n\nconst int QUEUE_MAX_THREADS[QUEUE_COUNT] = {\n\t-1,\t\t// no limit\n\t-1,\n\t-1,\n\t-1,\n\t-1,\n\t-1,\n\t1,\n\t-1\n};\n\nconst bool QUEUE_BENCH_SUPPORT[QUEUE_COUNT][BENCHMARK_TYPE_COUNT] = {\n\t{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },\n\t{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },\n\t{ 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1 },\n\t{ 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1 },\n\t{ 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1 },\n\t{ 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1 },\n\t{ 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0 },\n\t{ 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1 }\n};\n\n\nstruct Traits : public moodycamel::ConcurrentQueueDefaultTraits\n{\n\t// Use a slightly larger default block size; the default offers\n\t// a good trade off between speed and memory usage, but a bigger\n\t// block size will improve throughput (which is mostly what\n\t// we're after with these benchmarks).\n\tstatic const size_t BLOCK_SIZE = 64;\n\n\t// Reuse blocks once allocated.\n\tstatic const bool RECYCLE_ALLOCATED_BLOCKS = true;\n};\n\n\ntypedef std::uint64_t counter_t;\n\nconst counter_t BULK_BATCH_SIZE = 2300;\n\nstruct BenchmarkResult\n{\n\tdouble elapsedTime;\n\tcounter_t operations;\n\t\n\tinline bool operator<(BenchmarkResult const& other) const\n\t{\n\t\treturn elapsedTime < other.elapsedTime;\n\t}\n};\n\n\ntemplate<typename TFunc>\ncounter_t rampUpToMeasurableNumberOfMaxOps(TFunc const& func, counter_t startOps = 256)\n{\n\tcounter_t ops = startOps;\n\tdouble time;\n\tdo {\n\t\ttime = func(ops);\n\t\tops *= 2;\n\t} while (time < (precise ? 30 : 10));\n#ifdef NDEBUG\n\treturn ops / 2;\n#else\n\treturn ops / 4;\n#endif\n}\n\ncounter_t adjustForThreads(counter_t suggestedOps, int nthreads)\n{\n\treturn std::max((counter_t)(suggestedOps / std::pow(2, std::sqrt((nthreads - 1) * 3))), suggestedOps / 16);\n}\n\n\ntemplate<typename TQueue, typename item_t>\ncounter_t determineMaxOpsForBenchmark(benchmark_type_t benchmark, int nthreads, bool useTokens, unsigned int randSeed)\n{\n\tswitch (benchmark) {\n\tcase bench_balanced: {\n\t\treturn adjustForThreads(rampUpToMeasurableNumberOfMaxOps([&](counter_t ops) {\n\t\t\tTQueue q;\n\t\t\tRNG_t rng(randSeed * 1);\n\t\t\tstd::uniform_int_distribution<int> rand(0, 20);\n\t\t\tdouble total = 0;\n\t\t\tSystemTime start;\n\t\t\titem_t item = 1;\n\t\t\tfor (counter_t i = 0; i != ops; ++i) {\n\t\t\t\tstart = getSystemTime();\n\t\t\t\tq.enqueue(item);\n\t\t\t\ttotal += getTimeDelta(start);\n\t\t\t}\n\t\t\treturn total;\n\t\t}), nthreads);\n\t}\n\tcase bench_only_enqueue:\n\tcase bench_only_enqueue_prealloc:\n\tcase bench_mostly_enqueue: {\n\t\treturn adjustForThreads(rampUpToMeasurableNumberOfMaxOps([](counter_t ops) {\n\t\t\tTQueue q;\n\t\t\titem_t item = 1;\n\t\t\tauto start = getSystemTime();\n\t\t\tfor (counter_t i = 0; i != ops; ++i) {\n\t\t\t\tq.enqueue(item);\n\t\t\t}\n\t\t\treturn getTimeDelta(start);\n\t\t}), nthreads);\n\t}\n\tcase bench_only_dequeue:\n\tcase bench_mostly_dequeue:\n\tcase bench_spmc:\n\tcase bench_spmc_preproduced:\n\tcase bench_mpsc: {\n\t\treturn adjustForThreads(rampUpToMeasurableNumberOfMaxOps([](counter_t ops) {\n\t\t\tTQueue q;\n\t\t\titem_t item = 1;\n\t\t\tfor (counter_t i = 0; i != ops; ++i) {\n\t\t\t\tq.enqueue(item);\n\t\t\t}\n\t\t\titem_t item_rec;\n\t\t\tauto start = getSystemTime();\n\t\t\tfor (counter_t i = 0; i != ops; ++i) {\n\t\t\t\tq.try_dequeue(item_rec);\n\t\t\t}\n\t\t\treturn getTimeDelta(start);\n\t\t}), nthreads);\n\t}\n\tcase bench_only_enqueue_bulk:\n\tcase bench_only_enqueue_bulk_prealloc:\n\tcase bench_mostly_enqueue_bulk: {\n\t\tstd::vector<item_t> data;\n\t\tfor (counter_t i = 0; i != BULK_BATCH_SIZE; ++i) {\n\t\t\tdata.push_back(i);\n\t\t}\n\t\treturn adjustForThreads(rampUpToMeasurableNumberOfMaxOps([&](counter_t ops) {\n\t\t\tTQueue q;\n\t\t\tauto start = getSystemTime();\n\t\t\tfor (counter_t i = 0; i != ops; ++i) {\n\t\t\t\tq.enqueue_bulk(data.cbegin(), data.size());\n\t\t\t}\n\t\t\treturn getTimeDelta(start);\n\t\t}), nthreads);\n\t}\n\tcase bench_only_dequeue_bulk:\n\tcase bench_mostly_dequeue_bulk: {\n\t\treturn adjustForThreads(rampUpToMeasurableNumberOfMaxOps([](counter_t ops) {\n\t\t\tTQueue q;\n\t\t\tstd::vector<item_t> data(BULK_BATCH_SIZE);\n\t\t\tfor (counter_t i = 0; i != ops; ++i) {\n\t\t\t\tq.enqueue_bulk(data.cbegin(), data.size());\n\t\t\t}\n\t\t\tauto start = getSystemTime();\n\t\t\tfor (counter_t i = 0; i != ops; ++i) {\n\t\t\t\tq.try_dequeue_bulk(data.begin(), data.size());\n\t\t\t}\n\t\t\treturn getTimeDelta(start);\n\t\t}), nthreads);\n\t\treturn 0;\n\t}\n\tcase bench_empty_dequeue: {\n\t\treturn adjustForThreads(rampUpToMeasurableNumberOfMaxOps([](counter_t ops) {\n\t\t\tTQueue q;\n\t\t\titem_t item_rec;\n\t\t\tauto start = getSystemTime();\n\t\t\tfor (counter_t i = 0; i != ops; ++i) {\n\t\t\t\tq.try_dequeue(item_rec);\n\t\t\t}\n\t\t\treturn getTimeDelta(start);\n\t\t}), nthreads);\n\t}\n\tcase bench_enqueue_dequeue_pairs: {\n\t\treturn adjustForThreads(rampUpToMeasurableNumberOfMaxOps([](counter_t ops) {\n\t\t\tTQueue q;\n\t\t\titem_t item = 1;\n\t\t\titem_t item_rec;\n\t\t\tauto start = getSystemTime();\n\t\t\tfor (counter_t i = 0; i != ops; ++i) {\n\t\t\t\tq.enqueue(item);\n\t\t\t\tq.try_dequeue(item_rec);\n\t\t\t}\n\t\t\treturn getTimeDelta(start);\n\t\t}), nthreads);\n\t}\n\t\n\tcase bench_heavy_concurrent: {\n\t\treturn adjustForThreads(rampUpToMeasurableNumberOfMaxOps([](counter_t ops) {\n\t\t\tTQueue q;\n\t\t\titem_t item=1;\n\t\t\titem_t item_rec;\n\t\t\tauto start = getSystemTime();\n\t\t\tfor (counter_t i = 0; i != ops; ++i) {\n\t\t\t\tq.enqueue(item);\n\t\t\t\tq.try_dequeue(item_rec);\n\t\t\t}\n\t\t\treturn getTimeDelta(start);\n\t\t}), nthreads);\n\t}\n\t\n\tdefault:\n\t\tassert(false && \"Every benchmark type must be handled here!\");\n\t\treturn 0;\n\t}\n}\n\n\n// Returns time elapsed, in (fractional) milliseconds\ntemplate<typename TQueue, typename item_t>\ndouble runBenchmark(benchmark_type_t benchmark, int nthreads, bool useTokens, unsigned int randSeed, counter_t maxOps, int maxThreads, counter_t& out_opCount)\n{\n\tdouble result = 0;\n\tvolatile int forceNoOptimizeDummy;\n\t\n\tswitch (benchmark) {\n\tcase bench_balanced: {\n\t\t// Measures the average operation speed with multiple symmetrical threads under reasonable load\n\t\tTQueue q;\n\t\tstd::vector<SimpleThread> threads(nthreads);\n\t\tstd::vector<counter_t> ops(nthreads);\n\t\tstd::vector<double> times(nthreads);\n\t\tstd::atomic<int> ready(0);\n\t\titem_t item_rec;\n\t\titem_t item = 1;\n\t\tfor (int tid = 0; tid != nthreads; ++tid) {\n\t\t\tthreads[tid] = SimpleThread([&](int id) {\n\t\t\t\tready.fetch_add(1, std::memory_order_relaxed);\n\t\t\t\twhile (ready.load(std::memory_order_relaxed) != nthreads)\n\t\t\t\t\tcontinue;\n\t\t\t\t\n\t\t\t\tSystemTime start;\n\t\t\t\tRNG_t rng(randSeed * (id + 1));\n\t\t\t\tstd::uniform_int_distribution<int> rand(0, 20);\n\t\t\t\tops[id] = 0;\n\t\t\t\ttimes[id] = 0;\n\t\t\t\ttypename TQueue::consumer_token_t consTok(q);\n\t\t\t\ttypename TQueue::producer_token_t prodTok(q);\n\n\t\t\t\t\n\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\tif (rand(rng) == 0) {\n\t\t\t\t\t\tstart = getSystemTime();\n\t\t\t\t\t\tif ((i & 1) == 0) {\n\t\t\t\t\t\t\tif (useTokens) {\n\t\t\t\t\t\t\t\tq.try_dequeue(consTok, item_rec);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tq.try_dequeue(item_rec);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tif (useTokens) {\n\t\t\t\t\t\t\t\tq.enqueue(prodTok, item);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tq.enqueue(item);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttimes[id] += getTimeDelta(start);\n\t\t\t\t\t\t++ops[id];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, tid);\n\t\t}\n\t\tout_opCount = 0;\n\t\tresult = 0;\n\t\tfor (int tid = 0; tid != nthreads; ++tid) {\n\t\t\tthreads[tid].join();\n\t\t\tout_opCount += ops[tid];\n\t\t\tresult += times[tid];\n\t\t}\n\t\tforceNoOptimizeDummy = q.try_dequeue(item_rec) ? 1 : 0;\n\t\tbreak;\n\t}\n\t\n\tcase bench_only_enqueue_prealloc: {\n\t\tout_opCount = maxOps * nthreads;\n\t\t\n\t\tTQueue q;\n\t\titem_t item = 1;\n\t\titem_t item_rec;\n\t\t{\n\t\t\t// Enqueue opcount elements first, then dequeue them; this\n\t\t\t// will \"stretch out\" the queue, letting implementatations\n\t\t\t// that re-use memory internally avoid having to allocate\n\t\t\t// more later during the timed enqueue operations.\n\t\t\tstd::vector<SimpleThread> threads(nthreads);\n\t\t\t\n\t\t\tfor (int tid = 0; tid != nthreads; ++tid) {\n\t\t\t\tthreads[tid] = SimpleThread([&](int id) {\n\t\t\t\t\tif (useTokens) {\n\t\t\t\t\t\ttypename TQueue::producer_token_t tok(q);\n\t\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\t\tq.enqueue(tok, item);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\t\tq.enqueue(item);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}, tid);\n\t\t\t}\n\t\t\tfor (int tid = 0; tid != nthreads; ++tid) {\n\t\t\t\tthreads[tid].join();\n\t\t\t}\n\t\t\t\n\t\t\t// Now empty the queue\n\t\t\t\n\t\t\twhile (q.try_dequeue(item_rec))\n\t\t\t\tcontinue;\n\t\t}\n\t\t\n\t\tif (nthreads == 1) {\n\t\t\t// No contention -- measures raw single-item enqueue speed\n\t\t\tauto start = getSystemTime();\n\t\t\tif (useTokens) {\n\t\t\t\ttypename TQueue::producer_token_t tok(q);\n\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\tq.enqueue(tok, item);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\tq.enqueue(item);\n\t\t\t\t}\t\n\t\t\t}\n\t\t\tresult = getTimeDelta(start);\n\t\t}\n\t\telse {\n\t\t\tstd::vector<SimpleThread> threads(nthreads);\n\t\t\tstd::vector<double> timings(nthreads);\n\t\t\tstd::atomic<int> ready(0);\n\t\t\tfor (int tid = 0; tid != nthreads; ++tid) {\n\t\t\t\tthreads[tid] = SimpleThread([&](int id) {\n\t\t\t\t\tready.fetch_add(1, std::memory_order_relaxed);\n\t\t\t\t\twhile (ready.load(std::memory_order_relaxed) != nthreads)\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\n\t\t\t\t\tauto start = getSystemTime();\n\t\t\t\t\tif (useTokens) {\n\t\t\t\t\t\ttypename TQueue::producer_token_t tok(q);\n\t\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\t\tq.enqueue(tok, item);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\t\tq.enqueue(item);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\ttimings[id] = getTimeDelta(start);\n\t\t\t\t}, tid);\n\t\t\t}\n\t\t\tresult = 0;\n\t\t\tfor (int tid = 0; tid != nthreads; ++tid) {\n\t\t\t\tthreads[tid].join();\n\t\t\t\tresult += timings[tid];\n\t\t\t}\n\t\t}\n\t\tforceNoOptimizeDummy = q.try_dequeue(item_rec) ? 1 : 0;\n\t\tbreak;\n\t}\n\t\n\tcase bench_only_enqueue: {\n\t\tout_opCount = maxOps * nthreads;\n\t\t\n\t\tTQueue q;\n\t\titem_t item = 1;\n\t\titem_t item_rec;\n\t\tif (nthreads == 1) {\n\t\t\t// No contention -- measures raw single-item enqueue speed\n\t\t\tauto start = getSystemTime();\n\t\t\tif (useTokens) {\n\t\t\t\ttypename TQueue::producer_token_t tok(q);\n\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\tq.enqueue(tok, item);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\tq.enqueue(item);\n\t\t\t\t}\t\n\t\t\t}\n\t\t\tresult = getTimeDelta(start);\n\t\t}\n\t\telse {\n\t\t\tstd::vector<SimpleThread> threads(nthreads);\n\t\t\tstd::vector<double> timings(nthreads);\n\t\t\tstd::atomic<int> ready(0);\n\t\t\tfor (int tid = 0; tid != nthreads; ++tid) {\n\t\t\t\tthreads[tid] = SimpleThread([&](int id) {\n\t\t\t\t\tready.fetch_add(1, std::memory_order_relaxed);\n\t\t\t\t\twhile (ready.load(std::memory_order_relaxed) != nthreads)\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\n\t\t\t\t\tauto start = getSystemTime();\n\t\t\t\t\tif (useTokens) {\n\t\t\t\t\t\ttypename TQueue::producer_token_t tok(q);\n\t\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\t\tq.enqueue(tok, item);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\t\tq.enqueue(item);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\ttimings[id] = getTimeDelta(start);\n\t\t\t\t}, tid);\n\t\t\t}\n\t\t\tresult = 0;\n\t\t\tfor (int tid = 0; tid != nthreads; ++tid) {\n\t\t\t\tthreads[tid].join();\n\t\t\t\tresult += timings[tid];\n\t\t\t}\n\t\t}\n\t\tforceNoOptimizeDummy = q.try_dequeue(item_rec) ? 1 : 0;\n\t\tbreak;\n\t}\n\t\n\tcase bench_spmc_preproduced:\n\tcase bench_only_dequeue: {\n\t\tout_opCount = maxOps * nthreads;\n\t\t\n\t\tTQueue q;\n\t\titem_t item = 1;\n\t\titem_t item_rec;\n\t\t{\n\t\t\t// Fill up the queue first\n\t\t\tstd::vector<SimpleThread> threads(benchmark == bench_spmc_preproduced ? 1 : nthreads);\n\t\t\tcounter_t itemsPerThread = benchmark == bench_spmc_preproduced ? maxOps * nthreads : maxOps;\n\t\t\tfor (size_t tid = 0; tid != threads.size(); ++tid) {\n\t\t\t\tthreads[tid] = SimpleThread([&](size_t id) {\n\t\t\t\t\tif (useTokens) {\n\t\t\t\t\t\ttypename TQueue::producer_token_t tok(q);\n\t\t\t\t\t\tfor (counter_t i = 0; i != itemsPerThread; ++i) {\n\t\t\t\t\t\t\tq.enqueue(tok, item);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (counter_t i = 0; i != itemsPerThread; ++i) {\n\t\t\t\t\t\t\tq.enqueue(item);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}, tid);\n\t\t\t}\n\t\t\tfor (size_t tid = 0; tid != threads.size(); ++tid) {\n\t\t\t\tthreads[tid].join();\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (nthreads == 1) {\n\t\t\t// No contention -- measures raw single-item dequeue speed\n\t\t\tauto start = getSystemTime();\n\t\t\tif (useTokens) {\n\t\t\t\ttypename TQueue::consumer_token_t tok(q);\n\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\tq.try_dequeue(tok, item_rec);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\tq.try_dequeue(item_rec);\n\t\t\t\t}\t\n\t\t\t}\n\t\t\tresult = getTimeDelta(start);\n\t\t}\n\t\telse {\n\t\t\tstd::vector<SimpleThread> threads(nthreads);\n\t\t\tstd::vector<double> timings(nthreads);\n\t\t\tstd::atomic<int> ready(0);\n\t\t\tfor (int tid = 0; tid != nthreads; ++tid) {\n\t\t\t\tthreads[tid] = SimpleThread([&](int id) {\n\t\t\t\t\tready.fetch_add(1, std::memory_order_relaxed);\n\t\t\t\t\twhile (ready.load(std::memory_order_relaxed) != nthreads)\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\n\t\t\t\t\tauto start = getSystemTime();\n\t\t\t\t\tif (useTokens) {\n\t\t\t\t\t\ttypename TQueue::consumer_token_t tok(q);\n\t\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\t\tq.try_dequeue(tok, item_rec);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\t\tq.try_dequeue(item_rec);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\ttimings[id] = getTimeDelta(start);\n\t\t\t\t}, tid);\n\t\t\t}\n\t\t\tresult = 0;\n\t\t\tfor (int tid = 0; tid != nthreads; ++tid) {\n\t\t\t\tthreads[tid].join();\n\t\t\t\tresult += timings[tid];\n\t\t\t}\n\t\t}\n\t\tforceNoOptimizeDummy = q.try_dequeue(item_rec) ? 1 : 0;\n\t\tbreak;\n\t}\n\t\n\tcase bench_mostly_enqueue: {\n\t\t// Measures the average operation speed when most threads are enqueueing\n\t\tTQueue q;\n\t\titem_t item = 1;\n\t\titem_t item_rec;\n\t\tout_opCount = maxOps * nthreads;\n\t\tstd::vector<SimpleThread> threads(nthreads);\n\t\tstd::vector<double> timings(nthreads);\n\t\tauto dequeueThreads = std::max(1, nthreads / 4);\n\t\tstd::atomic<int> ready(0);\n\t\tfor (int tid = 0; tid != nthreads - dequeueThreads; ++tid) {\n\t\t\tthreads[tid] = SimpleThread([&](int id) {\n\t\t\t\tready.fetch_add(1, std::memory_order_relaxed);\n\t\t\t\twhile (ready.load(std::memory_order_relaxed) != nthreads)\n\t\t\t\t\tcontinue;\n\t\t\t\t\n\t\t\t\tauto start = getSystemTime();\n\t\t\t\tif (useTokens) {\n\t\t\t\t\ttypename TQueue::producer_token_t tok(q);\n\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\tq.enqueue(tok, item);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\tq.enqueue(item);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttimings[id] = getTimeDelta(start);\n\t\t\t}, tid);\n\t\t}\n\t\tfor (int tid = nthreads - dequeueThreads; tid != nthreads; ++tid) {\n\t\t\tthreads[tid] = SimpleThread([&](int id) {\n\t\t\t\tready.fetch_add(1, std::memory_order_relaxed);\n\t\t\t\twhile (ready.load(std::memory_order_relaxed) != nthreads)\n\t\t\t\t\tcontinue;\n\t\t\t\t\n\t\t\t\tauto start = getSystemTime();\n\t\t\t\tif (useTokens) {\n\t\t\t\t\ttypename TQueue::consumer_token_t tok(q);\n\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\tq.try_dequeue(tok, item_rec);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\tq.try_dequeue(item_rec);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttimings[id] = getTimeDelta(start);\n\t\t\t}, tid);\n\t\t}\n\t\tresult = 0;\n\t\tfor (int tid = 0; tid != nthreads; ++tid) {\n\t\t\tthreads[tid].join();\n\t\t\tresult += timings[tid];\n\t\t}\n\t\tforceNoOptimizeDummy = q.try_dequeue(item_rec) ? 1 : 0;\n\t\tbreak;\n\t}\n\t\n\tcase bench_mostly_dequeue: {\n\t\t// Measures the average operation speed when most threads are dequeueing\n\t\tTQueue q;\n\t\titem_t item = 1;\n\t\titem_t item_rec;\n\t\tout_opCount = maxOps * nthreads;\n\t\tstd::vector<SimpleThread> threads(nthreads);\n\t\tstd::vector<double> timings(nthreads);\n\t\tauto enqueueThreads = std::max(1, nthreads / 4);\n\t\t{\n\t\t\t// Fill up the queue first\n\t\t\tstd::vector<SimpleThread> threads(enqueueThreads);\n\t\t\tfor (int tid = 0; tid != enqueueThreads; ++tid) {\n\t\t\t\tthreads[tid] = SimpleThread([&](int id) {\n\t\t\t\t\tif (useTokens) {\n\t\t\t\t\t\ttypename TQueue::producer_token_t tok(q);\n\t\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\t\tq.enqueue(tok, item);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\t\tq.enqueue(item);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}, tid);\n\t\t\t}\n\t\t\tfor (int tid = 0; tid != enqueueThreads; ++tid) {\n\t\t\t\tthreads[tid].join();\n\t\t\t}\n\t\t}\n\t\tstd::atomic<int> ready(0);\n\t\tfor (int tid = 0; tid != nthreads - enqueueThreads; ++tid) {\n\t\t\tthreads[tid] = SimpleThread([&](int id) {\n\t\t\t\tready.fetch_add(1, std::memory_order_relaxed);\n\t\t\t\twhile (ready.load(std::memory_order_relaxed) != nthreads)\n\t\t\t\t\tcontinue;\n\t\t\t\t\n\t\t\t\tauto start = getSystemTime();\n\t\t\t\tif (useTokens) {\n\t\t\t\t\ttypename TQueue::consumer_token_t tok(q);\n\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\tq.try_dequeue(tok, item_rec);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\tq.try_dequeue(item_rec);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttimings[id] = getTimeDelta(start);\n\t\t\t}, tid);\n\t\t}\n\t\tfor (int tid = nthreads - enqueueThreads; tid != nthreads; ++tid) {\n\t\t\tthreads[tid] = SimpleThread([&](int id) {\n\t\t\t\tready.fetch_add(1, std::memory_order_relaxed);\n\t\t\t\twhile (ready.load(std::memory_order_relaxed) != nthreads)\n\t\t\t\t\tcontinue;\n\t\t\t\t\n\t\t\t\tauto start = getSystemTime();\n\t\t\t\tif (useTokens) {\n\t\t\t\t\ttypename TQueue::producer_token_t tok(q);\n\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\tq.enqueue(tok, item);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\tq.enqueue(item);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttimings[id] = getTimeDelta(start);\n\t\t\t}, tid);\n\t\t}\n\t\tresult = 0;\n\t\tfor (int tid = 0; tid != nthreads; ++tid) {\n\t\t\tthreads[tid].join();\n\t\t\tresult += timings[tid];\n\t\t}\n\t\tforceNoOptimizeDummy = q.try_dequeue(item_rec) ? 1 : 0;\n\t\tbreak;\n\t}\n\t\n\tcase bench_only_enqueue_bulk_prealloc: {\n\t\tTQueue q;\n\t\titem_t item = 1;\n\t\titem_t item_rec;\n\t\t{\n\t\t\t// Enqueue opcount elements first, then dequeue them; this\n\t\t\t// will \"stretch out\" the queue, letting implementatations\n\t\t\t// that re-use memory internally avoid having to allocate\n\t\t\t// more later during the timed enqueue operations.\n\t\t\tstd::vector<SimpleThread> threads(nthreads);\n\t\t\tfor (int tid = 0; tid != nthreads; ++tid) {\n\t\t\t\tthreads[tid] = SimpleThread([&](int id) {\n\t\t\t\t\tif (useTokens) {\n\t\t\t\t\t\ttypename TQueue::producer_token_t tok(q);\n\t\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\t\tq.enqueue(tok, item);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\t\tq.enqueue(item);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}, tid);\n\t\t\t}\n\t\t\tfor (int tid = 0; tid != nthreads; ++tid) {\n\t\t\t\tthreads[tid].join();\n\t\t\t}\n\t\t\t\n\t\t\t// Now empty the queue\n\t\t\twhile (q.try_dequeue(item_rec))\n\t\t\t\tcontinue;\n\t\t}\n\t\t\n\t\tstd::vector<counter_t> data;\n\t\tfor (counter_t i = 0; i != BULK_BATCH_SIZE; ++i) {\n\t\t\tdata.push_back(i);\n\t\t}\n\t\t\n\t\tout_opCount = maxOps * BULK_BATCH_SIZE * nthreads;\n\t\tif (nthreads == 1) {\n\t\t\tauto start = getSystemTime();\n\t\t\tif (useTokens) {\n\t\t\t\ttypename TQueue::producer_token_t tok(q);\n\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\tq.enqueue_bulk(tok, data.cbegin(), data.size());\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\tq.enqueue_bulk(data.cbegin(), data.size());\n\t\t\t\t}\t\n\t\t\t}\n\t\t\tresult = getTimeDelta(start);\n\t\t}\n\t\telse {\n\t\t\tstd::vector<SimpleThread> threads(nthreads);\n\t\t\tstd::vector<double> timings(nthreads);\n\t\t\tstd::atomic<int> ready(0);\n\t\t\tfor (int tid = 0; tid != nthreads; ++tid) {\n\t\t\t\tthreads[tid] = SimpleThread([&](int id) {\n\t\t\t\t\tready.fetch_add(1, std::memory_order_relaxed);\n\t\t\t\t\twhile (ready.load(std::memory_order_relaxed) != nthreads)\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\n\t\t\t\t\tauto start = getSystemTime();\n\t\t\t\t\tif (useTokens) {\n\t\t\t\t\t\ttypename TQueue::producer_token_t tok(q);\n\t\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\t\tq.enqueue_bulk(tok, data.cbegin(), data.size());\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\t\tq.enqueue_bulk(data.cbegin(), data.size());\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\ttimings[id] = getTimeDelta(start);\n\t\t\t\t}, tid);\n\t\t\t}\n\t\t\tresult = 0;\n\t\t\tfor (int tid = 0; tid != nthreads; ++tid) {\n\t\t\t\tthreads[tid].join();\n\t\t\t\tresult += timings[tid];\n\t\t\t}\n\t\t}\n\t\tforceNoOptimizeDummy = q.try_dequeue(item_rec) ? 1 : 0;\n\t\tbreak;\n\t}\n\t\n\tcase bench_only_enqueue_bulk: {\n\t\tTQueue q;\n\t\titem_t item_rec;\n\t\tstd::vector<counter_t> data;\n\t\tfor (counter_t i = 0; i != BULK_BATCH_SIZE; ++i) {\n\t\t\tdata.push_back(i);\n\t\t}\n\t\t\n\t\tout_opCount = maxOps * BULK_BATCH_SIZE * nthreads;\n\t\tif (nthreads == 1) {\n\t\t\tauto start = getSystemTime();\n\t\t\tif (useTokens) {\n\t\t\t\ttypename TQueue::producer_token_t tok(q);\n\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\tq.enqueue_bulk(tok, data.cbegin(), data.size());\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\tq.enqueue_bulk(data.cbegin(), data.size());\n\t\t\t\t}\t\n\t\t\t}\n\t\t\tresult = getTimeDelta(start);\n\t\t}\n\t\telse {\n\t\t\tstd::vector<SimpleThread> threads(nthreads);\n\t\t\tstd::vector<double> timings(nthreads);\n\t\t\tstd::atomic<int> ready(0);\n\t\t\tfor (int tid = 0; tid != nthreads; ++tid) {\n\t\t\t\tthreads[tid] = SimpleThread([&](int id) {\n\t\t\t\t\tready.fetch_add(1, std::memory_order_relaxed);\n\t\t\t\t\twhile (ready.load(std::memory_order_relaxed) != nthreads)\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\n\t\t\t\t\tauto start = getSystemTime();\n\t\t\t\t\tif (useTokens) {\n\t\t\t\t\t\ttypename TQueue::producer_token_t tok(q);\n\t\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\t\tq.enqueue_bulk(tok, data.cbegin(), data.size());\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\t\tq.enqueue_bulk(data.cbegin(), data.size());\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\ttimings[id] = getTimeDelta(start);\n\t\t\t\t}, tid);\n\t\t\t}\n\t\t\tresult = 0;\n\t\t\tfor (int tid = 0; tid != nthreads; ++tid) {\n\t\t\t\tthreads[tid].join();\n\t\t\t\tresult += timings[tid];\n\t\t\t}\n\t\t}\n\t\tforceNoOptimizeDummy = q.try_dequeue(item_rec) ? 1 : 0;\n\t\tbreak;\n\t}\n\t\n\tcase bench_mostly_enqueue_bulk: {\n\t\t// Measures the average speed of enqueueing in bulk under light contention\n\t\tTQueue q;\n\t\titem_t item_rec;\n\t\tstd::vector<counter_t> data;\n\t\tfor (counter_t i = 0; i != BULK_BATCH_SIZE; ++i) {\n\t\t\tdata.push_back(i);\n\t\t}\n\t\t\n\t\tstd::vector<SimpleThread> threads(nthreads);\n\t\tstd::vector<double> timings(nthreads);\n\t\tauto dequeueThreads = std::max(1, nthreads / 4);\n\t\tstd::vector<counter_t> ops(nthreads - dequeueThreads);\n\t\tout_opCount = maxOps * BULK_BATCH_SIZE * (nthreads - dequeueThreads);\t// dequeue ops added after\n\t\tstd::atomic<int> ready(0);\n\t\tfor (int tid = 0; tid != nthreads - dequeueThreads; ++tid) {\n\t\t\tthreads[tid] = SimpleThread([&](int id) {\n\t\t\t\tready.fetch_add(1, std::memory_order_relaxed);\n\t\t\t\twhile (ready.load(std::memory_order_relaxed) != nthreads)\n\t\t\t\t\tcontinue;\n\t\t\t\t\n\t\t\t\tauto start = getSystemTime();\n\t\t\t\tif (useTokens) {\n\t\t\t\t\ttypename TQueue::producer_token_t tok(q);\n\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\tq.enqueue_bulk(tok, data.cbegin(), data.size());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\tq.enqueue_bulk(data.cbegin(), data.size());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttimings[id] = getTimeDelta(start);\n\t\t\t}, tid);\n\t\t}\n\t\tfor (int tid = nthreads - dequeueThreads; tid != nthreads; ++tid) {\n\t\t\tthreads[tid] = SimpleThread([&](int id, int idBase0) {\n\t\t\t\tstd::vector<int> items(BULK_BATCH_SIZE);\n\t\t\t\t\n\t\t\t\tready.fetch_add(1, std::memory_order_relaxed);\n\t\t\t\twhile (ready.load(std::memory_order_relaxed) != nthreads)\n\t\t\t\t\tcontinue;\n\t\t\t\t\n\t\t\t\tcounter_t totalOps = 0;\n\t\t\t\tauto start = getSystemTime();\n\t\t\t\tif (useTokens) {\n\t\t\t\t\ttypename TQueue::consumer_token_t tok(q);\n\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\tauto actual = q.try_dequeue_bulk(tok, items.begin(), items.size());\n\t\t\t\t\t\ttotalOps += actual + (actual == items.size() ? 0 : 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\tauto actual = q.try_dequeue_bulk(items.begin(), items.size());\n\t\t\t\t\t\ttotalOps += actual + (actual == items.size() ? 0 : 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttimings[id] = getTimeDelta(start);\n\t\t\t\tops[idBase0] = totalOps;\n\t\t\t}, tid, tid - (nthreads - dequeueThreads));\n\t\t}\n\t\tresult = 0;\n\t\tfor (int tid = 0; tid != nthreads; ++tid) {\n\t\t\tthreads[tid].join();\n\t\t\tresult += timings[tid];\n\t\t\tif (tid < dequeueThreads) {\n\t\t\t\tout_opCount += ops[tid];\n\t\t\t}\n\t\t}\n\t\tforceNoOptimizeDummy = q.try_dequeue(item_rec) ? 1 : 0;\n\t\tbreak;\n\t}\n\t\n\tcase bench_only_dequeue_bulk: {\n\t\t// Measures the average speed of dequeueing in bulk when all threads are consumers\n\t\tTQueue q;\n\t\titem_t item_rec;\n\t\t{\n\t\t\t// Fill up the queue first\n\t\t\tstd::vector<int> data(BULK_BATCH_SIZE);\n\t\t\tfor (int i = 0; i != BULK_BATCH_SIZE; ++i) {\n\t\t\t\tdata[i] = i;\n\t\t\t}\n\t\t\tstd::vector<SimpleThread> threads(nthreads);\n\t\t\tfor (int tid = 0; tid != nthreads; ++tid) {\n\t\t\t\tthreads[tid] = SimpleThread([&](int id) {\n\t\t\t\t\tif (useTokens) {\n\t\t\t\t\t\ttypename TQueue::producer_token_t tok(q);\n\t\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\t\tq.enqueue_bulk(tok, data.cbegin(), data.size());\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\t\tq.enqueue_bulk(data.cbegin(), data.size());\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}, tid);\n\t\t\t}\n\t\t\tfor (int tid = 0; tid != nthreads; ++tid) {\n\t\t\t\tthreads[tid].join();\n\t\t\t}\n\t\t}\n\t\tif (nthreads == 1) {\n\t\t\tout_opCount = maxOps * BULK_BATCH_SIZE;\n\t\t\tauto start = getSystemTime();\n\t\t\tstd::vector<int> items(BULK_BATCH_SIZE);\n\t\t\tif (useTokens) {\n\t\t\t\ttypename TQueue::consumer_token_t tok(q);\n\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\tq.try_dequeue_bulk(tok, items.begin(), items.size());\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\tq.try_dequeue_bulk(items.begin(), items.size());\n\t\t\t\t}\n\t\t\t}\n\t\t\tresult = getTimeDelta(start);\n\t\t}\n\t\telse {\n\t\t\tstd::vector<SimpleThread> threads(nthreads);\n\t\t\tstd::vector<double> timings(nthreads);\n\t\t\tstd::vector<counter_t> ops(nthreads);\n\t\t\tstd::atomic<int> ready(0);\n\t\t\tfor (int tid = 0; tid != nthreads; ++tid) {\n\t\t\t\tthreads[tid] = SimpleThread([&](int id) {\n\t\t\t\t\tstd::vector<int> items(BULK_BATCH_SIZE);\n\t\t\t\t\tready.fetch_add(1, std::memory_order_relaxed);\n\t\t\t\t\twhile (ready.load(std::memory_order_relaxed) != nthreads)\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\n\t\t\t\t\tcounter_t totalOps = 0;\n\t\t\t\t\tauto start = getSystemTime();\n\t\t\t\t\tif (useTokens) {\n\t\t\t\t\t\ttypename TQueue::consumer_token_t tok(q);\n\t\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\t\tauto actual = q.try_dequeue_bulk(tok, items.begin(), items.size());\n\t\t\t\t\t\t\ttotalOps += actual + (actual == items.size() ? 0 : 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\t\tauto actual = q.try_dequeue_bulk(items.begin(), items.size());\n\t\t\t\t\t\t\ttotalOps += actual + (actual == items.size() ? 0 : 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\ttimings[id] = getTimeDelta(start);\n\t\t\t\t\tops[id] = totalOps;\n\t\t\t\t}, tid);\n\t\t\t}\n\t\t\tresult = 0;\n\t\t\tout_opCount = 0;\n\t\t\tfor (int tid = 0; tid != nthreads; ++tid) {\n\t\t\t\tthreads[tid].join();\n\t\t\t\tresult += timings[tid];\n\t\t\t\tout_opCount += ops[tid];\n\t\t\t}\n\t\t}\n\t\tforceNoOptimizeDummy = q.try_dequeue(item_rec) ? 1 : 0;\n\t\tbreak;\n\t}\n\t\n\tcase bench_mostly_dequeue_bulk: {\n\t\t// Measures the average speed of dequeueing in bulk under light contention\n\t\tTQueue q;\n\t\titem_t item_rec;\n\t\tauto enqueueThreads = std::max(1, nthreads / 4);\n\t\tout_opCount = maxOps * BULK_BATCH_SIZE * enqueueThreads;\n\t\tstd::vector<SimpleThread> threads(nthreads);\n\t\tstd::vector<double> timings(nthreads);\n\t\tstd::vector<counter_t> ops(nthreads - enqueueThreads);\n\t\tstd::vector<int> enqueueData(BULK_BATCH_SIZE);\n\t\tfor (int i = 0; i != BULK_BATCH_SIZE; ++i) {\n\t\t\tenqueueData[i] = i;\n\t\t}\n\t\t{\n\t\t\t// Fill up the queue first\n\t\t\tstd::vector<SimpleThread> threads(enqueueThreads);\n\t\t\tfor (int tid = 0; tid != enqueueThreads; ++tid) {\n\t\t\t\tthreads[tid] = SimpleThread([&](int id) {\n\t\t\t\t\tif (useTokens) {\n\t\t\t\t\t\ttypename TQueue::producer_token_t tok(q);\n\t\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\t\tq.enqueue_bulk(tok, enqueueData.cbegin(), enqueueData.size());\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\t\tq.enqueue_bulk(enqueueData.cbegin(), enqueueData.size());\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}, tid);\n\t\t\t}\n\t\t\tfor (int tid = 0; tid != enqueueThreads; ++tid) {\n\t\t\t\tthreads[tid].join();\n\t\t\t}\n\t\t}\n\t\tstd::atomic<int> ready(0);\n\t\tfor (int tid = 0; tid != nthreads - enqueueThreads; ++tid) {\n\t\t\tthreads[tid] = SimpleThread([&](int id) {\n\t\t\t\tstd::vector<int> data(BULK_BATCH_SIZE);\n\t\t\t\tready.fetch_add(1, std::memory_order_relaxed);\n\t\t\t\twhile (ready.load(std::memory_order_relaxed) != nthreads)\n\t\t\t\t\tcontinue;\n\t\t\t\tcounter_t totalOps = 0;\n\t\t\t\tauto start = getSystemTime();\n\t\t\t\tif (useTokens) {\n\t\t\t\t\ttypename TQueue::consumer_token_t tok(q);\n\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\tauto actual = q.try_dequeue_bulk(tok, data.begin(), data.size());\n\t\t\t\t\t\ttotalOps += actual + (actual == data.size() ? 0 : 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\tauto actual = q.try_dequeue_bulk(data.begin(), data.size());\n\t\t\t\t\t\ttotalOps += actual + (actual == data.size() ? 0 : 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttimings[id] = getTimeDelta(start);\n\t\t\t\tops[id] = totalOps;\n\t\t\t}, tid);\n\t\t}\n\t\tfor (int tid = nthreads - enqueueThreads; tid != nthreads; ++tid) {\n\t\t\tthreads[tid] = SimpleThread([&](int id) {\n\t\t\t\tready.fetch_add(1, std::memory_order_relaxed);\n\t\t\t\twhile (ready.load(std::memory_order_relaxed) != nthreads)\n\t\t\t\t\tcontinue;\n\t\t\t\t\n\t\t\t\tauto start = getSystemTime();\n\t\t\t\tif (useTokens) {\n\t\t\t\t\ttypename TQueue::producer_token_t tok(q);\n\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\tq.enqueue_bulk(tok, enqueueData.cbegin(), enqueueData.size());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\tq.enqueue_bulk(enqueueData.cbegin(), enqueueData.size());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttimings[id] = getTimeDelta(start);\n\t\t\t}, tid);\n\t\t}\n\t\tresult = 0;\n\t\tfor (int tid = 0; tid != nthreads; ++tid) {\n\t\t\tthreads[tid].join();\n\t\t\tresult += timings[tid];\n\t\t\tif (tid < nthreads - enqueueThreads) {\n\t\t\t\tout_opCount += ops[tid];\n\t\t\t}\n\t\t}\n\t\tforceNoOptimizeDummy = q.try_dequeue(item_rec) ? 1 : 0;\n\t\tbreak;\n\t}\n\t\n\tcase bench_spmc: {\n\t\tcounter_t elementsToDequeue = maxOps * (nthreads - 1);\n\t\t\n\t\tTQueue q;\n\t\titem_t item = 1;\n\t\titem_t item_rec;\n\t\tstd::vector<SimpleThread> threads(nthreads - 1);\n\t\tstd::vector<double> timings(nthreads - 1);\n\t\tstd::vector<counter_t> ops(nthreads - 1);\n\t\tstd::atomic<bool> lynchpin(false);\n\t\tstd::atomic<counter_t> totalDequeued(0);\n\t\tfor (int tid = 0; tid != nthreads - 1; ++tid) {\n\t\t\tthreads[tid] = SimpleThread([&](int id) {\n\t\t\t\twhile (!lynchpin.load(std::memory_order_relaxed)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tint item;\n\t\t\t\tcounter_t i = 0;\n\t\t\t\tauto start = getSystemTime();\n\t\t\t\tif (useTokens) {\n\t\t\t\t\ttypename TQueue::consumer_token_t tok(q);\n\t\t\t\t\twhile (true) {\n\t\t\t\t\t\tif (q.try_dequeue(tok, item)) {\n\t\t\t\t\t\t\ttotalDequeued.fetch_add(1, std::memory_order_relaxed);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (totalDequeued.load(std::memory_order_relaxed) == elementsToDequeue) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t++i;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\twhile (true) {\n\t\t\t\t\t\tif (q.try_dequeue(item_rec)) {\n\t\t\t\t\t\t\ttotalDequeued.fetch_add(1, std::memory_order_relaxed);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (totalDequeued.load(std::memory_order_relaxed) == elementsToDequeue) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t++i;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttimings[id] = getTimeDelta(start);\n\t\t\t\tops[id] = i;\n\t\t\t}, tid);\n\t\t}\n\t\t\n\t\tlynchpin.store(true, std::memory_order_seq_cst);\n\t\tfor (counter_t i = 0; i != elementsToDequeue; ++i) {\n\t\t\tq.enqueue(item);\n\t\t}\n\t\t\n\t\tresult = 0;\n\t\tout_opCount = 0;\n\t\tfor (int tid = 0; tid != nthreads - 1; ++tid) {\n\t\t\tthreads[tid].join();\n\t\t\tresult += timings[tid];\n\t\t\tout_opCount += ops[tid];\n\t\t}\n\t\tforceNoOptimizeDummy = q.try_dequeue(item_rec) ? 1 : 0;\n\t\tbreak;\n\t}\n\t\n\tcase bench_mpsc: {\n\t\tTQueue q;\n\t\titem_t item = 1;\n\t\titem_t item_rec;\n\t\tcounter_t elementsToDequeue = maxOps * (nthreads - 1);\n\t\tstd::vector<SimpleThread> threads(nthreads);\n\t\tstd::atomic<int> ready(0);\n\t\tfor (int tid = 0; tid != nthreads; ++tid) {\n\t\t\tif (tid == 0) {\n\t\t\t\t// Consumer thread\n\t\t\t\tthreads[tid] = SimpleThread([&](int id) {\n\t\t\t\t\tready.fetch_add(1, std::memory_order_seq_cst);\n\t\t\t\t\twhile (ready.load(std::memory_order_relaxed) != nthreads)\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\n\t\t\t\t\tint item;\n\t\t\t\t\tout_opCount = 0;\n\t\t\t\t\tauto start = getSystemTime();\n\t\t\t\t\tif (useTokens) {\n\t\t\t\t\t\ttypename TQueue::consumer_token_t tok(q);\n\t\t\t\t\t\tfor (counter_t i = 0; i != elementsToDequeue;) {\n\t\t\t\t\t\t\ti += q.try_dequeue(tok, item) ? 1 : 0;\n\t\t\t\t\t\t\t++out_opCount;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (counter_t i = 0; i != elementsToDequeue;) {\n\t\t\t\t\t\t\ti += q.try_dequeue(item_rec) ? 1 : 0;\n\t\t\t\t\t\t\t++out_opCount;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tresult = getTimeDelta(start);\n\t\t\t\t}, tid);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthreads[tid] = SimpleThread([&](int id) {\n\t\t\t\t\tready.fetch_add(1, std::memory_order_seq_cst);\n\t\t\t\t\twhile (ready.load(std::memory_order_relaxed) != nthreads)\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\n\t\t\t\t\tif (useTokens) {\n\t\t\t\t\t\ttypename TQueue::producer_token_t tok(q);\n\t\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\t\tq.enqueue(tok, item);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\t\tq.enqueue(item);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}, tid);\n\t\t\t}\n\t\t}\n\t\t\n\t\tfor (int tid = 0; tid != nthreads; ++tid) {\n\t\t\tthreads[tid].join();\n\t\t}\n\t\tforceNoOptimizeDummy = q.try_dequeue(item_rec) ? 1 : 0;\n\t\tbreak;\n\t}\n\t\n\tcase bench_empty_dequeue: {\n\t\t// Measures the average speed of attempting to dequeue from an empty queue\n\t\tTQueue q;\n\t\titem_t item = 1;\n\t\titem_t item_rec;\n\t\t// Fill up then empty the queue first\n\t\t{\n\t\t\tstd::vector<SimpleThread> threads(maxThreads > 0 ? maxThreads : 8);\n\t\t\tfor (size_t tid = 0; tid != threads.size(); ++tid) {\n\t\t\t\tthreads[tid] = SimpleThread([&](size_t id) {\n\t\t\t\t\tif (useTokens) {\n\t\t\t\t\t\ttypename TQueue::producer_token_t tok(q);\n\t\t\t\t\t\tfor (counter_t i = 0; i != 10000; ++i) {\n\t\t\t\t\t\t\tq.enqueue(tok, item);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (counter_t i = 0; i != 10000; ++i) {\n\t\t\t\t\t\t\tq.enqueue(item);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}, tid);\n\t\t\t}\n\t\t\tfor (size_t tid = 0; tid != threads.size(); ++tid) {\n\t\t\t\tthreads[tid].join();\n\t\t\t}\n\t\t\t\n\t\t\t// Empty the queue\n\t\t\twhile (q.try_dequeue(item_rec))\n\t\t\t\tcontinue;\n\t\t}\n\t\t\n\t\tif (nthreads == 1) {\n\t\t\t// No contention -- measures raw failed dequeue speed on empty queue\n\t\t\tint item;\n\t\t\tout_opCount = maxOps;\n\t\t\tauto start = getSystemTime();\n\t\t\tif (useTokens) {\n\t\t\t\ttypename TQueue::consumer_token_t tok(q);\n\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\tq.try_dequeue(tok, item);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\tq.try_dequeue(item_rec);\n\t\t\t\t}\n\t\t\t}\n\t\t\tresult = getTimeDelta(start);\n\t\t\tforceNoOptimizeDummy = q.try_dequeue(item_rec) ? 1 : 0;\n\t\t}\n\t\telse {\n\t\t\tout_opCount = maxOps * nthreads;\n\t\t\tstd::vector<SimpleThread> threads(nthreads);\n\t\t\tstd::vector<double> timings(nthreads);\n\t\t\tstd::atomic<int> ready(0);\n\t\t\tfor (int tid = 0; tid != nthreads; ++tid) {\n\t\t\t\tthreads[tid] = SimpleThread([&](int id) {\n\t\t\t\t\tready.fetch_add(1, std::memory_order_relaxed);\n\t\t\t\t\twhile (ready.load(std::memory_order_relaxed) != nthreads)\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\n\t\t\t\t\tint item;\n\t\t\t\t\tauto start = getSystemTime();\n\t\t\t\t\tif (useTokens) {\n\t\t\t\t\t\ttypename TQueue::consumer_token_t tok(q);\n\t\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\t\tq.try_dequeue(tok, item);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\t\tq.try_dequeue(item_rec);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\ttimings[id] = getTimeDelta(start);\n\t\t\t\t}, tid);\n\t\t\t}\n\t\t\tresult = 0;\n\t\t\tfor (int tid = 0; tid != nthreads; ++tid) {\n\t\t\t\tthreads[tid].join();\n\t\t\t\tresult += timings[tid];\n\t\t\t}\n\t\t\tforceNoOptimizeDummy = q.try_dequeue(item_rec) ? 1 : 0;\n\t\t}\n\t\tbreak;\n\t}\n\t\n\tcase bench_enqueue_dequeue_pairs: {\n\t\t// Measures the average speed of attempting to dequeue from an empty queue\n\t\t// (that eight separate threads had at one point enqueued to)\n\t\tout_opCount = maxOps * 2 * nthreads;\n\t\tTQueue q;\n\t\titem_t item_rec;\n\t\tif (nthreads == 1) {\n\t\t\t// No contention -- measures speed of immediately dequeueing the item that was just enqueued\n\t\t\tint item = 0;\n\t\t\tauto start = getSystemTime();\n\t\t\tif (useTokens) {\n\t\t\t\ttypename TQueue::producer_token_t prodTok(q);\n\t\t\t\ttypename TQueue::consumer_token_t consTok(q);\n\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\tq.enqueue(prodTok, item);\n\t\t\t\t\tq.try_dequeue(consTok, item);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\tq.enqueue(item);\n\t\t\t\t\tq.try_dequeue(item_rec);\n\t\t\t\t}\n\t\t\t}\n\t\t\tresult = getTimeDelta(start);\n\t\t\tforceNoOptimizeDummy = q.try_dequeue(item_rec) ? 1 : 0;\n\t\t}\n\t\telse {\n\t\t\tstd::vector<SimpleThread> threads(nthreads);\n\t\t\tstd::vector<double> timings(nthreads);\n\t\t\tstd::atomic<int> ready(0);\n\t\t\tfor (int tid = 0; tid != nthreads; ++tid) {\n\t\t\t\tthreads[tid] = SimpleThread([&](int id) {\n\t\t\t\t\tready.fetch_add(1, std::memory_order_relaxed);\n\t\t\t\t\twhile (ready.load(std::memory_order_relaxed) != nthreads)\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\n\t\t\t\t\tint item = 0;\n\t\t\t\t\tauto start = getSystemTime();\n\t\t\t\t\tif (useTokens) {\n\t\t\t\t\t\ttypename TQueue::producer_token_t prodTok(q);\n\t\t\t\t\t\ttypename TQueue::consumer_token_t consTok(q);\n\t\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\t\tq.enqueue(prodTok, item);\n\t\t\t\t\t\t\tq.try_dequeue(consTok, item);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\t\tq.enqueue(item);\n\t\t\t\t\t\t\tq.try_dequeue(item_rec);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\ttimings[id] = getTimeDelta(start);\n\t\t\t\t}, tid);\n\t\t\t}\n\t\t\tresult = 0;\n\t\t\tfor (int tid = 0; tid != nthreads; ++tid) {\n\t\t\t\tthreads[tid].join();\n\t\t\t\tresult += timings[tid];\n\t\t\t}\n\t\t\tforceNoOptimizeDummy = q.try_dequeue(item_rec) ? 1 : 0;\n\t\t}\n\t\tbreak;\n\t}\n\t\n\tcase bench_heavy_concurrent: {\n\t\t// Measures the average operation speed with many threads under heavy load\n\t\tout_opCount = maxOps * nthreads;\n\t\tTQueue q;\n\t\titem_t item = 1;\n\t\titem_t item_rec;\n\t\tstd::vector<SimpleThread> threads(nthreads);\n\t\tstd::vector<double> timings(nthreads);\n\t\tstd::atomic<int> ready(0);\n\t\tfor (int tid = 0; tid != nthreads; ++tid) {\n\t\t\tthreads[tid] = SimpleThread([&](int id) {\n\t\t\t\tready.fetch_add(1, std::memory_order_relaxed);\n\t\t\t\twhile (ready.load(std::memory_order_relaxed) != nthreads)\n\t\t\t\t\tcontinue;\n\t\t\t\t\n\t\t\t\tauto start = getSystemTime();\n\t\t\t\tif (id < 2) {\n\t\t\t\t\t// Alternate\n\t\t\t\t\tint item = 0;\n\t\t\t\t\tif (useTokens) {\n\t\t\t\t\t\ttypename TQueue::consumer_token_t consTok(q);\n\t\t\t\t\t\ttypename TQueue::producer_token_t prodTok(q);\n\t\t\t\t\t\t\n\t\t\t\t\t\tfor (counter_t i = 0; i != maxOps / 2; ++i) {\n\t\t\t\t\t\t\tq.try_dequeue(consTok, item);\n\t\t\t\t\t\t\tq.enqueue(prodTok, item);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (counter_t i = 0; i != maxOps / 2; ++i) {\n\t\t\t\t\t\t\tq.try_dequeue(item_rec);\n\t\t\t\t\t\t\tq.enqueue(item);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif ((id & 1) == 0) {\n\t\t\t\t\t\t// Enqueue\n\t\t\t\t\t\tif (useTokens) {\n\t\t\t\t\t\t\ttypename TQueue::producer_token_t prodTok(q);\n\t\t\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\t\t\tq.enqueue(prodTok, item);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\t\t\tq.enqueue(item);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// Dequeue\n\t\t\t\t\t\tint item;\n\t\t\t\t\t\tif (useTokens) {\n\t\t\t\t\t\t\ttypename TQueue::consumer_token_t consTok(q);\n\t\t\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\t\t\tq.try_dequeue(consTok, item);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tfor (counter_t i = 0; i != maxOps; ++i) {\n\t\t\t\t\t\t\t\tq.try_dequeue(item_rec);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttimings[id] = getTimeDelta(start);\n\t\t\t}, tid);\n\t\t}\n\t\tresult = 0;\n\t\tfor (int tid = 0; tid != nthreads; ++tid) {\n\t\t\tthreads[tid].join();\n\t\t\tresult += timings[tid];\n\t\t}\n\t\tforceNoOptimizeDummy = q.try_dequeue(item_rec) ? 1 : 0;\n\t\tbreak;\n\t}\n\t\n\tdefault:\n\t\tassert(false && \"Every benchmark type must be handled here!\");\n\t\tresult = 0;\n\t\tout_opCount = 0;\n\t}\n\t\n\t(void)forceNoOptimizeDummy;\n\t\n\treturn result;\n}\n\n\nconst char* LOG_FILE = \"benchmarks.log\";\nstd::ofstream* logOut;\nbool logErrorReported = false;\n\nvoid sayf(int indent, const char* fmt, ...)\n{\n\tstatic char indentBuffer[] = \"                        \";\n\tstatic char buf[2048];\n\t\n\tindentBuffer[indent] = '\\0';\n\t\n\tva_list arglist;\n\tva_start(arglist, fmt);\n\tvsprintf(buf, fmt, arglist);\n\tva_end(arglist);\n\t\n\tif (*logOut) {\n\t\t(*logOut) << indentBuffer << buf;\n\t}\n\telse if (!logErrorReported) {\n\t\tstd::printf(\"Note: Error writing to log file. Future output will appear only on stdout\\n\");\n\t\tlogErrorReported = true;\n\t}\n\tstd::printf(\"%s%s\", indentBuffer, buf);\n\t\n\tindentBuffer[indent] = ' ';\n}\n\n\n// Returns a formatted timestamp.\n// Returned buffer is only valid until the next call.\n// Not thread-safe.\nstatic const char* timestamp()\n{\n\tstatic char buf[32];\n\ttime_t time = std::time(NULL);\n\tstrcpy(buf, std::asctime(std::localtime(&time)));\n\tbuf[strlen(buf) - 1] = '\\0';\t// Remove trailing newline\n\treturn buf;\n}\n\nstatic inline bool isvowel(char ch)\n{\n\tch = std::tolower(ch);\n\tfor (const char* v = \"aeiou\"; *v != '\\0'; ++v) {\n\t\tif (*v == ch) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nstatic inline double safe_divide(double a, double b)\n{\n\treturn b == 0 ? 0 : a / b;\n}\n\n// Returns a positive number formatted in a string in a human-readable way.\n// The string is always 7 characters or less (excluding null byte).\n// Returned buffer is only valid until the sixteenth next call.\n// Not thread safe.\nstatic const char* pretty(double num)\n{\n\tassert(num >= 0);\n\t\n#if defined(_MSC_VER) && _MSC_VER < 1800\n\tif (!_finite(num)) {\n\t\treturn \"inf\";\n\t}\n\tif (_isnan(num)) {\n\t\treturn \"nan\";\n\t}\n#else\n\tif (std::isinf(num)) {\n\t\treturn \"inf\";\n\t}\n\tif (std::isnan(num)) {\n\t\treturn \"nan\";\n\t}\n#endif\n\t\n\tstatic char bufs[16][8];\n\tstatic int nextBuf = 0;\n\tchar* buf = bufs[nextBuf++];\n\tnextBuf &= 15;\n\t\n\tint suffix = 0;\n\tif (num < 1) {\n\t\tstatic const char minisufs[] = \"\\0munpfazy\";\n\t\twhile (num < 0.01) {\n\t\t\t++suffix;\n\t\t\tnum *= 1000;\n\t\t}\n\t\tsprintf(buf, \"%1.4f%c\", num, minisufs[suffix]);\n\t}\n\telse {\n\t\tstatic const char megasufs[] = \"\\0kMGTPEZY\";\n\t\twhile (num >= 1000) {\n\t\t\t++suffix;\n\t\t\tnum /= 1000;\n\t\t}\n\t\tsprintf(buf, \"%.2f%c\", num, megasufs[suffix]);\n\t}\n\t\n\treturn buf;\n}\n\nvoid printBenchmarkNames()\n{\n\tstd::printf(\"   Supported benchmarks are:\\n\");\n\t\n\tfor (int i = 0; i != BENCHMARK_TYPE_COUNT; ++i) {\n\t\tstd::printf(\"      %s\\n\", BENCHMARK_SHORT_NAMES[i]);\n\t}\n}\n\n\nint main(int argc, char** argv)\n{\n\t// Disable buffering (so that when run in, e.g., Sublime Text, the output appears as it is written)\n\tstd::setvbuf(stdout, nullptr, _IONBF, 0);\n\t\n\t// Isolate the executable name\n\tstd::string progName = argv[0];\n\tauto slash = progName.find_last_of(\"/\\\\\");\n\tif (slash != std::string::npos) {\n\t\tprogName = progName.substr(slash + 1);\n\t}\n\t\n\tstd::map<std::string, benchmark_type_t> benchmarkMap;\n\tfor (int i = 0; i != BENCHMARK_TYPE_COUNT; ++i) {\n\t\tbenchmarkMap.insert(std::make_pair(std::string(BENCHMARK_SHORT_NAMES[i]), (benchmark_type_t)i));\n\t}\n\tstd::vector<benchmark_type_t> selectedBenchmarks;\n\t\n\tbool showHelp = false;\n\tbool error = false;\n\tbool printedBenchmarks = false;\n\tfor (int i = 1; i < argc; ++i) {\n\t\tif (std::strcmp(argv[i], \"-h\") == 0 || std::strcmp(argv[i], \"--help\") == 0) {\n\t\t\tshowHelp = true;\n\t\t}\n\t\telse if (std::strcmp(argv[i], \"-p\") == 0 || std::strcmp(argv[i], \"--precise\") == 0) {\n\t\t\tprecise = true;\n\t\t}\n\t\telse if (std::strcmp(argv[i], \"--run\") == 0) {\n\t\t\tif (i + 1 == argc || argv[i + 1][0] == '-') {\n\t\t\t\tstd::printf(\"Expected benchmark name argument for --run option.\\n\");\n\t\t\t\tif (!printedBenchmarks) {\n\t\t\t\t\tprintBenchmarkNames();\n\t\t\t\t\tprintedBenchmarks = true;\n\t\t\t\t}\n\t\t\t\terror = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tauto it = benchmarkMap.find(argv[++i]);\n\t\t\tif (it == benchmarkMap.end()) {\n\t\t\t\tstd::printf(\"Unrecognized benchmark name '%s'.\\n\", argv[i]);\n\t\t\t\tif (!printedBenchmarks) {\n\t\t\t\t\tprintBenchmarkNames();\n\t\t\t\t\tprintedBenchmarks = true;\n\t\t\t\t}\n\t\t\t\terror = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tselectedBenchmarks.push_back(it->second);\n\t\t}\n\t\telse {\n\t\t\tstd::printf(\"Unrecognized option '%s'\\n\", argv[i]);\n\t\t\terror = true;\n\t\t}\n\t}\n\tif (showHelp || error) {\n\t\tif (error) {\n\t\t\tstd::printf(\"\\n\");\n\t\t}\n\t\tstd::printf(\"%s\\n    Description: Runs benchmarks for moodycamel::ConcurrentQueue\\n\", progName.c_str());\n\t\tstd::printf(\"    --help            Prints this help blurb\\n\");\n\t\tstd::printf(\"    --precise         Generate more precise benchmark results (slower)\\n\");\n\t\tstd::printf(\"    --run benchmark   Runs only the selected benchmark (can be used multiple times)\\n\");\n\t\treturn error ? 1 : 0;\n\t}\n\t\n\tbool logExists = true;\n\t{\n\t\tstd::ifstream fin(LOG_FILE);\n\t\tif (!fin) {\n\t\t\tlogExists = false;\n\t\t}\n\t}\n\t\n\tstd::ofstream fout(LOG_FILE, std::ios::app);\n\tlogOut = &fout;\n\tif (fout) {\n\t\tif (logExists) {\n\t\t\tfout << \"\\n\\n\\n\";\n\t\t}\n\t\tfout << \"--- New run (\" << timestamp() << \") ---\\n\";\n\t}\n\telse {\n\t\tstd::printf(\"Note: Error opening log file '%s'. Output will appear only on stdout.\\n\\n\", LOG_FILE);\n\t\tlogErrorReported = true;\n\t}\n\t\n\tconst char* bitStr = \"\";\n\tif (sizeof(void*) == 4 || sizeof(void*) == 8) {\n\t\tbitStr = sizeof(void*) == 4 ? \" 32-bit\" : \" 64-bit\";\n\t}\n\t\n\tconst char* cpuStr = getCPUString();\n\tsayf(0, \"Running%s benchmarks on a%s %s\\n\", bitStr, isvowel(cpuStr[0]) ? \"n\" : \"\", cpuStr);\n\tif (precise) {\n\t\tsayf(4, \"(precise mode)\\n\");\n\t}\n\tif (selectedBenchmarks.size() > 0) {\n\t\tsayf(4, \"(selected benchmarks only)\\n\");\n\t}\n\tsayf(0, \"Note that these are synthetic benchmarks. Take them with a grain of salt.\\n\\n\");\n\t\n\tsayf(0, \"Legend:\\n\");\n\tsayf(4, \"'Avg':     Average time taken per operation, normalized to be per thread\\n\");\n\tsayf(4, \"'Range':   The minimum and maximum times taken per operation (per thread)\\n\");\n\tsayf(4, \"'Ops/s':   Overall operations per second\\n\");\n\tsayf(4, \"'Ops/s/t': Operations per second per thread (inverse of 'Avg')\\n\");\n\tsayf(4, \"Operations include those that fail (e.g. because the queue is empty).\\n\");\n\tsayf(4, \"Each logical enqueue/dequeue counts as an individual operation when in bulk.\\n\");\n\tsayf(0, \"\\n\");\n\t\n\t\n#ifdef NDEBUG\n\tconst int ITERATIONS = precise ? 100 : 10;\n#else\n\tconst int ITERATIONS = precise ? 20 : 2;\n#endif\n\t\n\t\n\tconst double FASTEST_PERCENT_CONSIDERED = precise ? 8 : 50;\t// Only consider the top % of runs\n\t\n\t// Make sure each run of a given benchmark has the same seed (otherwise different runs are not comparable)\n\tstd::srand(std::time(NULL));\n\tunsigned int randSeeds[BENCHMARK_TYPE_COUNT];\n\tfor (unsigned int i = 0; i != BENCHMARK_TYPE_COUNT; ++i) {\n\t\trandSeeds[i] = std::rand() * (i + 1) + 1;\n\t}\n\t\n\tdouble opsst = 0;\t\t// ops/s/thread\n\t\n\tdouble totalWeightedOpsst[QUEUE_COUNT];\n\tdouble totalWeight[QUEUE_COUNT];\n\tfor (int i = 0; i != QUEUE_COUNT; ++i) {\n\t\ttotalWeightedOpsst[i] = 0;\n\t\ttotalWeight[i] = 0;\n\t}\n\t\n\tauto logicalCores = std::thread::hardware_concurrency();\n\t\n\tif (selectedBenchmarks.size() == 0) {\n\t\tfor (int i = 0; i != BENCHMARK_TYPE_COUNT; ++i) {\n\t\t\tselectedBenchmarks.push_back((benchmark_type_t)i);\n\t\t}\n\t}\n\t\n\tint indent = 0;\n\tfor (auto selectedIt = selectedBenchmarks.cbegin(); selectedIt != selectedBenchmarks.cend(); ++selectedIt) {\n\t\tint benchmark = static_cast<int>(*selectedIt);\n\t\tauto seed = randSeeds[benchmark];\n\t\t\n\t\tbool anyQueueSupportsBenchmark = false;\n\t\tfor (int queue = 0; queue != QUEUE_COUNT; ++queue) {\n\t\t\tif (QUEUE_BENCH_SUPPORT[queue][benchmark]) {\n\t\t\t\tanyQueueSupportsBenchmark = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (!anyQueueSupportsBenchmark) {\n\t\t\tcontinue;\n\t\t}\n\t\t\n\t\tsayf(0, \"%s\", BENCHMARK_NAMES[benchmark]);\n\t\tif (BENCHMARK_THREADS_MEASURED[benchmark] != 0) {\n\t\t\tif (BENCHMARK_THREADS_MEASURED[benchmark] < 0) {\n\t\t\t\tsayf(0, \" (measuring all but %d %s)\", -BENCHMARK_THREADS_MEASURED[benchmark], BENCHMARK_THREADS_MEASURED[benchmark] == -1 ? \"thread\" : \"threads\");\n\t\t\t}\n\t\t\telse {\n\t\t\t\tsayf(0, \" (measuring %d %s)\", BENCHMARK_THREADS_MEASURED[benchmark], BENCHMARK_THREADS_MEASURED[benchmark] == 1 ? \"thread\" : \"threads\");\n\t\t\t}\n\t\t}\n\t\tsayf(0, \":\\n\");\n\t\tindent += 2;\n\t\tsayf(indent, \"(%s)\\n\", BENCHMARK_DESCS[benchmark]);\n\t\t\n\t\tfor (int queue = 0; queue != QUEUE_COUNT; ++queue) {\n\t\t\tsayf(indent, \"> %s\\n\", QUEUE_NAMES[queue]);\n\t\t\t\n\t\t\tif (!QUEUE_BENCH_SUPPORT[queue][benchmark]) {\n\t\t\t\tsayf(indent + 3, \"(skipping, benchmark not supported...)\\n\\n\");\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tif (QUEUE_TOKEN_SUPPORT[queue]) {\n\t\t\t\tindent += 4;\n\t\t\t}\n\t\t\tfor (int useTokens = 0; useTokens != 2; ++useTokens) {\n\t\t\t\tif (QUEUE_TOKEN_SUPPORT[queue]) {\n\t\t\t\t\tsayf(indent, \"%s tokens\\n\", useTokens == 0 ? \"Without\" : \"With\");\n\t\t\t\t}\n\t\t\t\tif (useTokens == 1 && !QUEUE_TOKEN_SUPPORT[queue]) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tindent += 3;\n\t\t\t\t\n\t\t\t\tstd::vector<double> opssts;\n\t\t\t\tstd::vector<int> threadCounts;\n\t\t\t\tfor (int nthreadIndex = 0; BENCHMARK_THREADS[benchmark][nthreadIndex] != 0; ++nthreadIndex) {\n\t\t\t\t\tint nthreads = BENCHMARK_THREADS[benchmark][nthreadIndex];\n\t\t\t\t\tint measuredThreads = nthreads;\n\t\t\t\t\tif (BENCHMARK_THREADS_MEASURED[benchmark] != 0) {\n\t\t\t\t\t\tmeasuredThreads = BENCHMARK_THREADS_MEASURED[benchmark] < 0 ? nthreads + BENCHMARK_THREADS_MEASURED[benchmark] : BENCHMARK_THREADS_MEASURED[benchmark];\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (logicalCores > 0 && (unsigned int)nthreads > 3 * logicalCores) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (QUEUE_MAX_THREADS[queue] >= 0 && QUEUE_MAX_THREADS[queue] < nthreads) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tcounter_t maxOps;\n\t\t\t\t\tswitch ((queue_id_t)queue) {\n\t\t\t\t\tcase queue_moodycamel_ConcurrentQueue:\n\t\t\t\t\t\tmaxOps = determineMaxOpsForBenchmark<moodycamel::ConcurrentQueue<int, Traits>, int>((benchmark_type_t)benchmark, nthreads, (bool)useTokens, seed);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase queue_moodycamel_BlockingConcurrentQueue:\n\t\t\t\t\t\tmaxOps = determineMaxOpsForBenchmark<moodycamel::BlockingConcurrentQueue<int, Traits>, int>((benchmark_type_t)benchmark, nthreads, (bool)useTokens, seed);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase queue_lockbased:\n\t\t\t\t\t\tmaxOps = determineMaxOpsForBenchmark<LockBasedQueue<int>, int>((benchmark_type_t)benchmark, nthreads, (bool)useTokens, seed);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase queue_simplelockfree:\n\t\t\t\t\t\tmaxOps = determineMaxOpsForBenchmark<SimpleLockFreeQueue<int>, int>((benchmark_type_t)benchmark, nthreads, (bool)useTokens, seed);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase queue_boost:\n\t\t\t\t\t\tmaxOps = determineMaxOpsForBenchmark<BoostQueueWrapper<int>, int>((benchmark_type_t)benchmark, nthreads, (bool)useTokens, seed);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase queue_tbb:\n\t\t\t\t\t\tmaxOps = determineMaxOpsForBenchmark<TbbQueueWrapper<int>, int>((benchmark_type_t)benchmark, nthreads, (bool)useTokens, seed);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase queue_std:\n\t\t\t\t\t\tmaxOps = determineMaxOpsForBenchmark<StdQueueWrapper<int>, int>((benchmark_type_t)benchmark, nthreads, (bool)useTokens, seed);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase queue_dlib:\n\t\t\t\t\t\tmaxOps = determineMaxOpsForBenchmark<DlibQueueWrapper<int>, int>((benchmark_type_t)benchmark, nthreads, (bool)useTokens, seed);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tassert(false && \"There should be a case here for every queue in the benchmarks!\");\n\t\t\t\t\t}\n\t\t\t\t\t//std::printf(\"maxOps: %llu\\n\", maxOps);\n\t\t\t\t\t\n\t\t\t\t\tint maxThreads = QUEUE_MAX_THREADS[queue];\n\t\t\t\t\tstd::vector<BenchmarkResult> results(ITERATIONS);\n\t\t\t\t\tfor (int i = 0; i < ITERATIONS; ++i) {\n\t\t\t\t\t\tdouble elapsed = 0.0;\n\t\t\t\t\t\tcounter_t ops = 0;\n\t\t\t\t\t\t\n\t\t\t\t\t\tswitch ((queue_id_t)queue) {\n\t\t\t\t\t\tcase queue_moodycamel_ConcurrentQueue:\n\t\t\t\t\t\t\telapsed = runBenchmark<moodycamel::ConcurrentQueue<int, Traits>, int>((benchmark_type_t)benchmark, nthreads, (bool)useTokens, seed, maxOps, maxThreads, ops);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase queue_moodycamel_BlockingConcurrentQueue:\n\t\t\t\t\t\t\telapsed = runBenchmark<moodycamel::BlockingConcurrentQueue<int, Traits>, int>((benchmark_type_t)benchmark, nthreads, (bool)useTokens, seed, maxOps, maxThreads, ops);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase queue_lockbased:\n\t\t\t\t\t\t\telapsed = runBenchmark<LockBasedQueue<int>, int>((benchmark_type_t)benchmark, nthreads, (bool)useTokens, seed, maxOps, maxThreads, ops);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase queue_simplelockfree:\n\t\t\t\t\t\t\telapsed = runBenchmark<SimpleLockFreeQueue<int>, int>((benchmark_type_t)benchmark, nthreads, (bool)useTokens, seed, maxOps, maxThreads, ops);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase queue_boost:\n\t\t\t\t\t\t\telapsed = runBenchmark<BoostQueueWrapper<int>, int>((benchmark_type_t)benchmark, nthreads, (bool)useTokens, seed, maxOps, maxThreads, ops);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase queue_tbb:\n\t\t\t\t\t\t\telapsed = runBenchmark<TbbQueueWrapper<int>, int>((benchmark_type_t)benchmark, nthreads, (bool)useTokens, seed, maxOps, maxThreads, ops);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase queue_std:\n\t\t\t\t\t\t\telapsed = runBenchmark<StdQueueWrapper<int>, int>((benchmark_type_t)benchmark, nthreads, (bool)useTokens, seed, maxOps, maxThreads, ops);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase queue_dlib:\n\t\t\t\t\t\t\telapsed = runBenchmark<DlibQueueWrapper<int>, int>((benchmark_type_t)benchmark, nthreads, (bool)useTokens, seed, maxOps, maxThreads, ops);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tassert(false && \"There should be a case here for every queue in the benchmarks!\");\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tresults[i].elapsedTime = elapsed;\n\t\t\t\t\t\tresults[i].operations = ops;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tstd::sort(&results[0], &results[0] + ITERATIONS);\n\t\t\t\t\tint consideredCount = std::max(2, (int)(ITERATIONS * FASTEST_PERCENT_CONSIDERED / 100));\n\t\t\t\t\t\n\t\t\t\t\tdouble min = safe_divide(results[0].elapsedTime / 1000.0, (double)results[0].operations / measuredThreads);\n\t\t\t\t\tdouble max = safe_divide(results[0].elapsedTime / 1000.0, (double)results[0].operations / measuredThreads);\n\t\t\t\t\tdouble ops = 0;\n\t\t\t\t\tdouble time = 0;\n\t\t\t\t\tfor (int i = 0; i != consideredCount; ++i) {\n\t\t\t\t\t\tdouble msPerOperation = safe_divide(results[i].elapsedTime / 1000.0, (double)results[i].operations / measuredThreads);\n\t\t\t\t\t\tif (msPerOperation < min) {\n\t\t\t\t\t\t\tmin = msPerOperation;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (msPerOperation > max) {\n\t\t\t\t\t\t\tmax = msPerOperation;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\ttime += results[i].elapsedTime;\n\t\t\t\t\t\tops += results[i].operations;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tdouble avg = safe_divide(time / 1000.0, ops / measuredThreads);\n\t\t\t\t\tdouble opsPerSecond = safe_divide(ops, time / 1000.0);\n\t\t\t\t\topsst = opsPerSecond / (double)measuredThreads;\n\t\t\t\t\t\n\t\t\t\t\topssts.push_back(opsst);\n\t\t\t\t\tthreadCounts.push_back(measuredThreads);\n\t\t\t\t\t\n\t\t\t\t\tsayf(indent, \"%-3d %7s:  Avg: %7ss  Range: [%7ss, %7ss]  Ops/s: %7s  Ops/s/t: %7s\\n\", nthreads, nthreads != 1 ? \"threads\" : \"thread\", pretty(avg), pretty(min), pretty(max), pretty(opsPerSecond), pretty(opsst));\n\t\t\t\t\tif (nthreads == 1 && BENCHMARK_SINGLE_THREAD_NOTES[benchmark][0] != '\\0') {\n\t\t\t\t\t\tsayf(indent + 7, \"^ Note: %s\\n\", BENCHMARK_SINGLE_THREAD_NOTES[benchmark]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\topsst = 0;\n\t\t\t\tdouble divisor = 0;\n\t\t\t\tfor (size_t i = 0; i != opssts.size(); ++i) {\n\t\t\t\t\topsst += opssts[i] * std::sqrt(threadCounts[i]);\n\t\t\t\t\ttotalWeightedOpsst[queue] += opssts[i] * std::sqrt(threadCounts[i]);\n\t\t\t\t\tdivisor += std::sqrt(threadCounts[i]);\n\t\t\t\t\ttotalWeight[queue] += std::sqrt(threadCounts[i]);\n\t\t\t\t}\n\t\t\t\topsst /= divisor;\n\t\t\t\tsayf(indent, \"Operations per second per thread (weighted average): %7s\\n\\n\", opsst == 0 ? \"(n/a)\" : pretty(opsst));\n\t\t\t\t\n\t\t\t\tindent -= 3;\n\t\t\t}\n\t\t\tif (QUEUE_TOKEN_SUPPORT[queue]) {\n\t\t\t\tindent -= 4;\n\t\t\t}\n\t\t}\n\t\tindent -= 2;\n\t}\n\t\n\tsayf(0, \"Overall average operations per second per thread (where higher-concurrency runs have more weight):\\n\");\n\tsayf(0, \"(Take this summary with a grain of salt -- look at the individual benchmark results for a much\\nbetter idea of how the queues measure up to each other):\\n\");\n\tfor (int queue = 0; queue != QUEUE_COUNT; ++queue) {\n\t\topsst = safe_divide(totalWeightedOpsst[queue], totalWeight[queue]);\n\t\tif (QUEUE_SUMMARY_NOTES[queue] != nullptr && QUEUE_SUMMARY_NOTES[queue][0] != '\\0') {\n\t\t\tsayf(4, \"%s (%s): %7s\\n\", QUEUE_NAMES[queue], QUEUE_SUMMARY_NOTES[queue], opsst == 0 ? \"(n/a)\" : pretty(opsst));\n\t\t}\n\t\telse {\n\t\t\tsayf(4, \"%s: %7s\\n\", QUEUE_NAMES[queue], opsst == 0 ? \"(n/a)\" : pretty(opsst));\n\t\t}\n\t}\n\t\n\treturn 0;\n}\n"
  },
  {
    "path": "benchmarks/boost/LICENSE_1_0.txt",
    "content": "Boost Software License - Version 1.0 - August 17th, 2003\r\n\r\nPermission is hereby granted, free of charge, to any person or organization\r\nobtaining a copy of the software and accompanying documentation covered by\r\nthis license (the \"Software\") to use, reproduce, display, distribute,\r\nexecute, and transmit the Software, and to prepare derivative works of the\r\nSoftware, and to permit third-parties to whom the Software is furnished to\r\ndo so, all subject to the following:\r\n\r\nThe copyright notices in the Software and this entire statement, including\r\nthe above license grant, this restriction and the following disclaimer,\r\nmust be included in all copies of the Software, in whole or in part, and\r\nall derivative works of the Software, unless such copies or derivative\r\nworks are solely in the form of machine-executable object code generated by\r\na source language processor.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT\r\nSHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE\r\nFOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,\r\nARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r\nDEALINGS IN THE SOFTWARE.\r\n"
  },
  {
    "path": "benchmarks/boost/README.txt",
    "content": "This is a partial copy of Boost 1.60, specifically only the parts that\r\nboost/lockfree/queue.hpp depends on (extracted using bcp)."
  },
  {
    "path": "benchmarks/boost/array.hpp",
    "content": "/* The following code declares class array,\n * an STL container (as wrapper) for arrays of constant size.\n *\n * See\n *      http://www.boost.org/libs/array/\n * for documentation.\n *\n * The original author site is at: http://www.josuttis.com/\n *\n * (C) Copyright Nicolai M. Josuttis 2001.\n *\n * Distributed under the Boost Software License, Version 1.0. (See\n * accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * 14 Apr 2012 - (mtc) Added support for boost::hash\n * 28 Dec 2010 - (mtc) Added cbegin and cend (and crbegin and crend) for C++Ox compatibility.\n * 10 Mar 2010 - (mtc) fill method added, matching resolution of the standard library working group.\n *      See <http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#776> or Trac issue #3168\n *      Eventually, we should remove \"assign\" which is now a synonym for \"fill\" (Marshall Clow)\n * 10 Mar 2010 - added workaround for SUNCC and !STLPort [trac #3893] (Marshall Clow)\n * 29 Jan 2004 - c_array() added, BOOST_NO_PRIVATE_IN_AGGREGATE removed (Nico Josuttis)\n * 23 Aug 2002 - fix for Non-MSVC compilers combined with MSVC libraries.\n * 05 Aug 2001 - minor update (Nico Josuttis)\n * 20 Jan 2001 - STLport fix (Beman Dawes)\n * 29 Sep 2000 - Initial Revision (Nico Josuttis)\n *\n * Jan 29, 2004\n */\n#ifndef BOOST_ARRAY_HPP\n#define BOOST_ARRAY_HPP\n\n#include <boost/detail/workaround.hpp>\n\n#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)  \n# pragma warning(push)  \n# pragma warning(disable:4996) // 'std::equal': Function call with parameters that may be unsafe\n# pragma warning(disable:4510) // boost::array<T,N>' : default constructor could not be generated \n# pragma warning(disable:4610) // warning C4610: class 'boost::array<T,N>' can never be instantiated - user defined constructor required \n#endif\n\n#include <cstddef>\n#include <stdexcept>\n#include <boost/assert.hpp>\n#include <boost/swap.hpp>\n\n// Handles broken standard libraries better than <iterator>\n#include <boost/detail/iterator.hpp>\n#include <boost/throw_exception.hpp>\n#include <boost/functional/hash_fwd.hpp>\n#include <algorithm>\n\n// FIXES for broken compilers\n#include <boost/config.hpp>\n\n\nnamespace boost {\n\n    template<class T, std::size_t N>\n    class array {\n      public:\n        T elems[N];    // fixed-size array of elements of type T\n\n      public:\n        // type definitions\n        typedef T              value_type;\n        typedef T*             iterator;\n        typedef const T*       const_iterator;\n        typedef T&             reference;\n        typedef const T&       const_reference;\n        typedef std::size_t    size_type;\n        typedef std::ptrdiff_t difference_type;\n\n        // iterator support\n        iterator        begin()       { return elems; }\n        const_iterator  begin() const { return elems; }\n        const_iterator cbegin() const { return elems; }\n        \n        iterator        end()       { return elems+N; }\n        const_iterator  end() const { return elems+N; }\n        const_iterator cend() const { return elems+N; }\n\n        // reverse iterator support\n#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_MSVC_STD_ITERATOR) && !defined(BOOST_NO_STD_ITERATOR_TRAITS)\n        typedef std::reverse_iterator<iterator> reverse_iterator;\n        typedef std::reverse_iterator<const_iterator> const_reverse_iterator;\n#elif defined(_MSC_VER) && (_MSC_VER == 1300) && defined(BOOST_DINKUMWARE_STDLIB) && (BOOST_DINKUMWARE_STDLIB == 310)\n        // workaround for broken reverse_iterator in VC7\n        typedef std::reverse_iterator<std::_Ptrit<value_type, difference_type, iterator,\n                                      reference, iterator, reference> > reverse_iterator;\n        typedef std::reverse_iterator<std::_Ptrit<value_type, difference_type, const_iterator,\n                                      const_reference, iterator, reference> > const_reverse_iterator;\n#elif defined(_RWSTD_NO_CLASS_PARTIAL_SPEC) \n        typedef std::reverse_iterator<iterator, std::random_access_iterator_tag, \n              value_type, reference, iterator, difference_type> reverse_iterator; \n        typedef std::reverse_iterator<const_iterator, std::random_access_iterator_tag,\n              value_type, const_reference, const_iterator, difference_type> const_reverse_iterator;\n#else\n        // workaround for broken reverse_iterator implementations\n        typedef std::reverse_iterator<iterator,T> reverse_iterator;\n        typedef std::reverse_iterator<const_iterator,T> const_reverse_iterator;\n#endif\n\n        reverse_iterator rbegin() { return reverse_iterator(end()); }\n        const_reverse_iterator rbegin() const {\n            return const_reverse_iterator(end());\n        }\n        const_reverse_iterator crbegin() const {\n            return const_reverse_iterator(end());\n        }\n\n        reverse_iterator rend() { return reverse_iterator(begin()); }\n        const_reverse_iterator rend() const {\n            return const_reverse_iterator(begin());\n        }\n        const_reverse_iterator crend() const {\n            return const_reverse_iterator(begin());\n        }\n\n        // operator[]\n        reference operator[](size_type i) \n        { \n            BOOST_ASSERT_MSG( i < N, \"out of range\" );\n            return elems[i];\n        }\n        \n        const_reference operator[](size_type i) const \n        {     \n            BOOST_ASSERT_MSG( i < N, \"out of range\" );\n            return elems[i]; \n        }\n\n        // at() with range check\n        reference at(size_type i) { rangecheck(i); return elems[i]; }\n        const_reference at(size_type i) const { rangecheck(i); return elems[i]; }\n    \n        // front() and back()\n        reference front() \n        { \n            return elems[0]; \n        }\n        \n        const_reference front() const \n        {\n            return elems[0];\n        }\n        \n        reference back() \n        { \n            return elems[N-1]; \n        }\n        \n        const_reference back() const \n        { \n            return elems[N-1]; \n        }\n\n        // size is constant\n        static size_type size() { return N; }\n        static bool empty() { return false; }\n        static size_type max_size() { return N; }\n        enum { static_size = N };\n\n        // swap (note: linear complexity)\n        void swap (array<T,N>& y) {\n            for (size_type i = 0; i < N; ++i)\n                boost::swap(elems[i],y.elems[i]);\n        }\n\n        // direct access to data (read-only)\n        const T* data() const { return elems; }\n        T* data() { return elems; }\n\n        // use array as C array (direct read/write access to data)\n        T* c_array() { return elems; }\n\n        // assignment with type conversion\n        template <typename T2>\n        array<T,N>& operator= (const array<T2,N>& rhs) {\n            std::copy(rhs.begin(),rhs.end(), begin());\n            return *this;\n        }\n\n        // assign one value to all elements\n        void assign (const T& value) { fill ( value ); }    // A synonym for fill\n        void fill   (const T& value)\n        {\n            std::fill_n(begin(),size(),value);\n        }\n\n        // check range (may be private because it is static)\n        static void rangecheck (size_type i) {\n            if (i >= size()) {\n                std::out_of_range e(\"array<>: index out of range\");\n                boost::throw_exception(e);\n            }\n        }\n\n    };\n\n#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)\n    template< class T >\n    class array< T, 0 > {\n\n      public:\n        // type definitions\n        typedef T              value_type;\n        typedef T*             iterator;\n        typedef const T*       const_iterator;\n        typedef T&             reference;\n        typedef const T&       const_reference;\n        typedef std::size_t    size_type;\n        typedef std::ptrdiff_t difference_type;\n\n        // iterator support\n        iterator        begin()       { return       iterator( reinterpret_cast<       T * >( this ) ); }\n        const_iterator  begin() const { return const_iterator( reinterpret_cast< const T * >( this ) ); }\n        const_iterator cbegin() const { return const_iterator( reinterpret_cast< const T * >( this ) ); }\n\n        iterator        end()       { return  begin(); }\n        const_iterator  end() const { return  begin(); }\n        const_iterator cend() const { return cbegin(); }\n\n        // reverse iterator support\n#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_MSVC_STD_ITERATOR) && !defined(BOOST_NO_STD_ITERATOR_TRAITS)\n        typedef std::reverse_iterator<iterator> reverse_iterator;\n        typedef std::reverse_iterator<const_iterator> const_reverse_iterator;\n#elif defined(_MSC_VER) && (_MSC_VER == 1300) && defined(BOOST_DINKUMWARE_STDLIB) && (BOOST_DINKUMWARE_STDLIB == 310)\n        // workaround for broken reverse_iterator in VC7\n        typedef std::reverse_iterator<std::_Ptrit<value_type, difference_type, iterator,\n                                      reference, iterator, reference> > reverse_iterator;\n        typedef std::reverse_iterator<std::_Ptrit<value_type, difference_type, const_iterator,\n                                      const_reference, iterator, reference> > const_reverse_iterator;\n#elif defined(_RWSTD_NO_CLASS_PARTIAL_SPEC) \n        typedef std::reverse_iterator<iterator, std::random_access_iterator_tag, \n              value_type, reference, iterator, difference_type> reverse_iterator; \n        typedef std::reverse_iterator<const_iterator, std::random_access_iterator_tag,\n              value_type, const_reference, const_iterator, difference_type> const_reverse_iterator;\n#else\n        // workaround for broken reverse_iterator implementations\n        typedef std::reverse_iterator<iterator,T> reverse_iterator;\n        typedef std::reverse_iterator<const_iterator,T> const_reverse_iterator;\n#endif\n\n        reverse_iterator rbegin() { return reverse_iterator(end()); }\n        const_reverse_iterator rbegin() const {\n            return const_reverse_iterator(end());\n        }\n        const_reverse_iterator crbegin() const {\n            return const_reverse_iterator(end());\n        }\n\n        reverse_iterator rend() { return reverse_iterator(begin()); }\n        const_reverse_iterator rend() const {\n            return const_reverse_iterator(begin());\n        }\n        const_reverse_iterator crend() const {\n            return const_reverse_iterator(begin());\n        }\n\n        // operator[]\n        reference operator[](size_type /*i*/)\n        {\n            return failed_rangecheck();\n        }\n\n        const_reference operator[](size_type /*i*/) const\n        {\n            return failed_rangecheck();\n        }\n\n        // at() with range check\n        reference at(size_type /*i*/)               {   return failed_rangecheck(); }\n        const_reference at(size_type /*i*/) const   {   return failed_rangecheck(); }\n\n        // front() and back()\n        reference front()\n        {\n            return failed_rangecheck();\n        }\n\n        const_reference front() const\n        {\n            return failed_rangecheck();\n        }\n\n        reference back()\n        {\n            return failed_rangecheck();\n        }\n\n        const_reference back() const\n        {\n            return failed_rangecheck();\n        }\n\n        // size is constant\n        static size_type size() { return 0; }\n        static bool empty() { return true; }\n        static size_type max_size() { return 0; }\n        enum { static_size = 0 };\n\n        void swap (array<T,0>& /*y*/) {\n        }\n\n        // direct access to data (read-only)\n        const T* data() const { return 0; }\n        T* data() { return 0; }\n\n        // use array as C array (direct read/write access to data)\n        T* c_array() { return 0; }\n\n        // assignment with type conversion\n        template <typename T2>\n        array<T,0>& operator= (const array<T2,0>& ) {\n            return *this;\n        }\n\n        // assign one value to all elements\n        void assign (const T& value) { fill ( value ); }\n        void fill   (const T& ) {}\n        \n        // check range (may be private because it is static)\n        static reference failed_rangecheck () {\n                std::out_of_range e(\"attempt to access element of an empty array\");\n                boost::throw_exception(e);\n#if defined(BOOST_NO_EXCEPTIONS) || (!defined(BOOST_MSVC) && !defined(__PATHSCALE__))\n                //\n                // We need to return something here to keep\n                // some compilers happy: however we will never\n                // actually get here....\n                //\n                static T placeholder;\n                return placeholder;\n#endif\n            }\n    };\n#endif\n\n    // comparisons\n    template<class T, std::size_t N>\n    bool operator== (const array<T,N>& x, const array<T,N>& y) {\n        return std::equal(x.begin(), x.end(), y.begin());\n    }\n    template<class T, std::size_t N>\n    bool operator< (const array<T,N>& x, const array<T,N>& y) {\n        return std::lexicographical_compare(x.begin(),x.end(),y.begin(),y.end());\n    }\n    template<class T, std::size_t N>\n    bool operator!= (const array<T,N>& x, const array<T,N>& y) {\n        return !(x==y);\n    }\n    template<class T, std::size_t N>\n    bool operator> (const array<T,N>& x, const array<T,N>& y) {\n        return y<x;\n    }\n    template<class T, std::size_t N>\n    bool operator<= (const array<T,N>& x, const array<T,N>& y) {\n        return !(y<x);\n    }\n    template<class T, std::size_t N>\n    bool operator>= (const array<T,N>& x, const array<T,N>& y) {\n        return !(x<y);\n    }\n\n    // global swap()\n    template<class T, std::size_t N>\n    inline void swap (array<T,N>& x, array<T,N>& y) {\n        x.swap(y);\n    }\n\n#if defined(__SUNPRO_CC)\n//  Trac ticket #4757; the Sun Solaris compiler can't handle\n//  syntax like 'T(&get_c_array(boost::array<T,N>& arg))[N]'\n//  \n//  We can't just use this for all compilers, because the \n//      borland compilers can't handle this form. \n    namespace detail {\n       template <typename T, std::size_t N> struct c_array\n       {\n           typedef T type[N];\n       };\n    }\n    \n   // Specific for boost::array: simply returns its elems data member.\n   template <typename T, std::size_t N>\n   typename detail::c_array<T,N>::type& get_c_array(boost::array<T,N>& arg)\n   {\n       return arg.elems;\n   }\n\n   // Specific for boost::array: simply returns its elems data member.\n   template <typename T, std::size_t N>\n   typename const detail::c_array<T,N>::type& get_c_array(const boost::array<T,N>& arg)\n   {\n       return arg.elems;\n   }\n#else\n// Specific for boost::array: simply returns its elems data member.\n    template <typename T, std::size_t N>\n    T(&get_c_array(boost::array<T,N>& arg))[N]\n    {\n        return arg.elems;\n    }\n    \n    // Const version.\n    template <typename T, std::size_t N>\n    const T(&get_c_array(const boost::array<T,N>& arg))[N]\n    {\n        return arg.elems;\n    }\n#endif\n    \n#if 0\n    // Overload for std::array, assuming that std::array will have\n    // explicit conversion functions as discussed at the WG21 meeting\n    // in Summit, March 2009.\n    template <typename T, std::size_t N>\n    T(&get_c_array(std::array<T,N>& arg))[N]\n    {\n        return static_cast<T(&)[N]>(arg);\n    }\n    \n    // Const version.\n    template <typename T, std::size_t N>\n    const T(&get_c_array(const std::array<T,N>& arg))[N]\n    {\n        return static_cast<T(&)[N]>(arg);\n    }\n#endif\n\n\n    template<class T, std::size_t N>\n    std::size_t hash_value(const array<T,N>& arr)\n    {\n        return boost::hash_range(arr.begin(), arr.end());\n    }\n\n} /* namespace boost */\n\n\n#if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)  \n# pragma warning(pop)  \n#endif \n\n#endif /*BOOST_ARRAY_HPP*/\n"
  },
  {
    "path": "benchmarks/boost/assert.hpp",
    "content": "//\n//  boost/assert.hpp - BOOST_ASSERT(expr)\n//                     BOOST_ASSERT_MSG(expr, msg)\n//                     BOOST_VERIFY(expr)\n//                     BOOST_VERIFY_MSG(expr, msg)\n//                     BOOST_ASSERT_IS_VOID\n//\n//  Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd.\n//  Copyright (c) 2007, 2014 Peter Dimov\n//  Copyright (c) Beman Dawes 2011\n//  Copyright (c) 2015 Ion Gaztanaga\n//\n//  Distributed under the Boost Software License, Version 1.0.\n//  See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt\n//\n//  Note: There are no include guards. This is intentional.\n//\n//  See http://www.boost.org/libs/assert/assert.html for documentation.\n//\n\n//\n// Stop inspect complaining about use of 'assert':\n//\n// boostinspect:naassert_macro\n//\n\n//\n// BOOST_ASSERT, BOOST_ASSERT_MSG, BOOST_ASSERT_IS_VOID\n//\n\n#undef BOOST_ASSERT\n#undef BOOST_ASSERT_MSG\n#undef BOOST_ASSERT_IS_VOID\n\n#if defined(BOOST_DISABLE_ASSERTS) || ( defined(BOOST_ENABLE_ASSERT_DEBUG_HANDLER) && defined(NDEBUG) )\n\n# define BOOST_ASSERT(expr) ((void)0)\n# define BOOST_ASSERT_MSG(expr, msg) ((void)0)\n# define BOOST_ASSERT_IS_VOID\n\n#elif defined(BOOST_ENABLE_ASSERT_HANDLER) || ( defined(BOOST_ENABLE_ASSERT_DEBUG_HANDLER) && !defined(NDEBUG) )\n\n#include <boost/config.hpp> // for BOOST_LIKELY\n#include <boost/current_function.hpp>\n\nnamespace boost\n{\n    void assertion_failed(char const * expr, char const * function, char const * file, long line); // user defined\n    void assertion_failed_msg(char const * expr, char const * msg, char const * function, char const * file, long line); // user defined\n} // namespace boost\n\n#define BOOST_ASSERT(expr) (BOOST_LIKELY(!!(expr))? ((void)0): ::boost::assertion_failed(#expr, BOOST_CURRENT_FUNCTION, __FILE__, __LINE__))\n#define BOOST_ASSERT_MSG(expr, msg) (BOOST_LIKELY(!!(expr))? ((void)0): ::boost::assertion_failed_msg(#expr, msg, BOOST_CURRENT_FUNCTION, __FILE__, __LINE__))\n\n#else\n\n# include <assert.h> // .h to support old libraries w/o <cassert> - effect is the same\n\n# define BOOST_ASSERT(expr) assert(expr)\n# define BOOST_ASSERT_MSG(expr, msg) assert((expr)&&(msg))\n#if defined(NDEBUG)\n# define BOOST_ASSERT_IS_VOID\n#endif\n\n#endif\n\n//\n// BOOST_VERIFY, BOOST_VERIFY_MSG\n//\n\n#undef BOOST_VERIFY\n#undef BOOST_VERIFY_MSG\n\n#if defined(BOOST_DISABLE_ASSERTS) || ( !defined(BOOST_ENABLE_ASSERT_HANDLER) && defined(NDEBUG) )\n\n# define BOOST_VERIFY(expr) ((void)(expr))\n# define BOOST_VERIFY_MSG(expr, msg) ((void)(expr))\n\n#else\n\n# define BOOST_VERIFY(expr) BOOST_ASSERT(expr)\n# define BOOST_VERIFY_MSG(expr, msg) BOOST_ASSERT_MSG(expr,msg)\n\n#endif\n"
  },
  {
    "path": "benchmarks/boost/atomic/atomic.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2011 Helge Bahmann\n * Copyright (c) 2013 Tim Blechmann\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/atomic.hpp\n *\n * This header contains definition of \\c atomic template and \\c atomic_flag.\n */\n\n#ifndef BOOST_ATOMIC_ATOMIC_HPP_INCLUDED_\n#define BOOST_ATOMIC_ATOMIC_HPP_INCLUDED_\n\n#include <boost/atomic/capabilities.hpp>\n#include <boost/atomic/fences.hpp>\n#include <boost/atomic/atomic_flag.hpp>\n#include <boost/atomic/detail/atomic_template.hpp>\n#include <boost/atomic/detail/operations.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\nnamespace boost {\n\nusing atomics::atomic;\n\nusing atomics::atomic_char;\nusing atomics::atomic_uchar;\nusing atomics::atomic_schar;\nusing atomics::atomic_uint8_t;\nusing atomics::atomic_int8_t;\nusing atomics::atomic_ushort;\nusing atomics::atomic_short;\nusing atomics::atomic_uint16_t;\nusing atomics::atomic_int16_t;\nusing atomics::atomic_uint;\nusing atomics::atomic_int;\nusing atomics::atomic_uint32_t;\nusing atomics::atomic_int32_t;\nusing atomics::atomic_ulong;\nusing atomics::atomic_long;\nusing atomics::atomic_uint64_t;\nusing atomics::atomic_int64_t;\n#ifdef BOOST_HAS_LONG_LONG\nusing atomics::atomic_ullong;\nusing atomics::atomic_llong;\n#endif\nusing atomics::atomic_address;\nusing atomics::atomic_bool;\nusing atomics::atomic_wchar_t;\n#if !defined(BOOST_NO_CXX11_CHAR16_T)\nusing atomics::atomic_char16_t;\n#endif\n#if !defined(BOOST_NO_CXX11_CHAR32_T)\nusing atomics::atomic_char32_t;\n#endif\n\nusing atomics::atomic_int_least8_t;\nusing atomics::atomic_uint_least8_t;\nusing atomics::atomic_int_least16_t;\nusing atomics::atomic_uint_least16_t;\nusing atomics::atomic_int_least32_t;\nusing atomics::atomic_uint_least32_t;\nusing atomics::atomic_int_least64_t;\nusing atomics::atomic_uint_least64_t;\nusing atomics::atomic_int_fast8_t;\nusing atomics::atomic_uint_fast8_t;\nusing atomics::atomic_int_fast16_t;\nusing atomics::atomic_uint_fast16_t;\nusing atomics::atomic_int_fast32_t;\nusing atomics::atomic_uint_fast32_t;\nusing atomics::atomic_int_fast64_t;\nusing atomics::atomic_uint_fast64_t;\nusing atomics::atomic_intmax_t;\nusing atomics::atomic_uintmax_t;\n\nusing atomics::atomic_size_t;\nusing atomics::atomic_ptrdiff_t;\n\n#if defined(BOOST_HAS_INTPTR_T)\nusing atomics::atomic_intptr_t;\nusing atomics::atomic_uintptr_t;\n#endif\n\n} // namespace boost\n\n#endif // BOOST_ATOMIC_ATOMIC_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/atomic_flag.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2011 Helge Bahmann\n * Copyright (c) 2013 Tim Blechmann\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/atomic_flag.hpp\n *\n * This header contains definition of \\c atomic_flag.\n */\n\n#ifndef BOOST_ATOMIC_ATOMIC_FLAG_HPP_INCLUDED_\n#define BOOST_ATOMIC_ATOMIC_FLAG_HPP_INCLUDED_\n\n#include <boost/atomic/capabilities.hpp>\n#include <boost/atomic/detail/operations.hpp>\n#include <boost/atomic/detail/atomic_flag.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\nnamespace boost {\n\nusing atomics::atomic_flag;\n\n} // namespace boost\n\n#endif // BOOST_ATOMIC_ATOMIC_FLAG_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/capabilities.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/capabilities.hpp\n *\n * This header defines feature capabilities macros.\n */\n\n#ifndef BOOST_ATOMIC_CAPABILITIES_HPP_INCLUDED_\n#define BOOST_ATOMIC_CAPABILITIES_HPP_INCLUDED_\n\n#include <boost/atomic/detail/config.hpp>\n#include <boost/atomic/detail/platform.hpp>\n#include <boost/atomic/detail/int_sizes.hpp>\n\n#if !defined(BOOST_ATOMIC_EMULATED)\n#include BOOST_ATOMIC_DETAIL_HEADER(boost/atomic/detail/caps_)\n#endif\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\n#ifndef BOOST_ATOMIC_INT8_LOCK_FREE\n#define BOOST_ATOMIC_INT8_LOCK_FREE 0\n#endif\n\n#ifndef BOOST_ATOMIC_INT16_LOCK_FREE\n#define BOOST_ATOMIC_INT16_LOCK_FREE 0\n#endif\n\n#ifndef BOOST_ATOMIC_INT32_LOCK_FREE\n#define BOOST_ATOMIC_INT32_LOCK_FREE 0\n#endif\n\n#ifndef BOOST_ATOMIC_INT64_LOCK_FREE\n#define BOOST_ATOMIC_INT64_LOCK_FREE 0\n#endif\n\n#ifndef BOOST_ATOMIC_INT128_LOCK_FREE\n#define BOOST_ATOMIC_INT128_LOCK_FREE 0\n#endif\n\n\n#ifndef BOOST_ATOMIC_CHAR_LOCK_FREE\n#define BOOST_ATOMIC_CHAR_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE\n#endif\n\n#ifndef BOOST_ATOMIC_CHAR16_T_LOCK_FREE\n#define BOOST_ATOMIC_CHAR16_T_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE\n#endif\n\n#ifndef BOOST_ATOMIC_CHAR32_T_LOCK_FREE\n#define BOOST_ATOMIC_CHAR32_T_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE\n#endif\n\n#ifndef BOOST_ATOMIC_WCHAR_T_LOCK_FREE\n#if BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 1\n#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE\n#elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 2\n#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE\n#elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 4\n#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE\n#elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 8\n#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE\n#else\n#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 0\n#endif\n#endif\n\n#ifndef BOOST_ATOMIC_SHORT_LOCK_FREE\n#if BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 1\n#define BOOST_ATOMIC_SHORT_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE\n#elif BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 2\n#define BOOST_ATOMIC_SHORT_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE\n#elif BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 4\n#define BOOST_ATOMIC_SHORT_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE\n#elif BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 8\n#define BOOST_ATOMIC_SHORT_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE\n#else\n#define BOOST_ATOMIC_SHORT_LOCK_FREE 0\n#endif\n#endif\n\n#ifndef BOOST_ATOMIC_INT_LOCK_FREE\n#if BOOST_ATOMIC_DETAIL_SIZEOF_INT == 1\n#define BOOST_ATOMIC_INT_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE\n#elif BOOST_ATOMIC_DETAIL_SIZEOF_INT == 2\n#define BOOST_ATOMIC_INT_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE\n#elif BOOST_ATOMIC_DETAIL_SIZEOF_INT == 4\n#define BOOST_ATOMIC_INT_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE\n#elif BOOST_ATOMIC_DETAIL_SIZEOF_INT == 8\n#define BOOST_ATOMIC_INT_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE\n#else\n#define BOOST_ATOMIC_INT_LOCK_FREE 0\n#endif\n#endif\n\n#ifndef BOOST_ATOMIC_LONG_LOCK_FREE\n#if BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 1\n#define BOOST_ATOMIC_LONG_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE\n#elif BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 2\n#define BOOST_ATOMIC_LONG_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE\n#elif BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 4\n#define BOOST_ATOMIC_LONG_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE\n#elif BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 8\n#define BOOST_ATOMIC_LONG_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE\n#else\n#define BOOST_ATOMIC_LONG_LOCK_FREE 0\n#endif\n#endif\n\n#ifndef BOOST_ATOMIC_LLONG_LOCK_FREE\n#if BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 1\n#define BOOST_ATOMIC_LLONG_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE\n#elif BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 2\n#define BOOST_ATOMIC_LLONG_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE\n#elif BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 4\n#define BOOST_ATOMIC_LLONG_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE\n#elif BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 8\n#define BOOST_ATOMIC_LLONG_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE\n#else\n#define BOOST_ATOMIC_LLONG_LOCK_FREE 0\n#endif\n#endif\n\n#ifndef BOOST_ATOMIC_POINTER_LOCK_FREE\n#if (BOOST_ATOMIC_DETAIL_SIZEOF_POINTER + 0) == 8\n#define BOOST_ATOMIC_POINTER_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE\n#elif (BOOST_ATOMIC_DETAIL_SIZEOF_POINTER + 0) == 4\n#define BOOST_ATOMIC_POINTER_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE\n#else\n#define BOOST_ATOMIC_POINTER_LOCK_FREE 0\n#endif\n#endif\n\n#define BOOST_ATOMIC_ADDRESS_LOCK_FREE BOOST_ATOMIC_POINTER_LOCK_FREE\n\n#ifndef BOOST_ATOMIC_BOOL_LOCK_FREE\n// We store bools in 1-byte storage in all backends\n#define BOOST_ATOMIC_BOOL_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE\n#endif\n\n#ifndef BOOST_ATOMIC_FLAG_LOCK_FREE\n#define BOOST_ATOMIC_FLAG_LOCK_FREE BOOST_ATOMIC_BOOL_LOCK_FREE\n#endif\n\n#ifndef BOOST_ATOMIC_THREAD_FENCE\n#define BOOST_ATOMIC_THREAD_FENCE 0\n#endif\n\n#ifndef BOOST_ATOMIC_SIGNAL_FENCE\n#define BOOST_ATOMIC_SIGNAL_FENCE 0\n#endif\n\n#endif // BOOST_ATOMIC_CAPABILITIES_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/atomic_flag.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/atomic_flag.hpp\n *\n * This header contains interface definition of \\c atomic_flag.\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_ATOMIC_FLAG_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_ATOMIC_FLAG_HPP_INCLUDED_\n\n#include <boost/assert.hpp>\n#include <boost/memory_order.hpp>\n#include <boost/atomic/detail/config.hpp>\n#include <boost/atomic/detail/operations_lockfree.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\n/*\n * IMPLEMENTATION NOTE: All interface functions MUST be declared with BOOST_FORCEINLINE,\n *                      see comment for convert_memory_order_to_gcc in ops_gcc_atomic.hpp.\n */\n\nnamespace boost {\nnamespace atomics {\n\n#if defined(BOOST_NO_CXX11_CONSTEXPR) || defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX)\n#define BOOST_ATOMIC_NO_ATOMIC_FLAG_INIT\n#else\n#define BOOST_ATOMIC_FLAG_INIT {}\n#endif\n\nstruct atomic_flag\n{\n    typedef atomics::detail::operations< 1u, false > operations;\n    typedef operations::storage_type storage_type;\n\n    operations::aligned_storage_type m_storage;\n\n    BOOST_FORCEINLINE BOOST_CONSTEXPR atomic_flag() BOOST_NOEXCEPT : m_storage(0)\n    {\n    }\n\n    BOOST_FORCEINLINE bool test_and_set(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT\n    {\n        return operations::test_and_set(m_storage.value, order);\n    }\n\n    BOOST_FORCEINLINE void clear(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT\n    {\n        BOOST_ASSERT(order != memory_order_acquire);\n        BOOST_ASSERT(order != memory_order_acq_rel);\n        operations::clear(m_storage.value, order);\n    }\n\n    BOOST_DELETED_FUNCTION(atomic_flag(atomic_flag const&))\n    BOOST_DELETED_FUNCTION(atomic_flag& operator= (atomic_flag const&))\n};\n\n} // namespace atomics\n} // namespace boost\n\n#endif // BOOST_ATOMIC_DETAIL_ATOMIC_FLAG_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/atomic_template.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2011 Helge Bahmann\n * Copyright (c) 2013 Tim Blechmann\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/atomic_template.hpp\n *\n * This header contains interface definition of \\c atomic template.\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_ATOMIC_TEMPLATE_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_ATOMIC_TEMPLATE_HPP_INCLUDED_\n\n#include <cstddef>\n#include <boost/cstdint.hpp>\n#include <boost/assert.hpp>\n#include <boost/type_traits/is_signed.hpp>\n#include <boost/type_traits/is_integral.hpp>\n#include <boost/atomic/detail/config.hpp>\n#include <boost/atomic/detail/bitwise_cast.hpp>\n#include <boost/atomic/detail/operations_fwd.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\n#if defined(BOOST_MSVC)\n#pragma warning(push)\n// 'boost::atomics::atomic<T>' : multiple assignment operators specified\n#pragma warning(disable: 4522)\n#endif\n\n/*\n * IMPLEMENTATION NOTE: All interface functions MUST be declared with BOOST_FORCEINLINE,\n *                      see comment for convert_memory_order_to_gcc in ops_gcc_atomic.hpp.\n */\n\nnamespace boost {\nnamespace atomics {\nnamespace detail {\n\nBOOST_FORCEINLINE BOOST_CONSTEXPR memory_order deduce_failure_order(memory_order order) BOOST_NOEXCEPT\n{\n    return order == memory_order_acq_rel ? memory_order_acquire : (order == memory_order_release ? memory_order_relaxed : order);\n}\n\nBOOST_FORCEINLINE BOOST_CONSTEXPR bool cas_failure_order_must_not_be_stronger_than_success_order(memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n{\n    // 15 == (memory_order_seq_cst | memory_order_consume), see memory_order.hpp\n    // Given the enum values we can test the strength of memory order requirements with this single condition.\n    return (failure_order & 15u) <= (success_order & 15u);\n}\n\ntemplate< typename T, bool IsInt = boost::is_integral< T >::value >\nstruct classify\n{\n    typedef void type;\n};\n\ntemplate< typename T >\nstruct classify< T, true > { typedef int type; };\n\ntemplate< typename T >\nstruct classify< T*, false > { typedef void* type; };\n\ntemplate< typename T, typename Kind >\nclass base_atomic;\n\n//! Implementation for integers\ntemplate< typename T >\nclass base_atomic< T, int >\n{\nprivate:\n    typedef T value_type;\n    typedef T difference_type;\n    typedef atomics::detail::operations< storage_size_of< value_type >::value, boost::is_signed< T >::value > operations;\n\nprotected:\n    typedef value_type value_arg_type;\n\npublic:\n    typedef typename operations::storage_type storage_type;\n\nprotected:\n    typename operations::aligned_storage_type m_storage;\n\npublic:\n    BOOST_DEFAULTED_FUNCTION(base_atomic(), {})\n    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : m_storage(v) {}\n\n    BOOST_FORCEINLINE void store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT\n    {\n        BOOST_ASSERT(order != memory_order_consume);\n        BOOST_ASSERT(order != memory_order_acquire);\n        BOOST_ASSERT(order != memory_order_acq_rel);\n\n        operations::store(m_storage.value, static_cast< storage_type >(v), order);\n    }\n\n    BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT\n    {\n        BOOST_ASSERT(order != memory_order_release);\n        BOOST_ASSERT(order != memory_order_acq_rel);\n\n        return static_cast< value_type >(operations::load(m_storage.value, order));\n    }\n\n    BOOST_FORCEINLINE value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT\n    {\n        return static_cast< value_type >(operations::fetch_add(m_storage.value, static_cast< storage_type >(v), order));\n    }\n\n    BOOST_FORCEINLINE value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT\n    {\n        return static_cast< value_type >(operations::fetch_sub(m_storage.value, static_cast< storage_type >(v), order));\n    }\n\n    BOOST_FORCEINLINE value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT\n    {\n        return static_cast< value_type >(operations::exchange(m_storage.value, static_cast< storage_type >(v), order));\n    }\n\n    BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT\n    {\n        BOOST_ASSERT(failure_order != memory_order_release);\n        BOOST_ASSERT(failure_order != memory_order_acq_rel);\n        BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));\n\n        storage_type old_value = static_cast< storage_type >(expected);\n        const bool res = operations::compare_exchange_strong(m_storage.value, old_value, static_cast< storage_type >(desired), success_order, failure_order);\n        expected = static_cast< value_type >(old_value);\n        return res;\n    }\n\n    BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT\n    {\n        return compare_exchange_strong(expected, desired, order, atomics::detail::deduce_failure_order(order));\n    }\n\n    BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT\n    {\n        BOOST_ASSERT(failure_order != memory_order_release);\n        BOOST_ASSERT(failure_order != memory_order_acq_rel);\n        BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));\n\n        storage_type old_value = static_cast< storage_type >(expected);\n        const bool res = operations::compare_exchange_weak(m_storage.value, old_value, static_cast< storage_type >(desired), success_order, failure_order);\n        expected = static_cast< value_type >(old_value);\n        return res;\n    }\n\n    BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT\n    {\n        return compare_exchange_weak(expected, desired, order, atomics::detail::deduce_failure_order(order));\n    }\n\n    BOOST_FORCEINLINE value_type fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT\n    {\n        return static_cast< value_type >(operations::fetch_and(m_storage.value, static_cast< storage_type >(v), order));\n    }\n\n    BOOST_FORCEINLINE value_type fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT\n    {\n        return static_cast< value_type >(operations::fetch_or(m_storage.value, static_cast< storage_type >(v), order));\n    }\n\n    BOOST_FORCEINLINE value_type fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT\n    {\n        return static_cast< value_type >(operations::fetch_xor(m_storage.value, static_cast< storage_type >(v), order));\n    }\n\n    BOOST_FORCEINLINE bool is_lock_free() const volatile BOOST_NOEXCEPT\n    {\n        return operations::is_lock_free(m_storage.value);\n    }\n\n    BOOST_FORCEINLINE value_type operator++(int) volatile BOOST_NOEXCEPT\n    {\n        return fetch_add(1);\n    }\n\n    BOOST_FORCEINLINE value_type operator++() volatile BOOST_NOEXCEPT\n    {\n        return fetch_add(1) + 1;\n    }\n\n    BOOST_FORCEINLINE value_type operator--(int) volatile BOOST_NOEXCEPT\n    {\n        return fetch_sub(1);\n    }\n\n    BOOST_FORCEINLINE value_type operator--() volatile BOOST_NOEXCEPT\n    {\n        return fetch_sub(1) - 1;\n    }\n\n    BOOST_FORCEINLINE value_type operator+=(difference_type v) volatile BOOST_NOEXCEPT\n    {\n        return fetch_add(v) + v;\n    }\n\n    BOOST_FORCEINLINE value_type operator-=(difference_type v) volatile BOOST_NOEXCEPT\n    {\n        return fetch_sub(v) - v;\n    }\n\n    BOOST_FORCEINLINE value_type operator&=(value_type v) volatile BOOST_NOEXCEPT\n    {\n        return fetch_and(v) & v;\n    }\n\n    BOOST_FORCEINLINE value_type operator|=(value_type v) volatile BOOST_NOEXCEPT\n    {\n        return fetch_or(v) | v;\n    }\n\n    BOOST_FORCEINLINE value_type operator^=(value_type v) volatile BOOST_NOEXCEPT\n    {\n        return fetch_xor(v) ^ v;\n    }\n\n    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))\n    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))\n};\n\n//! Implementation for bool\ntemplate< >\nclass base_atomic< bool, int >\n{\nprivate:\n    typedef bool value_type;\n    typedef atomics::detail::operations< 1u, false > operations;\n\nprotected:\n    typedef value_type value_arg_type;\n\npublic:\n    typedef operations::storage_type storage_type;\n\nprotected:\n    operations::aligned_storage_type m_storage;\n\npublic:\n    BOOST_DEFAULTED_FUNCTION(base_atomic(), {})\n    BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : m_storage(v) {}\n\n    BOOST_FORCEINLINE void store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT\n    {\n        BOOST_ASSERT(order != memory_order_consume);\n        BOOST_ASSERT(order != memory_order_acquire);\n        BOOST_ASSERT(order != memory_order_acq_rel);\n\n        operations::store(m_storage.value, static_cast< storage_type >(v), order);\n    }\n\n    BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT\n    {\n        BOOST_ASSERT(order != memory_order_release);\n        BOOST_ASSERT(order != memory_order_acq_rel);\n\n        return !!operations::load(m_storage.value, order);\n    }\n\n    BOOST_FORCEINLINE value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT\n    {\n        return !!operations::exchange(m_storage.value, static_cast< storage_type >(v), order);\n    }\n\n    BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT\n    {\n        BOOST_ASSERT(failure_order != memory_order_release);\n        BOOST_ASSERT(failure_order != memory_order_acq_rel);\n        BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));\n\n        storage_type old_value = static_cast< storage_type >(expected);\n        const bool res = operations::compare_exchange_strong(m_storage.value, old_value, static_cast< storage_type >(desired), success_order, failure_order);\n        expected = !!old_value;\n        return res;\n    }\n\n    BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT\n    {\n        return compare_exchange_strong(expected, desired, order, atomics::detail::deduce_failure_order(order));\n    }\n\n    BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT\n    {\n        BOOST_ASSERT(failure_order != memory_order_release);\n        BOOST_ASSERT(failure_order != memory_order_acq_rel);\n        BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));\n\n        storage_type old_value = static_cast< storage_type >(expected);\n        const bool res = operations::compare_exchange_weak(m_storage.value, old_value, static_cast< storage_type >(desired), success_order, failure_order);\n        expected = !!old_value;\n        return res;\n    }\n\n    BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT\n    {\n        return compare_exchange_weak(expected, desired, order, atomics::detail::deduce_failure_order(order));\n    }\n\n    BOOST_FORCEINLINE bool is_lock_free() const volatile BOOST_NOEXCEPT\n    {\n        return operations::is_lock_free(m_storage.value);\n    }\n\n    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))\n    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))\n};\n\n\n//! Implementation for user-defined types, such as structs and enums\ntemplate< typename T >\nclass base_atomic< T, void >\n{\nprivate:\n    typedef T value_type;\n    typedef atomics::detail::operations< storage_size_of< value_type >::value, false > operations;\n\nprotected:\n    typedef value_type const& value_arg_type;\n\npublic:\n    typedef typename operations::storage_type storage_type;\n\nprotected:\n    typename operations::aligned_storage_type m_storage;\n\npublic:\n    BOOST_FORCEINLINE explicit base_atomic(value_type const& v = value_type()) BOOST_NOEXCEPT : m_storage(atomics::detail::bitwise_cast< storage_type >(v))\n    {\n    }\n\n    BOOST_FORCEINLINE void store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT\n    {\n        BOOST_ASSERT(order != memory_order_consume);\n        BOOST_ASSERT(order != memory_order_acquire);\n        BOOST_ASSERT(order != memory_order_acq_rel);\n\n        operations::store(m_storage.value, atomics::detail::bitwise_cast< storage_type >(v), order);\n    }\n\n    BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT\n    {\n        BOOST_ASSERT(order != memory_order_release);\n        BOOST_ASSERT(order != memory_order_acq_rel);\n\n        return atomics::detail::bitwise_cast< value_type >(operations::load(m_storage.value, order));\n    }\n\n    BOOST_FORCEINLINE value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT\n    {\n        return atomics::detail::bitwise_cast< value_type >(operations::exchange(m_storage.value, atomics::detail::bitwise_cast< storage_type >(v), order));\n    }\n\n    BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT\n    {\n        BOOST_ASSERT(failure_order != memory_order_release);\n        BOOST_ASSERT(failure_order != memory_order_acq_rel);\n        BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));\n\n        storage_type old_value = atomics::detail::bitwise_cast< storage_type >(expected);\n        const bool res = operations::compare_exchange_strong(m_storage.value, old_value, atomics::detail::bitwise_cast< storage_type >(desired), success_order, failure_order);\n        expected = atomics::detail::bitwise_cast< value_type >(old_value);\n        return res;\n    }\n\n    BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT\n    {\n        return compare_exchange_strong(expected, desired, order, atomics::detail::deduce_failure_order(order));\n    }\n\n    BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT\n    {\n        BOOST_ASSERT(failure_order != memory_order_release);\n        BOOST_ASSERT(failure_order != memory_order_acq_rel);\n        BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));\n\n        storage_type old_value = atomics::detail::bitwise_cast< storage_type >(expected);\n        const bool res = operations::compare_exchange_weak(m_storage.value, old_value, atomics::detail::bitwise_cast< storage_type >(desired), success_order, failure_order);\n        expected = atomics::detail::bitwise_cast< value_type >(old_value);\n        return res;\n    }\n\n    BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT\n    {\n        return compare_exchange_weak(expected, desired, order, atomics::detail::deduce_failure_order(order));\n    }\n\n    BOOST_FORCEINLINE bool is_lock_free() const volatile BOOST_NOEXCEPT\n    {\n        return operations::is_lock_free(m_storage.value);\n    }\n\n    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))\n    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))\n};\n\n\n//! Implementation for pointers\ntemplate< typename T >\nclass base_atomic< T*, void* >\n{\nprivate:\n    typedef T* value_type;\n    typedef std::ptrdiff_t difference_type;\n    typedef atomics::detail::operations< storage_size_of< value_type >::value, false > operations;\n\nprotected:\n    typedef value_type value_arg_type;\n\npublic:\n    typedef typename operations::storage_type storage_type;\n\nprotected:\n    typename operations::aligned_storage_type m_storage;\n\npublic:\n    BOOST_DEFAULTED_FUNCTION(base_atomic(), {})\n    BOOST_FORCEINLINE explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : m_storage(atomics::detail::bitwise_cast< storage_type >(v))\n    {\n    }\n\n    BOOST_FORCEINLINE void store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT\n    {\n        BOOST_ASSERT(order != memory_order_consume);\n        BOOST_ASSERT(order != memory_order_acquire);\n        BOOST_ASSERT(order != memory_order_acq_rel);\n\n        operations::store(m_storage.value, atomics::detail::bitwise_cast< storage_type >(v), order);\n    }\n\n    BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT\n    {\n        BOOST_ASSERT(order != memory_order_release);\n        BOOST_ASSERT(order != memory_order_acq_rel);\n\n        return atomics::detail::bitwise_cast< value_type >(operations::load(m_storage.value, order));\n    }\n\n    BOOST_FORCEINLINE value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT\n    {\n        return atomics::detail::bitwise_cast< value_type >(operations::fetch_add(m_storage.value, static_cast< storage_type >(v * sizeof(T)), order));\n    }\n\n    BOOST_FORCEINLINE value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT\n    {\n        return atomics::detail::bitwise_cast< value_type >(operations::fetch_sub(m_storage.value, static_cast< storage_type >(v * sizeof(T)), order));\n    }\n\n    BOOST_FORCEINLINE value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT\n    {\n        return atomics::detail::bitwise_cast< value_type >(operations::exchange(m_storage.value, atomics::detail::bitwise_cast< storage_type >(v), order));\n    }\n\n    BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT\n    {\n        BOOST_ASSERT(failure_order != memory_order_release);\n        BOOST_ASSERT(failure_order != memory_order_acq_rel);\n        BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));\n\n        storage_type old_value = atomics::detail::bitwise_cast< storage_type >(expected);\n        const bool res = operations::compare_exchange_strong(m_storage.value, old_value, atomics::detail::bitwise_cast< storage_type >(desired), success_order, failure_order);\n        expected = atomics::detail::bitwise_cast< value_type >(old_value);\n        return res;\n    }\n\n    BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT\n    {\n        return compare_exchange_strong(expected, desired, order, atomics::detail::deduce_failure_order(order));\n    }\n\n    BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT\n    {\n        BOOST_ASSERT(failure_order != memory_order_release);\n        BOOST_ASSERT(failure_order != memory_order_acq_rel);\n        BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));\n\n        storage_type old_value = atomics::detail::bitwise_cast< storage_type >(expected);\n        const bool res = operations::compare_exchange_weak(m_storage.value, old_value, atomics::detail::bitwise_cast< storage_type >(desired), success_order, failure_order);\n        expected = atomics::detail::bitwise_cast< value_type >(old_value);\n        return res;\n    }\n\n    BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT\n    {\n        return compare_exchange_weak(expected, desired, order, atomics::detail::deduce_failure_order(order));\n    }\n\n    BOOST_FORCEINLINE bool is_lock_free() const volatile BOOST_NOEXCEPT\n    {\n        return operations::is_lock_free(m_storage.value);\n    }\n\n    BOOST_FORCEINLINE value_type operator++(int) volatile BOOST_NOEXCEPT\n    {\n        return fetch_add(1);\n    }\n\n    BOOST_FORCEINLINE value_type operator++() volatile BOOST_NOEXCEPT\n    {\n        return fetch_add(1) + 1;\n    }\n\n    BOOST_FORCEINLINE value_type operator--(int) volatile BOOST_NOEXCEPT\n    {\n        return fetch_sub(1);\n    }\n\n    BOOST_FORCEINLINE value_type operator--() volatile BOOST_NOEXCEPT\n    {\n        return fetch_sub(1) - 1;\n    }\n\n    BOOST_FORCEINLINE value_type operator+=(difference_type v) volatile BOOST_NOEXCEPT\n    {\n        return fetch_add(v) + v;\n    }\n\n    BOOST_FORCEINLINE value_type operator-=(difference_type v) volatile BOOST_NOEXCEPT\n    {\n        return fetch_sub(v) - v;\n    }\n\n    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))\n    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))\n};\n\n\n//! Implementation for void pointers\ntemplate< >\nclass base_atomic< void*, void* >\n{\nprivate:\n    typedef void* value_type;\n    typedef std::ptrdiff_t difference_type;\n    typedef atomics::detail::operations< storage_size_of< value_type >::value, false > operations;\n\nprotected:\n    typedef value_type value_arg_type;\n\npublic:\n    typedef operations::storage_type storage_type;\n\nprotected:\n    operations::aligned_storage_type m_storage;\n\npublic:\n    BOOST_DEFAULTED_FUNCTION(base_atomic(), {})\n    BOOST_FORCEINLINE explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : m_storage(atomics::detail::bitwise_cast< storage_type >(v))\n    {\n    }\n\n    BOOST_FORCEINLINE void store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT\n    {\n        BOOST_ASSERT(order != memory_order_consume);\n        BOOST_ASSERT(order != memory_order_acquire);\n        BOOST_ASSERT(order != memory_order_acq_rel);\n\n        operations::store(m_storage.value, atomics::detail::bitwise_cast< storage_type >(v), order);\n    }\n\n    BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT\n    {\n        BOOST_ASSERT(order != memory_order_release);\n        BOOST_ASSERT(order != memory_order_acq_rel);\n\n        return atomics::detail::bitwise_cast< value_type >(operations::load(m_storage.value, order));\n    }\n\n    BOOST_FORCEINLINE value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT\n    {\n        return atomics::detail::bitwise_cast< value_type >(operations::fetch_add(m_storage.value, static_cast< storage_type >(v), order));\n    }\n\n    BOOST_FORCEINLINE value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT\n    {\n        return atomics::detail::bitwise_cast< value_type >(operations::fetch_sub(m_storage.value, static_cast< storage_type >(v), order));\n    }\n\n    BOOST_FORCEINLINE value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT\n    {\n        return atomics::detail::bitwise_cast< value_type >(operations::exchange(m_storage.value, atomics::detail::bitwise_cast< storage_type >(v), order));\n    }\n\n    BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT\n    {\n        BOOST_ASSERT(failure_order != memory_order_release);\n        BOOST_ASSERT(failure_order != memory_order_acq_rel);\n        BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));\n\n        storage_type old_value = atomics::detail::bitwise_cast< storage_type >(expected);\n        const bool res = operations::compare_exchange_strong(m_storage.value, old_value, atomics::detail::bitwise_cast< storage_type >(desired), success_order, failure_order);\n        expected = atomics::detail::bitwise_cast< value_type >(old_value);\n        return res;\n    }\n\n    BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT\n    {\n        return compare_exchange_strong(expected, desired, order, atomics::detail::deduce_failure_order(order));\n    }\n\n    BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT\n    {\n        BOOST_ASSERT(failure_order != memory_order_release);\n        BOOST_ASSERT(failure_order != memory_order_acq_rel);\n        BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));\n\n        storage_type old_value = atomics::detail::bitwise_cast< storage_type >(expected);\n        const bool res = operations::compare_exchange_weak(m_storage.value, old_value, atomics::detail::bitwise_cast< storage_type >(desired), success_order, failure_order);\n        expected = atomics::detail::bitwise_cast< value_type >(old_value);\n        return res;\n    }\n\n    BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT\n    {\n        return compare_exchange_weak(expected, desired, order, atomics::detail::deduce_failure_order(order));\n    }\n\n    BOOST_FORCEINLINE bool is_lock_free() const volatile BOOST_NOEXCEPT\n    {\n        return operations::is_lock_free(m_storage.value);\n    }\n\n    BOOST_FORCEINLINE value_type operator++(int) volatile BOOST_NOEXCEPT\n    {\n        return fetch_add(1);\n    }\n\n    BOOST_FORCEINLINE value_type operator++() volatile BOOST_NOEXCEPT\n    {\n        return (char*)fetch_add(1) + 1;\n    }\n\n    BOOST_FORCEINLINE value_type operator--(int) volatile BOOST_NOEXCEPT\n    {\n        return fetch_sub(1);\n    }\n\n    BOOST_FORCEINLINE value_type operator--() volatile BOOST_NOEXCEPT\n    {\n        return (char*)fetch_sub(1) - 1;\n    }\n\n    BOOST_FORCEINLINE value_type operator+=(difference_type v) volatile BOOST_NOEXCEPT\n    {\n        return (char*)fetch_add(v) + v;\n    }\n\n    BOOST_FORCEINLINE value_type operator-=(difference_type v) volatile BOOST_NOEXCEPT\n    {\n        return (char*)fetch_sub(v) - v;\n    }\n\n    BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))\n    BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))\n};\n\n} // namespace detail\n\ntemplate< typename T >\nclass atomic :\n    public atomics::detail::base_atomic< T, typename atomics::detail::classify< T >::type >\n{\nprivate:\n    typedef T value_type;\n    typedef atomics::detail::base_atomic< T, typename atomics::detail::classify< T >::type > base_type;\n    typedef typename base_type::value_arg_type value_arg_type;\n\npublic:\n    typedef typename base_type::storage_type storage_type;\n\npublic:\n    BOOST_DEFAULTED_FUNCTION(atomic(), BOOST_NOEXCEPT {})\n\n    // NOTE: The constructor is made explicit because gcc 4.7 complains that\n    //       operator=(value_arg_type) is considered ambiguous with operator=(atomic const&)\n    //       in assignment expressions, even though conversion to atomic<> is less preferred\n    //       than conversion to value_arg_type.\n    BOOST_FORCEINLINE explicit BOOST_CONSTEXPR atomic(value_arg_type v) BOOST_NOEXCEPT : base_type(v) {}\n\n    BOOST_FORCEINLINE value_type operator= (value_arg_type v) volatile BOOST_NOEXCEPT\n    {\n        this->store(v);\n        return v;\n    }\n\n    BOOST_FORCEINLINE operator value_type() volatile const BOOST_NOEXCEPT\n    {\n        return this->load();\n    }\n\n    BOOST_FORCEINLINE storage_type& storage() BOOST_NOEXCEPT { return this->m_storage.value; }\n    BOOST_FORCEINLINE storage_type volatile& storage() volatile BOOST_NOEXCEPT { return this->m_storage.value; }\n    BOOST_FORCEINLINE storage_type const& storage() const BOOST_NOEXCEPT { return this->m_storage.value; }\n    BOOST_FORCEINLINE storage_type const volatile& storage() const volatile BOOST_NOEXCEPT { return this->m_storage.value; }\n\n    BOOST_DELETED_FUNCTION(atomic(atomic const&))\n    BOOST_DELETED_FUNCTION(atomic& operator= (atomic const&))\n    BOOST_DELETED_FUNCTION(atomic& operator= (atomic const&) volatile)\n};\n\ntypedef atomic< char > atomic_char;\ntypedef atomic< unsigned char > atomic_uchar;\ntypedef atomic< signed char > atomic_schar;\ntypedef atomic< uint8_t > atomic_uint8_t;\ntypedef atomic< int8_t > atomic_int8_t;\ntypedef atomic< unsigned short > atomic_ushort;\ntypedef atomic< short > atomic_short;\ntypedef atomic< uint16_t > atomic_uint16_t;\ntypedef atomic< int16_t > atomic_int16_t;\ntypedef atomic< unsigned int > atomic_uint;\ntypedef atomic< int > atomic_int;\ntypedef atomic< uint32_t > atomic_uint32_t;\ntypedef atomic< int32_t > atomic_int32_t;\ntypedef atomic< unsigned long > atomic_ulong;\ntypedef atomic< long > atomic_long;\ntypedef atomic< uint64_t > atomic_uint64_t;\ntypedef atomic< int64_t > atomic_int64_t;\n#ifdef BOOST_HAS_LONG_LONG\ntypedef atomic< boost::ulong_long_type > atomic_ullong;\ntypedef atomic< boost::long_long_type > atomic_llong;\n#endif\ntypedef atomic< void* > atomic_address;\ntypedef atomic< bool > atomic_bool;\ntypedef atomic< wchar_t > atomic_wchar_t;\n#if !defined(BOOST_NO_CXX11_CHAR16_T)\ntypedef atomic< char16_t > atomic_char16_t;\n#endif\n#if !defined(BOOST_NO_CXX11_CHAR32_T)\ntypedef atomic< char32_t > atomic_char32_t;\n#endif\n\ntypedef atomic< int_least8_t > atomic_int_least8_t;\ntypedef atomic< uint_least8_t > atomic_uint_least8_t;\ntypedef atomic< int_least16_t > atomic_int_least16_t;\ntypedef atomic< uint_least16_t > atomic_uint_least16_t;\ntypedef atomic< int_least32_t > atomic_int_least32_t;\ntypedef atomic< uint_least32_t > atomic_uint_least32_t;\ntypedef atomic< int_least64_t > atomic_int_least64_t;\ntypedef atomic< uint_least64_t > atomic_uint_least64_t;\ntypedef atomic< int_fast8_t > atomic_int_fast8_t;\ntypedef atomic< uint_fast8_t > atomic_uint_fast8_t;\ntypedef atomic< int_fast16_t > atomic_int_fast16_t;\ntypedef atomic< uint_fast16_t > atomic_uint_fast16_t;\ntypedef atomic< int_fast32_t > atomic_int_fast32_t;\ntypedef atomic< uint_fast32_t > atomic_uint_fast32_t;\ntypedef atomic< int_fast64_t > atomic_int_fast64_t;\ntypedef atomic< uint_fast64_t > atomic_uint_fast64_t;\ntypedef atomic< intmax_t > atomic_intmax_t;\ntypedef atomic< uintmax_t > atomic_uintmax_t;\n\ntypedef atomic< std::size_t > atomic_size_t;\ntypedef atomic< std::ptrdiff_t > atomic_ptrdiff_t;\n\n#if defined(BOOST_HAS_INTPTR_T)\ntypedef atomic< intptr_t > atomic_intptr_t;\ntypedef atomic< uintptr_t > atomic_uintptr_t;\n#endif\n\n} // namespace atomics\n} // namespace boost\n\n#if defined(BOOST_MSVC)\n#pragma warning(pop)\n#endif\n\n#endif // BOOST_ATOMIC_DETAIL_ATOMIC_TEMPLATE_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/bitwise_cast.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2009 Helge Bahmann\n * Copyright (c) 2012 Tim Blechmann\n * Copyright (c) 2013 - 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/bitwise_cast.hpp\n *\n * This header defines \\c bitwise_cast used to convert between storage and value types\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_BITWISE_CAST_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_BITWISE_CAST_HPP_INCLUDED_\n\n#include <boost/atomic/detail/config.hpp>\n#if !defined(BOOST_ATOMIC_DETAIL_HAS_BUILTIN_MEMCPY)\n#include <cstring>\n#endif\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\nnamespace boost {\nnamespace atomics {\nnamespace detail {\n\ntemplate< typename To, typename From >\nBOOST_FORCEINLINE To bitwise_cast(From const& from) BOOST_NOEXCEPT\n{\n    struct\n    {\n        To to;\n    }\n    value = {};\n    BOOST_ATOMIC_DETAIL_MEMCPY\n    (\n        &reinterpret_cast< char& >(value.to),\n        &reinterpret_cast< const char& >(from),\n        (sizeof(From) < sizeof(To) ? sizeof(From) : sizeof(To))\n    );\n    return value.to;\n}\n\n} // namespace detail\n} // namespace atomics\n} // namespace boost\n\n#endif // BOOST_ATOMIC_DETAIL_BITWISE_CAST_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/caps_gcc_alpha.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2009 Helge Bahmann\n * Copyright (c) 2013 Tim Blechmann\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/caps_gcc_alpha.hpp\n *\n * This header defines feature capabilities macros\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_CAPS_GCC_ALPHA_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_CAPS_GCC_ALPHA_HPP_INCLUDED_\n\n#include <boost/atomic/detail/config.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\n#define BOOST_ATOMIC_INT8_LOCK_FREE 2\n#define BOOST_ATOMIC_INT16_LOCK_FREE 2\n#define BOOST_ATOMIC_INT32_LOCK_FREE 2\n#define BOOST_ATOMIC_INT64_LOCK_FREE 2\n#define BOOST_ATOMIC_POINTER_LOCK_FREE 2\n\n#define BOOST_ATOMIC_THREAD_FENCE 2\n#define BOOST_ATOMIC_SIGNAL_FENCE 2\n\n#endif // BOOST_ATOMIC_DETAIL_CAPS_GCC_ALPHA_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/caps_gcc_arm.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2009 Helge Bahmann\n * Copyright (c) 2009 Phil Endecott\n * Copyright (c) 2013 Tim Blechmann\n * ARM Code by Phil Endecott, based on other architectures.\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/caps_gcc_arm.hpp\n *\n * This header defines feature capabilities macros\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_CAPS_GCC_ARM_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_CAPS_GCC_ARM_HPP_INCLUDED_\n\n#include <boost/atomic/detail/config.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\n#if !(defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6ZK__))\n// ARMv7 and later have dmb instruction\n#define BOOST_ATOMIC_DETAIL_ARM_HAS_DMB 1\n#endif\n\n#if !(defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6Z__))\n// ARMv6k and ARMv7 have 8 and 16 ldrex/strex variants\n#define BOOST_ATOMIC_DETAIL_ARM_HAS_LDREXB_STREXB 1\n#define BOOST_ATOMIC_DETAIL_ARM_HAS_LDREXH_STREXH 1\n#if !(((defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6ZK__)) && defined(__thumb__)) || defined(__ARM_ARCH_7M__))\n// ARMv6k and ARMv7 except ARMv7-M have 64-bit ldrex/strex variants.\n// Unfortunately, GCC (at least 4.7.3 on Ubuntu) does not allocate register pairs properly when targeting ARMv6k Thumb,\n// which is required for ldrexd/strexd instructions, so we disable 64-bit support. When targeting ARMv6k ARM\n// or ARMv7 (both ARM and Thumb 2) it works as expected.\n#define BOOST_ATOMIC_DETAIL_ARM_HAS_LDREXD_STREXD 1\n#endif\n#endif\n\n#define BOOST_ATOMIC_INT8_LOCK_FREE 2\n#define BOOST_ATOMIC_INT16_LOCK_FREE 2\n#define BOOST_ATOMIC_INT32_LOCK_FREE 2\n#if defined(BOOST_ATOMIC_DETAIL_ARM_HAS_LDREXD_STREXD)\n#define BOOST_ATOMIC_INT64_LOCK_FREE 2\n#endif\n#define BOOST_ATOMIC_POINTER_LOCK_FREE 2\n\n#define BOOST_ATOMIC_THREAD_FENCE 2\n#define BOOST_ATOMIC_SIGNAL_FENCE 2\n\n#endif // BOOST_ATOMIC_DETAIL_CAPS_GCC_ARM_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/caps_gcc_atomic.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/caps_gcc_atomic.hpp\n *\n * This header defines feature capabilities macros\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_CAPS_GCC_ATOMIC_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_CAPS_GCC_ATOMIC_HPP_INCLUDED_\n\n#include <boost/atomic/detail/config.hpp>\n#include <boost/atomic/detail/int_sizes.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\n#if defined(__i386__) && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)\n#define BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B 1\n#endif\n\n#if defined(__x86_64__) && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16)\n#define BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B 1\n#endif\n\n#if defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B) && (defined(BOOST_HAS_INT128) || !defined(BOOST_NO_ALIGNMENT))\n#define BOOST_ATOMIC_INT128_LOCK_FREE 2\n#else\n#define BOOST_ATOMIC_INT128_LOCK_FREE 0\n#endif\n\n#if __GCC_ATOMIC_LLONG_LOCK_FREE == 2\n#define BOOST_ATOMIC_LLONG_LOCK_FREE 2\n#else\n#define BOOST_ATOMIC_LLONG_LOCK_FREE BOOST_ATOMIC_INT128_LOCK_FREE\n#endif\n\n#if __GCC_ATOMIC_LONG_LOCK_FREE == 2\n#define BOOST_ATOMIC_LONG_LOCK_FREE 2\n#else\n#define BOOST_ATOMIC_LONG_LOCK_FREE BOOST_ATOMIC_LLONG_LOCK_FREE\n#endif\n\n#if __GCC_ATOMIC_INT_LOCK_FREE == 2\n#define BOOST_ATOMIC_INT_LOCK_FREE 2\n#else\n#define BOOST_ATOMIC_INT_LOCK_FREE BOOST_ATOMIC_LONG_LOCK_FREE\n#endif\n\n#if __GCC_ATOMIC_SHORT_LOCK_FREE == 2\n#define BOOST_ATOMIC_SHORT_LOCK_FREE 2\n#else\n#define BOOST_ATOMIC_SHORT_LOCK_FREE BOOST_ATOMIC_INT_LOCK_FREE\n#endif\n\n#if __GCC_ATOMIC_CHAR_LOCK_FREE == 2\n#define BOOST_ATOMIC_CHAR_LOCK_FREE 2\n#else\n#define BOOST_ATOMIC_CHAR_LOCK_FREE BOOST_ATOMIC_SHORT_LOCK_FREE\n#endif\n\n#if __GCC_ATOMIC_POINTER_LOCK_FREE == 2\n#define BOOST_ATOMIC_POINTER_LOCK_FREE 2\n#else\n#define BOOST_ATOMIC_POINTER_LOCK_FREE 0\n#endif\n\n\n#define BOOST_ATOMIC_INT8_LOCK_FREE BOOST_ATOMIC_CHAR_LOCK_FREE\n\n#if BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 2\n#define BOOST_ATOMIC_INT16_LOCK_FREE BOOST_ATOMIC_SHORT_LOCK_FREE\n#elif BOOST_ATOMIC_DETAIL_SIZEOF_INT == 2\n#define BOOST_ATOMIC_INT16_LOCK_FREE BOOST_ATOMIC_INT_LOCK_FREE\n#elif BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 2\n#define BOOST_ATOMIC_INT16_LOCK_FREE BOOST_ATOMIC_LONG_LOCK_FREE\n#elif BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 2\n#define BOOST_ATOMIC_INT16_LOCK_FREE BOOST_ATOMIC_LLONG_LOCK_FREE\n#else\n#define BOOST_ATOMIC_INT16_LOCK_FREE 0\n#endif\n\n#if BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 4\n#define BOOST_ATOMIC_INT32_LOCK_FREE BOOST_ATOMIC_SHORT_LOCK_FREE\n#elif BOOST_ATOMIC_DETAIL_SIZEOF_INT == 4\n#define BOOST_ATOMIC_INT32_LOCK_FREE BOOST_ATOMIC_INT_LOCK_FREE\n#elif BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 4\n#define BOOST_ATOMIC_INT32_LOCK_FREE BOOST_ATOMIC_LONG_LOCK_FREE\n#elif BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 4\n#define BOOST_ATOMIC_INT32_LOCK_FREE BOOST_ATOMIC_LLONG_LOCK_FREE\n#else\n#define BOOST_ATOMIC_INT32_LOCK_FREE 0\n#endif\n\n#if BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 8\n#define BOOST_ATOMIC_INT64_LOCK_FREE BOOST_ATOMIC_SHORT_LOCK_FREE\n#elif BOOST_ATOMIC_DETAIL_SIZEOF_INT == 8\n#define BOOST_ATOMIC_INT64_LOCK_FREE BOOST_ATOMIC_INT_LOCK_FREE\n#elif BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 8\n#define BOOST_ATOMIC_INT64_LOCK_FREE BOOST_ATOMIC_LONG_LOCK_FREE\n#elif BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 8\n#define BOOST_ATOMIC_INT64_LOCK_FREE BOOST_ATOMIC_LLONG_LOCK_FREE\n#else\n#define BOOST_ATOMIC_INT64_LOCK_FREE 0\n#endif\n\n\n#if __GCC_ATOMIC_WCHAR_T_LOCK_FREE == 2\n#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 2\n#elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 8\n#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE\n#elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 4\n#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE\n#elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 2\n#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE\n#elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 1\n#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE\n#else\n#define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 0\n#endif\n\n#define BOOST_ATOMIC_CHAR32_T_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE\n#define BOOST_ATOMIC_CHAR16_T_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE\n\n#define BOOST_ATOMIC_THREAD_FENCE 2\n#define BOOST_ATOMIC_SIGNAL_FENCE 2\n\n#endif // BOOST_ATOMIC_DETAIL_CAPS_GCC_ATOMIC_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/caps_gcc_ppc.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2009 Helge Bahmann\n * Copyright (c) 2013 Tim Blechmann\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/caps_gcc_ppc.hpp\n *\n * This header defines feature capabilities macros\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_CAPS_GCC_PPC_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_CAPS_GCC_PPC_HPP_INCLUDED_\n\n#include <boost/atomic/detail/config.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\n#define BOOST_ATOMIC_INT8_LOCK_FREE 2\n#define BOOST_ATOMIC_INT16_LOCK_FREE 2\n#define BOOST_ATOMIC_INT32_LOCK_FREE 2\n#if defined(__powerpc64__) || defined(__PPC64__)\n#define BOOST_ATOMIC_INT64_LOCK_FREE 2\n#endif\n#define BOOST_ATOMIC_POINTER_LOCK_FREE 2\n\n#define BOOST_ATOMIC_THREAD_FENCE 2\n#define BOOST_ATOMIC_SIGNAL_FENCE 2\n\n#endif // BOOST_ATOMIC_DETAIL_CAPS_GCC_PPC_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/caps_gcc_sparc.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2010 Helge Bahmann\n * Copyright (c) 2013 Tim Blechmann\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/caps_gcc_sparc.hpp\n *\n * This header defines feature capabilities macros\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_CAPS_GCC_SPARC_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_CAPS_GCC_SPARC_HPP_INCLUDED_\n\n#include <boost/atomic/detail/config.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\n#define BOOST_ATOMIC_INT8_LOCK_FREE 2\n#define BOOST_ATOMIC_INT16_LOCK_FREE 2\n#define BOOST_ATOMIC_INT32_LOCK_FREE 2\n#define BOOST_ATOMIC_INT64_LOCK_FREE 2\n#define BOOST_ATOMIC_POINTER_LOCK_FREE 2\n\n#define BOOST_ATOMIC_THREAD_FENCE 2\n#define BOOST_ATOMIC_SIGNAL_FENCE 2\n\n#endif // BOOST_ATOMIC_DETAIL_CAPS_GCC_SPARC_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/caps_gcc_sync.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2011 Helge Bahmann\n * Copyright (c) 2013 Tim Blechmann\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/caps_gcc_sync.hpp\n *\n * This header defines feature capabilities macros\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_CAPS_GCC_SYNC_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_CAPS_GCC_SYNC_HPP_INCLUDED_\n\n#include <boost/atomic/detail/config.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\n#if defined(__i386__) && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)\n#define BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B 1\n#endif\n\n#if defined(__x86_64__) && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16)\n#define BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B 1\n#endif\n\n#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1)\\\n    || defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2)\\\n    || defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)\\\n    || defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)\\\n    || defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16)\n#define BOOST_ATOMIC_INT8_LOCK_FREE 2\n#endif\n#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2)\\\n    || defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)\\\n    || defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)\\\n    || defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16)\n#define BOOST_ATOMIC_INT16_LOCK_FREE 2\n#endif\n#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)\\\n    || defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)\\\n    || defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16)\n#define BOOST_ATOMIC_INT32_LOCK_FREE 2\n#endif\n#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)\\\n    || defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16)\n#define BOOST_ATOMIC_INT64_LOCK_FREE 2\n#endif\n#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16)\n#define BOOST_ATOMIC_INT128_LOCK_FREE 2\n#endif\n\n#define BOOST_ATOMIC_THREAD_FENCE 2\n#define BOOST_ATOMIC_SIGNAL_FENCE 2\n\n#endif // BOOST_ATOMIC_DETAIL_CAPS_GCC_SYNC_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/caps_gcc_x86.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2009 Helge Bahmann\n * Copyright (c) 2012 Tim Blechmann\n * Copyright (c) 2013 - 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/caps_gcc_x86.hpp\n *\n * This header defines feature capabilities macros\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_CAPS_GCC_X86_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_CAPS_GCC_X86_HPP_INCLUDED_\n\n#include <boost/atomic/detail/config.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\n#if defined(__i386__) &&\\\n    (\\\n        defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8) ||\\\n        defined(__i586__) || defined(__i686__) || defined(__pentium4__) || defined(__nocona__) || defined(__core2__) || defined(__corei7__) ||\\\n        defined(__k6__) || defined(__athlon__) || defined(__k8__) || defined(__amdfam10__) || defined(__bdver1__) || defined(__bdver2__) || defined(__bdver3__) || defined(__btver1__) || defined(__btver2__)\\\n    )\n#define BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B 1\n#endif\n\n#if defined(__x86_64__) && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16)\n#define BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B 1\n#endif\n\n#define BOOST_ATOMIC_INT8_LOCK_FREE 2\n#define BOOST_ATOMIC_INT16_LOCK_FREE 2\n#define BOOST_ATOMIC_INT32_LOCK_FREE 2\n#if defined(__x86_64__) || defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B)\n#define BOOST_ATOMIC_INT64_LOCK_FREE 2\n#endif\n#if defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B) && (defined(BOOST_HAS_INT128) || !defined(BOOST_NO_ALIGNMENT))\n#define BOOST_ATOMIC_INT128_LOCK_FREE 2\n#endif\n#define BOOST_ATOMIC_POINTER_LOCK_FREE 2\n\n#define BOOST_ATOMIC_THREAD_FENCE 2\n#define BOOST_ATOMIC_SIGNAL_FENCE 2\n\n#endif // BOOST_ATOMIC_DETAIL_CAPS_GCC_X86_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/caps_linux_arm.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2009, 2011 Helge Bahmann\n * Copyright (c) 2009 Phil Endecott\n * Copyright (c) 2013 Tim Blechmann\n * Linux-specific code by Phil Endecott\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/caps_linux_arm.hpp\n *\n * This header defines feature capabilities macros\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_CAPS_LINUX_ARM_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_CAPS_LINUX_ARM_HPP_INCLUDED_\n\n#include <boost/atomic/detail/config.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\n#define BOOST_ATOMIC_INT8_LOCK_FREE 2\n#define BOOST_ATOMIC_INT16_LOCK_FREE 2\n#define BOOST_ATOMIC_INT32_LOCK_FREE 2\n#define BOOST_ATOMIC_POINTER_LOCK_FREE 2\n\n#define BOOST_ATOMIC_THREAD_FENCE 2\n#define BOOST_ATOMIC_SIGNAL_FENCE 2\n\n#endif // BOOST_ATOMIC_DETAIL_CAPS_LINUX_ARM_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/caps_msvc_arm.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2009 Helge Bahmann\n * Copyright (c) 2013 Tim Blechmann\n * Copyright (c) 2012 - 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/caps_msvc_arm.hpp\n *\n * This header defines feature capabilities macros\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_CAPS_MSVC_ARM_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_CAPS_MSVC_ARM_HPP_INCLUDED_\n\n#include <boost/atomic/detail/config.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\n#define BOOST_ATOMIC_INT8_LOCK_FREE 2\n#define BOOST_ATOMIC_INT16_LOCK_FREE 2\n#define BOOST_ATOMIC_INT32_LOCK_FREE 2\n#define BOOST_ATOMIC_INT64_LOCK_FREE 2\n#define BOOST_ATOMIC_POINTER_LOCK_FREE 2\n\n#define BOOST_ATOMIC_THREAD_FENCE 2\n#define BOOST_ATOMIC_SIGNAL_FENCE 2\n\n#endif // BOOST_ATOMIC_DETAIL_CAPS_MSVC_ARM_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/caps_msvc_x86.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2009 Helge Bahmann\n * Copyright (c) 2013 Tim Blechmann\n * Copyright (c) 2012 - 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/caps_msvc_x86.hpp\n *\n * This header defines feature capabilities macros\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_CAPS_MSVC_X86_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_CAPS_MSVC_X86_HPP_INCLUDED_\n\n#include <boost/atomic/detail/config.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\n#if defined(_M_IX86) && _M_IX86 >= 500\n#define BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B 1\n#endif\n\n#if _MSC_VER >= 1500 && defined(_M_AMD64) && !defined(BOOST_ATOMIC_NO_CMPXCHG16B)\n#define BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B 1\n#endif\n\n#define BOOST_ATOMIC_INT8_LOCK_FREE 2\n#define BOOST_ATOMIC_INT16_LOCK_FREE 2\n#define BOOST_ATOMIC_INT32_LOCK_FREE 2\n\n#if defined(_M_AMD64) || defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B)\n#define BOOST_ATOMIC_INT64_LOCK_FREE 2\n#endif\n\n#if defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B) && (defined(BOOST_HAS_INT128) || !defined(BOOST_NO_ALIGNMENT))\n#define BOOST_ATOMIC_INT128_LOCK_FREE 2\n#endif\n\n#define BOOST_ATOMIC_POINTER_LOCK_FREE 2\n\n#define BOOST_ATOMIC_THREAD_FENCE 2\n#define BOOST_ATOMIC_SIGNAL_FENCE 2\n\n#endif // BOOST_ATOMIC_DETAIL_CAPS_MSVC_X86_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/caps_windows.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2009 Helge Bahmann\n * Copyright (c) 2013 Tim Blechmann\n * Copyright (c) 2012 - 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/caps_windows.hpp\n *\n * This header defines feature capabilities macros\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_CAPS_WINDOWS_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_CAPS_WINDOWS_HPP_INCLUDED_\n\n#include <boost/atomic/detail/config.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\n#define BOOST_ATOMIC_INT8_LOCK_FREE 2\n#define BOOST_ATOMIC_INT16_LOCK_FREE 2\n#define BOOST_ATOMIC_INT32_LOCK_FREE 2\n#define BOOST_ATOMIC_POINTER_LOCK_FREE 2\n\n#define BOOST_ATOMIC_THREAD_FENCE 2\n#define BOOST_ATOMIC_SIGNAL_FENCE 2\n\n#endif // BOOST_ATOMIC_DETAIL_CAPS_WINDOWS_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/config.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2012 Hartmut Kaiser\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/config.hpp\n *\n * This header defines configuraion macros for Boost.Atomic\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_CONFIG_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_CONFIG_HPP_INCLUDED_\n\n#include <boost/config.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\n#if defined(__has_builtin)\n#if __has_builtin(__builtin_memcpy)\n#define BOOST_ATOMIC_DETAIL_HAS_BUILTIN_MEMCPY\n#endif\n#if __has_builtin(__builtin_memcmp)\n#define BOOST_ATOMIC_DETAIL_HAS_BUILTIN_MEMCMP\n#endif\n#elif defined(BOOST_GCC)\n#define BOOST_ATOMIC_DETAIL_HAS_BUILTIN_MEMCPY\n#define BOOST_ATOMIC_DETAIL_HAS_BUILTIN_MEMCMP\n#endif\n\n#if defined(BOOST_ATOMIC_DETAIL_HAS_BUILTIN_MEMCPY)\n#define BOOST_ATOMIC_DETAIL_MEMCPY __builtin_memcpy\n#else\n#define BOOST_ATOMIC_DETAIL_MEMCPY std::memcpy\n#endif\n\n#if defined(BOOST_ATOMIC_DETAIL_HAS_BUILTIN_MEMCMP)\n#define BOOST_ATOMIC_DETAIL_MEMCMP __builtin_memcmp\n#else\n#define BOOST_ATOMIC_DETAIL_MEMCMP std::memcmp\n#endif\n\n#if defined(__CUDACC__)\n// nvcc does not support alternatives in asm statement constraints\n#define BOOST_ATOMIC_DETAIL_NO_ASM_CONSTRAINT_ALTERNATIVES\n// nvcc does not support condition code register (\"cc\") clobber in asm statements\n#define BOOST_ATOMIC_DETAIL_NO_ASM_CLOBBER_CC\n#endif\n\n#if !defined(BOOST_ATOMIC_DETAIL_NO_ASM_CLOBBER_CC)\n#define BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC \"cc\"\n#define BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"cc\",\n#else\n#define BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n#define BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA\n#endif\n\n#if (defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__)) && (defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) < 403)\n// This macro indicates we're using older binutils that don't support implied zero displacements for memory opereands,\n// making code like this invalid:\n//   movl 4+(%%edx), %%eax\n#define BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS\n#endif\n\n#if defined(__clang__) || (defined(BOOST_GCC) && (BOOST_GCC+0) < 40500)\n// This macro indicates that the compiler does not support allocating rax:rdx register pairs (\"A\") in asm blocks\n#define BOOST_ATOMIC_DETAIL_NO_ASM_RAX_RDX_PAIRS\n#endif\n\n#endif // BOOST_ATOMIC_DETAIL_CONFIG_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/int_sizes.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/int_sizes.hpp\n *\n * This header defines macros for testing buitin integer type sizes\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_INT_SIZES_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_INT_SIZES_HPP_INCLUDED_\n\n#include <boost/atomic/detail/config.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\n// GCC and compatible compilers define internal macros with builtin type traits\n#if defined(__SIZEOF_SHORT__)\n#define BOOST_ATOMIC_DETAIL_SIZEOF_SHORT __SIZEOF_SHORT__\n#endif\n#if defined(__SIZEOF_INT__)\n#define BOOST_ATOMIC_DETAIL_SIZEOF_INT __SIZEOF_INT__\n#endif\n#if defined(__SIZEOF_LONG__)\n#define BOOST_ATOMIC_DETAIL_SIZEOF_LONG __SIZEOF_LONG__\n#endif\n#if defined(__SIZEOF_LONG_LONG__)\n#define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG __SIZEOF_LONG_LONG__\n#endif\n#if defined(__SIZEOF_WCHAR_T__)\n#define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T __SIZEOF_WCHAR_T__\n#endif\n#if defined(__SIZEOF_POINTER__)\n#define BOOST_ATOMIC_DETAIL_SIZEOF_POINTER __SIZEOF_POINTER__\n#elif defined(_MSC_VER)\n#if defined(_M_AMD64) || defined(_M_IA64)\n#define BOOST_ATOMIC_DETAIL_SIZEOF_POINTER 8\n#else\n#define BOOST_ATOMIC_DETAIL_SIZEOF_POINTER 4\n#endif\n#endif\n\n#if !defined(BOOST_ATOMIC_DETAIL_SIZEOF_SHORT) || !defined(BOOST_ATOMIC_DETAIL_SIZEOF_INT) ||\\\n    !defined(BOOST_ATOMIC_DETAIL_SIZEOF_LONG) || !defined(BOOST_ATOMIC_DETAIL_SIZEOF_LLONG)\n\n// Try to deduce sizes from limits\n#include <limits.h>\n#include <boost/cstdint.hpp>\n\n#if (USHRT_MAX + 0) == 0xff\n#define BOOST_ATOMIC_DETAIL_SIZEOF_SHORT 1\n#elif (USHRT_MAX + 0) == 0xffff\n#define BOOST_ATOMIC_DETAIL_SIZEOF_SHORT 2\n#elif (USHRT_MAX + 0) == 0xffffffff\n#define BOOST_ATOMIC_DETAIL_SIZEOF_SHORT 4\n#elif (USHRT_MAX + 0) == UINT64_C(0xffffffffffffffff)\n#define BOOST_ATOMIC_DETAIL_SIZEOF_SHORT 8\n#endif\n\n#if (UINT_MAX + 0) == 0xff\n#define BOOST_ATOMIC_DETAIL_SIZEOF_INT 1\n#elif (UINT_MAX + 0) == 0xffff\n#define BOOST_ATOMIC_DETAIL_SIZEOF_INT 2\n#elif (UINT_MAX + 0) == 0xffffffff\n#define BOOST_ATOMIC_DETAIL_SIZEOF_INT 4\n#elif (UINT_MAX + 0) == UINT64_C(0xffffffffffffffff)\n#define BOOST_ATOMIC_DETAIL_SIZEOF_INT 8\n#endif\n\n#if (ULONG_MAX + 0) == 0xff\n#define BOOST_ATOMIC_DETAIL_SIZEOF_LONG 1\n#elif (ULONG_MAX + 0) == 0xffff\n#define BOOST_ATOMIC_DETAIL_SIZEOF_LONG 2\n#elif (ULONG_MAX + 0) == 0xffffffff\n#define BOOST_ATOMIC_DETAIL_SIZEOF_LONG 4\n#elif (ULONG_MAX + 0) == UINT64_C(0xffffffffffffffff)\n#define BOOST_ATOMIC_DETAIL_SIZEOF_LONG 8\n#endif\n\n#if defined(__hpux) // HP-UX's value of ULONG_LONG_MAX is unusable in preprocessor expressions\n#define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 8\n#else\n\n// The list of the non-standard macros (the ones except ULLONG_MAX) is taken from cstdint.hpp\n#if defined(ULLONG_MAX)\n#define BOOST_ATOMIC_DETAIL_ULLONG_MAX ULLONG_MAX\n#elif defined(ULONG_LONG_MAX)\n#define BOOST_ATOMIC_DETAIL_ULLONG_MAX ULONG_LONG_MAX\n#elif defined(ULONGLONG_MAX)\n#define BOOST_ATOMIC_DETAIL_ULLONG_MAX ULONGLONG_MAX\n#elif defined(_LLONG_MAX) // strangely enough, this one seems to be holding the limit for the unsigned integer\n#define BOOST_ATOMIC_DETAIL_ULLONG_MAX _LLONG_MAX\n#endif\n\n#if (BOOST_ATOMIC_DETAIL_ULLONG_MAX + 0) == 0xff\n#define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 1\n#elif (BOOST_ATOMIC_DETAIL_ULLONG_MAX + 0) == 0xffff\n#define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 2\n#elif (BOOST_ATOMIC_DETAIL_ULLONG_MAX + 0) == 0xffffffff\n#define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 4\n#elif (BOOST_ATOMIC_DETAIL_ULLONG_MAX + 0) == UINT64_C(0xffffffffffffffff)\n#define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 8\n#endif\n\n#endif // defined(__hpux)\n\n#endif\n\n#if !defined(BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T)\n\n#include <wchar.h>\n#include <boost/cstdint.hpp>\n\n #if defined(_MSC_VER) && ( _MSC_VER <= 1310 || defined(UNDER_CE) && _MSC_VER <= 1500 )\n// MSVC 7.1 and MSVC 8 (arm) define WCHAR_MAX to a value not suitable for constant expressions\n#define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 2\n#elif (WCHAR_MAX + 0) == 0xff || (WCHAR_MAX + 0) == 0x7f\n#define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 1\n#elif (WCHAR_MAX + 0) == 0xffff || (WCHAR_MAX + 0) == 0x7fff\n#define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 2\n#elif (WCHAR_MAX + 0) == 0xffffffff || (WCHAR_MAX + 0) == 0x7fffffff\n#define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 4\n#elif (WCHAR_MAX + 0) == UINT64_C(0xffffffffffffffff) || (WCHAR_MAX + 0) == INT64_C(0x7fffffffffffffff)\n#define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 8\n#endif\n#endif\n\n#if !defined(BOOST_ATOMIC_DETAIL_SIZEOF_SHORT) || !defined(BOOST_ATOMIC_DETAIL_SIZEOF_INT) ||\\\n    !defined(BOOST_ATOMIC_DETAIL_SIZEOF_LONG) || !defined(BOOST_ATOMIC_DETAIL_SIZEOF_LLONG) ||\\\n    !defined(BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T)\n#error Boost.Atomic: Failed to determine builtin integer sizes, the target platform is not supported. Please, report to the developers.\n#endif\n\n#endif // BOOST_ATOMIC_DETAIL_INT_SIZES_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/interlocked.hpp",
    "content": "#ifndef BOOST_ATOMIC_DETAIL_INTERLOCKED_HPP\n#define BOOST_ATOMIC_DETAIL_INTERLOCKED_HPP\n\n//  Copyright (c) 2009 Helge Bahmann\n//  Copyright (c) 2012 - 2014 Andrey Semashev\n//\n//  Distributed under the Boost Software License, Version 1.0.\n//  See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/atomic/detail/config.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\n#if defined(_WIN32_WCE)\n\n#if _WIN32_WCE >= 0x600\n\nextern \"C\" long __cdecl _InterlockedCompareExchange( long volatile *, long, long );\nextern \"C\" long __cdecl _InterlockedExchangeAdd( long volatile *, long );\nextern \"C\" long __cdecl _InterlockedExchange( long volatile *, long );\n\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE(dest, exchange, compare) _InterlockedCompareExchange((long*)(dest), exchange, compare)\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD(dest, addend) _InterlockedExchangeAdd((long*)(dest), (long)(addend))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE(dest, newval) _InterlockedExchange((long*)(dest), (long)(newval))\n\n#else // _WIN32_WCE >= 0x600\n\nextern \"C\" long __cdecl InterlockedCompareExchange( long*, long, long );\nextern \"C\" long __cdecl InterlockedExchangeAdd( long*, long );\nextern \"C\" long __cdecl InterlockedExchange( long*, long );\n\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE(dest, exchange, compare) InterlockedCompareExchange((long*)(dest), exchange, compare)\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD(dest, addend) InterlockedExchangeAdd((long*)(dest), (long)(addend))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE(dest, newval) InterlockedExchange((long*)(dest), (long)(newval))\n\n#endif // _WIN32_WCE >= 0x600\n\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest, exchange, compare) ((void*)BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE((long*)(dest), (long)(exchange), (long)(compare)))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_POINTER(dest, exchange) ((void*)BOOST_ATOMIC_INTERLOCKED_EXCHANGE((long*)(dest), (long)(exchange)))\n\n#elif defined(_MSC_VER) && _MSC_VER >= 1310\n\n#if _MSC_VER < 1400\n\nextern \"C\" long __cdecl _InterlockedCompareExchange( long volatile *, long, long );\nextern \"C\" long __cdecl _InterlockedExchangeAdd( long volatile *, long );\nextern \"C\" long __cdecl _InterlockedExchange( long volatile *, long );\n\n#if defined(BOOST_MSVC)\n#pragma intrinsic(_InterlockedCompareExchange)\n#pragma intrinsic(_InterlockedExchangeAdd)\n#pragma intrinsic(_InterlockedExchange)\n#endif\n\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE(dest, exchange, compare) _InterlockedCompareExchange((long*)(dest), exchange, compare)\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD(dest, addend) _InterlockedExchangeAdd((long*)(dest), (long)(addend))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE(dest, newval) _InterlockedExchange((long*)(dest), (long)(newval))\n\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest, exchange, compare) ((void*)BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE((long*)(dest), (long)(exchange), (long)(compare)))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_POINTER(dest, exchange) ((void*)BOOST_ATOMIC_INTERLOCKED_EXCHANGE((long*)(dest), (long)(exchange)))\n\n#else // _MSC_VER < 1400\n\n#include <intrin.h>\n\n#if defined(BOOST_MSVC)\n#pragma intrinsic(_InterlockedCompareExchange)\n#pragma intrinsic(_InterlockedExchangeAdd)\n#pragma intrinsic(_InterlockedExchange)\n#pragma intrinsic(_InterlockedAnd)\n#pragma intrinsic(_InterlockedOr)\n#pragma intrinsic(_InterlockedXor)\n#endif\n\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE(dest, exchange, compare) _InterlockedCompareExchange((long*)(dest), (long)(exchange), (long)(compare))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD(dest, addend) _InterlockedExchangeAdd((long*)(dest), (long)(addend))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE(dest, newval) _InterlockedExchange((long*)(dest), (long)(newval))\n#define BOOST_ATOMIC_INTERLOCKED_AND(dest, arg) _InterlockedAnd((long*)(dest), (long)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_OR(dest, arg) _InterlockedOr((long*)(dest), (long)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_XOR(dest, arg) _InterlockedXor((long*)(dest), (long)(arg))\n\n#if (defined(_M_IX86) && _M_IX86 >= 500) || defined(_M_AMD64) || defined(_M_IA64)\n#if defined(BOOST_MSVC)\n#pragma intrinsic(_InterlockedCompareExchange64)\n#endif\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64(dest, exchange, compare) _InterlockedCompareExchange64((__int64*)(dest), (__int64)(exchange), (__int64)(compare))\n#endif\n\n#if _MSC_VER >= 1500 && defined(_M_AMD64)\n#if defined(BOOST_MSVC)\n#pragma intrinsic(_InterlockedCompareExchange128)\n#endif\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE128(dest, exchange, compare) _InterlockedCompareExchange128((__int64*)(dest), ((const __int64*)(&exchange))[1], ((const __int64*)(&exchange))[0], (__int64*)(compare))\n#endif\n\n#if _MSC_VER >= 1600\n\n// MSVC 2010 and later provide intrinsics for 8 and 16 bit integers.\n// Note that for each bit count these macros must be either all defined or all not defined.\n// Otherwise atomic<> operations will be implemented inconsistently.\n\n#if defined(BOOST_MSVC)\n#pragma intrinsic(_InterlockedCompareExchange8)\n#pragma intrinsic(_InterlockedExchangeAdd8)\n#pragma intrinsic(_InterlockedExchange8)\n#pragma intrinsic(_InterlockedAnd8)\n#pragma intrinsic(_InterlockedOr8)\n#pragma intrinsic(_InterlockedXor8)\n#endif\n\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE8(dest, exchange, compare) _InterlockedCompareExchange8((char*)(dest), (char)(exchange), (char)(compare))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD8(dest, addend) _InterlockedExchangeAdd8((char*)(dest), (char)(addend))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE8(dest, newval) _InterlockedExchange8((char*)(dest), (char)(newval))\n#define BOOST_ATOMIC_INTERLOCKED_AND8(dest, arg) _InterlockedAnd8((char*)(dest), (char)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_OR8(dest, arg) _InterlockedOr8((char*)(dest), (char)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_XOR8(dest, arg) _InterlockedXor8((char*)(dest), (char)(arg))\n\n#if defined(BOOST_MSVC)\n#pragma intrinsic(_InterlockedCompareExchange16)\n#pragma intrinsic(_InterlockedExchangeAdd16)\n#pragma intrinsic(_InterlockedExchange16)\n#pragma intrinsic(_InterlockedAnd16)\n#pragma intrinsic(_InterlockedOr16)\n#pragma intrinsic(_InterlockedXor16)\n#endif\n\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE16(dest, exchange, compare) _InterlockedCompareExchange16((short*)(dest), (short)(exchange), (short)(compare))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD16(dest, addend) _InterlockedExchangeAdd16((short*)(dest), (short)(addend))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE16(dest, newval) _InterlockedExchange16((short*)(dest), (short)(newval))\n#define BOOST_ATOMIC_INTERLOCKED_AND16(dest, arg) _InterlockedAnd16((short*)(dest), (short)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_OR16(dest, arg) _InterlockedOr16((short*)(dest), (short)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_XOR16(dest, arg) _InterlockedXor16((short*)(dest), (short)(arg))\n\n#endif // _MSC_VER >= 1600\n\n#if defined(_M_AMD64) || defined(_M_IA64)\n\n#if defined(BOOST_MSVC)\n#pragma intrinsic(_InterlockedExchangeAdd64)\n#pragma intrinsic(_InterlockedExchange64)\n#pragma intrinsic(_InterlockedAnd64)\n#pragma intrinsic(_InterlockedOr64)\n#pragma intrinsic(_InterlockedXor64)\n#endif\n\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD64(dest, addend) _InterlockedExchangeAdd64((__int64*)(dest), (__int64)(addend))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE64(dest, newval) _InterlockedExchange64((__int64*)(dest), (__int64)(newval))\n#define BOOST_ATOMIC_INTERLOCKED_AND64(dest, arg) _InterlockedAnd64((__int64*)(dest), (__int64)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_OR64(dest, arg) _InterlockedOr64((__int64*)(dest), (__int64)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_XOR64(dest, arg) _InterlockedXor64((__int64*)(dest), (__int64)(arg))\n\n#if defined(BOOST_MSVC)\n#pragma intrinsic(_InterlockedCompareExchangePointer)\n#pragma intrinsic(_InterlockedExchangePointer)\n#endif\n\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest, exchange, compare) _InterlockedCompareExchangePointer((void**)(dest), (void*)(exchange), (void*)(compare))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_POINTER(dest, newval) _InterlockedExchangePointer((void**)(dest), (void*)(newval))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD_POINTER(dest, byte_offset) ((void*)BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD64((long*)(dest), byte_offset))\n\n#elif defined(_M_IX86)\n\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest, exchange, compare) ((void*)_InterlockedCompareExchange((long*)(dest), (long)(exchange), (long)(compare)))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_POINTER(dest, newval) ((void*)_InterlockedExchange((long*)(dest), (long)(newval)))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD_POINTER(dest, byte_offset) ((void*)BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD((long*)(dest), byte_offset))\n\n#endif\n\n#if _MSC_VER >= 1700 && defined(_M_ARM)\n\n#if defined(BOOST_MSVC)\n#pragma intrinsic(_InterlockedExchangeAdd64)\n#pragma intrinsic(_InterlockedExchange64)\n#pragma intrinsic(_InterlockedAnd64)\n#pragma intrinsic(_InterlockedOr64)\n#pragma intrinsic(_InterlockedXor64)\n#endif\n\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD64(dest, addend) _InterlockedExchangeAdd64((__int64*)(dest), (__int64)(addend))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE64(dest, newval) _InterlockedExchange64((__int64*)(dest), (__int64)(newval))\n#define BOOST_ATOMIC_INTERLOCKED_AND64(dest, arg) _InterlockedAnd64((__int64*)(dest), (__int64)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_OR64(dest, arg) _InterlockedOr64((__int64*)(dest), (__int64)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_XOR64(dest, arg) _InterlockedXor64((__int64*)(dest), (__int64)(arg))\n\n#if defined(BOOST_MSVC)\n#pragma intrinsic(_InterlockedCompareExchange8_nf)\n#pragma intrinsic(_InterlockedCompareExchange8_acq)\n#pragma intrinsic(_InterlockedCompareExchange8_rel)\n#pragma intrinsic(_InterlockedCompareExchange16_nf)\n#pragma intrinsic(_InterlockedCompareExchange16_acq)\n#pragma intrinsic(_InterlockedCompareExchange16_rel)\n#pragma intrinsic(_InterlockedCompareExchange_nf)\n#pragma intrinsic(_InterlockedCompareExchange_acq)\n#pragma intrinsic(_InterlockedCompareExchange_rel)\n#pragma intrinsic(_InterlockedCompareExchange64)\n#pragma intrinsic(_InterlockedCompareExchange64_nf)\n#pragma intrinsic(_InterlockedCompareExchange64_acq)\n#pragma intrinsic(_InterlockedCompareExchange64_rel)\n#pragma intrinsic(_InterlockedCompareExchangePointer)\n#pragma intrinsic(_InterlockedCompareExchangePointer_nf)\n#pragma intrinsic(_InterlockedCompareExchangePointer_acq)\n#pragma intrinsic(_InterlockedCompareExchangePointer_rel)\n#endif\n\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE8_RELAXED(dest, exchange, compare) _InterlockedCompareExchange8_nf((char*)(dest), (char)(exchange), (char)(compare))\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE8_ACQUIRE(dest, exchange, compare) _InterlockedCompareExchange8_acq((char*)(dest), (char)(exchange), (char)(compare))\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE8_RELEASE(dest, exchange, compare) _InterlockedCompareExchange8_rel((char*)(dest), (char)(exchange), (char)(compare))\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE16_RELAXED(dest, exchange, compare) _InterlockedCompareExchange16_nf((short*)(dest), (short)(exchange), (short)(compare))\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE16_ACQUIRE(dest, exchange, compare) _InterlockedCompareExchange16_acq((short*)(dest), (short)(exchange), (short)(compare))\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE16_RELEASE(dest, exchange, compare) _InterlockedCompareExchange16_rel((short*)(dest), (short)(exchange), (short)(compare))\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE_RELAXED(dest, exchange, compare) _InterlockedCompareExchange_nf((long*)(dest), (long)(exchange), (long)(compare))\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE_ACQUIRE(dest, exchange, compare) _InterlockedCompareExchange_acq((long*)(dest), (long)(exchange), (long)(compare))\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE_RELEASE(dest, exchange, compare) _InterlockedCompareExchange_rel((long*)(dest), (long)(exchange), (long)(compare))\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64(dest, exchange, compare) _InterlockedCompareExchange64((__int64*)(dest), (__int64)(exchange), (__int64)(compare))\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64_RELAXED(dest, exchange, compare) _InterlockedCompareExchange64_nf((__int64*)(dest), (__int64)(exchange), (__int64)(compare))\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64_ACQUIRE(dest, exchange, compare) _InterlockedCompareExchange64_acq((__int64*)(dest), (__int64)(exchange), (__int64)(compare))\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64_RELEASE(dest, exchange, compare) _InterlockedCompareExchange64_rel((__int64*)(dest), (__int64)(exchange), (__int64)(compare))\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest, exchange, compare) _InterlockedCompareExchangePointer((void**)(dest), (void*)(exchange), (void*)(compare))\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE_POINTER_RELAXED(dest, exchange, compare) _InterlockedCompareExchangePointer_nf((void**)(dest), (void*)(exchange), (void*)(compare))\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE_POINTER_ACQUIRE(dest, exchange, compare) _InterlockedCompareExchangePointer_acq((void**)(dest), (void*)(exchange), (void*)(compare))\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE_POINTER_RELEASE(dest, exchange, compare) _InterlockedCompareExchangePointer_rel((void**)(dest), (void*)(exchange), (void*)(compare))\n\n#if defined(BOOST_MSVC)\n#pragma intrinsic(_InterlockedExchangeAdd8_nf)\n#pragma intrinsic(_InterlockedExchangeAdd8_acq)\n#pragma intrinsic(_InterlockedExchangeAdd8_rel)\n#pragma intrinsic(_InterlockedExchangeAdd16_nf)\n#pragma intrinsic(_InterlockedExchangeAdd16_acq)\n#pragma intrinsic(_InterlockedExchangeAdd16_rel)\n#pragma intrinsic(_InterlockedExchangeAdd_nf)\n#pragma intrinsic(_InterlockedExchangeAdd_acq)\n#pragma intrinsic(_InterlockedExchangeAdd_rel)\n#pragma intrinsic(_InterlockedExchangeAdd64_nf)\n#pragma intrinsic(_InterlockedExchangeAdd64_acq)\n#pragma intrinsic(_InterlockedExchangeAdd64_rel)\n#endif\n\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD8_RELAXED(dest, addend) _InterlockedExchangeAdd8_nf((char*)(dest), (char)(addend))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD8_ACQUIRE(dest, addend) _InterlockedExchangeAdd8_acq((char*)(dest), (char)(addend))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD8_RELEASE(dest, addend) _InterlockedExchangeAdd8_rel((char*)(dest), (char)(addend))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD16_RELAXED(dest, addend) _InterlockedExchangeAdd16_nf((short*)(dest), (short)(addend))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD16_ACQUIRE(dest, addend) _InterlockedExchangeAdd16_acq((short*)(dest), (short)(addend))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD16_RELEASE(dest, addend) _InterlockedExchangeAdd16_rel((short*)(dest), (short)(addend))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD_RELAXED(dest, addend) _InterlockedExchangeAdd_nf((long*)(dest), (long)(addend))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD_ACQUIRE(dest, addend) _InterlockedExchangeAdd_acq((long*)(dest), (long)(addend))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD_RELEASE(dest, addend) _InterlockedExchangeAdd_rel((long*)(dest), (long)(addend))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD64_RELAXED(dest, addend) _InterlockedExchangeAdd64_nf((__int64*)(dest), (__int64)(addend))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD64_ACQUIRE(dest, addend) _InterlockedExchangeAdd64_acq((__int64*)(dest), (__int64)(addend))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD64_RELEASE(dest, addend) _InterlockedExchangeAdd64_rel((__int64*)(dest), (__int64)(addend))\n\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD_POINTER(dest, byte_offset) ((void*)BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD((long*)(dest), byte_offset))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD_POINTER_RELAXED(dest, byte_offset) ((void*)BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD_RELAXED((long*)(dest), byte_offset))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD_POINTER_ACQUIRE(dest, byte_offset) ((void*)BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD_ACQUIRE((long*)(dest), byte_offset))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD_POINTER_RELEASE(dest, byte_offset) ((void*)BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD_RELEASE((long*)(dest), byte_offset))\n\n#if defined(BOOST_MSVC)\n#pragma intrinsic(_InterlockedExchange8_nf)\n#pragma intrinsic(_InterlockedExchange8_acq)\n#pragma intrinsic(_InterlockedExchange16_nf)\n#pragma intrinsic(_InterlockedExchange16_acq)\n#pragma intrinsic(_InterlockedExchange_nf)\n#pragma intrinsic(_InterlockedExchange_acq)\n#pragma intrinsic(_InterlockedExchange64_nf)\n#pragma intrinsic(_InterlockedExchange64_acq)\n#pragma intrinsic(_InterlockedExchangePointer)\n#pragma intrinsic(_InterlockedExchangePointer_nf)\n#pragma intrinsic(_InterlockedExchangePointer_acq)\n#if _MSC_VER >= 1800\n#pragma intrinsic(_InterlockedExchange8_rel)\n#pragma intrinsic(_InterlockedExchange16_rel)\n#pragma intrinsic(_InterlockedExchange_rel)\n#pragma intrinsic(_InterlockedExchange64_rel)\n#pragma intrinsic(_InterlockedExchangePointer_rel)\n#endif\n#endif\n\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE8_RELAXED(dest, newval) _InterlockedExchange8_nf((char*)(dest), (char)(newval))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE8_ACQUIRE(dest, newval) _InterlockedExchange8_acq((char*)(dest), (char)(newval))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE16_RELAXED(dest, newval) _InterlockedExchange16_nf((short*)(dest), (short)(newval))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE16_ACQUIRE(dest, newval) _InterlockedExchange16_acq((short*)(dest), (short)(newval))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_RELAXED(dest, newval) _InterlockedExchange_nf((long*)(dest), (long)(newval))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ACQUIRE(dest, newval) _InterlockedExchange_acq((long*)(dest), (long)(newval))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE64_RELAXED(dest, newval) _InterlockedExchange64_nf((__int64*)(dest), (__int64)(newval))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE64_ACQUIRE(dest, newval) _InterlockedExchange64_acq((__int64*)(dest), (__int64)(newval))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_POINTER(dest, newval) _InterlockedExchangePointer((void**)(dest), (void*)(newval))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_POINTER_RELAXED(dest, newval) _InterlockedExchangePointer_nf((void**)(dest), (void*)(newval))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_POINTER_ACQUIRE(dest, newval) _InterlockedExchangePointer_acq((void**)(dest), (void*)(newval))\n\n#if _MSC_VER >= 1800\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE8_RELEASE(dest, newval) _InterlockedExchange8_rel((char*)(dest), (char)(newval))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE16_RELEASE(dest, newval) _InterlockedExchange16_rel((short*)(dest), (short)(newval))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_RELEASE(dest, newval) _InterlockedExchange_rel((long*)(dest), (long)(newval))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE64_RELEASE(dest, newval) _InterlockedExchange64_rel((__int64*)(dest), (__int64)(newval))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_POINTER_RELEASE(dest, newval) _InterlockedExchangePointer_rel((void**)(dest), (void*)(newval))\n#else\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE8_RELEASE(dest, newval) BOOST_ATOMIC_INTERLOCKED_EXCHANGE8(dest, newval)\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE16_RELEASE(dest, newval) BOOST_ATOMIC_INTERLOCKED_EXCHANGE16(dest, newval)\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_RELEASE(dest, newval) BOOST_ATOMIC_INTERLOCKED_EXCHANGE(dest, newval)\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE64_RELEASE(dest, newval) BOOST_ATOMIC_INTERLOCKED_EXCHANGE64(dest, newval)\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_POINTER_RELEASE(dest, newval) BOOST_ATOMIC_INTERLOCKED_EXCHANGE_POINTER(dest, newval)\n#endif\n\n#if defined(BOOST_MSVC)\n#pragma intrinsic(_InterlockedAnd8_nf)\n#pragma intrinsic(_InterlockedAnd8_acq)\n#pragma intrinsic(_InterlockedAnd8_rel)\n#pragma intrinsic(_InterlockedAnd16_nf)\n#pragma intrinsic(_InterlockedAnd16_acq)\n#pragma intrinsic(_InterlockedAnd16_rel)\n#pragma intrinsic(_InterlockedAnd_nf)\n#pragma intrinsic(_InterlockedAnd_acq)\n#pragma intrinsic(_InterlockedAnd_rel)\n#pragma intrinsic(_InterlockedAnd64_nf)\n#pragma intrinsic(_InterlockedAnd64_acq)\n#pragma intrinsic(_InterlockedAnd64_rel)\n#endif\n\n#define BOOST_ATOMIC_INTERLOCKED_AND8_RELAXED(dest, arg) _InterlockedAnd8_nf((char*)(dest), (char)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_AND8_ACQUIRE(dest, arg) _InterlockedAnd8_acq((char*)(dest), (char)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_AND8_RELEASE(dest, arg) _InterlockedAnd8_rel((char*)(dest), (char)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_AND16_RELAXED(dest, arg) _InterlockedAnd16_nf((short*)(dest), (short)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_AND16_ACQUIRE(dest, arg) _InterlockedAnd16_acq((short*)(dest), (short)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_AND16_RELEASE(dest, arg) _InterlockedAnd16_rel((short*)(dest), (short)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_AND_RELAXED(dest, arg) _InterlockedAnd_nf((long*)(dest), (long)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_AND_ACQUIRE(dest, arg) _InterlockedAnd_acq((long*)(dest), (long)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_AND_RELEASE(dest, arg) _InterlockedAnd_rel((long*)(dest), (long)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_AND64_RELAXED(dest, arg) _InterlockedAnd64_nf((__int64*)(dest), (__int64)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_AND64_ACQUIRE(dest, arg) _InterlockedAnd64_acq((__int64*)(dest), (__int64)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_AND64_RELEASE(dest, arg) _InterlockedAnd64_rel((__int64*)(dest), (__int64)(arg))\n\n#if defined(BOOST_MSVC)\n#pragma intrinsic(_InterlockedOr8_nf)\n#pragma intrinsic(_InterlockedOr8_acq)\n#pragma intrinsic(_InterlockedOr8_rel)\n#pragma intrinsic(_InterlockedOr16_nf)\n#pragma intrinsic(_InterlockedOr16_acq)\n#pragma intrinsic(_InterlockedOr16_rel)\n#pragma intrinsic(_InterlockedOr_nf)\n#pragma intrinsic(_InterlockedOr_acq)\n#pragma intrinsic(_InterlockedOr_rel)\n#pragma intrinsic(_InterlockedOr64_nf)\n#pragma intrinsic(_InterlockedOr64_acq)\n#pragma intrinsic(_InterlockedOr64_rel)\n#endif\n\n#define BOOST_ATOMIC_INTERLOCKED_OR8_RELAXED(dest, arg) _InterlockedOr8_nf((char*)(dest), (char)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_OR8_ACQUIRE(dest, arg) _InterlockedOr8_acq((char*)(dest), (char)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_OR8_RELEASE(dest, arg) _InterlockedOr8_rel((char*)(dest), (char)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_OR16_RELAXED(dest, arg) _InterlockedOr16_nf((short*)(dest), (short)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_OR16_ACQUIRE(dest, arg) _InterlockedOr16_acq((short*)(dest), (short)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_OR16_RELEASE(dest, arg) _InterlockedOr16_rel((short*)(dest), (short)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_OR_RELAXED(dest, arg) _InterlockedOr_nf((long*)(dest), (long)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_OR_ACQUIRE(dest, arg) _InterlockedOr_acq((long*)(dest), (long)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_OR_RELEASE(dest, arg) _InterlockedOr_rel((long*)(dest), (long)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_OR64_RELAXED(dest, arg) _InterlockedOr64_nf((__int64*)(dest), (__int64)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_OR64_ACQUIRE(dest, arg) _InterlockedOr64_acq((__int64*)(dest), (__int64)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_OR64_RELEASE(dest, arg) _InterlockedOr64_rel((__int64*)(dest), (__int64)(arg))\n\n#if defined(BOOST_MSVC)\n#pragma intrinsic(_InterlockedXor8_nf)\n#pragma intrinsic(_InterlockedXor8_acq)\n#pragma intrinsic(_InterlockedXor8_rel)\n#pragma intrinsic(_InterlockedXor16_nf)\n#pragma intrinsic(_InterlockedXor16_acq)\n#pragma intrinsic(_InterlockedXor16_rel)\n#pragma intrinsic(_InterlockedXor_nf)\n#pragma intrinsic(_InterlockedXor_acq)\n#pragma intrinsic(_InterlockedXor_rel)\n#pragma intrinsic(_InterlockedXor64_nf)\n#pragma intrinsic(_InterlockedXor64_acq)\n#pragma intrinsic(_InterlockedXor64_rel)\n#endif\n\n#define BOOST_ATOMIC_INTERLOCKED_XOR8_RELAXED(dest, arg) _InterlockedXor8_nf((char*)(dest), (char)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_XOR8_ACQUIRE(dest, arg) _InterlockedXor8_acq((char*)(dest), (char)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_XOR8_RELEASE(dest, arg) _InterlockedXor8_rel((char*)(dest), (char)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_XOR16_RELAXED(dest, arg) _InterlockedXor16_nf((short*)(dest), (short)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_XOR16_ACQUIRE(dest, arg) _InterlockedXor16_acq((short*)(dest), (short)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_XOR16_RELEASE(dest, arg) _InterlockedXor16_rel((short*)(dest), (short)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_XOR_RELAXED(dest, arg) _InterlockedXor_nf((long*)(dest), (long)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_XOR_ACQUIRE(dest, arg) _InterlockedXor_acq((long*)(dest), (long)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_XOR_RELEASE(dest, arg) _InterlockedXor_rel((long*)(dest), (long)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_XOR64_RELAXED(dest, arg) _InterlockedXor64_nf((__int64*)(dest), (__int64)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_XOR64_ACQUIRE(dest, arg) _InterlockedXor64_acq((__int64*)(dest), (__int64)(arg))\n#define BOOST_ATOMIC_INTERLOCKED_XOR64_RELEASE(dest, arg) _InterlockedXor64_rel((__int64*)(dest), (__int64)(arg))\n\n#endif // _MSC_VER >= 1700 && defined(_M_ARM)\n\n#endif // _MSC_VER < 1400\n\n#else // defined(_MSC_VER) && _MSC_VER >= 1310\n\n#if defined(BOOST_USE_WINDOWS_H)\n\n#include <windows.h>\n\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE(dest, exchange, compare) InterlockedCompareExchange((long*)(dest), (long)(exchange), (long)(compare))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE(dest, newval) InterlockedExchange((long*)(dest), (long)(newval))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD(dest, addend) InterlockedExchangeAdd((long*)(dest), (long)(addend))\n\n#if defined(_WIN64)\n\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64(dest, exchange, compare) InterlockedCompareExchange64((__int64*)(dest), (__int64)(exchange), (__int64)(compare))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE64(dest, newval) InterlockedExchange64((__int64*)(dest), (__int64)(newval))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD64(dest, addend) InterlockedExchangeAdd64((__int64*)(dest), (__int64)(addend))\n\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest, exchange, compare) InterlockedCompareExchangePointer((void**)(dest), (void*)(exchange), (void*)(compare))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_POINTER(dest, newval) InterlockedExchangePointer((void**)(dest), (void*)(newval))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD_POINTER(dest, byte_offset) ((void*)BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD64(dest, byte_offset))\n\n#else // defined(_WIN64)\n\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest, exchange, compare) ((void*)BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE(dest, exchange, compare))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_POINTER(dest, newval) ((void*)BOOST_ATOMIC_INTERLOCKED_EXCHANGE(dest, newval))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD_POINTER(dest, byte_offset) ((void*)BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD(dest, byte_offset))\n\n#endif // defined(_WIN64)\n\n#else // defined(BOOST_USE_WINDOWS_H)\n\n#if defined(__MINGW64__)\n#define BOOST_ATOMIC_INTERLOCKED_IMPORT\n#else\n#define BOOST_ATOMIC_INTERLOCKED_IMPORT __declspec(dllimport)\n#endif\n\nnamespace boost {\nnamespace atomics {\nnamespace detail {\n\nextern \"C\" {\n\nBOOST_ATOMIC_INTERLOCKED_IMPORT long __stdcall InterlockedCompareExchange(long volatile*, long, long);\nBOOST_ATOMIC_INTERLOCKED_IMPORT long __stdcall InterlockedExchange(long volatile*, long);\nBOOST_ATOMIC_INTERLOCKED_IMPORT long __stdcall InterlockedExchangeAdd(long volatile*, long);\n\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE(dest, exchange, compare) boost::atomics::detail::InterlockedCompareExchange((long*)(dest), (long)(exchange), (long)(compare))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE(dest, newval) boost::atomics::detail::InterlockedExchange((long*)(dest), (long)(newval))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD(dest, addend) boost::atomics::detail::InterlockedExchangeAdd((long*)(dest), (long)(addend))\n\n#if defined(_WIN64)\n\nBOOST_ATOMIC_INTERLOCKED_IMPORT __int64 __stdcall InterlockedCompareExchange64(__int64 volatile*, __int64, __int64);\nBOOST_ATOMIC_INTERLOCKED_IMPORT __int64 __stdcall InterlockedExchange64(__int64 volatile*, __int64);\nBOOST_ATOMIC_INTERLOCKED_IMPORT __int64 __stdcall InterlockedExchangeAdd64(__int64 volatile*, __int64);\n\nBOOST_ATOMIC_INTERLOCKED_IMPORT void* __stdcall InterlockedCompareExchangePointer(void* volatile *, void*, void*);\nBOOST_ATOMIC_INTERLOCKED_IMPORT void* __stdcall InterlockedExchangePointer(void* volatile *, void*);\n\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64(dest, exchange, compare) boost::atomics::detail::InterlockedCompareExchange64((__int64*)(dest), (__int64)(exchange), (__int64)(compare))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE64(dest, newval) boost::atomics::detail::InterlockedExchange64((__int64*)(dest), (__int64)(newval))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD64(dest, addend) boost::atomics::detail::InterlockedExchangeAdd64((__int64*)(dest), (__int64)(addend))\n\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest, exchange, compare) boost::atomics::detail::InterlockedCompareExchangePointer((void**)(dest), (void*)(exchange), (void*)(compare))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_POINTER(dest, newval) boost::atomics::detail::InterlockedExchangePointer((void**)(dest), (void*)(newval))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD_POINTER(dest, byte_offset) ((void*)BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD64(dest, byte_offset))\n\n#else // defined(_WIN64)\n\n#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest, exchange, compare) ((void*)BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE(dest, exchange, compare))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_POINTER(dest, newval) ((void*)BOOST_ATOMIC_INTERLOCKED_EXCHANGE(dest, newval))\n#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD_POINTER(dest, byte_offset) ((void*)BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD(dest, byte_offset))\n\n#endif // defined(_WIN64)\n\n} // extern \"C\"\n\n} // namespace detail\n} // namespace atomics\n} // namespace boost\n\n#undef BOOST_ATOMIC_INTERLOCKED_IMPORT\n\n#endif // defined(BOOST_USE_WINDOWS_H)\n\n#endif // defined(_MSC_VER)\n\n#endif\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/link.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2012 Hartmut Kaiser\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/config.hpp\n *\n * This header defines macros for linking with compiled library of Boost.Atomic\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_LINK_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_LINK_HPP_INCLUDED_\n\n#include <boost/atomic/detail/config.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\n///////////////////////////////////////////////////////////////////////////////\n//  Set up dll import/export options\n#if (defined(BOOST_ATOMIC_DYN_LINK) || defined(BOOST_ALL_DYN_LINK)) && \\\n    !defined(BOOST_ATOMIC_STATIC_LINK)\n\n#if defined(BOOST_ATOMIC_SOURCE)\n#define BOOST_ATOMIC_DECL BOOST_SYMBOL_EXPORT\n#define BOOST_ATOMIC_BUILD_DLL\n#else\n#define BOOST_ATOMIC_DECL BOOST_SYMBOL_IMPORT\n#endif\n\n#endif // building a shared library\n\n#ifndef BOOST_ATOMIC_DECL\n#define BOOST_ATOMIC_DECL\n#endif\n\n///////////////////////////////////////////////////////////////////////////////\n//  Auto library naming\n#if !defined(BOOST_ATOMIC_SOURCE) && !defined(BOOST_ALL_NO_LIB) && \\\n    !defined(BOOST_ATOMIC_NO_LIB)\n\n#define BOOST_LIB_NAME boost_atomic\n\n// tell the auto-link code to select a dll when required:\n#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_ATOMIC_DYN_LINK)\n#define BOOST_DYN_LINK\n#endif\n\n#include <boost/config/auto_link.hpp>\n\n#endif  // auto-linking disabled\n\n#endif\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/lockpool.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2011 Helge Bahmann\n * Copyright (c) 2013-2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/lockpool.hpp\n *\n * This header contains declaration of the lockpool used to emulate atomic ops.\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_LOCKPOOL_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_LOCKPOOL_HPP_INCLUDED_\n\n#include <boost/atomic/detail/config.hpp>\n#include <boost/atomic/detail/link.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\nnamespace boost {\nnamespace atomics {\nnamespace detail {\n\nstruct lockpool\n{\n    class scoped_lock\n    {\n        void* m_lock;\n\n    public:\n        explicit BOOST_ATOMIC_DECL scoped_lock(const volatile void* addr) BOOST_NOEXCEPT;\n        BOOST_ATOMIC_DECL ~scoped_lock() BOOST_NOEXCEPT;\n\n        BOOST_DELETED_FUNCTION(scoped_lock(scoped_lock const&))\n        BOOST_DELETED_FUNCTION(scoped_lock& operator=(scoped_lock const&))\n    };\n\n    static BOOST_ATOMIC_DECL void thread_fence() BOOST_NOEXCEPT;\n    static BOOST_ATOMIC_DECL void signal_fence() BOOST_NOEXCEPT;\n};\n\n} // namespace detail\n} // namespace atomics\n} // namespace boost\n\n#endif // BOOST_ATOMIC_DETAIL_LOCKPOOL_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/operations.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/operations.hpp\n *\n * This header defines atomic operations, including the emulated version.\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_OPERATIONS_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_OPERATIONS_HPP_INCLUDED_\n\n#include <boost/atomic/detail/operations_lockfree.hpp>\n#include <boost/atomic/detail/ops_emulated.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\n#endif // BOOST_ATOMIC_DETAIL_OPERATIONS_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/operations_fwd.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/operations_fwd.hpp\n *\n * This header contains forward declaration of the \\c operations template.\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_OPERATIONS_FWD_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_OPERATIONS_FWD_HPP_INCLUDED_\n\n#include <cstddef>\n#include <boost/atomic/detail/config.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\nnamespace boost {\nnamespace atomics {\nnamespace detail {\n\ntemplate< std::size_t Size, bool Signed >\nstruct operations;\n\n} // namespace detail\n} // namespace atomics\n} // namespace boost\n\n#endif // BOOST_ATOMIC_DETAIL_OPERATIONS_FWD_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/operations_lockfree.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/operations_lockfree.hpp\n *\n * This header defines lockfree atomic operations.\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_OPERATIONS_LOCKFREE_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_OPERATIONS_LOCKFREE_HPP_INCLUDED_\n\n#include <boost/atomic/detail/config.hpp>\n#include <boost/atomic/detail/platform.hpp>\n\n#if !defined(BOOST_ATOMIC_EMULATED)\n#include BOOST_ATOMIC_DETAIL_HEADER(boost/atomic/detail/ops_)\n#else\n#include <boost/atomic/detail/operations_fwd.hpp>\n#endif\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\n#endif // BOOST_ATOMIC_DETAIL_OPERATIONS_LOCKFREE_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/ops_cas_based.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/ops_cas_based.hpp\n *\n * This header contains CAS-based implementation of the \\c operations template.\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_OPS_CAS_BASED_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_OPS_CAS_BASED_HPP_INCLUDED_\n\n#include <boost/memory_order.hpp>\n#include <boost/atomic/detail/config.hpp>\n#include <boost/atomic/detail/storage_type.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\nnamespace boost {\nnamespace atomics {\nnamespace detail {\n\ntemplate< typename Base >\nstruct cas_based_exchange :\n    public Base\n{\n    typedef typename Base::storage_type storage_type;\n\n    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type old_val;\n        atomics::detail::non_atomic_load(storage, old_val);\n        while (!Base::compare_exchange_weak(storage, old_val, v, order, memory_order_relaxed)) {}\n        return old_val;\n    }\n};\n\ntemplate< typename Base >\nstruct cas_based_operations :\n    public Base\n{\n    typedef typename Base::storage_type storage_type;\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type old_val;\n        atomics::detail::non_atomic_load(storage, old_val);\n        while (!Base::compare_exchange_weak(storage, old_val, old_val + v, order, memory_order_relaxed)) {}\n        return old_val;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type old_val;\n        atomics::detail::non_atomic_load(storage, old_val);\n        while (!Base::compare_exchange_weak(storage, old_val, old_val - v, order, memory_order_relaxed)) {}\n        return old_val;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type old_val;\n        atomics::detail::non_atomic_load(storage, old_val);\n        while (!Base::compare_exchange_weak(storage, old_val, old_val & v, order, memory_order_relaxed)) {}\n        return old_val;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type old_val;\n        atomics::detail::non_atomic_load(storage, old_val);\n        while (!Base::compare_exchange_weak(storage, old_val, old_val | v, order, memory_order_relaxed)) {}\n        return old_val;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type old_val;\n        atomics::detail::non_atomic_load(storage, old_val);\n        while (!Base::compare_exchange_weak(storage, old_val, old_val ^ v, order, memory_order_relaxed)) {}\n        return old_val;\n    }\n\n    static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        return !!Base::exchange(storage, (storage_type)1, order);\n    }\n\n    static BOOST_FORCEINLINE void clear(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        Base::store(storage, (storage_type)0, order);\n    }\n};\n\n} // namespace detail\n} // namespace atomics\n} // namespace boost\n\n#endif // BOOST_ATOMIC_DETAIL_OPS_CAS_BASED_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/ops_emulated.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/ops_emulated.hpp\n *\n * This header contains lockpool-based implementation of the \\c operations template.\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_OPS_EMULATED_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_OPS_EMULATED_HPP_INCLUDED_\n\n#include <cstddef>\n#include <boost/memory_order.hpp>\n#include <boost/atomic/detail/config.hpp>\n#include <boost/atomic/detail/storage_type.hpp>\n#include <boost/atomic/detail/operations_fwd.hpp>\n#include <boost/atomic/detail/lockpool.hpp>\n#include <boost/atomic/capabilities.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\nnamespace boost {\nnamespace atomics {\nnamespace detail {\n\ntemplate< typename T >\nstruct emulated_operations\n{\n    typedef T storage_type;\n\n    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        lockpool::scoped_lock lock(&storage);\n        const_cast< storage_type& >(storage) = v;\n    }\n\n    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order) BOOST_NOEXCEPT\n    {\n        lockpool::scoped_lock lock(&storage);\n        return const_cast< storage_type const& >(storage);\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        storage_type& s = const_cast< storage_type& >(storage);\n        lockpool::scoped_lock lock(&storage);\n        storage_type old_val = s;\n        s += v;\n        return old_val;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        storage_type& s = const_cast< storage_type& >(storage);\n        lockpool::scoped_lock lock(&storage);\n        storage_type old_val = s;\n        s -= v;\n        return old_val;\n    }\n\n    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        storage_type& s = const_cast< storage_type& >(storage);\n        lockpool::scoped_lock lock(&storage);\n        storage_type old_val = s;\n        s = v;\n        return old_val;\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_strong(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order) BOOST_NOEXCEPT\n    {\n        storage_type& s = const_cast< storage_type& >(storage);\n        lockpool::scoped_lock lock(&storage);\n        storage_type old_val = s;\n        const bool res = old_val == expected;\n        if (res)\n            s = desired;\n        expected = old_val;\n\n        return res;\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_weak(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        // Note: This function is the exact copy of compare_exchange_strong. The reason we're not just forwarding the call\n        // is that MSVC-12 ICEs in this case.\n        storage_type& s = const_cast< storage_type& >(storage);\n        lockpool::scoped_lock lock(&storage);\n        storage_type old_val = s;\n        const bool res = old_val == expected;\n        if (res)\n            s = desired;\n        expected = old_val;\n\n        return res;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        storage_type& s = const_cast< storage_type& >(storage);\n        lockpool::scoped_lock lock(&storage);\n        storage_type old_val = s;\n        s &= v;\n        return old_val;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        storage_type& s = const_cast< storage_type& >(storage);\n        lockpool::scoped_lock lock(&storage);\n        storage_type old_val = s;\n        s |= v;\n        return old_val;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        storage_type& s = const_cast< storage_type& >(storage);\n        lockpool::scoped_lock lock(&storage);\n        storage_type old_val = s;\n        s ^= v;\n        return old_val;\n    }\n\n    static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        return !!exchange(storage, (storage_type)1, order);\n    }\n\n    static BOOST_FORCEINLINE void clear(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        store(storage, (storage_type)0, order);\n    }\n\n    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT\n    {\n        return false;\n    }\n};\n\ntemplate< std::size_t Size, bool Signed >\nstruct operations :\n    public emulated_operations< typename make_storage_type< Size, Signed >::type >\n{\n    typedef typename make_storage_type< Size, Signed >::aligned aligned_storage_type;\n};\n\n} // namespace detail\n} // namespace atomics\n} // namespace boost\n\n#endif // BOOST_ATOMIC_DETAIL_OPS_EMULATED_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/ops_extending_cas_based.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/ops_extending_cas_based.hpp\n *\n * This header contains a boilerplate of the \\c operations template implementation that requires sign/zero extension in arithmetic operations.\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_OPS_EXTENDING_CAS_BASED_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_OPS_EXTENDING_CAS_BASED_HPP_INCLUDED_\n\n#include <cstddef>\n#include <boost/memory_order.hpp>\n#include <boost/atomic/detail/config.hpp>\n#include <boost/atomic/detail/storage_type.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\nnamespace boost {\nnamespace atomics {\nnamespace detail {\n\ntemplate< typename Base, std::size_t Size, bool Signed >\nstruct extending_cas_based_operations :\n    public Base\n{\n    typedef typename Base::storage_type storage_type;\n    typedef typename make_storage_type< Size, Signed >::type emulated_storage_type;\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type old_val;\n        atomics::detail::non_atomic_load(storage, old_val);\n        emulated_storage_type new_val;\n        do\n        {\n            new_val = static_cast< emulated_storage_type >(old_val) + static_cast< emulated_storage_type >(v);\n        }\n        while (!Base::compare_exchange_weak(storage, old_val, static_cast< storage_type >(new_val), order, memory_order_relaxed));\n        return old_val;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type old_val;\n        atomics::detail::non_atomic_load(storage, old_val);\n        emulated_storage_type new_val;\n        do\n        {\n            new_val = static_cast< emulated_storage_type >(old_val) - static_cast< emulated_storage_type >(v);\n        }\n        while (!Base::compare_exchange_weak(storage, old_val, static_cast< storage_type >(new_val), order, memory_order_relaxed));\n        return old_val;\n    }\n};\n\n} // namespace detail\n} // namespace atomics\n} // namespace boost\n\n#endif // BOOST_ATOMIC_DETAIL_OPS_EXTENDING_CAS_BASED_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/ops_gcc_alpha.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2009 Helge Bahmann\n * Copyright (c) 2013 Tim Blechmann\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/ops_gcc_alpha.hpp\n *\n * This header contains implementation of the \\c operations template.\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_OPS_GCC_ALPHA_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_OPS_GCC_ALPHA_HPP_INCLUDED_\n\n#include <boost/memory_order.hpp>\n#include <boost/atomic/detail/config.hpp>\n#include <boost/atomic/detail/storage_type.hpp>\n#include <boost/atomic/detail/operations_fwd.hpp>\n#include <boost/atomic/capabilities.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\nnamespace boost {\nnamespace atomics {\nnamespace detail {\n\n/*\n  Refer to http://h71000.www7.hp.com/doc/82final/5601/5601pro_004.html\n  (HP OpenVMS systems documentation) and the Alpha Architecture Reference Manual.\n */\n\n/*\n    NB: The most natural thing would be to write the increment/decrement\n    operators along the following lines:\n\n    __asm__ __volatile__\n    (\n        \"1: ldl_l %0,%1 \\n\"\n        \"addl %0,1,%0 \\n\"\n        \"stl_c %0,%1 \\n\"\n        \"beq %0,1b\\n\"\n        : \"=&b\" (tmp)\n        : \"m\" (value)\n        : \"cc\"\n    );\n\n    However according to the comments on the HP website and matching\n    comments in the Linux kernel sources this defies branch prediction,\n    as the cpu assumes that backward branches are always taken; so\n    instead copy the trick from the Linux kernel, introduce a forward\n    branch and back again.\n\n    I have, however, had a hard time measuring the difference between\n    the two versions in microbenchmarks -- I am leaving it in nevertheless\n    as it apparently does not hurt either.\n*/\n\nstruct gcc_alpha_operations_base\n{\n    static BOOST_FORCEINLINE void fence_before(memory_order order) BOOST_NOEXCEPT\n    {\n        if ((order & memory_order_release) != 0)\n            __asm__ __volatile__ (\"mb\" ::: \"memory\");\n    }\n\n    static BOOST_FORCEINLINE void fence_after(memory_order order) BOOST_NOEXCEPT\n    {\n        if ((order & (memory_order_consume | memory_order_acquire)) != 0)\n            __asm__ __volatile__ (\"mb\" ::: \"memory\");\n    }\n\n    static BOOST_FORCEINLINE void fence_after_store(memory_order order) BOOST_NOEXCEPT\n    {\n        if (order == memory_order_seq_cst)\n            __asm__ __volatile__ (\"mb\" ::: \"memory\");\n    }\n};\n\n\ntemplate< bool Signed >\nstruct operations< 4u, Signed > :\n    public gcc_alpha_operations_base\n{\n    typedef typename make_storage_type< 4u, Signed >::type storage_type;\n    typedef typename make_storage_type< 4u, Signed >::aligned aligned_storage_type;\n\n    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        fence_before(order);\n        storage = v;\n        fence_after_store(order);\n    }\n\n    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type v = storage;\n        fence_after(order);\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, tmp;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\"\n            \"mov %3, %1\\n\"\n            \"ldl_l %0, %2\\n\"\n            \"stl_c %1, %2\\n\"\n            \"beq %1, 2f\\n\"\n\n            \".subsection 2\\n\"\n            \"2: br 1b\\n\"\n            \".previous\\n\"\n\n            : \"=&r\" (original),  // %0\n              \"=&r\" (tmp)        // %1\n            : \"m\" (storage),     // %2\n              \"r\" (v)            // %3\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_weak(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        fence_before(success_order);\n        int success;\n        storage_type current;\n        __asm__ __volatile__\n        (\n            \"1:\\n\"\n            \"ldl_l %2, %4\\n\"                // current = *(&storage)\n            \"cmpeq %2, %0, %3\\n\"            // success = current == expected\n            \"mov %2, %0\\n\"                  // expected = current\n            \"beq %3, 2f\\n\"                  // if (success == 0) goto end\n            \"stl_c %1, %4\\n\"                // storage = desired; desired = store succeeded\n            \"mov %1, %3\\n\"                  // success = desired\n            \"2:\\n\"\n            : \"+&r\" (expected),  // %0\n              \"+&r\" (desired),   // %1\n              \"=&r\" (current),   // %2\n              \"=&r\" (success)    // %3\n            : \"m\" (storage)      // %4\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        if (success)\n            fence_after(success_order);\n        else\n            fence_after(failure_order);\n        return !!success;\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_strong(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        int success;\n        storage_type current, tmp;\n        fence_before(success_order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\"\n            \"mov %5, %1\\n\"                  // tmp = desired\n            \"ldl_l %2, %4\\n\"                // current = *(&storage)\n            \"cmpeq %2, %0, %3\\n\"            // success = current == expected\n            \"mov %2, %0\\n\"                  // expected = current\n            \"beq %3, 2f\\n\"                  // if (success == 0) goto end\n            \"stl_c %1, %4\\n\"                // storage = tmp; tmp = store succeeded\n            \"beq %1, 3f\\n\"                  // if (tmp == 0) goto retry\n            \"mov %1, %3\\n\"                  // success = tmp\n            \"2:\\n\"\n\n            \".subsection 2\\n\"\n            \"3: br 1b\\n\"\n            \".previous\\n\"\n\n            : \"+&r\" (expected),  // %0\n              \"=&r\" (tmp),       // %1\n              \"=&r\" (current),   // %2\n              \"=&r\" (success)    // %3\n            : \"m\" (storage),     // %4\n              \"r\" (desired)      // %5\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        if (success)\n            fence_after(success_order);\n        else\n            fence_after(failure_order);\n        return !!success;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, modified;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\"\n            \"ldl_l %0, %2\\n\"\n            \"addl %0, %3, %1\\n\"\n            \"stl_c %1, %2\\n\"\n            \"beq %1, 2f\\n\"\n\n            \".subsection 2\\n\"\n            \"2: br 1b\\n\"\n            \".previous\\n\"\n\n            : \"=&r\" (original),  // %0\n              \"=&r\" (modified)   // %1\n            : \"m\" (storage),     // %2\n              \"r\" (v)            // %3\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, modified;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\"\n            \"ldl_l %0, %2\\n\"\n            \"subl %0, %3, %1\\n\"\n            \"stl_c %1, %2\\n\"\n            \"beq %1, 2f\\n\"\n\n            \".subsection 2\\n\"\n            \"2: br 1b\\n\"\n            \".previous\\n\"\n\n            : \"=&r\" (original),  // %0\n              \"=&r\" (modified)   // %1\n            : \"m\" (storage),     // %2\n              \"r\" (v)            // %3\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, modified;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\"\n            \"ldl_l %0, %2\\n\"\n            \"and %0, %3, %1\\n\"\n            \"stl_c %1, %2\\n\"\n            \"beq %1, 2f\\n\"\n\n            \".subsection 2\\n\"\n            \"2: br 1b\\n\"\n            \".previous\\n\"\n\n            : \"=&r\" (original),  // %0\n              \"=&r\" (modified)   // %1\n            : \"m\" (storage),     // %2\n              \"r\" (v)            // %3\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, modified;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\"\n            \"ldl_l %0, %2\\n\"\n            \"bis %0, %3, %1\\n\"\n            \"stl_c %1, %2\\n\"\n            \"beq %1, 2f\\n\"\n\n            \".subsection 2\\n\"\n            \"2: br 1b\\n\"\n            \".previous\\n\"\n\n            : \"=&r\" (original),  // %0\n              \"=&r\" (modified)   // %1\n            : \"m\" (storage),     // %2\n              \"r\" (v)            // %3\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, modified;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\"\n            \"ldl_l %0, %2\\n\"\n            \"xor %0, %3, %1\\n\"\n            \"stl_c %1, %2\\n\"\n            \"beq %1, 2f\\n\"\n\n            \".subsection 2\\n\"\n            \"2: br 1b\\n\"\n            \".previous\\n\"\n\n            : \"=&r\" (original),  // %0\n              \"=&r\" (modified)   // %1\n            : \"m\" (storage),     // %2\n              \"r\" (v)            // %3\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        return !!exchange(storage, (storage_type)1, order);\n    }\n\n    static BOOST_FORCEINLINE void clear(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        store(storage, 0, order);\n    }\n\n    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT\n    {\n        return true;\n    }\n};\n\n\ntemplate< >\nstruct operations< 1u, false > :\n    public operations< 4u, false >\n{\n    typedef operations< 4u, false > base_type;\n    typedef base_type::storage_type storage_type;\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, modified;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\"\n            \"ldl_l %0, %2\\n\"\n            \"addl %0, %3, %1\\n\"\n            \"zapnot %1, #1, %1\\n\"\n            \"stl_c %1, %2\\n\"\n            \"beq %1, 2f\\n\"\n\n            \".subsection 2\\n\"\n            \"2: br 1b\\n\"\n            \".previous\\n\"\n\n            : \"=&r\" (original),  // %0\n              \"=&r\" (modified)   // %1\n            : \"m\" (storage),     // %2\n              \"r\" (v)            // %3\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, modified;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\"\n            \"ldl_l %0, %2\\n\"\n            \"subl %0, %3, %1\\n\"\n            \"zapnot %1, #1, %1\\n\"\n            \"stl_c %1, %2\\n\"\n            \"beq %1, 2f\\n\"\n\n            \".subsection 2\\n\"\n            \"2: br 1b\\n\"\n            \".previous\\n\"\n\n            : \"=&r\" (original),  // %0\n              \"=&r\" (modified)   // %1\n            : \"m\" (storage),     // %2\n              \"r\" (v)            // %3\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n};\n\ntemplate< >\nstruct operations< 1u, true > :\n    public operations< 4u, true >\n{\n    typedef operations< 4u, true > base_type;\n    typedef base_type::storage_type storage_type;\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, modified;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\"\n            \"ldl_l %0, %2\\n\"\n            \"addl %0, %3, %1\\n\"\n            \"sextb %1, %1\\n\"\n            \"stl_c %1, %2\\n\"\n            \"beq %1, 2f\\n\"\n\n            \".subsection 2\\n\"\n            \"2: br 1b\\n\"\n            \".previous\\n\"\n\n            : \"=&r\" (original),  // %0\n              \"=&r\" (modified)   // %1\n            : \"m\" (storage),     // %2\n              \"r\" (v)            // %3\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, modified;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\"\n            \"ldl_l %0, %2\\n\"\n            \"subl %0, %3, %1\\n\"\n            \"sextb %1, %1\\n\"\n            \"stl_c %1, %2\\n\"\n            \"beq %1, 2f\\n\"\n\n            \".subsection 2\\n\"\n            \"2: br 1b\\n\"\n            \".previous\\n\"\n\n            : \"=&r\" (original),  // %0\n              \"=&r\" (modified)   // %1\n            : \"m\" (storage),     // %2\n              \"r\" (v)            // %3\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n};\n\n\ntemplate< >\nstruct operations< 2u, false > :\n    public operations< 4u, false >\n{\n    typedef operations< 4u, false > base_type;\n    typedef base_type::storage_type storage_type;\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, modified;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\"\n            \"ldl_l %0, %2\\n\"\n            \"addl %0, %3, %1\\n\"\n            \"zapnot %1, #3, %1\\n\"\n            \"stl_c %1, %2\\n\"\n            \"beq %1, 2f\\n\"\n\n            \".subsection 2\\n\"\n            \"2: br 1b\\n\"\n            \".previous\\n\"\n\n            : \"=&r\" (original),  // %0\n              \"=&r\" (modified)   // %1\n            : \"m\" (storage),     // %2\n              \"r\" (v)            // %3\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, modified;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\"\n            \"ldl_l %0, %2\\n\"\n            \"subl %0, %3, %1\\n\"\n            \"zapnot %1, #3, %1\\n\"\n            \"stl_c %1, %2\\n\"\n            \"beq %1, 2f\\n\"\n\n            \".subsection 2\\n\"\n            \"2: br 1b\\n\"\n            \".previous\\n\"\n\n            : \"=&r\" (original),  // %0\n              \"=&r\" (modified)   // %1\n            : \"m\" (storage),     // %2\n              \"r\" (v)            // %3\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n};\n\ntemplate< >\nstruct operations< 2u, true > :\n    public operations< 4u, true >\n{\n    typedef operations< 4u, true > base_type;\n    typedef base_type::storage_type storage_type;\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, modified;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\"\n            \"ldl_l %0, %2\\n\"\n            \"addl %0, %3, %1\\n\"\n            \"sextw %1, %1\\n\"\n            \"stl_c %1, %2\\n\"\n            \"beq %1, 2f\\n\"\n\n            \".subsection 2\\n\"\n            \"2: br 1b\\n\"\n            \".previous\\n\"\n\n            : \"=&r\" (original),  // %0\n              \"=&r\" (modified)   // %1\n            : \"m\" (storage),     // %2\n              \"r\" (v)            // %3\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, modified;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\"\n            \"ldl_l %0, %2\\n\"\n            \"subl %0, %3, %1\\n\"\n            \"sextw %1, %1\\n\"\n            \"stl_c %1, %2\\n\"\n            \"beq %1, 2f\\n\"\n\n            \".subsection 2\\n\"\n            \"2: br 1b\\n\"\n            \".previous\\n\"\n\n            : \"=&r\" (original),  // %0\n              \"=&r\" (modified)   // %1\n            : \"m\" (storage),     // %2\n              \"r\" (v)            // %3\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n};\n\n\ntemplate< bool Signed >\nstruct operations< 8u, Signed > :\n    public gcc_alpha_operations_base\n{\n    typedef typename make_storage_type< 8u, Signed >::type storage_type;\n    typedef typename make_storage_type< 8u, Signed >::aligned aligned_storage_type;\n\n    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        fence_before(order);\n        storage = v;\n        fence_after_store(order);\n    }\n\n    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type v = storage;\n        fence_after(order);\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, tmp;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\"\n            \"mov %3, %1\\n\"\n            \"ldq_l %0, %2\\n\"\n            \"stq_c %1, %2\\n\"\n            \"beq %1, 2f\\n\"\n\n            \".subsection 2\\n\"\n            \"2: br 1b\\n\"\n            \".previous\\n\"\n\n            : \"=&r\" (original),  // %0\n              \"=&r\" (tmp)        // %1\n            : \"m\" (storage),     // %2\n              \"r\" (v)            // %3\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_weak(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        fence_before(success_order);\n        int success;\n        storage_type current;\n        __asm__ __volatile__\n        (\n            \"1:\\n\"\n            \"ldq_l %2, %4\\n\"                // current = *(&storage)\n            \"cmpeq %2, %0, %3\\n\"            // success = current == expected\n            \"mov %2, %0\\n\"                  // expected = current\n            \"beq %3, 2f\\n\"                  // if (success == 0) goto end\n            \"stq_c %1, %4\\n\"                // storage = desired; desired = store succeeded\n            \"mov %1, %3\\n\"                  // success = desired\n            \"2:\\n\"\n            : \"+&r\" (expected),  // %0\n              \"+&r\" (desired),   // %1\n              \"=&r\" (current),   // %2\n              \"=&r\" (success)    // %3\n            : \"m\" (storage)      // %4\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        if (success)\n            fence_after(success_order);\n        else\n            fence_after(failure_order);\n        return !!success;\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_strong(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        int success;\n        storage_type current, tmp;\n        fence_before(success_order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\"\n            \"mov %5, %1\\n\"                  // tmp = desired\n            \"ldq_l %2, %4\\n\"                // current = *(&storage)\n            \"cmpeq %2, %0, %3\\n\"            // success = current == expected\n            \"mov %2, %0\\n\"                  // expected = current\n            \"beq %3, 2f\\n\"                  // if (success == 0) goto end\n            \"stq_c %1, %4\\n\"                // storage = tmp; tmp = store succeeded\n            \"beq %1, 3f\\n\"                  // if (tmp == 0) goto retry\n            \"mov %1, %3\\n\"                  // success = tmp\n            \"2:\\n\"\n\n            \".subsection 2\\n\"\n            \"3: br 1b\\n\"\n            \".previous\\n\"\n\n            : \"+&r\" (expected),  // %0\n              \"=&r\" (tmp),       // %1\n              \"=&r\" (current),   // %2\n              \"=&r\" (success)    // %3\n            : \"m\" (storage),     // %4\n              \"r\" (desired)      // %5\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        if (success)\n            fence_after(success_order);\n        else\n            fence_after(failure_order);\n        return !!success;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, modified;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\"\n            \"ldq_l %0, %2\\n\"\n            \"addq %0, %3, %1\\n\"\n            \"stq_c %1, %2\\n\"\n            \"beq %1, 2f\\n\"\n\n            \".subsection 2\\n\"\n            \"2: br 1b\\n\"\n            \".previous\\n\"\n\n            : \"=&r\" (original),  // %0\n              \"=&r\" (modified)   // %1\n            : \"m\" (storage),     // %2\n              \"r\" (v)            // %3\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, modified;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\"\n            \"ldq_l %0, %2\\n\"\n            \"subq %0, %3, %1\\n\"\n            \"stq_c %1, %2\\n\"\n            \"beq %1, 2f\\n\"\n\n            \".subsection 2\\n\"\n            \"2: br 1b\\n\"\n            \".previous\\n\"\n\n            : \"=&r\" (original),  // %0\n              \"=&r\" (modified)   // %1\n            : \"m\" (storage),     // %2\n              \"r\" (v)            // %3\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, modified;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\"\n            \"ldq_l %0, %2\\n\"\n            \"and %0, %3, %1\\n\"\n            \"stq_c %1, %2\\n\"\n            \"beq %1, 2f\\n\"\n\n            \".subsection 2\\n\"\n            \"2: br 1b\\n\"\n            \".previous\\n\"\n\n            : \"=&r\" (original),  // %0\n              \"=&r\" (modified)   // %1\n            : \"m\" (storage),     // %2\n              \"r\" (v)            // %3\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, modified;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\"\n            \"ldq_l %0, %2\\n\"\n            \"bis %0, %3, %1\\n\"\n            \"stq_c %1, %2\\n\"\n            \"beq %1, 2f\\n\"\n\n            \".subsection 2\\n\"\n            \"2: br 1b\\n\"\n            \".previous\\n\"\n\n            : \"=&r\" (original),  // %0\n              \"=&r\" (modified)   // %1\n            : \"m\" (storage),     // %2\n              \"r\" (v)            // %3\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, modified;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\"\n            \"ldq_l %0, %2\\n\"\n            \"xor %0, %3, %1\\n\"\n            \"stq_c %1, %2\\n\"\n            \"beq %1, 2f\\n\"\n\n            \".subsection 2\\n\"\n            \"2: br 1b\\n\"\n            \".previous\\n\"\n\n            : \"=&r\" (original),  // %0\n              \"=&r\" (modified)   // %1\n            : \"m\" (storage),     // %2\n              \"r\" (v)            // %3\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        return !!exchange(storage, (storage_type)1, order);\n    }\n\n    static BOOST_FORCEINLINE void clear(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        store(storage, 0, order);\n    }\n\n    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT\n    {\n        return true;\n    }\n};\n\n\nBOOST_FORCEINLINE void thread_fence(memory_order order) BOOST_NOEXCEPT\n{\n    if (order != memory_order_relaxed)\n        __asm__ __volatile__ (\"mb\" ::: \"memory\");\n}\n\nBOOST_FORCEINLINE void signal_fence(memory_order order) BOOST_NOEXCEPT\n{\n    if (order != memory_order_relaxed)\n        __asm__ __volatile__ (\"\" ::: \"memory\");\n}\n\n} // namespace detail\n} // namespace atomics\n} // namespace boost\n\n#endif // BOOST_ATOMIC_DETAIL_OPS_GCC_ALPHA_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/ops_gcc_arm.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2009 Helge Bahmann\n * Copyright (c) 2013 Tim Blechmann\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/ops_gcc_arm.hpp\n *\n * This header contains implementation of the \\c operations template.\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_OPS_GCC_ARM_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_OPS_GCC_ARM_HPP_INCLUDED_\n\n#include <boost/cstdint.hpp>\n#include <boost/memory_order.hpp>\n#include <boost/atomic/detail/config.hpp>\n#include <boost/atomic/detail/storage_type.hpp>\n#include <boost/atomic/detail/operations_fwd.hpp>\n#include <boost/atomic/detail/ops_extending_cas_based.hpp>\n#include <boost/atomic/capabilities.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\nnamespace boost {\nnamespace atomics {\nnamespace detail {\n\n// From the ARM Architecture Reference Manual for architecture v6:\n//\n// LDREX{<cond>} <Rd>, [<Rn>]\n// <Rd> Specifies the destination register for the memory word addressed by <Rd>\n// <Rn> Specifies the register containing the address.\n//\n// STREX{<cond>} <Rd>, <Rm>, [<Rn>]\n// <Rd> Specifies the destination register for the returned status value.\n//      0  if the operation updates memory\n//      1  if the operation fails to update memory\n// <Rm> Specifies the register containing the word to be stored to memory.\n// <Rn> Specifies the register containing the address.\n// Rd must not be the same register as Rm or Rn.\n//\n// ARM v7 is like ARM v6 plus:\n// There are half-word and byte versions of the LDREX and STREX instructions,\n// LDREXH, LDREXB, STREXH and STREXB.\n// There are also double-word versions, LDREXD and STREXD.\n// (Actually it looks like these are available from version 6k onwards.)\n// FIXME these are not yet used; should be mostly a matter of copy-and-paste.\n// I think you can supply an immediate offset to the address.\n//\n// A memory barrier is effected using a \"co-processor 15\" instruction,\n// though a separate assembler mnemonic is available for it in v7.\n//\n// \"Thumb 1\" is a subset of the ARM instruction set that uses a 16-bit encoding.  It\n// doesn't include all instructions and in particular it doesn't include the co-processor\n// instruction used for the memory barrier or the load-locked/store-conditional\n// instructions.  So, if we're compiling in \"Thumb 1\" mode, we need to wrap all of our\n// asm blocks with code to temporarily change to ARM mode.\n//\n// You can only change between ARM and Thumb modes when branching using the bx instruction.\n// bx takes an address specified in a register.  The least significant bit of the address\n// indicates the mode, so 1 is added to indicate that the destination code is Thumb.\n// A temporary register is needed for the address and is passed as an argument to these\n// macros.  It must be one of the \"low\" registers accessible to Thumb code, specified\n// using the \"l\" attribute in the asm statement.\n//\n// Architecture v7 introduces \"Thumb 2\", which does include (almost?) all of the ARM\n// instruction set.  (Actually, there was an extension of v6 called v6T2 which supported\n// \"Thumb 2\" mode, but its architecture manual is no longer available, referring to v7.)\n// So in v7 we don't need to change to ARM mode; we can write \"universal\n// assembler\" which will assemble to Thumb 2 or ARM code as appropriate.  The only thing\n// we need to do to make this \"universal\" assembler mode work is to insert \"IT\" instructions\n// to annotate the conditional instructions.  These are ignored in other modes (e.g. v6),\n// so they can always be present.\n\n// A note about memory_order_consume. Technically, this architecture allows to avoid\n// unnecessary memory barrier after consume load since it supports data dependency ordering.\n// However, some compiler optimizations may break a seemingly valid code relying on data\n// dependency tracking by injecting bogus branches to aid out of order execution.\n// This may happen not only in Boost.Atomic code but also in user's code, which we have no\n// control of. See this thread: http://lists.boost.org/Archives/boost/2014/06/213890.php.\n// For this reason we promote memory_order_consume to memory_order_acquire.\n\n#if defined(__thumb__) && !defined(__thumb2__)\n#define BOOST_ATOMIC_DETAIL_ARM_ASM_START(TMPREG) \"adr \" #TMPREG \", 8f\\n\" \"bx \" #TMPREG \"\\n\" \".arm\\n\" \".align 4\\n\" \"8:\\n\"\n#define BOOST_ATOMIC_DETAIL_ARM_ASM_END(TMPREG)   \"adr \" #TMPREG \", 9f + 1\\n\" \"bx \" #TMPREG \"\\n\" \".thumb\\n\" \".align 2\\n\" \"9:\\n\"\n#define BOOST_ATOMIC_DETAIL_ARM_ASM_TMPREG_CONSTRAINT(var) \"=&l\" (var)\n#else\n// The tmpreg may be wasted in this case, which is non-optimal.\n#define BOOST_ATOMIC_DETAIL_ARM_ASM_START(TMPREG)\n#define BOOST_ATOMIC_DETAIL_ARM_ASM_END(TMPREG)\n#define BOOST_ATOMIC_DETAIL_ARM_ASM_TMPREG_CONSTRAINT(var) \"=&r\" (var)\n#endif\n\nstruct gcc_arm_operations_base\n{\n    static BOOST_FORCEINLINE void fence_before(memory_order order) BOOST_NOEXCEPT\n    {\n        if ((order & memory_order_release) != 0)\n            hardware_full_fence();\n    }\n\n    static BOOST_FORCEINLINE void fence_after(memory_order order) BOOST_NOEXCEPT\n    {\n        if ((order & (memory_order_consume | memory_order_acquire)) != 0)\n            hardware_full_fence();\n    }\n\n    static BOOST_FORCEINLINE void fence_after_store(memory_order order) BOOST_NOEXCEPT\n    {\n        if (order == memory_order_seq_cst)\n            hardware_full_fence();\n    }\n\n    static BOOST_FORCEINLINE void hardware_full_fence() BOOST_NOEXCEPT\n    {\n#if defined(BOOST_ATOMIC_DETAIL_ARM_HAS_DMB)\n        // Older binutils (supposedly, older than 2.21.1) didn't support symbolic or numeric arguments of the \"dmb\" instruction such as \"ish\" or \"#11\".\n        // As a workaround we have to inject encoded bytes of the instruction. There are two encodings for the instruction: ARM and Thumb. See ARM Architecture Reference Manual, A8.8.43.\n        // Since we cannot detect binutils version at compile time, we'll have to always use this hack.\n        __asm__ __volatile__\n        (\n#if defined(__thumb2__)\n            \".short 0xF3BF, 0x8F5B\\n\" // dmb ish\n#else\n            \".word 0xF57FF05B\\n\" // dmb ish\n#endif\n            :\n            :\n            : \"memory\"\n        );\n#else\n        int tmp;\n        __asm__ __volatile__\n        (\n            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%0)\n            \"mcr\\tp15, 0, r0, c7, c10, 5\\n\"\n            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%0)\n            : \"=&l\" (tmp)\n            :\n            : \"memory\"\n        );\n#endif\n    }\n};\n\n\ntemplate< bool Signed >\nstruct operations< 4u, Signed > :\n    public gcc_arm_operations_base\n{\n    typedef typename make_storage_type< 4u, Signed >::type storage_type;\n    typedef typename make_storage_type< 4u, Signed >::aligned aligned_storage_type;\n\n    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        fence_before(order);\n        storage = v;\n        fence_after_store(order);\n    }\n\n    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type v = storage;\n        fence_after(order);\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original;\n        fence_before(order);\n        uint32_t tmp;\n        __asm__ __volatile__\n        (\n            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%[tmp])\n            \"1:\\n\"\n            \"ldrex %[original], %[storage]\\n\"          // load the original value\n            \"strex %[tmp], %[value], %[storage]\\n\"     // store the replacement, tmp = store failed\n            \"teq   %[tmp], #0\\n\"                       // check if store succeeded\n            \"bne   1b\\n\"\n            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%[tmp])\n            : [tmp] \"=&l\" (tmp), [original] \"=&r\" (original), [storage] \"+Q\" (storage)\n            : [value] \"r\" (v)\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_weak(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        fence_before(success_order);\n        uint32_t success;\n        uint32_t tmp;\n        storage_type original;\n        __asm__ __volatile__\n        (\n            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%[tmp])\n            \"mov     %[success], #0\\n\"                      // success = 0\n            \"ldrex   %[original], %[storage]\\n\"             // original = *(&storage)\n            \"cmp     %[original], %[expected]\\n\"            // flags = original==expected\n            \"itt     eq\\n\"                                  // [hint that the following 2 instructions are conditional on flags.equal]\n            \"strexeq %[success], %[desired], %[storage]\\n\"  // if (flags.equal) *(&storage) = desired, success = store failed\n            \"eoreq   %[success], %[success], #1\\n\"          // if (flags.equal) success ^= 1 (i.e. make it 1 if store succeeded)\n            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%[tmp])\n            : [original] \"=&r\" (original),  // %0\n              [success] \"=&r\" (success),    // %1\n              [tmp] \"=&l\" (tmp),            // %2\n              [storage] \"+Q\" (storage)      // %3\n            : [expected] \"r\" (expected),    // %4\n              [desired] \"r\" (desired)       // %5\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        if (success)\n            fence_after(success_order);\n        else\n            fence_after(failure_order);\n        expected = original;\n        return !!success;\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_strong(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        fence_before(success_order);\n        uint32_t success;\n        uint32_t tmp;\n        storage_type original;\n        __asm__ __volatile__\n        (\n            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%[tmp])\n            \"mov     %[success], #0\\n\"                      // success = 0\n            \"1:\\n\"\n            \"ldrex   %[original], %[storage]\\n\"             // original = *(&storage)\n            \"cmp     %[original], %[expected]\\n\"            // flags = original==expected\n            \"bne     2f\\n\"                                  // if (!flags.equal) goto end\n            \"strex   %[success], %[desired], %[storage]\\n\"  // *(&storage) = desired, success = store failed\n            \"eors    %[success], %[success], #1\\n\"          // success ^= 1 (i.e. make it 1 if store succeeded); flags.equal = success == 0\n            \"beq     1b\\n\"                                  // if (flags.equal) goto retry\n            \"2:\\n\"\n            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%[tmp])\n            : [original] \"=&r\" (original),  // %0\n              [success] \"=&r\" (success),    // %1\n              [tmp] \"=&l\" (tmp),            // %2\n              [storage] \"+Q\" (storage)      // %3\n            : [expected] \"r\" (expected),    // %4\n              [desired] \"r\" (desired)       // %5\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        if (success)\n            fence_after(success_order);\n        else\n            fence_after(failure_order);\n        expected = original;\n        return !!success;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        fence_before(order);\n        uint32_t tmp;\n        storage_type original, result;\n        __asm__ __volatile__\n        (\n            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%[tmp])\n            \"1:\\n\"\n            \"ldrex   %[original], %[storage]\\n\"           // original = *(&storage)\n            \"add     %[result], %[original], %[value]\\n\"  // result = original + value\n            \"strex   %[tmp], %[result], %[storage]\\n\"     // *(&storage) = result, tmp = store failed\n            \"teq     %[tmp], #0\\n\"                        // flags = tmp==0\n            \"bne     1b\\n\"                                // if (!flags.equal) goto retry\n            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%[tmp])\n            : [original] \"=&r\" (original),  // %0\n              [result] \"=&r\" (result),      // %1\n              [tmp] \"=&l\" (tmp),            // %2\n              [storage] \"+Q\" (storage)      // %3\n            : [value] \"r\" (v)               // %4\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        fence_before(order);\n        uint32_t tmp;\n        storage_type original, result;\n        __asm__ __volatile__\n        (\n            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%[tmp])\n            \"1:\\n\"\n            \"ldrex   %[original], %[storage]\\n\"           // original = *(&storage)\n            \"sub     %[result], %[original], %[value]\\n\"  // result = original - value\n            \"strex   %[tmp], %[result], %[storage]\\n\"     // *(&storage) = result, tmp = store failed\n            \"teq     %[tmp], #0\\n\"                        // flags = tmp==0\n            \"bne     1b\\n\"                                // if (!flags.equal) goto retry\n            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%[tmp])\n            : [original] \"=&r\" (original),  // %0\n              [result] \"=&r\" (result),      // %1\n              [tmp] \"=&l\" (tmp),            // %2\n              [storage] \"+Q\" (storage)      // %3\n            : [value] \"r\" (v)               // %4\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        fence_before(order);\n        uint32_t tmp;\n        storage_type original, result;\n        __asm__ __volatile__\n        (\n            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%[tmp])\n            \"1:\\n\"\n            \"ldrex   %[original], %[storage]\\n\"           // original = *(&storage)\n            \"and     %[result], %[original], %[value]\\n\"  // result = original & value\n            \"strex   %[tmp], %[result], %[storage]\\n\"     // *(&storage) = result, tmp = store failed\n            \"teq     %[tmp], #0\\n\"                        // flags = tmp==0\n            \"bne     1b\\n\"                                // if (!flags.equal) goto retry\n            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%[tmp])\n            : [original] \"=&r\" (original),  // %0\n              [result] \"=&r\" (result),      // %1\n              [tmp] \"=&l\" (tmp),            // %2\n              [storage] \"+Q\" (storage)      // %3\n            : [value] \"r\" (v)               // %4\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        fence_before(order);\n        uint32_t tmp;\n        storage_type original, result;\n        __asm__ __volatile__\n        (\n            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%[tmp])\n            \"1:\\n\"\n            \"ldrex   %[original], %[storage]\\n\"           // original = *(&storage)\n            \"orr     %[result], %[original], %[value]\\n\"  // result = original | value\n            \"strex   %[tmp], %[result], %[storage]\\n\"     // *(&storage) = result, tmp = store failed\n            \"teq     %[tmp], #0\\n\"                        // flags = tmp==0\n            \"bne     1b\\n\"                                // if (!flags.equal) goto retry\n            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%[tmp])\n            : [original] \"=&r\" (original),  // %0\n              [result] \"=&r\" (result),      // %1\n              [tmp] \"=&l\" (tmp),            // %2\n              [storage] \"+Q\" (storage)      // %3\n            : [value] \"r\" (v)               // %4\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        fence_before(order);\n        uint32_t tmp;\n        storage_type original, result;\n        __asm__ __volatile__\n        (\n            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%[tmp])\n            \"1:\\n\"\n            \"ldrex   %[original], %[storage]\\n\"           // original = *(&storage)\n            \"eor     %[result], %[original], %[value]\\n\"  // result = original ^ value\n            \"strex   %[tmp], %[result], %[storage]\\n\"     // *(&storage) = result, tmp = store failed\n            \"teq     %[tmp], #0\\n\"                        // flags = tmp==0\n            \"bne     1b\\n\"                                // if (!flags.equal) goto retry\n            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%[tmp])\n            : [original] \"=&r\" (original),  // %0\n              [result] \"=&r\" (result),      // %1\n              [tmp] \"=&l\" (tmp),            // %2\n              [storage] \"+Q\" (storage)      // %3\n            : [value] \"r\" (v)               // %4\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        return !!exchange(storage, (storage_type)1, order);\n    }\n\n    static BOOST_FORCEINLINE void clear(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        store(storage, 0, order);\n    }\n\n    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT\n    {\n        return true;\n    }\n};\n\n\ntemplate< >\nstruct operations< 1u, false > :\n    public operations< 4u, false >\n{\n    typedef operations< 4u, false > base_type;\n    typedef base_type::storage_type storage_type;\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        fence_before(order);\n        uint32_t tmp;\n        storage_type original, result;\n        __asm__ __volatile__\n        (\n            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%[tmp])\n            \"1:\\n\"\n            \"ldrex   %[original], %[storage]\\n\"           // original = *(&storage)\n            \"add     %[result], %[original], %[value]\\n\"  // result = original + value\n            \"uxtb    %[result], %[result]\\n\"              // zero extend result from 8 to 32 bits\n            \"strex   %[tmp], %[result], %[storage]\\n\"     // *(&storage) = result, tmp = store failed\n            \"teq     %[tmp], #0\\n\"                        // flags = tmp==0\n            \"bne     1b\\n\"                                // if (!flags.equal) goto retry\n            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%[tmp])\n            : [original] \"=&r\" (original),  // %0\n              [result] \"=&r\" (result),      // %1\n              [tmp] \"=&l\" (tmp),            // %2\n              [storage] \"+Q\" (storage)      // %3\n            : [value] \"r\" (v)               // %4\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        fence_before(order);\n        uint32_t tmp;\n        storage_type original, result;\n        __asm__ __volatile__\n        (\n            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%[tmp])\n            \"1:\\n\"\n            \"ldrex   %[original], %[storage]\\n\"           // original = *(&storage)\n            \"sub     %[result], %[original], %[value]\\n\"  // result = original - value\n            \"uxtb    %[result], %[result]\\n\"              // zero extend result from 8 to 32 bits\n            \"strex   %[tmp], %[result], %[storage]\\n\"     // *(&storage) = result, tmp = store failed\n            \"teq     %[tmp], #0\\n\"                        // flags = tmp==0\n            \"bne     1b\\n\"                                // if (!flags.equal) goto retry\n            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%[tmp])\n            : [original] \"=&r\" (original),  // %0\n              [result] \"=&r\" (result),      // %1\n              [tmp] \"=&l\" (tmp),            // %2\n              [storage] \"+Q\" (storage)      // %3\n            : [value] \"r\" (v)               // %4\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n};\n\ntemplate< >\nstruct operations< 1u, true > :\n    public operations< 4u, true >\n{\n    typedef operations< 4u, true > base_type;\n    typedef base_type::storage_type storage_type;\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        fence_before(order);\n        uint32_t tmp;\n        storage_type original, result;\n        __asm__ __volatile__\n        (\n            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%[tmp])\n            \"1:\\n\"\n            \"ldrex   %[original], %[storage]\\n\"           // original = *(&storage)\n            \"add     %[result], %[original], %[value]\\n\"  // result = original + value\n            \"sxtb    %[result], %[result]\\n\"              // sign extend result from 8 to 32 bits\n            \"strex   %[tmp], %[result], %[storage]\\n\"     // *(&storage) = result, tmp = store failed\n            \"teq     %[tmp], #0\\n\"                        // flags = tmp==0\n            \"bne     1b\\n\"                                // if (!flags.equal) goto retry\n            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%[tmp])\n            : [original] \"=&r\" (original),  // %0\n              [result] \"=&r\" (result),      // %1\n              [tmp] \"=&l\" (tmp),            // %2\n              [storage] \"+Q\" (storage)      // %3\n            : [value] \"r\" (v)               // %4\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        fence_before(order);\n        uint32_t tmp;\n        storage_type original, result;\n        __asm__ __volatile__\n        (\n            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%[tmp])\n            \"1:\\n\"\n            \"ldrex   %[original], %[storage]\\n\"           // original = *(&storage)\n            \"sub     %[result], %[original], %[value]\\n\"  // result = original - value\n            \"sxtb    %[result], %[result]\\n\"              // sign extend result from 8 to 32 bits\n            \"strex   %[tmp], %[result], %[storage]\\n\"     // *(&storage) = result, tmp = store failed\n            \"teq     %[tmp], #0\\n\"                        // flags = tmp==0\n            \"bne     1b\\n\"                                // if (!flags.equal) goto retry\n            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%[tmp])\n            : [original] \"=&r\" (original),  // %0\n              [result] \"=&r\" (result),      // %1\n              [tmp] \"=&l\" (tmp),            // %2\n              [storage] \"+Q\" (storage)      // %3\n            : [value] \"r\" (v)               // %4\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n};\n\n\ntemplate< >\nstruct operations< 2u, false > :\n    public operations< 4u, false >\n{\n    typedef operations< 4u, false > base_type;\n    typedef base_type::storage_type storage_type;\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        fence_before(order);\n        uint32_t tmp;\n        storage_type original, result;\n        __asm__ __volatile__\n        (\n            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%[tmp])\n            \"1:\\n\"\n            \"ldrex   %[original], %[storage]\\n\"           // original = *(&storage)\n            \"add     %[result], %[original], %[value]\\n\"  // result = original + value\n            \"uxth    %[result], %[result]\\n\"              // zero extend result from 16 to 32 bits\n            \"strex   %[tmp], %[result], %[storage]\\n\"     // *(&storage) = result, tmp = store failed\n            \"teq     %[tmp], #0\\n\"                        // flags = tmp==0\n            \"bne     1b\\n\"                                // if (!flags.equal) goto retry\n            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%[tmp])\n            : [original] \"=&r\" (original),  // %0\n              [result] \"=&r\" (result),      // %1\n              [tmp] \"=&l\" (tmp),            // %2\n              [storage] \"+Q\" (storage)      // %3\n            : [value] \"r\" (v)               // %4\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        fence_before(order);\n        uint32_t tmp;\n        storage_type original, result;\n        __asm__ __volatile__\n        (\n            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%[tmp])\n            \"1:\\n\"\n            \"ldrex   %[original], %[storage]\\n\"           // original = *(&storage)\n            \"sub     %[result], %[original], %[value]\\n\"  // result = original - value\n            \"uxth    %[result], %[result]\\n\"              // zero extend result from 16 to 32 bits\n            \"strex   %[tmp], %[result], %[storage]\\n\"     // *(&storage) = result, tmp = store failed\n            \"teq     %[tmp], #0\\n\"                        // flags = tmp==0\n            \"bne     1b\\n\"                                // if (!flags.equal) goto retry\n            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%[tmp])\n            : [original] \"=&r\" (original),  // %0\n              [result] \"=&r\" (result),      // %1\n              [tmp] \"=&l\" (tmp),            // %2\n              [storage] \"+Q\" (storage)      // %3\n            : [value] \"r\" (v)               // %4\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n};\n\ntemplate< >\nstruct operations< 2u, true > :\n    public operations< 4u, true >\n{\n    typedef operations< 4u, true > base_type;\n    typedef base_type::storage_type storage_type;\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        fence_before(order);\n        uint32_t tmp;\n        storage_type original, result;\n        __asm__ __volatile__\n        (\n            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%[tmp])\n            \"1:\\n\"\n            \"ldrex   %[original], %[storage]\\n\"           // original = *(&storage)\n            \"add     %[result], %[original], %[value]\\n\"  // result = original + value\n            \"sxth    %[result], %[result]\\n\"              // sign extend result from 16 to 32 bits\n            \"strex   %[tmp], %[result], %[storage]\\n\"     // *(&storage) = result, tmp = store failed\n            \"teq     %[tmp], #0\\n\"                        // flags = tmp==0\n            \"bne     1b\\n\"                                // if (!flags.equal) goto retry\n            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%[tmp])\n            : [original] \"=&r\" (original),  // %0\n              [result] \"=&r\" (result),      // %1\n              [tmp] \"=&l\" (tmp),            // %2\n              [storage] \"+Q\" (storage)      // %3\n            : [value] \"r\" (v)               // %4\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        fence_before(order);\n        uint32_t tmp;\n        storage_type original, result;\n        __asm__ __volatile__\n        (\n            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%[tmp])\n            \"1:\\n\"\n            \"ldrex   %[original], %[storage]\\n\"           // original = *(&storage)\n            \"sub     %[result], %[original], %[value]\\n\"  // result = original - value\n            \"sxth    %[result], %[result]\\n\"              // sign extend result from 16 to 32 bits\n            \"strex   %[tmp], %[result], %[storage]\\n\"     // *(&storage) = result, tmp = store failed\n            \"teq     %[tmp], #0\\n\"                        // flags = tmp==0\n            \"bne     1b\\n\"                                // if (!flags.equal) goto retry\n            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%[tmp])\n            : [original] \"=&r\" (original),  // %0\n              [result] \"=&r\" (result),      // %1\n              [tmp] \"=&l\" (tmp),            // %2\n              [storage] \"+Q\" (storage)      // %3\n            : [value] \"r\" (v)               // %4\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n};\n\n\n#if defined(BOOST_ATOMIC_DETAIL_ARM_HAS_LDREXD_STREXD)\n\n// Unlike 32-bit operations, for 64-bit loads and stores we must use ldrexd/strexd.\n// Any other instructions result in a non-atomic sequence of 32-bit accesses.\n// See \"ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition\",\n// Section A3.5.3 \"Atomicity in the ARM architecture\".\n\n// In the asm blocks below we have to use 32-bit register pairs to compose 64-bit values.\n// In order to pass the 64-bit operands to/from asm blocks, we use undocumented gcc feature:\n// the lower half (Rt) of the operand is accessible normally, via the numbered placeholder (e.g. %0),\n// and the upper half (Rt2) - via the same placeholder with an 'H' after the '%' sign (e.g. %H0).\n// See: http://hardwarebug.org/2010/07/06/arm-inline-asm-secrets/\n\ntemplate< bool Signed >\nstruct operations< 8u, Signed > :\n    public gcc_arm_operations_base\n{\n    typedef typename make_storage_type< 8u, Signed >::type storage_type;\n    typedef typename make_storage_type< 8u, Signed >::aligned aligned_storage_type;\n\n    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        exchange(storage, v, order);\n    }\n\n    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original;\n        uint32_t tmp;\n        __asm__ __volatile__\n        (\n            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%0)\n            \"ldrexd %1, %H1, [%2]\\n\"\n            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%0)\n            : BOOST_ATOMIC_DETAIL_ARM_ASM_TMPREG_CONSTRAINT(tmp), // %0\n              \"=&r\" (original)   // %1\n            : \"r\" (&storage)     // %2\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original;\n        fence_before(order);\n        uint32_t tmp;\n        __asm__ __volatile__\n        (\n            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%0)\n            \"1:\\n\"\n            \"ldrexd %1, %H1, [%3]\\n\"        // load the original value\n            \"strexd %0, %2, %H2, [%3]\\n\"    // store the replacement, tmp = store failed\n            \"teq    %0, #0\\n\"               // check if store succeeded\n            \"bne    1b\\n\"\n            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%0)\n            : BOOST_ATOMIC_DETAIL_ARM_ASM_TMPREG_CONSTRAINT(tmp), // %0\n              \"=&r\" (original)   // %1\n            : \"r\" (v),           // %2\n              \"r\" (&storage)     // %3\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"memory\"\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_weak(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        fence_before(success_order);\n        uint32_t tmp;\n        storage_type original, old_val = expected;\n        __asm__ __volatile__\n        (\n            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%0)\n            \"ldrexd   %1, %H1, [%3]\\n\"               // original = *(&storage)\n            \"cmp      %1, %2\\n\"                      // flags = original.lo==old_val.lo\n            \"ittt     eq\\n\"                          // [hint that the following 3 instructions are conditional on flags.equal]\n            \"cmpeq    %H1, %H2\\n\"                    // if (flags.equal) flags = original.hi==old_val.hi\n            \"strexdeq %0, %4, %H4, [%3]\\n\"           // if (flags.equal) *(&storage) = desired, tmp = store failed\n            \"teqeq    %0, #0\\n\"                      // if (flags.equal) flags = tmp==0\n            \"ite      eq\\n\"                          // [hint that the following 2 instructions are conditional on flags.equal]\n            \"moveq    %2, #1\\n\"                      // if (flags.equal) old_val.lo = 1\n            \"movne    %2, #0\\n\"                      // if (!flags.equal) old_val.lo = 0\n            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%0)\n            : BOOST_ATOMIC_DETAIL_ARM_ASM_TMPREG_CONSTRAINT(tmp), // %0\n              \"=&r\" (original),  // %1\n              \"+r\" (old_val)     // %2\n            : \"r\" (&storage),    // %3\n              \"r\" (desired)      // %4\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"memory\"\n        );\n        const uint32_t success = (uint32_t)old_val;\n        if (success)\n            fence_after(success_order);\n        else\n            fence_after(failure_order);\n        expected = original;\n        return !!success;\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_strong(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        fence_before(success_order);\n        uint32_t tmp;\n        storage_type original, old_val = expected;\n        __asm__ __volatile__\n        (\n            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%0)\n            \"1:\\n\"\n            \"ldrexd  %1, %H1, [%3]\\n\"               // original = *(&storage)\n            \"cmp     %1, %2\\n\"                      // flags = original.lo==old_val.lo\n            \"it      eq\\n\"                          // [hint that the following instruction is conditional on flags.equal]\n            \"cmpeq   %H1, %H2\\n\"                    // if (flags.equal) flags = original.hi==old_val.hi\n            \"bne     2f\\n\"                          // if (!flags.equal) goto end\n            \"strexd  %0, %4, %H4, [%3]\\n\"           // *(&storage) = desired, tmp = store failed\n            \"teq     %0, #0\\n\"                      // flags.equal = tmp == 0\n            \"bne     1b\\n\"                          // if (flags.equal) goto retry\n            \"2:\\n\"\n            \"ite      eq\\n\"                         // [hint that the following 2 instructions are conditional on flags.equal]\n            \"moveq    %2, #1\\n\"                     // if (flags.equal) old_val.lo = 1\n            \"movne    %2, #0\\n\"                     // if (!flags.equal) old_val.lo = 0\n            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%0)\n            : BOOST_ATOMIC_DETAIL_ARM_ASM_TMPREG_CONSTRAINT(tmp), // %0\n              \"=&r\" (original),  // %1\n              \"+r\" (old_val)     // %2\n            : \"r\" (&storage),    // %3\n              \"r\" (desired)      // %4\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"memory\"\n        );\n        const uint32_t success = (uint32_t)old_val;\n        if (success)\n            fence_after(success_order);\n        else\n            fence_after(failure_order);\n        expected = original;\n        return !!success;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        fence_before(order);\n        storage_type original, result;\n        uint32_t tmp;\n        __asm__ __volatile__\n        (\n            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%0)\n            \"1:\\n\"\n            \"ldrexd  %1, %H1, [%3]\\n\"               // original = *(&storage)\n            \"adds    %2, %1, %4\\n\"                  // result = original + value\n            \"adc     %H2, %H1, %H4\\n\"\n            \"strexd  %0, %2, %H2, [%3]\\n\"           // *(&storage) = result, tmp = store failed\n            \"teq     %0, #0\\n\"                      // flags = tmp==0\n            \"bne     1b\\n\"                          // if (!flags.equal) goto retry\n            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%0)\n            : BOOST_ATOMIC_DETAIL_ARM_ASM_TMPREG_CONSTRAINT(tmp), // %0\n              \"=&r\" (original),  // %1\n              \"=&r\" (result)     // %2\n            : \"r\" (&storage),    // %3\n              \"r\" (v)            // %4\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"memory\"\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        fence_before(order);\n        storage_type original, result;\n        uint32_t tmp;\n        __asm__ __volatile__\n        (\n            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%0)\n            \"1:\\n\"\n            \"ldrexd  %1, %H1, [%3]\\n\"               // original = *(&storage)\n            \"subs    %2, %1, %4\\n\"                  // result = original - value\n            \"sbc     %H2, %H1, %H4\\n\"\n            \"strexd  %0, %2, %H2, [%3]\\n\"           // *(&storage) = result, tmp = store failed\n            \"teq     %0, #0\\n\"                      // flags = tmp==0\n            \"bne     1b\\n\"                          // if (!flags.equal) goto retry\n            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%0)\n            : BOOST_ATOMIC_DETAIL_ARM_ASM_TMPREG_CONSTRAINT(tmp), // %0\n              \"=&r\" (original),  // %1\n              \"=&r\" (result)     // %2\n            : \"r\" (&storage),    // %3\n              \"r\" (v)            // %4\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"memory\"\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        fence_before(order);\n        storage_type original, result;\n        uint32_t tmp;\n        __asm__ __volatile__\n        (\n            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%0)\n            \"1:\\n\"\n            \"ldrexd  %1, %H1, [%3]\\n\"               // original = *(&storage)\n            \"and     %2, %1, %4\\n\"                  // result = original & value\n            \"and     %H2, %H1, %H4\\n\"\n            \"strexd  %0, %2, %H2, [%3]\\n\"           // *(&storage) = result, tmp = store failed\n            \"teq     %0, #0\\n\"                      // flags = tmp==0\n            \"bne     1b\\n\"                          // if (!flags.equal) goto retry\n            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%0)\n            : BOOST_ATOMIC_DETAIL_ARM_ASM_TMPREG_CONSTRAINT(tmp), // %0\n              \"=&r\" (original),  // %1\n              \"=&r\" (result)     // %2\n            : \"r\" (&storage),    // %3\n              \"r\" (v)            // %4\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"memory\"\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        fence_before(order);\n        storage_type original, result;\n        uint32_t tmp;\n        __asm__ __volatile__\n        (\n            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%0)\n            \"1:\\n\"\n            \"ldrexd  %1, %H1, [%3]\\n\"               // original = *(&storage)\n            \"orr     %2, %1, %4\\n\"                  // result = original | value\n            \"orr     %H2, %H1, %H4\\n\"\n            \"strexd  %0, %2, %H2, [%3]\\n\"           // *(&storage) = result, tmp = store failed\n            \"teq     %0, #0\\n\"                      // flags = tmp==0\n            \"bne     1b\\n\"                          // if (!flags.equal) goto retry\n            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%0)\n            : BOOST_ATOMIC_DETAIL_ARM_ASM_TMPREG_CONSTRAINT(tmp), // %0\n              \"=&r\" (original),  // %1\n              \"=&r\" (result)     // %2\n            : \"r\" (&storage),    // %3\n              \"r\" (v)            // %4\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"memory\"\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        fence_before(order);\n        storage_type original, result;\n        uint32_t tmp;\n        __asm__ __volatile__\n        (\n            BOOST_ATOMIC_DETAIL_ARM_ASM_START(%0)\n            \"1:\\n\"\n            \"ldrexd  %1, %H1, [%3]\\n\"               // original = *(&storage)\n            \"eor     %2, %1, %4\\n\"                  // result = original ^ value\n            \"eor     %H2, %H1, %H4\\n\"\n            \"strexd  %0, %2, %H2, [%3]\\n\"           // *(&storage) = result, tmp = store failed\n            \"teq     %0, #0\\n\"                      // flags = tmp==0\n            \"bne     1b\\n\"                          // if (!flags.equal) goto retry\n            BOOST_ATOMIC_DETAIL_ARM_ASM_END(%0)\n            : BOOST_ATOMIC_DETAIL_ARM_ASM_TMPREG_CONSTRAINT(tmp), // %0\n              \"=&r\" (original),  // %1\n              \"=&r\" (result)     // %2\n            : \"r\" (&storage),    // %3\n              \"r\" (v)            // %4\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"memory\"\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        return !!exchange(storage, (storage_type)1, order);\n    }\n\n    static BOOST_FORCEINLINE void clear(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        store(storage, 0, order);\n    }\n\n    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT\n    {\n        return true;\n    }\n};\n\n#endif // defined(BOOST_ATOMIC_DETAIL_ARM_HAS_LDREXD_STREXD)\n\n\nBOOST_FORCEINLINE void thread_fence(memory_order order) BOOST_NOEXCEPT\n{\n    if (order != memory_order_relaxed)\n        gcc_arm_operations_base::hardware_full_fence();\n}\n\nBOOST_FORCEINLINE void signal_fence(memory_order order) BOOST_NOEXCEPT\n{\n    if (order != memory_order_relaxed)\n        __asm__ __volatile__ (\"\" ::: \"memory\");\n}\n\n} // namespace detail\n} // namespace atomics\n} // namespace boost\n\n#endif // BOOST_ATOMIC_DETAIL_OPS_GCC_ARM_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/ops_gcc_atomic.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/ops_gcc_atomic.hpp\n *\n * This header contains implementation of the \\c operations template.\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_OPS_GCC_ATOMIC_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_OPS_GCC_ATOMIC_HPP_INCLUDED_\n\n#include <boost/memory_order.hpp>\n#include <boost/atomic/detail/config.hpp>\n#include <boost/atomic/detail/storage_type.hpp>\n#include <boost/atomic/detail/operations_fwd.hpp>\n#include <boost/atomic/capabilities.hpp>\n#if defined(__clang__) && (defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B) || defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B))\n#include <boost/atomic/detail/ops_gcc_x86_dcas.hpp>\n#include <boost/atomic/detail/ops_cas_based.hpp>\n#endif\n\n#if __GCC_ATOMIC_LLONG_LOCK_FREE != BOOST_ATOMIC_LLONG_LOCK_FREE || __GCC_ATOMIC_LONG_LOCK_FREE != BOOST_ATOMIC_LONG_LOCK_FREE ||\\\n    __GCC_ATOMIC_INT_LOCK_FREE != BOOST_ATOMIC_INT_LOCK_FREE || __GCC_ATOMIC_SHORT_LOCK_FREE != BOOST_ATOMIC_SHORT_LOCK_FREE ||\\\n    __GCC_ATOMIC_CHAR_LOCK_FREE != BOOST_ATOMIC_CHAR_LOCK_FREE || __GCC_ATOMIC_BOOL_LOCK_FREE != BOOST_ATOMIC_BOOL_LOCK_FREE ||\\\n    __GCC_ATOMIC_WCHAR_T_LOCK_FREE != BOOST_ATOMIC_WCHAR_T_LOCK_FREE\n// There are platforms where we need to use larger storage types\n#include <boost/atomic/detail/int_sizes.hpp>\n#include <boost/atomic/detail/ops_extending_cas_based.hpp>\n#endif\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\n#if defined(__INTEL_COMPILER)\n// This is used to suppress warning #32013 described below for Intel Compiler.\n// In debug builds the compiler does not inline any functions, so basically\n// every atomic function call results in this warning. I don't know any other\n// way to selectively disable just this one warning.\n#pragma system_header\n#endif\n\nnamespace boost {\nnamespace atomics {\nnamespace detail {\n\n/*!\n * The function converts \\c boost::memory_order values to the compiler-specific constants.\n *\n * NOTE: The intention is that the function is optimized away by the compiler, and the\n *       compiler-specific constants are passed to the intrinsics. I know constexpr doesn't\n *       work in this case because the standard atomics interface require memory ordering\n *       constants to be passed as function arguments, at which point they stop being constexpr.\n *       However it is crucial that the compiler sees constants and not runtime values,\n *       because otherwise it just ignores the ordering value and always uses seq_cst.\n *       This is the case with Intel C++ Compiler 14.0.3 (Composer XE 2013 SP1, update 3) and\n *       gcc 4.8.2. Intel Compiler issues a warning in this case:\n *\n *       warning #32013: Invalid memory order specified. Defaulting to seq_cst memory order.\n *\n *       while gcc acts silently.\n *\n *       To mitigate the problem ALL functions, including the atomic<> members must be\n *       declared with BOOST_FORCEINLINE. In this case the compilers are able to see that\n *       all functions are called with constant orderings and call intrinstcts properly.\n *\n *       Unfortunately, this still doesn't work in debug mode as the compiler doesn't\n *       inline functions even when marked with BOOST_FORCEINLINE. In this case all atomic\n *       operaions will be executed with seq_cst semantics.\n */\nBOOST_FORCEINLINE BOOST_CONSTEXPR int convert_memory_order_to_gcc(memory_order order) BOOST_NOEXCEPT\n{\n    return (order == memory_order_relaxed ? __ATOMIC_RELAXED : (order == memory_order_consume ? __ATOMIC_CONSUME :\n        (order == memory_order_acquire ? __ATOMIC_ACQUIRE : (order == memory_order_release ? __ATOMIC_RELEASE :\n        (order == memory_order_acq_rel ? __ATOMIC_ACQ_REL : __ATOMIC_SEQ_CST)))));\n}\n\ntemplate< typename T >\nstruct gcc_atomic_operations\n{\n    typedef T storage_type;\n\n    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        __atomic_store_n(&storage, v, atomics::detail::convert_memory_order_to_gcc(order));\n    }\n\n    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        return __atomic_load_n(&storage, atomics::detail::convert_memory_order_to_gcc(order));\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        return __atomic_fetch_add(&storage, v, atomics::detail::convert_memory_order_to_gcc(order));\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        return __atomic_fetch_sub(&storage, v, atomics::detail::convert_memory_order_to_gcc(order));\n    }\n\n    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        return __atomic_exchange_n(&storage, v, atomics::detail::convert_memory_order_to_gcc(order));\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_strong(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        return __atomic_compare_exchange_n\n        (\n            &storage, &expected, desired, false,\n            atomics::detail::convert_memory_order_to_gcc(success_order),\n            atomics::detail::convert_memory_order_to_gcc(failure_order)\n        );\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_weak(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        return __atomic_compare_exchange_n\n        (\n            &storage, &expected, desired, true,\n            atomics::detail::convert_memory_order_to_gcc(success_order),\n            atomics::detail::convert_memory_order_to_gcc(failure_order)\n        );\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        return __atomic_fetch_and(&storage, v, atomics::detail::convert_memory_order_to_gcc(order));\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        return __atomic_fetch_or(&storage, v, atomics::detail::convert_memory_order_to_gcc(order));\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        return __atomic_fetch_xor(&storage, v, atomics::detail::convert_memory_order_to_gcc(order));\n    }\n\n    static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        return __atomic_test_and_set(&storage, atomics::detail::convert_memory_order_to_gcc(order));\n    }\n\n    static BOOST_FORCEINLINE void clear(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        __atomic_clear(const_cast< storage_type* >(&storage), atomics::detail::convert_memory_order_to_gcc(order));\n    }\n\n    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile& storage) BOOST_NOEXCEPT\n    {\n        return __atomic_is_lock_free(sizeof(storage_type), &storage);\n    }\n};\n\n#if BOOST_ATOMIC_INT128_LOCK_FREE > 0\n#if defined(__clang__) && defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B)\n\n// Workaround for clang bug: http://llvm.org/bugs/show_bug.cgi?id=19149\n// Clang 3.4 does not implement 128-bit __atomic* intrinsics even though it defines __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16\ntemplate< bool Signed >\nstruct operations< 16u, Signed > :\n    public cas_based_operations< gcc_dcas_x86_64< Signed > >\n{\n};\n\n#else\n\ntemplate< bool Signed >\nstruct operations< 16u, Signed > :\n    public gcc_atomic_operations< typename make_storage_type< 16u, Signed >::type >\n{\n    typedef typename make_storage_type< 16u, Signed >::aligned aligned_storage_type;\n};\n\n#endif\n#endif\n\n\n#if BOOST_ATOMIC_INT64_LOCK_FREE > 0\n#if defined(__clang__) && defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B)\n\n// Workaround for clang bug http://llvm.org/bugs/show_bug.cgi?id=19355\ntemplate< bool Signed >\nstruct operations< 8u, Signed > :\n    public cas_based_operations< gcc_dcas_x86< Signed > >\n{\n};\n\n#elif (BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 8 && __GCC_ATOMIC_LLONG_LOCK_FREE != BOOST_ATOMIC_LLONG_LOCK_FREE) ||\\\n    (BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 8 && __GCC_ATOMIC_LONG_LOCK_FREE != BOOST_ATOMIC_LONG_LOCK_FREE) ||\\\n    (BOOST_ATOMIC_DETAIL_SIZEOF_INT == 8 && __GCC_ATOMIC_INT_LOCK_FREE != BOOST_ATOMIC_INT_LOCK_FREE) ||\\\n    (BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 8 && __GCC_ATOMIC_SHORT_LOCK_FREE != BOOST_ATOMIC_SHORT_LOCK_FREE) ||\\\n    (BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 8 && __GCC_ATOMIC_WCHAR_T_LOCK_FREE != BOOST_ATOMIC_WCHAR_T_LOCK_FREE)\n\n#define BOOST_ATOMIC_DETAIL_INT64_EXTENDED\n\ntemplate< bool Signed >\nstruct operations< 8u, Signed > :\n    public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 16u, Signed >::type >, 8u, Signed >\n{\n    typedef typename make_storage_type< 16u, Signed >::aligned aligned_storage_type;\n};\n\n#else\n\ntemplate< bool Signed >\nstruct operations< 8u, Signed > :\n    public gcc_atomic_operations< typename make_storage_type< 8u, Signed >::type >\n{\n    typedef typename make_storage_type< 8u, Signed >::aligned aligned_storage_type;\n};\n\n#endif\n#endif\n\n#if BOOST_ATOMIC_INT32_LOCK_FREE > 0\n#if (BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 4 && __GCC_ATOMIC_LLONG_LOCK_FREE != BOOST_ATOMIC_LLONG_LOCK_FREE) ||\\\n    (BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 4 && __GCC_ATOMIC_LONG_LOCK_FREE != BOOST_ATOMIC_LONG_LOCK_FREE) ||\\\n    (BOOST_ATOMIC_DETAIL_SIZEOF_INT == 4 && __GCC_ATOMIC_INT_LOCK_FREE != BOOST_ATOMIC_INT_LOCK_FREE) ||\\\n    (BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 4 && __GCC_ATOMIC_SHORT_LOCK_FREE != BOOST_ATOMIC_SHORT_LOCK_FREE) ||\\\n    (BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 4 && __GCC_ATOMIC_WCHAR_T_LOCK_FREE != BOOST_ATOMIC_WCHAR_T_LOCK_FREE)\n\n#define BOOST_ATOMIC_DETAIL_INT32_EXTENDED\n\n#if !defined(BOOST_ATOMIC_DETAIL_INT64_EXTENDED)\n\ntemplate< bool Signed >\nstruct operations< 4u, Signed > :\n    public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 8u, Signed >::type >, 4u, Signed >\n{\n    typedef typename make_storage_type< 8u, Signed >::aligned aligned_storage_type;\n};\n\n#else // !defined(BOOST_ATOMIC_DETAIL_INT64_EXTENDED)\n\ntemplate< bool Signed >\nstruct operations< 4u, Signed > :\n    public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 16u, Signed >::type >, 4u, Signed >\n{\n    typedef typename make_storage_type< 16u, Signed >::aligned aligned_storage_type;\n};\n\n#endif // !defined(BOOST_ATOMIC_DETAIL_INT64_EXTENDED)\n\n#else\n\ntemplate< bool Signed >\nstruct operations< 4u, Signed > :\n    public gcc_atomic_operations< typename make_storage_type< 4u, Signed >::type >\n{\n    typedef typename make_storage_type< 4u, Signed >::aligned aligned_storage_type;\n};\n\n#endif\n#endif\n\n#if BOOST_ATOMIC_INT16_LOCK_FREE > 0\n#if (BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 2 && __GCC_ATOMIC_LLONG_LOCK_FREE != BOOST_ATOMIC_LLONG_LOCK_FREE) ||\\\n    (BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 2 && __GCC_ATOMIC_LONG_LOCK_FREE != BOOST_ATOMIC_LONG_LOCK_FREE) ||\\\n    (BOOST_ATOMIC_DETAIL_SIZEOF_INT == 2 && __GCC_ATOMIC_INT_LOCK_FREE != BOOST_ATOMIC_INT_LOCK_FREE) ||\\\n    (BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 2 && __GCC_ATOMIC_SHORT_LOCK_FREE != BOOST_ATOMIC_SHORT_LOCK_FREE) ||\\\n    (BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 2 && __GCC_ATOMIC_WCHAR_T_LOCK_FREE != BOOST_ATOMIC_WCHAR_T_LOCK_FREE)\n\n#define BOOST_ATOMIC_DETAIL_INT16_EXTENDED\n\n#if !defined(BOOST_ATOMIC_DETAIL_INT32_EXTENDED)\n\ntemplate< bool Signed >\nstruct operations< 2u, Signed > :\n    public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 4u, Signed >::type >, 2u, Signed >\n{\n    typedef typename make_storage_type< 4u, Signed >::aligned aligned_storage_type;\n};\n\n#elif !defined(BOOST_ATOMIC_DETAIL_INT64_EXTENDED)\n\ntemplate< bool Signed >\nstruct operations< 2u, Signed > :\n    public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 8u, Signed >::type >, 2u, Signed >\n{\n    typedef typename make_storage_type< 8u, Signed >::aligned aligned_storage_type;\n};\n\n#else\n\ntemplate< bool Signed >\nstruct operations< 2u, Signed > :\n    public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 16u, Signed >::type >, 2u, Signed >\n{\n    typedef typename make_storage_type< 16u, Signed >::aligned aligned_storage_type;\n};\n\n#endif\n\n#else\n\ntemplate< bool Signed >\nstruct operations< 2u, Signed > :\n    public gcc_atomic_operations< typename make_storage_type< 2u, Signed >::type >\n{\n    typedef typename make_storage_type< 2u, Signed >::aligned aligned_storage_type;\n};\n\n#endif\n#endif\n\n#if BOOST_ATOMIC_INT8_LOCK_FREE > 0\n#if (BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 1 && __GCC_ATOMIC_LLONG_LOCK_FREE != BOOST_ATOMIC_LLONG_LOCK_FREE) ||\\\n    (BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 1 && __GCC_ATOMIC_LONG_LOCK_FREE != BOOST_ATOMIC_LONG_LOCK_FREE) ||\\\n    (BOOST_ATOMIC_DETAIL_SIZEOF_INT == 1 && __GCC_ATOMIC_INT_LOCK_FREE != BOOST_ATOMIC_INT_LOCK_FREE) ||\\\n    (BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 1 && __GCC_ATOMIC_SHORT_LOCK_FREE != BOOST_ATOMIC_SHORT_LOCK_FREE) ||\\\n    (BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 1 && __GCC_ATOMIC_WCHAR_T_LOCK_FREE != BOOST_ATOMIC_WCHAR_T_LOCK_FREE) ||\\\n    (__GCC_ATOMIC_CHAR_LOCK_FREE != BOOST_ATOMIC_CHAR_LOCK_FREE) ||\\\n    (__GCC_ATOMIC_BOOL_LOCK_FREE != BOOST_ATOMIC_BOOL_LOCK_FREE)\n\n#if !defined(BOOST_ATOMIC_DETAIL_INT16_EXTENDED)\n\ntemplate< bool Signed >\nstruct operations< 1u, Signed > :\n    public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 2u, Signed >::type >, 1u, Signed >\n{\n    typedef typename make_storage_type< 2u, Signed >::aligned aligned_storage_type;\n};\n\n#elif !defined(BOOST_ATOMIC_DETAIL_INT32_EXTENDED)\n\ntemplate< bool Signed >\nstruct operations< 1u, Signed > :\n    public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 4u, Signed >::type >, 1u, Signed >\n{\n    typedef typename make_storage_type< 4u, Signed >::aligned aligned_storage_type;\n};\n\n#elif !defined(BOOST_ATOMIC_DETAIL_INT64_EXTENDED)\n\ntemplate< bool Signed >\nstruct operations< 1u, Signed > :\n    public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 8u, Signed >::type >, 1u, Signed >\n{\n    typedef typename make_storage_type< 8u, Signed >::aligned aligned_storage_type;\n};\n\n#else\n\ntemplate< bool Signed >\nstruct operations< 1u, Signed > :\n    public extending_cas_based_operations< gcc_atomic_operations< typename make_storage_type< 16u, Signed >::type >, 1u, Signed >\n{\n    typedef typename make_storage_type< 16u, Signed >::aligned aligned_storage_type;\n};\n\n#endif\n\n#else\n\ntemplate< bool Signed >\nstruct operations< 1u, Signed > :\n    public gcc_atomic_operations< typename make_storage_type< 1u, Signed >::type >\n{\n    typedef typename make_storage_type< 1u, Signed >::aligned aligned_storage_type;\n};\n\n#endif\n#endif\n\n#undef BOOST_ATOMIC_DETAIL_INT16_EXTENDED\n#undef BOOST_ATOMIC_DETAIL_INT32_EXTENDED\n#undef BOOST_ATOMIC_DETAIL_INT64_EXTENDED\n\nBOOST_FORCEINLINE void thread_fence(memory_order order) BOOST_NOEXCEPT\n{\n    __atomic_thread_fence(atomics::detail::convert_memory_order_to_gcc(order));\n}\n\nBOOST_FORCEINLINE void signal_fence(memory_order order) BOOST_NOEXCEPT\n{\n    __atomic_signal_fence(atomics::detail::convert_memory_order_to_gcc(order));\n}\n\n} // namespace detail\n} // namespace atomics\n} // namespace boost\n\n#endif // BOOST_ATOMIC_DETAIL_OPS_GCC_ATOMIC_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/ops_gcc_ppc.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2009 Helge Bahmann\n * Copyright (c) 2013 Tim Blechmann\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/ops_gcc_ppc.hpp\n *\n * This header contains implementation of the \\c operations template.\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_OPS_GCC_PPC_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_OPS_GCC_PPC_HPP_INCLUDED_\n\n#include <boost/memory_order.hpp>\n#include <boost/atomic/detail/config.hpp>\n#include <boost/atomic/detail/storage_type.hpp>\n#include <boost/atomic/detail/operations_fwd.hpp>\n#include <boost/atomic/capabilities.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\nnamespace boost {\nnamespace atomics {\nnamespace detail {\n\n// The implementation below uses information from this document:\n// http://www.rdrop.com/users/paulmck/scalability/paper/N2745r.2010.02.19a.html\n\n/*\n    Refer to: Motorola: \"Programming Environments Manual for 32-Bit\n    Implementations of the PowerPC Architecture\", Appendix E:\n    \"Synchronization Programming Examples\" for an explanation of what is\n    going on here (can be found on the web at various places by the\n    name \"MPCFPE32B.pdf\", Google is your friend...)\n\n    Most of the atomic operations map to instructions in a relatively\n    straight-forward fashion, but \"load\"s may at first glance appear\n    a bit strange as they map to:\n\n            lwz %rX, addr\n            cmpw %rX, %rX\n            bne- 1f\n        1:\n\n    That is, the CPU is forced to perform a branch that \"formally\" depends\n    on the value retrieved from memory. This scheme has an overhead of\n    about 1-2 clock cycles per load, but it allows to map \"acquire\" to\n    the \"isync\" instruction instead of \"sync\" uniformly and for all type\n    of atomic operations. Since \"isync\" has a cost of about 15 clock\n    cycles, while \"sync\" hast a cost of about 50 clock cycles, the small\n    penalty to atomic loads more than compensates for this.\n\n    Byte- and halfword-sized atomic values are realized by encoding the\n    value to be represented into a word, performing sign/zero extension\n    as appropriate. This means that after add/sub operations the value\n    needs fixing up to accurately preserve the wrap-around semantic of\n    the smaller type. (Nothing special needs to be done for the bit-wise\n    and the \"exchange type\" operators as the compiler already sees to\n    it that values carried in registers are extended appropriately and\n    everything falls into place naturally).\n\n    The register constraint \"b\"  instructs gcc to use any register\n    except r0; this is sometimes required because the encoding for\n    r0 is used to signify \"constant zero\" in a number of instructions,\n    making r0 unusable in this place. For simplicity this constraint\n    is used everywhere since I am to lazy to look this up on a\n    per-instruction basis, and ppc has enough registers for this not\n    to pose a problem.\n*/\n\n// A note about memory_order_consume. Technically, this architecture allows to avoid\n// unnecessary memory barrier after consume load since it supports data dependency ordering.\n// However, some compiler optimizations may break a seemingly valid code relying on data\n// dependency tracking by injecting bogus branches to aid out of order execution.\n// This may happen not only in Boost.Atomic code but also in user's code, which we have no\n// control of. See this thread: http://lists.boost.org/Archives/boost/2014/06/213890.php.\n// For this reason we promote memory_order_consume to memory_order_acquire.\n\nstruct gcc_ppc_operations_base\n{\n    static BOOST_FORCEINLINE void fence_before(memory_order order) BOOST_NOEXCEPT\n    {\n#if defined(__powerpc64__) || defined(__PPC64__)\n        if (order == memory_order_seq_cst)\n            __asm__ __volatile__ (\"sync\" ::: \"memory\");\n        else if ((order & memory_order_release) != 0)\n            __asm__ __volatile__ (\"lwsync\" ::: \"memory\");\n#else\n        if ((order & memory_order_release) != 0)\n            __asm__ __volatile__ (\"sync\" ::: \"memory\");\n#endif\n    }\n\n    static BOOST_FORCEINLINE void fence_after(memory_order order) BOOST_NOEXCEPT\n    {\n        if ((order & (memory_order_consume | memory_order_acquire)) != 0)\n            __asm__ __volatile__ (\"isync\" ::: \"memory\");\n    }\n};\n\n\ntemplate< bool Signed >\nstruct operations< 4u, Signed > :\n    public gcc_ppc_operations_base\n{\n    typedef typename make_storage_type< 4u, Signed >::type storage_type;\n    typedef typename make_storage_type< 4u, Signed >::aligned aligned_storage_type;\n\n    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"stw %1, %0\\n\\t\"\n            : \"+m\" (storage)\n            : \"r\" (v)\n        );\n    }\n\n    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type v;\n        if (order == memory_order_seq_cst)\n            __asm__ __volatile__ (\"sync\" ::: \"memory\");\n        if ((order & (memory_order_consume | memory_order_acquire)) != 0)\n        {\n            __asm__ __volatile__\n            (\n                \"lwz %0, %1\\n\\t\"\n                \"cmpw %0, %0\\n\\t\"\n                \"bne- 1f\\n\\t\"\n                \"1:\\n\\t\"\n                \"isync\\n\\t\"\n                : \"=&r\" (v)\n                : \"m\" (storage)\n                : \"cr0\", \"memory\"\n            );\n        }\n        else\n        {\n            __asm__ __volatile__\n            (\n                \"lwz %0, %1\\n\\t\"\n                : \"=&r\" (v)\n                : \"m\" (storage)\n            );\n        }\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\\t\"\n            \"lwarx %0,%y1\\n\\t\"\n            \"stwcx. %2,%y1\\n\\t\"\n            \"bne- 1b\\n\\t\"\n            : \"=&b\" (original), \"+Z\" (storage)\n            : \"b\" (v)\n            : \"cr0\"\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_weak(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        int success;\n        fence_before(success_order);\n        __asm__ __volatile__\n        (\n            \"li %1, 0\\n\\t\"\n            \"lwarx %0,%y2\\n\\t\"\n            \"cmpw %0, %3\\n\\t\"\n            \"bne- 1f\\n\\t\"\n            \"stwcx. %4,%y2\\n\\t\"\n            \"bne- 1f\\n\\t\"\n            \"li %1, 1\\n\\t\"\n            \"1:\\n\\t\"\n            : \"=&b\" (expected), \"=&b\" (success), \"+Z\" (storage)\n            : \"b\" (expected), \"b\" (desired)\n            : \"cr0\"\n        );\n        if (success)\n            fence_after(success_order);\n        else\n            fence_after(failure_order);\n        return !!success;\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_strong(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        int success;\n        fence_before(success_order);\n        __asm__ __volatile__\n        (\n            \"li %1, 0\\n\\t\"\n            \"0: lwarx %0,%y2\\n\\t\"\n            \"cmpw %0, %3\\n\\t\"\n            \"bne- 1f\\n\\t\"\n            \"stwcx. %4,%y2\\n\\t\"\n            \"bne- 0b\\n\\t\"\n            \"li %1, 1\\n\\t\"\n            \"1:\\n\\t\"\n            : \"=&b\" (expected), \"=&b\" (success), \"+Z\" (storage)\n            : \"b\" (expected), \"b\" (desired)\n            : \"cr0\"\n        );\n        if (success)\n            fence_after(success_order);\n        else\n            fence_after(failure_order);\n        return !!success;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, tmp;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\\t\"\n            \"lwarx %0,%y2\\n\\t\"\n            \"add %1,%0,%3\\n\\t\"\n            \"stwcx. %1,%y2\\n\\t\"\n            \"bne- 1b\\n\\t\"\n            : \"=&b\" (original), \"=&b\" (tmp), \"+Z\" (storage)\n            : \"b\" (v)\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, tmp;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\\t\"\n            \"lwarx %0,%y2\\n\\t\"\n            \"sub %1,%0,%3\\n\\t\"\n            \"stwcx. %1,%y2\\n\\t\"\n            \"bne- 1b\\n\\t\"\n            : \"=&b\" (original), \"=&b\" (tmp), \"+Z\" (storage)\n            : \"b\" (v)\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, tmp;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\\t\"\n            \"lwarx %0,%y2\\n\\t\"\n            \"and %1,%0,%3\\n\\t\"\n            \"stwcx. %1,%y2\\n\\t\"\n            \"bne- 1b\\n\\t\"\n            : \"=&b\" (original), \"=&b\" (tmp), \"+Z\" (storage)\n            : \"b\" (v)\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, tmp;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\\t\"\n            \"lwarx %0,%y2\\n\\t\"\n            \"or %1,%0,%3\\n\\t\"\n            \"stwcx. %1,%y2\\n\\t\"\n            \"bne- 1b\\n\\t\"\n            : \"=&b\" (original), \"=&b\" (tmp), \"+Z\" (storage)\n            : \"b\" (v)\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, tmp;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\\t\"\n            \"lwarx %0,%y2\\n\\t\"\n            \"xor %1,%0,%3\\n\\t\"\n            \"stwcx. %1,%y2\\n\\t\"\n            \"bne- 1b\\n\\t\"\n            : \"=&b\" (original), \"=&b\" (tmp), \"+Z\" (storage)\n            : \"b\" (v)\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        return !!exchange(storage, (storage_type)1, order);\n    }\n\n    static BOOST_FORCEINLINE void clear(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        store(storage, 0, order);\n    }\n\n    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT\n    {\n        return true;\n    }\n};\n\n\ntemplate< >\nstruct operations< 1u, false > :\n    public operations< 4u, false >\n{\n    typedef operations< 4u, false > base_type;\n    typedef base_type::storage_type storage_type;\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, tmp;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\\t\"\n            \"lwarx %0,%y2\\n\\t\"\n            \"add %1,%0,%3\\n\\t\"\n            \"rlwinm %1, %1, 0, 0xff\\n\\t\"\n            \"stwcx. %1,%y2\\n\\t\"\n            \"bne- 1b\\n\\t\"\n            : \"=&b\" (original), \"=&b\" (tmp), \"+Z\" (storage)\n            : \"b\" (v)\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, tmp;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\\t\"\n            \"lwarx %0,%y2\\n\\t\"\n            \"sub %1,%0,%3\\n\\t\"\n            \"rlwinm %1, %1, 0, 0xff\\n\\t\"\n            \"stwcx. %1,%y2\\n\\t\"\n            \"bne- 1b\\n\\t\"\n            : \"=&b\" (original), \"=&b\" (tmp), \"+Z\" (storage)\n            : \"b\" (v)\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n};\n\ntemplate< >\nstruct operations< 1u, true > :\n    public operations< 4u, true >\n{\n    typedef operations< 4u, true > base_type;\n    typedef base_type::storage_type storage_type;\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, tmp;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\\t\"\n            \"lwarx %0,%y2\\n\\t\"\n            \"add %1,%0,%3\\n\\t\"\n            \"extsb %1, %1\\n\\t\"\n            \"stwcx. %1,%y2\\n\\t\"\n            \"bne- 1b\\n\\t\"\n            : \"=&b\" (original), \"=&b\" (tmp), \"+Z\" (storage)\n            : \"b\" (v)\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, tmp;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\\t\"\n            \"lwarx %0,%y2\\n\\t\"\n            \"sub %1,%0,%3\\n\\t\"\n            \"extsb %1, %1\\n\\t\"\n            \"stwcx. %1,%y2\\n\\t\"\n            \"bne- 1b\\n\\t\"\n            : \"=&b\" (original), \"=&b\" (tmp), \"+Z\" (storage)\n            : \"b\" (v)\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n};\n\n\ntemplate< >\nstruct operations< 2u, false > :\n    public operations< 4u, false >\n{\n    typedef operations< 4u, false > base_type;\n    typedef base_type::storage_type storage_type;\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, tmp;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\\t\"\n            \"lwarx %0,%y2\\n\\t\"\n            \"add %1,%0,%3\\n\\t\"\n            \"rlwinm %1, %1, 0, 0xffff\\n\\t\"\n            \"stwcx. %1,%y2\\n\\t\"\n            \"bne- 1b\\n\\t\"\n            : \"=&b\" (original), \"=&b\" (tmp), \"+Z\" (storage)\n            : \"b\" (v)\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, tmp;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\\t\"\n            \"lwarx %0,%y2\\n\\t\"\n            \"sub %1,%0,%3\\n\\t\"\n            \"rlwinm %1, %1, 0, 0xffff\\n\\t\"\n            \"stwcx. %1,%y2\\n\\t\"\n            \"bne- 1b\\n\\t\"\n            : \"=&b\" (original), \"=&b\" (tmp), \"+Z\" (storage)\n            : \"b\" (v)\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n};\n\ntemplate< >\nstruct operations< 2u, true > :\n    public operations< 4u, true >\n{\n    typedef operations< 4u, true > base_type;\n    typedef base_type::storage_type storage_type;\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, tmp;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\\t\"\n            \"lwarx %0,%y2\\n\\t\"\n            \"add %1,%0,%3\\n\\t\"\n            \"extsh %1, %1\\n\\t\"\n            \"stwcx. %1,%y2\\n\\t\"\n            \"bne- 1b\\n\\t\"\n            : \"=&b\" (original), \"=&b\" (tmp), \"+Z\" (storage)\n            : \"b\" (v)\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, tmp;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\\t\"\n            \"lwarx %0,%y2\\n\\t\"\n            \"sub %1,%0,%3\\n\\t\"\n            \"extsh %1, %1\\n\\t\"\n            \"stwcx. %1,%y2\\n\\t\"\n            \"bne- 1b\\n\\t\"\n            : \"=&b\" (original), \"=&b\" (tmp), \"+Z\" (storage)\n            : \"b\" (v)\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n};\n\n\n#if defined(__powerpc64__) || defined(__PPC64__)\n\ntemplate< bool Signed >\nstruct operations< 8u, Signed > :\n    public gcc_ppc_operations_base\n{\n    typedef typename make_storage_type< 8u, Signed >::type storage_type;\n    typedef typename make_storage_type< 8u, Signed >::aligned aligned_storage_type;\n\n    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"std %1, %0\\n\\t\"\n            : \"+m\" (storage)\n            : \"r\" (v)\n        );\n    }\n\n    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type v;\n        if (order == memory_order_seq_cst)\n            __asm__ __volatile__ (\"sync\" ::: \"memory\");\n        if ((order & (memory_order_consume | memory_order_acquire)) != 0)\n        {\n            __asm__ __volatile__\n            (\n                \"ld %0, %1\\n\\t\"\n                \"cmpd %0, %0\\n\\t\"\n                \"bne- 1f\\n\\t\"\n                \"1:\\n\\t\"\n                \"isync\\n\\t\"\n                : \"=&b\" (v)\n                : \"m\" (storage)\n                : \"cr0\", \"memory\"\n            );\n        }\n        else\n        {\n            __asm__ __volatile__\n            (\n                \"ld %0, %1\\n\\t\"\n                : \"=&b\" (v)\n                : \"m\" (storage)\n            );\n        }\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\\t\"\n            \"ldarx %0,%y1\\n\\t\"\n            \"stdcx. %2,%y1\\n\\t\"\n            \"bne- 1b\\n\\t\"\n            : \"=&b\" (original), \"+Z\" (storage)\n            : \"b\" (v)\n            : \"cr0\"\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_weak(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        int success;\n        fence_before(success_order);\n        __asm__ __volatile__\n        (\n            \"li %1, 0\\n\\t\"\n            \"ldarx %0,%y2\\n\\t\"\n            \"cmpd %0, %3\\n\\t\"\n            \"bne- 1f\\n\\t\"\n            \"stdcx. %4,%y2\\n\\t\"\n            \"bne- 1f\\n\\t\"\n            \"li %1, 1\\n\\t\"\n            \"1:\"\n            : \"=&b\" (expected), \"=&b\" (success), \"+Z\" (storage)\n            : \"b\" (expected), \"b\" (desired)\n            : \"cr0\"\n        );\n        if (success)\n            fence_after(success_order);\n        else\n            fence_after(failure_order);\n        return !!success;\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_strong(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        int success;\n        fence_before(success_order);\n        __asm__ __volatile__\n        (\n            \"li %1, 0\\n\\t\"\n            \"0: ldarx %0,%y2\\n\\t\"\n            \"cmpd %0, %3\\n\\t\"\n            \"bne- 1f\\n\\t\"\n            \"stdcx. %4,%y2\\n\\t\"\n            \"bne- 0b\\n\\t\"\n            \"li %1, 1\\n\\t\"\n            \"1:\\n\\t\"\n            : \"=&b\" (expected), \"=&b\" (success), \"+Z\" (storage)\n            : \"b\" (expected), \"b\" (desired)\n            : \"cr0\"\n        );\n        if (success)\n            fence_after(success_order);\n        else\n            fence_after(failure_order);\n        return !!success;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, tmp;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\\t\"\n            \"ldarx %0,%y2\\n\\t\"\n            \"add %1,%0,%3\\n\\t\"\n            \"stdcx. %1,%y2\\n\\t\"\n            \"bne- 1b\\n\\t\"\n            : \"=&b\" (original), \"=&b\" (tmp), \"+Z\" (storage)\n            : \"b\" (v)\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, tmp;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\\t\"\n            \"ldarx %0,%y2\\n\\t\"\n            \"sub %1,%0,%3\\n\\t\"\n            \"stdcx. %1,%y2\\n\\t\"\n            \"bne- 1b\\n\\t\"\n            : \"=&b\" (original), \"=&b\" (tmp), \"+Z\" (storage)\n            : \"b\" (v)\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, tmp;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\\t\"\n            \"ldarx %0,%y2\\n\\t\"\n            \"and %1,%0,%3\\n\\t\"\n            \"stdcx. %1,%y2\\n\\t\"\n            \"bne- 1b\\n\\t\"\n            : \"=&b\" (original), \"=&b\" (tmp), \"+Z\" (storage)\n            : \"b\" (v)\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, tmp;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\\t\"\n            \"ldarx %0,%y2\\n\\t\"\n            \"or %1,%0,%3\\n\\t\"\n            \"stdcx. %1,%y2\\n\\t\"\n            \"bne- 1b\\n\\t\"\n            : \"=&b\" (original), \"=&b\" (tmp), \"+Z\" (storage)\n            : \"b\" (v)\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type original, tmp;\n        fence_before(order);\n        __asm__ __volatile__\n        (\n            \"1:\\n\\t\"\n            \"ldarx %0,%y2\\n\\t\"\n            \"xor %1,%0,%3\\n\\t\"\n            \"stdcx. %1,%y2\\n\\t\"\n            \"bne- 1b\\n\\t\"\n            : \"=&b\" (original), \"=&b\" (tmp), \"+Z\" (storage)\n            : \"b\" (v)\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC\n        );\n        fence_after(order);\n        return original;\n    }\n\n    static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        return !!exchange(storage, (storage_type)1, order);\n    }\n\n    static BOOST_FORCEINLINE void clear(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        store(storage, 0, order);\n    }\n\n    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT\n    {\n        return true;\n    }\n};\n\n#endif // defined(__powerpc64__) || defined(__PPC64__)\n\n\nBOOST_FORCEINLINE void thread_fence(memory_order order) BOOST_NOEXCEPT\n{\n    switch (order)\n    {\n    case memory_order_consume:\n    case memory_order_acquire:\n    case memory_order_release:\n    case memory_order_acq_rel:\n#if defined(__powerpc64__) || defined(__PPC64__)\n        __asm__ __volatile__ (\"lwsync\" ::: \"memory\");\n        break;\n#endif\n    case memory_order_seq_cst:\n        __asm__ __volatile__ (\"sync\" ::: \"memory\");\n        break;\n    default:;\n    }\n}\n\nBOOST_FORCEINLINE void signal_fence(memory_order order) BOOST_NOEXCEPT\n{\n    if (order != memory_order_relaxed)\n#if defined(__ibmxl__) || defined(__IBMCPP__)\n        __fence();\n#else\n        __asm__ __volatile__ (\"\" ::: \"memory\");\n#endif\n}\n\n} // namespace detail\n} // namespace atomics\n} // namespace boost\n\n#endif // BOOST_ATOMIC_DETAIL_OPS_GCC_PPC_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/ops_gcc_sparc.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2010 Helge Bahmann\n * Copyright (c) 2013 Tim Blechmann\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/ops_gcc_sparc.hpp\n *\n * This header contains implementation of the \\c operations template.\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_OPS_GCC_SPARC_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_OPS_GCC_SPARC_HPP_INCLUDED_\n\n#include <boost/memory_order.hpp>\n#include <boost/atomic/detail/config.hpp>\n#include <boost/atomic/detail/storage_type.hpp>\n#include <boost/atomic/detail/operations_fwd.hpp>\n#include <boost/atomic/capabilities.hpp>\n#include <boost/atomic/detail/ops_cas_based.hpp>\n#include <boost/atomic/detail/ops_extending_cas_based.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\nnamespace boost {\nnamespace atomics {\nnamespace detail {\n\nstruct gcc_sparc_cas_base\n{\n    static BOOST_FORCEINLINE void fence_before(memory_order order) BOOST_NOEXCEPT\n    {\n        if (order == memory_order_seq_cst)\n            __asm__ __volatile__ (\"membar #Sync\" ::: \"memory\");\n        else if ((order & memory_order_release) != 0)\n            __asm__ __volatile__ (\"membar #StoreStore | #LoadStore\" ::: \"memory\");\n    }\n\n    static BOOST_FORCEINLINE void fence_after(memory_order order) BOOST_NOEXCEPT\n    {\n        if (order == memory_order_seq_cst)\n            __asm__ __volatile__ (\"membar #Sync\" ::: \"memory\");\n        else if ((order & (memory_order_consume | memory_order_acquire)) != 0)\n            __asm__ __volatile__ (\"membar #StoreStore | #LoadStore\" ::: \"memory\");\n    }\n\n    static BOOST_FORCEINLINE void fence_after_store(memory_order order) BOOST_NOEXCEPT\n    {\n        if (order == memory_order_seq_cst)\n            __asm__ __volatile__ (\"membar #Sync\" ::: \"memory\");\n    }\n};\n\ntemplate< bool Signed >\nstruct gcc_sparc_cas32 :\n    public gcc_sparc_cas_base\n{\n    typedef typename make_storage_type< 4u, Signed >::type storage_type;\n    typedef typename make_storage_type< 4u, Signed >::aligned aligned_storage_type;\n\n    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        fence_before_store(order);\n        storage = v;\n        fence_after_store(order);\n    }\n\n    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type v = storage;\n        fence_after(order);\n        return v;\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_strong(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        fence_before(success_order);\n        storage_type previous = expected;\n        __asm__ __volatile__\n        (\n            \"cas [%1], %2, %0\"\n            : \"+r\" (desired)\n            : \"r\" (&storage), \"r\" (previous)\n            : \"memory\"\n        );\n        const bool success = (desired == previous);\n        if (success)\n            fence_after(success_order);\n        else\n            fence_after(failure_order);\n        expected = desired;\n        return success;\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_weak(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        return compare_exchange_strong(storage, expected, desired, success_order, failure_order);\n    }\n\n    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        base_type::fence_before(order);\n        __asm__ __volatile__\n        (\n            \"swap [%1], %0\"\n            : \"+r\" (v)\n            : \"r\" (&storage)\n            : \"memory\"\n        );\n        base_type::fence_after(order);\n        return v;\n    }\n\n    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT\n    {\n        return true;\n    }\n};\n\ntemplate< bool Signed >\nstruct operations< 4u, Signed > :\n    public cas_based_operations< gcc_sparc_cas32< Signed > >\n{\n};\n\ntemplate< bool Signed >\nstruct operations< 1u, Signed > :\n    public extending_cas_based_operations< operations< 4u, Signed >, 1u, Signed >\n{\n};\n\ntemplate< bool Signed >\nstruct operations< 2u, Signed > :\n    public extending_cas_based_operations< operations< 4u, Signed >, 2u, Signed >\n{\n};\n\ntemplate< bool Signed >\nstruct gcc_sparc_cas64 :\n    public gcc_sparc_cas_base\n{\n    typedef typename make_storage_type< 8u, Signed >::type storage_type;\n    typedef typename make_storage_type< 8u, Signed >::aligned aligned_storage_type;\n\n    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        fence_before_store(order);\n        storage = v;\n        fence_after_store(order);\n    }\n\n    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type v = storage;\n        fence_after(order);\n        return v;\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_strong(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        fence_before(success_order);\n        storage_type previous = expected;\n        __asm__ __volatile__\n        (\n            \"casx [%1], %2, %0\"\n            : \"+r\" (desired)\n            : \"r\" (&storage), \"r\" (previous)\n            : \"memory\"\n        );\n        const bool success = (desired == previous);\n        if (success)\n            fence_after(success_order);\n        else\n            fence_after(failure_order);\n        expected = desired;\n        return success;\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_weak(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        return compare_exchange_strong(storage, expected, desired, success_order, failure_order);\n    }\n\n    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT\n    {\n        return true;\n    }\n};\n\ntemplate< bool Signed >\nstruct operations< 8u, Signed > :\n    public cas_based_operations< cas_based_exchange< gcc_sparc_cas64< Signed > > >\n{\n};\n\n\nBOOST_FORCEINLINE void thread_fence(memory_order order) BOOST_NOEXCEPT\n{\n    switch (order)\n    {\n    case memory_order_release:\n        __asm__ __volatile__ (\"membar #StoreStore | #LoadStore\" ::: \"memory\");\n        break;\n    case memory_order_consume:\n    case memory_order_acquire:\n        __asm__ __volatile__ (\"membar #LoadLoad | #LoadStore\" ::: \"memory\");\n        break;\n    case memory_order_acq_rel:\n        __asm__ __volatile__ (\"membar #LoadLoad | #LoadStore | #StoreStore\" ::: \"memory\");\n        break;\n    case memory_order_seq_cst:\n        __asm__ __volatile__ (\"membar #Sync\" ::: \"memory\");\n        break;\n    case memory_order_relaxed:\n    default:\n        break;\n    }\n}\n\nBOOST_FORCEINLINE void signal_fence(memory_order order) BOOST_NOEXCEPT\n{\n    if (order != memory_order_relaxed)\n        __asm__ __volatile__ (\"\" ::: \"memory\");\n}\n\n} // namespace detail\n} // namespace atomics\n} // namespace boost\n\n#endif // BOOST_ATOMIC_DETAIL_OPS_GCC_SPARC_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/ops_gcc_sync.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2011 Helge Bahmann\n * Copyright (c) 2013 Tim Blechmann\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/ops_gcc_sync.hpp\n *\n * This header contains implementation of the \\c operations template.\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_OPS_GCC_SYNC_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_OPS_GCC_SYNC_HPP_INCLUDED_\n\n#include <boost/memory_order.hpp>\n#include <boost/atomic/detail/config.hpp>\n#include <boost/atomic/detail/storage_type.hpp>\n#include <boost/atomic/detail/operations_fwd.hpp>\n#include <boost/atomic/detail/ops_extending_cas_based.hpp>\n#include <boost/atomic/capabilities.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\nnamespace boost {\nnamespace atomics {\nnamespace detail {\n\nstruct gcc_sync_operations_base\n{\n    static BOOST_FORCEINLINE void fence_before_store(memory_order order) BOOST_NOEXCEPT\n    {\n        if ((order & memory_order_release) != 0)\n            __sync_synchronize();\n    }\n\n    static BOOST_FORCEINLINE void fence_after_store(memory_order order) BOOST_NOEXCEPT\n    {\n        if (order == memory_order_seq_cst)\n            __sync_synchronize();\n    }\n\n    static BOOST_FORCEINLINE void fence_after_load(memory_order order) BOOST_NOEXCEPT\n    {\n        if ((order & (memory_order_acquire | memory_order_consume)) != 0)\n            __sync_synchronize();\n    }\n};\n\ntemplate< typename T >\nstruct gcc_sync_operations :\n    public gcc_sync_operations_base\n{\n    typedef T storage_type;\n\n    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        fence_before_store(order);\n        storage = v;\n        fence_after_store(order);\n    }\n\n    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type v = storage;\n        fence_after_load(order);\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        return __sync_fetch_and_add(&storage, v);\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        return __sync_fetch_and_sub(&storage, v);\n    }\n\n    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        // GCC docs mention that not all architectures may support full exchange semantics for this intrinsic. However, GCC's implementation of\n        // std::atomic<> uses this intrinsic unconditionally. We do so as well. In case if some architectures actually don't support this, we can always\n        // add a check here and fall back to a CAS loop.\n        if ((order & memory_order_release) != 0)\n            __sync_synchronize();\n        return __sync_lock_test_and_set(&storage, v);\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_strong(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order) BOOST_NOEXCEPT\n    {\n        storage_type expected2 = expected;\n        storage_type old_val = __sync_val_compare_and_swap(&storage, expected2, desired);\n\n        if (old_val == expected2)\n        {\n            return true;\n        }\n        else\n        {\n            expected = old_val;\n            return false;\n        }\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_weak(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        return compare_exchange_strong(storage, expected, desired, success_order, failure_order);\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        return __sync_fetch_and_and(&storage, v);\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        return __sync_fetch_and_or(&storage, v);\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        return __sync_fetch_and_xor(&storage, v);\n    }\n\n    static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        if ((order & memory_order_release) != 0)\n            __sync_synchronize();\n        return !!__sync_lock_test_and_set(&storage, 1);\n    }\n\n    static BOOST_FORCEINLINE void clear(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        __sync_lock_release(&storage);\n        if (order == memory_order_seq_cst)\n            __sync_synchronize();\n    }\n\n    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT\n    {\n        return true;\n    }\n};\n\n#if BOOST_ATOMIC_INT8_LOCK_FREE > 0\ntemplate< bool Signed >\nstruct operations< 1u, Signed > :\n#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1)\n    public gcc_sync_operations< typename make_storage_type< 1u, Signed >::type >\n#elif defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2)\n    public extending_cas_based_operations< gcc_sync_operations< typename make_storage_type< 2u, Signed >::type >, 1u, Signed >\n#elif defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)\n    public extending_cas_based_operations< gcc_sync_operations< typename make_storage_type< 4u, Signed >::type >, 1u, Signed >\n#elif defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)\n    public extending_cas_based_operations< gcc_sync_operations< typename make_storage_type< 8u, Signed >::type >, 1u, Signed >\n#else\n    public extending_cas_based_operations< gcc_sync_operations< typename make_storage_type< 16u, Signed >::type >, 1u, Signed >\n#endif\n{\n#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1)\n    typedef typename make_storage_type< 1u, Signed >::aligned aligned_storage_type;\n#elif defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2)\n    typedef typename make_storage_type< 2u, Signed >::aligned aligned_storage_type;\n#elif defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)\n    typedef typename make_storage_type< 4u, Signed >::aligned aligned_storage_type;\n#elif defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)\n    typedef typename make_storage_type< 8u, Signed >::aligned aligned_storage_type;\n#else\n    typedef typename make_storage_type< 16u, Signed >::aligned aligned_storage_type;\n#endif\n};\n#endif\n\n#if BOOST_ATOMIC_INT16_LOCK_FREE > 0\ntemplate< bool Signed >\nstruct operations< 2u, Signed > :\n#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2)\n    public gcc_sync_operations< typename make_storage_type< 2u, Signed >::type >\n#elif defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)\n    public extending_cas_based_operations< gcc_sync_operations< typename make_storage_type< 4u, Signed >::type >, 2u, Signed >\n#elif defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)\n    public extending_cas_based_operations< gcc_sync_operations< typename make_storage_type< 8u, Signed >::type >, 2u, Signed >\n#else\n    public extending_cas_based_operations< gcc_sync_operations< typename make_storage_type< 16u, Signed >::type >, 2u, Signed >\n#endif\n{\n#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2)\n    typedef typename make_storage_type< 2u, Signed >::aligned aligned_storage_type;\n#elif defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)\n    typedef typename make_storage_type< 4u, Signed >::aligned aligned_storage_type;\n#elif defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)\n    typedef typename make_storage_type< 8u, Signed >::aligned aligned_storage_type;\n#else\n    typedef typename make_storage_type< 16u, Signed >::aligned aligned_storage_type;\n#endif\n};\n#endif\n\n#if BOOST_ATOMIC_INT32_LOCK_FREE > 0\ntemplate< bool Signed >\nstruct operations< 4u, Signed > :\n#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)\n    public gcc_sync_operations< typename make_storage_type< 4u, Signed >::type >\n#elif defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)\n    public extending_cas_based_operations< gcc_sync_operations< typename make_storage_type< 8u, Signed >::type >, 4u, Signed >\n#else\n    public extending_cas_based_operations< gcc_sync_operations< typename make_storage_type< 16u, Signed >::type >, 4u, Signed >\n#endif\n{\n#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)\n    typedef typename make_storage_type< 4u, Signed >::aligned aligned_storage_type;\n#elif defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)\n    typedef typename make_storage_type< 8u, Signed >::aligned aligned_storage_type;\n#else\n    typedef typename make_storage_type< 16u, Signed >::aligned aligned_storage_type;\n#endif\n};\n#endif\n\n#if BOOST_ATOMIC_INT64_LOCK_FREE > 0\ntemplate< bool Signed >\nstruct operations< 8u, Signed > :\n#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)\n    public gcc_sync_operations< typename make_storage_type< 8u, Signed >::type >\n#else\n    public extending_cas_based_operations< gcc_sync_operations< typename make_storage_type< 16u, Signed >::type >, 8u, Signed >\n#endif\n{\n#if defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8)\n    typedef typename make_storage_type< 8u, Signed >::aligned aligned_storage_type;\n#else\n    typedef typename make_storage_type< 16u, Signed >::aligned aligned_storage_type;\n#endif\n};\n#endif\n\n#if BOOST_ATOMIC_INT128_LOCK_FREE > 0\ntemplate< bool Signed >\nstruct operations< 16u, Signed > :\n    public gcc_sync_operations< typename make_storage_type< 16u, Signed >::type >\n{\n    typedef typename make_storage_type< 16u, Signed >::aligned aligned_storage_type;\n};\n#endif\n\nBOOST_FORCEINLINE void thread_fence(memory_order order) BOOST_NOEXCEPT\n{\n    if (order != memory_order_relaxed)\n        __sync_synchronize();\n}\n\nBOOST_FORCEINLINE void signal_fence(memory_order order) BOOST_NOEXCEPT\n{\n    if (order != memory_order_relaxed)\n        __asm__ __volatile__ (\"\" ::: \"memory\");\n}\n\n} // namespace detail\n} // namespace atomics\n} // namespace boost\n\n#endif // BOOST_ATOMIC_DETAIL_OPS_GCC_SYNC_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/ops_gcc_x86.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2009 Helge Bahmann\n * Copyright (c) 2012 Tim Blechmann\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/ops_gcc_x86.hpp\n *\n * This header contains implementation of the \\c operations template.\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_OPS_GCC_X86_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_OPS_GCC_X86_HPP_INCLUDED_\n\n#include <boost/memory_order.hpp>\n#include <boost/atomic/detail/config.hpp>\n#include <boost/atomic/detail/storage_type.hpp>\n#include <boost/atomic/detail/operations_fwd.hpp>\n#include <boost/atomic/capabilities.hpp>\n#if defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B) || defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B)\n#include <boost/atomic/detail/ops_gcc_x86_dcas.hpp>\n#include <boost/atomic/detail/ops_cas_based.hpp>\n#endif\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\n#if defined(__x86_64__)\n#define BOOST_ATOMIC_DETAIL_TEMP_CAS_REGISTER \"rdx\"\n#else\n#define BOOST_ATOMIC_DETAIL_TEMP_CAS_REGISTER \"edx\"\n#endif\n\nnamespace boost {\nnamespace atomics {\nnamespace detail {\n\nstruct gcc_x86_operations_base\n{\n    static BOOST_FORCEINLINE void fence_before(memory_order order) BOOST_NOEXCEPT\n    {\n        if ((order & memory_order_release) != 0)\n            __asm__ __volatile__ (\"\" ::: \"memory\");\n    }\n\n    static BOOST_FORCEINLINE void fence_after(memory_order order) BOOST_NOEXCEPT\n    {\n        if ((order & memory_order_acquire) != 0)\n            __asm__ __volatile__ (\"\" ::: \"memory\");\n    }\n};\n\ntemplate< typename T, typename Derived >\nstruct gcc_x86_operations :\n    public gcc_x86_operations_base\n{\n    typedef T storage_type;\n\n    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        if (order != memory_order_seq_cst)\n        {\n            fence_before(order);\n            storage = v;\n            fence_after(order);\n        }\n        else\n        {\n            Derived::exchange(storage, v, order);\n        }\n    }\n\n    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type v = storage;\n        fence_after(order);\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        return Derived::fetch_add(storage, -v, order);\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_weak(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        return Derived::compare_exchange_strong(storage, expected, desired, success_order, failure_order);\n    }\n\n    static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        return !!Derived::exchange(storage, (storage_type)1, order);\n    }\n\n    static BOOST_FORCEINLINE void clear(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        store(storage, (storage_type)0, order);\n    }\n\n    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT\n    {\n        return true;\n    }\n};\n\ntemplate< bool Signed >\nstruct operations< 1u, Signed > :\n    public gcc_x86_operations< typename make_storage_type< 1u, Signed >::type, operations< 1u, Signed > >\n{\n    typedef gcc_x86_operations< typename make_storage_type< 1u, Signed >::type, operations< 1u, Signed > > base_type;\n    typedef typename base_type::storage_type storage_type;\n    typedef typename make_storage_type< 1u, Signed >::aligned aligned_storage_type;\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        __asm__ __volatile__\n        (\n            \"lock; xaddb %0, %1\"\n            : \"+q\" (v), \"+m\" (storage)\n            :\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"memory\"\n        );\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        __asm__ __volatile__\n        (\n            \"xchgb %0, %1\"\n            : \"+q\" (v), \"+m\" (storage)\n            :\n            : \"memory\"\n        );\n        return v;\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_strong(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order) BOOST_NOEXCEPT\n    {\n        storage_type previous = expected;\n        bool success;\n        __asm__ __volatile__\n        (\n            \"lock; cmpxchgb %3, %1\\n\\t\"\n            \"sete %2\"\n            : \"+a\" (previous), \"+m\" (storage), \"=q\" (success)\n            : \"q\" (desired)\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"memory\"\n        );\n        expected = previous;\n        return success;\n    }\n\n#define BOOST_ATOMIC_DETAIL_CAS_LOOP(op, argument, result)\\\n    __asm__ __volatile__\\\n    (\\\n        \"xor %%\" BOOST_ATOMIC_DETAIL_TEMP_CAS_REGISTER \", %%\" BOOST_ATOMIC_DETAIL_TEMP_CAS_REGISTER \"\\n\\t\"\\\n        \".align 16\\n\\t\"\\\n        \"1: movb %[arg], %%dl\\n\\t\"\\\n        op \" %%al, %%dl\\n\\t\"\\\n        \"lock; cmpxchgb %%dl, %[storage]\\n\\t\"\\\n        \"jne 1b\"\\\n        : [res] \"+a\" (result), [storage] \"+m\" (storage)\\\n        : [arg] \"q\" (argument)\\\n        : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA BOOST_ATOMIC_DETAIL_TEMP_CAS_REGISTER, \"memory\"\\\n    )\n\n    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        storage_type res = storage;\n        BOOST_ATOMIC_DETAIL_CAS_LOOP(\"andb\", v, res);\n        return res;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        storage_type res = storage;\n        BOOST_ATOMIC_DETAIL_CAS_LOOP(\"orb\", v, res);\n        return res;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        storage_type res = storage;\n        BOOST_ATOMIC_DETAIL_CAS_LOOP(\"xorb\", v, res);\n        return res;\n    }\n\n#undef BOOST_ATOMIC_DETAIL_CAS_LOOP\n};\n\ntemplate< bool Signed >\nstruct operations< 2u, Signed > :\n    public gcc_x86_operations< typename make_storage_type< 2u, Signed >::type, operations< 2u, Signed > >\n{\n    typedef gcc_x86_operations< typename make_storage_type< 2u, Signed >::type, operations< 2u, Signed > > base_type;\n    typedef typename base_type::storage_type storage_type;\n    typedef typename make_storage_type< 2u, Signed >::aligned aligned_storage_type;\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        __asm__ __volatile__\n        (\n            \"lock; xaddw %0, %1\"\n            : \"+q\" (v), \"+m\" (storage)\n            :\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"memory\"\n        );\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        __asm__ __volatile__\n        (\n            \"xchgw %0, %1\"\n            : \"+q\" (v), \"+m\" (storage)\n            :\n            : \"memory\"\n        );\n        return v;\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_strong(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order) BOOST_NOEXCEPT\n    {\n        storage_type previous = expected;\n        bool success;\n        __asm__ __volatile__\n        (\n            \"lock; cmpxchgw %3, %1\\n\\t\"\n            \"sete %2\"\n            : \"+a\" (previous), \"+m\" (storage), \"=q\" (success)\n            : \"q\" (desired)\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"memory\"\n        );\n        expected = previous;\n        return success;\n    }\n\n#define BOOST_ATOMIC_DETAIL_CAS_LOOP(op, argument, result)\\\n    __asm__ __volatile__\\\n    (\\\n        \"xor %%\" BOOST_ATOMIC_DETAIL_TEMP_CAS_REGISTER \", %%\" BOOST_ATOMIC_DETAIL_TEMP_CAS_REGISTER \"\\n\\t\"\\\n        \".align 16\\n\\t\"\\\n        \"1: movw %[arg], %%dx\\n\\t\"\\\n        op \" %%ax, %%dx\\n\\t\"\\\n        \"lock; cmpxchgw %%dx, %[storage]\\n\\t\"\\\n        \"jne 1b\"\\\n        : [res] \"+a\" (result), [storage] \"+m\" (storage)\\\n        : [arg] \"q\" (argument)\\\n        : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA BOOST_ATOMIC_DETAIL_TEMP_CAS_REGISTER, \"memory\"\\\n    )\n\n    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        storage_type res = storage;\n        BOOST_ATOMIC_DETAIL_CAS_LOOP(\"andw\", v, res);\n        return res;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        storage_type res = storage;\n        BOOST_ATOMIC_DETAIL_CAS_LOOP(\"orw\", v, res);\n        return res;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        storage_type res = storage;\n        BOOST_ATOMIC_DETAIL_CAS_LOOP(\"xorw\", v, res);\n        return res;\n    }\n\n#undef BOOST_ATOMIC_DETAIL_CAS_LOOP\n};\n\ntemplate< bool Signed >\nstruct operations< 4u, Signed > :\n    public gcc_x86_operations< typename make_storage_type< 4u, Signed >::type, operations< 4u, Signed > >\n{\n    typedef gcc_x86_operations< typename make_storage_type< 4u, Signed >::type, operations< 4u, Signed > > base_type;\n    typedef typename base_type::storage_type storage_type;\n    typedef typename make_storage_type< 4u, Signed >::aligned aligned_storage_type;\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        __asm__ __volatile__\n        (\n            \"lock; xaddl %0, %1\"\n            : \"+r\" (v), \"+m\" (storage)\n            :\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"memory\"\n        );\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        __asm__ __volatile__\n        (\n            \"xchgl %0, %1\"\n            : \"+r\" (v), \"+m\" (storage)\n            :\n            : \"memory\"\n        );\n        return v;\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_strong(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order) BOOST_NOEXCEPT\n    {\n        storage_type previous = expected;\n        bool success;\n        __asm__ __volatile__\n        (\n            \"lock; cmpxchgl %3, %1\\n\\t\"\n            \"sete %2\"\n            : \"+a\" (previous), \"+m\" (storage), \"=q\" (success)\n            : \"r\" (desired)\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"memory\"\n        );\n        expected = previous;\n        return success;\n    }\n\n#define BOOST_ATOMIC_DETAIL_CAS_LOOP(op, argument, result)\\\n    __asm__ __volatile__\\\n    (\\\n        \"xor %%\" BOOST_ATOMIC_DETAIL_TEMP_CAS_REGISTER \", %%\" BOOST_ATOMIC_DETAIL_TEMP_CAS_REGISTER \"\\n\\t\"\\\n        \".align 16\\n\\t\"\\\n        \"1: movl %[arg], %%edx\\n\\t\"\\\n        op \" %%eax, %%edx\\n\\t\"\\\n        \"lock; cmpxchgl %%edx, %[storage]\\n\\t\"\\\n        \"jne 1b\"\\\n        : [res] \"+a\" (result), [storage] \"+m\" (storage)\\\n        : [arg] \"r\" (argument)\\\n        : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA BOOST_ATOMIC_DETAIL_TEMP_CAS_REGISTER, \"memory\"\\\n    )\n\n    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        storage_type res = storage;\n        BOOST_ATOMIC_DETAIL_CAS_LOOP(\"andl\", v, res);\n        return res;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        storage_type res = storage;\n        BOOST_ATOMIC_DETAIL_CAS_LOOP(\"orl\", v, res);\n        return res;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        storage_type res = storage;\n        BOOST_ATOMIC_DETAIL_CAS_LOOP(\"xorl\", v, res);\n        return res;\n    }\n\n#undef BOOST_ATOMIC_DETAIL_CAS_LOOP\n};\n\n#if defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B)\n\ntemplate< bool Signed >\nstruct operations< 8u, Signed > :\n    public cas_based_operations< gcc_dcas_x86< Signed > >\n{\n};\n\n#elif defined(__x86_64__)\n\ntemplate< bool Signed >\nstruct operations< 8u, Signed > :\n    public gcc_x86_operations< typename make_storage_type< 8u, Signed >::type, operations< 8u, Signed > >\n{\n    typedef gcc_x86_operations< typename make_storage_type< 8u, Signed >::type, operations< 8u, Signed > > base_type;\n    typedef typename base_type::storage_type storage_type;\n    typedef typename make_storage_type< 8u, Signed >::aligned aligned_storage_type;\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        __asm__ __volatile__\n        (\n            \"lock; xaddq %0, %1\"\n            : \"+r\" (v), \"+m\" (storage)\n            :\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"memory\"\n        );\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        __asm__ __volatile__\n        (\n            \"xchgq %0, %1\"\n            : \"+r\" (v), \"+m\" (storage)\n            :\n            : \"memory\"\n        );\n        return v;\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_strong(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order) BOOST_NOEXCEPT\n    {\n        storage_type previous = expected;\n        bool success;\n        __asm__ __volatile__\n        (\n            \"lock; cmpxchgq %3, %1\\n\\t\"\n            \"sete %2\"\n            : \"+a\" (previous), \"+m\" (storage), \"=q\" (success)\n            : \"r\" (desired)\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"memory\"\n        );\n        expected = previous;\n        return success;\n    }\n\n#define BOOST_ATOMIC_DETAIL_CAS_LOOP(op, argument, result)\\\n    __asm__ __volatile__\\\n    (\\\n        \"xor %%\" BOOST_ATOMIC_DETAIL_TEMP_CAS_REGISTER \", %%\" BOOST_ATOMIC_DETAIL_TEMP_CAS_REGISTER \"\\n\\t\"\\\n        \".align 16\\n\\t\"\\\n        \"1: movq %[arg], %%rdx\\n\\t\"\\\n        op \" %%rax, %%rdx\\n\\t\"\\\n        \"lock; cmpxchgq %%rdx, %[storage]\\n\\t\"\\\n        \"jne 1b\"\\\n        : [res] \"+a\" (result), [storage] \"+m\" (storage)\\\n        : [arg] \"r\" (argument)\\\n        : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA BOOST_ATOMIC_DETAIL_TEMP_CAS_REGISTER, \"memory\"\\\n    )\n\n    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        storage_type res = storage;\n        BOOST_ATOMIC_DETAIL_CAS_LOOP(\"andq\", v, res);\n        return res;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        storage_type res = storage;\n        BOOST_ATOMIC_DETAIL_CAS_LOOP(\"orq\", v, res);\n        return res;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        storage_type res = storage;\n        BOOST_ATOMIC_DETAIL_CAS_LOOP(\"xorq\", v, res);\n        return res;\n    }\n\n#undef BOOST_ATOMIC_DETAIL_CAS_LOOP\n};\n\n#endif\n\n#if defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B)\n\ntemplate< bool Signed >\nstruct operations< 16u, Signed > :\n    public cas_based_operations< gcc_dcas_x86_64< Signed > >\n{\n};\n\n#endif // defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B)\n\nBOOST_FORCEINLINE void thread_fence(memory_order order) BOOST_NOEXCEPT\n{\n    if (order == memory_order_seq_cst)\n    {\n        __asm__ __volatile__\n        (\n#if defined(__x86_64__) || defined(__SSE2__)\n            \"mfence\\n\"\n#else\n            \"lock; addl $0, (%%esp)\\n\"\n#endif\n            ::: \"memory\"\n        );\n    }\n    else if ((order & (memory_order_acquire | memory_order_release)) != 0)\n    {\n        __asm__ __volatile__ (\"\" ::: \"memory\");\n    }\n}\n\nBOOST_FORCEINLINE void signal_fence(memory_order order) BOOST_NOEXCEPT\n{\n    if (order != memory_order_relaxed)\n        __asm__ __volatile__ (\"\" ::: \"memory\");\n}\n\n} // namespace detail\n} // namespace atomics\n} // namespace boost\n\n#undef BOOST_ATOMIC_DETAIL_TEMP_CAS_REGISTER\n\n#endif // BOOST_ATOMIC_DETAIL_OPS_GCC_X86_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/ops_gcc_x86_dcas.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2009 Helge Bahmann\n * Copyright (c) 2012 Tim Blechmann\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/ops_gcc_x86_dcas.hpp\n *\n * This header contains implementation of the double-width CAS primitive for x86.\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_OPS_GCC_X86_DCAS_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_OPS_GCC_X86_DCAS_HPP_INCLUDED_\n\n#include <boost/cstdint.hpp>\n#include <boost/memory_order.hpp>\n#include <boost/atomic/detail/config.hpp>\n#include <boost/atomic/detail/storage_type.hpp>\n#include <boost/atomic/capabilities.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\nnamespace boost {\nnamespace atomics {\nnamespace detail {\n\n#if defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B)\n\ntemplate< bool Signed >\nstruct gcc_dcas_x86\n{\n    typedef typename make_storage_type< 8u, Signed >::type storage_type;\n    typedef typename make_storage_type< 8u, Signed >::aligned aligned_storage_type;\n\n    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        if ((((uint32_t)&storage) & 0x00000007) == 0)\n        {\n#if defined(__SSE2__)\n            __asm__ __volatile__\n            (\n#if defined(__AVX__)\n                \"vmovq %1, %%xmm4\\n\\t\"\n                \"vmovq %%xmm4, %0\\n\\t\"\n#else\n                \"movq %1, %%xmm4\\n\\t\"\n                \"movq %%xmm4, %0\\n\\t\"\n#endif\n                : \"=m\" (storage)\n                : \"m\" (v)\n                : \"memory\", \"xmm4\"\n            );\n#else\n            __asm__ __volatile__\n            (\n                \"fildll %1\\n\\t\"\n                \"fistpll %0\\n\\t\"\n                : \"=m\" (storage)\n                : \"m\" (v)\n                : \"memory\"\n            );\n#endif\n        }\n        else\n        {\n#if !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)\n#if defined(__PIC__)\n            uint32_t scratch;\n            __asm__ __volatile__\n            (\n                \"movl %%ebx, %[scratch]\\n\\t\"\n                \"movl %[value_lo], %%ebx\\n\\t\"\n                \"movl %[dest], %%eax\\n\\t\"\n                \"movl 4+%[dest], %%edx\\n\\t\"\n                \".align 16\\n\\t\"\n                \"1: lock; cmpxchg8b %[dest]\\n\\t\"\n                \"jne 1b\\n\\t\"\n                \"movl %[scratch], %%ebx\\n\\t\"\n                : [scratch] \"=m\" (scratch), [dest] \"=o\" (storage)\n                : [value_lo] \"a\" ((uint32_t)v), \"c\" ((uint32_t)(v >> 32))\n                : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"edx\", \"memory\"\n            );\n#else // defined(__PIC__)\n            __asm__ __volatile__\n            (\n                \"movl %[dest], %%eax\\n\\t\"\n                \"movl 4+%[dest], %%edx\\n\\t\"\n                \".align 16\\n\\t\"\n                \"1: lock; cmpxchg8b %[dest]\\n\\t\"\n                \"jne 1b\\n\\t\"\n                : [dest] \"=o\" (storage)\n                : [value_lo] \"b\" ((uint32_t)v), \"c\" ((uint32_t)(v >> 32))\n                : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"eax\", \"edx\", \"memory\"\n            );\n#endif // defined(__PIC__)\n#else // !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)\n#if defined(__PIC__)\n            uint32_t scratch;\n            __asm__ __volatile__\n            (\n                \"movl %%ebx, %[scratch]\\n\\t\"\n                \"movl %[value_lo], %%ebx\\n\\t\"\n                \"movl 0(%[dest]), %%eax\\n\\t\"\n                \"movl 4(%[dest]), %%edx\\n\\t\"\n                \".align 16\\n\\t\"\n                \"1: lock; cmpxchg8b 0(%[dest])\\n\\t\"\n                \"jne 1b\\n\\t\"\n                \"movl %[scratch], %%ebx\\n\\t\"\n#if !defined(BOOST_ATOMIC_DETAIL_NO_ASM_CONSTRAINT_ALTERNATIVES)\n                : [scratch] \"=m,m\" (scratch)\n                : [value_lo] \"a,a\" ((uint32_t)v), \"c,c\" ((uint32_t)(v >> 32)), [dest] \"D,S\" (&storage)\n#else\n                : [scratch] \"=m\" (scratch)\n                : [value_lo] \"a\" ((uint32_t)v), \"c\" ((uint32_t)(v >> 32)), [dest] \"D\" (&storage)\n#endif\n                : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"edx\", \"memory\"\n            );\n#else // defined(__PIC__)\n            __asm__ __volatile__\n            (\n                \"movl 0(%[dest]), %%eax\\n\\t\"\n                \"movl 4(%[dest]), %%edx\\n\\t\"\n                \".align 16\\n\\t\"\n                \"1: lock; cmpxchg8b 0(%[dest])\\n\\t\"\n                \"jne 1b\\n\\t\"\n                :\n#if !defined(BOOST_ATOMIC_DETAIL_NO_ASM_CONSTRAINT_ALTERNATIVES)\n                : [value_lo] \"b,b\" ((uint32_t)v), \"c,c\" ((uint32_t)(v >> 32)), [dest] \"D,S\" (&storage)\n#else\n                : [value_lo] \"b\" ((uint32_t)v), \"c\" ((uint32_t)(v >> 32)), [dest] \"D\" (&storage)\n#endif\n                : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"eax\", \"edx\", \"memory\"\n            );\n#endif // defined(__PIC__)\n#endif // !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)\n        }\n    }\n\n    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order) BOOST_NOEXCEPT\n    {\n        storage_type value;\n\n        if ((((uint32_t)&storage) & 0x00000007) == 0)\n        {\n#if defined(__SSE2__)\n            __asm__ __volatile__\n            (\n#if defined(__AVX__)\n                \"vmovq %1, %%xmm4\\n\\t\"\n                \"vmovq %%xmm4, %0\\n\\t\"\n#else\n                \"movq %1, %%xmm4\\n\\t\"\n                \"movq %%xmm4, %0\\n\\t\"\n#endif\n                : \"=m\" (value)\n                : \"m\" (storage)\n                : \"memory\", \"xmm4\"\n            );\n#else\n            __asm__ __volatile__\n            (\n                \"fildll %1\\n\\t\"\n                \"fistpll %0\\n\\t\"\n                : \"=m\" (value)\n                : \"m\" (storage)\n                : \"memory\"\n            );\n#endif\n        }\n        else\n        {\n#if defined(__clang__)\n            // Clang cannot allocate eax:edx register pairs but it has sync intrinsics\n            value = __sync_val_compare_and_swap(&storage, (storage_type)0, (storage_type)0);\n#else\n            // We don't care for comparison result here; the previous value will be stored into value anyway.\n            // Also we don't care for ebx and ecx values, they just have to be equal to eax and edx before cmpxchg8b.\n            __asm__ __volatile__\n            (\n                \"movl %%ebx, %%eax\\n\\t\"\n                \"movl %%ecx, %%edx\\n\\t\"\n                \"lock; cmpxchg8b %[storage]\\n\\t\"\n                : \"=&A\" (value)\n                : [storage] \"m\" (storage)\n                : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"memory\"\n            );\n#endif\n        }\n\n        return value;\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_strong(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order) BOOST_NOEXCEPT\n    {\n#if defined(__clang__)\n        // Clang cannot allocate eax:edx register pairs but it has sync intrinsics\n        storage_type old_expected = expected;\n        expected = __sync_val_compare_and_swap(&storage, old_expected, desired);\n        return expected == old_expected;\n#elif defined(__PIC__)\n        // Make sure ebx is saved and restored properly in case\n        // of position independent code. To make this work\n        // setup register constraints such that ebx can not be\n        // used by accident e.g. as base address for the variable\n        // to be modified. Accessing \"scratch\" should always be okay,\n        // as it can only be placed on the stack (and therefore\n        // accessed through ebp or esp only).\n        //\n        // In theory, could push/pop ebx onto/off the stack, but movs\n        // to a prepared stack slot turn out to be faster.\n\n        uint32_t scratch;\n        bool success;\n        __asm__ __volatile__\n        (\n            \"movl %%ebx, %[scratch]\\n\\t\"\n            \"movl %[desired_lo], %%ebx\\n\\t\"\n            \"lock; cmpxchg8b %[dest]\\n\\t\"\n            \"movl %[scratch], %%ebx\\n\\t\"\n            \"sete %[success]\\n\\t\"\n#if !defined(BOOST_ATOMIC_DETAIL_NO_ASM_CONSTRAINT_ALTERNATIVES)\n            : \"+A,A,A,A,A,A\" (expected), [dest] \"+m,m,m,m,m,m\" (storage), [scratch] \"=m,m,m,m,m,m\" (scratch), [success] \"=q,m,q,m,q,m\" (success)\n            : [desired_lo] \"S,S,D,D,m,m\" ((uint32_t)desired), \"c,c,c,c,c,c\" ((uint32_t)(desired >> 32))\n#else\n            : \"+A\" (expected), [dest] \"+m\" (storage), [scratch] \"=m\" (scratch), [success] \"=q\" (success)\n            : [desired_lo] \"S\" ((uint32_t)desired), \"c\" ((uint32_t)(desired >> 32))\n#endif\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"memory\"\n        );\n        return success;\n#else\n        bool success;\n        __asm__ __volatile__\n        (\n            \"lock; cmpxchg8b %[dest]\\n\\t\"\n            \"sete %[success]\\n\\t\"\n#if !defined(BOOST_ATOMIC_DETAIL_NO_ASM_CONSTRAINT_ALTERNATIVES)\n            : \"+A,A\" (expected), [dest] \"+m,m\" (storage), [success] \"=q,m\" (success)\n            : \"b,b\" ((uint32_t)desired), \"c,c\" ((uint32_t)(desired >> 32))\n#else\n            : \"+A\" (expected), [dest] \"+m\" (storage), [success] \"=q\" (success)\n            : \"b\" ((uint32_t)desired), \"c\" ((uint32_t)(desired >> 32))\n#endif\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"memory\"\n        );\n        return success;\n#endif\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_weak(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        return compare_exchange_strong(storage, expected, desired, success_order, failure_order);\n    }\n\n    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n#if defined(__clang__)\n        // Clang cannot allocate eax:edx register pairs but it has sync intrinsics\n        storage_type old_val = storage;\n        while (true)\n        {\n            storage_type val = __sync_val_compare_and_swap(&storage, old_val, v);\n            if (val == old_val)\n                return val;\n            old_val = val;\n        }\n#elif !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)\n#if defined(__PIC__)\n        uint32_t scratch;\n        __asm__ __volatile__\n        (\n            \"movl %%ebx, %[scratch]\\n\\t\"\n            \"movl %%eax, %%ebx\\n\\t\"\n            \"movl %%edx, %%ecx\\n\\t\"\n            \"movl %[dest], %%eax\\n\\t\"\n            \"movl 4+%[dest], %%edx\\n\\t\"\n            \".align 16\\n\\t\"\n            \"1: lock; cmpxchg8b %[dest]\\n\\t\"\n            \"jne 1b\\n\\t\"\n            \"movl %[scratch], %%ebx\\n\\t\"\n            : \"+A\" (v), [scratch] \"=m\" (scratch), [dest] \"+o\" (storage)\n            :\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"ecx\", \"memory\"\n        );\n        return v;\n#else // defined(__PIC__)\n        __asm__ __volatile__\n        (\n            \"movl %[dest], %%eax\\n\\t\"\n            \"movl 4+%[dest], %%edx\\n\\t\"\n            \".align 16\\n\\t\"\n            \"1: lock; cmpxchg8b %[dest]\\n\\t\"\n            \"jne 1b\\n\\t\"\n            : \"=A\" (v), [dest] \"+o\" (storage)\n            : \"b\" ((uint32_t)v), \"c\" ((uint32_t)(v >> 32))\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"memory\"\n        );\n        return v;\n#endif // defined(__PIC__)\n#else // !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)\n#if defined(__PIC__)\n        uint32_t scratch;\n        __asm__ __volatile__\n        (\n            \"movl %%ebx, %[scratch]\\n\\t\"\n            \"movl %%eax, %%ebx\\n\\t\"\n            \"movl %%edx, %%ecx\\n\\t\"\n            \"movl 0(%[dest]), %%eax\\n\\t\"\n            \"movl 4(%[dest]), %%edx\\n\\t\"\n            \".align 16\\n\\t\"\n            \"1: lock; cmpxchg8b 0(%[dest])\\n\\t\"\n            \"jne 1b\\n\\t\"\n            \"movl %[scratch], %%ebx\\n\\t\"\n#if !defined(BOOST_ATOMIC_DETAIL_NO_ASM_CONSTRAINT_ALTERNATIVES)\n            : \"+A,A\" (v), [scratch] \"=m,m\" (scratch)\n            : [dest] \"D,S\" (&storage)\n#else\n            : \"+A\" (v), [scratch] \"=m\" (scratch)\n            : [dest] \"D\" (&storage)\n#endif\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"ecx\", \"memory\"\n        );\n        return v;\n#else // defined(__PIC__)\n        __asm__ __volatile__\n        (\n            \"movl 0(%[dest]), %%eax\\n\\t\"\n            \"movl 4(%[dest]), %%edx\\n\\t\"\n            \".align 16\\n\\t\"\n            \"1: lock; cmpxchg8b 0(%[dest])\\n\\t\"\n            \"jne 1b\\n\\t\"\n#if !defined(BOOST_ATOMIC_DETAIL_NO_ASM_CONSTRAINT_ALTERNATIVES)\n            : \"=A,A\" (v)\n            : \"b,b\" ((uint32_t)v), \"c,c\" ((uint32_t)(v >> 32)), [dest] \"D,S\" (&storage)\n#else\n            : \"=A\" (v)\n            : \"b\" ((uint32_t)v), \"c\" ((uint32_t)(v >> 32)), [dest] \"D\" (&storage)\n#endif\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"memory\"\n        );\n        return v;\n#endif // defined(__PIC__)\n#endif\n    }\n\n    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT\n    {\n        return true;\n    }\n};\n\n#endif // defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B)\n\n#if defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B)\n\ntemplate< bool Signed >\nstruct gcc_dcas_x86_64\n{\n    typedef typename make_storage_type< 16u, Signed >::type storage_type;\n    typedef typename make_storage_type< 16u, Signed >::aligned aligned_storage_type;\n\n    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        uint64_t const* p_value = (uint64_t const*)&v;\n#if !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)\n        __asm__ __volatile__\n        (\n            \"movq %[dest], %%rax\\n\\t\"\n            \"movq 8+%[dest], %%rdx\\n\\t\"\n            \".align 16\\n\\t\"\n            \"1: lock; cmpxchg16b %[dest]\\n\\t\"\n            \"jne 1b\\n\\t\"\n            : [dest] \"=o\" (storage)\n            : \"b\" (p_value[0]), \"c\" (p_value[1])\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"rax\", \"rdx\", \"memory\"\n        );\n#else // !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)\n        __asm__ __volatile__\n        (\n            \"movq 0(%[dest]), %%rax\\n\\t\"\n            \"movq 8(%[dest]), %%rdx\\n\\t\"\n            \".align 16\\n\\t\"\n            \"1: lock; cmpxchg16b 0(%[dest])\\n\\t\"\n            \"jne 1b\\n\\t\"\n            :\n            : \"b\" (p_value[0]), \"c\" (p_value[1]), [dest] \"r\" (&storage)\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"rax\", \"rdx\", \"memory\"\n        );\n#endif // !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)\n    }\n\n    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order) BOOST_NOEXCEPT\n    {\n#if defined(__clang__)\n        // Clang cannot allocate rax:rdx register pairs but it has sync intrinsics\n        storage_type value = storage_type();\n        return __sync_val_compare_and_swap(&storage, value, value);\n#elif defined(BOOST_ATOMIC_DETAIL_NO_ASM_RAX_RDX_PAIRS)\n        // GCC 4.4 can't allocate rax:rdx register pair either but it also doesn't support 128-bit __sync_val_compare_and_swap\n        storage_type value;\n\n        // We don't care for comparison result here; the previous value will be stored into value anyway.\n        // Also we don't care for rbx and rcx values, they just have to be equal to rax and rdx before cmpxchg16b.\n#if !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)\n        __asm__ __volatile__\n        (\n            \"movq %%rbx, %%rax\\n\\t\"\n            \"movq %%rcx, %%rdx\\n\\t\"\n            \"lock; cmpxchg16b %[storage]\\n\\t\"\n            \"movq %%rax, %[value]\\n\\t\"\n            \"movq %%rdx, 8+%[value]\\n\\t\"\n            : [value] \"=o\" (value)\n            : [storage] \"m\" (storage)\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"memory\", \"rax\", \"rdx\"\n        );\n#else // !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)\n        __asm__ __volatile__\n        (\n            \"movq %%rbx, %%rax\\n\\t\"\n            \"movq %%rcx, %%rdx\\n\\t\"\n            \"lock; cmpxchg16b %[storage]\\n\\t\"\n            \"movq %%rax, 0(%[value])\\n\\t\"\n            \"movq %%rdx, 8(%[value])\\n\\t\"\n            :\n            : [storage] \"m\" (storage), [value] \"r\" (&value)\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"memory\", \"rax\", \"rdx\"\n        );\n#endif // !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)\n\n        return value;\n#else // defined(BOOST_ATOMIC_DETAIL_NO_ASM_RAX_RDX_PAIRS)\n        storage_type value;\n\n        // We don't care for comparison result here; the previous value will be stored into value anyway.\n        // Also we don't care for rbx and rcx values, they just have to be equal to rax and rdx before cmpxchg16b.\n        __asm__ __volatile__\n        (\n            \"movq %%rbx, %%rax\\n\\t\"\n            \"movq %%rcx, %%rdx\\n\\t\"\n            \"lock; cmpxchg16b %[storage]\\n\\t\"\n            : \"=&A\" (value)\n            : [storage] \"m\" (storage)\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"memory\"\n        );\n\n        return value;\n#endif\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_strong(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order) BOOST_NOEXCEPT\n    {\n#if defined(__clang__)\n        // Clang cannot allocate rax:rdx register pairs but it has sync intrinsics\n        storage_type old_expected = expected;\n        expected = __sync_val_compare_and_swap(&storage, old_expected, desired);\n        return expected == old_expected;\n#elif defined(BOOST_ATOMIC_DETAIL_NO_ASM_RAX_RDX_PAIRS)\n        // GCC 4.4 can't allocate rax:rdx register pair either but it also doesn't support 128-bit __sync_val_compare_and_swap\n        uint64_t const* p_desired = (uint64_t const*)&desired;\n        bool success;\n#if !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)\n        __asm__ __volatile__\n        (\n            \"movq %[expected], %%rax\\n\\t\"\n            \"movq 8+%[expected], %%rdx\\n\\t\"\n            \"lock; cmpxchg16b %[dest]\\n\\t\"\n            \"sete %[success]\\n\\t\"\n            \"movq %%rax, %[expected]\\n\\t\"\n            \"movq %%rdx, 8+%[expected]\\n\\t\"\n            : [dest] \"+m\" (storage), [expected] \"+o\" (expected), [success] \"=q\" (success)\n            : \"b\" (p_desired[0]), \"c\" (p_desired[1])\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"memory\", \"rax\", \"rdx\"\n        );\n#else // !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)\n        __asm__ __volatile__\n        (\n            \"movq 0(%[expected]), %%rax\\n\\t\"\n            \"movq 8(%[expected]), %%rdx\\n\\t\"\n            \"lock; cmpxchg16b %[dest]\\n\\t\"\n            \"sete %[success]\\n\\t\"\n            \"movq %%rax, 0(%[expected])\\n\\t\"\n            \"movq %%rdx, 8(%[expected])\\n\\t\"\n            : [dest] \"+m\" (storage), [success] \"=q\" (success)\n            : \"b\" (p_desired[0]), \"c\" (p_desired[1]), [expected] \"r\" (&expected)\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"memory\", \"rax\", \"rdx\"\n        );\n#endif // !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)\n\n        return success;\n#else // defined(BOOST_ATOMIC_DETAIL_NO_ASM_RAX_RDX_PAIRS)\n        uint64_t const* p_desired = (uint64_t const*)&desired;\n        bool success;\n        __asm__ __volatile__\n        (\n            \"lock; cmpxchg16b %[dest]\\n\\t\"\n            \"sete %[success]\\n\\t\"\n#if !defined(BOOST_ATOMIC_DETAIL_NO_ASM_CONSTRAINT_ALTERNATIVES)\n            : \"+A,A\" (expected), [dest] \"+m,m\" (storage), [success] \"=q,m\" (success)\n            : \"b,b\" (p_desired[0]), \"c,c\" (p_desired[1])\n#else\n            : \"+A\" (expected), [dest] \"+m\" (storage), [success] \"=q\" (success)\n            : \"b\" (p_desired[0]), \"c\" (p_desired[1])\n#endif\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"memory\"\n        );\n        return success;\n#endif\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_weak(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        return compare_exchange_strong(storage, expected, desired, success_order, failure_order);\n    }\n\n    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n#if defined(__clang__)\n        // Clang cannot allocate eax:edx register pairs but it has sync intrinsics\n        storage_type old_val = storage;\n        while (true)\n        {\n            storage_type val = __sync_val_compare_and_swap(&storage, old_val, v);\n            if (val == old_val)\n                return val;\n            old_val = val;\n        }\n#elif defined(BOOST_ATOMIC_DETAIL_NO_ASM_RAX_RDX_PAIRS)\n        // GCC 4.4 can't allocate rax:rdx register pair either but it also doesn't support 128-bit __sync_val_compare_and_swap\n        storage_type old_value;\n        uint64_t const* p_value = (uint64_t const*)&v;\n#if !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)\n        __asm__ __volatile__\n        (\n            \"movq %[dest], %%rax\\n\\t\"\n            \"movq 8+%[dest], %%rdx\\n\\t\"\n            \".align 16\\n\\t\"\n            \"1: lock; cmpxchg16b %[dest]\\n\\t\"\n            \"jne 1b\\n\\t\"\n            \"movq %%rax, %[old_value]\\n\\t\"\n            \"movq %%rdx, 8+%[old_value]\\n\\t\"\n            : [dest] \"+o\" (storage), [old_value] \"=o\" (old_value)\n            : \"b\" (p_value[0]), \"c\" (p_value[1])\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"memory\", \"rax\", \"rdx\"\n        );\n#else // !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)\n        __asm__ __volatile__\n        (\n            \"movq 0(%[dest]), %%rax\\n\\t\"\n            \"movq 8(%[dest]), %%rdx\\n\\t\"\n            \".align 16\\n\\t\"\n            \"1: lock; cmpxchg16b 0(%[dest])\\n\\t\"\n            \"jne 1b\\n\\t\"\n            \"movq %%rax, 0(%[old_value])\\n\\t\"\n            \"movq %%rdx, 8(%[old_value])\\n\\t\"\n            :\n            : \"b\" (p_value[0]), \"c\" (p_value[1]), [dest] \"r\" (&storage), [old_value] \"r\" (&old_value)\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"memory\", \"rax\", \"rdx\"\n        );\n#endif // !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)\n\n        return old_value;\n#else // defined(BOOST_ATOMIC_DETAIL_NO_ASM_RAX_RDX_PAIRS)\n        uint64_t const* p_value = (uint64_t const*)&v;\n#if !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)\n        __asm__ __volatile__\n        (\n            \"movq %[dest], %%rax\\n\\t\"\n            \"movq 8+%[dest], %%rdx\\n\\t\"\n            \".align 16\\n\\t\"\n            \"1: lock; cmpxchg16b %[dest]\\n\\t\"\n            \"jne 1b\\n\\t\"\n            : \"=&A\" (v), [dest] \"+o\" (storage)\n            : \"b\" (p_value[0]), \"c\" (p_value[1])\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"memory\"\n        );\n#else // !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)\n        __asm__ __volatile__\n        (\n            \"movq 0(%[dest]), %%rax\\n\\t\"\n            \"movq 8(%[dest]), %%rdx\\n\\t\"\n            \".align 16\\n\\t\"\n            \"1: lock; cmpxchg16b 0(%[dest])\\n\\t\"\n            \"jne 1b\\n\\t\"\n            : \"=&A\" (v)\n            : \"b\" (p_value[0]), \"c\" (p_value[1]), [dest] \"r\" (&storage)\n            : BOOST_ATOMIC_DETAIL_ASM_CLOBBER_CC_COMMA \"memory\"\n        );\n#endif // !defined(BOOST_ATOMIC_DETAIL_NO_ASM_IMPLIED_ZERO_DISPLACEMENTS)\n\n        return v;\n#endif\n    }\n\n    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT\n    {\n        return true;\n    }\n};\n\n#endif // defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B)\n\n} // namespace detail\n} // namespace atomics\n} // namespace boost\n\n#endif // BOOST_ATOMIC_DETAIL_OPS_GCC_X86_DCAS_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/ops_linux_arm.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2009, 2011 Helge Bahmann\n * Copyright (c) 2009 Phil Endecott\n * Copyright (c) 2013 Tim Blechmann\n * Linux-specific code by Phil Endecott\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/ops_linux_arm.hpp\n *\n * This header contains implementation of the \\c operations template.\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_OPS_LINUX_ARM_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_OPS_LINUX_ARM_HPP_INCLUDED_\n\n#include <boost/memory_order.hpp>\n#include <boost/atomic/detail/config.hpp>\n#include <boost/atomic/detail/storage_type.hpp>\n#include <boost/atomic/detail/operations_fwd.hpp>\n#include <boost/atomic/capabilities.hpp>\n#include <boost/atomic/detail/ops_cas_based.hpp>\n#include <boost/atomic/detail/ops_extending_cas_based.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\nnamespace boost {\nnamespace atomics {\nnamespace detail {\n\n// Different ARM processors have different atomic instructions.  In particular,\n// architecture versions before v6 (which are still in widespread use, e.g. the\n// Intel/Marvell XScale chips like the one in the NSLU2) have only atomic swap.\n// On Linux the kernel provides some support that lets us abstract away from\n// these differences: it provides emulated CAS and barrier functions at special\n// addresses that are guaranteed not to be interrupted by the kernel.  Using\n// this facility is slightly slower than inline assembler would be, but much\n// faster than a system call.\n//\n// While this emulated CAS is \"strong\" in the sense that it does not fail\n// \"spuriously\" (i.e.: it never fails to perform the exchange when the value\n// found equals the value expected), it does not return the found value on\n// failure. To satisfy the atomic API, compare_exchange_{weak|strong} must\n// return the found value on failure, and we have to manually load this value\n// after the emulated CAS reports failure. This in turn introduces a race\n// between the CAS failing (due to the \"wrong\" value being found) and subsequently\n// loading (which might turn up the \"right\" value). From an application's\n// point of view this looks like \"spurious failure\", and therefore the\n// emulated CAS is only good enough to provide compare_exchange_weak\n// semantics.\n\nstruct linux_arm_cas_base\n{\n    static BOOST_FORCEINLINE void fence_before_store(memory_order order) BOOST_NOEXCEPT\n    {\n        if ((order & memory_order_release) != 0)\n            hardware_full_fence();\n    }\n\n    static BOOST_FORCEINLINE void fence_after_store(memory_order order) BOOST_NOEXCEPT\n    {\n        if (order == memory_order_seq_cst)\n            hardware_full_fence();\n    }\n\n    static BOOST_FORCEINLINE void fence_after_load(memory_order order) BOOST_NOEXCEPT\n    {\n        if ((order & (memory_order_consume | memory_order_acquire)) != 0)\n            hardware_full_fence();\n    }\n\n    static BOOST_FORCEINLINE void hardware_full_fence() BOOST_NOEXCEPT\n    {\n        typedef void (*kernel_dmb_t)(void);\n        ((kernel_dmb_t)0xffff0fa0)();\n    }\n};\n\ntemplate< bool Signed >\nstruct linux_arm_cas :\n    public linux_arm_cas_base\n{\n    typedef typename make_storage_type< 4u, Signed >::type storage_type;\n    typedef typename make_storage_type< 4u, Signed >::aligned aligned_storage_type;\n\n    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        fence_before_store(order);\n        storage = v;\n        fence_after_store(order);\n    }\n\n    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type v = storage;\n        fence_after_load(order);\n        return v;\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_strong(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        while (true)\n        {\n            storage_type tmp = expected;\n            if (compare_exchange_weak(storage, tmp, desired, success_order, failure_order))\n                return true;\n            if (tmp != expected)\n            {\n                expected = tmp;\n                return false;\n            }\n        }\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_weak(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order) BOOST_NOEXCEPT\n    {\n        typedef storage_type (*kernel_cmpxchg32_t)(storage_type oldval, storage_type newval, volatile storage_type* ptr);\n\n        if (((kernel_cmpxchg32_t)0xffff0fc0)(expected, desired, &storage) == 0)\n        {\n            return true;\n        }\n        else\n        {\n            expected = storage;\n            return false;\n        }\n    }\n\n    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT\n    {\n        return true;\n    }\n};\n\ntemplate< bool Signed >\nstruct operations< 1u, Signed > :\n    public extending_cas_based_operations< cas_based_operations< cas_based_exchange< linux_arm_cas< Signed > > >, 1u, Signed >\n{\n};\n\ntemplate< bool Signed >\nstruct operations< 2u, Signed > :\n    public extending_cas_based_operations< cas_based_operations< cas_based_exchange< linux_arm_cas< Signed > > >, 2u, Signed >\n{\n};\n\ntemplate< bool Signed >\nstruct operations< 4u, Signed > :\n    public cas_based_operations< cas_based_exchange< linux_arm_cas< Signed > > >\n{\n};\n\nBOOST_FORCEINLINE void thread_fence(memory_order order) BOOST_NOEXCEPT\n{\n    if (order != memory_order_relaxed)\n        linux_arm_cas_base::hardware_full_fence();\n}\n\nBOOST_FORCEINLINE void signal_fence(memory_order order) BOOST_NOEXCEPT\n{\n    if (order != memory_order_relaxed)\n        __asm__ __volatile__ (\"\" ::: \"memory\");\n}\n\n} // namespace detail\n} // namespace atomics\n} // namespace boost\n\n#endif // BOOST_ATOMIC_DETAIL_OPS_LINUX_ARM_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/ops_msvc_arm.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2009 Helge Bahmann\n * Copyright (c) 2012 Tim Blechmann\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/ops_msvc_arm.hpp\n *\n * This header contains implementation of the \\c operations template.\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_OPS_MSVC_ARM_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_OPS_MSVC_ARM_HPP_INCLUDED_\n\n#include <intrin.h>\n#include <boost/memory_order.hpp>\n#include <boost/type_traits/make_signed.hpp>\n#include <boost/atomic/detail/config.hpp>\n#include <boost/atomic/detail/interlocked.hpp>\n#include <boost/atomic/detail/storage_type.hpp>\n#include <boost/atomic/detail/operations_fwd.hpp>\n#include <boost/atomic/capabilities.hpp>\n#include <boost/atomic/detail/ops_msvc_common.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\n#define BOOST_ATOMIC_DETAIL_ARM_LOAD8(p) __iso_volatile_load8((const volatile __int8*)(p))\n#define BOOST_ATOMIC_DETAIL_ARM_LOAD16(p) __iso_volatile_load16((const volatile __int16*)(p))\n#define BOOST_ATOMIC_DETAIL_ARM_LOAD32(p) __iso_volatile_load32((const volatile __int32*)(p))\n#define BOOST_ATOMIC_DETAIL_ARM_LOAD64(p) __iso_volatile_load64((const volatile __int64*)(p))\n#define BOOST_ATOMIC_DETAIL_ARM_STORE8(p, v) __iso_volatile_store8((volatile __int8*)(p), (__int8)(v))\n#define BOOST_ATOMIC_DETAIL_ARM_STORE16(p, v) __iso_volatile_store16((volatile __int16*)(p), (__int16)(v))\n#define BOOST_ATOMIC_DETAIL_ARM_STORE32(p, v) __iso_volatile_store32((volatile __int32*)(p), (__int32)(v))\n#define BOOST_ATOMIC_DETAIL_ARM_STORE64(p, v) __iso_volatile_store64((volatile __int64*)(p), (__int64)(v))\n\nnamespace boost {\nnamespace atomics {\nnamespace detail {\n\n// A note about memory_order_consume. Technically, this architecture allows to avoid\n// unnecessary memory barrier after consume load since it supports data dependency ordering.\n// However, some compiler optimizations may break a seemingly valid code relying on data\n// dependency tracking by injecting bogus branches to aid out of order execution.\n// This may happen not only in Boost.Atomic code but also in user's code, which we have no\n// control of. See this thread: http://lists.boost.org/Archives/boost/2014/06/213890.php.\n// For this reason we promote memory_order_consume to memory_order_acquire.\n\nstruct msvc_arm_operations_base\n{\n    static BOOST_FORCEINLINE void hardware_full_fence() BOOST_NOEXCEPT\n    {\n        __dmb(0xB); // _ARM_BARRIER_ISH, see armintr.h from MSVC 11 and later\n    }\n\n    static BOOST_FORCEINLINE void fence_before_store(memory_order order) BOOST_NOEXCEPT\n    {\n        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();\n\n        if ((order & memory_order_release) != 0)\n            hardware_full_fence();\n\n        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();\n    }\n\n    static BOOST_FORCEINLINE void fence_after_store(memory_order order) BOOST_NOEXCEPT\n    {\n        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();\n\n        if (order == memory_order_seq_cst)\n            hardware_full_fence();\n\n        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();\n    }\n\n    static BOOST_FORCEINLINE void fence_after_load(memory_order order) BOOST_NOEXCEPT\n    {\n        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();\n\n        if ((order & (memory_order_consume | memory_order_acquire)) != 0)\n            hardware_full_fence();\n\n        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();\n    }\n\n    static BOOST_FORCEINLINE BOOST_CONSTEXPR memory_order cas_common_order(memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        // Combine order flags together and promote memory_order_consume to memory_order_acquire\n        return static_cast< memory_order >(((failure_order | success_order) & ~memory_order_consume) | (((failure_order | success_order) & memory_order_consume) << 1u));\n    }\n};\n\ntemplate< typename T, typename Derived >\nstruct msvc_arm_operations :\n    public msvc_arm_operations_base\n{\n    typedef T storage_type;\n\n    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        typedef typename make_signed< storage_type >::type signed_storage_type;\n        return Derived::fetch_add(storage, static_cast< storage_type >(-static_cast< signed_storage_type >(v)), order);\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_weak(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        return Derived::compare_exchange_strong(storage, expected, desired, success_order, failure_order);\n    }\n\n    static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        return !!Derived::exchange(storage, (storage_type)1, order);\n    }\n\n    static BOOST_FORCEINLINE void clear(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        Derived::store(storage, (storage_type)0, order);\n    }\n\n    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT\n    {\n        return true;\n    }\n};\n\ntemplate< bool Signed >\nstruct operations< 1u, Signed > :\n    public msvc_arm_operations< typename make_storage_type< 1u, Signed >::type, operations< 1u, Signed > >\n{\n    typedef msvc_arm_operations< typename make_storage_type< 1u, Signed >::type, operations< 1u, Signed > > base_type;\n    typedef typename base_type::storage_type storage_type;\n    typedef typename make_storage_type< 1u, Signed >::aligned aligned_storage_type;\n\n    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        base_type::fence_before_store(order);\n        BOOST_ATOMIC_DETAIL_ARM_STORE8(&storage, v);\n        base_type::fence_after_store(order);\n    }\n\n    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type v = BOOST_ATOMIC_DETAIL_ARM_LOAD8(&storage);\n        base_type::fence_after_load(order);\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        switch (order)\n        {\n        case memory_order_relaxed:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD8_RELAXED(&storage, v));\n            break;\n        case memory_order_consume:\n        case memory_order_acquire:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD8_ACQUIRE(&storage, v));\n            break;\n        case memory_order_release:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD8_RELEASE(&storage, v));\n            break;\n        case memory_order_acq_rel:\n        case memory_order_seq_cst:\n        default:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD8(&storage, v));\n            break;\n        }\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        switch (order)\n        {\n        case memory_order_relaxed:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE8_RELAXED(&storage, v));\n            break;\n        case memory_order_consume:\n        case memory_order_acquire:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE8_ACQUIRE(&storage, v));\n            break;\n        case memory_order_release:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE8_RELEASE(&storage, v));\n            break;\n        case memory_order_acq_rel:\n        case memory_order_seq_cst:\n        default:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE8(&storage, v));\n            break;\n        }\n        return v;\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_strong(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        storage_type previous = expected, old_val;\n\n        switch (cas_common_order(success_order, failure_order))\n        {\n        case memory_order_relaxed:\n            old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE8_RELAXED(&storage, desired, previous));\n            break;\n        case memory_order_consume:\n        case memory_order_acquire:\n            old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE8_ACQUIRE(&storage, desired, previous));\n            break;\n        case memory_order_release:\n            old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE8_RELEASE(&storage, desired, previous));\n            break;\n        case memory_order_acq_rel:\n        case memory_order_seq_cst:\n        default:\n            old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE8(&storage, desired, previous));\n            break;\n        }\n        expected = old_val;\n\n        return (previous == old_val);\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        switch (order)\n        {\n        case memory_order_relaxed:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND8_RELAXED(&storage, v));\n            break;\n        case memory_order_consume:\n        case memory_order_acquire:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND8_ACQUIRE(&storage, v));\n            break;\n        case memory_order_release:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND8_RELEASE(&storage, v));\n            break;\n        case memory_order_acq_rel:\n        case memory_order_seq_cst:\n        default:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND8(&storage, v));\n            break;\n        }\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        switch (order)\n        {\n        case memory_order_relaxed:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR8_RELAXED(&storage, v));\n            break;\n        case memory_order_consume:\n        case memory_order_acquire:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR8_ACQUIRE(&storage, v));\n            break;\n        case memory_order_release:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR8_RELEASE(&storage, v));\n            break;\n        case memory_order_acq_rel:\n        case memory_order_seq_cst:\n        default:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR8(&storage, v));\n            break;\n        }\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        switch (order)\n        {\n        case memory_order_relaxed:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR8_RELAXED(&storage, v));\n            break;\n        case memory_order_consume:\n        case memory_order_acquire:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR8_ACQUIRE(&storage, v));\n            break;\n        case memory_order_release:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR8_RELEASE(&storage, v));\n            break;\n        case memory_order_acq_rel:\n        case memory_order_seq_cst:\n        default:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR8(&storage, v));\n            break;\n        }\n        return v;\n    }\n};\n\ntemplate< bool Signed >\nstruct operations< 2u, Signed > :\n    public msvc_arm_operations< typename make_storage_type< 2u, Signed >::type, operations< 2u, Signed > >\n{\n    typedef msvc_arm_operations< typename make_storage_type< 2u, Signed >::type, operations< 2u, Signed > > base_type;\n    typedef typename base_type::storage_type storage_type;\n    typedef typename make_storage_type< 2u, Signed >::aligned aligned_storage_type;\n\n    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        base_type::fence_before_store(order);\n        BOOST_ATOMIC_DETAIL_ARM_STORE16(&storage, v);\n        base_type::fence_after_store(order);\n    }\n\n    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type v = BOOST_ATOMIC_DETAIL_ARM_LOAD16(&storage);\n        base_type::fence_after_load(order);\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        switch (order)\n        {\n        case memory_order_relaxed:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD16_RELAXED(&storage, v));\n            break;\n        case memory_order_consume:\n        case memory_order_acquire:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD16_ACQUIRE(&storage, v));\n            break;\n        case memory_order_release:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD16_RELEASE(&storage, v));\n            break;\n        case memory_order_acq_rel:\n        case memory_order_seq_cst:\n        default:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD16(&storage, v));\n            break;\n        }\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        switch (order)\n        {\n        case memory_order_relaxed:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE16_RELAXED(&storage, v));\n            break;\n        case memory_order_consume:\n        case memory_order_acquire:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE16_ACQUIRE(&storage, v));\n            break;\n        case memory_order_release:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE16_RELEASE(&storage, v));\n            break;\n        case memory_order_acq_rel:\n        case memory_order_seq_cst:\n        default:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE16(&storage, v));\n            break;\n        }\n        return v;\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_strong(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        storage_type previous = expected, old_val;\n\n        switch (cas_common_order(success_order, failure_order))\n        {\n        case memory_order_relaxed:\n            old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE16_RELAXED(&storage, desired, previous));\n            break;\n        case memory_order_consume:\n        case memory_order_acquire:\n            old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE16_ACQUIRE(&storage, desired, previous));\n            break;\n        case memory_order_release:\n            old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE16_RELEASE(&storage, desired, previous));\n            break;\n        case memory_order_acq_rel:\n        case memory_order_seq_cst:\n        default:\n            old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE16(&storage, desired, previous));\n            break;\n        }\n        expected = old_val;\n\n        return (previous == old_val);\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        switch (order)\n        {\n        case memory_order_relaxed:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND16_RELAXED(&storage, v));\n            break;\n        case memory_order_consume:\n        case memory_order_acquire:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND16_ACQUIRE(&storage, v));\n            break;\n        case memory_order_release:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND16_RELEASE(&storage, v));\n            break;\n        case memory_order_acq_rel:\n        case memory_order_seq_cst:\n        default:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND16(&storage, v));\n            break;\n        }\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        switch (order)\n        {\n        case memory_order_relaxed:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR16_RELAXED(&storage, v));\n            break;\n        case memory_order_consume:\n        case memory_order_acquire:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR16_ACQUIRE(&storage, v));\n            break;\n        case memory_order_release:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR16_RELEASE(&storage, v));\n            break;\n        case memory_order_acq_rel:\n        case memory_order_seq_cst:\n        default:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR16(&storage, v));\n            break;\n        }\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        switch (order)\n        {\n        case memory_order_relaxed:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR16_RELAXED(&storage, v));\n            break;\n        case memory_order_consume:\n        case memory_order_acquire:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR16_ACQUIRE(&storage, v));\n            break;\n        case memory_order_release:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR16_RELEASE(&storage, v));\n            break;\n        case memory_order_acq_rel:\n        case memory_order_seq_cst:\n        default:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR16(&storage, v));\n            break;\n        }\n        return v;\n    }\n};\n\ntemplate< bool Signed >\nstruct operations< 4u, Signed > :\n    public msvc_arm_operations< typename make_storage_type< 4u, Signed >::type, operations< 4u, Signed > >\n{\n    typedef msvc_arm_operations< typename make_storage_type< 4u, Signed >::type, operations< 4u, Signed > > base_type;\n    typedef typename base_type::storage_type storage_type;\n    typedef typename make_storage_type< 4u, Signed >::aligned aligned_storage_type;\n\n    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        base_type::fence_before_store(order);\n        BOOST_ATOMIC_DETAIL_ARM_STORE32(&storage, v);\n        base_type::fence_after_store(order);\n    }\n\n    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type v = BOOST_ATOMIC_DETAIL_ARM_LOAD32(&storage);\n        base_type::fence_after_load(order);\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        switch (order)\n        {\n        case memory_order_relaxed:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD_RELAXED(&storage, v));\n            break;\n        case memory_order_consume:\n        case memory_order_acquire:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD_ACQUIRE(&storage, v));\n            break;\n        case memory_order_release:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD_RELEASE(&storage, v));\n            break;\n        case memory_order_acq_rel:\n        case memory_order_seq_cst:\n        default:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD(&storage, v));\n            break;\n        }\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        switch (order)\n        {\n        case memory_order_relaxed:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_RELAXED(&storage, v));\n            break;\n        case memory_order_consume:\n        case memory_order_acquire:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ACQUIRE(&storage, v));\n            break;\n        case memory_order_release:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_RELEASE(&storage, v));\n            break;\n        case memory_order_acq_rel:\n        case memory_order_seq_cst:\n        default:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE(&storage, v));\n            break;\n        }\n        return v;\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_strong(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        storage_type previous = expected, old_val;\n\n        switch (cas_common_order(success_order, failure_order))\n        {\n        case memory_order_relaxed:\n            old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE_RELAXED(&storage, desired, previous));\n            break;\n        case memory_order_consume:\n        case memory_order_acquire:\n            old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE_ACQUIRE(&storage, desired, previous));\n            break;\n        case memory_order_release:\n            old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE_RELEASE(&storage, desired, previous));\n            break;\n        case memory_order_acq_rel:\n        case memory_order_seq_cst:\n        default:\n            old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE(&storage, desired, previous));\n            break;\n        }\n        expected = old_val;\n\n        return (previous == old_val);\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        switch (order)\n        {\n        case memory_order_relaxed:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND_RELAXED(&storage, v));\n            break;\n        case memory_order_consume:\n        case memory_order_acquire:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND_ACQUIRE(&storage, v));\n            break;\n        case memory_order_release:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND_RELEASE(&storage, v));\n            break;\n        case memory_order_acq_rel:\n        case memory_order_seq_cst:\n        default:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND(&storage, v));\n            break;\n        }\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        switch (order)\n        {\n        case memory_order_relaxed:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR_RELAXED(&storage, v));\n            break;\n        case memory_order_consume:\n        case memory_order_acquire:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR_ACQUIRE(&storage, v));\n            break;\n        case memory_order_release:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR_RELEASE(&storage, v));\n            break;\n        case memory_order_acq_rel:\n        case memory_order_seq_cst:\n        default:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR(&storage, v));\n            break;\n        }\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        switch (order)\n        {\n        case memory_order_relaxed:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR_RELAXED(&storage, v));\n            break;\n        case memory_order_consume:\n        case memory_order_acquire:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR_ACQUIRE(&storage, v));\n            break;\n        case memory_order_release:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR_RELEASE(&storage, v));\n            break;\n        case memory_order_acq_rel:\n        case memory_order_seq_cst:\n        default:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR(&storage, v));\n            break;\n        }\n        return v;\n    }\n};\n\ntemplate< bool Signed >\nstruct operations< 8u, Signed > :\n    public msvc_arm_operations< typename make_storage_type< 8u, Signed >::type, operations< 8u, Signed > >\n{\n    typedef msvc_arm_operations< typename make_storage_type< 8u, Signed >::type, operations< 8u, Signed > > base_type;\n    typedef typename base_type::storage_type storage_type;\n    typedef typename make_storage_type< 8u, Signed >::aligned aligned_storage_type;\n\n    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        base_type::fence_before_store(order);\n        BOOST_ATOMIC_DETAIL_ARM_STORE64(&storage, v);\n        base_type::fence_after_store(order);\n    }\n\n    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type v = BOOST_ATOMIC_DETAIL_ARM_LOAD64(&storage);\n        base_type::fence_after_load(order);\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        switch (order)\n        {\n        case memory_order_relaxed:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD64_RELAXED(&storage, v));\n            break;\n        case memory_order_consume:\n        case memory_order_acquire:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD64_ACQUIRE(&storage, v));\n            break;\n        case memory_order_release:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD64_RELEASE(&storage, v));\n            break;\n        case memory_order_acq_rel:\n        case memory_order_seq_cst:\n        default:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD64(&storage, v));\n            break;\n        }\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        switch (order)\n        {\n        case memory_order_relaxed:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE64_RELAXED(&storage, v));\n            break;\n        case memory_order_consume:\n        case memory_order_acquire:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE64_ACQUIRE(&storage, v));\n            break;\n        case memory_order_release:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE64_RELEASE(&storage, v));\n            break;\n        case memory_order_acq_rel:\n        case memory_order_seq_cst:\n        default:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE64(&storage, v));\n            break;\n        }\n        return v;\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_strong(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        storage_type previous = expected, old_val;\n\n        switch (cas_common_order(success_order, failure_order))\n        {\n        case memory_order_relaxed:\n            old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64_RELAXED(&storage, desired, previous));\n            break;\n        case memory_order_consume:\n        case memory_order_acquire:\n            old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64_ACQUIRE(&storage, desired, previous));\n            break;\n        case memory_order_release:\n            old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64_RELEASE(&storage, desired, previous));\n            break;\n        case memory_order_acq_rel:\n        case memory_order_seq_cst:\n        default:\n            old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64(&storage, desired, previous));\n            break;\n        }\n        expected = old_val;\n\n        return (previous == old_val);\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        switch (order)\n        {\n        case memory_order_relaxed:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND64_RELAXED(&storage, v));\n            break;\n        case memory_order_consume:\n        case memory_order_acquire:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND64_ACQUIRE(&storage, v));\n            break;\n        case memory_order_release:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND64_RELEASE(&storage, v));\n            break;\n        case memory_order_acq_rel:\n        case memory_order_seq_cst:\n        default:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND64(&storage, v));\n            break;\n        }\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        switch (order)\n        {\n        case memory_order_relaxed:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR64_RELAXED(&storage, v));\n            break;\n        case memory_order_consume:\n        case memory_order_acquire:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR64_ACQUIRE(&storage, v));\n            break;\n        case memory_order_release:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR64_RELEASE(&storage, v));\n            break;\n        case memory_order_acq_rel:\n        case memory_order_seq_cst:\n        default:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR64(&storage, v));\n            break;\n        }\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        switch (order)\n        {\n        case memory_order_relaxed:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR64_RELAXED(&storage, v));\n            break;\n        case memory_order_consume:\n        case memory_order_acquire:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR64_ACQUIRE(&storage, v));\n            break;\n        case memory_order_release:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR64_RELEASE(&storage, v));\n            break;\n        case memory_order_acq_rel:\n        case memory_order_seq_cst:\n        default:\n            v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR64(&storage, v));\n            break;\n        }\n        return v;\n    }\n};\n\n\nBOOST_FORCEINLINE void thread_fence(memory_order order) BOOST_NOEXCEPT\n{\n    BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();\n    if (order != memory_order_relaxed)\n        msvc_arm_operations_base::hardware_full_fence();\n    BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();\n}\n\nBOOST_FORCEINLINE void signal_fence(memory_order order) BOOST_NOEXCEPT\n{\n    if (order != memory_order_relaxed)\n        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();\n}\n\n} // namespace detail\n} // namespace atomics\n} // namespace boost\n\n#undef BOOST_ATOMIC_DETAIL_ARM_LOAD8\n#undef BOOST_ATOMIC_DETAIL_ARM_LOAD16\n#undef BOOST_ATOMIC_DETAIL_ARM_LOAD32\n#undef BOOST_ATOMIC_DETAIL_ARM_LOAD64\n#undef BOOST_ATOMIC_DETAIL_ARM_STORE8\n#undef BOOST_ATOMIC_DETAIL_ARM_STORE16\n#undef BOOST_ATOMIC_DETAIL_ARM_STORE32\n#undef BOOST_ATOMIC_DETAIL_ARM_STORE64\n\n#endif // BOOST_ATOMIC_DETAIL_OPS_MSVC_ARM_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/ops_msvc_common.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2009 Helge Bahmann\n * Copyright (c) 2012 Tim Blechmann\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/ops_msvc_common.hpp\n *\n * This header contains common tools for MSVC implementation of the \\c operations template.\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_OPS_MSVC_COMMON_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_OPS_MSVC_COMMON_HPP_INCLUDED_\n\n#include <boost/atomic/detail/config.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\n// Define compiler barriers\n#if defined(__INTEL_COMPILER)\n#define BOOST_ATOMIC_DETAIL_COMPILER_BARRIER() __memory_barrier()\n#elif defined(_MSC_VER) && !defined(_WIN32_WCE)\nextern \"C\" void _ReadWriteBarrier(void);\n#pragma intrinsic(_ReadWriteBarrier)\n#define BOOST_ATOMIC_DETAIL_COMPILER_BARRIER() _ReadWriteBarrier()\n#endif\n\n#ifndef BOOST_ATOMIC_DETAIL_COMPILER_BARRIER\n#define BOOST_ATOMIC_DETAIL_COMPILER_BARRIER()\n#endif\n\n#endif // BOOST_ATOMIC_DETAIL_OPS_MSVC_COMMON_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/ops_msvc_x86.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2009 Helge Bahmann\n * Copyright (c) 2012 Tim Blechmann\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/ops_msvc_x86.hpp\n *\n * This header contains implementation of the \\c operations template.\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_OPS_MSVC_X86_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_OPS_MSVC_X86_HPP_INCLUDED_\n\n#include <boost/memory_order.hpp>\n#include <boost/type_traits/make_signed.hpp>\n#include <boost/atomic/detail/config.hpp>\n#include <boost/atomic/detail/interlocked.hpp>\n#include <boost/atomic/detail/storage_type.hpp>\n#include <boost/atomic/detail/operations_fwd.hpp>\n#include <boost/atomic/capabilities.hpp>\n#if defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B) || defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B)\n#include <boost/cstdint.hpp>\n#include <boost/atomic/detail/ops_cas_based.hpp>\n#endif\n#include <boost/atomic/detail/ops_msvc_common.hpp>\n#if !defined(_M_IX86) && !(defined(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE8) && defined(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE16))\n#include <boost/atomic/detail/ops_extending_cas_based.hpp>\n#endif\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\n#if defined(BOOST_MSVC)\n#pragma warning(push)\n// frame pointer register 'ebx' modified by inline assembly code. See the note below.\n#pragma warning(disable: 4731)\n#endif\n\n#if defined(_MSC_VER) && (defined(_M_AMD64) || (defined(_M_IX86) && defined(_M_IX86_FP) && _M_IX86_FP >= 2))\nextern \"C\" void _mm_mfence(void);\n#if defined(BOOST_MSVC)\n#pragma intrinsic(_mm_mfence)\n#endif\n#endif\n\nnamespace boost {\nnamespace atomics {\nnamespace detail {\n\n/*\n * Implementation note for asm blocks.\n *\n * http://msdn.microsoft.com/en-us/data/k1a8ss06%28v=vs.105%29\n *\n * Some SSE types require eight-byte stack alignment, forcing the compiler to emit dynamic stack-alignment code.\n * To be able to access both the local variables and the function parameters after the alignment, the compiler\n * maintains two frame pointers. If the compiler performs frame pointer omission (FPO), it will use EBP and ESP.\n * If the compiler does not perform FPO, it will use EBX and EBP. To ensure code runs correctly, do not modify EBX\n * in asm code if the function requires dynamic stack alignment as it could modify the frame pointer.\n * Either move the eight-byte aligned types out of the function, or avoid using EBX.\n *\n * Since we have no way of knowing that the compiler uses FPO, we have to always save and restore ebx\n * whenever we have to clobber it. Additionally, we disable warning C4731 above so that the compiler\n * doesn't spam about ebx use.\n */\n\nstruct msvc_x86_operations_base\n{\n    static BOOST_FORCEINLINE void hardware_full_fence() BOOST_NOEXCEPT\n    {\n#if defined(_MSC_VER) && (defined(_M_AMD64) || (defined(_M_IX86) && defined(_M_IX86_FP) && _M_IX86_FP >= 2))\n        // Use mfence only if SSE2 is available\n        _mm_mfence();\n#else\n        long tmp;\n        BOOST_ATOMIC_INTERLOCKED_EXCHANGE(&tmp, 0);\n#endif\n    }\n\n    static BOOST_FORCEINLINE void fence_before(memory_order) BOOST_NOEXCEPT\n    {\n        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();\n    }\n\n    static BOOST_FORCEINLINE void fence_after(memory_order) BOOST_NOEXCEPT\n    {\n        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();\n    }\n\n    static BOOST_FORCEINLINE void fence_after_load(memory_order) BOOST_NOEXCEPT\n    {\n        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();\n\n        // On x86 and x86_64 there is no need for a hardware barrier,\n        // even if seq_cst memory order is requested, because all\n        // seq_cst writes are implemented with lock-prefixed operations\n        // or xchg which has implied lock prefix. Therefore normal loads\n        // are already ordered with seq_cst stores on these architectures.\n    }\n};\n\ntemplate< typename T, typename Derived >\nstruct msvc_x86_operations :\n    public msvc_x86_operations_base\n{\n    typedef T storage_type;\n\n    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        if (order != memory_order_seq_cst)\n        {\n            fence_before(order);\n            storage = v;\n            fence_after(order);\n        }\n        else\n        {\n            Derived::exchange(storage, v, order);\n        }\n    }\n\n    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type v = storage;\n        fence_after_load(order);\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        typedef typename make_signed< storage_type >::type signed_storage_type;\n        return Derived::fetch_add(storage, static_cast< storage_type >(-static_cast< signed_storage_type >(v)), order);\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_weak(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        return Derived::compare_exchange_strong(storage, expected, desired, success_order, failure_order);\n    }\n\n    static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        return !!Derived::exchange(storage, (storage_type)1, order);\n    }\n\n    static BOOST_FORCEINLINE void clear(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        store(storage, (storage_type)0, order);\n    }\n\n    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT\n    {\n        return true;\n    }\n};\n\ntemplate< bool Signed >\nstruct operations< 4u, Signed > :\n    public msvc_x86_operations< typename make_storage_type< 4u, Signed >::type, operations< 4u, Signed > >\n{\n    typedef msvc_x86_operations< typename make_storage_type< 4u, Signed >::type, operations< 4u, Signed > > base_type;\n    typedef typename base_type::storage_type storage_type;\n    typedef typename make_storage_type< 4u, Signed >::aligned aligned_storage_type;\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD(&storage, v));\n    }\n\n    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE(&storage, v));\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_strong(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order) BOOST_NOEXCEPT\n    {\n        storage_type previous = expected;\n        storage_type old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE(&storage, desired, previous));\n        expected = old_val;\n        return (previous == old_val);\n    }\n\n#if defined(BOOST_ATOMIC_INTERLOCKED_AND)\n    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND(&storage, v));\n    }\n#else\n    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type res = storage;\n        while (!compare_exchange_strong(storage, res, res & v, order, memory_order_relaxed)) {}\n        return res;\n    }\n#endif\n\n#if defined(BOOST_ATOMIC_INTERLOCKED_OR)\n    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR(&storage, v));\n    }\n#else\n    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type res = storage;\n        while (!compare_exchange_strong(storage, res, res | v, order, memory_order_relaxed)) {}\n        return res;\n    }\n#endif\n\n#if defined(BOOST_ATOMIC_INTERLOCKED_XOR)\n    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR(&storage, v));\n    }\n#else\n    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        storage_type res = storage;\n        while (!compare_exchange_strong(storage, res, res ^ v, order, memory_order_relaxed)) {}\n        return res;\n    }\n#endif\n};\n\n#if defined(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE8)\n\ntemplate< bool Signed >\nstruct operations< 1u, Signed > :\n    public msvc_x86_operations< typename make_storage_type< 1u, Signed >::type, operations< 1u, Signed > >\n{\n    typedef msvc_x86_operations< typename make_storage_type< 1u, Signed >::type, operations< 1u, Signed > > base_type;\n    typedef typename base_type::storage_type storage_type;\n    typedef typename make_storage_type< 1u, Signed >::aligned aligned_storage_type;\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD8(&storage, v));\n    }\n\n    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE8(&storage, v));\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_strong(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order) BOOST_NOEXCEPT\n    {\n        storage_type previous = expected;\n        storage_type old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE8(&storage, desired, previous));\n        expected = old_val;\n        return (previous == old_val);\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND8(&storage, v));\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR8(&storage, v));\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR8(&storage, v));\n    }\n};\n\n#elif defined(_M_IX86)\n\ntemplate< bool Signed >\nstruct operations< 1u, Signed > :\n    public msvc_x86_operations< typename make_storage_type< 1u, Signed >::type, operations< 1u, Signed > >\n{\n    typedef msvc_x86_operations< typename make_storage_type< 1u, Signed >::type, operations< 1u, Signed > > base_type;\n    typedef typename base_type::storage_type storage_type;\n    typedef typename make_storage_type< 1u, Signed >::aligned aligned_storage_type;\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        base_type::fence_before(order);\n        __asm\n        {\n            mov edx, storage\n            movzx eax, v\n            lock xadd byte ptr [edx], al\n            mov v, al\n        };\n        base_type::fence_after(order);\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        base_type::fence_before(order);\n        __asm\n        {\n            mov edx, storage\n            movzx eax, v\n            xchg byte ptr [edx], al\n            mov v, al\n        };\n        base_type::fence_after(order);\n        return v;\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_strong(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order) BOOST_NOEXCEPT\n    {\n        base_type::fence_before(success_order);\n        bool success;\n        __asm\n        {\n            mov esi, expected\n            mov edi, storage\n            movzx eax, byte ptr [esi]\n            movzx edx, desired\n            lock cmpxchg byte ptr [edi], dl\n            mov byte ptr [esi], al\n            sete success\n        };\n        // The success and failure fences are equivalent anyway\n        base_type::fence_after(success_order);\n        return success;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        base_type::fence_before(order);\n        int backup;\n        __asm\n        {\n            mov backup, ebx\n            xor edx, edx\n            mov edi, storage\n            movzx ebx, v\n            movzx eax, byte ptr [edi]\n            align 16\n        again:\n            mov dl, al\n            and dl, bl\n            lock cmpxchg byte ptr [edi], dl\n            jne again\n            mov v, al\n            mov ebx, backup\n        };\n        base_type::fence_after(order);\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        base_type::fence_before(order);\n        int backup;\n        __asm\n        {\n            mov backup, ebx\n            xor edx, edx\n            mov edi, storage\n            movzx ebx, v\n            movzx eax, byte ptr [edi]\n            align 16\n        again:\n            mov dl, al\n            or dl, bl\n            lock cmpxchg byte ptr [edi], dl\n            jne again\n            mov v, al\n            mov ebx, backup\n        };\n        base_type::fence_after(order);\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        base_type::fence_before(order);\n        int backup;\n        __asm\n        {\n            mov backup, ebx\n            xor edx, edx\n            mov edi, storage\n            movzx ebx, v\n            movzx eax, byte ptr [edi]\n            align 16\n        again:\n            mov dl, al\n            xor dl, bl\n            lock cmpxchg byte ptr [edi], dl\n            jne again\n            mov v, al\n            mov ebx, backup\n        };\n        base_type::fence_after(order);\n        return v;\n    }\n};\n\n#else\n\ntemplate< bool Signed >\nstruct operations< 1u, Signed > :\n    public extending_cas_based_operations< operations< 4u, Signed >, 1u, Signed >\n{\n};\n\n#endif\n\n#if defined(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE16)\n\ntemplate< bool Signed >\nstruct operations< 2u, Signed > :\n    public msvc_x86_operations< typename make_storage_type< 2u, Signed >::type, operations< 2u, Signed > >\n{\n    typedef msvc_x86_operations< typename make_storage_type< 2u, Signed >::type, operations< 2u, Signed > > base_type;\n    typedef typename base_type::storage_type storage_type;\n    typedef typename make_storage_type< 2u, Signed >::aligned aligned_storage_type;\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD16(&storage, v));\n    }\n\n    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE16(&storage, v));\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_strong(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order) BOOST_NOEXCEPT\n    {\n        storage_type previous = expected;\n        storage_type old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE16(&storage, desired, previous));\n        expected = old_val;\n        return (previous == old_val);\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND16(&storage, v));\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR16(&storage, v));\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR16(&storage, v));\n    }\n};\n\n#elif defined(_M_IX86)\n\ntemplate< bool Signed >\nstruct operations< 2u, Signed > :\n    public msvc_x86_operations< typename make_storage_type< 2u, Signed >::type, operations< 2u, Signed > >\n{\n    typedef msvc_x86_operations< typename make_storage_type< 2u, Signed >::type, operations< 2u, Signed > > base_type;\n    typedef typename base_type::storage_type storage_type;\n    typedef typename make_storage_type< 2u, Signed >::aligned aligned_storage_type;\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        base_type::fence_before(order);\n        __asm\n        {\n            mov edx, storage\n            movzx eax, v\n            lock xadd word ptr [edx], ax\n            mov v, ax\n        };\n        base_type::fence_after(order);\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        base_type::fence_before(order);\n        __asm\n        {\n            mov edx, storage\n            movzx eax, v\n            xchg word ptr [edx], ax\n            mov v, ax\n        };\n        base_type::fence_after(order);\n        return v;\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_strong(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order) BOOST_NOEXCEPT\n    {\n        base_type::fence_before(success_order);\n        bool success;\n        __asm\n        {\n            mov esi, expected\n            mov edi, storage\n            movzx eax, word ptr [esi]\n            movzx edx, desired\n            lock cmpxchg word ptr [edi], dx\n            mov word ptr [esi], ax\n            sete success\n        };\n        // The success and failure fences are equivalent anyway\n        base_type::fence_after(success_order);\n        return success;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        base_type::fence_before(order);\n        int backup;\n        __asm\n        {\n            mov backup, ebx\n            xor edx, edx\n            mov edi, storage\n            movzx ebx, v\n            movzx eax, word ptr [edi]\n            align 16\n        again:\n            mov dx, ax\n            and dx, bx\n            lock cmpxchg word ptr [edi], dx\n            jne again\n            mov v, ax\n            mov ebx, backup\n        };\n        base_type::fence_after(order);\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        base_type::fence_before(order);\n        int backup;\n        __asm\n        {\n            mov backup, ebx\n            xor edx, edx\n            mov edi, storage\n            movzx ebx, v\n            movzx eax, word ptr [edi]\n            align 16\n        again:\n            mov dx, ax\n            or dx, bx\n            lock cmpxchg word ptr [edi], dx\n            jne again\n            mov v, ax\n            mov ebx, backup\n        };\n        base_type::fence_after(order);\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        base_type::fence_before(order);\n        int backup;\n        __asm\n        {\n            mov backup, ebx\n            xor edx, edx\n            mov edi, storage\n            movzx ebx, v\n            movzx eax, word ptr [edi]\n            align 16\n        again:\n            mov dx, ax\n            xor dx, bx\n            lock cmpxchg word ptr [edi], dx\n            jne again\n            mov v, ax\n            mov ebx, backup\n        };\n        base_type::fence_after(order);\n        return v;\n    }\n};\n\n#else\n\ntemplate< bool Signed >\nstruct operations< 2u, Signed > :\n    public extending_cas_based_operations< operations< 4u, Signed >, 2u, Signed >\n{\n};\n\n#endif\n\n\n#if defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B)\n\ntemplate< bool Signed >\nstruct msvc_dcas_x86\n{\n    typedef typename make_storage_type< 8u, Signed >::type storage_type;\n    typedef typename make_storage_type< 8u, Signed >::aligned aligned_storage_type;\n\n    // Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 3A, 8.1.1. Guaranteed Atomic Operations:\n    //\n    // The Pentium processor (and newer processors since) guarantees that the following additional memory operations will always be carried out atomically:\n    // * Reading or writing a quadword aligned on a 64-bit boundary\n    //\n    // Luckily, the memory is almost always 8-byte aligned in our case because atomic<> uses 64 bit native types for storage and dynamic memory allocations\n    // have at least 8 byte alignment. The only unfortunate case is when atomic is placed on the stack and it is not 8-byte aligned (like on 32 bit Windows).\n\n    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();\n\n        storage_type volatile* p = &storage;\n        if (((uint32_t)p & 0x00000007) == 0)\n        {\n#if defined(_M_IX86_FP) && _M_IX86_FP >= 2\n#if defined(__AVX__)\n            __asm\n            {\n                mov edx, p\n                vmovq xmm4, v\n                vmovq qword ptr [edx], xmm4\n            };\n#else\n            __asm\n            {\n                mov edx, p\n                movq xmm4, v\n                movq qword ptr [edx], xmm4\n            };\n#endif\n#else\n            __asm\n            {\n                mov edx, p\n                fild v\n                fistp qword ptr [edx]\n            };\n#endif\n        }\n        else\n        {\n            int backup;\n            __asm\n            {\n                mov backup, ebx\n                mov edi, p\n                mov ebx, dword ptr [v]\n                mov ecx, dword ptr [v + 4]\n                mov eax, dword ptr [edi]\n                mov edx, dword ptr [edi + 4]\n                align 16\n            again:\n                lock cmpxchg8b qword ptr [edi]\n                jne again\n                mov ebx, backup\n            };\n        }\n\n        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();\n    }\n\n    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order) BOOST_NOEXCEPT\n    {\n        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();\n\n        storage_type const volatile* p = &storage;\n        storage_type value;\n\n        if (((uint32_t)p & 0x00000007) == 0)\n        {\n#if defined(_M_IX86_FP) && _M_IX86_FP >= 2\n#if defined(__AVX__)\n            __asm\n            {\n                mov edx, p\n                vmovq xmm4, qword ptr [edx]\n                vmovq value, xmm4\n            };\n#else\n            __asm\n            {\n                mov edx, p\n                movq xmm4, qword ptr [edx]\n                movq value, xmm4\n            };\n#endif\n#else\n            __asm\n            {\n                mov edx, p\n                fild qword ptr [edx]\n                fistp value\n            };\n#endif\n        }\n        else\n        {\n            // We don't care for comparison result here; the previous value will be stored into value anyway.\n            // Also we don't care for ebx and ecx values, they just have to be equal to eax and edx before cmpxchg8b.\n            __asm\n            {\n                mov edi, p\n                mov eax, ebx\n                mov edx, ecx\n                lock cmpxchg8b qword ptr [edi]\n                mov dword ptr [value], eax\n                mov dword ptr [value + 4], edx\n            };\n        }\n\n        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();\n\n        return value;\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_strong(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order) BOOST_NOEXCEPT\n    {\n        // MSVC-11 in 32-bit mode sometimes generates messed up code without compiler barriers,\n        // even though the _InterlockedCompareExchange64 intrinsic already provides one.\n        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();\n\n        storage_type volatile* p = &storage;\n#if defined(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64)\n        const storage_type old_val = (storage_type)BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64(p, desired, expected);\n        const bool result = (old_val == expected);\n        expected = old_val;\n#else\n        bool result;\n        int backup;\n        __asm\n        {\n            mov backup, ebx\n            mov edi, p\n            mov esi, expected\n            mov ebx, dword ptr [desired]\n            mov ecx, dword ptr [desired + 4]\n            mov eax, dword ptr [esi]\n            mov edx, dword ptr [esi + 4]\n            lock cmpxchg8b qword ptr [edi]\n            mov dword ptr [esi], eax\n            mov dword ptr [esi + 4], edx\n            mov ebx, backup\n            sete result\n        };\n#endif\n        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();\n\n        return result;\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_weak(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        return compare_exchange_strong(storage, expected, desired, success_order, failure_order);\n    }\n\n    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();\n\n        storage_type volatile* p = &storage;\n        int backup;\n        __asm\n        {\n            mov backup, ebx\n            mov edi, p\n            mov ebx, dword ptr [v]\n            mov ecx, dword ptr [v + 4]\n            mov eax, dword ptr [edi]\n            mov edx, dword ptr [edi + 4]\n            align 16\n        again:\n            lock cmpxchg8b qword ptr [edi]\n            jne again\n            mov ebx, backup\n            mov dword ptr [v], eax\n            mov dword ptr [v + 4], edx\n        };\n\n        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();\n\n        return v;\n    }\n\n    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT\n    {\n        return true;\n    }\n};\n\ntemplate< bool Signed >\nstruct operations< 8u, Signed > :\n    public cas_based_operations< msvc_dcas_x86< Signed > >\n{\n};\n\n#elif defined(_M_AMD64)\n\ntemplate< bool Signed >\nstruct operations< 8u, Signed > :\n    public msvc_x86_operations< typename make_storage_type< 8u, Signed >::type, operations< 8u, Signed > >\n{\n    typedef msvc_x86_operations< typename make_storage_type< 8u, Signed >::type, operations< 8u, Signed > > base_type;\n    typedef typename base_type::storage_type storage_type;\n    typedef typename make_storage_type< 8u, Signed >::aligned aligned_storage_type;\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD64(&storage, v));\n    }\n\n    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE64(&storage, v));\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_strong(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order) BOOST_NOEXCEPT\n    {\n        storage_type previous = expected;\n        storage_type old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64(&storage, desired, previous));\n        expected = old_val;\n        return (previous == old_val);\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND64(&storage, v));\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR64(&storage, v));\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        return static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR64(&storage, v));\n    }\n};\n\n#endif\n\n#if defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B)\n\ntemplate< bool Signed >\nstruct msvc_dcas_x86_64\n{\n    typedef typename make_storage_type< 16u, Signed >::type storage_type;\n    typedef typename make_storage_type< 16u, Signed >::aligned aligned_storage_type;\n\n    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order) BOOST_NOEXCEPT\n    {\n        storage_type value = const_cast< storage_type& >(storage);\n        while (!BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE128(&storage, v, &value)) {}\n    }\n\n    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order) BOOST_NOEXCEPT\n    {\n        storage_type value = storage_type();\n        BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE128(&storage, value, &value);\n        return value;\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_strong(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order, memory_order) BOOST_NOEXCEPT\n    {\n        return !!BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE128(&storage, desired, &expected);\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_weak(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        return compare_exchange_strong(storage, expected, desired, success_order, failure_order);\n    }\n\n    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT\n    {\n        return true;\n    }\n};\n\ntemplate< bool Signed >\nstruct operations< 16u, Signed > :\n    public cas_based_operations< cas_based_exchange< msvc_dcas_x86_64< Signed > > >\n{\n};\n\n#endif // defined(BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B)\n\nBOOST_FORCEINLINE void thread_fence(memory_order order) BOOST_NOEXCEPT\n{\n    BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();\n    if (order == memory_order_seq_cst)\n        msvc_x86_operations_base::hardware_full_fence();\n    BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();\n}\n\nBOOST_FORCEINLINE void signal_fence(memory_order order) BOOST_NOEXCEPT\n{\n    if (order != memory_order_relaxed)\n        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();\n}\n\n} // namespace detail\n} // namespace atomics\n} // namespace boost\n\n#if defined(BOOST_MSVC)\n#pragma warning(pop)\n#endif\n\n#endif // BOOST_ATOMIC_DETAIL_OPS_MSVC_X86_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/ops_windows.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2009 Helge Bahmann\n * Copyright (c) 2012 Tim Blechmann\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/ops_windows.hpp\n *\n * This header contains implementation of the \\c operations template.\n *\n * This implementation is the most basic version for Windows. It should\n * work for any non-MSVC-like compilers as long as there are Interlocked WinAPI\n * functions available. This version is also used for WinCE.\n *\n * Notably, this implementation is not as efficient as other\n * versions based on compiler intrinsics.\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_OPS_WINDOWS_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_OPS_WINDOWS_HPP_INCLUDED_\n\n#include <boost/memory_order.hpp>\n#include <boost/type_traits/make_signed.hpp>\n#include <boost/atomic/detail/config.hpp>\n#include <boost/atomic/detail/interlocked.hpp>\n#include <boost/atomic/detail/storage_type.hpp>\n#include <boost/atomic/detail/operations_fwd.hpp>\n#include <boost/atomic/capabilities.hpp>\n#include <boost/atomic/detail/ops_msvc_common.hpp>\n#include <boost/atomic/detail/ops_extending_cas_based.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\nnamespace boost {\nnamespace atomics {\nnamespace detail {\n\nstruct windows_operations_base\n{\n    static BOOST_FORCEINLINE void hardware_full_fence() BOOST_NOEXCEPT\n    {\n        long tmp;\n        BOOST_ATOMIC_INTERLOCKED_EXCHANGE(&tmp, 0);\n    }\n\n    static BOOST_FORCEINLINE void fence_before(memory_order) BOOST_NOEXCEPT\n    {\n        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();\n    }\n\n    static BOOST_FORCEINLINE void fence_after(memory_order) BOOST_NOEXCEPT\n    {\n        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();\n    }\n};\n\ntemplate< typename T, typename Derived >\nstruct windows_operations :\n    public windows_operations_base\n{\n    typedef T storage_type;\n\n    static BOOST_FORCEINLINE void store(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        Derived::exchange(storage, v, order);\n    }\n\n    static BOOST_FORCEINLINE storage_type load(storage_type const volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        return Derived::fetch_add(const_cast< storage_type volatile& >(storage), (storage_type)0, order);\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_sub(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        typedef typename make_signed< storage_type >::type signed_storage_type;\n        return Derived::fetch_add(storage, static_cast< storage_type >(-static_cast< signed_storage_type >(v)), order);\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_weak(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        return Derived::compare_exchange_strong(storage, expected, desired, success_order, failure_order);\n    }\n\n    static BOOST_FORCEINLINE bool test_and_set(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        return !!Derived::exchange(storage, (storage_type)1, order);\n    }\n\n    static BOOST_FORCEINLINE void clear(storage_type volatile& storage, memory_order order) BOOST_NOEXCEPT\n    {\n        store(storage, (storage_type)0, order);\n    }\n\n    static BOOST_FORCEINLINE bool is_lock_free(storage_type const volatile&) BOOST_NOEXCEPT\n    {\n        return true;\n    }\n};\n\ntemplate< bool Signed >\nstruct operations< 4u, Signed > :\n    public windows_operations< typename make_storage_type< 4u, Signed >::type, operations< 4u, Signed > >\n{\n    typedef windows_operations< typename make_storage_type< 4u, Signed >::type, operations< 4u, Signed > > base_type;\n    typedef typename base_type::storage_type storage_type;\n    typedef typename make_storage_type< 4u, Signed >::aligned aligned_storage_type;\n\n    static BOOST_FORCEINLINE storage_type fetch_add(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        base_type::fence_before(order);\n        v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD(&storage, v));\n        base_type::fence_after(order);\n        return v;\n    }\n\n    static BOOST_FORCEINLINE storage_type exchange(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n        base_type::fence_before(order);\n        v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE(&storage, v));\n        base_type::fence_after(order);\n        return v;\n    }\n\n    static BOOST_FORCEINLINE bool compare_exchange_strong(\n        storage_type volatile& storage, storage_type& expected, storage_type desired, memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT\n    {\n        storage_type previous = expected;\n        base_type::fence_before(success_order);\n        storage_type old_val = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE(&storage, desired, previous));\n        expected = old_val;\n        // The success and failure fences are the same anyway\n        base_type::fence_after(success_order);\n        return (previous == old_val);\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_and(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n#if defined(BOOST_ATOMIC_INTERLOCKED_AND)\n        base_type::fence_before(order);\n        v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_AND(&storage, v));\n        base_type::fence_after(order);\n        return v;\n#else\n        storage_type res = storage;\n        while (!compare_exchange_strong(storage, res, res & v, order, memory_order_relaxed)) {}\n        return res;\n#endif\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_or(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n#if defined(BOOST_ATOMIC_INTERLOCKED_OR)\n        base_type::fence_before(order);\n        v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_OR(&storage, v));\n        base_type::fence_after(order);\n        return v;\n#else\n        storage_type res = storage;\n        while (!compare_exchange_strong(storage, res, res | v, order, memory_order_relaxed)) {}\n        return res;\n#endif\n    }\n\n    static BOOST_FORCEINLINE storage_type fetch_xor(storage_type volatile& storage, storage_type v, memory_order order) BOOST_NOEXCEPT\n    {\n#if defined(BOOST_ATOMIC_INTERLOCKED_XOR)\n        base_type::fence_before(order);\n        v = static_cast< storage_type >(BOOST_ATOMIC_INTERLOCKED_XOR(&storage, v));\n        base_type::fence_after(order);\n        return v;\n#else\n        storage_type res = storage;\n        while (!compare_exchange_strong(storage, res, res ^ v, order, memory_order_relaxed)) {}\n        return res;\n#endif\n    }\n};\n\ntemplate< bool Signed >\nstruct operations< 1u, Signed > :\n    public extending_cas_based_operations< operations< 4u, Signed >, 1u, Signed >\n{\n};\n\ntemplate< bool Signed >\nstruct operations< 2u, Signed > :\n    public extending_cas_based_operations< operations< 4u, Signed >, 2u, Signed >\n{\n};\n\nBOOST_FORCEINLINE void thread_fence(memory_order order) BOOST_NOEXCEPT\n{\n    BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();\n    if (order == memory_order_seq_cst)\n        windows_operations_base::hardware_full_fence();\n    BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();\n}\n\nBOOST_FORCEINLINE void signal_fence(memory_order order) BOOST_NOEXCEPT\n{\n    if (order != memory_order_relaxed)\n        BOOST_ATOMIC_DETAIL_COMPILER_BARRIER();\n}\n\n} // namespace detail\n} // namespace atomics\n} // namespace boost\n\n#endif // BOOST_ATOMIC_DETAIL_OPS_WINDOWS_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/pause.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n *    (See accompanying file LICENSE_1_0.txt or copy at\n *          http://www.boost.org/LICENSE_1_0.txt)\n *\n * (C) Copyright 2013 Tim Blechmann\n * (C) Copyright 2013 Andrey Semashev\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_PAUSE_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_PAUSE_HPP_INCLUDED_\n\n#include <boost/atomic/detail/config.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\n#if defined(_MSC_VER) && (defined(_M_AMD64) || defined(_M_IX86))\nextern \"C\" void _mm_pause(void);\n#if defined(BOOST_MSVC)\n#pragma intrinsic(_mm_pause)\n#endif\n#endif\n\nnamespace boost {\nnamespace atomics {\nnamespace detail {\n\nBOOST_FORCEINLINE void pause() BOOST_NOEXCEPT\n{\n#if defined(_MSC_VER) && (defined(_M_AMD64) || defined(_M_IX86))\n    _mm_pause();\n#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))\n    __asm__ __volatile__(\"pause;\");\n#endif\n}\n\n} // namespace detail\n} // namespace atomics\n} // namespace boost\n\n#endif // BOOST_ATOMIC_DETAIL_PAUSE_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/platform.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2009 Helge Bahmann\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/platform.hpp\n *\n * This header defines macros for the target platform detection\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_PLATFORM_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_PLATFORM_HPP_INCLUDED_\n\n#include <boost/atomic/detail/config.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\n#if !defined(BOOST_ATOMIC_FORCE_FALLBACK)\n\n// Compiler-based backends\n#if (defined(__ibmxl__) || defined(__IBMCPP__)) && defined(__PPC__)\n\n// IBM XL C++ Compiler has to be checked before GCC/Clang as it pretends to be one but does not support __atomic* intrinsics.\n// It does support GCC inline assembler though.\n#define BOOST_ATOMIC_DETAIL_PLATFORM gcc_ppc\n\n#elif ((defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 407)) ||\\\n    (defined(BOOST_CLANG) && ((__clang_major__ * 100 + __clang_minor__) >= 302))) &&\\\n    (\\\n        (__GCC_ATOMIC_BOOL_LOCK_FREE + 0) == 2 ||\\\n        (__GCC_ATOMIC_CHAR_LOCK_FREE + 0) == 2 ||\\\n        (__GCC_ATOMIC_SHORT_LOCK_FREE + 0) == 2 ||\\\n        (__GCC_ATOMIC_INT_LOCK_FREE + 0) == 2 ||\\\n        (__GCC_ATOMIC_LONG_LOCK_FREE + 0) == 2 ||\\\n        (__GCC_ATOMIC_LLONG_LOCK_FREE + 0) == 2\\\n    )\n\n#define BOOST_ATOMIC_DETAIL_PLATFORM gcc_atomic\n\n#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))\n\n#define BOOST_ATOMIC_DETAIL_PLATFORM gcc_x86\n\n#elif defined(__GNUC__) && (defined(__POWERPC__) || defined(__PPC__))\n\n#define BOOST_ATOMIC_DETAIL_PLATFORM gcc_ppc\n\n// This list of ARM architecture versions comes from Apple's arm/arch.h header.\n// I don't know how complete it is.\n#elif defined(__GNUC__) &&\\\n    (\\\n        defined(__ARM_ARCH_6__)  || defined(__ARM_ARCH_6J__) ||\\\n        defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) ||\\\n        defined(__ARM_ARCH_6ZK__) ||\\\n        defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) ||\\\n        defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) ||\\\n        defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_7S__)\\\n    )\n\n#define BOOST_ATOMIC_DETAIL_PLATFORM gcc_arm\n\n#elif defined(__GNUC__) && defined(__sparc_v9__)\n\n#define BOOST_ATOMIC_DETAIL_PLATFORM gcc_sparc\n\n#elif defined(__GNUC__) && defined(__alpha__)\n\n#define BOOST_ATOMIC_DETAIL_PLATFORM gcc_alpha\n\n#elif defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 401) &&\\\n    (\\\n        defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1) ||\\\n        defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2) ||\\\n        defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) ||\\\n        defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8) ||\\\n        defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16)\\\n    )\n\n#define BOOST_ATOMIC_DETAIL_PLATFORM gcc_sync\n\n#elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))\n\n#define BOOST_ATOMIC_DETAIL_PLATFORM msvc_x86\n\n#elif defined(_MSC_VER) && _MSC_VER >= 1700 && defined(_M_ARM)\n\n#define BOOST_ATOMIC_DETAIL_PLATFORM msvc_arm\n\n#endif\n\n// OS-based backends\n#if !defined(BOOST_ATOMIC_DETAIL_PLATFORM)\n\n#if defined(__linux__) && defined(__arm__)\n\n#define BOOST_ATOMIC_DETAIL_PLATFORM linux_arm\n\n#elif defined(BOOST_WINDOWS) || defined(_WIN32_CE)\n\n#define BOOST_ATOMIC_DETAIL_PLATFORM windows\n\n#endif\n\n#endif // !defined(BOOST_ATOMIC_DETAIL_PLATFORM)\n\n#endif // !defined(BOOST_ATOMIC_FORCE_FALLBACK)\n\n#if !defined(BOOST_ATOMIC_DETAIL_PLATFORM)\n#define BOOST_ATOMIC_DETAIL_PLATFORM emulated\n#define BOOST_ATOMIC_EMULATED\n#endif\n\n#define BOOST_ATOMIC_DETAIL_HEADER(prefix) <BOOST_JOIN(prefix, BOOST_ATOMIC_DETAIL_PLATFORM).hpp>\n\n#endif // BOOST_ATOMIC_DETAIL_PLATFORM_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/detail/storage_type.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2009 Helge Bahmann\n * Copyright (c) 2012 Tim Blechmann\n * Copyright (c) 2013 - 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/detail/storage_type.hpp\n *\n * This header defines underlying types used as storage\n */\n\n#ifndef BOOST_ATOMIC_DETAIL_STORAGE_TYPE_HPP_INCLUDED_\n#define BOOST_ATOMIC_DETAIL_STORAGE_TYPE_HPP_INCLUDED_\n\n#include <cstddef>\n#include <boost/cstdint.hpp>\n#include <boost/atomic/detail/config.hpp>\n#if !defined(BOOST_ATOMIC_DETAIL_HAS_BUILTIN_MEMCMP) || !defined(BOOST_ATOMIC_DETAIL_HAS_BUILTIN_MEMCPY)\n#include <cstring>\n#endif\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\nnamespace boost {\nnamespace atomics {\nnamespace detail {\n\ntemplate< typename T >\nBOOST_FORCEINLINE void non_atomic_load(T const volatile& from, T& to) BOOST_NOEXCEPT\n{\n    to = from;\n}\n\ntemplate< std::size_t Size >\nstruct buffer_storage\n{\n    BOOST_ALIGNMENT(16) unsigned char data[Size];\n\n    BOOST_FORCEINLINE bool operator! () const BOOST_NOEXCEPT\n    {\n        return (data[0] == 0u && BOOST_ATOMIC_DETAIL_MEMCMP(data, data + 1, Size - 1) == 0);\n    }\n\n    BOOST_FORCEINLINE bool operator== (buffer_storage const& that) const BOOST_NOEXCEPT\n    {\n        return BOOST_ATOMIC_DETAIL_MEMCMP(data, that.data, Size) == 0;\n    }\n\n    BOOST_FORCEINLINE bool operator!= (buffer_storage const& that) const BOOST_NOEXCEPT\n    {\n        return BOOST_ATOMIC_DETAIL_MEMCMP(data, that.data, Size) != 0;\n    }\n};\n\ntemplate< std::size_t Size >\nBOOST_FORCEINLINE void non_atomic_load(buffer_storage< Size > const volatile& from, buffer_storage< Size >& to) BOOST_NOEXCEPT\n{\n    BOOST_ATOMIC_DETAIL_MEMCPY(to.data, const_cast< unsigned char const* >(from.data), Size);\n}\n\ntemplate< std::size_t Size, bool Signed >\nstruct make_storage_type\n{\n    typedef buffer_storage< Size > type;\n\n    struct aligned\n    {\n        type value;\n\n        BOOST_DEFAULTED_FUNCTION(aligned(), {})\n        BOOST_FORCEINLINE BOOST_CONSTEXPR explicit aligned(type const& v) BOOST_NOEXCEPT : value(v) {}\n    };\n};\n\ntemplate< >\nstruct make_storage_type< 1u, false >\n{\n    typedef boost::uint8_t type;\n\n    struct aligned\n    {\n        type value;\n\n        BOOST_DEFAULTED_FUNCTION(aligned(), {})\n        BOOST_FORCEINLINE BOOST_CONSTEXPR explicit aligned(type v) BOOST_NOEXCEPT : value(v) {}\n    };\n};\n\ntemplate< >\nstruct make_storage_type< 1u, true >\n{\n    typedef boost::int8_t type;\n\n    struct aligned\n    {\n        type value;\n\n        BOOST_DEFAULTED_FUNCTION(aligned(), {})\n        BOOST_FORCEINLINE BOOST_CONSTEXPR explicit aligned(type v) BOOST_NOEXCEPT : value(v) {}\n    };\n};\n\ntemplate< >\nstruct make_storage_type< 2u, false >\n{\n    typedef boost::uint16_t type;\n\n    struct aligned\n    {\n        BOOST_ALIGNMENT(2) type value;\n\n        BOOST_DEFAULTED_FUNCTION(aligned(), {})\n        BOOST_FORCEINLINE BOOST_CONSTEXPR explicit aligned(type v) BOOST_NOEXCEPT : value(v) {}\n    };\n};\n\ntemplate< >\nstruct make_storage_type< 2u, true >\n{\n    typedef boost::int16_t type;\n\n    struct aligned\n    {\n        BOOST_ALIGNMENT(2) type value;\n\n        BOOST_DEFAULTED_FUNCTION(aligned(), {})\n        BOOST_FORCEINLINE BOOST_CONSTEXPR explicit aligned(type v) BOOST_NOEXCEPT : value(v) {}\n    };\n};\n\ntemplate< >\nstruct make_storage_type< 4u, false >\n{\n    typedef boost::uint32_t type;\n\n    struct aligned\n    {\n        BOOST_ALIGNMENT(4) type value;\n\n        BOOST_DEFAULTED_FUNCTION(aligned(), {})\n        BOOST_FORCEINLINE BOOST_CONSTEXPR explicit aligned(type v) BOOST_NOEXCEPT : value(v) {}\n    };\n};\n\ntemplate< >\nstruct make_storage_type< 4u, true >\n{\n    typedef boost::int32_t type;\n\n    struct aligned\n    {\n        BOOST_ALIGNMENT(4) type value;\n\n        BOOST_DEFAULTED_FUNCTION(aligned(), {})\n        BOOST_FORCEINLINE BOOST_CONSTEXPR explicit aligned(type v) BOOST_NOEXCEPT : value(v) {}\n    };\n};\n\ntemplate< >\nstruct make_storage_type< 8u, false >\n{\n    typedef boost::uint64_t type;\n\n    struct aligned\n    {\n        BOOST_ALIGNMENT(8) type value;\n\n        BOOST_DEFAULTED_FUNCTION(aligned(), {})\n        BOOST_FORCEINLINE BOOST_CONSTEXPR explicit aligned(type v) BOOST_NOEXCEPT : value(v) {}\n    };\n};\n\ntemplate< >\nstruct make_storage_type< 8u, true >\n{\n    typedef boost::int64_t type;\n\n    struct aligned\n    {\n        BOOST_ALIGNMENT(8) type value;\n\n        BOOST_DEFAULTED_FUNCTION(aligned(), {})\n        BOOST_FORCEINLINE BOOST_CONSTEXPR explicit aligned(type v) BOOST_NOEXCEPT : value(v) {}\n    };\n};\n\n#if defined(BOOST_HAS_INT128)\n\ntemplate< >\nstruct make_storage_type< 16u, false >\n{\n    typedef boost::uint128_type type;\n\n    struct aligned\n    {\n        BOOST_ALIGNMENT(16) type value;\n\n        BOOST_DEFAULTED_FUNCTION(aligned(), {})\n        BOOST_FORCEINLINE BOOST_CONSTEXPR explicit aligned(type v) BOOST_NOEXCEPT : value(v) {}\n    };\n};\n\ntemplate< >\nstruct make_storage_type< 16u, true >\n{\n    typedef boost::int128_type type;\n\n    struct aligned\n    {\n        BOOST_ALIGNMENT(16) type value;\n\n        BOOST_DEFAULTED_FUNCTION(aligned(), {})\n        BOOST_FORCEINLINE BOOST_CONSTEXPR explicit aligned(type v) BOOST_NOEXCEPT : value(v) {}\n    };\n};\n\n#elif !defined(BOOST_NO_ALIGNMENT)\n\nstruct storage128_t\n{\n    boost::uint64_t data[2];\n\n    BOOST_FORCEINLINE bool operator! () const BOOST_NOEXCEPT\n    {\n        return data[0] == 0 && data[1] == 0;\n    }\n};\n\nBOOST_FORCEINLINE bool operator== (storage128_t const& left, storage128_t const& right) BOOST_NOEXCEPT\n{\n    return left.data[0] == right.data[0] && left.data[1] == right.data[1];\n}\nBOOST_FORCEINLINE bool operator!= (storage128_t const& left, storage128_t const& right) BOOST_NOEXCEPT\n{\n    return !(left == right);\n}\n\nBOOST_FORCEINLINE void non_atomic_load(storage128_t const volatile& from, storage128_t& to) BOOST_NOEXCEPT\n{\n    to.data[0] = from.data[0];\n    to.data[1] = from.data[1];\n}\n\ntemplate< bool Signed >\nstruct make_storage_type< 16u, Signed >\n{\n    typedef storage128_t type;\n\n    struct aligned\n    {\n        BOOST_ALIGNMENT(16) type value;\n\n        BOOST_DEFAULTED_FUNCTION(aligned(), {})\n        BOOST_FORCEINLINE BOOST_CONSTEXPR explicit aligned(type const& v) BOOST_NOEXCEPT : value(v) {}\n    };\n};\n\n#endif\n\ntemplate< typename T >\nstruct storage_size_of\n{\n    enum _\n    {\n        size = sizeof(T),\n        value = (size == 3 ? 4 : (size >= 5 && size <= 7 ? 8 : (size >= 9 && size <= 15 ? 16 : size)))\n    };\n};\n\n} // namespace detail\n} // namespace atomics\n} // namespace boost\n\n#endif // BOOST_ATOMIC_DETAIL_STORAGE_TYPE_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic/fences.hpp",
    "content": "/*\n * Distributed under the Boost Software License, Version 1.0.\n * (See accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n *\n * Copyright (c) 2011 Helge Bahmann\n * Copyright (c) 2013 Tim Blechmann\n * Copyright (c) 2014 Andrey Semashev\n */\n/*!\n * \\file   atomic/fences.hpp\n *\n * This header contains definition of \\c atomic_thread_fence and \\c atomic_signal_fence functions.\n */\n\n#ifndef BOOST_ATOMIC_FENCES_HPP_INCLUDED_\n#define BOOST_ATOMIC_FENCES_HPP_INCLUDED_\n\n#include <boost/memory_order.hpp>\n#include <boost/atomic/capabilities.hpp>\n#include <boost/atomic/detail/operations.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\n/*\n * IMPLEMENTATION NOTE: All interface functions MUST be declared with BOOST_FORCEINLINE,\n *                      see comment for convert_memory_order_to_gcc in ops_gcc_atomic.hpp.\n */\n\nnamespace boost {\n\nnamespace atomics {\n\n#if BOOST_ATOMIC_THREAD_FENCE > 0\nBOOST_FORCEINLINE void atomic_thread_fence(memory_order order) BOOST_NOEXCEPT\n{\n    detail::thread_fence(order);\n}\n#else\nBOOST_FORCEINLINE void atomic_thread_fence(memory_order) BOOST_NOEXCEPT\n{\n    detail::lockpool::thread_fence();\n}\n#endif\n\n#if BOOST_ATOMIC_SIGNAL_FENCE > 0\nBOOST_FORCEINLINE void atomic_signal_fence(memory_order order) BOOST_NOEXCEPT\n{\n    detail::signal_fence(order);\n}\n#else\nBOOST_FORCEINLINE void atomic_signal_fence(memory_order) BOOST_NOEXCEPT\n{\n    detail::lockpool::signal_fence();\n}\n#endif\n\n} // namespace atomics\n\nusing atomics::atomic_thread_fence;\nusing atomics::atomic_signal_fence;\n\n} // namespace boost\n\n#endif // BOOST_ATOMIC_FENCES_HPP_INCLUDED_\n"
  },
  {
    "path": "benchmarks/boost/atomic.hpp",
    "content": "#ifndef BOOST_ATOMIC_HPP\n#define BOOST_ATOMIC_HPP\n\n//  Copyright (c) 2011 Helge Bahmann\n//\n//  Distributed under the Boost Software License, Version 1.0.\n//  See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n\n// This header includes all Boost.Atomic public headers\n\n#include <boost/atomic/atomic.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\n#endif\n"
  },
  {
    "path": "benchmarks/boost/config/abi/borland_prefix.hpp",
    "content": "//  (C) Copyright John Maddock 2003. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  for C++ Builder the following options effect the ABI:\n//\n//  -b (on or off - effect emum sizes)\n//  -Vx  (on or off - empty members)\n//  -Ve (on or off - empty base classes)\n//  -aX (alignment - 5 options).\n//  -pX (Calling convention - 4 options)\n//  -VmX (member pointer size and layout - 5 options)\n//  -VC (on or off, changes name mangling)\n//  -Vl (on or off, changes struct layout).\n\n//  In addition the following warnings are sufficiently annoying (and\n//  unfixable) to have them turned off by default:\n//\n//  8027 - functions containing [for|while] loops are not expanded inline\n//  8026 - functions taking class by value arguments are not expanded inline\n\n#pragma nopushoptwarn\n#  pragma option push -a8 -Vx- -Ve- -b- -pc -Vmv -VC- -Vl- -w-8027 -w-8026\n\n\n\n"
  },
  {
    "path": "benchmarks/boost/config/abi/borland_suffix.hpp",
    "content": "//  (C) Copyright John Maddock 2003. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#  pragma option pop\n#pragma nopushoptwarn\n\n\n\n\n\n"
  },
  {
    "path": "benchmarks/boost/config/abi/msvc_prefix.hpp",
    "content": "//  (C) Copyright John Maddock 2003. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//\n// Boost binaries are built with the compiler's default ABI settings,\n// if the user changes their default alignment in the VS IDE then their\n// code will no longer be binary compatible with the bjam built binaries\n// unless this header is included to force Boost code into a consistent ABI.\n//\n// Note that inclusion of this header is only necessary for libraries with \n// separate source, header only libraries DO NOT need this as long as all\n// translation units are built with the same options.\n//\n#if defined(_M_X64)\n#  pragma pack(push,16)\n#else\n#  pragma pack(push,8)\n#endif\n\n\n"
  },
  {
    "path": "benchmarks/boost/config/abi/msvc_suffix.hpp",
    "content": "//  (C) Copyright John Maddock 2003. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#pragma pack(pop)\n\n\n"
  },
  {
    "path": "benchmarks/boost/config/abi_prefix.hpp",
    "content": "//  abi_prefix header  -------------------------------------------------------//\n\n// (c) Copyright John Maddock 2003\n   \n// Use, modification and distribution are subject to the Boost Software License,\n// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt).\n\n#ifndef BOOST_CONFIG_ABI_PREFIX_HPP\n# define BOOST_CONFIG_ABI_PREFIX_HPP\n#else\n# error double inclusion of header boost/config/abi_prefix.hpp is an error\n#endif\n\n#include <boost/config.hpp>\n\n// this must occur after all other includes and before any code appears:\n#ifdef BOOST_HAS_ABI_HEADERS\n#  include BOOST_ABI_PREFIX\n#endif\n\n#if defined( __BORLANDC__ )\n#pragma nopushoptwarn\n#endif\n\n"
  },
  {
    "path": "benchmarks/boost/config/abi_suffix.hpp",
    "content": "//  abi_sufffix header  -------------------------------------------------------//\n\n// (c) Copyright John Maddock 2003\n   \n// Use, modification and distribution are subject to the Boost Software License,\n// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt).\n\n// This header should be #included AFTER code that was preceded by a #include\n// <boost/config/abi_prefix.hpp>.\n\n#ifndef BOOST_CONFIG_ABI_PREFIX_HPP\n# error Header boost/config/abi_suffix.hpp must only be used after boost/config/abi_prefix.hpp\n#else\n# undef BOOST_CONFIG_ABI_PREFIX_HPP\n#endif\n\n// the suffix header occurs after all of our code:\n#ifdef BOOST_HAS_ABI_HEADERS\n#  include BOOST_ABI_SUFFIX\n#endif\n\n#if defined( __BORLANDC__ )\n#pragma nopushoptwarn\n#endif\n\n\n"
  },
  {
    "path": "benchmarks/boost/config/auto_link.hpp",
    "content": "//  (C) Copyright John Maddock 2003.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n /*\n  *   LOCATION:    see http://www.boost.org for most recent version.\n  *   FILE         auto_link.hpp\n  *   VERSION      see <boost/version.hpp>\n  *   DESCRIPTION: Automatic library inclusion for Borland/Microsoft compilers.\n  */\n\n/*************************************************************************\n\nUSAGE:\n~~~~~~\n\nBefore including this header you must define one or more of define the following macros:\n\nBOOST_LIB_NAME:           Required: A string containing the basename of the library,\n                          for example boost_regex.\nBOOST_LIB_TOOLSET:        Optional: the base name of the toolset.\nBOOST_DYN_LINK:           Optional: when set link to dll rather than static library.\nBOOST_LIB_DIAGNOSTIC:     Optional: when set the header will print out the name\n                          of the library selected (useful for debugging).\nBOOST_AUTO_LINK_NOMANGLE: Specifies that we should link to BOOST_LIB_NAME.lib,\n                          rather than a mangled-name version.\nBOOST_AUTO_LINK_TAGGED:   Specifies that we link to libraries built with the --layout=tagged option.\n                          This is essentially the same as the default name-mangled version, but without\n                          the compiler name and version, or the Boost version.  Just the build options.\n\nThese macros will be undef'ed at the end of the header, further this header\nhas no include guards - so be sure to include it only once from your library!\n\nAlgorithm:\n~~~~~~~~~~\n\nLibraries for Borland and Microsoft compilers are automatically\nselected here, the name of the lib is selected according to the following\nformula:\n\nBOOST_LIB_PREFIX\n   + BOOST_LIB_NAME\n   + \"_\"\n   + BOOST_LIB_TOOLSET\n   + BOOST_LIB_THREAD_OPT\n   + BOOST_LIB_RT_OPT\n   \"-\"\n   + BOOST_LIB_VERSION\n\nThese are defined as:\n\nBOOST_LIB_PREFIX:     \"lib\" for static libraries otherwise \"\".\n\nBOOST_LIB_NAME:       The base name of the lib ( for example boost_regex).\n\nBOOST_LIB_TOOLSET:    The compiler toolset name (vc6, vc7, bcb5 etc).\n\nBOOST_LIB_THREAD_OPT: \"-mt\" for multithread builds, otherwise nothing.\n\nBOOST_LIB_RT_OPT:     A suffix that indicates the runtime library used,\n                      contains one or more of the following letters after\n                      a hyphen:\n\n                      s      static runtime (dynamic if not present).\n                      g      debug/diagnostic runtime (release if not present).\n                      y      Python debug/diagnostic runtime (release if not present).\n                      d      debug build (release if not present).\n                      p      STLport build.\n                      n      STLport build without its IOStreams.\n\nBOOST_LIB_VERSION:    The Boost version, in the form x_y, for Boost version x.y.\n\n\n***************************************************************************/\n\n#ifdef __cplusplus\n#  ifndef BOOST_CONFIG_HPP\n#     include <boost/config.hpp>\n#  endif\n#elif defined(_MSC_VER) && !defined(__MWERKS__) && !defined(__EDG_VERSION__)\n//\n// C language compatability (no, honestly)\n//\n#  define BOOST_MSVC _MSC_VER\n#  define BOOST_STRINGIZE(X) BOOST_DO_STRINGIZE(X)\n#  define BOOST_DO_STRINGIZE(X) #X\n#endif\n//\n// Only include what follows for known and supported compilers:\n//\n#if defined(BOOST_MSVC) \\\n    || defined(__BORLANDC__) \\\n    || (defined(__MWERKS__) && defined(_WIN32) && (__MWERKS__ >= 0x3000)) \\\n    || (defined(__ICL) && defined(_MSC_EXTENSIONS) && (_MSC_VER >= 1200))\n\n#ifndef BOOST_VERSION_HPP\n#  include <boost/version.hpp>\n#endif\n\n#ifndef BOOST_LIB_NAME\n#  error \"Macro BOOST_LIB_NAME not set (internal error)\"\n#endif\n\n//\n// error check:\n//\n#if defined(__MSVC_RUNTIME_CHECKS) && !defined(_DEBUG)\n#  pragma message(\"Using the /RTC option without specifying a debug runtime will lead to linker errors\")\n#  pragma message(\"Hint: go to the code generation options and switch to one of the debugging runtimes\")\n#  error \"Incompatible build options\"\n#endif\n//\n// select toolset if not defined already:\n//\n#ifndef BOOST_LIB_TOOLSET\n#  if defined(BOOST_MSVC) && (BOOST_MSVC < 1200)\n    // Note: no compilers before 1200 are supported\n#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1300)\n\n#    ifdef UNDER_CE\n       // eVC4:\n#      define BOOST_LIB_TOOLSET \"evc4\"\n#    else\n       // vc6:\n#      define BOOST_LIB_TOOLSET \"vc6\"\n#    endif\n\n#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1310)\n\n     // vc7:\n#    define BOOST_LIB_TOOLSET \"vc7\"\n\n#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1400)\n\n     // vc71:\n#    define BOOST_LIB_TOOLSET \"vc71\"\n\n#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1500)\n\n     // vc80:\n#    define BOOST_LIB_TOOLSET \"vc80\"\n\n#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1600)\n\n     // vc90:\n#    define BOOST_LIB_TOOLSET \"vc90\"\n\n#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1700)\n\n     // vc10:\n#    define BOOST_LIB_TOOLSET \"vc100\"\n\n#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1800)\n\n     // vc11:\n#    define BOOST_LIB_TOOLSET \"vc110\"\n\n#  elif defined(BOOST_MSVC) && (BOOST_MSVC < 1900)\n\n     // vc12:\n#    define BOOST_LIB_TOOLSET \"vc120\"\n\n# elif defined(BOOST_MSVC)\n\n   // vc14:\n#  define BOOST_LIB_TOOLSET \"vc140\"\n\n#  elif defined(__BORLANDC__)\n\n     // CBuilder 6:\n#    define BOOST_LIB_TOOLSET \"bcb\"\n\n#  elif defined(__ICL)\n\n     // Intel C++, no version number:\n#    define BOOST_LIB_TOOLSET \"iw\"\n\n#  elif defined(__MWERKS__) && (__MWERKS__ <= 0x31FF )\n\n     // Metrowerks CodeWarrior 8.x\n#    define BOOST_LIB_TOOLSET \"cw8\"\n\n#  elif defined(__MWERKS__) && (__MWERKS__ <= 0x32FF )\n\n     // Metrowerks CodeWarrior 9.x\n#    define BOOST_LIB_TOOLSET \"cw9\"\n\n#  endif\n#endif // BOOST_LIB_TOOLSET\n\n//\n// select thread opt:\n//\n#if defined(_MT) || defined(__MT__)\n#  define BOOST_LIB_THREAD_OPT \"-mt\"\n#else\n#  define BOOST_LIB_THREAD_OPT\n#endif\n\n#if defined(_MSC_VER) || defined(__MWERKS__)\n\n#  ifdef _DLL\n\n#     if (defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)) && (defined(_STLP_OWN_IOSTREAMS) || defined(__STL_OWN_IOSTREAMS))\n\n#        if defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG))\\\n               && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)\n#            define BOOST_LIB_RT_OPT \"-gydp\"\n#        elif defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG))\n#            define BOOST_LIB_RT_OPT \"-gdp\"\n#        elif defined(_DEBUG)\\\n               && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)\n#            define BOOST_LIB_RT_OPT \"-gydp\"\n#            pragma message(\"warning: STLport debug versions are built with /D_STLP_DEBUG=1\")\n#            error \"Build options aren't compatible with pre-built libraries\"\n#        elif defined(_DEBUG)\n#            define BOOST_LIB_RT_OPT \"-gdp\"\n#            pragma message(\"warning: STLport debug versions are built with /D_STLP_DEBUG=1\")\n#            error \"Build options aren't compatible with pre-built libraries\"\n#        else\n#            define BOOST_LIB_RT_OPT \"-p\"\n#        endif\n\n#     elif defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)\n\n#        if defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG))\\\n               && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)\n#            define BOOST_LIB_RT_OPT \"-gydpn\"\n#        elif defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG))\n#            define BOOST_LIB_RT_OPT \"-gdpn\"\n#        elif defined(_DEBUG)\\\n               && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)\n#            define BOOST_LIB_RT_OPT \"-gydpn\"\n#            pragma message(\"warning: STLport debug versions are built with /D_STLP_DEBUG=1\")\n#            error \"Build options aren't compatible with pre-built libraries\"\n#        elif defined(_DEBUG)\n#            define BOOST_LIB_RT_OPT \"-gdpn\"\n#            pragma message(\"warning: STLport debug versions are built with /D_STLP_DEBUG=1\")\n#            error \"Build options aren't compatible with pre-built libraries\"\n#        else\n#            define BOOST_LIB_RT_OPT \"-pn\"\n#        endif\n\n#     else\n\n#        if defined(_DEBUG) && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)\n#            define BOOST_LIB_RT_OPT \"-gyd\"\n#        elif defined(_DEBUG)\n#            define BOOST_LIB_RT_OPT \"-gd\"\n#        else\n#            define BOOST_LIB_RT_OPT\n#        endif\n\n#     endif\n\n#  else\n\n#     if (defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)) && (defined(_STLP_OWN_IOSTREAMS) || defined(__STL_OWN_IOSTREAMS))\n\n#        if defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG))\\\n               && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)\n#            define BOOST_LIB_RT_OPT \"-sgydp\"\n#        elif defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG))\n#            define BOOST_LIB_RT_OPT \"-sgdp\"\n#        elif defined(_DEBUG)\\\n               && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)\n#             define BOOST_LIB_RT_OPT \"-sgydp\"\n#            pragma message(\"warning: STLport debug versions are built with /D_STLP_DEBUG=1\")\n#            error \"Build options aren't compatible with pre-built libraries\"\n#        elif defined(_DEBUG)\n#             define BOOST_LIB_RT_OPT \"-sgdp\"\n#            pragma message(\"warning: STLport debug versions are built with /D_STLP_DEBUG=1\")\n#            error \"Build options aren't compatible with pre-built libraries\"\n#        else\n#            define BOOST_LIB_RT_OPT \"-sp\"\n#        endif\n\n#     elif defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)\n\n#        if defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG))\\\n               && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)\n#            define BOOST_LIB_RT_OPT \"-sgydpn\"\n#        elif defined(_DEBUG) && (defined(__STL_DEBUG) || defined(_STLP_DEBUG))\n#            define BOOST_LIB_RT_OPT \"-sgdpn\"\n#        elif defined(_DEBUG)\\\n               && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)\n#             define BOOST_LIB_RT_OPT \"-sgydpn\"\n#            pragma message(\"warning: STLport debug versions are built with /D_STLP_DEBUG=1\")\n#            error \"Build options aren't compatible with pre-built libraries\"\n#        elif defined(_DEBUG)\n#             define BOOST_LIB_RT_OPT \"-sgdpn\"\n#            pragma message(\"warning: STLport debug versions are built with /D_STLP_DEBUG=1\")\n#            error \"Build options aren't compatible with pre-built libraries\"\n#        else\n#            define BOOST_LIB_RT_OPT \"-spn\"\n#        endif\n\n#     else\n\n#        if defined(_DEBUG)\\\n               && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)\n#             define BOOST_LIB_RT_OPT \"-sgyd\"\n#        elif defined(_DEBUG)\n#             define BOOST_LIB_RT_OPT \"-sgd\"\n#        else\n#            define BOOST_LIB_RT_OPT \"-s\"\n#        endif\n\n#     endif\n\n#  endif\n\n#elif defined(__BORLANDC__)\n\n//\n// figure out whether we want the debug builds or not:\n//\n#if __BORLANDC__ > 0x561\n#pragma defineonoption BOOST_BORLAND_DEBUG -v\n#endif\n//\n// sanity check:\n//\n#if defined(__STL_DEBUG) || defined(_STLP_DEBUG)\n#error \"Pre-built versions of the Boost libraries are not provided in STLport-debug form\"\n#endif\n\n#  ifdef _RTLDLL\n\n#     if defined(BOOST_BORLAND_DEBUG)\\\n               && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)\n#         define BOOST_LIB_RT_OPT \"-yd\"\n#     elif defined(BOOST_BORLAND_DEBUG)\n#         define BOOST_LIB_RT_OPT \"-d\"\n#     elif defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)\n#         define BOOST_LIB_RT_OPT -y\n#     else\n#         define BOOST_LIB_RT_OPT\n#     endif\n\n#  else\n\n#     if defined(BOOST_BORLAND_DEBUG)\\\n               && defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)\n#         define BOOST_LIB_RT_OPT \"-syd\"\n#     elif defined(BOOST_BORLAND_DEBUG)\n#         define BOOST_LIB_RT_OPT \"-sd\"\n#     elif defined(BOOST_DEBUG_PYTHON) && defined(BOOST_LINKING_PYTHON)\n#         define BOOST_LIB_RT_OPT \"-sy\"\n#     else\n#         define BOOST_LIB_RT_OPT \"-s\"\n#     endif\n\n#  endif\n\n#endif\n\n//\n// select linkage opt:\n//\n#if (defined(_DLL) || defined(_RTLDLL)) && defined(BOOST_DYN_LINK)\n#  define BOOST_LIB_PREFIX\n#elif defined(BOOST_DYN_LINK)\n#  error \"Mixing a dll boost library with a static runtime is a really bad idea...\"\n#else\n#  define BOOST_LIB_PREFIX \"lib\"\n#endif\n\n//\n// now include the lib:\n//\n#if defined(BOOST_LIB_NAME) \\\n      && defined(BOOST_LIB_PREFIX) \\\n      && defined(BOOST_LIB_TOOLSET) \\\n      && defined(BOOST_LIB_THREAD_OPT) \\\n      && defined(BOOST_LIB_RT_OPT) \\\n      && defined(BOOST_LIB_VERSION)\n\n#ifdef BOOST_AUTO_LINK_TAGGED\n#  pragma comment(lib, BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT \".lib\")\n#  ifdef BOOST_LIB_DIAGNOSTIC\n#     pragma message (\"Linking to lib file: \" BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT \".lib\")\n#  endif\n#elif defined(BOOST_AUTO_LINK_NOMANGLE)\n#  pragma comment(lib, BOOST_STRINGIZE(BOOST_LIB_NAME) \".lib\")\n#  ifdef BOOST_LIB_DIAGNOSTIC\n#     pragma message (\"Linking to lib file: \" BOOST_STRINGIZE(BOOST_LIB_NAME) \".lib\")\n#  endif\n#elif defined(BOOST_LIB_BUILDID)\n#  pragma comment(lib, BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) \"-\" BOOST_LIB_TOOLSET BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT \"-\" BOOST_LIB_VERSION \"-\" BOOST_STRINGIZE(BOOST_LIB_BUILDID) \".lib\")\n#  ifdef BOOST_LIB_DIAGNOSTIC\n#     pragma message (\"Linking to lib file: \" BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) \"-\" BOOST_LIB_TOOLSET BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT \"-\" BOOST_LIB_VERSION \"-\" BOOST_STRINGIZE(BOOST_LIB_BUILDID) \".lib\")\n#  endif\n#else\n#  pragma comment(lib, BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) \"-\" BOOST_LIB_TOOLSET BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT \"-\" BOOST_LIB_VERSION \".lib\")\n#  ifdef BOOST_LIB_DIAGNOSTIC\n#     pragma message (\"Linking to lib file: \" BOOST_LIB_PREFIX BOOST_STRINGIZE(BOOST_LIB_NAME) \"-\" BOOST_LIB_TOOLSET BOOST_LIB_THREAD_OPT BOOST_LIB_RT_OPT \"-\" BOOST_LIB_VERSION \".lib\")\n#  endif\n#endif\n\n#else\n#  error \"some required macros where not defined (internal logic error).\"\n#endif\n\n\n#endif // _MSC_VER || __BORLANDC__\n\n//\n// finally undef any macros we may have set:\n//\n#ifdef BOOST_LIB_PREFIX\n#  undef BOOST_LIB_PREFIX\n#endif\n#if defined(BOOST_LIB_NAME)\n#  undef BOOST_LIB_NAME\n#endif\n// Don't undef this one: it can be set by the user and should be the \n// same for all libraries:\n//#if defined(BOOST_LIB_TOOLSET)\n//#  undef BOOST_LIB_TOOLSET\n//#endif\n#if defined(BOOST_LIB_THREAD_OPT)\n#  undef BOOST_LIB_THREAD_OPT\n#endif\n#if defined(BOOST_LIB_RT_OPT)\n#  undef BOOST_LIB_RT_OPT\n#endif\n#if defined(BOOST_LIB_LINK_OPT)\n#  undef BOOST_LIB_LINK_OPT\n#endif\n#if defined(BOOST_LIB_DEBUG_OPT)\n#  undef BOOST_LIB_DEBUG_OPT\n#endif\n#if defined(BOOST_DYN_LINK)\n#  undef BOOST_DYN_LINK\n#endif\n\n\n"
  },
  {
    "path": "benchmarks/boost/config/compiler/borland.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003.\n//  (C) Copyright David Abrahams 2002 - 2003.\n//  (C) Copyright Aleksey Gurtovoy 2002.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Borland C++ compiler setup:\n\n//\n// versions check:\n// we don't support Borland prior to version 5.4:\n#if __BORLANDC__ < 0x540\n#  error \"Compiler not supported or configured - please reconfigure\"\n#endif\n\n// last known compiler version:\n#if (__BORLANDC__ > 0x613)\n//#  if defined(BOOST_ASSERT_CONFIG)\n#     error \"Unknown compiler version - please run the configure tests and report the results\"\n//#  else\n//#     pragma message( \"Unknown compiler version - please run the configure tests and report the results\")\n//#  endif\n#elif (__BORLANDC__ == 0x600)\n#  error \"CBuilderX preview compiler is no longer supported\"\n#endif\n\n//\n// Support macros to help with standard library detection\n#if (__BORLANDC__ < 0x560) || defined(_USE_OLD_RW_STL)\n#  define BOOST_BCB_WITH_ROGUE_WAVE\n#elif __BORLANDC__ < 0x570\n#  define BOOST_BCB_WITH_STLPORT\n#else\n#  define BOOST_BCB_WITH_DINKUMWARE\n#endif\n\n//\n// Version 5.0 and below:\n#   if __BORLANDC__ <= 0x0550\n// Borland C++Builder 4 and 5:\n#     define BOOST_NO_MEMBER_TEMPLATE_FRIENDS\n#     if __BORLANDC__ == 0x0550\n// Borland C++Builder 5, command-line compiler 5.5:\n#       define BOOST_NO_OPERATORS_IN_NAMESPACE\n#     endif\n// Variadic macros do not exist for C++ Builder versions 5 and below\n#define BOOST_NO_CXX11_VARIADIC_MACROS\n#   endif\n\n// Version 5.51 and below:\n#if (__BORLANDC__ <= 0x551)\n#  define BOOST_NO_CV_SPECIALIZATIONS\n#  define BOOST_NO_CV_VOID_SPECIALIZATIONS\n#  define BOOST_NO_DEDUCED_TYPENAME\n// workaround for missing WCHAR_MAX/WCHAR_MIN:\n#ifdef __cplusplus\n#include <climits>\n#include <cwchar>\n#else\n#include <limits.h>\n#include <wchar.h>\n#endif // __cplusplus\n#ifndef WCHAR_MAX\n#  define WCHAR_MAX 0xffff\n#endif\n#ifndef WCHAR_MIN\n#  define WCHAR_MIN 0\n#endif\n#endif\n\n// Borland C++ Builder 6 and below:\n#if (__BORLANDC__ <= 0x564)\n\n#  if defined(NDEBUG) && defined(__cplusplus)\n      // fix broken <cstring> so that Boost.test works:\n#     include <cstring>\n#     undef strcmp\n#  endif\n   // fix broken errno declaration:\n#  include <errno.h>\n#  ifndef errno\n#     define errno errno\n#  endif\n\n#endif\n\n//\n// new bug in 5.61:\n#if (__BORLANDC__ >= 0x561) && (__BORLANDC__ <= 0x580)\n   // this seems to be needed by the command line compiler, but not the IDE:\n#  define BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS\n#endif\n\n// Borland C++ Builder 2006 Update 2 and below:\n#if (__BORLANDC__ <= 0x582)\n#  define BOOST_NO_SFINAE\n#  define BOOST_BCB_PARTIAL_SPECIALIZATION_BUG\n#  define BOOST_NO_TEMPLATE_TEMPLATES\n\n#  define BOOST_NO_PRIVATE_IN_AGGREGATE\n\n#  ifdef _WIN32\n#     define BOOST_NO_SWPRINTF\n#  elif defined(linux) || defined(__linux__) || defined(__linux)\n      // we should really be able to do without this\n      // but the wcs* functions aren't imported into std::\n#     define BOOST_NO_STDC_NAMESPACE\n      // _CPPUNWIND doesn't get automatically set for some reason:\n#     pragma defineonoption BOOST_CPPUNWIND -x\n#  endif\n#endif\n\n#if (__BORLANDC__ <= 0x613)  // Beman has asked Alisdair for more info\n   // we shouldn't really need this - but too many things choke\n   // without it, this needs more investigation:\n#  define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS\n#  define BOOST_NO_IS_ABSTRACT\n#  define BOOST_NO_FUNCTION_TYPE_SPECIALIZATIONS\n#  define BOOST_NO_USING_TEMPLATE\n#  define BOOST_SP_NO_SP_CONVERTIBLE\n\n// Temporary workaround\n#define BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS\n#endif\n\n// Borland C++ Builder 2008 and below:\n#  define BOOST_NO_INTEGRAL_INT64_T\n#  define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL\n#  define BOOST_NO_DEPENDENT_NESTED_DERIVATIONS\n#  define BOOST_NO_MEMBER_TEMPLATE_FRIENDS\n#  define BOOST_NO_TWO_PHASE_NAME_LOOKUP\n#  define BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE\n#  define BOOST_NO_NESTED_FRIENDSHIP\n#  define BOOST_NO_TYPENAME_WITH_CTOR\n#if (__BORLANDC__ < 0x600)\n#  define BOOST_ILLEGAL_CV_REFERENCES\n#endif\n\n//\n//  Positive Feature detection\n//\n// Borland C++ Builder 2008 and below:\n#if (__BORLANDC__ >= 0x599)\n#  pragma defineonoption BOOST_CODEGEAR_0X_SUPPORT -Ax\n#endif\n//\n// C++0x Macros:\n//\n#if !defined( BOOST_CODEGEAR_0X_SUPPORT ) || (__BORLANDC__ < 0x610)\n#  define BOOST_NO_CXX11_CHAR16_T\n#  define BOOST_NO_CXX11_CHAR32_T\n#  define BOOST_NO_CXX11_DECLTYPE\n#  define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#  define BOOST_NO_CXX11_EXTERN_TEMPLATE\n#  define BOOST_NO_CXX11_RVALUE_REFERENCES\n#  define BOOST_NO_CXX11_SCOPED_ENUMS\n#  define BOOST_NO_CXX11_STATIC_ASSERT\n#else\n#  define BOOST_HAS_ALIGNOF\n#  define BOOST_HAS_CHAR16_T\n#  define BOOST_HAS_CHAR32_T\n#  define BOOST_HAS_DECLTYPE\n#  define BOOST_HAS_EXPLICIT_CONVERSION_OPS\n#  define BOOST_HAS_REF_QUALIFIER\n#  define BOOST_HAS_RVALUE_REFS\n#  define BOOST_HAS_STATIC_ASSERT\n#endif\n\n#define BOOST_NO_CXX11_AUTO_DECLARATIONS\n#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#define BOOST_NO_CXX11_CONSTEXPR\n#define BOOST_NO_CXX11_DECLTYPE_N3276\n#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#define BOOST_NO_CXX11_DELETED_FUNCTIONS\n#define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#define BOOST_NO_CXX11_LAMBDAS\n#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#define BOOST_NO_CXX11_NULLPTR\n#define BOOST_NO_CXX11_RANGE_BASED_FOR\n#define BOOST_NO_CXX11_RAW_LITERALS\n#define BOOST_NO_CXX11_RVALUE_REFERENCES\n#define BOOST_NO_CXX11_SCOPED_ENUMS\n#define BOOST_NO_SFINAE_EXPR\n#define BOOST_NO_CXX11_TEMPLATE_ALIASES\n#define BOOST_NO_CXX11_UNICODE_LITERALS    // UTF-8 still not supported\n#define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#define BOOST_NO_CXX11_NOEXCEPT\n#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#define BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#define BOOST_NO_CXX11_ALIGNAS\n#define BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#define BOOST_NO_CXX11_INLINE_NAMESPACES\n#define BOOST_NO_CXX11_REF_QUALIFIERS\n#define BOOST_NO_CXX11_FINAL\n\n// C++ 14:\n#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)\n#  define BOOST_NO_CXX14_AGGREGATE_NSDMI\n#endif\n#if !defined(__cpp_binary_literals) || (__cpp_binary_literals < 201304)\n#  define BOOST_NO_CXX14_BINARY_LITERALS\n#endif\n#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)\n#  define BOOST_NO_CXX14_CONSTEXPR\n#endif\n#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304)\n#  define BOOST_NO_CXX14_DECLTYPE_AUTO\n#endif\n#if (__cplusplus < 201304) // There's no SD6 check for this....\n#  define BOOST_NO_CXX14_DIGIT_SEPARATORS\n#endif\n#if !defined(__cpp_generic_lambdas) || (__cpp_generic_lambdas < 201304)\n#  define BOOST_NO_CXX14_GENERIC_LAMBDAS\n#endif\n#if !defined(__cpp_init_captures) || (__cpp_init_captures < 201304)\n#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES\n#endif\n#if !defined(__cpp_return_type_deduction) || (__cpp_return_type_deduction < 201304)\n#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION\n#endif\n#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)\n#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES\n#endif\n\n#if __BORLANDC__ >= 0x590\n#  define BOOST_HAS_TR1_HASH\n\n#  define BOOST_HAS_MACRO_USE_FACET\n#endif\n\n//\n// Post 0x561 we have long long and stdint.h:\n#if __BORLANDC__ >= 0x561\n#  ifndef __NO_LONG_LONG\n#     define BOOST_HAS_LONG_LONG\n#  else\n#     define BOOST_NO_LONG_LONG\n#  endif\n   // On non-Win32 platforms let the platform config figure this out:\n#  ifdef _WIN32\n#      define BOOST_HAS_STDINT_H\n#  endif\n#endif\n\n// Borland C++Builder 6 defaults to using STLPort.  If _USE_OLD_RW_STL is\n// defined, then we have 0x560 or greater with the Rogue Wave implementation\n// which presumably has the std::DBL_MAX bug.\n#if defined( BOOST_BCB_WITH_ROGUE_WAVE )\n// <climits> is partly broken, some macros define symbols that are really in\n// namespace std, so you end up having to use illegal constructs like\n// std::DBL_MAX, as a fix we'll just include float.h and have done with:\n#include <float.h>\n#endif\n//\n// __int64:\n//\n#if (__BORLANDC__ >= 0x530) && !defined(__STRICT_ANSI__)\n#  define BOOST_HAS_MS_INT64\n#endif\n//\n// check for exception handling support:\n//\n#if !defined(_CPPUNWIND) && !defined(BOOST_CPPUNWIND) && !defined(__EXCEPTIONS) && !defined(BOOST_NO_EXCEPTIONS)\n#  define BOOST_NO_EXCEPTIONS\n#endif\n//\n// all versions have a <dirent.h>:\n//\n#ifndef __STRICT_ANSI__\n#  define BOOST_HAS_DIRENT_H\n#endif\n//\n// all versions support __declspec:\n//\n#if defined(__STRICT_ANSI__)\n// config/platform/win32.hpp will define BOOST_SYMBOL_EXPORT, etc., unless already defined\n#  define BOOST_SYMBOL_EXPORT\n#endif\n//\n// ABI fixing headers:\n//\n#if __BORLANDC__ != 0x600 // not implemented for version 6 compiler yet\n#ifndef BOOST_ABI_PREFIX\n#  define BOOST_ABI_PREFIX \"boost/config/abi/borland_prefix.hpp\"\n#endif\n#ifndef BOOST_ABI_SUFFIX\n#  define BOOST_ABI_SUFFIX \"boost/config/abi/borland_suffix.hpp\"\n#endif\n#endif\n//\n// Disable Win32 support in ANSI mode:\n//\n#if __BORLANDC__ < 0x600\n#  pragma defineonoption BOOST_DISABLE_WIN32 -A\n#elif defined(__STRICT_ANSI__)\n#  define BOOST_DISABLE_WIN32\n#endif\n//\n// MSVC compatibility mode does some nasty things:\n// TODO: look up if this doesn't apply to the whole 12xx range\n//\n#if defined(_MSC_VER) && (_MSC_VER <= 1200)\n#  define BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP\n#  define BOOST_NO_VOID_RETURNS\n#endif\n\n// Borland did not implement value-initialization completely, as I reported\n// in 2007, Borland Report 51854, \"Value-initialization: POD struct should be\n// zero-initialized\", http://qc.embarcadero.com/wc/qcmain.aspx?d=51854\n// See also: http://www.boost.org/libs/utility/value_init.htm#compiler_issues\n// (Niels Dekker, LKEB, April 2010)\n#define BOOST_NO_COMPLETE_VALUE_INITIALIZATION\n\n#define BOOST_COMPILER \"Borland C++ version \" BOOST_STRINGIZE(__BORLANDC__)\n"
  },
  {
    "path": "benchmarks/boost/config/compiler/clang.hpp",
    "content": "// (C) Copyright Douglas Gregor 2010\n//\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n// Clang compiler setup.\n\n#define BOOST_HAS_PRAGMA_ONCE\n\n// Detecting `-fms-extension` compiler flag assuming that _MSC_VER defined when that flag is used.\n#if defined (_MSC_VER) && (__clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 4))\n#   define BOOST_HAS_PRAGMA_DETECT_MISMATCH\n#endif\n\n// When compiling with clang before __has_extension was defined,\n// even if one writes 'defined(__has_extension) && __has_extension(xxx)',\n// clang reports a compiler error. So the only workaround found is:\n\n#ifndef __has_extension\n#define __has_extension __has_feature\n#endif\n\n#ifndef __has_attribute\n#define __has_attribute(x) 0\n#endif\n\n#if !__has_feature(cxx_exceptions) && !defined(BOOST_NO_EXCEPTIONS)\n#  define BOOST_NO_EXCEPTIONS\n#endif\n\n#if !__has_feature(cxx_rtti) && !defined(BOOST_NO_RTTI)\n#  define BOOST_NO_RTTI\n#endif\n\n#if !__has_feature(cxx_rtti) && !defined(BOOST_NO_TYPEID)\n#  define BOOST_NO_TYPEID\n#endif\n\n#if defined(__int64) && !defined(__GNUC__)\n#  define BOOST_HAS_MS_INT64\n#endif\n\n#define BOOST_HAS_NRVO\n\n// Branch prediction hints\n#if defined(__has_builtin)\n#if __has_builtin(__builtin_expect)\n#define BOOST_LIKELY(x) __builtin_expect(x, 1)\n#define BOOST_UNLIKELY(x) __builtin_expect(x, 0)\n#endif\n#endif\n\n// Clang supports \"long long\" in all compilation modes.\n#define BOOST_HAS_LONG_LONG\n\n//\n// We disable this if the compiler is really nvcc as it\n// doesn't actually support __int128 as of CUDA_VERSION=5000\n// even though it defines __SIZEOF_INT128__.\n// See https://svn.boost.org/trac/boost/ticket/10418\n// Only re-enable this for nvcc if you're absolutely sure\n// of the circumstances under which it's supported.\n// Similarly __SIZEOF_INT128__ is defined when targetting msvc\n// compatibility even though the required support functions are absent.\n//\n#if defined(__SIZEOF_INT128__) && !defined(__CUDACC__) && !defined(_MSC_VER)\n#  define BOOST_HAS_INT128\n#endif\n\n\n//\n// Dynamic shared object (DSO) and dynamic-link library (DLL) support\n//\n#if !defined(_WIN32) && !defined(__WIN32__) && !defined(WIN32)\n#  define BOOST_SYMBOL_EXPORT __attribute__((__visibility__(\"default\")))\n#  define BOOST_SYMBOL_IMPORT\n#  define BOOST_SYMBOL_VISIBLE __attribute__((__visibility__(\"default\")))\n#endif\n\n//\n// The BOOST_FALLTHROUGH macro can be used to annotate implicit fall-through\n// between switch labels.\n//\n#if __cplusplus >= 201103L && defined(__has_warning)\n#  if __has_feature(cxx_attributes) && __has_warning(\"-Wimplicit-fallthrough\")\n#    define BOOST_FALLTHROUGH [[clang::fallthrough]]\n#  endif\n#endif\n\n#if !__has_feature(cxx_auto_type)\n#  define BOOST_NO_CXX11_AUTO_DECLARATIONS\n#  define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#endif\n\n//\n// Currently clang on Windows using VC++ RTL does not support C++11's char16_t or char32_t\n//\n#if defined(_MSC_VER) || !(defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L)\n#  define BOOST_NO_CXX11_CHAR16_T\n#  define BOOST_NO_CXX11_CHAR32_T\n#endif\n\n#if !__has_feature(cxx_constexpr)\n#  define BOOST_NO_CXX11_CONSTEXPR\n#endif\n\n#if !__has_feature(cxx_decltype)\n#  define BOOST_NO_CXX11_DECLTYPE\n#endif\n\n#if !__has_feature(cxx_decltype_incomplete_return_types)\n#  define BOOST_NO_CXX11_DECLTYPE_N3276\n#endif\n\n#if !__has_feature(cxx_defaulted_functions)\n#  define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#endif\n\n#if !__has_feature(cxx_deleted_functions)\n#  define BOOST_NO_CXX11_DELETED_FUNCTIONS\n#endif\n\n#if !__has_feature(cxx_explicit_conversions)\n#  define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#endif\n\n#if !__has_feature(cxx_default_function_template_args)\n#  define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#endif\n\n#if !__has_feature(cxx_generalized_initializers)\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#endif\n\n#if !__has_feature(cxx_lambdas)\n#  define BOOST_NO_CXX11_LAMBDAS\n#endif\n\n#if !__has_feature(cxx_local_type_template_args)\n#  define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#endif\n\n#if !__has_feature(cxx_noexcept)\n#  define BOOST_NO_CXX11_NOEXCEPT\n#endif\n\n#if !__has_feature(cxx_nullptr)\n#  define BOOST_NO_CXX11_NULLPTR\n#endif\n\n#if !__has_feature(cxx_range_for)\n#  define BOOST_NO_CXX11_RANGE_BASED_FOR\n#endif\n\n#if !__has_feature(cxx_raw_string_literals)\n#  define BOOST_NO_CXX11_RAW_LITERALS\n#endif\n\n#if !__has_feature(cxx_reference_qualified_functions)\n#  define BOOST_NO_CXX11_REF_QUALIFIERS\n#endif\n\n#if !__has_feature(cxx_generalized_initializers)\n#  define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#endif\n\n#if !__has_feature(cxx_rvalue_references)\n#  define BOOST_NO_CXX11_RVALUE_REFERENCES\n#endif\n\n#if !__has_feature(cxx_strong_enums)\n#  define BOOST_NO_CXX11_SCOPED_ENUMS\n#endif\n\n#if !__has_feature(cxx_static_assert)\n#  define BOOST_NO_CXX11_STATIC_ASSERT\n#endif\n\n#if !__has_feature(cxx_alias_templates)\n#  define BOOST_NO_CXX11_TEMPLATE_ALIASES\n#endif\n\n#if !__has_feature(cxx_unicode_literals)\n#  define BOOST_NO_CXX11_UNICODE_LITERALS\n#endif\n\n#if !__has_feature(cxx_variadic_templates)\n#  define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#endif\n\n#if !__has_feature(cxx_user_literals)\n#  define BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#endif\n\n#if !__has_feature(cxx_alignas)\n#  define BOOST_NO_CXX11_ALIGNAS\n#endif\n\n#if !__has_feature(cxx_trailing_return)\n#  define BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#endif\n\n#if !__has_feature(cxx_inline_namespaces)\n#  define BOOST_NO_CXX11_INLINE_NAMESPACES\n#endif\n\n#if !__has_feature(cxx_override_control)\n#  define BOOST_NO_CXX11_FINAL\n#endif\n\n#if !(__has_feature(__cxx_binary_literals__) || __has_extension(__cxx_binary_literals__))\n#  define BOOST_NO_CXX14_BINARY_LITERALS\n#endif\n\n#if !__has_feature(__cxx_decltype_auto__)\n#  define BOOST_NO_CXX14_DECLTYPE_AUTO\n#endif\n\n#if !__has_feature(__cxx_aggregate_nsdmi__)\n#  define BOOST_NO_CXX14_AGGREGATE_NSDMI\n#endif\n\n#if !__has_feature(__cxx_init_captures__)\n#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES\n#endif\n\n#if !__has_feature(__cxx_generic_lambdas__)\n#  define BOOST_NO_CXX14_GENERIC_LAMBDAS\n#endif\n\n// clang < 3.5 has a defect with dependent type, like following.\n//\n//  template <class T>\n//  constexpr typename enable_if<pred<T> >::type foo(T &)\n//  { } // error: no return statement in constexpr function\n//\n// This issue also affects C++11 mode, but C++11 constexpr requires return stmt.\n// Therefore we don't care such case.\n//\n// Note that we can't check Clang version directly as the numbering system changes depending who's\n// creating the Clang release (see https://github.com/boostorg/config/pull/39#issuecomment-59927873)\n// so instead verify that we have a feature that was introduced at the same time as working C++14\n// constexpr (generic lambda's in this case):\n//\n#if !__has_feature(__cxx_generic_lambdas__) || !__has_feature(__cxx_relaxed_constexpr__)\n#  define BOOST_NO_CXX14_CONSTEXPR\n#endif\n\n#if !__has_feature(__cxx_return_type_deduction__)\n#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION\n#endif\n\n#if !__has_feature(__cxx_variable_templates__)\n#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES\n#endif\n\n#if __cplusplus < 201400\n// All versions with __cplusplus above this value seem to support this:\n#  define BOOST_NO_CXX14_DIGIT_SEPARATORS\n#endif\n//\n// __builtin_unreachable:\n#if defined(__has_builtin) && __has_builtin(__builtin_unreachable)\n#define BOOST_UNREACHABLE_RETURN(x) __builtin_unreachable();\n#endif\n\n// Clang has supported the 'unused' attribute since the first release.\n#define BOOST_ATTRIBUTE_UNUSED __attribute__((__unused__))\n\n#ifndef BOOST_COMPILER\n#  define BOOST_COMPILER \"Clang version \" __clang_version__\n#endif\n\n// Macro used to identify the Clang compiler.\n#define BOOST_CLANG 1\n\n"
  },
  {
    "path": "benchmarks/boost/config/compiler/codegear.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003.\n//  (C) Copyright David Abrahams 2002 - 2003.\n//  (C) Copyright Aleksey Gurtovoy 2002.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  CodeGear C++ compiler setup:\n\n#if !defined( BOOST_WITH_CODEGEAR_WARNINGS )\n// these warnings occur frequently in optimized template code\n# pragma warn -8004 // var assigned value, but never used\n# pragma warn -8008 // condition always true/false\n# pragma warn -8066 // dead code can never execute\n# pragma warn -8104 // static members with ctors not threadsafe\n# pragma warn -8105 // reference member in class without ctors\n#endif\n//\n// versions check:\n// last known and checked version is 0x621\n#if (__CODEGEARC__ > 0x621)\n#  if defined(BOOST_ASSERT_CONFIG)\n#     error \"Unknown compiler version - please run the configure tests and report the results\"\n#  else\n#     pragma message( \"Unknown compiler version - please run the configure tests and report the results\")\n#  endif\n#endif\n\n// CodeGear C++ Builder 2009\n#if (__CODEGEARC__ <= 0x613)\n#  define BOOST_NO_INTEGRAL_INT64_T\n#  define BOOST_NO_DEPENDENT_NESTED_DERIVATIONS\n#  define BOOST_NO_PRIVATE_IN_AGGREGATE\n#  define BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE\n   // we shouldn't really need this - but too many things choke\n   // without it, this needs more investigation:\n#  define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS\n#  define BOOST_SP_NO_SP_CONVERTIBLE\n#endif\n\n// CodeGear C++ Builder 2010\n#if (__CODEGEARC__ <= 0x621)\n#  define BOOST_NO_TYPENAME_WITH_CTOR    // Cannot use typename keyword when making temporaries of a dependant type\n#  define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL\n#  define BOOST_NO_MEMBER_TEMPLATE_FRIENDS\n#  define BOOST_NO_NESTED_FRIENDSHIP     // TC1 gives nested classes access rights as any other member\n#  define BOOST_NO_USING_TEMPLATE\n#  define BOOST_NO_TWO_PHASE_NAME_LOOKUP\n// Temporary hack, until specific MPL preprocessed headers are generated\n#  define BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS\n\n// CodeGear has not yet completely implemented value-initialization, for\n// example for array types, as I reported in 2010: Embarcadero Report 83751,\n// \"Value-initialization: arrays should have each element value-initialized\",\n// http://qc.embarcadero.com/wc/qcmain.aspx?d=83751\n// Last checked version: Embarcadero C++ 6.21\n// See also: http://www.boost.org/libs/utility/value_init.htm#compiler_issues\n// (Niels Dekker, LKEB, April 2010)\n#  define BOOST_NO_COMPLETE_VALUE_INITIALIZATION\n\n#  if defined(NDEBUG) && defined(__cplusplus)\n      // fix broken <cstring> so that Boost.test works:\n#     include <cstring>\n#     undef strcmp\n#  endif\n   // fix broken errno declaration:\n#  include <errno.h>\n#  ifndef errno\n#     define errno errno\n#  endif\n\n#endif\n\n// Reportedly, #pragma once is supported since C++ Builder 2010\n#if (__CODEGEARC__ >= 0x620)\n#  define BOOST_HAS_PRAGMA_ONCE\n#endif\n\n//\n// C++0x macros:\n//\n#if (__CODEGEARC__ <= 0x620)\n#define BOOST_NO_CXX11_STATIC_ASSERT\n#else\n#define BOOST_HAS_STATIC_ASSERT\n#endif\n#define BOOST_HAS_CHAR16_T\n#define BOOST_HAS_CHAR32_T\n#define BOOST_HAS_LONG_LONG\n// #define BOOST_HAS_ALIGNOF\n#define BOOST_HAS_DECLTYPE\n#define BOOST_HAS_EXPLICIT_CONVERSION_OPS\n// #define BOOST_HAS_RVALUE_REFS\n#define BOOST_HAS_SCOPED_ENUM\n// #define BOOST_HAS_STATIC_ASSERT\n#define BOOST_HAS_STD_TYPE_TRAITS\n\n#define BOOST_NO_CXX11_AUTO_DECLARATIONS\n#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#define BOOST_NO_CXX11_CONSTEXPR\n#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#define BOOST_NO_CXX11_DELETED_FUNCTIONS\n#define BOOST_NO_CXX11_EXTERN_TEMPLATE\n#define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#define BOOST_NO_CXX11_LAMBDAS\n#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#define BOOST_NO_CXX11_NOEXCEPT\n#define BOOST_NO_CXX11_NULLPTR\n#define BOOST_NO_CXX11_RANGE_BASED_FOR\n#define BOOST_NO_CXX11_RAW_LITERALS\n#define BOOST_NO_CXX11_RVALUE_REFERENCES\n#define BOOST_NO_SFINAE_EXPR\n#define BOOST_NO_CXX11_TEMPLATE_ALIASES\n#define BOOST_NO_CXX11_UNICODE_LITERALS\n#define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#define BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#define BOOST_NO_CXX11_ALIGNAS\n#define BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#define BOOST_NO_CXX11_INLINE_NAMESPACES\n#define BOOST_NO_CXX11_REF_QUALIFIERS\n#define BOOST_NO_CXX11_FINAL\n\n// C++ 14:\n#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)\n#  define BOOST_NO_CXX14_AGGREGATE_NSDMI\n#endif\n#if !defined(__cpp_binary_literals) || (__cpp_binary_literals < 201304)\n#  define BOOST_NO_CXX14_BINARY_LITERALS\n#endif\n#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)\n#  define BOOST_NO_CXX14_CONSTEXPR\n#endif\n#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304)\n#  define BOOST_NO_CXX14_DECLTYPE_AUTO\n#endif\n#if (__cplusplus < 201304) // There's no SD6 check for this....\n#  define BOOST_NO_CXX14_DIGIT_SEPARATORS\n#endif\n#if !defined(__cpp_generic_lambdas) || (__cpp_generic_lambdas < 201304)\n#  define BOOST_NO_CXX14_GENERIC_LAMBDAS\n#endif\n#if !defined(__cpp_init_captures) || (__cpp_init_captures < 201304)\n#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES\n#endif\n#if !defined(__cpp_return_type_deduction) || (__cpp_return_type_deduction < 201304)\n#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION\n#endif\n#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)\n#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES\n#endif\n\n//\n// TR1 macros:\n//\n#define BOOST_HAS_TR1_HASH\n#define BOOST_HAS_TR1_TYPE_TRAITS\n#define BOOST_HAS_TR1_UNORDERED_MAP\n#define BOOST_HAS_TR1_UNORDERED_SET\n\n#define BOOST_HAS_MACRO_USE_FACET\n\n#define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n\n// On non-Win32 platforms let the platform config figure this out:\n#ifdef _WIN32\n#  define BOOST_HAS_STDINT_H\n#endif\n\n//\n// __int64:\n//\n#if !defined(__STRICT_ANSI__)\n#  define BOOST_HAS_MS_INT64\n#endif\n//\n// check for exception handling support:\n//\n#if !defined(_CPPUNWIND) && !defined(BOOST_CPPUNWIND) && !defined(__EXCEPTIONS) && !defined(BOOST_NO_EXCEPTIONS)\n#  define BOOST_NO_EXCEPTIONS\n#endif\n//\n// all versions have a <dirent.h>:\n//\n#if !defined(__STRICT_ANSI__)\n#  define BOOST_HAS_DIRENT_H\n#endif\n//\n// all versions support __declspec:\n//\n#if defined(__STRICT_ANSI__)\n// config/platform/win32.hpp will define BOOST_SYMBOL_EXPORT, etc., unless already defined\n#  define BOOST_SYMBOL_EXPORT\n#endif\n//\n// ABI fixing headers:\n//\n#ifndef BOOST_ABI_PREFIX\n#  define BOOST_ABI_PREFIX \"boost/config/abi/borland_prefix.hpp\"\n#endif\n#ifndef BOOST_ABI_SUFFIX\n#  define BOOST_ABI_SUFFIX \"boost/config/abi/borland_suffix.hpp\"\n#endif\n//\n// Disable Win32 support in ANSI mode:\n//\n#  pragma defineonoption BOOST_DISABLE_WIN32 -A\n//\n// MSVC compatibility mode does some nasty things:\n// TODO: look up if this doesn't apply to the whole 12xx range\n//\n#if defined(_MSC_VER) && (_MSC_VER <= 1200)\n#  define BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP\n#  define BOOST_NO_VOID_RETURNS\n#endif\n\n#define BOOST_COMPILER \"CodeGear C++ version \" BOOST_STRINGIZE(__CODEGEARC__)\n\n"
  },
  {
    "path": "benchmarks/boost/config/compiler/comeau.hpp",
    "content": "//  (C) Copyright John Maddock 2001. \n//  (C) Copyright Douglas Gregor 2001. \n//  (C) Copyright Peter Dimov 2001. \n//  (C) Copyright Aleksey Gurtovoy 2003. \n//  (C) Copyright Beman Dawes 2003. \n//  (C) Copyright Jens Maurer 2003. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Comeau C++ compiler setup:\n\n#include \"boost/config/compiler/common_edg.hpp\"\n\n#if (__COMO_VERSION__ <= 4245)\n\n#  if defined(_MSC_VER) && _MSC_VER <= 1300\n#     if _MSC_VER > 100\n         // only set this in non-strict mode:\n#        define BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP\n#     endif\n#  endif\n\n// Void returns don't work when emulating VC 6 (Peter Dimov)\n// TODO: look up if this doesn't apply to the whole 12xx range\n#  if defined(_MSC_VER) && (_MSC_VER < 1300)\n#     define BOOST_NO_VOID_RETURNS\n#  endif\n\n#endif  // version 4245\n\n//\n// enable __int64 support in VC emulation mode\n//\n#  if defined(_MSC_VER) && (_MSC_VER >= 1200)\n#     define BOOST_HAS_MS_INT64\n#  endif\n\n#define BOOST_COMPILER \"Comeau compiler version \" BOOST_STRINGIZE(__COMO_VERSION__)\n\n//\n// versions check:\n// we don't know Comeau prior to version 4245:\n#if __COMO_VERSION__ < 4245\n#  error \"Compiler not configured - please reconfigure\"\n#endif\n//\n// last known and checked version is 4245:\n#if (__COMO_VERSION__ > 4245)\n#  if defined(BOOST_ASSERT_CONFIG)\n#     error \"Unknown compiler version - please run the configure tests and report the results\"\n#  endif\n#endif\n\n\n\n\n"
  },
  {
    "path": "benchmarks/boost/config/compiler/common_edg.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2002.\n//  (C) Copyright Jens Maurer 2001.\n//  (C) Copyright David Abrahams 2002.\n//  (C) Copyright Aleksey Gurtovoy 2002.\n//  (C) Copyright Markus Schoepflin 2005.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//\n// Options common to all edg based compilers.\n//\n// This is included from within the individual compiler mini-configs.\n\n#ifndef  __EDG_VERSION__\n#  error This file requires that __EDG_VERSION__ be defined.\n#endif\n\n#if (__EDG_VERSION__ <= 238)\n#   define BOOST_NO_INTEGRAL_INT64_T\n#   define BOOST_NO_SFINAE\n#endif\n\n#if (__EDG_VERSION__ <= 240)\n#   define BOOST_NO_VOID_RETURNS\n#endif\n\n#if (__EDG_VERSION__ <= 241) && !defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)\n#   define BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP\n#endif\n\n#if (__EDG_VERSION__ <= 244) && !defined(BOOST_NO_TEMPLATE_TEMPLATES)\n#   define BOOST_NO_TEMPLATE_TEMPLATES\n#endif\n\n#if (__EDG_VERSION__ < 300) && !defined(BOOST_NO_IS_ABSTRACT)\n#   define BOOST_NO_IS_ABSTRACT\n#endif\n\n#if (__EDG_VERSION__ <= 303) && !defined(BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL)\n#   define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL\n#endif\n\n// See also kai.hpp which checks a Kai-specific symbol for EH\n# if !defined(__KCC) && !defined(__EXCEPTIONS) && !defined(BOOST_NO_EXCEPTIONS)\n#     define BOOST_NO_EXCEPTIONS\n# endif\n\n# if !defined(__NO_LONG_LONG)\n#     define BOOST_HAS_LONG_LONG\n# else\n#     define BOOST_NO_LONG_LONG\n# endif\n\n// Not sure what version was the first to support #pragma once, but\n// different EDG-based compilers (e.g. Intel) supported it for ages.\n// Add a proper version check if it causes problems.\n#define BOOST_HAS_PRAGMA_ONCE\n\n//\n// C++0x features\n//\n//   See above for BOOST_NO_LONG_LONG\n//\n#if (__EDG_VERSION__ < 310)\n#  define BOOST_NO_CXX11_EXTERN_TEMPLATE\n#endif\n#if (__EDG_VERSION__ <= 310)\n// No support for initializer lists\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#endif\n#if (__EDG_VERSION__ < 400)\n#  define BOOST_NO_CXX11_VARIADIC_MACROS\n#endif\n\n#define BOOST_NO_CXX11_AUTO_DECLARATIONS\n#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#define BOOST_NO_CXX11_CHAR16_T\n#define BOOST_NO_CXX11_CHAR32_T\n#define BOOST_NO_CXX11_CONSTEXPR\n#define BOOST_NO_CXX11_DECLTYPE\n#define BOOST_NO_CXX11_DECLTYPE_N3276\n#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#define BOOST_NO_CXX11_DELETED_FUNCTIONS\n#define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#define BOOST_NO_CXX11_LAMBDAS\n#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#define BOOST_NO_CXX11_NOEXCEPT\n#define BOOST_NO_CXX11_NULLPTR\n#define BOOST_NO_CXX11_RANGE_BASED_FOR\n#define BOOST_NO_CXX11_RAW_LITERALS\n#define BOOST_NO_CXX11_RVALUE_REFERENCES\n#define BOOST_NO_CXX11_SCOPED_ENUMS\n#define BOOST_NO_SFINAE_EXPR\n#define BOOST_NO_CXX11_STATIC_ASSERT\n#define BOOST_NO_CXX11_TEMPLATE_ALIASES\n#define BOOST_NO_CXX11_UNICODE_LITERALS\n#define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#define BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#define BOOST_NO_CXX11_ALIGNAS\n#define BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#define BOOST_NO_CXX11_INLINE_NAMESPACES\n#define BOOST_NO_CXX11_REF_QUALIFIERS\n#define BOOST_NO_CXX11_FINAL\n\n// C++ 14:\n#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)\n#  define BOOST_NO_CXX14_AGGREGATE_NSDMI\n#endif\n#if !defined(__cpp_binary_literals) || (__cpp_binary_literals < 201304)\n#  define BOOST_NO_CXX14_BINARY_LITERALS\n#endif\n#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)\n#  define BOOST_NO_CXX14_CONSTEXPR\n#endif\n#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304)\n#  define BOOST_NO_CXX14_DECLTYPE_AUTO\n#endif\n#if (__cplusplus < 201304) // There's no SD6 check for this....\n#  define BOOST_NO_CXX14_DIGIT_SEPARATORS\n#endif\n#if !defined(__cpp_generic_lambdas) || (__cpp_generic_lambdas < 201304)\n#  define BOOST_NO_CXX14_GENERIC_LAMBDAS\n#endif\n#if !defined(__cpp_init_captures) || (__cpp_init_captures < 201304)\n#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES\n#endif\n#if !defined(__cpp_return_type_deduction) || (__cpp_return_type_deduction < 201304)\n#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION\n#endif\n#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)\n#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES\n#endif\n\n#ifdef c_plusplus\n// EDG has \"long long\" in non-strict mode\n// However, some libraries have insufficient \"long long\" support\n// #define BOOST_HAS_LONG_LONG\n#endif\n"
  },
  {
    "path": "benchmarks/boost/config/compiler/compaq_cxx.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Tru64 C++ compiler setup (now HP):\n\n#define BOOST_COMPILER \"HP Tru64 C++ \" BOOST_STRINGIZE(__DECCXX_VER)\n\n#include \"boost/config/compiler/common_edg.hpp\"\n\n//\n// versions check:\n// Nothing to do here?\n\n\n\n"
  },
  {
    "path": "benchmarks/boost/config/compiler/cray.hpp",
    "content": "//  (C) Copyright John Maddock 2011.\n//  (C) Copyright Cray, Inc. 2013\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Greenhills C compiler setup:\n\n#define BOOST_COMPILER \"Cray C version \" BOOST_STRINGIZE(_RELEASE)\n\n#if _RELEASE < 8\n#  error \"Boost is not configured for Cray compilers prior to version 8, please try the configure script.\"\n#endif\n\n//\n// Check this is a recent EDG based compiler, otherwise we don't support it here:\n//\n#ifndef __EDG_VERSION__\n#  error \"Unsupported Cray compiler, please try running the configure script.\"\n#endif\n\n#include \"boost/config/compiler/common_edg.hpp\"\n\n\n//\n//\n#define BOOST_NO_CXX11_STATIC_ASSERT\n#define BOOST_NO_CXX11_AUTO_DECLARATIONS\n#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#define BOOST_HAS_NRVO\n#define BOOST_NO_CXX11_VARIADIC_MACROS\n#define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#define BOOST_NO_CXX11_UNICODE_LITERALS\n#define BOOST_NO_TWO_PHASE_NAME_LOOKUP\n#define BOOST_HAS_NRVO\n#define BOOST_NO_CXX11_TEMPLATE_ALIASES\n#define BOOST_NO_CXX11_STATIC_ASSERT\n#define BOOST_NO_SFINAE_EXPR\n#define BOOST_NO_CXX11_SCOPED_ENUMS\n#define BOOST_NO_CXX11_RVALUE_REFERENCES\n#define BOOST_NO_CXX11_RANGE_BASED_FOR\n#define BOOST_NO_CXX11_RAW_LITERALS\n#define BOOST_NO_CXX11_NULLPTR\n#define BOOST_NO_CXX11_NOEXCEPT\n#define BOOST_NO_CXX11_LAMBDAS\n#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#define BOOST_NO_CXX11_DELETED_FUNCTIONS\n#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#define BOOST_NO_CXX11_DECLTYPE_N3276\n#define BOOST_NO_CXX11_DECLTYPE\n#define BOOST_NO_CXX11_CONSTEXPR\n#define BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#define BOOST_NO_COMPLETE_VALUE_INITIALIZATION\n#define BOOST_NO_CXX11_CHAR32_T\n#define BOOST_NO_CXX11_CHAR16_T\n#define BOOST_NO_CXX11_REF_QUALIFIERS\n#define BOOST_NO_CXX11_FINAL\n\n\n//#define BOOST_BCB_PARTIAL_SPECIALIZATION_BUG\n#define BOOST_MATH_DISABLE_STD_FPCLASSIFY\n//#define BOOST_HAS_FPCLASSIFY\n\n#define BOOST_SP_USE_PTHREADS \n#define BOOST_AC_USE_PTHREADS \n\n/* everything that follows is working around what are thought to be\n * compiler shortcomings.  Revist all of these regularly.\n */\n\n//#define BOOST_USE_ENUM_STATIC_ASSERT\n//#define BOOST_BUGGY_INTEGRAL_CONSTANT_EXPRESSIONS //(this may be implied by the previous #define\n\n// These constants should be provided by the \n// compiler, at least when -hgnu is asserted on the command line.\n\n#ifndef __ATOMIC_RELAXED\n#define __ATOMIC_RELAXED 0\n#define __ATOMIC_CONSUME 1\n#define __ATOMIC_ACQUIRE 2\n#define __ATOMIC_RELEASE 3\n#define __ATOMIC_ACQ_REL 4\n#define __ATOMIC_SEQ_CST 5\n#endif\n\n\n\n"
  },
  {
    "path": "benchmarks/boost/config/compiler/digitalmars.hpp",
    "content": "//  Copyright (C) Christof Meerwald 2003\n//  Copyright (C) Dan Watkins 2003\n//\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  Digital Mars C++ compiler setup:\n#define BOOST_COMPILER __DMC_VERSION_STRING__\n\n#define BOOST_HAS_LONG_LONG\n#define BOOST_HAS_PRAGMA_ONCE\n\n#if !defined(BOOST_STRICT_CONFIG)\n#define BOOST_NO_MEMBER_TEMPLATE_FRIENDS\n#define BOOST_NO_OPERATORS_IN_NAMESPACE\n#define BOOST_NO_UNREACHABLE_RETURN_DETECTION\n#define BOOST_NO_SFINAE\n#define BOOST_NO_USING_TEMPLATE\n#define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL\n#endif\n\n//\n// has macros:\n#define BOOST_HAS_DIRENT_H\n#define BOOST_HAS_STDINT_H\n#define BOOST_HAS_WINTHREADS\n\n#if (__DMC__ >= 0x847)\n#define BOOST_HAS_EXPM1\n#define BOOST_HAS_LOG1P\n#endif\n\n//\n// Is this really the best way to detect whether the std lib is in namespace std?\n//\n#ifdef __cplusplus\n#include <cstddef>\n#endif\n#if !defined(__STL_IMPORT_VENDOR_CSTD) && !defined(_STLP_IMPORT_VENDOR_CSTD)\n#  define BOOST_NO_STDC_NAMESPACE\n#endif\n\n\n// check for exception handling support:\n#if !defined(_CPPUNWIND) && !defined(BOOST_NO_EXCEPTIONS)\n#  define BOOST_NO_EXCEPTIONS\n#endif\n\n//\n// C++0x features\n//\n#define BOOST_NO_CXX11_AUTO_DECLARATIONS\n#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#define BOOST_NO_CXX11_CHAR16_T\n#define BOOST_NO_CXX11_CHAR32_T\n#define BOOST_NO_CXX11_CONSTEXPR\n#define BOOST_NO_CXX11_DECLTYPE\n#define BOOST_NO_CXX11_DECLTYPE_N3276\n#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#define BOOST_NO_CXX11_DELETED_FUNCTIONS\n#define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#define BOOST_NO_CXX11_EXTERN_TEMPLATE\n#define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#define BOOST_NO_CXX11_LAMBDAS\n#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#define BOOST_NO_CXX11_NOEXCEPT\n#define BOOST_NO_CXX11_NULLPTR\n#define BOOST_NO_CXX11_RANGE_BASED_FOR\n#define BOOST_NO_CXX11_RAW_LITERALS\n#define BOOST_NO_CXX11_RVALUE_REFERENCES\n#define BOOST_NO_CXX11_SCOPED_ENUMS\n#define BOOST_NO_SFINAE_EXPR\n#define BOOST_NO_CXX11_STATIC_ASSERT\n#define BOOST_NO_CXX11_TEMPLATE_ALIASES\n#define BOOST_NO_CXX11_UNICODE_LITERALS\n#define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#define BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#define BOOST_NO_CXX11_ALIGNAS\n#define BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#define BOOST_NO_CXX11_INLINE_NAMESPACES\n#define BOOST_NO_CXX11_REF_QUALIFIERS\n#define BOOST_NO_CXX11_FINAL\n\n// C++ 14:\n#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)\n#  define BOOST_NO_CXX14_AGGREGATE_NSDMI\n#endif\n#if !defined(__cpp_binary_literals) || (__cpp_binary_literals < 201304)\n#  define BOOST_NO_CXX14_BINARY_LITERALS\n#endif\n#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)\n#  define BOOST_NO_CXX14_CONSTEXPR\n#endif\n#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304)\n#  define BOOST_NO_CXX14_DECLTYPE_AUTO\n#endif\n#if (__cplusplus < 201304) // There's no SD6 check for this....\n#  define BOOST_NO_CXX14_DIGIT_SEPARATORS\n#endif\n#if !defined(__cpp_generic_lambdas) || (__cpp_generic_lambdas < 201304)\n#  define BOOST_NO_CXX14_GENERIC_LAMBDAS\n#endif\n#if !defined(__cpp_init_captures) || (__cpp_init_captures < 201304)\n#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES\n#endif\n#if !defined(__cpp_return_type_deduction) || (__cpp_return_type_deduction < 201304)\n#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION\n#endif\n#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)\n#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES\n#endif\n\n#if (__DMC__ <= 0x840)\n#error \"Compiler not supported or configured - please reconfigure\"\n#endif\n//\n// last known and checked version is ...:\n#if (__DMC__ > 0x848)\n#  if defined(BOOST_ASSERT_CONFIG)\n#     error \"Unknown compiler version - please run the configure tests and report the results\"\n#  endif\n#endif\n"
  },
  {
    "path": "benchmarks/boost/config/compiler/gcc.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003.\n//  (C) Copyright Darin Adler 2001 - 2002.\n//  (C) Copyright Jens Maurer 2001 - 2002.\n//  (C) Copyright Beman Dawes 2001 - 2003.\n//  (C) Copyright Douglas Gregor 2002.\n//  (C) Copyright David Abrahams 2002 - 2003.\n//  (C) Copyright Synge Todo 2003.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  GNU C++ compiler setup.\n\n//\n// Define BOOST_GCC so we know this is \"real\" GCC and not some pretender:\n//\n#define BOOST_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)\n#if !defined(__CUDACC__)\n#define BOOST_GCC BOOST_GCC_VERSION\n#endif\n\n#if defined(__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus >= 201103L)\n#  define BOOST_GCC_CXX11\n#endif\n\n#if __GNUC__ == 3\n#  if defined (__PATHSCALE__)\n#     define BOOST_NO_TWO_PHASE_NAME_LOOKUP\n#     define BOOST_NO_IS_ABSTRACT\n#  endif\n\n#  if __GNUC_MINOR__ < 4\n#     define BOOST_NO_IS_ABSTRACT\n#  endif\n#  define BOOST_NO_CXX11_EXTERN_TEMPLATE\n#endif\n#if __GNUC__ < 4\n//\n// All problems to gcc-3.x and earlier here:\n//\n#define BOOST_NO_TWO_PHASE_NAME_LOOKUP\n#  ifdef __OPEN64__\n#     define BOOST_NO_IS_ABSTRACT\n#  endif\n#endif\n\n// GCC prior to 3.4 had #pragma once too but it didn't work well with filesystem links\n#if BOOST_GCC_VERSION >= 30400\n#define BOOST_HAS_PRAGMA_ONCE\n#endif\n\n#if BOOST_GCC_VERSION < 40400\n// Previous versions of GCC did not completely implement value-initialization:\n// GCC Bug 30111, \"Value-initialization of POD base class doesn't initialize\n// members\", reported by Jonathan Wakely in 2006,\n// http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30111 (fixed for GCC 4.4)\n// GCC Bug 33916, \"Default constructor fails to initialize array members\",\n// reported by Michael Elizabeth Chastain in 2007,\n// http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33916 (fixed for GCC 4.2.4)\n// See also: http://www.boost.org/libs/utility/value_init.htm#compiler_issues\n#define BOOST_NO_COMPLETE_VALUE_INITIALIZATION\n#endif\n\n#if !defined(__EXCEPTIONS) && !defined(BOOST_NO_EXCEPTIONS)\n# define BOOST_NO_EXCEPTIONS\n#endif\n\n\n//\n// Threading support: Turn this on unconditionally here (except for\n// those platforms where we can know for sure). It will get turned off again\n// later if no threading API is detected.\n//\n#if !defined(__MINGW32__) && !defined(linux) && !defined(__linux) && !defined(__linux__)\n# define BOOST_HAS_THREADS\n#endif\n\n//\n// gcc has \"long long\"\n// Except on Darwin with standard compliance enabled (-pedantic)\n// Apple gcc helpfully defines this macro we can query\n//\n#if !defined(__DARWIN_NO_LONG_LONG)\n# define BOOST_HAS_LONG_LONG\n#endif\n\n//\n// gcc implements the named return value optimization since version 3.1\n//\n#define BOOST_HAS_NRVO\n\n// Branch prediction hints\n#define BOOST_LIKELY(x) __builtin_expect(x, 1)\n#define BOOST_UNLIKELY(x) __builtin_expect(x, 0)\n\n//\n// Dynamic shared object (DSO) and dynamic-link library (DLL) support\n//\n#if __GNUC__ >= 4\n#  if (defined(_WIN32) || defined(__WIN32__) || defined(WIN32)) && !defined(__CYGWIN__)\n     // All Win32 development environments, including 64-bit Windows and MinGW, define\n     // _WIN32 or one of its variant spellings. Note that Cygwin is a POSIX environment,\n     // so does not define _WIN32 or its variants.\n#    define BOOST_HAS_DECLSPEC\n#    define BOOST_SYMBOL_EXPORT __attribute__((__dllexport__))\n#    define BOOST_SYMBOL_IMPORT __attribute__((__dllimport__))\n#  else\n#    define BOOST_SYMBOL_EXPORT __attribute__((__visibility__(\"default\")))\n#    define BOOST_SYMBOL_IMPORT\n#  endif\n#  define BOOST_SYMBOL_VISIBLE __attribute__((__visibility__(\"default\")))\n#else\n// config/platform/win32.hpp will define BOOST_SYMBOL_EXPORT, etc., unless already defined\n#  define BOOST_SYMBOL_EXPORT\n#endif\n\n//\n// RTTI and typeinfo detection is possible post gcc-4.3:\n//\n#if BOOST_GCC_VERSION > 40300\n#  ifndef __GXX_RTTI\n#     ifndef BOOST_NO_TYPEID\n#        define BOOST_NO_TYPEID\n#     endif\n#     ifndef BOOST_NO_RTTI\n#        define BOOST_NO_RTTI\n#     endif\n#  endif\n#endif\n\n//\n// Recent GCC versions have __int128 when in 64-bit mode.\n//\n// We disable this if the compiler is really nvcc as it\n// doesn't actually support __int128 as of CUDA_VERSION=5000\n// even though it defines __SIZEOF_INT128__.\n// See https://svn.boost.org/trac/boost/ticket/8048\n// Only re-enable this for nvcc if you're absolutely sure\n// of the circumstances under which it's supported:\n//\n#if defined(__SIZEOF_INT128__) && !defined(__CUDACC__)\n#  define BOOST_HAS_INT128\n#endif\n//\n// Recent GCC versions have a __float128 native type, we need to\n// include a std lib header to detect this - not ideal, but we'll\n// be including <cstddef> later anyway when we select the std lib.\n//\n#ifdef __cplusplus\n#include <cstddef>\n#else\n#include <stddef.h>\n#endif\n#if defined(_GLIBCXX_USE_FLOAT128) && !defined(__STRICT_ANSI__)\n# define BOOST_HAS_FLOAT128\n#endif\n\n// C++0x features in 4.3.n and later\n//\n#if (BOOST_GCC_VERSION >= 40300) && defined(BOOST_GCC_CXX11)\n// C++0x features are only enabled when -std=c++0x or -std=gnu++0x are\n// passed on the command line, which in turn defines\n// __GXX_EXPERIMENTAL_CXX0X__.\n#  define BOOST_HAS_DECLTYPE\n#  define BOOST_HAS_RVALUE_REFS\n#  define BOOST_HAS_STATIC_ASSERT\n#  define BOOST_HAS_VARIADIC_TMPL\n#else\n#  define BOOST_NO_CXX11_DECLTYPE\n#  define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#  define BOOST_NO_CXX11_RVALUE_REFERENCES\n#  define BOOST_NO_CXX11_STATIC_ASSERT\n#endif\n\n// C++0x features in 4.4.n and later\n//\n#if (BOOST_GCC_VERSION < 40400) || !defined(BOOST_GCC_CXX11)\n#  define BOOST_NO_CXX11_AUTO_DECLARATIONS\n#  define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#  define BOOST_NO_CXX11_CHAR16_T\n#  define BOOST_NO_CXX11_CHAR32_T\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#  define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#  define BOOST_NO_CXX11_DELETED_FUNCTIONS\n#  define BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#  define BOOST_NO_CXX11_INLINE_NAMESPACES\n#  define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#endif\n\n#if BOOST_GCC_VERSION < 40500\n#  define BOOST_NO_SFINAE_EXPR\n#endif\n\n// GCC 4.5 forbids declaration of defaulted functions in private or protected sections\n#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ == 5) || !defined(BOOST_GCC_CXX11)\n#  define BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS\n#endif\n\n// C++0x features in 4.5.0 and later\n//\n#if (BOOST_GCC_VERSION < 40500) || !defined(BOOST_GCC_CXX11)\n#  define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#  define BOOST_NO_CXX11_LAMBDAS\n#  define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#  define BOOST_NO_CXX11_RAW_LITERALS\n#  define BOOST_NO_CXX11_UNICODE_LITERALS\n#endif\n\n// C++0x features in 4.5.1 and later\n//\n#if (BOOST_GCC_VERSION < 40501) || !defined(BOOST_GCC_CXX11)\n// scoped enums have a serious bug in 4.4.0, so define BOOST_NO_CXX11_SCOPED_ENUMS before 4.5.1\n// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38064\n#  define BOOST_NO_CXX11_SCOPED_ENUMS\n#endif\n\n// C++0x features in 4.6.n and later\n//\n#if (BOOST_GCC_VERSION < 40600) || !defined(BOOST_GCC_CXX11)\n#define BOOST_NO_CXX11_CONSTEXPR\n#define BOOST_NO_CXX11_NOEXCEPT\n#define BOOST_NO_CXX11_NULLPTR\n#define BOOST_NO_CXX11_RANGE_BASED_FOR\n#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#endif\n\n// C++0x features in 4.7.n and later\n//\n#if (BOOST_GCC_VERSION < 40700) || !defined(BOOST_GCC_CXX11)\n#  define BOOST_NO_CXX11_FINAL\n#  define BOOST_NO_CXX11_TEMPLATE_ALIASES\n#  define BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#  define BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS\n#endif\n\n// C++0x features in 4.8.n and later\n//\n#if (BOOST_GCC_VERSION < 40800) || !defined(BOOST_GCC_CXX11)\n#  define BOOST_NO_CXX11_ALIGNAS\n#endif\n\n// C++0x features in 4.8.1 and later\n//\n#if (BOOST_GCC_VERSION < 40801) || !defined(BOOST_GCC_CXX11)\n#  define BOOST_NO_CXX11_DECLTYPE_N3276\n#  define BOOST_NO_CXX11_REF_QUALIFIERS\n#  define BOOST_NO_CXX14_BINARY_LITERALS\n#endif\n\n// C++14 features in 4.9.0 and later\n//\n#if (BOOST_GCC_VERSION < 40900) || (__cplusplus < 201300)\n#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION\n#  define BOOST_NO_CXX14_GENERIC_LAMBDAS\n#  define BOOST_NO_CXX14_DIGIT_SEPARATORS\n#  define BOOST_NO_CXX14_DECLTYPE_AUTO\n#  if !((BOOST_GCC_VERSION >= 40801) && (BOOST_GCC_VERSION < 40900) && defined(BOOST_GCC_CXX11))\n#     define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES\n#  endif\n#endif\n\n\n// C++ 14:\n#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)\n#  define BOOST_NO_CXX14_AGGREGATE_NSDMI\n#endif\n#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)\n#  define BOOST_NO_CXX14_CONSTEXPR\n#endif\n#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)\n#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES\n#endif\n\n//\n// Unused attribute:\n#if __GNUC__ >= 4\n#  define BOOST_ATTRIBUTE_UNUSED __attribute__((__unused__))\n#endif\n//\n// __builtin_unreachable:\n#if BOOST_GCC_VERSION >= 40800\n#define BOOST_UNREACHABLE_RETURN(x) __builtin_unreachable();\n#endif\n\n#ifndef BOOST_COMPILER\n#  define BOOST_COMPILER \"GNU C++ version \" __VERSION__\n#endif\n\n// ConceptGCC compiler:\n//   http://www.generic-programming.org/software/ConceptGCC/\n#ifdef __GXX_CONCEPTS__\n#  define BOOST_HAS_CONCEPTS\n#  define BOOST_COMPILER \"ConceptGCC version \" __VERSION__\n#endif\n\n// versions check:\n// we don't know gcc prior to version 3.30:\n#if (BOOST_GCC_VERSION< 30300)\n#  error \"Compiler not configured - please reconfigure\"\n#endif\n//\n// last known and checked version is 4.9:\n#if (BOOST_GCC_VERSION > 40900)\n#  if defined(BOOST_ASSERT_CONFIG)\n#     error \"Unknown compiler version - please run the configure tests and report the results\"\n#  else\n// we don't emit warnings here anymore since there are no defect macros defined for\n// gcc post 3.4, so any failures are gcc regressions...\n//#     warning \"Unknown compiler version - please run the configure tests and report the results\"\n#  endif\n#endif\n\n"
  },
  {
    "path": "benchmarks/boost/config/compiler/gcc_xml.hpp",
    "content": "//  (C) Copyright John Maddock 2006.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  GCC-XML C++ compiler setup:\n\n#  if !defined(__GCCXML_GNUC__) || ((__GCCXML_GNUC__ <= 3) && (__GCCXML_GNUC_MINOR__ <= 3))\n#     define BOOST_NO_IS_ABSTRACT\n#  endif\n\n//\n// Threading support: Turn this on unconditionally here (except for\n// those platforms where we can know for sure). It will get turned off again\n// later if no threading API is detected.\n//\n#if !defined(__MINGW32__) && !defined(_MSC_VER) && !defined(linux) && !defined(__linux) && !defined(__linux__)\n# define BOOST_HAS_THREADS\n#endif\n\n//\n// gcc has \"long long\"\n//\n#define BOOST_HAS_LONG_LONG\n\n// C++0x features:\n//\n#  define BOOST_NO_CXX11_CONSTEXPR\n#  define BOOST_NO_CXX11_NULLPTR\n#  define BOOST_NO_CXX11_TEMPLATE_ALIASES\n#  define BOOST_NO_CXX11_DECLTYPE\n#  define BOOST_NO_CXX11_DECLTYPE_N3276\n#  define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#  define BOOST_NO_CXX11_RVALUE_REFERENCES\n#  define BOOST_NO_CXX11_STATIC_ASSERT\n#  define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#  define BOOST_NO_CXX11_VARIADIC_MACROS\n#  define BOOST_NO_CXX11_AUTO_DECLARATIONS\n#  define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#  define BOOST_NO_CXX11_CHAR16_T\n#  define BOOST_NO_CXX11_CHAR32_T\n#  define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#  define BOOST_NO_CXX11_DELETED_FUNCTIONS\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#  define BOOST_NO_CXX11_SCOPED_ENUMS\n#  define BOOST_NO_SFINAE_EXPR\n#  define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#  define BOOST_NO_CXX11_LAMBDAS\n#  define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#  define BOOST_NO_CXX11_RANGE_BASED_FOR\n#  define BOOST_NO_CXX11_RAW_LITERALS\n#  define BOOST_NO_CXX11_UNICODE_LITERALS\n#  define BOOST_NO_CXX11_NOEXCEPT\n#  define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#  define BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#  define BOOST_NO_CXX11_ALIGNAS\n#  define BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#  define BOOST_NO_CXX11_INLINE_NAMESPACES\n#  define BOOST_NO_CXX11_REF_QUALIFIERS\n#define BOOST_NO_CXX11_FINAL\n\n// C++ 14:\n#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)\n#  define BOOST_NO_CXX14_AGGREGATE_NSDMI\n#endif\n#if !defined(__cpp_binary_literals) || (__cpp_binary_literals < 201304)\n#  define BOOST_NO_CXX14_BINARY_LITERALS\n#endif\n#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)\n#  define BOOST_NO_CXX14_CONSTEXPR\n#endif\n#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304)\n#  define BOOST_NO_CXX14_DECLTYPE_AUTO\n#endif\n#if (__cplusplus < 201304) // There's no SD6 check for this....\n#  define BOOST_NO_CXX14_DIGIT_SEPARATORS\n#endif\n#if !defined(__cpp_generic_lambdas) || (__cpp_generic_lambdas < 201304)\n#  define BOOST_NO_CXX14_GENERIC_LAMBDAS\n#endif\n#if !defined(__cpp_init_captures) || (__cpp_init_captures < 201304)\n#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES\n#endif\n#if !defined(__cpp_return_type_deduction) || (__cpp_return_type_deduction < 201304)\n#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION\n#endif\n#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)\n#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES\n#endif\n\n#define BOOST_COMPILER \"GCC-XML C++ version \" __GCCXML__\n\n\n"
  },
  {
    "path": "benchmarks/boost/config/compiler/greenhills.hpp",
    "content": "//  (C) Copyright John Maddock 2001. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Greenhills C++ compiler setup:\n\n#define BOOST_COMPILER \"Greenhills C++ version \" BOOST_STRINGIZE(__ghs)\n\n#include \"boost/config/compiler/common_edg.hpp\"\n\n//\n// versions check:\n// we don't support Greenhills prior to version 0:\n#if __ghs < 0\n#  error \"Compiler not supported or configured - please reconfigure\"\n#endif\n//\n// last known and checked version is 0:\n#if (__ghs > 0)\n#  if defined(BOOST_ASSERT_CONFIG)\n#     error \"Unknown compiler version - please run the configure tests and report the results\"\n#  endif\n#endif\n\n\n"
  },
  {
    "path": "benchmarks/boost/config/compiler/hp_acc.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003.\n//  (C) Copyright Jens Maurer 2001 - 2003.\n//  (C) Copyright Aleksey Gurtovoy 2002.\n//  (C) Copyright David Abrahams 2002 - 2003.\n//  (C) Copyright Toon Knapen 2003.\n//  (C) Copyright Boris Gubenko 2006 - 2007.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  HP aCC C++ compiler setup:\n\n#if defined(__EDG__)\n#include \"boost/config/compiler/common_edg.hpp\"\n#endif\n\n#if (__HP_aCC <= 33100)\n#    define BOOST_NO_INTEGRAL_INT64_T\n#    define BOOST_NO_OPERATORS_IN_NAMESPACE\n#  if !defined(_NAMESPACE_STD)\n#     define BOOST_NO_STD_LOCALE\n#     define BOOST_NO_STRINGSTREAM\n#  endif\n#endif\n\n#if (__HP_aCC <= 33300)\n// member templates are sufficiently broken that we disable them for now\n#    define BOOST_NO_MEMBER_TEMPLATES\n#    define BOOST_NO_DEPENDENT_NESTED_DERIVATIONS\n#    define BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE\n#endif\n\n#if (__HP_aCC <= 38000)\n#  define BOOST_NO_TWO_PHASE_NAME_LOOKUP\n#endif\n\n#if (__HP_aCC > 50000) && (__HP_aCC < 60000)\n#    define BOOST_NO_UNREACHABLE_RETURN_DETECTION\n#    define BOOST_NO_TEMPLATE_TEMPLATES\n#    define BOOST_NO_SWPRINTF\n#    define BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS\n#    define BOOST_NO_IS_ABSTRACT\n#    define BOOST_NO_MEMBER_TEMPLATE_FRIENDS\n#endif\n\n// optional features rather than defects:\n#if (__HP_aCC >= 33900)\n#    define BOOST_HAS_LONG_LONG\n#    define BOOST_HAS_PARTIAL_STD_ALLOCATOR\n#endif\n\n#if (__HP_aCC >= 50000 ) && (__HP_aCC <= 53800 ) || (__HP_aCC < 31300 )\n#    define BOOST_NO_MEMBER_TEMPLATE_KEYWORD\n#endif\n\n// This macro should not be defined when compiling in strict ansi\n// mode, but, currently, we don't have the ability to determine\n// what standard mode we are compiling with. Some future version\n// of aCC6 compiler will provide predefined macros reflecting the\n// compilation options, including the standard mode.\n#if (__HP_aCC >= 60000) || ((__HP_aCC > 38000) && defined(__hpxstd98))\n#    define BOOST_NO_TWO_PHASE_NAME_LOOKUP\n#endif\n\n#define BOOST_COMPILER \"HP aCC version \" BOOST_STRINGIZE(__HP_aCC)\n\n//\n// versions check:\n// we don't support HP aCC prior to version 33000:\n#if __HP_aCC < 33000\n#  error \"Compiler not supported or configured - please reconfigure\"\n#endif\n\n//\n// Extended checks for supporting aCC on PA-RISC\n#if __HP_aCC > 30000 && __HP_aCC < 50000\n#  if __HP_aCC < 38000\n      // versions prior to version A.03.80 not supported\n#     error \"Compiler version not supported - version A.03.80 or higher is required\"\n#  elif !defined(__hpxstd98)\n      // must compile using the option +hpxstd98 with version A.03.80 and above\n#     error \"Compiler option '+hpxstd98' is required for proper support\"\n#  endif //PA-RISC\n#endif\n\n//\n// C++0x features\n//\n//   See boost\\config\\suffix.hpp for BOOST_NO_LONG_LONG\n//\n#if !defined(__EDG__)\n\n#define BOOST_NO_CXX11_AUTO_DECLARATIONS\n#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#define BOOST_NO_CXX11_CHAR16_T\n#define BOOST_NO_CXX11_CHAR32_T\n#define BOOST_NO_CXX11_CONSTEXPR\n#define BOOST_NO_CXX11_DECLTYPE\n#define BOOST_NO_CXX11_DECLTYPE_N3276\n#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#define BOOST_NO_CXX11_DELETED_FUNCTIONS\n#define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#define BOOST_NO_CXX11_EXTERN_TEMPLATE\n#define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#define BOOST_NO_CXX11_LAMBDAS\n#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#define BOOST_NO_CXX11_NOEXCEPT\n#define BOOST_NO_CXX11_NULLPTR\n#define BOOST_NO_CXX11_RANGE_BASED_FOR\n#define BOOST_NO_CXX11_RAW_LITERALS\n#define BOOST_NO_CXX11_RVALUE_REFERENCES\n#define BOOST_NO_CXX11_SCOPED_ENUMS\n#define BOOST_NO_SFINAE_EXPR\n#define BOOST_NO_CXX11_STATIC_ASSERT\n#define BOOST_NO_CXX11_TEMPLATE_ALIASES\n#define BOOST_NO_CXX11_UNICODE_LITERALS\n#define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#define BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#define BOOST_NO_CXX11_ALIGNAS\n#define BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#define BOOST_NO_CXX11_INLINE_NAMESPACES\n#define BOOST_NO_CXX11_REF_QUALIFIERS\n\n/*\n  See https://forums13.itrc.hp.com/service/forums/questionanswer.do?threadId=1443331 and\n      https://forums13.itrc.hp.com/service/forums/questionanswer.do?threadId=1443436\n*/\n\n#if (__HP_aCC < 62500) || !defined(HP_CXX0x_SOURCE)\n  #define BOOST_NO_CXX11_VARIADIC_MACROS\n#endif\n\n#endif\n\n//\n// last known and checked version for HP-UX/ia64 is 61300\n// last known and checked version for PA-RISC is 38000\n#if ((__HP_aCC > 61300) || ((__HP_aCC > 38000) && defined(__hpxstd98)))\n#  if defined(BOOST_ASSERT_CONFIG)\n#     error \"Unknown compiler version - please run the configure tests and report the results\"\n#  endif\n#endif\n"
  },
  {
    "path": "benchmarks/boost/config/compiler/intel.hpp",
    "content": "//  (C) Copyright John Maddock 2001-8.\n//  (C) Copyright Peter Dimov 2001.\n//  (C) Copyright Jens Maurer 2001.\n//  (C) Copyright David Abrahams 2002 - 2003.\n//  (C) Copyright Aleksey Gurtovoy 2002 - 2003.\n//  (C) Copyright Guillaume Melquiond 2002 - 2003.\n//  (C) Copyright Beman Dawes 2003.\n//  (C) Copyright Martin Wille 2003.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Intel compiler setup:\n\n#if defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1500) && (defined(_MSC_VER) || defined(__GNUC__))\n\n#ifdef _MSC_VER\n\n#include <boost/config/compiler/visualc.hpp>\n\n#undef BOOST_MSVC\n#undef BOOST_MSVC_FULL_VER\n\n#if (__INTEL_COMPILER >= 1500) && (_MSC_VER >= 1900)\n//\n// These appear to be supported, even though VC++ may not support them:\n//\n#define BOOST_HAS_EXPM1\n#define BOOST_HAS_LOG1P\n#undef BOOST_NO_CXX14_BINARY_LITERALS\n// This one may be a little risky to enable??\n#undef BOOST_NO_SFINAE_EXPR\n\n#endif\n\n#else\n\n#include <boost/config/compiler/gcc.hpp>\n\n#undef BOOST_GCC_VERSION\n#undef BOOST_GCC_CXX11\n\n#endif\n\n#undef BOOST_COMPILER\n\n#if defined(__INTEL_COMPILER)\n#if __INTEL_COMPILER == 9999\n#  define BOOST_INTEL_CXX_VERSION 1200 // Intel bug in 12.1.\n#else\n#  define BOOST_INTEL_CXX_VERSION __INTEL_COMPILER\n#endif\n#elif defined(__ICL)\n#  define BOOST_INTEL_CXX_VERSION __ICL\n#elif defined(__ICC)\n#  define BOOST_INTEL_CXX_VERSION __ICC\n#elif defined(__ECC)\n#  define BOOST_INTEL_CXX_VERSION __ECC\n#endif\n\n// Flags determined by comparing output of 'icpc -dM -E' with and without '-std=c++0x'\n#if (!(defined(_WIN32) || defined(_WIN64)) && defined(__STDC_HOSTED__) && (__STDC_HOSTED__ && (BOOST_INTEL_CXX_VERSION <= 1200))) || defined(__GXX_EXPERIMENTAL_CPP0X__) || defined(__GXX_EXPERIMENTAL_CXX0X__)\n#  define BOOST_INTEL_STDCXX0X\n#endif\n#if defined(_MSC_VER) && (_MSC_VER >= 1600)\n#  define BOOST_INTEL_STDCXX0X\n#endif\n\n#ifdef __GNUC__\n#  define BOOST_INTEL_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)\n#endif\n\n#if !defined(BOOST_COMPILER)\n#  if defined(BOOST_INTEL_STDCXX0X)\n#    define BOOST_COMPILER \"Intel C++ C++0x mode version \" BOOST_STRINGIZE(BOOST_INTEL_CXX_VERSION)\n#  else\n#    define BOOST_COMPILER \"Intel C++ version \" BOOST_STRINGIZE(BOOST_INTEL_CXX_VERSION)\n#  endif\n#endif\n\n#define BOOST_INTEL BOOST_INTEL_CXX_VERSION\n\n#if defined(_WIN32) || defined(_WIN64)\n#  define BOOST_INTEL_WIN BOOST_INTEL\n#else\n#  define BOOST_INTEL_LINUX BOOST_INTEL\n#endif\n\n#else\n\n#include \"boost/config/compiler/common_edg.hpp\"\n\n#if defined(__INTEL_COMPILER)\n#if __INTEL_COMPILER == 9999\n#  define BOOST_INTEL_CXX_VERSION 1200 // Intel bug in 12.1.\n#else\n#  define BOOST_INTEL_CXX_VERSION __INTEL_COMPILER\n#endif\n#elif defined(__ICL)\n#  define BOOST_INTEL_CXX_VERSION __ICL\n#elif defined(__ICC)\n#  define BOOST_INTEL_CXX_VERSION __ICC\n#elif defined(__ECC)\n#  define BOOST_INTEL_CXX_VERSION __ECC\n#endif\n\n// Flags determined by comparing output of 'icpc -dM -E' with and without '-std=c++0x'\n#if (!(defined(_WIN32) || defined(_WIN64)) && defined(__STDC_HOSTED__) && (__STDC_HOSTED__ && (BOOST_INTEL_CXX_VERSION <= 1200))) || defined(__GXX_EXPERIMENTAL_CPP0X__) || defined(__GXX_EXPERIMENTAL_CXX0X__)\n#  define BOOST_INTEL_STDCXX0X\n#endif\n#if defined(_MSC_VER) && (_MSC_VER >= 1600)\n#  define BOOST_INTEL_STDCXX0X\n#endif\n\n#ifdef __GNUC__\n#  define BOOST_INTEL_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)\n#endif\n\n#if !defined(BOOST_COMPILER)\n#  if defined(BOOST_INTEL_STDCXX0X)\n#    define BOOST_COMPILER \"Intel C++ C++0x mode version \" BOOST_STRINGIZE(BOOST_INTEL_CXX_VERSION)\n#  else\n#    define BOOST_COMPILER \"Intel C++ version \" BOOST_STRINGIZE(BOOST_INTEL_CXX_VERSION)\n#  endif\n#endif\n\n#define BOOST_INTEL BOOST_INTEL_CXX_VERSION\n\n#if defined(_WIN32) || defined(_WIN64)\n#  define BOOST_INTEL_WIN BOOST_INTEL\n#else\n#  define BOOST_INTEL_LINUX BOOST_INTEL\n#endif\n\n#if (BOOST_INTEL_CXX_VERSION <= 600)\n\n#  if defined(_MSC_VER) && (_MSC_VER <= 1300) // added check for <= VC 7 (Peter Dimov)\n\n// Boost libraries assume strong standard conformance unless otherwise\n// indicated by a config macro. As configured by Intel, the EDG front-end\n// requires certain compiler options be set to achieve that strong conformance.\n// Particularly /Qoption,c,--arg_dep_lookup (reported by Kirk Klobe & Thomas Witt)\n// and /Zc:wchar_t,forScope. See boost-root/tools/build/intel-win32-tools.jam for\n// details as they apply to particular versions of the compiler. When the\n// compiler does not predefine a macro indicating if an option has been set,\n// this config file simply assumes the option has been set.\n// Thus BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP will not be defined, even if\n// the compiler option is not enabled.\n\n#     define BOOST_NO_SWPRINTF\n#  endif\n\n// Void returns, 64 bit integrals don't work when emulating VC 6 (Peter Dimov)\n\n#  if defined(_MSC_VER) && (_MSC_VER <= 1200)\n#     define BOOST_NO_VOID_RETURNS\n#     define BOOST_NO_INTEGRAL_INT64_T\n#  endif\n\n#endif\n\n#if (BOOST_INTEL_CXX_VERSION <= 710) && defined(_WIN32)\n#  define BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS\n#endif\n\n// See http://aspn.activestate.com/ASPN/Mail/Message/boost/1614864\n#if BOOST_INTEL_CXX_VERSION < 600\n#  define BOOST_NO_INTRINSIC_WCHAR_T\n#else\n// We should test the macro _WCHAR_T_DEFINED to check if the compiler\n// supports wchar_t natively. *BUT* there is a problem here: the standard\n// headers define this macro if they typedef wchar_t. Anyway, we're lucky\n// because they define it without a value, while Intel C++ defines it\n// to 1. So we can check its value to see if the macro was defined natively\n// or not.\n// Under UNIX, the situation is exactly the same, but the macro _WCHAR_T\n// is used instead.\n#  if ((_WCHAR_T_DEFINED + 0) == 0) && ((_WCHAR_T + 0) == 0)\n#    define BOOST_NO_INTRINSIC_WCHAR_T\n#  endif\n#endif\n\n#if defined(__GNUC__) && !defined(BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL)\n//\n// Figure out when Intel is emulating this gcc bug\n// (All Intel versions prior to 9.0.26, and versions\n// later than that if they are set up to emulate gcc 3.2\n// or earlier):\n//\n#  if ((__GNUC__ == 3) && (__GNUC_MINOR__ <= 2)) || (BOOST_INTEL < 900) || (__INTEL_COMPILER_BUILD_DATE < 20050912)\n#     define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL\n#  endif\n#endif\n#if (defined(__GNUC__) && (__GNUC__ < 4)) || (defined(_WIN32) && (BOOST_INTEL_CXX_VERSION <= 1200)) || (BOOST_INTEL_CXX_VERSION <= 1200)\n// GCC or VC emulation:\n#define BOOST_NO_TWO_PHASE_NAME_LOOKUP\n#endif\n//\n// Verify that we have actually got BOOST_NO_INTRINSIC_WCHAR_T\n// set correctly, if we don't do this now, we will get errors later\n// in type_traits code among other things, getting this correct\n// for the Intel compiler is actually remarkably fragile and tricky:\n//\n#ifdef __cplusplus\n#if defined(BOOST_NO_INTRINSIC_WCHAR_T)\n#include <cwchar>\ntemplate< typename T > struct assert_no_intrinsic_wchar_t;\ntemplate<> struct assert_no_intrinsic_wchar_t<wchar_t> { typedef void type; };\n// if you see an error here then you need to unset BOOST_NO_INTRINSIC_WCHAR_T\n// where it is defined above:\ntypedef assert_no_intrinsic_wchar_t<unsigned short>::type assert_no_intrinsic_wchar_t_;\n#else\ntemplate< typename T > struct assert_intrinsic_wchar_t;\ntemplate<> struct assert_intrinsic_wchar_t<wchar_t> {};\n// if you see an error here then define BOOST_NO_INTRINSIC_WCHAR_T on the command line:\ntemplate<> struct assert_intrinsic_wchar_t<unsigned short> {};\n#endif\n#endif\n\n#if defined(_MSC_VER) && (_MSC_VER+0 >= 1000)\n#  if _MSC_VER >= 1200\n#     define BOOST_HAS_MS_INT64\n#  endif\n#  define BOOST_NO_SWPRINTF\n#  define BOOST_NO_TWO_PHASE_NAME_LOOKUP\n#elif defined(_WIN32)\n#  define BOOST_DISABLE_WIN32\n#endif\n\n// I checked version 6.0 build 020312Z, it implements the NRVO.\n// Correct this as you find out which version of the compiler\n// implemented the NRVO first.  (Daniel Frey)\n#if (BOOST_INTEL_CXX_VERSION >= 600)\n#  define BOOST_HAS_NRVO\n#endif\n\n// Branch prediction hints\n// I'm not sure 8.0 was the first version to support these builtins,\n// update the condition if the version is not accurate. (Andrey Semashev)\n#if defined(__GNUC__) && BOOST_INTEL_CXX_VERSION >= 800\n#define BOOST_LIKELY(x) __builtin_expect(x, 1)\n#define BOOST_UNLIKELY(x) __builtin_expect(x, 0)\n#endif\n\n// RTTI\n// __RTTI is the EDG macro\n// __INTEL_RTTI__ is the Intel macro\n// __GXX_RTTI is the g++ macro\n// _CPPRTTI is the MSVC++ macro\n#if !defined(__RTTI) && !defined(__INTEL_RTTI__) && !defined(__GXX_RTTI) && !defined(_CPPRTTI)\n\n#if !defined(BOOST_NO_RTTI)\n# define BOOST_NO_RTTI\n#endif\n\n// in MS mode, static typeid works even when RTTI is off\n#if !defined(_MSC_VER) && !defined(BOOST_NO_TYPEID)\n# define BOOST_NO_TYPEID\n#endif\n\n#endif\n\n//\n// versions check:\n// we don't support Intel prior to version 6.0:\n#if BOOST_INTEL_CXX_VERSION < 600\n#  error \"Compiler not supported or configured - please reconfigure\"\n#endif\n\n// Intel on MacOS requires\n#if defined(__APPLE__) && defined(__INTEL_COMPILER)\n#  define BOOST_NO_TWO_PHASE_NAME_LOOKUP\n#endif\n\n// Intel on Altix Itanium\n#if defined(__itanium__) && defined(__INTEL_COMPILER)\n#  define BOOST_NO_TWO_PHASE_NAME_LOOKUP\n#endif\n\n//\n// An attempt to value-initialize a pointer-to-member may trigger an\n// internal error on Intel <= 11.1 (last checked version), as was\n// reported by John Maddock, Intel support issue 589832, May 2010.\n// Moreover, according to test results from Huang-Vista-x86_32_intel,\n// intel-vc9-win-11.1 may leave a non-POD array uninitialized, in some\n// cases when it should be value-initialized.\n// (Niels Dekker, LKEB, May 2010)\n// Apparently Intel 12.1 (compiler version number 9999 !!) has the same issue (compiler regression).\n#if defined(__INTEL_COMPILER)\n#  if (__INTEL_COMPILER <= 1110) || (__INTEL_COMPILER == 9999) || (defined(_WIN32) && (__INTEL_COMPILER < 1600))\n#    define BOOST_NO_COMPLETE_VALUE_INITIALIZATION\n#  endif\n#endif\n\n//\n// Dynamic shared object (DSO) and dynamic-link library (DLL) support\n//\n#if defined(__GNUC__) && (__GNUC__ >= 4)\n#  define BOOST_SYMBOL_EXPORT __attribute__((visibility(\"default\")))\n#  define BOOST_SYMBOL_IMPORT\n#  define BOOST_SYMBOL_VISIBLE __attribute__((visibility(\"default\")))\n#endif\n//\n// C++0x features\n// For each feature we need to check both the Intel compiler version, \n// and the version of MSVC or GCC that we are emulating.\n// See http://software.intel.com/en-us/articles/c0x-features-supported-by-intel-c-compiler/\n// for a list of which features were implemented in which Intel releases.\n//\n#if defined(BOOST_INTEL_STDCXX0X)\n// BOOST_NO_CXX11_CONSTEXPR:\n#if (BOOST_INTEL_CXX_VERSION >= 1500) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40600)) && !defined(_MSC_VER)\n// Available in earlier Intel versions, but fail our tests:\n#  undef BOOST_NO_CXX11_CONSTEXPR\n#endif\n// BOOST_NO_CXX11_NULLPTR:\n#if (BOOST_INTEL_CXX_VERSION >= 1210) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40600)) && (!defined(_MSC_VER) || (_MSC_VER >= 1600))\n#  undef BOOST_NO_CXX11_NULLPTR\n#endif\n// BOOST_NO_CXX11_TEMPLATE_ALIASES\n#if (BOOST_INTEL_CXX_VERSION >= 1210) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40700)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 180020827))\n#  undef BOOST_NO_CXX11_TEMPLATE_ALIASES\n#endif\n\n// BOOST_NO_CXX11_DECLTYPE\n#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40300)) && (!defined(_MSC_VER) || (_MSC_VER >= 1600))\n#  undef BOOST_NO_CXX11_DECLTYPE\n#endif\n\n// BOOST_NO_CXX11_DECLTYPE_N3276\n#if (BOOST_INTEL_CXX_VERSION >= 1500) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40800)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 180020827))\n#  undef BOOST_NO_CXX11_DECLTYPE_N3276\n#endif\n\n// BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40300)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 180020827))\n#  undef BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#endif\n\n// BOOST_NO_CXX11_RVALUE_REFERENCES\n#if (BOOST_INTEL_CXX_VERSION >= 1300) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40300)) && (!defined(_MSC_VER) || (_MSC_VER >= 1600))\n// This is available from earlier Intel versions, but breaks Filesystem and other libraries:\n#  undef BOOST_NO_CXX11_RVALUE_REFERENCES\n#endif\n\n// BOOST_NO_CXX11_STATIC_ASSERT\n#if (BOOST_INTEL_CXX_VERSION >= 1110) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40300)) && (!defined(_MSC_VER) || (_MSC_VER >= 1600))\n#  undef BOOST_NO_CXX11_STATIC_ASSERT\n#endif\n\n// BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40400)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 180020827))\n#  undef BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#endif\n\n// BOOST_NO_CXX11_VARIADIC_MACROS\n#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40200)) && (!defined(_MSC_VER) || (_MSC_VER >= 1400))\n#  undef BOOST_NO_CXX11_VARIADIC_MACROS\n#endif\n\n// BOOST_NO_CXX11_AUTO_DECLARATIONS\n#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40400)) && (!defined(_MSC_VER) || (_MSC_VER >= 1600))\n#  undef BOOST_NO_CXX11_AUTO_DECLARATIONS\n#endif\n\n// BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40400)) && (!defined(_MSC_VER) || (_MSC_VER >= 1600))\n#  undef BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#endif\n\n// BOOST_NO_CXX11_CHAR16_T\n#if (BOOST_INTEL_CXX_VERSION >= 1400) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40400)) && (!defined(_MSC_VER) || (_MSC_VER >= 9999))\n#  undef BOOST_NO_CXX11_CHAR16_T\n#endif\n\n// BOOST_NO_CXX11_CHAR32_T\n#if (BOOST_INTEL_CXX_VERSION >= 1400) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40400)) && (!defined(_MSC_VER) || (_MSC_VER >= 9999))\n#  undef BOOST_NO_CXX11_CHAR32_T\n#endif\n\n// BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40400)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 180020827))\n#  undef BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#endif\n\n// BOOST_NO_CXX11_DELETED_FUNCTIONS\n#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40400)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 180020827))\n#  undef BOOST_NO_CXX11_DELETED_FUNCTIONS\n#endif\n\n// BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#if (BOOST_INTEL_CXX_VERSION >= 1400) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40400)) && (!defined(_MSC_VER) || (_MSC_VER >= 1700))\n#  undef BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#endif\n\n// BOOST_NO_CXX11_SCOPED_ENUMS\n#if (BOOST_INTEL_CXX_VERSION >= 1400) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40501)) && (!defined(_MSC_VER) || (_MSC_VER >= 1700))\n// This is available but broken in earlier Intel releases.\n#  undef BOOST_NO_CXX11_SCOPED_ENUMS\n#endif\n\n// BOOST_NO_SFINAE_EXPR\n#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40500)) && (!defined(_MSC_VER) || (_MSC_VER >= 9999))\n#  undef BOOST_NO_SFINAE_EXPR\n#endif\n\n// BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#if (BOOST_INTEL_CXX_VERSION >= 1500) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40500)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 180020827))\n// This is available in earlier Intel releases, but breaks Multiprecision:\n#  undef BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#endif\n\n// BOOST_NO_CXX11_LAMBDAS\n#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40500)) && (!defined(_MSC_VER) || (_MSC_VER >= 1600))\n#  undef BOOST_NO_CXX11_LAMBDAS\n#endif\n\n// BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40500))\n#  undef BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#endif\n\n// BOOST_NO_CXX11_RANGE_BASED_FOR\n#if (BOOST_INTEL_CXX_VERSION >= 1400) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40600)) && (!defined(_MSC_VER) || (_MSC_VER >= 1700))\n#  undef BOOST_NO_CXX11_RANGE_BASED_FOR\n#endif\n\n// BOOST_NO_CXX11_RAW_LITERALS\n#if (BOOST_INTEL_CXX_VERSION >= 1400) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40500)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 180020827))\n#  undef BOOST_NO_CXX11_RAW_LITERALS\n#endif\n\n// BOOST_NO_CXX11_UNICODE_LITERALS\n#if (BOOST_INTEL_CXX_VERSION >= 1400) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40500)) && (!defined(_MSC_VER) || (_MSC_VER >= 9999))\n#  undef BOOST_NO_CXX11_UNICODE_LITERALS\n#endif\n\n// BOOST_NO_CXX11_NOEXCEPT\n#if (BOOST_INTEL_CXX_VERSION >= 1500) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40600)) && (!defined(_MSC_VER) || (_MSC_VER >= 9999))\n// Available in earlier Intel release, but generates errors when used with \n// conditional exception specifications, for example in multiprecision:\n#  undef BOOST_NO_CXX11_NOEXCEPT\n#endif\n\n// BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#if (BOOST_INTEL_CXX_VERSION >= 1400) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40600)) && (!defined(_MSC_VER) || (_MSC_VER >= 9999))\n#  undef BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#endif\n\n// BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#if (BOOST_INTEL_CXX_VERSION >= 1500) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40700)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 190021730))\n#  undef BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#endif\n\n// BOOST_NO_CXX11_ALIGNAS\n#if (BOOST_INTEL_CXX_VERSION >= 1500) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40800)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 190021730))\n#  undef BOOST_NO_CXX11_ALIGNAS\n#endif\n\n// BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#if (BOOST_INTEL_CXX_VERSION >= 1200) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40400)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 180020827))\n#  undef BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#endif\n\n// BOOST_NO_CXX11_INLINE_NAMESPACES\n#if (BOOST_INTEL_CXX_VERSION >= 1400) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40400)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 190021730))\n#  undef BOOST_NO_CXX11_INLINE_NAMESPACES\n#endif\n\n// BOOST_NO_CXX11_REF_QUALIFIERS\n#if (BOOST_INTEL_CXX_VERSION >= 1400) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40800)) && (!defined(_MSC_VER) || (_MSC_FULL_VER >= 190021730))\n#  undef BOOST_NO_CXX11_REF_QUALIFIERS\n#endif\n\n// BOOST_NO_CXX11_FINAL\n#if (BOOST_INTEL_CXX_VERSION >= 1400) && (!defined(BOOST_INTEL_GCC_VERSION) || (BOOST_INTEL_GCC_VERSION >= 40700)) && (!defined(_MSC_VER) || (_MSC_VER >= 1700))\n#  undef BOOST_NO_CXX11_FINAL\n#endif\n\n#endif\n\n//\n// Broken in all versions up to 15:\n#define BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS\n\n#if defined(BOOST_INTEL_STDCXX0X) && (BOOST_INTEL_CXX_VERSION <= 1310)\n#  define BOOST_NO_CXX11_HDR_FUTURE\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#endif\n\n#if defined(BOOST_INTEL_STDCXX0X) && (BOOST_INTEL_CXX_VERSION == 1400)\n// A regression in Intel's compiler means that <tuple> seems to be broken in this release as well as <future> :\n#  define BOOST_NO_CXX11_HDR_FUTURE\n#  define BOOST_NO_CXX11_HDR_TUPLE\n#endif\n\n#if (BOOST_INTEL_CXX_VERSION < 1200)\n//\n// fenv.h appears not to work with Intel prior to 12.0:\n//\n#  define BOOST_NO_FENV_H\n#endif\n\n// Intel 13.10 fails to access defaulted functions of a base class declared in private or protected sections,\n// producing the following errors:\n// error #453: protected function \"...\" (declared at ...\") is not accessible through a \"...\" pointer or object\n#if (BOOST_INTEL_CXX_VERSION <= 1310)\n#  define BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS\n#endif\n\n#if defined(_MSC_VER) && (_MSC_VER >= 1600)\n#  define BOOST_HAS_STDINT_H\n#endif\n\n#if defined(__LP64__) && defined(__GNUC__) && (BOOST_INTEL_CXX_VERSION >= 1310) && !defined(__CUDACC__)\n#  define BOOST_HAS_INT128\n#endif\n\n#endif\n//\n// last known and checked version:\n#if (BOOST_INTEL_CXX_VERSION > 1500)\n#  if defined(BOOST_ASSERT_CONFIG)\n#     error \"Unknown compiler version - please run the configure tests and report the results\"\n#  elif defined(_MSC_VER)\n//\n//      We don't emit this warning any more, since we have so few\n//      defect macros set anyway (just the one).\n//\n//#     pragma message(\"Unknown compiler version - please run the configure tests and report the results\")\n#  endif\n#endif\n\n"
  },
  {
    "path": "benchmarks/boost/config/compiler/kai.hpp",
    "content": "//  (C) Copyright John Maddock 2001. \n//  (C) Copyright David Abrahams 2002. \n//  (C) Copyright Aleksey Gurtovoy 2002. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Kai C++ compiler setup:\n\n#include \"boost/config/compiler/common_edg.hpp\"\n\n#   if (__KCC_VERSION <= 4001) || !defined(BOOST_STRICT_CONFIG)\n      // at least on Sun, the contents of <cwchar> is not in namespace std\n#     define BOOST_NO_STDC_NAMESPACE\n#   endif\n\n// see also common_edg.hpp which needs a special check for __KCC\n# if !defined(_EXCEPTIONS) && !defined(BOOST_NO_EXCEPTIONS)\n#     define BOOST_NO_EXCEPTIONS\n# endif\n\n//\n// last known and checked version is 4001:\n#if (__KCC_VERSION > 4001)\n#  if defined(BOOST_ASSERT_CONFIG)\n#     error \"Unknown compiler version - please run the configure tests and report the results\"\n#  endif\n#endif\n\n\n\n"
  },
  {
    "path": "benchmarks/boost/config/compiler/metrowerks.hpp",
    "content": "//  (C) Copyright John Maddock 2001.\n//  (C) Copyright Darin Adler 2001.\n//  (C) Copyright Peter Dimov 2001.\n//  (C) Copyright David Abrahams 2001 - 2002.\n//  (C) Copyright Beman Dawes 2001 - 2003.\n//  (C) Copyright Stefan Slapeta 2004.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Metrowerks C++ compiler setup:\n\n// locale support is disabled when linking with the dynamic runtime\n#   ifdef _MSL_NO_LOCALE\n#     define BOOST_NO_STD_LOCALE\n#   endif\n\n#   if __MWERKS__ <= 0x2301  // 5.3\n#     define BOOST_NO_FUNCTION_TEMPLATE_ORDERING\n#     define BOOST_NO_POINTER_TO_MEMBER_CONST\n#     define BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS\n#     define BOOST_NO_MEMBER_TEMPLATE_KEYWORD\n#   endif\n\n#   if __MWERKS__ <= 0x2401  // 6.2\n//#     define BOOST_NO_FUNCTION_TEMPLATE_ORDERING\n#   endif\n\n#   if(__MWERKS__ <= 0x2407)  // 7.x\n#     define BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS\n#     define BOOST_NO_UNREACHABLE_RETURN_DETECTION\n#   endif\n\n#   if(__MWERKS__ <= 0x3003)  // 8.x\n#     define BOOST_NO_SFINAE\n#    endif\n\n// the \"|| !defined(BOOST_STRICT_CONFIG)\" part should apply to the last\n// tested version *only*:\n#   if(__MWERKS__ <= 0x3207) || !defined(BOOST_STRICT_CONFIG) // 9.6\n#     define BOOST_NO_MEMBER_TEMPLATE_FRIENDS\n#     define BOOST_NO_IS_ABSTRACT\n#    endif\n\n#if !__option(wchar_type)\n#   define BOOST_NO_INTRINSIC_WCHAR_T\n#endif\n\n#if !__option(exceptions) && !defined(BOOST_NO_EXCEPTIONS)\n#   define BOOST_NO_EXCEPTIONS\n#endif\n\n#if (__INTEL__ && _WIN32) || (__POWERPC__ && macintosh)\n#   if __MWERKS__ == 0x3000\n#     define BOOST_COMPILER_VERSION 8.0\n#   elif __MWERKS__ == 0x3001\n#     define BOOST_COMPILER_VERSION 8.1\n#   elif __MWERKS__ == 0x3002\n#     define BOOST_COMPILER_VERSION 8.2\n#   elif __MWERKS__ == 0x3003\n#     define BOOST_COMPILER_VERSION 8.3\n#   elif __MWERKS__ == 0x3200\n#     define BOOST_COMPILER_VERSION 9.0\n#   elif __MWERKS__ == 0x3201\n#     define BOOST_COMPILER_VERSION 9.1\n#   elif __MWERKS__ == 0x3202\n#     define BOOST_COMPILER_VERSION 9.2\n#   elif __MWERKS__ == 0x3204\n#     define BOOST_COMPILER_VERSION 9.3\n#   elif __MWERKS__ == 0x3205\n#     define BOOST_COMPILER_VERSION 9.4\n#   elif __MWERKS__ == 0x3206\n#     define BOOST_COMPILER_VERSION 9.5\n#   elif __MWERKS__ == 0x3207\n#     define BOOST_COMPILER_VERSION 9.6\n#   else\n#     define BOOST_COMPILER_VERSION __MWERKS__\n#   endif\n#else\n#  define BOOST_COMPILER_VERSION __MWERKS__\n#endif\n\n//\n// C++0x features\n//\n//   See boost\\config\\suffix.hpp for BOOST_NO_LONG_LONG\n//\n#if __MWERKS__ > 0x3206 && __option(rvalue_refs)\n#  define BOOST_HAS_RVALUE_REFS\n#else\n#  define BOOST_NO_CXX11_RVALUE_REFERENCES\n#endif\n#define BOOST_NO_CXX11_AUTO_DECLARATIONS\n#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#define BOOST_NO_CXX11_CHAR16_T\n#define BOOST_NO_CXX11_CHAR32_T\n#define BOOST_NO_CXX11_CONSTEXPR\n#define BOOST_NO_CXX11_DECLTYPE\n#define BOOST_NO_CXX11_DECLTYPE_N3276\n#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#define BOOST_NO_CXX11_DELETED_FUNCTIONS\n#define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#define BOOST_NO_CXX11_EXTERN_TEMPLATE\n#define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#define BOOST_NO_CXX11_LAMBDAS\n#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#define BOOST_NO_CXX11_NOEXCEPT\n#define BOOST_NO_CXX11_NULLPTR\n#define BOOST_NO_CXX11_RANGE_BASED_FOR\n#define BOOST_NO_CXX11_RAW_LITERALS\n#define BOOST_NO_CXX11_SCOPED_ENUMS\n#define BOOST_NO_SFINAE_EXPR\n#define BOOST_NO_CXX11_STATIC_ASSERT\n#define BOOST_NO_CXX11_TEMPLATE_ALIASES\n#define BOOST_NO_CXX11_UNICODE_LITERALS\n#define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#define BOOST_NO_CXX11_VARIADIC_MACROS\n#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#define BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#define BOOST_NO_CXX11_ALIGNAS\n#define BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#define BOOST_NO_CXX11_INLINE_NAMESPACES\n#define BOOST_NO_CXX11_REF_QUALIFIERS\n#define BOOST_NO_CXX11_FINAL\n\n// C++ 14:\n#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)\n#  define BOOST_NO_CXX14_AGGREGATE_NSDMI\n#endif\n#if !defined(__cpp_binary_literals) || (__cpp_binary_literals < 201304)\n#  define BOOST_NO_CXX14_BINARY_LITERALS\n#endif\n#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)\n#  define BOOST_NO_CXX14_CONSTEXPR\n#endif\n#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304)\n#  define BOOST_NO_CXX14_DECLTYPE_AUTO\n#endif\n#if (__cplusplus < 201304) // There's no SD6 check for this....\n#  define BOOST_NO_CXX14_DIGIT_SEPARATORS\n#endif\n#if !defined(__cpp_generic_lambdas) || (__cpp_generic_lambdas < 201304)\n#  define BOOST_NO_CXX14_GENERIC_LAMBDAS\n#endif\n#if !defined(__cpp_init_captures) || (__cpp_init_captures < 201304)\n#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES\n#endif\n#if !defined(__cpp_return_type_deduction) || (__cpp_return_type_deduction < 201304)\n#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION\n#endif\n#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)\n#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES\n#endif\n\n#define BOOST_COMPILER \"Metrowerks CodeWarrior C++ version \" BOOST_STRINGIZE(BOOST_COMPILER_VERSION)\n\n//\n// versions check:\n// we don't support Metrowerks prior to version 5.3:\n#if __MWERKS__ < 0x2301\n#  error \"Compiler not supported or configured - please reconfigure\"\n#endif\n//\n// last known and checked version:\n#if (__MWERKS__ > 0x3205)\n#  if defined(BOOST_ASSERT_CONFIG)\n#     error \"Unknown compiler version - please run the configure tests and report the results\"\n#  endif\n#endif\n\n\n\n\n\n\n\n"
  },
  {
    "path": "benchmarks/boost/config/compiler/mpw.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2002.\n//  (C) Copyright Aleksey Gurtovoy 2002.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  MPW C++ compilers setup:\n\n#   if    defined(__SC__)\n#     define BOOST_COMPILER \"MPW SCpp version \" BOOST_STRINGIZE(__SC__)\n#   elif defined(__MRC__)\n#     define BOOST_COMPILER \"MPW MrCpp version \" BOOST_STRINGIZE(__MRC__)\n#   else\n#     error \"Using MPW compiler configuration by mistake.  Please update.\"\n#   endif\n\n//\n// MPW 8.90:\n//\n#if (MPW_CPLUS <= 0x890) || !defined(BOOST_STRICT_CONFIG)\n#  define BOOST_NO_CV_SPECIALIZATIONS\n#  define BOOST_NO_DEPENDENT_NESTED_DERIVATIONS\n#  define BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS\n#  define BOOST_NO_INCLASS_MEMBER_INITIALIZATION\n#  define BOOST_NO_INTRINSIC_WCHAR_T\n#  define BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION\n#  define BOOST_NO_USING_TEMPLATE\n\n#  define BOOST_NO_CWCHAR\n#  define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS\n\n#  define BOOST_NO_STD_ALLOCATOR /* actually a bug with const reference overloading */\n\n#endif\n\n//\n// C++0x features\n//\n//   See boost\\config\\suffix.hpp for BOOST_NO_LONG_LONG\n//\n#define BOOST_NO_CXX11_AUTO_DECLARATIONS\n#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#define BOOST_NO_CXX11_CHAR16_T\n#define BOOST_NO_CXX11_CHAR32_T\n#define BOOST_NO_CXX11_CONSTEXPR\n#define BOOST_NO_CXX11_DECLTYPE\n#define BOOST_NO_CXX11_DECLTYPE_N3276\n#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#define BOOST_NO_CXX11_DELETED_FUNCTIONS\n#define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#define BOOST_NO_CXX11_EXTERN_TEMPLATE\n#define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#define BOOST_NO_CXX11_LAMBDAS\n#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#define BOOST_NO_CXX11_NOEXCEPT\n#define BOOST_NO_CXX11_NULLPTR\n#define BOOST_NO_CXX11_RANGE_BASED_FOR\n#define BOOST_NO_CXX11_RAW_LITERALS\n#define BOOST_NO_CXX11_RVALUE_REFERENCES\n#define BOOST_NO_CXX11_SCOPED_ENUMS\n#define BOOST_NO_SFINAE_EXPR\n#define BOOST_NO_CXX11_STATIC_ASSERT\n#define BOOST_NO_CXX11_TEMPLATE_ALIASES\n#define BOOST_NO_CXX11_UNICODE_LITERALS\n#define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#define BOOST_NO_CXX11_VARIADIC_MACROS\n#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#define BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#define BOOST_NO_CXX11_ALIGNAS\n#define BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#define BOOST_NO_CXX11_INLINE_NAMESPACES\n#define BOOST_NO_CXX11_REF_QUALIFIERS\n#define BOOST_NO_CXX11_FINAL\n\n// C++ 14:\n#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)\n#  define BOOST_NO_CXX14_AGGREGATE_NSDMI\n#endif\n#if !defined(__cpp_binary_literals) || (__cpp_binary_literals < 201304)\n#  define BOOST_NO_CXX14_BINARY_LITERALS\n#endif\n#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)\n#  define BOOST_NO_CXX14_CONSTEXPR\n#endif\n#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304)\n#  define BOOST_NO_CXX14_DECLTYPE_AUTO\n#endif\n#if (__cplusplus < 201304) // There's no SD6 check for this....\n#  define BOOST_NO_CXX14_DIGIT_SEPARATORS\n#endif\n#if !defined(__cpp_generic_lambdas) || (__cpp_generic_lambdas < 201304)\n#  define BOOST_NO_CXX14_GENERIC_LAMBDAS\n#endif\n#if !defined(__cpp_init_captures) || (__cpp_init_captures < 201304)\n#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES\n#endif\n#if !defined(__cpp_return_type_deduction) || (__cpp_return_type_deduction < 201304)\n#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION\n#endif\n#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)\n#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES\n#endif\n\n//\n// versions check:\n// we don't support MPW prior to version 8.9:\n#if MPW_CPLUS < 0x890\n#  error \"Compiler not supported or configured - please reconfigure\"\n#endif\n//\n// last known and checked version is 0x890:\n#if (MPW_CPLUS > 0x890)\n#  if defined(BOOST_ASSERT_CONFIG)\n#     error \"Unknown compiler version - please run the configure tests and report the results\"\n#  endif\n#endif\n\n\n"
  },
  {
    "path": "benchmarks/boost/config/compiler/nvcc.hpp",
    "content": "//  (C) Copyright Eric Jourdanneau, Joel Falcou 2010\n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  NVIDIA CUDA C++ compiler setup\n\n#ifndef BOOST_COMPILER\n#  define BOOST_COMPILER \"NVIDIA CUDA C++ Compiler\"\n#endif\n\n// NVIDIA Specific support\n// BOOST_GPU_ENABLED : Flag a function or a method as being enabled on the host and device\n#define BOOST_GPU_ENABLED __host__ __device__\n"
  },
  {
    "path": "benchmarks/boost/config/compiler/pathscale.hpp",
    "content": "//  (C) Copyright Bryce Lelbach 2011\n\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n// PathScale EKOPath C++ Compiler\n\n#ifndef BOOST_COMPILER\n#  define BOOST_COMPILER \"PathScale EKOPath C++ Compiler version \" __PATHSCALE__\n#endif\n\n#if __PATHCC__ >= 4\n#  define BOOST_MSVC6_MEMBER_TEMPLATES\n#  define BOOST_HAS_UNISTD_H\n#  define BOOST_HAS_STDINT_H\n#  define BOOST_HAS_SIGACTION\n#  define BOOST_HAS_SCHED_YIELD\n#  define BOOST_HAS_THREADS\n#  define BOOST_HAS_PTHREADS\n#  define BOOST_HAS_PTHREAD_YIELD\n#  define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE\n#  define BOOST_HAS_PARTIAL_STD_ALLOCATOR\n#  define BOOST_HAS_NRVO\n#  define BOOST_HAS_NL_TYPES_H\n#  define BOOST_HAS_NANOSLEEP\n#  define BOOST_HAS_LONG_LONG\n#  define BOOST_HAS_LOG1P\n#  define BOOST_HAS_GETTIMEOFDAY\n#  define BOOST_HAS_EXPM1\n#  define BOOST_HAS_DIRENT_H\n#  define BOOST_HAS_CLOCK_GETTIME\n#  define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#  define BOOST_NO_CXX11_UNICODE_LITERALS\n#  define BOOST_NO_CXX11_TEMPLATE_ALIASES\n#  define BOOST_NO_CXX11_STATIC_ASSERT\n#  define BOOST_NO_SFINAE_EXPR\n#  define BOOST_NO_CXX11_SCOPED_ENUMS\n#  define BOOST_NO_CXX11_RVALUE_REFERENCES\n#  define BOOST_NO_CXX11_RANGE_BASED_FOR\n#  define BOOST_NO_CXX11_RAW_LITERALS\n#  define BOOST_NO_CXX11_NULLPTR\n#  define BOOST_NO_CXX11_NUMERIC_LIMITS\n#  define BOOST_NO_CXX11_NOEXCEPT\n#  define BOOST_NO_CXX11_LAMBDAS\n#  define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#  define BOOST_NO_MS_INT64_NUMERIC_LIMITS\n#  define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#  define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#  define BOOST_NO_CXX11_DELETED_FUNCTIONS\n#  define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#  define BOOST_NO_CXX11_DECLTYPE\n#  define BOOST_NO_CXX11_DECLTYPE_N3276\n#  define BOOST_NO_CXX11_CONSTEXPR\n#  define BOOST_NO_COMPLETE_VALUE_INITIALIZATION\n#  define BOOST_NO_CXX11_CHAR32_T\n#  define BOOST_NO_CXX11_CHAR16_T\n#  define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#  define BOOST_NO_CXX11_AUTO_DECLARATIONS\n#  define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#  define BOOST_NO_CXX11_HDR_UNORDERED_SET\n#  define BOOST_NO_CXX11_HDR_UNORDERED_MAP\n#  define BOOST_NO_CXX11_HDR_TYPEINDEX\n#  define BOOST_NO_CXX11_HDR_TUPLE\n#  define BOOST_NO_CXX11_HDR_THREAD\n#  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR\n#  define BOOST_NO_CXX11_HDR_REGEX\n#  define BOOST_NO_CXX11_HDR_RATIO\n#  define BOOST_NO_CXX11_HDR_RANDOM\n#  define BOOST_NO_CXX11_HDR_MUTEX\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#  define BOOST_NO_CXX11_HDR_FUTURE\n#  define BOOST_NO_CXX11_HDR_FORWARD_LIST\n#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE\n#  define BOOST_NO_CXX11_HDR_CODECVT\n#  define BOOST_NO_CXX11_HDR_CHRONO\n#  define BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#  define BOOST_NO_CXX11_ALIGNAS\n#  define BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#  define BOOST_NO_CXX11_INLINE_NAMESPACES\n#  define BOOST_NO_CXX11_REF_QUALIFIERS\n#  define BOOST_NO_CXX11_FINAL\n\n// C++ 14:\n#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)\n#  define BOOST_NO_CXX14_AGGREGATE_NSDMI\n#endif\n#if !defined(__cpp_binary_literals) || (__cpp_binary_literals < 201304)\n#  define BOOST_NO_CXX14_BINARY_LITERALS\n#endif\n#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)\n#  define BOOST_NO_CXX14_CONSTEXPR\n#endif\n#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304)\n#  define BOOST_NO_CXX14_DECLTYPE_AUTO\n#endif\n#if (__cplusplus < 201304) // There's no SD6 check for this....\n#  define BOOST_NO_CXX14_DIGIT_SEPARATORS\n#endif\n#if !defined(__cpp_generic_lambdas) || (__cpp_generic_lambdas < 201304)\n#  define BOOST_NO_CXX14_GENERIC_LAMBDAS\n#endif\n#if !defined(__cpp_init_captures) || (__cpp_init_captures < 201304)\n#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES\n#endif\n#if !defined(__cpp_return_type_deduction) || (__cpp_return_type_deduction < 201304)\n#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION\n#endif\n#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)\n#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES\n#endif\n#endif\n"
  },
  {
    "path": "benchmarks/boost/config/compiler/pgi.hpp",
    "content": "//  (C) Copyright Noel Belcourt 2007.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  PGI C++ compiler setup:\n\n#define BOOST_COMPILER_VERSION __PGIC__##__PGIC_MINOR__\n#define BOOST_COMPILER \"PGI compiler version \" BOOST_STRINGIZE(BOOST_COMPILER_VERSION)\n\n//\n// Threading support:\n// Turn this on unconditionally here, it will get turned off again later\n// if no threading API is detected.\n//\n\n#if __PGIC__ >= 11\n\n// options requested by configure --enable-test\n#define BOOST_HAS_PTHREADS\n#define BOOST_HAS_THREADS\n#define BOOST_HAS_PTHREAD_YIELD\n#define BOOST_HAS_NRVO\n#define BOOST_HAS_LONG_LONG\n\n// options --enable-test wants undefined\n#undef BOOST_NO_STDC_NAMESPACE\n#undef BOOST_NO_EXCEPTION_STD_NAMESPACE\n#undef BOOST_DEDUCED_TYPENAME\n\n#define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL\n#define BOOST_NO_TWO_PHASE_NAME_LOOKUP\n#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#define BOOST_NO_CXX11_AUTO_DECLARATIONS\n\n#elif __PGIC__ >= 10\n\n// options requested by configure --enable-test\n#define BOOST_HAS_THREADS\n#define BOOST_HAS_NRVO\n#define BOOST_HAS_LONG_LONG\n#if defined(linux) || defined(__linux) || defined(__linux__)\n#  define BOOST_HAS_STDINT_H\n#endif\n\n// options --enable-test wants undefined\n#undef BOOST_NO_STDC_NAMESPACE\n#undef BOOST_NO_EXCEPTION_STD_NAMESPACE\n#undef BOOST_DEDUCED_TYPENAME\n\n#elif __PGIC__ >= 7\n\n#define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL\n#define BOOST_NO_TWO_PHASE_NAME_LOOKUP\n#define BOOST_NO_SWPRINTF\n#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#define BOOST_NO_CXX11_AUTO_DECLARATIONS\n\n#else\n\n#  error \"Pgi compiler not configured - please reconfigure\"\n\n#endif\n//\n// C++0x features\n//\n//   See boost\\config\\suffix.hpp for BOOST_NO_LONG_LONG\n//\n#define BOOST_NO_CXX11_CHAR16_T\n#define BOOST_NO_CXX11_CHAR32_T\n#define BOOST_NO_CXX11_CONSTEXPR\n#define BOOST_NO_CXX11_DECLTYPE\n#define BOOST_NO_CXX11_DECLTYPE_N3276\n#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#define BOOST_NO_CXX11_DELETED_FUNCTIONS\n#define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#define BOOST_NO_CXX11_EXTERN_TEMPLATE\n#define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#define BOOST_NO_CXX11_LAMBDAS\n#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#define BOOST_NO_CXX11_NOEXCEPT\n#define BOOST_NO_CXX11_NULLPTR\n#define BOOST_NO_CXX11_NUMERIC_LIMITS\n#define BOOST_NO_CXX11_RANGE_BASED_FOR\n#define BOOST_NO_CXX11_RAW_LITERALS\n#define BOOST_NO_CXX11_RVALUE_REFERENCES\n#define BOOST_NO_CXX11_SCOPED_ENUMS\n#define BOOST_NO_SFINAE_EXPR\n#define BOOST_NO_CXX11_STATIC_ASSERT\n#define BOOST_NO_SWPRINTF\n#define BOOST_NO_CXX11_TEMPLATE_ALIASES\n#define BOOST_NO_CXX11_UNICODE_LITERALS\n#define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#define BOOST_NO_CXX11_VARIADIC_MACROS\n#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n\n#define BOOST_NO_CXX11_HDR_UNORDERED_SET\n#define BOOST_NO_CXX11_HDR_UNORDERED_MAP\n#define BOOST_NO_CXX11_HDR_TYPEINDEX\n#define BOOST_NO_CXX11_HDR_TYPE_TRAITS\n#define BOOST_NO_CXX11_HDR_TUPLE\n#define BOOST_NO_CXX11_HDR_THREAD\n#define BOOST_NO_CXX11_HDR_SYSTEM_ERROR\n#define BOOST_NO_CXX11_HDR_REGEX\n#define BOOST_NO_CXX11_HDR_RATIO\n#define BOOST_NO_CXX11_HDR_RANDOM\n#define BOOST_NO_CXX11_HDR_MUTEX\n#define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#define BOOST_NO_CXX11_HDR_FUTURE\n#define BOOST_NO_CXX11_HDR_FORWARD_LIST\n#define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE\n#define BOOST_NO_CXX11_HDR_CODECVT\n#define BOOST_NO_CXX11_HDR_CHRONO\n#define BOOST_NO_CXX11_HDR_ARRAY\n#define BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#define BOOST_NO_CXX11_ALIGNAS\n#define BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#define BOOST_NO_CXX11_INLINE_NAMESPACES\n#define BOOST_NO_CXX11_REF_QUALIFIERS\n#define BOOST_NO_CXX11_FINAL\n\n// C++ 14:\n#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)\n#  define BOOST_NO_CXX14_AGGREGATE_NSDMI\n#endif\n#if !defined(__cpp_binary_literals) || (__cpp_binary_literals < 201304)\n#  define BOOST_NO_CXX14_BINARY_LITERALS\n#endif\n#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)\n#  define BOOST_NO_CXX14_CONSTEXPR\n#endif\n#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304)\n#  define BOOST_NO_CXX14_DECLTYPE_AUTO\n#endif\n#if (__cplusplus < 201304) // There's no SD6 check for this....\n#  define BOOST_NO_CXX14_DIGIT_SEPARATORS\n#endif\n#if !defined(__cpp_generic_lambdas) || (__cpp_generic_lambdas < 201304)\n#  define BOOST_NO_CXX14_GENERIC_LAMBDAS\n#endif\n#if !defined(__cpp_init_captures) || (__cpp_init_captures < 201304)\n#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES\n#endif\n#if !defined(__cpp_return_type_deduction) || (__cpp_return_type_deduction < 201304)\n#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION\n#endif\n#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)\n#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES\n#endif\n//\n// version check:\n// probably nothing to do here?\n\n"
  },
  {
    "path": "benchmarks/boost/config/compiler/sgi_mipspro.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2002. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  SGI C++ compiler setup:\n\n#define BOOST_COMPILER \"SGI Irix compiler version \" BOOST_STRINGIZE(_COMPILER_VERSION)\n\n#include \"boost/config/compiler/common_edg.hpp\"\n\n//\n// Threading support:\n// Turn this on unconditionally here, it will get turned off again later\n// if no threading API is detected.\n//\n#define BOOST_HAS_THREADS\n#define BOOST_NO_TWO_PHASE_NAME_LOOKUP\n\n#undef BOOST_NO_SWPRINTF\n#undef BOOST_DEDUCED_TYPENAME\n\n//\n// version check:\n// probably nothing to do here?\n\n\n"
  },
  {
    "path": "benchmarks/boost/config/compiler/sunpro_cc.hpp",
    "content": "//  (C) Copyright John Maddock 2001.\n//  (C) Copyright Jens Maurer 2001 - 2003.\n//  (C) Copyright Peter Dimov 2002.\n//  (C) Copyright Aleksey Gurtovoy 2002 - 2003.\n//  (C) Copyright David Abrahams 2002.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Sun C++ compiler setup:\n\n#    if __SUNPRO_CC <= 0x500\n#      define BOOST_NO_MEMBER_TEMPLATES\n#      define BOOST_NO_FUNCTION_TEMPLATE_ORDERING\n#    endif\n\n#    if (__SUNPRO_CC <= 0x520)\n       //\n       // Sunpro 5.2 and earler:\n       //\n       // although sunpro 5.2 supports the syntax for\n       // inline initialization it often gets the value\n       // wrong, especially where the value is computed\n       // from other constants (J Maddock 6th May 2001)\n#      define BOOST_NO_INCLASS_MEMBER_INITIALIZATION\n\n       // Although sunpro 5.2 supports the syntax for\n       // partial specialization, it often seems to\n       // bind to the wrong specialization.  Better\n       // to disable it until suppport becomes more stable\n       // (J Maddock 6th May 2001).\n#      define BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION\n#    endif\n\n#    if (__SUNPRO_CC <= 0x530)\n       // Requesting debug info (-g) with Boost.Python results\n       // in an internal compiler error for \"static const\"\n       // initialized in-class.\n       //    >> Assertion:   (../links/dbg_cstabs.cc, line 611)\n       //         while processing ../test.cpp at line 0.\n       // (Jens Maurer according to Gottfried Ganssauge 04 Mar 2002)\n#      define BOOST_NO_INCLASS_MEMBER_INITIALIZATION\n\n       // SunPro 5.3 has better support for partial specialization,\n       // but breaks when compiling std::less<shared_ptr<T> >\n       // (Jens Maurer 4 Nov 2001).\n\n       // std::less specialization fixed as reported by George\n       // Heintzelman; partial specialization re-enabled\n       // (Peter Dimov 17 Jan 2002)\n\n//#      define BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION\n\n       // integral constant expressions with 64 bit numbers fail\n#      define BOOST_NO_INTEGRAL_INT64_T\n#    endif\n\n#    if (__SUNPRO_CC < 0x570)\n#      define BOOST_NO_TEMPLATE_TEMPLATES\n       // see http://lists.boost.org/MailArchives/boost/msg47184.php\n       // and http://lists.boost.org/MailArchives/boost/msg47220.php\n#      define BOOST_NO_INCLASS_MEMBER_INITIALIZATION\n#      define BOOST_NO_SFINAE\n#      define BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS\n#    endif\n#    if (__SUNPRO_CC <= 0x580)\n#      define BOOST_NO_IS_ABSTRACT\n#    endif\n\n#    if (__SUNPRO_CC <= 0x5100)\n       // Sun 5.10 may not correctly value-initialize objects of\n       // some user defined types, as was reported in April 2010\n       // (CR 6947016), and confirmed by Steve Clamage.\n       // (Niels Dekker, LKEB, May 2010).\n#      define BOOST_NO_COMPLETE_VALUE_INITIALIZATION\n#    endif\n\n//\n// Dynamic shared object (DSO) and dynamic-link library (DLL) support\n//\n#if __SUNPRO_CC > 0x500\n#  define BOOST_SYMBOL_EXPORT __global\n#  define BOOST_SYMBOL_IMPORT __global\n#  define BOOST_SYMBOL_VISIBLE __global\n#endif\n\n#if (__SUNPRO_CC < 0x5130)\n// C++03 features in 12.4:\n#define BOOST_NO_TWO_PHASE_NAME_LOOKUP\n#define BOOST_NO_SFINAE_EXPR\n#define BOOST_NO_ADL_BARRIER\n#define BOOST_NO_CXX11_VARIADIC_MACROS\n#endif\n\n#if (__SUNPRO_CC < 0x5130) || (__cplusplus < 201100)\n// C++11 only featuires in 12.4:\n#define BOOST_NO_CXX11_AUTO_DECLARATIONS\n#define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#define BOOST_NO_CXX11_CHAR16_T\n#define BOOST_NO_CXX11_CHAR32_T\n#define BOOST_NO_CXX11_CONSTEXPR\n#define BOOST_NO_CXX11_DECLTYPE\n#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#define BOOST_NO_CXX11_DELETED_FUNCTIONS\n#define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#define BOOST_NO_CXX11_EXTERN_TEMPLATE\n#define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#define BOOST_NO_CXX11_LAMBDAS\n#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#define BOOST_NO_CXX11_NOEXCEPT\n#define BOOST_NO_CXX11_NULLPTR\n#define BOOST_NO_CXX11_RANGE_BASED_FOR\n#define BOOST_NO_CXX11_RAW_LITERALS\n#define BOOST_NO_CXX11_RVALUE_REFERENCES\n#define BOOST_NO_CXX11_SCOPED_ENUMS\n#define BOOST_NO_CXX11_STATIC_ASSERT\n#define BOOST_NO_CXX11_TEMPLATE_ALIASES\n#define BOOST_NO_CXX11_UNICODE_LITERALS\n#define BOOST_NO_CXX11_ALIGNAS\n#define BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#define BOOST_NO_CXX11_INLINE_NAMESPACES\n#define BOOST_NO_CXX11_FINAL\n#endif\n\n#if (__SUNPRO_CC < 0x5140) || (__cplusplus < 201103)\n#define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#define BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS\n#define BOOST_NO_CXX11_DECLTYPE_N3276\n#define BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#define BOOST_NO_CXX11_REF_QUALIFIERS\n#endif\n\n#define BOOST_NO_COMPLETE_VALUE_INITIALIZATION\n//\n// C++0x features\n//\n#  define BOOST_HAS_LONG_LONG\n\n\n// C++ 14:\n#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)\n#  define BOOST_NO_CXX14_AGGREGATE_NSDMI\n#endif\n#if !defined(__cpp_binary_literals) || (__cpp_binary_literals < 201304)\n#  define BOOST_NO_CXX14_BINARY_LITERALS\n#endif\n#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)\n#  define BOOST_NO_CXX14_CONSTEXPR\n#endif\n#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304)\n#  define BOOST_NO_CXX14_DECLTYPE_AUTO\n#endif\n#if (__cplusplus < 201304) // There's no SD6 check for this....\n#  define BOOST_NO_CXX14_DIGIT_SEPARATORS\n#endif\n#if !defined(__cpp_generic_lambdas) || (__cpp_generic_lambdas < 201304)\n#  define BOOST_NO_CXX14_GENERIC_LAMBDAS\n#endif\n#if !defined(__cpp_init_captures) || (__cpp_init_captures < 201304)\n#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES\n#endif\n#if !defined(__cpp_return_type_deduction) || (__cpp_return_type_deduction < 201304)\n#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION\n#endif\n#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)\n#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES\n#endif\n//\n// Version\n//\n\n#define BOOST_COMPILER \"Sun compiler version \" BOOST_STRINGIZE(__SUNPRO_CC)\n\n//\n// versions check:\n// we don't support sunpro prior to version 4:\n#if __SUNPRO_CC < 0x400\n#error \"Compiler not supported or configured - please reconfigure\"\n#endif\n//\n// last known and checked version is 0x590:\n#if (__SUNPRO_CC > 0x590)\n#  if defined(BOOST_ASSERT_CONFIG)\n#     error \"Unknown compiler version - please run the configure tests and report the results\"\n#  endif\n#endif\n"
  },
  {
    "path": "benchmarks/boost/config/compiler/vacpp.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003.\n//  (C) Copyright Toon Knapen 2001 - 2003.\n//  (C) Copyright Lie-Quan Lee 2001.\n//  (C) Copyright Markus Schoepflin 2002 - 2003.\n//  (C) Copyright Beman Dawes 2002 - 2003.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Visual Age (IBM) C++ compiler setup:\n\n#if __IBMCPP__ <= 501\n#  define BOOST_NO_MEMBER_TEMPLATE_FRIENDS\n#  define BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS\n#endif\n\n#if (__IBMCPP__ <= 502)\n// Actually the compiler supports inclass member initialization but it\n// requires a definition for the class member and it doesn't recognize\n// it as an integral constant expression when used as a template argument.\n#  define BOOST_NO_INCLASS_MEMBER_INITIALIZATION\n#  define BOOST_NO_INTEGRAL_INT64_T\n#  define BOOST_NO_MEMBER_TEMPLATE_KEYWORD\n#endif\n\n#if (__IBMCPP__ <= 600) || !defined(BOOST_STRICT_CONFIG)\n#  define BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS\n#endif\n\n#if (__IBMCPP__ <= 1110)\n// XL C++ V11.1 and earlier versions may not always value-initialize\n// a temporary object T(), when T is a non-POD aggregate class type.\n// Michael Wong (IBM Canada Ltd) has confirmed this issue and gave it\n// high priority. -- Niels Dekker (LKEB), May 2010.\n#  define BOOST_NO_COMPLETE_VALUE_INITIALIZATION\n#endif\n\n//\n// On AIX thread support seems to be indicated by _THREAD_SAFE:\n//\n#ifdef _THREAD_SAFE\n#  define BOOST_HAS_THREADS\n#endif\n\n#define BOOST_COMPILER \"IBM Visual Age version \" BOOST_STRINGIZE(__IBMCPP__)\n\n//\n// versions check:\n// we don't support Visual age prior to version 5:\n#if __IBMCPP__ < 500\n#error \"Compiler not supported or configured - please reconfigure\"\n#endif\n//\n// last known and checked version is 1210:\n#if (__IBMCPP__ > 1210)\n#  if defined(BOOST_ASSERT_CONFIG)\n#     error \"Unknown compiler version - please run the configure tests and report the results\"\n#  endif\n#endif\n\n// Some versions of the compiler have issues with default arguments on partial specializations\n#if __IBMCPP__ <= 1010\n#define BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS\n#endif\n\n//\n// C++0x features\n//\n//   See boost\\config\\suffix.hpp for BOOST_NO_LONG_LONG\n//\n#if ! __IBMCPP_AUTO_TYPEDEDUCTION\n#  define BOOST_NO_CXX11_AUTO_DECLARATIONS\n#  define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#endif\n#if ! __IBMCPP_UTF_LITERAL__\n#  define BOOST_NO_CXX11_CHAR16_T\n#  define BOOST_NO_CXX11_CHAR32_T\n#endif\n#if ! __IBMCPP_CONSTEXPR\n#  define BOOST_NO_CXX11_CONSTEXPR\n#endif\n#if ! __IBMCPP_DECLTYPE\n#  define BOOST_NO_CXX11_DECLTYPE\n#else\n#  define BOOST_HAS_DECLTYPE\n#endif\n#define BOOST_NO_CXX11_DECLTYPE_N3276\n#define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#define BOOST_NO_CXX11_DELETED_FUNCTIONS\n#if ! __IBMCPP_EXPLICIT_CONVERSION_OPERATORS\n#  define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#endif\n#if ! __IBMCPP_EXTERN_TEMPLATE\n#  define BOOST_NO_CXX11_EXTERN_TEMPLATE\n#endif\n#if ! __IBMCPP_VARIADIC_TEMPLATES\n// not enabled separately at this time\n#  define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#endif\n#define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#define BOOST_NO_CXX11_LAMBDAS\n#define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#define BOOST_NO_CXX11_NOEXCEPT\n#define BOOST_NO_CXX11_NULLPTR\n#define BOOST_NO_CXX11_RANGE_BASED_FOR\n#define BOOST_NO_CXX11_RAW_LITERALS\n#define BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#if ! __IBMCPP_RVALUE_REFERENCES\n#  define BOOST_NO_CXX11_RVALUE_REFERENCES\n#endif\n#if ! __IBMCPP_SCOPED_ENUM\n#  define BOOST_NO_CXX11_SCOPED_ENUMS\n#endif\n#define BOOST_NO_SFINAE_EXPR\n#define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#if ! __IBMCPP_STATIC_ASSERT\n#  define BOOST_NO_CXX11_STATIC_ASSERT\n#endif\n#define BOOST_NO_CXX11_TEMPLATE_ALIASES\n#define BOOST_NO_CXX11_UNICODE_LITERALS\n#if ! __IBMCPP_VARIADIC_TEMPLATES\n#  define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#endif\n#if ! __C99_MACRO_WITH_VA_ARGS\n#  define BOOST_NO_CXX11_VARIADIC_MACROS\n#endif\n#define BOOST_NO_CXX11_ALIGNAS\n#define BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#define BOOST_NO_CXX11_INLINE_NAMESPACES\n#define BOOST_NO_CXX11_REF_QUALIFIERS\n#define BOOST_NO_CXX11_FINAL\n\n// C++ 14:\n#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)\n#  define BOOST_NO_CXX14_AGGREGATE_NSDMI\n#endif\n#if !defined(__cpp_binary_literals) || (__cpp_binary_literals < 201304)\n#  define BOOST_NO_CXX14_BINARY_LITERALS\n#endif\n#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)\n#  define BOOST_NO_CXX14_CONSTEXPR\n#endif\n#if !defined(__cpp_decltype_auto) || (__cpp_decltype_auto < 201304)\n#  define BOOST_NO_CXX14_DECLTYPE_AUTO\n#endif\n#if (__cplusplus < 201304) // There's no SD6 check for this....\n#  define BOOST_NO_CXX14_DIGIT_SEPARATORS\n#endif\n#if !defined(__cpp_generic_lambdas) || (__cpp_generic_lambdas < 201304)\n#  define BOOST_NO_CXX14_GENERIC_LAMBDAS\n#endif\n#if !defined(__cpp_init_captures) || (__cpp_init_captures < 201304)\n#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES\n#endif\n#if !defined(__cpp_return_type_deduction) || (__cpp_return_type_deduction < 201304)\n#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION\n#endif\n#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)\n#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES\n#endif\n"
  },
  {
    "path": "benchmarks/boost/config/compiler/visualc.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003.\n//  (C) Copyright Darin Adler 2001 - 2002.\n//  (C) Copyright Peter Dimov 2001.\n//  (C) Copyright Aleksey Gurtovoy 2002.\n//  (C) Copyright David Abrahams 2002 - 2003.\n//  (C) Copyright Beman Dawes 2002 - 2003.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n//\n//  Microsoft Visual C++ compiler setup:\n//\n//  We need to be careful with the checks in this file, as contrary\n//  to popular belief there are versions with _MSC_VER with the final\n//  digit non-zero (mainly the MIPS cross compiler).\n//\n//  So we either test _MSC_VER >= XXXX or else _MSC_VER < XXXX.\n//  No other comparisons (==, >, or <=) are safe.\n//\n\n#define BOOST_MSVC _MSC_VER\n\n//\n// Helper macro BOOST_MSVC_FULL_VER for use in Boost code:\n//\n#if _MSC_FULL_VER > 100000000\n#  define BOOST_MSVC_FULL_VER _MSC_FULL_VER\n#else\n#  define BOOST_MSVC_FULL_VER (_MSC_FULL_VER * 10)\n#endif\n\n// Attempt to suppress VC6 warnings about the length of decorated names (obsolete):\n#pragma warning( disable : 4503 ) // warning: decorated name length exceeded\n\n#define BOOST_HAS_PRAGMA_ONCE\n\n//\n// versions check:\n// we don't support Visual C++ prior to version 7.1:\n#if _MSC_VER < 1310\n#  error \"Compiler not supported or configured - please reconfigure\"\n#endif\n\n#if _MSC_FULL_VER < 180020827\n#  define BOOST_NO_FENV_H\n#endif\n\n#if _MSC_VER < 1400\n// although a conforming signature for swprint exists in VC7.1\n// it appears not to actually work:\n#  define BOOST_NO_SWPRINTF\n// Our extern template tests also fail for this compiler:\n#  define BOOST_NO_CXX11_EXTERN_TEMPLATE\n// Variadic macros do not exist for VC7.1 and lower\n#  define BOOST_NO_CXX11_VARIADIC_MACROS\n#  define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#endif\n\n#if _MSC_VER < 1500  // 140X == VC++ 8.0\n#  define BOOST_NO_MEMBER_TEMPLATE_FRIENDS\n#endif\n\n#if _MSC_VER < 1600  // 150X == VC++ 9.0\n   // A bug in VC9:\n#  define BOOST_NO_ADL_BARRIER\n#endif\n\n\n#ifndef _NATIVE_WCHAR_T_DEFINED\n#  define BOOST_NO_INTRINSIC_WCHAR_T\n#endif\n\n//\n// check for exception handling support:\n#if !defined(_CPPUNWIND) && !defined(BOOST_NO_EXCEPTIONS)\n#  define BOOST_NO_EXCEPTIONS\n#endif\n\n//\n// __int64 support:\n//\n#define BOOST_HAS_MS_INT64\n#if defined(_MSC_EXTENSIONS) || (_MSC_VER >= 1400)\n#   define BOOST_HAS_LONG_LONG\n#else\n#   define BOOST_NO_LONG_LONG\n#endif\n#if (_MSC_VER >= 1400) && !defined(_DEBUG)\n#   define BOOST_HAS_NRVO\n#endif\n#if _MSC_VER >= 1600  // 160X == VC++ 10.0\n#  define BOOST_HAS_PRAGMA_DETECT_MISMATCH\n#endif\n//\n// disable Win32 API's if compiler extensions are\n// turned off:\n//\n#if !defined(_MSC_EXTENSIONS) && !defined(BOOST_DISABLE_WIN32)\n#  define BOOST_DISABLE_WIN32\n#endif\n#if !defined(_CPPRTTI) && !defined(BOOST_NO_RTTI)\n#  define BOOST_NO_RTTI\n#endif\n\n//\n// TR1 features:\n//\n#if _MSC_VER >= 1700\n// # define BOOST_HAS_TR1_HASH\t\t\t// don't know if this is true yet.\n// # define BOOST_HAS_TR1_TYPE_TRAITS\t// don't know if this is true yet.\n# define BOOST_HAS_TR1_UNORDERED_MAP\n# define BOOST_HAS_TR1_UNORDERED_SET\n#endif\n\n//\n// C++0x features\n//\n//   See above for BOOST_NO_LONG_LONG\n\n// C++ features supported by VC++ 10 (aka 2010)\n//\n#if _MSC_VER < 1600\n#  define BOOST_NO_CXX11_AUTO_DECLARATIONS\n#  define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#  define BOOST_NO_CXX11_LAMBDAS\n#  define BOOST_NO_CXX11_RVALUE_REFERENCES\n#  define BOOST_NO_CXX11_STATIC_ASSERT\n#  define BOOST_NO_CXX11_NULLPTR\n#  define BOOST_NO_CXX11_DECLTYPE\n#endif // _MSC_VER < 1600\n\n#if _MSC_VER >= 1600\n#  define BOOST_HAS_STDINT_H\n#endif\n\n// C++11 features supported by VC++ 11 (aka 2012)\n//\n#if _MSC_VER < 1700\n#  define BOOST_NO_CXX11_FINAL\n#  define BOOST_NO_CXX11_RANGE_BASED_FOR\n#  define BOOST_NO_CXX11_SCOPED_ENUMS\n#endif // _MSC_VER < 1700\n\n// C++11 features supported by VC++ 12 (aka 2013).\n//\n#if _MSC_FULL_VER < 180020827\n#  define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#  define BOOST_NO_CXX11_DELETED_FUNCTIONS\n#  define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#  define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#  define BOOST_NO_CXX11_RAW_LITERALS\n#  define BOOST_NO_CXX11_TEMPLATE_ALIASES\n#  define BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#  define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#  define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#  define BOOST_NO_CXX11_DECLTYPE_N3276\n#endif\n\n// C++11 features supported by VC++ 14 (aka 2015)\n//\n#if (_MSC_FULL_VER < 190023026)\n#  define BOOST_NO_CXX11_NOEXCEPT\n#  define BOOST_NO_CXX11_REF_QUALIFIERS\n#  define BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#  define BOOST_NO_CXX11_ALIGNAS\n#  define BOOST_NO_CXX11_INLINE_NAMESPACES\n#  define BOOST_NO_CXX11_CHAR16_T\n#  define BOOST_NO_CXX11_CHAR32_T\n#  define BOOST_NO_CXX11_UNICODE_LITERALS\n#  define BOOST_NO_CXX14_DECLTYPE_AUTO\n#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES\n#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION\n#  define BOOST_NO_CXX14_BINARY_LITERALS\n#  define BOOST_NO_CXX14_GENERIC_LAMBDAS\n#  define BOOST_NO_CXX14_DIGIT_SEPARATORS\n#endif\n\n// MSVC including version 14 has not yet completely\n// implemented value-initialization, as is reported:\n// \"VC++ does not value-initialize members of derived classes without\n// user-declared constructor\", reported in 2009 by Sylvester Hesp:\n// https://connect.microsoft.com/VisualStudio/feedback/details/484295\n// \"Presence of copy constructor breaks member class initialization\",\n// reported in 2009 by Alex Vakulenko:\n// https://connect.microsoft.com/VisualStudio/feedback/details/499606\n// \"Value-initialization in new-expression\", reported in 2005 by\n// Pavel Kuznetsov (MetaCommunications Engineering):\n// https://connect.microsoft.com/VisualStudio/feedback/details/100744\n// Reported again by John Maddock in 2015 for VC14:\n// https://connect.microsoft.com/VisualStudio/feedback/details/1582233/c-subobjects-still-not-value-initialized-correctly\n// See also: http://www.boost.org/libs/utility/value_init.htm#compiler_issues\n// (Niels Dekker, LKEB, May 2010)\n#define BOOST_NO_COMPLETE_VALUE_INITIALIZATION\n// C++11 features not supported by any versions\n#define BOOST_NO_SFINAE_EXPR\n#define BOOST_NO_TWO_PHASE_NAME_LOOKUP\n//\n// This is somewhat supported in VC14, but we may need to wait for\n// a service release before enabling:\n//\n#define BOOST_NO_CXX11_CONSTEXPR\n\n// C++ 14:\n#if !defined(__cpp_aggregate_nsdmi) || (__cpp_aggregate_nsdmi < 201304)\n#  define BOOST_NO_CXX14_AGGREGATE_NSDMI\n#endif\n#if !defined(__cpp_constexpr) || (__cpp_constexpr < 201304)\n#  define BOOST_NO_CXX14_CONSTEXPR\n#endif\n#if !defined(__cpp_variable_templates) || (__cpp_variable_templates < 201304)\n#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES\n#endif\n\n//\n// prefix and suffix headers:\n//\n#ifndef BOOST_ABI_PREFIX\n#  define BOOST_ABI_PREFIX \"boost/config/abi/msvc_prefix.hpp\"\n#endif\n#ifndef BOOST_ABI_SUFFIX\n#  define BOOST_ABI_SUFFIX \"boost/config/abi/msvc_suffix.hpp\"\n#endif\n\n#ifndef BOOST_COMPILER\n// TODO:\n// these things are mostly bogus. 1200 means version 12.0 of the compiler. The\n// artificial versions assigned to them only refer to the versions of some IDE\n// these compilers have been shipped with, and even that is not all of it. Some\n// were shipped with freely downloadable SDKs, others as crosscompilers in eVC.\n// IOW, you can't use these 'versions' in any sensible way. Sorry.\n# if defined(UNDER_CE)\n#   if _MSC_VER < 1400\n      // Note: I'm not aware of any CE compiler with version 13xx\n#      if defined(BOOST_ASSERT_CONFIG)\n#         error \"Unknown EVC++ compiler version - please run the configure tests and report the results\"\n#      else\n#         pragma message(\"Unknown EVC++ compiler version - please run the configure tests and report the results\")\n#      endif\n#   elif _MSC_VER < 1500\n#     define BOOST_COMPILER_VERSION evc8\n#   elif _MSC_VER < 1600\n#     define BOOST_COMPILER_VERSION evc9\n#   elif _MSC_VER < 1700\n#     define BOOST_COMPILER_VERSION evc10\n#   elif _MSC_VER < 1800 \n#     define BOOST_COMPILER_VERSION evc11 \n#   elif _MSC_VER < 1900 \n#     define BOOST_COMPILER_VERSION evc12\n#   elif _MSC_VER < 2000  \n#     define BOOST_COMPILER_VERSION evc14\n#   else\n#      if defined(BOOST_ASSERT_CONFIG)\n#         error \"Unknown EVC++ compiler version - please run the configure tests and report the results\"\n#      else\n#         pragma message(\"Unknown EVC++ compiler version - please run the configure tests and report the results\")\n#      endif\n#   endif\n# else\n#   if _MSC_VER < 1310\n      // Note: Versions up to 7.0 aren't supported.\n#     define BOOST_COMPILER_VERSION 5.0\n#   elif _MSC_VER < 1300\n#     define BOOST_COMPILER_VERSION 6.0\n#   elif _MSC_VER < 1310\n#     define BOOST_COMPILER_VERSION 7.0\n#   elif _MSC_VER < 1400\n#     define BOOST_COMPILER_VERSION 7.1\n#   elif _MSC_VER < 1500\n#     define BOOST_COMPILER_VERSION 8.0\n#   elif _MSC_VER < 1600\n#     define BOOST_COMPILER_VERSION 9.0\n#   elif _MSC_VER < 1700\n#     define BOOST_COMPILER_VERSION 10.0\n#   elif _MSC_VER < 1800 \n#     define BOOST_COMPILER_VERSION 11.0\n#   elif _MSC_VER < 1900\n#     define BOOST_COMPILER_VERSION 12.0\n#   elif _MSC_VER < 2000\n#     define BOOST_COMPILER_VERSION 14.0\n#   else\n#     define BOOST_COMPILER_VERSION _MSC_VER\n#   endif\n# endif\n\n#  define BOOST_COMPILER \"Microsoft Visual C++ version \" BOOST_STRINGIZE(BOOST_COMPILER_VERSION)\n#endif\n\n//\n// last known and checked version is 19.00.23026 (VC++ 2015 RTM):\n#if (_MSC_VER > 1900)\n#  if defined(BOOST_ASSERT_CONFIG)\n#     error \"Unknown compiler version - please run the configure tests and report the results\"\n#  else\n#     pragma message(\"Unknown compiler version - please run the configure tests and report the results\")\n#  endif\n#endif\n"
  },
  {
    "path": "benchmarks/boost/config/compiler/xlcpp.hpp",
    "content": "// (C) Copyright Douglas Gregor 2010\n//\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  compiler setup for IBM XL C/C++ for Linux (Little Endian) based on clang.\n\n#define BOOST_HAS_PRAGMA_ONCE\n\n// Detecting `-fms-extension` compiler flag assuming that _MSC_VER defined when that flag is used.\n#if defined (_MSC_VER) && (__clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 4))\n#   define BOOST_HAS_PRAGMA_DETECT_MISMATCH\n#endif\n\n// When compiling with clang before __has_extension was defined,\n// even if one writes 'defined(__has_extension) && __has_extension(xxx)',\n// clang reports a compiler error. So the only workaround found is:\n\n#ifndef __has_extension\n#define __has_extension __has_feature\n#endif\n\n#if !__has_feature(cxx_exceptions) && !defined(BOOST_NO_EXCEPTIONS)\n#  define BOOST_NO_EXCEPTIONS\n#endif\n\n#if !__has_feature(cxx_rtti) && !defined(BOOST_NO_RTTI)\n#  define BOOST_NO_RTTI\n#endif\n\n#if !__has_feature(cxx_rtti) && !defined(BOOST_NO_TYPEID)\n#  define BOOST_NO_TYPEID\n#endif\n\n#if defined(__int64) && !defined(__GNUC__)\n#  define BOOST_HAS_MS_INT64\n#endif\n\n#define BOOST_HAS_NRVO\n\n// Branch prediction hints\n#if defined(__has_builtin)\n#if __has_builtin(__builtin_expect)\n#define BOOST_LIKELY(x) __builtin_expect(x, 1)\n#define BOOST_UNLIKELY(x) __builtin_expect(x, 0)\n#endif\n#endif\n\n// Clang supports \"long long\" in all compilation modes.\n#define BOOST_HAS_LONG_LONG\n\n//\n// Dynamic shared object (DSO) and dynamic-link library (DLL) support\n//\n#if !defined(_WIN32) && !defined(__WIN32__) && !defined(WIN32)\n#  define BOOST_SYMBOL_EXPORT __attribute__((__visibility__(\"default\")))\n#  define BOOST_SYMBOL_IMPORT\n#  define BOOST_SYMBOL_VISIBLE __attribute__((__visibility__(\"default\")))\n#endif\n\n//\n// The BOOST_FALLTHROUGH macro can be used to annotate implicit fall-through\n// between switch labels.\n//\n#if __cplusplus >= 201103L && defined(__has_warning)\n#  if __has_feature(cxx_attributes) && __has_warning(\"-Wimplicit-fallthrough\")\n#    define BOOST_FALLTHROUGH [[clang::fallthrough]]\n#  endif\n#endif\n\n#if !__has_feature(cxx_auto_type)\n#  define BOOST_NO_CXX11_AUTO_DECLARATIONS\n#  define BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS\n#endif\n\n//\n// Currently clang on Windows using VC++ RTL does not support C++11's char16_t or char32_t\n//\n#if defined(_MSC_VER) || !(defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L)\n#  define BOOST_NO_CXX11_CHAR16_T\n#  define BOOST_NO_CXX11_CHAR32_T\n#endif\n\n#if !__has_feature(cxx_constexpr)\n#  define BOOST_NO_CXX11_CONSTEXPR\n#endif\n\n#if !__has_feature(cxx_decltype)\n#  define BOOST_NO_CXX11_DECLTYPE\n#endif\n\n#if !__has_feature(cxx_decltype_incomplete_return_types)\n#  define BOOST_NO_CXX11_DECLTYPE_N3276\n#endif\n\n#if !__has_feature(cxx_defaulted_functions)\n#  define BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n#endif\n\n#if !__has_feature(cxx_deleted_functions)\n#  define BOOST_NO_CXX11_DELETED_FUNCTIONS\n#endif\n\n#if !__has_feature(cxx_explicit_conversions)\n#  define BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS\n#endif\n\n#if !__has_feature(cxx_default_function_template_args)\n#  define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#endif\n\n#if !__has_feature(cxx_generalized_initializers)\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#endif\n\n#if !__has_feature(cxx_lambdas)\n#  define BOOST_NO_CXX11_LAMBDAS\n#endif\n\n#if !__has_feature(cxx_local_type_template_args)\n#  define BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#endif\n\n#if !__has_feature(cxx_noexcept)\n#  define BOOST_NO_CXX11_NOEXCEPT\n#endif\n\n#if !__has_feature(cxx_nullptr)\n#  define BOOST_NO_CXX11_NULLPTR\n#endif\n\n#if !__has_feature(cxx_range_for)\n#  define BOOST_NO_CXX11_RANGE_BASED_FOR\n#endif\n\n#if !__has_feature(cxx_raw_string_literals)\n#  define BOOST_NO_CXX11_RAW_LITERALS\n#endif\n\n#if !__has_feature(cxx_reference_qualified_functions)\n#  define BOOST_NO_CXX11_REF_QUALIFIERS\n#endif\n\n#if !__has_feature(cxx_generalized_initializers)\n#  define BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX\n#endif\n\n#if !__has_feature(cxx_rvalue_references)\n#  define BOOST_NO_CXX11_RVALUE_REFERENCES\n#endif\n\n#if !__has_feature(cxx_strong_enums)\n#  define BOOST_NO_CXX11_SCOPED_ENUMS\n#endif\n\n#if !__has_feature(cxx_static_assert)\n#  define BOOST_NO_CXX11_STATIC_ASSERT\n#endif\n\n#if !__has_feature(cxx_alias_templates)\n#  define BOOST_NO_CXX11_TEMPLATE_ALIASES\n#endif\n\n#if !__has_feature(cxx_unicode_literals)\n#  define BOOST_NO_CXX11_UNICODE_LITERALS\n#endif\n\n#if !__has_feature(cxx_variadic_templates)\n#  define BOOST_NO_CXX11_VARIADIC_TEMPLATES\n#endif\n\n#if !__has_feature(cxx_user_literals)\n#  define BOOST_NO_CXX11_USER_DEFINED_LITERALS\n#endif\n\n#if !__has_feature(cxx_alignas)\n#  define BOOST_NO_CXX11_ALIGNAS\n#endif\n\n#if !__has_feature(cxx_trailing_return)\n#  define BOOST_NO_CXX11_TRAILING_RESULT_TYPES\n#endif\n\n#if !__has_feature(cxx_inline_namespaces)\n#  define BOOST_NO_CXX11_INLINE_NAMESPACES\n#endif\n\n#if !__has_feature(cxx_override_control)\n#  define BOOST_NO_CXX11_FINAL\n#endif\n\n#if !(__has_feature(__cxx_binary_literals__) || __has_extension(__cxx_binary_literals__))\n#  define BOOST_NO_CXX14_BINARY_LITERALS\n#endif\n\n#if !__has_feature(__cxx_decltype_auto__)\n#  define BOOST_NO_CXX14_DECLTYPE_AUTO\n#endif\n\n#if !__has_feature(__cxx_aggregate_nsdmi__)\n#  define BOOST_NO_CXX14_AGGREGATE_NSDMI\n#endif\n\n#if !__has_feature(__cxx_init_captures__)\n#  define BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES\n#endif\n\n#if !__has_feature(__cxx_generic_lambdas__)\n#  define BOOST_NO_CXX14_GENERIC_LAMBDAS\n#endif\n\n// clang < 3.5 has a defect with dependent type, like following.\n//\n//  template <class T>\n//  constexpr typename enable_if<pred<T> >::type foo(T &)\n//  { } // error: no return statement in constexpr function\n//\n// This issue also affects C++11 mode, but C++11 constexpr requires return stmt.\n// Therefore we don't care such case.\n//\n// Note that we can't check Clang version directly as the numbering system changes depending who's\n// creating the Clang release (see https://github.com/boostorg/config/pull/39#issuecomment-59927873)\n// so instead verify that we have a feature that was introduced at the same time as working C++14\n// constexpr (generic lambda's in this case):\n//\n#if !__has_feature(__cxx_generic_lambdas__) || !__has_feature(__cxx_relaxed_constexpr__)\n#  define BOOST_NO_CXX14_CONSTEXPR\n#endif\n\n#if !__has_feature(__cxx_return_type_deduction__)\n#  define BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION\n#endif\n\n#if !__has_feature(__cxx_variable_templates__)\n#  define BOOST_NO_CXX14_VARIABLE_TEMPLATES\n#endif\n\n#if __cplusplus < 201400\n// All versions with __cplusplus above this value seem to support this:\n#  define BOOST_NO_CXX14_DIGIT_SEPARATORS\n#endif\n\n\n// Unused attribute:\n#if defined(__GNUC__) && (__GNUC__ >= 4)\n#  define BOOST_ATTRIBUTE_UNUSED __attribute__((unused))\n#endif\n\n#ifndef BOOST_COMPILER\n#  define BOOST_COMPILER \"Clang version \" __clang_version__\n#endif\n\n// Macro used to identify the Clang compiler.\n#define BOOST_CLANG 1\n\n"
  },
  {
    "path": "benchmarks/boost/config/no_tr1/cmath.hpp",
    "content": "//  (C) Copyright John Maddock 2008.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n//\n// The aim of this header is just to include <cmath> but to do\n// so in a way that does not result in recursive inclusion of\n// the Boost TR1 components if boost/tr1/tr1/cmath is in the\n// include search path.  We have to do this to avoid circular\n// dependencies:\n//\n\n#ifndef BOOST_CONFIG_CMATH\n#  define BOOST_CONFIG_CMATH\n\n#  ifndef BOOST_TR1_NO_RECURSION\n#     define BOOST_TR1_NO_RECURSION\n#     define BOOST_CONFIG_NO_CMATH_RECURSION\n#  endif\n\n#  include <cmath>\n\n#  ifdef BOOST_CONFIG_NO_CMATH_RECURSION\n#     undef BOOST_TR1_NO_RECURSION\n#     undef BOOST_CONFIG_NO_CMATH_RECURSION\n#  endif\n\n#endif\n"
  },
  {
    "path": "benchmarks/boost/config/no_tr1/complex.hpp",
    "content": "//  (C) Copyright John Maddock 2005.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n//\n// The aim of this header is just to include <complex> but to do\n// so in a way that does not result in recursive inclusion of\n// the Boost TR1 components if boost/tr1/tr1/complex is in the\n// include search path.  We have to do this to avoid circular\n// dependencies:\n//\n\n#ifndef BOOST_CONFIG_COMPLEX\n#  define BOOST_CONFIG_COMPLEX\n\n#  ifndef BOOST_TR1_NO_RECURSION\n#     define BOOST_TR1_NO_RECURSION\n#     define BOOST_CONFIG_NO_COMPLEX_RECURSION\n#  endif\n\n#  include <complex>\n\n#  ifdef BOOST_CONFIG_NO_COMPLEX_RECURSION\n#     undef BOOST_TR1_NO_RECURSION\n#     undef BOOST_CONFIG_NO_COMPLEX_RECURSION\n#  endif\n\n#endif\n"
  },
  {
    "path": "benchmarks/boost/config/no_tr1/functional.hpp",
    "content": "//  (C) Copyright John Maddock 2005.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n//\n// The aim of this header is just to include <functional> but to do\n// so in a way that does not result in recursive inclusion of\n// the Boost TR1 components if boost/tr1/tr1/functional is in the\n// include search path.  We have to do this to avoid circular\n// dependencies:\n//\n\n#ifndef BOOST_CONFIG_FUNCTIONAL\n#  define BOOST_CONFIG_FUNCTIONAL\n\n#  ifndef BOOST_TR1_NO_RECURSION\n#     define BOOST_TR1_NO_RECURSION\n#     define BOOST_CONFIG_NO_FUNCTIONAL_RECURSION\n#  endif\n\n#  include <functional>\n\n#  ifdef BOOST_CONFIG_NO_FUNCTIONAL_RECURSION\n#     undef BOOST_TR1_NO_RECURSION\n#     undef BOOST_CONFIG_NO_FUNCTIONAL_RECURSION\n#  endif\n\n#endif\n"
  },
  {
    "path": "benchmarks/boost/config/no_tr1/memory.hpp",
    "content": "//  (C) Copyright John Maddock 2005.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n//\n// The aim of this header is just to include <memory> but to do\n// so in a way that does not result in recursive inclusion of\n// the Boost TR1 components if boost/tr1/tr1/memory is in the\n// include search path.  We have to do this to avoid circular\n// dependencies:\n//\n\n#ifndef BOOST_CONFIG_MEMORY\n#  define BOOST_CONFIG_MEMORY\n\n#  ifndef BOOST_TR1_NO_RECURSION\n#     define BOOST_TR1_NO_RECURSION\n#     define BOOST_CONFIG_NO_MEMORY_RECURSION\n#  endif\n\n#  include <memory>\n\n#  ifdef BOOST_CONFIG_NO_MEMORY_RECURSION\n#     undef BOOST_TR1_NO_RECURSION\n#     undef BOOST_CONFIG_NO_MEMORY_RECURSION\n#  endif\n\n#endif\n"
  },
  {
    "path": "benchmarks/boost/config/no_tr1/utility.hpp",
    "content": "//  (C) Copyright John Maddock 2005.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n//\n// The aim of this header is just to include <utility> but to do\n// so in a way that does not result in recursive inclusion of\n// the Boost TR1 components if boost/tr1/tr1/utility is in the\n// include search path.  We have to do this to avoid circular\n// dependencies:\n//\n\n#ifndef BOOST_CONFIG_UTILITY\n#  define BOOST_CONFIG_UTILITY\n\n#  ifndef BOOST_TR1_NO_RECURSION\n#     define BOOST_TR1_NO_RECURSION\n#     define BOOST_CONFIG_NO_UTILITY_RECURSION\n#  endif\n\n#  include <utility>\n\n#  ifdef BOOST_CONFIG_NO_UTILITY_RECURSION\n#     undef BOOST_TR1_NO_RECURSION\n#     undef BOOST_CONFIG_NO_UTILITY_RECURSION\n#  endif\n\n#endif\n"
  },
  {
    "path": "benchmarks/boost/config/platform/aix.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2002. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  IBM/Aix specific config options:\n\n#define BOOST_PLATFORM \"IBM Aix\"\n\n#define BOOST_HAS_UNISTD_H\n#define BOOST_HAS_NL_TYPES_H\n#define BOOST_HAS_NANOSLEEP\n#define BOOST_HAS_CLOCK_GETTIME\n\n// This needs support in \"boost/cstdint.hpp\" exactly like FreeBSD.\n// This platform has header named <inttypes.h> which includes all\n// the things needed.\n#define BOOST_HAS_STDINT_H\n\n// Threading API's:\n#define BOOST_HAS_PTHREADS\n#define BOOST_HAS_PTHREAD_DELAY_NP\n#define BOOST_HAS_SCHED_YIELD\n//#define BOOST_HAS_PTHREAD_YIELD\n\n// boilerplate code:\n#include <boost/config/posix_features.hpp>\n\n\n\n\n"
  },
  {
    "path": "benchmarks/boost/config/platform/amigaos.hpp",
    "content": "//  (C) Copyright John Maddock 2002. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n#define BOOST_PLATFORM \"AmigaOS\"\n\n#define BOOST_DISABLE_THREADS\n#define BOOST_NO_CWCHAR\n#define BOOST_NO_STD_WSTRING\n#define BOOST_NO_INTRINSIC_WCHAR_T\n \n\n"
  },
  {
    "path": "benchmarks/boost/config/platform/beos.hpp",
    "content": "//  (C) Copyright John Maddock 2001. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  BeOS specific config options:\n\n#define BOOST_PLATFORM \"BeOS\"\n\n#define BOOST_NO_CWCHAR\n#define BOOST_NO_CWCTYPE\n#define BOOST_HAS_UNISTD_H\n\n#define BOOST_HAS_BETHREADS\n\n#ifndef BOOST_DISABLE_THREADS\n#  define BOOST_HAS_THREADS\n#endif\n\n// boilerplate code:\n#include <boost/config/posix_features.hpp>\n \n\n\n"
  },
  {
    "path": "benchmarks/boost/config/platform/bsd.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003. \n//  (C) Copyright Darin Adler 2001. \n//  (C) Copyright Douglas Gregor 2002. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  generic BSD config options:\n\n#if !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(__OpenBSD__) && !defined(__DragonFly__)\n#error \"This platform is not BSD\"\n#endif\n\n#ifdef __FreeBSD__\n#define BOOST_PLATFORM \"FreeBSD \" BOOST_STRINGIZE(__FreeBSD__)\n#elif defined(__NetBSD__)\n#define BOOST_PLATFORM \"NetBSD \" BOOST_STRINGIZE(__NetBSD__)\n#elif defined(__OpenBSD__)\n#define BOOST_PLATFORM \"OpenBSD \" BOOST_STRINGIZE(__OpenBSD__)\n#elif defined(__DragonFly__)\n#define BOOST_PLATFORM \"DragonFly \" BOOST_STRINGIZE(__DragonFly__)\n#endif\n\n//\n// is this the correct version check?\n// FreeBSD has <nl_types.h> but does not\n// advertise the fact in <unistd.h>:\n//\n#if (defined(__FreeBSD__) && (__FreeBSD__ >= 3)) || defined(__DragonFly__)\n#  define BOOST_HAS_NL_TYPES_H\n#endif\n\n//\n// FreeBSD 3.x has pthreads support, but defines _POSIX_THREADS in <pthread.h>\n// and not in <unistd.h>\n//\n#if (defined(__FreeBSD__) && (__FreeBSD__ <= 3))\\\n   || defined(__OpenBSD__) || defined(__DragonFly__) \n#  define BOOST_HAS_PTHREADS\n#endif\n\n//\n// No wide character support in the BSD header files:\n//\n#if defined(__NetBSD__)\n#define __NetBSD_GCC__ (__GNUC__         * 1000000 \\\n                       + __GNUC_MINOR__ *    1000 \\\n                       + __GNUC_PATCHLEVEL__)\n// XXX - the following is required until c++config.h\n//       defines _GLIBCXX_HAVE_SWPRINTF and friends\n//       or the preprocessor conditionals are removed\n//       from the cwchar header.\n#define _GLIBCXX_HAVE_SWPRINTF 1\n#endif\n\n#if !((defined(__FreeBSD__) && (__FreeBSD__ >= 5)) \\\n      || (defined(__NetBSD_GCC__) && (__NetBSD_GCC__ >= 2095003)) || defined(__DragonFly__))\n#  define BOOST_NO_CWCHAR\n#endif\n//\n// The BSD <ctype.h> has macros only, no functions:\n//\n#if !defined(__OpenBSD__) || defined(__DragonFly__)\n#  define BOOST_NO_CTYPE_FUNCTIONS\n#endif\n\n//\n// thread API's not auto detected:\n//\n#define BOOST_HAS_SCHED_YIELD\n#define BOOST_HAS_NANOSLEEP\n#define BOOST_HAS_GETTIMEOFDAY\n#define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE\n#define BOOST_HAS_SIGACTION\n\n// boilerplate code:\n#define BOOST_HAS_UNISTD_H\n#include <boost/config/posix_features.hpp>\n\n\n\n\n\n\n"
  },
  {
    "path": "benchmarks/boost/config/platform/cloudabi.hpp",
    "content": "//       Copyright Nuxi, https://nuxi.nl/ 2015.\n// Distributed under the Boost Software License, Version 1.0.\n//    (See accompanying file LICENSE_1_0.txt or copy at\n//          http://www.boost.org/LICENSE_1_0.txt)\n\n#define BOOST_PLATFORM \"CloudABI\"\n\n#define BOOST_HAS_DIRENT_H\n#define BOOST_HAS_STDINT_H\n#define BOOST_HAS_UNISTD_H\n\n#define BOOST_HAS_CLOCK_GETTIME\n#define BOOST_HAS_EXPM1\n#define BOOST_HAS_GETTIMEOFDAY\n#define BOOST_HAS_LOG1P\n#define BOOST_HAS_NANOSLEEP\n#define BOOST_HAS_PTHREADS\n#define BOOST_HAS_SCHED_YIELD\n"
  },
  {
    "path": "benchmarks/boost/config/platform/cray.hpp",
    "content": "//  (C) Copyright John Maddock 2011.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n\n//  See http://www.boost.org for most recent version.\n\n//  SGI Irix specific config options:\n\n#define BOOST_PLATFORM \"Cray\"\n\n// boilerplate code:\n#define BOOST_HAS_UNISTD_H\n#include <boost/config/posix_features.hpp>\n\n\n\n"
  },
  {
    "path": "benchmarks/boost/config/platform/cygwin.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  cygwin specific config options:\n\n#define BOOST_PLATFORM \"Cygwin\"\n#define BOOST_HAS_DIRENT_H\n#define BOOST_HAS_LOG1P\n#define BOOST_HAS_EXPM1\n\n//\n// Threading API:\n// See if we have POSIX threads, if we do use them, otherwise\n// revert to native Win threads.\n#define BOOST_HAS_UNISTD_H\n#include <unistd.h>\n#if defined(_POSIX_THREADS) && (_POSIX_THREADS+0 >= 0) && !defined(BOOST_HAS_WINTHREADS)\n#  define BOOST_HAS_PTHREADS\n#  define BOOST_HAS_SCHED_YIELD\n#  define BOOST_HAS_GETTIMEOFDAY\n#  define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE\n#  define BOOST_HAS_SIGACTION\n#else\n#  if !defined(BOOST_HAS_WINTHREADS)\n#     define BOOST_HAS_WINTHREADS\n#  endif\n#  define BOOST_HAS_FTIME\n#endif\n\n//\n// find out if we have a stdint.h, there should be a better way to do this:\n//\n#include <sys/types.h>\n#ifdef _STDINT_H\n#define BOOST_HAS_STDINT_H\n#endif\n\n/// Cygwin has no fenv.h\n#define BOOST_NO_FENV_H\n\n// boilerplate code:\n#include <boost/config/posix_features.hpp>\n\n//\n// Cygwin lies about XSI conformance, there is no nl_types.h:\n//\n#ifdef BOOST_HAS_NL_TYPES_H\n#  undef BOOST_HAS_NL_TYPES_H\n#endif\n \n\n\n\n\n"
  },
  {
    "path": "benchmarks/boost/config/platform/haiku.hpp",
    "content": "//  (C) Copyright Jessica Hamilton 2014.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Haiku specific config options:\n\n#define BOOST_PLATFORM \"Haiku\"\n\n#define BOOST_HAS_UNISTD_H\n#define BOOST_HAS_STDINT_H\n\n#ifndef BOOST_DISABLE_THREADS\n#  define BOOST_HAS_THREADS\n#endif\n\n#define BOOST_NO_CXX11_HDR_TYPE_TRAITS\n#define BOOST_NO_CXX11_ATOMIC_SMART_PTR\n#define BOOST_NO_CXX11_STATIC_ASSERT\n#define BOOST_NO_CXX11_VARIADIC_MACROS\n\n//\n// thread API's not auto detected:\n//\n#define BOOST_HAS_SCHED_YIELD\n#define BOOST_HAS_GETTIMEOFDAY\n\n// boilerplate code:\n#include <boost/config/posix_features.hpp>\n"
  },
  {
    "path": "benchmarks/boost/config/platform/hpux.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003. \n//  (C) Copyright Jens Maurer 2001 - 2003. \n//  (C) Copyright David Abrahams 2002. \n//  (C) Copyright Toon Knapen 2003. \n//  (C) Copyright Boris Gubenko 2006 - 2007.\n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  hpux specific config options:\n\n#define BOOST_PLATFORM \"HP-UX\"\n\n// In principle, HP-UX has a nice <stdint.h> under the name <inttypes.h>\n// However, it has the following problem:\n// Use of UINT32_C(0) results in \"0u l\" for the preprocessed source\n// (verifyable with gcc 2.95.3)\n#if (defined(__GNUC__) && (__GNUC__ >= 3)) || defined(__HP_aCC)\n#  define BOOST_HAS_STDINT_H\n#endif\n\n#if !(defined(__HP_aCC) || !defined(_INCLUDE__STDC_A1_SOURCE))\n#  define BOOST_NO_SWPRINTF\n#endif\n#if defined(__HP_aCC) && !defined(_INCLUDE__STDC_A1_SOURCE)\n#  define BOOST_NO_CWCTYPE\n#endif\n\n#if defined(__GNUC__)\n#  if (__GNUC__ < 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ < 3))\n      // GNU C on HP-UX does not support threads (checked up to gcc 3.3)\n#     define BOOST_DISABLE_THREADS\n#  elif !defined(BOOST_DISABLE_THREADS)\n      // threads supported from gcc-3.3 onwards:\n#     define BOOST_HAS_THREADS\n#     define BOOST_HAS_PTHREADS\n#  endif\n#elif defined(__HP_aCC) && !defined(BOOST_DISABLE_THREADS)\n#  define BOOST_HAS_PTHREADS\n#endif\n\n// boilerplate code:\n#define BOOST_HAS_UNISTD_H\n#include <boost/config/posix_features.hpp>\n\n// the following are always available:\n#ifndef BOOST_HAS_GETTIMEOFDAY\n#  define BOOST_HAS_GETTIMEOFDAY\n#endif\n#ifndef BOOST_HAS_SCHED_YIELD\n#    define BOOST_HAS_SCHED_YIELD\n#endif\n#ifndef BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE\n#    define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE\n#endif\n#ifndef BOOST_HAS_NL_TYPES_H\n#    define BOOST_HAS_NL_TYPES_H\n#endif\n#ifndef BOOST_HAS_NANOSLEEP\n#    define BOOST_HAS_NANOSLEEP\n#endif\n#ifndef BOOST_HAS_GETTIMEOFDAY\n#    define BOOST_HAS_GETTIMEOFDAY\n#endif\n#ifndef BOOST_HAS_DIRENT_H\n#    define BOOST_HAS_DIRENT_H\n#endif\n#ifndef BOOST_HAS_CLOCK_GETTIME\n#    define BOOST_HAS_CLOCK_GETTIME\n#endif\n#ifndef BOOST_HAS_SIGACTION\n#  define BOOST_HAS_SIGACTION\n#endif\n#ifndef BOOST_HAS_NRVO \n#  ifndef __parisc\n#    define BOOST_HAS_NRVO\n#  endif\n#endif\n#ifndef BOOST_HAS_LOG1P \n#  define BOOST_HAS_LOG1P\n#endif\n#ifndef BOOST_HAS_EXPM1\n#  define BOOST_HAS_EXPM1\n#endif\n\n"
  },
  {
    "path": "benchmarks/boost/config/platform/irix.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003. \n//  (C) Copyright Jens Maurer 2003. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n\n//  See http://www.boost.org for most recent version.\n\n//  SGI Irix specific config options:\n\n#define BOOST_PLATFORM \"SGI Irix\"\n\n#define BOOST_NO_SWPRINTF \n//\n// these are not auto detected by POSIX feature tests:\n//\n#define BOOST_HAS_GETTIMEOFDAY\n#define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE\n\n#ifdef __GNUC__\n   // GNU C on IRIX does not support threads (checked up to gcc 3.3)\n#  define BOOST_DISABLE_THREADS\n#endif\n\n// boilerplate code:\n#define BOOST_HAS_UNISTD_H\n#include <boost/config/posix_features.hpp>\n\n\n\n"
  },
  {
    "path": "benchmarks/boost/config/platform/linux.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003. \n//  (C) Copyright Jens Maurer 2001 - 2003. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  linux specific config options:\n\n#define BOOST_PLATFORM \"linux\"\n\n// make sure we have __GLIBC_PREREQ if available at all\n#ifdef __cplusplus\n#include <cstdlib>\n#else\n#include <stdlib.h>\n#endif\n\n//\n// <stdint.h> added to glibc 2.1.1\n// We can only test for 2.1 though:\n//\n#if defined(__GLIBC__) && ((__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 1)))\n   // <stdint.h> defines int64_t unconditionally, but <sys/types.h> defines\n   // int64_t only if __GNUC__.  Thus, assume a fully usable <stdint.h>\n   // only when using GCC.\n#  if defined __GNUC__\n#    define BOOST_HAS_STDINT_H\n#  endif\n#endif\n\n#if defined(__LIBCOMO__)\n   //\n   // como on linux doesn't have std:: c functions:\n   // NOTE: versions of libcomo prior to beta28 have octal version numbering,\n   // e.g. version 25 is 21 (dec)\n   //\n#  if __LIBCOMO_VERSION__ <= 20\n#    define BOOST_NO_STDC_NAMESPACE\n#  endif\n\n#  if __LIBCOMO_VERSION__ <= 21\n#    define BOOST_NO_SWPRINTF\n#  endif\n\n#endif\n\n//\n// If glibc is past version 2 then we definitely have\n// gettimeofday, earlier versions may or may not have it:\n//\n#if defined(__GLIBC__) && (__GLIBC__ >= 2)\n#  define BOOST_HAS_GETTIMEOFDAY\n#endif\n\n#ifdef __USE_POSIX199309\n#  define BOOST_HAS_NANOSLEEP\n#endif\n\n#if defined(__GLIBC__) && defined(__GLIBC_PREREQ)\n// __GLIBC_PREREQ is available since 2.1.2\n\n   // swprintf is available since glibc 2.2.0\n#  if !__GLIBC_PREREQ(2,2) || (!defined(__USE_ISOC99) && !defined(__USE_UNIX98))\n#    define BOOST_NO_SWPRINTF\n#  endif\n#else\n#  define BOOST_NO_SWPRINTF\n#endif\n\n// boilerplate code:\n#define BOOST_HAS_UNISTD_H\n#include <boost/config/posix_features.hpp>\n#ifdef __USE_GNU\n#define BOOST_HAS_PTHREAD_YIELD\n#endif\n\n#ifndef __GNUC__\n//\n// if the compiler is not gcc we still need to be able to parse\n// the GNU system headers, some of which (mainly <stdint.h>)\n// use GNU specific extensions:\n//\n#  ifndef __extension__\n#     define __extension__\n#  endif\n#  ifndef __const__\n#     define __const__ const\n#  endif\n#  ifndef __volatile__\n#     define __volatile__ volatile\n#  endif\n#  ifndef __signed__\n#     define __signed__ signed\n#  endif\n#  ifndef __typeof__\n#     define __typeof__ typeof\n#  endif\n#  ifndef __inline__\n#     define __inline__ inline\n#  endif\n#endif\n\n\n"
  },
  {
    "path": "benchmarks/boost/config/platform/macos.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003. \n//  (C) Copyright Darin Adler 2001 - 2002. \n//  (C) Copyright Bill Kempf 2002. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Mac OS specific config options:\n\n#define BOOST_PLATFORM \"Mac OS\"\n\n#if __MACH__ && !defined(_MSL_USING_MSL_C)\n\n// Using the Mac OS X system BSD-style C library.\n\n#  ifndef BOOST_HAS_UNISTD_H\n#    define BOOST_HAS_UNISTD_H\n#  endif\n//\n// Begin by including our boilerplate code for POSIX\n// feature detection, this is safe even when using\n// the MSL as Metrowerks supply their own <unistd.h>\n// to replace the platform-native BSD one. G++ users\n// should also always be able to do this on MaxOS X.\n//\n#  include <boost/config/posix_features.hpp>\n#  ifndef BOOST_HAS_STDINT_H\n#     define BOOST_HAS_STDINT_H\n#  endif\n\n//\n// BSD runtime has pthreads, sigaction, sched_yield and gettimeofday,\n// of these only pthreads are advertised in <unistd.h>, so set the \n// other options explicitly:\n//\n#  define BOOST_HAS_SCHED_YIELD\n#  define BOOST_HAS_GETTIMEOFDAY\n#  define BOOST_HAS_SIGACTION\n\n#  if (__GNUC__ < 3) && !defined( __APPLE_CC__)\n\n// GCC strange \"ignore std\" mode works better if you pretend everything\n// is in the std namespace, for the most part.\n\n#    define BOOST_NO_STDC_NAMESPACE\n#  endif\n\n#  if (__GNUC__ >= 4)\n\n// Both gcc and intel require these.  \n#    define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE\n#    define BOOST_HAS_NANOSLEEP\n\n#  endif\n\n#else\n\n// Using the MSL C library.\n\n// We will eventually support threads in non-Carbon builds, but we do\n// not support this yet.\n#  if ( defined(TARGET_API_MAC_CARBON) && TARGET_API_MAC_CARBON ) || ( defined(TARGET_CARBON) && TARGET_CARBON )\n\n#  if !defined(BOOST_HAS_PTHREADS)\n// MPTasks support is deprecated/removed from Boost:\n//#    define BOOST_HAS_MPTASKS\n#  elif ( __dest_os == __mac_os_x )\n// We are doing a Carbon/Mach-O/MSL build which has pthreads, but only the\n// gettimeofday and no posix.\n#  define BOOST_HAS_GETTIMEOFDAY\n#  endif\n\n#ifdef BOOST_HAS_PTHREADS\n#  define BOOST_HAS_THREADS\n#endif\n\n// The remote call manager depends on this.\n#    define BOOST_BIND_ENABLE_PASCAL\n\n#  endif\n\n#endif\n\n\n\n"
  },
  {
    "path": "benchmarks/boost/config/platform/qnxnto.hpp",
    "content": "//  (C) Copyright Jim Douglas 2005. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  QNX specific config options:\n\n#define BOOST_PLATFORM \"QNX\"\n\n#define BOOST_HAS_UNISTD_H\n#include <boost/config/posix_features.hpp>\n\n// QNX claims XOpen version 5 compatibility, but doesn't have an nl_types.h\n// or log1p and expm1:\n#undef  BOOST_HAS_NL_TYPES_H\n#undef  BOOST_HAS_LOG1P\n#undef  BOOST_HAS_EXPM1\n\n#define BOOST_HAS_PTHREADS\n#define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE\n\n#define BOOST_HAS_GETTIMEOFDAY\n#define BOOST_HAS_CLOCK_GETTIME\n#define BOOST_HAS_NANOSLEEP\n\n\n\n\n\n"
  },
  {
    "path": "benchmarks/boost/config/platform/solaris.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003. \n//  (C) Copyright Jens Maurer 2003. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  sun specific config options:\n\n#define BOOST_PLATFORM \"Sun Solaris\"\n\n#define BOOST_HAS_GETTIMEOFDAY\n\n// boilerplate code:\n#define BOOST_HAS_UNISTD_H\n#include <boost/config/posix_features.hpp>\n\n//\n// pthreads don't actually work with gcc unless _PTHREADS is defined:\n//\n#if defined(__GNUC__) && defined(_POSIX_THREADS) && !defined(_PTHREADS)\n# undef BOOST_HAS_PTHREADS\n#endif\n\n#define BOOST_HAS_STDINT_H \n#define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE \n#define BOOST_HAS_LOG1P \n#define BOOST_HAS_EXPM1\n\n\n"
  },
  {
    "path": "benchmarks/boost/config/platform/symbian.hpp",
    "content": "//  (C) Copyright Yuriy Krasnoschek 2009. \n//  (C) Copyright John Maddock 2001 - 2003. \n//  (C) Copyright Jens Maurer 2001 - 2003. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  symbian specific config options:\n\n\n#define BOOST_PLATFORM \"Symbian\"\n#define BOOST_SYMBIAN 1\n\n\n#if defined(__S60_3X__)\n// Open C / C++ plugin was introdused in this SDK, earlier versions don't have CRT / STL\n#  define BOOST_S60_3rd_EDITION_FP2_OR_LATER_SDK\n// make sure we have __GLIBC_PREREQ if available at all\n#ifdef __cplusplus\n#include <cstdlib>\n#else\n#include <stdlib.h>\n#endif// boilerplate code:\n#  define BOOST_HAS_UNISTD_H\n#  include <boost/config/posix_features.hpp>\n// S60 SDK defines _POSIX_VERSION as POSIX.1\n#  ifndef BOOST_HAS_STDINT_H\n#    define BOOST_HAS_STDINT_H\n#  endif\n#  ifndef BOOST_HAS_GETTIMEOFDAY\n#    define BOOST_HAS_GETTIMEOFDAY\n#  endif\n#  ifndef BOOST_HAS_DIRENT_H\n#    define BOOST_HAS_DIRENT_H\n#  endif\n#  ifndef BOOST_HAS_SIGACTION\n#    define BOOST_HAS_SIGACTION\n#  endif\n#  ifndef BOOST_HAS_PTHREADS\n#    define BOOST_HAS_PTHREADS\n#  endif\n#  ifndef BOOST_HAS_NANOSLEEP\n#    define BOOST_HAS_NANOSLEEP\n#  endif\n#  ifndef BOOST_HAS_SCHED_YIELD\n#    define BOOST_HAS_SCHED_YIELD\n#  endif\n#  ifndef BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE\n#    define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE\n#  endif\n#  ifndef BOOST_HAS_LOG1P\n#    define BOOST_HAS_LOG1P\n#  endif\n#  ifndef BOOST_HAS_EXPM1\n#    define BOOST_HAS_EXPM1\n#  endif\n#  ifndef BOOST_POSIX_API\n#    define BOOST_POSIX_API\n#  endif\n// endianess support\n#  include <sys/endian.h>\n// Symbian SDK provides _BYTE_ORDER instead of __BYTE_ORDER\n#  ifndef __LITTLE_ENDIAN\n#    ifdef _LITTLE_ENDIAN\n#      define __LITTLE_ENDIAN _LITTLE_ENDIAN\n#    else\n#      define __LITTLE_ENDIAN 1234\n#    endif\n#  endif\n#  ifndef __BIG_ENDIAN\n#    ifdef _BIG_ENDIAN\n#      define __BIG_ENDIAN _BIG_ENDIAN\n#    else\n#      define __BIG_ENDIAN 4321\n#    endif\n#  endif\n#  ifndef __BYTE_ORDER\n#    define __BYTE_ORDER __LITTLE_ENDIAN // Symbian is LE\n#  endif\n// Known limitations\n#  define BOOST_ASIO_DISABLE_SERIAL_PORT\n#  define BOOST_DATE_TIME_NO_LOCALE\n#  define BOOST_NO_STD_WSTRING\n#  define BOOST_EXCEPTION_DISABLE\n#  define BOOST_NO_EXCEPTIONS\n\n#else // TODO: More platform support e.g. UIQ\n#  error \"Unsuppoted Symbian SDK\"\n#endif\n\n#if defined(__WINSCW__) && !defined(BOOST_DISABLE_WIN32)\n#  define BOOST_DISABLE_WIN32 // winscw defines WIN32 macro\n#endif\n\n\n"
  },
  {
    "path": "benchmarks/boost/config/platform/vms.hpp",
    "content": "//  (C) Copyright Artyom Beilis 2010.  \n//  Use, modification and distribution are subject to the  \n//  Boost Software License, Version 1.0. (See accompanying file  \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) \n\n#ifndef BOOST_CONFIG_PLATFORM_VMS_HPP \n#define BOOST_CONFIG_PLATFORM_VMS_HPP \n\n#define BOOST_PLATFORM \"OpenVMS\" \n\n#undef  BOOST_HAS_STDINT_H \n#define BOOST_HAS_UNISTD_H \n#define BOOST_HAS_NL_TYPES_H \n#define BOOST_HAS_GETTIMEOFDAY \n#define BOOST_HAS_DIRENT_H \n#define BOOST_HAS_PTHREADS \n#define BOOST_HAS_NANOSLEEP \n#define BOOST_HAS_CLOCK_GETTIME \n#define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE \n#define BOOST_HAS_LOG1P \n#define BOOST_HAS_EXPM1 \n#define BOOST_HAS_THREADS \n#undef  BOOST_HAS_SCHED_YIELD \n\n#endif \n"
  },
  {
    "path": "benchmarks/boost/config/platform/vxworks.hpp",
    "content": "//  (C) Copyright Dustin Spicuzza 2009.\n//      Adapted to vxWorks 6.9 by Peter Brockamp 2012.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Since WRS does not yet properly support boost under vxWorks\n//  and this file was badly outdated, but I was keen on using it,\n//  I patched boost myself to make things work. This has been tested\n//  and adapted by me for vxWorks 6.9 *only*, as I'm lacking access\n//  to earlier 6.X versions! The only thing I know for sure is that\n//  very old versions of vxWorks (namely everything below 6.x) are\n//  absolutely unable to use boost. This is mainly due to the completely\n//  outdated libraries and ancient compiler (GCC 2.96 or worse). Do\n//  not even think of getting this to work, a miserable failure will\n//  be guaranteed!\n//  Equally, this file has been tested for RTPs (Real Time Processes)\n//  only, not for DKMs (Downloadable Kernel Modules). These two types\n//  of executables differ largely in the available functionality of\n//  the C-library, STL, and so on. A DKM uses a library similar to those\n//  of vxWorks 5.X - with all its limitations and incompatibilities\n//  with respect to ANSI C++ and STL. So probably there might be problems\n//  with the usage of boost from DKMs. WRS or any voluteers are free to\n//  prove the opposite!\n\n// ====================================================================\n//\n// Some important information regarding the usage of POSIX semaphores:\n// -------------------------------------------------------------------\n//\n// VxWorks as a real time operating system handles threads somewhat\n// different from what \"normal\" OSes do, regarding their scheduling!\n// This could lead to a scenario called \"priority inversion\" when using\n// semaphores, see http://en.wikipedia.org/wiki/Priority_inversion.\n//\n// Now, VxWorks POSIX-semaphores for DKM's default to the usage of\n// priority inverting semaphores, which is fine. On the other hand,\n// for RTP's it defaults to using non priority inverting semaphores,\n// which could easily pose a serious problem for a real time process,\n// i.e. deadlocks! To overcome this two possibilities do exist:\n//\n// a) Patch every piece of boost that uses semaphores to instanciate\n//    the proper type of semaphores. This is non-intrusive with respect\n//    to the OS and could relatively easy been done by giving all\n//    semaphores attributes deviating from the default (for in-depth\n//    information see the POSIX functions pthread_mutexattr_init()\n//    and pthread_mutexattr_setprotocol()). However this breaks all\n//    too easily, as with every new version some boost library could\n//    all in a sudden start using semaphores, resurrecting the very\n//    same, hard to locate problem over and over again!\n//\n// b) We could change the default properties for POSIX-semaphores\n//    that VxWorks uses for RTP's and this is being suggested here,\n//    as it will more or less seamlessly integrate with boost. I got\n//    the following information from WRS how to do this, compare\n//    Wind River TSR# 1209768:\n//\n// Instructions for changing the default properties of POSIX-\n// semaphores for RTP's in VxWorks 6.9:\n// - Edit the file /vxworks-6.9/target/usr/src/posix/pthreadLib.c\n//   in the root of your Workbench-installation.\n// - Around line 917 there should be the definition of the default\n//   mutex attributes:\n//\n//   LOCAL pthread_mutexattr_t defaultMutexAttr =\n//       {\n//       PTHREAD_INITIALIZED_OBJ, PTHREAD_PRIO_NONE, 0,\n//       PTHREAD_MUTEX_DEFAULT\n//       };\n//\n//   Here, replace PTHREAD_PRIO_NONE by PTHREAD_PRIO_INHERIT.\n// - Around line 1236 there should be a definition for the function\n//   pthread_mutexattr_init(). A couple of lines below you should\n//   find a block of code like this:\n//\n//   pAttr->mutexAttrStatus      = PTHREAD_INITIALIZED_OBJ;\n//   pAttr->mutexAttrProtocol    = PTHREAD_PRIO_NONE;\n//   pAttr->mutexAttrPrioceiling = 0;\n//   pAttr->mutexAttrType        = PTHREAD_MUTEX_DEFAULT;\n//\n//   Here again, replace PTHREAD_PRIO_NONE by PTHREAD_PRIO_INHERIT.\n// - Finally, rebuild your VSB. This will create a new VxWorks kernel\n//   with the changed properties. That's it! Now, using boost should\n//   no longer cause any problems with task deadlocks!\n//\n// And here's another useful piece of information concerning VxWorks'\n// POSIX-functionality in general:\n// VxWorks is not a genuine POSIX-OS in itself, rather it is using a\n// kind of compatibility layer (sort of a wrapper) to emulate the\n// POSIX-functionality by using its own resources and functions.\n// At the time a task (thread) calls it's first POSIX-function during\n// runtime it is being transformed by the OS into a POSIX-thread.\n// This transformation does include a call to malloc() to allocate the\n// memory required for the housekeeping of POSIX-threads. In a high\n// priority RTP this malloc() call may be highly undesirable, as its\n// timing is more or less unpredictable (depending on what your actual\n// heap looks like). You can circumvent this problem by calling the\n// function thread_self() at a well defined point in the code of the\n// task, e.g. shortly after the task spawns up. Thereby you are able\n// to define the time when the task-transformation will take place and\n// you could shift it to an uncritical point where a malloc() call is\n// tolerable. So, if this could pose a problem for your code, remember\n// to call thread_self() from the affected task at an early stage.\n//\n// ====================================================================\n\n// Block out all versions before vxWorks 6.x, as these don't work:\n// Include header with the vxWorks version information and query them\n#include <version.h>\n#if !defined(_WRS_VXWORKS_MAJOR) || (_WRS_VXWORKS_MAJOR < 6)\n#  error \"The vxWorks version you're using is so badly outdated,\\\n          it doesn't work at all with boost, sorry, no chance!\"\n#endif\n\n// Handle versions above 5.X but below 6.9\n#if (_WRS_VXWORKS_MAJOR == 6) && (_WRS_VXWORKS_MINOR < 9)\n// TODO: Starting from what version does vxWorks work with boost?\n// We can't reasonably insert a #warning \"\" as a user hint here,\n// as this will show up with every file including some boost header,\n// badly bugging the user... So for the time being we just leave it.\n#endif\n\n// vxWorks specific config options:\n// --------------------------------\n#define BOOST_PLATFORM \"vxWorks\"\n\n// Special behaviour for DKMs:\n#ifdef _WRS_KERNEL\n  // DKMs do not have the <cwchar>-header,\n  // but apparently they do have an intrinsic wchar_t meanwhile!\n#  define BOOST_NO_CWCHAR\n\n  // Lots of wide-functions and -headers are unavailable for DKMs as well:\n#  define BOOST_NO_CWCTYPE\n#  define BOOST_NO_SWPRINTF\n#  define BOOST_NO_STD_WSTRING\n#  define BOOST_NO_STD_WSTREAMBUF\n#endif\n\n// Generally available headers:\n#define BOOST_HAS_UNISTD_H\n#define BOOST_HAS_STDINT_H\n#define BOOST_HAS_DIRENT_H\n#define BOOST_HAS_SLIST\n\n// vxWorks does not have installed an iconv-library by default,\n// so unfortunately no Unicode support from scratch is available!\n// Thus, instead it is suggested to switch to ICU, as this seems\n// to be the most complete and portable option...\n#define BOOST_LOCALE_WITH_ICU\n\n// Generally available functionality:\n#define BOOST_HAS_THREADS\n#define BOOST_HAS_NANOSLEEP\n#define BOOST_HAS_GETTIMEOFDAY\n#define BOOST_HAS_CLOCK_GETTIME\n#define BOOST_HAS_MACRO_USE_FACET\n\n// Generally unavailable functionality, delivered by boost's test function:\n//#define BOOST_NO_DEDUCED_TYPENAME // Commented this out, boost's test gives an errorneous result!\n#define BOOST_NO_CXX11_EXTERN_TEMPLATE\n#define BOOST_NO_CXX11_VARIADIC_MACROS\n\n// Generally available threading API's:\n#define BOOST_HAS_PTHREADS\n#define BOOST_HAS_SCHED_YIELD\n#define BOOST_HAS_SIGACTION\n\n// Functionality available for RTPs only:\n#ifdef __RTP__\n#  define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE\n#  define BOOST_HAS_LOG1P\n#  define BOOST_HAS_EXPM1\n#endif\n\n// Functionality available for DKMs only:\n#ifdef _WRS_KERNEL\n  // Luckily, at the moment there seems to be none!\n#endif\n\n// These #defines allow posix_features to work, since vxWorks doesn't\n// #define them itself for DKMs (for RTPs on the contrary it does):\n#ifdef _WRS_KERNEL\n#  ifndef _POSIX_TIMERS\n#    define _POSIX_TIMERS  1\n#  endif\n#  ifndef _POSIX_THREADS\n#    define _POSIX_THREADS 1\n#  endif\n#endif\n\n// vxWorks doesn't work with asio serial ports:\n#define BOOST_ASIO_DISABLE_SERIAL_PORT\n// TODO: The problem here seems to bee that vxWorks uses its own, very specific\n//       ways to handle serial ports, incompatible with POSIX or anything...\n//       Maybe a specific implementation would be possible, but until the\n//       straight need arises... This implementation would presumably consist\n//       of some vxWorks specific ioctl-calls, etc. Any voluteers?\n\n// vxWorks-around: <time.h> #defines CLOCKS_PER_SEC as sysClkRateGet() but\n//                 miserably fails to #include the required <sysLib.h> to make\n//                 sysClkRateGet() available! So we manually include it here.\n#ifdef __RTP__\n#  include <time.h>\n#  include <sysLib.h>\n#endif\n\n// vxWorks-around: In <stdint.h> the macros INT32_C(), UINT32_C(), INT64_C() and\n//                 UINT64_C() are defined errorneously, yielding not a signed/\n//                 unsigned long/long long type, but a signed/unsigned int/long\n//                 type. Eventually this leads to compile errors in ratio_fwd.hpp,\n//                 when trying to define several constants which do not fit into a\n//                 long type! We correct them here by redefining.\n#include <cstdint>\n\n// Some macro-magic to do the job\n#define VX_JOIN(X, Y)     VX_DO_JOIN(X, Y)\n#define VX_DO_JOIN(X, Y)  VX_DO_JOIN2(X, Y)\n#define VX_DO_JOIN2(X, Y) X##Y\n\n// Correctly setup the macros\n#undef  INT32_C\n#undef  UINT32_C\n#undef  INT64_C\n#undef  UINT64_C\n#define INT32_C(x)  VX_JOIN(x, L)\n#define UINT32_C(x) VX_JOIN(x, UL)\n#define INT64_C(x)  VX_JOIN(x, LL)\n#define UINT64_C(x) VX_JOIN(x, ULL)\n\n// #include Libraries required for the following function adaption\n#include <ioLib.h>\n#include <tickLib.h>\n#include <sys/time.h>\n\n// Use C-linkage for the following helper functions\nextern \"C\" {\n\n// vxWorks-around: The required functions getrlimit() and getrlimit() are missing.\n//                 But we have the similar functions getprlimit() and setprlimit(),\n//                 which may serve the purpose.\n//                 Problem: The vxWorks-documentation regarding these functions\n//                 doesn't deserve its name! It isn't documented what the first two\n//                 parameters idtype and id mean, so we must fall back to an educated\n//                 guess - null, argh... :-/\n\n// TODO: getprlimit() and setprlimit() do exist for RTPs only, for whatever reason.\n//       Thus for DKMs there would have to be another implementation.\n#ifdef __RTP__\n  inline int getrlimit(int resource, struct rlimit *rlp){\n    return getprlimit(0, 0, resource, rlp);\n  }\n\n  inline int setrlimit(int resource, const struct rlimit *rlp){\n    return setprlimit(0, 0, resource, const_cast<struct rlimit*>(rlp));\n  }\n#endif\n\n// vxWorks has ftruncate() only, so we do simulate truncate():\ninline int truncate(const char *p, off_t l){\n  int fd = open(p, O_WRONLY);\n  if (fd == -1){\n    errno = EACCES;\n    return -1;\n  }\n  if (ftruncate(fd, l) == -1){\n    close(fd);\n    errno = EACCES;\n    return -1;\n  }\n  return close(fd);\n}\n\n// Fake symlink handling by dummy functions:\ninline int symlink(const char*, const char*){\n  // vxWorks has no symlinks -> always return an error!\n  errno = EACCES;\n  return -1;\n}\n\ninline ssize_t readlink(const char*, char*, size_t){\n  // vxWorks has no symlinks -> always return an error!\n  errno = EACCES;\n  return -1;\n}\n\n// vxWorks claims to implement gettimeofday in sys/time.h\n// but nevertheless does not provide it! See\n// https://support.windriver.com/olsPortal/faces/maintenance/techtipDetail_noHeader.jspx?docId=16442&contentId=WR_TECHTIP_006256\n// We implement a surrogate version here via clock_gettime:\ninline int gettimeofday(struct timeval *tv, void * /*tzv*/) {\n  struct timespec ts;\n  clock_gettime(CLOCK_MONOTONIC, &ts);\n  tv->tv_sec  = ts.tv_sec;\n  tv->tv_usec = ts.tv_nsec / 1000;\n  return 0;\n}\n\n// vxWorks does provide neither struct tms nor function times()!\n// We implement an empty dummy-function, simply setting the user\n// and system time to the half of thew actual system ticks-value\n// and the child user and system time to 0.\n// Rather ugly but at least it suppresses compiler errors...\n// Unfortunately, this of course *does* have an severe impact on\n// dependant libraries, actually this is chrono only! Here it will\n// not be possible to correctly use user and system times! But\n// as vxWorks is lacking the ability to calculate user and system\n// process times there seems to be no other possible solution.\nstruct tms{\n  clock_t tms_utime;  // User CPU time\n  clock_t tms_stime;  // System CPU time\n  clock_t tms_cutime; // User CPU time of terminated child processes\n  clock_t tms_cstime; // System CPU time of terminated child processes\n};\n\ninline clock_t times(struct tms *t){\n  struct timespec ts;\n  clock_gettime(CLOCK_THREAD_CPUTIME_ID, &ts);\n  clock_t ticks(static_cast<clock_t>(static_cast<double>(ts.tv_sec)  * CLOCKS_PER_SEC +\n                                     static_cast<double>(ts.tv_nsec) * CLOCKS_PER_SEC / 1000000.0));\n  t->tms_utime  = ticks/2U;\n  t->tms_stime  = ticks/2U;\n  t->tms_cutime = 0; // vxWorks is lacking the concept of a child process!\n  t->tms_cstime = 0; // -> Set the wait times for childs to 0\n  return ticks;\n}\n\n} // extern \"C\"\n\n// Put the selfmade functions into the std-namespace, just in case\nnamespace std {\n# ifdef __RTP__\n    using ::getrlimit;\n    using ::setrlimit;\n# endif\n  using ::truncate;\n  using ::symlink;\n  using ::readlink;\n  using ::times;\n  using ::gettimeofday;\n}\n\n// Some more macro-magic:\n// vxWorks-around: Some functions are not present or broken in vxWorks\n//                 but may be patched to life via helper macros...\n\n// Include signal.h which might contain a typo to be corrected here\n#include <signal.h>\n\n#define getpagesize()    sysconf(_SC_PAGESIZE)         // getpagesize is deprecated anyway!\n#ifndef S_ISSOCK\n#  define S_ISSOCK(mode) ((mode & S_IFMT) == S_IFSOCK) // Is file a socket?\n#endif\n#define lstat(p, b)      stat(p, b)                    // lstat() == stat(), as vxWorks has no symlinks!\n#ifndef FPE_FLTINV\n#  define FPE_FLTINV     (FPE_FLTSUB+1)                // vxWorks has no FPE_FLTINV, so define one as a dummy\n#endif\n#if !defined(BUS_ADRALN) && defined(BUS_ADRALNR)\n#  define BUS_ADRALN     BUS_ADRALNR                   // Correct a supposed typo in vxWorks' <signal.h>\n#endif\n//typedef int              locale_t;                     // locale_t is a POSIX-extension, currently unpresent in vxWorks!\n\n// #include boilerplate code:\n#include <boost/config/posix_features.hpp>\n\n// vxWorks lies about XSI conformance, there is no nl_types.h:\n#undef BOOST_HAS_NL_TYPES_H\n"
  },
  {
    "path": "benchmarks/boost/config/platform/win32.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003. \n//  (C) Copyright Bill Kempf 2001. \n//  (C) Copyright Aleksey Gurtovoy 2003. \n//  (C) Copyright Rene Rivera 2005.\n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Win32 specific config options:\n\n#define BOOST_PLATFORM \"Win32\"\n\n//  Get the information about the MinGW runtime, i.e. __MINGW32_*VERSION.\n#if defined(__MINGW32__)\n#  include <_mingw.h>\n#endif\n\n#if defined(__GNUC__) && !defined(BOOST_NO_SWPRINTF)\n#  define BOOST_NO_SWPRINTF\n#endif\n\n//  Default defines for BOOST_SYMBOL_EXPORT and BOOST_SYMBOL_IMPORT\n//  If a compiler doesn't support __declspec(dllexport)/__declspec(dllimport),\n//  its boost/config/compiler/ file must define BOOST_SYMBOL_EXPORT and\n//  BOOST_SYMBOL_IMPORT\n#ifndef BOOST_SYMBOL_EXPORT\n#  define BOOST_HAS_DECLSPEC\n#  define BOOST_SYMBOL_EXPORT __declspec(dllexport)\n#  define BOOST_SYMBOL_IMPORT __declspec(dllimport)\n#endif\n\n#if defined(__MINGW32__) && ((__MINGW32_MAJOR_VERSION > 2) || ((__MINGW32_MAJOR_VERSION == 2) && (__MINGW32_MINOR_VERSION >= 0)))\n#  define BOOST_HAS_STDINT_H\n#  ifndef __STDC_LIMIT_MACROS\n#     define __STDC_LIMIT_MACROS\n#  endif\n#  define BOOST_HAS_DIRENT_H\n#  define BOOST_HAS_UNISTD_H\n#endif\n\n#if defined(__MINGW32__) && (__GNUC__ >= 4)\n// Mingw has these functions but there are persistent problems\n// with calls to these crashing, so disable for now:\n//#  define BOOST_HAS_EXPM1\n//#  define BOOST_HAS_LOG1P\n#  define BOOST_HAS_GETTIMEOFDAY\n#endif\n//\n// Win32 will normally be using native Win32 threads,\n// but there is a pthread library avaliable as an option,\n// we used to disable this when BOOST_DISABLE_WIN32 was \n// defined but no longer - this should allow some\n// files to be compiled in strict mode - while maintaining\n// a consistent setting of BOOST_HAS_THREADS across\n// all translation units (needed for shared_ptr etc).\n//\n\n#ifndef BOOST_HAS_PTHREADS\n#  define BOOST_HAS_WINTHREADS\n#endif\n\n//\n// WinCE configuration:\n//\n#if defined(_WIN32_WCE) || defined(UNDER_CE)\n#  define BOOST_NO_ANSI_APIS\n// Windows CE does not have a conforming signature for swprintf\n#  define BOOST_NO_SWPRINTF\n#else\n#  define BOOST_HAS_GETSYSTEMTIMEASFILETIME\n#  define BOOST_HAS_THREADEX\n#  define BOOST_HAS_GETSYSTEMTIMEASFILETIME\n#endif\n\n//\n// Windows Runtime\n//\n#if defined(WINAPI_FAMILY) && \\\n  (WINAPI_FAMILY == WINAPI_FAMILY_APP || WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP)\n#  define BOOST_NO_ANSI_APIS\n#endif\n\n#ifndef BOOST_DISABLE_WIN32\n// WEK: Added\n#define BOOST_HAS_FTIME\n#define BOOST_WINDOWS 1\n\n#endif\n"
  },
  {
    "path": "benchmarks/boost/config/posix_features.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n\n//  See http://www.boost.org for most recent version.\n\n// All POSIX feature tests go in this file,\n// Note that we test _POSIX_C_SOURCE and _XOPEN_SOURCE as well\n// _POSIX_VERSION and _XOPEN_VERSION: on some systems POSIX API's\n// may be present but none-functional unless _POSIX_C_SOURCE and\n// _XOPEN_SOURCE have been defined to the right value (it's up\n// to the user to do this *before* including any header, although\n// in most cases the compiler will do this for you).\n\n#  if defined(BOOST_HAS_UNISTD_H)\n#     include <unistd.h>\n\n      // XOpen has <nl_types.h>, but is this the correct version check?\n#     if defined(_XOPEN_VERSION) && (_XOPEN_VERSION >= 3)\n#        define BOOST_HAS_NL_TYPES_H\n#     endif\n\n      // POSIX version 6 requires <stdint.h>\n#     if defined(_POSIX_VERSION) && (_POSIX_VERSION >= 200100)\n#        define BOOST_HAS_STDINT_H\n#     endif\n\n      // POSIX version 2 requires <dirent.h>\n#     if defined(_POSIX_VERSION) && (_POSIX_VERSION >= 199009L)\n#        define BOOST_HAS_DIRENT_H\n#     endif\n\n      // POSIX version 3 requires <signal.h> to have sigaction:\n#     if defined(_POSIX_VERSION) && (_POSIX_VERSION >= 199506L)\n#        define BOOST_HAS_SIGACTION\n#     endif\n      // POSIX defines _POSIX_THREADS > 0 for pthread support,\n      // however some platforms define _POSIX_THREADS without\n      // a value, hence the (_POSIX_THREADS+0 >= 0) check.\n      // Strictly speaking this may catch platforms with a\n      // non-functioning stub <pthreads.h>, but such occurrences should\n      // occur very rarely if at all.\n#     if defined(_POSIX_THREADS) && (_POSIX_THREADS+0 >= 0) && !defined(BOOST_HAS_WINTHREADS) && !defined(BOOST_HAS_MPTASKS)\n#        define BOOST_HAS_PTHREADS\n#     endif\n\n      // BOOST_HAS_NANOSLEEP:\n      // This is predicated on _POSIX_TIMERS or _XOPEN_REALTIME:\n#     if (defined(_POSIX_TIMERS) && (_POSIX_TIMERS+0 >= 0)) \\\n             || (defined(_XOPEN_REALTIME) && (_XOPEN_REALTIME+0 >= 0))\n#        define BOOST_HAS_NANOSLEEP\n#     endif\n\n      // BOOST_HAS_CLOCK_GETTIME:\n      // This is predicated on _POSIX_TIMERS (also on _XOPEN_REALTIME\n      // but at least one platform - linux - defines that flag without\n      // defining clock_gettime):\n#     if (defined(_POSIX_TIMERS) && (_POSIX_TIMERS+0 >= 0))\n#        define BOOST_HAS_CLOCK_GETTIME\n#     endif\n\n      // BOOST_HAS_SCHED_YIELD:\n      // This is predicated on _POSIX_PRIORITY_SCHEDULING or\n      // on _POSIX_THREAD_PRIORITY_SCHEDULING or on _XOPEN_REALTIME.\n#     if defined(_POSIX_PRIORITY_SCHEDULING) && (_POSIX_PRIORITY_SCHEDULING+0 > 0)\\\n            || (defined(_POSIX_THREAD_PRIORITY_SCHEDULING) && (_POSIX_THREAD_PRIORITY_SCHEDULING+0 > 0))\\\n            || (defined(_XOPEN_REALTIME) && (_XOPEN_REALTIME+0 >= 0))\n#        define BOOST_HAS_SCHED_YIELD\n#     endif\n\n      // BOOST_HAS_GETTIMEOFDAY:\n      // BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE:\n      // These are predicated on _XOPEN_VERSION, and appears to be first released\n      // in issue 4, version 2 (_XOPEN_VERSION > 500).\n      // Likewise for the functions log1p and expm1.\n#     if defined(_XOPEN_VERSION) && (_XOPEN_VERSION+0 >= 500)\n#        define BOOST_HAS_GETTIMEOFDAY\n#        if defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE+0 >= 500)\n#           define BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE\n#        endif\n#        ifndef BOOST_HAS_LOG1P\n#           define BOOST_HAS_LOG1P\n#        endif\n#        ifndef BOOST_HAS_EXPM1\n#           define BOOST_HAS_EXPM1\n#        endif\n#     endif\n\n#  endif\n\n\n\n\n"
  },
  {
    "path": "benchmarks/boost/config/requires_threads.hpp",
    "content": "//  (C) Copyright John Maddock 2003. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n\n#ifndef BOOST_CONFIG_REQUIRES_THREADS_HPP\n#define BOOST_CONFIG_REQUIRES_THREADS_HPP\n\n#ifndef BOOST_CONFIG_HPP\n#  include <boost/config.hpp>\n#endif\n\n#if defined(BOOST_DISABLE_THREADS)\n\n//\n// special case to handle versions of gcc which don't currently support threads:\n//\n#if defined(__GNUC__) && ((__GNUC__ < 3) || (__GNUC_MINOR__ <= 3) || !defined(BOOST_STRICT_CONFIG))\n//\n// this is checked up to gcc 3.3:\n//\n#if defined(__sgi) || defined(__hpux)\n#  error \"Multi-threaded programs are not supported by gcc on HPUX or Irix (last checked with gcc 3.3)\"\n#endif\n\n#endif\n\n#  error \"Threading support unavaliable: it has been explicitly disabled with BOOST_DISABLE_THREADS\"\n\n#elif !defined(BOOST_HAS_THREADS)\n\n# if defined __COMO__\n//  Comeau C++\n#   error \"Compiler threading support is not turned on. Please set the correct command line options for threading: -D_MT (Windows) or -D_REENTRANT (Unix)\"\n\n#elif defined(__INTEL_COMPILER) || defined(__ICL) || defined(__ICC) || defined(__ECC)\n//  Intel\n#ifdef _WIN32\n#  error \"Compiler threading support is not turned on. Please set the correct command line options for threading: either /MT /MTd /MD or /MDd\"\n#else\n#   error \"Compiler threading support is not turned on. Please set the correct command line options for threading: -openmp\"\n#endif\n\n# elif defined __GNUC__\n//  GNU C++:\n#   error \"Compiler threading support is not turned on. Please set the correct command line options for threading: -pthread (Linux), -pthreads (Solaris) or -mthreads (Mingw32)\"\n\n#elif defined __sgi\n//  SGI MIPSpro C++\n#   error \"Compiler threading support is not turned on. Please set the correct command line options for threading: -D_SGI_MP_SOURCE\"\n\n#elif defined __DECCXX\n//  Compaq Tru64 Unix cxx\n#   error \"Compiler threading support is not turned on. Please set the correct command line options for threading: -pthread\"\n\n#elif defined __BORLANDC__\n//  Borland\n#   error \"Compiler threading support is not turned on. Please set the correct command line options for threading: -tWM\"\n\n#elif defined  __MWERKS__\n//  Metrowerks CodeWarrior\n#   error \"Compiler threading support is not turned on. Please set the correct command line options for threading: either -runtime sm, -runtime smd, -runtime dm, or -runtime dmd\"\n\n#elif defined  __SUNPRO_CC\n//  Sun Workshop Compiler C++\n#   error \"Compiler threading support is not turned on. Please set the correct command line options for threading: -mt\"\n\n#elif defined __HP_aCC\n//  HP aCC\n#   error \"Compiler threading support is not turned on. Please set the correct command line options for threading: -mt\"\n\n#elif defined(__IBMCPP__)\n//  IBM Visual Age\n#   error \"Compiler threading support is not turned on. Please compile the code with the xlC_r compiler\"\n\n#elif defined _MSC_VER\n//  Microsoft Visual C++\n//\n//  Must remain the last #elif since some other vendors (Metrowerks, for\n//  example) also #define _MSC_VER\n#  error \"Compiler threading support is not turned on. Please set the correct command line options for threading: either /MT /MTd /MD or /MDd\"\n\n#else\n\n#  error \"Compiler threading support is not turned on.  Please consult your compiler's documentation for the appropriate options to use\"\n\n#endif // compilers\n\n#endif // BOOST_HAS_THREADS\n\n#endif // BOOST_CONFIG_REQUIRES_THREADS_HPP\n"
  },
  {
    "path": "benchmarks/boost/config/select_compiler_config.hpp",
    "content": "//  Boost compiler configuration selection header file\n\n//  (C) Copyright John Maddock 2001 - 2003. \n//  (C) Copyright Martin Wille 2003.\n//  (C) Copyright Guillaume Melquiond 2003.\n//\n//  Distributed under the Boost Software License, Version 1.0.\n//  (See accompanying file LICENSE_1_0.txt or copy at\n//   http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org/ for most recent version.\n\n// locate which compiler we are using and define\n// BOOST_COMPILER_CONFIG as needed: \n\n#if defined __CUDACC__\n//  NVIDIA CUDA C++ compiler for GPU\n#   include \"boost/config/compiler/nvcc.hpp\"\n\n#endif\n\n#if defined(__GCCXML__)\n// GCC-XML emulates other compilers, it has to appear first here!\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/gcc_xml.hpp\"\n\n#elif defined(_CRAYC)\n// EDG based Cray compiler:\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/cray.hpp\"\n\n#elif defined __COMO__\n//  Comeau C++\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/comeau.hpp\"\n\n#elif defined(__PATHSCALE__) && (__PATHCC__ >= 4)\n// PathScale EKOPath compiler (has to come before clang and gcc)\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/pathscale.hpp\"\n\n#elif defined(__INTEL_COMPILER) || defined(__ICL) || defined(__ICC) || defined(__ECC)\n//  Intel\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/intel.hpp\"\n\n#elif defined __clang__ && !defined(__CUDACC__) && !defined(__ibmxl__)\n// when using clang and cuda at same time, you want to appear as gcc\n//  Clang C++ emulates GCC, so it has to appear early.\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/clang.hpp\"\n\n#elif defined __DMC__\n//  Digital Mars C++\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/digitalmars.hpp\"\n\n# elif defined(__GNUC__) && !defined(__ibmxl__)\n//  GNU C++:\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/gcc.hpp\"\n\n#elif defined __KCC\n//  Kai C++\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/kai.hpp\"\n\n#elif defined __sgi\n//  SGI MIPSpro C++\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/sgi_mipspro.hpp\"\n\n#elif defined __DECCXX\n//  Compaq Tru64 Unix cxx\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/compaq_cxx.hpp\"\n\n#elif defined __ghs\n//  Greenhills C++\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/greenhills.hpp\"\n\n#elif defined __CODEGEARC__\n//  CodeGear - must be checked for before Borland\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/codegear.hpp\"\n\n#elif defined __BORLANDC__\n//  Borland\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/borland.hpp\"\n\n#elif defined  __MWERKS__\n//  Metrowerks CodeWarrior\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/metrowerks.hpp\"\n\n#elif defined  __SUNPRO_CC\n//  Sun Workshop Compiler C++\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/sunpro_cc.hpp\"\n\n#elif defined __HP_aCC\n//  HP aCC\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/hp_acc.hpp\"\n\n#elif defined(__MRC__) || defined(__SC__)\n//  MPW MrCpp or SCpp\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/mpw.hpp\"\n\n#elif defined(__ibmxl__)\n// IBM XL C/C++ for Linux (Little Endian)\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/xlcpp.hpp\"\n\n#elif defined(__IBMCPP__)\n//  IBM Visual Age or IBM XL C/C++ for Linux (Big Endian)\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/vacpp.hpp\"\n\n#elif defined(__PGI)\n//  Portland Group Inc.\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/pgi.hpp\"\n\n#elif defined _MSC_VER\n//  Microsoft Visual C++\n//\n//  Must remain the last #elif since some other vendors (Metrowerks, for\n//  example) also #define _MSC_VER\n#   define BOOST_COMPILER_CONFIG \"boost/config/compiler/visualc.hpp\"\n\n#elif defined (BOOST_ASSERT_CONFIG)\n// this must come last - generate an error if we don't\n// recognise the compiler:\n#  error \"Unknown compiler - please configure (http://www.boost.org/libs/config/config.htm#configuring) and report the results to the main boost mailing list (http://www.boost.org/more/mailing_lists.htm#main)\"\n\n#endif\n\n#if 0\n//\n// This section allows dependency scanners to find all the headers we *might* include:\n//\n#include \"boost/config/compiler/gcc_xml.hpp\"\n#include \"boost/config/compiler/cray.hpp\"\n#include \"boost/config/compiler/comeau.hpp\"\n#include \"boost/config/compiler/pathscale.hpp\"\n#include \"boost/config/compiler/intel.hpp\"\n#include \"boost/config/compiler/clang.hpp\"\n#include \"boost/config/compiler/digitalmars.hpp\"\n#include \"boost/config/compiler/gcc.hpp\"\n#include \"boost/config/compiler/kai.hpp\"\n#include \"boost/config/compiler/sgi_mipspro.hpp\"\n#include \"boost/config/compiler/compaq_cxx.hpp\"\n#include \"boost/config/compiler/greenhills.hpp\"\n#include \"boost/config/compiler/codegear.hpp\"\n#include \"boost/config/compiler/borland.hpp\"\n#include \"boost/config/compiler/metrowerks.hpp\"\n#include \"boost/config/compiler/sunpro_cc.hpp\"\n#include \"boost/config/compiler/hp_acc.hpp\"\n#include \"boost/config/compiler/mpw.hpp\"\n#include \"boost/config/compiler/vacpp.hpp\"\n#include \"boost/config/compiler/pgi.hpp\"\n#include \"boost/config/compiler/visualc.hpp\"\n\n#endif\n\n"
  },
  {
    "path": "benchmarks/boost/config/select_platform_config.hpp",
    "content": "//  Boost compiler configuration selection header file\n\n//  (C) Copyright John Maddock 2001 - 2002. \n//  (C) Copyright Jens Maurer 2001. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n// locate which platform we are on and define BOOST_PLATFORM_CONFIG as needed.\n// Note that we define the headers to include using \"header_name\" not\n// <header_name> in order to prevent macro expansion within the header\n// name (for example \"linux\" is a macro on linux systems).\n\n#if (defined(linux) || defined(__linux) || defined(__linux__) || defined(__GNU__) || defined(__GLIBC__)) && !defined(_CRAYC)\n// linux, also other platforms (Hurd etc) that use GLIBC, should these really have their own config headers though?\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/linux.hpp\"\n\n#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)\n// BSD:\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/bsd.hpp\"\n\n#elif defined(sun) || defined(__sun)\n// solaris:\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/solaris.hpp\"\n\n#elif defined(__sgi)\n// SGI Irix:\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/irix.hpp\"\n\n#elif defined(__hpux)\n// hp unix:\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/hpux.hpp\"\n\n#elif defined(__CYGWIN__)\n// cygwin is not win32:\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/cygwin.hpp\"\n\n#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32)\n// win32:\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/win32.hpp\"\n\n#elif defined(__HAIKU__)\n// Haiku\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/haiku.hpp\"\n\n#elif defined(__BEOS__)\n// BeOS\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/beos.hpp\"\n\n#elif defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__)\n// MacOS\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/macos.hpp\"\n\n#elif defined(__IBMCPP__) || defined(_AIX)\n// IBM\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/aix.hpp\"\n\n#elif defined(__amigaos__)\n// AmigaOS\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/amigaos.hpp\"\n\n#elif defined(__QNXNTO__)\n// QNX:\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/qnxnto.hpp\"\n\n#elif defined(__VXWORKS__)\n// vxWorks:\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/vxworks.hpp\"\n\n#elif defined(__SYMBIAN32__) \n// Symbian: \n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/symbian.hpp\" \n\n#elif defined(_CRAYC)\n// Cray:\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/cray.hpp\" \n\n#elif defined(__VMS) \n// VMS:\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/vms.hpp\" \n\n#elif defined(__CloudABI__)\n// Nuxi CloudABI:\n#  define BOOST_PLATFORM_CONFIG \"boost/config/platform/cloudabi.hpp\"\n#else\n\n#  if defined(unix) \\\n      || defined(__unix) \\\n      || defined(_XOPEN_SOURCE) \\\n      || defined(_POSIX_SOURCE)\n\n   // generic unix platform:\n\n#  ifndef BOOST_HAS_UNISTD_H\n#     define BOOST_HAS_UNISTD_H\n#  endif\n\n#  include <boost/config/posix_features.hpp>\n\n#  endif\n\n#  if defined (BOOST_ASSERT_CONFIG)\n      // this must come last - generate an error if we don't\n      // recognise the platform:\n#     error \"Unknown platform - please configure and report the results to boost.org\"\n#  endif\n\n#endif\n\n#if 0\n//\n// This section allows dependency scanners to find all the files we *might* include:\n//\n#  include \"boost/config/platform/linux.hpp\"\n#  include \"boost/config/platform/bsd.hpp\"\n#  include \"boost/config/platform/solaris.hpp\"\n#  include \"boost/config/platform/irix.hpp\"\n#  include \"boost/config/platform/hpux.hpp\"\n#  include \"boost/config/platform/cygwin.hpp\"\n#  include \"boost/config/platform/win32.hpp\"\n#  include \"boost/config/platform/beos.hpp\"\n#  include \"boost/config/platform/macos.hpp\"\n#  include \"boost/config/platform/aix.hpp\"\n#  include \"boost/config/platform/amigaos.hpp\"\n#  include \"boost/config/platform/qnxnto.hpp\"\n#  include \"boost/config/platform/vxworks.hpp\"\n#  include \"boost/config/platform/symbian.hpp\" \n#  include \"boost/config/platform/cray.hpp\" \n#  include \"boost/config/platform/vms.hpp\" \n#  include <boost/config/posix_features.hpp>\n\n\n\n#endif\n\n"
  },
  {
    "path": "benchmarks/boost/config/select_stdlib_config.hpp",
    "content": "//  Boost compiler configuration selection header file\n\n//  (C) Copyright John Maddock 2001 - 2003. \n//  (C) Copyright Jens Maurer 2001 - 2002. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n\n//  See http://www.boost.org for most recent version.\n\n// locate which std lib we are using and define BOOST_STDLIB_CONFIG as needed:\n\n// First include <cstddef> to determine if some version of STLport is in use as the std lib\n// (do not rely on this header being included since users can short-circuit this header \n//  if they know whose std lib they are using.)\n#ifdef __cplusplus\n#  include <cstddef>\n#else\n#  include <stddef.h>\n#endif\n\n#if defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)\n// STLPort library; this _must_ come first, otherwise since\n// STLport typically sits on top of some other library, we\n// can end up detecting that first rather than STLport:\n#  define BOOST_STDLIB_CONFIG \"boost/config/stdlib/stlport.hpp\"\n\n#else\n\n// If our std lib was not some version of STLport, and has not otherwise\n// been detected, then include <utility> as it is about \n// the smallest of the std lib headers that includes real C++ stuff.\n// Some std libs do not include their C++-related macros in <cstddef> \n// so this additional include makes sure we get those definitions.\n// Note: do not rely on this header being included since users can short-circuit this \n// #include if they know whose std lib they are using.\n#if !defined(__LIBCOMO__) && !defined(__STD_RWCOMPILER_H__) && !defined(_RWSTD_VER)\\\n   && !defined(_LIBCPP_VERSION) && !defined(__GLIBCPP__) && !defined(__GLIBCXX__)\\\n   && !defined(__STL_CONFIG_H) && !defined(__MSL_CPP__) && !defined(__IBMCPP__)\\\n   && !defined(MSIPL_COMPILE_H) && !defined(_YVALS) && !defined(_CPPLIB_VER)\n#include <utility>\n#endif\n\n#if defined(__LIBCOMO__)\n// Comeau STL:\n#define BOOST_STDLIB_CONFIG \"boost/config/stdlib/libcomo.hpp\"\n\n#elif defined(__STD_RWCOMPILER_H__) || defined(_RWSTD_VER)\n// Rogue Wave library:\n#  define BOOST_STDLIB_CONFIG \"boost/config/stdlib/roguewave.hpp\"\n\n#elif defined(_LIBCPP_VERSION)\n// libc++\n#  define BOOST_STDLIB_CONFIG \"boost/config/stdlib/libcpp.hpp\"\n\n#elif defined(__GLIBCPP__) || defined(__GLIBCXX__)\n// GNU libstdc++ 3\n#  define BOOST_STDLIB_CONFIG \"boost/config/stdlib/libstdcpp3.hpp\"\n\n#elif defined(__STL_CONFIG_H)\n// generic SGI STL\n#  define BOOST_STDLIB_CONFIG \"boost/config/stdlib/sgi.hpp\"\n\n#elif defined(__MSL_CPP__)\n// MSL standard lib:\n#  define BOOST_STDLIB_CONFIG \"boost/config/stdlib/msl.hpp\"\n\n#elif defined(__IBMCPP__)\n// take the default VACPP std lib\n#  define BOOST_STDLIB_CONFIG \"boost/config/stdlib/vacpp.hpp\"\n\n#elif defined(MSIPL_COMPILE_H)\n// Modena C++ standard library\n#  define BOOST_STDLIB_CONFIG \"boost/config/stdlib/modena.hpp\"\n\n#elif (defined(_YVALS) && !defined(__IBMCPP__)) || defined(_CPPLIB_VER)\n// Dinkumware Library (this has to appear after any possible replacement libraries):\n#  define BOOST_STDLIB_CONFIG \"boost/config/stdlib/dinkumware.hpp\"\n\n#elif defined (BOOST_ASSERT_CONFIG)\n// this must come last - generate an error if we don't\n// recognise the library:\n#  error \"Unknown standard library - please configure and report the results to boost.org\"\n\n#endif\n\n#endif\n\n#if 0\n//\n// This section allows dependency scanners to find all the files we *might* include:\n//\n#  include \"boost/config/stdlib/stlport.hpp\"\n#  include \"boost/config/stdlib/libcomo.hpp\"\n#  include \"boost/config/stdlib/roguewave.hpp\"\n#  include \"boost/config/stdlib/libcpp.hpp\"\n#  include \"boost/config/stdlib/libstdcpp3.hpp\"\n#  include \"boost/config/stdlib/sgi.hpp\"\n#  include \"boost/config/stdlib/msl.hpp\"\n#  include \"boost/config/stdlib/vacpp.hpp\"\n#  include \"boost/config/stdlib/modena.hpp\"\n#  include \"boost/config/stdlib/dinkumware.hpp\"\n#endif\n\n"
  },
  {
    "path": "benchmarks/boost/config/stdlib/dinkumware.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003.\n//  (C) Copyright Jens Maurer 2001.\n//  (C) Copyright Peter Dimov 2001.\n//  (C) Copyright David Abrahams 2002.\n//  (C) Copyright Guillaume Melquiond 2003.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Dinkumware standard library config:\n\n#if !defined(_YVALS) && !defined(_CPPLIB_VER)\n#include <boost/config/no_tr1/utility.hpp>\n#if !defined(_YVALS) && !defined(_CPPLIB_VER)\n#error This is not the Dinkumware lib!\n#endif\n#endif\n\n\n#if defined(_CPPLIB_VER) && (_CPPLIB_VER >= 306)\n   // full dinkumware 3.06 and above\n   // fully conforming provided the compiler supports it:\n#  if !(defined(_GLOBAL_USING) && (_GLOBAL_USING+0 > 0)) && !defined(__BORLANDC__) && !defined(_STD) && !(defined(__ICC) && (__ICC >= 700))   // can be defined in yvals.h\n#     define BOOST_NO_STDC_NAMESPACE\n#  endif\n#  if !(defined(_HAS_MEMBER_TEMPLATES_REBIND) && (_HAS_MEMBER_TEMPLATES_REBIND+0 > 0)) && !(defined(_MSC_VER) && (_MSC_VER > 1300)) && defined(BOOST_MSVC)\n#     define BOOST_NO_STD_ALLOCATOR\n#  endif\n#  define BOOST_HAS_PARTIAL_STD_ALLOCATOR\n#  if defined(BOOST_MSVC) && (BOOST_MSVC < 1300)\n      // if this lib version is set up for vc6 then there is no std::use_facet:\n#     define BOOST_NO_STD_USE_FACET\n#     define BOOST_HAS_TWO_ARG_USE_FACET\n      // C lib functions aren't in namespace std either:\n#     define BOOST_NO_STDC_NAMESPACE\n      // and nor is <exception>\n#     define BOOST_NO_EXCEPTION_STD_NAMESPACE\n#  endif\n// There's no numeric_limits<long long> support unless _LONGLONG is defined:\n#  if !defined(_LONGLONG) && (_CPPLIB_VER <= 310)\n#     define BOOST_NO_MS_INT64_NUMERIC_LIMITS\n#  endif\n// 3.06 appears to have (non-sgi versions of) <hash_set> & <hash_map>,\n// and no <slist> at all\n#else\n#  define BOOST_MSVC_STD_ITERATOR 1\n#  define BOOST_NO_STD_ITERATOR\n#  define BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS\n#  define BOOST_NO_STD_ALLOCATOR\n#  define BOOST_NO_STDC_NAMESPACE\n#  define BOOST_NO_STD_USE_FACET\n#  define BOOST_NO_STD_OUTPUT_ITERATOR_ASSIGN\n#  define BOOST_HAS_MACRO_USE_FACET\n#  ifndef _CPPLIB_VER\n      // Updated Dinkum library defines this, and provides\n      // its own min and max definitions, as does MTA version.\n#     ifndef __MTA__ \n#        define BOOST_NO_STD_MIN_MAX\n#     endif\n#     define BOOST_NO_MS_INT64_NUMERIC_LIMITS\n#  endif\n#endif\n\n//\n// std extension namespace is stdext for vc7.1 and later, \n// the same applies to other compilers that sit on top\n// of vc7.1 (Intel and Comeau):\n//\n#if defined(_MSC_VER) && (_MSC_VER >= 1310) && !defined(__BORLANDC__)\n#  define BOOST_STD_EXTENSION_NAMESPACE stdext\n#endif\n\n\n#if (defined(_MSC_VER) && (_MSC_VER <= 1300) && !defined(__BORLANDC__)) || !defined(_CPPLIB_VER) || (_CPPLIB_VER < 306)\n   // if we're using a dinkum lib that's\n   // been configured for VC6/7 then there is\n   // no iterator traits (true even for icl)\n#  define BOOST_NO_STD_ITERATOR_TRAITS\n#endif\n\n#if defined(__ICL) && (__ICL < 800) && defined(_CPPLIB_VER) && (_CPPLIB_VER <= 310)\n// Intel C++ chokes over any non-trivial use of <locale>\n// this may be an overly restrictive define, but regex fails without it:\n#  define BOOST_NO_STD_LOCALE\n#endif\n\n// Fix for VC++ 8.0 on up ( I do not have a previous version to test )\n// or clang-cl. If exceptions are off you must manually include the \n// <exception> header before including the <typeinfo> header. Admittedly \n// trying to use Boost libraries or the standard C++ libraries without \n// exception support is not suggested but currently clang-cl ( v 3.4 ) \n// does not support exceptions and must be compiled with exceptions off.\n#if !_HAS_EXCEPTIONS && ((defined(BOOST_MSVC) && BOOST_MSVC >= 1400) || (defined(__clang__) && defined(_MSC_VER)))\n#include <exception>\n#endif\n#include <typeinfo>\n#if ( (!_HAS_EXCEPTIONS && !defined(__ghs__)) || (!_HAS_NAMESPACE && defined(__ghs__)) ) && !defined(__TI_COMPILER_VERSION__) && !defined(__VISUALDSPVERSION__)\n#  define BOOST_NO_STD_TYPEINFO\n#endif  \n\n//  C++0x headers implemented in 520 (as shipped by Microsoft)\n//\n#if !defined(_CPPLIB_VER) || _CPPLIB_VER < 520\n#  define BOOST_NO_CXX11_HDR_ARRAY\n#  define BOOST_NO_CXX11_HDR_CODECVT\n#  define BOOST_NO_CXX11_HDR_FORWARD_LIST\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#  define BOOST_NO_CXX11_HDR_RANDOM\n#  define BOOST_NO_CXX11_HDR_REGEX\n#  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR\n#  define BOOST_NO_CXX11_HDR_UNORDERED_MAP\n#  define BOOST_NO_CXX11_HDR_UNORDERED_SET\n#  define BOOST_NO_CXX11_HDR_TUPLE\n#  define BOOST_NO_CXX11_HDR_TYPEINDEX\n#  define BOOST_NO_CXX11_HDR_FUNCTIONAL\n#  define BOOST_NO_CXX11_NUMERIC_LIMITS\n#  define BOOST_NO_CXX11_SMART_PTR\n#endif\n\n#if ((!defined(_HAS_TR1_IMPORTS) || (_HAS_TR1_IMPORTS+0 == 0)) && !defined(BOOST_NO_CXX11_HDR_TUPLE)) \\\n  && (!defined(_CPPLIB_VER) || _CPPLIB_VER < 610)\n#  define BOOST_NO_CXX11_HDR_TUPLE\n#endif\n\n//  C++0x headers implemented in 540 (as shipped by Microsoft)\n//\n#if !defined(_CPPLIB_VER) || _CPPLIB_VER < 540\n#  define BOOST_NO_CXX11_HDR_TYPE_TRAITS\n#  define BOOST_NO_CXX11_HDR_CHRONO\n#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE\n#  define BOOST_NO_CXX11_HDR_FUTURE\n#  define BOOST_NO_CXX11_HDR_MUTEX\n#  define BOOST_NO_CXX11_HDR_RATIO\n#  define BOOST_NO_CXX11_HDR_THREAD\n#  define BOOST_NO_CXX11_ATOMIC_SMART_PTR\n#endif\n\n//  C++0x headers implemented in 610 (as shipped by Microsoft)\n//\n#if !defined(_CPPLIB_VER) || _CPPLIB_VER < 610\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#  define BOOST_NO_CXX11_HDR_ATOMIC\n#  define BOOST_NO_CXX11_ALLOCATOR\n// 540 has std::align but it is not a conforming implementation\n#  define BOOST_NO_CXX11_STD_ALIGN\n#endif\n\n#if defined(__has_include)\n#if !__has_include(<shared_mutex>)\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#elif __cplusplus < 201402\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n#elif !defined(_CPPLIB_VER) || (_CPPLIB_VER < 650)\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n\n#if defined(BOOST_INTEL) && (BOOST_INTEL <= 1400)\n// Intel's compiler can't handle this header yet:\n#  define BOOST_NO_CXX11_HDR_ATOMIC\n#endif\n\n\n//  520..610 have std::addressof, but it doesn't support functions\n//\n#if !defined(_CPPLIB_VER) || _CPPLIB_VER < 650\n#  define BOOST_NO_CXX11_ADDRESSOF\n#endif\n\n// Bug specific to VC14, \n// See https://connect.microsoft.com/VisualStudio/feedback/details/1348277/link-error-when-using-std-codecvt-utf8-utf16-char16-t\n// and discussion here: http://blogs.msdn.com/b/vcblog/archive/2014/11/12/visual-studio-2015-preview-now-available.aspx?PageIndex=2\n#if defined(_CPPLIB_VER) && (_CPPLIB_VER == 650)\n#  define BOOST_NO_CXX11_HDR_CODECVT\n#endif\n\n#if defined(_CPPLIB_VER) && (_CPPLIB_VER >= 650)\n// If _HAS_AUTO_PTR_ETC is defined to 0, std::auto_ptr is not available.\n// See https://www.visualstudio.com/en-us/news/vs2015-vs.aspx#C++\n// and http://blogs.msdn.com/b/vcblog/archive/2015/06/19/c-11-14-17-features-in-vs-2015-rtm.aspx\n#  if defined(_HAS_AUTO_PTR_ETC) && (_HAS_AUTO_PTR_ETC == 0)\n#    define BOOST_NO_AUTO_PTR\n#  endif\n#endif\n\n#ifdef _CPPLIB_VER\n#  define BOOST_DINKUMWARE_STDLIB _CPPLIB_VER\n#else\n#  define BOOST_DINKUMWARE_STDLIB 1\n#endif\n\n#ifdef _CPPLIB_VER\n#  define BOOST_STDLIB \"Dinkumware standard library version \" BOOST_STRINGIZE(_CPPLIB_VER)\n#else\n#  define BOOST_STDLIB \"Dinkumware standard library version 1.x\"\n#endif\n"
  },
  {
    "path": "benchmarks/boost/config/stdlib/libcomo.hpp",
    "content": "//  (C) Copyright John Maddock 2002 - 2003. \n//  (C) Copyright Jens Maurer 2002 - 2003. \n//  (C) Copyright Beman Dawes 2002 - 2003. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Comeau STL:\n\n#if !defined(__LIBCOMO__)\n#  include <boost/config/no_tr1/utility.hpp>\n#  if !defined(__LIBCOMO__)\n#      error \"This is not the Comeau STL!\"\n#  endif\n#endif\n\n//\n// std::streambuf<wchar_t> is non-standard\n// NOTE: versions of libcomo prior to beta28 have octal version numbering,\n// e.g. version 25 is 21 (dec)\n#if __LIBCOMO_VERSION__ <= 22\n#  define BOOST_NO_STD_WSTREAMBUF\n#endif\n\n#if (__LIBCOMO_VERSION__ <= 31) && defined(_WIN32)\n#define BOOST_NO_SWPRINTF\n#endif\n\n#if __LIBCOMO_VERSION__ >= 31\n#  define BOOST_HAS_HASH\n#  define BOOST_HAS_SLIST\n#endif\n\n//  C++0x headers not yet implemented\n//\n#  define BOOST_NO_CXX11_HDR_ARRAY\n#  define BOOST_NO_CXX11_HDR_CHRONO\n#  define BOOST_NO_CXX11_HDR_CODECVT\n#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE\n#  define BOOST_NO_CXX11_HDR_FORWARD_LIST\n#  define BOOST_NO_CXX11_HDR_FUTURE\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#  define BOOST_NO_CXX11_HDR_MUTEX\n#  define BOOST_NO_CXX11_HDR_RANDOM\n#  define BOOST_NO_CXX11_HDR_RATIO\n#  define BOOST_NO_CXX11_HDR_REGEX\n#  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR\n#  define BOOST_NO_CXX11_HDR_THREAD\n#  define BOOST_NO_CXX11_HDR_TUPLE\n#  define BOOST_NO_CXX11_HDR_TYPE_TRAITS\n#  define BOOST_NO_CXX11_HDR_TYPEINDEX\n#  define BOOST_NO_CXX11_HDR_UNORDERED_MAP\n#  define BOOST_NO_CXX11_HDR_UNORDERED_SET\n#  define BOOST_NO_CXX11_NUMERIC_LIMITS\n#  define BOOST_NO_CXX11_ALLOCATOR\n#  define BOOST_NO_CXX11_ATOMIC_SMART_PTR\n#  define BOOST_NO_CXX11_SMART_PTR\n#  define BOOST_NO_CXX11_HDR_FUNCTIONAL\n#  define BOOST_NO_CXX11_HDR_ATOMIC\n#  define BOOST_NO_CXX11_STD_ALIGN\n#  define BOOST_NO_CXX11_ADDRESSOF\n\n#if defined(__has_include)\n#if !__has_include(<shared_mutex>)\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#elif __cplusplus < 201402\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n#else\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n\n//\n// Intrinsic type_traits support.\n// The SGI STL has it's own __type_traits class, which\n// has intrinsic compiler support with SGI's compilers.\n// Whatever map SGI style type traits to boost equivalents:\n//\n#define BOOST_HAS_SGI_TYPE_TRAITS\n\n#define BOOST_STDLIB \"Comeau standard library \" BOOST_STRINGIZE(__LIBCOMO_VERSION__)\n"
  },
  {
    "path": "benchmarks/boost/config/stdlib/libcpp.hpp",
    "content": "//  (C) Copyright Christopher Jefferson 2011.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  config for libc++\n//  Might need more in here later.\n\n#if !defined(_LIBCPP_VERSION)\n#  include <ciso646>\n#  if !defined(_LIBCPP_VERSION)\n#      error \"This is not libc++!\"\n#  endif\n#endif\n\n#define BOOST_STDLIB \"libc++ version \" BOOST_STRINGIZE(_LIBCPP_VERSION)\n\n#define BOOST_HAS_THREADS\n\n#ifdef _LIBCPP_HAS_NO_VARIADICS\n#    define BOOST_NO_CXX11_HDR_TUPLE\n#endif\n\n// BOOST_NO_CXX11_ALLOCATOR should imply no support for the C++11\n// allocator model. The C++11 allocator model requires a conforming\n// std::allocator_traits which is only possible with C++11 template\n// aliases since members rebind_alloc and rebind_traits require it.\n#if defined(_LIBCPP_HAS_NO_TEMPLATE_ALIASES)\n#    define BOOST_NO_CXX11_ALLOCATOR\n#endif\n\n#if __cplusplus < 201103\n#  define BOOST_NO_CXX11_HDR_ARRAY\n#  define BOOST_NO_CXX11_HDR_CODECVT\n#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE\n#  define BOOST_NO_CXX11_HDR_FORWARD_LIST\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#  define BOOST_NO_CXX11_HDR_MUTEX\n#  define BOOST_NO_CXX11_HDR_RANDOM\n#  define BOOST_NO_CXX11_HDR_RATIO\n#  define BOOST_NO_CXX11_HDR_REGEX\n#  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR\n#  define BOOST_NO_CXX11_HDR_THREAD\n#  define BOOST_NO_CXX11_HDR_TUPLE\n#  define BOOST_NO_CXX11_HDR_TYPEINDEX\n#  define BOOST_NO_CXX11_HDR_UNORDERED_MAP\n#  define BOOST_NO_CXX11_HDR_UNORDERED_SET\n#  define BOOST_NO_CXX11_NUMERIC_LIMITS\n#  define BOOST_NO_CXX11_ALLOCATOR\n#  define BOOST_NO_CXX11_SMART_PTR\n#  define BOOST_NO_CXX11_HDR_FUNCTIONAL\n#  define BOOST_NO_CXX11_STD_ALIGN\n#  define BOOST_NO_CXX11_ADDRESSOF\n#endif\n\n//\n// These appear to be unusable/incomplete so far:\n//\n#  define BOOST_NO_CXX11_HDR_CHRONO\n#  define BOOST_NO_CXX11_HDR_FUTURE\n#  define BOOST_NO_CXX11_HDR_TYPE_TRAITS\n#  define BOOST_NO_CXX11_ATOMIC_SMART_PTR\n#  define BOOST_NO_CXX11_HDR_ATOMIC\n\n// libc++ uses a non-standard messages_base\n#define BOOST_NO_STD_MESSAGES\n\n#if defined(__has_include)\n#if !__has_include(<shared_mutex>)\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#elif __cplusplus <= 201103\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n#elif __cplusplus < 201402\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n\n//  --- end ---\n"
  },
  {
    "path": "benchmarks/boost/config/stdlib/libstdcpp3.hpp",
    "content": "//  (C) Copyright John Maddock 2001.\n//  (C) Copyright Jens Maurer 2001.\n//  Use, modification and distribution are subject to the\n//  Boost Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  config for libstdc++ v3\n//  not much to go in here:\n\n#define BOOST_GNU_STDLIB 1\n\n#ifdef __GLIBCXX__\n#define BOOST_STDLIB \"GNU libstdc++ version \" BOOST_STRINGIZE(__GLIBCXX__)\n#else\n#define BOOST_STDLIB \"GNU libstdc++ version \" BOOST_STRINGIZE(__GLIBCPP__)\n#endif\n\n#if !defined(_GLIBCPP_USE_WCHAR_T) && !defined(_GLIBCXX_USE_WCHAR_T)\n#  define BOOST_NO_CWCHAR\n#  define BOOST_NO_CWCTYPE\n#  define BOOST_NO_STD_WSTRING\n#  define BOOST_NO_STD_WSTREAMBUF\n#endif\n\n#if defined(__osf__) && !defined(_REENTRANT) \\\n  && ( defined(_GLIBCXX_HAVE_GTHR_DEFAULT) || defined(_GLIBCPP_HAVE_GTHR_DEFAULT) )\n// GCC 3 on Tru64 forces the definition of _REENTRANT when any std lib header\n// file is included, therefore for consistency we define it here as well.\n#  define _REENTRANT\n#endif\n\n#ifdef __GLIBCXX__ // gcc 3.4 and greater:\n#  if defined(_GLIBCXX_HAVE_GTHR_DEFAULT) \\\n        || defined(_GLIBCXX__PTHREADS) \\\n        || defined(_GLIBCXX_HAS_GTHREADS) \\\n        || defined(_WIN32) \\\n        || defined(_AIX) \\\n        || defined(__HAIKU__)\n      //\n      // If the std lib has thread support turned on, then turn it on in Boost\n      // as well.  We do this because some gcc-3.4 std lib headers define _REENTANT\n      // while others do not...\n      //\n#     define BOOST_HAS_THREADS\n#  else\n#     define BOOST_DISABLE_THREADS\n#  endif\n#elif defined(__GLIBCPP__) \\\n        && !defined(_GLIBCPP_HAVE_GTHR_DEFAULT) \\\n        && !defined(_GLIBCPP__PTHREADS)\n   // disable thread support if the std lib was built single threaded:\n#  define BOOST_DISABLE_THREADS\n#endif\n\n#if (defined(linux) || defined(__linux) || defined(__linux__)) && defined(__arm__) && defined(_GLIBCPP_HAVE_GTHR_DEFAULT)\n// linux on arm apparently doesn't define _REENTRANT\n// so just turn on threading support whenever the std lib is thread safe:\n#  define BOOST_HAS_THREADS\n#endif\n\n#if !defined(_GLIBCPP_USE_LONG_LONG) \\\n    && !defined(_GLIBCXX_USE_LONG_LONG)\\\n    && defined(BOOST_HAS_LONG_LONG)\n// May have been set by compiler/*.hpp, but \"long long\" without library\n// support is useless.\n#  undef BOOST_HAS_LONG_LONG\n#endif\n\n// Apple doesn't seem to reliably defined a *unix* macro\n#if !defined(CYGWIN) && (  defined(__unix__)  \\\n                        || defined(__unix)    \\\n                        || defined(unix)      \\\n                        || defined(__APPLE__) \\\n                        || defined(__APPLE)   \\\n                        || defined(APPLE))\n#  include <unistd.h>\n#endif\n\n#if defined(__GLIBCXX__) || (defined(__GLIBCPP__) && __GLIBCPP__>=20020514) // GCC >= 3.1.0\n#  define BOOST_STD_EXTENSION_NAMESPACE __gnu_cxx\n#  define BOOST_HAS_SLIST\n#  define BOOST_HAS_HASH\n#  define BOOST_SLIST_HEADER <ext/slist>\n# if !defined(__GNUC__) || __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 3)\n#   define BOOST_HASH_SET_HEADER <ext/hash_set>\n#   define BOOST_HASH_MAP_HEADER <ext/hash_map>\n# else\n#   define BOOST_HASH_SET_HEADER <backward/hash_set>\n#   define BOOST_HASH_MAP_HEADER <backward/hash_map>\n# endif\n#endif\n\n//\n// Decide whether we have C++11 support turned on:\n//\n#if defined(__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus >= 201103)\n#  define BOOST_LIBSTDCXX11\n#endif\n//\n//  Decide which version of libstdc++ we have, normally\n//  stdlibc++ C++0x support is detected via __GNUC__, __GNUC_MINOR__, and possibly\n//  __GNUC_PATCHLEVEL__ at the suggestion of Jonathan Wakely, one of the stdlibc++\n//  developers. He also commented:\n//\n//       \"I'm not sure how useful __GLIBCXX__ is for your purposes, for instance in\n//       GCC 4.2.4 it is set to 20080519 but in GCC 4.3.0 it is set to 20080305.\n//       Although 4.3.0 was released earlier than 4.2.4, it has better C++0x support\n//       than any release in the 4.2 series.\"\n//\n//  Another resource for understanding stdlibc++ features is:\n//  http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#manual.intro.status.standard.200x\n//\n//  However, using the GCC version number fails when the compiler is clang since this\n//  only ever claims to emulate GCC-4.2, see https://svn.boost.org/trac/boost/ticket/7473\n//  for a long discussion on this issue.  What we can do though is use clang's __has_include\n//  to detect the presence of a C++11 header that was introduced with a specific GCC release.\n//  We still have to be careful though as many such headers were buggy and/or incomplete when\n//  first introduced, so we only check for headers that were fully featured from day 1, and then\n//  use that to infer the underlying GCC version:\n//\n#ifdef __clang__\n\n#if __has_include(<experimental/any>)\n#  define BOOST_LIBSTDCXX_VERSION 50100\n#elif __has_include(<shared_mutex>)\n#  define BOOST_LIBSTDCXX_VERSION 40900\n#elif __has_include(<ext/cmath>)\n#  define BOOST_LIBSTDCXX_VERSION 40800\n#elif __has_include(<scoped_allocator>)\n#  define BOOST_LIBSTDCXX_VERSION 40700\n#elif __has_include(<typeindex>)\n#  define BOOST_LIBSTDCXX_VERSION 40600\n#elif __has_include(<future>)\n#  define BOOST_LIBSTDCXX_VERSION 40500\n#elif  __has_include(<ratio>)\n#  define BOOST_LIBSTDCXX_VERSION 40400\n#elif __has_include(<array>)\n#  define BOOST_LIBSTDCXX_VERSION 40300\n#endif\n//\n//  GCC 4.8 and 9 add working versions of <atomic> and <regex> respectively.\n//  However, we have no test for these as the headers were present but broken\n//  in early GCC versions.\n//\n#endif\n\n#if defined(__SUNPRO_CC) && (__SUNPRO_CC >= 0x5130) && (__cplusplus >= 201103L)\n//\n// Oracle Solaris compiler uses it's own verison of libstdc++ but doesn't \n// set __GNUC__\n//\n#define BOOST_LIBSTDCXX_VERSION 40800\n#endif\n\n#if !defined(BOOST_LIBSTDCXX_VERSION)\n#  define BOOST_LIBSTDCXX_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)\n#endif\n\n//  C++0x headers in GCC 4.3.0 and later\n//\n#if (BOOST_LIBSTDCXX_VERSION < 40300) || !defined(BOOST_LIBSTDCXX11)\n#  define BOOST_NO_CXX11_HDR_ARRAY\n#  define BOOST_NO_CXX11_HDR_TUPLE\n#  define BOOST_NO_CXX11_HDR_UNORDERED_MAP\n#  define BOOST_NO_CXX11_HDR_UNORDERED_SET\n#  define BOOST_NO_CXX11_HDR_FUNCTIONAL\n#endif\n\n//  C++0x headers in GCC 4.4.0 and later\n//\n#if (BOOST_LIBSTDCXX_VERSION < 40400) || !defined(BOOST_LIBSTDCXX11)\n#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE\n#  define BOOST_NO_CXX11_HDR_FORWARD_LIST\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#  define BOOST_NO_CXX11_HDR_MUTEX\n#  define BOOST_NO_CXX11_HDR_RATIO\n#  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR\n#  define BOOST_NO_CXX11_SMART_PTR\n#else\n#  define BOOST_HAS_TR1_COMPLEX_INVERSE_TRIG \n#  define BOOST_HAS_TR1_COMPLEX_OVERLOADS \n#endif\n\n//  C++0x features in GCC 4.5.0 and later\n//\n#if (BOOST_LIBSTDCXX_VERSION < 40500) || !defined(BOOST_LIBSTDCXX11)\n#  define BOOST_NO_CXX11_NUMERIC_LIMITS\n#  define BOOST_NO_CXX11_HDR_FUTURE\n#  define BOOST_NO_CXX11_HDR_RANDOM\n#endif\n\n//  C++0x features in GCC 4.6.0 and later\n//\n#if (BOOST_LIBSTDCXX_VERSION < 40600) || !defined(BOOST_LIBSTDCXX11)\n#  define BOOST_NO_CXX11_HDR_TYPEINDEX\n#  define BOOST_NO_CXX11_ADDRESSOF\n#endif\n\n//  C++0x features in GCC 4.7.0 and later\n//\n#if (BOOST_LIBSTDCXX_VERSION < 40700) || !defined(BOOST_LIBSTDCXX11)\n// Note that although <chrono> existed prior to 4.7, \"steady_clock\" is spelled \"monotonic_clock\"\n// so 4.7.0 is the first truely conforming one.\n#  define BOOST_NO_CXX11_HDR_CHRONO\n#  define BOOST_NO_CXX11_ALLOCATOR\n#endif\n//  C++0x features in GCC 4.8.0 and later\n//\n#if (BOOST_LIBSTDCXX_VERSION < 40800) || !defined(BOOST_LIBSTDCXX11)\n// Note that although <atomic> existed prior to gcc 4.8 it was largely unimplemented for many types:\n#  define BOOST_NO_CXX11_HDR_ATOMIC\n#  define BOOST_NO_CXX11_HDR_THREAD\n#endif\n//  C++0x features in GCC 4.9.0 and later\n//\n#if (BOOST_LIBSTDCXX_VERSION < 40900) || !defined(BOOST_LIBSTDCXX11)\n// Although <regex> is present and compilable against, the actual implementation is not functional\n// even for the simplest patterns such as \"\\d\" or \"[0-9]\". This is the case at least in gcc up to 4.8, inclusively.\n#  define BOOST_NO_CXX11_HDR_REGEX\n#endif\n\n#if defined(__clang_major__) && ((__clang_major__ < 3) || ((__clang_major__ == 3) && (__clang_minor__ < 7)))\n// As of clang-3.6, libstdc++ header <atomic> throws up errors with clang:\n#  define BOOST_NO_CXX11_HDR_ATOMIC\n#endif\n//\n//  C++0x features in GCC 5.1 and later\n//\n#if (BOOST_LIBSTDCXX_VERSION < 50100) || !defined(BOOST_LIBSTDCXX11)\n#  define BOOST_NO_CXX11_HDR_TYPE_TRAITS\n#  define BOOST_NO_CXX11_HDR_CODECVT\n#  define BOOST_NO_CXX11_ATOMIC_SMART_PTR\n#  define BOOST_NO_CXX11_STD_ALIGN\n#endif\n\n#if defined(__has_include)\n#if !__has_include(<shared_mutex>)\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#elif __cplusplus <= 201103\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n#elif __cplusplus < 201402 || (BOOST_LIBSTDCXX_VERSION < 40900) || !defined(BOOST_LIBSTDCXX11)\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n\n//\n// Headers not present on Solaris with the Oracle compiler:\n#if defined(__SUNPRO_CC)\n#define BOOST_NO_CXX11_HDR_FUTURE\n#define BOOST_NO_CXX11_HDR_FORWARD_LIST \n#define BOOST_NO_CXX11_HDR_ATOMIC\n// shared_ptr is present, but is not convertible to bool\n// which causes all kinds of problems especially in Boost.Thread\n// but probably elsewhere as well.\n#define BOOST_NO_CXX11_SMART_PTR\n#endif\n\n#if (!defined(_GLIBCXX_HAS_GTHREADS) || !defined(_GLIBCXX_USE_C99_STDINT_TR1))\n   // Headers not always available:\n#  ifndef BOOST_NO_CXX11_HDR_CONDITION_VARIABLE\n#     define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE\n#  endif\n#  ifndef BOOST_NO_CXX11_HDR_MUTEX\n#     define BOOST_NO_CXX11_HDR_MUTEX\n#  endif\n#  ifndef BOOST_NO_CXX11_HDR_THREAD\n#     define BOOST_NO_CXX11_HDR_THREAD\n#  endif\n#  ifndef BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#     define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#  endif\n#endif\n\n#if (!defined(_GTHREAD_USE_MUTEX_TIMEDLOCK) || (_GTHREAD_USE_MUTEX_TIMEDLOCK == 0)) && !defined(BOOST_NO_CXX11_HDR_MUTEX)\n// Timed mutexes are not always available:\n#  define BOOST_NO_CXX11_HDR_MUTEX\n#endif\n\n//  --- end ---\n"
  },
  {
    "path": "benchmarks/boost/config/stdlib/modena.hpp",
    "content": "//  (C) Copyright Jens Maurer 2001. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Modena C++ standard library (comes with KAI C++)\n\n#if !defined(MSIPL_COMPILE_H)\n#  include <boost/config/no_tr1/utility.hpp>\n#  if !defined(__MSIPL_COMPILE_H)\n#      error \"This is not the Modena C++ library!\"\n#  endif\n#endif\n\n#ifndef MSIPL_NL_TYPES\n#define BOOST_NO_STD_MESSAGES\n#endif\n\n#ifndef MSIPL_WCHART\n#define BOOST_NO_STD_WSTRING\n#endif\n\n//  C++0x headers not yet implemented\n//\n#  define BOOST_NO_CXX11_HDR_ARRAY\n#  define BOOST_NO_CXX11_HDR_CHRONO\n#  define BOOST_NO_CXX11_HDR_CODECVT\n#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE\n#  define BOOST_NO_CXX11_HDR_FORWARD_LIST\n#  define BOOST_NO_CXX11_HDR_FUTURE\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#  define BOOST_NO_CXX11_HDR_MUTEX\n#  define BOOST_NO_CXX11_HDR_RANDOM\n#  define BOOST_NO_CXX11_HDR_RATIO\n#  define BOOST_NO_CXX11_HDR_REGEX\n#  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR\n#  define BOOST_NO_CXX11_HDR_THREAD\n#  define BOOST_NO_CXX11_HDR_TUPLE\n#  define BOOST_NO_CXX11_HDR_TYPE_TRAITS\n#  define BOOST_NO_CXX11_HDR_TYPEINDEX\n#  define BOOST_NO_CXX11_HDR_UNORDERED_MAP\n#  define BOOST_NO_CXX11_HDR_UNORDERED_SET\n#  define BOOST_NO_CXX11_NUMERIC_LIMITS\n#  define BOOST_NO_CXX11_ALLOCATOR\n#  define BOOST_NO_CXX11_ATOMIC_SMART_PTR\n#  define BOOST_NO_CXX11_SMART_PTR\n#  define BOOST_NO_CXX11_HDR_FUNCTIONAL\n#  define BOOST_NO_CXX11_HDR_ATOMIC\n#  define BOOST_NO_CXX11_STD_ALIGN\n#  define BOOST_NO_CXX11_ADDRESSOF\n\n#if defined(__has_include)\n#if !__has_include(<shared_mutex>)\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#elif __cplusplus < 201402\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n#else\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n\n#define BOOST_STDLIB \"Modena C++ standard library\"\n\n\n\n\n\n"
  },
  {
    "path": "benchmarks/boost/config/stdlib/msl.hpp",
    "content": "//  (C) Copyright John Maddock 2001. \n//  (C) Copyright Darin Adler 2001. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Metrowerks standard library:\n\n#ifndef __MSL_CPP__\n#  include <boost/config/no_tr1/utility.hpp>\n#  ifndef __MSL_CPP__\n#     error This is not the MSL standard library!\n#  endif\n#endif\n\n#if __MSL_CPP__ >= 0x6000  // Pro 6\n#  define BOOST_HAS_HASH\n#  define BOOST_STD_EXTENSION_NAMESPACE Metrowerks\n#endif\n#define BOOST_HAS_SLIST\n\n#if __MSL_CPP__ < 0x6209\n#  define BOOST_NO_STD_MESSAGES\n#endif\n\n// check C lib version for <stdint.h>\n#include <cstddef>\n\n#if defined(__MSL__) && (__MSL__ >= 0x5000)\n#  define BOOST_HAS_STDINT_H\n#  if !defined(__PALMOS_TRAPS__)\n#    define BOOST_HAS_UNISTD_H\n#  endif\n   // boilerplate code:\n#  include <boost/config/posix_features.hpp>\n#endif\n\n#if defined(_MWMT) || _MSL_THREADSAFE\n#  define BOOST_HAS_THREADS\n#endif\n\n#ifdef _MSL_NO_EXPLICIT_FUNC_TEMPLATE_ARG\n#  define BOOST_NO_STD_USE_FACET\n#  define BOOST_HAS_TWO_ARG_USE_FACET\n#endif\n\n//  C++0x headers not yet implemented\n//\n#  define BOOST_NO_CXX11_HDR_ARRAY\n#  define BOOST_NO_CXX11_HDR_CHRONO\n#  define BOOST_NO_CXX11_HDR_CODECVT\n#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE\n#  define BOOST_NO_CXX11_HDR_FORWARD_LIST\n#  define BOOST_NO_CXX11_HDR_FUTURE\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#  define BOOST_NO_CXX11_HDR_MUTEX\n#  define BOOST_NO_CXX11_HDR_RANDOM\n#  define BOOST_NO_CXX11_HDR_RATIO\n#  define BOOST_NO_CXX11_HDR_REGEX\n#  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR\n#  define BOOST_NO_CXX11_HDR_THREAD\n#  define BOOST_NO_CXX11_HDR_TUPLE\n#  define BOOST_NO_CXX11_HDR_TYPE_TRAITS\n#  define BOOST_NO_CXX11_HDR_TYPEINDEX\n#  define BOOST_NO_CXX11_HDR_UNORDERED_MAP\n#  define BOOST_NO_CXX11_HDR_UNORDERED_SET\n#  define BOOST_NO_CXX11_NUMERIC_LIMITS\n#  define BOOST_NO_CXX11_ALLOCATOR\n#  define BOOST_NO_CXX11_ATOMIC_SMART_PTR\n#  define BOOST_NO_CXX11_SMART_PTR\n#  define BOOST_NO_CXX11_HDR_FUNCTIONAL\n#  define BOOST_NO_CXX11_HDR_ATOMIC\n#  define BOOST_NO_CXX11_STD_ALIGN\n#  define BOOST_NO_CXX11_ADDRESSOF\n\n#if defined(__has_include)\n#if !__has_include(<shared_mutex>)\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#elif __cplusplus < 201402\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n#else\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n\n#define BOOST_STDLIB \"Metrowerks Standard Library version \" BOOST_STRINGIZE(__MSL_CPP__)\n"
  },
  {
    "path": "benchmarks/boost/config/stdlib/roguewave.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003. \n//  (C) Copyright Jens Maurer 2001. \n//  (C) Copyright David Abrahams 2003. \n//  (C) Copyright Boris Gubenko 2007. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  Rogue Wave std lib:\n\n#define BOOST_RW_STDLIB 1 \n\n#if !defined(__STD_RWCOMPILER_H__) && !defined(_RWSTD_VER)\n#  include <boost/config/no_tr1/utility.hpp>\n#  if !defined(__STD_RWCOMPILER_H__) && !defined(_RWSTD_VER)\n#     error This is not the Rogue Wave standard library\n#  endif\n#endif\n//\n// figure out a consistent version number:\n//\n#ifndef _RWSTD_VER\n#  define BOOST_RWSTD_VER 0x010000\n#elif _RWSTD_VER < 0x010000\n#  define BOOST_RWSTD_VER (_RWSTD_VER << 8)\n#else\n#  define BOOST_RWSTD_VER _RWSTD_VER\n#endif\n\n#ifndef _RWSTD_VER\n#  define BOOST_STDLIB \"Rogue Wave standard library version (Unknown version)\"\n#elif _RWSTD_VER < 0x04010200\n #  define BOOST_STDLIB \"Rogue Wave standard library version \" BOOST_STRINGIZE(_RWSTD_VER)\n#else\n#  ifdef _RWSTD_VER_STR\n#    define BOOST_STDLIB \"Apache STDCXX standard library version \" _RWSTD_VER_STR\n#  else\n#    define BOOST_STDLIB \"Apache STDCXX standard library version \" BOOST_STRINGIZE(_RWSTD_VER)\n#  endif\n#endif\n\n//\n// Prior to version 2.2.0 the primary template for std::numeric_limits\n// does not have compile time constants, even though specializations of that\n// template do:\n//\n#if BOOST_RWSTD_VER < 0x020200\n#  define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS\n#endif\n\n// Sun CC 5.5 patch 113817-07 adds long long specialization, but does not change the\n// library version number (http://sunsolve6.sun.com/search/document.do?assetkey=1-21-113817):\n#if BOOST_RWSTD_VER <= 0x020101 && (!defined(__SUNPRO_CC) || (__SUNPRO_CC < 0x550))\n#  define BOOST_NO_LONG_LONG_NUMERIC_LIMITS\n# endif\n\n//\n// Borland version of numeric_limits lacks __int64 specialisation:\n//\n#ifdef __BORLANDC__\n#  define BOOST_NO_MS_INT64_NUMERIC_LIMITS\n#endif\n\n//\n// No std::iterator if it can't figure out default template args:\n//\n#if defined(_RWSTD_NO_SIMPLE_DEFAULT_TEMPLATES) || defined(RWSTD_NO_SIMPLE_DEFAULT_TEMPLATES) || (BOOST_RWSTD_VER < 0x020000)\n#  define BOOST_NO_STD_ITERATOR\n#endif\n\n//\n// No iterator traits without partial specialization:\n//\n#if defined(_RWSTD_NO_CLASS_PARTIAL_SPEC) || defined(RWSTD_NO_CLASS_PARTIAL_SPEC)\n#  define BOOST_NO_STD_ITERATOR_TRAITS\n#endif\n\n//\n// Prior to version 2.0, std::auto_ptr was buggy, and there were no\n// new-style iostreams, and no conformant std::allocator:\n//\n#if (BOOST_RWSTD_VER < 0x020000)\n#  define BOOST_NO_AUTO_PTR\n#  define BOOST_NO_STRINGSTREAM\n#  define BOOST_NO_STD_ALLOCATOR\n#  define BOOST_NO_STD_LOCALE\n#endif\n\n//\n// No template iterator constructors without member template support:\n//\n#if defined(RWSTD_NO_MEMBER_TEMPLATES) || defined(_RWSTD_NO_MEMBER_TEMPLATES)\n#  define BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS\n#endif\n\n//\n// RW defines _RWSTD_ALLOCATOR if the allocator is conformant and in use\n// (the or _HPACC_ part is a hack - the library seems to define _RWSTD_ALLOCATOR\n// on HP aCC systems even though the allocator is in fact broken):\n//\n#if !defined(_RWSTD_ALLOCATOR) || (defined(__HP_aCC) && __HP_aCC <= 33100)\n#  define BOOST_NO_STD_ALLOCATOR\n#endif\n\n//\n// If we have a std::locale, we still may not have std::use_facet:\n//\n#if defined(_RWSTD_NO_TEMPLATE_ON_RETURN_TYPE) && !defined(BOOST_NO_STD_LOCALE)\n#  define BOOST_NO_STD_USE_FACET\n#  define BOOST_HAS_TWO_ARG_USE_FACET\n#endif\n\n//\n// There's no std::distance prior to version 2, or without\n// partial specialization support:\n//\n#if (BOOST_RWSTD_VER < 0x020000) || defined(_RWSTD_NO_CLASS_PARTIAL_SPEC)\n    #define BOOST_NO_STD_DISTANCE\n#endif\n\n//\n// Some versions of the rogue wave library don't have assignable\n// OutputIterators:\n//\n#if BOOST_RWSTD_VER < 0x020100\n#  define BOOST_NO_STD_OUTPUT_ITERATOR_ASSIGN\n#endif\n\n//\n// Disable BOOST_HAS_LONG_LONG when the library has no support for it.\n//\n#if !defined(_RWSTD_LONG_LONG) && defined(BOOST_HAS_LONG_LONG)\n#  undef BOOST_HAS_LONG_LONG\n#endif\n\n//\n// check that on HP-UX, the proper RW library is used\n//\n#if defined(__HP_aCC) && !defined(_HP_NAMESPACE_STD)\n#  error \"Boost requires Standard RW library. Please compile and link with -AA\"\n#endif\n\n//\n// Define macros specific to RW V2.2 on HP-UX\n//\n#if defined(__HP_aCC) && (BOOST_RWSTD_VER == 0x02020100)\n#  ifndef __HP_TC1_MAKE_PAIR\n#    define __HP_TC1_MAKE_PAIR\n#  endif\n#  ifndef _HP_INSTANTIATE_STD2_VL\n#    define _HP_INSTANTIATE_STD2_VL\n#  endif\n#endif\n\n#if _RWSTD_VER < 0x05000000\n#  define BOOST_NO_CXX11_HDR_ARRAY\n#endif\n// type_traits header is incomplete:\n#  define BOOST_NO_CXX11_HDR_TYPE_TRAITS\n//\n//  C++0x headers not yet implemented\n//\n#  define BOOST_NO_CXX11_HDR_CHRONO\n#  define BOOST_NO_CXX11_HDR_CODECVT\n#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE\n#  define BOOST_NO_CXX11_HDR_FORWARD_LIST\n#  define BOOST_NO_CXX11_HDR_FUTURE\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#  define BOOST_NO_CXX11_HDR_MUTEX\n#  define BOOST_NO_CXX11_HDR_RANDOM\n#  define BOOST_NO_CXX11_HDR_RATIO\n#  define BOOST_NO_CXX11_HDR_REGEX\n#  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR\n#  define BOOST_NO_CXX11_HDR_THREAD\n#  define BOOST_NO_CXX11_HDR_TUPLE\n#  define BOOST_NO_CXX11_HDR_TYPEINDEX\n#  define BOOST_NO_CXX11_HDR_UNORDERED_MAP\n#  define BOOST_NO_CXX11_HDR_UNORDERED_SET\n#  define BOOST_NO_CXX11_NUMERIC_LIMITS\n#  define BOOST_NO_CXX11_ALLOCATOR\n#  define BOOST_NO_CXX11_ATOMIC_SMART_PTR\n#  define BOOST_NO_CXX11_SMART_PTR\n#  define BOOST_NO_CXX11_HDR_FUNCTIONAL\n#  define BOOST_NO_CXX11_HDR_ATOMIC\n#  define BOOST_NO_CXX11_STD_ALIGN\n#  define BOOST_NO_CXX11_ADDRESSOF\n\n#if defined(__has_include)\n#if !__has_include(<shared_mutex>)\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#elif __cplusplus < 201402\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n#else\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n"
  },
  {
    "path": "benchmarks/boost/config/stdlib/sgi.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2003. \n//  (C) Copyright Darin Adler 2001. \n//  (C) Copyright Jens Maurer 2001 - 2003. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  generic SGI STL:\n\n#if !defined(__STL_CONFIG_H)\n#  include <boost/config/no_tr1/utility.hpp>\n#  if !defined(__STL_CONFIG_H)\n#      error \"This is not the SGI STL!\"\n#  endif\n#endif\n\n//\n// No std::iterator traits without partial specialisation:\n//\n#if !defined(__STL_CLASS_PARTIAL_SPECIALIZATION)\n#  define BOOST_NO_STD_ITERATOR_TRAITS\n#endif\n\n//\n// No std::stringstream with gcc < 3\n//\n#if defined(__GNUC__) && (__GNUC__ < 3) && \\\n     ((__GNUC_MINOR__ < 95) || (__GNUC_MINOR__ == 96)) && \\\n     !defined(__STL_USE_NEW_IOSTREAMS) || \\\n   defined(__APPLE_CC__)\n   // Note that we only set this for GNU C++ prior to 2.95 since the\n   // latest patches for that release do contain a minimal <sstream>\n   // If you are running a 2.95 release prior to 2.95.3 then this will need\n   // setting, but there is no way to detect that automatically (other\n   // than by running the configure script).\n   // Also, the unofficial GNU C++ 2.96 included in RedHat 7.1 doesn't\n   // have <sstream>.\n#  define BOOST_NO_STRINGSTREAM\n#endif\n\n// Apple doesn't seem to reliably defined a *unix* macro\n#if !defined(CYGWIN) && (  defined(__unix__)  \\\n                        || defined(__unix)    \\\n                        || defined(unix)      \\\n                        || defined(__APPLE__) \\\n                        || defined(__APPLE)   \\\n                        || defined(APPLE))\n#  include <unistd.h>\n#endif\n\n\n//\n// Assume no std::locale without own iostreams (this may be an\n// incorrect assumption in some cases):\n//\n#if !defined(__SGI_STL_OWN_IOSTREAMS) && !defined(__STL_USE_NEW_IOSTREAMS)\n#  define BOOST_NO_STD_LOCALE\n#endif\n\n//\n// Original native SGI streams have non-standard std::messages facet:\n//\n#if defined(__sgi) && (_COMPILER_VERSION <= 650) && !defined(__SGI_STL_OWN_IOSTREAMS)\n#  define BOOST_NO_STD_LOCALE\n#endif\n\n//\n// SGI's new iostreams have missing \"const\" in messages<>::open\n//\n#if defined(__sgi) && (_COMPILER_VERSION <= 740) && defined(__STL_USE_NEW_IOSTREAMS)\n#  define BOOST_NO_STD_MESSAGES\n#endif\n\n//\n// No template iterator constructors, or std::allocator\n// without member templates:\n//\n#if !defined(__STL_MEMBER_TEMPLATES)\n#  define BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS\n#  define BOOST_NO_STD_ALLOCATOR\n#endif\n\n//\n// We always have SGI style hash_set, hash_map, and slist:\n//\n#define BOOST_HAS_HASH\n#define BOOST_HAS_SLIST\n\n//\n// If this is GNU libstdc++2, then no <limits> and no std::wstring:\n//\n#if (defined(__GNUC__) && (__GNUC__ < 3))\n#  include <string>\n#  if defined(__BASTRING__)\n#     define BOOST_NO_LIMITS\n// Note: <boost/limits.hpp> will provide compile-time constants\n#     undef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS\n#     define BOOST_NO_STD_WSTRING\n#  endif\n#endif\n\n//\n// There is no standard iterator unless we have namespace support:\n//\n#if !defined(__STL_USE_NAMESPACES)\n#  define BOOST_NO_STD_ITERATOR\n#endif\n\n//\n// Intrinsic type_traits support.\n// The SGI STL has it's own __type_traits class, which\n// has intrinsic compiler support with SGI's compilers.\n// Whatever map SGI style type traits to boost equivalents:\n//\n#define BOOST_HAS_SGI_TYPE_TRAITS\n\n//  C++0x headers not yet implemented\n//\n#  define BOOST_NO_CXX11_HDR_ARRAY\n#  define BOOST_NO_CXX11_HDR_CHRONO\n#  define BOOST_NO_CXX11_HDR_CODECVT\n#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE\n#  define BOOST_NO_CXX11_HDR_FORWARD_LIST\n#  define BOOST_NO_CXX11_HDR_FUTURE\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#  define BOOST_NO_CXX11_HDR_MUTEX\n#  define BOOST_NO_CXX11_HDR_RANDOM\n#  define BOOST_NO_CXX11_HDR_RATIO\n#  define BOOST_NO_CXX11_HDR_REGEX\n#  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR\n#  define BOOST_NO_CXX11_HDR_THREAD\n#  define BOOST_NO_CXX11_HDR_TUPLE\n#  define BOOST_NO_CXX11_HDR_TYPE_TRAITS\n#  define BOOST_NO_CXX11_HDR_TYPEINDEX\n#  define BOOST_NO_CXX11_HDR_UNORDERED_MAP\n#  define BOOST_NO_CXX11_HDR_UNORDERED_SET\n#  define BOOST_NO_CXX11_NUMERIC_LIMITS\n#  define BOOST_NO_CXX11_ALLOCATOR\n#  define BOOST_NO_CXX11_ATOMIC_SMART_PTR\n#  define BOOST_NO_CXX11_SMART_PTR\n#  define BOOST_NO_CXX11_HDR_FUNCTIONAL\n#  define BOOST_NO_CXX11_HDR_ATOMIC\n#  define BOOST_NO_CXX11_STD_ALIGN\n#  define BOOST_NO_CXX11_ADDRESSOF\n\n#if defined(__has_include)\n#if !__has_include(<shared_mutex>)\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#elif __cplusplus < 201402\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n#else\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n\n#define BOOST_STDLIB \"SGI standard library\""
  },
  {
    "path": "benchmarks/boost/config/stdlib/stlport.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2002. \n//  (C) Copyright Darin Adler 2001. \n//  (C) Copyright Jens Maurer 2001. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n//  STLPort standard library config:\n\n#if !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION)\n#  include <cstddef>\n#  if !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION)\n#      error \"This is not STLPort!\"\n#  endif\n#endif\n\n// Apple doesn't seem to reliably defined a *unix* macro\n#if !defined(CYGWIN) && (  defined(__unix__)  \\\n                        || defined(__unix)    \\\n                        || defined(unix)      \\\n                        || defined(__APPLE__) \\\n                        || defined(__APPLE)   \\\n                        || defined(APPLE))\n#  include <unistd.h>\n#endif\n\n//\n// __STL_STATIC_CONST_INIT_BUG implies BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS\n// for versions prior to 4.1(beta)\n//\n#if (defined(__STL_STATIC_CONST_INIT_BUG) || defined(_STLP_STATIC_CONST_INIT_BUG)) && (__SGI_STL_PORT <= 0x400)\n#  define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS\n#endif\n\n//\n// If STLport thinks that there is no partial specialisation, then there is no\n// std::iterator traits:\n//\n#if !(defined(_STLP_CLASS_PARTIAL_SPECIALIZATION) || defined(__STL_CLASS_PARTIAL_SPECIALIZATION))\n#  define BOOST_NO_STD_ITERATOR_TRAITS\n#endif\n\n//\n// No new style iostreams on GCC without STLport's iostreams enabled:\n//\n#if (defined(__GNUC__) && (__GNUC__ < 3)) && !(defined(__SGI_STL_OWN_IOSTREAMS) || defined(_STLP_OWN_IOSTREAMS))\n#  define BOOST_NO_STRINGSTREAM\n#endif\n\n//\n// No new iostreams implies no std::locale, and no std::stringstream:\n//\n#if defined(__STL_NO_IOSTREAMS) || defined(__STL_NO_NEW_IOSTREAMS) || defined(_STLP_NO_IOSTREAMS) || defined(_STLP_NO_NEW_IOSTREAMS)\n#  define BOOST_NO_STD_LOCALE\n#  define BOOST_NO_STRINGSTREAM\n#endif\n\n//\n// If the streams are not native, and we have a \"using ::x\" compiler bug\n// then the io stream facets are not available in namespace std::\n//\n#ifdef _STLPORT_VERSION\n#  if !(_STLPORT_VERSION >= 0x500) && !defined(_STLP_OWN_IOSTREAMS) && defined(_STLP_USE_NAMESPACES) && defined(BOOST_NO_USING_TEMPLATE) && !defined(__BORLANDC__)\n#     define BOOST_NO_STD_LOCALE\n#  endif\n#else\n#  if !defined(__SGI_STL_OWN_IOSTREAMS) && defined(__STL_USE_NAMESPACES) && defined(BOOST_NO_USING_TEMPLATE) && !defined(__BORLANDC__)\n#     define BOOST_NO_STD_LOCALE\n#  endif\n#endif\n\n#if defined(_STLPORT_VERSION) && (_STLPORT_VERSION >= 0x520)\n#  define BOOST_HAS_TR1_UNORDERED_SET\n#  define BOOST_HAS_TR1_UNORDERED_MAP\n#endif\n//\n// Without member template support enabled, their are no template\n// iterate constructors, and no std::allocator:\n//\n#if !(defined(__STL_MEMBER_TEMPLATES) || defined(_STLP_MEMBER_TEMPLATES))\n#  define BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS\n#  define BOOST_NO_STD_ALLOCATOR\n#endif\n//\n// however we always have at least a partial allocator:\n//\n#define BOOST_HAS_PARTIAL_STD_ALLOCATOR\n\n#if !defined(_STLP_MEMBER_TEMPLATE_CLASSES) || defined(_STLP_DONT_SUPPORT_REBIND_MEMBER_TEMPLATE)\n#  define BOOST_NO_STD_ALLOCATOR\n#endif\n\n#if defined(_STLP_NO_MEMBER_TEMPLATE_KEYWORD) && defined(BOOST_MSVC) && (BOOST_MSVC <= 1300)\n#  define BOOST_NO_STD_ALLOCATOR\n#endif\n\n//\n// If STLport thinks there is no wchar_t at all, then we have to disable\n// the support for the relevant specilazations of std:: templates.\n//\n#if !defined(_STLP_HAS_WCHAR_T) && !defined(_STLP_WCHAR_T_IS_USHORT)\n#  ifndef  BOOST_NO_STD_WSTRING\n#     define BOOST_NO_STD_WSTRING\n#  endif\n#  ifndef  BOOST_NO_STD_WSTREAMBUF\n#     define BOOST_NO_STD_WSTREAMBUF\n#  endif\n#endif\n\n//\n// We always have SGI style hash_set, hash_map, and slist:\n//\n#ifndef _STLP_NO_EXTENSIONS\n#define BOOST_HAS_HASH\n#define BOOST_HAS_SLIST\n#endif\n\n//\n// STLport does a good job of importing names into namespace std::,\n// but doesn't always get them all, define BOOST_NO_STDC_NAMESPACE, since our\n// workaround does not conflict with STLports:\n//\n//\n// Harold Howe says:\n// Borland switched to STLport in BCB6. Defining BOOST_NO_STDC_NAMESPACE with\n// BCB6 does cause problems. If we detect C++ Builder, then don't define \n// BOOST_NO_STDC_NAMESPACE\n//\n#if !defined(__BORLANDC__) && !defined(__DMC__)\n//\n// If STLport is using it's own namespace, and the real names are in\n// the global namespace, then we duplicate STLport's using declarations\n// (by defining BOOST_NO_STDC_NAMESPACE), we do this because STLport doesn't\n// necessarily import all the names we need into namespace std::\n// \n#  if (defined(__STL_IMPORT_VENDOR_CSTD) \\\n         || defined(__STL_USE_OWN_NAMESPACE) \\\n         || defined(_STLP_IMPORT_VENDOR_CSTD) \\\n         || defined(_STLP_USE_OWN_NAMESPACE)) \\\n      && (defined(__STL_VENDOR_GLOBAL_CSTD) || defined (_STLP_VENDOR_GLOBAL_CSTD))\n#     define BOOST_NO_STDC_NAMESPACE\n#     define BOOST_NO_EXCEPTION_STD_NAMESPACE\n#  endif\n#elif defined(__BORLANDC__) && __BORLANDC__ < 0x560\n// STLport doesn't import std::abs correctly:\n#include <stdlib.h>\nnamespace std { using ::abs; }\n// and strcmp/strcpy don't get imported either ('cos they are macros)\n#include <string.h>\n#ifdef strcpy\n#  undef strcpy\n#endif\n#ifdef strcmp\n#  undef strcmp\n#endif\n#ifdef _STLP_VENDOR_CSTD\nnamespace std{ using _STLP_VENDOR_CSTD::strcmp; using _STLP_VENDOR_CSTD::strcpy; }\n#endif\n#endif\n\n//\n// std::use_facet may be non-standard, uses a class instead:\n//\n#if defined(__STL_NO_EXPLICIT_FUNCTION_TMPL_ARGS) || defined(_STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS)\n#  define BOOST_NO_STD_USE_FACET\n#  define BOOST_HAS_STLP_USE_FACET\n#endif\n\n//\n// If STLport thinks there are no wide functions, <cwchar> etc. is not working; but\n// only if BOOST_NO_STDC_NAMESPACE is not defined (if it is then we do the import \n// into std:: ourselves).\n//\n#if defined(_STLP_NO_NATIVE_WIDE_FUNCTIONS) && !defined(BOOST_NO_STDC_NAMESPACE)\n#  define BOOST_NO_CWCHAR\n#  define BOOST_NO_CWCTYPE\n#endif\n\n//\n// If STLport for some reason was configured so that it thinks that wchar_t\n// is not an intrinsic type, then we have to disable the support for it as\n// well (we would be missing required specializations otherwise).\n//\n#if !defined( _STLP_HAS_WCHAR_T) || defined(_STLP_WCHAR_T_IS_USHORT)\n#  undef  BOOST_NO_INTRINSIC_WCHAR_T\n#  define BOOST_NO_INTRINSIC_WCHAR_T\n#endif\n\n//\n// Borland ships a version of STLport with C++ Builder 6 that lacks\n// hashtables and the like:\n//\n#if defined(__BORLANDC__) && (__BORLANDC__ == 0x560)\n#  undef BOOST_HAS_HASH\n#endif\n\n//\n// gcc-2.95.3/STLPort does not like the using declarations we use to get ADL with std::min/max\n//\n#if defined(__GNUC__) && (__GNUC__ < 3)\n#  include <algorithm> // for std::min and std::max\n#  define BOOST_USING_STD_MIN() ((void)0)\n#  define BOOST_USING_STD_MAX() ((void)0)\nnamespace boost { using std::min; using std::max; }\n#endif\n\n//  C++0x headers not yet implemented\n//\n#  define BOOST_NO_CXX11_HDR_ARRAY\n#  define BOOST_NO_CXX11_HDR_CHRONO\n#  define BOOST_NO_CXX11_HDR_CODECVT\n#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE\n#  define BOOST_NO_CXX11_HDR_FORWARD_LIST\n#  define BOOST_NO_CXX11_HDR_FUTURE\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#  define BOOST_NO_CXX11_HDR_MUTEX\n#  define BOOST_NO_CXX11_HDR_RANDOM\n#  define BOOST_NO_CXX11_HDR_RATIO\n#  define BOOST_NO_CXX11_HDR_REGEX\n#  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR\n#  define BOOST_NO_CXX11_HDR_THREAD\n#  define BOOST_NO_CXX11_HDR_TUPLE\n#  define BOOST_NO_CXX11_HDR_TYPE_TRAITS\n#  define BOOST_NO_CXX11_HDR_TYPEINDEX\n#  define BOOST_NO_CXX11_HDR_UNORDERED_MAP\n#  define BOOST_NO_CXX11_HDR_UNORDERED_SET\n#  define BOOST_NO_CXX11_NUMERIC_LIMITS\n#  define BOOST_NO_CXX11_ALLOCATOR\n#  define BOOST_NO_CXX11_ATOMIC_SMART_PTR\n#  define BOOST_NO_CXX11_SMART_PTR\n#  define BOOST_NO_CXX11_HDR_FUNCTIONAL\n#  define BOOST_NO_CXX11_HDR_ATOMIC\n#  define BOOST_NO_CXX11_STD_ALIGN\n#  define BOOST_NO_CXX11_ADDRESSOF\n\n#if defined(__has_include)\n#if !__has_include(<shared_mutex>)\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#elif __cplusplus < 201402\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n#else\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n\n#define BOOST_STDLIB \"STLPort standard library version \" BOOST_STRINGIZE(__SGI_STL_PORT)\n"
  },
  {
    "path": "benchmarks/boost/config/stdlib/vacpp.hpp",
    "content": "//  (C) Copyright John Maddock 2001 - 2002. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org for most recent version.\n\n#if __IBMCPP__ <= 501\n#  define BOOST_NO_STD_ALLOCATOR\n#endif\n\n#define BOOST_HAS_MACRO_USE_FACET\n#define BOOST_NO_STD_MESSAGES\n\n// Apple doesn't seem to reliably defined a *unix* macro\n#if !defined(CYGWIN) && (  defined(__unix__)  \\\n                        || defined(__unix)    \\\n                        || defined(unix)      \\\n                        || defined(__APPLE__) \\\n                        || defined(__APPLE)   \\\n                        || defined(APPLE))\n#  include <unistd.h>\n#endif\n\n//  C++0x headers not yet implemented\n//\n#  define BOOST_NO_CXX11_HDR_ARRAY\n#  define BOOST_NO_CXX11_HDR_CHRONO\n#  define BOOST_NO_CXX11_HDR_CODECVT\n#  define BOOST_NO_CXX11_HDR_CONDITION_VARIABLE\n#  define BOOST_NO_CXX11_HDR_FORWARD_LIST\n#  define BOOST_NO_CXX11_HDR_FUTURE\n#  define BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n#  define BOOST_NO_CXX11_HDR_MUTEX\n#  define BOOST_NO_CXX11_HDR_RANDOM\n#  define BOOST_NO_CXX11_HDR_RATIO\n#  define BOOST_NO_CXX11_HDR_REGEX\n#  define BOOST_NO_CXX11_HDR_SYSTEM_ERROR\n#  define BOOST_NO_CXX11_HDR_THREAD\n#  define BOOST_NO_CXX11_HDR_TUPLE\n#  define BOOST_NO_CXX11_HDR_TYPE_TRAITS\n#  define BOOST_NO_CXX11_HDR_TYPEINDEX\n#  define BOOST_NO_CXX11_HDR_UNORDERED_MAP\n#  define BOOST_NO_CXX11_HDR_UNORDERED_SET\n#  define BOOST_NO_CXX11_NUMERIC_LIMITS\n#  define BOOST_NO_CXX11_ALLOCATOR\n#  define BOOST_NO_CXX11_ATOMIC_SMART_PTR\n#  define BOOST_NO_CXX11_SMART_PTR\n#  define BOOST_NO_CXX11_HDR_FUNCTIONAL\n#  define BOOST_NO_CXX11_HDR_ATOMIC\n#  define BOOST_NO_CXX11_STD_ALIGN\n#  define BOOST_NO_CXX11_ADDRESSOF\n\n#if defined(__has_include)\n#if !__has_include(<shared_mutex>)\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#elif __cplusplus < 201402\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n#else\n#  define BOOST_NO_CXX14_HDR_SHARED_MUTEX\n#endif\n\n#define BOOST_STDLIB \"Visual Age default standard library\"\n"
  },
  {
    "path": "benchmarks/boost/config/suffix.hpp",
    "content": "//  Boost config.hpp configuration header file  ------------------------------//\n//  boostinspect:ndprecated_macros -- tell the inspect tool to ignore this file\n\n//  Copyright (c) 2001-2003 John Maddock\n//  Copyright (c) 2001 Darin Adler\n//  Copyright (c) 2001 Peter Dimov\n//  Copyright (c) 2002 Bill Kempf\n//  Copyright (c) 2002 Jens Maurer\n//  Copyright (c) 2002-2003 David Abrahams\n//  Copyright (c) 2003 Gennaro Prota\n//  Copyright (c) 2003 Eric Friedman\n//  Copyright (c) 2010 Eric Jourdanneau, Joel Falcou\n// Distributed under the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org/ for most recent version.\n\n//  Boost config.hpp policy and rationale documentation has been moved to\n//  http://www.boost.org/libs/config/\n//\n//  This file is intended to be stable, and relatively unchanging.\n//  It should contain boilerplate code only - no compiler specific\n//  code unless it is unavoidable - no changes unless unavoidable.\n\n#ifndef BOOST_CONFIG_SUFFIX_HPP\n#define BOOST_CONFIG_SUFFIX_HPP\n\n#if defined(__GNUC__) && (__GNUC__ >= 4)\n//\n// Some GCC-4.x versions issue warnings even when __extension__ is used,\n// so use this as a workaround:\n//\n#pragma GCC system_header\n#endif\n\n//\n// ensure that visibility macros are always defined, thus symplifying use\n//\n#ifndef BOOST_SYMBOL_EXPORT\n# define BOOST_SYMBOL_EXPORT\n#endif\n#ifndef BOOST_SYMBOL_IMPORT\n# define BOOST_SYMBOL_IMPORT\n#endif\n#ifndef BOOST_SYMBOL_VISIBLE\n# define BOOST_SYMBOL_VISIBLE\n#endif\n\n//\n// look for long long by looking for the appropriate macros in <limits.h>.\n// Note that we use limits.h rather than climits for maximal portability,\n// remember that since these just declare a bunch of macros, there should be\n// no namespace issues from this.\n//\n#if !defined(BOOST_HAS_LONG_LONG) && !defined(BOOST_NO_LONG_LONG)                                              \\\n   && !defined(BOOST_MSVC) && !defined(__BORLANDC__)\n# include <limits.h>\n# if (defined(ULLONG_MAX) || defined(ULONG_LONG_MAX) || defined(ULONGLONG_MAX))\n#   define BOOST_HAS_LONG_LONG\n# else\n#   define BOOST_NO_LONG_LONG\n# endif\n#endif\n\n// GCC 3.x will clean up all of those nasty macro definitions that\n// BOOST_NO_CTYPE_FUNCTIONS is intended to help work around, so undefine\n// it under GCC 3.x.\n#if defined(__GNUC__) && (__GNUC__ >= 3) && defined(BOOST_NO_CTYPE_FUNCTIONS)\n#  undef BOOST_NO_CTYPE_FUNCTIONS\n#endif\n\n//\n// Assume any extensions are in namespace std:: unless stated otherwise:\n//\n#  ifndef BOOST_STD_EXTENSION_NAMESPACE\n#    define BOOST_STD_EXTENSION_NAMESPACE std\n#  endif\n\n//\n// If cv-qualified specializations are not allowed, then neither are cv-void ones:\n//\n#  if defined(BOOST_NO_CV_SPECIALIZATIONS) \\\n      && !defined(BOOST_NO_CV_VOID_SPECIALIZATIONS)\n#     define BOOST_NO_CV_VOID_SPECIALIZATIONS\n#  endif\n\n//\n// If there is no numeric_limits template, then it can't have any compile time\n// constants either!\n//\n#  if defined(BOOST_NO_LIMITS) \\\n      && !defined(BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS)\n#     define BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS\n#     define BOOST_NO_MS_INT64_NUMERIC_LIMITS\n#     define BOOST_NO_LONG_LONG_NUMERIC_LIMITS\n#  endif\n\n//\n// if there is no long long then there is no specialisation\n// for numeric_limits<long long> either:\n//\n#if !defined(BOOST_HAS_LONG_LONG) && !defined(BOOST_NO_LONG_LONG_NUMERIC_LIMITS)\n#  define BOOST_NO_LONG_LONG_NUMERIC_LIMITS\n#endif\n\n//\n// if there is no __int64 then there is no specialisation\n// for numeric_limits<__int64> either:\n//\n#if !defined(BOOST_HAS_MS_INT64) && !defined(BOOST_NO_MS_INT64_NUMERIC_LIMITS)\n#  define BOOST_NO_MS_INT64_NUMERIC_LIMITS\n#endif\n\n//\n// if member templates are supported then so is the\n// VC6 subset of member templates:\n//\n#  if !defined(BOOST_NO_MEMBER_TEMPLATES) \\\n       && !defined(BOOST_MSVC6_MEMBER_TEMPLATES)\n#     define BOOST_MSVC6_MEMBER_TEMPLATES\n#  endif\n\n//\n// Without partial specialization, can't test for partial specialisation bugs:\n//\n#  if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \\\n      && !defined(BOOST_BCB_PARTIAL_SPECIALIZATION_BUG)\n#     define BOOST_BCB_PARTIAL_SPECIALIZATION_BUG\n#  endif\n\n//\n// Without partial specialization, we can't have array-type partial specialisations:\n//\n#  if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \\\n      && !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS)\n#     define BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS\n#  endif\n\n//\n// Without partial specialization, std::iterator_traits can't work:\n//\n#  if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \\\n      && !defined(BOOST_NO_STD_ITERATOR_TRAITS)\n#     define BOOST_NO_STD_ITERATOR_TRAITS\n#  endif\n\n//\n// Without partial specialization, partial\n// specialization with default args won't work either:\n//\n#  if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \\\n      && !defined(BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS)\n#     define BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS\n#  endif\n\n//\n// Without member template support, we can't have template constructors\n// in the standard library either:\n//\n#  if defined(BOOST_NO_MEMBER_TEMPLATES) \\\n      && !defined(BOOST_MSVC6_MEMBER_TEMPLATES) \\\n      && !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)\n#     define BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS\n#  endif\n\n//\n// Without member template support, we can't have a conforming\n// std::allocator template either:\n//\n#  if defined(BOOST_NO_MEMBER_TEMPLATES) \\\n      && !defined(BOOST_MSVC6_MEMBER_TEMPLATES) \\\n      && !defined(BOOST_NO_STD_ALLOCATOR)\n#     define BOOST_NO_STD_ALLOCATOR\n#  endif\n\n//\n// without ADL support then using declarations will break ADL as well:\n//\n#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP) && !defined(BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL)\n#  define BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL\n#endif\n\n//\n// Without typeid support we have no dynamic RTTI either:\n//\n#if defined(BOOST_NO_TYPEID) && !defined(BOOST_NO_RTTI)\n#  define BOOST_NO_RTTI\n#endif\n\n//\n// If we have a standard allocator, then we have a partial one as well:\n//\n#if !defined(BOOST_NO_STD_ALLOCATOR)\n#  define BOOST_HAS_PARTIAL_STD_ALLOCATOR\n#endif\n\n//\n// We can't have a working std::use_facet if there is no std::locale:\n//\n#  if defined(BOOST_NO_STD_LOCALE) && !defined(BOOST_NO_STD_USE_FACET)\n#     define BOOST_NO_STD_USE_FACET\n#  endif\n\n//\n// We can't have a std::messages facet if there is no std::locale:\n//\n#  if defined(BOOST_NO_STD_LOCALE) && !defined(BOOST_NO_STD_MESSAGES)\n#     define BOOST_NO_STD_MESSAGES\n#  endif\n\n//\n// We can't have a working std::wstreambuf if there is no std::locale:\n//\n#  if defined(BOOST_NO_STD_LOCALE) && !defined(BOOST_NO_STD_WSTREAMBUF)\n#     define BOOST_NO_STD_WSTREAMBUF\n#  endif\n\n//\n// We can't have a <cwctype> if there is no <cwchar>:\n//\n#  if defined(BOOST_NO_CWCHAR) && !defined(BOOST_NO_CWCTYPE)\n#     define BOOST_NO_CWCTYPE\n#  endif\n\n//\n// We can't have a swprintf if there is no <cwchar>:\n//\n#  if defined(BOOST_NO_CWCHAR) && !defined(BOOST_NO_SWPRINTF)\n#     define BOOST_NO_SWPRINTF\n#  endif\n\n//\n// If Win32 support is turned off, then we must turn off\n// threading support also, unless there is some other\n// thread API enabled:\n//\n#if defined(BOOST_DISABLE_WIN32) && defined(_WIN32) \\\n   && !defined(BOOST_DISABLE_THREADS) && !defined(BOOST_HAS_PTHREADS)\n#  define BOOST_DISABLE_THREADS\n#endif\n\n//\n// Turn on threading support if the compiler thinks that it's in\n// multithreaded mode.  We put this here because there are only a\n// limited number of macros that identify this (if there's any missing\n// from here then add to the appropriate compiler section):\n//\n#if (defined(__MT__) || defined(_MT) || defined(_REENTRANT) \\\n    || defined(_PTHREADS) || defined(__APPLE__) || defined(__DragonFly__)) \\\n    && !defined(BOOST_HAS_THREADS)\n#  define BOOST_HAS_THREADS\n#endif\n\n//\n// Turn threading support off if BOOST_DISABLE_THREADS is defined:\n//\n#if defined(BOOST_DISABLE_THREADS) && defined(BOOST_HAS_THREADS)\n#  undef BOOST_HAS_THREADS\n#endif\n\n//\n// Turn threading support off if we don't recognise the threading API:\n//\n#if defined(BOOST_HAS_THREADS) && !defined(BOOST_HAS_PTHREADS)\\\n      && !defined(BOOST_HAS_WINTHREADS) && !defined(BOOST_HAS_BETHREADS)\\\n      && !defined(BOOST_HAS_MPTASKS)\n#  undef BOOST_HAS_THREADS\n#endif\n\n//\n// Turn threading detail macros off if we don't (want to) use threading\n//\n#ifndef BOOST_HAS_THREADS\n#  undef BOOST_HAS_PTHREADS\n#  undef BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE\n#  undef BOOST_HAS_PTHREAD_YIELD\n#  undef BOOST_HAS_PTHREAD_DELAY_NP\n#  undef BOOST_HAS_WINTHREADS\n#  undef BOOST_HAS_BETHREADS\n#  undef BOOST_HAS_MPTASKS\n#endif\n\n//\n// If the compiler claims to be C99 conformant, then it had better\n// have a <stdint.h>:\n//\n#  if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901)\n#     define BOOST_HAS_STDINT_H\n#     ifndef BOOST_HAS_LOG1P\n#        define BOOST_HAS_LOG1P\n#     endif\n#     ifndef BOOST_HAS_EXPM1\n#        define BOOST_HAS_EXPM1\n#     endif\n#  endif\n\n//\n// Define BOOST_NO_SLIST and BOOST_NO_HASH if required.\n// Note that this is for backwards compatibility only.\n//\n#  if !defined(BOOST_HAS_SLIST) && !defined(BOOST_NO_SLIST)\n#     define BOOST_NO_SLIST\n#  endif\n\n#  if !defined(BOOST_HAS_HASH) && !defined(BOOST_NO_HASH)\n#     define BOOST_NO_HASH\n#  endif\n\n//\n// Set BOOST_SLIST_HEADER if not set already:\n//\n#if defined(BOOST_HAS_SLIST) && !defined(BOOST_SLIST_HEADER)\n#  define BOOST_SLIST_HEADER <slist>\n#endif\n\n//\n// Set BOOST_HASH_SET_HEADER if not set already:\n//\n#if defined(BOOST_HAS_HASH) && !defined(BOOST_HASH_SET_HEADER)\n#  define BOOST_HASH_SET_HEADER <hash_set>\n#endif\n\n//\n// Set BOOST_HASH_MAP_HEADER if not set already:\n//\n#if defined(BOOST_HAS_HASH) && !defined(BOOST_HASH_MAP_HEADER)\n#  define BOOST_HASH_MAP_HEADER <hash_map>\n#endif\n\n//  BOOST_HAS_ABI_HEADERS\n//  This macro gets set if we have headers that fix the ABI,\n//  and prevent ODR violations when linking to external libraries:\n#if defined(BOOST_ABI_PREFIX) && defined(BOOST_ABI_SUFFIX) && !defined(BOOST_HAS_ABI_HEADERS)\n#  define BOOST_HAS_ABI_HEADERS\n#endif\n\n#if defined(BOOST_HAS_ABI_HEADERS) && defined(BOOST_DISABLE_ABI_HEADERS)\n#  undef BOOST_HAS_ABI_HEADERS\n#endif\n\n//  BOOST_NO_STDC_NAMESPACE workaround  --------------------------------------//\n//  Because std::size_t usage is so common, even in boost headers which do not\n//  otherwise use the C library, the <cstddef> workaround is included here so\n//  that ugly workaround code need not appear in many other boost headers.\n//  NOTE WELL: This is a workaround for non-conforming compilers; <cstddef>\n//  must still be #included in the usual places so that <cstddef> inclusion\n//  works as expected with standard conforming compilers.  The resulting\n//  double inclusion of <cstddef> is harmless.\n\n# if defined(BOOST_NO_STDC_NAMESPACE) && defined(__cplusplus)\n#   include <cstddef>\n    namespace std { using ::ptrdiff_t; using ::size_t; }\n# endif\n\n//  Workaround for the unfortunate min/max macros defined by some platform headers\n\n#define BOOST_PREVENT_MACRO_SUBSTITUTION\n\n#ifndef BOOST_USING_STD_MIN\n#  define BOOST_USING_STD_MIN() using std::min\n#endif\n\n#ifndef BOOST_USING_STD_MAX\n#  define BOOST_USING_STD_MAX() using std::max\n#endif\n\n//  BOOST_NO_STD_MIN_MAX workaround  -----------------------------------------//\n\n#  if defined(BOOST_NO_STD_MIN_MAX) && defined(__cplusplus)\n\nnamespace std {\n  template <class _Tp>\n  inline const _Tp& min BOOST_PREVENT_MACRO_SUBSTITUTION (const _Tp& __a, const _Tp& __b) {\n    return __b < __a ? __b : __a;\n  }\n  template <class _Tp>\n  inline const _Tp& max BOOST_PREVENT_MACRO_SUBSTITUTION (const _Tp& __a, const _Tp& __b) {\n    return  __a < __b ? __b : __a;\n  }\n}\n\n#  endif\n\n// BOOST_STATIC_CONSTANT workaround --------------------------------------- //\n// On compilers which don't allow in-class initialization of static integral\n// constant members, we must use enums as a workaround if we want the constants\n// to be available at compile-time. This macro gives us a convenient way to\n// declare such constants.\n\n#  ifdef BOOST_NO_INCLASS_MEMBER_INITIALIZATION\n#       define BOOST_STATIC_CONSTANT(type, assignment) enum { assignment }\n#  else\n#     define BOOST_STATIC_CONSTANT(type, assignment) static const type assignment\n#  endif\n\n// BOOST_USE_FACET / HAS_FACET workaround ----------------------------------//\n// When the standard library does not have a conforming std::use_facet there\n// are various workarounds available, but they differ from library to library.\n// The same problem occurs with has_facet.\n// These macros provide a consistent way to access a locale's facets.\n// Usage:\n//    replace\n//       std::use_facet<Type>(loc);\n//    with\n//       BOOST_USE_FACET(Type, loc);\n//    Note do not add a std:: prefix to the front of BOOST_USE_FACET!\n//  Use for BOOST_HAS_FACET is analogous.\n\n#if defined(BOOST_NO_STD_USE_FACET)\n#  ifdef BOOST_HAS_TWO_ARG_USE_FACET\n#     define BOOST_USE_FACET(Type, loc) std::use_facet(loc, static_cast<Type*>(0))\n#     define BOOST_HAS_FACET(Type, loc) std::has_facet(loc, static_cast<Type*>(0))\n#  elif defined(BOOST_HAS_MACRO_USE_FACET)\n#     define BOOST_USE_FACET(Type, loc) std::_USE(loc, Type)\n#     define BOOST_HAS_FACET(Type, loc) std::_HAS(loc, Type)\n#  elif defined(BOOST_HAS_STLP_USE_FACET)\n#     define BOOST_USE_FACET(Type, loc) (*std::_Use_facet<Type >(loc))\n#     define BOOST_HAS_FACET(Type, loc) std::has_facet< Type >(loc)\n#  endif\n#else\n#  define BOOST_USE_FACET(Type, loc) std::use_facet< Type >(loc)\n#  define BOOST_HAS_FACET(Type, loc) std::has_facet< Type >(loc)\n#endif\n\n// BOOST_NESTED_TEMPLATE workaround ------------------------------------------//\n// Member templates are supported by some compilers even though they can't use\n// the A::template member<U> syntax, as a workaround replace:\n//\n// typedef typename A::template rebind<U> binder;\n//\n// with:\n//\n// typedef typename A::BOOST_NESTED_TEMPLATE rebind<U> binder;\n\n#ifndef BOOST_NO_MEMBER_TEMPLATE_KEYWORD\n#  define BOOST_NESTED_TEMPLATE template\n#else\n#  define BOOST_NESTED_TEMPLATE\n#endif\n\n// BOOST_UNREACHABLE_RETURN(x) workaround -------------------------------------//\n// Normally evaluates to nothing, unless BOOST_NO_UNREACHABLE_RETURN_DETECTION\n// is defined, in which case it evaluates to return x; Use when you have a return\n// statement that can never be reached.\n\n#ifndef BOOST_UNREACHABLE_RETURN\n#  ifdef BOOST_NO_UNREACHABLE_RETURN_DETECTION\n#     define BOOST_UNREACHABLE_RETURN(x) return x;\n#  else\n#     define BOOST_UNREACHABLE_RETURN(x)\n#  endif\n#endif\n\n// BOOST_DEDUCED_TYPENAME workaround ------------------------------------------//\n//\n// Some compilers don't support the use of `typename' for dependent\n// types in deduced contexts, e.g.\n//\n//     template <class T> void f(T, typename T::type);\n//                                  ^^^^^^^^\n// Replace these declarations with:\n//\n//     template <class T> void f(T, BOOST_DEDUCED_TYPENAME T::type);\n\n#ifndef BOOST_NO_DEDUCED_TYPENAME\n#  define BOOST_DEDUCED_TYPENAME typename\n#else\n#  define BOOST_DEDUCED_TYPENAME\n#endif\n\n#ifndef BOOST_NO_TYPENAME_WITH_CTOR\n#  define BOOST_CTOR_TYPENAME typename\n#else\n#  define BOOST_CTOR_TYPENAME\n#endif\n\n// long long workaround ------------------------------------------//\n// On gcc (and maybe other compilers?) long long is alway supported\n// but it's use may generate either warnings (with -ansi), or errors\n// (with -pedantic -ansi) unless it's use is prefixed by __extension__\n//\n#if defined(BOOST_HAS_LONG_LONG) && defined(__cplusplus)\nnamespace boost{\n#  ifdef __GNUC__\n   __extension__ typedef long long long_long_type;\n   __extension__ typedef unsigned long long ulong_long_type;\n#  else\n   typedef long long long_long_type;\n   typedef unsigned long long ulong_long_type;\n#  endif\n}\n#endif\n// same again for __int128:\n#if defined(BOOST_HAS_INT128) && defined(__cplusplus)\nnamespace boost{\n#  ifdef __GNUC__\n   __extension__ typedef __int128 int128_type;\n   __extension__ typedef unsigned __int128 uint128_type;\n#  else\n   typedef __int128 int128_type;\n   typedef unsigned __int128 uint128_type;\n#  endif\n}\n#endif\n// same again for __float128:\n#if defined(BOOST_HAS_FLOAT128) && defined(__cplusplus)\nnamespace boost {\n#  ifdef __GNUC__\n   __extension__ typedef __float128 float128_type;\n#  else\n   typedef __float128 float128_type;\n#  endif\n}\n#endif\n\n// BOOST_[APPEND_]EXPLICIT_TEMPLATE_[NON_]TYPE macros --------------------------//\n\n// These macros are obsolete. Port away and remove.\n\n#  define BOOST_EXPLICIT_TEMPLATE_TYPE(t)\n#  define BOOST_EXPLICIT_TEMPLATE_TYPE_SPEC(t)\n#  define BOOST_EXPLICIT_TEMPLATE_NON_TYPE(t, v)\n#  define BOOST_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v)\n\n#  define BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(t)\n#  define BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE_SPEC(t)\n#  define BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE(t, v)\n#  define BOOST_APPEND_EXPLICIT_TEMPLATE_NON_TYPE_SPEC(t, v)\n\n// When BOOST_NO_STD_TYPEINFO is defined, we can just import\n// the global definition into std namespace:\n#if defined(BOOST_NO_STD_TYPEINFO) && defined(__cplusplus)\n#include <typeinfo>\nnamespace std{ using ::type_info; }\n#endif\n\n// ---------------------------------------------------------------------------//\n\n//\n// Helper macro BOOST_STRINGIZE:\n// Converts the parameter X to a string after macro replacement\n// on X has been performed.\n//\n#define BOOST_STRINGIZE(X) BOOST_DO_STRINGIZE(X)\n#define BOOST_DO_STRINGIZE(X) #X\n\n//\n// Helper macro BOOST_JOIN:\n// The following piece of macro magic joins the two\n// arguments together, even when one of the arguments is\n// itself a macro (see 16.3.1 in C++ standard).  The key\n// is that macro expansion of macro arguments does not\n// occur in BOOST_DO_JOIN2 but does in BOOST_DO_JOIN.\n//\n#define BOOST_JOIN( X, Y ) BOOST_DO_JOIN( X, Y )\n#define BOOST_DO_JOIN( X, Y ) BOOST_DO_JOIN2(X,Y)\n#define BOOST_DO_JOIN2( X, Y ) X##Y\n\n//\n// Set some default values for compiler/library/platform names.\n// These are for debugging config setup only:\n//\n#  ifndef BOOST_COMPILER\n#     define BOOST_COMPILER \"Unknown ISO C++ Compiler\"\n#  endif\n#  ifndef BOOST_STDLIB\n#     define BOOST_STDLIB \"Unknown ISO standard library\"\n#  endif\n#  ifndef BOOST_PLATFORM\n#     if defined(unix) || defined(__unix) || defined(_XOPEN_SOURCE) \\\n         || defined(_POSIX_SOURCE)\n#        define BOOST_PLATFORM \"Generic Unix\"\n#     else\n#        define BOOST_PLATFORM \"Unknown\"\n#     endif\n#  endif\n\n//\n// Set some default values GPU support\n//\n#  ifndef BOOST_GPU_ENABLED\n#  define BOOST_GPU_ENABLED\n#  endif\n\n// BOOST_FORCEINLINE ---------------------------------------------//\n// Macro to use in place of 'inline' to force a function to be inline\n#if !defined(BOOST_FORCEINLINE)\n#  if defined(_MSC_VER)\n#    define BOOST_FORCEINLINE __forceinline\n#  elif defined(__GNUC__) && __GNUC__ > 3\n     // Clang also defines __GNUC__ (as 4)\n#    define BOOST_FORCEINLINE inline __attribute__ ((__always_inline__))\n#  else\n#    define BOOST_FORCEINLINE inline\n#  endif\n#endif\n\n// BOOST_NOINLINE ---------------------------------------------//\n// Macro to use in place of 'inline' to prevent a function to be inlined\n#if !defined(BOOST_NOINLINE)\n#  if defined(_MSC_VER)\n#    define BOOST_NOINLINE __declspec(noinline)\n#  elif defined(__GNUC__) && __GNUC__ > 3\n     // Clang also defines __GNUC__ (as 4)\n#    if defined(__CUDACC__)\n       // nvcc doesn't always parse __noinline__, \n       // see: https://svn.boost.org/trac/boost/ticket/9392\n#      define BOOST_NOINLINE __attribute__ ((noinline))\n#    else\n#      define BOOST_NOINLINE __attribute__ ((__noinline__))\n#    endif\n#  else\n#    define BOOST_NOINLINE\n#  endif\n#endif\n\n// BOOST_NORETURN ---------------------------------------------//\n// Macro to use before a function declaration/definition to designate\n// the function as not returning normally (i.e. with a return statement\n// or by leaving the function scope, if the function return type is void).\n#if !defined(BOOST_NORETURN)\n#  if defined(_MSC_VER)\n#    define BOOST_NORETURN __declspec(noreturn)\n#  elif defined(__GNUC__)\n#    define BOOST_NORETURN __attribute__ ((__noreturn__))\n#  else\n#    define BOOST_NO_NORETURN\n#    define BOOST_NORETURN\n#  endif\n#endif\n\n// Branch prediction hints\n// These macros are intended to wrap conditional expressions that yield true or false\n//\n//  if (BOOST_LIKELY(var == 10))\n//  {\n//     // the most probable code here\n//  }\n//\n#if !defined(BOOST_LIKELY)\n#  define BOOST_LIKELY(x) x\n#endif\n#if !defined(BOOST_UNLIKELY)\n#  define BOOST_UNLIKELY(x) x\n#endif\n\n// Type and data alignment specification\n//\n#if !defined(BOOST_NO_CXX11_ALIGNAS)\n#  define BOOST_ALIGNMENT(x) alignas(x)\n#elif defined(_MSC_VER)\n#  define BOOST_ALIGNMENT(x) __declspec(align(x))\n#elif defined(__GNUC__)\n#  define BOOST_ALIGNMENT(x) __attribute__ ((__aligned__(x)))\n#else\n#  define BOOST_NO_ALIGNMENT\n#  define BOOST_ALIGNMENT(x)\n#endif\n\n// Lack of non-public defaulted functions is implied by the lack of any defaulted functions\n#if !defined(BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS) && defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS)\n#  define BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS\n#endif\n\n// Defaulted and deleted function declaration helpers\n// These macros are intended to be inside a class definition.\n// BOOST_DEFAULTED_FUNCTION accepts the function declaration and its\n// body, which will be used if the compiler doesn't support defaulted functions.\n// BOOST_DELETED_FUNCTION only accepts the function declaration. It\n// will expand to a private function declaration, if the compiler doesn't support\n// deleted functions. Because of this it is recommended to use BOOST_DELETED_FUNCTION\n// in the end of the class definition.\n//\n//  class my_class\n//  {\n//  public:\n//      // Default-constructible\n//      BOOST_DEFAULTED_FUNCTION(my_class(), {})\n//      // Copying prohibited\n//      BOOST_DELETED_FUNCTION(my_class(my_class const&))\n//      BOOST_DELETED_FUNCTION(my_class& operator= (my_class const&))\n//  };\n//\n#if !(defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) || defined(BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS))\n#   define BOOST_DEFAULTED_FUNCTION(fun, body) fun = default;\n#else\n#   define BOOST_DEFAULTED_FUNCTION(fun, body) fun body\n#endif\n\n#if !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS)\n#   define BOOST_DELETED_FUNCTION(fun) fun = delete;\n#else\n#   define BOOST_DELETED_FUNCTION(fun) private: fun;\n#endif\n\n//\n// Set BOOST_NO_DECLTYPE_N3276 when BOOST_NO_DECLTYPE is defined\n//\n#if defined(BOOST_NO_CXX11_DECLTYPE) && !defined(BOOST_NO_CXX11_DECLTYPE_N3276)\n#define BOOST_NO_CXX11_DECLTYPE_N3276 BOOST_NO_CXX11_DECLTYPE\n#endif\n\n//  -------------------- Deprecated macros for 1.50 ---------------------------\n//  These will go away in a future release\n\n//  Use BOOST_NO_CXX11_HDR_UNORDERED_SET or BOOST_NO_CXX11_HDR_UNORDERED_MAP\n//           instead of BOOST_NO_STD_UNORDERED\n#if defined(BOOST_NO_CXX11_HDR_UNORDERED_MAP) || defined (BOOST_NO_CXX11_HDR_UNORDERED_SET)\n# ifndef BOOST_NO_CXX11_STD_UNORDERED\n#  define BOOST_NO_CXX11_STD_UNORDERED\n# endif\n#endif\n\n//  Use BOOST_NO_CXX11_HDR_INITIALIZER_LIST instead of BOOST_NO_INITIALIZER_LISTS\n#if defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) && !defined(BOOST_NO_INITIALIZER_LISTS)\n#  define BOOST_NO_INITIALIZER_LISTS\n#endif\n\n//  Use BOOST_NO_CXX11_HDR_ARRAY instead of BOOST_NO_0X_HDR_ARRAY\n#if defined(BOOST_NO_CXX11_HDR_ARRAY) && !defined(BOOST_NO_0X_HDR_ARRAY)\n#  define BOOST_NO_0X_HDR_ARRAY\n#endif\n//  Use BOOST_NO_CXX11_HDR_CHRONO instead of BOOST_NO_0X_HDR_CHRONO\n#if defined(BOOST_NO_CXX11_HDR_CHRONO) && !defined(BOOST_NO_0X_HDR_CHRONO)\n#  define BOOST_NO_0X_HDR_CHRONO\n#endif\n//  Use BOOST_NO_CXX11_HDR_CODECVT instead of BOOST_NO_0X_HDR_CODECVT\n#if defined(BOOST_NO_CXX11_HDR_CODECVT) && !defined(BOOST_NO_0X_HDR_CODECVT)\n#  define BOOST_NO_0X_HDR_CODECVT\n#endif\n//  Use BOOST_NO_CXX11_HDR_CONDITION_VARIABLE instead of BOOST_NO_0X_HDR_CONDITION_VARIABLE\n#if defined(BOOST_NO_CXX11_HDR_CONDITION_VARIABLE) && !defined(BOOST_NO_0X_HDR_CONDITION_VARIABLE)\n#  define BOOST_NO_0X_HDR_CONDITION_VARIABLE\n#endif\n//  Use BOOST_NO_CXX11_HDR_FORWARD_LIST instead of BOOST_NO_0X_HDR_FORWARD_LIST\n#if defined(BOOST_NO_CXX11_HDR_FORWARD_LIST) && !defined(BOOST_NO_0X_HDR_FORWARD_LIST)\n#  define BOOST_NO_0X_HDR_FORWARD_LIST\n#endif\n//  Use BOOST_NO_CXX11_HDR_FUTURE instead of BOOST_NO_0X_HDR_FUTURE\n#if defined(BOOST_NO_CXX11_HDR_FUTURE) && !defined(BOOST_NO_0X_HDR_FUTURE)\n#  define BOOST_NO_0X_HDR_FUTURE\n#endif\n\n//  Use BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n//  instead of BOOST_NO_0X_HDR_INITIALIZER_LIST or BOOST_NO_INITIALIZER_LISTS\n#ifdef BOOST_NO_CXX11_HDR_INITIALIZER_LIST\n# ifndef BOOST_NO_0X_HDR_INITIALIZER_LIST\n#  define BOOST_NO_0X_HDR_INITIALIZER_LIST\n# endif\n# ifndef BOOST_NO_INITIALIZER_LISTS\n#  define BOOST_NO_INITIALIZER_LISTS\n# endif\n#endif\n\n//  Use BOOST_NO_CXX11_HDR_MUTEX instead of BOOST_NO_0X_HDR_MUTEX\n#if defined(BOOST_NO_CXX11_HDR_MUTEX) && !defined(BOOST_NO_0X_HDR_MUTEX)\n#  define BOOST_NO_0X_HDR_MUTEX\n#endif\n//  Use BOOST_NO_CXX11_HDR_RANDOM instead of BOOST_NO_0X_HDR_RANDOM\n#if defined(BOOST_NO_CXX11_HDR_RANDOM) && !defined(BOOST_NO_0X_HDR_RANDOM)\n#  define BOOST_NO_0X_HDR_RANDOM\n#endif\n//  Use BOOST_NO_CXX11_HDR_RATIO instead of BOOST_NO_0X_HDR_RATIO\n#if defined(BOOST_NO_CXX11_HDR_RATIO) && !defined(BOOST_NO_0X_HDR_RATIO)\n#  define BOOST_NO_0X_HDR_RATIO\n#endif\n//  Use BOOST_NO_CXX11_HDR_REGEX instead of BOOST_NO_0X_HDR_REGEX\n#if defined(BOOST_NO_CXX11_HDR_REGEX) && !defined(BOOST_NO_0X_HDR_REGEX)\n#  define BOOST_NO_0X_HDR_REGEX\n#endif\n//  Use BOOST_NO_CXX11_HDR_SYSTEM_ERROR instead of BOOST_NO_0X_HDR_SYSTEM_ERROR\n#if defined(BOOST_NO_CXX11_HDR_SYSTEM_ERROR) && !defined(BOOST_NO_0X_HDR_SYSTEM_ERROR)\n#  define BOOST_NO_0X_HDR_SYSTEM_ERROR\n#endif\n//  Use BOOST_NO_CXX11_HDR_THREAD instead of BOOST_NO_0X_HDR_THREAD\n#if defined(BOOST_NO_CXX11_HDR_THREAD) && !defined(BOOST_NO_0X_HDR_THREAD)\n#  define BOOST_NO_0X_HDR_THREAD\n#endif\n//  Use BOOST_NO_CXX11_HDR_TUPLE instead of BOOST_NO_0X_HDR_TUPLE\n#if defined(BOOST_NO_CXX11_HDR_TUPLE) && !defined(BOOST_NO_0X_HDR_TUPLE)\n#  define BOOST_NO_0X_HDR_TUPLE\n#endif\n//  Use BOOST_NO_CXX11_HDR_TYPE_TRAITS instead of BOOST_NO_0X_HDR_TYPE_TRAITS\n#if defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS) && !defined(BOOST_NO_0X_HDR_TYPE_TRAITS)\n#  define BOOST_NO_0X_HDR_TYPE_TRAITS\n#endif\n//  Use BOOST_NO_CXX11_HDR_TYPEINDEX instead of BOOST_NO_0X_HDR_TYPEINDEX\n#if defined(BOOST_NO_CXX11_HDR_TYPEINDEX) && !defined(BOOST_NO_0X_HDR_TYPEINDEX)\n#  define BOOST_NO_0X_HDR_TYPEINDEX\n#endif\n//  Use BOOST_NO_CXX11_HDR_UNORDERED_MAP instead of BOOST_NO_0X_HDR_UNORDERED_MAP\n#if defined(BOOST_NO_CXX11_HDR_UNORDERED_MAP) && !defined(BOOST_NO_0X_HDR_UNORDERED_MAP)\n#  define BOOST_NO_0X_HDR_UNORDERED_MAP\n#endif\n//  Use BOOST_NO_CXX11_HDR_UNORDERED_SET instead of BOOST_NO_0X_HDR_UNORDERED_SET\n#if defined(BOOST_NO_CXX11_HDR_UNORDERED_SET) && !defined(BOOST_NO_0X_HDR_UNORDERED_SET)\n#  define BOOST_NO_0X_HDR_UNORDERED_SET\n#endif\n\n//  ------------------ End of deprecated macros for 1.50 ---------------------------\n\n//  -------------------- Deprecated macros for 1.51 ---------------------------\n//  These will go away in a future release\n\n//  Use     BOOST_NO_CXX11_AUTO_DECLARATIONS instead of   BOOST_NO_AUTO_DECLARATIONS\n#if defined(BOOST_NO_CXX11_AUTO_DECLARATIONS) && !defined(BOOST_NO_AUTO_DECLARATIONS)\n#  define BOOST_NO_AUTO_DECLARATIONS\n#endif\n//  Use     BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS instead of   BOOST_NO_AUTO_MULTIDECLARATIONS\n#if defined(BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS) && !defined(BOOST_NO_AUTO_MULTIDECLARATIONS)\n#  define BOOST_NO_AUTO_MULTIDECLARATIONS\n#endif\n//  Use     BOOST_NO_CXX11_CHAR16_T instead of   BOOST_NO_CHAR16_T\n#if defined(BOOST_NO_CXX11_CHAR16_T) && !defined(BOOST_NO_CHAR16_T)\n#  define BOOST_NO_CHAR16_T\n#endif\n//  Use     BOOST_NO_CXX11_CHAR32_T instead of   BOOST_NO_CHAR32_T\n#if defined(BOOST_NO_CXX11_CHAR32_T) && !defined(BOOST_NO_CHAR32_T)\n#  define BOOST_NO_CHAR32_T\n#endif\n//  Use     BOOST_NO_CXX11_TEMPLATE_ALIASES instead of   BOOST_NO_TEMPLATE_ALIASES\n#if defined(BOOST_NO_CXX11_TEMPLATE_ALIASES) && !defined(BOOST_NO_TEMPLATE_ALIASES)\n#  define BOOST_NO_TEMPLATE_ALIASES\n#endif\n//  Use     BOOST_NO_CXX11_CONSTEXPR instead of   BOOST_NO_CONSTEXPR\n#if defined(BOOST_NO_CXX11_CONSTEXPR) && !defined(BOOST_NO_CONSTEXPR)\n#  define BOOST_NO_CONSTEXPR\n#endif\n//  Use     BOOST_NO_CXX11_DECLTYPE_N3276 instead of   BOOST_NO_DECLTYPE_N3276\n#if defined(BOOST_NO_CXX11_DECLTYPE_N3276) && !defined(BOOST_NO_DECLTYPE_N3276)\n#  define BOOST_NO_DECLTYPE_N3276\n#endif\n//  Use     BOOST_NO_CXX11_DECLTYPE instead of   BOOST_NO_DECLTYPE\n#if defined(BOOST_NO_CXX11_DECLTYPE) && !defined(BOOST_NO_DECLTYPE)\n#  define BOOST_NO_DECLTYPE\n#endif\n//  Use     BOOST_NO_CXX11_DEFAULTED_FUNCTIONS instead of   BOOST_NO_DEFAULTED_FUNCTIONS\n#if defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) && !defined(BOOST_NO_DEFAULTED_FUNCTIONS)\n#  define BOOST_NO_DEFAULTED_FUNCTIONS\n#endif\n//  Use     BOOST_NO_CXX11_DELETED_FUNCTIONS instead of   BOOST_NO_DELETED_FUNCTIONS\n#if defined(BOOST_NO_CXX11_DELETED_FUNCTIONS) && !defined(BOOST_NO_DELETED_FUNCTIONS)\n#  define BOOST_NO_DELETED_FUNCTIONS\n#endif\n//  Use     BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS instead of   BOOST_NO_EXPLICIT_CONVERSION_OPERATORS\n#if defined(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS) && !defined(BOOST_NO_EXPLICIT_CONVERSION_OPERATORS)\n#  define BOOST_NO_EXPLICIT_CONVERSION_OPERATORS\n#endif\n//  Use     BOOST_NO_CXX11_EXTERN_TEMPLATE instead of   BOOST_NO_EXTERN_TEMPLATE\n#if defined(BOOST_NO_CXX11_EXTERN_TEMPLATE) && !defined(BOOST_NO_EXTERN_TEMPLATE)\n#  define BOOST_NO_EXTERN_TEMPLATE\n#endif\n//  Use     BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS instead of   BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#if defined(BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS) && !defined(BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS)\n#  define BOOST_NO_FUNCTION_TEMPLATE_DEFAULT_ARGS\n#endif\n//  Use     BOOST_NO_CXX11_LAMBDAS instead of   BOOST_NO_LAMBDAS\n#if defined(BOOST_NO_CXX11_LAMBDAS) && !defined(BOOST_NO_LAMBDAS)\n#  define BOOST_NO_LAMBDAS\n#endif\n//  Use     BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS instead of   BOOST_NO_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#if defined(BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS) && !defined(BOOST_NO_LOCAL_CLASS_TEMPLATE_PARAMETERS)\n#  define BOOST_NO_LOCAL_CLASS_TEMPLATE_PARAMETERS\n#endif\n//  Use     BOOST_NO_CXX11_NOEXCEPT instead of   BOOST_NO_NOEXCEPT\n#if defined(BOOST_NO_CXX11_NOEXCEPT) && !defined(BOOST_NO_NOEXCEPT)\n#  define BOOST_NO_NOEXCEPT\n#endif\n//  Use     BOOST_NO_CXX11_NULLPTR instead of   BOOST_NO_NULLPTR\n#if defined(BOOST_NO_CXX11_NULLPTR) && !defined(BOOST_NO_NULLPTR)\n#  define BOOST_NO_NULLPTR\n#endif\n//  Use     BOOST_NO_CXX11_RAW_LITERALS instead of   BOOST_NO_RAW_LITERALS\n#if defined(BOOST_NO_CXX11_RAW_LITERALS) && !defined(BOOST_NO_RAW_LITERALS)\n#  define BOOST_NO_RAW_LITERALS\n#endif\n//  Use     BOOST_NO_CXX11_RVALUE_REFERENCES instead of   BOOST_NO_RVALUE_REFERENCES\n#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_NO_RVALUE_REFERENCES)\n#  define BOOST_NO_RVALUE_REFERENCES\n#endif\n//  Use     BOOST_NO_CXX11_SCOPED_ENUMS instead of   BOOST_NO_SCOPED_ENUMS\n#if defined(BOOST_NO_CXX11_SCOPED_ENUMS) && !defined(BOOST_NO_SCOPED_ENUMS)\n#  define BOOST_NO_SCOPED_ENUMS\n#endif\n//  Use     BOOST_NO_CXX11_STATIC_ASSERT instead of   BOOST_NO_STATIC_ASSERT\n#if defined(BOOST_NO_CXX11_STATIC_ASSERT) && !defined(BOOST_NO_STATIC_ASSERT)\n#  define BOOST_NO_STATIC_ASSERT\n#endif\n//  Use     BOOST_NO_CXX11_STD_UNORDERED instead of   BOOST_NO_STD_UNORDERED\n#if defined(BOOST_NO_CXX11_STD_UNORDERED) && !defined(BOOST_NO_STD_UNORDERED)\n#  define BOOST_NO_STD_UNORDERED\n#endif\n//  Use     BOOST_NO_CXX11_UNICODE_LITERALS instead of   BOOST_NO_UNICODE_LITERALS\n#if defined(BOOST_NO_CXX11_UNICODE_LITERALS) && !defined(BOOST_NO_UNICODE_LITERALS)\n#  define BOOST_NO_UNICODE_LITERALS\n#endif\n//  Use     BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX instead of   BOOST_NO_UNIFIED_INITIALIZATION_SYNTAX\n#if defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX) && !defined(BOOST_NO_UNIFIED_INITIALIZATION_SYNTAX)\n#  define BOOST_NO_UNIFIED_INITIALIZATION_SYNTAX\n#endif\n//  Use     BOOST_NO_CXX11_VARIADIC_TEMPLATES instead of   BOOST_NO_VARIADIC_TEMPLATES\n#if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && !defined(BOOST_NO_VARIADIC_TEMPLATES)\n#  define BOOST_NO_VARIADIC_TEMPLATES\n#endif\n//  Use     BOOST_NO_CXX11_VARIADIC_MACROS instead of   BOOST_NO_VARIADIC_MACROS\n#if defined(BOOST_NO_CXX11_VARIADIC_MACROS) && !defined(BOOST_NO_VARIADIC_MACROS)\n#  define BOOST_NO_VARIADIC_MACROS\n#endif\n//  Use     BOOST_NO_CXX11_NUMERIC_LIMITS instead of   BOOST_NO_NUMERIC_LIMITS_LOWEST\n#if defined(BOOST_NO_CXX11_NUMERIC_LIMITS) && !defined(BOOST_NO_NUMERIC_LIMITS_LOWEST)\n#  define BOOST_NO_NUMERIC_LIMITS_LOWEST\n#endif\n//  ------------------ End of deprecated macros for 1.51 ---------------------------\n\n\n\n//\n// Helper macros BOOST_NOEXCEPT, BOOST_NOEXCEPT_IF, BOOST_NOEXCEPT_EXPR\n// These aid the transition to C++11 while still supporting C++03 compilers\n//\n#ifdef BOOST_NO_CXX11_NOEXCEPT\n#  define BOOST_NOEXCEPT\n#  define BOOST_NOEXCEPT_OR_NOTHROW throw()\n#  define BOOST_NOEXCEPT_IF(Predicate)\n#  define BOOST_NOEXCEPT_EXPR(Expression) false\n#else\n#  define BOOST_NOEXCEPT noexcept\n#  define BOOST_NOEXCEPT_OR_NOTHROW noexcept\n#  define BOOST_NOEXCEPT_IF(Predicate) noexcept((Predicate))\n#  define BOOST_NOEXCEPT_EXPR(Expression) noexcept((Expression))\n#endif\n//\n// Helper macro BOOST_FALLTHROUGH\n// Fallback definition of BOOST_FALLTHROUGH macro used to mark intended\n// fall-through between case labels in a switch statement. We use a definition\n// that requires a semicolon after it to avoid at least one type of misuse even\n// on unsupported compilers.\n//\n#ifndef BOOST_FALLTHROUGH\n#  define BOOST_FALLTHROUGH ((void)0)\n#endif\n\n//\n// constexpr workarounds\n//\n#if defined(BOOST_NO_CXX11_CONSTEXPR)\n#define BOOST_CONSTEXPR\n#define BOOST_CONSTEXPR_OR_CONST const\n#else\n#define BOOST_CONSTEXPR constexpr\n#define BOOST_CONSTEXPR_OR_CONST constexpr\n#endif\n#if defined(BOOST_NO_CXX14_CONSTEXPR)\n#define BOOST_CXX14_CONSTEXPR\n#else\n#define BOOST_CXX14_CONSTEXPR constexpr\n#endif\n\n//\n// Unused variable/typedef workarounds:\n//\n#ifndef BOOST_ATTRIBUTE_UNUSED\n#  define BOOST_ATTRIBUTE_UNUSED\n#endif\n\n#define BOOST_STATIC_CONSTEXPR  static BOOST_CONSTEXPR_OR_CONST\n\n//\n// Set BOOST_HAS_STATIC_ASSERT when BOOST_NO_CXX11_STATIC_ASSERT is not defined\n//\n#if !defined(BOOST_NO_CXX11_STATIC_ASSERT) && !defined(BOOST_HAS_STATIC_ASSERT)\n#  define BOOST_HAS_STATIC_ASSERT\n#endif\n\n//\n// Set BOOST_HAS_RVALUE_REFS when BOOST_NO_CXX11_RVALUE_REFERENCES is not defined\n//\n#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_HAS_RVALUE_REFS)\n#define BOOST_HAS_RVALUE_REFS\n#endif\n\n//\n// Set BOOST_HAS_VARIADIC_TMPL when BOOST_NO_CXX11_VARIADIC_TEMPLATES is not defined\n//\n#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && !defined(BOOST_HAS_VARIADIC_TMPL)\n#define BOOST_HAS_VARIADIC_TMPL\n#endif\n//\n// Set BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS when\n// BOOST_NO_CXX11_VARIADIC_TEMPLATES is set:\n//\n#if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && !defined(BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS)\n#  define BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS\n#endif\n\n//\n// Finish off with checks for macros that are depricated / no longer supported,\n// if any of these are set then it's very likely that much of Boost will no\n// longer work.  So stop with a #error for now, but give the user a chance\n// to continue at their own risk if they really want to:\n//\n#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_CONFIG_ALLOW_DEPRECATED)\n#  error \"You are using a compiler which lacks features which are now a minimum requirement in order to use Boost, define BOOST_CONFIG_ALLOW_DEPRECATED if you want to continue at your own risk!!!\"\n#endif\n\n#endif\n"
  },
  {
    "path": "benchmarks/boost/config/user.hpp",
    "content": "//  boost/config/user.hpp  ---------------------------------------------------//\n\n//  (C) Copyright John Maddock 2001. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  Do not check in modified versions of this file,\n//  This file may be customized by the end user, but not by boost.\n\n//\n//  Use this file to define a site and compiler specific\n//  configuration policy:\n//\n\n// define this to locate a compiler config file:\n// #define BOOST_COMPILER_CONFIG <myheader>\n\n// define this to locate a stdlib config file:\n// #define BOOST_STDLIB_CONFIG   <myheader>\n\n// define this to locate a platform config file:\n// #define BOOST_PLATFORM_CONFIG <myheader>\n\n// define this to disable compiler config,\n// use if your compiler config has nothing to set:\n// #define BOOST_NO_COMPILER_CONFIG\n\n// define this to disable stdlib config,\n// use if your stdlib config has nothing to set:\n// #define BOOST_NO_STDLIB_CONFIG\n\n// define this to disable platform config,\n// use if your platform config has nothing to set:\n// #define BOOST_NO_PLATFORM_CONFIG\n\n// define this to disable all config options,\n// excluding the user config.  Use if your\n// setup is fully ISO compliant, and has no\n// useful extensions, or for autoconf generated\n// setups:\n// #define BOOST_NO_CONFIG\n\n// define this to make the config \"optimistic\"\n// about unknown compiler versions.  Normally\n// unknown compiler versions are assumed to have\n// all the defects of the last known version, however\n// setting this flag, causes the config to assume\n// that unknown compiler versions are fully conformant\n// with the standard:\n// #define BOOST_STRICT_CONFIG\n\n// define this to cause the config to halt compilation\n// with an #error if it encounters anything unknown --\n// either an unknown compiler version or an unknown\n// compiler/platform/library:\n// #define BOOST_ASSERT_CONFIG\n\n\n// define if you want to disable threading support, even\n// when available:\n// #define BOOST_DISABLE_THREADS\n\n// define when you want to disable Win32 specific features\n// even when available:\n// #define BOOST_DISABLE_WIN32\n\n// BOOST_DISABLE_ABI_HEADERS: Stops boost headers from including any \n// prefix/suffix headers that normally control things like struct \n// packing and alignment. \n// #define BOOST_DISABLE_ABI_HEADERS\n\n// BOOST_ABI_PREFIX: A prefix header to include in place of whatever\n// boost.config would normally select, any replacement should set up \n// struct packing and alignment options as required. \n// #define BOOST_ABI_PREFIX my-header-name\n\n// BOOST_ABI_SUFFIX: A suffix header to include in place of whatever \n// boost.config would normally select, any replacement should undo \n// the effects of the prefix header. \n// #define BOOST_ABI_SUFFIX my-header-name\n\n// BOOST_ALL_DYN_LINK: Forces all libraries that have separate source, \n// to be linked as dll's rather than static libraries on Microsoft Windows \n// (this macro is used to turn on __declspec(dllimport) modifiers, so that \n// the compiler knows which symbols to look for in a dll rather than in a \n// static library).  Note that there may be some libraries that can only \n// be linked in one way (statically or dynamically), in these cases this \n// macro has no effect.\n// #define BOOST_ALL_DYN_LINK\n \n// BOOST_WHATEVER_DYN_LINK: Forces library \"whatever\" to be linked as a dll \n// rather than a static library on Microsoft Windows: replace the WHATEVER \n// part of the macro name with the name of the library that you want to \n// dynamically link to, for example use BOOST_DATE_TIME_DYN_LINK or \n// BOOST_REGEX_DYN_LINK etc (this macro is used to turn on __declspec(dllimport) \n// modifiers, so that the compiler knows which symbols to look for in a dll \n// rather than in a static library).  \n// Note that there may be some libraries that can only \n// be linked in one way (statically or dynamically), \n// in these cases this macro is unsupported.\n// #define BOOST_WHATEVER_DYN_LINK\n \n// BOOST_ALL_NO_LIB: Tells the config system not to automatically select \n// which libraries to link against.  \n// Normally if a compiler supports #pragma lib, then the correct library \n// build variant will be automatically selected and linked against, \n// simply by the act of including one of that library's headers.  \n// This macro turns that feature off.\n// #define BOOST_ALL_NO_LIB\n \n// BOOST_WHATEVER_NO_LIB: Tells the config system not to automatically \n// select which library to link against for library \"whatever\", \n// replace WHATEVER in the macro name with the name of the library; \n// for example BOOST_DATE_TIME_NO_LIB or BOOST_REGEX_NO_LIB.  \n// Normally if a compiler supports #pragma lib, then the correct library \n// build variant will be automatically selected and linked against, simply \n// by the act of including one of that library's headers.  This macro turns \n// that feature off.\n// #define BOOST_WHATEVER_NO_LIB\n \n// BOOST_LIB_BUILDID: Set to the same value as the value passed to Boost.Build's\n// --buildid command line option.  For example if you built using:\n//\n// bjam address-model=64 --buildid=amd64\n//\n// then compile your code with:\n//\n// -DBOOST_LIB_BUILDID = amd64\n//\n// to ensure the correct libraries are selected at link time.\n// #define BOOST_LIB_BUILDID amd64\n\n"
  },
  {
    "path": "benchmarks/boost/config/warning_disable.hpp",
    "content": "//  Copyright John Maddock 2008\n//  Use, modification, and distribution is subject to the Boost Software\n//  License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  This file exists to turn off some overly-pedantic warning emitted\n//  by certain compilers.  You should include this header only in:\n//\n//  * A test case, before any other headers, or,\n//  * A library source file before any other headers.\n//\n//  IT SHOULD NOT BE INCLUDED BY ANY BOOST HEADER.\n//\n//  YOU SHOULD NOT INCLUDE IT IF YOU CAN REASONABLY FIX THE WARNING.\n//\n//  The only warnings disabled here are those that are:\n//\n//  * Quite unreasonably pedantic.\n//  * Generally only emitted by a single compiler.\n//  * Can't easily be fixed: for example if the vendors own std lib \n//    code emits these warnings!\n//\n//  Note that THIS HEADER MUST NOT INCLUDE ANY OTHER HEADERS:\n//  not even std library ones!  Doing so may turn the warning\n//  off too late to be of any use.  For example the VC++ C4996\n//  warning can be emitted from <iosfwd> if that header is included\n//  before or by this one :-(\n//\n\n#ifndef BOOST_CONFIG_WARNING_DISABLE_HPP\n#define BOOST_CONFIG_WARNING_DISABLE_HPP\n\n#if defined(_MSC_VER) && (_MSC_VER >= 1400) \n   // Error 'function': was declared deprecated\n   // http://msdn2.microsoft.com/en-us/library/ttcz0bys(VS.80).aspx\n   // This error is emitted when you use some perfectly conforming\n   // std lib functions in a perfectly correct way, and also by\n   // some of Microsoft's own std lib code !\n#  pragma warning(disable:4996)\n#endif\n#if defined(__INTEL_COMPILER) || defined(__ICL)\n   // As above: gives warning when a \"deprecated\"\n   // std library function is encountered.\n#  pragma warning(disable:1786)\n#endif\n\n#endif // BOOST_CONFIG_WARNING_DISABLE_HPP\n"
  },
  {
    "path": "benchmarks/boost/config.hpp",
    "content": "//  Boost config.hpp configuration header file  ------------------------------//\n\n//  (C) Copyright John Maddock 2002.\n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org/libs/config for most recent version.\n\n//  Boost config.hpp policy and rationale documentation has been moved to\n//  http://www.boost.org/libs/config\n//\n//  CAUTION: This file is intended to be completely stable -\n//           DO NOT MODIFY THIS FILE!\n//\n\n#ifndef BOOST_CONFIG_HPP\n#define BOOST_CONFIG_HPP\n\n// if we don't have a user config, then use the default location:\n#if !defined(BOOST_USER_CONFIG) && !defined(BOOST_NO_USER_CONFIG)\n#  define BOOST_USER_CONFIG <boost/config/user.hpp>\n#if 0\n// For dependency trackers:\n#  include <boost/config/user.hpp>\n#endif\n#endif\n// include it first:\n#ifdef BOOST_USER_CONFIG\n#  include BOOST_USER_CONFIG\n#endif\n\n// if we don't have a compiler config set, try and find one:\n#if !defined(BOOST_COMPILER_CONFIG) && !defined(BOOST_NO_COMPILER_CONFIG) && !defined(BOOST_NO_CONFIG)\n#  include <boost/config/select_compiler_config.hpp>\n#endif\n// if we have a compiler config, include it now:\n#ifdef BOOST_COMPILER_CONFIG\n#  include BOOST_COMPILER_CONFIG\n#endif\n\n// if we don't have a std library config set, try and find one:\n#if !defined(BOOST_STDLIB_CONFIG) && !defined(BOOST_NO_STDLIB_CONFIG) && !defined(BOOST_NO_CONFIG) && defined(__cplusplus)\n#  include <boost/config/select_stdlib_config.hpp>\n#endif\n// if we have a std library config, include it now:\n#ifdef BOOST_STDLIB_CONFIG\n#  include BOOST_STDLIB_CONFIG\n#endif\n\n// if we don't have a platform config set, try and find one:\n#if !defined(BOOST_PLATFORM_CONFIG) && !defined(BOOST_NO_PLATFORM_CONFIG) && !defined(BOOST_NO_CONFIG)\n#  include <boost/config/select_platform_config.hpp>\n#endif\n// if we have a platform config, include it now:\n#ifdef BOOST_PLATFORM_CONFIG\n#  include BOOST_PLATFORM_CONFIG\n#endif\n\n// get config suffix code:\n#include <boost/config/suffix.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\n#endif  // BOOST_CONFIG_HPP\n"
  },
  {
    "path": "benchmarks/boost/core/enable_if.hpp",
    "content": "// Boost enable_if library\n\n// Copyright 2003 (c) The Trustees of Indiana University.\n\n// Use, modification, and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n//    Authors: Jaakko Jarvi (jajarvi at osl.iu.edu)\n//             Jeremiah Willcock (jewillco at osl.iu.edu)\n//             Andrew Lumsdaine (lums at osl.iu.edu)\n\n\n#ifndef BOOST_CORE_ENABLE_IF_HPP\n#define BOOST_CORE_ENABLE_IF_HPP\n\n#include \"boost/config.hpp\"\n\n// Even the definition of enable_if causes problems on some compilers,\n// so it's macroed out for all compilers that do not support SFINAE\n\n#ifndef BOOST_NO_SFINAE\n\nnamespace boost\n{\n  template<typename T, typename R=void>\n  struct enable_if_has_type\n  {\n    typedef R type;\n  };\n \n  template <bool B, class T = void>\n  struct enable_if_c {\n    typedef T type;\n  };\n\n  template <class T>\n  struct enable_if_c<false, T> {};\n\n  template <class Cond, class T = void> \n  struct enable_if : public enable_if_c<Cond::value, T> {};\n\n  template <bool B, class T>\n  struct lazy_enable_if_c {\n    typedef typename T::type type;\n  };\n\n  template <class T>\n  struct lazy_enable_if_c<false, T> {};\n\n  template <class Cond, class T> \n  struct lazy_enable_if : public lazy_enable_if_c<Cond::value, T> {};\n\n\n  template <bool B, class T = void>\n  struct disable_if_c {\n    typedef T type;\n  };\n\n  template <class T>\n  struct disable_if_c<true, T> {};\n\n  template <class Cond, class T = void> \n  struct disable_if : public disable_if_c<Cond::value, T> {};\n\n  template <bool B, class T>\n  struct lazy_disable_if_c {\n    typedef typename T::type type;\n  };\n\n  template <class T>\n  struct lazy_disable_if_c<true, T> {};\n\n  template <class Cond, class T> \n  struct lazy_disable_if : public lazy_disable_if_c<Cond::value, T> {};\n\n} // namespace boost\n\n#else\n\nnamespace boost {\n\n  namespace detail { typedef void enable_if_default_T; }\n\n  template <typename T>\n  struct enable_if_does_not_work_on_this_compiler;\n\n  template<typename T, typename R=void>\n  struct enable_if_has_type : enable_if_does_not_work_on_this_compiler<T>\n  { };\n\n  template <bool B, class T = detail::enable_if_default_T>\n  struct enable_if_c : enable_if_does_not_work_on_this_compiler<T>\n  { };\n\n  template <bool B, class T = detail::enable_if_default_T> \n  struct disable_if_c : enable_if_does_not_work_on_this_compiler<T>\n  { };\n\n  template <bool B, class T = detail::enable_if_default_T> \n  struct lazy_enable_if_c : enable_if_does_not_work_on_this_compiler<T>\n  { };\n\n  template <bool B, class T = detail::enable_if_default_T> \n  struct lazy_disable_if_c : enable_if_does_not_work_on_this_compiler<T>\n  { };\n\n  template <class Cond, class T = detail::enable_if_default_T> \n  struct enable_if : enable_if_does_not_work_on_this_compiler<T>\n  { };\n\n  template <class Cond, class T = detail::enable_if_default_T> \n  struct disable_if : enable_if_does_not_work_on_this_compiler<T>\n  { };\n\n  template <class Cond, class T = detail::enable_if_default_T> \n  struct lazy_enable_if : enable_if_does_not_work_on_this_compiler<T>\n  { };\n\n  template <class Cond, class T = detail::enable_if_default_T> \n  struct lazy_disable_if : enable_if_does_not_work_on_this_compiler<T>\n  { };\n\n} // namespace boost\n\n#endif // BOOST_NO_SFINAE\n\n#endif\n"
  },
  {
    "path": "benchmarks/boost/core/noncopyable.hpp",
    "content": "//  Boost noncopyable.hpp header file  --------------------------------------//\n\n//  (C) Copyright Beman Dawes 1999-2003. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org/libs/utility for documentation.\n\n#ifndef BOOST_CORE_NONCOPYABLE_HPP\n#define BOOST_CORE_NONCOPYABLE_HPP\n\n#include <boost/config.hpp>\n\nnamespace boost {\n\n//  Private copy constructor and copy assignment ensure classes derived from\n//  class noncopyable cannot be copied.\n\n//  Contributed by Dave Abrahams\n\nnamespace noncopyable_  // protection from unintended ADL\n{\n  class noncopyable\n  {\n  protected:\n#if !defined(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS) && !defined(BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS)\n      BOOST_CONSTEXPR noncopyable() = default;\n      ~noncopyable() = default;\n#else\n      noncopyable() {}\n      ~noncopyable() {}\n#endif\n#if !defined(BOOST_NO_CXX11_DELETED_FUNCTIONS)\n      noncopyable( const noncopyable& ) = delete;\n      noncopyable& operator=( const noncopyable& ) = delete;\n#else\n  private:  // emphasize the following members are private\n      noncopyable( const noncopyable& );\n      noncopyable& operator=( const noncopyable& );\n#endif\n  };\n}\n\ntypedef noncopyable_::noncopyable noncopyable;\n\n} // namespace boost\n\n#endif  // BOOST_CORE_NONCOPYABLE_HPP\n"
  },
  {
    "path": "benchmarks/boost/core/swap.hpp",
    "content": "// Copyright (C) 2007, 2008 Steven Watanabe, Joseph Gauterin, Niels Dekker\n//\n// Distributed under the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n// For more information, see http://www.boost.org\n\n\n#ifndef BOOST_CORE_SWAP_HPP\n#define BOOST_CORE_SWAP_HPP\n\n// Note: the implementation of this utility contains various workarounds:\n// - swap_impl is put outside the boost namespace, to avoid infinite\n// recursion (causing stack overflow) when swapping objects of a primitive\n// type.\n// - swap_impl has a using-directive, rather than a using-declaration,\n// because some compilers (including MSVC 7.1, Borland 5.9.3, and\n// Intel 8.1) don't do argument-dependent lookup when it has a\n// using-declaration instead.\n// - boost::swap has two template arguments, instead of one, to\n// avoid ambiguity when swapping objects of a Boost type that does\n// not have its own boost::swap overload.\n\n#include <utility> //for std::swap (C++11)\n#include <algorithm> //for std::swap (C++98)\n#include <cstddef> //for std::size_t\n#include <boost/config.hpp>\n\nnamespace boost_swap_impl\n{\n  template<class T>\n  BOOST_GPU_ENABLED\n  void swap_impl(T& left, T& right)\n  {\n    using namespace std;//use std::swap if argument dependent lookup fails\n    swap(left,right);\n  }\n\n  template<class T, std::size_t N>\n  BOOST_GPU_ENABLED\n  void swap_impl(T (& left)[N], T (& right)[N])\n  {\n    for (std::size_t i = 0; i < N; ++i)\n    {\n      ::boost_swap_impl::swap_impl(left[i], right[i]);\n    }\n  }\n}\n\nnamespace boost\n{\n  template<class T1, class T2>\n  BOOST_GPU_ENABLED\n  void swap(T1& left, T2& right)\n  {\n    ::boost_swap_impl::swap_impl(left, right);\n  }\n}\n\n#endif\n"
  },
  {
    "path": "benchmarks/boost/cstdint.hpp",
    "content": "//  boost cstdint.hpp header file  ------------------------------------------//\n\n//  (C) Copyright Beman Dawes 1999.\n//  (C) Copyright Jens Mauer 2001\n//  (C) Copyright John Maddock 2001\n//  Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org/libs/integer for documentation.\n\n//  Revision History\n//   31 Oct 01  use BOOST_HAS_LONG_LONG to check for \"long long\" (Jens M.)\n//   16 Apr 01  check LONGLONG_MAX when looking for \"long long\" (Jens Maurer)\n//   23 Jan 01  prefer \"long\" over \"int\" for int32_t and intmax_t (Jens Maurer)\n//   12 Nov 00  Merged <boost/stdint.h> (Jens Maurer)\n//   23 Sep 00  Added INTXX_C macro support (John Maddock).\n//   22 Sep 00  Better 64-bit support (John Maddock)\n//   29 Jun 00  Reimplement to avoid including stdint.h within namespace boost\n//    8 Aug 99  Initial version (Beman Dawes)\n\n\n#ifndef BOOST_CSTDINT_HPP\n#define BOOST_CSTDINT_HPP\n\n//\n// Since we always define the INT#_C macros as per C++0x,\n// define __STDC_CONSTANT_MACROS so that <stdint.h> does the right\n// thing if possible, and so that the user knows that the macros\n// are actually defined as per C99.\n//\n#ifndef __STDC_CONSTANT_MACROS\n#  define __STDC_CONSTANT_MACROS\n#endif\n\n#include <boost/config.hpp>\n\n//\n// Note that GLIBC is a bit inconsistent about whether int64_t is defined or not\n// depending upon what headers happen to have been included first...\n// so we disable use of stdint.h when GLIBC does not define __GLIBC_HAVE_LONG_LONG.\n// See https://svn.boost.org/trac/boost/ticket/3548 and http://sources.redhat.com/bugzilla/show_bug.cgi?id=10990\n//\n#if defined(BOOST_HAS_STDINT_H)\t\t\t\t\t\\\n  && (!defined(__GLIBC__)\t\t\t\t\t\\\n      || defined(__GLIBC_HAVE_LONG_LONG)\t\t\t\\\n      || (defined(__GLIBC__) && ((__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 17)))))\n\n// The following #include is an implementation artifact; not part of interface.\n# ifdef __hpux\n// HP-UX has a vaguely nice <stdint.h> in a non-standard location\n#   include <inttypes.h>\n#   ifdef __STDC_32_MODE__\n      // this is triggered with GCC, because it defines __cplusplus < 199707L\n#     define BOOST_NO_INT64_T\n#   endif\n# elif defined(__FreeBSD__) || defined(__IBMCPP__) || defined(_AIX)\n#   include <inttypes.h>\n# else\n#   include <stdint.h>\n\n// There is a bug in Cygwin two _C macros\n#   if defined(__STDC_CONSTANT_MACROS) && defined(__CYGWIN__)\n#     undef INTMAX_C\n#     undef UINTMAX_C\n#     define INTMAX_C(c) c##LL\n#     define UINTMAX_C(c) c##ULL\n#   endif\n\n# endif\n\n#if defined(__QNX__) && defined(__EXT_QNX) \n\n// QNX (Dinkumware stdlib) defines these as non-standard names.\n// Reflect to the standard names.\n\ntypedef ::intleast8_t int_least8_t;\ntypedef ::intfast8_t int_fast8_t;\ntypedef ::uintleast8_t uint_least8_t;\ntypedef ::uintfast8_t uint_fast8_t;\n\ntypedef ::intleast16_t int_least16_t;\ntypedef ::intfast16_t int_fast16_t;\ntypedef ::uintleast16_t uint_least16_t;\ntypedef ::uintfast16_t uint_fast16_t;\n\ntypedef ::intleast32_t int_least32_t;\ntypedef ::intfast32_t int_fast32_t;\ntypedef ::uintleast32_t uint_least32_t;\ntypedef ::uintfast32_t uint_fast32_t;\n\n# ifndef BOOST_NO_INT64_T\n\ntypedef ::intleast64_t int_least64_t;\ntypedef ::intfast64_t int_fast64_t;\ntypedef ::uintleast64_t uint_least64_t;\ntypedef ::uintfast64_t uint_fast64_t;\n\n# endif\n\n#endif\n\nnamespace boost\n{\n\n  using ::int8_t;\n  using ::int_least8_t;\n  using ::int_fast8_t;\n  using ::uint8_t;\n  using ::uint_least8_t;\n  using ::uint_fast8_t;\n\n  using ::int16_t;\n  using ::int_least16_t;\n  using ::int_fast16_t;\n  using ::uint16_t;\n  using ::uint_least16_t;\n  using ::uint_fast16_t;\n\n  using ::int32_t;\n  using ::int_least32_t;\n  using ::int_fast32_t;\n  using ::uint32_t;\n  using ::uint_least32_t;\n  using ::uint_fast32_t;\n\n# ifndef BOOST_NO_INT64_T\n\n  using ::int64_t;\n  using ::int_least64_t;\n  using ::int_fast64_t;\n  using ::uint64_t;\n  using ::uint_least64_t;\n  using ::uint_fast64_t;\n\n# endif\n\n  using ::intmax_t;\n  using ::uintmax_t;\n\n} // namespace boost\n\n#elif defined(__FreeBSD__) && (__FreeBSD__ <= 4) || defined(__osf__) || defined(__VMS) || defined(__SOLARIS9__) || defined(__NetBSD__)\n// FreeBSD and Tru64 have an <inttypes.h> that contains much of what we need.\n# include <inttypes.h>\n\nnamespace boost {\n\n  using ::int8_t;\n  typedef int8_t int_least8_t;\n  typedef int8_t int_fast8_t;\n  using ::uint8_t;\n  typedef uint8_t uint_least8_t;\n  typedef uint8_t uint_fast8_t;\n\n  using ::int16_t;\n  typedef int16_t int_least16_t;\n  typedef int16_t int_fast16_t;\n  using ::uint16_t;\n  typedef uint16_t uint_least16_t;\n  typedef uint16_t uint_fast16_t;\n\n  using ::int32_t;\n  typedef int32_t int_least32_t;\n  typedef int32_t int_fast32_t;\n  using ::uint32_t;\n  typedef uint32_t uint_least32_t;\n  typedef uint32_t uint_fast32_t;\n\n# ifndef BOOST_NO_INT64_T\n\n  using ::int64_t;\n  typedef int64_t int_least64_t;\n  typedef int64_t int_fast64_t;\n  using ::uint64_t;\n  typedef uint64_t uint_least64_t;\n  typedef uint64_t uint_fast64_t;\n\n  typedef int64_t intmax_t;\n  typedef uint64_t uintmax_t;\n\n# else\n\n  typedef int32_t intmax_t;\n  typedef uint32_t uintmax_t;\n\n# endif\n\n} // namespace boost\n\n#else  // BOOST_HAS_STDINT_H\n\n# include <boost/limits.hpp> // implementation artifact; not part of interface\n# include <limits.h>         // needed for limits macros\n\n\nnamespace boost\n{\n\n//  These are fairly safe guesses for some 16-bit, and most 32-bit and 64-bit\n//  platforms.  For other systems, they will have to be hand tailored.\n//\n//  Because the fast types are assumed to be the same as the undecorated types,\n//  it may be possible to hand tailor a more efficient implementation.  Such\n//  an optimization may be illusionary; on the Intel x86-family 386 on, for\n//  example, byte arithmetic and load/stores are as fast as \"int\" sized ones.\n\n//  8-bit types  ------------------------------------------------------------//\n\n# if UCHAR_MAX == 0xff\n     typedef signed char     int8_t;\n     typedef signed char     int_least8_t;\n     typedef signed char     int_fast8_t;\n     typedef unsigned char   uint8_t;\n     typedef unsigned char   uint_least8_t;\n     typedef unsigned char   uint_fast8_t;\n# else\n#    error defaults not correct; you must hand modify boost/cstdint.hpp\n# endif\n\n//  16-bit types  -----------------------------------------------------------//\n\n# if USHRT_MAX == 0xffff\n#  if defined(__crayx1)\n     // The Cray X1 has a 16-bit short, however it is not recommend\n     // for use in performance critical code.\n     typedef short           int16_t;\n     typedef short           int_least16_t;\n     typedef int             int_fast16_t;\n     typedef unsigned short  uint16_t;\n     typedef unsigned short  uint_least16_t;\n     typedef unsigned int    uint_fast16_t;\n#  else\n     typedef short           int16_t;\n     typedef short           int_least16_t;\n     typedef short           int_fast16_t;\n     typedef unsigned short  uint16_t;\n     typedef unsigned short  uint_least16_t;\n     typedef unsigned short  uint_fast16_t;\n#  endif\n# elif (USHRT_MAX == 0xffffffff) && defined(__MTA__)\n      // On MTA / XMT short is 32 bits unless the -short16 compiler flag is specified\n      // MTA / XMT does support the following non-standard integer types\n      typedef __short16           int16_t;\n      typedef __short16           int_least16_t;\n      typedef __short16           int_fast16_t;\n      typedef unsigned __short16  uint16_t;\n      typedef unsigned __short16  uint_least16_t;\n      typedef unsigned __short16  uint_fast16_t;\n# elif (USHRT_MAX == 0xffffffff) && defined(CRAY)\n     // no 16-bit types on Cray:\n     typedef short           int_least16_t;\n     typedef short           int_fast16_t;\n     typedef unsigned short  uint_least16_t;\n     typedef unsigned short  uint_fast16_t;\n# else\n#    error defaults not correct; you must hand modify boost/cstdint.hpp\n# endif\n\n//  32-bit types  -----------------------------------------------------------//\n\n# if UINT_MAX == 0xffffffff\n     typedef int             int32_t;\n     typedef int             int_least32_t;\n     typedef int             int_fast32_t;\n     typedef unsigned int    uint32_t;\n     typedef unsigned int    uint_least32_t;\n     typedef unsigned int    uint_fast32_t;\n# elif (USHRT_MAX == 0xffffffff)\n     typedef short             int32_t;\n     typedef short             int_least32_t;\n     typedef short             int_fast32_t;\n     typedef unsigned short    uint32_t;\n     typedef unsigned short    uint_least32_t;\n     typedef unsigned short    uint_fast32_t;\n# elif ULONG_MAX == 0xffffffff\n     typedef long            int32_t;\n     typedef long            int_least32_t;\n     typedef long            int_fast32_t;\n     typedef unsigned long   uint32_t;\n     typedef unsigned long   uint_least32_t;\n     typedef unsigned long   uint_fast32_t;\n# elif (UINT_MAX == 0xffffffffffffffff) && defined(__MTA__)\n      // Integers are 64 bits on the MTA / XMT\n      typedef __int32           int32_t;\n      typedef __int32           int_least32_t;\n      typedef __int32           int_fast32_t;\n      typedef unsigned __int32  uint32_t;\n      typedef unsigned __int32  uint_least32_t;\n      typedef unsigned __int32  uint_fast32_t;\n# else\n#    error defaults not correct; you must hand modify boost/cstdint.hpp\n# endif\n\n//  64-bit types + intmax_t and uintmax_t  ----------------------------------//\n\n# if defined(BOOST_HAS_LONG_LONG) && \\\n   !defined(BOOST_MSVC) && !defined(__BORLANDC__) && \\\n   (!defined(__GLIBCPP__) || defined(_GLIBCPP_USE_LONG_LONG)) && \\\n   (defined(ULLONG_MAX) || defined(ULONG_LONG_MAX) || defined(ULONGLONG_MAX))\n#    if defined(__hpux)\n     // HP-UX's value of ULONG_LONG_MAX is unusable in preprocessor expressions\n#    elif (defined(ULLONG_MAX) && ULLONG_MAX == 18446744073709551615ULL) || (defined(ULONG_LONG_MAX) && ULONG_LONG_MAX == 18446744073709551615ULL) || (defined(ULONGLONG_MAX) && ULONGLONG_MAX == 18446744073709551615ULL)\n                                                                 // 2**64 - 1\n#    else\n#       error defaults not correct; you must hand modify boost/cstdint.hpp\n#    endif\n\n     typedef  ::boost::long_long_type            intmax_t;\n     typedef  ::boost::ulong_long_type   uintmax_t;\n     typedef  ::boost::long_long_type            int64_t;\n     typedef  ::boost::long_long_type            int_least64_t;\n     typedef  ::boost::long_long_type            int_fast64_t;\n     typedef  ::boost::ulong_long_type   uint64_t;\n     typedef  ::boost::ulong_long_type   uint_least64_t;\n     typedef  ::boost::ulong_long_type   uint_fast64_t;\n\n# elif ULONG_MAX != 0xffffffff\n\n#    if ULONG_MAX == 18446744073709551615 // 2**64 - 1\n     typedef long                 intmax_t;\n     typedef unsigned long        uintmax_t;\n     typedef long                 int64_t;\n     typedef long                 int_least64_t;\n     typedef long                 int_fast64_t;\n     typedef unsigned long        uint64_t;\n     typedef unsigned long        uint_least64_t;\n     typedef unsigned long        uint_fast64_t;\n#    else\n#       error defaults not correct; you must hand modify boost/cstdint.hpp\n#    endif\n# elif defined(__GNUC__) && defined(BOOST_HAS_LONG_LONG)\n     __extension__ typedef long long            intmax_t;\n     __extension__ typedef unsigned long long   uintmax_t;\n     __extension__ typedef long long            int64_t;\n     __extension__ typedef long long            int_least64_t;\n     __extension__ typedef long long            int_fast64_t;\n     __extension__ typedef unsigned long long   uint64_t;\n     __extension__ typedef unsigned long long   uint_least64_t;\n     __extension__ typedef unsigned long long   uint_fast64_t;\n# elif defined(BOOST_HAS_MS_INT64)\n     //\n     // we have Borland/Intel/Microsoft __int64:\n     //\n     typedef __int64             intmax_t;\n     typedef unsigned __int64    uintmax_t;\n     typedef __int64             int64_t;\n     typedef __int64             int_least64_t;\n     typedef __int64             int_fast64_t;\n     typedef unsigned __int64    uint64_t;\n     typedef unsigned __int64    uint_least64_t;\n     typedef unsigned __int64    uint_fast64_t;\n# else // assume no 64-bit integers\n#  define BOOST_NO_INT64_T\n     typedef int32_t              intmax_t;\n     typedef uint32_t             uintmax_t;\n# endif\n\n} // namespace boost\n\n\n#endif // BOOST_HAS_STDINT_H\n\n// intptr_t/uintptr_t are defined separately because they are optional and not universally available\n#if defined(BOOST_WINDOWS) && !defined(_WIN32_WCE) && !defined(BOOST_HAS_STDINT_H)\n// Older MSVC don't have stdint.h and have intptr_t/uintptr_t defined in stddef.h\n#include <stddef.h>\n#endif\n\n// PGI seems to not support intptr_t/uintptr_t properly. BOOST_HAS_STDINT_H is not defined for this compiler by Boost.Config.\n#if !defined(__PGIC__)\n\n#if (defined(BOOST_WINDOWS) && !defined(_WIN32_WCE)) \\\n    || (defined(_XOPEN_UNIX) && (_XOPEN_UNIX+0 > 0) && !defined(__UCLIBC__)) \\\n    || defined(__CYGWIN__) \\\n    || defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) \\\n    || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(sun)\n\nnamespace boost {\n    using ::intptr_t;\n    using ::uintptr_t;\n}\n#define BOOST_HAS_INTPTR_T\n\n// Clang pretends to be GCC, so it'll match this condition\n#elif defined(__GNUC__) && defined(__INTPTR_TYPE__) && defined(__UINTPTR_TYPE__)\n\nnamespace boost {\n    typedef __INTPTR_TYPE__ intptr_t;\n    typedef __UINTPTR_TYPE__ uintptr_t;\n}\n#define BOOST_HAS_INTPTR_T\n\n#endif\n\n#endif // !defined(__PGIC__)\n\n#endif // BOOST_CSTDINT_HPP\n\n\n/****************************************************\n\nMacro definition section:\n\nAdded 23rd September 2000 (John Maddock).\nModified 11th September 2001 to be excluded when\nBOOST_HAS_STDINT_H is defined (John Maddock).\nModified 11th Dec 2009 to always define the\nINT#_C macros if they're not already defined (John Maddock).\n\n******************************************************/\n\n#if !defined(BOOST__STDC_CONSTANT_MACROS_DEFINED) && \\\n   (!defined(INT8_C) || !defined(INT16_C) || !defined(INT32_C) || !defined(INT64_C))\n//\n// For the following code we get several warnings along the lines of:\n//\n// boost/cstdint.hpp:428:35: error: use of C99 long long integer constant\n//\n// So we declare this a system header to suppress these warnings.\n//\n#if defined(__GNUC__) && (__GNUC__ >= 4)\n#pragma GCC system_header\n#endif\n\n#include <limits.h>\n# define BOOST__STDC_CONSTANT_MACROS_DEFINED\n# if defined(BOOST_HAS_MS_INT64)\n//\n// Borland/Intel/Microsoft compilers have width specific suffixes:\n//\n#ifndef INT8_C\n#  define INT8_C(value)     value##i8\n#endif\n#ifndef INT16_C\n#  define INT16_C(value)    value##i16\n#endif\n#ifndef INT32_C\n#  define INT32_C(value)    value##i32\n#endif\n#ifndef INT64_C\n#  define INT64_C(value)    value##i64\n#endif\n#  ifdef __BORLANDC__\n    // Borland bug: appending ui8 makes the type a signed char\n#   define UINT8_C(value)    static_cast<unsigned char>(value##u)\n#  else\n#   define UINT8_C(value)    value##ui8\n#  endif\n#ifndef UINT16_C\n#  define UINT16_C(value)   value##ui16\n#endif\n#ifndef UINT32_C\n#  define UINT32_C(value)   value##ui32\n#endif\n#ifndef UINT64_C\n#  define UINT64_C(value)   value##ui64\n#endif\n#ifndef INTMAX_C\n#  define INTMAX_C(value)   value##i64\n#  define UINTMAX_C(value)  value##ui64\n#endif\n\n# else\n//  do it the old fashioned way:\n\n//  8-bit types  ------------------------------------------------------------//\n\n#  if (UCHAR_MAX == 0xff) && !defined(INT8_C)\n#   define INT8_C(value) static_cast<boost::int8_t>(value)\n#   define UINT8_C(value) static_cast<boost::uint8_t>(value##u)\n#  endif\n\n//  16-bit types  -----------------------------------------------------------//\n\n#  if (USHRT_MAX == 0xffff) && !defined(INT16_C)\n#   define INT16_C(value) static_cast<boost::int16_t>(value)\n#   define UINT16_C(value) static_cast<boost::uint16_t>(value##u)\n#  endif\n\n//  32-bit types  -----------------------------------------------------------//\n#ifndef INT32_C\n#  if (UINT_MAX == 0xffffffff)\n#   define INT32_C(value) value\n#   define UINT32_C(value) value##u\n#  elif ULONG_MAX == 0xffffffff\n#   define INT32_C(value) value##L\n#   define UINT32_C(value) value##uL\n#  endif\n#endif\n\n//  64-bit types + intmax_t and uintmax_t  ----------------------------------//\n#ifndef INT64_C\n#  if defined(BOOST_HAS_LONG_LONG) && \\\n    (defined(ULLONG_MAX) || defined(ULONG_LONG_MAX) || defined(ULONGLONG_MAX) || defined(_ULLONG_MAX) || defined(_LLONG_MAX))\n\n#    if defined(__hpux)\n        // HP-UX's value of ULONG_LONG_MAX is unusable in preprocessor expressions\n#       define INT64_C(value) value##LL\n#       define UINT64_C(value) value##uLL\n#    elif (defined(ULLONG_MAX) && ULLONG_MAX == 18446744073709551615ULL) ||  \\\n        (defined(ULONG_LONG_MAX) && ULONG_LONG_MAX == 18446744073709551615ULL) ||  \\\n        (defined(ULONGLONG_MAX) && ULONGLONG_MAX == 18446744073709551615ULL) || \\\n        (defined(_ULLONG_MAX) && _ULLONG_MAX == 18446744073709551615ULL) || \\\n        (defined(_LLONG_MAX) && _LLONG_MAX == 9223372036854775807LL)\n\n#       define INT64_C(value) value##LL\n#       define UINT64_C(value) value##uLL\n#    else\n#       error defaults not correct; you must hand modify boost/cstdint.hpp\n#    endif\n#  elif ULONG_MAX != 0xffffffff\n\n#    if ULONG_MAX == 18446744073709551615U // 2**64 - 1\n#       define INT64_C(value) value##L\n#       define UINT64_C(value) value##uL\n#    else\n#       error defaults not correct; you must hand modify boost/cstdint.hpp\n#    endif\n#  elif defined(BOOST_HAS_LONG_LONG)\n     // Usual macros not defined, work things out for ourselves:\n#    if(~0uLL == 18446744073709551615ULL)\n#       define INT64_C(value) value##LL\n#       define UINT64_C(value) value##uLL\n#    else\n#       error defaults not correct; you must hand modify boost/cstdint.hpp\n#    endif\n#  else\n#    error defaults not correct; you must hand modify boost/cstdint.hpp\n#  endif\n\n#  ifdef BOOST_NO_INT64_T\n#   define INTMAX_C(value) INT32_C(value)\n#   define UINTMAX_C(value) UINT32_C(value)\n#  else\n#   define INTMAX_C(value) INT64_C(value)\n#   define UINTMAX_C(value) UINT64_C(value)\n#  endif\n#endif\n# endif // Borland/Microsoft specific width suffixes\n\n#endif // INT#_C macros.\n\n\n\n\n"
  },
  {
    "path": "benchmarks/boost/current_function.hpp",
    "content": "#ifndef BOOST_CURRENT_FUNCTION_HPP_INCLUDED\n#define BOOST_CURRENT_FUNCTION_HPP_INCLUDED\n\n// MS compatible compilers support #pragma once\n\n#if defined(_MSC_VER) && (_MSC_VER >= 1020)\n# pragma once\n#endif\n\n//\n//  boost/current_function.hpp - BOOST_CURRENT_FUNCTION\n//\n//  Copyright (c) 2002 Peter Dimov and Multi Media Ltd.\n//\n//  Distributed under the Boost Software License, Version 1.0.\n//  See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt\n//\n//  http://www.boost.org/libs/assert/current_function.html\n//\n\nnamespace boost\n{\n\nnamespace detail\n{\n\ninline void current_function_helper()\n{\n\n#if defined(__GNUC__) || (defined(__MWERKS__) && (__MWERKS__ >= 0x3000)) || (defined(__ICC) && (__ICC >= 600)) || defined(__ghs__)\n\n# define BOOST_CURRENT_FUNCTION __PRETTY_FUNCTION__\n\n#elif defined(__DMC__) && (__DMC__ >= 0x810)\n\n# define BOOST_CURRENT_FUNCTION __PRETTY_FUNCTION__\n\n#elif defined(__FUNCSIG__)\n\n# define BOOST_CURRENT_FUNCTION __FUNCSIG__\n\n#elif (defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 600)) || (defined(__IBMCPP__) && (__IBMCPP__ >= 500))\n\n# define BOOST_CURRENT_FUNCTION __FUNCTION__\n\n#elif defined(__BORLANDC__) && (__BORLANDC__ >= 0x550)\n\n# define BOOST_CURRENT_FUNCTION __FUNC__\n\n#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901)\n\n# define BOOST_CURRENT_FUNCTION __func__\n\n#elif defined(__cplusplus) && (__cplusplus >= 201103)\n\n# define BOOST_CURRENT_FUNCTION __func__\n\n#else\n\n# define BOOST_CURRENT_FUNCTION \"(unknown)\"\n\n#endif\n\n}\n\n} // namespace detail\n\n} // namespace boost\n\n#endif // #ifndef BOOST_CURRENT_FUNCTION_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/detail/is_xxx.hpp",
    "content": "// Copyright David Abrahams 2005. Distributed under the Boost\n// Software License, Version 1.0. (See accompanying\n// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n#ifndef BOOST_DETAIL_IS_XXX_DWA20051011_HPP\n# define BOOST_DETAIL_IS_XXX_DWA20051011_HPP\n\n# include <boost/config.hpp>\n# include <boost/mpl/bool.hpp>\n# include <boost/preprocessor/enum_params.hpp>\n\n\n#  define BOOST_DETAIL_IS_XXX_DEF(name, qualified_name, nargs)  \\\ntemplate <class T>                                              \\\nstruct is_##name : mpl::false_                                  \\\n{                                                               \\\n};                                                              \\\n                                                                \\\ntemplate < BOOST_PP_ENUM_PARAMS_Z(1, nargs, class T) >          \\\nstruct is_##name<                                               \\\n   qualified_name< BOOST_PP_ENUM_PARAMS_Z(1, nargs, T) >        \\\n>                                                               \\\n   : mpl::true_                                                 \\\n{                                                               \\\n};\n\n\n#endif // BOOST_DETAIL_IS_XXX_DWA20051011_HPP\n"
  },
  {
    "path": "benchmarks/boost/detail/iterator.hpp",
    "content": "// (C) Copyright David Abrahams 2002.\n// Distributed under the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef ITERATOR_DWA122600_HPP_\n#define ITERATOR_DWA122600_HPP_\n\n// This header is obsolete and will be deprecated.\n\n#include <iterator>\n\nnamespace boost\n{\n\nnamespace detail\n{\n\nusing std::iterator_traits;\nusing std::distance;\n\n} // namespace detail\n\n} // namespace boost\n\n#endif // ITERATOR_DWA122600_HPP_\n"
  },
  {
    "path": "benchmarks/boost/detail/workaround.hpp",
    "content": "// Copyright David Abrahams 2002.\n// Distributed under the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n#ifndef WORKAROUND_DWA2002126_HPP\n# define WORKAROUND_DWA2002126_HPP\n\n// Compiler/library version workaround macro\n//\n// Usage:\n//\n//     #if BOOST_WORKAROUND(BOOST_MSVC, < 1300)\n//        // workaround for eVC4 and VC6\n//        ... // workaround code here\n//     #endif\n//\n// When BOOST_STRICT_CONFIG is defined, expands to 0. Otherwise, the\n// first argument must be undefined or expand to a numeric\n// value. The above expands to:\n//\n//     (BOOST_MSVC) != 0 && (BOOST_MSVC) < 1300\n//\n// When used for workarounds that apply to the latest known version \n// and all earlier versions of a compiler, the following convention \n// should be observed:\n//\n//     #if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1301))\n//\n// The version number in this case corresponds to the last version in\n// which the workaround was known to have been required. When\n// BOOST_DETECT_OUTDATED_WORKAROUNDS is not the defined, the macro\n// BOOST_TESTED_AT(x) expands to \"!= 0\", which effectively activates\n// the workaround for any version of the compiler. When\n// BOOST_DETECT_OUTDATED_WORKAROUNDS is defined, a compiler warning or\n// error will be issued if the compiler version exceeds the argument\n// to BOOST_TESTED_AT().  This can be used to locate workarounds which\n// may be obsoleted by newer versions.\n\n# ifndef BOOST_STRICT_CONFIG\n\n#include <boost/config.hpp>\n\n#ifndef __BORLANDC__\n#define __BORLANDC___WORKAROUND_GUARD 1\n#else\n#define __BORLANDC___WORKAROUND_GUARD 0\n#endif\n#ifndef __CODEGEARC__\n#define __CODEGEARC___WORKAROUND_GUARD 1\n#else\n#define __CODEGEARC___WORKAROUND_GUARD 0\n#endif\n#ifndef _MSC_VER\n#define _MSC_VER_WORKAROUND_GUARD 1\n#else\n#define _MSC_VER_WORKAROUND_GUARD 0\n#endif\n#ifndef _MSC_FULL_VER\n#define _MSC_FULL_VER_WORKAROUND_GUARD 1\n#else\n#define _MSC_FULL_VER_WORKAROUND_GUARD 0\n#endif\n#ifndef BOOST_MSVC\n#define BOOST_MSVC_WORKAROUND_GUARD 1\n#else\n#define BOOST_MSVC_WORKAROUND_GUARD 0\n#endif\n#ifndef BOOST_MSVC_FULL_VER\n#define BOOST_MSVC_FULL_VER_WORKAROUND_GUARD 1\n#else\n#define BOOST_MSVC_FULL_VER_WORKAROUND_GUARD 0\n#endif\n#ifndef __GNUC__\n#define __GNUC___WORKAROUND_GUARD 1\n#else\n#define __GNUC___WORKAROUND_GUARD 0\n#endif\n#ifndef __GNUC_MINOR__\n#define __GNUC_MINOR___WORKAROUND_GUARD 1\n#else\n#define __GNUC_MINOR___WORKAROUND_GUARD 0\n#endif\n#ifndef __GNUC_PATCHLEVEL__\n#define __GNUC_PATCHLEVEL___WORKAROUND_GUARD 1\n#else\n#define __GNUC_PATCHLEVEL___WORKAROUND_GUARD 0\n#endif\n#ifndef __IBMCPP__\n#define __IBMCPP___WORKAROUND_GUARD 1\n#else\n#define __IBMCPP___WORKAROUND_GUARD 0\n#endif\n#ifndef __SUNPRO_CC\n#define __SUNPRO_CC_WORKAROUND_GUARD 1\n#else\n#define __SUNPRO_CC_WORKAROUND_GUARD 0\n#endif\n#ifndef __DECCXX_VER\n#define __DECCXX_VER_WORKAROUND_GUARD 1\n#else\n#define __DECCXX_VER_WORKAROUND_GUARD 0\n#endif\n#ifndef __MWERKS__\n#define __MWERKS___WORKAROUND_GUARD 1\n#else\n#define __MWERKS___WORKAROUND_GUARD 0\n#endif\n#ifndef __EDG__\n#define __EDG___WORKAROUND_GUARD 1\n#else\n#define __EDG___WORKAROUND_GUARD 0\n#endif\n#ifndef __EDG_VERSION__\n#define __EDG_VERSION___WORKAROUND_GUARD 1\n#else\n#define __EDG_VERSION___WORKAROUND_GUARD 0\n#endif\n#ifndef __HP_aCC\n#define __HP_aCC_WORKAROUND_GUARD 1\n#else\n#define __HP_aCC_WORKAROUND_GUARD 0\n#endif\n#ifndef __hpxstd98\n#define __hpxstd98_WORKAROUND_GUARD 1\n#else\n#define __hpxstd98_WORKAROUND_GUARD 0\n#endif\n#ifndef _CRAYC\n#define _CRAYC_WORKAROUND_GUARD 1\n#else\n#define _CRAYC_WORKAROUND_GUARD 0\n#endif\n#ifndef __DMC__\n#define __DMC___WORKAROUND_GUARD 1\n#else\n#define __DMC___WORKAROUND_GUARD 0\n#endif\n#ifndef MPW_CPLUS\n#define MPW_CPLUS_WORKAROUND_GUARD 1\n#else\n#define MPW_CPLUS_WORKAROUND_GUARD 0\n#endif\n#ifndef __COMO__\n#define __COMO___WORKAROUND_GUARD 1\n#else\n#define __COMO___WORKAROUND_GUARD 0\n#endif\n#ifndef __COMO_VERSION__\n#define __COMO_VERSION___WORKAROUND_GUARD 1\n#else\n#define __COMO_VERSION___WORKAROUND_GUARD 0\n#endif\n#ifndef __INTEL_COMPILER\n#define __INTEL_COMPILER_WORKAROUND_GUARD 1\n#else\n#define __INTEL_COMPILER_WORKAROUND_GUARD 0\n#endif\n#ifndef __ICL\n#define __ICL_WORKAROUND_GUARD 1\n#else\n#define __ICL_WORKAROUND_GUARD 0\n#endif\n#ifndef _COMPILER_VERSION\n#define _COMPILER_VERSION_WORKAROUND_GUARD 1\n#else\n#define _COMPILER_VERSION_WORKAROUND_GUARD 0\n#endif\n\n#ifndef _RWSTD_VER\n#define _RWSTD_VER_WORKAROUND_GUARD 1\n#else\n#define _RWSTD_VER_WORKAROUND_GUARD 0\n#endif\n#ifndef BOOST_RWSTD_VER\n#define BOOST_RWSTD_VER_WORKAROUND_GUARD 1\n#else\n#define BOOST_RWSTD_VER_WORKAROUND_GUARD 0\n#endif\n#ifndef __GLIBCPP__\n#define __GLIBCPP___WORKAROUND_GUARD 1\n#else\n#define __GLIBCPP___WORKAROUND_GUARD 0\n#endif\n#ifndef _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC\n#define _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC_WORKAROUND_GUARD 1\n#else\n#define _GLIBCXX_USE_C99_FP_MACROS_DYNAMIC_WORKAROUND_GUARD 0\n#endif\n#ifndef __SGI_STL_PORT\n#define __SGI_STL_PORT_WORKAROUND_GUARD 1\n#else\n#define __SGI_STL_PORT_WORKAROUND_GUARD 0\n#endif\n#ifndef _STLPORT_VERSION\n#define _STLPORT_VERSION_WORKAROUND_GUARD 1\n#else\n#define _STLPORT_VERSION_WORKAROUND_GUARD 0\n#endif\n#ifndef __LIBCOMO_VERSION__\n#define __LIBCOMO_VERSION___WORKAROUND_GUARD 1\n#else\n#define __LIBCOMO_VERSION___WORKAROUND_GUARD 0\n#endif\n#ifndef _CPPLIB_VER\n#define _CPPLIB_VER_WORKAROUND_GUARD 1\n#else\n#define _CPPLIB_VER_WORKAROUND_GUARD 0\n#endif\n\n#ifndef BOOST_INTEL_CXX_VERSION\n#define BOOST_INTEL_CXX_VERSION_WORKAROUND_GUARD 1\n#else\n#define BOOST_INTEL_CXX_VERSION_WORKAROUND_GUARD 0\n#endif\n#ifndef BOOST_INTEL_WIN\n#define BOOST_INTEL_WIN_WORKAROUND_GUARD 1\n#else\n#define BOOST_INTEL_WIN_WORKAROUND_GUARD 0\n#endif\n#ifndef BOOST_DINKUMWARE_STDLIB\n#define BOOST_DINKUMWARE_STDLIB_WORKAROUND_GUARD 1\n#else\n#define BOOST_DINKUMWARE_STDLIB_WORKAROUND_GUARD 0\n#endif\n#ifndef BOOST_INTEL\n#define BOOST_INTEL_WORKAROUND_GUARD 1\n#else\n#define BOOST_INTEL_WORKAROUND_GUARD 0\n#endif\n// Always define to zero, if it's used it'll be defined my MPL:\n#define BOOST_MPL_CFG_GCC_WORKAROUND_GUARD 0\n\n#  define BOOST_WORKAROUND(symbol, test)                \\\n         ((symbol ## _WORKAROUND_GUARD + 0 == 0) &&     \\\n         (symbol != 0) && (1 % (( (symbol test) ) + 1)))\n//                              ^ ^           ^ ^\n// The extra level of parenthesis nesting above, along with the\n// BOOST_OPEN_PAREN indirection below, is required to satisfy the\n// broken preprocessor in MWCW 8.3 and earlier.\n//\n// The basic mechanism works as follows:\n//      (symbol test) + 1        =>   if (symbol test) then 2 else 1\n//      1 % ((symbol test) + 1)  =>   if (symbol test) then 1 else 0\n//\n// The complication with % is for cooperation with BOOST_TESTED_AT().\n// When \"test\" is BOOST_TESTED_AT(x) and\n// BOOST_DETECT_OUTDATED_WORKAROUNDS is #defined,\n//\n//      symbol test              =>   if (symbol <= x) then 1 else -1\n//      (symbol test) + 1        =>   if (symbol <= x) then 2 else 0\n//      1 % ((symbol test) + 1)  =>   if (symbol <= x) then 1 else divide-by-zero\n//\n\n#  ifdef BOOST_DETECT_OUTDATED_WORKAROUNDS\n#   define BOOST_OPEN_PAREN (\n#   define BOOST_TESTED_AT(value)  > value) ?(-1): BOOST_OPEN_PAREN 1\n#  else\n#   define BOOST_TESTED_AT(value) != ((value)-(value))\n#  endif\n\n# else\n\n#  define BOOST_WORKAROUND(symbol, test) 0\n\n# endif \n\n#endif // WORKAROUND_DWA2002126_HPP\n"
  },
  {
    "path": "benchmarks/boost/exception/exception.hpp",
    "content": "//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.\n\n//Distributed under the Boost Software License, Version 1.0. (See accompanying\n//file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef UUID_274DA366004E11DCB1DDFE2E56D89593\n#define UUID_274DA366004E11DCB1DDFE2E56D89593\n#if (__GNUC__*100+__GNUC_MINOR__>301) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)\n#pragma GCC system_header\n#endif\n#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)\n#pragma warning(push,1)\n#endif\n\nnamespace\nboost\n    {\n    namespace\n    exception_detail\n        {\n        template <class T>\n        class\n        refcount_ptr\n            {\n            public:\n\n            refcount_ptr():\n                px_(0)\n                {\n                }\n\n            ~refcount_ptr()\n                {\n                release();\n                }\n\n            refcount_ptr( refcount_ptr const & x ):\n                px_(x.px_)\n                {\n                add_ref();\n                }\n\n            refcount_ptr &\n            operator=( refcount_ptr const & x )\n                {\n                adopt(x.px_);\n                return *this;\n                }\n\n            void\n            adopt( T * px )\n                {\n                release();\n                px_=px;\n                add_ref();\n                }\n\n            T *\n            get() const\n                {\n                return px_;\n                }\n\n            private:\n\n            T * px_;\n\n            void\n            add_ref()\n                {\n                if( px_ )\n                    px_->add_ref();\n                }\n\n            void\n            release()\n                {\n                if( px_ && px_->release() )\n                    px_=0;\n                }\n            };\n        }\n\n    ////////////////////////////////////////////////////////////////////////\n\n    template <class Tag,class T>\n    class error_info;\n\n    typedef error_info<struct throw_function_,char const *> throw_function;\n    typedef error_info<struct throw_file_,char const *> throw_file;\n    typedef error_info<struct throw_line_,int> throw_line;\n\n    template <>\n    class\n    error_info<throw_function_,char const *>\n        {\n        public:\n        typedef char const * value_type;\n        value_type v_;\n        explicit\n        error_info( value_type v ):\n            v_(v)\n            {\n            }\n        };\n\n    template <>\n    class\n    error_info<throw_file_,char const *>\n        {\n        public:\n        typedef char const * value_type;\n        value_type v_;\n        explicit\n        error_info( value_type v ):\n            v_(v)\n            {\n            }\n        };\n\n    template <>\n    class\n    error_info<throw_line_,int>\n        {\n        public:\n        typedef int value_type;\n        value_type v_;\n        explicit\n        error_info( value_type v ):\n            v_(v)\n            {\n            }\n        };\n\n#if defined(__GNUC__)\n# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)\n#  pragma GCC visibility push (default)\n# endif\n#endif\n    class exception;\n#if defined(__GNUC__)\n# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)\n#  pragma GCC visibility pop\n# endif\n#endif\n\n    template <class T>\n    class shared_ptr;\n\n    namespace\n    exception_detail\n        {\n        class error_info_base;\n        struct type_info_;\n\n        struct\n        error_info_container\n            {\n            virtual char const * diagnostic_information( char const * ) const = 0;\n            virtual shared_ptr<error_info_base> get( type_info_ const & ) const = 0;\n            virtual void set( shared_ptr<error_info_base> const &, type_info_ const & ) = 0;\n            virtual void add_ref() const = 0;\n            virtual bool release() const = 0;\n            virtual refcount_ptr<exception_detail::error_info_container> clone() const = 0;\n\n            protected:\n\n            ~error_info_container() throw()\n                {\n                }\n            };\n\n        template <class>\n        struct get_info;\n\n        template <>\n        struct get_info<throw_function>;\n\n        template <>\n        struct get_info<throw_file>;\n\n        template <>\n        struct get_info<throw_line>;\n\n        char const * get_diagnostic_information( exception const &, char const * );\n\n        void copy_boost_exception( exception *, exception const * );\n\n        template <class E,class Tag,class T>\n        E const & set_info( E const &, error_info<Tag,T> const & );\n\n        template <class E>\n        E const & set_info( E const &, throw_function const & );\n\n        template <class E>\n        E const & set_info( E const &, throw_file const & );\n\n        template <class E>\n        E const & set_info( E const &, throw_line const & );\n        }\n\n#if defined(__GNUC__)\n# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)\n#  pragma GCC visibility push (default)\n# endif\n#endif\n    class\n    exception\n        {\n        //<N3757>\n        public:\n        template <class Tag> void set( typename Tag::type const & );\n        template <class Tag> typename Tag::type const * get() const;\n        //</N3757>\n\n        protected:\n\n        exception():\n            throw_function_(0),\n            throw_file_(0),\n            throw_line_(-1)\n            {\n            }\n\n#ifdef __HP_aCC\n        //On HP aCC, this protected copy constructor prevents throwing boost::exception.\n        //On all other platforms, the same effect is achieved by the pure virtual destructor.\n        exception( exception const & x ) throw():\n            data_(x.data_),\n            throw_function_(x.throw_function_),\n            throw_file_(x.throw_file_),\n            throw_line_(x.throw_line_)\n            {\n            }\n#endif\n\n        virtual ~exception() throw()\n#ifndef __HP_aCC\n            = 0 //Workaround for HP aCC, =0 incorrectly leads to link errors.\n#endif\n            ;\n\n#if (defined(__MWERKS__) && __MWERKS__<=0x3207) || (defined(_MSC_VER) && _MSC_VER<=1310)\n        public:\n#else\n        private:\n\n        template <class E>\n        friend E const & exception_detail::set_info( E const &, throw_function const & );\n\n        template <class E>\n        friend E const & exception_detail::set_info( E const &, throw_file const & );\n\n        template <class E>\n        friend E const & exception_detail::set_info( E const &, throw_line const & );\n\n        template <class E,class Tag,class T>\n        friend E const & exception_detail::set_info( E const &, error_info<Tag,T> const & );\n\n        friend char const * exception_detail::get_diagnostic_information( exception const &, char const * );\n\n        template <class>\n        friend struct exception_detail::get_info;\n        friend struct exception_detail::get_info<throw_function>;\n        friend struct exception_detail::get_info<throw_file>;\n        friend struct exception_detail::get_info<throw_line>;\n        friend void exception_detail::copy_boost_exception( exception *, exception const * );\n#endif\n        mutable exception_detail::refcount_ptr<exception_detail::error_info_container> data_;\n        mutable char const * throw_function_;\n        mutable char const * throw_file_;\n        mutable int throw_line_;\n        };\n#if defined(__GNUC__)\n# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)\n#  pragma GCC visibility pop\n# endif\n#endif\n\n    inline\n    exception::\n    ~exception() throw()\n        {\n        }\n\n    namespace\n    exception_detail\n        {\n        template <class E>\n        E const &\n        set_info( E const & x, throw_function const & y )\n            {\n            x.throw_function_=y.v_;\n            return x;\n            }\n\n        template <class E>\n        E const &\n        set_info( E const & x, throw_file const & y )\n            {\n            x.throw_file_=y.v_;\n            return x;\n            }\n\n        template <class E>\n        E const &\n        set_info( E const & x, throw_line const & y )\n            {\n            x.throw_line_=y.v_;\n            return x;\n            }\n        }\n\n    ////////////////////////////////////////////////////////////////////////\n\n    namespace\n    exception_detail\n        {\n#if defined(__GNUC__)\n# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)\n#  pragma GCC visibility push (default)\n# endif\n#endif\n        template <class T>\n        struct\n        error_info_injector:\n            public T,\n            public exception\n            {\n            explicit\n            error_info_injector( T const & x ):\n                T(x)\n                {\n                }\n\n            ~error_info_injector() throw()\n                {\n                }\n            };\n#if defined(__GNUC__)\n# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)\n#  pragma GCC visibility pop\n# endif\n#endif\n\n        struct large_size { char c[256]; };\n        large_size dispatch_boost_exception( exception const * );\n\n        struct small_size { };\n        small_size dispatch_boost_exception( void const * );\n\n        template <class,int>\n        struct enable_error_info_helper;\n\n        template <class T>\n        struct\n        enable_error_info_helper<T,sizeof(large_size)>\n            {\n            typedef T type;\n            };\n\n        template <class T>\n        struct\n        enable_error_info_helper<T,sizeof(small_size)>\n            {\n            typedef error_info_injector<T> type;\n            };\n\n        template <class T>\n        struct\n        enable_error_info_return_type\n            {\n            typedef typename enable_error_info_helper<T,sizeof(exception_detail::dispatch_boost_exception(static_cast<T *>(0)))>::type type;\n            };\n        }\n\n    template <class T>\n    inline\n    typename\n    exception_detail::enable_error_info_return_type<T>::type\n    enable_error_info( T const & x )\n        {\n        typedef typename exception_detail::enable_error_info_return_type<T>::type rt;\n        return rt(x);\n        }\n\n    ////////////////////////////////////////////////////////////////////////\n\n    namespace\n    exception_detail\n        {\n#if defined(__GNUC__)\n# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)\n#  pragma GCC visibility push (default)\n# endif\n#endif\n        class\n        clone_base\n            {\n            public:\n\n            virtual clone_base const * clone() const = 0;\n            virtual void rethrow() const = 0;\n\n            virtual\n            ~clone_base() throw()\n                {\n                }\n            };\n#if defined(__GNUC__)\n# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)\n#  pragma GCC visibility pop\n# endif\n#endif\n\n        inline\n        void\n        copy_boost_exception( exception * a, exception const * b )\n            {\n            refcount_ptr<error_info_container> data;\n            if( error_info_container * d=b->data_.get() )\n                data = d->clone();\n            a->throw_file_ = b->throw_file_;\n            a->throw_line_ = b->throw_line_;\n            a->throw_function_ = b->throw_function_;\n            a->data_ = data;\n            }\n\n        inline\n        void\n        copy_boost_exception( void *, void const * )\n            {\n            }\n\n#if defined(__GNUC__)\n# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)\n#  pragma GCC visibility push (default)\n# endif\n#endif\n        template <class T>\n        class\n        clone_impl:\n            public T,\n            public virtual clone_base\n            {\n            struct clone_tag { };\n            clone_impl( clone_impl const & x, clone_tag ):\n                T(x)\n                {\n                copy_boost_exception(this,&x);\n                }\n\n            public:\n\n            explicit\n            clone_impl( T const & x ):\n                T(x)\n                {\n                copy_boost_exception(this,&x);\n                }\n\n            ~clone_impl() throw()\n                {\n                }\n\n            private:\n\n            clone_base const *\n            clone() const\n                {\n                return new clone_impl(*this,clone_tag());\n                }\n\n            void\n            rethrow() const\n                {\n                throw*this;\n                }\n            };\n        }\n#if defined(__GNUC__)\n# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)\n#  pragma GCC visibility pop\n# endif\n#endif\n\n    template <class T>\n    inline\n    exception_detail::clone_impl<T>\n    enable_current_exception( T const & x )\n        {\n        return exception_detail::clone_impl<T>(x);\n        }\n    }\n\n#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)\n#pragma warning(pop)\n#endif\n#endif\n"
  },
  {
    "path": "benchmarks/boost/functional/hash/hash_fwd.hpp",
    "content": "\n// Copyright 2005-2009 Daniel James.\n// Distributed under the Boost Software License, Version 1.0. (See accompanying\n// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  Based on Peter Dimov's proposal\n//  http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1756.pdf\n//  issue 6.18. \n\n#if !defined(BOOST_FUNCTIONAL_HASH_FWD_HPP)\n#define BOOST_FUNCTIONAL_HASH_FWD_HPP\n\n#include <boost/config.hpp>\n#if defined(BOOST_HAS_PRAGMA_ONCE)\n#pragma once\n#endif\n\n#include <cstddef>\n#include <boost/detail/workaround.hpp>\n\nnamespace boost\n{\n    template <class T> struct hash;\n\n    template <class T> void hash_combine(std::size_t& seed, T const& v);\n\n    template <class It> std::size_t hash_range(It, It);\n    template <class It> void hash_range(std::size_t&, It, It);\n\n#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))\n    template <class T> inline std::size_t hash_range(T*, T*);\n    template <class T> inline void hash_range(std::size_t&, T*, T*);\n#endif\n}\n\n#endif\n"
  },
  {
    "path": "benchmarks/boost/functional/hash_fwd.hpp",
    "content": "\n// Copyright 2005-2009 Daniel James.\n// Distributed under the Boost Software License, Version 1.0. (See accompanying\n// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#include <boost/config.hpp>\n#if defined(BOOST_HAS_PRAGMA_ONCE)\n#pragma once\n#endif\n\n#include <boost/functional/hash/hash_fwd.hpp>\n"
  },
  {
    "path": "benchmarks/boost/limits.hpp",
    "content": "\n//  (C) Copyright John maddock 1999. \n//  (C) David Abrahams 2002.  Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n//\n// use this header as a workaround for missing <limits>\n\n//  See http://www.boost.org/libs/compatibility/index.html for documentation.\n\n#ifndef BOOST_LIMITS\n#define BOOST_LIMITS\n\n#include <boost/config.hpp>\n\n#ifdef BOOST_NO_LIMITS\n#  error \"There is no std::numeric_limits suppport available.\"\n#else\n# include <limits>\n#endif\n\n#if (defined(BOOST_HAS_LONG_LONG) && defined(BOOST_NO_LONG_LONG_NUMERIC_LIMITS)) \\\n      || (defined(BOOST_HAS_MS_INT64) && defined(BOOST_NO_MS_INT64_NUMERIC_LIMITS))\n// Add missing specializations for numeric_limits:\n#ifdef BOOST_HAS_MS_INT64\n#  define BOOST_LLT __int64\n#  define BOOST_ULLT unsigned __int64\n#else\n#  define BOOST_LLT  ::boost::long_long_type\n#  define BOOST_ULLT  ::boost::ulong_long_type\n#endif\n\n#include <climits>  // for CHAR_BIT\n\nnamespace std\n{\n  template<>\n  class numeric_limits<BOOST_LLT> \n  {\n   public:\n\n      BOOST_STATIC_CONSTANT(bool, is_specialized = true);\n#ifdef BOOST_HAS_MS_INT64\n      static BOOST_LLT min BOOST_PREVENT_MACRO_SUBSTITUTION (){ return 0x8000000000000000i64; }\n      static BOOST_LLT max BOOST_PREVENT_MACRO_SUBSTITUTION (){ return 0x7FFFFFFFFFFFFFFFi64; }\n#elif defined(LLONG_MAX)\n      static BOOST_LLT min BOOST_PREVENT_MACRO_SUBSTITUTION (){ return LLONG_MIN; }\n      static BOOST_LLT max BOOST_PREVENT_MACRO_SUBSTITUTION (){ return LLONG_MAX; }\n#elif defined(LONGLONG_MAX)\n      static BOOST_LLT min BOOST_PREVENT_MACRO_SUBSTITUTION (){ return LONGLONG_MIN; }\n      static BOOST_LLT max BOOST_PREVENT_MACRO_SUBSTITUTION (){ return LONGLONG_MAX; }\n#else\n      static BOOST_LLT min BOOST_PREVENT_MACRO_SUBSTITUTION (){ return 1LL << (sizeof(BOOST_LLT) * CHAR_BIT - 1); }\n      static BOOST_LLT max BOOST_PREVENT_MACRO_SUBSTITUTION (){ return ~(min)(); }\n#endif\n      BOOST_STATIC_CONSTANT(int, digits = sizeof(BOOST_LLT) * CHAR_BIT -1);\n      BOOST_STATIC_CONSTANT(int, digits10 = (CHAR_BIT * sizeof (BOOST_LLT) - 1) * 301L / 1000);\n      BOOST_STATIC_CONSTANT(bool, is_signed = true);\n      BOOST_STATIC_CONSTANT(bool, is_integer = true);\n      BOOST_STATIC_CONSTANT(bool, is_exact = true);\n      BOOST_STATIC_CONSTANT(int, radix = 2);\n      static BOOST_LLT epsilon() throw() { return 0; };\n      static BOOST_LLT round_error() throw() { return 0; };\n\n      BOOST_STATIC_CONSTANT(int, min_exponent = 0);\n      BOOST_STATIC_CONSTANT(int, min_exponent10 = 0);\n      BOOST_STATIC_CONSTANT(int, max_exponent = 0);\n      BOOST_STATIC_CONSTANT(int, max_exponent10 = 0);\n\n      BOOST_STATIC_CONSTANT(bool, has_infinity = false);\n      BOOST_STATIC_CONSTANT(bool, has_quiet_NaN = false);\n      BOOST_STATIC_CONSTANT(bool, has_signaling_NaN = false);\n      BOOST_STATIC_CONSTANT(bool, has_denorm = false);\n      BOOST_STATIC_CONSTANT(bool, has_denorm_loss = false);\n      static BOOST_LLT infinity() throw() { return 0; };\n      static BOOST_LLT quiet_NaN() throw() { return 0; };\n      static BOOST_LLT signaling_NaN() throw() { return 0; };\n      static BOOST_LLT denorm_min() throw() { return 0; };\n\n      BOOST_STATIC_CONSTANT(bool, is_iec559 = false);\n      BOOST_STATIC_CONSTANT(bool, is_bounded = true);\n      BOOST_STATIC_CONSTANT(bool, is_modulo = true);\n\n      BOOST_STATIC_CONSTANT(bool, traps = false);\n      BOOST_STATIC_CONSTANT(bool, tinyness_before = false);\n      BOOST_STATIC_CONSTANT(float_round_style, round_style = round_toward_zero);\n      \n  };\n\n  template<>\n  class numeric_limits<BOOST_ULLT> \n  {\n   public:\n\n      BOOST_STATIC_CONSTANT(bool, is_specialized = true);\n#ifdef BOOST_HAS_MS_INT64\n      static BOOST_ULLT min BOOST_PREVENT_MACRO_SUBSTITUTION (){ return 0ui64; }\n      static BOOST_ULLT max BOOST_PREVENT_MACRO_SUBSTITUTION (){ return 0xFFFFFFFFFFFFFFFFui64; }\n#elif defined(ULLONG_MAX) && defined(ULLONG_MIN)\n      static BOOST_ULLT min BOOST_PREVENT_MACRO_SUBSTITUTION (){ return ULLONG_MIN; }\n      static BOOST_ULLT max BOOST_PREVENT_MACRO_SUBSTITUTION (){ return ULLONG_MAX; }\n#elif defined(ULONGLONG_MAX) && defined(ULONGLONG_MIN)\n      static BOOST_ULLT min BOOST_PREVENT_MACRO_SUBSTITUTION (){ return ULONGLONG_MIN; }\n      static BOOST_ULLT max BOOST_PREVENT_MACRO_SUBSTITUTION (){ return ULONGLONG_MAX; }\n#else\n      static BOOST_ULLT min BOOST_PREVENT_MACRO_SUBSTITUTION (){ return 0uLL; }\n      static BOOST_ULLT max BOOST_PREVENT_MACRO_SUBSTITUTION (){ return ~0uLL; }\n#endif\n      BOOST_STATIC_CONSTANT(int, digits = sizeof(BOOST_LLT) * CHAR_BIT);\n      BOOST_STATIC_CONSTANT(int, digits10 = (CHAR_BIT * sizeof (BOOST_LLT)) * 301L / 1000);\n      BOOST_STATIC_CONSTANT(bool, is_signed = false);\n      BOOST_STATIC_CONSTANT(bool, is_integer = true);\n      BOOST_STATIC_CONSTANT(bool, is_exact = true);\n      BOOST_STATIC_CONSTANT(int, radix = 2);\n      static BOOST_ULLT epsilon() throw() { return 0; };\n      static BOOST_ULLT round_error() throw() { return 0; };\n\n      BOOST_STATIC_CONSTANT(int, min_exponent = 0);\n      BOOST_STATIC_CONSTANT(int, min_exponent10 = 0);\n      BOOST_STATIC_CONSTANT(int, max_exponent = 0);\n      BOOST_STATIC_CONSTANT(int, max_exponent10 = 0);\n\n      BOOST_STATIC_CONSTANT(bool, has_infinity = false);\n      BOOST_STATIC_CONSTANT(bool, has_quiet_NaN = false);\n      BOOST_STATIC_CONSTANT(bool, has_signaling_NaN = false);\n      BOOST_STATIC_CONSTANT(bool, has_denorm = false);\n      BOOST_STATIC_CONSTANT(bool, has_denorm_loss = false);\n      static BOOST_ULLT infinity() throw() { return 0; };\n      static BOOST_ULLT quiet_NaN() throw() { return 0; };\n      static BOOST_ULLT signaling_NaN() throw() { return 0; };\n      static BOOST_ULLT denorm_min() throw() { return 0; };\n\n      BOOST_STATIC_CONSTANT(bool, is_iec559 = false);\n      BOOST_STATIC_CONSTANT(bool, is_bounded = true);\n      BOOST_STATIC_CONSTANT(bool, is_modulo = true);\n\n      BOOST_STATIC_CONSTANT(bool, traps = false);\n      BOOST_STATIC_CONSTANT(bool, tinyness_before = false);\n      BOOST_STATIC_CONSTANT(float_round_style, round_style = round_toward_zero);\n      \n  };\n}\n#endif \n\n#endif\n\n"
  },
  {
    "path": "benchmarks/boost/lockfree/detail/atomic.hpp",
    "content": "//  Copyright (C) 2011-2013 Tim Blechmann\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_LOCKFREE_DETAIL_ATOMIC_HPP\n#define BOOST_LOCKFREE_DETAIL_ATOMIC_HPP\n\n#include <boost/config.hpp>\n\n#ifndef BOOST_LOCKFREE_FORCE_STD_ATOMIC\n\n#define BOOST_LOCKFREE_NO_HDR_ATOMIC\n\n// MSVC supports atomic<> from version 2012 onwards.\n#if defined(BOOST_MSVC) && (BOOST_MSVC >= 1700)\n#undef BOOST_LOCKFREE_NO_HDR_ATOMIC\n#endif\n\n\n// GCC supports atomic<> from version 4.8 onwards.\n#if (BOOST_GCC >= 40800) && (__cplusplus >= 201103L)\n#undef BOOST_LOCKFREE_NO_HDR_ATOMIC\n#endif\n\n\n// Apple clang is 2 mayor versions ahead, but in fact 1 minor version behind\n#ifdef BOOST_CLANG\n\n#define BOOST_ATOMIC_CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)\n\n#if  defined(__apple_build_version__) && (BOOST_ATOMIC_CLANG_VERSION >= 60100) && (__cplusplus >= 201103L)\n#undef BOOST_LOCKFREE_NO_HDR_ATOMIC\n#endif\n\n#if !defined(__apple_build_version__) && (BOOST_ATOMIC_CLANG_VERSION >= 30600) && (__cplusplus >= 201103L)\n#undef BOOST_LOCKFREE_NO_HDR_ATOMIC\n#endif\n\n#undef BOOST_ATOMIC_CLANG_VERSION\n\n#endif // BOOST_CLANG\n\n#endif // BOOST_LOCKFREE_FORCE_STD_ATOMIC\n\n\n#if defined(BOOST_LOCKFREE_NO_HDR_ATOMIC)\n#include <boost/atomic.hpp>\n#else\n#include <atomic>\n#endif\n\nnamespace boost {\nnamespace lockfree {\nnamespace detail {\n\n#if defined(BOOST_LOCKFREE_NO_HDR_ATOMIC)\nusing boost::atomic;\nusing boost::memory_order_acquire;\nusing boost::memory_order_consume;\nusing boost::memory_order_relaxed;\nusing boost::memory_order_release;\n#else\nusing std::atomic;\nusing std::memory_order_acquire;\nusing std::memory_order_consume;\nusing std::memory_order_relaxed;\nusing std::memory_order_release;\n#endif\n\n}\nusing detail::atomic;\nusing detail::memory_order_acquire;\nusing detail::memory_order_consume;\nusing detail::memory_order_relaxed;\nusing detail::memory_order_release;\n\n}}\n\n#endif /* BOOST_LOCKFREE_DETAIL_ATOMIC_HPP */\n"
  },
  {
    "path": "benchmarks/boost/lockfree/detail/copy_payload.hpp",
    "content": "//  boost lockfree: copy_payload helper\n//\n//  Copyright (C) 2011 Tim Blechmann\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_LOCKFREE_DETAIL_COPY_PAYLOAD_HPP_INCLUDED\n#define BOOST_LOCKFREE_DETAIL_COPY_PAYLOAD_HPP_INCLUDED\n\n#include <boost/mpl/if.hpp>\n#include <boost/type_traits/is_convertible.hpp>\n\n#if defined(_MSC_VER)\n#pragma warning(push)\n#pragma warning(disable: 4512) // assignment operator could not be generated\n#endif\n\nnamespace boost    {\nnamespace lockfree {\nnamespace detail   {\n\nstruct copy_convertible\n{\n    template <typename T, typename U>\n    static void copy(T & t, U & u)\n    {\n        u = t;\n    }\n};\n\nstruct copy_constructible_and_copyable\n{\n    template <typename T, typename U>\n    static void copy(T & t, U & u)\n    {\n        u = U(t);\n    }\n};\n\ntemplate <typename T, typename U>\nvoid copy_payload(T & t, U & u)\n{\n    typedef typename boost::mpl::if_<typename boost::is_convertible<T, U>::type,\n                                     copy_convertible,\n                                     copy_constructible_and_copyable\n                                    >::type copy_type;\n    copy_type::copy(t, u);\n}\n\ntemplate <typename T>\nstruct consume_via_copy\n{\n    consume_via_copy(T & out):\n        out_(out)\n    {}\n\n    template <typename U>\n    void operator()(U & element)\n    {\n        copy_payload(element, out_);\n    }\n\n    T & out_;\n};\n\nstruct consume_noop\n{\n    template <typename U>\n    void operator()(const U &)\n    {\n    }\n};\n\n\n}}}\n\n#if defined(_MSC_VER)\n#pragma warning(pop)\n#endif\n\n#endif  /* BOOST_LOCKFREE_DETAIL_COPY_PAYLOAD_HPP_INCLUDED */\n"
  },
  {
    "path": "benchmarks/boost/lockfree/detail/freelist.hpp",
    "content": "//  lock-free freelist\n//\n//  Copyright (C) 2008-2013 Tim Blechmann\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_LOCKFREE_FREELIST_HPP_INCLUDED\n#define BOOST_LOCKFREE_FREELIST_HPP_INCLUDED\n\n#include <limits>\n#include <memory>\n\n#include <boost/array.hpp>\n#include <boost/config.hpp>\n#include <boost/cstdint.hpp>\n#include <boost/noncopyable.hpp>\n#include <boost/static_assert.hpp>\n\n#include <boost/lockfree/detail/atomic.hpp>\n#include <boost/lockfree/detail/parameter.hpp>\n#include <boost/lockfree/detail/tagged_ptr.hpp>\n\n#if defined(_MSC_VER)\n#pragma warning(push)\n#pragma warning(disable: 4100) // unreferenced formal parameter\n#pragma warning(disable: 4127) // conditional expression is constant\n#endif\n\nnamespace boost    {\nnamespace lockfree {\nnamespace detail   {\n\ntemplate <typename T,\n          typename Alloc = std::allocator<T>\n         >\nclass freelist_stack:\n    Alloc\n{\n    struct freelist_node\n    {\n        tagged_ptr<freelist_node> next;\n    };\n\n    typedef tagged_ptr<freelist_node> tagged_node_ptr;\n\npublic:\n    typedef tagged_ptr<T> tagged_node_handle;\n\n    template <typename Allocator>\n    freelist_stack (Allocator const & alloc, std::size_t n = 0):\n        Alloc(alloc),\n        pool_(tagged_node_ptr(NULL))\n    {\n        for (std::size_t i = 0; i != n; ++i) {\n            T * node = Alloc::allocate(1);\n#ifdef BOOST_LOCKFREE_FREELIST_INIT_RUNS_DTOR\n            destruct<false>(node);\n#else\n            deallocate<false>(node);\n#endif\n        }\n    }\n\n    template <bool ThreadSafe>\n    void reserve (std::size_t count)\n    {\n        for (std::size_t i = 0; i != count; ++i) {\n            T * node = Alloc::allocate(1);\n            deallocate<ThreadSafe>(node);\n        }\n    }\n\n    template <bool ThreadSafe, bool Bounded>\n    T * construct (void)\n    {\n        T * node = allocate<ThreadSafe, Bounded>();\n        if (node)\n            new(node) T();\n        return node;\n    }\n\n    template <bool ThreadSafe, bool Bounded, typename ArgumentType>\n    T * construct (ArgumentType const & arg)\n    {\n        T * node = allocate<ThreadSafe, Bounded>();\n        if (node)\n            new(node) T(arg);\n        return node;\n    }\n\n    template <bool ThreadSafe, bool Bounded, typename ArgumentType1, typename ArgumentType2>\n    T * construct (ArgumentType1 const & arg1, ArgumentType2 const & arg2)\n    {\n        T * node = allocate<ThreadSafe, Bounded>();\n        if (node)\n            new(node) T(arg1, arg2);\n        return node;\n    }\n\n    template <bool ThreadSafe>\n    void destruct (tagged_node_handle tagged_ptr)\n    {\n        T * n = tagged_ptr.get_ptr();\n        n->~T();\n        deallocate<ThreadSafe>(n);\n    }\n\n    template <bool ThreadSafe>\n    void destruct (T * n)\n    {\n        n->~T();\n        deallocate<ThreadSafe>(n);\n    }\n\n    ~freelist_stack(void)\n    {\n        tagged_node_ptr current = pool_.load();\n\n        while (current) {\n            freelist_node * current_ptr = current.get_ptr();\n            if (current_ptr)\n                current = current_ptr->next;\n            Alloc::deallocate((T*)current_ptr, 1);\n        }\n    }\n\n    bool is_lock_free(void) const\n    {\n        return pool_.is_lock_free();\n    }\n\n    T * get_handle(T * pointer) const\n    {\n        return pointer;\n    }\n\n    T * get_handle(tagged_node_handle const & handle) const\n    {\n        return get_pointer(handle);\n    }\n\n    T * get_pointer(tagged_node_handle const & tptr) const\n    {\n        return tptr.get_ptr();\n    }\n\n    T * get_pointer(T * pointer) const\n    {\n        return pointer;\n    }\n\n    T * null_handle(void) const\n    {\n        return NULL;\n    }\n\nprotected: // allow use from subclasses\n    template <bool ThreadSafe, bool Bounded>\n    T * allocate (void)\n    {\n        if (ThreadSafe)\n            return allocate_impl<Bounded>();\n        else\n            return allocate_impl_unsafe<Bounded>();\n    }\n\nprivate:\n    template <bool Bounded>\n    T * allocate_impl (void)\n    {\n        tagged_node_ptr old_pool = pool_.load(memory_order_consume);\n\n        for(;;) {\n            if (!old_pool.get_ptr()) {\n                if (!Bounded)\n                    return Alloc::allocate(1);\n                else\n                    return 0;\n            }\n\n            freelist_node * new_pool_ptr = old_pool->next.get_ptr();\n            tagged_node_ptr new_pool (new_pool_ptr, old_pool.get_next_tag());\n\n            if (pool_.compare_exchange_weak(old_pool, new_pool)) {\n                void * ptr = old_pool.get_ptr();\n                return reinterpret_cast<T*>(ptr);\n            }\n        }\n    }\n\n    template <bool Bounded>\n    T * allocate_impl_unsafe (void)\n    {\n        tagged_node_ptr old_pool = pool_.load(memory_order_relaxed);\n\n        if (!old_pool.get_ptr()) {\n            if (!Bounded)\n                return Alloc::allocate(1);\n            else\n                return 0;\n        }\n\n        freelist_node * new_pool_ptr = old_pool->next.get_ptr();\n        tagged_node_ptr new_pool (new_pool_ptr, old_pool.get_next_tag());\n\n        pool_.store(new_pool, memory_order_relaxed);\n        void * ptr = old_pool.get_ptr();\n        return reinterpret_cast<T*>(ptr);\n    }\n\nprotected:\n    template <bool ThreadSafe>\n    void deallocate (T * n)\n    {\n        if (ThreadSafe)\n            deallocate_impl(n);\n        else\n            deallocate_impl_unsafe(n);\n    }\n\nprivate:\n    void deallocate_impl (T * n)\n    {\n        void * node = n;\n        tagged_node_ptr old_pool = pool_.load(memory_order_consume);\n        freelist_node * new_pool_ptr = reinterpret_cast<freelist_node*>(node);\n\n        for(;;) {\n            tagged_node_ptr new_pool (new_pool_ptr, old_pool.get_tag());\n            new_pool->next.set_ptr(old_pool.get_ptr());\n\n            if (pool_.compare_exchange_weak(old_pool, new_pool))\n                return;\n        }\n    }\n\n    void deallocate_impl_unsafe (T * n)\n    {\n        void * node = n;\n        tagged_node_ptr old_pool = pool_.load(memory_order_relaxed);\n        freelist_node * new_pool_ptr = reinterpret_cast<freelist_node*>(node);\n\n        tagged_node_ptr new_pool (new_pool_ptr, old_pool.get_tag());\n        new_pool->next.set_ptr(old_pool.get_ptr());\n\n        pool_.store(new_pool, memory_order_relaxed);\n    }\n\n    atomic<tagged_node_ptr> pool_;\n};\n\nclass tagged_index\n{\npublic:\n    typedef boost::uint16_t tag_t;\n    typedef boost::uint16_t index_t;\n\n    /** uninitialized constructor */\n    tagged_index(void) BOOST_NOEXCEPT //: index(0), tag(0)\n    {}\n\n    /** copy constructor */\n#ifdef BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n    tagged_index(tagged_index const & rhs):\n        index(rhs.index), tag(rhs.tag)\n    {}\n#else\n    tagged_index(tagged_index const & rhs) = default;\n#endif\n\n    explicit tagged_index(index_t i, tag_t t = 0):\n        index(i), tag(t)\n    {}\n\n    /** index access */\n    /* @{ */\n    index_t get_index() const\n    {\n        return index;\n    }\n\n    void set_index(index_t i)\n    {\n        index = i;\n    }\n    /* @} */\n\n    /** tag access */\n    /* @{ */\n    tag_t get_tag() const\n    {\n        return tag;\n    }\n\n    tag_t get_next_tag() const\n    {\n        tag_t next = (get_tag() + 1u) & (std::numeric_limits<tag_t>::max)();\n        return next;\n    }\n\n    void set_tag(tag_t t)\n    {\n        tag = t;\n    }\n    /* @} */\n\n    bool operator==(tagged_index const & rhs) const\n    {\n        return (index == rhs.index) && (tag == rhs.tag);\n    }\n\n    bool operator!=(tagged_index const & rhs) const\n    {\n        return !operator==(rhs);\n    }\n\nprotected:\n    index_t index;\n    tag_t tag;\n};\n\ntemplate <typename T,\n          std::size_t size>\nstruct compiletime_sized_freelist_storage\n{\n    // array-based freelists only support a 16bit address space.\n    BOOST_STATIC_ASSERT(size < 65536);\n\n    boost::array<char, size * sizeof(T)> data;\n\n    // unused ... only for API purposes\n    template <typename Allocator>\n    compiletime_sized_freelist_storage(Allocator const & /* alloc */, std::size_t /* count */)\n    {}\n\n    T * nodes(void) const\n    {\n        return reinterpret_cast<T*>(const_cast<char*>(data.data()));\n    }\n\n    std::size_t node_count(void) const\n    {\n        return size;\n    }\n};\n\ntemplate <typename T,\n          typename Alloc = std::allocator<T> >\nstruct runtime_sized_freelist_storage:\n    Alloc\n{\n    T * nodes_;\n    std::size_t node_count_;\n\n    template <typename Allocator>\n    runtime_sized_freelist_storage(Allocator const & alloc, std::size_t count):\n        Alloc(alloc), node_count_(count)\n    {\n        if (count > 65535)\n            boost::throw_exception(std::runtime_error(\"boost.lockfree: freelist size is limited to a maximum of 65535 objects\"));\n        nodes_ = Alloc::allocate(count);\n    }\n\n    ~runtime_sized_freelist_storage(void)\n    {\n        Alloc::deallocate(nodes_, node_count_);\n    }\n\n    T * nodes(void) const\n    {\n        return nodes_;\n    }\n\n    std::size_t node_count(void) const\n    {\n        return node_count_;\n    }\n};\n\n\ntemplate <typename T,\n          typename NodeStorage = runtime_sized_freelist_storage<T>\n         >\nclass fixed_size_freelist:\n    NodeStorage\n{\n    struct freelist_node\n    {\n        tagged_index next;\n    };\n\n    typedef tagged_index::index_t index_t;\n\n    void initialize(void)\n    {\n        T * nodes = NodeStorage::nodes();\n        for (std::size_t i = 0; i != NodeStorage::node_count(); ++i) {\n            tagged_index * next_index = reinterpret_cast<tagged_index*>(nodes + i);\n            next_index->set_index(null_handle());\n\n#ifdef BOOST_LOCKFREE_FREELIST_INIT_RUNS_DTOR\n            destruct<false>(nodes + i);\n#else\n            deallocate<false>(static_cast<index_t>(i));\n#endif\n        }\n    }\n\npublic:\n    typedef tagged_index tagged_node_handle;\n\n    template <typename Allocator>\n    fixed_size_freelist (Allocator const & alloc, std::size_t count):\n        NodeStorage(alloc, count),\n        pool_(tagged_index(static_cast<index_t>(count), 0))\n    {\n        initialize();\n    }\n\n    fixed_size_freelist (void):\n        pool_(tagged_index(NodeStorage::node_count(), 0))\n    {\n        initialize();\n    }\n\n    template <bool ThreadSafe, bool Bounded>\n    T * construct (void)\n    {\n        index_t node_index = allocate<ThreadSafe>();\n        if (node_index == null_handle())\n            return NULL;\n\n        T * node = NodeStorage::nodes() + node_index;\n        new(node) T();\n        return node;\n    }\n\n    template <bool ThreadSafe, bool Bounded, typename ArgumentType>\n    T * construct (ArgumentType const & arg)\n    {\n        index_t node_index = allocate<ThreadSafe>();\n        if (node_index == null_handle())\n            return NULL;\n\n        T * node = NodeStorage::nodes() + node_index;\n        new(node) T(arg);\n        return node;\n    }\n\n    template <bool ThreadSafe, bool Bounded, typename ArgumentType1, typename ArgumentType2>\n    T * construct (ArgumentType1 const & arg1, ArgumentType2 const & arg2)\n    {\n        index_t node_index = allocate<ThreadSafe>();\n        if (node_index == null_handle())\n            return NULL;\n\n        T * node = NodeStorage::nodes() + node_index;\n        new(node) T(arg1, arg2);\n        return node;\n    }\n\n    template <bool ThreadSafe>\n    void destruct (tagged_node_handle tagged_index)\n    {\n        index_t index = tagged_index.get_index();\n        T * n = NodeStorage::nodes() + index;\n        (void)n; // silence msvc warning\n        n->~T();\n        deallocate<ThreadSafe>(index);\n    }\n\n    template <bool ThreadSafe>\n    void destruct (T * n)\n    {\n        n->~T();\n        deallocate<ThreadSafe>(n - NodeStorage::nodes());\n    }\n\n    bool is_lock_free(void) const\n    {\n        return pool_.is_lock_free();\n    }\n\n    index_t null_handle(void) const\n    {\n        return static_cast<index_t>(NodeStorage::node_count());\n    }\n\n    index_t get_handle(T * pointer) const\n    {\n        if (pointer == NULL)\n            return null_handle();\n        else\n            return static_cast<index_t>(pointer - NodeStorage::nodes());\n    }\n\n    index_t get_handle(tagged_node_handle const & handle) const\n    {\n        return handle.get_index();\n    }\n\n    T * get_pointer(tagged_node_handle const & tptr) const\n    {\n        return get_pointer(tptr.get_index());\n    }\n\n    T * get_pointer(index_t index) const\n    {\n        if (index == null_handle())\n            return 0;\n        else\n            return NodeStorage::nodes() + index;\n    }\n\n    T * get_pointer(T * ptr) const\n    {\n        return ptr;\n    }\n\nprotected: // allow use from subclasses\n    template <bool ThreadSafe>\n    index_t allocate (void)\n    {\n        if (ThreadSafe)\n            return allocate_impl();\n        else\n            return allocate_impl_unsafe();\n    }\n\nprivate:\n    index_t allocate_impl (void)\n    {\n        tagged_index old_pool = pool_.load(memory_order_consume);\n\n        for(;;) {\n            index_t index = old_pool.get_index();\n            if (index == null_handle())\n                return index;\n\n            T * old_node = NodeStorage::nodes() + index;\n            tagged_index * next_index = reinterpret_cast<tagged_index*>(old_node);\n\n            tagged_index new_pool(next_index->get_index(), old_pool.get_next_tag());\n\n            if (pool_.compare_exchange_weak(old_pool, new_pool))\n                return old_pool.get_index();\n        }\n    }\n\n    index_t allocate_impl_unsafe (void)\n    {\n        tagged_index old_pool = pool_.load(memory_order_consume);\n\n        index_t index = old_pool.get_index();\n        if (index == null_handle())\n            return index;\n\n        T * old_node = NodeStorage::nodes() + index;\n        tagged_index * next_index = reinterpret_cast<tagged_index*>(old_node);\n\n        tagged_index new_pool(next_index->get_index(), old_pool.get_next_tag());\n\n        pool_.store(new_pool, memory_order_relaxed);\n        return old_pool.get_index();\n    }\n\n    template <bool ThreadSafe>\n    void deallocate (index_t index)\n    {\n        if (ThreadSafe)\n            deallocate_impl(index);\n        else\n            deallocate_impl_unsafe(index);\n    }\n\n    void deallocate_impl (index_t index)\n    {\n        freelist_node * new_pool_node = reinterpret_cast<freelist_node*>(NodeStorage::nodes() + index);\n        tagged_index old_pool = pool_.load(memory_order_consume);\n\n        for(;;) {\n            tagged_index new_pool (index, old_pool.get_tag());\n            new_pool_node->next.set_index(old_pool.get_index());\n\n            if (pool_.compare_exchange_weak(old_pool, new_pool))\n                return;\n        }\n    }\n\n    void deallocate_impl_unsafe (index_t index)\n    {\n        freelist_node * new_pool_node = reinterpret_cast<freelist_node*>(NodeStorage::nodes() + index);\n        tagged_index old_pool = pool_.load(memory_order_consume);\n\n        tagged_index new_pool (index, old_pool.get_tag());\n        new_pool_node->next.set_index(old_pool.get_index());\n\n        pool_.store(new_pool);\n    }\n\n    atomic<tagged_index> pool_;\n};\n\ntemplate <typename T,\n          typename Alloc,\n          bool IsCompileTimeSized,\n          bool IsFixedSize,\n          std::size_t Capacity\n          >\nstruct select_freelist\n{\n    typedef typename mpl::if_c<IsCompileTimeSized,\n                               compiletime_sized_freelist_storage<T, Capacity>,\n                               runtime_sized_freelist_storage<T, Alloc>\n                              >::type fixed_sized_storage_type;\n\n    typedef typename mpl::if_c<IsCompileTimeSized || IsFixedSize,\n                               fixed_size_freelist<T, fixed_sized_storage_type>,\n                               freelist_stack<T, Alloc>\n                              >::type type;\n};\n\ntemplate <typename T, bool IsNodeBased>\nstruct select_tagged_handle\n{\n    typedef typename mpl::if_c<IsNodeBased,\n                               tagged_ptr<T>,\n                               tagged_index\n                              >::type tagged_handle_type;\n\n    typedef typename mpl::if_c<IsNodeBased,\n                               T*,\n                               typename tagged_index::index_t\n                              >::type handle_type;\n};\n\n\n} /* namespace detail */\n} /* namespace lockfree */\n} /* namespace boost */\n\n#if defined(_MSC_VER)\n#pragma warning(pop)\n#endif\n\n\n#endif /* BOOST_LOCKFREE_FREELIST_HPP_INCLUDED */\n"
  },
  {
    "path": "benchmarks/boost/lockfree/detail/parameter.hpp",
    "content": "// boost lockfree\n//\n// Copyright (C) 2011 Tim Blechmann\n//\n// Distributed under the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_LOCKFREE_DETAIL_PARAMETER_HPP\n#define BOOST_LOCKFREE_DETAIL_PARAMETER_HPP\n\n#include <boost/lockfree/policies.hpp>\n\nnamespace boost {\nnamespace lockfree {\nnamespace detail {\n\nnamespace mpl = boost::mpl;\n\ntemplate <typename bound_args, typename tag_type>\nstruct has_arg\n{\n    typedef typename parameter::binding<bound_args, tag_type, mpl::void_>::type type;\n    static const bool value = mpl::is_not_void_<type>::type::value;\n};\n\n\ntemplate <typename bound_args>\nstruct extract_capacity\n{\n    static const bool has_capacity = has_arg<bound_args, tag::capacity>::value;\n\n    typedef typename mpl::if_c<has_capacity,\n                               typename has_arg<bound_args, tag::capacity>::type,\n                               mpl::size_t< 0 >\n                              >::type capacity_t;\n\n    static const std::size_t capacity = capacity_t::value;\n};\n\n\ntemplate <typename bound_args, typename T>\nstruct extract_allocator\n{\n    static const bool has_allocator = has_arg<bound_args, tag::allocator>::value;\n\n    typedef typename mpl::if_c<has_allocator,\n                               typename has_arg<bound_args, tag::allocator>::type,\n                               std::allocator<T>\n                              >::type allocator_arg;\n\n    typedef typename allocator_arg::template rebind<T>::other type;\n};\n\ntemplate <typename bound_args, bool default_ = false>\nstruct extract_fixed_sized\n{\n    static const bool has_fixed_sized = has_arg<bound_args, tag::fixed_sized>::value;\n\n    typedef typename mpl::if_c<has_fixed_sized,\n                               typename has_arg<bound_args, tag::fixed_sized>::type,\n                               mpl::bool_<default_>\n                              >::type type;\n\n    static const bool value = type::value;\n};\n\n\n} /* namespace detail */\n} /* namespace lockfree */\n} /* namespace boost */\n\n#endif /* BOOST_LOCKFREE_DETAIL_PARAMETER_HPP */\n"
  },
  {
    "path": "benchmarks/boost/lockfree/detail/prefix.hpp",
    "content": "//  Copyright (C) 2009 Tim Blechmann\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_LOCKFREE_PREFIX_HPP_INCLUDED\n#define BOOST_LOCKFREE_PREFIX_HPP_INCLUDED\n\n/* this file defines the following macros:\n   BOOST_LOCKFREE_CACHELINE_BYTES: size of a cache line\n   BOOST_LOCKFREE_PTR_COMPRESSION: use tag/pointer compression to utilize parts\n                                   of the virtual address space as tag (at least 16bit)\n   BOOST_LOCKFREE_DCAS_ALIGNMENT:  symbol used for aligning structs at cache line\n                                   boundaries\n*/\n\n#define BOOST_LOCKFREE_CACHELINE_BYTES 64\n\n#ifdef _MSC_VER\n\n#define BOOST_LOCKFREE_CACHELINE_ALIGNMENT __declspec(align(BOOST_LOCKFREE_CACHELINE_BYTES))\n\n#if defined(_M_IX86)\n    #define BOOST_LOCKFREE_DCAS_ALIGNMENT\n#elif defined(_M_X64) || defined(_M_IA64)\n    #define BOOST_LOCKFREE_PTR_COMPRESSION 1\n    #define BOOST_LOCKFREE_DCAS_ALIGNMENT __declspec(align(16))\n#endif\n\n#endif /* _MSC_VER */\n\n#ifdef __GNUC__\n\n#define BOOST_LOCKFREE_CACHELINE_ALIGNMENT __attribute__((aligned(BOOST_LOCKFREE_CACHELINE_BYTES)))\n\n#if defined(__i386__) || defined(__ppc__)\n    #define BOOST_LOCKFREE_DCAS_ALIGNMENT\n#elif defined(__x86_64__)\n    #define BOOST_LOCKFREE_PTR_COMPRESSION 1\n    #define BOOST_LOCKFREE_DCAS_ALIGNMENT __attribute__((aligned(16)))\n#elif defined(__alpha__)\n    // LATER: alpha may benefit from pointer compression. but what is the maximum size of the address space?\n    #define BOOST_LOCKFREE_DCAS_ALIGNMENT\n#endif\n#endif /* __GNUC__ */\n\n#ifndef BOOST_LOCKFREE_DCAS_ALIGNMENT\n#define BOOST_LOCKFREE_DCAS_ALIGNMENT /*BOOST_LOCKFREE_DCAS_ALIGNMENT*/\n#endif\n\n#ifndef BOOST_LOCKFREE_CACHELINE_ALIGNMENT\n#define BOOST_LOCKFREE_CACHELINE_ALIGNMENT /*BOOST_LOCKFREE_CACHELINE_ALIGNMENT*/\n#endif\n\n#endif /* BOOST_LOCKFREE_PREFIX_HPP_INCLUDED */\n"
  },
  {
    "path": "benchmarks/boost/lockfree/detail/tagged_ptr.hpp",
    "content": "//  tagged pointer, for aba prevention\n//\n//  Copyright (C) 2008 Tim Blechmann\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_LOCKFREE_TAGGED_PTR_HPP_INCLUDED\n#define BOOST_LOCKFREE_TAGGED_PTR_HPP_INCLUDED\n\n#include <boost/config.hpp>\n#include <boost/lockfree/detail/prefix.hpp>\n\n#ifndef BOOST_LOCKFREE_PTR_COMPRESSION\n#include <boost/lockfree/detail/tagged_ptr_dcas.hpp>\n#else\n#include <boost/lockfree/detail/tagged_ptr_ptrcompression.hpp>\n#endif\n\n#endif /* BOOST_LOCKFREE_TAGGED_PTR_HPP_INCLUDED */\n"
  },
  {
    "path": "benchmarks/boost/lockfree/detail/tagged_ptr_dcas.hpp",
    "content": "//  tagged pointer, for aba prevention\n//\n//  Copyright (C) 2008 Tim Blechmann\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_LOCKFREE_TAGGED_PTR_DCAS_HPP_INCLUDED\n#define BOOST_LOCKFREE_TAGGED_PTR_DCAS_HPP_INCLUDED\n\n#include <cstddef>              /* for std::size_t */\n#include <limits>\n\n\nnamespace boost {\nnamespace lockfree {\nnamespace detail {\n\ntemplate <class T>\nclass BOOST_LOCKFREE_DCAS_ALIGNMENT tagged_ptr\n{\npublic:\n    typedef std::size_t tag_t;\n\n    /** uninitialized constructor */\n    tagged_ptr(void) BOOST_NOEXCEPT//: ptr(0), tag(0)\n    {}\n\n#ifdef BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n    tagged_ptr(tagged_ptr const & p):\n        ptr(p.ptr), tag(p.tag)\n    {}\n#else\n    tagged_ptr(tagged_ptr const & p) = default;\n#endif\n\n    explicit tagged_ptr(T * p, tag_t t = 0):\n        ptr(p), tag(t)\n    {}\n\n    /** unsafe set operation */\n    /* @{ */\n#ifdef BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n    tagged_ptr & operator= (tagged_ptr const & p)\n    {\n        set(p.ptr, p.tag);\n        return *this;\n    }\n#else\n    tagged_ptr & operator= (tagged_ptr const & p) = default;\n#endif\n\n    void set(T * p, tag_t t)\n    {\n        ptr = p;\n        tag = t;\n    }\n    /* @} */\n\n    /** comparing semantics */\n    /* @{ */\n    bool operator== (volatile tagged_ptr const & p) const\n    {\n        return (ptr == p.ptr) && (tag == p.tag);\n    }\n\n    bool operator!= (volatile tagged_ptr const & p) const\n    {\n        return !operator==(p);\n    }\n    /* @} */\n\n    /** pointer access */\n    /* @{ */\n    T * get_ptr(void) const\n    {\n        return ptr;\n    }\n\n    void set_ptr(T * p)\n    {\n        ptr = p;\n    }\n    /* @} */\n\n    /** tag access */\n    /* @{ */\n    tag_t get_tag() const\n    {\n        return tag;\n    }\n\n    tag_t get_next_tag() const\n    {\n        tag_t next = (get_tag() + 1) & (std::numeric_limits<tag_t>::max)();\n        return next;\n    }\n\n    void set_tag(tag_t t)\n    {\n        tag = t;\n    }\n    /* @} */\n\n    /** smart pointer support  */\n    /* @{ */\n    T & operator*() const\n    {\n        return *ptr;\n    }\n\n    T * operator->() const\n    {\n        return ptr;\n    }\n\n    operator bool(void) const\n    {\n        return ptr != 0;\n    }\n    /* @} */\n\nprotected:\n    T * ptr;\n    tag_t tag;\n};\n\n} /* namespace detail */\n} /* namespace lockfree */\n} /* namespace boost */\n\n#endif /* BOOST_LOCKFREE_TAGGED_PTR_DCAS_HPP_INCLUDED */\n"
  },
  {
    "path": "benchmarks/boost/lockfree/detail/tagged_ptr_ptrcompression.hpp",
    "content": "//  tagged pointer, for aba prevention\n//\n//  Copyright (C) 2008, 2009 Tim Blechmann, based on code by Cory Nelson\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_LOCKFREE_TAGGED_PTR_PTRCOMPRESSION_HPP_INCLUDED\n#define BOOST_LOCKFREE_TAGGED_PTR_PTRCOMPRESSION_HPP_INCLUDED\n\n#include <cstddef>              /* for std::size_t */\n#include <limits>\n\n#include <boost/cstdint.hpp>\n\n\nnamespace boost {\nnamespace lockfree {\nnamespace detail {\n\n#if defined (__x86_64__) || defined (_M_X64)\n\ntemplate <class T>\nclass tagged_ptr\n{\n    typedef boost::uint64_t compressed_ptr_t;\n\npublic:\n    typedef boost::uint16_t tag_t;\n\nprivate:\n    union cast_unit\n    {\n        compressed_ptr_t value;\n        tag_t tag[4];\n    };\n\n    static const int tag_index = 3;\n    static const compressed_ptr_t ptr_mask = 0xffffffffffffUL; //(1L<<48L)-1;\n\n    static T* extract_ptr(volatile compressed_ptr_t const & i)\n    {\n        return (T*)(i & ptr_mask);\n    }\n\n    static tag_t extract_tag(volatile compressed_ptr_t const & i)\n    {\n        cast_unit cu;\n        cu.value = i;\n        return cu.tag[tag_index];\n    }\n\n    static compressed_ptr_t pack_ptr(T * ptr, tag_t tag)\n    {\n        cast_unit ret;\n        ret.value = compressed_ptr_t(ptr);\n        ret.tag[tag_index] = tag;\n        return ret.value;\n    }\n\npublic:\n    /** uninitialized constructor */\n    tagged_ptr(void) BOOST_NOEXCEPT//: ptr(0), tag(0)\n    {}\n\n    /** copy constructor */\n#ifdef BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n    tagged_ptr(tagged_ptr const & p):\n        ptr(p.ptr)\n    {}\n#else\n    tagged_ptr(tagged_ptr const & p) = default;\n#endif\n\n    explicit tagged_ptr(T * p, tag_t t = 0):\n        ptr(pack_ptr(p, t))\n    {}\n\n    /** unsafe set operation */\n    /* @{ */\n#ifdef BOOST_NO_CXX11_DEFAULTED_FUNCTIONS\n    tagged_ptr & operator= (tagged_ptr const & p)\n    {\n         ptr = p.ptr;\n         return *this;\n    }\n#else\n    tagged_ptr & operator= (tagged_ptr const & p) = default;\n#endif\n\n    void set(T * p, tag_t t)\n    {\n        ptr = pack_ptr(p, t);\n    }\n    /* @} */\n\n    /** comparing semantics */\n    /* @{ */\n    bool operator== (volatile tagged_ptr const & p) const\n    {\n        return (ptr == p.ptr);\n    }\n\n    bool operator!= (volatile tagged_ptr const & p) const\n    {\n        return !operator==(p);\n    }\n    /* @} */\n\n    /** pointer access */\n    /* @{ */\n    T * get_ptr() const\n    {\n        return extract_ptr(ptr);\n    }\n\n    void set_ptr(T * p)\n    {\n        tag_t tag = get_tag();\n        ptr = pack_ptr(p, tag);\n    }\n    /* @} */\n\n    /** tag access */\n    /* @{ */\n    tag_t get_tag() const\n    {\n        return extract_tag(ptr);\n    }\n\n    tag_t get_next_tag() const\n    {\n        tag_t next = (get_tag() + 1u) & (std::numeric_limits<tag_t>::max)();\n        return next;\n    }\n\n    void set_tag(tag_t t)\n    {\n        T * p = get_ptr();\n        ptr = pack_ptr(p, t);\n    }\n    /* @} */\n\n    /** smart pointer support  */\n    /* @{ */\n    T & operator*() const\n    {\n        return *get_ptr();\n    }\n\n    T * operator->() const\n    {\n        return get_ptr();\n    }\n\n    operator bool(void) const\n    {\n        return get_ptr() != 0;\n    }\n    /* @} */\n\nprotected:\n    compressed_ptr_t ptr;\n};\n#else\n#error unsupported platform\n#endif\n\n} /* namespace detail */\n} /* namespace lockfree */\n} /* namespace boost */\n\n#endif /* BOOST_LOCKFREE_TAGGED_PTR_PTRCOMPRESSION_HPP_INCLUDED */\n"
  },
  {
    "path": "benchmarks/boost/lockfree/policies.hpp",
    "content": "// boost lockfree\n//\n// Copyright (C) 2011 Tim Blechmann\n//\n// Distributed under the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_LOCKFREE_POLICIES_HPP_INCLUDED\n#define BOOST_LOCKFREE_POLICIES_HPP_INCLUDED\n\n#include <boost/parameter.hpp>\n#include <boost/mpl/bool.hpp>\n#include <boost/mpl/size_t.hpp>\n#include <boost/mpl/void.hpp>\n\nnamespace boost {\nnamespace lockfree {\n\n#ifndef BOOST_DOXYGEN_INVOKED\nnamespace tag { struct allocator ; }\nnamespace tag { struct fixed_sized; }\nnamespace tag { struct capacity; }\n\n#endif\n\n/** Configures a data structure as \\b fixed-sized.\n *\n *  The internal nodes are stored inside an array and they are addressed by array indexing. This limits the possible size of the\n *  queue to the number of elements that can be addressed by the index type (usually 2**16-2), but on platforms that lack\n *  double-width compare-and-exchange instructions, this is the best way to achieve lock-freedom.\n *  This implies that a data structure is bounded.\n * */\ntemplate <bool IsFixedSized>\nstruct fixed_sized:\n    boost::parameter::template_keyword<tag::fixed_sized, boost::mpl::bool_<IsFixedSized> >\n{};\n\n/** Sets the \\b capacity of a data structure at compile-time.\n *\n * This implies that a data structure is bounded and fixed-sized.\n * */\ntemplate <size_t Size>\nstruct capacity:\n    boost::parameter::template_keyword<tag::capacity, boost::mpl::size_t<Size> >\n{};\n\n/** Defines the \\b allocator type of a data structure.\n * */\ntemplate <class Alloc>\nstruct allocator:\n    boost::parameter::template_keyword<tag::allocator, Alloc>\n{};\n\n}\n}\n\n#endif /* BOOST_LOCKFREE_POLICIES_HPP_INCLUDED */\n\n"
  },
  {
    "path": "benchmarks/boost/lockfree/queue.hpp",
    "content": "//  lock-free queue from\n//  Michael, M. M. and Scott, M. L.,\n//  \"simple, fast and practical non-blocking and blocking concurrent queue algorithms\"\n//\n//  Copyright (C) 2008-2013 Tim Blechmann\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_LOCKFREE_FIFO_HPP_INCLUDED\n#define BOOST_LOCKFREE_FIFO_HPP_INCLUDED\n\n#include <boost/assert.hpp>\n#include <boost/static_assert.hpp>\n#include <boost/type_traits/has_trivial_assign.hpp>\n#include <boost/type_traits/has_trivial_destructor.hpp>\n#include <boost/config.hpp> // for BOOST_LIKELY\n\n#include <boost/lockfree/detail/atomic.hpp>\n#include <boost/lockfree/detail/copy_payload.hpp>\n#include <boost/lockfree/detail/freelist.hpp>\n#include <boost/lockfree/detail/parameter.hpp>\n#include <boost/lockfree/detail/tagged_ptr.hpp>\n\n#ifdef BOOST_HAS_PRAGMA_ONCE\n#pragma once\n#endif\n\n\n#if defined(_MSC_VER)\n#pragma warning(push)\n#pragma warning(disable: 4324) // structure was padded due to __declspec(align())\n#endif\n\n\nnamespace boost    {\nnamespace lockfree {\nnamespace detail   {\n\ntypedef parameter::parameters<boost::parameter::optional<tag::allocator>,\n                              boost::parameter::optional<tag::capacity>\n                             > queue_signature;\n\n} /* namespace detail */\n\n\n/** The queue class provides a multi-writer/multi-reader queue, pushing and popping is lock-free,\n *  construction/destruction has to be synchronized. It uses a freelist for memory management,\n *  freed nodes are pushed to the freelist and not returned to the OS before the queue is destroyed.\n *\n *  \\b Policies:\n *  - \\ref boost::lockfree::fixed_sized, defaults to \\c boost::lockfree::fixed_sized<false> \\n\n *    Can be used to completely disable dynamic memory allocations during push in order to ensure lockfree behavior. \\n\n *    If the data structure is configured as fixed-sized, the internal nodes are stored inside an array and they are addressed\n *    by array indexing. This limits the possible size of the queue to the number of elements that can be addressed by the index\n *    type (usually 2**16-2), but on platforms that lack double-width compare-and-exchange instructions, this is the best way\n *    to achieve lock-freedom.\n *\n *  - \\ref boost::lockfree::capacity, optional \\n\n *    If this template argument is passed to the options, the size of the queue is set at compile-time.\\n\n *    It this option implies \\c fixed_sized<true>\n *\n *  - \\ref boost::lockfree::allocator, defaults to \\c boost::lockfree::allocator<std::allocator<void>> \\n\n *    Specifies the allocator that is used for the internal freelist\n *\n *  \\b Requirements:\n *   - T must have a copy constructor\n *   - T must have a trivial assignment operator\n *   - T must have a trivial destructor\n *\n * */\n#ifndef BOOST_DOXYGEN_INVOKED\ntemplate <typename T,\n          class A0 = boost::parameter::void_,\n          class A1 = boost::parameter::void_,\n          class A2 = boost::parameter::void_>\n#else\ntemplate <typename T, ...Options>\n#endif\nclass queue\n{\nprivate:\n#ifndef BOOST_DOXYGEN_INVOKED\n\n#ifdef BOOST_HAS_TRIVIAL_DESTRUCTOR\n    BOOST_STATIC_ASSERT((boost::has_trivial_destructor<T>::value));\n#endif\n\n#ifdef BOOST_HAS_TRIVIAL_ASSIGN\n    BOOST_STATIC_ASSERT((boost::has_trivial_assign<T>::value));\n#endif\n\n    typedef typename detail::queue_signature::bind<A0, A1, A2>::type bound_args;\n\n    static const bool has_capacity = detail::extract_capacity<bound_args>::has_capacity;\n    static const size_t capacity = detail::extract_capacity<bound_args>::capacity + 1; // the queue uses one dummy node\n    static const bool fixed_sized = detail::extract_fixed_sized<bound_args>::value;\n    static const bool node_based = !(has_capacity || fixed_sized);\n    static const bool compile_time_sized = has_capacity;\n\n    struct BOOST_LOCKFREE_CACHELINE_ALIGNMENT node\n    {\n        typedef typename detail::select_tagged_handle<node, node_based>::tagged_handle_type tagged_node_handle;\n        typedef typename detail::select_tagged_handle<node, node_based>::handle_type handle_type;\n\n        node(T const & v, handle_type null_handle):\n            data(v)//, next(tagged_node_handle(0, 0))\n        {\n            /* increment tag to avoid ABA problem */\n            tagged_node_handle old_next = next.load(memory_order_relaxed);\n            tagged_node_handle new_next (null_handle, old_next.get_next_tag());\n            next.store(new_next, memory_order_release);\n        }\n\n        node (handle_type null_handle):\n            next(tagged_node_handle(null_handle, 0))\n        {}\n\n        node(void)\n        {}\n\n        atomic<tagged_node_handle> next;\n        T data;\n    };\n\n    typedef typename detail::extract_allocator<bound_args, node>::type node_allocator;\n    typedef typename detail::select_freelist<node, node_allocator, compile_time_sized, fixed_sized, capacity>::type pool_t;\n    typedef typename pool_t::tagged_node_handle tagged_node_handle;\n    typedef typename detail::select_tagged_handle<node, node_based>::handle_type handle_type;\n\n    void initialize(void)\n    {\n        node * n = pool.template construct<true, false>(pool.null_handle());\n        tagged_node_handle dummy_node(pool.get_handle(n), 0);\n        head_.store(dummy_node, memory_order_relaxed);\n        tail_.store(dummy_node, memory_order_release);\n    }\n\n    struct implementation_defined\n    {\n        typedef node_allocator allocator;\n        typedef std::size_t size_type;\n    };\n\n#endif\n\n    BOOST_DELETED_FUNCTION(queue(queue const&))\n    BOOST_DELETED_FUNCTION(queue& operator= (queue const&))\n\npublic:\n    typedef T value_type;\n    typedef typename implementation_defined::allocator allocator;\n    typedef typename implementation_defined::size_type size_type;\n\n    /**\n     * \\return true, if implementation is lock-free.\n     *\n     * \\warning It only checks, if the queue head and tail nodes and the freelist can be modified in a lock-free manner.\n     *       On most platforms, the whole implementation is lock-free, if this is true. Using c++0x-style atomics, there is\n     *       no possibility to provide a completely accurate implementation, because one would need to test every internal\n     *       node, which is impossible if further nodes will be allocated from the operating system.\n     * */\n    bool is_lock_free (void) const\n    {\n        return head_.is_lock_free() && tail_.is_lock_free() && pool.is_lock_free();\n    }\n\n    //! Construct queue\n    // @{\n    queue(void):\n        head_(tagged_node_handle(0, 0)),\n        tail_(tagged_node_handle(0, 0)),\n        pool(node_allocator(), capacity)\n    {\n        BOOST_ASSERT(has_capacity);\n        initialize();\n    }\n\n    template <typename U>\n    explicit queue(typename node_allocator::template rebind<U>::other const & alloc):\n        head_(tagged_node_handle(0, 0)),\n        tail_(tagged_node_handle(0, 0)),\n        pool(alloc, capacity)\n    {\n        BOOST_STATIC_ASSERT(has_capacity);\n        initialize();\n    }\n\n    explicit queue(allocator const & alloc):\n        head_(tagged_node_handle(0, 0)),\n        tail_(tagged_node_handle(0, 0)),\n        pool(alloc, capacity)\n    {\n        BOOST_ASSERT(has_capacity);\n        initialize();\n    }\n    // @}\n\n    //! Construct queue, allocate n nodes for the freelist.\n    // @{\n    explicit queue(size_type n):\n        head_(tagged_node_handle(0, 0)),\n        tail_(tagged_node_handle(0, 0)),\n        pool(node_allocator(), n + 1)\n    {\n        BOOST_ASSERT(!has_capacity);\n        initialize();\n    }\n\n    template <typename U>\n    queue(size_type n, typename node_allocator::template rebind<U>::other const & alloc):\n        head_(tagged_node_handle(0, 0)),\n        tail_(tagged_node_handle(0, 0)),\n        pool(alloc, n + 1)\n    {\n        BOOST_STATIC_ASSERT(!has_capacity);\n        initialize();\n    }\n    // @}\n\n    /** \\copydoc boost::lockfree::stack::reserve\n     * */\n    void reserve(size_type n)\n    {\n        pool.template reserve<true>(n);\n    }\n\n    /** \\copydoc boost::lockfree::stack::reserve_unsafe\n     * */\n    void reserve_unsafe(size_type n)\n    {\n        pool.template reserve<false>(n);\n    }\n\n    /** Destroys queue, free all nodes from freelist.\n     * */\n    ~queue(void)\n    {\n        T dummy;\n        while(unsynchronized_pop(dummy))\n        {}\n\n        pool.template destruct<false>(head_.load(memory_order_relaxed));\n    }\n\n    /** Check if the queue is empty\n     *\n     * \\return true, if the queue is empty, false otherwise\n     * \\note The result is only accurate, if no other thread modifies the queue. Therefore it is rarely practical to use this\n     *       value in program logic.\n     * */\n    bool empty(void) const\n    {\n        return pool.get_handle(head_.load()) == pool.get_handle(tail_.load());\n    }\n\n    /** Pushes object t to the queue.\n     *\n     * \\post object will be pushed to the queue, if internal node can be allocated\n     * \\returns true, if the push operation is successful.\n     *\n     * \\note Thread-safe. If internal memory pool is exhausted and the memory pool is not fixed-sized, a new node will be allocated\n     *                    from the OS. This may not be lock-free.\n     * */\n    bool push(T const & t)\n    {\n        return do_push<false>(t);\n    }\n\n    /** Pushes object t to the queue.\n     *\n     * \\post object will be pushed to the queue, if internal node can be allocated\n     * \\returns true, if the push operation is successful.\n     *\n     * \\note Thread-safe and non-blocking. If internal memory pool is exhausted, operation will fail\n     * \\throws if memory allocator throws\n     * */\n    bool bounded_push(T const & t)\n    {\n        return do_push<true>(t);\n    }\n\n\nprivate:\n#ifndef BOOST_DOXYGEN_INVOKED\n    template <bool Bounded>\n    bool do_push(T const & t)\n    {\n        node * n = pool.template construct<true, Bounded>(t, pool.null_handle());\n        handle_type node_handle = pool.get_handle(n);\n\n        if (n == NULL)\n            return false;\n\n        for (;;) {\n            tagged_node_handle tail = tail_.load(memory_order_acquire);\n            node * tail_node = pool.get_pointer(tail);\n            tagged_node_handle next = tail_node->next.load(memory_order_acquire);\n            node * next_ptr = pool.get_pointer(next);\n\n            tagged_node_handle tail2 = tail_.load(memory_order_acquire);\n            if (BOOST_LIKELY(tail == tail2)) {\n                if (next_ptr == 0) {\n                    tagged_node_handle new_tail_next(node_handle, next.get_next_tag());\n                    if ( tail_node->next.compare_exchange_weak(next, new_tail_next) ) {\n                        tagged_node_handle new_tail(node_handle, tail.get_next_tag());\n                        tail_.compare_exchange_strong(tail, new_tail);\n                        return true;\n                    }\n                }\n                else {\n                    tagged_node_handle new_tail(pool.get_handle(next_ptr), tail.get_next_tag());\n                    tail_.compare_exchange_strong(tail, new_tail);\n                }\n            }\n        }\n    }\n#endif\n\npublic:\n\n    /** Pushes object t to the queue.\n     *\n     * \\post object will be pushed to the queue, if internal node can be allocated\n     * \\returns true, if the push operation is successful.\n     *\n     * \\note Not Thread-safe. If internal memory pool is exhausted and the memory pool is not fixed-sized, a new node will be allocated\n     *       from the OS. This may not be lock-free.\n     * \\throws if memory allocator throws\n     * */\n    bool unsynchronized_push(T const & t)\n    {\n        node * n = pool.template construct<false, false>(t, pool.null_handle());\n\n        if (n == NULL)\n            return false;\n\n        for (;;) {\n            tagged_node_handle tail = tail_.load(memory_order_relaxed);\n            tagged_node_handle next = tail->next.load(memory_order_relaxed);\n            node * next_ptr = next.get_ptr();\n\n            if (next_ptr == 0) {\n                tail->next.store(tagged_node_handle(n, next.get_next_tag()), memory_order_relaxed);\n                tail_.store(tagged_node_handle(n, tail.get_next_tag()), memory_order_relaxed);\n                return true;\n            }\n            else\n                tail_.store(tagged_node_handle(next_ptr, tail.get_next_tag()), memory_order_relaxed);\n        }\n    }\n\n    /** Pops object from queue.\n     *\n     * \\post if pop operation is successful, object will be copied to ret.\n     * \\returns true, if the pop operation is successful, false if queue was empty.\n     *\n     * \\note Thread-safe and non-blocking\n     * */\n    bool pop (T & ret)\n    {\n        return pop<T>(ret);\n    }\n\n    /** Pops object from queue.\n     *\n     * \\pre type U must be constructible by T and copyable, or T must be convertible to U\n     * \\post if pop operation is successful, object will be copied to ret.\n     * \\returns true, if the pop operation is successful, false if queue was empty.\n     *\n     * \\note Thread-safe and non-blocking\n     * */\n    template <typename U>\n    bool pop (U & ret)\n    {\n        for (;;) {\n            tagged_node_handle head = head_.load(memory_order_acquire);\n            node * head_ptr = pool.get_pointer(head);\n\n            tagged_node_handle tail = tail_.load(memory_order_acquire);\n            tagged_node_handle next = head_ptr->next.load(memory_order_acquire);\n            node * next_ptr = pool.get_pointer(next);\n\n            tagged_node_handle head2 = head_.load(memory_order_acquire);\n            if (BOOST_LIKELY(head == head2)) {\n                if (pool.get_handle(head) == pool.get_handle(tail)) {\n                    if (next_ptr == 0)\n                        return false;\n\n                    tagged_node_handle new_tail(pool.get_handle(next), tail.get_next_tag());\n                    tail_.compare_exchange_strong(tail, new_tail);\n\n                } else {\n                    if (next_ptr == 0)\n                        /* this check is not part of the original algorithm as published by michael and scott\n                         *\n                         * however we reuse the tagged_ptr part for the freelist and clear the next part during node\n                         * allocation. we can observe a null-pointer here.\n                         * */\n                        continue;\n                    detail::copy_payload(next_ptr->data, ret);\n\n                    tagged_node_handle new_head(pool.get_handle(next), head.get_next_tag());\n                    if (head_.compare_exchange_weak(head, new_head)) {\n                        pool.template destruct<true>(head);\n                        return true;\n                    }\n                }\n            }\n        }\n    }\n\n    /** Pops object from queue.\n     *\n     * \\post if pop operation is successful, object will be copied to ret.\n     * \\returns true, if the pop operation is successful, false if queue was empty.\n     *\n     * \\note Not thread-safe, but non-blocking\n     *\n     * */\n    bool unsynchronized_pop (T & ret)\n    {\n        return unsynchronized_pop<T>(ret);\n    }\n\n    /** Pops object from queue.\n     *\n     * \\pre type U must be constructible by T and copyable, or T must be convertible to U\n     * \\post if pop operation is successful, object will be copied to ret.\n     * \\returns true, if the pop operation is successful, false if queue was empty.\n     *\n     * \\note Not thread-safe, but non-blocking\n     *\n     * */\n    template <typename U>\n    bool unsynchronized_pop (U & ret)\n    {\n        for (;;) {\n            tagged_node_handle head = head_.load(memory_order_relaxed);\n            node * head_ptr = pool.get_pointer(head);\n            tagged_node_handle tail = tail_.load(memory_order_relaxed);\n            tagged_node_handle next = head_ptr->next.load(memory_order_relaxed);\n            node * next_ptr = pool.get_pointer(next);\n\n            if (pool.get_handle(head) == pool.get_handle(tail)) {\n                if (next_ptr == 0)\n                    return false;\n\n                tagged_node_handle new_tail(pool.get_handle(next), tail.get_next_tag());\n                tail_.store(new_tail);\n            } else {\n                if (next_ptr == 0)\n                    /* this check is not part of the original algorithm as published by michael and scott\n                     *\n                     * however we reuse the tagged_ptr part for the freelist and clear the next part during node\n                     * allocation. we can observe a null-pointer here.\n                     * */\n                    continue;\n                detail::copy_payload(next_ptr->data, ret);\n                tagged_node_handle new_head(pool.get_handle(next), head.get_next_tag());\n                head_.store(new_head);\n                pool.template destruct<false>(head);\n                return true;\n            }\n        }\n    }\n\n    /** consumes one element via a functor\n     *\n     *  pops one element from the queue and applies the functor on this object\n     *\n     * \\returns true, if one element was consumed\n     *\n     * \\note Thread-safe and non-blocking, if functor is thread-safe and non-blocking\n     * */\n    template <typename Functor>\n    bool consume_one(Functor & f)\n    {\n        T element;\n        bool success = pop(element);\n        if (success)\n            f(element);\n\n        return success;\n    }\n\n    /// \\copydoc boost::lockfree::queue::consume_one(Functor & rhs)\n    template <typename Functor>\n    bool consume_one(Functor const & f)\n    {\n        T element;\n        bool success = pop(element);\n        if (success)\n            f(element);\n\n        return success;\n    }\n\n    /** consumes all elements via a functor\n     *\n     * sequentially pops all elements from the queue and applies the functor on each object\n     *\n     * \\returns number of elements that are consumed\n     *\n     * \\note Thread-safe and non-blocking, if functor is thread-safe and non-blocking\n     * */\n    template <typename Functor>\n    size_t consume_all(Functor & f)\n    {\n        size_t element_count = 0;\n        while (consume_one(f))\n            element_count += 1;\n\n        return element_count;\n    }\n\n    /// \\copydoc boost::lockfree::queue::consume_all(Functor & rhs)\n    template <typename Functor>\n    size_t consume_all(Functor const & f)\n    {\n        size_t element_count = 0;\n        while (consume_one(f))\n            element_count += 1;\n\n        return element_count;\n    }\n\nprivate:\n#ifndef BOOST_DOXYGEN_INVOKED\n    atomic<tagged_node_handle> head_;\n    static const int padding_size = BOOST_LOCKFREE_CACHELINE_BYTES - sizeof(tagged_node_handle);\n    char padding1[padding_size];\n    atomic<tagged_node_handle> tail_;\n    char padding2[padding_size];\n\n    pool_t pool;\n#endif\n};\n\n} /* namespace lockfree */\n} /* namespace boost */\n\n#if defined(_MSC_VER)\n#pragma warning(pop)\n#endif\n\n#endif /* BOOST_LOCKFREE_FIFO_HPP_INCLUDED */\n"
  },
  {
    "path": "benchmarks/boost/memory_order.hpp",
    "content": "#ifndef BOOST_MEMORY_ORDER_HPP_INCLUDED\n#define BOOST_MEMORY_ORDER_HPP_INCLUDED\n\n// MS compatible compilers support #pragma once\n\n#if defined(_MSC_VER) && (_MSC_VER >= 1020)\n# pragma once\n#endif\n\n//  boost/memory_order.hpp\n//\n//  Defines enum boost::memory_order per the C++0x working draft\n//\n//  Copyright (c) 2008, 2009 Peter Dimov\n//\n//  Distributed under the Boost Software License, Version 1.0.\n//  See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n\n\nnamespace boost\n{\n\n//\n// Enum values are chosen so that code that needs to insert\n// a trailing fence for acquire semantics can use a single\n// test such as:\n//\n// if( mo & memory_order_acquire ) { ...fence... }\n//\n// For leading fences one can use:\n//\n// if( mo & memory_order_release ) { ...fence... }\n//\n// Architectures such as Alpha that need a fence on consume\n// can use:\n//\n// if( mo & ( memory_order_acquire | memory_order_consume ) ) { ...fence... }\n//\n// The values are also in the order of increasing \"strength\"\n// of the fences so that success/failure orders can be checked\n// efficiently in compare_exchange methods.\n//\n\nenum memory_order\n{\n    memory_order_relaxed = 0,\n    memory_order_consume = 1,\n    memory_order_acquire = 2,\n    memory_order_release = 4,\n    memory_order_acq_rel = 6, // acquire | release\n    memory_order_seq_cst = 14 // acq_rel | 8\n};\n\n} // namespace boost\n\n#endif // #ifndef BOOST_MEMORY_ORDER_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/O1_size.hpp",
    "content": "\n#ifndef BOOST_MPL_O1_SIZE_HPP_INCLUDED\n#define BOOST_MPL_O1_SIZE_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/O1_size_fwd.hpp>\n#include <boost/mpl/sequence_tag.hpp>\n#include <boost/mpl/aux_/O1_size_impl.hpp>\n#include <boost/mpl/aux_/na_spec.hpp>\n#include <boost/mpl/aux_/lambda_support.hpp>\n\nnamespace boost { namespace mpl {\n\n// returns sequence size if it's an O(1) operation; otherwise returns -1\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(Sequence)\n    >\nstruct O1_size\n    : O1_size_impl< typename sequence_tag<Sequence>::type >\n        ::template apply< Sequence >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(1, O1_size, (Sequence))\n};\n\nBOOST_MPL_AUX_NA_SPEC(1, O1_size)\n\n}}\n\n#endif // BOOST_MPL_O1_SIZE_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/O1_size_fwd.hpp",
    "content": "\n#ifndef BOOST_MPL_O1_SIZE_FWD_HPP_INCLUDED\n#define BOOST_MPL_O1_SIZE_FWD_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\nnamespace boost { namespace mpl {\n\ntemplate< typename Tag > struct O1_size_impl;\ntemplate< typename Sequence > struct O1_size;\n\n}}\n\n#endif // BOOST_MPL_O1_SIZE_FWD_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/always.hpp",
    "content": "\n#ifndef BOOST_MPL_ALWAYS_HPP_INCLUDED\n#define BOOST_MPL_ALWAYS_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/preprocessor/default_params.hpp>\n#include <boost/mpl/aux_/na.hpp>\n#include <boost/mpl/aux_/arity_spec.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate< typename Value > struct always\n{\n    template<\n        BOOST_MPL_PP_DEFAULT_PARAMS(BOOST_MPL_LIMIT_METAFUNCTION_ARITY, typename T, na)\n        >\n    struct apply\n    {\n        typedef Value type;\n    };\n};\n\nBOOST_MPL_AUX_ARITY_SPEC(0, always)\n\n}}\n\n#endif // BOOST_MPL_ALWAYS_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/and.hpp",
    "content": "\n#ifndef BOOST_MPL_AND_HPP_INCLUDED\n#define BOOST_MPL_AND_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/use_preprocessed.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \\\n    && !defined(BOOST_MPL_PREPROCESSING_MODE)\n\n#   include <boost/mpl/bool.hpp>\n#   include <boost/mpl/aux_/nested_type_wknd.hpp>\n#   include <boost/mpl/aux_/na_spec.hpp>\n#   include <boost/mpl/aux_/lambda_support.hpp>\n\n// agurt, 19/may/04: workaround a conflict with <iso646.h> header's \n// 'or' and 'and' macros, see http://tinyurl.com/3et69; 'defined(and)'\n// has to be checked in a separate condition, otherwise GCC complains \n// about 'and' being an alternative token\n#if defined(_MSC_VER) && !defined(__clang__)\n#ifndef __GCCXML__\n#if defined(and) \n#   pragma push_macro(\"and\")\n#   undef and\n#   define and(x)\n#endif\n#endif\n#endif\n\n#   define BOOST_MPL_PREPROCESSED_HEADER and.hpp\n#   include <boost/mpl/aux_/include_preprocessed.hpp>\n\n#if defined(_MSC_VER) && !defined(__clang__)\n#ifndef __GCCXML__\n#if defined(and) \n#   pragma pop_macro(\"and\")\n#endif\n#endif\n#endif\n\n#else\n\n#   define AUX778076_OP_NAME and_\n#   define AUX778076_OP_VALUE1 false\n#   define AUX778076_OP_VALUE2 true\n#   include <boost/mpl/aux_/logical_op.hpp>\n\n#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS\n#endif // BOOST_MPL_AND_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/apply.hpp",
    "content": "\n#if !defined(BOOST_PP_IS_ITERATING)\n\n///// header body\n\n#ifndef BOOST_MPL_APPLY_HPP_INCLUDED\n#define BOOST_MPL_APPLY_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#if !defined(BOOST_MPL_PREPROCESSING_MODE)\n#   include <boost/mpl/apply_fwd.hpp>\n#   include <boost/mpl/apply_wrap.hpp>\n#   include <boost/mpl/placeholders.hpp>\n#   include <boost/mpl/lambda.hpp>\n#   include <boost/mpl/aux_/na.hpp>\n#   include <boost/mpl/aux_/lambda_support.hpp>\n#endif\n\n#include <boost/mpl/aux_/config/use_preprocessed.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \\\n    && !defined(BOOST_MPL_PREPROCESSING_MODE)\n\n#   define BOOST_MPL_PREPROCESSED_HEADER apply.hpp\n#   include <boost/mpl/aux_/include_preprocessed.hpp>\n\n#else\n\n#   include <boost/mpl/limits/arity.hpp>\n#   include <boost/mpl/aux_/preprocessor/params.hpp>\n#   include <boost/mpl/aux_/preprocessor/default_params.hpp>\n#   include <boost/mpl/aux_/preprocessor/partial_spec_params.hpp>\n#   include <boost/mpl/aux_/preprocessor/enum.hpp>\n#   include <boost/mpl/aux_/config/lambda.hpp>\n#   include <boost/mpl/aux_/config/dtp.hpp>\n#   include <boost/mpl/aux_/nttp_decl.hpp>\n#   include <boost/mpl/aux_/config/eti.hpp>\n#   include <boost/mpl/aux_/config/msvc.hpp>\n#   include <boost/mpl/aux_/config/workaround.hpp>\n\n#   include <boost/preprocessor/comma_if.hpp>\n#   include <boost/preprocessor/inc.hpp>\n#   include <boost/preprocessor/iterate.hpp>\n#   include <boost/preprocessor/cat.hpp>\n\nnamespace boost { namespace mpl {\n\n// local macros, #undef-ined at the end of the header\n#   define AUX778076_APPLY_PARAMS(param) \\\n    BOOST_MPL_PP_PARAMS( \\\n          BOOST_MPL_LIMIT_METAFUNCTION_ARITY \\\n        , param \\\n        ) \\\n    /**/\n\n#   define AUX778076_APPLY_DEF_PARAMS(param, value) \\\n    BOOST_MPL_PP_DEFAULT_PARAMS( \\\n          BOOST_MPL_LIMIT_METAFUNCTION_ARITY \\\n        , param \\\n        , value \\\n        ) \\\n    /**/\n\n#   define AUX778076_APPLY_N_PARAMS(n, param) \\\n    BOOST_MPL_PP_PARAMS(n, param) \\\n    /**/\n\n#   define AUX778076_APPLY_N_COMMA_PARAMS(n, param) \\\n    BOOST_PP_COMMA_IF(n) \\\n    BOOST_MPL_PP_PARAMS(n, param) \\\n    /**/\n\n#   define AUX778076_APPLY_N_PARTIAL_SPEC_PARAMS(n, param, def) \\\n    BOOST_PP_COMMA_IF(n) \\\n    BOOST_MPL_PP_PARTIAL_SPEC_PARAMS(n, param, def) \\\n    /**/\n    \n#   define AUX778076_APPLY_N_SPEC_PARAMS(n, param) \\\n    BOOST_MPL_PP_ENUM(BOOST_PP_INC(n), param) \\\n    /**/\n\n\n#define BOOST_PP_ITERATION_PARAMS_1 \\\n    (3,(0, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, <boost/mpl/apply.hpp>))\n#include BOOST_PP_ITERATE()\n\n#   if !defined(BOOST_MPL_CFG_NO_APPLY_TEMPLATE)\n// real C++ version is already taken care of\n#   if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)\n\nnamespace aux {\n// apply_count_args\n#define AUX778076_COUNT_ARGS_PREFIX apply\n#define AUX778076_COUNT_ARGS_DEFAULT na\n#define AUX778076_COUNT_ARGS_ARITY BOOST_MPL_LIMIT_METAFUNCTION_ARITY\n#include <boost/mpl/aux_/count_args.hpp>\n}\n\n\ntemplate<\n      typename F, AUX778076_APPLY_DEF_PARAMS(typename T, na)\n    >\nstruct apply\n    : aux::apply_chooser< \n          aux::apply_count_args< AUX778076_APPLY_PARAMS(T) >::value\n        >::template result_< F, AUX778076_APPLY_PARAMS(T) >::type\n{\n};\n\n#   endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION\n#   endif // BOOST_MPL_CFG_NO_APPLY_TEMPLATE\n\n#   undef AUX778076_APPLY_N_SPEC_PARAMS\n#   undef AUX778076_APPLY_N_PARTIAL_SPEC_PARAMS\n#   undef AUX778076_APPLY_N_COMMA_PARAMS\n#   undef AUX778076_APPLY_N_PARAMS\n#   undef AUX778076_APPLY_DEF_PARAMS\n#   undef AUX778076_APPLY_PARAMS\n\n}}\n\n#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS\n#endif // BOOST_MPL_APPLY_HPP_INCLUDED\n\n///// iteration, depth == 1\n\n// For gcc 4.4 compatability, we must include the\n// BOOST_PP_ITERATION_DEPTH test inside an #else clause.\n#else // BOOST_PP_IS_ITERATING\n#if BOOST_PP_ITERATION_DEPTH() == 1\n\n#   define i_ BOOST_PP_FRAME_ITERATION(1)\n\ntemplate<\n      typename F AUX778076_APPLY_N_COMMA_PARAMS(i_, typename T)\n    >\nstruct BOOST_PP_CAT(apply,i_)\n#if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)\n    : BOOST_PP_CAT(apply_wrap,i_)< \n          typename lambda<F>::type\n        AUX778076_APPLY_N_COMMA_PARAMS(i_, T)\n        >\n{\n#else\n{\n    typedef typename BOOST_PP_CAT(apply_wrap,i_)< \n          typename lambda<F>::type\n        AUX778076_APPLY_N_COMMA_PARAMS(i_, T)\n        >::type type;\n#endif\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          BOOST_PP_INC(i_)\n        , BOOST_PP_CAT(apply,i_)\n        , (F AUX778076_APPLY_N_COMMA_PARAMS(i_,T))\n        )\n};\n\n\n#if defined(BOOST_MPL_CFG_MSVC_ETI_BUG)\n/// workaround for ETI bug\ntemplate<>\nstruct BOOST_PP_CAT(apply,i_)<AUX778076_APPLY_N_SPEC_PARAMS(i_, int)>\n{\n    typedef int type;\n};\n#endif\n\n#   if !defined(BOOST_MPL_CFG_NO_APPLY_TEMPLATE)\n#   if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)\n\n#if i_ == BOOST_MPL_LIMIT_METAFUNCTION_ARITY\n/// primary template (not a specialization!)\ntemplate<\n      typename F AUX778076_APPLY_N_COMMA_PARAMS(i_, typename T)\n    >\nstruct apply\n    : BOOST_PP_CAT(apply,i_)< F AUX778076_APPLY_N_COMMA_PARAMS(i_, T) >\n{\n};\n#else\ntemplate<\n      typename F AUX778076_APPLY_N_COMMA_PARAMS(i_, typename T)\n    >\nstruct apply< F AUX778076_APPLY_N_PARTIAL_SPEC_PARAMS(i_, T, na) >\n    : BOOST_PP_CAT(apply,i_)< F AUX778076_APPLY_N_COMMA_PARAMS(i_, T) >\n{\n};\n#endif\n\n#   else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION\n\n#if !defined(BOOST_MPL_CFG_NO_APPLY_TEMPLATE)\nnamespace aux {\n\ntemplate<>\nstruct apply_chooser<i_>\n{\n    template<\n          typename F, AUX778076_APPLY_PARAMS(typename T)\n        >\n    struct result_\n    {\n        typedef BOOST_PP_CAT(apply,i_)<\n              F AUX778076_APPLY_N_COMMA_PARAMS(i_, T)\n            > type;\n    };\n};\n\n} // namespace aux\n#endif\n\n#   endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION\n#   endif // BOOST_MPL_CFG_NO_APPLY_TEMPLATE\n\n#   undef i_\n\n#endif // BOOST_PP_ITERATION_DEPTH()\n#endif // BOOST_PP_IS_ITERATING\n"
  },
  {
    "path": "benchmarks/boost/mpl/apply_fwd.hpp",
    "content": "\n#if !defined(BOOST_PP_IS_ITERATING)\n\n///// header body\n\n#ifndef BOOST_MPL_APPLY_FWD_HPP_INCLUDED\n#define BOOST_MPL_APPLY_FWD_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#if !defined(BOOST_MPL_PREPROCESSING_MODE)\n#   include <boost/mpl/aux_/na.hpp>\n#endif\n\n#include <boost/mpl/aux_/config/use_preprocessed.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \\\n    && !defined(BOOST_MPL_PREPROCESSING_MODE)\n\n#   define BOOST_MPL_PREPROCESSED_HEADER apply_fwd.hpp\n#   include <boost/mpl/aux_/include_preprocessed.hpp>\n\n#else\n\n#   include <boost/mpl/limits/arity.hpp>\n#   include <boost/mpl/aux_/preprocessor/params.hpp>\n#   include <boost/mpl/aux_/preprocessor/default_params.hpp>\n#   include <boost/mpl/aux_/config/ctps.hpp>\n#   include <boost/mpl/aux_/nttp_decl.hpp>\n\n#   include <boost/preprocessor/comma_if.hpp>\n#   include <boost/preprocessor/iterate.hpp>\n#   include <boost/preprocessor/cat.hpp>\n\n// agurt, 15/jan/02: top-level 'apply' template gives an ICE on MSVC\n// (for known reasons)\n#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)\n#   define BOOST_MPL_CFG_NO_APPLY_TEMPLATE\n#endif\n\nnamespace boost { namespace mpl {\n\n// local macro, #undef-ined at the end of the header\n#   define AUX778076_APPLY_DEF_PARAMS(param, value) \\\n    BOOST_MPL_PP_DEFAULT_PARAMS( \\\n          BOOST_MPL_LIMIT_METAFUNCTION_ARITY \\\n        , param \\\n        , value \\\n        ) \\\n    /**/\n\n#   define AUX778076_APPLY_N_COMMA_PARAMS(n, param) \\\n    BOOST_PP_COMMA_IF(n) \\\n    BOOST_MPL_PP_PARAMS(n, param) \\\n    /**/\n\n#   if !defined(BOOST_MPL_CFG_NO_APPLY_TEMPLATE)\n\n#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)\n// forward declaration\ntemplate<\n      typename F, AUX778076_APPLY_DEF_PARAMS(typename T, na)\n    >\nstruct apply;\n#else\nnamespace aux {\ntemplate< BOOST_AUX_NTTP_DECL(int, arity_) > struct apply_chooser;\n}\n#endif\n\n#   endif // BOOST_MPL_CFG_NO_APPLY_TEMPLATE\n\n#define BOOST_PP_ITERATION_PARAMS_1 \\\n    (3,(0, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, <boost/mpl/apply_fwd.hpp>))\n#include BOOST_PP_ITERATE()\n\n\n#   undef AUX778076_APPLY_N_COMMA_PARAMS\n#   undef AUX778076_APPLY_DEF_PARAMS\n\n}}\n\n#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS\n#endif // BOOST_MPL_APPLY_FWD_HPP_INCLUDED\n\n///// iteration\n\n#else\n#define i_ BOOST_PP_FRAME_ITERATION(1)\n\ntemplate<\n      typename F AUX778076_APPLY_N_COMMA_PARAMS(i_, typename T)\n    >\nstruct BOOST_PP_CAT(apply,i_);\n\n#undef i_\n#endif // BOOST_PP_IS_ITERATING\n"
  },
  {
    "path": "benchmarks/boost/mpl/apply_wrap.hpp",
    "content": "\n#if !defined(BOOST_PP_IS_ITERATING)\n\n///// header body\n\n#ifndef BOOST_MPL_APPLY_WRAP_HPP_INCLUDED\n#define BOOST_MPL_APPLY_WRAP_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2008\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#if !defined(BOOST_MPL_PREPROCESSING_MODE)\n#   include <boost/mpl/aux_/arity.hpp>\n#   include <boost/mpl/aux_/has_apply.hpp>\n#   include <boost/mpl/aux_/na.hpp>\n#   include <boost/mpl/aux_/msvc_never_true.hpp>\n#endif\n\n#include <boost/mpl/aux_/config/use_preprocessed.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \\\n    && !defined(BOOST_MPL_PREPROCESSING_MODE)\n\n#   define BOOST_MPL_PREPROCESSED_HEADER apply_wrap.hpp\n#   include <boost/mpl/aux_/include_preprocessed.hpp>\n\n#else\n\n#   include <boost/mpl/limits/arity.hpp>\n#   include <boost/mpl/aux_/preprocessor/params.hpp>\n#   include <boost/mpl/aux_/preprocessor/enum.hpp>\n#   include <boost/mpl/aux_/preprocessor/add.hpp>\n#   include <boost/mpl/aux_/config/bcc.hpp>\n#   include <boost/mpl/aux_/config/ctps.hpp>\n#   include <boost/mpl/aux_/config/dtp.hpp>\n#   include <boost/mpl/aux_/config/eti.hpp>\n#   include <boost/mpl/aux_/config/msvc.hpp>\n#   include <boost/mpl/aux_/config/workaround.hpp>\n\n#   include <boost/preprocessor/comma_if.hpp>\n#   include <boost/preprocessor/logical/and.hpp>\n#   include <boost/preprocessor/inc.hpp>\n#   include <boost/preprocessor/iterate.hpp>\n\n\nnamespace boost { namespace mpl {\n\n// local macros, #undef-ined at the end of the header\n#   define AUX778076_APPLY_WRAP_PARAMS(n, param) \\\n    BOOST_MPL_PP_PARAMS(n, param) \\\n    /**/\n\n#   define AUX778076_APPLY_WRAP_SPEC_PARAMS(n, param) \\\n    BOOST_MPL_PP_ENUM(BOOST_PP_INC(n), param) \\\n    /**/\n\n\n#define BOOST_PP_ITERATION_PARAMS_1 \\\n    (3,(0, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, <boost/mpl/apply_wrap.hpp>))\n#include BOOST_PP_ITERATE()\n\n\n#   undef AUX778076_APPLY_WRAP_SPEC_PARAMS\n#   undef AUX778076_APPLY_WRAP_PARAMS\n\n}}\n\n#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS\n#endif // BOOST_MPL_APPLY_WRAP_HPP_INCLUDED\n\n///// iteration, depth == 1\n\n// For gcc 4.4 compatability, we must include the\n// BOOST_PP_ITERATION_DEPTH test inside an #else clause.\n#else // BOOST_PP_IS_ITERATING\n#if BOOST_PP_ITERATION_DEPTH() == 1\n\n#   define i_ BOOST_PP_FRAME_ITERATION(1)\n\n#   if BOOST_WORKAROUND(BOOST_MSVC, < 1300)\n// MSVC version\n\n#define AUX778076_MSVC_DTW_NAME BOOST_PP_CAT(msvc_apply,i_)\n#define AUX778076_MSVC_DTW_ORIGINAL_NAME apply\n#define AUX778076_MSVC_DTW_ARITY i_\n#include <boost/mpl/aux_/msvc_dtw.hpp>\n\ntemplate<\n      typename F BOOST_PP_COMMA_IF(i_) AUX778076_APPLY_WRAP_PARAMS(i_, typename T)\n    >\nstruct BOOST_PP_CAT(apply_wrap,i_)\n{\n    // Metafunction forwarding confuses vc6\n    typedef typename BOOST_PP_CAT(msvc_apply,i_)<F>::template result_<\n          AUX778076_APPLY_WRAP_PARAMS(i_, T)\n        >::type type;\n};\n\n#   elif defined(BOOST_MPL_CFG_BROKEN_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES)\n// MWCW/Borland version\n\ntemplate<\n      int N, typename F BOOST_PP_COMMA_IF(i_) AUX778076_APPLY_WRAP_PARAMS(i_, typename T)\n    >\nstruct BOOST_PP_CAT(apply_wrap_impl,i_);\n\n#define BOOST_PP_ITERATION_PARAMS_2 \\\n    (3,(0, BOOST_MPL_LIMIT_METAFUNCTION_ARITY - i_, <boost/mpl/apply_wrap.hpp>))\n#include BOOST_PP_ITERATE()\n\ntemplate<\n      typename F BOOST_PP_COMMA_IF(i_) AUX778076_APPLY_WRAP_PARAMS(i_, typename T)\n    >\nstruct BOOST_PP_CAT(apply_wrap,i_)\n    : BOOST_PP_CAT(apply_wrap_impl,i_)<\n          ::boost::mpl::aux::arity<F,i_>::value\n        , F\n        BOOST_PP_COMMA_IF(i_) AUX778076_APPLY_WRAP_PARAMS(i_, T)\n        >::type\n{\n};\n\n#   else\n// ISO98 C++, with minor concession to vc7\n\ntemplate<\n      typename F BOOST_PP_COMMA_IF(i_) AUX778076_APPLY_WRAP_PARAMS(i_, typename T)\n#if i_ == 0\n    , typename has_apply_ = typename aux::has_apply<F>::type\n#endif\n    >\nstruct BOOST_PP_CAT(apply_wrap,i_)\n// metafunction forwarding confuses MSVC 7.0\n#if !BOOST_WORKAROUND(BOOST_MSVC, == 1300)\n    : F::template apply< AUX778076_APPLY_WRAP_PARAMS(i_, T) >\n{\n#else\n{    \n    typedef typename F::template apply<\n         AUX778076_APPLY_WRAP_PARAMS(i_, T)\n        >::type type;\n#endif\n};\n\n#if i_ == 0 && !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)\ntemplate< typename F >\nstruct BOOST_PP_CAT(apply_wrap,i_)<F,true_>\n    : F::apply\n{\n};\n#endif\n\n#   endif // workarounds\n\n#if defined(BOOST_MPL_CFG_MSVC_ETI_BUG)\n/// workaround for ETI bug\ntemplate<>\nstruct BOOST_PP_CAT(apply_wrap,i_)<AUX778076_APPLY_WRAP_SPEC_PARAMS(i_, int)>\n{\n    typedef int type;\n};\n#endif\n\n#   undef i_\n\n///// iteration, depth == 2\n\n#elif BOOST_PP_ITERATION_DEPTH() == 2\n\n#   define j_ BOOST_PP_FRAME_ITERATION(2)\n\n#if i_ == 0 && j_ == 0 \\\n    && defined(BOOST_MPL_CFG_BCC590_WORKAROUNDS) \\\n    && !defined(BOOST_MPL_CFG_NO_HAS_APPLY)\n\ntemplate< typename F, bool F_has_apply >\nstruct apply_wrap_impl0_bcb {\n    typedef typename F::template apply< na > type;\n};\n\ntemplate< typename F >\nstruct apply_wrap_impl0_bcb< F, true > {\n    typedef typename F::apply type;\n};\n\ntemplate<\n      typename F BOOST_PP_COMMA_IF(i_) AUX778076_APPLY_WRAP_PARAMS(i_, typename T)\n    >\nstruct BOOST_PP_CAT(apply_wrap_impl,i_)<\n          BOOST_MPL_PP_ADD(i_, j_)\n        , F\n        BOOST_PP_COMMA_IF(i_) AUX778076_APPLY_WRAP_PARAMS(i_, T)\n        >\n{\n    typedef apply_wrap_impl0_bcb< F, aux::has_apply< F >::value >::type type;\n};\n#else\n\ntemplate<\n      typename F BOOST_PP_COMMA_IF(i_) AUX778076_APPLY_WRAP_PARAMS(i_, typename T)\n    >\nstruct BOOST_PP_CAT(apply_wrap_impl,i_)<\n          BOOST_MPL_PP_ADD(i_, j_)\n        , F\n        BOOST_PP_COMMA_IF(i_) AUX778076_APPLY_WRAP_PARAMS(i_, T)\n        >\n{\n    typedef typename F::template apply<\n          AUX778076_APPLY_WRAP_PARAMS(i_, T)\n#if i_ == 0 && j_ == 0\n/// since the defaults are \"lost\", we have to pass *something* even for nullary\n/// metafunction classes\n        na\n#else\n        BOOST_PP_COMMA_IF(BOOST_PP_AND(i_, j_)) BOOST_MPL_PP_ENUM(j_, na)\n#endif\n        > type;\n};\n\n#endif\n\n#   undef j_\n\n#endif // BOOST_PP_ITERATION_DEPTH()\n#endif // BOOST_PP_IS_ITERATING\n"
  },
  {
    "path": "benchmarks/boost/mpl/arg.hpp",
    "content": "\n#if !defined(BOOST_PP_IS_ITERATING)\n\n///// header body\n\n#ifndef BOOST_MPL_ARG_HPP_INCLUDED\n#define BOOST_MPL_ARG_HPP_INCLUDED\n\n// Copyright Peter Dimov 2001-2002\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#if !defined(BOOST_MPL_PREPROCESSING_MODE)\n#   include <boost/mpl/arg_fwd.hpp>\n#   include <boost/mpl/aux_/na.hpp>\n#   include <boost/mpl/aux_/na_assert.hpp>\n#   include <boost/mpl/aux_/arity_spec.hpp>\n#   include <boost/mpl/aux_/arg_typedef.hpp>\n#endif\n\n#include <boost/mpl/aux_/config/static_constant.hpp>\n#include <boost/mpl/aux_/config/use_preprocessed.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \\\n    && !defined(BOOST_MPL_PREPROCESSING_MODE)\n\n#   define BOOST_MPL_PREPROCESSED_HEADER arg.hpp\n#   include <boost/mpl/aux_/include_preprocessed.hpp>\n\n#else\n\n#   include <boost/mpl/limits/arity.hpp>\n#   include <boost/mpl/aux_/preprocessor/default_params.hpp>\n#   include <boost/mpl/aux_/preprocessor/params.hpp>\n#   include <boost/mpl/aux_/config/lambda.hpp>\n#   include <boost/mpl/aux_/config/dtp.hpp>\n#   include <boost/mpl/aux_/nttp_decl.hpp>\n\n#   include <boost/preprocessor/iterate.hpp>\n#   include <boost/preprocessor/inc.hpp>\n#   include <boost/preprocessor/cat.hpp>\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\n\n// local macro, #undef-ined at the end of the header\n#if !defined(BOOST_MPL_CFG_NO_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES)\n#   define AUX778076_ARG_N_DEFAULT_PARAMS(param,value) \\\n    BOOST_MPL_PP_DEFAULT_PARAMS( \\\n          BOOST_MPL_LIMIT_METAFUNCTION_ARITY \\\n        , param \\\n        , value \\\n        ) \\\n    /**/\n#else\n#   define AUX778076_ARG_N_DEFAULT_PARAMS(param,value) \\\n    BOOST_MPL_PP_PARAMS( \\\n          BOOST_MPL_LIMIT_METAFUNCTION_ARITY \\\n        , param \\\n        ) \\\n    /**/\n#endif\n\n#define BOOST_PP_ITERATION_PARAMS_1 \\\n    (3,(0, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, <boost/mpl/arg.hpp>))\n#include BOOST_PP_ITERATE()\n\n\n#   undef AUX778076_ARG_N_DEFAULT_PARAMS\n\nBOOST_MPL_AUX_NONTYPE_ARITY_SPEC(1,int,arg)\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\n\n#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS\n#endif // BOOST_MPL_ARG_HPP_INCLUDED\n\n///// iteration\n\n#else\n#define i_ BOOST_PP_FRAME_ITERATION(1)\n\n#if i_ > 0\n\ntemplate<> struct arg<i_>\n{\n    BOOST_STATIC_CONSTANT(int, value = i_);\n    typedef arg<BOOST_PP_INC(i_)> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          AUX778076_ARG_N_DEFAULT_PARAMS(typename U, na)\n        >\n    struct apply\n    {\n        typedef BOOST_PP_CAT(U,i_) type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\n#else\n\ntemplate<> struct arg<-1>\n{\n    BOOST_STATIC_CONSTANT(int, value = -1);\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          AUX778076_ARG_N_DEFAULT_PARAMS(typename U, na)\n        >\n    struct apply\n    {\n        typedef U1 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\n#endif // i_ > 0\n\n#undef i_\n#endif // BOOST_PP_IS_ITERATING\n"
  },
  {
    "path": "benchmarks/boost/mpl/arg_fwd.hpp",
    "content": "\n#ifndef BOOST_MPL_ARG_FWD_HPP_INCLUDED\n#define BOOST_MPL_ARG_FWD_HPP_INCLUDED\n\n// Copyright Peter Dimov 2001-2002\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/adl_barrier.hpp>\n#include <boost/mpl/aux_/nttp_decl.hpp>\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\n\ntemplate< BOOST_MPL_AUX_NTTP_DECL(int, N) > struct arg;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nBOOST_MPL_AUX_ADL_BARRIER_DECL(arg)\n\n#endif // BOOST_MPL_ARG_FWD_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/assert.hpp",
    "content": "\n#ifndef BOOST_MPL_ASSERT_HPP_INCLUDED\n#define BOOST_MPL_ASSERT_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2006\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/not.hpp>\n#include <boost/mpl/aux_/value_wknd.hpp>\n#include <boost/mpl/aux_/nested_type_wknd.hpp>\n#include <boost/mpl/aux_/yes_no.hpp>\n#include <boost/mpl/aux_/na.hpp>\n#include <boost/mpl/aux_/adl_barrier.hpp>\n\n#include <boost/mpl/aux_/config/nttp.hpp>\n#include <boost/mpl/aux_/config/dtp.hpp>\n#include <boost/mpl/aux_/config/gcc.hpp>\n#include <boost/mpl/aux_/config/msvc.hpp>\n#include <boost/mpl/aux_/config/gpu.hpp>\n#include <boost/mpl/aux_/config/static_constant.hpp>\n#include <boost/mpl/aux_/config/pp_counter.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n#include <boost/preprocessor/cat.hpp>\n\n#include <boost/config.hpp> // make sure 'size_t' is placed into 'std'\n#include <cstddef>\n\n#if BOOST_WORKAROUND(BOOST_MSVC, == 1700)\n#include <boost/mpl/if.hpp>\n#endif\n\n#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) \\\n    || (BOOST_MPL_CFG_GCC != 0) \\\n    || BOOST_WORKAROUND(__IBMCPP__, <= 600)\n#   define BOOST_MPL_CFG_ASSERT_USE_RELATION_NAMES\n#endif\n\n#if BOOST_WORKAROUND(__MWERKS__, < 0x3202) \\\n    || BOOST_WORKAROUND(__EDG_VERSION__, <= 238) \\\n    || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) \\\n    || BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840))\n#   define BOOST_MPL_CFG_ASSERT_BROKEN_POINTER_TO_POINTER_TO_MEMBER\n#endif\n\n// agurt, 10/nov/06: use enums for Borland (which cannot cope with static constants) \n// and GCC (which issues \"unused variable\" warnings when static constants are used \n// at a function scope)\n#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) \\\n    || (BOOST_MPL_CFG_GCC != 0) || (BOOST_MPL_CFG_GPU != 0)\n#   define BOOST_MPL_AUX_ASSERT_CONSTANT(T, expr) enum { expr }\n#else\n#   define BOOST_MPL_AUX_ASSERT_CONSTANT(T, expr) BOOST_STATIC_CONSTANT(T, expr)\n#endif\n\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\n\nstruct failed {};\n\n// agurt, 24/aug/04: MSVC 7.1 workaround here and below: return/accept \n// 'assert<false>' by reference; can't apply it unconditionally -- apparently it\n// degrades the quality of GCC diagnostics\n#if BOOST_WORKAROUND(BOOST_MSVC, == 1310)\n#   define AUX778076_ASSERT_ARG(x) x&\n#else\n#   define AUX778076_ASSERT_ARG(x) x\n#endif\n\ntemplate< bool C >  struct assert        { typedef void* type; };\ntemplate<>          struct assert<false> { typedef AUX778076_ASSERT_ARG(assert) type; };\n\ntemplate< bool C >\nint assertion_failed( typename assert<C>::type );\n\ntemplate< bool C >\nstruct assertion\n{\n    static int failed( assert<false> );\n};\n\ntemplate<>\nstruct assertion<true>\n{\n    static int failed( void* );\n};\n\nstruct assert_\n{\n#if !defined(BOOST_MPL_CFG_NO_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES)\n    template< typename T1, typename T2 = na, typename T3 = na, typename T4 = na > struct types {};\n#endif\n    static assert_ const arg;\n    enum relations { equal = 1, not_equal, greater, greater_equal, less, less_equal };\n};\n\n\n#if !defined(BOOST_MPL_CFG_ASSERT_USE_RELATION_NAMES)\n\nbool operator==( failed, failed );\nbool operator!=( failed, failed );\nbool operator>( failed, failed );\nbool operator>=( failed, failed );\nbool operator<( failed, failed );\nbool operator<=( failed, failed );\n\n#if defined(__EDG_VERSION__)\ntemplate< bool (*)(failed, failed), long x, long y > struct assert_relation {};\n#   define BOOST_MPL_AUX_ASSERT_RELATION(x, y, r) assert_relation<r,x,y>\n#else\ntemplate< BOOST_MPL_AUX_NTTP_DECL(long, x), BOOST_MPL_AUX_NTTP_DECL(long, y), bool (*)(failed, failed) > \nstruct assert_relation {};\n#   define BOOST_MPL_AUX_ASSERT_RELATION(x, y, r) assert_relation<x,y,r>\n#endif\n\n#else // BOOST_MPL_CFG_ASSERT_USE_RELATION_NAMES\n\nboost::mpl::aux::weighted_tag<1>::type operator==( assert_, assert_ );\nboost::mpl::aux::weighted_tag<2>::type operator!=( assert_, assert_ );\nboost::mpl::aux::weighted_tag<3>::type operator>(  assert_, assert_ );\nboost::mpl::aux::weighted_tag<4>::type operator>=( assert_, assert_ );\nboost::mpl::aux::weighted_tag<5>::type operator<( assert_, assert_ );\nboost::mpl::aux::weighted_tag<6>::type operator<=( assert_, assert_ );\n\ntemplate< assert_::relations r, long x, long y > struct assert_relation {};\n\n#endif \n\n#if BOOST_WORKAROUND(BOOST_MSVC, == 1700)\n\ntemplate<class Pred>\nstruct extract_assert_pred;\n\ntemplate<class Pred>\nstruct extract_assert_pred<void(Pred)> { typedef Pred type; };\n\ntemplate<class Pred>\nstruct eval_assert {\n    typedef typename extract_assert_pred<Pred>::type P;\n    typedef typename P::type p_type;\n    typedef typename ::boost::mpl::if_c<p_type::value,\n        AUX778076_ASSERT_ARG(assert<false>),\n        failed ************ P::************\n    >::type type;\n};\n\ntemplate<class Pred>\nstruct eval_assert_not {\n    typedef typename extract_assert_pred<Pred>::type P;\n    typedef typename P::type p_type;\n    typedef typename ::boost::mpl::if_c<!p_type::value,\n        AUX778076_ASSERT_ARG(assert<false>),\n        failed ************ ::boost::mpl::not_<P>::************\n    >::type type;\n};\n\ntemplate< typename T >\nT make_assert_arg();\n\n#elif !defined(BOOST_MPL_CFG_ASSERT_BROKEN_POINTER_TO_POINTER_TO_MEMBER)\n\ntemplate< bool > struct assert_arg_pred_impl { typedef int type; };\ntemplate<> struct assert_arg_pred_impl<true> { typedef void* type; };\n\ntemplate< typename P > struct assert_arg_pred\n{\n    typedef typename P::type p_type;\n    typedef typename assert_arg_pred_impl< p_type::value >::type type;\n};\n\ntemplate< typename P > struct assert_arg_pred_not\n{\n    typedef typename P::type p_type;\n    BOOST_MPL_AUX_ASSERT_CONSTANT( bool, p = !p_type::value );\n    typedef typename assert_arg_pred_impl<p>::type type;\n};\n\ntemplate< typename Pred >\nfailed ************ (Pred::************ \n      assert_arg( void (*)(Pred), typename assert_arg_pred<Pred>::type )\n    );\n\ntemplate< typename Pred >\nfailed ************ (boost::mpl::not_<Pred>::************ \n      assert_not_arg( void (*)(Pred), typename assert_arg_pred_not<Pred>::type )\n    );\n\ntemplate< typename Pred >\nAUX778076_ASSERT_ARG(assert<false>)\nassert_arg( void (*)(Pred), typename assert_arg_pred_not<Pred>::type );\n\ntemplate< typename Pred >\nAUX778076_ASSERT_ARG(assert<false>)\nassert_not_arg( void (*)(Pred), typename assert_arg_pred<Pred>::type );\n\n\n#else // BOOST_MPL_CFG_ASSERT_BROKEN_POINTER_TO_POINTER_TO_MEMBER\n        \ntemplate< bool c, typename Pred > struct assert_arg_type_impl\n{\n    typedef failed      ************ Pred::* mwcw83_wknd;\n    typedef mwcw83_wknd ************* type;\n};\n\ntemplate< typename Pred > struct assert_arg_type_impl<true,Pred>\n{\n    typedef AUX778076_ASSERT_ARG(assert<false>) type;\n};\n\ntemplate< typename Pred > struct assert_arg_type\n    : assert_arg_type_impl< BOOST_MPL_AUX_VALUE_WKND(BOOST_MPL_AUX_NESTED_TYPE_WKND(Pred))::value, Pred >\n{\n};\n\ntemplate< typename Pred >\ntypename assert_arg_type<Pred>::type \nassert_arg(void (*)(Pred), int);\n\ntemplate< typename Pred >\ntypename assert_arg_type< boost::mpl::not_<Pred> >::type \nassert_not_arg(void (*)(Pred), int);\n\n#   if !defined(BOOST_MPL_CFG_ASSERT_USE_RELATION_NAMES)\ntemplate< long x, long y, bool (*r)(failed, failed) >\ntypename assert_arg_type_impl< false,BOOST_MPL_AUX_ASSERT_RELATION(x,y,r) >::type\nassert_rel_arg( BOOST_MPL_AUX_ASSERT_RELATION(x,y,r) );\n#   else\ntemplate< assert_::relations r, long x, long y >\ntypename assert_arg_type_impl< false,assert_relation<r,x,y> >::type\nassert_rel_arg( assert_relation<r,x,y> );\n#   endif\n\n#endif // BOOST_MPL_CFG_ASSERT_BROKEN_POINTER_TO_POINTER_TO_MEMBER\n\n#undef AUX778076_ASSERT_ARG\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\n\n#if BOOST_WORKAROUND(BOOST_MSVC, == 1700)\n\n// BOOST_MPL_ASSERT((pred<x,...>))\n\n#define BOOST_MPL_ASSERT(pred) \\\nBOOST_MPL_AUX_ASSERT_CONSTANT( \\\n      std::size_t \\\n    , BOOST_PP_CAT(mpl_assertion_in_line_,BOOST_MPL_AUX_PP_COUNTER()) = sizeof( \\\n          boost::mpl::assertion_failed<false>( \\\n              boost::mpl::make_assert_arg< \\\n                  typename boost::mpl::eval_assert<void pred>::type \\\n                >() \\\n            ) \\\n        ) \\\n    ) \\\n/**/\n\n// BOOST_MPL_ASSERT_NOT((pred<x,...>))\n\n#define BOOST_MPL_ASSERT_NOT(pred) \\\nBOOST_MPL_AUX_ASSERT_CONSTANT( \\\n      std::size_t \\\n    , BOOST_PP_CAT(mpl_assertion_in_line_,BOOST_MPL_AUX_PP_COUNTER()) = sizeof( \\\n          boost::mpl::assertion_failed<false>( \\\n              boost::mpl::make_assert_arg< \\\n                  typename boost::mpl::eval_assert_not<void pred>::type \\\n                >() \\\n            ) \\\n        ) \\\n    ) \\\n/**/\n\n#else\n\n// BOOST_MPL_ASSERT((pred<x,...>))\n\n#define BOOST_MPL_ASSERT(pred) \\\nBOOST_MPL_AUX_ASSERT_CONSTANT( \\\n      std::size_t \\\n    , BOOST_PP_CAT(mpl_assertion_in_line_,BOOST_MPL_AUX_PP_COUNTER()) = sizeof( \\\n          boost::mpl::assertion_failed<false>( \\\n              boost::mpl::assert_arg( (void (*) pred)0, 1 ) \\\n            ) \\\n        ) \\\n    ) \\\n/**/\n\n// BOOST_MPL_ASSERT_NOT((pred<x,...>))\n\n#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)\n#   define BOOST_MPL_ASSERT_NOT(pred) \\\nenum { \\\n      BOOST_PP_CAT(mpl_assertion_in_line_,BOOST_MPL_AUX_PP_COUNTER()) = sizeof( \\\n          boost::mpl::assertion<false>::failed( \\\n              boost::mpl::assert_not_arg( (void (*) pred)0, 1 ) \\\n            ) \\\n        ) \\\n}\\\n/**/\n#else\n#   define BOOST_MPL_ASSERT_NOT(pred) \\\nBOOST_MPL_AUX_ASSERT_CONSTANT( \\\n      std::size_t \\\n    , BOOST_PP_CAT(mpl_assertion_in_line_,BOOST_MPL_AUX_PP_COUNTER()) = sizeof( \\\n          boost::mpl::assertion_failed<false>( \\\n              boost::mpl::assert_not_arg( (void (*) pred)0, 1 ) \\\n            ) \\\n        ) \\\n   ) \\\n/**/\n#endif\n\n#endif\n\n// BOOST_MPL_ASSERT_RELATION(x, ==|!=|<=|<|>=|>, y)\n\n#if defined(BOOST_MPL_CFG_ASSERT_USE_RELATION_NAMES)\n\n#   if !defined(BOOST_MPL_CFG_ASSERT_BROKEN_POINTER_TO_POINTER_TO_MEMBER)\n// agurt, 9/nov/06: 'enum' below is a workaround for gcc 4.0.4/4.1.1 bugs #29522 and #29518\n#   define BOOST_MPL_ASSERT_RELATION_IMPL(counter, x, rel, y)      \\\nenum { BOOST_PP_CAT(mpl_assert_rel_value,counter) = (x rel y) }; \\\nBOOST_MPL_AUX_ASSERT_CONSTANT( \\\n      std::size_t \\\n    , BOOST_PP_CAT(mpl_assertion_in_line_,counter) = sizeof( \\\n        boost::mpl::assertion_failed<BOOST_PP_CAT(mpl_assert_rel_value,counter)>( \\\n            (boost::mpl::failed ************ ( boost::mpl::assert_relation< \\\n                  boost::mpl::assert_::relations( sizeof( \\\n                      boost::mpl::assert_::arg rel boost::mpl::assert_::arg \\\n                    ) ) \\\n                , x \\\n                , y \\\n                >::************)) 0 ) \\\n        ) \\\n    ) \\\n/**/\n#   else\n#   define BOOST_MPL_ASSERT_RELATION_IMPL(counter, x, rel, y)    \\\nBOOST_MPL_AUX_ASSERT_CONSTANT( \\\n      std::size_t \\\n    , BOOST_PP_CAT(mpl_assert_rel,counter) = sizeof( \\\n          boost::mpl::assert_::arg rel boost::mpl::assert_::arg \\\n        ) \\\n    ); \\\nBOOST_MPL_AUX_ASSERT_CONSTANT( bool, BOOST_PP_CAT(mpl_assert_rel_value,counter) = (x rel y) ); \\\nBOOST_MPL_AUX_ASSERT_CONSTANT( \\\n      std::size_t \\\n    , BOOST_PP_CAT(mpl_assertion_in_line_,counter) = sizeof( \\\n        boost::mpl::assertion_failed<BOOST_PP_CAT(mpl_assert_rel_value,counter)>( \\\n              boost::mpl::assert_rel_arg( boost::mpl::assert_relation< \\\n                  boost::mpl::assert_::relations(BOOST_PP_CAT(mpl_assert_rel,counter)) \\\n                , x \\\n                , y \\\n                >() ) \\\n            ) \\\n        ) \\\n    ) \\\n/**/\n#   endif\n\n#   define BOOST_MPL_ASSERT_RELATION(x, rel, y) \\\nBOOST_MPL_ASSERT_RELATION_IMPL(BOOST_MPL_AUX_PP_COUNTER(), x, rel, y) \\\n/**/\n\n#else // !BOOST_MPL_CFG_ASSERT_USE_RELATION_NAMES\n\n#   if defined(BOOST_MPL_CFG_ASSERT_BROKEN_POINTER_TO_POINTER_TO_MEMBER)\n#   define BOOST_MPL_ASSERT_RELATION(x, rel, y) \\\nBOOST_MPL_AUX_ASSERT_CONSTANT( \\\n      std::size_t \\\n    , BOOST_PP_CAT(mpl_assertion_in_line_,BOOST_MPL_AUX_PP_COUNTER()) = sizeof( \\\n        boost::mpl::assertion_failed<(x rel y)>( boost::mpl::assert_rel_arg( \\\n              boost::mpl::BOOST_MPL_AUX_ASSERT_RELATION(x,y,(&boost::mpl::operator rel))() \\\n            ) ) \\\n        ) \\\n    ) \\\n/**/\n#   else\n#   define BOOST_MPL_ASSERT_RELATION(x, rel, y) \\\nBOOST_MPL_AUX_ASSERT_CONSTANT( \\\n      std::size_t \\\n    , BOOST_PP_CAT(mpl_assertion_in_line_,BOOST_MPL_AUX_PP_COUNTER()) = sizeof( \\\n        boost::mpl::assertion_failed<(x rel y)>( (boost::mpl::failed ************ ( \\\n            boost::mpl::BOOST_MPL_AUX_ASSERT_RELATION(x,y,(&boost::mpl::operator rel))::************))0 ) \\\n        ) \\\n    ) \\\n/**/\n#   endif\n\n#endif\n\n\n// BOOST_MPL_ASSERT_MSG( (pred<x,...>::value), USER_PROVIDED_MESSAGE, (types<x,...>) ) \n\n#if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3202))\n#   define BOOST_MPL_ASSERT_MSG_IMPL( counter, c, msg, types_ ) \\\nstruct msg; \\\ntypedef struct BOOST_PP_CAT(msg,counter) : boost::mpl::assert_ \\\n{ \\\n    using boost::mpl::assert_::types; \\\n    static boost::mpl::failed ************ (msg::************ assert_arg()) types_ \\\n    { return 0; } \\\n} BOOST_PP_CAT(mpl_assert_arg,counter); \\\nBOOST_MPL_AUX_ASSERT_CONSTANT( \\\n      std::size_t \\\n    , BOOST_PP_CAT(mpl_assertion_in_line_,counter) = sizeof( \\\n        boost::mpl::assertion<(c)>::failed( BOOST_PP_CAT(mpl_assert_arg,counter)::assert_arg() ) \\\n        ) \\\n    ) \\\n/**/\n#else\n#   define BOOST_MPL_ASSERT_MSG_IMPL( counter, c, msg, types_ )  \\\nstruct msg; \\\ntypedef struct BOOST_PP_CAT(msg,counter) : boost::mpl::assert_ \\\n{ \\\n    static boost::mpl::failed ************ (msg::************ assert_arg()) types_ \\\n    { return 0; } \\\n} BOOST_PP_CAT(mpl_assert_arg,counter); \\\nBOOST_MPL_AUX_ASSERT_CONSTANT( \\\n      std::size_t \\\n    , BOOST_PP_CAT(mpl_assertion_in_line_,counter) = sizeof( \\\n        boost::mpl::assertion_failed<(c)>( BOOST_PP_CAT(mpl_assert_arg,counter)::assert_arg() ) \\\n        ) \\\n    ) \\\n/**/\n#endif\n\n#define BOOST_MPL_ASSERT_MSG( c, msg, types_ ) \\\nBOOST_MPL_ASSERT_MSG_IMPL( BOOST_MPL_AUX_PP_COUNTER(), c, msg, types_ ) \\\n/**/\n\n#endif // BOOST_MPL_ASSERT_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/at_fwd.hpp",
    "content": "\n#ifndef BOOST_MPL_AT_FWD_HPP_INCLUDED\n#define BOOST_MPL_AT_FWD_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\nnamespace boost { namespace mpl {\n\ntemplate< typename Tag > struct at_impl;\ntemplate< typename Sequence, typename N > struct at;\n\n}}\n\n#endif // BOOST_MPL_AT_FWD_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/O1_size_impl.hpp",
    "content": "\n#ifndef BOOST_MPL_O1_SIZE_IMPL_HPP_INCLUDED\n#define BOOST_MPL_O1_SIZE_IMPL_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/O1_size_fwd.hpp>\n#include <boost/mpl/long.hpp>\n#include <boost/mpl/if.hpp>\n#include <boost/mpl/aux_/has_size.hpp>\n#include <boost/mpl/aux_/config/forwarding.hpp>\n#include <boost/mpl/aux_/config/static_constant.hpp>\n#include <boost/mpl/aux_/config/msvc.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n\nnamespace boost { namespace mpl {\n\n// default implementation - returns 'Sequence::size' if sequence has a 'size'\n// member, and -1 otherwise; conrete sequences might override it by \n// specializing either the 'O1_size_impl' or the primary 'O1_size' template\n\n#   if !BOOST_WORKAROUND(BOOST_MSVC, < 1300) \\\n    && !BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003))\n\nnamespace aux {\ntemplate< typename Sequence > struct O1_size_impl\n    : Sequence::size\n{\n};\n}\n\ntemplate< typename Tag >\nstruct O1_size_impl\n{\n    template< typename Sequence > struct apply\n#if !defined(BOOST_MPL_CFG_NO_NESTED_FORWARDING)\n        : if_<\n              aux::has_size<Sequence>\n            , aux::O1_size_impl<Sequence>\n            , long_<-1>\n            >::type\n    {\n#else\n    {\n        typedef typename if_<\n              aux::has_size<Sequence>\n            , aux::O1_size_impl<Sequence>\n            , long_<-1>\n            >::type type;\n\n        BOOST_STATIC_CONSTANT(long, value =\n              (if_<\n                  aux::has_size<Sequence>\n                , aux::O1_size_impl<Sequence>\n                , long_<-1>\n                >::type::value)\n            );\n#endif\n    };\n};\n\n#   else // BOOST_MSVC\n\ntemplate< typename Tag >\nstruct O1_size_impl\n{\n    template< typename Sequence > struct apply\n        : long_<-1>\n        {\n        };\n};\n\n#   endif\n\n}}\n\n#endif // BOOST_MPL_O1_SIZE_IMPL_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/adl_barrier.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_ADL_BARRIER_HPP_INCLUDED\n#define BOOST_MPL_AUX_ADL_BARRIER_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2002-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/adl.hpp>\n#include <boost/mpl/aux_/config/gcc.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_ADL_BARRIER_NAMESPACE)\n\n#   define BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE mpl_\n#   define BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN namespace mpl_ {\n#   define BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE }\n#   define BOOST_MPL_AUX_ADL_BARRIER_DECL(type) \\\n    namespace boost { namespace mpl { \\\n    using ::BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::type; \\\n    } } \\\n/**/\n\n#if !defined(BOOST_MPL_PREPROCESSING_MODE)\nnamespace BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE { namespace aux {} }\nnamespace boost { namespace mpl { using namespace BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE; \nnamespace aux { using namespace BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::aux; }\n}}\n#endif\n\n#else // BOOST_MPL_CFG_NO_ADL_BARRIER_NAMESPACE\n\n#   define BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE boost::mpl\n#   define BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN namespace boost { namespace mpl {\n#   define BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE }}\n#   define BOOST_MPL_AUX_ADL_BARRIER_DECL(type) /**/\n\n#endif\n\n#endif // BOOST_MPL_AUX_ADL_BARRIER_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/arg_typedef.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_ARG_TYPEDEF_HPP_INCLUDED\n#define BOOST_MPL_AUX_ARG_TYPEDEF_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/lambda.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n#if defined(BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT) \\\n    || BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840))\n    \n#   define BOOST_MPL_AUX_ARG_TYPEDEF(T, name) typedef T name;\n\n#else\n\n#   define BOOST_MPL_AUX_ARG_TYPEDEF(T, name) /**/\n\n#endif\n\n#endif // BOOST_MPL_AUX_ARG_TYPEDEF_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/arity.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_ARITY_HPP_INCLUDED\n#define BOOST_MPL_AUX_ARITY_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/dtp.hpp>\n\n#if defined(BOOST_MPL_CFG_BROKEN_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES)\n\n#   include <boost/mpl/aux_/nttp_decl.hpp>\n#   include <boost/mpl/aux_/config/static_constant.hpp>\n\nnamespace boost { namespace mpl { namespace aux {\n\n// agurt, 15/mar/02: it's possible to implement the template so that it will \n// \"just work\" and do not require any specialization, but not on the compilers\n// that require the arity workaround in the first place\ntemplate< typename F, BOOST_MPL_AUX_NTTP_DECL(int, N) >\nstruct arity\n{\n    BOOST_STATIC_CONSTANT(int, value = N);\n};\n\n}}}\n\n#endif // BOOST_MPL_CFG_BROKEN_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES\n\n#endif // BOOST_MPL_AUX_ARITY_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/arity_spec.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_ARITY_SPEC_HPP_INCLUDED\n#define BOOST_MPL_AUX_ARITY_SPEC_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/int.hpp>\n#include <boost/mpl/limits/arity.hpp>\n#include <boost/mpl/aux_/config/dtp.hpp>\n#include <boost/mpl/aux_/preprocessor/params.hpp>\n#include <boost/mpl/aux_/arity.hpp>\n#include <boost/mpl/aux_/template_arity_fwd.hpp>\n#include <boost/mpl/aux_/config/ttp.hpp>\n#include <boost/mpl/aux_/config/lambda.hpp>\n#include <boost/mpl/aux_/config/static_constant.hpp>\n\n#if defined(BOOST_MPL_CFG_BROKEN_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES)\n#   define BOOST_MPL_AUX_NONTYPE_ARITY_SPEC(i,type,name) \\\nnamespace aux { \\\ntemplate< BOOST_MPL_AUX_NTTP_DECL(int, N), BOOST_MPL_PP_PARAMS(i,type T) > \\\nstruct arity< \\\n      name< BOOST_MPL_PP_PARAMS(i,T) > \\\n    , N \\\n    > \\\n{ \\\n    BOOST_STATIC_CONSTANT(int \\\n        , value = BOOST_MPL_LIMIT_METAFUNCTION_ARITY \\\n        ); \\\n}; \\\n} \\\n/**/\n#else\n#   define BOOST_MPL_AUX_NONTYPE_ARITY_SPEC(i,type,name) /**/\n#endif\n\n#   define BOOST_MPL_AUX_ARITY_SPEC(i,name) \\\n    BOOST_MPL_AUX_NONTYPE_ARITY_SPEC(i,typename,name) \\\n/**/\n\n\n#if defined(BOOST_MPL_CFG_EXTENDED_TEMPLATE_PARAMETERS_MATCHING) \\\n    && !defined(BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT)\n#   define BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(i, name) \\\nnamespace aux { \\\ntemplate< BOOST_MPL_PP_PARAMS(i,typename T) > \\\nstruct template_arity< name<BOOST_MPL_PP_PARAMS(i,T)> > \\\n    : int_<i> \\\n{ \\\n}; \\\n} \\\n/**/\n#else\n#   define BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(i, name) /**/\n#endif\n\n\n#endif // BOOST_MPL_AUX_ARITY_SPEC_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/begin_end_impl.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_BEGIN_END_IMPL_HPP_INCLUDED\n#define BOOST_MPL_AUX_BEGIN_END_IMPL_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0.\n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/begin_end_fwd.hpp>\n#include <boost/mpl/sequence_tag_fwd.hpp>\n#include <boost/mpl/void.hpp>\n#include <boost/mpl/eval_if.hpp>\n#include <boost/mpl/aux_/has_begin.hpp>\n#include <boost/mpl/aux_/na.hpp>\n#include <boost/mpl/aux_/traits_lambda_spec.hpp>\n#include <boost/mpl/aux_/config/eti.hpp>\n\nnamespace boost { namespace mpl {\n\n\nnamespace aux { \n\ntemplate< typename Sequence > \nstruct begin_type \n{ \n    typedef typename Sequence::begin type; \n};\ntemplate< typename Sequence > \nstruct end_type\n{ \n    typedef typename Sequence::end type; \n};\n\n}\n\n// default implementation; conrete sequences might override it by \n// specializing either the 'begin_impl/end_impl' or the primary \n// 'begin/end' templates\n\ntemplate< typename Tag >\nstruct begin_impl\n{\n    template< typename Sequence > struct apply\n    {\n        typedef typename eval_if<aux::has_begin<Sequence, true_>,\n                                 aux::begin_type<Sequence>, void_>::type type;\n    };\n};\n\ntemplate< typename Tag >\nstruct end_impl\n{\n    template< typename Sequence > struct apply\n    {\n        typedef typename eval_if<aux::has_begin<Sequence, true_>,\n                                 aux::end_type<Sequence>, void_>::type type;\n    };\n};\n\n// specialize 'begin_trait/end_trait' for two pre-defined tags\n\n#   define AUX778076_IMPL_SPEC(name, tag, result) \\\ntemplate<> \\\nstruct name##_impl<tag> \\\n{ \\\n    template< typename Sequence > struct apply \\\n    { \\\n        typedef result type; \\\n    }; \\\n}; \\\n/**/\n\n// a sequence with nested 'begin/end' typedefs; just query them\nAUX778076_IMPL_SPEC(begin, nested_begin_end_tag, typename Sequence::begin)\nAUX778076_IMPL_SPEC(end, nested_begin_end_tag, typename Sequence::end)\n\n// if a type 'T' does not contain 'begin/end' or 'tag' members \n// and doesn't specialize either 'begin/end' or 'begin_impl/end_impl' \n// templates, then we end up here\nAUX778076_IMPL_SPEC(begin, non_sequence_tag, void_)\nAUX778076_IMPL_SPEC(end, non_sequence_tag, void_)\nAUX778076_IMPL_SPEC(begin, na, void_)\nAUX778076_IMPL_SPEC(end, na, void_)\n\n#   undef AUX778076_IMPL_SPEC\n\n\nBOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC_IMPL(1,begin_impl)\nBOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC_IMPL(1,end_impl)\n\n}}\n\n#endif // BOOST_MPL_AUX_BEGIN_END_IMPL_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/clear_impl.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_CLEAR_IMPL_HPP_INCLUDED\n#define BOOST_MPL_AUX_CLEAR_IMPL_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/clear_fwd.hpp>\n#include <boost/mpl/aux_/traits_lambda_spec.hpp>\n#include <boost/mpl/aux_/config/eti.hpp>\n\nnamespace boost { namespace mpl {\n\n// no default implementation; the definition is needed to make MSVC happy\n\ntemplate< typename Tag >\nstruct clear_impl\n{\n    template< typename Sequence > struct apply;\n};\n\nBOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC(1, clear_impl)\n\n}}\n\n#endif // BOOST_MPL_AUX_CLEAR_IMPL_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/common_name_wknd.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_COMMON_NAME_WKND_HPP_INCLUDED\n#define BOOST_MPL_AUX_COMMON_NAME_WKND_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2002-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n#if BOOST_WORKAROUND(__BORLANDC__, < 0x561)\n// agurt, 12/nov/02: to suppress the bogus \"Cannot have both a template class \n// and function named 'xxx'\" diagnostic\n#   define BOOST_MPL_AUX_COMMON_NAME_WKND(name) \\\nnamespace name_##wknd { \\\ntemplate< typename > void name(); \\\n} \\\n/**/\n\n#else\n\n#   define BOOST_MPL_AUX_COMMON_NAME_WKND(name) /**/\n\n#endif // __BORLANDC__\n\n#endif // BOOST_MPL_AUX_COMMON_NAME_WKND_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/config/adl.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_CONFIG_ADL_HPP_INCLUDED\n#define BOOST_MPL_AUX_CONFIG_ADL_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2002-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/msvc.hpp>\n#include <boost/mpl/aux_/config/intel.hpp>\n#include <boost/mpl/aux_/config/gcc.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n// agurt, 25/apr/04: technically, the ADL workaround is only needed for GCC,\n// but putting everything expect public, user-specializable metafunctions into\n// a separate global namespace has a nice side effect of reducing the length \n// of template instantiation symbols, so we apply the workaround on all \n// platforms that can handle it\n\n#if !defined(BOOST_MPL_CFG_NO_ADL_BARRIER_NAMESPACE) \\\n    && (   BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1400)) \\\n        || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) \\\n        || BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840)) \\\n        || BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3202)) \\\n        || BOOST_WORKAROUND(BOOST_INTEL_CXX_VERSION, BOOST_TESTED_AT(810)) \\\n        )\n\n#   define BOOST_MPL_CFG_NO_ADL_BARRIER_NAMESPACE\n\n#endif\n\n#endif // BOOST_MPL_AUX_CONFIG_ADL_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/config/arrays.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_CONFIG_ARRAYS_HPP_INCLUDED\n#define BOOST_MPL_AUX_CONFIG_ARRAYS_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2003-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/msvc.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n#if    !defined(BOOST_MPL_CFG_NO_DEPENDENT_ARRAY_TYPES) \\\n    && !defined(BOOST_MPL_PREPROCESSING_MODE) \\\n    && ( BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) \\\n        || BOOST_WORKAROUND(BOOST_MSVC, <= 1300) \\\n        )\n\n#   define BOOST_MPL_CFG_NO_DEPENDENT_ARRAY_TYPES\n\n#endif\n\n#endif // BOOST_MPL_AUX_CONFIG_ARRAYS_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/config/bcc.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_CONFIG_BCC_HPP_INCLUDED\n#define BOOST_MPL_AUX_CONFIG_BCC_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2008\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date: 2004-09-02 10:41:37 -0500 (Thu, 02 Sep 2004) $\n// $Revision: 24874 $\n\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n#if    !defined(BOOST_MPL_CFG_BCC590_WORKAROUNDS) \\\n    && !defined(BOOST_MPL_PREPROCESSING_MODE) \\\n    && BOOST_WORKAROUND(__BORLANDC__, >= 0x590) \\\n    && BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610))\n\n#   define BOOST_MPL_CFG_BCC590_WORKAROUNDS\n\n#endif\n\n#endif // BOOST_MPL_AUX_CONFIG_BCC_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/config/bind.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_CONFIG_BIND_HPP_INCLUDED\n#define BOOST_MPL_AUX_CONFIG_BIND_HPP_INCLUDED\n\n// Copyright David Abrahams 2002\n// Copyright Aleksey Gurtovoy 2002-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/msvc.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n#if    !defined(BOOST_MPL_CFG_NO_BIND_TEMPLATE) \\\n    && !defined(BOOST_MPL_PREPROCESSING_MODE) \\\n    && (   BOOST_WORKAROUND(BOOST_MSVC, <= 1300) \\\n        || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) \\\n        )\n\n#   define BOOST_MPL_CFG_NO_BIND_TEMPLATE\n\n#endif\n\n//#define BOOST_MPL_CFG_NO_UNNAMED_PLACEHOLDER_SUPPORT\n\n#endif // BOOST_MPL_AUX_CONFIG_BIND_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/config/compiler.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_CONFIG_COMPILER_HPP_INCLUDED\n#define BOOST_MPL_AUX_CONFIG_COMPILER_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2001-2008\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#if !defined(BOOST_MPL_CFG_COMPILER_DIR)\n\n#   include <boost/mpl/aux_/config/dtp.hpp>\n#   include <boost/mpl/aux_/config/ttp.hpp>\n#   include <boost/mpl/aux_/config/ctps.hpp>\n#   include <boost/mpl/aux_/config/msvc.hpp>\n#   include <boost/mpl/aux_/config/gcc.hpp>\n#   include <boost/mpl/aux_/config/workaround.hpp>\n\n#   if BOOST_WORKAROUND(BOOST_MSVC, < 1300)\n#       define BOOST_MPL_CFG_COMPILER_DIR msvc60\n\n#   elif BOOST_WORKAROUND(BOOST_MSVC, == 1300)\n#       define BOOST_MPL_CFG_COMPILER_DIR msvc70\n\n#   elif BOOST_WORKAROUND(BOOST_MPL_CFG_GCC, BOOST_TESTED_AT(0x0304))\n#       define BOOST_MPL_CFG_COMPILER_DIR gcc\n\n#   elif BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610))\n#       if !defined(BOOST_MPL_CFG_NO_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES)\n#           define BOOST_MPL_CFG_COMPILER_DIR bcc551\n#       elif BOOST_WORKAROUND(__BORLANDC__, >= 0x590)\n#           define BOOST_MPL_CFG_COMPILER_DIR bcc\n#       else\n#           define BOOST_MPL_CFG_COMPILER_DIR bcc_pre590\n#       endif\n\n#   elif BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840))\n#       define BOOST_MPL_CFG_COMPILER_DIR dmc\n\n#   elif defined(__MWERKS__)\n#       if defined(BOOST_MPL_CFG_BROKEN_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES)\n#           define BOOST_MPL_CFG_COMPILER_DIR mwcw\n#       else\n#           define BOOST_MPL_CFG_COMPILER_DIR plain\n#       endif\n\n#   elif defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)\n#       define BOOST_MPL_CFG_COMPILER_DIR no_ctps\n\n#   elif defined(BOOST_MPL_CFG_NO_TEMPLATE_TEMPLATE_PARAMETERS)\n#       define BOOST_MPL_CFG_COMPILER_DIR no_ttp\n\n#   else\n#       define BOOST_MPL_CFG_COMPILER_DIR plain\n#   endif\n\n#endif // BOOST_MPL_CFG_COMPILER_DIR\n\n#endif // BOOST_MPL_AUX_CONFIG_COMPILER_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/config/ctps.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_CONFIG_CTPS_HPP_INCLUDED\n#define BOOST_MPL_AUX_CONFIG_CTPS_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/workaround.hpp>\n#include <boost/config.hpp>\n\n#if    !defined(BOOST_MPL_CFG_NO_NONTYPE_TEMPLATE_PARTIAL_SPEC) \\\n    && !defined(BOOST_MPL_PREPROCESSING_MODE) \\\n    && BOOST_WORKAROUND(__BORLANDC__, < 0x582)\n\n#   define BOOST_MPL_CFG_NO_NONTYPE_TEMPLATE_PARTIAL_SPEC\n\n#endif\n\n// BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION is defined in <boost/config.hpp>\n\n#endif // BOOST_MPL_AUX_CONFIG_CTPS_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/config/dmc_ambiguous_ctps.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_CONFIG_DMC_AMBIGUOUS_CTPS_HPP_INCLUDED\n#define BOOST_MPL_AUX_CONFIG_DMC_AMBIGUOUS_CTPS_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n#if    !defined(BOOST_MPL_CFG_DMC_AMBIGUOUS_CTPS) \\\n    && !defined(BOOST_MPL_PREPROCESSING_MODE) \\\n    && BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840))\n\n#   define BOOST_MPL_CFG_DMC_AMBIGUOUS_CTPS\n\n#endif\n\n#endif // BOOST_MPL_AUX_CONFIG_DMC_AMBIGUOUS_CTPS_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/config/dtp.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_CONFIG_DTP_HPP_INCLUDED\n#define BOOST_MPL_AUX_CONFIG_DTP_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n// MWCW 7.x-8.0 \"losts\" default template parameters of nested class \n// templates when their owner classes are passed as arguments to other \n// templates; Borland 5.5.1 \"forgets\" them from the very beginning (if \n// the owner class is a class template), and Borland 5.6 isn't even\n// able to compile a definition of nested class template with DTP\n\n#if    !defined(BOOST_MPL_CFG_NO_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES) \\\n    && !defined(BOOST_MPL_PREPROCESSING_MODE) \\\n    && BOOST_WORKAROUND(__BORLANDC__, >= 0x560) \\\n    && BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610))\n\n#   define BOOST_MPL_CFG_NO_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES\n\n#endif\n\n\n#if    !defined(BOOST_MPL_CFG_BROKEN_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES) \\\n    && !defined(BOOST_MPL_PREPROCESSING_MODE) \\\n    && (   BOOST_WORKAROUND(__MWERKS__, <= 0x3001) \\\n        || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) \\\n        || defined(BOOST_MPL_CFG_NO_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES) \\\n        )\n        \n#   define BOOST_MPL_CFG_BROKEN_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES\n\n#endif\n\n#endif // BOOST_MPL_AUX_CONFIG_DTP_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/config/eti.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_CONFIG_ETI_HPP_INCLUDED\n#define BOOST_MPL_AUX_CONFIG_ETI_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/msvc.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n// flags for MSVC 6.5's so-called \"early template instantiation bug\"\n#if    !defined(BOOST_MPL_CFG_MSVC_60_ETI_BUG) \\\n    && !defined(BOOST_MPL_PREPROCESSING_MODE) \\\n    && BOOST_WORKAROUND(BOOST_MSVC, < 1300)\n\n#   define BOOST_MPL_CFG_MSVC_60_ETI_BUG\n\n#endif\n\n#if    !defined(BOOST_MPL_CFG_MSVC_70_ETI_BUG) \\\n    && !defined(BOOST_MPL_PREPROCESSING_MODE) \\\n    && BOOST_WORKAROUND(BOOST_MSVC, == 1300)\n\n#   define BOOST_MPL_CFG_MSVC_70_ETI_BUG\n\n#endif\n\n#if    !defined(BOOST_MPL_CFG_MSVC_ETI_BUG) \\\n    && !defined(BOOST_MPL_PREPROCESSING_MODE) \\\n    && ( defined(BOOST_MPL_CFG_MSVC_60_ETI_BUG) \\\n        || defined(BOOST_MPL_CFG_MSVC_70_ETI_BUG) \\\n        )\n\n#   define BOOST_MPL_CFG_MSVC_ETI_BUG\n\n#endif\n\n#endif // BOOST_MPL_AUX_CONFIG_ETI_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/config/forwarding.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_CONFIG_FORWARDING_HPP_INCLUDED\n#define BOOST_MPL_AUX_CONFIG_FORWARDING_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n#if    !defined(BOOST_MPL_CFG_NO_NESTED_FORWARDING) \\\n    && !defined(BOOST_MPL_PREPROCESSING_MODE) \\\n    && BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610))\n\n#   define BOOST_MPL_CFG_NO_NESTED_FORWARDING\n\n#endif\n\n#endif // BOOST_MPL_AUX_CONFIG_FORWARDING_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/config/gcc.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_CONFIG_GCC_HPP_INCLUDED\n#define BOOST_MPL_AUX_CONFIG_GCC_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#if defined(__GNUC__) && !defined(__EDG_VERSION__)\n#   define BOOST_MPL_CFG_GCC ((__GNUC__ << 8) | __GNUC_MINOR__)\n#else\n#   define BOOST_MPL_CFG_GCC 0\n#endif\n\n#endif // BOOST_MPL_AUX_CONFIG_GCC_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/config/gpu.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_CONFIG_GPU_HPP_INCLUDED\n#define BOOST_MPL_AUX_CONFIG_GPU_HPP_INCLUDED\n\n// Copyright Eric Niebler 2014\n//\n// Distributed under the Boost Software License, Version 1.0.\n// (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/config.hpp>\n\n#if !defined(BOOST_MPL_CFG_GPU_ENABLED) \\\n\n#   define BOOST_MPL_CFG_GPU_ENABLED BOOST_GPU_ENABLED\n\n#endif\n\n#if defined __CUDACC__\n\n#    define BOOST_MPL_CFG_GPU 1\n\n#else\n\n#    define BOOST_MPL_CFG_GPU 0\n\n#endif\n\n#endif // BOOST_MPL_AUX_CONFIG_GPU_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/config/has_apply.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_CONFIG_HAS_APPLY_HPP_INCLUDED\n#define BOOST_MPL_AUX_CONFIG_HAS_APPLY_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/has_xxx.hpp>\n#include <boost/mpl/aux_/config/msvc.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_HAS_APPLY) \\\n    && (   defined(BOOST_MPL_CFG_NO_HAS_XXX) \\\n        || BOOST_WORKAROUND(__EDG_VERSION__, < 300) \\\n        || BOOST_WORKAROUND(BOOST_MSVC, <= 1300) \\\n        || BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3202)) \\\n        )\n\n#   define BOOST_MPL_CFG_NO_HAS_APPLY\n\n#endif\n\n#endif // BOOST_MPL_AUX_CONFIG_HAS_APPLY_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/config/has_xxx.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_CONFIG_HAS_XXX_HPP_INCLUDED\n#define BOOST_MPL_AUX_CONFIG_HAS_XXX_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2002-2004\n// Copyright David Abrahams 2002-2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/overload_resolution.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n// agurt, 11/jan/03: signals a stub-only 'has_xxx' implementation\n\n#if !defined(BOOST_MPL_CFG_NO_HAS_XXX) \\\n    && (   defined(BOOST_MPL_CFG_BROKEN_OVERLOAD_RESOLUTION) \\\n        || BOOST_WORKAROUND(__GNUC__, <= 2) \\\n        || BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840)) \\\n        )\n\n#   define BOOST_MPL_CFG_NO_HAS_XXX\n#   define BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE\n\n#endif\n\n#endif // BOOST_MPL_AUX_CONFIG_HAS_XXX_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/config/integral.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_CONFIG_INTEGRAL_HPP_INCLUDED\n#define BOOST_MPL_AUX_CONFIG_INTEGRAL_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/msvc.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n#if    !defined(BOOST_MPL_CFG_BCC_INTEGRAL_CONSTANTS) \\\n    && !defined(BOOST_MPL_PREPROCESSING_MODE) \\\n    && BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610))\n\n#   define BOOST_MPL_CFG_BCC_INTEGRAL_CONSTANTS\n\n#endif\n\n#if    !defined(BOOST_MPL_CFG_NO_NESTED_VALUE_ARITHMETIC) \\\n    && !defined(BOOST_MPL_PREPROCESSING_MODE) \\\n    && ( BOOST_WORKAROUND(BOOST_MSVC, <= 1300) \\\n        || BOOST_WORKAROUND(__EDG_VERSION__, <= 238) \\\n        )\n\n#   define BOOST_MPL_CFG_NO_NESTED_VALUE_ARITHMETIC\n\n#endif\n\n#endif // BOOST_MPL_AUX_CONFIG_INTEGRAL_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/config/intel.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_CONFIG_INTEL_HPP_INCLUDED\n#define BOOST_MPL_AUX_CONFIG_INTEL_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n\n// BOOST_INTEL_CXX_VERSION is defined here:\n#include <boost/config.hpp>\n\n#endif // BOOST_MPL_AUX_CONFIG_INTEL_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/config/lambda.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_CONFIG_LAMBDA_HPP_INCLUDED\n#define BOOST_MPL_AUX_CONFIG_LAMBDA_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2002-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/ttp.hpp>\n#include <boost/mpl/aux_/config/ctps.hpp>\n\n// agurt, 15/jan/02: full-fledged implementation requires both \n// template template parameters _and_ partial specialization\n\n#if    !defined(BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT) \\\n    && (   defined(BOOST_MPL_CFG_NO_TEMPLATE_TEMPLATE_PARAMETERS) \\\n        || defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \\\n        )\n\n#   define BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT\n\n#endif\n\n#endif // BOOST_MPL_AUX_CONFIG_LAMBDA_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/config/msvc.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_CONFIG_MSVC_HPP_INCLUDED\n#define BOOST_MPL_AUX_CONFIG_MSVC_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2002-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n\n// BOOST_MSVC is defined here:\n#include <boost/config.hpp>\n\n#endif // BOOST_MPL_AUX_CONFIG_MSVC_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/config/msvc_typename.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_CONFIG_MSVC_TYPENAME_HPP_INCLUDED\n#define BOOST_MPL_AUX_CONFIG_MSVC_TYPENAME_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/msvc.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)\n#   define BOOST_MSVC_TYPENAME\n#else\n#   define BOOST_MSVC_TYPENAME typename\n#endif\n\n#endif // BOOST_MPL_AUX_CONFIG_MSVC_TYPENAME_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/config/nttp.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_CONFIG_NTTP_HPP_INCLUDED\n#define BOOST_MPL_AUX_CONFIG_NTTP_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/msvc.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n// MSVC 6.5 ICE-s on the code as simple as this (see \"aux_/nttp_decl.hpp\"\n// for a workaround):\n//\n//    namespace std {\n//    template< typename Char > struct string;\n//    }\n//\n//    void foo(std::string<char>);\n//\n//    namespace boost { namespace mpl {\n//    template< int > struct arg;\n//    }}\n\n#if    !defined(BOOST_MPL_CFG_NTTP_BUG) \\\n    && !defined(BOOST_MPL_PREPROCESSING_MODE) \\\n    && BOOST_WORKAROUND(BOOST_MSVC, < 1300)\n\n#   define BOOST_MPL_CFG_NTTP_BUG\n\n#endif\n\n#endif // BOOST_MPL_AUX_CONFIG_NTTP_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/config/operators.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_CONFIG_OPERATORS_HPP_INCLUDED\n#define BOOST_MPL_AUX_CONFIG_OPERATORS_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2003-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/gcc.hpp>\n#include <boost/mpl/aux_/config/msvc.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n#if !defined(BOOST_MPL_CFG_USE_OPERATORS_OVERLOADING) \\\n    && ( BOOST_WORKAROUND(BOOST_MSVC, <= 1300) \\\n        || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) \\\n        || BOOST_WORKAROUND(__EDG_VERSION__, <= 245) \\\n        || BOOST_WORKAROUND(BOOST_MPL_CFG_GCC, <= 0x0295) \\\n        || BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(600)) \\\n        || BOOST_WORKAROUND(__NVCC__, BOOST_TESTED_AT(1)) \\\n        )\n\n#   define BOOST_MPL_CFG_USE_OPERATORS_OVERLOADING\n\n#endif\n\n#endif // BOOST_MPL_AUX_CONFIG_OPERATORS_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/config/overload_resolution.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_CONFIG_OVERLOAD_RESOLUTION_HPP_INCLUDED\n#define BOOST_MPL_AUX_CONFIG_OVERLOAD_RESOLUTION_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2002-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n#if    !defined(BOOST_MPL_CFG_BROKEN_OVERLOAD_RESOLUTION) \\\n    && !defined(BOOST_MPL_PREPROCESSING_MODE) \\\n    && (   BOOST_WORKAROUND(__BORLANDC__, < 0x590) \\\n        || BOOST_WORKAROUND(__MWERKS__, < 0x3001) \\\n        )\n\n#   define BOOST_MPL_CFG_BROKEN_OVERLOAD_RESOLUTION\n\n#endif\n\n#endif // BOOST_MPL_AUX_CONFIG_OVERLOAD_RESOLUTION_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/config/pp_counter.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_CONFIG_PP_COUNTER_HPP_INCLUDED\n#define BOOST_MPL_AUX_CONFIG_PP_COUNTER_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2006\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#if !defined(BOOST_MPL_AUX_PP_COUNTER)\n#   include <boost/mpl/aux_/config/msvc.hpp>\n#   if BOOST_WORKAROUND(BOOST_MSVC, >= 1300)\n#       define BOOST_MPL_AUX_PP_COUNTER() __COUNTER__\n#   else\n#       define BOOST_MPL_AUX_PP_COUNTER() __LINE__\n#   endif\n#endif\n\n#endif // BOOST_MPL_AUX_CONFIG_PP_COUNTER_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/config/preprocessor.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_CONFIG_PREPROCESSOR_HPP_INCLUDED\n#define BOOST_MPL_AUX_CONFIG_PREPROCESSOR_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n#if !defined(BOOST_MPL_CFG_BROKEN_PP_MACRO_EXPANSION) \\\n    && (   BOOST_WORKAROUND(__MWERKS__, <= 0x3003) \\\n        || BOOST_WORKAROUND(__BORLANDC__, < 0x582) \\\n        || BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(502)) \\\n        )\n\n#   define BOOST_MPL_CFG_BROKEN_PP_MACRO_EXPANSION\n\n#endif\n\n#if !defined(BOOST_MPL_CFG_NO_OWN_PP_PRIMITIVES)\n#   define BOOST_MPL_CFG_NO_OWN_PP_PRIMITIVES\n#endif\n\n#if !defined(BOOST_NEEDS_TOKEN_PASTING_OP_FOR_TOKENS_JUXTAPOSING) \\\n    && BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840))\n#   define BOOST_NEEDS_TOKEN_PASTING_OP_FOR_TOKENS_JUXTAPOSING\n#endif\n\n\n#endif // BOOST_MPL_AUX_CONFIG_PREPROCESSOR_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/config/static_constant.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_CONFIG_STATIC_CONSTANT_HPP_INCLUDED\n#define BOOST_MPL_AUX_CONFIG_STATIC_CONSTANT_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#if !defined(BOOST_MPL_PREPROCESSING_MODE)\n// BOOST_STATIC_CONSTANT is defined here:\n#   include <boost/config.hpp>\n#else\n// undef the macro for the preprocessing mode\n#   undef BOOST_STATIC_CONSTANT\n#endif\n\n#endif // BOOST_MPL_AUX_CONFIG_STATIC_CONSTANT_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/config/ttp.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_CONFIG_TTP_HPP_INCLUDED\n#define BOOST_MPL_AUX_CONFIG_TTP_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/msvc.hpp>\n#include <boost/mpl/aux_/config/gcc.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_TEMPLATE_TEMPLATE_PARAMETERS) \\\n    && ( defined(BOOST_NO_TEMPLATE_TEMPLATES) \\\n      || BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT( 0x590) ) \\\n       )\n\n#   define BOOST_MPL_CFG_NO_TEMPLATE_TEMPLATE_PARAMETERS\n\n#endif\n\n\n#if    !defined(BOOST_MPL_CFG_EXTENDED_TEMPLATE_PARAMETERS_MATCHING) \\\n    && !defined(BOOST_MPL_PREPROCESSING_MODE) \\\n    && (   BOOST_WORKAROUND(BOOST_MPL_CFG_GCC, BOOST_TESTED_AT(0x0302)) \\\n        || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) \\\n        )\n\n#   define BOOST_MPL_CFG_EXTENDED_TEMPLATE_PARAMETERS_MATCHING\n\n#endif\n\n#endif // BOOST_MPL_AUX_CONFIG_TTP_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/config/use_preprocessed.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_CONFIG_USE_PREPROCESSED_HPP_INCLUDED\n#define BOOST_MPL_AUX_CONFIG_USE_PREPROCESSED_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n// #define BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS\n\n#endif // BOOST_MPL_AUX_CONFIG_USE_PREPROCESSED_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/config/workaround.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_CONFIG_WORKAROUND_HPP_INCLUDED\n#define BOOST_MPL_AUX_CONFIG_WORKAROUND_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2002-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/detail/workaround.hpp>\n\n#endif // BOOST_MPL_AUX_CONFIG_WORKAROUND_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/count_args.hpp",
    "content": "\n// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/preprocessor/expr_if.hpp>\n#include <boost/preprocessor/inc.hpp>\n#include <boost/preprocessor/cat.hpp>\n\n#if !defined(AUX778076_COUNT_ARGS_PARAM_NAME)\n#   define AUX778076_COUNT_ARGS_PARAM_NAME T\n#endif\n\n#if !defined(AUX778076_COUNT_ARGS_TEMPLATE_PARAM)\n#   define AUX778076_COUNT_ARGS_TEMPLATE_PARAM typename AUX778076_COUNT_ARGS_PARAM_NAME\n#endif\n\n// local macros, #undef-ined at the end of the header\n\n#if !defined(AUX778076_COUNT_ARGS_USE_STANDARD_PP_PRIMITIVES)\n\n#   include <boost/mpl/aux_/preprocessor/repeat.hpp>\n#   include <boost/mpl/aux_/preprocessor/params.hpp>\n\n#   define AUX778076_COUNT_ARGS_REPEAT BOOST_MPL_PP_REPEAT\n#   define AUX778076_COUNT_ARGS_PARAMS(param) \\\n    BOOST_MPL_PP_PARAMS( \\\n          AUX778076_COUNT_ARGS_ARITY \\\n        , param \\\n        ) \\\n    /**/\n\n#else\n\n#   include <boost/preprocessor/enum_shifted_params.hpp>\n#   include <boost/preprocessor/repeat.hpp>\n#   include <boost/preprocessor/inc.hpp>\n\n#   define AUX778076_COUNT_ARGS_REPEAT BOOST_PP_REPEAT\n#   define AUX778076_COUNT_ARGS_PARAMS(param) \\\n    BOOST_PP_ENUM_SHIFTED_PARAMS( \\\n          BOOST_PP_INC(AUX778076_COUNT_ARGS_ARITY) \\\n        , param \\\n        ) \\\n    /**/\n\n#endif // AUX778076_COUNT_ARGS_USE_STANDARD_PP_PRIMITIVES\n\n\n#define AUX778076_IS_ARG_TEMPLATE_NAME \\\n    BOOST_PP_CAT(is_,BOOST_PP_CAT(AUX778076_COUNT_ARGS_PREFIX,_arg)) \\\n/**/\n\n#define AUX778076_COUNT_ARGS_FUNC(unused, i, param) \\\n    BOOST_PP_EXPR_IF(i, +) \\\n    AUX778076_IS_ARG_TEMPLATE_NAME<BOOST_PP_CAT(param,BOOST_PP_INC(i))>::value \\\n/**/\n\n// is_<xxx>_arg\ntemplate< AUX778076_COUNT_ARGS_TEMPLATE_PARAM >\nstruct AUX778076_IS_ARG_TEMPLATE_NAME\n{\n    BOOST_STATIC_CONSTANT(bool, value = true);\n};\n\ntemplate<>\nstruct AUX778076_IS_ARG_TEMPLATE_NAME<AUX778076_COUNT_ARGS_DEFAULT>\n{\n    BOOST_STATIC_CONSTANT(bool, value = false);\n};\n\n// <xxx>_count_args\ntemplate<\n      AUX778076_COUNT_ARGS_PARAMS(AUX778076_COUNT_ARGS_TEMPLATE_PARAM)\n    >\nstruct BOOST_PP_CAT(AUX778076_COUNT_ARGS_PREFIX,_count_args)\n{\n    BOOST_STATIC_CONSTANT(int, value = AUX778076_COUNT_ARGS_REPEAT(\n          AUX778076_COUNT_ARGS_ARITY\n        , AUX778076_COUNT_ARGS_FUNC\n        , AUX778076_COUNT_ARGS_PARAM_NAME\n        ));\n};\n\n#undef AUX778076_COUNT_ARGS_FUNC\n#undef AUX778076_IS_ARG_TEMPLATE_NAME\n#undef AUX778076_COUNT_ARGS_PARAMS\n#undef AUX778076_COUNT_ARGS_REPEAT\n\n#undef AUX778076_COUNT_ARGS_ARITY\n#undef AUX778076_COUNT_ARGS_DEFAULT\n#undef AUX778076_COUNT_ARGS_PREFIX\n#undef AUX778076_COUNT_ARGS_USE_STANDARD_PP_PRIMITIVES\n#undef AUX778076_COUNT_ARGS_TEMPLATE_PARAM\n#undef AUX778076_COUNT_ARGS_PARAM_NAME\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/find_if_pred.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_FIND_IF_PRED_HPP_INCLUDED\n#define BOOST_MPL_AUX_FIND_IF_PRED_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Eric Friedman 2002\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n#include <boost/mpl/aux_/iter_apply.hpp>\n#include <boost/mpl/not.hpp>\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< typename Predicate >\nstruct find_if_pred\n{\n    template< typename Iterator >\n    struct apply\n    {\n        typedef not_< aux::iter_apply1<Predicate,Iterator> > type;\n    };\n};\n\n}}}\n\n#endif // BOOST_MPL_AUX_FIND_IF_PRED_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/fold_impl.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_FOLD_IMPL_HPP_INCLUDED\n#define BOOST_MPL_AUX_FOLD_IMPL_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#if !defined(BOOST_MPL_PREPROCESSING_MODE)\n#   include <boost/mpl/next_prior.hpp>\n#   include <boost/mpl/apply.hpp>\n#   include <boost/mpl/deref.hpp>\n#   include <boost/mpl/aux_/config/ctps.hpp>\n#   if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)\n#       include <boost/mpl/if.hpp>\n#       include <boost/type_traits/is_same.hpp>\n#   endif\n#endif\n\n#include <boost/mpl/aux_/config/use_preprocessed.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \\\n    && !defined(BOOST_MPL_PREPROCESSING_MODE)\n\n#   define BOOST_MPL_PREPROCESSED_HEADER fold_impl.hpp\n#   include <boost/mpl/aux_/include_preprocessed.hpp>\n\n#else\n\n#   define AUX778076_FOLD_IMPL_OP(iter) typename deref<iter>::type\n#   define AUX778076_FOLD_IMPL_NAME_PREFIX fold\n#   include <boost/mpl/aux_/fold_impl_body.hpp>\n\n#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS\n#endif // BOOST_MPL_AUX_FOLD_IMPL_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/fold_impl_body.hpp",
    "content": "\n// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION\n\n#if !defined(BOOST_PP_IS_ITERATING)\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#   include <boost/mpl/limits/unrolling.hpp>\n#   include <boost/mpl/aux_/preprocessor/repeat.hpp>\n#   include <boost/mpl/aux_/config/workaround.hpp>\n#   include <boost/mpl/aux_/config/ctps.hpp>\n#   include <boost/mpl/aux_/nttp_decl.hpp>\n#   include <boost/mpl/aux_/config/eti.hpp>\n\n#   include <boost/preprocessor/iterate.hpp>\n#   include <boost/preprocessor/dec.hpp>\n#   include <boost/preprocessor/cat.hpp>\n\n// local macros, #undef-ined at the end of the header\n\n#   define AUX778076_ITER_FOLD_STEP(unused, i, unused2) \\\n    typedef typename apply2< \\\n          ForwardOp \\\n        , BOOST_PP_CAT(state,i) \\\n        , AUX778076_FOLD_IMPL_OP(BOOST_PP_CAT(iter,i)) \\\n        >::type BOOST_PP_CAT(state,BOOST_PP_INC(i)); \\\n    typedef typename mpl::next<BOOST_PP_CAT(iter,i)>::type \\\n        BOOST_PP_CAT(iter,BOOST_PP_INC(i)); \\\n    /**/\n\n#   define AUX778076_FOLD_IMPL_NAME \\\n    BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_impl) \\\n    /**/\n\n#   define AUX778076_FOLD_CHUNK_NAME \\\n    BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_chunk) \\\n    /**/\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\ntemplate<\n      BOOST_MPL_AUX_NTTP_DECL(int, N)\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    > \nstruct AUX778076_FOLD_IMPL_NAME;\n\n#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)\n\n#   if !BOOST_WORKAROUND(__BORLANDC__, < 0x600)\n\n#   define BOOST_PP_ITERATION_PARAMS_1 \\\n    (3,(0, BOOST_MPL_LIMIT_UNROLLING, <boost/mpl/aux_/fold_impl_body.hpp>))\n#   include BOOST_PP_ITERATE()\n\n// implementation for N that exceeds BOOST_MPL_LIMIT_UNROLLING\ntemplate<\n      BOOST_MPL_AUX_NTTP_DECL(int, N)\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    > \nstruct AUX778076_FOLD_IMPL_NAME\n{\n    typedef AUX778076_FOLD_IMPL_NAME<\n          BOOST_MPL_LIMIT_UNROLLING\n        , First\n        , Last\n        , State\n        , ForwardOp\n        > chunk_;\n\n    typedef AUX778076_FOLD_IMPL_NAME<\n          ( (N - BOOST_MPL_LIMIT_UNROLLING) < 0 ? 0 : N - BOOST_MPL_LIMIT_UNROLLING )\n        , typename chunk_::iterator\n        , Last\n        , typename chunk_::state\n        , ForwardOp\n        > res_;\n        \n    typedef typename res_::state state;\n    typedef typename res_::iterator iterator;\n};\n\n// fallback implementation for sequences of unknown size\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    > \nstruct AUX778076_FOLD_IMPL_NAME<-1,First,Last,State,ForwardOp>\n    : AUX778076_FOLD_IMPL_NAME<\n          -1\n        , typename mpl::next<First>::type\n        , Last\n        , typename apply2<ForwardOp,State,AUX778076_FOLD_IMPL_OP(First)>::type\n        , ForwardOp\n        >\n{\n};\n\ntemplate<\n      typename Last\n    , typename State\n    , typename ForwardOp\n    > \nstruct AUX778076_FOLD_IMPL_NAME<-1,Last,Last,State,ForwardOp>\n{\n    typedef State state;\n    typedef Last iterator;\n};\n\n#   else // BOOST_WORKAROUND(__BORLANDC__, < 0x600)\n\n// Borland have some serious problems with the unrolled version, so\n// we always use a basic implementation\ntemplate<\n      BOOST_MPL_AUX_NTTP_DECL(int, N)\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    > \nstruct AUX778076_FOLD_IMPL_NAME\n{\n    typedef AUX778076_FOLD_IMPL_NAME<\n          -1\n        , typename mpl::next<First>::type\n        , Last\n        , typename apply2<ForwardOp,State,AUX778076_FOLD_IMPL_OP(First)>::type\n        , ForwardOp\n        > res_;\n\n    typedef typename res_::state state;\n    typedef typename res_::iterator iterator;\n    typedef state type;\n};\n\ntemplate<\n      BOOST_MPL_AUX_NTTP_DECL(int, N)\n     , typename Last\n    , typename State\n    , typename ForwardOp\n    > \nstruct AUX778076_FOLD_IMPL_NAME<N,Last,Last,State,ForwardOp >\n{\n    typedef State state;\n    typedef Last iterator;\n    typedef state type;\n};\n\n#   endif // BOOST_WORKAROUND(__BORLANDC__, < 0x600)\n \n#else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION\n\ntemplate< BOOST_MPL_AUX_NTTP_DECL(int, N) >\nstruct AUX778076_FOLD_CHUNK_NAME;\n\n#   define BOOST_PP_ITERATION_PARAMS_1 \\\n    (3,(0, BOOST_MPL_LIMIT_UNROLLING, <boost/mpl/aux_/fold_impl_body.hpp>))\n#   include BOOST_PP_ITERATE()\n\n// implementation for N that exceeds BOOST_MPL_LIMIT_UNROLLING\ntemplate< BOOST_MPL_AUX_NTTP_DECL(int, N) > \nstruct AUX778076_FOLD_CHUNK_NAME\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        > \n    struct result_\n    {\n        typedef AUX778076_FOLD_IMPL_NAME<\n              BOOST_MPL_LIMIT_UNROLLING\n            , First\n            , Last\n            , State\n            , ForwardOp\n            > chunk_;\n\n        typedef AUX778076_FOLD_IMPL_NAME<\n              ( (N - BOOST_MPL_LIMIT_UNROLLING) < 0 ? 0 : N - BOOST_MPL_LIMIT_UNROLLING )\n            , typename chunk_::iterator\n            , Last\n            , typename chunk_::state\n            , ForwardOp\n            > res_;\n\n        typedef typename res_::state state;\n        typedef typename res_::iterator iterator;\n    };\n};\n\n// fallback implementation for sequences of unknown size\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    > \nstruct BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_step);\n\ntemplate<\n      typename Last\n    , typename State\n    >\nstruct BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_null_step)\n{\n    typedef Last iterator;\n    typedef State state;\n};\n\ntemplate<> \nstruct AUX778076_FOLD_CHUNK_NAME<-1>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        > \n    struct result_\n    {\n        typedef typename if_<\n              typename is_same<First,Last>::type\n            , BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_null_step)<Last,State>\n            , BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_step)<First,Last,State,ForwardOp>\n            >::type res_;\n\n        typedef typename res_::state state;\n        typedef typename res_::iterator iterator;\n    };\n\n#if defined(BOOST_MPL_CFG_MSVC_60_ETI_BUG)\n    /// ETI workaround\n    template<> struct result_<int,int,int,int>\n    {\n        typedef int state;\n        typedef int iterator;\n    };\n#endif\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    > \nstruct BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_step)\n{\n    // can't inherit here - it breaks MSVC 7.0\n    typedef AUX778076_FOLD_CHUNK_NAME<-1>::template result_<\n          typename mpl::next<First>::type\n        , Last\n        , typename apply2<ForwardOp,State,AUX778076_FOLD_IMPL_OP(First)>::type\n        , ForwardOp\n        > chunk_;\n\n    typedef typename chunk_::state state;\n    typedef typename chunk_::iterator iterator;\n};\n\ntemplate<\n      BOOST_MPL_AUX_NTTP_DECL(int, N)\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    > \nstruct AUX778076_FOLD_IMPL_NAME\n    : AUX778076_FOLD_CHUNK_NAME<N>\n        ::template result_<First,Last,State,ForwardOp>\n{\n};\n\n#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION\n\n}}}\n\n#   undef AUX778076_FOLD_IMPL_NAME\n#   undef AUX778076_FOLD_CHUNK_NAME\n#   undef AUX778076_ITER_FOLD_STEP\n\n#undef AUX778076_FOLD_IMPL_OP\n#undef AUX778076_FOLD_IMPL_NAME_PREFIX\n\n///// iteration\n\n#else\n\n#   define n_ BOOST_PP_FRAME_ITERATION(1)\n\n#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct AUX778076_FOLD_IMPL_NAME<n_,First,Last,State,ForwardOp>\n{\n    typedef First iter0;\n    typedef State state0;\n\n    BOOST_MPL_PP_REPEAT(n_, AUX778076_ITER_FOLD_STEP, unused)\n\n    typedef BOOST_PP_CAT(state,n_) state;\n    typedef BOOST_PP_CAT(iter,n_) iterator;\n};\n\n#else\n\ntemplate<> struct AUX778076_FOLD_CHUNK_NAME<n_>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State state0;\n\n        BOOST_MPL_PP_REPEAT(n_, AUX778076_ITER_FOLD_STEP, unused)\n\n        typedef BOOST_PP_CAT(state,n_) state;\n        typedef BOOST_PP_CAT(iter,n_) iterator;\n    };\n\n#if defined(BOOST_MPL_CFG_MSVC_60_ETI_BUG)\n    /// ETI workaround\n    template<> struct result_<int,int,int,int>\n    {\n        typedef int state;\n        typedef int iterator;\n    };\n#endif\n};\n\n#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION\n\n#   undef n_\n\n#endif // BOOST_PP_IS_ITERATING\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/full_lambda.hpp",
    "content": "\n#if !defined(BOOST_PP_IS_ITERATING)\n\n///// header body\n\n#ifndef BOOST_MPL_AUX_FULL_LAMBDA_HPP_INCLUDED\n#define BOOST_MPL_AUX_FULL_LAMBDA_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#if !defined(BOOST_MPL_PREPROCESSING_MODE)\n#   include <boost/mpl/lambda_fwd.hpp>\n#   include <boost/mpl/bind_fwd.hpp>\n#   include <boost/mpl/protect.hpp>\n#   include <boost/mpl/quote.hpp>\n#   include <boost/mpl/arg.hpp>\n#   include <boost/mpl/bool.hpp>\n#   include <boost/mpl/int_fwd.hpp>\n#   include <boost/mpl/aux_/template_arity.hpp>\n#   include <boost/mpl/aux_/na_spec.hpp>\n#   include <boost/mpl/aux_/config/ttp.hpp>\n#   if defined(BOOST_MPL_CFG_EXTENDED_TEMPLATE_PARAMETERS_MATCHING)\n#       include <boost/mpl/if.hpp>\n#   endif\n#endif\n\n#include <boost/mpl/aux_/lambda_arity_param.hpp>\n#include <boost/mpl/aux_/config/use_preprocessed.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \\\n    && !defined(BOOST_MPL_PREPROCESSING_MODE)\n\n#   define BOOST_MPL_PREPROCESSED_HEADER full_lambda.hpp\n#   include <boost/mpl/aux_/include_preprocessed.hpp>\n\n#else\n\n#   include <boost/mpl/limits/arity.hpp>\n#   include <boost/mpl/aux_/preprocessor/default_params.hpp>\n#   include <boost/mpl/aux_/preprocessor/params.hpp>\n#   include <boost/mpl/aux_/preprocessor/enum.hpp>\n#   include <boost/mpl/aux_/preprocessor/repeat.hpp>\n#   include <boost/mpl/aux_/config/dmc_ambiguous_ctps.hpp>\n\n#   include <boost/preprocessor/iterate.hpp>\n#   include <boost/preprocessor/comma_if.hpp>\n#   include <boost/preprocessor/inc.hpp>\n#   include <boost/preprocessor/cat.hpp>\n\nnamespace boost { namespace mpl {\n\n// local macros, #undef-ined at the end of the header\n#   define AUX778076_LAMBDA_PARAMS(i_, param) \\\n    BOOST_MPL_PP_PARAMS(i_, param) \\\n    /**/\n\n#   define AUX778076_BIND_PARAMS(param) \\\n    BOOST_MPL_PP_PARAMS( \\\n          BOOST_MPL_LIMIT_METAFUNCTION_ARITY \\\n        , param \\\n        ) \\\n    /**/\n\n#   define AUX778076_BIND_N_PARAMS(i_, param) \\\n    BOOST_PP_COMMA_IF(i_) \\\n    BOOST_MPL_PP_PARAMS(i_, param) \\\n    /**/\n\n#   define AUX778076_ARITY_PARAM(param) \\\n    BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(param) \\\n    /**/\n\n\n#define n_ BOOST_MPL_LIMIT_METAFUNCTION_ARITY\nnamespace aux {\n\ntemplate<\n      BOOST_MPL_PP_DEFAULT_PARAMS(n_,bool C,false)\n    >\nstruct lambda_or\n    : true_\n{\n};\n\ntemplate<>\nstruct lambda_or< BOOST_MPL_PP_ENUM(n_,false) >\n    : false_\n{\n};\n\n} // namespace aux\n#undef n_\n\ntemplate<\n      typename T\n    , typename Tag\n    AUX778076_ARITY_PARAM(typename Arity)\n    >\nstruct lambda\n{\n    typedef false_ is_le;\n    typedef T result_;\n    typedef T type;\n};\n\ntemplate<\n      typename T\n    >\nstruct is_lambda_expression\n    : lambda<T>::is_le\n{\n};\n\n\ntemplate< int N, typename Tag >\nstruct lambda< arg<N>,Tag AUX778076_ARITY_PARAM(int_<-1>) >\n{\n    typedef true_ is_le;\n    typedef mpl::arg<N> result_; // qualified for the sake of MIPSpro 7.41\n    typedef mpl::protect<result_> type; \n};\n\n\n#define BOOST_PP_ITERATION_PARAMS_1 \\\n    (3,(0, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, <boost/mpl/aux_/full_lambda.hpp>))\n#include BOOST_PP_ITERATE()\n\n/// special case for 'protect'\ntemplate< typename T, typename Tag >\nstruct lambda< mpl::protect<T>,Tag AUX778076_ARITY_PARAM(int_<1>) >\n{\n    typedef false_ is_le;\n    typedef mpl::protect<T> result_;\n    typedef result_ type;\n};\n\n/// specializations for the main 'bind' form\ntemplate<\n      typename F, AUX778076_BIND_PARAMS(typename T)\n    , typename Tag\n    >\nstruct lambda<\n          bind<F,AUX778076_BIND_PARAMS(T)>\n        , Tag\n        AUX778076_ARITY_PARAM(int_<BOOST_PP_INC(BOOST_MPL_LIMIT_METAFUNCTION_ARITY)>)\n        >\n{\n    typedef false_ is_le;\n    typedef bind<F, AUX778076_BIND_PARAMS(T)> result_;\n    typedef result_ type;\n};\n\n\n#if defined(BOOST_MPL_CFG_EXTENDED_TEMPLATE_PARAMETERS_MATCHING)\n\ntemplate<\n      typename F\n    , typename Tag1\n    , typename Tag2\n    , typename Arity\n    >\nstruct lambda<\n          lambda<F,Tag1,Arity>\n        , Tag2\n        , int_<3>\n        >\n{\n    typedef lambda< F,Tag2 > l1;\n    typedef lambda< Tag1,Tag2 > l2;\n\n    typedef typename l1::is_le is_le;\n    typedef bind1< quote1<aux::template_arity>, typename l1::result_ > arity_;\n    typedef lambda< typename if_<is_le,arity_,Arity>::type,Tag2 > l3;\n    \n    typedef aux::le_result3<is_le, Tag2, mpl::lambda, l1, l2, l3> le_result_;\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\n#elif !defined(BOOST_MPL_CFG_DMC_AMBIGUOUS_CTPS)\n\n/// workaround for MWCW 8.3+/EDG < 303, leads to ambiguity on Digital Mars\ntemplate<\n      typename F, typename Tag1, typename Tag2\n    >\nstruct lambda<\n          lambda< F,Tag1 >\n        , Tag2\n        >\n{\n    typedef lambda< F,Tag2 > l1;\n    typedef lambda< Tag1,Tag2 > l2;\n    \n    typedef typename l1::is_le is_le;\n    typedef aux::le_result2<is_le, Tag2, mpl::lambda, l1, l2> le_result_;\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\n#endif\n\n#   undef AUX778076_ARITY_PARAM\n#   undef AUX778076_BIND_N_PARAMS\n#   undef AUX778076_BIND_PARAMS\n#   undef AUX778076_LAMBDA_PARAMS\n\n#if !defined(BOOST_MPL_CFG_EXTENDED_TEMPLATE_PARAMETERS_MATCHING)\nBOOST_MPL_AUX_NA_SPEC(2, lambda)\n#else\nBOOST_MPL_AUX_NA_SPEC2(2, 3, lambda)\n#endif\n\n}}\n\n#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS\n#endif // BOOST_MPL_AUX_FULL_LAMBDA_HPP_INCLUDED\n\n///// iteration, depth == 1\n\n// For gcc 4.4 compatability, we must include the\n// BOOST_PP_ITERATION_DEPTH test inside an #else clause.\n#else // BOOST_PP_IS_ITERATING\n#if BOOST_PP_ITERATION_DEPTH() == 1\n#define i_ BOOST_PP_FRAME_ITERATION(1)\n\n#if i_ > 0\n\nnamespace aux {\n\n#   define AUX778076_RESULT(unused, i_, T) \\\n    BOOST_PP_COMMA_IF(i_) \\\n    typename BOOST_PP_CAT(T, BOOST_PP_INC(i_))::result_ \\\n    /**/\n\n#   define AUX778076_TYPE(unused, i_, T) \\\n    BOOST_PP_COMMA_IF(i_) \\\n    typename BOOST_PP_CAT(T, BOOST_PP_INC(i_))::type \\\n    /**/\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< AUX778076_LAMBDA_PARAMS(i_, typename P) > class F\n    , AUX778076_LAMBDA_PARAMS(i_, typename L)\n    >\nstruct BOOST_PP_CAT(le_result,i_)\n{\n    typedef F<\n          BOOST_MPL_PP_REPEAT(i_, AUX778076_TYPE, L)\n        > result_;\n    \n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< AUX778076_LAMBDA_PARAMS(i_, typename P) > class F\n    , AUX778076_LAMBDA_PARAMS(i_, typename L)\n    >\nstruct BOOST_PP_CAT(le_result,i_)< true_,Tag,F,AUX778076_LAMBDA_PARAMS(i_, L) >\n{\n    typedef BOOST_PP_CAT(bind,i_)<\n          BOOST_PP_CAT(quote,i_)<F,Tag>\n        , BOOST_MPL_PP_REPEAT(i_, AUX778076_RESULT, L)\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n#   undef AUX778076_TYPE\n#   undef AUX778076_RESULT\n\n} // namespace aux\n\n\n#   define AUX778076_LAMBDA_TYPEDEF(unused, i_, T) \\\n    typedef lambda< BOOST_PP_CAT(T, BOOST_PP_INC(i_)), Tag > \\\n        BOOST_PP_CAT(l,BOOST_PP_INC(i_)); \\\n/**/\n\n#   define AUX778076_IS_LE_TYPEDEF(unused, i_, unused2) \\\n    typedef typename BOOST_PP_CAT(l,BOOST_PP_INC(i_))::is_le \\\n        BOOST_PP_CAT(is_le,BOOST_PP_INC(i_)); \\\n/**/\n\n#   define AUX778076_IS_LAMBDA_EXPR(unused, i_, unused2) \\\n    BOOST_PP_COMMA_IF(i_) \\\n    BOOST_PP_CAT(is_le,BOOST_PP_INC(i_))::value \\\n/**/\n\ntemplate<\n      template< AUX778076_LAMBDA_PARAMS(i_, typename P) > class F\n    , AUX778076_LAMBDA_PARAMS(i_, typename T)\n    , typename Tag\n    >\nstruct lambda< \n          F<AUX778076_LAMBDA_PARAMS(i_, T)>\n        , Tag\n        AUX778076_ARITY_PARAM(int_<i_>)\n        >\n{\n    BOOST_MPL_PP_REPEAT(i_, AUX778076_LAMBDA_TYPEDEF, T)\n    BOOST_MPL_PP_REPEAT(i_, AUX778076_IS_LE_TYPEDEF, unused)\n\n    typedef typename aux::lambda_or<\n          BOOST_MPL_PP_REPEAT(i_, AUX778076_IS_LAMBDA_EXPR, unused)\n        >::type is_le;\n\n    typedef aux::BOOST_PP_CAT(le_result,i_)<\n          is_le, Tag, F, AUX778076_LAMBDA_PARAMS(i_, l)\n        > le_result_;\n    \n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\n\n#   undef AUX778076_IS_LAMBDA_EXPR\n#   undef AUX778076_IS_LE_TYPEDEF\n#   undef AUX778076_LAMBDA_TYPEDEF\n\n#endif // i_ > 0\n\ntemplate<\n      typename F AUX778076_BIND_N_PARAMS(i_, typename T)\n    , typename Tag\n    >\nstruct lambda<\n          BOOST_PP_CAT(bind,i_)<F AUX778076_BIND_N_PARAMS(i_, T)>\n        , Tag\n        AUX778076_ARITY_PARAM(int_<BOOST_PP_INC(i_)>)\n        >\n{\n    typedef false_ is_le;\n    typedef BOOST_PP_CAT(bind,i_)<\n          F\n        AUX778076_BIND_N_PARAMS(i_, T)\n        > result_;\n        \n    typedef result_ type;\n};\n\n#undef i_\n#endif // BOOST_PP_ITERATION_DEPTH()\n#endif // BOOST_PP_IS_ITERATING\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/has_apply.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_HAS_APPLY_HPP_INCLUDED\n#define BOOST_MPL_AUX_HAS_APPLY_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/has_xxx.hpp>\n#include <boost/mpl/aux_/config/has_apply.hpp>\n\nnamespace boost { namespace mpl { namespace aux {\n#if !defined(BOOST_MPL_CFG_NO_HAS_APPLY)\nBOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(has_apply, apply, false)\n#else\ntemplate< typename T, typename fallback_ = false_ >\nstruct has_apply\n    : fallback_\n{\n};\n#endif\n}}}\n\n#endif // BOOST_MPL_AUX_HAS_APPLY_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/has_begin.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_HAS_BEGIN_HPP_INCLUDED\n#define BOOST_MPL_AUX_HAS_BEGIN_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2002-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/has_xxx.hpp>\n\nnamespace boost { namespace mpl { namespace aux {\nBOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(has_begin, begin, true)\n}}}\n\n#endif // BOOST_MPL_AUX_HAS_BEGIN_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/has_key_impl.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_HAS_KEY_IMPL_HPP_INCLUDED\n#define BOOST_MPL_AUX_HAS_KEY_IMPL_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2002-2004\n// Copyright David Abrahams 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/has_key_fwd.hpp>\n#include <boost/mpl/aux_/traits_lambda_spec.hpp>\n\nnamespace boost { namespace mpl {\n\n// no default implementation; the definition is needed to make MSVC happy \n\ntemplate< typename Tag > struct has_key_impl\n{\n    template< typename AssociativeSequence, typename Key > struct apply;\n};\n\nBOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC(2,has_key_impl)\n\n}}\n\n#endif // BOOST_MPL_AUX_HAS_KEY_IMPL_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/has_rebind.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_HAS_REBIND_HPP_INCLUDED\n#define BOOST_MPL_AUX_HAS_REBIND_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2002-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/msvc.hpp>\n#include <boost/mpl/aux_/config/intel.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n#if BOOST_WORKAROUND(__EDG_VERSION__, <= 244) && !defined(BOOST_INTEL_CXX_VERSION)\n#   include <boost/mpl/has_xxx.hpp>\n#elif BOOST_WORKAROUND(BOOST_MSVC, < 1300)\n#   include <boost/mpl/has_xxx.hpp>\n#   include <boost/mpl/if.hpp>\n#   include <boost/mpl/bool.hpp>\n#   include <boost/mpl/aux_/msvc_is_class.hpp>\n#elif BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610))\n#   include <boost/mpl/if.hpp>\n#   include <boost/mpl/bool.hpp>\n#   include <boost/mpl/aux_/yes_no.hpp>\n#   include <boost/mpl/aux_/config/static_constant.hpp>\n#   include <boost/type_traits/is_class.hpp>\n#else\n#   include <boost/mpl/aux_/type_wrapper.hpp>\n#   include <boost/mpl/aux_/yes_no.hpp>\n#   include <boost/mpl/aux_/config/static_constant.hpp>\n#endif\n\nnamespace boost { namespace mpl { namespace aux {\n\n#if BOOST_WORKAROUND(__EDG_VERSION__, <= 244) && !defined(BOOST_INTEL_CXX_VERSION)\n\nBOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(has_rebind, rebind, false)\n\n#elif BOOST_WORKAROUND(BOOST_MSVC, < 1300)\n\nBOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(has_rebind_impl, rebind, false)\n\ntemplate< typename T >\nstruct has_rebind\n    : if_< \n          msvc_is_class<T>\n        , has_rebind_impl<T>\n        , bool_<false>\n        >::type\n{\n};\n\n#else // the rest\n\ntemplate< typename T > struct has_rebind_tag {};\nno_tag operator|(has_rebind_tag<int>, void const volatile*);\n\n#   if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610))\ntemplate< typename T >\nstruct has_rebind\n{\n    static has_rebind_tag<T>* get();\n    BOOST_STATIC_CONSTANT(bool, value = \n          sizeof(has_rebind_tag<int>() | get()) == sizeof(yes_tag)\n        );\n};\n#   else // __BORLANDC__\ntemplate< typename T >\nstruct has_rebind_impl\n{\n    static T* get();\n    BOOST_STATIC_CONSTANT(bool, value = \n          sizeof(has_rebind_tag<int>() | get()) == sizeof(yes_tag)\n        );\n};\n\ntemplate< typename T >\nstruct has_rebind\n    : if_< \n          is_class<T>\n        , has_rebind_impl<T>\n        , bool_<false>\n        >::type\n{\n};\n#   endif // __BORLANDC__\n\n#endif\n\n}}}\n\n#endif // BOOST_MPL_AUX_HAS_REBIND_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/has_size.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_HAS_SIZE_HPP_INCLUDED\n#define BOOST_MPL_AUX_HAS_SIZE_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2002-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/has_xxx.hpp>\n\nnamespace boost { namespace mpl { namespace aux {\nBOOST_MPL_HAS_XXX_TRAIT_DEF(size)\n}}}\n\n#endif // BOOST_MPL_AUX_HAS_SIZE_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/has_tag.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_HAS_TAG_HPP_INCLUDED\n#define BOOST_MPL_AUX_HAS_TAG_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2002-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/has_xxx.hpp>\n\nnamespace boost { namespace mpl { namespace aux {\nBOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(has_tag, tag, false)\n}}}\n\n#endif // BOOST_MPL_AUX_HAS_TAG_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/has_type.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_HAS_TYPE_HPP_INCLUDED\n#define BOOST_MPL_AUX_HAS_TYPE_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2002-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/has_xxx.hpp>\n\nnamespace boost { namespace mpl { namespace aux {\nBOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(has_type, type, true)\n}}}\n\n#endif // BOOST_MPL_AUX_HAS_TYPE_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/include_preprocessed.hpp",
    "content": "\n// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION\n\n// Copyright Aleksey Gurtovoy 2000-2006\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/compiler.hpp>\n#include <boost/mpl/aux_/config/preprocessor.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n#include <boost/preprocessor/cat.hpp>\n#include <boost/preprocessor/stringize.hpp>\n\n#if !defined(BOOST_NEEDS_TOKEN_PASTING_OP_FOR_TOKENS_JUXTAPOSING)\n#   define AUX778076_PREPROCESSED_HEADER \\\n    BOOST_MPL_CFG_COMPILER_DIR/BOOST_MPL_PREPROCESSED_HEADER \\\n/**/\n#else\n#   define AUX778076_PREPROCESSED_HEADER \\\n    BOOST_PP_CAT(BOOST_MPL_CFG_COMPILER_DIR,/)##BOOST_MPL_PREPROCESSED_HEADER \\\n/**/\n#endif\n\n#if BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(700))\n#   define AUX778076_INCLUDE_STRING BOOST_PP_STRINGIZE(boost/mpl/aux_/preprocessed/AUX778076_PREPROCESSED_HEADER)\n#   include AUX778076_INCLUDE_STRING\n#   undef AUX778076_INCLUDE_STRING\n#else\n#   include BOOST_PP_STRINGIZE(boost/mpl/aux_/preprocessed/AUX778076_PREPROCESSED_HEADER)\n#endif\n\n#   undef AUX778076_PREPROCESSED_HEADER\n\n#undef BOOST_MPL_PREPROCESSED_HEADER\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/insert_impl.hpp",
    "content": "\n#ifndef BOOST_MPL_INSERT_IMPL_HPP_INCLUDED\n#define BOOST_MPL_INSERT_IMPL_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/reverse_fold.hpp>\n#include <boost/mpl/iterator_range.hpp>\n#include <boost/mpl/clear.hpp>\n#include <boost/mpl/push_front.hpp>\n#include <boost/mpl/aux_/na_spec.hpp>\n#include <boost/mpl/aux_/traits_lambda_spec.hpp>\n#include <boost/type_traits/is_same.hpp>\n\nnamespace boost { namespace mpl {\n\n// default implementation; conrete sequences might override it by \n// specializing either the 'insert_impl' or the primary 'insert' template\n\ntemplate< typename Tag >\nstruct insert_impl\n{\n    template<\n          typename Sequence\n        , typename Pos\n        , typename T\n        >\n    struct apply\n    {\n        typedef iterator_range<\n              typename begin<Sequence>::type\n            , Pos\n            > first_half_;\n\n        typedef iterator_range<\n              Pos\n            , typename end<Sequence>::type\n            > second_half_;\n\n        typedef typename reverse_fold<\n              second_half_\n            , typename clear<Sequence>::type\n            , push_front<_,_>\n            >::type half_sequence_;\n\n        typedef typename reverse_fold<\n              first_half_\n            , typename push_front<half_sequence_,T>::type\n            , push_front<_,_>\n            >::type type;\n    };\n};\n\nBOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC(3,insert_impl)\n\n}}\n\n#endif // BOOST_MPL_INSERT_IMPL_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/integral_wrapper.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2006\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION!\n\n#include <boost/mpl/integral_c_tag.hpp>\n#include <boost/mpl/aux_/static_cast.hpp>\n#include <boost/mpl/aux_/nttp_decl.hpp>\n#include <boost/mpl/aux_/config/static_constant.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n#include <boost/preprocessor/cat.hpp>\n\n#if !defined(AUX_WRAPPER_NAME)\n#   define AUX_WRAPPER_NAME BOOST_PP_CAT(AUX_WRAPPER_VALUE_TYPE,_)\n#endif\n\n#if !defined(AUX_WRAPPER_PARAMS)\n#   define AUX_WRAPPER_PARAMS(N) BOOST_MPL_AUX_NTTP_DECL(AUX_WRAPPER_VALUE_TYPE, N)\n#endif\n\n#if !defined(AUX_WRAPPER_INST)\n#   if BOOST_WORKAROUND(__MWERKS__, <= 0x2407)\n#       define AUX_WRAPPER_INST(value) AUX_WRAPPER_NAME< value >\n#   else \n#       define AUX_WRAPPER_INST(value) BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::AUX_WRAPPER_NAME< value >\n#   endif\n#endif\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\n\ntemplate< AUX_WRAPPER_PARAMS(N) >\nstruct AUX_WRAPPER_NAME\n{\n    BOOST_STATIC_CONSTANT(AUX_WRAPPER_VALUE_TYPE, value = N);\n// agurt, 08/mar/03: SGI MIPSpro C++ workaround, have to #ifdef because some \n// other compilers (e.g. MSVC) are not particulary happy about it\n#if BOOST_WORKAROUND(__EDG_VERSION__, <= 238)\n    typedef struct AUX_WRAPPER_NAME type;\n#else\n    typedef AUX_WRAPPER_NAME type;\n#endif\n    typedef AUX_WRAPPER_VALUE_TYPE value_type;\n    typedef integral_c_tag tag;\n\n// have to #ifdef here: some compilers don't like the 'N + 1' form (MSVC),\n// while some other don't like 'value + 1' (Borland), and some don't like\n// either\n#if BOOST_WORKAROUND(__EDG_VERSION__, <= 243)\n private:\n    BOOST_STATIC_CONSTANT(AUX_WRAPPER_VALUE_TYPE, next_value = BOOST_MPL_AUX_STATIC_CAST(AUX_WRAPPER_VALUE_TYPE, (N + 1)));\n    BOOST_STATIC_CONSTANT(AUX_WRAPPER_VALUE_TYPE, prior_value = BOOST_MPL_AUX_STATIC_CAST(AUX_WRAPPER_VALUE_TYPE, (N - 1)));\n public:\n    typedef AUX_WRAPPER_INST(next_value) next;\n    typedef AUX_WRAPPER_INST(prior_value) prior;\n#elif BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x561)) \\\n    || BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(502)) \\\n    || (BOOST_WORKAROUND(__HP_aCC, <= 53800) && (BOOST_WORKAROUND(__hpxstd98, != 1)))\n    typedef AUX_WRAPPER_INST( BOOST_MPL_AUX_STATIC_CAST(AUX_WRAPPER_VALUE_TYPE, (N + 1)) ) next;\n    typedef AUX_WRAPPER_INST( BOOST_MPL_AUX_STATIC_CAST(AUX_WRAPPER_VALUE_TYPE, (N - 1)) ) prior;\n#else\n    typedef AUX_WRAPPER_INST( BOOST_MPL_AUX_STATIC_CAST(AUX_WRAPPER_VALUE_TYPE, (value + 1)) ) next;\n    typedef AUX_WRAPPER_INST( BOOST_MPL_AUX_STATIC_CAST(AUX_WRAPPER_VALUE_TYPE, (value - 1)) ) prior;\n#endif\n\n    // enables uniform function call syntax for families of overloaded \n    // functions that return objects of both arithmetic ('int', 'long',\n    // 'double', etc.) and wrapped integral types (for an example, see \n    // \"mpl/example/power.cpp\")\n    BOOST_CONSTEXPR operator AUX_WRAPPER_VALUE_TYPE() const { return static_cast<AUX_WRAPPER_VALUE_TYPE>(this->value); } \n};\n\n#if !defined(BOOST_NO_INCLASS_MEMBER_INITIALIZATION)\ntemplate< AUX_WRAPPER_PARAMS(N) >\nAUX_WRAPPER_VALUE_TYPE const AUX_WRAPPER_INST(N)::value;\n#endif\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\n\n#undef AUX_WRAPPER_NAME\n#undef AUX_WRAPPER_PARAMS\n#undef AUX_WRAPPER_INST\n#undef AUX_WRAPPER_VALUE_TYPE\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/is_msvc_eti_arg.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_IS_MSVC_ETI_ARG_HPP_INCLUDED\n#define BOOST_MPL_AUX_IS_MSVC_ETI_ARG_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/yes_no.hpp>\n#include <boost/mpl/aux_/config/eti.hpp>\n#include <boost/mpl/aux_/config/static_constant.hpp>\n\nnamespace boost { namespace mpl { namespace aux {\n\n#if defined(BOOST_MPL_CFG_MSVC_ETI_BUG)\n\n#if defined(BOOST_MPL_CFG_MSVC_60_ETI_BUG)\n\ntemplate< typename T >\nstruct is_msvc_eti_arg\n{ \n    BOOST_STATIC_CONSTANT(bool, value = false);\n};\n\n#else // BOOST_MPL_CFG_MSVC_60_ETI_BUG\n\nstruct eti_int_convertible\n{\n    eti_int_convertible(int);\n};\n\ntemplate< typename T >\nstruct is_msvc_eti_arg\n{ \n    static no_tag test(...);\n    static yes_tag test(eti_int_convertible);\n    static T& get();\n\n    BOOST_STATIC_CONSTANT(bool, value = \n          sizeof(test(get())) == sizeof(yes_tag)\n        );\n};\n\n#endif\n\ntemplate<>\nstruct is_msvc_eti_arg<int>\n{ \n    BOOST_STATIC_CONSTANT(bool, value = true);\n};\n\n#endif // BOOST_MPL_CFG_MSVC_ETI_BUG\n\n}}}\n\n#endif // BOOST_MPL_AUX_IS_MSVC_ETI_ARG_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/iter_apply.hpp",
    "content": "\n#ifndef BOOST_MPL_ITER_APPLY_HPP_INCLUDED\n#define BOOST_MPL_ITER_APPLY_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2002-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/apply.hpp>\n#include <boost/mpl/deref.hpp>\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate<\n      typename F\n    , typename Iterator\n    >\nstruct iter_apply1\n    : apply1< F,typename deref<Iterator>::type >\n{\n};\n\ntemplate<\n      typename F\n    , typename Iterator1\n    , typename Iterator2\n    >\nstruct iter_apply2\n    : apply2<\n          F\n        , typename deref<Iterator1>::type\n        , typename deref<Iterator2>::type\n        >\n{\n};\n\n}}}\n\n#endif // BOOST_MPL_ITER_APPLY_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/iter_fold_if_impl.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_ITER_FOLD_IF_IMPL_HPP_INCLUDED\n#define BOOST_MPL_AUX_ITER_FOLD_IF_IMPL_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2001-2004\n// Copyright David Abrahams 2001-2002\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#if !defined(BOOST_MPL_PREPROCESSING_MODE)\n#   include <boost/mpl/identity.hpp>\n#   include <boost/mpl/next.hpp>\n#   include <boost/mpl/if.hpp>\n#   include <boost/mpl/apply.hpp>\n#   include <boost/mpl/aux_/value_wknd.hpp>\n#endif\n\n#include <boost/mpl/aux_/config/use_preprocessed.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \\\n    && !defined(BOOST_MPL_PREPROCESSING_MODE)\n\n#   define BOOST_MPL_PREPROCESSED_HEADER iter_fold_if_impl.hpp\n#   include <boost/mpl/aux_/include_preprocessed.hpp>\n\n#else\n\n#   include <boost/mpl/limits/unrolling.hpp>\n#   include <boost/preprocessor/arithmetic/sub.hpp>\n#   include <boost/preprocessor/repeat.hpp>\n#   include <boost/preprocessor/inc.hpp>\n#   include <boost/preprocessor/dec.hpp>\n#   include <boost/preprocessor/cat.hpp>\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< typename Iterator, typename State >\nstruct iter_fold_if_null_step\n{\n    typedef State state;\n    typedef Iterator iterator;\n};\n\ntemplate< bool >\nstruct iter_fold_if_step_impl\n{\n    template<\n          typename Iterator\n        , typename State\n        , typename StateOp\n        , typename IteratorOp\n        >\n    struct result_\n    {\n        typedef typename apply2<StateOp,State,Iterator>::type state;\n        typedef typename IteratorOp::type iterator;\n    };\n};\n\ntemplate<>\nstruct iter_fold_if_step_impl<false>\n{\n    template<\n          typename Iterator\n        , typename State\n        , typename StateOp\n        , typename IteratorOp\n        >\n    struct result_\n    {\n        typedef State state;\n        typedef Iterator iterator;\n    };\n};\n\n// agurt, 25/jun/02: MSVC 6.5 workaround, had to get rid of inheritance \n// here and in 'iter_fold_if_backward_step', because sometimes it interfered \n// with the \"early template instantiation bug\" in _really_ ugly ways\ntemplate<\n      typename Iterator\n    , typename State\n    , typename ForwardOp\n    , typename Predicate\n    >\nstruct iter_fold_if_forward_step\n{\n    typedef typename apply2<Predicate,State,Iterator>::type not_last;\n    typedef typename iter_fold_if_step_impl<\n          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value\n        >::template result_< Iterator,State,ForwardOp,mpl::next<Iterator> > impl_;\n\n    typedef typename impl_::state state;\n    typedef typename impl_::iterator iterator;\n};\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename BackwardOp\n    , typename Predicate\n    >\nstruct iter_fold_if_backward_step\n{\n    typedef typename apply2<Predicate,State,Iterator>::type not_last;\n    typedef typename iter_fold_if_step_impl<\n          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value\n        >::template result_< Iterator,State,BackwardOp,identity<Iterator> > impl_;\n\n    typedef typename impl_::state state;\n    typedef typename impl_::iterator iterator;\n};\n\n\n// local macros, #undef-ined at the end of the header\n\n#   define AUX_ITER_FOLD_FORWARD_STEP(unused, i, unused2) \\\n    typedef iter_fold_if_forward_step< \\\n          typename BOOST_PP_CAT(forward_step,i)::iterator \\\n        , typename BOOST_PP_CAT(forward_step,i)::state \\\n        , ForwardOp \\\n        , ForwardPredicate \\\n        > BOOST_PP_CAT(forward_step, BOOST_PP_INC(i)); \\\n    /**/\n\n#   define AUX_ITER_FOLD_BACKWARD_STEP_FUNC(i) \\\n    typedef iter_fold_if_backward_step< \\\n          typename BOOST_PP_CAT(forward_step,BOOST_PP_DEC(i))::iterator \\\n        , typename BOOST_PP_CAT(backward_step,i)::state \\\n        , BackwardOp \\\n        , BackwardPredicate \\\n        > BOOST_PP_CAT(backward_step,BOOST_PP_DEC(i)); \\\n    /**/\n\n#   define AUX_ITER_FOLD_BACKWARD_STEP(unused, i, unused2) \\\n    AUX_ITER_FOLD_BACKWARD_STEP_FUNC( \\\n        BOOST_PP_SUB_D(1,BOOST_MPL_LIMIT_UNROLLING,i) \\\n        ) \\\n    /**/\n\n#   define AUX_LAST_FORWARD_STEP \\\n    BOOST_PP_CAT(forward_step, BOOST_MPL_LIMIT_UNROLLING) \\\n    /**/\n\n#   define AUX_LAST_BACKWARD_STEP \\\n    BOOST_PP_CAT(backward_step, BOOST_MPL_LIMIT_UNROLLING) \\\n    /**/\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename ForwardOp\n    , typename ForwardPredicate\n    , typename BackwardOp\n    , typename BackwardPredicate\n    >\nstruct iter_fold_if_impl\n{\n private:\n    typedef iter_fold_if_null_step<Iterator,State> forward_step0;\n    BOOST_PP_REPEAT(\n          BOOST_MPL_LIMIT_UNROLLING\n        , AUX_ITER_FOLD_FORWARD_STEP\n        , unused\n        )\n    \n    typedef typename if_<\n          typename AUX_LAST_FORWARD_STEP::not_last\n        , iter_fold_if_impl<\n              typename AUX_LAST_FORWARD_STEP::iterator\n            , typename AUX_LAST_FORWARD_STEP::state\n            , ForwardOp\n            , ForwardPredicate\n            , BackwardOp\n            , BackwardPredicate\n            >\n        , iter_fold_if_null_step<\n              typename AUX_LAST_FORWARD_STEP::iterator\n            , typename AUX_LAST_FORWARD_STEP::state\n            >\n        >::type AUX_LAST_BACKWARD_STEP;\n\n    BOOST_PP_REPEAT(\n          BOOST_MPL_LIMIT_UNROLLING\n        , AUX_ITER_FOLD_BACKWARD_STEP\n        , unused\n        )\n\n public:\n    typedef typename backward_step0::state state;\n    typedef typename AUX_LAST_BACKWARD_STEP::iterator iterator;\n};\n\n#   undef AUX_LAST_BACKWARD_STEP\n#   undef AUX_LAST_FORWARD_STEP\n#   undef AUX_ITER_FOLD_BACKWARD_STEP\n#   undef AUX_ITER_FOLD_BACKWARD_STEP_FUNC\n#   undef AUX_ITER_FOLD_FORWARD_STEP\n\n}}}\n\n#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS\n#endif // BOOST_MPL_AUX_ITER_FOLD_IF_IMPL_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/lambda_arity_param.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_LAMBDA_ARITY_PARAM_HPP_INCLUDED\n#define BOOST_MPL_AUX_LAMBDA_ARITY_PARAM_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/ttp.hpp>\n\n#if !defined(BOOST_MPL_CFG_EXTENDED_TEMPLATE_PARAMETERS_MATCHING)\n#   define BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(param)    \n#else\n#   define BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(param) , param\n#endif\n\n#endif // BOOST_MPL_AUX_LAMBDA_ARITY_PARAM_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/lambda_no_ctps.hpp",
    "content": "\n#if !defined(BOOST_PP_IS_ITERATING)\n\n///// header body\n\n#ifndef BOOST_MPL_AUX_LAMBDA_NO_CTPS_HPP_INCLUDED\n#define BOOST_MPL_AUX_LAMBDA_NO_CTPS_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#if !defined(BOOST_MPL_PREPROCESSING_MODE)\n#   include <boost/mpl/lambda_fwd.hpp>\n#   include <boost/mpl/bind_fwd.hpp>\n#   include <boost/mpl/protect.hpp>\n#   include <boost/mpl/is_placeholder.hpp>\n#   include <boost/mpl/if.hpp>\n#   include <boost/mpl/identity.hpp>\n#   include <boost/mpl/bool.hpp>\n#   include <boost/mpl/aux_/na_spec.hpp>\n#   include <boost/mpl/aux_/lambda_support.hpp>\n#   include <boost/mpl/aux_/template_arity.hpp>\n#   include <boost/mpl/aux_/value_wknd.hpp>\n#endif\n\n#include <boost/mpl/aux_/config/use_preprocessed.hpp>\n\n#if    !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \\\n    && !defined(BOOST_MPL_PREPROCESSING_MODE)\n\n#   define BOOST_MPL_PREPROCESSED_HEADER lambda_no_ctps.hpp\n#   include <boost/mpl/aux_/include_preprocessed.hpp>\n\n#else\n\n#   include <boost/mpl/limits/arity.hpp>\n#   include <boost/mpl/aux_/preprocessor/params.hpp>\n#   include <boost/mpl/aux_/preprocessor/default_params.hpp>\n#   include <boost/mpl/aux_/preprocessor/repeat.hpp>\n#   include <boost/mpl/aux_/preprocessor/enum.hpp>\n#   include <boost/mpl/aux_/config/msvc.hpp>\n#   include <boost/mpl/aux_/config/workaround.hpp>\n\n#   include <boost/preprocessor/comma_if.hpp>\n#   include <boost/preprocessor/iterate.hpp>\n#   include <boost/preprocessor/inc.hpp>\n#   include <boost/preprocessor/cat.hpp>\n\nnamespace boost { namespace mpl {\n\n#   define AUX778076_LAMBDA_PARAMS(i_, param) \\\n    BOOST_MPL_PP_PARAMS(i_, param) \\\n    /**/\n\nnamespace aux {\n\n#define n_ BOOST_MPL_LIMIT_METAFUNCTION_ARITY\ntemplate<\n      BOOST_MPL_PP_DEFAULT_PARAMS(n_,bool C,false)\n    >\nstruct lambda_or\n    : true_\n{\n};\n\ntemplate<>\nstruct lambda_or< BOOST_MPL_PP_ENUM(n_,false) >\n    : false_\n{\n};\n#undef n_\n\ntemplate< typename Arity > struct lambda_impl\n{\n    template< typename T, typename Tag, typename Protect > struct result_\n    {\n        typedef T type;\n        typedef is_placeholder<T> is_le;\n    };\n};\n\n#define BOOST_PP_ITERATION_PARAMS_1 \\\n    (3,(1, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, <boost/mpl/aux_/lambda_no_ctps.hpp>))\n#include BOOST_PP_ITERATE()\n\n} // namespace aux\n\ntemplate<\n      typename T\n    , typename Tag\n    , typename Protect\n    >\nstruct lambda\n{\n    /// Metafunction forwarding confuses MSVC 6.x\n    typedef typename aux::template_arity<T>::type arity_;\n    typedef typename aux::lambda_impl<arity_>\n        ::template result_< T,Tag,Protect > l_;\n\n    typedef typename l_::type type;\n    typedef typename l_::is_le is_le;\n    \n    BOOST_MPL_AUX_LAMBDA_SUPPORT(3, lambda, (T, Tag, Protect))\n};\n\nBOOST_MPL_AUX_NA_SPEC2(1, 3, lambda)\n\ntemplate<\n      typename T\n    >\nstruct is_lambda_expression\n    : lambda<T>::is_le\n{\n};\n\n#   undef AUX778076_LAMBDA_PARAMS\n\n}}\n\n#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS\n#endif // BOOST_MPL_AUX_LAMBDA_NO_CTPS_HPP_INCLUDED\n\n///// iteration, depth == 1\n\n#else\n\n#define i_ BOOST_PP_FRAME_ITERATION(1)\n\n#   define AUX778076_LAMBDA_TYPEDEF(unused, i_, F) \\\n    typedef lambda< \\\n          typename F::BOOST_PP_CAT(arg,BOOST_PP_INC(i_)) \\\n        , Tag \\\n        , false_ \\\n        > BOOST_PP_CAT(l,BOOST_PP_INC(i_)); \\\n    /**/\n\n#   define AUX778076_IS_LE_TYPEDEF(unused, i_, unused2) \\\n    typedef typename BOOST_PP_CAT(l,BOOST_PP_INC(i_))::is_le \\\n        BOOST_PP_CAT(is_le,BOOST_PP_INC(i_)); \\\n    /**/\n\n#   define AUX778076_IS_LAMBDA_EXPR(unused, i_, unused2) \\\n    BOOST_PP_COMMA_IF(i_) \\\n    BOOST_MPL_AUX_MSVC_VALUE_WKND(BOOST_PP_CAT(is_le,BOOST_PP_INC(i_)))::value \\\n    /**/\n\n#   define AUX778076_LAMBDA_RESULT(unused, i_, unused2) \\\n    , typename BOOST_PP_CAT(l,BOOST_PP_INC(i_))::type \\\n    /**/\n\ntemplate<> struct lambda_impl< int_<i_> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        BOOST_MPL_PP_REPEAT(i_, AUX778076_LAMBDA_TYPEDEF, F)\n        BOOST_MPL_PP_REPEAT(i_, AUX778076_IS_LE_TYPEDEF, unused)\n\n        typedef aux::lambda_or<\n              BOOST_MPL_PP_REPEAT(i_, AUX778076_IS_LAMBDA_EXPR, unused)\n            > is_le;\n\n        typedef BOOST_PP_CAT(bind,i_)<\n              typename F::rebind\n            BOOST_MPL_PP_REPEAT(i_, AUX778076_LAMBDA_RESULT, unused)\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n    \n        typedef typename type_::type type;\n    };\n};\n\n#   undef AUX778076_LAMBDA_RESULT\n#   undef AUX778076_IS_LAMBDA_EXPR\n#   undef AUX778076_IS_LE_TYPEDEF\n#   undef AUX778076_LAMBDA_TYPEDEF\n\n#undef i_\n\n#endif // BOOST_PP_IS_ITERATING\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/lambda_spec.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_LAMBDA_SPEC_HPP_INCLUDED\n#define BOOST_MPL_AUX_LAMBDA_SPEC_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2001-2007\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/void.hpp>\n#include <boost/mpl/lambda_fwd.hpp>\n#include <boost/mpl/int_fwd.hpp>\n#include <boost/mpl/aux_/preprocessor/params.hpp>\n#include <boost/mpl/aux_/lambda_arity_param.hpp>\n#include <boost/mpl/aux_/config/lambda.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT)\n\n#   define BOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(i, name) \\\ntemplate< \\\n      BOOST_MPL_PP_PARAMS(i, typename T) \\\n    , typename Tag \\\n    > \\\nstruct lambda< \\\n      name< BOOST_MPL_PP_PARAMS(i, T) > \\\n    , Tag \\\n    BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(int_<i>) \\\n    > \\\n{ \\\n    typedef false_ is_le; \\\n    typedef name< BOOST_MPL_PP_PARAMS(i, T) > result_; \\\n    typedef result_ type; \\\n}; \\\n/**/\n\n#else\n\n#   define BOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(i, name) /**/\n\n#endif\n\n#endif // BOOST_MPL_AUX_LAMBDA_SPEC_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/lambda_support.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_LAMBDA_SUPPORT_HPP_INCLUDED\n#define BOOST_MPL_AUX_LAMBDA_SUPPORT_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/lambda.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT)\n\n#   define BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(i, name, params) /**/\n#   define BOOST_MPL_AUX_LAMBDA_SUPPORT(i,name,params) /**/\n\n#else\n\n#   include <boost/mpl/int_fwd.hpp>\n#   include <boost/mpl/aux_/yes_no.hpp>\n#   include <boost/mpl/aux_/na_fwd.hpp>\n#   include <boost/mpl/aux_/preprocessor/params.hpp>\n#   include <boost/mpl/aux_/preprocessor/enum.hpp>\n#   include <boost/mpl/aux_/config/msvc.hpp>\n#   include <boost/mpl/aux_/config/workaround.hpp>\n\n#   include <boost/preprocessor/tuple/to_list.hpp>\n#   include <boost/preprocessor/list/for_each_i.hpp>\n#   include <boost/preprocessor/inc.hpp>\n#   include <boost/preprocessor/cat.hpp>\n\n#   define BOOST_MPL_AUX_LAMBDA_SUPPORT_ARG_TYPEDEF_FUNC(R,typedef_,i,param) \\\n    typedef_ param BOOST_PP_CAT(arg,BOOST_PP_INC(i)); \\\n    /**/\n\n// agurt, 07/mar/03: restore an old revision for the sake of SGI MIPSpro C++\n#if BOOST_WORKAROUND(__EDG_VERSION__, <= 238) \n\n#   define BOOST_MPL_AUX_LAMBDA_SUPPORT(i, name, params) \\\n    typedef BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::int_<i> arity; \\\n    BOOST_PP_LIST_FOR_EACH_I_R( \\\n          1 \\\n        , BOOST_MPL_AUX_LAMBDA_SUPPORT_ARG_TYPEDEF_FUNC \\\n        , typedef \\\n        , BOOST_PP_TUPLE_TO_LIST(i,params) \\\n        ) \\\n    struct rebind \\\n    { \\\n        template< BOOST_MPL_PP_PARAMS(i,typename U) > struct apply \\\n            : name< BOOST_MPL_PP_PARAMS(i,U) > \\\n        { \\\n        }; \\\n    }; \\\n    /**/\n\n#   define BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(i, name, params) \\\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(i, name, params) \\\n    /**/\n\n#elif BOOST_WORKAROUND(__EDG_VERSION__, <= 244) && !defined(BOOST_INTEL_CXX_VERSION)\n// agurt, 18/jan/03: old EDG-based compilers actually enforce 11.4 para 9\n// (in strict mode), so we have to provide an alternative to the \n// MSVC-optimized implementation\n\n#   define BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(i, name, params) \\\n    typedef BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::int_<i> arity; \\\n    BOOST_PP_LIST_FOR_EACH_I_R( \\\n          1 \\\n        , BOOST_MPL_AUX_LAMBDA_SUPPORT_ARG_TYPEDEF_FUNC \\\n        , typedef \\\n        , BOOST_PP_TUPLE_TO_LIST(i,params) \\\n        ) \\\n    struct rebind; \\\n/**/\n\n#   define BOOST_MPL_AUX_LAMBDA_SUPPORT(i, name, params) \\\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(i, name, params) \\\n}; \\\ntemplate< BOOST_MPL_PP_PARAMS(i,typename T) > \\\nstruct name<BOOST_MPL_PP_PARAMS(i,T)>::rebind \\\n{ \\\n    template< BOOST_MPL_PP_PARAMS(i,typename U) > struct apply \\\n        : name< BOOST_MPL_PP_PARAMS(i,U) > \\\n    { \\\n    }; \\\n/**/\n\n#else // __EDG_VERSION__\n\nnamespace boost { namespace mpl { namespace aux {\ntemplate< typename T > struct has_rebind_tag;\n}}}\n\n#   define BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(i, name, params) \\\n    typedef BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::int_<i> arity; \\\n    BOOST_PP_LIST_FOR_EACH_I_R( \\\n          1 \\\n        , BOOST_MPL_AUX_LAMBDA_SUPPORT_ARG_TYPEDEF_FUNC \\\n        , typedef \\\n        , BOOST_PP_TUPLE_TO_LIST(i,params) \\\n        ) \\\n    friend class BOOST_PP_CAT(name,_rebind); \\\n    typedef BOOST_PP_CAT(name,_rebind) rebind; \\\n/**/\n\n#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610))\n#   define BOOST_MPL_AUX_LAMBDA_SUPPORT_HAS_REBIND(i, name, params) \\\ntemplate< BOOST_MPL_PP_PARAMS(i,typename T) > \\\n::boost::mpl::aux::yes_tag operator|( \\\n      ::boost::mpl::aux::has_rebind_tag<int> \\\n    , name<BOOST_MPL_PP_PARAMS(i,T)>* \\\n    ); \\\n::boost::mpl::aux::no_tag operator|( \\\n      ::boost::mpl::aux::has_rebind_tag<int> \\\n    , name< BOOST_MPL_PP_ENUM(i,::boost::mpl::na) >* \\\n    ); \\\n/**/\n#elif !BOOST_WORKAROUND(BOOST_MSVC, < 1300)\n#   define BOOST_MPL_AUX_LAMBDA_SUPPORT_HAS_REBIND(i, name, params) \\\ntemplate< BOOST_MPL_PP_PARAMS(i,typename T) > \\\n::boost::mpl::aux::yes_tag operator|( \\\n      ::boost::mpl::aux::has_rebind_tag<int> \\\n    , ::boost::mpl::aux::has_rebind_tag< name<BOOST_MPL_PP_PARAMS(i,T)> >* \\\n    ); \\\n/**/\n#else\n#   define BOOST_MPL_AUX_LAMBDA_SUPPORT_HAS_REBIND(i, name, params) /**/\n#endif\n\n#   if !defined(__BORLANDC__)\n#   define BOOST_MPL_AUX_LAMBDA_SUPPORT(i, name, params) \\\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(i, name, params) \\\n}; \\\nBOOST_MPL_AUX_LAMBDA_SUPPORT_HAS_REBIND(i, name, params) \\\nclass BOOST_PP_CAT(name,_rebind) \\\n{ \\\n public: \\\n    template< BOOST_MPL_PP_PARAMS(i,typename U) > struct apply \\\n        : name< BOOST_MPL_PP_PARAMS(i,U) > \\\n    { \\\n    }; \\\n/**/\n#   else\n#   define BOOST_MPL_AUX_LAMBDA_SUPPORT(i, name, params) \\\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(i, name, params) \\\n}; \\\nBOOST_MPL_AUX_LAMBDA_SUPPORT_HAS_REBIND(i, name, params) \\\nclass BOOST_PP_CAT(name,_rebind) \\\n{ \\\n public: \\\n    template< BOOST_MPL_PP_PARAMS(i,typename U) > struct apply \\\n    { \\\n        typedef typename name< BOOST_MPL_PP_PARAMS(i,U) >::type type; \\\n    }; \\\n/**/\n#   endif // __BORLANDC__\n\n#endif // __EDG_VERSION__\n\n#endif // BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT\n\n#endif // BOOST_MPL_AUX_LAMBDA_SUPPORT_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/logical_op.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION!\n\n#if !defined(BOOST_MPL_PREPROCESSING_MODE)\n#   include <boost/mpl/bool.hpp>\n#   include <boost/mpl/aux_/nested_type_wknd.hpp>\n#   include <boost/mpl/aux_/na_spec.hpp>\n#   include <boost/mpl/aux_/lambda_support.hpp>\n#endif\n\n#include <boost/mpl/limits/arity.hpp>\n#include <boost/mpl/aux_/preprocessor/params.hpp>\n#include <boost/mpl/aux_/preprocessor/ext_params.hpp>\n#include <boost/mpl/aux_/preprocessor/def_params_tail.hpp>\n#include <boost/mpl/aux_/preprocessor/enum.hpp>\n#include <boost/mpl/aux_/preprocessor/sub.hpp>\n#include <boost/mpl/aux_/config/ctps.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n#include <boost/preprocessor/dec.hpp>\n#include <boost/preprocessor/inc.hpp>\n#include <boost/preprocessor/cat.hpp>\n\nnamespace boost { namespace mpl {\n\n#   define AUX778076_PARAMS(param, sub) \\\n    BOOST_MPL_PP_PARAMS( \\\n          BOOST_MPL_PP_SUB(BOOST_MPL_LIMIT_METAFUNCTION_ARITY, sub) \\\n        , param \\\n        ) \\\n    /**/\n\n#   define AUX778076_SHIFTED_PARAMS(param, sub) \\\n    BOOST_MPL_PP_EXT_PARAMS( \\\n          2, BOOST_MPL_PP_SUB(BOOST_PP_INC(BOOST_MPL_LIMIT_METAFUNCTION_ARITY), sub) \\\n        , param \\\n        ) \\\n    /**/\n\n#   define AUX778076_SPEC_PARAMS(param) \\\n    BOOST_MPL_PP_ENUM( \\\n          BOOST_PP_DEC(BOOST_MPL_LIMIT_METAFUNCTION_ARITY) \\\n        , param \\\n        ) \\\n    /**/\n\nnamespace aux {\n\n#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)\n\ntemplate< bool C_, AUX778076_PARAMS(typename T, 1) >\nstruct BOOST_PP_CAT(AUX778076_OP_NAME,impl)\n    : BOOST_PP_CAT(AUX778076_OP_VALUE1,_)\n{\n};\n\ntemplate< AUX778076_PARAMS(typename T, 1) >\nstruct BOOST_PP_CAT(AUX778076_OP_NAME,impl)< AUX778076_OP_VALUE2,AUX778076_PARAMS(T, 1) >\n    : BOOST_PP_CAT(AUX778076_OP_NAME,impl)<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        , AUX778076_SHIFTED_PARAMS(T, 1)\n        , BOOST_PP_CAT(AUX778076_OP_VALUE2,_)\n        >\n{\n};\n\ntemplate<>\nstruct BOOST_PP_CAT(AUX778076_OP_NAME,impl)<\n          AUX778076_OP_VALUE2\n        , AUX778076_SPEC_PARAMS(BOOST_PP_CAT(AUX778076_OP_VALUE2,_))\n        >\n    : BOOST_PP_CAT(AUX778076_OP_VALUE2,_)\n{\n};\n\n#else\n\ntemplate< bool C_ > struct BOOST_PP_CAT(AUX778076_OP_NAME,impl)\n{\n    template< AUX778076_PARAMS(typename T, 1) > struct result_\n        : BOOST_PP_CAT(AUX778076_OP_VALUE1,_)\n    {\n    };\n};\n\ntemplate<> struct BOOST_PP_CAT(AUX778076_OP_NAME,impl)<AUX778076_OP_VALUE2>\n{\n    template< AUX778076_PARAMS(typename T, 1) > struct result_\n        : BOOST_PP_CAT(AUX778076_OP_NAME,impl)< \n              BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n            >::template result_< AUX778076_SHIFTED_PARAMS(T,1),BOOST_PP_CAT(AUX778076_OP_VALUE2,_) >\n    {\n    };\n\n#if BOOST_WORKAROUND(BOOST_MSVC, == 1300)\n    template<> struct result_<AUX778076_SPEC_PARAMS(BOOST_PP_CAT(AUX778076_OP_VALUE2,_))>\n        : BOOST_PP_CAT(AUX778076_OP_VALUE2,_)\n    {\n    };\n};\n#else\n};\n\ntemplate<>\nstruct BOOST_PP_CAT(AUX778076_OP_NAME,impl)<AUX778076_OP_VALUE2>\n    ::result_< AUX778076_SPEC_PARAMS(BOOST_PP_CAT(AUX778076_OP_VALUE2,_)) >\n        : BOOST_PP_CAT(AUX778076_OP_VALUE2,_)\n{\n};\n#endif // BOOST_MSVC == 1300\n\n#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION\n\n} // namespace aux\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    BOOST_MPL_PP_DEF_PARAMS_TAIL(2, typename T, BOOST_PP_CAT(AUX778076_OP_VALUE2,_))\n    >\nstruct AUX778076_OP_NAME\n#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)\n    : aux::BOOST_PP_CAT(AUX778076_OP_NAME,impl)<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        , AUX778076_SHIFTED_PARAMS(T,0)\n        >\n#else\n    : aux::BOOST_PP_CAT(AUX778076_OP_NAME,impl)< \n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        >::template result_< AUX778076_SHIFTED_PARAMS(T,0) >\n#endif\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          BOOST_MPL_LIMIT_METAFUNCTION_ARITY\n        , AUX778076_OP_NAME\n        , (AUX778076_PARAMS(T, 0))\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC2(\n      2\n    , BOOST_MPL_LIMIT_METAFUNCTION_ARITY\n    , AUX778076_OP_NAME\n    )\n\n}}\n\n#undef AUX778076_SPEC_PARAMS\n#undef AUX778076_SHIFTED_PARAMS\n#undef AUX778076_PARAMS\n#undef AUX778076_OP_NAME\n#undef AUX778076_OP_VALUE1\n#undef AUX778076_OP_VALUE2\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/msvc_dtw.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION!\n\n#include <boost/mpl/aux_/preprocessor/params.hpp>\n\n// local macros, #undef-ined at the end of the header\n#define AUX778076_DTW_PARAMS(param) \\\n    BOOST_MPL_PP_PARAMS(AUX778076_MSVC_DTW_ARITY, param) \\\n/**/\n\n#define AUX778076_DTW_ORIGINAL_NAME \\\n    AUX778076_MSVC_DTW_ORIGINAL_NAME \\\n/**/\n\n// warning: not a well-formed C++\n// workaround for MSVC 6.5's \"dependent template typedef bug\"\n\ntemplate< typename F>\nstruct AUX778076_MSVC_DTW_NAME\n{\n    template< bool > struct f_ : F {};\n    template<> struct f_<true>\n    {\n#if AUX778076_MSVC_DTW_ARITY > 0\n        template< AUX778076_DTW_PARAMS(typename P) > struct AUX778076_DTW_ORIGINAL_NAME\n        {\n            typedef int type;\n        };\n    };\n\n    template< AUX778076_DTW_PARAMS(typename T) > struct result_\n        : f_< aux::msvc_never_true<F>::value >\n            ::template AUX778076_DTW_ORIGINAL_NAME< AUX778076_DTW_PARAMS(T) >\n    {\n    };\n#else\n        template< typename P = int > struct AUX778076_DTW_ORIGINAL_NAME\n        {\n            typedef int type;\n        };\n    };\n\n    template< typename T = int > struct result_\n        : f_< aux::msvc_never_true<F>::value >\n            ::template AUX778076_DTW_ORIGINAL_NAME<>\n    {\n    };\n#endif\n};\n\n#undef AUX778076_DTW_ORIGINAL_NAME\n#undef AUX778076_DTW_PARAMS\n\n#undef AUX778076_MSVC_DTW_NAME\n#undef AUX778076_MSVC_DTW_ORIGINAL_NAME\n#undef AUX778076_MSVC_DTW_ARITY\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/msvc_eti_base.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_MSVC_ETI_BASE_HPP_INCLUDED\n#define BOOST_MPL_AUX_MSVC_ETI_BASE_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/is_msvc_eti_arg.hpp>\n#include <boost/mpl/aux_/config/eti.hpp>\n#include <boost/mpl/aux_/config/gcc.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n\nnamespace boost { namespace mpl { namespace aux {\n\n#if defined(BOOST_MPL_CFG_MSVC_70_ETI_BUG)\n\ntemplate< bool > struct msvc_eti_base_impl\n{\n    template< typename T > struct result_\n        : T\n    {\n        typedef T type;\n    };\n};\n\ntemplate<> struct msvc_eti_base_impl<true>\n{\n    template< typename T > struct result_\n    {\n        typedef result_ type;\n        typedef result_ first;\n        typedef result_ second;\n        typedef result_ tag;\n        enum { value = 0 };\n    };\n};\n\ntemplate< typename T > struct msvc_eti_base\n    : msvc_eti_base_impl< is_msvc_eti_arg<T>::value >\n        ::template result_<T>\n{\n};\n\n#else // !BOOST_MPL_CFG_MSVC_70_ETI_BUG\n\ntemplate< typename T > struct msvc_eti_base\n    : T\n{\n#if BOOST_WORKAROUND(BOOST_MPL_CFG_GCC, BOOST_TESTED_AT(0x0304))\n    msvc_eti_base();\n#endif\n    typedef T type;\n};\n\n#endif \n\ntemplate<> struct msvc_eti_base<int>\n{\n    typedef msvc_eti_base type;\n    typedef msvc_eti_base first;\n    typedef msvc_eti_base second;\n    typedef msvc_eti_base tag;\n    enum { value = 0 };\n};\n\n}}}\n\n#endif // BOOST_MPL_AUX_MSVC_ETI_BASE_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/msvc_is_class.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_MSVC_IS_CLASS_HPP_INCLUDED\n#define BOOST_MPL_AUX_MSVC_IS_CLASS_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2002-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/if.hpp>\n#include <boost/mpl/bool.hpp>\n#include <boost/mpl/aux_/type_wrapper.hpp>\n#include <boost/mpl/aux_/yes_no.hpp>\n\n#include <boost/type_traits/is_reference.hpp>\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< typename T > struct is_class_helper\n{\n    typedef int (T::* type)();\n};\n\n// MSVC 6.x-specific lightweight 'is_class' implementation; \n// Distinguishing feature: does not instantiate the type being tested.\ntemplate< typename T >\nstruct msvc_is_class_impl\n{\n    template< typename U>\n    static yes_tag  test(type_wrapper<U>*, /*typename*/ is_class_helper<U>::type = 0);\n    static no_tag   test(void const volatile*, ...);\n\n    enum { value = sizeof(test((type_wrapper<T>*)0)) == sizeof(yes_tag) };\n    typedef bool_<value> type;\n};\n\n// agurt, 17/sep/04: have to check for 'is_reference' upfront to avoid ICEs in\n// complex metaprograms\ntemplate< typename T >\nstruct msvc_is_class\n    : if_<\n          is_reference<T>\n        , false_\n        , msvc_is_class_impl<T>\n        >::type\n{\n};\n\n}}}\n\n#endif // BOOST_MPL_AUX_MSVC_IS_CLASS_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/msvc_never_true.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_MSVC_NEVER_TRUE_HPP_INCLUDED\n#define BOOST_MPL_AUX_MSVC_NEVER_TRUE_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/msvc.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< typename T >\nstruct msvc_never_true\n{\n    enum { value = false };\n};\n\n}}}\n\n#endif // BOOST_MSVC\n\n#endif // BOOST_MPL_AUX_MSVC_NEVER_TRUE_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/msvc_type.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_MSVC_TYPE_HPP_INCLUDED\n#define BOOST_MPL_AUX_MSVC_TYPE_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/eti.hpp>\n#include <boost/mpl/aux_/is_msvc_eti_arg.hpp>\n\nnamespace boost { namespace mpl { namespace aux {\n\n#if defined(BOOST_MPL_CFG_MSVC_70_ETI_BUG)\n\ntemplate< bool > struct msvc_type_impl\n{\n    template< typename T > struct result_\n    {\n        typedef typename T::type type;\n    };\n};\n\ntemplate<> struct msvc_type_impl<true>\n{\n    template< typename T > struct result_\n    {\n        typedef result_ type;\n    };\n};\n\ntemplate< typename T > struct msvc_type\n    : msvc_type_impl< is_msvc_eti_arg<T>::value >\n        ::template result_<T>\n{\n};\n\n#else // BOOST_MPL_CFG_MSVC_70_ETI_BUG\n\ntemplate< typename T > struct msvc_type \n{\n    typedef typename T::type type;\n};\n\ntemplate<> struct msvc_type<int>\n{\n    typedef int type;\n};\n\n#endif\n\n}}}\n\n#endif // BOOST_MPL_AUX_MSVC_TYPE_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/na.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_NA_HPP_INCLUDED\n#define BOOST_MPL_AUX_NA_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/bool.hpp>\n#include <boost/mpl/aux_/na_fwd.hpp>\n#include <boost/mpl/aux_/config/msvc.hpp>\n#include <boost/mpl/aux_/config/ctps.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate< typename T >\nstruct is_na\n    : false_\n{\n#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)\n    using false_::value;\n#endif\n};\n\ntemplate<>\nstruct is_na<na>\n    : true_\n{\n#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)\n    using true_::value;\n#endif\n};\n\ntemplate< typename T >\nstruct is_not_na\n    : true_\n{\n#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)\n    using true_::value;\n#endif\n};\n\ntemplate<>\nstruct is_not_na<na>\n    : false_\n{\n#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)\n    using false_::value;\n#endif\n};\n\n#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)\ntemplate< typename T, typename U > struct if_na\n{\n    typedef T type;\n};\n\ntemplate< typename U > struct if_na<na,U>\n{\n    typedef U type;\n};\n#else\ntemplate< typename T > struct if_na_impl\n{\n    template< typename U > struct apply\n    {\n        typedef T type;\n    };\n};\n\ntemplate<> struct if_na_impl<na>\n{\n    template< typename U > struct apply\n    {\n        typedef U type;\n    };\n};\n\ntemplate< typename T, typename U > struct if_na\n    : if_na_impl<T>::template apply<U>\n{\n};\n#endif\n\n}}\n\n#endif // BOOST_MPL_AUX_NA_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/na_assert.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_NA_ASSERT_HPP_INCLUDED\n#define BOOST_MPL_AUX_NA_ASSERT_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/na.hpp>\n#include <boost/mpl/aux_/config/msvc.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n#if !BOOST_WORKAROUND(_MSC_FULL_VER, <= 140050601)    \\\n    && !BOOST_WORKAROUND(__EDG_VERSION__, <= 243)\n#   include <boost/mpl/assert.hpp>\n#   define BOOST_MPL_AUX_ASSERT_NOT_NA(x) \\\n    BOOST_MPL_ASSERT_NOT((boost::mpl::is_na<type>)) \\\n/**/\n#else\n#   include <boost/static_assert.hpp>\n#   define BOOST_MPL_AUX_ASSERT_NOT_NA(x) \\\n    BOOST_STATIC_ASSERT(!boost::mpl::is_na<x>::value) \\\n/**/\n#endif\n\n#endif // BOOST_MPL_AUX_NA_ASSERT_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/na_fwd.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_NA_FWD_HPP_INCLUDED\n#define BOOST_MPL_AUX_NA_FWD_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/adl_barrier.hpp>\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\n\n// n.a. == not available\nstruct na\n{\n    typedef na type;\n    enum { value = 0 };\n};\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nBOOST_MPL_AUX_ADL_BARRIER_DECL(na)\n\n#endif // BOOST_MPL_AUX_NA_FWD_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/na_spec.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_NA_SPEC_HPP_INCLUDED\n#define BOOST_MPL_AUX_NA_SPEC_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#if !defined(BOOST_MPL_PREPROCESSING_MODE)\n#   include <boost/mpl/lambda_fwd.hpp>\n#   include <boost/mpl/int.hpp>\n#   include <boost/mpl/bool.hpp>\n#   include <boost/mpl/aux_/na.hpp>\n#   include <boost/mpl/aux_/arity.hpp>\n#   include <boost/mpl/aux_/template_arity_fwd.hpp>\n#endif\n\n#include <boost/mpl/aux_/preprocessor/params.hpp>\n#include <boost/mpl/aux_/preprocessor/enum.hpp>\n#include <boost/mpl/aux_/preprocessor/def_params_tail.hpp>\n#include <boost/mpl/aux_/lambda_arity_param.hpp>\n#include <boost/mpl/aux_/config/dtp.hpp>\n#include <boost/mpl/aux_/config/eti.hpp>\n#include <boost/mpl/aux_/nttp_decl.hpp>\n#include <boost/mpl/aux_/config/ttp.hpp>\n#include <boost/mpl/aux_/config/lambda.hpp>\n#include <boost/mpl/aux_/config/overload_resolution.hpp>\n\n\n#define BOOST_MPL_AUX_NA_PARAMS(i) \\\n    BOOST_MPL_PP_ENUM(i, na) \\\n/**/\n\n#if defined(BOOST_MPL_CFG_BROKEN_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES)\n#   define BOOST_MPL_AUX_NA_SPEC_ARITY(i, name) \\\nnamespace aux { \\\ntemplate< BOOST_MPL_AUX_NTTP_DECL(int, N) > \\\nstruct arity< \\\n          name< BOOST_MPL_AUX_NA_PARAMS(i) > \\\n        , N \\\n        > \\\n    : int_< BOOST_MPL_LIMIT_METAFUNCTION_ARITY > \\\n{ \\\n}; \\\n} \\\n/**/\n#else\n#   define BOOST_MPL_AUX_NA_SPEC_ARITY(i, name) /**/\n#endif\n\n#define BOOST_MPL_AUX_NA_SPEC_MAIN(i, name) \\\ntemplate<> \\\nstruct name< BOOST_MPL_AUX_NA_PARAMS(i) > \\\n{ \\\n    template< \\\n          BOOST_MPL_PP_PARAMS(i, typename T) \\\n        BOOST_MPL_PP_NESTED_DEF_PARAMS_TAIL(i, typename T, na) \\\n        > \\\n    struct apply \\\n        : name< BOOST_MPL_PP_PARAMS(i, T) > \\\n    { \\\n    }; \\\n}; \\\n/**/\n\n#if defined(BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT)\n#   define BOOST_MPL_AUX_NA_SPEC_LAMBDA(i, name) \\\ntemplate<> \\\nstruct lambda< \\\n      name< BOOST_MPL_AUX_NA_PARAMS(i) > \\\n    , void_ \\\n    , true_ \\\n    > \\\n{ \\\n    typedef false_ is_le; \\\n    typedef name< BOOST_MPL_AUX_NA_PARAMS(i) > type; \\\n}; \\\ntemplate<> \\\nstruct lambda< \\\n      name< BOOST_MPL_AUX_NA_PARAMS(i) > \\\n    , void_ \\\n    , false_ \\\n    > \\\n{ \\\n    typedef false_ is_le; \\\n    typedef name< BOOST_MPL_AUX_NA_PARAMS(i) > type; \\\n}; \\\n/**/\n#else\n#   define BOOST_MPL_AUX_NA_SPEC_LAMBDA(i, name) \\\ntemplate< typename Tag > \\\nstruct lambda< \\\n      name< BOOST_MPL_AUX_NA_PARAMS(i) > \\\n    , Tag \\\n    BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(int_<-1>) \\\n    > \\\n{ \\\n    typedef false_ is_le; \\\n    typedef name< BOOST_MPL_AUX_NA_PARAMS(i) > result_; \\\n    typedef name< BOOST_MPL_AUX_NA_PARAMS(i) > type; \\\n}; \\\n/**/\n#endif\n\n#if defined(BOOST_MPL_CFG_EXTENDED_TEMPLATE_PARAMETERS_MATCHING) \\\n    || defined(BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT) \\\n        && defined(BOOST_MPL_CFG_BROKEN_OVERLOAD_RESOLUTION)\n#   define BOOST_MPL_AUX_NA_SPEC_TEMPLATE_ARITY(i, j, name) \\\nnamespace aux { \\\ntemplate< BOOST_MPL_PP_PARAMS(j, typename T) > \\\nstruct template_arity< \\\n          name< BOOST_MPL_PP_PARAMS(j, T) > \\\n        > \\\n    : int_<j> \\\n{ \\\n}; \\\n\\\ntemplate<> \\\nstruct template_arity< \\\n          name< BOOST_MPL_PP_ENUM(i, na) > \\\n        > \\\n    : int_<-1> \\\n{ \\\n}; \\\n} \\\n/**/\n#else\n#   define BOOST_MPL_AUX_NA_SPEC_TEMPLATE_ARITY(i, j, name) /**/\n#endif\n\n#if defined(BOOST_MPL_CFG_MSVC_ETI_BUG)\n#   define BOOST_MPL_AUX_NA_SPEC_ETI(i, name) \\\ntemplate<> \\\nstruct name< BOOST_MPL_PP_ENUM(i, int) > \\\n{ \\\n    typedef int type; \\\n    enum { value = 0 }; \\\n}; \\\n/**/\n#else\n#   define BOOST_MPL_AUX_NA_SPEC_ETI(i, name) /**/\n#endif\n\n#define BOOST_MPL_AUX_NA_PARAM(param) param = na\n\n#define BOOST_MPL_AUX_NA_SPEC_NO_ETI(i, name) \\\nBOOST_MPL_AUX_NA_SPEC_MAIN(i, name) \\\nBOOST_MPL_AUX_NA_SPEC_LAMBDA(i, name) \\\nBOOST_MPL_AUX_NA_SPEC_ARITY(i, name) \\\nBOOST_MPL_AUX_NA_SPEC_TEMPLATE_ARITY(i, i, name) \\\n/**/\n\n#define BOOST_MPL_AUX_NA_SPEC(i, name) \\\nBOOST_MPL_AUX_NA_SPEC_NO_ETI(i, name) \\\nBOOST_MPL_AUX_NA_SPEC_ETI(i, name) \\\n/**/\n\n#define BOOST_MPL_AUX_NA_SPEC2(i, j, name) \\\nBOOST_MPL_AUX_NA_SPEC_MAIN(i, name) \\\nBOOST_MPL_AUX_NA_SPEC_ETI(i, name) \\\nBOOST_MPL_AUX_NA_SPEC_LAMBDA(i, name) \\\nBOOST_MPL_AUX_NA_SPEC_ARITY(i, name) \\\nBOOST_MPL_AUX_NA_SPEC_TEMPLATE_ARITY(i, j, name) \\\n/**/\n\n\n#endif // BOOST_MPL_AUX_NA_SPEC_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/nested_type_wknd.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_NESTED_TYPE_WKND_HPP_INCLUDED\n#define BOOST_MPL_AUX_NESTED_TYPE_WKND_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/gcc.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n#if BOOST_WORKAROUND(BOOST_MPL_CFG_GCC, BOOST_TESTED_AT(0x0302)) \\\n    || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x561)) \\\n    || BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x530)) \\\n    || BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840))\n\nnamespace boost { namespace mpl { namespace aux {\ntemplate< typename T > struct nested_type_wknd\n    : T::type\n{\n};\n}}}\n\n#if BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840))\n#   define BOOST_MPL_AUX_NESTED_TYPE_WKND(T) \\\n    aux::nested_type_wknd<T> \\\n/**/\n#else\n#   define BOOST_MPL_AUX_NESTED_TYPE_WKND(T) \\\n    ::boost::mpl::aux::nested_type_wknd<T> \\\n/**/\n#endif\n\n#else // !BOOST_MPL_CFG_GCC et al.\n\n#   define BOOST_MPL_AUX_NESTED_TYPE_WKND(T) T::type\n\n#endif \n\n#endif // BOOST_MPL_AUX_NESTED_TYPE_WKND_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/nttp_decl.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_NTTP_DECL_HPP_INCLUDED\n#define BOOST_MPL_AUX_NTTP_DECL_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/nttp.hpp>\n\n#if defined(BOOST_MPL_CFG_NTTP_BUG)\n\ntypedef bool        _mpl_nttp_bool;\ntypedef int         _mpl_nttp_int;\ntypedef unsigned    _mpl_nttp_unsigned;\ntypedef long        _mpl_nttp_long;\n\n#   include <boost/preprocessor/cat.hpp>\n#   define BOOST_MPL_AUX_NTTP_DECL(T, x) BOOST_PP_CAT(_mpl_nttp_,T) x /**/\n\n#else\n\n#   define BOOST_MPL_AUX_NTTP_DECL(T, x) T x /**/\n\n#endif\n\n#endif // BOOST_MPL_AUX_NTTP_DECL_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/overload_names.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_OVERLOAD_NAMES_HPP_INCLUDED\n#define BOOST_MPL_AUX_OVERLOAD_NAMES_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/ptr_to_ref.hpp>\n#include <boost/mpl/aux_/config/operators.hpp>\n\n#if defined(BOOST_MPL_CFG_USE_OPERATORS_OVERLOADING)\n\n#   include <boost/mpl/aux_/static_cast.hpp>\n\n#   define BOOST_MPL_AUX_OVERLOAD_VALUE_BY_KEY  operator/\n#   define BOOST_MPL_AUX_OVERLOAD_ITEM_BY_ORDER operator|\n#   define BOOST_MPL_AUX_OVERLOAD_ORDER_BY_KEY  operator||\n#   define BOOST_MPL_AUX_OVERLOAD_IS_MASKED     operator%\n\n#   define BOOST_MPL_AUX_OVERLOAD_CALL_VALUE_BY_KEY(T, x)   BOOST_MPL_AUX_PTR_TO_REF(T) / x\n#   define BOOST_MPL_AUX_OVERLOAD_CALL_ITEM_BY_ORDER(T, x)  BOOST_MPL_AUX_PTR_TO_REF(T) | x\n#   define BOOST_MPL_AUX_OVERLOAD_CALL_ORDER_BY_KEY(T, x)   BOOST_MPL_AUX_PTR_TO_REF(T) || x\n#   define BOOST_MPL_AUX_OVERLOAD_CALL_IS_MASKED(T, x)      BOOST_MPL_AUX_PTR_TO_REF(T) % x\n\n#else\n\n#   define BOOST_MPL_AUX_OVERLOAD_VALUE_BY_KEY  value_by_key_\n#   define BOOST_MPL_AUX_OVERLOAD_ITEM_BY_ORDER item_by_order_\n#   define BOOST_MPL_AUX_OVERLOAD_ORDER_BY_KEY  order_by_key_\n#   define BOOST_MPL_AUX_OVERLOAD_IS_MASKED     is_masked_\n\n#   define BOOST_MPL_AUX_OVERLOAD_CALL_VALUE_BY_KEY(T, x)   T::BOOST_MPL_AUX_OVERLOAD_VALUE_BY_KEY( BOOST_MPL_AUX_PTR_TO_REF(T), x )\n#   define BOOST_MPL_AUX_OVERLOAD_CALL_ITEM_BY_ORDER(T, x)  T::BOOST_MPL_AUX_OVERLOAD_ITEM_BY_ORDER( BOOST_MPL_AUX_PTR_TO_REF(T), x )\n#   define BOOST_MPL_AUX_OVERLOAD_CALL_ORDER_BY_KEY(T, x)   T::BOOST_MPL_AUX_OVERLOAD_ORDER_BY_KEY( BOOST_MPL_AUX_PTR_TO_REF(T), x )\n#   define BOOST_MPL_AUX_OVERLOAD_CALL_IS_MASKED(T, x)      T::BOOST_MPL_AUX_OVERLOAD_IS_MASKED( BOOST_MPL_AUX_PTR_TO_REF(T), x )\n\n#endif\n\n#endif // BOOST_MPL_AUX_OVERLOAD_NAMES_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/advance_backward.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"advance_backward.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< long N > struct advance_backward;\ntemplate<>\nstruct advance_backward<0>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef iter0 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<1>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef iter1 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<2>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef typename prior<iter1>::type iter2;\n        typedef iter2 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<3>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef typename prior<iter1>::type iter2;\n        typedef typename prior<iter2>::type iter3;\n        typedef iter3 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<4>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef typename prior<iter1>::type iter2;\n        typedef typename prior<iter2>::type iter3;\n        typedef typename prior<iter3>::type iter4;\n        typedef iter4 type;\n    };\n};\n\ntemplate< long N >\nstruct advance_backward\n{\n    template< typename Iterator > struct apply\n    {\n        typedef typename apply_wrap1<\n              advance_backward<4>\n            , Iterator\n            >::type chunk_result_;\n\n        typedef typename apply_wrap1<\n              advance_backward<(\n                (N - 4) < 0\n                    ? 0\n                    : N - 4\n                    )>\n            , chunk_result_\n            >::type type;\n    };\n};\n\n}}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/advance_forward.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"advance_forward.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< long N > struct advance_forward;\ntemplate<>\nstruct advance_forward<0>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef iter0 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<1>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef iter1 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<2>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef typename next<iter1>::type iter2;\n        typedef iter2 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<3>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef typename next<iter1>::type iter2;\n        typedef typename next<iter2>::type iter3;\n        typedef iter3 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<4>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef typename next<iter1>::type iter2;\n        typedef typename next<iter2>::type iter3;\n        typedef typename next<iter3>::type iter4;\n        typedef iter4 type;\n    };\n};\n\ntemplate< long N >\nstruct advance_forward\n{\n    template< typename Iterator > struct apply\n    {\n        typedef typename apply_wrap1<\n              advance_forward<4>\n            , Iterator\n            >::type chunk_result_;\n\n        typedef typename apply_wrap1<\n              advance_forward<(\n                (N - 4) < 0\n                    ? 0\n                    : N - 4\n                    )>\n            , chunk_result_\n            >::type type;\n    };\n};\n\n}}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/and.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"and.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate< bool C_, typename T1, typename T2, typename T3, typename T4 >\nstruct and_impl\n    : false_\n{\n};\n\ntemplate< typename T1, typename T2, typename T3, typename T4 >\nstruct and_impl< true,T1,T2,T3,T4 >\n    : and_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        , T2, T3, T4\n        , true_\n        >\n{\n};\n\ntemplate<>\nstruct and_impl<\n          true\n        , true_, true_, true_, true_\n        >\n    : true_\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    , typename T3 = true_, typename T4 = true_, typename T5 = true_\n    >\nstruct and_\n\n    : aux::and_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        , T2, T3, T4, T5\n        >\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , and_\n        , ( T1, T2, T3, T4, T5)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC2(\n      2\n    , 5\n    , and_\n    )\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/apply.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"apply.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F\n    >\nstruct apply0\n\n    : apply_wrap0<\n          typename lambda<F>::type\n       \n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          1\n        , apply0\n        , (F )\n        )\n};\n\ntemplate<\n      typename F\n    >\nstruct apply< F,na,na,na,na,na >\n    : apply0<F>\n{\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply1\n\n    : apply_wrap1<\n          typename lambda<F>::type\n        , T1\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          2\n        , apply1\n        , (F, T1)\n        )\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply< F,T1,na,na,na,na >\n    : apply1< F,T1 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply2\n\n    : apply_wrap2<\n          typename lambda<F>::type\n        , T1, T2\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          3\n        , apply2\n        , (F, T1, T2)\n        )\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply< F,T1,T2,na,na,na >\n    : apply2< F,T1,T2 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply3\n\n    : apply_wrap3<\n          typename lambda<F>::type\n        , T1, T2, T3\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          4\n        , apply3\n        , (F, T1, T2, T3)\n        )\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply< F,T1,T2,T3,na,na >\n    : apply3< F,T1,T2,T3 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply4\n\n    : apply_wrap4<\n          typename lambda<F>::type\n        , T1, T2, T3, T4\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , apply4\n        , (F, T1, T2, T3, T4)\n        )\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply< F,T1,T2,T3,T4,na >\n    : apply4< F,T1,T2,T3,T4 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply5\n\n    : apply_wrap5<\n          typename lambda<F>::type\n        , T1, T2, T3, T4, T5\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          6\n        , apply5\n        , (F, T1, T2, T3, T4, T5)\n        )\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply\n    : apply5< F,T1,T2,T3,T4,T5 >\n{\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/apply_fwd.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"apply_fwd.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na\n    >\nstruct apply;\n\ntemplate<\n      typename F\n    >\nstruct apply0;\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply1;\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply2;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply3;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply4;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply5;\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/apply_wrap.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2008\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"apply_wrap.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      int N, typename F\n    >\nstruct apply_wrap_impl0;\n\ntemplate< typename F, bool F_has_apply >\nstruct apply_wrap_impl0_bcb {\n    typedef typename F::template apply<na> type;\n};\n\ntemplate< typename F >\nstruct apply_wrap_impl0_bcb< F,true > {\n    typedef typename F::apply type;\n};\n\ntemplate<\n      typename F\n    >\nstruct apply_wrap_impl0<\n          0\n        , F\n       \n        >\n{\n    typedef apply_wrap_impl0_bcb< F, aux::has_apply<F>::value >::type type;\n};\n\ntemplate<\n      typename F\n    >\nstruct apply_wrap_impl0<\n          1\n        , F\n       \n        >\n{\n    typedef typename F::template apply<\n         \n        na\n        > type;\n};\n\ntemplate<\n      typename F\n    >\nstruct apply_wrap_impl0<\n          2\n        , F\n       \n        >\n{\n    typedef typename F::template apply<\n         \n        na, na\n\n        > type;\n};\n\ntemplate<\n      typename F\n    >\nstruct apply_wrap_impl0<\n          3\n        , F\n       \n        >\n{\n    typedef typename F::template apply<\n         \n        na, na, na\n\n        > type;\n};\n\ntemplate<\n      typename F\n    >\nstruct apply_wrap_impl0<\n          4\n        , F\n       \n        >\n{\n    typedef typename F::template apply<\n         \n        na, na, na, na\n\n        > type;\n};\n\ntemplate<\n      typename F\n    >\nstruct apply_wrap_impl0<\n          5\n        , F\n       \n        >\n{\n    typedef typename F::template apply<\n         \n        na, na, na, na, na\n\n        > type;\n};\n\ntemplate<\n      typename F\n    >\nstruct apply_wrap0\n    : apply_wrap_impl0<\n          ::boost::mpl::aux::arity< F,0 >::value\n        , F\n       \n        >::type\n{\n};\n\ntemplate<\n      int N, typename F, typename T1\n    >\nstruct apply_wrap_impl1;\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply_wrap_impl1<\n          1\n        , F\n        , T1\n        >\n{\n    typedef typename F::template apply<\n          T1\n        > type;\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply_wrap_impl1<\n          2\n        , F\n        , T1\n        >\n{\n    typedef typename F::template apply<\n          T1\n        , na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply_wrap_impl1<\n          3\n        , F\n        , T1\n        >\n{\n    typedef typename F::template apply<\n          T1\n        , na, na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply_wrap_impl1<\n          4\n        , F\n        , T1\n        >\n{\n    typedef typename F::template apply<\n          T1\n        , na, na, na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply_wrap_impl1<\n          5\n        , F\n        , T1\n        >\n{\n    typedef typename F::template apply<\n          T1\n        , na, na, na, na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply_wrap1\n    : apply_wrap_impl1<\n          ::boost::mpl::aux::arity< F,1 >::value\n        , F\n        , T1\n        >::type\n{\n};\n\ntemplate<\n      int N, typename F, typename T1, typename T2\n    >\nstruct apply_wrap_impl2;\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply_wrap_impl2<\n          2\n        , F\n        , T1, T2\n        >\n{\n    typedef typename F::template apply<\n          T1, T2\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply_wrap_impl2<\n          3\n        , F\n        , T1, T2\n        >\n{\n    typedef typename F::template apply<\n          T1, T2\n\n        , na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply_wrap_impl2<\n          4\n        , F\n        , T1, T2\n        >\n{\n    typedef typename F::template apply<\n          T1, T2\n\n        , na, na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply_wrap_impl2<\n          5\n        , F\n        , T1, T2\n        >\n{\n    typedef typename F::template apply<\n          T1, T2\n\n        , na, na, na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply_wrap2\n    : apply_wrap_impl2<\n          ::boost::mpl::aux::arity< F,2 >::value\n        , F\n        , T1, T2\n        >::type\n{\n};\n\ntemplate<\n      int N, typename F, typename T1, typename T2, typename T3\n    >\nstruct apply_wrap_impl3;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply_wrap_impl3<\n          3\n        , F\n        , T1, T2, T3\n        >\n{\n    typedef typename F::template apply<\n          T1, T2, T3\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply_wrap_impl3<\n          4\n        , F\n        , T1, T2, T3\n        >\n{\n    typedef typename F::template apply<\n          T1, T2, T3\n\n        , na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply_wrap_impl3<\n          5\n        , F\n        , T1, T2, T3\n        >\n{\n    typedef typename F::template apply<\n          T1, T2, T3\n\n        , na, na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply_wrap3\n    : apply_wrap_impl3<\n          ::boost::mpl::aux::arity< F,3 >::value\n        , F\n        , T1, T2, T3\n        >::type\n{\n};\n\ntemplate<\n      int N, typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply_wrap_impl4;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply_wrap_impl4<\n          4\n        , F\n        , T1, T2, T3, T4\n        >\n{\n    typedef typename F::template apply<\n          T1, T2, T3, T4\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply_wrap_impl4<\n          5\n        , F\n        , T1, T2, T3, T4\n        >\n{\n    typedef typename F::template apply<\n          T1, T2, T3, T4\n\n        , na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply_wrap4\n    : apply_wrap_impl4<\n          ::boost::mpl::aux::arity< F,4 >::value\n        , F\n        , T1, T2, T3, T4\n        >::type\n{\n};\n\ntemplate<\n      int N, typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply_wrap_impl5;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply_wrap_impl5<\n          5\n        , F\n        , T1, T2, T3, T4, T5\n        >\n{\n    typedef typename F::template apply<\n          T1, T2, T3, T4, T5\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply_wrap5\n    : apply_wrap_impl5<\n          ::boost::mpl::aux::arity< F,5 >::value\n        , F\n        , T1, T2, T3, T4, T5\n        >::type\n{\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/arg.hpp",
    "content": "\n// Copyright Peter Dimov 2001-2002\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"arg.hpp\" header\n// -- DO NOT modify by hand!\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntemplate<> struct arg< -1 >\n{\n    BOOST_STATIC_CONSTANT(int, value  = -1);\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n        typedef U1 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<1>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 1);\n    typedef arg<2> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n        typedef U1 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<2>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 2);\n    typedef arg<3> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n        typedef U2 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<3>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 3);\n    typedef arg<4> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n        typedef U3 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<4>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 4);\n    typedef arg<5> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n        typedef U4 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<5>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 5);\n    typedef arg<6> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n        typedef U5 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\nBOOST_MPL_AUX_NONTYPE_ARITY_SPEC(1,int, arg)\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/basic_bind.hpp",
    "content": "\n// Copyright Peter Dimov 2001\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"basic_bind.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      typename T, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg\n{\n    typedef T type;\n};\n\ntemplate<\n      int N, typename U1, typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 >\n{\n    typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename F\n    >\nstruct bind0\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n\n     public:\n        typedef typename apply_wrap0<\n              f_\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg<\n      bind0<F>, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind0<F> f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(1, bind0)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind1\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n\n     public:\n        typedef typename apply_wrap1<\n              f_\n            , typename t1::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename U1, typename U2, typename U3\n    , typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind1< F,T1 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind1< F,T1 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(2, bind1)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind2\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n\n     public:\n        typedef typename apply_wrap2<\n              f_\n            , typename t1::type, typename t2::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename U1, typename U2\n    , typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind2< F,T1,T2 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind2< F,T1,T2 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(3, bind2)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind3\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n\n     public:\n        typedef typename apply_wrap3<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename U1\n    , typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind3< F,T1,T2,T3 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(4, bind3)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind4\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;\n\n     public:\n        typedef typename apply_wrap4<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename U1, typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind4< F,T1,T2,T3,T4 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(5, bind4)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind5\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;\n        typedef aux::resolve_bind_arg< T5,U1,U2,U3,U4,U5 > t5;\n\n     public:\n        typedef typename apply_wrap5<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type, typename t5::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg<\n      bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind5< F,T1,T2,T3,T4,T5 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(6, bind5)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/bind.hpp",
    "content": "\n// Copyright Peter Dimov 2001\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"bind.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      typename T, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg\n{\n    typedef T type;\n};\n\ntemplate<\n      typename T\n    , typename Arg\n    >\nstruct replace_unnamed_arg\n{\n    typedef Arg next;\n    typedef T type;\n};\n\ntemplate<\n      typename Arg\n    >\nstruct replace_unnamed_arg< arg< -1 >, Arg >\n{\n    typedef typename Arg::next next;\n    typedef Arg type;\n};\n\ntemplate<\n      int N, typename U1, typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 >\n{\n    typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename F\n    >\nstruct bind0\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n     public:\n        typedef typename apply_wrap0<\n              f_\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg<\n      bind0<F>, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind0<F> f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(1, bind0)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind1\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n     public:\n        typedef typename apply_wrap1<\n              f_\n            , typename t1::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename U1, typename U2, typename U3\n    , typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind1< F,T1 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind1< F,T1 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(2, bind1)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind2\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n     public:\n        typedef typename apply_wrap2<\n              f_\n            , typename t1::type, typename t2::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename U1, typename U2\n    , typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind2< F,T1,T2 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind2< F,T1,T2 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(3, bind2)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind3\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n     public:\n        typedef typename apply_wrap3<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename U1\n    , typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind3< F,T1,T2,T3 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(4, bind3)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind4\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n        typedef aux::replace_unnamed_arg< T4,n4 > r4;\n        typedef typename r4::type a4;\n        typedef typename r4::next n5;\n        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;\n        ///\n     public:\n        typedef typename apply_wrap4<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename U1, typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind4< F,T1,T2,T3,T4 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(5, bind4)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind5\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n        typedef aux::replace_unnamed_arg< T4,n4 > r4;\n        typedef typename r4::type a4;\n        typedef typename r4::next n5;\n        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;\n        ///\n        typedef aux::replace_unnamed_arg< T5,n5 > r5;\n        typedef typename r5::type a5;\n        typedef typename r5::next n6;\n        typedef aux::resolve_bind_arg< a5,U1,U2,U3,U4,U5 > t5;\n        ///\n     public:\n        typedef typename apply_wrap5<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type, typename t5::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg<\n      bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind5< F,T1,T2,T3,T4,T5 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(6, bind5)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/bind_fwd.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"bind_fwd.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F\n    >\nstruct bind0;\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind1;\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind2;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind3;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind4;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind5;\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/bitand.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"bitand.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct bitand_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< bitand_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< bitand_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct bitand_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitand_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitand_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct bitand_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct bitand_\n    : bitand_< bitand_< bitand_< bitand_< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , bitand_\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct bitand_< N1,N2,N3,N4,na >\n\n    : bitand_< bitand_< bitand_< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitand_\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct bitand_< N1,N2,N3,na,na >\n\n    : bitand_< bitand_< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitand_\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct bitand_< N1,N2,na,na,na >\n    : bitand_impl<\n          typename bitand_tag<N1>::type\n        , typename bitand_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitand_\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, bitand_)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct bitand_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  & BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/bitor.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"bitor.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct bitor_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< bitor_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< bitor_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct bitor_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitor_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitor_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct bitor_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct bitor_\n    : bitor_< bitor_< bitor_< bitor_< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , bitor_\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct bitor_< N1,N2,N3,N4,na >\n\n    : bitor_< bitor_< bitor_< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitor_\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct bitor_< N1,N2,N3,na,na >\n\n    : bitor_< bitor_< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitor_\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct bitor_< N1,N2,na,na,na >\n    : bitor_impl<\n          typename bitor_tag<N1>::type\n        , typename bitor_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitor_\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, bitor_)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct bitor_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  | BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/bitxor.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"bitxor.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct bitxor_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< bitxor_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< bitxor_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct bitxor_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitxor_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitxor_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct bitxor_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct bitxor_\n    : bitxor_< bitxor_< bitxor_< bitxor_< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , bitxor_\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct bitxor_< N1,N2,N3,N4,na >\n\n    : bitxor_< bitxor_< bitxor_< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitxor_\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct bitxor_< N1,N2,N3,na,na >\n\n    : bitxor_< bitxor_< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitxor_\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct bitxor_< N1,N2,na,na,na >\n    : bitxor_impl<\n          typename bitxor_tag<N1>::type\n        , typename bitxor_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitxor_\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, bitxor_)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct bitxor_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  ^ BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/deque.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"deque.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct deque;\n\ntemplate<\n     \n    >\nstruct deque<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector0<  >\n{\n    typedef vector0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct deque<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector1<T0>\n{\n    typedef typename vector1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct deque<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector2< T0,T1 >\n{\n    typedef typename vector2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct deque<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector3< T0,T1,T2 >\n{\n    typedef typename vector3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct deque<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector4< T0,T1,T2,T3 >\n{\n    typedef typename vector4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector5< T0,T1,T2,T3,T4 >\n{\n    typedef typename vector5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename vector6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename vector7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename vector8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : vector15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename vector15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : vector16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename vector16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : vector17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename vector17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : vector18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename vector18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : vector19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename vector19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct deque\n    : vector20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename vector20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/divides.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"divides.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct divides_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< divides_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< divides_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct divides_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct divides_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct divides_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct divides_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct divides\n    : divides< divides< divides< divides< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , divides\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct divides< N1,N2,N3,N4,na >\n\n    : divides< divides< divides< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , divides\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct divides< N1,N2,N3,na,na >\n\n    : divides< divides< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , divides\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct divides< N1,N2,na,na,na >\n    : divides_impl<\n          typename divides_tag<N1>::type\n        , typename divides_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , divides\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, divides)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct divides_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  / BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/equal_to.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"equal_to.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct equal_to_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct equal_to_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct equal_to_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct equal_to_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct equal_to_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct equal_to\n\n    : equal_to_impl<\n          typename equal_to_tag<N1>::type\n        , typename equal_to_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, equal_to, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, equal_to)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct equal_to_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value  == BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl;\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 0,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef state0 state;\n    typedef iter0 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 1,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    \n\n    typedef state1 state;\n    typedef iter1 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 2,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    \n\n    typedef state2 state;\n    typedef iter2 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 3,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    \n\n    typedef state3 state;\n    typedef iter3 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 4,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp, state3, typename deref<iter3>::type >::type state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef state4 state;\n    typedef iter4 iterator;\n};\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl\n{\n    typedef fold_impl<\n          4\n        , First\n        , Last\n        , State\n        , ForwardOp\n        > chunk_;\n\n    typedef fold_impl<\n          ( (N - 4) < 0 ? 0 : N - 4 )\n        , typename chunk_::iterator\n        , Last\n        , typename chunk_::state\n        , ForwardOp\n        > res_;\n\n    typedef typename res_::state state;\n    typedef typename res_::iterator iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< -1,First,Last,State,ForwardOp >\n    : fold_impl<\n          -1\n        , typename mpl::next<First>::type\n        , Last\n        , typename apply2<ForwardOp,State, typename deref<First>::type>::type\n        , ForwardOp\n        >\n{\n};\n\ntemplate<\n      typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< -1,Last,Last,State,ForwardOp >\n{\n    typedef State state;\n    typedef Last iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/full_lambda.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"full_lambda.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false\n    , bool C5 = false\n    >\nstruct lambda_or\n    : true_\n{\n};\n\ntemplate<>\nstruct lambda_or< false,false,false,false,false >\n    : false_\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename T\n    , typename Tag\n    , typename Arity\n    >\nstruct lambda\n{\n    typedef false_ is_le;\n    typedef T result_;\n    typedef T type;\n};\n\ntemplate<\n      typename T\n    >\nstruct is_lambda_expression\n    : lambda<T>::is_le\n{\n};\n\ntemplate< int N, typename Tag >\nstruct lambda< arg<N>,Tag, int_< -1 > >\n{\n    typedef true_ is_le;\n    typedef mpl::arg<N> result_; // qualified for the sake of MIPSpro 7.41\n    typedef mpl::protect<result_> type;\n};\n\ntemplate<\n      typename F\n    , typename Tag\n    >\nstruct lambda<\n          bind0<F>\n        , Tag\n        , int_<1>\n        >\n{\n    typedef false_ is_le;\n    typedef bind0<\n          F\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1 > class F\n    , typename L1\n    >\nstruct le_result1\n{\n    typedef F<\n          typename L1::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1 > class F\n    , typename L1\n    >\nstruct le_result1< true_,Tag,F,L1 >\n{\n    typedef bind1<\n          quote1< F,Tag >\n        , typename L1::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1 > class F\n    , typename T1\n    , typename Tag\n    >\nstruct lambda<\n          F<T1>\n        , Tag\n        , int_<1>\n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef typename l1::is_le is_le1;\n    typedef typename aux::lambda_or<\n          is_le1::value\n        >::type is_le;\n\n    typedef aux::le_result1<\n          is_le, Tag, F, l1\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1\n    , typename Tag\n    >\nstruct lambda<\n          bind1< F,T1 >\n        , Tag\n        , int_<2>\n        >\n{\n    typedef false_ is_le;\n    typedef bind1<\n          F\n        , T1\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2 > class F\n    , typename L1, typename L2\n    >\nstruct le_result2\n{\n    typedef F<\n          typename L1::type, typename L2::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2 > class F\n    , typename L1, typename L2\n    >\nstruct le_result2< true_,Tag,F,L1,L2 >\n{\n    typedef bind2<\n          quote2< F,Tag >\n        , typename L1::result_, typename L2::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1, typename P2 > class F\n    , typename T1, typename T2\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2 >\n        , Tag\n        , int_<2>\n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value\n        >::type is_le;\n\n    typedef aux::le_result2<\n          is_le, Tag, F, l1, l2\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    , typename Tag\n    >\nstruct lambda<\n          bind2< F,T1,T2 >\n        , Tag\n        , int_<3>\n        >\n{\n    typedef false_ is_le;\n    typedef bind2<\n          F\n        , T1, T2\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2, typename P3 > class F\n    , typename L1, typename L2, typename L3\n    >\nstruct le_result3\n{\n    typedef F<\n          typename L1::type, typename L2::type, typename L3::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2, typename P3 > class F\n    , typename L1, typename L2, typename L3\n    >\nstruct le_result3< true_,Tag,F,L1,L2,L3 >\n{\n    typedef bind3<\n          quote3< F,Tag >\n        , typename L1::result_, typename L2::result_, typename L3::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1, typename P2, typename P3 > class F\n    , typename T1, typename T2, typename T3\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2,T3 >\n        , Tag\n        , int_<3>\n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    typedef lambda< T3,Tag > l3;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    typedef typename l3::is_le is_le3;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value, is_le3::value\n        >::type is_le;\n\n    typedef aux::le_result3<\n          is_le, Tag, F, l1, l2, l3\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    , typename Tag\n    >\nstruct lambda<\n          bind3< F,T1,T2,T3 >\n        , Tag\n        , int_<4>\n        >\n{\n    typedef false_ is_le;\n    typedef bind3<\n          F\n        , T1, T2, T3\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename L1, typename L2, typename L3, typename L4\n    >\nstruct le_result4\n{\n    typedef F<\n          typename L1::type, typename L2::type, typename L3::type\n        , typename L4::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename L1, typename L2, typename L3, typename L4\n    >\nstruct le_result4< true_,Tag,F,L1,L2,L3,L4 >\n{\n    typedef bind4<\n          quote4< F,Tag >\n        , typename L1::result_, typename L2::result_, typename L3::result_\n        , typename L4::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename T1, typename T2, typename T3, typename T4\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2,T3,T4 >\n        , Tag\n        , int_<4>\n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    typedef lambda< T3,Tag > l3;\n    typedef lambda< T4,Tag > l4;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    typedef typename l3::is_le is_le3;\n    typedef typename l4::is_le is_le4;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value, is_le3::value, is_le4::value\n        >::type is_le;\n\n    typedef aux::le_result4<\n          is_le, Tag, F, l1, l2, l3, l4\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename Tag\n    >\nstruct lambda<\n          bind4< F,T1,T2,T3,T4 >\n        , Tag\n        , int_<5>\n        >\n{\n    typedef false_ is_le;\n    typedef bind4<\n          F\n        , T1, T2, T3, T4\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F\n    , typename L1, typename L2, typename L3, typename L4, typename L5\n    >\nstruct le_result5\n{\n    typedef F<\n          typename L1::type, typename L2::type, typename L3::type\n        , typename L4::type, typename L5::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F\n    , typename L1, typename L2, typename L3, typename L4, typename L5\n    >\nstruct le_result5< true_,Tag,F,L1,L2,L3,L4,L5 >\n{\n    typedef bind5<\n          quote5< F,Tag >\n        , typename L1::result_, typename L2::result_, typename L3::result_\n        , typename L4::result_, typename L5::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template<\n          typename P1, typename P2, typename P3, typename P4\n        , typename P5\n        >\n      class F\n    , typename T1, typename T2, typename T3, typename T4, typename T5\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2,T3,T4,T5 >\n        , Tag\n        , int_<5>\n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    typedef lambda< T3,Tag > l3;\n    typedef lambda< T4,Tag > l4;\n    typedef lambda< T5,Tag > l5;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    typedef typename l3::is_le is_le3;\n    typedef typename l4::is_le is_le4;\n    typedef typename l5::is_le is_le5;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value, is_le3::value, is_le4::value\n        , is_le5::value\n        >::type is_le;\n\n    typedef aux::le_result5<\n          is_le, Tag, F, l1, l2, l3, l4, l5\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    , typename Tag\n    >\nstruct lambda<\n          bind5< F,T1,T2,T3,T4,T5 >\n        , Tag\n        , int_<6>\n        >\n{\n    typedef false_ is_le;\n    typedef bind5<\n          F\n        , T1, T2, T3, T4, T5\n        > result_;\n\n    typedef result_ type;\n};\n\n/// special case for 'protect'\ntemplate< typename T, typename Tag >\nstruct lambda< mpl::protect<T>,Tag, int_<1> >\n{\n    typedef false_ is_le;\n    typedef mpl::protect<T> result_;\n    typedef result_ type;\n};\n\n/// specializations for the main 'bind' form\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    , typename Tag\n    >\nstruct lambda<\n          bind< F,T1,T2,T3,T4,T5 >\n        , Tag\n        , int_<6>\n        >\n{\n    typedef false_ is_le;\n    typedef bind< F,T1,T2,T3,T4,T5 > result_;\n    typedef result_ type;\n};\n\ntemplate<\n      typename F\n    , typename Tag1\n    , typename Tag2\n    , typename Arity\n    >\nstruct lambda<\n          lambda< F,Tag1,Arity >\n        , Tag2\n        , int_<3>\n        >\n{\n    typedef lambda< F,Tag2 > l1;\n    typedef lambda< Tag1,Tag2 > l2;\n    typedef typename l1::is_le is_le;\n    typedef bind1< quote1<aux::template_arity>, typename l1::result_ > arity_;\n    typedef lambda< typename if_< is_le,arity_,Arity >::type, Tag2 > l3;\n    typedef aux::le_result3<is_le, Tag2, mpl::lambda, l1, l2, l3> le_result_;\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 3, lambda)\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/greater.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"greater.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct greater_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< greater_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< greater_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct greater_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct greater_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct greater_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct greater_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct greater\n\n    : greater_impl<\n          typename greater_tag<N1>::type\n        , typename greater_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, greater)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct greater_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value > BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/greater_equal.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"greater_equal.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct greater_equal_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< greater_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< greater_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct greater_equal_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct greater_equal_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct greater_equal_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct greater_equal_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct greater_equal\n\n    : greater_equal_impl<\n          typename greater_equal_tag<N1>::type\n        , typename greater_equal_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater_equal, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, greater_equal)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct greater_equal_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value >= BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/inherit.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"inherit.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    >\nstruct inherit2\n    : T1, T2\n{\n    typedef inherit2 type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, inherit2, (T1, T2))\n};\n\ntemplate< typename T1 >\nstruct inherit2< T1,empty_base >\n{\n    typedef T1 type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (T1, empty_base))\n};\n\ntemplate< typename T2 >\nstruct inherit2< empty_base,T2 >\n{\n    typedef T2 type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base, T2))\n};\n\ntemplate<>\nstruct inherit2< empty_base,empty_base >\n{\n    typedef empty_base type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base, empty_base))\n};\n\nBOOST_MPL_AUX_NA_SPEC(2, inherit2)\n\ntemplate<\n      typename T1 = na, typename T2 = na, typename T3 = na\n    >\nstruct inherit3\n    : inherit2<\n          typename inherit2<\n              T1, T2\n            >::type\n        , T3\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          3\n        , inherit3\n        , ( T1, T2, T3)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC(3, inherit3)\n\ntemplate<\n      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na\n    >\nstruct inherit4\n    : inherit2<\n          typename inherit3<\n              T1, T2, T3\n            >::type\n        , T4\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          4\n        , inherit4\n        , ( T1, T2, T3, T4)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC(4, inherit4)\n\ntemplate<\n      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na\n    , typename T5 = na\n    >\nstruct inherit5\n    : inherit2<\n          typename inherit4<\n              T1, T2, T3, T4\n            >::type\n        , T5\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , inherit5\n        , ( T1, T2, T3, T4, T5)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC(5, inherit5)\n\n/// primary template\n\ntemplate<\n      typename T1 = empty_base, typename T2 = empty_base\n    , typename T3 = empty_base, typename T4 = empty_base\n    , typename T5 = empty_base\n    >\nstruct inherit\n    : inherit5< T1,T2,T3,T4,T5 >\n{\n};\n\ntemplate<>\nstruct inherit< na,na,na,na,na >\n{\n    template<\n\n          typename T1, typename T2, typename T3, typename T4, typename T5\n\n        >\n    struct apply\n        : inherit< T1,T2,T3,T4,T5 >\n    {\n    };\n};\n\nBOOST_MPL_AUX_NA_SPEC_LAMBDA(5, inherit)\nBOOST_MPL_AUX_NA_SPEC_ARITY(5, inherit)\nBOOST_MPL_AUX_NA_SPEC_TEMPLATE_ARITY(5, 5, inherit)\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/iter_fold_if_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n// Copyright David Abrahams 2001-2002\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"iter_fold_if_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< typename Iterator, typename State >\nstruct iter_fold_if_null_step\n{\n    typedef State state;\n    typedef Iterator iterator;\n};\n\ntemplate< bool >\nstruct iter_fold_if_step_impl\n{\n    template<\n          typename Iterator\n        , typename State\n        , typename StateOp\n        , typename IteratorOp\n        >\n    struct result_\n    {\n        typedef typename apply2< StateOp,State,Iterator >::type state;\n        typedef typename IteratorOp::type iterator;\n    };\n};\n\ntemplate<>\nstruct iter_fold_if_step_impl<false>\n{\n    template<\n          typename Iterator\n        , typename State\n        , typename StateOp\n        , typename IteratorOp\n        >\n    struct result_\n    {\n        typedef State state;\n        typedef Iterator iterator;\n    };\n};\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename ForwardOp\n    , typename Predicate\n    >\nstruct iter_fold_if_forward_step\n{\n    typedef typename apply2< Predicate,State,Iterator >::type not_last;\n    typedef typename iter_fold_if_step_impl<\n          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value\n        >::template result_< Iterator,State,ForwardOp, mpl::next<Iterator> > impl_;\n\n    typedef typename impl_::state state;\n    typedef typename impl_::iterator iterator;\n};\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename BackwardOp\n    , typename Predicate\n    >\nstruct iter_fold_if_backward_step\n{\n    typedef typename apply2< Predicate,State,Iterator >::type not_last;\n    typedef typename iter_fold_if_step_impl<\n          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value\n        >::template result_< Iterator,State,BackwardOp, identity<Iterator> > impl_;\n\n    typedef typename impl_::state state;\n    typedef typename impl_::iterator iterator;\n};\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename ForwardOp\n    , typename ForwardPredicate\n    , typename BackwardOp\n    , typename BackwardPredicate\n    >\nstruct iter_fold_if_impl\n{\n private:\n    typedef iter_fold_if_null_step< Iterator,State > forward_step0;\n    typedef iter_fold_if_forward_step< typename forward_step0::iterator, typename forward_step0::state, ForwardOp, ForwardPredicate > forward_step1;\n    typedef iter_fold_if_forward_step< typename forward_step1::iterator, typename forward_step1::state, ForwardOp, ForwardPredicate > forward_step2;\n    typedef iter_fold_if_forward_step< typename forward_step2::iterator, typename forward_step2::state, ForwardOp, ForwardPredicate > forward_step3;\n    typedef iter_fold_if_forward_step< typename forward_step3::iterator, typename forward_step3::state, ForwardOp, ForwardPredicate > forward_step4;\n    \n\n    typedef typename if_<\n          typename forward_step4::not_last\n        , iter_fold_if_impl<\n              typename forward_step4::iterator\n            , typename forward_step4::state\n            , ForwardOp\n            , ForwardPredicate\n            , BackwardOp\n            , BackwardPredicate\n            >\n        , iter_fold_if_null_step<\n              typename forward_step4::iterator\n            , typename forward_step4::state\n            >\n        >::type backward_step4;\n\n    typedef iter_fold_if_backward_step< typename forward_step3::iterator, typename backward_step4::state, BackwardOp, BackwardPredicate > backward_step3;\n    typedef iter_fold_if_backward_step< typename forward_step2::iterator, typename backward_step3::state, BackwardOp, BackwardPredicate > backward_step2;\n    typedef iter_fold_if_backward_step< typename forward_step1::iterator, typename backward_step2::state, BackwardOp, BackwardPredicate > backward_step1;\n    typedef iter_fold_if_backward_step< typename forward_step0::iterator, typename backward_step1::state, BackwardOp, BackwardPredicate > backward_step0;\n    \n\n public:\n    typedef typename backward_step0::state state;\n    typedef typename backward_step4::iterator iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/iter_fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"iter_fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl;\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 0,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef state0 state;\n    typedef iter0 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 1,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    \n\n    typedef state1 state;\n    typedef iter1 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 2,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    \n\n    typedef state2 state;\n    typedef iter2 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 3,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp,state2,iter2 >::type state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    \n\n    typedef state3 state;\n    typedef iter3 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 4,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp,state2,iter2 >::type state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp,state3,iter3 >::type state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef state4 state;\n    typedef iter4 iterator;\n};\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl\n{\n    typedef iter_fold_impl<\n          4\n        , First\n        , Last\n        , State\n        , ForwardOp\n        > chunk_;\n\n    typedef iter_fold_impl<\n          ( (N - 4) < 0 ? 0 : N - 4 )\n        , typename chunk_::iterator\n        , Last\n        , typename chunk_::state\n        , ForwardOp\n        > res_;\n\n    typedef typename res_::state state;\n    typedef typename res_::iterator iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< -1,First,Last,State,ForwardOp >\n    : iter_fold_impl<\n          -1\n        , typename mpl::next<First>::type\n        , Last\n        , typename apply2< ForwardOp,State,First >::type\n        , ForwardOp\n        >\n{\n};\n\ntemplate<\n      typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< -1,Last,Last,State,ForwardOp >\n{\n    typedef State state;\n    typedef Last iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/lambda_no_ctps.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"lambda_no_ctps.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false\n    , bool C5 = false\n    >\nstruct lambda_or\n    : true_\n{\n};\n\ntemplate<>\nstruct lambda_or< false,false,false,false,false >\n    : false_\n{\n};\n\ntemplate< typename Arity > struct lambda_impl\n{\n    template< typename T, typename Tag, typename Protect > struct result_\n    {\n        typedef T type;\n        typedef is_placeholder<T> is_le;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<1> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef typename l1::is_le is_le1;\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value\n            > is_le;\n\n        typedef bind1<\n              typename F::rebind\n            , typename l1::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<2> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value\n            > is_le;\n\n        typedef bind2<\n              typename F::rebind\n            , typename l1::type, typename l2::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<3> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        typedef lambda< typename F::arg3, Tag, false_ > l3;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        typedef typename l3::is_le is_le3;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value\n            > is_le;\n\n        typedef bind3<\n              typename F::rebind\n            , typename l1::type, typename l2::type, typename l3::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<4> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        typedef lambda< typename F::arg3, Tag, false_ > l3;\n        typedef lambda< typename F::arg4, Tag, false_ > l4;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        typedef typename l3::is_le is_le3;\n        typedef typename l4::is_le is_le4;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value\n            > is_le;\n\n        typedef bind4<\n              typename F::rebind\n            , typename l1::type, typename l2::type, typename l3::type\n            , typename l4::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<5> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        typedef lambda< typename F::arg3, Tag, false_ > l3;\n        typedef lambda< typename F::arg4, Tag, false_ > l4;\n        typedef lambda< typename F::arg5, Tag, false_ > l5;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        typedef typename l3::is_le is_le3;\n        typedef typename l4::is_le is_le4;\n        typedef typename l5::is_le is_le5;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le5)::value\n            > is_le;\n\n        typedef bind5<\n              typename F::rebind\n            , typename l1::type, typename l2::type, typename l3::type\n            , typename l4::type, typename l5::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\n} // namespace aux\n\ntemplate<\n      typename T\n    , typename Tag\n    , typename Protect\n    >\nstruct lambda\n{\n    /// Metafunction forwarding confuses MSVC 6.x\n    typedef typename aux::template_arity<T>::type arity_;\n    typedef typename aux::lambda_impl<arity_>\n        ::template result_< T,Tag,Protect > l_;\n\n    typedef typename l_::type type;\n    typedef typename l_::is_le is_le;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(3, lambda, (T, Tag, Protect))\n};\n\nBOOST_MPL_AUX_NA_SPEC2(1, 3, lambda)\n\ntemplate<\n      typename T\n    >\nstruct is_lambda_expression\n    : lambda<T>::is_le\n{\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/less.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"less.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct less_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< less_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< less_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct less_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct less_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct less_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct less_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct less\n\n    : less_impl<\n          typename less_tag<N1>::type\n        , typename less_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, less)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct less_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N2)::value > BOOST_MPL_AUX_VALUE_WKND(N1)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/less_equal.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"less_equal.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct less_equal_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< less_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< less_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct less_equal_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct less_equal_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct less_equal_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct less_equal_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct less_equal\n\n    : less_equal_impl<\n          typename less_equal_tag<N1>::type\n        , typename less_equal_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less_equal, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, less_equal)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct less_equal_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value <= BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/list.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"list.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct list;\n\ntemplate<\n     \n    >\nstruct list<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list0<  >\n{\n    typedef list0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct list<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list1<T0>\n{\n    typedef typename list1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct list<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list2< T0,T1 >\n{\n    typedef typename list2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct list<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list3< T0,T1,T2 >\n{\n    typedef typename list3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct list<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list4< T0,T1,T2,T3 >\n{\n    typedef typename list4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct list<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list5< T0,T1,T2,T3,T4 >\n{\n    typedef typename list5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename list6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename list7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename list8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename list9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename list10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename list11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : list12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename list12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : list13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename list13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : list14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename list14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : list15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename list15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : list16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename list16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : list17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename list17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : list18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename list18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : list19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename list19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct list\n    : list20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename list20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/list_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"list_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX\n    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX\n    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX\n    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX\n    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX\n    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX\n    , long C18 = LONG_MAX, long C19 = LONG_MAX\n    >\nstruct list_c;\n\ntemplate<\n      typename T\n    >\nstruct list_c<\n          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list0_c<T>\n{\n    typedef typename list0_c<T>::type type;\n};\n\ntemplate<\n      typename T, long C0\n    >\nstruct list_c<\n          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list1_c< T,C0 >\n{\n    typedef typename list1_c< T,C0 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1\n    >\nstruct list_c<\n          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list2_c< T,C0,C1 >\n{\n    typedef typename list2_c< T,C0,C1 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2\n    >\nstruct list_c<\n          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list3_c< T,C0,C1,C2 >\n{\n    typedef typename list3_c< T,C0,C1,C2 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list4_c< T,C0,C1,C2,C3 >\n{\n    typedef typename list4_c< T,C0,C1,C2,C3 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list5_c< T,C0,C1,C2,C3,C4 >\n{\n    typedef typename list5_c< T,C0,C1,C2,C3,C4 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list6_c< T,C0,C1,C2,C3,C4,C5 >\n{\n    typedef typename list6_c< T,C0,C1,C2,C3,C4,C5 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list7_c< T,C0,C1,C2,C3,C4,C5,C6 >\n{\n    typedef typename list7_c< T,C0,C1,C2,C3,C4,C5,C6 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX\n        >\n    : list8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >\n{\n    typedef typename list8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : list9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >\n{\n    typedef typename list9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : list10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >\n{\n    typedef typename list10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >\n{\n    typedef typename list11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >\n{\n    typedef typename list12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >\n{\n    typedef typename list13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list14_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        >\n{\n    typedef typename list14_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list15_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        >\n{\n    typedef typename list15_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list16_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15\n        >\n{\n    typedef typename list16_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list17_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16\n        >\n{\n    typedef typename list17_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, LONG_MAX, LONG_MAX\n        >\n    : list18_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17\n        >\n{\n    typedef typename list18_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, LONG_MAX\n        >\n    : list19_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18\n        >\n{\n    typedef typename list19_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n    >\nstruct list_c\n    : list20_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, C19\n        >\n{\n    typedef typename list20_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/map.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"map.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct map;\n\ntemplate<\n     \n    >\nstruct map<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map0<  >\n{\n    typedef map0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct map<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map1<T0>\n{\n    typedef typename map1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct map<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map2< T0,T1 >\n{\n    typedef typename map2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct map<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map3< T0,T1,T2 >\n{\n    typedef typename map3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct map<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map4< T0,T1,T2,T3 >\n{\n    typedef typename map4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct map<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map5< T0,T1,T2,T3,T4 >\n{\n    typedef typename map5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename map6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename map7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename map8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename map9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename map10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename map11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : map12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename map12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : map13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename map13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : map14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename map14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : map15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename map15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : map16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename map16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : map17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename map17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : map18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename map18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : map19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename map19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct map\n    : map20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename map20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/minus.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"minus.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct minus_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< minus_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< minus_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct minus_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct minus_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct minus_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct minus_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct minus\n    : minus< minus< minus< minus< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , minus\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct minus< N1,N2,N3,N4,na >\n\n    : minus< minus< minus< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , minus\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct minus< N1,N2,N3,na,na >\n\n    : minus< minus< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , minus\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct minus< N1,N2,na,na,na >\n    : minus_impl<\n          typename minus_tag<N1>::type\n        , typename minus_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , minus\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, minus)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct minus_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  - BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/modulus.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"modulus.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct modulus_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< modulus_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< modulus_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct modulus_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct modulus_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct modulus_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct modulus_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct modulus\n\n    : modulus_impl<\n          typename modulus_tag<N1>::type\n        , typename modulus_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, modulus, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, modulus)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct modulus_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  % BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/not_equal_to.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"not_equal_to.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct not_equal_to_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< not_equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< not_equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct not_equal_to_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct not_equal_to_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct not_equal_to_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct not_equal_to_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct not_equal_to\n\n    : not_equal_to_impl<\n          typename not_equal_to_tag<N1>::type\n        , typename not_equal_to_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, not_equal_to, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, not_equal_to)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct not_equal_to_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value != BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/or.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"or.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate< bool C_, typename T1, typename T2, typename T3, typename T4 >\nstruct or_impl\n    : true_\n{\n};\n\ntemplate< typename T1, typename T2, typename T3, typename T4 >\nstruct or_impl< false,T1,T2,T3,T4 >\n    : or_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        , T2, T3, T4\n        , false_\n        >\n{\n};\n\ntemplate<>\nstruct or_impl<\n          false\n        , false_, false_, false_, false_\n        >\n    : false_\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    , typename T3 = false_, typename T4 = false_, typename T5 = false_\n    >\nstruct or_\n\n    : aux::or_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        , T2, T3, T4, T5\n        >\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , or_\n        , ( T1, T2, T3, T4, T5)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC2(\n      2\n    , 5\n    , or_\n    )\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/placeholders.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n// Copyright Peter Dimov 2001-2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"placeholders.hpp\" header\n// -- DO NOT modify by hand!\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg< -1 > _;\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_;\n}\n\n}}\n\n/// agurt, 17/mar/02: one more placeholder for the last 'apply#' \n/// specialization\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<1> _1;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_1)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_1;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<2> _2;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_2)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_2;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<3> _3;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_3)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_3;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<4> _4;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_4)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_4;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<5> _5;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_5)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_5;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<6> _6;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_6)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_6;\n}\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/plus.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"plus.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct plus_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< plus_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< plus_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct plus_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct plus_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct plus_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct plus_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct plus\n    : plus< plus< plus< plus< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , plus\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct plus< N1,N2,N3,N4,na >\n\n    : plus< plus< plus< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , plus\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct plus< N1,N2,N3,na,na >\n\n    : plus< plus< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , plus\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct plus< N1,N2,na,na,na >\n    : plus_impl<\n          typename plus_tag<N1>::type\n        , typename plus_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , plus\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, plus)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct plus_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  + BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/quote.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2008\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"quote.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate< typename T, bool has_type_ >\nstruct quote_impl\n\n{\n    typedef typename T::type type;\n};\n\ntemplate< typename T >\nstruct quote_impl< T,false >\n{\n    typedef T type;\n};\n\ntemplate<\n      template< typename P1 > class F\n    , typename Tag = void_\n    >\nstruct quote1\n{\n    template< typename U1 > struct apply\n\n    {\n        typedef typename quote_impl<\n              F<U1>\n            , aux::has_type< F<U1> >::value\n            >::type type;\n    };\n};\n\ntemplate<\n      template< typename P1, typename P2 > class F\n    , typename Tag = void_\n    >\nstruct quote2\n{\n    template< typename U1, typename U2 > struct apply\n\n    {\n        typedef typename quote_impl<\n              F< U1,U2 >\n            , aux::has_type< F< U1,U2 > >::value\n            >::type type;\n    };\n};\n\ntemplate<\n      template< typename P1, typename P2, typename P3 > class F\n    , typename Tag = void_\n    >\nstruct quote3\n{\n    template< typename U1, typename U2, typename U3 > struct apply\n\n    {\n        typedef typename quote_impl<\n              F< U1,U2,U3 >\n            , aux::has_type< F< U1,U2,U3 > >::value\n            >::type type;\n    };\n};\n\ntemplate<\n      template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename Tag = void_\n    >\nstruct quote4\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4\n        >\n    struct apply\n\n    {\n        typedef typename quote_impl<\n              F< U1,U2,U3,U4 >\n            , aux::has_type< F< U1,U2,U3,U4 > >::value\n            >::type type;\n    };\n};\n\ntemplate<\n      template<\n          typename P1, typename P2, typename P3, typename P4\n        , typename P5\n        >\n      class F\n    , typename Tag = void_\n    >\nstruct quote5\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4\n        , typename U5\n        >\n    struct apply\n\n    {\n        typedef typename quote_impl<\n              F< U1,U2,U3,U4,U5 >\n            , aux::has_type< F< U1,U2,U3,U4,U5 > >::value\n            >::type type;\n    };\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/reverse_fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"reverse_fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl;\n\ntemplate< long N >\nstruct reverse_fold_chunk;\n\ntemplate<> struct reverse_fold_chunk<0>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef fwd_state0 bkwd_state0;\n        typedef bkwd_state0 state;\n        typedef iter0 iterator;\n    };\n};\n\ntemplate<> struct reverse_fold_chunk<1>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        \n\n        typedef fwd_state1 bkwd_state1;\n        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n        typedef bkwd_state0 state;\n        typedef iter1 iterator;\n    };\n};\n\ntemplate<> struct reverse_fold_chunk<2>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        \n\n        typedef fwd_state2 bkwd_state2;\n        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter2 iterator;\n    };\n};\n\ntemplate<> struct reverse_fold_chunk<3>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        \n\n        typedef fwd_state3 bkwd_state3;\n        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;\n        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter3 iterator;\n    };\n};\n\ntemplate<> struct reverse_fold_chunk<4>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;\n        typedef typename mpl::next<iter3>::type iter4;\n        \n\n        typedef fwd_state4 bkwd_state4;\n        typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;\n        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;\n        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter4 iterator;\n    };\n};\n\ntemplate< long N >\nstruct reverse_fold_chunk\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;\n        typedef typename mpl::next<iter3>::type iter4;\n        \n\n        typedef reverse_fold_impl<\n              ( (N - 4) < 0 ? 0 : N - 4 )\n            , iter4\n            , Last\n            , fwd_state4\n            , BackwardOp\n            , ForwardOp\n            > nested_chunk;\n\n        typedef typename nested_chunk::state bkwd_state4;\n        typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;\n        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;\n        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef typename nested_chunk::iterator iterator;\n    };\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_step;\n\ntemplate<\n      typename Last\n    , typename State\n    >\nstruct reverse_fold_null_step\n{\n    typedef Last iterator;\n    typedef State state;\n};\n\ntemplate<>\nstruct reverse_fold_chunk< -1 >\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef typename if_<\n              typename is_same< First,Last >::type\n            , reverse_fold_null_step< Last,State >\n            , reverse_fold_step< First,Last,State,BackwardOp,ForwardOp >\n            >::type res_;\n\n        typedef typename res_::state state;\n        typedef typename res_::iterator iterator;\n    };\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_step\n{\n    typedef reverse_fold_chunk< -1 >::template result_<\n          typename mpl::next<First>::type\n        , Last\n        , typename apply2<ForwardOp,State, typename deref<First>::type>::type\n        , BackwardOp\n        , ForwardOp\n        > nested_step;\n\n    typedef typename apply2<\n          BackwardOp\n        , typename nested_step::state\n        , typename deref<First>::type\n        >::type state;\n\n    typedef typename nested_step::iterator iterator;\n};\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl\n    : reverse_fold_chunk<N>\n        ::template result_< First,Last,State,BackwardOp,ForwardOp >\n{\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/reverse_iter_fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"reverse_iter_fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl;\n\ntemplate< long N >\nstruct reverse_iter_fold_chunk;\n\ntemplate<> struct reverse_iter_fold_chunk<0>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef fwd_state0 bkwd_state0;\n        typedef bkwd_state0 state;\n        typedef iter0 iterator;\n    };\n};\n\ntemplate<> struct reverse_iter_fold_chunk<1>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        \n\n        typedef fwd_state1 bkwd_state1;\n        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n        typedef bkwd_state0 state;\n        typedef iter1 iterator;\n    };\n};\n\ntemplate<> struct reverse_iter_fold_chunk<2>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        \n\n        typedef fwd_state2 bkwd_state2;\n        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter2 iterator;\n    };\n};\n\ntemplate<> struct reverse_iter_fold_chunk<3>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        \n\n        typedef fwd_state3 bkwd_state3;\n        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;\n        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter3 iterator;\n    };\n};\n\ntemplate<> struct reverse_iter_fold_chunk<4>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;\n        typedef typename mpl::next<iter3>::type iter4;\n        \n\n        typedef fwd_state4 bkwd_state4;\n        typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;\n        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;\n        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter4 iterator;\n    };\n};\n\ntemplate< long N >\nstruct reverse_iter_fold_chunk\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;\n        typedef typename mpl::next<iter3>::type iter4;\n        \n\n        typedef reverse_iter_fold_impl<\n              ( (N - 4) < 0 ? 0 : N - 4 )\n            , iter4\n            , Last\n            , fwd_state4\n            , BackwardOp\n            , ForwardOp\n            > nested_chunk;\n\n        typedef typename nested_chunk::state bkwd_state4;\n        typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;\n        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;\n        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef typename nested_chunk::iterator iterator;\n    };\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_step;\n\ntemplate<\n      typename Last\n    , typename State\n    >\nstruct reverse_iter_fold_null_step\n{\n    typedef Last iterator;\n    typedef State state;\n};\n\ntemplate<>\nstruct reverse_iter_fold_chunk< -1 >\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef typename if_<\n              typename is_same< First,Last >::type\n            , reverse_iter_fold_null_step< Last,State >\n            , reverse_iter_fold_step< First,Last,State,BackwardOp,ForwardOp >\n            >::type res_;\n\n        typedef typename res_::state state;\n        typedef typename res_::iterator iterator;\n    };\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_step\n{\n    typedef reverse_iter_fold_chunk< -1 >::template result_<\n          typename mpl::next<First>::type\n        , Last\n        , typename apply2< ForwardOp,State,First >::type\n        , BackwardOp\n        , ForwardOp\n        > nested_step;\n\n    typedef typename apply2<\n          BackwardOp\n        , typename nested_step::state\n        , First\n        >::type state;\n\n    typedef typename nested_step::iterator iterator;\n};\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl\n    : reverse_iter_fold_chunk<N>\n        ::template result_< First,Last,State,BackwardOp,ForwardOp >\n{\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/set.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"set.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct set;\n\ntemplate<\n     \n    >\nstruct set<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set0<  >\n{\n    typedef set0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct set<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set1<T0>\n{\n    typedef typename set1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct set<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set2< T0,T1 >\n{\n    typedef typename set2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct set<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set3< T0,T1,T2 >\n{\n    typedef typename set3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct set<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set4< T0,T1,T2,T3 >\n{\n    typedef typename set4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct set<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set5< T0,T1,T2,T3,T4 >\n{\n    typedef typename set5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename set6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename set7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename set8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename set9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename set10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename set11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : set12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename set12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : set13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename set13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : set14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename set14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : set15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename set15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : set16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename set16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : set17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename set17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : set18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename set18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : set19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename set19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct set\n    : set20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename set20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/set_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"set_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX\n    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX\n    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX\n    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX\n    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX\n    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX\n    , long C18 = LONG_MAX, long C19 = LONG_MAX\n    >\nstruct set_c;\n\ntemplate<\n      typename T\n    >\nstruct set_c<\n          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set0_c<T>\n{\n    typedef typename set0_c<T>::type type;\n};\n\ntemplate<\n      typename T, long C0\n    >\nstruct set_c<\n          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set1_c< T,C0 >\n{\n    typedef typename set1_c< T,C0 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1\n    >\nstruct set_c<\n          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set2_c< T,C0,C1 >\n{\n    typedef typename set2_c< T,C0,C1 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2\n    >\nstruct set_c<\n          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set3_c< T,C0,C1,C2 >\n{\n    typedef typename set3_c< T,C0,C1,C2 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set4_c< T,C0,C1,C2,C3 >\n{\n    typedef typename set4_c< T,C0,C1,C2,C3 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set5_c< T,C0,C1,C2,C3,C4 >\n{\n    typedef typename set5_c< T,C0,C1,C2,C3,C4 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set6_c< T,C0,C1,C2,C3,C4,C5 >\n{\n    typedef typename set6_c< T,C0,C1,C2,C3,C4,C5 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set7_c< T,C0,C1,C2,C3,C4,C5,C6 >\n{\n    typedef typename set7_c< T,C0,C1,C2,C3,C4,C5,C6 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX\n        >\n    : set8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >\n{\n    typedef typename set8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : set9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >\n{\n    typedef typename set9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : set10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >\n{\n    typedef typename set10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >\n{\n    typedef typename set11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >\n{\n    typedef typename set12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >\n{\n    typedef typename set13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set14_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        >\n{\n    typedef typename set14_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set15_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        >\n{\n    typedef typename set15_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set16_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15\n        >\n{\n    typedef typename set16_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set17_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16\n        >\n{\n    typedef typename set17_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, LONG_MAX, LONG_MAX\n        >\n    : set18_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17\n        >\n{\n    typedef typename set18_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, LONG_MAX\n        >\n    : set19_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18\n        >\n{\n    typedef typename set19_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n    >\nstruct set_c\n    : set20_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, C19\n        >\n{\n    typedef typename set20_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/shift_left.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"shift_left.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct shift_left_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< shift_left_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< shift_left_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct shift_left_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct shift_left_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct shift_left_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct shift_left_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct shift_left\n\n    : shift_left_impl<\n          typename shift_left_tag<N1>::type\n        , typename shift_left_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_left, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, shift_left)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct shift_left_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N, typename S > struct apply\n\n        : integral_c<\n              typename N::value_type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N)::value\n                  << BOOST_MPL_AUX_VALUE_WKND(S)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/shift_right.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"shift_right.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct shift_right_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< shift_right_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< shift_right_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct shift_right_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct shift_right_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct shift_right_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct shift_right_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct shift_right\n\n    : shift_right_impl<\n          typename shift_right_tag<N1>::type\n        , typename shift_right_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_right, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, shift_right)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct shift_right_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N, typename S > struct apply\n\n        : integral_c<\n              typename N::value_type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N)::value\n                  >> BOOST_MPL_AUX_VALUE_WKND(S)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/template_arity.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"template_arity.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< bool >\nstruct template_arity_impl\n{\n    template< typename F > struct result_\n        : mpl::int_< -1 >\n    {\n    };\n};\n\ntemplate<>\nstruct template_arity_impl<true>\n{\n    template< typename F > struct result_\n        : F::arity\n    {\n    };\n};\n\ntemplate< typename F >\nstruct template_arity\n    : template_arity_impl< ::boost::mpl::aux::has_rebind<F>::value >\n        ::template result_<F>\n{\n};\n\n}}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/times.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"times.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct times_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< times_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< times_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct times_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct times_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct times_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct times_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct times\n    : times< times< times< times< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , times\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct times< N1,N2,N3,N4,na >\n\n    : times< times< times< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , times\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct times< N1,N2,N3,na,na >\n\n    : times< times< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , times\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct times< N1,N2,na,na,na >\n    : times_impl<\n          typename times_tag<N1>::type\n        , typename times_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , times\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, times)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct times_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  * BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/unpack_args.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2002-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"unpack_args.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate< int size, typename F, typename Args >\nstruct unpack_args_impl;\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 0,F,Args >\n    : apply0<\n          F\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 1,F,Args >\n    : apply1<\n          F\n        , typename at_c< Args,0 >::type\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 2,F,Args >\n    : apply2<\n          F\n        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 3,F,Args >\n    : apply3<\n          F\n        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n        , typename at_c< Args,2 >::type\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 4,F,Args >\n    : apply4<\n          F\n        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n        , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 5,F,Args >\n    : apply5<\n          F\n        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n        , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type\n        , typename at_c< Args,4 >::type\n        >\n{\n};\n\n}\n\ntemplate<\n      typename F\n    >\nstruct unpack_args\n{\n    template< typename Args > struct apply\n    {\n        typedef typename aux::unpack_args_impl<\n              size<Args>::value\n            , F\n            , Args\n            >::type type;\n\n    };\n};\n\nBOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(1, unpack_args)\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/vector.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"vector.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct vector;\n\ntemplate<\n     \n    >\nstruct vector<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector0<  >\n{\n    typedef vector0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct vector<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector1<T0>\n{\n    typedef typename vector1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct vector<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector2< T0,T1 >\n{\n    typedef typename vector2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct vector<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector3< T0,T1,T2 >\n{\n    typedef typename vector3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct vector<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector4< T0,T1,T2,T3 >\n{\n    typedef typename vector4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector5< T0,T1,T2,T3,T4 >\n{\n    typedef typename vector5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename vector6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename vector7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename vector8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : vector15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename vector15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : vector16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename vector16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : vector17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename vector17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : vector18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename vector18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : vector19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename vector19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct vector\n    : vector20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename vector20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc/vector_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2008\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"vector_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX\n    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX\n    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX\n    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX\n    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX\n    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX\n    , long C18 = LONG_MAX, long C19 = LONG_MAX\n    >\nstruct vector_c;\n\ntemplate<\n      typename T\n    >\nstruct vector_c<\n          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector0_c<T>\n{\n    typedef typename vector0_c<T>::type type;\n};\n\ntemplate<\n      typename T, long C0\n    >\nstruct vector_c<\n          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector1_c< T, T(C0) >\n{\n    typedef typename vector1_c< T, T(C0) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1\n    >\nstruct vector_c<\n          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector2_c< T, T(C0), T(C1) >\n{\n    typedef typename vector2_c< T, T(C0), T(C1) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2\n    >\nstruct vector_c<\n          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector3_c< T, T(C0), T(C1), T(C2) >\n{\n    typedef typename vector3_c< T, T(C0), T(C1), T(C2) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector4_c< T, T(C0), T(C1), T(C2), T(C3) >\n{\n    typedef typename vector4_c< T, T(C0), T(C1), T(C2), T(C3) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector5_c< T, T(C0), T(C1), T(C2), T(C3), T(C4) >\n{\n    typedef typename vector5_c< T, T(C0), T(C1), T(C2), T(C3), T(C4) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector6_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5) >\n{\n    typedef typename vector6_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector7_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6) >\n{\n    typedef typename vector7_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX\n        >\n    : vector8_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7) >\n{\n    typedef typename vector8_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : vector9_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8) >\n{\n    typedef typename vector9_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : vector10_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9) >\n{\n    typedef typename vector10_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector11_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10) >\n{\n    typedef typename vector11_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector12_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11) >\n{\n    typedef typename vector12_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector13_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12) >\n{\n    typedef typename vector13_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector14_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13) >\n{\n    typedef typename vector14_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector15_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14) >\n{\n    typedef typename vector15_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector16_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15) >\n{\n    typedef typename vector16_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector17_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16) >\n{\n    typedef typename vector17_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, LONG_MAX, LONG_MAX\n        >\n    : vector18_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17) >\n{\n    typedef typename vector18_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, LONG_MAX\n        >\n    : vector19_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18) >\n{\n    typedef typename vector19_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18) >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n    >\nstruct vector_c\n    : vector20_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19) >\n{\n    typedef typename vector20_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19) >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/advance_backward.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/advance_backward.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< long N > struct advance_backward;\ntemplate<>\nstruct advance_backward<0>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef iter0 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<1>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef iter1 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<2>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef typename prior<iter1>::type iter2;\n        typedef iter2 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<3>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef typename prior<iter1>::type iter2;\n        typedef typename prior<iter2>::type iter3;\n        typedef iter3 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<4>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef typename prior<iter1>::type iter2;\n        typedef typename prior<iter2>::type iter3;\n        typedef typename prior<iter3>::type iter4;\n        typedef iter4 type;\n    };\n};\n\ntemplate< long N >\nstruct advance_backward\n{\n    template< typename Iterator > struct apply\n    {\n        typedef typename apply_wrap1<\n              advance_backward<4>\n            , Iterator\n            >::type chunk_result_;\n\n        typedef typename apply_wrap1<\n              advance_backward<(\n                (N - 4) < 0\n                    ? 0\n                    : N - 4\n                    )>\n            , chunk_result_\n            >::type type;\n    };\n};\n\n}}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/advance_forward.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/advance_forward.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< long N > struct advance_forward;\ntemplate<>\nstruct advance_forward<0>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef iter0 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<1>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef iter1 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<2>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef typename next<iter1>::type iter2;\n        typedef iter2 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<3>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef typename next<iter1>::type iter2;\n        typedef typename next<iter2>::type iter3;\n        typedef iter3 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<4>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef typename next<iter1>::type iter2;\n        typedef typename next<iter2>::type iter3;\n        typedef typename next<iter3>::type iter4;\n        typedef iter4 type;\n    };\n};\n\ntemplate< long N >\nstruct advance_forward\n{\n    template< typename Iterator > struct apply\n    {\n        typedef typename apply_wrap1<\n              advance_forward<4>\n            , Iterator\n            >::type chunk_result_;\n\n        typedef typename apply_wrap1<\n              advance_forward<(\n                (N - 4) < 0\n                    ? 0\n                    : N - 4\n                    )>\n            , chunk_result_\n            >::type type;\n    };\n};\n\n}}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/and.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/and.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate< bool C_, typename T1, typename T2, typename T3, typename T4 >\nstruct and_impl\n    : false_\n{\n};\n\ntemplate< typename T1, typename T2, typename T3, typename T4 >\nstruct and_impl< true,T1,T2,T3,T4 >\n    : and_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        , T2, T3, T4\n        , true_\n        >\n{\n};\n\ntemplate<>\nstruct and_impl<\n          true\n        , true_, true_, true_, true_\n        >\n    : true_\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    , typename T3 = true_, typename T4 = true_, typename T5 = true_\n    >\nstruct and_\n\n    : aux::and_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        , T2, T3, T4, T5\n        >\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , and_\n        , ( T1, T2, T3, T4, T5)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC2(\n      2\n    , 5\n    , and_\n    )\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/apply.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/apply.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F\n    >\nstruct apply0\n\n    : apply_wrap0<\n          typename lambda<F>::type\n       \n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          1\n        , apply0\n        , (F )\n        )\n};\n\ntemplate<\n      typename F\n    >\nstruct apply< F,na,na,na,na,na >\n    : apply0<F>\n{\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply1\n\n    : apply_wrap1<\n          typename lambda<F>::type\n        , T1\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          2\n        , apply1\n        , (F, T1)\n        )\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply< F,T1,na,na,na,na >\n    : apply1< F,T1 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply2\n\n    : apply_wrap2<\n          typename lambda<F>::type\n        , T1, T2\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          3\n        , apply2\n        , (F, T1, T2)\n        )\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply< F,T1,T2,na,na,na >\n    : apply2< F,T1,T2 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply3\n\n    : apply_wrap3<\n          typename lambda<F>::type\n        , T1, T2, T3\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          4\n        , apply3\n        , (F, T1, T2, T3)\n        )\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply< F,T1,T2,T3,na,na >\n    : apply3< F,T1,T2,T3 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply4\n\n    : apply_wrap4<\n          typename lambda<F>::type\n        , T1, T2, T3, T4\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , apply4\n        , (F, T1, T2, T3, T4)\n        )\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply< F,T1,T2,T3,T4,na >\n    : apply4< F,T1,T2,T3,T4 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply5\n\n    : apply_wrap5<\n          typename lambda<F>::type\n        , T1, T2, T3, T4, T5\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          6\n        , apply5\n        , (F, T1, T2, T3, T4, T5)\n        )\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply\n    : apply5< F,T1,T2,T3,T4,T5 >\n{\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/apply_fwd.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/apply_fwd.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na\n    >\nstruct apply;\n\ntemplate<\n      typename F\n    >\nstruct apply0;\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply1;\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply2;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply3;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply4;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply5;\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/apply_wrap.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/apply_wrap.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      int N, typename F\n    >\nstruct apply_wrap_impl0;\n\ntemplate<\n      typename F\n    >\nstruct apply_wrap_impl0<\n          0\n        , F\n       \n        >\n{\n    typedef typename F::template apply<\n         \n/// since the defaults are \"lost\", we have to pass *something* even for nullary\n/// metafunction classes\n        na\n        > type;\n};\n\ntemplate<\n      typename F\n    >\nstruct apply_wrap_impl0<\n          1\n        , F\n       \n        >\n{\n    typedef typename F::template apply<\n         \n        na\n        > type;\n};\n\ntemplate<\n      typename F\n    >\nstruct apply_wrap_impl0<\n          2\n        , F\n       \n        >\n{\n    typedef typename F::template apply<\n         \n        na, na\n\n        > type;\n};\n\ntemplate<\n      typename F\n    >\nstruct apply_wrap_impl0<\n          3\n        , F\n       \n        >\n{\n    typedef typename F::template apply<\n         \n        na, na, na\n\n        > type;\n};\n\ntemplate<\n      typename F\n    >\nstruct apply_wrap_impl0<\n          4\n        , F\n       \n        >\n{\n    typedef typename F::template apply<\n         \n        na, na, na, na\n\n        > type;\n};\n\ntemplate<\n      typename F\n    >\nstruct apply_wrap_impl0<\n          5\n        , F\n       \n        >\n{\n    typedef typename F::template apply<\n         \n        na, na, na, na, na\n\n        > type;\n};\n\ntemplate<\n      typename F\n    >\nstruct apply_wrap0\n    : apply_wrap_impl0<\n          ::boost::mpl::aux::arity< F,0 >::value\n        , F\n       \n        >::type\n{\n};\n\ntemplate<\n      int N, typename F, typename T1\n    >\nstruct apply_wrap_impl1;\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply_wrap_impl1<\n          1\n        , F\n        , T1\n        >\n{\n    typedef typename F::template apply<\n          T1\n        > type;\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply_wrap_impl1<\n          2\n        , F\n        , T1\n        >\n{\n    typedef typename F::template apply<\n          T1\n        , na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply_wrap_impl1<\n          3\n        , F\n        , T1\n        >\n{\n    typedef typename F::template apply<\n          T1\n        , na, na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply_wrap_impl1<\n          4\n        , F\n        , T1\n        >\n{\n    typedef typename F::template apply<\n          T1\n        , na, na, na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply_wrap_impl1<\n          5\n        , F\n        , T1\n        >\n{\n    typedef typename F::template apply<\n          T1\n        , na, na, na, na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply_wrap1\n    : apply_wrap_impl1<\n          ::boost::mpl::aux::arity< F,1 >::value\n        , F\n        , T1\n        >::type\n{\n};\n\ntemplate<\n      int N, typename F, typename T1, typename T2\n    >\nstruct apply_wrap_impl2;\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply_wrap_impl2<\n          2\n        , F\n        , T1, T2\n        >\n{\n    typedef typename F::template apply<\n          T1, T2\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply_wrap_impl2<\n          3\n        , F\n        , T1, T2\n        >\n{\n    typedef typename F::template apply<\n          T1, T2\n\n        , na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply_wrap_impl2<\n          4\n        , F\n        , T1, T2\n        >\n{\n    typedef typename F::template apply<\n          T1, T2\n\n        , na, na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply_wrap_impl2<\n          5\n        , F\n        , T1, T2\n        >\n{\n    typedef typename F::template apply<\n          T1, T2\n\n        , na, na, na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply_wrap2\n    : apply_wrap_impl2<\n          ::boost::mpl::aux::arity< F,2 >::value\n        , F\n        , T1, T2\n        >::type\n{\n};\n\ntemplate<\n      int N, typename F, typename T1, typename T2, typename T3\n    >\nstruct apply_wrap_impl3;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply_wrap_impl3<\n          3\n        , F\n        , T1, T2, T3\n        >\n{\n    typedef typename F::template apply<\n          T1, T2, T3\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply_wrap_impl3<\n          4\n        , F\n        , T1, T2, T3\n        >\n{\n    typedef typename F::template apply<\n          T1, T2, T3\n\n        , na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply_wrap_impl3<\n          5\n        , F\n        , T1, T2, T3\n        >\n{\n    typedef typename F::template apply<\n          T1, T2, T3\n\n        , na, na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply_wrap3\n    : apply_wrap_impl3<\n          ::boost::mpl::aux::arity< F,3 >::value\n        , F\n        , T1, T2, T3\n        >::type\n{\n};\n\ntemplate<\n      int N, typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply_wrap_impl4;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply_wrap_impl4<\n          4\n        , F\n        , T1, T2, T3, T4\n        >\n{\n    typedef typename F::template apply<\n          T1, T2, T3, T4\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply_wrap_impl4<\n          5\n        , F\n        , T1, T2, T3, T4\n        >\n{\n    typedef typename F::template apply<\n          T1, T2, T3, T4\n\n        , na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply_wrap4\n    : apply_wrap_impl4<\n          ::boost::mpl::aux::arity< F,4 >::value\n        , F\n        , T1, T2, T3, T4\n        >::type\n{\n};\n\ntemplate<\n      int N, typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply_wrap_impl5;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply_wrap_impl5<\n          5\n        , F\n        , T1, T2, T3, T4, T5\n        >\n{\n    typedef typename F::template apply<\n          T1, T2, T3, T4, T5\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply_wrap5\n    : apply_wrap_impl5<\n          ::boost::mpl::aux::arity< F,5 >::value\n        , F\n        , T1, T2, T3, T4, T5\n        >::type\n{\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/arg.hpp",
    "content": "\n// Copyright Peter Dimov 2001-2002\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/arg.hpp\" header\n// -- DO NOT modify by hand!\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntemplate<> struct arg< -1 >\n{\n    BOOST_STATIC_CONSTANT(int, value  = -1);\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U1 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<1>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 1);\n    typedef arg<2> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U1 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<2>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 2);\n    typedef arg<3> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U2 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<3>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 3);\n    typedef arg<4> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U3 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<4>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 4);\n    typedef arg<5> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U4 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<5>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 5);\n    typedef arg<6> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U5 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\nBOOST_MPL_AUX_NONTYPE_ARITY_SPEC(1,int, arg)\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/basic_bind.hpp",
    "content": "\n// Copyright Peter Dimov 2001\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/basic_bind.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      typename T, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg\n{\n    typedef T type;\n};\n\ntemplate<\n      int N, typename U1, typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 >\n{\n    typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename F\n    >\nstruct bind0\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n\n     public:\n        typedef typename apply_wrap0<\n              f_\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg<\n      bind0<F>, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind0<F> f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(1, bind0)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind1\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n\n     public:\n        typedef typename apply_wrap1<\n              f_\n            , typename t1::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename U1, typename U2, typename U3\n    , typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind1< F,T1 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind1< F,T1 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(2, bind1)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind2\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n\n     public:\n        typedef typename apply_wrap2<\n              f_\n            , typename t1::type, typename t2::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename U1, typename U2\n    , typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind2< F,T1,T2 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind2< F,T1,T2 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(3, bind2)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind3\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n\n     public:\n        typedef typename apply_wrap3<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename U1\n    , typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind3< F,T1,T2,T3 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(4, bind3)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind4\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;\n\n     public:\n        typedef typename apply_wrap4<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename U1, typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind4< F,T1,T2,T3,T4 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(5, bind4)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind5\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;\n        typedef aux::resolve_bind_arg< T5,U1,U2,U3,U4,U5 > t5;\n\n     public:\n        typedef typename apply_wrap5<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type, typename t5::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg<\n      bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind5< F,T1,T2,T3,T4,T5 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(6, bind5)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/bind.hpp",
    "content": "\n// Copyright Peter Dimov 2001\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bind.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      typename T, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg\n{\n    typedef T type;\n};\n\ntemplate<\n      typename T\n    , typename Arg\n    >\nstruct replace_unnamed_arg\n{\n    typedef Arg next;\n    typedef T type;\n};\n\ntemplate<\n      typename Arg\n    >\nstruct replace_unnamed_arg< arg< -1 >, Arg >\n{\n    typedef typename Arg::next next;\n    typedef Arg type;\n};\n\ntemplate<\n      int N, typename U1, typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 >\n{\n    typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename F\n    >\nstruct bind0\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n     public:\n        typedef typename apply_wrap0<\n              f_\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg<\n      bind0<F>, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind0<F> f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(1, bind0)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind1\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n     public:\n        typedef typename apply_wrap1<\n              f_\n            , typename t1::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename U1, typename U2, typename U3\n    , typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind1< F,T1 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind1< F,T1 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(2, bind1)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind2\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n     public:\n        typedef typename apply_wrap2<\n              f_\n            , typename t1::type, typename t2::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename U1, typename U2\n    , typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind2< F,T1,T2 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind2< F,T1,T2 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(3, bind2)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind3\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n     public:\n        typedef typename apply_wrap3<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename U1\n    , typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind3< F,T1,T2,T3 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(4, bind3)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind4\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n        typedef aux::replace_unnamed_arg< T4,n4 > r4;\n        typedef typename r4::type a4;\n        typedef typename r4::next n5;\n        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;\n        ///\n     public:\n        typedef typename apply_wrap4<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename U1, typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind4< F,T1,T2,T3,T4 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(5, bind4)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind5\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n        typedef aux::replace_unnamed_arg< T4,n4 > r4;\n        typedef typename r4::type a4;\n        typedef typename r4::next n5;\n        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;\n        ///\n        typedef aux::replace_unnamed_arg< T5,n5 > r5;\n        typedef typename r5::type a5;\n        typedef typename r5::next n6;\n        typedef aux::resolve_bind_arg< a5,U1,U2,U3,U4,U5 > t5;\n        ///\n     public:\n        typedef typename apply_wrap5<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type, typename t5::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg<\n      bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind5< F,T1,T2,T3,T4,T5 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(6, bind5)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/bind_fwd.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bind_fwd.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F\n    >\nstruct bind0;\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind1;\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind2;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind3;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind4;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind5;\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/bitand.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bitand.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct bitand_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< bitand_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< bitand_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct bitand_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitand_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitand_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct bitand_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct bitand_\n    : bitand_< bitand_< bitand_< bitand_< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , bitand_\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct bitand_< N1,N2,N3,N4,na >\n\n    : bitand_< bitand_< bitand_< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitand_\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct bitand_< N1,N2,N3,na,na >\n\n    : bitand_< bitand_< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitand_\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct bitand_< N1,N2,na,na,na >\n    : bitand_impl<\n          typename bitand_tag<N1>::type\n        , typename bitand_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitand_\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, bitand_)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct bitand_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  & BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/bitor.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bitor.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct bitor_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< bitor_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< bitor_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct bitor_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitor_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitor_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct bitor_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct bitor_\n    : bitor_< bitor_< bitor_< bitor_< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , bitor_\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct bitor_< N1,N2,N3,N4,na >\n\n    : bitor_< bitor_< bitor_< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitor_\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct bitor_< N1,N2,N3,na,na >\n\n    : bitor_< bitor_< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitor_\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct bitor_< N1,N2,na,na,na >\n    : bitor_impl<\n          typename bitor_tag<N1>::type\n        , typename bitor_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitor_\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, bitor_)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct bitor_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  | BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/bitxor.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bitxor.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct bitxor_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< bitxor_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< bitxor_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct bitxor_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitxor_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitxor_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct bitxor_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct bitxor_\n    : bitxor_< bitxor_< bitxor_< bitxor_< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , bitxor_\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct bitxor_< N1,N2,N3,N4,na >\n\n    : bitxor_< bitxor_< bitxor_< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitxor_\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct bitxor_< N1,N2,N3,na,na >\n\n    : bitxor_< bitxor_< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitxor_\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct bitxor_< N1,N2,na,na,na >\n    : bitxor_impl<\n          typename bitxor_tag<N1>::type\n        , typename bitxor_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitxor_\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, bitxor_)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct bitxor_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  ^ BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/deque.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/deque.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct deque;\n\ntemplate<\n     \n    >\nstruct deque<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector0<  >\n{\n    typedef vector0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct deque<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector1<T0>\n{\n    typedef typename vector1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct deque<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector2< T0,T1 >\n{\n    typedef typename vector2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct deque<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector3< T0,T1,T2 >\n{\n    typedef typename vector3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct deque<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector4< T0,T1,T2,T3 >\n{\n    typedef typename vector4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector5< T0,T1,T2,T3,T4 >\n{\n    typedef typename vector5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename vector6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename vector7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename vector8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : vector15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename vector15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : vector16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename vector16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : vector17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename vector17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : vector18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename vector18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : vector19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename vector19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct deque\n    : vector20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename vector20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/divides.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/divides.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct divides_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< divides_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< divides_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct divides_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct divides_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct divides_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct divides_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct divides\n    : divides< divides< divides< divides< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , divides\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct divides< N1,N2,N3,N4,na >\n\n    : divides< divides< divides< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , divides\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct divides< N1,N2,N3,na,na >\n\n    : divides< divides< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , divides\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct divides< N1,N2,na,na,na >\n    : divides_impl<\n          typename divides_tag<N1>::type\n        , typename divides_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , divides\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, divides)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct divides_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  / BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/equal_to.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/equal_to.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct equal_to_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct equal_to_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct equal_to_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct equal_to_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct equal_to_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct equal_to\n\n    : equal_to_impl<\n          typename equal_to_tag<N1>::type\n        , typename equal_to_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, equal_to, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, equal_to)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct equal_to_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value  == BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl;\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 0,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef state0 state;\n    typedef iter0 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 1,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    \n\n    typedef state1 state;\n    typedef iter1 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 2,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    \n\n    typedef state2 state;\n    typedef iter2 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 3,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    \n\n    typedef state3 state;\n    typedef iter3 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 4,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp, state3, typename deref<iter3>::type >::type state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef state4 state;\n    typedef iter4 iterator;\n};\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl\n{\n    typedef fold_impl<\n          4\n        , First\n        , Last\n        , State\n        , ForwardOp\n        > chunk_;\n\n    typedef fold_impl<\n          ( (N - 4) < 0 ? 0 : N - 4 )\n        , typename chunk_::iterator\n        , Last\n        , typename chunk_::state\n        , ForwardOp\n        > res_;\n\n    typedef typename res_::state state;\n    typedef typename res_::iterator iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< -1,First,Last,State,ForwardOp >\n    : fold_impl<\n          -1\n        , typename mpl::next<First>::type\n        , Last\n        , typename apply2<ForwardOp,State, typename deref<First>::type>::type\n        , ForwardOp\n        >\n{\n};\n\ntemplate<\n      typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< -1,Last,Last,State,ForwardOp >\n{\n    typedef State state;\n    typedef Last iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/full_lambda.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/full_lambda.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false\n    , bool C5 = false\n    >\nstruct lambda_or\n    : true_\n{\n};\n\ntemplate<>\nstruct lambda_or< false,false,false,false,false >\n    : false_\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename T\n    , typename Tag\n    , typename Arity\n    >\nstruct lambda\n{\n    typedef false_ is_le;\n    typedef T result_;\n    typedef T type;\n};\n\ntemplate<\n      typename T\n    >\nstruct is_lambda_expression\n    : lambda<T>::is_le\n{\n};\n\ntemplate< int N, typename Tag >\nstruct lambda< arg<N>,Tag, int_< -1 > >\n{\n    typedef true_ is_le;\n    typedef mpl::arg<N> result_; // qualified for the sake of MIPSpro 7.41\n    typedef mpl::protect<result_> type;\n};\n\ntemplate<\n      typename F\n    , typename Tag\n    >\nstruct lambda<\n          bind0<F>\n        , Tag\n        , int_<1>\n        >\n{\n    typedef false_ is_le;\n    typedef bind0<\n          F\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1 > class F\n    , typename L1\n    >\nstruct le_result1\n{\n    typedef F<\n          typename L1::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1 > class F\n    , typename L1\n    >\nstruct le_result1< true_,Tag,F,L1 >\n{\n    typedef bind1<\n          quote1< F,Tag >\n        , typename L1::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1 > class F\n    , typename T1\n    , typename Tag\n    >\nstruct lambda<\n          F<T1>\n        , Tag\n        , int_<1>\n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef typename l1::is_le is_le1;\n    typedef typename aux::lambda_or<\n          is_le1::value\n        >::type is_le;\n\n    typedef aux::le_result1<\n          is_le, Tag, F, l1\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1\n    , typename Tag\n    >\nstruct lambda<\n          bind1< F,T1 >\n        , Tag\n        , int_<2>\n        >\n{\n    typedef false_ is_le;\n    typedef bind1<\n          F\n        , T1\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2 > class F\n    , typename L1, typename L2\n    >\nstruct le_result2\n{\n    typedef F<\n          typename L1::type, typename L2::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2 > class F\n    , typename L1, typename L2\n    >\nstruct le_result2< true_,Tag,F,L1,L2 >\n{\n    typedef bind2<\n          quote2< F,Tag >\n        , typename L1::result_, typename L2::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1, typename P2 > class F\n    , typename T1, typename T2\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2 >\n        , Tag\n        , int_<2>\n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value\n        >::type is_le;\n\n    typedef aux::le_result2<\n          is_le, Tag, F, l1, l2\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    , typename Tag\n    >\nstruct lambda<\n          bind2< F,T1,T2 >\n        , Tag\n        , int_<3>\n        >\n{\n    typedef false_ is_le;\n    typedef bind2<\n          F\n        , T1, T2\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2, typename P3 > class F\n    , typename L1, typename L2, typename L3\n    >\nstruct le_result3\n{\n    typedef F<\n          typename L1::type, typename L2::type, typename L3::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2, typename P3 > class F\n    , typename L1, typename L2, typename L3\n    >\nstruct le_result3< true_,Tag,F,L1,L2,L3 >\n{\n    typedef bind3<\n          quote3< F,Tag >\n        , typename L1::result_, typename L2::result_, typename L3::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1, typename P2, typename P3 > class F\n    , typename T1, typename T2, typename T3\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2,T3 >\n        , Tag\n        , int_<3>\n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    typedef lambda< T3,Tag > l3;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    typedef typename l3::is_le is_le3;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value, is_le3::value\n        >::type is_le;\n\n    typedef aux::le_result3<\n          is_le, Tag, F, l1, l2, l3\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    , typename Tag\n    >\nstruct lambda<\n          bind3< F,T1,T2,T3 >\n        , Tag\n        , int_<4>\n        >\n{\n    typedef false_ is_le;\n    typedef bind3<\n          F\n        , T1, T2, T3\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename L1, typename L2, typename L3, typename L4\n    >\nstruct le_result4\n{\n    typedef F<\n          typename L1::type, typename L2::type, typename L3::type\n        , typename L4::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename L1, typename L2, typename L3, typename L4\n    >\nstruct le_result4< true_,Tag,F,L1,L2,L3,L4 >\n{\n    typedef bind4<\n          quote4< F,Tag >\n        , typename L1::result_, typename L2::result_, typename L3::result_\n        , typename L4::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename T1, typename T2, typename T3, typename T4\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2,T3,T4 >\n        , Tag\n        , int_<4>\n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    typedef lambda< T3,Tag > l3;\n    typedef lambda< T4,Tag > l4;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    typedef typename l3::is_le is_le3;\n    typedef typename l4::is_le is_le4;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value, is_le3::value, is_le4::value\n        >::type is_le;\n\n    typedef aux::le_result4<\n          is_le, Tag, F, l1, l2, l3, l4\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename Tag\n    >\nstruct lambda<\n          bind4< F,T1,T2,T3,T4 >\n        , Tag\n        , int_<5>\n        >\n{\n    typedef false_ is_le;\n    typedef bind4<\n          F\n        , T1, T2, T3, T4\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F\n    , typename L1, typename L2, typename L3, typename L4, typename L5\n    >\nstruct le_result5\n{\n    typedef F<\n          typename L1::type, typename L2::type, typename L3::type\n        , typename L4::type, typename L5::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F\n    , typename L1, typename L2, typename L3, typename L4, typename L5\n    >\nstruct le_result5< true_,Tag,F,L1,L2,L3,L4,L5 >\n{\n    typedef bind5<\n          quote5< F,Tag >\n        , typename L1::result_, typename L2::result_, typename L3::result_\n        , typename L4::result_, typename L5::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template<\n          typename P1, typename P2, typename P3, typename P4\n        , typename P5\n        >\n      class F\n    , typename T1, typename T2, typename T3, typename T4, typename T5\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2,T3,T4,T5 >\n        , Tag\n        , int_<5>\n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    typedef lambda< T3,Tag > l3;\n    typedef lambda< T4,Tag > l4;\n    typedef lambda< T5,Tag > l5;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    typedef typename l3::is_le is_le3;\n    typedef typename l4::is_le is_le4;\n    typedef typename l5::is_le is_le5;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value, is_le3::value, is_le4::value\n        , is_le5::value\n        >::type is_le;\n\n    typedef aux::le_result5<\n          is_le, Tag, F, l1, l2, l3, l4, l5\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    , typename Tag\n    >\nstruct lambda<\n          bind5< F,T1,T2,T3,T4,T5 >\n        , Tag\n        , int_<6>\n        >\n{\n    typedef false_ is_le;\n    typedef bind5<\n          F\n        , T1, T2, T3, T4, T5\n        > result_;\n\n    typedef result_ type;\n};\n\n/// special case for 'protect'\ntemplate< typename T, typename Tag >\nstruct lambda< mpl::protect<T>,Tag, int_<1> >\n{\n    typedef false_ is_le;\n    typedef mpl::protect<T> result_;\n    typedef result_ type;\n};\n\n/// specializations for the main 'bind' form\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    , typename Tag\n    >\nstruct lambda<\n          bind< F,T1,T2,T3,T4,T5 >\n        , Tag\n        , int_<6>\n        >\n{\n    typedef false_ is_le;\n    typedef bind< F,T1,T2,T3,T4,T5 > result_;\n    typedef result_ type;\n};\n\ntemplate<\n      typename F\n    , typename Tag1\n    , typename Tag2\n    , typename Arity\n    >\nstruct lambda<\n          lambda< F,Tag1,Arity >\n        , Tag2\n        , int_<3>\n        >\n{\n    typedef lambda< F,Tag2 > l1;\n    typedef lambda< Tag1,Tag2 > l2;\n    typedef typename l1::is_le is_le;\n    typedef bind1< quote1<aux::template_arity>, typename l1::result_ > arity_;\n    typedef lambda< typename if_< is_le,arity_,Arity >::type, Tag2 > l3;\n    typedef aux::le_result3<is_le, Tag2, mpl::lambda, l1, l2, l3> le_result_;\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 3, lambda)\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/greater.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/greater.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct greater_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< greater_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< greater_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct greater_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct greater_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct greater_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct greater_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct greater\n\n    : greater_impl<\n          typename greater_tag<N1>::type\n        , typename greater_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, greater)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct greater_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value > BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/greater_equal.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/greater_equal.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct greater_equal_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< greater_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< greater_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct greater_equal_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct greater_equal_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct greater_equal_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct greater_equal_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct greater_equal\n\n    : greater_equal_impl<\n          typename greater_equal_tag<N1>::type\n        , typename greater_equal_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater_equal, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, greater_equal)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct greater_equal_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value >= BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/inherit.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/inherit.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    >\nstruct inherit2\n    : T1, T2\n{\n    typedef inherit2 type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, inherit2, (T1, T2))\n};\n\ntemplate< typename T1 >\nstruct inherit2< T1,empty_base >\n{\n    typedef T1 type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (T1, empty_base))\n};\n\ntemplate< typename T2 >\nstruct inherit2< empty_base,T2 >\n{\n    typedef T2 type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base, T2))\n};\n\ntemplate<>\nstruct inherit2< empty_base,empty_base >\n{\n    typedef empty_base type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base, empty_base))\n};\n\nBOOST_MPL_AUX_NA_SPEC(2, inherit2)\n\ntemplate<\n      typename T1 = na, typename T2 = na, typename T3 = na\n    >\nstruct inherit3\n    : inherit2<\n          typename inherit2<\n              T1, T2\n            >::type\n        , T3\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          3\n        , inherit3\n        , ( T1, T2, T3)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC(3, inherit3)\n\ntemplate<\n      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na\n    >\nstruct inherit4\n    : inherit2<\n          typename inherit3<\n              T1, T2, T3\n            >::type\n        , T4\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          4\n        , inherit4\n        , ( T1, T2, T3, T4)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC(4, inherit4)\n\ntemplate<\n      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na\n    , typename T5 = na\n    >\nstruct inherit5\n    : inherit2<\n          typename inherit4<\n              T1, T2, T3, T4\n            >::type\n        , T5\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , inherit5\n        , ( T1, T2, T3, T4, T5)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC(5, inherit5)\n\n/// primary template\n\ntemplate<\n      typename T1 = empty_base, typename T2 = empty_base\n    , typename T3 = empty_base, typename T4 = empty_base\n    , typename T5 = empty_base\n    >\nstruct inherit\n    : inherit5< T1,T2,T3,T4,T5 >\n{\n};\n\ntemplate<>\nstruct inherit< na,na,na,na,na >\n{\n    template<\n\n          typename T1 = empty_base, typename T2 = empty_base\n        , typename T3 = empty_base, typename T4 = empty_base\n        , typename T5 = empty_base\n\n        >\n    struct apply\n        : inherit< T1,T2,T3,T4,T5 >\n    {\n    };\n};\n\nBOOST_MPL_AUX_NA_SPEC_LAMBDA(5, inherit)\nBOOST_MPL_AUX_NA_SPEC_ARITY(5, inherit)\nBOOST_MPL_AUX_NA_SPEC_TEMPLATE_ARITY(5, 5, inherit)\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/iter_fold_if_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n// Copyright David Abrahams 2001-2002\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/iter_fold_if_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< typename Iterator, typename State >\nstruct iter_fold_if_null_step\n{\n    typedef State state;\n    typedef Iterator iterator;\n};\n\ntemplate< bool >\nstruct iter_fold_if_step_impl\n{\n    template<\n          typename Iterator\n        , typename State\n        , typename StateOp\n        , typename IteratorOp\n        >\n    struct result_\n    {\n        typedef typename apply2< StateOp,State,Iterator >::type state;\n        typedef typename IteratorOp::type iterator;\n    };\n};\n\ntemplate<>\nstruct iter_fold_if_step_impl<false>\n{\n    template<\n          typename Iterator\n        , typename State\n        , typename StateOp\n        , typename IteratorOp\n        >\n    struct result_\n    {\n        typedef State state;\n        typedef Iterator iterator;\n    };\n};\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename ForwardOp\n    , typename Predicate\n    >\nstruct iter_fold_if_forward_step\n{\n    typedef typename apply2< Predicate,State,Iterator >::type not_last;\n    typedef typename iter_fold_if_step_impl<\n          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value\n        >::template result_< Iterator,State,ForwardOp, mpl::next<Iterator> > impl_;\n\n    typedef typename impl_::state state;\n    typedef typename impl_::iterator iterator;\n};\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename BackwardOp\n    , typename Predicate\n    >\nstruct iter_fold_if_backward_step\n{\n    typedef typename apply2< Predicate,State,Iterator >::type not_last;\n    typedef typename iter_fold_if_step_impl<\n          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value\n        >::template result_< Iterator,State,BackwardOp, identity<Iterator> > impl_;\n\n    typedef typename impl_::state state;\n    typedef typename impl_::iterator iterator;\n};\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename ForwardOp\n    , typename ForwardPredicate\n    , typename BackwardOp\n    , typename BackwardPredicate\n    >\nstruct iter_fold_if_impl\n{\n private:\n    typedef iter_fold_if_null_step< Iterator,State > forward_step0;\n    typedef iter_fold_if_forward_step< typename forward_step0::iterator, typename forward_step0::state, ForwardOp, ForwardPredicate > forward_step1;\n    typedef iter_fold_if_forward_step< typename forward_step1::iterator, typename forward_step1::state, ForwardOp, ForwardPredicate > forward_step2;\n    typedef iter_fold_if_forward_step< typename forward_step2::iterator, typename forward_step2::state, ForwardOp, ForwardPredicate > forward_step3;\n    typedef iter_fold_if_forward_step< typename forward_step3::iterator, typename forward_step3::state, ForwardOp, ForwardPredicate > forward_step4;\n    \n\n    typedef typename if_<\n          typename forward_step4::not_last\n        , iter_fold_if_impl<\n              typename forward_step4::iterator\n            , typename forward_step4::state\n            , ForwardOp\n            , ForwardPredicate\n            , BackwardOp\n            , BackwardPredicate\n            >\n        , iter_fold_if_null_step<\n              typename forward_step4::iterator\n            , typename forward_step4::state\n            >\n        >::type backward_step4;\n\n    typedef iter_fold_if_backward_step< typename forward_step3::iterator, typename backward_step4::state, BackwardOp, BackwardPredicate > backward_step3;\n    typedef iter_fold_if_backward_step< typename forward_step2::iterator, typename backward_step3::state, BackwardOp, BackwardPredicate > backward_step2;\n    typedef iter_fold_if_backward_step< typename forward_step1::iterator, typename backward_step2::state, BackwardOp, BackwardPredicate > backward_step1;\n    typedef iter_fold_if_backward_step< typename forward_step0::iterator, typename backward_step1::state, BackwardOp, BackwardPredicate > backward_step0;\n    \n\n public:\n    typedef typename backward_step0::state state;\n    typedef typename backward_step4::iterator iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/iter_fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/iter_fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl;\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 0,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef state0 state;\n    typedef iter0 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 1,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    \n\n    typedef state1 state;\n    typedef iter1 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 2,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    \n\n    typedef state2 state;\n    typedef iter2 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 3,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp,state2,iter2 >::type state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    \n\n    typedef state3 state;\n    typedef iter3 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 4,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp,state2,iter2 >::type state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp,state3,iter3 >::type state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef state4 state;\n    typedef iter4 iterator;\n};\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl\n{\n    typedef iter_fold_impl<\n          4\n        , First\n        , Last\n        , State\n        , ForwardOp\n        > chunk_;\n\n    typedef iter_fold_impl<\n          ( (N - 4) < 0 ? 0 : N - 4 )\n        , typename chunk_::iterator\n        , Last\n        , typename chunk_::state\n        , ForwardOp\n        > res_;\n\n    typedef typename res_::state state;\n    typedef typename res_::iterator iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< -1,First,Last,State,ForwardOp >\n    : iter_fold_impl<\n          -1\n        , typename mpl::next<First>::type\n        , Last\n        , typename apply2< ForwardOp,State,First >::type\n        , ForwardOp\n        >\n{\n};\n\ntemplate<\n      typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< -1,Last,Last,State,ForwardOp >\n{\n    typedef State state;\n    typedef Last iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/lambda_no_ctps.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/lambda_no_ctps.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false\n    , bool C5 = false\n    >\nstruct lambda_or\n    : true_\n{\n};\n\ntemplate<>\nstruct lambda_or< false,false,false,false,false >\n    : false_\n{\n};\n\ntemplate< typename Arity > struct lambda_impl\n{\n    template< typename T, typename Tag, typename Protect > struct result_\n    {\n        typedef T type;\n        typedef is_placeholder<T> is_le;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<1> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef typename l1::is_le is_le1;\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value\n            > is_le;\n\n        typedef bind1<\n              typename F::rebind\n            , typename l1::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<2> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value\n            > is_le;\n\n        typedef bind2<\n              typename F::rebind\n            , typename l1::type, typename l2::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<3> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        typedef lambda< typename F::arg3, Tag, false_ > l3;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        typedef typename l3::is_le is_le3;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value\n            > is_le;\n\n        typedef bind3<\n              typename F::rebind\n            , typename l1::type, typename l2::type, typename l3::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<4> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        typedef lambda< typename F::arg3, Tag, false_ > l3;\n        typedef lambda< typename F::arg4, Tag, false_ > l4;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        typedef typename l3::is_le is_le3;\n        typedef typename l4::is_le is_le4;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value\n            > is_le;\n\n        typedef bind4<\n              typename F::rebind\n            , typename l1::type, typename l2::type, typename l3::type\n            , typename l4::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<5> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        typedef lambda< typename F::arg3, Tag, false_ > l3;\n        typedef lambda< typename F::arg4, Tag, false_ > l4;\n        typedef lambda< typename F::arg5, Tag, false_ > l5;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        typedef typename l3::is_le is_le3;\n        typedef typename l4::is_le is_le4;\n        typedef typename l5::is_le is_le5;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le5)::value\n            > is_le;\n\n        typedef bind5<\n              typename F::rebind\n            , typename l1::type, typename l2::type, typename l3::type\n            , typename l4::type, typename l5::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\n} // namespace aux\n\ntemplate<\n      typename T\n    , typename Tag\n    , typename Protect\n    >\nstruct lambda\n{\n    /// Metafunction forwarding confuses MSVC 6.x\n    typedef typename aux::template_arity<T>::type arity_;\n    typedef typename aux::lambda_impl<arity_>\n        ::template result_< T,Tag,Protect > l_;\n\n    typedef typename l_::type type;\n    typedef typename l_::is_le is_le;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(3, lambda, (T, Tag, Protect))\n};\n\nBOOST_MPL_AUX_NA_SPEC2(1, 3, lambda)\n\ntemplate<\n      typename T\n    >\nstruct is_lambda_expression\n    : lambda<T>::is_le\n{\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/less.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/less.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct less_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< less_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< less_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct less_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct less_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct less_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct less_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct less\n\n    : less_impl<\n          typename less_tag<N1>::type\n        , typename less_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, less)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct less_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N2)::value > BOOST_MPL_AUX_VALUE_WKND(N1)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/less_equal.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/less_equal.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct less_equal_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< less_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< less_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct less_equal_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct less_equal_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct less_equal_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct less_equal_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct less_equal\n\n    : less_equal_impl<\n          typename less_equal_tag<N1>::type\n        , typename less_equal_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less_equal, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, less_equal)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct less_equal_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value <= BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/list.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/list.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct list;\n\ntemplate<\n     \n    >\nstruct list<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list0<  >\n{\n    typedef list0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct list<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list1<T0>\n{\n    typedef typename list1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct list<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list2< T0,T1 >\n{\n    typedef typename list2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct list<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list3< T0,T1,T2 >\n{\n    typedef typename list3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct list<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list4< T0,T1,T2,T3 >\n{\n    typedef typename list4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct list<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list5< T0,T1,T2,T3,T4 >\n{\n    typedef typename list5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename list6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename list7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename list8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename list9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename list10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename list11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : list12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename list12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : list13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename list13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : list14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename list14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : list15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename list15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : list16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename list16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : list17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename list17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : list18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename list18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : list19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename list19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct list\n    : list20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename list20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/list_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/list_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX\n    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX\n    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX\n    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX\n    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX\n    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX\n    , long C18 = LONG_MAX, long C19 = LONG_MAX\n    >\nstruct list_c;\n\ntemplate<\n      typename T\n    >\nstruct list_c<\n          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list0_c<T>\n{\n    typedef typename list0_c<T>::type type;\n};\n\ntemplate<\n      typename T, long C0\n    >\nstruct list_c<\n          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list1_c< T,C0 >\n{\n    typedef typename list1_c< T,C0 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1\n    >\nstruct list_c<\n          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list2_c< T,C0,C1 >\n{\n    typedef typename list2_c< T,C0,C1 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2\n    >\nstruct list_c<\n          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list3_c< T,C0,C1,C2 >\n{\n    typedef typename list3_c< T,C0,C1,C2 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list4_c< T,C0,C1,C2,C3 >\n{\n    typedef typename list4_c< T,C0,C1,C2,C3 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list5_c< T,C0,C1,C2,C3,C4 >\n{\n    typedef typename list5_c< T,C0,C1,C2,C3,C4 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list6_c< T,C0,C1,C2,C3,C4,C5 >\n{\n    typedef typename list6_c< T,C0,C1,C2,C3,C4,C5 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list7_c< T,C0,C1,C2,C3,C4,C5,C6 >\n{\n    typedef typename list7_c< T,C0,C1,C2,C3,C4,C5,C6 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX\n        >\n    : list8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >\n{\n    typedef typename list8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : list9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >\n{\n    typedef typename list9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : list10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >\n{\n    typedef typename list10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >\n{\n    typedef typename list11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >\n{\n    typedef typename list12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >\n{\n    typedef typename list13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list14_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        >\n{\n    typedef typename list14_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list15_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        >\n{\n    typedef typename list15_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list16_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15\n        >\n{\n    typedef typename list16_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list17_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16\n        >\n{\n    typedef typename list17_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, LONG_MAX, LONG_MAX\n        >\n    : list18_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17\n        >\n{\n    typedef typename list18_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, LONG_MAX\n        >\n    : list19_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18\n        >\n{\n    typedef typename list19_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n    >\nstruct list_c\n    : list20_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, C19\n        >\n{\n    typedef typename list20_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/map.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/map.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct map;\n\ntemplate<\n     \n    >\nstruct map<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map0<  >\n{\n    typedef map0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct map<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map1<T0>\n{\n    typedef typename map1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct map<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map2< T0,T1 >\n{\n    typedef typename map2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct map<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map3< T0,T1,T2 >\n{\n    typedef typename map3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct map<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map4< T0,T1,T2,T3 >\n{\n    typedef typename map4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct map<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map5< T0,T1,T2,T3,T4 >\n{\n    typedef typename map5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename map6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename map7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename map8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename map9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename map10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename map11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : map12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename map12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : map13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename map13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : map14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename map14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : map15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename map15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : map16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename map16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : map17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename map17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : map18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename map18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : map19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename map19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct map\n    : map20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename map20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/minus.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/minus.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct minus_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< minus_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< minus_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct minus_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct minus_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct minus_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct minus_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct minus\n    : minus< minus< minus< minus< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , minus\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct minus< N1,N2,N3,N4,na >\n\n    : minus< minus< minus< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , minus\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct minus< N1,N2,N3,na,na >\n\n    : minus< minus< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , minus\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct minus< N1,N2,na,na,na >\n    : minus_impl<\n          typename minus_tag<N1>::type\n        , typename minus_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , minus\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, minus)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct minus_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  - BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/modulus.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/modulus.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct modulus_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< modulus_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< modulus_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct modulus_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct modulus_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct modulus_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct modulus_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct modulus\n\n    : modulus_impl<\n          typename modulus_tag<N1>::type\n        , typename modulus_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, modulus, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, modulus)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct modulus_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  % BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/not_equal_to.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/not_equal_to.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct not_equal_to_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< not_equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< not_equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct not_equal_to_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct not_equal_to_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct not_equal_to_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct not_equal_to_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct not_equal_to\n\n    : not_equal_to_impl<\n          typename not_equal_to_tag<N1>::type\n        , typename not_equal_to_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, not_equal_to, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, not_equal_to)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct not_equal_to_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value != BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/or.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/or.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate< bool C_, typename T1, typename T2, typename T3, typename T4 >\nstruct or_impl\n    : true_\n{\n};\n\ntemplate< typename T1, typename T2, typename T3, typename T4 >\nstruct or_impl< false,T1,T2,T3,T4 >\n    : or_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        , T2, T3, T4\n        , false_\n        >\n{\n};\n\ntemplate<>\nstruct or_impl<\n          false\n        , false_, false_, false_, false_\n        >\n    : false_\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    , typename T3 = false_, typename T4 = false_, typename T5 = false_\n    >\nstruct or_\n\n    : aux::or_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        , T2, T3, T4, T5\n        >\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , or_\n        , ( T1, T2, T3, T4, T5)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC2(\n      2\n    , 5\n    , or_\n    )\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/placeholders.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n// Copyright Peter Dimov 2001-2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/placeholders.hpp\" header\n// -- DO NOT modify by hand!\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg< -1 > _;\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_;\n}\n\n}}\n\n/// agurt, 17/mar/02: one more placeholder for the last 'apply#' \n/// specialization\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<1> _1;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_1)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_1;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<2> _2;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_2)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_2;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<3> _3;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_3)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_3;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<4> _4;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_4)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_4;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<5> _5;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_5)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_5;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<6> _6;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_6)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_6;\n}\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/plus.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/plus.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct plus_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< plus_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< plus_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct plus_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct plus_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct plus_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct plus_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct plus\n    : plus< plus< plus< plus< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , plus\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct plus< N1,N2,N3,N4,na >\n\n    : plus< plus< plus< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , plus\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct plus< N1,N2,N3,na,na >\n\n    : plus< plus< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , plus\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct plus< N1,N2,na,na,na >\n    : plus_impl<\n          typename plus_tag<N1>::type\n        , typename plus_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , plus\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, plus)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct plus_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  + BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/quote.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/quote.hpp\" header\n// -- DO NOT modify by hand!\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/reverse_fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/reverse_fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl;\n\ntemplate< long N >\nstruct reverse_fold_chunk;\n\ntemplate<> struct reverse_fold_chunk<0>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef fwd_state0 bkwd_state0;\n        typedef bkwd_state0 state;\n        typedef iter0 iterator;\n    };\n};\n\ntemplate<> struct reverse_fold_chunk<1>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        \n\n        typedef fwd_state1 bkwd_state1;\n        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n        typedef bkwd_state0 state;\n        typedef iter1 iterator;\n    };\n};\n\ntemplate<> struct reverse_fold_chunk<2>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        \n\n        typedef fwd_state2 bkwd_state2;\n        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter2 iterator;\n    };\n};\n\ntemplate<> struct reverse_fold_chunk<3>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        \n\n        typedef fwd_state3 bkwd_state3;\n        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;\n        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter3 iterator;\n    };\n};\n\ntemplate<> struct reverse_fold_chunk<4>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;\n        typedef typename mpl::next<iter3>::type iter4;\n        \n\n        typedef fwd_state4 bkwd_state4;\n        typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;\n        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;\n        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter4 iterator;\n    };\n};\n\ntemplate< long N >\nstruct reverse_fold_chunk\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;\n        typedef typename mpl::next<iter3>::type iter4;\n        \n\n        typedef reverse_fold_impl<\n              ( (N - 4) < 0 ? 0 : N - 4 )\n            , iter4\n            , Last\n            , fwd_state4\n            , BackwardOp\n            , ForwardOp\n            > nested_chunk;\n\n        typedef typename nested_chunk::state bkwd_state4;\n        typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;\n        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;\n        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef typename nested_chunk::iterator iterator;\n    };\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_step;\n\ntemplate<\n      typename Last\n    , typename State\n    >\nstruct reverse_fold_null_step\n{\n    typedef Last iterator;\n    typedef State state;\n};\n\ntemplate<>\nstruct reverse_fold_chunk< -1 >\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef typename if_<\n              typename is_same< First,Last >::type\n            , reverse_fold_null_step< Last,State >\n            , reverse_fold_step< First,Last,State,BackwardOp,ForwardOp >\n            >::type res_;\n\n        typedef typename res_::state state;\n        typedef typename res_::iterator iterator;\n    };\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_step\n{\n    typedef reverse_fold_chunk< -1 >::template result_<\n          typename mpl::next<First>::type\n        , Last\n        , typename apply2<ForwardOp,State, typename deref<First>::type>::type\n        , BackwardOp\n        , ForwardOp\n        > nested_step;\n\n    typedef typename apply2<\n          BackwardOp\n        , typename nested_step::state\n        , typename deref<First>::type\n        >::type state;\n\n    typedef typename nested_step::iterator iterator;\n};\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl\n    : reverse_fold_chunk<N>\n        ::template result_< First,Last,State,BackwardOp,ForwardOp >\n{\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/reverse_iter_fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/reverse_iter_fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl;\n\ntemplate< long N >\nstruct reverse_iter_fold_chunk;\n\ntemplate<> struct reverse_iter_fold_chunk<0>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef fwd_state0 bkwd_state0;\n        typedef bkwd_state0 state;\n        typedef iter0 iterator;\n    };\n};\n\ntemplate<> struct reverse_iter_fold_chunk<1>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        \n\n        typedef fwd_state1 bkwd_state1;\n        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n        typedef bkwd_state0 state;\n        typedef iter1 iterator;\n    };\n};\n\ntemplate<> struct reverse_iter_fold_chunk<2>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        \n\n        typedef fwd_state2 bkwd_state2;\n        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter2 iterator;\n    };\n};\n\ntemplate<> struct reverse_iter_fold_chunk<3>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        \n\n        typedef fwd_state3 bkwd_state3;\n        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;\n        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter3 iterator;\n    };\n};\n\ntemplate<> struct reverse_iter_fold_chunk<4>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;\n        typedef typename mpl::next<iter3>::type iter4;\n        \n\n        typedef fwd_state4 bkwd_state4;\n        typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;\n        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;\n        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter4 iterator;\n    };\n};\n\ntemplate< long N >\nstruct reverse_iter_fold_chunk\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;\n        typedef typename mpl::next<iter3>::type iter4;\n        \n\n        typedef reverse_iter_fold_impl<\n              ( (N - 4) < 0 ? 0 : N - 4 )\n            , iter4\n            , Last\n            , fwd_state4\n            , BackwardOp\n            , ForwardOp\n            > nested_chunk;\n\n        typedef typename nested_chunk::state bkwd_state4;\n        typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;\n        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;\n        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef typename nested_chunk::iterator iterator;\n    };\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_step;\n\ntemplate<\n      typename Last\n    , typename State\n    >\nstruct reverse_iter_fold_null_step\n{\n    typedef Last iterator;\n    typedef State state;\n};\n\ntemplate<>\nstruct reverse_iter_fold_chunk< -1 >\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef typename if_<\n              typename is_same< First,Last >::type\n            , reverse_iter_fold_null_step< Last,State >\n            , reverse_iter_fold_step< First,Last,State,BackwardOp,ForwardOp >\n            >::type res_;\n\n        typedef typename res_::state state;\n        typedef typename res_::iterator iterator;\n    };\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_step\n{\n    typedef reverse_iter_fold_chunk< -1 >::template result_<\n          typename mpl::next<First>::type\n        , Last\n        , typename apply2< ForwardOp,State,First >::type\n        , BackwardOp\n        , ForwardOp\n        > nested_step;\n\n    typedef typename apply2<\n          BackwardOp\n        , typename nested_step::state\n        , First\n        >::type state;\n\n    typedef typename nested_step::iterator iterator;\n};\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl\n    : reverse_iter_fold_chunk<N>\n        ::template result_< First,Last,State,BackwardOp,ForwardOp >\n{\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/set.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/set.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct set;\n\ntemplate<\n     \n    >\nstruct set<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set0<  >\n{\n    typedef set0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct set<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set1<T0>\n{\n    typedef typename set1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct set<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set2< T0,T1 >\n{\n    typedef typename set2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct set<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set3< T0,T1,T2 >\n{\n    typedef typename set3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct set<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set4< T0,T1,T2,T3 >\n{\n    typedef typename set4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct set<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set5< T0,T1,T2,T3,T4 >\n{\n    typedef typename set5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename set6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename set7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename set8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename set9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename set10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename set11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : set12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename set12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : set13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename set13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : set14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename set14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : set15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename set15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : set16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename set16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : set17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename set17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : set18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename set18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : set19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename set19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct set\n    : set20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename set20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/set_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/set_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX\n    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX\n    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX\n    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX\n    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX\n    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX\n    , long C18 = LONG_MAX, long C19 = LONG_MAX\n    >\nstruct set_c;\n\ntemplate<\n      typename T\n    >\nstruct set_c<\n          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set0_c<T>\n{\n    typedef typename set0_c<T>::type type;\n};\n\ntemplate<\n      typename T, long C0\n    >\nstruct set_c<\n          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set1_c< T,C0 >\n{\n    typedef typename set1_c< T,C0 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1\n    >\nstruct set_c<\n          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set2_c< T,C0,C1 >\n{\n    typedef typename set2_c< T,C0,C1 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2\n    >\nstruct set_c<\n          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set3_c< T,C0,C1,C2 >\n{\n    typedef typename set3_c< T,C0,C1,C2 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set4_c< T,C0,C1,C2,C3 >\n{\n    typedef typename set4_c< T,C0,C1,C2,C3 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set5_c< T,C0,C1,C2,C3,C4 >\n{\n    typedef typename set5_c< T,C0,C1,C2,C3,C4 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set6_c< T,C0,C1,C2,C3,C4,C5 >\n{\n    typedef typename set6_c< T,C0,C1,C2,C3,C4,C5 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set7_c< T,C0,C1,C2,C3,C4,C5,C6 >\n{\n    typedef typename set7_c< T,C0,C1,C2,C3,C4,C5,C6 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX\n        >\n    : set8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >\n{\n    typedef typename set8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : set9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >\n{\n    typedef typename set9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : set10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >\n{\n    typedef typename set10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >\n{\n    typedef typename set11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >\n{\n    typedef typename set12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >\n{\n    typedef typename set13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set14_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        >\n{\n    typedef typename set14_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set15_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        >\n{\n    typedef typename set15_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set16_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15\n        >\n{\n    typedef typename set16_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set17_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16\n        >\n{\n    typedef typename set17_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, LONG_MAX, LONG_MAX\n        >\n    : set18_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17\n        >\n{\n    typedef typename set18_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, LONG_MAX\n        >\n    : set19_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18\n        >\n{\n    typedef typename set19_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n    >\nstruct set_c\n    : set20_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, C19\n        >\n{\n    typedef typename set20_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/shift_left.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/shift_left.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct shift_left_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< shift_left_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< shift_left_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct shift_left_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct shift_left_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct shift_left_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct shift_left_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct shift_left\n\n    : shift_left_impl<\n          typename shift_left_tag<N1>::type\n        , typename shift_left_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_left, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, shift_left)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct shift_left_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N, typename S > struct apply\n\n        : integral_c<\n              typename N::value_type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N)::value\n                  << BOOST_MPL_AUX_VALUE_WKND(S)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/shift_right.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/shift_right.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct shift_right_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< shift_right_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< shift_right_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct shift_right_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct shift_right_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct shift_right_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct shift_right_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct shift_right\n\n    : shift_right_impl<\n          typename shift_right_tag<N1>::type\n        , typename shift_right_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_right, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, shift_right)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct shift_right_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N, typename S > struct apply\n\n        : integral_c<\n              typename N::value_type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N)::value\n                  >> BOOST_MPL_AUX_VALUE_WKND(S)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/template_arity.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/template_arity.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< bool >\nstruct template_arity_impl\n{\n    template< typename F > struct result_\n        : mpl::int_< -1 >\n    {\n    };\n};\n\ntemplate<>\nstruct template_arity_impl<true>\n{\n    template< typename F > struct result_\n        : F::arity\n    {\n    };\n};\n\ntemplate< typename F >\nstruct template_arity\n    : template_arity_impl< ::boost::mpl::aux::has_rebind<F>::value >\n        ::template result_<F>\n{\n};\n\n}}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/times.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/times.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct times_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< times_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< times_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct times_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct times_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct times_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct times_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct times\n    : times< times< times< times< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , times\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct times< N1,N2,N3,N4,na >\n\n    : times< times< times< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , times\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct times< N1,N2,N3,na,na >\n\n    : times< times< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , times\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct times< N1,N2,na,na,na >\n    : times_impl<\n          typename times_tag<N1>::type\n        , typename times_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , times\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, times)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct times_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  * BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/unpack_args.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2002-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/unpack_args.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate< int size, typename F, typename Args >\nstruct unpack_args_impl;\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 0,F,Args >\n    : apply0<\n          F\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 1,F,Args >\n    : apply1<\n          F\n        , typename at_c< Args,0 >::type\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 2,F,Args >\n    : apply2<\n          F\n        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 3,F,Args >\n    : apply3<\n          F\n        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n        , typename at_c< Args,2 >::type\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 4,F,Args >\n    : apply4<\n          F\n        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n        , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 5,F,Args >\n    : apply5<\n          F\n        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n        , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type\n        , typename at_c< Args,4 >::type\n        >\n{\n};\n\n}\n\ntemplate<\n      typename F\n    >\nstruct unpack_args\n{\n    template< typename Args > struct apply\n    {\n        typedef typename aux::unpack_args_impl<\n              size<Args>::value\n            , F\n            , Args\n            >::type type;\n\n    };\n};\n\nBOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(1, unpack_args)\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/vector.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/vector.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct vector;\n\ntemplate<\n     \n    >\nstruct vector<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector0<  >\n{\n    typedef vector0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct vector<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector1<T0>\n{\n    typedef typename vector1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct vector<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector2< T0,T1 >\n{\n    typedef typename vector2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct vector<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector3< T0,T1,T2 >\n{\n    typedef typename vector3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct vector<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector4< T0,T1,T2,T3 >\n{\n    typedef typename vector4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector5< T0,T1,T2,T3,T4 >\n{\n    typedef typename vector5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename vector6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename vector7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename vector8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : vector15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename vector15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : vector16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename vector16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : vector17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename vector17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : vector18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename vector18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : vector19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename vector19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct vector\n    : vector20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename vector20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc551/vector_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/vector_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX\n    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX\n    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX\n    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX\n    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX\n    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX\n    , long C18 = LONG_MAX, long C19 = LONG_MAX\n    >\nstruct vector_c;\n\ntemplate<\n      typename T\n    >\nstruct vector_c<\n          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector0_c<T>\n{\n    typedef typename vector0_c<T>::type type;\n};\n\ntemplate<\n      typename T, long C0\n    >\nstruct vector_c<\n          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector1_c< T, T(C0) >\n{\n    typedef typename vector1_c< T, T(C0) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1\n    >\nstruct vector_c<\n          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector2_c< T, T(C0), T(C1) >\n{\n    typedef typename vector2_c< T, T(C0), T(C1) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2\n    >\nstruct vector_c<\n          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector3_c< T, T(C0), T(C1), T(C2) >\n{\n    typedef typename vector3_c< T, T(C0), T(C1), T(C2) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector4_c< T, T(C0), T(C1), T(C2), T(C3) >\n{\n    typedef typename vector4_c< T, T(C0), T(C1), T(C2), T(C3) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector5_c< T, T(C0), T(C1), T(C2), T(C3), T(C4) >\n{\n    typedef typename vector5_c< T, T(C0), T(C1), T(C2), T(C3), T(C4) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector6_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5) >\n{\n    typedef typename vector6_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector7_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6) >\n{\n    typedef typename vector7_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX\n        >\n    : vector8_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7) >\n{\n    typedef typename vector8_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : vector9_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8) >\n{\n    typedef typename vector9_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : vector10_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9) >\n{\n    typedef typename vector10_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector11_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10) >\n{\n    typedef typename vector11_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector12_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11) >\n{\n    typedef typename vector12_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector13_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12) >\n{\n    typedef typename vector13_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector14_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13) >\n{\n    typedef typename vector14_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector15_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14) >\n{\n    typedef typename vector15_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector16_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15) >\n{\n    typedef typename vector16_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector17_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16) >\n{\n    typedef typename vector17_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, LONG_MAX, LONG_MAX\n        >\n    : vector18_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17) >\n{\n    typedef typename vector18_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, LONG_MAX\n        >\n    : vector19_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18) >\n{\n    typedef typename vector19_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18) >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n    >\nstruct vector_c\n    : vector20_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19) >\n{\n    typedef typename vector20_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19) >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/advance_backward.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"advance_backward.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< long N > struct advance_backward;\ntemplate<>\nstruct advance_backward<0>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef iter0 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<1>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef iter1 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<2>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef typename prior<iter1>::type iter2;\n        typedef iter2 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<3>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef typename prior<iter1>::type iter2;\n        typedef typename prior<iter2>::type iter3;\n        typedef iter3 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<4>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef typename prior<iter1>::type iter2;\n        typedef typename prior<iter2>::type iter3;\n        typedef typename prior<iter3>::type iter4;\n        typedef iter4 type;\n    };\n};\n\ntemplate< long N >\nstruct advance_backward\n{\n    template< typename Iterator > struct apply\n    {\n        typedef typename apply_wrap1<\n              advance_backward<4>\n            , Iterator\n            >::type chunk_result_;\n\n        typedef typename apply_wrap1<\n              advance_backward<(\n                (N - 4) < 0\n                    ? 0\n                    : N - 4\n                    )>\n            , chunk_result_\n            >::type type;\n    };\n};\n\n}}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/advance_forward.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"advance_forward.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< long N > struct advance_forward;\ntemplate<>\nstruct advance_forward<0>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef iter0 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<1>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef iter1 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<2>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef typename next<iter1>::type iter2;\n        typedef iter2 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<3>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef typename next<iter1>::type iter2;\n        typedef typename next<iter2>::type iter3;\n        typedef iter3 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<4>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef typename next<iter1>::type iter2;\n        typedef typename next<iter2>::type iter3;\n        typedef typename next<iter3>::type iter4;\n        typedef iter4 type;\n    };\n};\n\ntemplate< long N >\nstruct advance_forward\n{\n    template< typename Iterator > struct apply\n    {\n        typedef typename apply_wrap1<\n              advance_forward<4>\n            , Iterator\n            >::type chunk_result_;\n\n        typedef typename apply_wrap1<\n              advance_forward<(\n                (N - 4) < 0\n                    ? 0\n                    : N - 4\n                    )>\n            , chunk_result_\n            >::type type;\n    };\n};\n\n}}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/and.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"and.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate< bool C_, typename T1, typename T2, typename T3, typename T4 >\nstruct and_impl\n    : false_\n{\n};\n\ntemplate< typename T1, typename T2, typename T3, typename T4 >\nstruct and_impl< true,T1,T2,T3,T4 >\n    : and_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        , T2, T3, T4\n        , true_\n        >\n{\n};\n\ntemplate<>\nstruct and_impl<\n          true\n        , true_, true_, true_, true_\n        >\n    : true_\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    , typename T3 = true_, typename T4 = true_, typename T5 = true_\n    >\nstruct and_\n\n    : aux::and_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        , T2, T3, T4, T5\n        >\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , and_\n        , ( T1, T2, T3, T4, T5)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC2(\n      2\n    , 5\n    , and_\n    )\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/apply.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"apply.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F\n    >\nstruct apply0\n\n    : apply_wrap0<\n          typename lambda<F>::type\n       \n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          1\n        , apply0\n        , (F )\n        )\n};\n\ntemplate<\n      typename F\n    >\nstruct apply< F,na,na,na,na,na >\n    : apply0<F>\n{\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply1\n\n    : apply_wrap1<\n          typename lambda<F>::type\n        , T1\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          2\n        , apply1\n        , (F, T1)\n        )\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply< F,T1,na,na,na,na >\n    : apply1< F,T1 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply2\n\n    : apply_wrap2<\n          typename lambda<F>::type\n        , T1, T2\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          3\n        , apply2\n        , (F, T1, T2)\n        )\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply< F,T1,T2,na,na,na >\n    : apply2< F,T1,T2 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply3\n\n    : apply_wrap3<\n          typename lambda<F>::type\n        , T1, T2, T3\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          4\n        , apply3\n        , (F, T1, T2, T3)\n        )\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply< F,T1,T2,T3,na,na >\n    : apply3< F,T1,T2,T3 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply4\n\n    : apply_wrap4<\n          typename lambda<F>::type\n        , T1, T2, T3, T4\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , apply4\n        , (F, T1, T2, T3, T4)\n        )\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply< F,T1,T2,T3,T4,na >\n    : apply4< F,T1,T2,T3,T4 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply5\n\n    : apply_wrap5<\n          typename lambda<F>::type\n        , T1, T2, T3, T4, T5\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          6\n        , apply5\n        , (F, T1, T2, T3, T4, T5)\n        )\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply\n    : apply5< F,T1,T2,T3,T4,T5 >\n{\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/apply_fwd.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"apply_fwd.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na\n    >\nstruct apply;\n\ntemplate<\n      typename F\n    >\nstruct apply0;\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply1;\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply2;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply3;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply4;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply5;\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/apply_wrap.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2008\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"apply_wrap.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      int N, typename F\n    >\nstruct apply_wrap_impl0;\n\ntemplate<\n      typename F\n    >\nstruct apply_wrap_impl0<\n          0\n        , F\n       \n        >\n{\n    typedef typename F::template apply<\n         \n/// since the defaults are \"lost\", we have to pass *something* even for nullary\n/// metafunction classes\n        na\n        > type;\n};\n\ntemplate<\n      typename F\n    >\nstruct apply_wrap_impl0<\n          1\n        , F\n       \n        >\n{\n    typedef typename F::template apply<\n         \n        na\n        > type;\n};\n\ntemplate<\n      typename F\n    >\nstruct apply_wrap_impl0<\n          2\n        , F\n       \n        >\n{\n    typedef typename F::template apply<\n         \n        na, na\n\n        > type;\n};\n\ntemplate<\n      typename F\n    >\nstruct apply_wrap_impl0<\n          3\n        , F\n       \n        >\n{\n    typedef typename F::template apply<\n         \n        na, na, na\n\n        > type;\n};\n\ntemplate<\n      typename F\n    >\nstruct apply_wrap_impl0<\n          4\n        , F\n       \n        >\n{\n    typedef typename F::template apply<\n         \n        na, na, na, na\n\n        > type;\n};\n\ntemplate<\n      typename F\n    >\nstruct apply_wrap_impl0<\n          5\n        , F\n       \n        >\n{\n    typedef typename F::template apply<\n         \n        na, na, na, na, na\n\n        > type;\n};\n\ntemplate<\n      typename F\n    >\nstruct apply_wrap0\n    : apply_wrap_impl0<\n          ::boost::mpl::aux::arity< F,0 >::value\n        , F\n       \n        >::type\n{\n};\n\ntemplate<\n      int N, typename F, typename T1\n    >\nstruct apply_wrap_impl1;\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply_wrap_impl1<\n          1\n        , F\n        , T1\n        >\n{\n    typedef typename F::template apply<\n          T1\n        > type;\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply_wrap_impl1<\n          2\n        , F\n        , T1\n        >\n{\n    typedef typename F::template apply<\n          T1\n        , na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply_wrap_impl1<\n          3\n        , F\n        , T1\n        >\n{\n    typedef typename F::template apply<\n          T1\n        , na, na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply_wrap_impl1<\n          4\n        , F\n        , T1\n        >\n{\n    typedef typename F::template apply<\n          T1\n        , na, na, na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply_wrap_impl1<\n          5\n        , F\n        , T1\n        >\n{\n    typedef typename F::template apply<\n          T1\n        , na, na, na, na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply_wrap1\n    : apply_wrap_impl1<\n          ::boost::mpl::aux::arity< F,1 >::value\n        , F\n        , T1\n        >::type\n{\n};\n\ntemplate<\n      int N, typename F, typename T1, typename T2\n    >\nstruct apply_wrap_impl2;\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply_wrap_impl2<\n          2\n        , F\n        , T1, T2\n        >\n{\n    typedef typename F::template apply<\n          T1, T2\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply_wrap_impl2<\n          3\n        , F\n        , T1, T2\n        >\n{\n    typedef typename F::template apply<\n          T1, T2\n\n        , na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply_wrap_impl2<\n          4\n        , F\n        , T1, T2\n        >\n{\n    typedef typename F::template apply<\n          T1, T2\n\n        , na, na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply_wrap_impl2<\n          5\n        , F\n        , T1, T2\n        >\n{\n    typedef typename F::template apply<\n          T1, T2\n\n        , na, na, na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply_wrap2\n    : apply_wrap_impl2<\n          ::boost::mpl::aux::arity< F,2 >::value\n        , F\n        , T1, T2\n        >::type\n{\n};\n\ntemplate<\n      int N, typename F, typename T1, typename T2, typename T3\n    >\nstruct apply_wrap_impl3;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply_wrap_impl3<\n          3\n        , F\n        , T1, T2, T3\n        >\n{\n    typedef typename F::template apply<\n          T1, T2, T3\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply_wrap_impl3<\n          4\n        , F\n        , T1, T2, T3\n        >\n{\n    typedef typename F::template apply<\n          T1, T2, T3\n\n        , na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply_wrap_impl3<\n          5\n        , F\n        , T1, T2, T3\n        >\n{\n    typedef typename F::template apply<\n          T1, T2, T3\n\n        , na, na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply_wrap3\n    : apply_wrap_impl3<\n          ::boost::mpl::aux::arity< F,3 >::value\n        , F\n        , T1, T2, T3\n        >::type\n{\n};\n\ntemplate<\n      int N, typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply_wrap_impl4;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply_wrap_impl4<\n          4\n        , F\n        , T1, T2, T3, T4\n        >\n{\n    typedef typename F::template apply<\n          T1, T2, T3, T4\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply_wrap_impl4<\n          5\n        , F\n        , T1, T2, T3, T4\n        >\n{\n    typedef typename F::template apply<\n          T1, T2, T3, T4\n\n        , na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply_wrap4\n    : apply_wrap_impl4<\n          ::boost::mpl::aux::arity< F,4 >::value\n        , F\n        , T1, T2, T3, T4\n        >::type\n{\n};\n\ntemplate<\n      int N, typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply_wrap_impl5;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply_wrap_impl5<\n          5\n        , F\n        , T1, T2, T3, T4, T5\n        >\n{\n    typedef typename F::template apply<\n          T1, T2, T3, T4, T5\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply_wrap5\n    : apply_wrap_impl5<\n          ::boost::mpl::aux::arity< F,5 >::value\n        , F\n        , T1, T2, T3, T4, T5\n        >::type\n{\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/arg.hpp",
    "content": "\n// Copyright Peter Dimov 2001-2002\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"arg.hpp\" header\n// -- DO NOT modify by hand!\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntemplate<> struct arg< -1 >\n{\n    BOOST_STATIC_CONSTANT(int, value  = -1);\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n        typedef U1 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<1>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 1);\n    typedef arg<2> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n        typedef U1 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<2>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 2);\n    typedef arg<3> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n        typedef U2 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<3>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 3);\n    typedef arg<4> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n        typedef U3 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<4>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 4);\n    typedef arg<5> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n        typedef U4 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<5>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 5);\n    typedef arg<6> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n        typedef U5 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\nBOOST_MPL_AUX_NONTYPE_ARITY_SPEC(1,int, arg)\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/basic_bind.hpp",
    "content": "\n// Copyright Peter Dimov 2001\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"basic_bind.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      typename T, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg\n{\n    typedef T type;\n};\n\ntemplate<\n      int N, typename U1, typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 >\n{\n    typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename F\n    >\nstruct bind0\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n\n     public:\n        typedef typename apply_wrap0<\n              f_\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg<\n      bind0<F>, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind0<F> f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(1, bind0)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind1\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n\n     public:\n        typedef typename apply_wrap1<\n              f_\n            , typename t1::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename U1, typename U2, typename U3\n    , typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind1< F,T1 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind1< F,T1 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(2, bind1)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind2\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n\n     public:\n        typedef typename apply_wrap2<\n              f_\n            , typename t1::type, typename t2::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename U1, typename U2\n    , typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind2< F,T1,T2 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind2< F,T1,T2 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(3, bind2)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind3\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n\n     public:\n        typedef typename apply_wrap3<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename U1\n    , typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind3< F,T1,T2,T3 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(4, bind3)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind4\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;\n\n     public:\n        typedef typename apply_wrap4<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename U1, typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind4< F,T1,T2,T3,T4 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(5, bind4)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind5\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;\n        typedef aux::resolve_bind_arg< T5,U1,U2,U3,U4,U5 > t5;\n\n     public:\n        typedef typename apply_wrap5<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type, typename t5::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg<\n      bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind5< F,T1,T2,T3,T4,T5 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(6, bind5)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/bind.hpp",
    "content": "\n// Copyright Peter Dimov 2001\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"bind.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      typename T, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg\n{\n    typedef T type;\n};\n\ntemplate<\n      typename T\n    , typename Arg\n    >\nstruct replace_unnamed_arg\n{\n    typedef Arg next;\n    typedef T type;\n};\n\ntemplate<\n      typename Arg\n    >\nstruct replace_unnamed_arg< arg< -1 >, Arg >\n{\n    typedef typename Arg::next next;\n    typedef Arg type;\n};\n\ntemplate<\n      int N, typename U1, typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 >\n{\n    typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename F\n    >\nstruct bind0\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n     public:\n        typedef typename apply_wrap0<\n              f_\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg<\n      bind0<F>, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind0<F> f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(1, bind0)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind1\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n     public:\n        typedef typename apply_wrap1<\n              f_\n            , typename t1::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename U1, typename U2, typename U3\n    , typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind1< F,T1 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind1< F,T1 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(2, bind1)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind2\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n     public:\n        typedef typename apply_wrap2<\n              f_\n            , typename t1::type, typename t2::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename U1, typename U2\n    , typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind2< F,T1,T2 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind2< F,T1,T2 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(3, bind2)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind3\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n     public:\n        typedef typename apply_wrap3<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename U1\n    , typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind3< F,T1,T2,T3 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(4, bind3)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind4\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n        typedef aux::replace_unnamed_arg< T4,n4 > r4;\n        typedef typename r4::type a4;\n        typedef typename r4::next n5;\n        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;\n        ///\n     public:\n        typedef typename apply_wrap4<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename U1, typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind4< F,T1,T2,T3,T4 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(5, bind4)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind5\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4, typename U5\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n        typedef aux::replace_unnamed_arg< T4,n4 > r4;\n        typedef typename r4::type a4;\n        typedef typename r4::next n5;\n        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;\n        ///\n        typedef aux::replace_unnamed_arg< T5,n5 > r5;\n        typedef typename r5::type a5;\n        typedef typename r5::next n6;\n        typedef aux::resolve_bind_arg< a5,U1,U2,U3,U4,U5 > t5;\n        ///\n     public:\n        typedef typename apply_wrap5<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type, typename t5::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg<\n      bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind5< F,T1,T2,T3,T4,T5 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(6, bind5)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/bind_fwd.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"bind_fwd.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F\n    >\nstruct bind0;\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind1;\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind2;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind3;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind4;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind5;\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/bitand.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"bitand.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct bitand_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< bitand_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< bitand_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct bitand_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitand_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitand_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct bitand_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct bitand_\n    : bitand_< bitand_< bitand_< bitand_< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , bitand_\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct bitand_< N1,N2,N3,N4,na >\n\n    : bitand_< bitand_< bitand_< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitand_\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct bitand_< N1,N2,N3,na,na >\n\n    : bitand_< bitand_< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitand_\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct bitand_< N1,N2,na,na,na >\n    : bitand_impl<\n          typename bitand_tag<N1>::type\n        , typename bitand_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitand_\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, bitand_)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct bitand_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  & BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/bitor.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"bitor.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct bitor_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< bitor_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< bitor_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct bitor_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitor_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitor_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct bitor_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct bitor_\n    : bitor_< bitor_< bitor_< bitor_< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , bitor_\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct bitor_< N1,N2,N3,N4,na >\n\n    : bitor_< bitor_< bitor_< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitor_\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct bitor_< N1,N2,N3,na,na >\n\n    : bitor_< bitor_< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitor_\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct bitor_< N1,N2,na,na,na >\n    : bitor_impl<\n          typename bitor_tag<N1>::type\n        , typename bitor_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitor_\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, bitor_)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct bitor_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  | BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/bitxor.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"bitxor.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct bitxor_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< bitxor_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< bitxor_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct bitxor_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitxor_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitxor_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct bitxor_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct bitxor_\n    : bitxor_< bitxor_< bitxor_< bitxor_< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , bitxor_\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct bitxor_< N1,N2,N3,N4,na >\n\n    : bitxor_< bitxor_< bitxor_< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitxor_\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct bitxor_< N1,N2,N3,na,na >\n\n    : bitxor_< bitxor_< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitxor_\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct bitxor_< N1,N2,na,na,na >\n    : bitxor_impl<\n          typename bitxor_tag<N1>::type\n        , typename bitxor_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitxor_\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, bitxor_)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct bitxor_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  ^ BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/deque.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"deque.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct deque;\n\ntemplate<\n     \n    >\nstruct deque<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector0<  >\n{\n    typedef vector0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct deque<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector1<T0>\n{\n    typedef typename vector1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct deque<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector2< T0,T1 >\n{\n    typedef typename vector2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct deque<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector3< T0,T1,T2 >\n{\n    typedef typename vector3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct deque<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector4< T0,T1,T2,T3 >\n{\n    typedef typename vector4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector5< T0,T1,T2,T3,T4 >\n{\n    typedef typename vector5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename vector6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename vector7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename vector8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : vector15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename vector15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : vector16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename vector16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : vector17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename vector17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : vector18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename vector18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : vector19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename vector19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct deque\n    : vector20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename vector20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/divides.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"divides.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct divides_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< divides_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< divides_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct divides_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct divides_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct divides_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct divides_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct divides\n    : divides< divides< divides< divides< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , divides\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct divides< N1,N2,N3,N4,na >\n\n    : divides< divides< divides< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , divides\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct divides< N1,N2,N3,na,na >\n\n    : divides< divides< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , divides\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct divides< N1,N2,na,na,na >\n    : divides_impl<\n          typename divides_tag<N1>::type\n        , typename divides_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , divides\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, divides)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct divides_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  / BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/equal_to.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"equal_to.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct equal_to_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct equal_to_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct equal_to_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct equal_to_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct equal_to_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct equal_to\n\n    : equal_to_impl<\n          typename equal_to_tag<N1>::type\n        , typename equal_to_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, equal_to, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, equal_to)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct equal_to_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value  == BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl;\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 0,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef state0 state;\n    typedef iter0 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 1,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    \n\n    typedef state1 state;\n    typedef iter1 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 2,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    \n\n    typedef state2 state;\n    typedef iter2 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 3,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    \n\n    typedef state3 state;\n    typedef iter3 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 4,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp, state3, typename deref<iter3>::type >::type state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef state4 state;\n    typedef iter4 iterator;\n};\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl\n{\n    typedef fold_impl<\n          4\n        , First\n        , Last\n        , State\n        , ForwardOp\n        > chunk_;\n\n    typedef fold_impl<\n          ( (N - 4) < 0 ? 0 : N - 4 )\n        , typename chunk_::iterator\n        , Last\n        , typename chunk_::state\n        , ForwardOp\n        > res_;\n\n    typedef typename res_::state state;\n    typedef typename res_::iterator iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< -1,First,Last,State,ForwardOp >\n    : fold_impl<\n          -1\n        , typename mpl::next<First>::type\n        , Last\n        , typename apply2<ForwardOp,State, typename deref<First>::type>::type\n        , ForwardOp\n        >\n{\n};\n\ntemplate<\n      typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< -1,Last,Last,State,ForwardOp >\n{\n    typedef State state;\n    typedef Last iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/full_lambda.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"full_lambda.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false\n    , bool C5 = false\n    >\nstruct lambda_or\n    : true_\n{\n};\n\ntemplate<>\nstruct lambda_or< false,false,false,false,false >\n    : false_\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename T\n    , typename Tag\n    , typename Arity\n    >\nstruct lambda\n{\n    typedef false_ is_le;\n    typedef T result_;\n    typedef T type;\n};\n\ntemplate<\n      typename T\n    >\nstruct is_lambda_expression\n    : lambda<T>::is_le\n{\n};\n\ntemplate< int N, typename Tag >\nstruct lambda< arg<N>,Tag, int_< -1 > >\n{\n    typedef true_ is_le;\n    typedef mpl::arg<N> result_; // qualified for the sake of MIPSpro 7.41\n    typedef mpl::protect<result_> type;\n};\n\ntemplate<\n      typename F\n    , typename Tag\n    >\nstruct lambda<\n          bind0<F>\n        , Tag\n        , int_<1>\n        >\n{\n    typedef false_ is_le;\n    typedef bind0<\n          F\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1 > class F\n    , typename L1\n    >\nstruct le_result1\n{\n    typedef F<\n          typename L1::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1 > class F\n    , typename L1\n    >\nstruct le_result1< true_,Tag,F,L1 >\n{\n    typedef bind1<\n          quote1< F,Tag >\n        , typename L1::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1 > class F\n    , typename T1\n    , typename Tag\n    >\nstruct lambda<\n          F<T1>\n        , Tag\n        , int_<1>\n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef typename l1::is_le is_le1;\n    typedef typename aux::lambda_or<\n          is_le1::value\n        >::type is_le;\n\n    typedef aux::le_result1<\n          is_le, Tag, F, l1\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1\n    , typename Tag\n    >\nstruct lambda<\n          bind1< F,T1 >\n        , Tag\n        , int_<2>\n        >\n{\n    typedef false_ is_le;\n    typedef bind1<\n          F\n        , T1\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2 > class F\n    , typename L1, typename L2\n    >\nstruct le_result2\n{\n    typedef F<\n          typename L1::type, typename L2::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2 > class F\n    , typename L1, typename L2\n    >\nstruct le_result2< true_,Tag,F,L1,L2 >\n{\n    typedef bind2<\n          quote2< F,Tag >\n        , typename L1::result_, typename L2::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1, typename P2 > class F\n    , typename T1, typename T2\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2 >\n        , Tag\n        , int_<2>\n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value\n        >::type is_le;\n\n    typedef aux::le_result2<\n          is_le, Tag, F, l1, l2\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    , typename Tag\n    >\nstruct lambda<\n          bind2< F,T1,T2 >\n        , Tag\n        , int_<3>\n        >\n{\n    typedef false_ is_le;\n    typedef bind2<\n          F\n        , T1, T2\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2, typename P3 > class F\n    , typename L1, typename L2, typename L3\n    >\nstruct le_result3\n{\n    typedef F<\n          typename L1::type, typename L2::type, typename L3::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2, typename P3 > class F\n    , typename L1, typename L2, typename L3\n    >\nstruct le_result3< true_,Tag,F,L1,L2,L3 >\n{\n    typedef bind3<\n          quote3< F,Tag >\n        , typename L1::result_, typename L2::result_, typename L3::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1, typename P2, typename P3 > class F\n    , typename T1, typename T2, typename T3\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2,T3 >\n        , Tag\n        , int_<3>\n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    typedef lambda< T3,Tag > l3;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    typedef typename l3::is_le is_le3;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value, is_le3::value\n        >::type is_le;\n\n    typedef aux::le_result3<\n          is_le, Tag, F, l1, l2, l3\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    , typename Tag\n    >\nstruct lambda<\n          bind3< F,T1,T2,T3 >\n        , Tag\n        , int_<4>\n        >\n{\n    typedef false_ is_le;\n    typedef bind3<\n          F\n        , T1, T2, T3\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename L1, typename L2, typename L3, typename L4\n    >\nstruct le_result4\n{\n    typedef F<\n          typename L1::type, typename L2::type, typename L3::type\n        , typename L4::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename L1, typename L2, typename L3, typename L4\n    >\nstruct le_result4< true_,Tag,F,L1,L2,L3,L4 >\n{\n    typedef bind4<\n          quote4< F,Tag >\n        , typename L1::result_, typename L2::result_, typename L3::result_\n        , typename L4::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename T1, typename T2, typename T3, typename T4\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2,T3,T4 >\n        , Tag\n        , int_<4>\n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    typedef lambda< T3,Tag > l3;\n    typedef lambda< T4,Tag > l4;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    typedef typename l3::is_le is_le3;\n    typedef typename l4::is_le is_le4;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value, is_le3::value, is_le4::value\n        >::type is_le;\n\n    typedef aux::le_result4<\n          is_le, Tag, F, l1, l2, l3, l4\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename Tag\n    >\nstruct lambda<\n          bind4< F,T1,T2,T3,T4 >\n        , Tag\n        , int_<5>\n        >\n{\n    typedef false_ is_le;\n    typedef bind4<\n          F\n        , T1, T2, T3, T4\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F\n    , typename L1, typename L2, typename L3, typename L4, typename L5\n    >\nstruct le_result5\n{\n    typedef F<\n          typename L1::type, typename L2::type, typename L3::type\n        , typename L4::type, typename L5::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F\n    , typename L1, typename L2, typename L3, typename L4, typename L5\n    >\nstruct le_result5< true_,Tag,F,L1,L2,L3,L4,L5 >\n{\n    typedef bind5<\n          quote5< F,Tag >\n        , typename L1::result_, typename L2::result_, typename L3::result_\n        , typename L4::result_, typename L5::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template<\n          typename P1, typename P2, typename P3, typename P4\n        , typename P5\n        >\n      class F\n    , typename T1, typename T2, typename T3, typename T4, typename T5\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2,T3,T4,T5 >\n        , Tag\n        , int_<5>\n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    typedef lambda< T3,Tag > l3;\n    typedef lambda< T4,Tag > l4;\n    typedef lambda< T5,Tag > l5;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    typedef typename l3::is_le is_le3;\n    typedef typename l4::is_le is_le4;\n    typedef typename l5::is_le is_le5;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value, is_le3::value, is_le4::value\n        , is_le5::value\n        >::type is_le;\n\n    typedef aux::le_result5<\n          is_le, Tag, F, l1, l2, l3, l4, l5\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    , typename Tag\n    >\nstruct lambda<\n          bind5< F,T1,T2,T3,T4,T5 >\n        , Tag\n        , int_<6>\n        >\n{\n    typedef false_ is_le;\n    typedef bind5<\n          F\n        , T1, T2, T3, T4, T5\n        > result_;\n\n    typedef result_ type;\n};\n\n/// special case for 'protect'\ntemplate< typename T, typename Tag >\nstruct lambda< mpl::protect<T>,Tag, int_<1> >\n{\n    typedef false_ is_le;\n    typedef mpl::protect<T> result_;\n    typedef result_ type;\n};\n\n/// specializations for the main 'bind' form\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    , typename Tag\n    >\nstruct lambda<\n          bind< F,T1,T2,T3,T4,T5 >\n        , Tag\n        , int_<6>\n        >\n{\n    typedef false_ is_le;\n    typedef bind< F,T1,T2,T3,T4,T5 > result_;\n    typedef result_ type;\n};\n\ntemplate<\n      typename F\n    , typename Tag1\n    , typename Tag2\n    , typename Arity\n    >\nstruct lambda<\n          lambda< F,Tag1,Arity >\n        , Tag2\n        , int_<3>\n        >\n{\n    typedef lambda< F,Tag2 > l1;\n    typedef lambda< Tag1,Tag2 > l2;\n    typedef typename l1::is_le is_le;\n    typedef bind1< quote1<aux::template_arity>, typename l1::result_ > arity_;\n    typedef lambda< typename if_< is_le,arity_,Arity >::type, Tag2 > l3;\n    typedef aux::le_result3<is_le, Tag2, mpl::lambda, l1, l2, l3> le_result_;\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 3, lambda)\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/greater.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"greater.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct greater_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< greater_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< greater_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct greater_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct greater_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct greater_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct greater_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct greater\n\n    : greater_impl<\n          typename greater_tag<N1>::type\n        , typename greater_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, greater)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct greater_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value > BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/greater_equal.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"greater_equal.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct greater_equal_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< greater_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< greater_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct greater_equal_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct greater_equal_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct greater_equal_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct greater_equal_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct greater_equal\n\n    : greater_equal_impl<\n          typename greater_equal_tag<N1>::type\n        , typename greater_equal_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater_equal, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, greater_equal)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct greater_equal_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value >= BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/inherit.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"inherit.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    >\nstruct inherit2\n    : T1, T2\n{\n    typedef inherit2 type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, inherit2, (T1, T2))\n};\n\ntemplate< typename T1 >\nstruct inherit2< T1,empty_base >\n{\n    typedef T1 type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (T1, empty_base))\n};\n\ntemplate< typename T2 >\nstruct inherit2< empty_base,T2 >\n{\n    typedef T2 type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base, T2))\n};\n\ntemplate<>\nstruct inherit2< empty_base,empty_base >\n{\n    typedef empty_base type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base, empty_base))\n};\n\nBOOST_MPL_AUX_NA_SPEC(2, inherit2)\n\ntemplate<\n      typename T1 = na, typename T2 = na, typename T3 = na\n    >\nstruct inherit3\n    : inherit2<\n          typename inherit2<\n              T1, T2\n            >::type\n        , T3\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          3\n        , inherit3\n        , ( T1, T2, T3)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC(3, inherit3)\n\ntemplate<\n      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na\n    >\nstruct inherit4\n    : inherit2<\n          typename inherit3<\n              T1, T2, T3\n            >::type\n        , T4\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          4\n        , inherit4\n        , ( T1, T2, T3, T4)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC(4, inherit4)\n\ntemplate<\n      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na\n    , typename T5 = na\n    >\nstruct inherit5\n    : inherit2<\n          typename inherit4<\n              T1, T2, T3, T4\n            >::type\n        , T5\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , inherit5\n        , ( T1, T2, T3, T4, T5)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC(5, inherit5)\n\n/// primary template\n\ntemplate<\n      typename T1 = empty_base, typename T2 = empty_base\n    , typename T3 = empty_base, typename T4 = empty_base\n    , typename T5 = empty_base\n    >\nstruct inherit\n    : inherit5< T1,T2,T3,T4,T5 >\n{\n};\n\ntemplate<>\nstruct inherit< na,na,na,na,na >\n{\n    template<\n\n          typename T1, typename T2, typename T3, typename T4, typename T5\n\n        >\n    struct apply\n        : inherit< T1,T2,T3,T4,T5 >\n    {\n    };\n};\n\nBOOST_MPL_AUX_NA_SPEC_LAMBDA(5, inherit)\nBOOST_MPL_AUX_NA_SPEC_ARITY(5, inherit)\nBOOST_MPL_AUX_NA_SPEC_TEMPLATE_ARITY(5, 5, inherit)\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/iter_fold_if_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n// Copyright David Abrahams 2001-2002\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"iter_fold_if_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< typename Iterator, typename State >\nstruct iter_fold_if_null_step\n{\n    typedef State state;\n    typedef Iterator iterator;\n};\n\ntemplate< bool >\nstruct iter_fold_if_step_impl\n{\n    template<\n          typename Iterator\n        , typename State\n        , typename StateOp\n        , typename IteratorOp\n        >\n    struct result_\n    {\n        typedef typename apply2< StateOp,State,Iterator >::type state;\n        typedef typename IteratorOp::type iterator;\n    };\n};\n\ntemplate<>\nstruct iter_fold_if_step_impl<false>\n{\n    template<\n          typename Iterator\n        , typename State\n        , typename StateOp\n        , typename IteratorOp\n        >\n    struct result_\n    {\n        typedef State state;\n        typedef Iterator iterator;\n    };\n};\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename ForwardOp\n    , typename Predicate\n    >\nstruct iter_fold_if_forward_step\n{\n    typedef typename apply2< Predicate,State,Iterator >::type not_last;\n    typedef typename iter_fold_if_step_impl<\n          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value\n        >::template result_< Iterator,State,ForwardOp, mpl::next<Iterator> > impl_;\n\n    typedef typename impl_::state state;\n    typedef typename impl_::iterator iterator;\n};\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename BackwardOp\n    , typename Predicate\n    >\nstruct iter_fold_if_backward_step\n{\n    typedef typename apply2< Predicate,State,Iterator >::type not_last;\n    typedef typename iter_fold_if_step_impl<\n          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value\n        >::template result_< Iterator,State,BackwardOp, identity<Iterator> > impl_;\n\n    typedef typename impl_::state state;\n    typedef typename impl_::iterator iterator;\n};\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename ForwardOp\n    , typename ForwardPredicate\n    , typename BackwardOp\n    , typename BackwardPredicate\n    >\nstruct iter_fold_if_impl\n{\n private:\n    typedef iter_fold_if_null_step< Iterator,State > forward_step0;\n    typedef iter_fold_if_forward_step< typename forward_step0::iterator, typename forward_step0::state, ForwardOp, ForwardPredicate > forward_step1;\n    typedef iter_fold_if_forward_step< typename forward_step1::iterator, typename forward_step1::state, ForwardOp, ForwardPredicate > forward_step2;\n    typedef iter_fold_if_forward_step< typename forward_step2::iterator, typename forward_step2::state, ForwardOp, ForwardPredicate > forward_step3;\n    typedef iter_fold_if_forward_step< typename forward_step3::iterator, typename forward_step3::state, ForwardOp, ForwardPredicate > forward_step4;\n    \n\n    typedef typename if_<\n          typename forward_step4::not_last\n        , iter_fold_if_impl<\n              typename forward_step4::iterator\n            , typename forward_step4::state\n            , ForwardOp\n            , ForwardPredicate\n            , BackwardOp\n            , BackwardPredicate\n            >\n        , iter_fold_if_null_step<\n              typename forward_step4::iterator\n            , typename forward_step4::state\n            >\n        >::type backward_step4;\n\n    typedef iter_fold_if_backward_step< typename forward_step3::iterator, typename backward_step4::state, BackwardOp, BackwardPredicate > backward_step3;\n    typedef iter_fold_if_backward_step< typename forward_step2::iterator, typename backward_step3::state, BackwardOp, BackwardPredicate > backward_step2;\n    typedef iter_fold_if_backward_step< typename forward_step1::iterator, typename backward_step2::state, BackwardOp, BackwardPredicate > backward_step1;\n    typedef iter_fold_if_backward_step< typename forward_step0::iterator, typename backward_step1::state, BackwardOp, BackwardPredicate > backward_step0;\n    \n\n public:\n    typedef typename backward_step0::state state;\n    typedef typename backward_step4::iterator iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/iter_fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"iter_fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl;\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 0,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef state0 state;\n    typedef iter0 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 1,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    \n\n    typedef state1 state;\n    typedef iter1 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 2,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    \n\n    typedef state2 state;\n    typedef iter2 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 3,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp,state2,iter2 >::type state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    \n\n    typedef state3 state;\n    typedef iter3 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 4,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp,state2,iter2 >::type state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp,state3,iter3 >::type state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef state4 state;\n    typedef iter4 iterator;\n};\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl\n{\n    typedef iter_fold_impl<\n          4\n        , First\n        , Last\n        , State\n        , ForwardOp\n        > chunk_;\n\n    typedef iter_fold_impl<\n          ( (N - 4) < 0 ? 0 : N - 4 )\n        , typename chunk_::iterator\n        , Last\n        , typename chunk_::state\n        , ForwardOp\n        > res_;\n\n    typedef typename res_::state state;\n    typedef typename res_::iterator iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< -1,First,Last,State,ForwardOp >\n    : iter_fold_impl<\n          -1\n        , typename mpl::next<First>::type\n        , Last\n        , typename apply2< ForwardOp,State,First >::type\n        , ForwardOp\n        >\n{\n};\n\ntemplate<\n      typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< -1,Last,Last,State,ForwardOp >\n{\n    typedef State state;\n    typedef Last iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/lambda_no_ctps.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"lambda_no_ctps.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false\n    , bool C5 = false\n    >\nstruct lambda_or\n    : true_\n{\n};\n\ntemplate<>\nstruct lambda_or< false,false,false,false,false >\n    : false_\n{\n};\n\ntemplate< typename Arity > struct lambda_impl\n{\n    template< typename T, typename Tag, typename Protect > struct result_\n    {\n        typedef T type;\n        typedef is_placeholder<T> is_le;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<1> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef typename l1::is_le is_le1;\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value\n            > is_le;\n\n        typedef bind1<\n              typename F::rebind\n            , typename l1::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<2> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value\n            > is_le;\n\n        typedef bind2<\n              typename F::rebind\n            , typename l1::type, typename l2::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<3> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        typedef lambda< typename F::arg3, Tag, false_ > l3;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        typedef typename l3::is_le is_le3;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value\n            > is_le;\n\n        typedef bind3<\n              typename F::rebind\n            , typename l1::type, typename l2::type, typename l3::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<4> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        typedef lambda< typename F::arg3, Tag, false_ > l3;\n        typedef lambda< typename F::arg4, Tag, false_ > l4;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        typedef typename l3::is_le is_le3;\n        typedef typename l4::is_le is_le4;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value\n            > is_le;\n\n        typedef bind4<\n              typename F::rebind\n            , typename l1::type, typename l2::type, typename l3::type\n            , typename l4::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<5> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        typedef lambda< typename F::arg3, Tag, false_ > l3;\n        typedef lambda< typename F::arg4, Tag, false_ > l4;\n        typedef lambda< typename F::arg5, Tag, false_ > l5;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        typedef typename l3::is_le is_le3;\n        typedef typename l4::is_le is_le4;\n        typedef typename l5::is_le is_le5;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le5)::value\n            > is_le;\n\n        typedef bind5<\n              typename F::rebind\n            , typename l1::type, typename l2::type, typename l3::type\n            , typename l4::type, typename l5::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\n} // namespace aux\n\ntemplate<\n      typename T\n    , typename Tag\n    , typename Protect\n    >\nstruct lambda\n{\n    /// Metafunction forwarding confuses MSVC 6.x\n    typedef typename aux::template_arity<T>::type arity_;\n    typedef typename aux::lambda_impl<arity_>\n        ::template result_< T,Tag,Protect > l_;\n\n    typedef typename l_::type type;\n    typedef typename l_::is_le is_le;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(3, lambda, (T, Tag, Protect))\n};\n\nBOOST_MPL_AUX_NA_SPEC2(1, 3, lambda)\n\ntemplate<\n      typename T\n    >\nstruct is_lambda_expression\n    : lambda<T>::is_le\n{\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/less.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"less.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct less_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< less_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< less_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct less_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct less_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct less_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct less_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct less\n\n    : less_impl<\n          typename less_tag<N1>::type\n        , typename less_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, less)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct less_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N2)::value > BOOST_MPL_AUX_VALUE_WKND(N1)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/less_equal.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"less_equal.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct less_equal_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< less_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< less_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct less_equal_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct less_equal_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct less_equal_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct less_equal_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct less_equal\n\n    : less_equal_impl<\n          typename less_equal_tag<N1>::type\n        , typename less_equal_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less_equal, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, less_equal)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct less_equal_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value <= BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/list.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"list.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct list;\n\ntemplate<\n     \n    >\nstruct list<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list0<  >\n{\n    typedef list0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct list<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list1<T0>\n{\n    typedef typename list1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct list<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list2< T0,T1 >\n{\n    typedef typename list2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct list<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list3< T0,T1,T2 >\n{\n    typedef typename list3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct list<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list4< T0,T1,T2,T3 >\n{\n    typedef typename list4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct list<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list5< T0,T1,T2,T3,T4 >\n{\n    typedef typename list5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename list6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename list7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename list8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename list9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename list10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename list11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : list12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename list12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : list13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename list13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : list14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename list14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : list15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename list15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : list16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename list16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : list17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename list17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : list18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename list18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : list19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename list19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct list\n    : list20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename list20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/list_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"list_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX\n    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX\n    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX\n    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX\n    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX\n    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX\n    , long C18 = LONG_MAX, long C19 = LONG_MAX\n    >\nstruct list_c;\n\ntemplate<\n      typename T\n    >\nstruct list_c<\n          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list0_c<T>\n{\n    typedef typename list0_c<T>::type type;\n};\n\ntemplate<\n      typename T, long C0\n    >\nstruct list_c<\n          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list1_c< T,C0 >\n{\n    typedef typename list1_c< T,C0 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1\n    >\nstruct list_c<\n          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list2_c< T,C0,C1 >\n{\n    typedef typename list2_c< T,C0,C1 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2\n    >\nstruct list_c<\n          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list3_c< T,C0,C1,C2 >\n{\n    typedef typename list3_c< T,C0,C1,C2 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list4_c< T,C0,C1,C2,C3 >\n{\n    typedef typename list4_c< T,C0,C1,C2,C3 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list5_c< T,C0,C1,C2,C3,C4 >\n{\n    typedef typename list5_c< T,C0,C1,C2,C3,C4 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list6_c< T,C0,C1,C2,C3,C4,C5 >\n{\n    typedef typename list6_c< T,C0,C1,C2,C3,C4,C5 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list7_c< T,C0,C1,C2,C3,C4,C5,C6 >\n{\n    typedef typename list7_c< T,C0,C1,C2,C3,C4,C5,C6 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX\n        >\n    : list8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >\n{\n    typedef typename list8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : list9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >\n{\n    typedef typename list9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : list10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >\n{\n    typedef typename list10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >\n{\n    typedef typename list11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >\n{\n    typedef typename list12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >\n{\n    typedef typename list13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list14_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        >\n{\n    typedef typename list14_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list15_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        >\n{\n    typedef typename list15_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list16_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15\n        >\n{\n    typedef typename list16_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list17_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16\n        >\n{\n    typedef typename list17_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, LONG_MAX, LONG_MAX\n        >\n    : list18_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17\n        >\n{\n    typedef typename list18_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, LONG_MAX\n        >\n    : list19_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18\n        >\n{\n    typedef typename list19_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n    >\nstruct list_c\n    : list20_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, C19\n        >\n{\n    typedef typename list20_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/map.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"map.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct map;\n\ntemplate<\n     \n    >\nstruct map<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map0<  >\n{\n    typedef map0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct map<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map1<T0>\n{\n    typedef typename map1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct map<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map2< T0,T1 >\n{\n    typedef typename map2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct map<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map3< T0,T1,T2 >\n{\n    typedef typename map3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct map<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map4< T0,T1,T2,T3 >\n{\n    typedef typename map4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct map<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map5< T0,T1,T2,T3,T4 >\n{\n    typedef typename map5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename map6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename map7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename map8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename map9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename map10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename map11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : map12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename map12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : map13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename map13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : map14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename map14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : map15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename map15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : map16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename map16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : map17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename map17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : map18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename map18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : map19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename map19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct map\n    : map20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename map20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/minus.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"minus.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct minus_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< minus_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< minus_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct minus_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct minus_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct minus_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct minus_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct minus\n    : minus< minus< minus< minus< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , minus\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct minus< N1,N2,N3,N4,na >\n\n    : minus< minus< minus< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , minus\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct minus< N1,N2,N3,na,na >\n\n    : minus< minus< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , minus\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct minus< N1,N2,na,na,na >\n    : minus_impl<\n          typename minus_tag<N1>::type\n        , typename minus_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , minus\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, minus)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct minus_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  - BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/modulus.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"modulus.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct modulus_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< modulus_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< modulus_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct modulus_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct modulus_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct modulus_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct modulus_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct modulus\n\n    : modulus_impl<\n          typename modulus_tag<N1>::type\n        , typename modulus_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, modulus, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, modulus)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct modulus_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  % BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/not_equal_to.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"not_equal_to.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct not_equal_to_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< not_equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< not_equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct not_equal_to_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct not_equal_to_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct not_equal_to_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct not_equal_to_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct not_equal_to\n\n    : not_equal_to_impl<\n          typename not_equal_to_tag<N1>::type\n        , typename not_equal_to_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, not_equal_to, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, not_equal_to)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct not_equal_to_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value != BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/or.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"or.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate< bool C_, typename T1, typename T2, typename T3, typename T4 >\nstruct or_impl\n    : true_\n{\n};\n\ntemplate< typename T1, typename T2, typename T3, typename T4 >\nstruct or_impl< false,T1,T2,T3,T4 >\n    : or_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        , T2, T3, T4\n        , false_\n        >\n{\n};\n\ntemplate<>\nstruct or_impl<\n          false\n        , false_, false_, false_, false_\n        >\n    : false_\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    , typename T3 = false_, typename T4 = false_, typename T5 = false_\n    >\nstruct or_\n\n    : aux::or_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        , T2, T3, T4, T5\n        >\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , or_\n        , ( T1, T2, T3, T4, T5)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC2(\n      2\n    , 5\n    , or_\n    )\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/placeholders.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n// Copyright Peter Dimov 2001-2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"placeholders.hpp\" header\n// -- DO NOT modify by hand!\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg< -1 > _;\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_;\n}\n\n}}\n\n/// agurt, 17/mar/02: one more placeholder for the last 'apply#' \n/// specialization\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<1> _1;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_1)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_1;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<2> _2;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_2)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_2;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<3> _3;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_3)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_3;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<4> _4;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_4)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_4;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<5> _5;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_5)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_5;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<6> _6;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_6)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_6;\n}\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/plus.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"plus.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct plus_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< plus_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< plus_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct plus_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct plus_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct plus_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct plus_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct plus\n    : plus< plus< plus< plus< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , plus\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct plus< N1,N2,N3,N4,na >\n\n    : plus< plus< plus< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , plus\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct plus< N1,N2,N3,na,na >\n\n    : plus< plus< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , plus\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct plus< N1,N2,na,na,na >\n    : plus_impl<\n          typename plus_tag<N1>::type\n        , typename plus_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , plus\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, plus)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct plus_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  + BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/quote.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2008\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"quote.hpp\" header\n// -- DO NOT modify by hand!\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/reverse_fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"reverse_fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl;\n\ntemplate< long N >\nstruct reverse_fold_chunk;\n\ntemplate<> struct reverse_fold_chunk<0>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef fwd_state0 bkwd_state0;\n        typedef bkwd_state0 state;\n        typedef iter0 iterator;\n    };\n};\n\ntemplate<> struct reverse_fold_chunk<1>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        \n\n        typedef fwd_state1 bkwd_state1;\n        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n        typedef bkwd_state0 state;\n        typedef iter1 iterator;\n    };\n};\n\ntemplate<> struct reverse_fold_chunk<2>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        \n\n        typedef fwd_state2 bkwd_state2;\n        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter2 iterator;\n    };\n};\n\ntemplate<> struct reverse_fold_chunk<3>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        \n\n        typedef fwd_state3 bkwd_state3;\n        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;\n        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter3 iterator;\n    };\n};\n\ntemplate<> struct reverse_fold_chunk<4>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;\n        typedef typename mpl::next<iter3>::type iter4;\n        \n\n        typedef fwd_state4 bkwd_state4;\n        typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;\n        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;\n        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter4 iterator;\n    };\n};\n\ntemplate< long N >\nstruct reverse_fold_chunk\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;\n        typedef typename mpl::next<iter3>::type iter4;\n        \n\n        typedef reverse_fold_impl<\n              ( (N - 4) < 0 ? 0 : N - 4 )\n            , iter4\n            , Last\n            , fwd_state4\n            , BackwardOp\n            , ForwardOp\n            > nested_chunk;\n\n        typedef typename nested_chunk::state bkwd_state4;\n        typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;\n        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;\n        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef typename nested_chunk::iterator iterator;\n    };\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_step;\n\ntemplate<\n      typename Last\n    , typename State\n    >\nstruct reverse_fold_null_step\n{\n    typedef Last iterator;\n    typedef State state;\n};\n\ntemplate<>\nstruct reverse_fold_chunk< -1 >\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef typename if_<\n              typename is_same< First,Last >::type\n            , reverse_fold_null_step< Last,State >\n            , reverse_fold_step< First,Last,State,BackwardOp,ForwardOp >\n            >::type res_;\n\n        typedef typename res_::state state;\n        typedef typename res_::iterator iterator;\n    };\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_step\n{\n    typedef reverse_fold_chunk< -1 >::template result_<\n          typename mpl::next<First>::type\n        , Last\n        , typename apply2<ForwardOp,State, typename deref<First>::type>::type\n        , BackwardOp\n        , ForwardOp\n        > nested_step;\n\n    typedef typename apply2<\n          BackwardOp\n        , typename nested_step::state\n        , typename deref<First>::type\n        >::type state;\n\n    typedef typename nested_step::iterator iterator;\n};\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl\n    : reverse_fold_chunk<N>\n        ::template result_< First,Last,State,BackwardOp,ForwardOp >\n{\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/reverse_iter_fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"reverse_iter_fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl;\n\ntemplate< long N >\nstruct reverse_iter_fold_chunk;\n\ntemplate<> struct reverse_iter_fold_chunk<0>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef fwd_state0 bkwd_state0;\n        typedef bkwd_state0 state;\n        typedef iter0 iterator;\n    };\n};\n\ntemplate<> struct reverse_iter_fold_chunk<1>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        \n\n        typedef fwd_state1 bkwd_state1;\n        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n        typedef bkwd_state0 state;\n        typedef iter1 iterator;\n    };\n};\n\ntemplate<> struct reverse_iter_fold_chunk<2>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        \n\n        typedef fwd_state2 bkwd_state2;\n        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter2 iterator;\n    };\n};\n\ntemplate<> struct reverse_iter_fold_chunk<3>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        \n\n        typedef fwd_state3 bkwd_state3;\n        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;\n        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter3 iterator;\n    };\n};\n\ntemplate<> struct reverse_iter_fold_chunk<4>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;\n        typedef typename mpl::next<iter3>::type iter4;\n        \n\n        typedef fwd_state4 bkwd_state4;\n        typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;\n        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;\n        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter4 iterator;\n    };\n};\n\ntemplate< long N >\nstruct reverse_iter_fold_chunk\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;\n        typedef typename mpl::next<iter3>::type iter4;\n        \n\n        typedef reverse_iter_fold_impl<\n              ( (N - 4) < 0 ? 0 : N - 4 )\n            , iter4\n            , Last\n            , fwd_state4\n            , BackwardOp\n            , ForwardOp\n            > nested_chunk;\n\n        typedef typename nested_chunk::state bkwd_state4;\n        typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;\n        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;\n        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef typename nested_chunk::iterator iterator;\n    };\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_step;\n\ntemplate<\n      typename Last\n    , typename State\n    >\nstruct reverse_iter_fold_null_step\n{\n    typedef Last iterator;\n    typedef State state;\n};\n\ntemplate<>\nstruct reverse_iter_fold_chunk< -1 >\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef typename if_<\n              typename is_same< First,Last >::type\n            , reverse_iter_fold_null_step< Last,State >\n            , reverse_iter_fold_step< First,Last,State,BackwardOp,ForwardOp >\n            >::type res_;\n\n        typedef typename res_::state state;\n        typedef typename res_::iterator iterator;\n    };\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_step\n{\n    typedef reverse_iter_fold_chunk< -1 >::template result_<\n          typename mpl::next<First>::type\n        , Last\n        , typename apply2< ForwardOp,State,First >::type\n        , BackwardOp\n        , ForwardOp\n        > nested_step;\n\n    typedef typename apply2<\n          BackwardOp\n        , typename nested_step::state\n        , First\n        >::type state;\n\n    typedef typename nested_step::iterator iterator;\n};\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl\n    : reverse_iter_fold_chunk<N>\n        ::template result_< First,Last,State,BackwardOp,ForwardOp >\n{\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/set.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"set.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct set;\n\ntemplate<\n     \n    >\nstruct set<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set0<  >\n{\n    typedef set0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct set<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set1<T0>\n{\n    typedef typename set1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct set<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set2< T0,T1 >\n{\n    typedef typename set2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct set<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set3< T0,T1,T2 >\n{\n    typedef typename set3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct set<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set4< T0,T1,T2,T3 >\n{\n    typedef typename set4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct set<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set5< T0,T1,T2,T3,T4 >\n{\n    typedef typename set5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename set6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename set7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename set8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename set9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename set10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename set11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : set12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename set12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : set13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename set13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : set14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename set14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : set15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename set15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : set16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename set16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : set17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename set17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : set18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename set18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : set19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename set19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct set\n    : set20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename set20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/set_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"set_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX\n    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX\n    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX\n    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX\n    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX\n    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX\n    , long C18 = LONG_MAX, long C19 = LONG_MAX\n    >\nstruct set_c;\n\ntemplate<\n      typename T\n    >\nstruct set_c<\n          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set0_c<T>\n{\n    typedef typename set0_c<T>::type type;\n};\n\ntemplate<\n      typename T, long C0\n    >\nstruct set_c<\n          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set1_c< T,C0 >\n{\n    typedef typename set1_c< T,C0 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1\n    >\nstruct set_c<\n          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set2_c< T,C0,C1 >\n{\n    typedef typename set2_c< T,C0,C1 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2\n    >\nstruct set_c<\n          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set3_c< T,C0,C1,C2 >\n{\n    typedef typename set3_c< T,C0,C1,C2 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set4_c< T,C0,C1,C2,C3 >\n{\n    typedef typename set4_c< T,C0,C1,C2,C3 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set5_c< T,C0,C1,C2,C3,C4 >\n{\n    typedef typename set5_c< T,C0,C1,C2,C3,C4 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set6_c< T,C0,C1,C2,C3,C4,C5 >\n{\n    typedef typename set6_c< T,C0,C1,C2,C3,C4,C5 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set7_c< T,C0,C1,C2,C3,C4,C5,C6 >\n{\n    typedef typename set7_c< T,C0,C1,C2,C3,C4,C5,C6 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX\n        >\n    : set8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >\n{\n    typedef typename set8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : set9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >\n{\n    typedef typename set9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : set10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >\n{\n    typedef typename set10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >\n{\n    typedef typename set11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >\n{\n    typedef typename set12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >\n{\n    typedef typename set13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set14_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        >\n{\n    typedef typename set14_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set15_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        >\n{\n    typedef typename set15_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set16_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15\n        >\n{\n    typedef typename set16_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set17_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16\n        >\n{\n    typedef typename set17_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, LONG_MAX, LONG_MAX\n        >\n    : set18_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17\n        >\n{\n    typedef typename set18_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, LONG_MAX\n        >\n    : set19_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18\n        >\n{\n    typedef typename set19_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n    >\nstruct set_c\n    : set20_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, C19\n        >\n{\n    typedef typename set20_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/shift_left.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"shift_left.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct shift_left_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< shift_left_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< shift_left_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct shift_left_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct shift_left_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct shift_left_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct shift_left_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct shift_left\n\n    : shift_left_impl<\n          typename shift_left_tag<N1>::type\n        , typename shift_left_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_left, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, shift_left)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct shift_left_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N, typename S > struct apply\n\n        : integral_c<\n              typename N::value_type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N)::value\n                  << BOOST_MPL_AUX_VALUE_WKND(S)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/shift_right.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"shift_right.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct shift_right_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< shift_right_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< shift_right_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct shift_right_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct shift_right_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct shift_right_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct shift_right_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct shift_right\n\n    : shift_right_impl<\n          typename shift_right_tag<N1>::type\n        , typename shift_right_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_right, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, shift_right)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct shift_right_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N, typename S > struct apply\n\n        : integral_c<\n              typename N::value_type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N)::value\n                  >> BOOST_MPL_AUX_VALUE_WKND(S)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/template_arity.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"template_arity.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< bool >\nstruct template_arity_impl\n{\n    template< typename F > struct result_\n        : mpl::int_< -1 >\n    {\n    };\n};\n\ntemplate<>\nstruct template_arity_impl<true>\n{\n    template< typename F > struct result_\n        : F::arity\n    {\n    };\n};\n\ntemplate< typename F >\nstruct template_arity\n    : template_arity_impl< ::boost::mpl::aux::has_rebind<F>::value >\n        ::template result_<F>\n{\n};\n\n}}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/times.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"times.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct times_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< times_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< times_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct times_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct times_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct times_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct times_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct times\n    : times< times< times< times< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , times\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct times< N1,N2,N3,N4,na >\n\n    : times< times< times< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , times\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct times< N1,N2,N3,na,na >\n\n    : times< times< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , times\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct times< N1,N2,na,na,na >\n    : times_impl<\n          typename times_tag<N1>::type\n        , typename times_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , times\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, times)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct times_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  * BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/unpack_args.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2002-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"unpack_args.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate< int size, typename F, typename Args >\nstruct unpack_args_impl;\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 0,F,Args >\n    : apply0<\n          F\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 1,F,Args >\n    : apply1<\n          F\n        , typename at_c< Args,0 >::type\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 2,F,Args >\n    : apply2<\n          F\n        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 3,F,Args >\n    : apply3<\n          F\n        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n        , typename at_c< Args,2 >::type\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 4,F,Args >\n    : apply4<\n          F\n        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n        , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 5,F,Args >\n    : apply5<\n          F\n        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n        , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type\n        , typename at_c< Args,4 >::type\n        >\n{\n};\n\n}\n\ntemplate<\n      typename F\n    >\nstruct unpack_args\n{\n    template< typename Args > struct apply\n    {\n        typedef typename aux::unpack_args_impl<\n              size<Args>::value\n            , F\n            , Args\n            >::type type;\n\n    };\n};\n\nBOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(1, unpack_args)\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/vector.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"vector.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct vector;\n\ntemplate<\n     \n    >\nstruct vector<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector0<  >\n{\n    typedef vector0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct vector<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector1<T0>\n{\n    typedef typename vector1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct vector<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector2< T0,T1 >\n{\n    typedef typename vector2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct vector<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector3< T0,T1,T2 >\n{\n    typedef typename vector3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct vector<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector4< T0,T1,T2,T3 >\n{\n    typedef typename vector4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector5< T0,T1,T2,T3,T4 >\n{\n    typedef typename vector5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename vector6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename vector7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename vector8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : vector15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename vector15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : vector16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename vector16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : vector17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename vector17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : vector18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename vector18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : vector19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename vector19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct vector\n    : vector20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename vector20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/bcc_pre590/vector_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2008\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"vector_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX\n    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX\n    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX\n    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX\n    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX\n    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX\n    , long C18 = LONG_MAX, long C19 = LONG_MAX\n    >\nstruct vector_c;\n\ntemplate<\n      typename T\n    >\nstruct vector_c<\n          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector0_c<T>\n{\n    typedef typename vector0_c<T>::type type;\n};\n\ntemplate<\n      typename T, long C0\n    >\nstruct vector_c<\n          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector1_c< T, T(C0) >\n{\n    typedef typename vector1_c< T, T(C0) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1\n    >\nstruct vector_c<\n          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector2_c< T, T(C0), T(C1) >\n{\n    typedef typename vector2_c< T, T(C0), T(C1) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2\n    >\nstruct vector_c<\n          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector3_c< T, T(C0), T(C1), T(C2) >\n{\n    typedef typename vector3_c< T, T(C0), T(C1), T(C2) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector4_c< T, T(C0), T(C1), T(C2), T(C3) >\n{\n    typedef typename vector4_c< T, T(C0), T(C1), T(C2), T(C3) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector5_c< T, T(C0), T(C1), T(C2), T(C3), T(C4) >\n{\n    typedef typename vector5_c< T, T(C0), T(C1), T(C2), T(C3), T(C4) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector6_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5) >\n{\n    typedef typename vector6_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector7_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6) >\n{\n    typedef typename vector7_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX\n        >\n    : vector8_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7) >\n{\n    typedef typename vector8_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : vector9_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8) >\n{\n    typedef typename vector9_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : vector10_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9) >\n{\n    typedef typename vector10_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector11_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10) >\n{\n    typedef typename vector11_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector12_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11) >\n{\n    typedef typename vector12_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector13_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12) >\n{\n    typedef typename vector13_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector14_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13) >\n{\n    typedef typename vector14_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector15_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14) >\n{\n    typedef typename vector15_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector16_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15) >\n{\n    typedef typename vector16_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector17_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16) >\n{\n    typedef typename vector17_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, LONG_MAX, LONG_MAX\n        >\n    : vector18_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17) >\n{\n    typedef typename vector18_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, LONG_MAX\n        >\n    : vector19_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18) >\n{\n    typedef typename vector19_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18) >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n    >\nstruct vector_c\n    : vector20_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19) >\n{\n    typedef typename vector20_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19) >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/advance_backward.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/advance_backward.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< long N > struct advance_backward;\ntemplate<>\nstruct advance_backward<0>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef iter0 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<1>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef iter1 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<2>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef typename prior<iter1>::type iter2;\n        typedef iter2 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<3>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef typename prior<iter1>::type iter2;\n        typedef typename prior<iter2>::type iter3;\n        typedef iter3 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<4>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef typename prior<iter1>::type iter2;\n        typedef typename prior<iter2>::type iter3;\n        typedef typename prior<iter3>::type iter4;\n        typedef iter4 type;\n    };\n};\n\ntemplate< long N >\nstruct advance_backward\n{\n    template< typename Iterator > struct apply\n    {\n        typedef typename apply_wrap1<\n              advance_backward<4>\n            , Iterator\n            >::type chunk_result_;\n\n        typedef typename apply_wrap1<\n              advance_backward<(\n                (N - 4) < 0\n                    ? 0\n                    : N - 4\n                    )>\n            , chunk_result_\n            >::type type;\n    };\n};\n\n}}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/advance_forward.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/advance_forward.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< long N > struct advance_forward;\ntemplate<>\nstruct advance_forward<0>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef iter0 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<1>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef iter1 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<2>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef typename next<iter1>::type iter2;\n        typedef iter2 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<3>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef typename next<iter1>::type iter2;\n        typedef typename next<iter2>::type iter3;\n        typedef iter3 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<4>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef typename next<iter1>::type iter2;\n        typedef typename next<iter2>::type iter3;\n        typedef typename next<iter3>::type iter4;\n        typedef iter4 type;\n    };\n};\n\ntemplate< long N >\nstruct advance_forward\n{\n    template< typename Iterator > struct apply\n    {\n        typedef typename apply_wrap1<\n              advance_forward<4>\n            , Iterator\n            >::type chunk_result_;\n\n        typedef typename apply_wrap1<\n              advance_forward<(\n                (N - 4) < 0\n                    ? 0\n                    : N - 4\n                    )>\n            , chunk_result_\n            >::type type;\n    };\n};\n\n}}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/and.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/and.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate< bool C_, typename T1, typename T2, typename T3, typename T4 >\nstruct and_impl\n    : false_\n{\n};\n\ntemplate< typename T1, typename T2, typename T3, typename T4 >\nstruct and_impl< true,T1,T2,T3,T4 >\n    : and_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        , T2, T3, T4\n        , true_\n        >\n{\n};\n\ntemplate<>\nstruct and_impl<\n          true\n        , true_, true_, true_, true_\n        >\n    : true_\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    , typename T3 = true_, typename T4 = true_, typename T5 = true_\n    >\nstruct and_\n\n    : aux::and_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        , T2, T3, T4, T5\n        >\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , and_\n        , ( T1, T2, T3, T4, T5)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC2(\n      2\n    , 5\n    , and_\n    )\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/apply.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/apply.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F\n    >\nstruct apply0\n\n    : apply_wrap0<\n          typename lambda<F>::type\n       \n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          1\n        , apply0\n        , (F )\n        )\n};\n\ntemplate<\n      typename F\n    >\nstruct apply< F,na,na,na,na,na >\n    : apply0<F>\n{\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply1\n\n    : apply_wrap1<\n          typename lambda<F>::type\n        , T1\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          2\n        , apply1\n        , (F, T1)\n        )\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply< F,T1,na,na,na,na >\n    : apply1< F,T1 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply2\n\n    : apply_wrap2<\n          typename lambda<F>::type\n        , T1, T2\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          3\n        , apply2\n        , (F, T1, T2)\n        )\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply< F,T1,T2,na,na,na >\n    : apply2< F,T1,T2 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply3\n\n    : apply_wrap3<\n          typename lambda<F>::type\n        , T1, T2, T3\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          4\n        , apply3\n        , (F, T1, T2, T3)\n        )\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply< F,T1,T2,T3,na,na >\n    : apply3< F,T1,T2,T3 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply4\n\n    : apply_wrap4<\n          typename lambda<F>::type\n        , T1, T2, T3, T4\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , apply4\n        , (F, T1, T2, T3, T4)\n        )\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply< F,T1,T2,T3,T4,na >\n    : apply4< F,T1,T2,T3,T4 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply5\n\n    : apply_wrap5<\n          typename lambda<F>::type\n        , T1, T2, T3, T4, T5\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          6\n        , apply5\n        , (F, T1, T2, T3, T4, T5)\n        )\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply\n    : apply5< F,T1,T2,T3,T4,T5 >\n{\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/apply_fwd.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/apply_fwd.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na\n    >\nstruct apply;\n\ntemplate<\n      typename F\n    >\nstruct apply0;\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply1;\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply2;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply3;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply4;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply5;\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/apply_wrap.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/apply_wrap.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F\n\n    , typename has_apply_ = typename aux::has_apply<F>::type\n\n    >\nstruct apply_wrap0\n\n    : F::template apply<  >\n{\n};\n\ntemplate< typename F >\nstruct apply_wrap0< F,true_ >\n    : F::apply\n{\n};\n\ntemplate<\n      typename F, typename T1\n\n    >\nstruct apply_wrap1\n\n    : F::template apply<T1>\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n\n    >\nstruct apply_wrap2\n\n    : F::template apply< T1,T2 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n\n    >\nstruct apply_wrap3\n\n    : F::template apply< T1,T2,T3 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n\n    >\nstruct apply_wrap4\n\n    : F::template apply< T1,T2,T3,T4 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n\n    >\nstruct apply_wrap5\n\n    : F::template apply< T1,T2,T3,T4,T5 >\n{\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/arg.hpp",
    "content": "\n// Copyright Peter Dimov 2001-2002\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/arg.hpp\" header\n// -- DO NOT modify by hand!\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntemplate<> struct arg< -1 >\n{\n    BOOST_STATIC_CONSTANT(int, value  = -1);\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U1 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<1>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 1);\n    typedef arg<2> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U1 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<2>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 2);\n    typedef arg<3> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U2 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<3>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 3);\n    typedef arg<4> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U3 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<4>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 4);\n    typedef arg<5> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U4 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<5>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 5);\n    typedef arg<6> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U5 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\nBOOST_MPL_AUX_NONTYPE_ARITY_SPEC(1,int, arg)\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/basic_bind.hpp",
    "content": "\n// Copyright Peter Dimov 2001\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/basic_bind.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      typename T, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg\n{\n    typedef T type;\n};\n\ntemplate<\n      int N, typename U1, typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 >\n{\n    typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg< bind< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5 >\n{\n    typedef bind< F,T1,T2,T3,T4,T5 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename F, int dummy_\n    >\nstruct bind0\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n\n     public:\n        typedef typename apply_wrap0<\n              f_\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg<\n      bind0<F>, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind0<F> f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(1, bind0)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)\n\ntemplate<\n      typename F, int dummy_\n    >\nstruct bind< F,na,na,na,na,na >\n    : bind0<F>\n{\n};\n\ntemplate<\n      typename F, typename T1, int dummy_\n    >\nstruct bind1\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n\n     public:\n        typedef typename apply_wrap1<\n              f_\n            , typename t1::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename U1, typename U2, typename U3\n    , typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind1< F,T1 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind1< F,T1 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(2, bind1)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)\n\ntemplate<\n      typename F, typename T1, int dummy_\n    >\nstruct bind< F,T1,na,na,na,na >\n    : bind1< F,T1 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, int dummy_\n    >\nstruct bind2\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n\n     public:\n        typedef typename apply_wrap2<\n              f_\n            , typename t1::type, typename t2::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename U1, typename U2\n    , typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind2< F,T1,T2 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind2< F,T1,T2 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(3, bind2)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)\n\ntemplate<\n      typename F, typename T1, typename T2, int dummy_\n    >\nstruct bind< F,T1,T2,na,na,na >\n    : bind2< F,T1,T2 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, int dummy_\n    >\nstruct bind3\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n\n     public:\n        typedef typename apply_wrap3<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename U1\n    , typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind3< F,T1,T2,T3 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(4, bind3)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, int dummy_\n    >\nstruct bind< F,T1,T2,T3,na,na >\n    : bind3< F,T1,T2,T3 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , int dummy_\n    >\nstruct bind4\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;\n\n     public:\n        typedef typename apply_wrap4<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename U1, typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind4< F,T1,T2,T3,T4 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(5, bind4)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , int dummy_\n    >\nstruct bind< F,T1,T2,T3,T4,na >\n    : bind4< F,T1,T2,T3,T4 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5, int dummy_\n    >\nstruct bind5\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;\n        typedef aux::resolve_bind_arg< T5,U1,U2,U3,U4,U5 > t5;\n\n     public:\n        typedef typename apply_wrap5<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type, typename t5::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg<\n      bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind5< F,T1,T2,T3,T4,T5 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(6, bind5)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5, int dummy_\n    >\nstruct bind\n    : bind5< F,T1,T2,T3,T4,T5 >\n{\n};\n\n/// if_/eval_if specializations\ntemplate< template< typename T1, typename T2, typename T3 > class F, typename Tag >\nstruct quote3;\n\ntemplate< typename T1, typename T2, typename T3 > struct if_;\n\ntemplate<\n      typename Tag, typename T1, typename T2, typename T3\n    >\nstruct bind3<\n      quote3< if_,Tag >\n    , T1, T2, T3\n    >\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef mpl::arg<1> n1;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n        typedef typename if_<\n              typename t1::type\n            , t2, t3\n            >::type f_;\n\n     public:\n        typedef typename f_::type type;\n    };\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/bind.hpp",
    "content": "\n// Copyright Peter Dimov 2001\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bind.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      typename T, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg\n{\n    typedef T type;\n};\n\ntemplate<\n      typename T\n    , typename Arg\n    >\nstruct replace_unnamed_arg\n{\n    typedef Arg next;\n    typedef T type;\n};\n\ntemplate<\n      typename Arg\n    >\nstruct replace_unnamed_arg< arg< -1 >, Arg >\n{\n    typedef typename Arg::next next;\n    typedef Arg type;\n};\n\ntemplate<\n      int N, typename U1, typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 >\n{\n    typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg< bind< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5 >\n{\n    typedef bind< F,T1,T2,T3,T4,T5 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename F, int dummy_\n    >\nstruct bind0\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n     public:\n        typedef typename apply_wrap0<\n              f_\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg<\n      bind0<F>, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind0<F> f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(1, bind0)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)\n\ntemplate<\n      typename F, int dummy_\n    >\nstruct bind< F,na,na,na,na,na >\n    : bind0<F>\n{\n};\n\ntemplate<\n      typename F, typename T1, int dummy_\n    >\nstruct bind1\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n     public:\n        typedef typename apply_wrap1<\n              f_\n            , typename t1::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename U1, typename U2, typename U3\n    , typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind1< F,T1 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind1< F,T1 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(2, bind1)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)\n\ntemplate<\n      typename F, typename T1, int dummy_\n    >\nstruct bind< F,T1,na,na,na,na >\n    : bind1< F,T1 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, int dummy_\n    >\nstruct bind2\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n     public:\n        typedef typename apply_wrap2<\n              f_\n            , typename t1::type, typename t2::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename U1, typename U2\n    , typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind2< F,T1,T2 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind2< F,T1,T2 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(3, bind2)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)\n\ntemplate<\n      typename F, typename T1, typename T2, int dummy_\n    >\nstruct bind< F,T1,T2,na,na,na >\n    : bind2< F,T1,T2 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, int dummy_\n    >\nstruct bind3\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n     public:\n        typedef typename apply_wrap3<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename U1\n    , typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind3< F,T1,T2,T3 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(4, bind3)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, int dummy_\n    >\nstruct bind< F,T1,T2,T3,na,na >\n    : bind3< F,T1,T2,T3 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , int dummy_\n    >\nstruct bind4\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n        typedef aux::replace_unnamed_arg< T4,n4 > r4;\n        typedef typename r4::type a4;\n        typedef typename r4::next n5;\n        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;\n        ///\n     public:\n        typedef typename apply_wrap4<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename U1, typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind4< F,T1,T2,T3,T4 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(5, bind4)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , int dummy_\n    >\nstruct bind< F,T1,T2,T3,T4,na >\n    : bind4< F,T1,T2,T3,T4 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5, int dummy_\n    >\nstruct bind5\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n        typedef aux::replace_unnamed_arg< T4,n4 > r4;\n        typedef typename r4::type a4;\n        typedef typename r4::next n5;\n        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;\n        ///\n        typedef aux::replace_unnamed_arg< T5,n5 > r5;\n        typedef typename r5::type a5;\n        typedef typename r5::next n6;\n        typedef aux::resolve_bind_arg< a5,U1,U2,U3,U4,U5 > t5;\n        ///\n     public:\n        typedef typename apply_wrap5<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type, typename t5::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg<\n      bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind5< F,T1,T2,T3,T4,T5 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(6, bind5)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5, int dummy_\n    >\nstruct bind\n    : bind5< F,T1,T2,T3,T4,T5 >\n{\n};\n\n/// if_/eval_if specializations\ntemplate< template< typename T1, typename T2, typename T3 > class F, typename Tag >\nstruct quote3;\n\ntemplate< typename T1, typename T2, typename T3 > struct if_;\n\ntemplate<\n      typename Tag, typename T1, typename T2, typename T3\n    >\nstruct bind3<\n      quote3< if_,Tag >\n    , T1, T2, T3\n    >\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef mpl::arg<1> n1;\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n        typedef typename if_<\n              typename t1::type\n            , t2, t3\n            >::type f_;\n\n     public:\n        typedef typename f_::type type;\n    };\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/bind_fwd.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bind_fwd.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, int dummy_ = 0\n    >\nstruct bind;\n\ntemplate<\n      typename F, int dummy_ = 0\n    >\nstruct bind0;\n\ntemplate<\n      typename F, typename T1, int dummy_ = 0\n    >\nstruct bind1;\n\ntemplate<\n      typename F, typename T1, typename T2, int dummy_ = 0\n    >\nstruct bind2;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, int dummy_ = 0\n    >\nstruct bind3;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , int dummy_ = 0\n    >\nstruct bind4;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5, int dummy_ = 0\n    >\nstruct bind5;\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/bitand.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bitand.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct bitand_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< bitand_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< bitand_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct bitand_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitand_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitand_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct bitand_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct bitand_\n    : bitand_< bitand_< bitand_< bitand_< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , bitand_\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct bitand_< N1,N2,N3,N4,na >\n\n    : bitand_< bitand_< bitand_< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitand_\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct bitand_< N1,N2,N3,na,na >\n\n    : bitand_< bitand_< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitand_\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct bitand_< N1,N2,na,na,na >\n    : bitand_impl<\n          typename bitand_tag<N1>::type\n        , typename bitand_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitand_\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, bitand_)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct bitand_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  & BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/bitor.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bitor.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct bitor_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< bitor_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< bitor_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct bitor_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitor_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitor_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct bitor_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct bitor_\n    : bitor_< bitor_< bitor_< bitor_< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , bitor_\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct bitor_< N1,N2,N3,N4,na >\n\n    : bitor_< bitor_< bitor_< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitor_\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct bitor_< N1,N2,N3,na,na >\n\n    : bitor_< bitor_< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitor_\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct bitor_< N1,N2,na,na,na >\n    : bitor_impl<\n          typename bitor_tag<N1>::type\n        , typename bitor_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitor_\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, bitor_)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct bitor_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  | BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/bitxor.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bitxor.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct bitxor_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< bitxor_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< bitxor_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct bitxor_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitxor_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitxor_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct bitxor_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct bitxor_\n    : bitxor_< bitxor_< bitxor_< bitxor_< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , bitxor_\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct bitxor_< N1,N2,N3,N4,na >\n\n    : bitxor_< bitxor_< bitxor_< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitxor_\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct bitxor_< N1,N2,N3,na,na >\n\n    : bitxor_< bitxor_< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitxor_\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct bitxor_< N1,N2,na,na,na >\n    : bitxor_impl<\n          typename bitxor_tag<N1>::type\n        , typename bitxor_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitxor_\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, bitxor_)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct bitxor_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  ^ BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/deque.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/deque.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct deque;\n\ntemplate<\n     \n    >\nstruct deque<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector0<  >\n{\n    typedef vector0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct deque<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector1<T0>\n{\n    typedef typename vector1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct deque<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector2< T0,T1 >\n{\n    typedef typename vector2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct deque<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector3< T0,T1,T2 >\n{\n    typedef typename vector3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct deque<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector4< T0,T1,T2,T3 >\n{\n    typedef typename vector4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector5< T0,T1,T2,T3,T4 >\n{\n    typedef typename vector5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename vector6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename vector7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename vector8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : vector15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename vector15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : vector16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename vector16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : vector17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename vector17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : vector18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename vector18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : vector19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename vector19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct deque\n    : vector20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename vector20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/divides.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/divides.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct divides_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< divides_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< divides_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct divides_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct divides_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct divides_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct divides_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct divides\n    : divides< divides< divides< divides< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , divides\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct divides< N1,N2,N3,N4,na >\n\n    : divides< divides< divides< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , divides\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct divides< N1,N2,N3,na,na >\n\n    : divides< divides< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , divides\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct divides< N1,N2,na,na,na >\n    : divides_impl<\n          typename divides_tag<N1>::type\n        , typename divides_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , divides\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, divides)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct divides_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  / BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/equal_to.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/equal_to.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct equal_to_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct equal_to_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct equal_to_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct equal_to_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct equal_to_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct equal_to\n\n    : equal_to_impl<\n          typename equal_to_tag<N1>::type\n        , typename equal_to_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, equal_to, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, equal_to)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct equal_to_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value  == BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl;\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 0,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef state0 state;\n    typedef iter0 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 1,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    \n\n    typedef state1 state;\n    typedef iter1 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 2,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    \n\n    typedef state2 state;\n    typedef iter2 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 3,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    \n\n    typedef state3 state;\n    typedef iter3 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 4,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp, state3, typename deref<iter3>::type >::type state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef state4 state;\n    typedef iter4 iterator;\n};\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl\n{\n    typedef fold_impl<\n          4\n        , First\n        , Last\n        , State\n        , ForwardOp\n        > chunk_;\n\n    typedef fold_impl<\n          ( (N - 4) < 0 ? 0 : N - 4 )\n        , typename chunk_::iterator\n        , Last\n        , typename chunk_::state\n        , ForwardOp\n        > res_;\n\n    typedef typename res_::state state;\n    typedef typename res_::iterator iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< -1,First,Last,State,ForwardOp >\n    : fold_impl<\n          -1\n        , typename mpl::next<First>::type\n        , Last\n        , typename apply2<ForwardOp,State, typename deref<First>::type>::type\n        , ForwardOp\n        >\n{\n};\n\ntemplate<\n      typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< -1,Last,Last,State,ForwardOp >\n{\n    typedef State state;\n    typedef Last iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/full_lambda.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/full_lambda.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false\n    , bool C5 = false\n    >\nstruct lambda_or\n    : true_\n{\n};\n\ntemplate<>\nstruct lambda_or< false,false,false,false,false >\n    : false_\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename T\n    , typename Tag\n   \n    >\nstruct lambda\n{\n    typedef false_ is_le;\n    typedef T result_;\n    typedef T type;\n};\n\ntemplate<\n      typename T\n    >\nstruct is_lambda_expression\n    : lambda<T>::is_le\n{\n};\n\ntemplate< int N, typename Tag >\nstruct lambda< arg<N>, Tag >\n{\n    typedef true_ is_le;\n    typedef mpl::arg<N> result_; // qualified for the sake of MIPSpro 7.41\n    typedef mpl::protect<result_> type;\n};\n\ntemplate<\n      typename F\n    , typename Tag\n    >\nstruct lambda<\n          bind0<F>\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind0<\n          F\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1 > class F\n    , typename L1\n    >\nstruct le_result1\n{\n    typedef F<\n          typename L1::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1 > class F\n    , typename L1\n    >\nstruct le_result1< true_,Tag,F,L1 >\n{\n    typedef bind1<\n          quote1< F,Tag >\n        , typename L1::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1 > class F\n    , typename T1\n    , typename Tag\n    >\nstruct lambda<\n          F<T1>\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef typename l1::is_le is_le1;\n    typedef typename aux::lambda_or<\n          is_le1::value\n        >::type is_le;\n\n    typedef aux::le_result1<\n          is_le, Tag, F, l1\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1\n    , typename Tag\n    >\nstruct lambda<\n          bind1< F,T1 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind1<\n          F\n        , T1\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2 > class F\n    , typename L1, typename L2\n    >\nstruct le_result2\n{\n    typedef F<\n          typename L1::type, typename L2::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2 > class F\n    , typename L1, typename L2\n    >\nstruct le_result2< true_,Tag,F,L1,L2 >\n{\n    typedef bind2<\n          quote2< F,Tag >\n        , typename L1::result_, typename L2::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1, typename P2 > class F\n    , typename T1, typename T2\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2 >\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value\n        >::type is_le;\n\n    typedef aux::le_result2<\n          is_le, Tag, F, l1, l2\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    , typename Tag\n    >\nstruct lambda<\n          bind2< F,T1,T2 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind2<\n          F\n        , T1, T2\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2, typename P3 > class F\n    , typename L1, typename L2, typename L3\n    >\nstruct le_result3\n{\n    typedef F<\n          typename L1::type, typename L2::type, typename L3::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2, typename P3 > class F\n    , typename L1, typename L2, typename L3\n    >\nstruct le_result3< true_,Tag,F,L1,L2,L3 >\n{\n    typedef bind3<\n          quote3< F,Tag >\n        , typename L1::result_, typename L2::result_, typename L3::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1, typename P2, typename P3 > class F\n    , typename T1, typename T2, typename T3\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2,T3 >\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    typedef lambda< T3,Tag > l3;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    typedef typename l3::is_le is_le3;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value, is_le3::value\n        >::type is_le;\n\n    typedef aux::le_result3<\n          is_le, Tag, F, l1, l2, l3\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    , typename Tag\n    >\nstruct lambda<\n          bind3< F,T1,T2,T3 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind3<\n          F\n        , T1, T2, T3\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename L1, typename L2, typename L3, typename L4\n    >\nstruct le_result4\n{\n    typedef F<\n          typename L1::type, typename L2::type, typename L3::type\n        , typename L4::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename L1, typename L2, typename L3, typename L4\n    >\nstruct le_result4< true_,Tag,F,L1,L2,L3,L4 >\n{\n    typedef bind4<\n          quote4< F,Tag >\n        , typename L1::result_, typename L2::result_, typename L3::result_\n        , typename L4::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename T1, typename T2, typename T3, typename T4\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2,T3,T4 >\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    typedef lambda< T3,Tag > l3;\n    typedef lambda< T4,Tag > l4;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    typedef typename l3::is_le is_le3;\n    typedef typename l4::is_le is_le4;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value, is_le3::value, is_le4::value\n        >::type is_le;\n\n    typedef aux::le_result4<\n          is_le, Tag, F, l1, l2, l3, l4\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename Tag\n    >\nstruct lambda<\n          bind4< F,T1,T2,T3,T4 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind4<\n          F\n        , T1, T2, T3, T4\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F\n    , typename L1, typename L2, typename L3, typename L4, typename L5\n    >\nstruct le_result5\n{\n    typedef F<\n          typename L1::type, typename L2::type, typename L3::type\n        , typename L4::type, typename L5::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F\n    , typename L1, typename L2, typename L3, typename L4, typename L5\n    >\nstruct le_result5< true_,Tag,F,L1,L2,L3,L4,L5 >\n{\n    typedef bind5<\n          quote5< F,Tag >\n        , typename L1::result_, typename L2::result_, typename L3::result_\n        , typename L4::result_, typename L5::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template<\n          typename P1, typename P2, typename P3, typename P4\n        , typename P5\n        >\n      class F\n    , typename T1, typename T2, typename T3, typename T4, typename T5\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2,T3,T4,T5 >\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    typedef lambda< T3,Tag > l3;\n    typedef lambda< T4,Tag > l4;\n    typedef lambda< T5,Tag > l5;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    typedef typename l3::is_le is_le3;\n    typedef typename l4::is_le is_le4;\n    typedef typename l5::is_le is_le5;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value, is_le3::value, is_le4::value\n        , is_le5::value\n        >::type is_le;\n\n    typedef aux::le_result5<\n          is_le, Tag, F, l1, l2, l3, l4, l5\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    , typename Tag\n    >\nstruct lambda<\n          bind5< F,T1,T2,T3,T4,T5 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind5<\n          F\n        , T1, T2, T3, T4, T5\n        > result_;\n\n    typedef result_ type;\n};\n\n/// special case for 'protect'\ntemplate< typename T, typename Tag >\nstruct lambda< mpl::protect<T>, Tag >\n{\n    typedef false_ is_le;\n    typedef mpl::protect<T> result_;\n    typedef result_ type;\n};\n\n/// specializations for the main 'bind' form\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    , typename Tag\n    >\nstruct lambda<\n          bind< F,T1,T2,T3,T4,T5 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind< F,T1,T2,T3,T4,T5 > result_;\n    typedef result_ type;\n};\n\nBOOST_MPL_AUX_NA_SPEC(2, lambda)\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/greater.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/greater.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct greater_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< greater_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< greater_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct greater_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct greater_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct greater_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct greater_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct greater\n\n    : greater_impl<\n          typename greater_tag<N1>::type\n        , typename greater_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, greater)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct greater_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value > BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/greater_equal.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/greater_equal.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct greater_equal_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< greater_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< greater_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct greater_equal_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct greater_equal_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct greater_equal_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct greater_equal_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct greater_equal\n\n    : greater_equal_impl<\n          typename greater_equal_tag<N1>::type\n        , typename greater_equal_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater_equal, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, greater_equal)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct greater_equal_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value >= BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/inherit.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/inherit.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    >\nstruct inherit2\n    : T1, T2\n{\n    typedef inherit2 type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, inherit2, (T1, T2))\n};\n\ntemplate< typename T1 >\nstruct inherit2< T1,empty_base >\n{\n    typedef T1 type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (T1, empty_base))\n};\n\ntemplate< typename T2 >\nstruct inherit2< empty_base,T2 >\n{\n    typedef T2 type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base, T2))\n};\n\ntemplate<>\nstruct inherit2< empty_base,empty_base >\n{\n    typedef empty_base type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base, empty_base))\n};\n\nBOOST_MPL_AUX_NA_SPEC(2, inherit2)\n\ntemplate<\n      typename T1 = na, typename T2 = na, typename T3 = na\n    >\nstruct inherit3\n    : inherit2<\n          typename inherit2<\n              T1, T2\n            >::type\n        , T3\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          3\n        , inherit3\n        , ( T1, T2, T3)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC(3, inherit3)\n\ntemplate<\n      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na\n    >\nstruct inherit4\n    : inherit2<\n          typename inherit3<\n              T1, T2, T3\n            >::type\n        , T4\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          4\n        , inherit4\n        , ( T1, T2, T3, T4)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC(4, inherit4)\n\ntemplate<\n      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na\n    , typename T5 = na\n    >\nstruct inherit5\n    : inherit2<\n          typename inherit4<\n              T1, T2, T3, T4\n            >::type\n        , T5\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , inherit5\n        , ( T1, T2, T3, T4, T5)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC(5, inherit5)\n\n/// primary template\n\ntemplate<\n      typename T1 = empty_base, typename T2 = empty_base\n    , typename T3 = empty_base, typename T4 = empty_base\n    , typename T5 = empty_base\n    >\nstruct inherit\n    : inherit5< T1,T2,T3,T4,T5 >\n{\n};\n\ntemplate<>\nstruct inherit< na,na,na,na,na >\n{\n    template<\n\n          typename T1 = empty_base, typename T2 = empty_base\n        , typename T3 = empty_base, typename T4 = empty_base\n        , typename T5 = empty_base\n\n        >\n    struct apply\n        : inherit< T1,T2,T3,T4,T5 >\n    {\n    };\n};\n\nBOOST_MPL_AUX_NA_SPEC_LAMBDA(5, inherit)\nBOOST_MPL_AUX_NA_SPEC_ARITY(5, inherit)\nBOOST_MPL_AUX_NA_SPEC_TEMPLATE_ARITY(5, 5, inherit)\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/iter_fold_if_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n// Copyright David Abrahams 2001-2002\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/iter_fold_if_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< typename Iterator, typename State >\nstruct iter_fold_if_null_step\n{\n    typedef State state;\n    typedef Iterator iterator;\n};\n\ntemplate< bool >\nstruct iter_fold_if_step_impl\n{\n    template<\n          typename Iterator\n        , typename State\n        , typename StateOp\n        , typename IteratorOp\n        >\n    struct result_\n    {\n        typedef typename apply2< StateOp,State,Iterator >::type state;\n        typedef typename IteratorOp::type iterator;\n    };\n};\n\ntemplate<>\nstruct iter_fold_if_step_impl<false>\n{\n    template<\n          typename Iterator\n        , typename State\n        , typename StateOp\n        , typename IteratorOp\n        >\n    struct result_\n    {\n        typedef State state;\n        typedef Iterator iterator;\n    };\n};\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename ForwardOp\n    , typename Predicate\n    >\nstruct iter_fold_if_forward_step\n{\n    typedef typename apply2< Predicate,State,Iterator >::type not_last;\n    typedef typename iter_fold_if_step_impl<\n          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value\n        >::template result_< Iterator,State,ForwardOp, mpl::next<Iterator> > impl_;\n\n    typedef typename impl_::state state;\n    typedef typename impl_::iterator iterator;\n};\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename BackwardOp\n    , typename Predicate\n    >\nstruct iter_fold_if_backward_step\n{\n    typedef typename apply2< Predicate,State,Iterator >::type not_last;\n    typedef typename iter_fold_if_step_impl<\n          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value\n        >::template result_< Iterator,State,BackwardOp, identity<Iterator> > impl_;\n\n    typedef typename impl_::state state;\n    typedef typename impl_::iterator iterator;\n};\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename ForwardOp\n    , typename ForwardPredicate\n    , typename BackwardOp\n    , typename BackwardPredicate\n    >\nstruct iter_fold_if_impl\n{\n private:\n    typedef iter_fold_if_null_step< Iterator,State > forward_step0;\n    typedef iter_fold_if_forward_step< typename forward_step0::iterator, typename forward_step0::state, ForwardOp, ForwardPredicate > forward_step1;\n    typedef iter_fold_if_forward_step< typename forward_step1::iterator, typename forward_step1::state, ForwardOp, ForwardPredicate > forward_step2;\n    typedef iter_fold_if_forward_step< typename forward_step2::iterator, typename forward_step2::state, ForwardOp, ForwardPredicate > forward_step3;\n    typedef iter_fold_if_forward_step< typename forward_step3::iterator, typename forward_step3::state, ForwardOp, ForwardPredicate > forward_step4;\n    \n\n    typedef typename if_<\n          typename forward_step4::not_last\n        , iter_fold_if_impl<\n              typename forward_step4::iterator\n            , typename forward_step4::state\n            , ForwardOp\n            , ForwardPredicate\n            , BackwardOp\n            , BackwardPredicate\n            >\n        , iter_fold_if_null_step<\n              typename forward_step4::iterator\n            , typename forward_step4::state\n            >\n        >::type backward_step4;\n\n    typedef iter_fold_if_backward_step< typename forward_step3::iterator, typename backward_step4::state, BackwardOp, BackwardPredicate > backward_step3;\n    typedef iter_fold_if_backward_step< typename forward_step2::iterator, typename backward_step3::state, BackwardOp, BackwardPredicate > backward_step2;\n    typedef iter_fold_if_backward_step< typename forward_step1::iterator, typename backward_step2::state, BackwardOp, BackwardPredicate > backward_step1;\n    typedef iter_fold_if_backward_step< typename forward_step0::iterator, typename backward_step1::state, BackwardOp, BackwardPredicate > backward_step0;\n    \n\n public:\n    typedef typename backward_step0::state state;\n    typedef typename backward_step4::iterator iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/iter_fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/iter_fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl;\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 0,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef state0 state;\n    typedef iter0 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 1,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    \n\n    typedef state1 state;\n    typedef iter1 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 2,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    \n\n    typedef state2 state;\n    typedef iter2 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 3,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp,state2,iter2 >::type state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    \n\n    typedef state3 state;\n    typedef iter3 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 4,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp,state2,iter2 >::type state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp,state3,iter3 >::type state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef state4 state;\n    typedef iter4 iterator;\n};\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl\n{\n    typedef iter_fold_impl<\n          4\n        , First\n        , Last\n        , State\n        , ForwardOp\n        > chunk_;\n\n    typedef iter_fold_impl<\n          ( (N - 4) < 0 ? 0 : N - 4 )\n        , typename chunk_::iterator\n        , Last\n        , typename chunk_::state\n        , ForwardOp\n        > res_;\n\n    typedef typename res_::state state;\n    typedef typename res_::iterator iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< -1,First,Last,State,ForwardOp >\n    : iter_fold_impl<\n          -1\n        , typename mpl::next<First>::type\n        , Last\n        , typename apply2< ForwardOp,State,First >::type\n        , ForwardOp\n        >\n{\n};\n\ntemplate<\n      typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< -1,Last,Last,State,ForwardOp >\n{\n    typedef State state;\n    typedef Last iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/lambda_no_ctps.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/lambda_no_ctps.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false\n    , bool C5 = false\n    >\nstruct lambda_or\n    : true_\n{\n};\n\ntemplate<>\nstruct lambda_or< false,false,false,false,false >\n    : false_\n{\n};\n\ntemplate< typename Arity > struct lambda_impl\n{\n    template< typename T, typename Tag, typename Protect > struct result_\n    {\n        typedef T type;\n        typedef is_placeholder<T> is_le;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<1> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef typename l1::is_le is_le1;\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value\n            > is_le;\n\n        typedef bind1<\n              typename F::rebind\n            , typename l1::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<2> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value\n            > is_le;\n\n        typedef bind2<\n              typename F::rebind\n            , typename l1::type, typename l2::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<3> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        typedef lambda< typename F::arg3, Tag, false_ > l3;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        typedef typename l3::is_le is_le3;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value\n            > is_le;\n\n        typedef bind3<\n              typename F::rebind\n            , typename l1::type, typename l2::type, typename l3::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<4> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        typedef lambda< typename F::arg3, Tag, false_ > l3;\n        typedef lambda< typename F::arg4, Tag, false_ > l4;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        typedef typename l3::is_le is_le3;\n        typedef typename l4::is_le is_le4;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value\n            > is_le;\n\n        typedef bind4<\n              typename F::rebind\n            , typename l1::type, typename l2::type, typename l3::type\n            , typename l4::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<5> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        typedef lambda< typename F::arg3, Tag, false_ > l3;\n        typedef lambda< typename F::arg4, Tag, false_ > l4;\n        typedef lambda< typename F::arg5, Tag, false_ > l5;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        typedef typename l3::is_le is_le3;\n        typedef typename l4::is_le is_le4;\n        typedef typename l5::is_le is_le5;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le5)::value\n            > is_le;\n\n        typedef bind5<\n              typename F::rebind\n            , typename l1::type, typename l2::type, typename l3::type\n            , typename l4::type, typename l5::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\n} // namespace aux\n\ntemplate<\n      typename T\n    , typename Tag\n    , typename Protect\n    >\nstruct lambda\n{\n    /// Metafunction forwarding confuses MSVC 6.x\n    typedef typename aux::template_arity<T>::type arity_;\n    typedef typename aux::lambda_impl<arity_>\n        ::template result_< T,Tag,Protect > l_;\n\n    typedef typename l_::type type;\n    typedef typename l_::is_le is_le;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(3, lambda, (T, Tag, Protect))\n};\n\nBOOST_MPL_AUX_NA_SPEC2(1, 3, lambda)\n\ntemplate<\n      typename T\n    >\nstruct is_lambda_expression\n    : lambda<T>::is_le\n{\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/less.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/less.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct less_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< less_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< less_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct less_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct less_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct less_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct less_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct less\n\n    : less_impl<\n          typename less_tag<N1>::type\n        , typename less_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, less)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct less_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N2)::value > BOOST_MPL_AUX_VALUE_WKND(N1)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/less_equal.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/less_equal.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct less_equal_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< less_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< less_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct less_equal_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct less_equal_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct less_equal_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct less_equal_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct less_equal\n\n    : less_equal_impl<\n          typename less_equal_tag<N1>::type\n        , typename less_equal_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less_equal, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, less_equal)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct less_equal_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value <= BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/list.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/list.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct list;\n\ntemplate<\n     \n    >\nstruct list<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list0<  >\n{\n    typedef list0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct list<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list1<T0>\n{\n    typedef typename list1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct list<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list2< T0,T1 >\n{\n    typedef typename list2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct list<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list3< T0,T1,T2 >\n{\n    typedef typename list3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct list<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list4< T0,T1,T2,T3 >\n{\n    typedef typename list4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct list<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list5< T0,T1,T2,T3,T4 >\n{\n    typedef typename list5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename list6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename list7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename list8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename list9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename list10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename list11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : list12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename list12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : list13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename list13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : list14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename list14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : list15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename list15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : list16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename list16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : list17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename list17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : list18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename list18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : list19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename list19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct list\n    : list20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename list20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/list_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/list_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX\n    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX\n    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX\n    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX\n    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX\n    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX\n    , long C18 = LONG_MAX, long C19 = LONG_MAX\n    >\nstruct list_c;\n\ntemplate<\n      typename T\n    >\nstruct list_c<\n          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list0_c<T>\n{\n    typedef typename list0_c<T>::type type;\n};\n\ntemplate<\n      typename T, long C0\n    >\nstruct list_c<\n          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list1_c< T,C0 >\n{\n    typedef typename list1_c< T,C0 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1\n    >\nstruct list_c<\n          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list2_c< T,C0,C1 >\n{\n    typedef typename list2_c< T,C0,C1 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2\n    >\nstruct list_c<\n          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list3_c< T,C0,C1,C2 >\n{\n    typedef typename list3_c< T,C0,C1,C2 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list4_c< T,C0,C1,C2,C3 >\n{\n    typedef typename list4_c< T,C0,C1,C2,C3 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list5_c< T,C0,C1,C2,C3,C4 >\n{\n    typedef typename list5_c< T,C0,C1,C2,C3,C4 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list6_c< T,C0,C1,C2,C3,C4,C5 >\n{\n    typedef typename list6_c< T,C0,C1,C2,C3,C4,C5 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list7_c< T,C0,C1,C2,C3,C4,C5,C6 >\n{\n    typedef typename list7_c< T,C0,C1,C2,C3,C4,C5,C6 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX\n        >\n    : list8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >\n{\n    typedef typename list8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : list9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >\n{\n    typedef typename list9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : list10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >\n{\n    typedef typename list10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >\n{\n    typedef typename list11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >\n{\n    typedef typename list12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >\n{\n    typedef typename list13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list14_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        >\n{\n    typedef typename list14_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list15_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        >\n{\n    typedef typename list15_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list16_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15\n        >\n{\n    typedef typename list16_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list17_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16\n        >\n{\n    typedef typename list17_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, LONG_MAX, LONG_MAX\n        >\n    : list18_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17\n        >\n{\n    typedef typename list18_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, LONG_MAX\n        >\n    : list19_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18\n        >\n{\n    typedef typename list19_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n    >\nstruct list_c\n    : list20_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, C19\n        >\n{\n    typedef typename list20_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/map.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/map.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct map;\n\ntemplate<\n     \n    >\nstruct map<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map0<  >\n{\n    typedef map0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct map<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map1<T0>\n{\n    typedef typename map1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct map<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map2< T0,T1 >\n{\n    typedef typename map2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct map<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map3< T0,T1,T2 >\n{\n    typedef typename map3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct map<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map4< T0,T1,T2,T3 >\n{\n    typedef typename map4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct map<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map5< T0,T1,T2,T3,T4 >\n{\n    typedef typename map5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename map6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename map7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename map8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename map9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename map10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename map11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : map12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename map12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : map13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename map13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : map14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename map14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : map15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename map15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : map16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename map16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : map17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename map17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : map18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename map18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : map19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename map19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct map\n    : map20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename map20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/minus.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/minus.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct minus_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< minus_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< minus_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct minus_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct minus_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct minus_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct minus_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct minus\n    : minus< minus< minus< minus< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , minus\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct minus< N1,N2,N3,N4,na >\n\n    : minus< minus< minus< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , minus\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct minus< N1,N2,N3,na,na >\n\n    : minus< minus< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , minus\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct minus< N1,N2,na,na,na >\n    : minus_impl<\n          typename minus_tag<N1>::type\n        , typename minus_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , minus\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, minus)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct minus_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  - BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/modulus.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/modulus.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct modulus_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< modulus_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< modulus_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct modulus_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct modulus_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct modulus_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct modulus_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct modulus\n\n    : modulus_impl<\n          typename modulus_tag<N1>::type\n        , typename modulus_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, modulus, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, modulus)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct modulus_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  % BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/not_equal_to.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/not_equal_to.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct not_equal_to_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< not_equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< not_equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct not_equal_to_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct not_equal_to_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct not_equal_to_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct not_equal_to_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct not_equal_to\n\n    : not_equal_to_impl<\n          typename not_equal_to_tag<N1>::type\n        , typename not_equal_to_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, not_equal_to, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, not_equal_to)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct not_equal_to_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value != BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/or.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/or.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate< bool C_, typename T1, typename T2, typename T3, typename T4 >\nstruct or_impl\n    : true_\n{\n};\n\ntemplate< typename T1, typename T2, typename T3, typename T4 >\nstruct or_impl< false,T1,T2,T3,T4 >\n    : or_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        , T2, T3, T4\n        , false_\n        >\n{\n};\n\ntemplate<>\nstruct or_impl<\n          false\n        , false_, false_, false_, false_\n        >\n    : false_\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    , typename T3 = false_, typename T4 = false_, typename T5 = false_\n    >\nstruct or_\n\n    : aux::or_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        , T2, T3, T4, T5\n        >\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , or_\n        , ( T1, T2, T3, T4, T5)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC2(\n      2\n    , 5\n    , or_\n    )\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/placeholders.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n// Copyright Peter Dimov 2001-2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/placeholders.hpp\" header\n// -- DO NOT modify by hand!\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg< -1 > _;\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_;\n}\n\n}}\n\n/// agurt, 17/mar/02: one more placeholder for the last 'apply#' \n/// specialization\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<1> _1;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_1)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_1;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<2> _2;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_2)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_2;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<3> _3;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_3)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_3;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<4> _4;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_4)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_4;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<5> _5;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_5)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_5;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<6> _6;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_6)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_6;\n}\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/plus.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/plus.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct plus_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< plus_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< plus_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct plus_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct plus_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct plus_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct plus_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct plus\n    : plus< plus< plus< plus< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , plus\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct plus< N1,N2,N3,N4,na >\n\n    : plus< plus< plus< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , plus\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct plus< N1,N2,N3,na,na >\n\n    : plus< plus< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , plus\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct plus< N1,N2,na,na,na >\n    : plus_impl<\n          typename plus_tag<N1>::type\n        , typename plus_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , plus\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, plus)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct plus_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  + BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/quote.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/quote.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate< typename T, bool has_type_ >\nstruct quote_impl\n    : T\n{\n};\n\ntemplate< typename T >\nstruct quote_impl< T,false >\n{\n    typedef T type;\n};\n\ntemplate<\n      template< typename P1 > class F\n    , typename Tag = void_\n    >\nstruct quote1\n{\n    template< typename U1 > struct apply\n\n        : quote_impl<\n              F<U1>\n            , aux::has_type< F<U1> >::value\n            >\n\n    {\n    };\n};\n\ntemplate<\n      template< typename P1, typename P2 > class F\n    , typename Tag = void_\n    >\nstruct quote2\n{\n    template< typename U1, typename U2 > struct apply\n\n        : quote_impl<\n              F< U1,U2 >\n            , aux::has_type< F< U1,U2 > >::value\n            >\n\n    {\n    };\n};\n\ntemplate<\n      template< typename P1, typename P2, typename P3 > class F\n    , typename Tag = void_\n    >\nstruct quote3\n{\n    template< typename U1, typename U2, typename U3 > struct apply\n\n        : quote_impl<\n              F< U1,U2,U3 >\n            , aux::has_type< F< U1,U2,U3 > >::value\n            >\n\n    {\n    };\n};\n\ntemplate<\n      template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename Tag = void_\n    >\nstruct quote4\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4\n        >\n    struct apply\n\n        : quote_impl<\n              F< U1,U2,U3,U4 >\n            , aux::has_type< F< U1,U2,U3,U4 > >::value\n            >\n\n    {\n    };\n};\n\ntemplate<\n      template<\n          typename P1, typename P2, typename P3, typename P4\n        , typename P5\n        >\n      class F\n    , typename Tag = void_\n    >\nstruct quote5\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4\n        , typename U5\n        >\n    struct apply\n\n        : quote_impl<\n              F< U1,U2,U3,U4,U5 >\n            , aux::has_type< F< U1,U2,U3,U4,U5 > >::value\n            >\n\n    {\n    };\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/reverse_fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/reverse_fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl;\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< 0,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef fwd_state0 bkwd_state0;\n    typedef bkwd_state0 state;\n    typedef iter0 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< 1,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    \n\n    typedef fwd_state1 bkwd_state1;\n    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n    typedef bkwd_state0 state;\n    typedef iter1 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< 2,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    \n\n    typedef fwd_state2 bkwd_state2;\n    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef iter2 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< 3,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    \n\n    typedef fwd_state3 bkwd_state3;\n    typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;\n    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef iter3 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< 4,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef fwd_state4 bkwd_state4;\n    typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;\n    typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;\n    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef iter4 iterator;\n};\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef reverse_fold_impl<\n          ( (N - 4) < 0 ? 0 : N - 4 )\n        , iter4\n        , Last\n        , fwd_state4\n        , BackwardOp\n        , ForwardOp\n        > nested_chunk;\n\n    typedef typename nested_chunk::state bkwd_state4;\n    typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;\n    typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;\n    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef typename nested_chunk::iterator iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< -1,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef reverse_fold_impl<\n          -1\n        , typename mpl::next<First>::type\n        , Last\n        , typename apply2<ForwardOp,State, typename deref<First>::type>::type\n        , BackwardOp\n        , ForwardOp\n        > nested_step;\n\n    typedef typename apply2<\n          BackwardOp\n        , typename nested_step::state\n        , typename deref<First>::type\n        >::type state;\n\n    typedef typename nested_step::iterator iterator;\n};\n\ntemplate<\n      typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< -1,Last,Last,State,BackwardOp,ForwardOp >\n{\n    typedef State state;\n    typedef Last iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/reverse_iter_fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/reverse_iter_fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl;\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< 0,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef fwd_state0 bkwd_state0;\n    typedef bkwd_state0 state;\n    typedef iter0 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< 1,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    \n\n    typedef fwd_state1 bkwd_state1;\n    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n    typedef bkwd_state0 state;\n    typedef iter1 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< 2,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    \n\n    typedef fwd_state2 bkwd_state2;\n    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef iter2 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< 3,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    \n\n    typedef fwd_state3 bkwd_state3;\n    typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;\n    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef iter3 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< 4,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef fwd_state4 bkwd_state4;\n    typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;\n    typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;\n    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef iter4 iterator;\n};\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef reverse_iter_fold_impl<\n          ( (N - 4) < 0 ? 0 : N - 4 )\n        , iter4\n        , Last\n        , fwd_state4\n        , BackwardOp\n        , ForwardOp\n        > nested_chunk;\n\n    typedef typename nested_chunk::state bkwd_state4;\n    typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;\n    typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;\n    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef typename nested_chunk::iterator iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< -1,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef reverse_iter_fold_impl<\n          -1\n        , typename mpl::next<First>::type\n        , Last\n        , typename apply2< ForwardOp,State,First >::type\n        , BackwardOp\n        , ForwardOp\n        > nested_step;\n\n    typedef typename apply2<\n          BackwardOp\n        , typename nested_step::state\n        , First\n        >::type state;\n\n    typedef typename nested_step::iterator iterator;\n};\n\ntemplate<\n      typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< -1,Last,Last,State,BackwardOp,ForwardOp >\n{\n    typedef State state;\n    typedef Last iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/set.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/set.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct set;\n\ntemplate<\n     \n    >\nstruct set<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set0<  >\n{\n    typedef set0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct set<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set1<T0>\n{\n    typedef typename set1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct set<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set2< T0,T1 >\n{\n    typedef typename set2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct set<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set3< T0,T1,T2 >\n{\n    typedef typename set3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct set<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set4< T0,T1,T2,T3 >\n{\n    typedef typename set4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct set<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set5< T0,T1,T2,T3,T4 >\n{\n    typedef typename set5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename set6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename set7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename set8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename set9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename set10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename set11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : set12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename set12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : set13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename set13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : set14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename set14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : set15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename set15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : set16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename set16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : set17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename set17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : set18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename set18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : set19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename set19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct set\n    : set20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename set20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/set_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/set_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX\n    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX\n    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX\n    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX\n    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX\n    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX\n    , long C18 = LONG_MAX, long C19 = LONG_MAX\n    >\nstruct set_c;\n\ntemplate<\n      typename T\n    >\nstruct set_c<\n          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set0_c<T>\n{\n    typedef typename set0_c<T>::type type;\n};\n\ntemplate<\n      typename T, long C0\n    >\nstruct set_c<\n          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set1_c< T,C0 >\n{\n    typedef typename set1_c< T,C0 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1\n    >\nstruct set_c<\n          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set2_c< T,C0,C1 >\n{\n    typedef typename set2_c< T,C0,C1 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2\n    >\nstruct set_c<\n          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set3_c< T,C0,C1,C2 >\n{\n    typedef typename set3_c< T,C0,C1,C2 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set4_c< T,C0,C1,C2,C3 >\n{\n    typedef typename set4_c< T,C0,C1,C2,C3 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set5_c< T,C0,C1,C2,C3,C4 >\n{\n    typedef typename set5_c< T,C0,C1,C2,C3,C4 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set6_c< T,C0,C1,C2,C3,C4,C5 >\n{\n    typedef typename set6_c< T,C0,C1,C2,C3,C4,C5 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set7_c< T,C0,C1,C2,C3,C4,C5,C6 >\n{\n    typedef typename set7_c< T,C0,C1,C2,C3,C4,C5,C6 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX\n        >\n    : set8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >\n{\n    typedef typename set8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : set9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >\n{\n    typedef typename set9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : set10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >\n{\n    typedef typename set10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >\n{\n    typedef typename set11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >\n{\n    typedef typename set12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >\n{\n    typedef typename set13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set14_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        >\n{\n    typedef typename set14_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set15_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        >\n{\n    typedef typename set15_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set16_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15\n        >\n{\n    typedef typename set16_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set17_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16\n        >\n{\n    typedef typename set17_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, LONG_MAX, LONG_MAX\n        >\n    : set18_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17\n        >\n{\n    typedef typename set18_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, LONG_MAX\n        >\n    : set19_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18\n        >\n{\n    typedef typename set19_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n    >\nstruct set_c\n    : set20_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, C19\n        >\n{\n    typedef typename set20_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/shift_left.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/shift_left.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct shift_left_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< shift_left_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< shift_left_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct shift_left_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct shift_left_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct shift_left_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct shift_left_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct shift_left\n\n    : shift_left_impl<\n          typename shift_left_tag<N1>::type\n        , typename shift_left_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_left, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, shift_left)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct shift_left_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N, typename S > struct apply\n\n        : integral_c<\n              typename N::value_type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N)::value\n                  << BOOST_MPL_AUX_VALUE_WKND(S)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/shift_right.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/shift_right.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct shift_right_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< shift_right_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< shift_right_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct shift_right_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct shift_right_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct shift_right_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct shift_right_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct shift_right\n\n    : shift_right_impl<\n          typename shift_right_tag<N1>::type\n        , typename shift_right_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_right, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, shift_right)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct shift_right_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N, typename S > struct apply\n\n        : integral_c<\n              typename N::value_type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N)::value\n                  >> BOOST_MPL_AUX_VALUE_WKND(S)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/template_arity.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/template_arity.hpp\" header\n// -- DO NOT modify by hand!\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/times.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/times.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct times_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< times_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< times_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct times_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct times_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct times_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct times_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct times\n    : times< times< times< times< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , times\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct times< N1,N2,N3,N4,na >\n\n    : times< times< times< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , times\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct times< N1,N2,N3,na,na >\n\n    : times< times< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , times\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct times< N1,N2,na,na,na >\n    : times_impl<\n          typename times_tag<N1>::type\n        , typename times_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , times\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, times)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct times_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  * BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/unpack_args.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2002-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/unpack_args.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate< int size, typename F, typename Args >\nstruct unpack_args_impl;\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 0,F,Args >\n    : apply0<\n          F\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 1,F,Args >\n    : apply1<\n          F\n        , typename at_c< Args,0 >::type\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 2,F,Args >\n    : apply2<\n          F\n        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 3,F,Args >\n    : apply3<\n          F\n        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n        , typename at_c< Args,2 >::type\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 4,F,Args >\n    : apply4<\n          F\n        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n        , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 5,F,Args >\n    : apply5<\n          F\n        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n        , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type\n        , typename at_c< Args,4 >::type\n        >\n{\n};\n\n}\n\ntemplate<\n      typename F\n    >\nstruct unpack_args\n{\n    template< typename Args > struct apply\n\n        : aux::unpack_args_impl< size<Args>::value,F, Args >\n\n    {\n    };\n};\n\nBOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(1, unpack_args)\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/vector.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/vector.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct vector;\n\ntemplate<\n     \n    >\nstruct vector<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector0<  >\n{\n    typedef vector0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct vector<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector1<T0>\n{\n    typedef typename vector1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct vector<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector2< T0,T1 >\n{\n    typedef typename vector2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct vector<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector3< T0,T1,T2 >\n{\n    typedef typename vector3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct vector<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector4< T0,T1,T2,T3 >\n{\n    typedef typename vector4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector5< T0,T1,T2,T3,T4 >\n{\n    typedef typename vector5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename vector6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename vector7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename vector8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : vector15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename vector15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : vector16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename vector16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : vector17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename vector17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : vector18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename vector18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : vector19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename vector19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct vector\n    : vector20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename vector20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/dmc/vector_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/vector_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX\n    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX\n    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX\n    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX\n    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX\n    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX\n    , long C18 = LONG_MAX, long C19 = LONG_MAX\n    >\nstruct vector_c;\n\ntemplate<\n      typename T\n    >\nstruct vector_c<\n          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector0_c<T>\n{\n    typedef typename vector0_c<T>::type type;\n};\n\ntemplate<\n      typename T, long C0\n    >\nstruct vector_c<\n          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector1_c< T, T(C0) >\n{\n    typedef typename vector1_c< T, T(C0) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1\n    >\nstruct vector_c<\n          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector2_c< T, T(C0), T(C1) >\n{\n    typedef typename vector2_c< T, T(C0), T(C1) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2\n    >\nstruct vector_c<\n          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector3_c< T, T(C0), T(C1), T(C2) >\n{\n    typedef typename vector3_c< T, T(C0), T(C1), T(C2) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector4_c< T, T(C0), T(C1), T(C2), T(C3) >\n{\n    typedef typename vector4_c< T, T(C0), T(C1), T(C2), T(C3) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector5_c< T, T(C0), T(C1), T(C2), T(C3), T(C4) >\n{\n    typedef typename vector5_c< T, T(C0), T(C1), T(C2), T(C3), T(C4) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector6_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5) >\n{\n    typedef typename vector6_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector7_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6) >\n{\n    typedef typename vector7_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX\n        >\n    : vector8_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7) >\n{\n    typedef typename vector8_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : vector9_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8) >\n{\n    typedef typename vector9_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : vector10_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9) >\n{\n    typedef typename vector10_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector11_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10) >\n{\n    typedef typename vector11_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector12_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11) >\n{\n    typedef typename vector12_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector13_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12) >\n{\n    typedef typename vector13_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector14_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13) >\n{\n    typedef typename vector14_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector15_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14) >\n{\n    typedef typename vector15_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector16_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15) >\n{\n    typedef typename vector16_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector17_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16) >\n{\n    typedef typename vector17_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, LONG_MAX, LONG_MAX\n        >\n    : vector18_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17) >\n{\n    typedef typename vector18_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, LONG_MAX\n        >\n    : vector19_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18) >\n{\n    typedef typename vector19_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18) >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n    >\nstruct vector_c\n    : vector20_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19) >\n{\n    typedef typename vector20_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19) >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/advance_backward.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/advance_backward.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< long N > struct advance_backward;\ntemplate<>\nstruct advance_backward<0>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef iter0 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<1>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef iter1 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<2>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef typename prior<iter1>::type iter2;\n        typedef iter2 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<3>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef typename prior<iter1>::type iter2;\n        typedef typename prior<iter2>::type iter3;\n        typedef iter3 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<4>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef typename prior<iter1>::type iter2;\n        typedef typename prior<iter2>::type iter3;\n        typedef typename prior<iter3>::type iter4;\n        typedef iter4 type;\n    };\n};\n\ntemplate< long N >\nstruct advance_backward\n{\n    template< typename Iterator > struct apply\n    {\n        typedef typename apply_wrap1<\n              advance_backward<4>\n            , Iterator\n            >::type chunk_result_;\n\n        typedef typename apply_wrap1<\n              advance_backward<(\n                (N - 4) < 0\n                    ? 0\n                    : N - 4\n                    )>\n            , chunk_result_\n            >::type type;\n    };\n};\n\n}}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/advance_forward.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/advance_forward.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< long N > struct advance_forward;\ntemplate<>\nstruct advance_forward<0>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef iter0 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<1>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef iter1 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<2>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef typename next<iter1>::type iter2;\n        typedef iter2 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<3>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef typename next<iter1>::type iter2;\n        typedef typename next<iter2>::type iter3;\n        typedef iter3 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<4>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef typename next<iter1>::type iter2;\n        typedef typename next<iter2>::type iter3;\n        typedef typename next<iter3>::type iter4;\n        typedef iter4 type;\n    };\n};\n\ntemplate< long N >\nstruct advance_forward\n{\n    template< typename Iterator > struct apply\n    {\n        typedef typename apply_wrap1<\n              advance_forward<4>\n            , Iterator\n            >::type chunk_result_;\n\n        typedef typename apply_wrap1<\n              advance_forward<(\n                (N - 4) < 0\n                    ? 0\n                    : N - 4\n                    )>\n            , chunk_result_\n            >::type type;\n    };\n};\n\n}}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/and.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/and.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate< bool C_, typename T1, typename T2, typename T3, typename T4 >\nstruct and_impl\n    : false_\n{\n};\n\ntemplate< typename T1, typename T2, typename T3, typename T4 >\nstruct and_impl< true,T1,T2,T3,T4 >\n    : and_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        , T2, T3, T4\n        , true_\n        >\n{\n};\n\ntemplate<>\nstruct and_impl<\n          true\n        , true_, true_, true_, true_\n        >\n    : true_\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    , typename T3 = true_, typename T4 = true_, typename T5 = true_\n    >\nstruct and_\n\n    : aux::and_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        , T2, T3, T4, T5\n        >\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , and_\n        , ( T1, T2, T3, T4, T5)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC2(\n      2\n    , 5\n    , and_\n    )\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/apply.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/apply.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F\n    >\nstruct apply0\n\n    : apply_wrap0<\n          typename lambda<F>::type\n       \n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          1\n        , apply0\n        , (F )\n        )\n};\n\ntemplate<\n      typename F\n    >\nstruct apply< F,na,na,na,na,na >\n    : apply0<F>\n{\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply1\n\n    : apply_wrap1<\n          typename lambda<F>::type\n        , T1\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          2\n        , apply1\n        , (F, T1)\n        )\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply< F,T1,na,na,na,na >\n    : apply1< F,T1 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply2\n\n    : apply_wrap2<\n          typename lambda<F>::type\n        , T1, T2\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          3\n        , apply2\n        , (F, T1, T2)\n        )\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply< F,T1,T2,na,na,na >\n    : apply2< F,T1,T2 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply3\n\n    : apply_wrap3<\n          typename lambda<F>::type\n        , T1, T2, T3\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          4\n        , apply3\n        , (F, T1, T2, T3)\n        )\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply< F,T1,T2,T3,na,na >\n    : apply3< F,T1,T2,T3 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply4\n\n    : apply_wrap4<\n          typename lambda<F>::type\n        , T1, T2, T3, T4\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , apply4\n        , (F, T1, T2, T3, T4)\n        )\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply< F,T1,T2,T3,T4,na >\n    : apply4< F,T1,T2,T3,T4 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply5\n\n    : apply_wrap5<\n          typename lambda<F>::type\n        , T1, T2, T3, T4, T5\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          6\n        , apply5\n        , (F, T1, T2, T3, T4, T5)\n        )\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply\n    : apply5< F,T1,T2,T3,T4,T5 >\n{\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/apply_fwd.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/apply_fwd.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na\n    >\nstruct apply;\n\ntemplate<\n      typename F\n    >\nstruct apply0;\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply1;\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply2;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply3;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply4;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply5;\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/apply_wrap.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/apply_wrap.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F\n\n    , typename has_apply_ = typename aux::has_apply<F>::type\n\n    >\nstruct apply_wrap0\n\n    : F::template apply<  >\n{\n};\n\ntemplate< typename F >\nstruct apply_wrap0< F,true_ >\n    : F::apply\n{\n};\n\ntemplate<\n      typename F, typename T1\n\n    >\nstruct apply_wrap1\n\n    : F::template apply<T1>\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n\n    >\nstruct apply_wrap2\n\n    : F::template apply< T1,T2 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n\n    >\nstruct apply_wrap3\n\n    : F::template apply< T1,T2,T3 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n\n    >\nstruct apply_wrap4\n\n    : F::template apply< T1,T2,T3,T4 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n\n    >\nstruct apply_wrap5\n\n    : F::template apply< T1,T2,T3,T4,T5 >\n{\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/arg.hpp",
    "content": "\n// Copyright Peter Dimov 2001-2002\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/arg.hpp\" header\n// -- DO NOT modify by hand!\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntemplate<> struct arg< -1 >\n{\n    BOOST_STATIC_CONSTANT(int, value  = -1);\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U1 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<1>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 1);\n    typedef arg<2> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U1 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<2>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 2);\n    typedef arg<3> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U2 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<3>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 3);\n    typedef arg<4> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U3 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<4>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 4);\n    typedef arg<5> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U4 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<5>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 5);\n    typedef arg<6> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U5 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\nBOOST_MPL_AUX_NONTYPE_ARITY_SPEC(1,int, arg)\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/basic_bind.hpp",
    "content": "\n// Copyright Peter Dimov 2001\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/basic_bind.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      typename T, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg\n{\n    typedef T type;\n};\n\ntemplate<\n      int N, typename U1, typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 >\n{\n    typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg< bind< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5 >\n{\n    typedef bind< F,T1,T2,T3,T4,T5 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename F\n    >\nstruct bind0\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n\n     public:\n        typedef typename apply_wrap0<\n              f_\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg<\n      bind0<F>, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind0<F> f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(1, bind0)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)\n\ntemplate<\n      typename F\n    >\nstruct bind< F,na,na,na,na,na >\n    : bind0<F>\n{\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind1\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n\n     public:\n        typedef typename apply_wrap1<\n              f_\n            , typename t1::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename U1, typename U2, typename U3\n    , typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind1< F,T1 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind1< F,T1 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(2, bind1)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind< F,T1,na,na,na,na >\n    : bind1< F,T1 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind2\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n\n     public:\n        typedef typename apply_wrap2<\n              f_\n            , typename t1::type, typename t2::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename U1, typename U2\n    , typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind2< F,T1,T2 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind2< F,T1,T2 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(3, bind2)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind< F,T1,T2,na,na,na >\n    : bind2< F,T1,T2 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind3\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n\n     public:\n        typedef typename apply_wrap3<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename U1\n    , typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind3< F,T1,T2,T3 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(4, bind3)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind< F,T1,T2,T3,na,na >\n    : bind3< F,T1,T2,T3 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind4\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;\n\n     public:\n        typedef typename apply_wrap4<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename U1, typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind4< F,T1,T2,T3,T4 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(5, bind4)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind< F,T1,T2,T3,T4,na >\n    : bind4< F,T1,T2,T3,T4 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind5\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;\n        typedef aux::resolve_bind_arg< T5,U1,U2,U3,U4,U5 > t5;\n\n     public:\n        typedef typename apply_wrap5<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type, typename t5::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg<\n      bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind5< F,T1,T2,T3,T4,T5 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(6, bind5)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind\n    : bind5< F,T1,T2,T3,T4,T5 >\n{\n};\n\n/// if_/eval_if specializations\ntemplate< template< typename T1, typename T2, typename T3 > class F, typename Tag >\nstruct quote3;\n\ntemplate< typename T1, typename T2, typename T3 > struct if_;\n\ntemplate<\n      typename Tag, typename T1, typename T2, typename T3\n    >\nstruct bind3<\n      quote3< if_,Tag >\n    , T1, T2, T3\n    >\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef mpl::arg<1> n1;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n        typedef typename if_<\n              typename t1::type\n            , t2, t3\n            >::type f_;\n\n     public:\n        typedef typename f_::type type;\n    };\n};\n\ntemplate<\n      template< typename T1, typename T2, typename T3 > class F, typename Tag\n    >\nstruct quote3;\n\ntemplate< typename T1, typename T2, typename T3 > struct eval_if;\n\ntemplate<\n      typename Tag, typename T1, typename T2, typename T3\n    >\nstruct bind3<\n      quote3< eval_if,Tag >\n    , T1, T2, T3\n    >\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef mpl::arg<1> n1;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n        typedef typename eval_if<\n              typename t1::type\n            , t2, t3\n            >::type f_;\n\n     public:\n        typedef typename f_::type type;\n    };\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/bind.hpp",
    "content": "\n// Copyright Peter Dimov 2001\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bind.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      typename T, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg\n{\n    typedef T type;\n};\n\ntemplate<\n      typename T\n    , typename Arg\n    >\nstruct replace_unnamed_arg\n{\n    typedef Arg next;\n    typedef T type;\n};\n\ntemplate<\n      typename Arg\n    >\nstruct replace_unnamed_arg< arg< -1 >, Arg >\n{\n    typedef typename Arg::next next;\n    typedef Arg type;\n};\n\ntemplate<\n      int N, typename U1, typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 >\n{\n    typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg< bind< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5 >\n{\n    typedef bind< F,T1,T2,T3,T4,T5 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename F\n    >\nstruct bind0\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n     public:\n        typedef typename apply_wrap0<\n              f_\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg<\n      bind0<F>, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind0<F> f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(1, bind0)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)\n\ntemplate<\n      typename F\n    >\nstruct bind< F,na,na,na,na,na >\n    : bind0<F>\n{\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind1\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n     public:\n        typedef typename apply_wrap1<\n              f_\n            , typename t1::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename U1, typename U2, typename U3\n    , typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind1< F,T1 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind1< F,T1 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(2, bind1)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind< F,T1,na,na,na,na >\n    : bind1< F,T1 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind2\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n     public:\n        typedef typename apply_wrap2<\n              f_\n            , typename t1::type, typename t2::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename U1, typename U2\n    , typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind2< F,T1,T2 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind2< F,T1,T2 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(3, bind2)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind< F,T1,T2,na,na,na >\n    : bind2< F,T1,T2 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind3\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n     public:\n        typedef typename apply_wrap3<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename U1\n    , typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind3< F,T1,T2,T3 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(4, bind3)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind< F,T1,T2,T3,na,na >\n    : bind3< F,T1,T2,T3 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind4\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n        typedef aux::replace_unnamed_arg< T4,n4 > r4;\n        typedef typename r4::type a4;\n        typedef typename r4::next n5;\n        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;\n        ///\n     public:\n        typedef typename apply_wrap4<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename U1, typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind4< F,T1,T2,T3,T4 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(5, bind4)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind< F,T1,T2,T3,T4,na >\n    : bind4< F,T1,T2,T3,T4 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind5\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n        typedef aux::replace_unnamed_arg< T4,n4 > r4;\n        typedef typename r4::type a4;\n        typedef typename r4::next n5;\n        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;\n        ///\n        typedef aux::replace_unnamed_arg< T5,n5 > r5;\n        typedef typename r5::type a5;\n        typedef typename r5::next n6;\n        typedef aux::resolve_bind_arg< a5,U1,U2,U3,U4,U5 > t5;\n        ///\n     public:\n        typedef typename apply_wrap5<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type, typename t5::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg<\n      bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind5< F,T1,T2,T3,T4,T5 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(6, bind5)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind\n    : bind5< F,T1,T2,T3,T4,T5 >\n{\n};\n\n/// if_/eval_if specializations\ntemplate< template< typename T1, typename T2, typename T3 > class F, typename Tag >\nstruct quote3;\n\ntemplate< typename T1, typename T2, typename T3 > struct if_;\n\ntemplate<\n      typename Tag, typename T1, typename T2, typename T3\n    >\nstruct bind3<\n      quote3< if_,Tag >\n    , T1, T2, T3\n    >\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef mpl::arg<1> n1;\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n        typedef typename if_<\n              typename t1::type\n            , t2, t3\n            >::type f_;\n\n     public:\n        typedef typename f_::type type;\n    };\n};\n\ntemplate<\n      template< typename T1, typename T2, typename T3 > class F, typename Tag\n    >\nstruct quote3;\n\ntemplate< typename T1, typename T2, typename T3 > struct eval_if;\n\ntemplate<\n      typename Tag, typename T1, typename T2, typename T3\n    >\nstruct bind3<\n      quote3< eval_if,Tag >\n    , T1, T2, T3\n    >\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef mpl::arg<1> n1;\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n        typedef typename eval_if<\n              typename t1::type\n            , t2, t3\n            >::type f_;\n\n     public:\n        typedef typename f_::type type;\n    };\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/bind_fwd.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bind_fwd.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na\n    >\nstruct bind;\n\ntemplate<\n      typename F\n    >\nstruct bind0;\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind1;\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind2;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind3;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind4;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind5;\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/bitand.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bitand.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct bitand_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< bitand_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< bitand_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct bitand_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitand_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitand_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct bitand_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct bitand_\n    : bitand_< bitand_< bitand_< bitand_< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , bitand_\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct bitand_< N1,N2,N3,N4,na >\n\n    : bitand_< bitand_< bitand_< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitand_\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct bitand_< N1,N2,N3,na,na >\n\n    : bitand_< bitand_< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitand_\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct bitand_< N1,N2,na,na,na >\n    : bitand_impl<\n          typename bitand_tag<N1>::type\n        , typename bitand_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitand_\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, bitand_)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct bitand_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  & BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/bitor.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bitor.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct bitor_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< bitor_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< bitor_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct bitor_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitor_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitor_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct bitor_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct bitor_\n    : bitor_< bitor_< bitor_< bitor_< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , bitor_\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct bitor_< N1,N2,N3,N4,na >\n\n    : bitor_< bitor_< bitor_< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitor_\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct bitor_< N1,N2,N3,na,na >\n\n    : bitor_< bitor_< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitor_\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct bitor_< N1,N2,na,na,na >\n    : bitor_impl<\n          typename bitor_tag<N1>::type\n        , typename bitor_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitor_\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, bitor_)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct bitor_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  | BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/bitxor.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bitxor.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct bitxor_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< bitxor_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< bitxor_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct bitxor_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitxor_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitxor_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct bitxor_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct bitxor_\n    : bitxor_< bitxor_< bitxor_< bitxor_< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , bitxor_\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct bitxor_< N1,N2,N3,N4,na >\n\n    : bitxor_< bitxor_< bitxor_< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitxor_\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct bitxor_< N1,N2,N3,na,na >\n\n    : bitxor_< bitxor_< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitxor_\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct bitxor_< N1,N2,na,na,na >\n    : bitxor_impl<\n          typename bitxor_tag<N1>::type\n        , typename bitxor_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitxor_\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, bitxor_)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct bitxor_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  ^ BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/deque.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/deque.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct deque;\n\ntemplate<\n     \n    >\nstruct deque<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector0<  >\n{\n    typedef vector0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct deque<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector1<T0>\n{\n    typedef typename vector1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct deque<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector2< T0,T1 >\n{\n    typedef typename vector2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct deque<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector3< T0,T1,T2 >\n{\n    typedef typename vector3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct deque<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector4< T0,T1,T2,T3 >\n{\n    typedef typename vector4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector5< T0,T1,T2,T3,T4 >\n{\n    typedef typename vector5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename vector6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename vector7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename vector8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : vector15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename vector15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : vector16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename vector16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : vector17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename vector17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : vector18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename vector18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : vector19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename vector19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct deque\n    : vector20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename vector20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/divides.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/divides.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct divides_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< divides_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< divides_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct divides_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct divides_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct divides_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct divides_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct divides\n    : divides< divides< divides< divides< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , divides\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct divides< N1,N2,N3,N4,na >\n\n    : divides< divides< divides< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , divides\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct divides< N1,N2,N3,na,na >\n\n    : divides< divides< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , divides\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct divides< N1,N2,na,na,na >\n    : divides_impl<\n          typename divides_tag<N1>::type\n        , typename divides_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , divides\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, divides)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct divides_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  / BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/equal_to.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/equal_to.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct equal_to_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct equal_to_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct equal_to_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct equal_to_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct equal_to_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct equal_to\n\n    : equal_to_impl<\n          typename equal_to_tag<N1>::type\n        , typename equal_to_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, equal_to, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, equal_to)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct equal_to_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value  == BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl;\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 0,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef state0 state;\n    typedef iter0 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 1,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    \n\n    typedef state1 state;\n    typedef iter1 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 2,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    \n\n    typedef state2 state;\n    typedef iter2 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 3,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    \n\n    typedef state3 state;\n    typedef iter3 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 4,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp, state3, typename deref<iter3>::type >::type state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef state4 state;\n    typedef iter4 iterator;\n};\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl\n{\n    typedef fold_impl<\n          4\n        , First\n        , Last\n        , State\n        , ForwardOp\n        > chunk_;\n\n    typedef fold_impl<\n          ( (N - 4) < 0 ? 0 : N - 4 )\n        , typename chunk_::iterator\n        , Last\n        , typename chunk_::state\n        , ForwardOp\n        > res_;\n\n    typedef typename res_::state state;\n    typedef typename res_::iterator iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< -1,First,Last,State,ForwardOp >\n    : fold_impl<\n          -1\n        , typename mpl::next<First>::type\n        , Last\n        , typename apply2<ForwardOp,State, typename deref<First>::type>::type\n        , ForwardOp\n        >\n{\n};\n\ntemplate<\n      typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< -1,Last,Last,State,ForwardOp >\n{\n    typedef State state;\n    typedef Last iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/full_lambda.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/full_lambda.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false\n    , bool C5 = false\n    >\nstruct lambda_or\n    : true_\n{\n};\n\ntemplate<>\nstruct lambda_or< false,false,false,false,false >\n    : false_\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename T\n    , typename Tag\n    , typename Arity\n    >\nstruct lambda\n{\n    typedef false_ is_le;\n    typedef T result_;\n    typedef T type;\n};\n\ntemplate<\n      typename T\n    >\nstruct is_lambda_expression\n    : lambda<T>::is_le\n{\n};\n\ntemplate< int N, typename Tag >\nstruct lambda< arg<N>,Tag, int_< -1 > >\n{\n    typedef true_ is_le;\n    typedef mpl::arg<N> result_; // qualified for the sake of MIPSpro 7.41\n    typedef mpl::protect<result_> type;\n};\n\ntemplate<\n      typename F\n    , typename Tag\n    >\nstruct lambda<\n          bind0<F>\n        , Tag\n        , int_<1>\n        >\n{\n    typedef false_ is_le;\n    typedef bind0<\n          F\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1 > class F\n    , typename L1\n    >\nstruct le_result1\n{\n    typedef F<\n          typename L1::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1 > class F\n    , typename L1\n    >\nstruct le_result1< true_,Tag,F,L1 >\n{\n    typedef bind1<\n          quote1< F,Tag >\n        , typename L1::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1 > class F\n    , typename T1\n    , typename Tag\n    >\nstruct lambda<\n          F<T1>\n        , Tag\n        , int_<1>\n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef typename l1::is_le is_le1;\n    typedef typename aux::lambda_or<\n          is_le1::value\n        >::type is_le;\n\n    typedef aux::le_result1<\n          is_le, Tag, F, l1\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1\n    , typename Tag\n    >\nstruct lambda<\n          bind1< F,T1 >\n        , Tag\n        , int_<2>\n        >\n{\n    typedef false_ is_le;\n    typedef bind1<\n          F\n        , T1\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2 > class F\n    , typename L1, typename L2\n    >\nstruct le_result2\n{\n    typedef F<\n          typename L1::type, typename L2::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2 > class F\n    , typename L1, typename L2\n    >\nstruct le_result2< true_,Tag,F,L1,L2 >\n{\n    typedef bind2<\n          quote2< F,Tag >\n        , typename L1::result_, typename L2::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1, typename P2 > class F\n    , typename T1, typename T2\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2 >\n        , Tag\n        , int_<2>\n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value\n        >::type is_le;\n\n    typedef aux::le_result2<\n          is_le, Tag, F, l1, l2\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    , typename Tag\n    >\nstruct lambda<\n          bind2< F,T1,T2 >\n        , Tag\n        , int_<3>\n        >\n{\n    typedef false_ is_le;\n    typedef bind2<\n          F\n        , T1, T2\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2, typename P3 > class F\n    , typename L1, typename L2, typename L3\n    >\nstruct le_result3\n{\n    typedef F<\n          typename L1::type, typename L2::type, typename L3::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2, typename P3 > class F\n    , typename L1, typename L2, typename L3\n    >\nstruct le_result3< true_,Tag,F,L1,L2,L3 >\n{\n    typedef bind3<\n          quote3< F,Tag >\n        , typename L1::result_, typename L2::result_, typename L3::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1, typename P2, typename P3 > class F\n    , typename T1, typename T2, typename T3\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2,T3 >\n        , Tag\n        , int_<3>\n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    typedef lambda< T3,Tag > l3;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    typedef typename l3::is_le is_le3;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value, is_le3::value\n        >::type is_le;\n\n    typedef aux::le_result3<\n          is_le, Tag, F, l1, l2, l3\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    , typename Tag\n    >\nstruct lambda<\n          bind3< F,T1,T2,T3 >\n        , Tag\n        , int_<4>\n        >\n{\n    typedef false_ is_le;\n    typedef bind3<\n          F\n        , T1, T2, T3\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename L1, typename L2, typename L3, typename L4\n    >\nstruct le_result4\n{\n    typedef F<\n          typename L1::type, typename L2::type, typename L3::type\n        , typename L4::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename L1, typename L2, typename L3, typename L4\n    >\nstruct le_result4< true_,Tag,F,L1,L2,L3,L4 >\n{\n    typedef bind4<\n          quote4< F,Tag >\n        , typename L1::result_, typename L2::result_, typename L3::result_\n        , typename L4::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename T1, typename T2, typename T3, typename T4\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2,T3,T4 >\n        , Tag\n        , int_<4>\n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    typedef lambda< T3,Tag > l3;\n    typedef lambda< T4,Tag > l4;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    typedef typename l3::is_le is_le3;\n    typedef typename l4::is_le is_le4;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value, is_le3::value, is_le4::value\n        >::type is_le;\n\n    typedef aux::le_result4<\n          is_le, Tag, F, l1, l2, l3, l4\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename Tag\n    >\nstruct lambda<\n          bind4< F,T1,T2,T3,T4 >\n        , Tag\n        , int_<5>\n        >\n{\n    typedef false_ is_le;\n    typedef bind4<\n          F\n        , T1, T2, T3, T4\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F\n    , typename L1, typename L2, typename L3, typename L4, typename L5\n    >\nstruct le_result5\n{\n    typedef F<\n          typename L1::type, typename L2::type, typename L3::type\n        , typename L4::type, typename L5::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F\n    , typename L1, typename L2, typename L3, typename L4, typename L5\n    >\nstruct le_result5< true_,Tag,F,L1,L2,L3,L4,L5 >\n{\n    typedef bind5<\n          quote5< F,Tag >\n        , typename L1::result_, typename L2::result_, typename L3::result_\n        , typename L4::result_, typename L5::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template<\n          typename P1, typename P2, typename P3, typename P4\n        , typename P5\n        >\n      class F\n    , typename T1, typename T2, typename T3, typename T4, typename T5\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2,T3,T4,T5 >\n        , Tag\n        , int_<5>\n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    typedef lambda< T3,Tag > l3;\n    typedef lambda< T4,Tag > l4;\n    typedef lambda< T5,Tag > l5;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    typedef typename l3::is_le is_le3;\n    typedef typename l4::is_le is_le4;\n    typedef typename l5::is_le is_le5;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value, is_le3::value, is_le4::value\n        , is_le5::value\n        >::type is_le;\n\n    typedef aux::le_result5<\n          is_le, Tag, F, l1, l2, l3, l4, l5\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    , typename Tag\n    >\nstruct lambda<\n          bind5< F,T1,T2,T3,T4,T5 >\n        , Tag\n        , int_<6>\n        >\n{\n    typedef false_ is_le;\n    typedef bind5<\n          F\n        , T1, T2, T3, T4, T5\n        > result_;\n\n    typedef result_ type;\n};\n\n/// special case for 'protect'\ntemplate< typename T, typename Tag >\nstruct lambda< mpl::protect<T>,Tag, int_<1> >\n{\n    typedef false_ is_le;\n    typedef mpl::protect<T> result_;\n    typedef result_ type;\n};\n\n/// specializations for the main 'bind' form\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    , typename Tag\n    >\nstruct lambda<\n          bind< F,T1,T2,T3,T4,T5 >\n        , Tag\n        , int_<6>\n        >\n{\n    typedef false_ is_le;\n    typedef bind< F,T1,T2,T3,T4,T5 > result_;\n    typedef result_ type;\n};\n\ntemplate<\n      typename F\n    , typename Tag1\n    , typename Tag2\n    , typename Arity\n    >\nstruct lambda<\n          lambda< F,Tag1,Arity >\n        , Tag2\n        , int_<3>\n        >\n{\n    typedef lambda< F,Tag2 > l1;\n    typedef lambda< Tag1,Tag2 > l2;\n    typedef typename l1::is_le is_le;\n    typedef bind1< quote1<aux::template_arity>, typename l1::result_ > arity_;\n    typedef lambda< typename if_< is_le,arity_,Arity >::type, Tag2 > l3;\n    typedef aux::le_result3<is_le, Tag2, mpl::lambda, l1, l2, l3> le_result_;\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 3, lambda)\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/greater.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/greater.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct greater_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< greater_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< greater_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct greater_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct greater_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct greater_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct greater_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct greater\n\n    : greater_impl<\n          typename greater_tag<N1>::type\n        , typename greater_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, greater)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct greater_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value > BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/greater_equal.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/greater_equal.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct greater_equal_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< greater_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< greater_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct greater_equal_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct greater_equal_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct greater_equal_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct greater_equal_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct greater_equal\n\n    : greater_equal_impl<\n          typename greater_equal_tag<N1>::type\n        , typename greater_equal_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater_equal, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, greater_equal)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct greater_equal_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value >= BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/inherit.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/inherit.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    >\nstruct inherit2\n    : T1, T2\n{\n    typedef inherit2 type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, inherit2, (T1, T2))\n};\n\ntemplate< typename T1 >\nstruct inherit2< T1,empty_base >\n{\n    typedef T1 type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (T1, empty_base))\n};\n\ntemplate< typename T2 >\nstruct inherit2< empty_base,T2 >\n{\n    typedef T2 type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base, T2))\n};\n\ntemplate<>\nstruct inherit2< empty_base,empty_base >\n{\n    typedef empty_base type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base, empty_base))\n};\n\nBOOST_MPL_AUX_NA_SPEC(2, inherit2)\n\ntemplate<\n      typename T1 = na, typename T2 = na, typename T3 = na\n    >\nstruct inherit3\n    : inherit2<\n          typename inherit2<\n              T1, T2\n            >::type\n        , T3\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          3\n        , inherit3\n        , ( T1, T2, T3)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC(3, inherit3)\n\ntemplate<\n      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na\n    >\nstruct inherit4\n    : inherit2<\n          typename inherit3<\n              T1, T2, T3\n            >::type\n        , T4\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          4\n        , inherit4\n        , ( T1, T2, T3, T4)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC(4, inherit4)\n\ntemplate<\n      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na\n    , typename T5 = na\n    >\nstruct inherit5\n    : inherit2<\n          typename inherit4<\n              T1, T2, T3, T4\n            >::type\n        , T5\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , inherit5\n        , ( T1, T2, T3, T4, T5)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC(5, inherit5)\n\n/// primary template\n\ntemplate<\n      typename T1 = empty_base, typename T2 = empty_base\n    , typename T3 = empty_base, typename T4 = empty_base\n    , typename T5 = empty_base\n    >\nstruct inherit\n    : inherit5< T1,T2,T3,T4,T5 >\n{\n};\n\ntemplate<>\nstruct inherit< na,na,na,na,na >\n{\n    template<\n\n          typename T1 = empty_base, typename T2 = empty_base\n        , typename T3 = empty_base, typename T4 = empty_base\n        , typename T5 = empty_base\n\n        >\n    struct apply\n        : inherit< T1,T2,T3,T4,T5 >\n    {\n    };\n};\n\nBOOST_MPL_AUX_NA_SPEC_LAMBDA(5, inherit)\nBOOST_MPL_AUX_NA_SPEC_ARITY(5, inherit)\nBOOST_MPL_AUX_NA_SPEC_TEMPLATE_ARITY(5, 5, inherit)\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/iter_fold_if_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n// Copyright David Abrahams 2001-2002\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/iter_fold_if_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< typename Iterator, typename State >\nstruct iter_fold_if_null_step\n{\n    typedef State state;\n    typedef Iterator iterator;\n};\n\ntemplate< bool >\nstruct iter_fold_if_step_impl\n{\n    template<\n          typename Iterator\n        , typename State\n        , typename StateOp\n        , typename IteratorOp\n        >\n    struct result_\n    {\n        typedef typename apply2< StateOp,State,Iterator >::type state;\n        typedef typename IteratorOp::type iterator;\n    };\n};\n\ntemplate<>\nstruct iter_fold_if_step_impl<false>\n{\n    template<\n          typename Iterator\n        , typename State\n        , typename StateOp\n        , typename IteratorOp\n        >\n    struct result_\n    {\n        typedef State state;\n        typedef Iterator iterator;\n    };\n};\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename ForwardOp\n    , typename Predicate\n    >\nstruct iter_fold_if_forward_step\n{\n    typedef typename apply2< Predicate,State,Iterator >::type not_last;\n    typedef typename iter_fold_if_step_impl<\n          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value\n        >::template result_< Iterator,State,ForwardOp, mpl::next<Iterator> > impl_;\n\n    typedef typename impl_::state state;\n    typedef typename impl_::iterator iterator;\n};\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename BackwardOp\n    , typename Predicate\n    >\nstruct iter_fold_if_backward_step\n{\n    typedef typename apply2< Predicate,State,Iterator >::type not_last;\n    typedef typename iter_fold_if_step_impl<\n          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value\n        >::template result_< Iterator,State,BackwardOp, identity<Iterator> > impl_;\n\n    typedef typename impl_::state state;\n    typedef typename impl_::iterator iterator;\n};\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename ForwardOp\n    , typename ForwardPredicate\n    , typename BackwardOp\n    , typename BackwardPredicate\n    >\nstruct iter_fold_if_impl\n{\n private:\n    typedef iter_fold_if_null_step< Iterator,State > forward_step0;\n    typedef iter_fold_if_forward_step< typename forward_step0::iterator, typename forward_step0::state, ForwardOp, ForwardPredicate > forward_step1;\n    typedef iter_fold_if_forward_step< typename forward_step1::iterator, typename forward_step1::state, ForwardOp, ForwardPredicate > forward_step2;\n    typedef iter_fold_if_forward_step< typename forward_step2::iterator, typename forward_step2::state, ForwardOp, ForwardPredicate > forward_step3;\n    typedef iter_fold_if_forward_step< typename forward_step3::iterator, typename forward_step3::state, ForwardOp, ForwardPredicate > forward_step4;\n    \n\n    typedef typename if_<\n          typename forward_step4::not_last\n        , iter_fold_if_impl<\n              typename forward_step4::iterator\n            , typename forward_step4::state\n            , ForwardOp\n            , ForwardPredicate\n            , BackwardOp\n            , BackwardPredicate\n            >\n        , iter_fold_if_null_step<\n              typename forward_step4::iterator\n            , typename forward_step4::state\n            >\n        >::type backward_step4;\n\n    typedef iter_fold_if_backward_step< typename forward_step3::iterator, typename backward_step4::state, BackwardOp, BackwardPredicate > backward_step3;\n    typedef iter_fold_if_backward_step< typename forward_step2::iterator, typename backward_step3::state, BackwardOp, BackwardPredicate > backward_step2;\n    typedef iter_fold_if_backward_step< typename forward_step1::iterator, typename backward_step2::state, BackwardOp, BackwardPredicate > backward_step1;\n    typedef iter_fold_if_backward_step< typename forward_step0::iterator, typename backward_step1::state, BackwardOp, BackwardPredicate > backward_step0;\n    \n\n public:\n    typedef typename backward_step0::state state;\n    typedef typename backward_step4::iterator iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/iter_fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/iter_fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl;\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 0,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef state0 state;\n    typedef iter0 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 1,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    \n\n    typedef state1 state;\n    typedef iter1 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 2,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    \n\n    typedef state2 state;\n    typedef iter2 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 3,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp,state2,iter2 >::type state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    \n\n    typedef state3 state;\n    typedef iter3 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 4,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp,state2,iter2 >::type state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp,state3,iter3 >::type state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef state4 state;\n    typedef iter4 iterator;\n};\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl\n{\n    typedef iter_fold_impl<\n          4\n        , First\n        , Last\n        , State\n        , ForwardOp\n        > chunk_;\n\n    typedef iter_fold_impl<\n          ( (N - 4) < 0 ? 0 : N - 4 )\n        , typename chunk_::iterator\n        , Last\n        , typename chunk_::state\n        , ForwardOp\n        > res_;\n\n    typedef typename res_::state state;\n    typedef typename res_::iterator iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< -1,First,Last,State,ForwardOp >\n    : iter_fold_impl<\n          -1\n        , typename mpl::next<First>::type\n        , Last\n        , typename apply2< ForwardOp,State,First >::type\n        , ForwardOp\n        >\n{\n};\n\ntemplate<\n      typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< -1,Last,Last,State,ForwardOp >\n{\n    typedef State state;\n    typedef Last iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/lambda_no_ctps.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/lambda_no_ctps.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false\n    , bool C5 = false\n    >\nstruct lambda_or\n    : true_\n{\n};\n\ntemplate<>\nstruct lambda_or< false,false,false,false,false >\n    : false_\n{\n};\n\ntemplate< typename Arity > struct lambda_impl\n{\n    template< typename T, typename Tag, typename Protect > struct result_\n    {\n        typedef T type;\n        typedef is_placeholder<T> is_le;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<1> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef typename l1::is_le is_le1;\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value\n            > is_le;\n\n        typedef bind1<\n              typename F::rebind\n            , typename l1::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<2> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value\n            > is_le;\n\n        typedef bind2<\n              typename F::rebind\n            , typename l1::type, typename l2::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<3> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        typedef lambda< typename F::arg3, Tag, false_ > l3;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        typedef typename l3::is_le is_le3;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value\n            > is_le;\n\n        typedef bind3<\n              typename F::rebind\n            , typename l1::type, typename l2::type, typename l3::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<4> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        typedef lambda< typename F::arg3, Tag, false_ > l3;\n        typedef lambda< typename F::arg4, Tag, false_ > l4;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        typedef typename l3::is_le is_le3;\n        typedef typename l4::is_le is_le4;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value\n            > is_le;\n\n        typedef bind4<\n              typename F::rebind\n            , typename l1::type, typename l2::type, typename l3::type\n            , typename l4::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<5> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        typedef lambda< typename F::arg3, Tag, false_ > l3;\n        typedef lambda< typename F::arg4, Tag, false_ > l4;\n        typedef lambda< typename F::arg5, Tag, false_ > l5;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        typedef typename l3::is_le is_le3;\n        typedef typename l4::is_le is_le4;\n        typedef typename l5::is_le is_le5;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le5)::value\n            > is_le;\n\n        typedef bind5<\n              typename F::rebind\n            , typename l1::type, typename l2::type, typename l3::type\n            , typename l4::type, typename l5::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\n} // namespace aux\n\ntemplate<\n      typename T\n    , typename Tag\n    , typename Protect\n    >\nstruct lambda\n{\n    /// Metafunction forwarding confuses MSVC 6.x\n    typedef typename aux::template_arity<T>::type arity_;\n    typedef typename aux::lambda_impl<arity_>\n        ::template result_< T,Tag,Protect > l_;\n\n    typedef typename l_::type type;\n    typedef typename l_::is_le is_le;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(3, lambda, (T, Tag, Protect))\n};\n\nBOOST_MPL_AUX_NA_SPEC2(1, 3, lambda)\n\ntemplate<\n      typename T\n    >\nstruct is_lambda_expression\n    : lambda<T>::is_le\n{\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/less.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/less.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct less_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< less_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< less_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct less_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct less_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct less_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct less_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct less\n\n    : less_impl<\n          typename less_tag<N1>::type\n        , typename less_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, less)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct less_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N2)::value > BOOST_MPL_AUX_VALUE_WKND(N1)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/less_equal.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/less_equal.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct less_equal_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< less_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< less_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct less_equal_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct less_equal_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct less_equal_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct less_equal_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct less_equal\n\n    : less_equal_impl<\n          typename less_equal_tag<N1>::type\n        , typename less_equal_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less_equal, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, less_equal)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct less_equal_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value <= BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/list.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/list.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct list;\n\ntemplate<\n     \n    >\nstruct list<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list0<  >\n{\n    typedef list0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct list<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list1<T0>\n{\n    typedef typename list1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct list<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list2< T0,T1 >\n{\n    typedef typename list2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct list<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list3< T0,T1,T2 >\n{\n    typedef typename list3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct list<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list4< T0,T1,T2,T3 >\n{\n    typedef typename list4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct list<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list5< T0,T1,T2,T3,T4 >\n{\n    typedef typename list5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename list6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename list7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename list8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename list9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename list10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename list11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : list12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename list12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : list13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename list13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : list14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename list14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : list15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename list15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : list16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename list16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : list17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename list17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : list18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename list18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : list19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename list19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct list\n    : list20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename list20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/list_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/list_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX\n    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX\n    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX\n    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX\n    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX\n    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX\n    , long C18 = LONG_MAX, long C19 = LONG_MAX\n    >\nstruct list_c;\n\ntemplate<\n      typename T\n    >\nstruct list_c<\n          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list0_c<T>\n{\n    typedef typename list0_c<T>::type type;\n};\n\ntemplate<\n      typename T, long C0\n    >\nstruct list_c<\n          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list1_c< T,C0 >\n{\n    typedef typename list1_c< T,C0 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1\n    >\nstruct list_c<\n          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list2_c< T,C0,C1 >\n{\n    typedef typename list2_c< T,C0,C1 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2\n    >\nstruct list_c<\n          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list3_c< T,C0,C1,C2 >\n{\n    typedef typename list3_c< T,C0,C1,C2 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list4_c< T,C0,C1,C2,C3 >\n{\n    typedef typename list4_c< T,C0,C1,C2,C3 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list5_c< T,C0,C1,C2,C3,C4 >\n{\n    typedef typename list5_c< T,C0,C1,C2,C3,C4 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list6_c< T,C0,C1,C2,C3,C4,C5 >\n{\n    typedef typename list6_c< T,C0,C1,C2,C3,C4,C5 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list7_c< T,C0,C1,C2,C3,C4,C5,C6 >\n{\n    typedef typename list7_c< T,C0,C1,C2,C3,C4,C5,C6 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX\n        >\n    : list8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >\n{\n    typedef typename list8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : list9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >\n{\n    typedef typename list9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : list10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >\n{\n    typedef typename list10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >\n{\n    typedef typename list11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >\n{\n    typedef typename list12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >\n{\n    typedef typename list13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list14_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        >\n{\n    typedef typename list14_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list15_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        >\n{\n    typedef typename list15_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list16_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15\n        >\n{\n    typedef typename list16_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list17_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16\n        >\n{\n    typedef typename list17_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, LONG_MAX, LONG_MAX\n        >\n    : list18_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17\n        >\n{\n    typedef typename list18_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, LONG_MAX\n        >\n    : list19_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18\n        >\n{\n    typedef typename list19_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n    >\nstruct list_c\n    : list20_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, C19\n        >\n{\n    typedef typename list20_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/map.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/map.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct map;\n\ntemplate<\n     \n    >\nstruct map<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map0<  >\n{\n    typedef map0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct map<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map1<T0>\n{\n    typedef typename map1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct map<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map2< T0,T1 >\n{\n    typedef typename map2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct map<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map3< T0,T1,T2 >\n{\n    typedef typename map3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct map<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map4< T0,T1,T2,T3 >\n{\n    typedef typename map4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct map<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map5< T0,T1,T2,T3,T4 >\n{\n    typedef typename map5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename map6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename map7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename map8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename map9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename map10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename map11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : map12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename map12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : map13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename map13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : map14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename map14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : map15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename map15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : map16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename map16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : map17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename map17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : map18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename map18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : map19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename map19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct map\n    : map20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename map20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/minus.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/minus.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct minus_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< minus_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< minus_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct minus_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct minus_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct minus_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct minus_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct minus\n    : minus< minus< minus< minus< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , minus\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct minus< N1,N2,N3,N4,na >\n\n    : minus< minus< minus< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , minus\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct minus< N1,N2,N3,na,na >\n\n    : minus< minus< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , minus\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct minus< N1,N2,na,na,na >\n    : minus_impl<\n          typename minus_tag<N1>::type\n        , typename minus_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , minus\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, minus)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct minus_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  - BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/modulus.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/modulus.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct modulus_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< modulus_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< modulus_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct modulus_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct modulus_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct modulus_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct modulus_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct modulus\n\n    : modulus_impl<\n          typename modulus_tag<N1>::type\n        , typename modulus_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, modulus, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, modulus)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct modulus_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  % BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/not_equal_to.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/not_equal_to.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct not_equal_to_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< not_equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< not_equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct not_equal_to_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct not_equal_to_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct not_equal_to_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct not_equal_to_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct not_equal_to\n\n    : not_equal_to_impl<\n          typename not_equal_to_tag<N1>::type\n        , typename not_equal_to_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, not_equal_to, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, not_equal_to)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct not_equal_to_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value != BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/or.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/or.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate< bool C_, typename T1, typename T2, typename T3, typename T4 >\nstruct or_impl\n    : true_\n{\n};\n\ntemplate< typename T1, typename T2, typename T3, typename T4 >\nstruct or_impl< false,T1,T2,T3,T4 >\n    : or_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        , T2, T3, T4\n        , false_\n        >\n{\n};\n\ntemplate<>\nstruct or_impl<\n          false\n        , false_, false_, false_, false_\n        >\n    : false_\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    , typename T3 = false_, typename T4 = false_, typename T5 = false_\n    >\nstruct or_\n\n    : aux::or_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        , T2, T3, T4, T5\n        >\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , or_\n        , ( T1, T2, T3, T4, T5)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC2(\n      2\n    , 5\n    , or_\n    )\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/placeholders.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n// Copyright Peter Dimov 2001-2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/placeholders.hpp\" header\n// -- DO NOT modify by hand!\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg< -1 > _;\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_;\n}\n\n}}\n\n/// agurt, 17/mar/02: one more placeholder for the last 'apply#' \n/// specialization\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<1> _1;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_1)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_1;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<2> _2;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_2)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_2;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<3> _3;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_3)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_3;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<4> _4;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_4)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_4;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<5> _5;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_5)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_5;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<6> _6;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_6)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_6;\n}\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/plus.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/plus.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct plus_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< plus_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< plus_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct plus_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct plus_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct plus_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct plus_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct plus\n    : plus< plus< plus< plus< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , plus\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct plus< N1,N2,N3,N4,na >\n\n    : plus< plus< plus< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , plus\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct plus< N1,N2,N3,na,na >\n\n    : plus< plus< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , plus\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct plus< N1,N2,na,na,na >\n    : plus_impl<\n          typename plus_tag<N1>::type\n        , typename plus_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , plus\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, plus)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct plus_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  + BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/quote.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/quote.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate< typename T, bool has_type_ >\nstruct quote_impl\n{\n    typedef typename T::type type;\n};\n\ntemplate< typename T >\nstruct quote_impl< T,false >\n{\n    typedef T type;\n};\n\ntemplate<\n      template< typename P1 > class F\n    , typename Tag = void_\n    >\nstruct quote1\n{\n    template< typename U1 > struct apply\n\n        : quote_impl<\n              F<U1>\n            , aux::has_type< F<U1> >::value\n            >\n\n    {\n    };\n};\n\ntemplate<\n      template< typename P1, typename P2 > class F\n    , typename Tag = void_\n    >\nstruct quote2\n{\n    template< typename U1, typename U2 > struct apply\n\n        : quote_impl<\n              F< U1,U2 >\n            , aux::has_type< F< U1,U2 > >::value\n            >\n\n    {\n    };\n};\n\ntemplate<\n      template< typename P1, typename P2, typename P3 > class F\n    , typename Tag = void_\n    >\nstruct quote3\n{\n    template< typename U1, typename U2, typename U3 > struct apply\n\n        : quote_impl<\n              F< U1,U2,U3 >\n            , aux::has_type< F< U1,U2,U3 > >::value\n            >\n\n    {\n    };\n};\n\ntemplate<\n      template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename Tag = void_\n    >\nstruct quote4\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4\n        >\n    struct apply\n\n        : quote_impl<\n              F< U1,U2,U3,U4 >\n            , aux::has_type< F< U1,U2,U3,U4 > >::value\n            >\n\n    {\n    };\n};\n\ntemplate<\n      template<\n          typename P1, typename P2, typename P3, typename P4\n        , typename P5\n        >\n      class F\n    , typename Tag = void_\n    >\nstruct quote5\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4\n        , typename U5\n        >\n    struct apply\n\n        : quote_impl<\n              F< U1,U2,U3,U4,U5 >\n            , aux::has_type< F< U1,U2,U3,U4,U5 > >::value\n            >\n\n    {\n    };\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/reverse_fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/reverse_fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl;\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< 0,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef fwd_state0 bkwd_state0;\n    typedef bkwd_state0 state;\n    typedef iter0 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< 1,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    \n\n    typedef fwd_state1 bkwd_state1;\n    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n    typedef bkwd_state0 state;\n    typedef iter1 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< 2,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    \n\n    typedef fwd_state2 bkwd_state2;\n    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef iter2 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< 3,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    \n\n    typedef fwd_state3 bkwd_state3;\n    typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;\n    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef iter3 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< 4,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef fwd_state4 bkwd_state4;\n    typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;\n    typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;\n    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef iter4 iterator;\n};\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef reverse_fold_impl<\n          ( (N - 4) < 0 ? 0 : N - 4 )\n        , iter4\n        , Last\n        , fwd_state4\n        , BackwardOp\n        , ForwardOp\n        > nested_chunk;\n\n    typedef typename nested_chunk::state bkwd_state4;\n    typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;\n    typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;\n    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef typename nested_chunk::iterator iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< -1,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef reverse_fold_impl<\n          -1\n        , typename mpl::next<First>::type\n        , Last\n        , typename apply2<ForwardOp,State, typename deref<First>::type>::type\n        , BackwardOp\n        , ForwardOp\n        > nested_step;\n\n    typedef typename apply2<\n          BackwardOp\n        , typename nested_step::state\n        , typename deref<First>::type\n        >::type state;\n\n    typedef typename nested_step::iterator iterator;\n};\n\ntemplate<\n      typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< -1,Last,Last,State,BackwardOp,ForwardOp >\n{\n    typedef State state;\n    typedef Last iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/reverse_iter_fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/reverse_iter_fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl;\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< 0,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef fwd_state0 bkwd_state0;\n    typedef bkwd_state0 state;\n    typedef iter0 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< 1,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    \n\n    typedef fwd_state1 bkwd_state1;\n    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n    typedef bkwd_state0 state;\n    typedef iter1 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< 2,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    \n\n    typedef fwd_state2 bkwd_state2;\n    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef iter2 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< 3,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    \n\n    typedef fwd_state3 bkwd_state3;\n    typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;\n    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef iter3 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< 4,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef fwd_state4 bkwd_state4;\n    typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;\n    typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;\n    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef iter4 iterator;\n};\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef reverse_iter_fold_impl<\n          ( (N - 4) < 0 ? 0 : N - 4 )\n        , iter4\n        , Last\n        , fwd_state4\n        , BackwardOp\n        , ForwardOp\n        > nested_chunk;\n\n    typedef typename nested_chunk::state bkwd_state4;\n    typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;\n    typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;\n    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef typename nested_chunk::iterator iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< -1,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef reverse_iter_fold_impl<\n          -1\n        , typename mpl::next<First>::type\n        , Last\n        , typename apply2< ForwardOp,State,First >::type\n        , BackwardOp\n        , ForwardOp\n        > nested_step;\n\n    typedef typename apply2<\n          BackwardOp\n        , typename nested_step::state\n        , First\n        >::type state;\n\n    typedef typename nested_step::iterator iterator;\n};\n\ntemplate<\n      typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< -1,Last,Last,State,BackwardOp,ForwardOp >\n{\n    typedef State state;\n    typedef Last iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/set.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/set.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct set;\n\ntemplate<\n     \n    >\nstruct set<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set0<  >\n{\n    typedef set0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct set<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set1<T0>\n{\n    typedef typename set1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct set<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set2< T0,T1 >\n{\n    typedef typename set2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct set<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set3< T0,T1,T2 >\n{\n    typedef typename set3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct set<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set4< T0,T1,T2,T3 >\n{\n    typedef typename set4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct set<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set5< T0,T1,T2,T3,T4 >\n{\n    typedef typename set5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename set6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename set7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename set8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename set9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename set10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename set11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : set12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename set12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : set13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename set13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : set14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename set14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : set15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename set15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : set16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename set16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : set17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename set17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : set18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename set18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : set19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename set19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct set\n    : set20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename set20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/set_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/set_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX\n    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX\n    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX\n    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX\n    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX\n    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX\n    , long C18 = LONG_MAX, long C19 = LONG_MAX\n    >\nstruct set_c;\n\ntemplate<\n      typename T\n    >\nstruct set_c<\n          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set0_c<T>\n{\n    typedef typename set0_c<T>::type type;\n};\n\ntemplate<\n      typename T, long C0\n    >\nstruct set_c<\n          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set1_c< T,C0 >\n{\n    typedef typename set1_c< T,C0 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1\n    >\nstruct set_c<\n          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set2_c< T,C0,C1 >\n{\n    typedef typename set2_c< T,C0,C1 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2\n    >\nstruct set_c<\n          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set3_c< T,C0,C1,C2 >\n{\n    typedef typename set3_c< T,C0,C1,C2 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set4_c< T,C0,C1,C2,C3 >\n{\n    typedef typename set4_c< T,C0,C1,C2,C3 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set5_c< T,C0,C1,C2,C3,C4 >\n{\n    typedef typename set5_c< T,C0,C1,C2,C3,C4 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set6_c< T,C0,C1,C2,C3,C4,C5 >\n{\n    typedef typename set6_c< T,C0,C1,C2,C3,C4,C5 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set7_c< T,C0,C1,C2,C3,C4,C5,C6 >\n{\n    typedef typename set7_c< T,C0,C1,C2,C3,C4,C5,C6 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX\n        >\n    : set8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >\n{\n    typedef typename set8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : set9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >\n{\n    typedef typename set9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : set10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >\n{\n    typedef typename set10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >\n{\n    typedef typename set11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >\n{\n    typedef typename set12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >\n{\n    typedef typename set13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set14_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        >\n{\n    typedef typename set14_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set15_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        >\n{\n    typedef typename set15_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set16_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15\n        >\n{\n    typedef typename set16_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set17_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16\n        >\n{\n    typedef typename set17_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, LONG_MAX, LONG_MAX\n        >\n    : set18_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17\n        >\n{\n    typedef typename set18_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, LONG_MAX\n        >\n    : set19_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18\n        >\n{\n    typedef typename set19_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n    >\nstruct set_c\n    : set20_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, C19\n        >\n{\n    typedef typename set20_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/shift_left.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/shift_left.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct shift_left_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< shift_left_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< shift_left_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct shift_left_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct shift_left_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct shift_left_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct shift_left_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct shift_left\n\n    : shift_left_impl<\n          typename shift_left_tag<N1>::type\n        , typename shift_left_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_left, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, shift_left)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct shift_left_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N, typename S > struct apply\n\n        : integral_c<\n              typename N::value_type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N)::value\n                  << BOOST_MPL_AUX_VALUE_WKND(S)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/shift_right.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/shift_right.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct shift_right_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< shift_right_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< shift_right_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct shift_right_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct shift_right_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct shift_right_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct shift_right_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct shift_right\n\n    : shift_right_impl<\n          typename shift_right_tag<N1>::type\n        , typename shift_right_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_right, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, shift_right)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct shift_right_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N, typename S > struct apply\n\n        : integral_c<\n              typename N::value_type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N)::value\n                  >> BOOST_MPL_AUX_VALUE_WKND(S)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/template_arity.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// *Preprocessed* version of the main \"template_arity.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\ntemplate< int N > struct arity_tag\n{\n    typedef char (&type)[N + 1];\n};\n\ntemplate<\n      int C1, int C2, int C3, int C4, int C5, int C6\n    >\nstruct max_arity\n{\n    BOOST_STATIC_CONSTANT(int, value =\n          ( C6 > 0 ? C6 : ( C5 > 0 ? C5 : ( C4 > 0 ? C4 : ( C3 > 0 ? C3 : ( C2 > 0 ? C2 : ( C1 > 0 ? C1 : -1 ) ) ) ) ) )\n        );\n};\n\narity_tag<0>::type arity_helper(...);\n\ntemplate<\n      template< typename P1 > class F\n    , typename T1\n    >\ntypename arity_tag<1>::type\narity_helper(type_wrapper< F<T1> >, arity_tag<1>);\n\ntemplate<\n      template< typename P1, typename P2 > class F\n    , typename T1, typename T2\n    >\ntypename arity_tag<2>::type\narity_helper(type_wrapper< F< T1,T2 > >, arity_tag<2>);\n\ntemplate<\n      template< typename P1, typename P2, typename P3 > class F\n    , typename T1, typename T2, typename T3\n    >\ntypename arity_tag<3>::type\narity_helper(type_wrapper< F< T1,T2,T3 > >, arity_tag<3>);\n\ntemplate<\n      template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename T1, typename T2, typename T3, typename T4\n    >\ntypename arity_tag<4>::type\narity_helper(type_wrapper< F< T1,T2,T3,T4 > >, arity_tag<4>);\n\ntemplate<\n      template<\n          typename P1, typename P2, typename P3, typename P4\n        , typename P5\n        >\n      class F\n    , typename T1, typename T2, typename T3, typename T4, typename T5\n    >\ntypename arity_tag<5>::type\narity_helper(type_wrapper< F< T1,T2,T3,T4,T5 > >, arity_tag<5>);\n\ntemplate<\n      template<\n          typename P1, typename P2, typename P3, typename P4\n        , typename P5, typename P6\n        >\n      class F\n    , typename T1, typename T2, typename T3, typename T4, typename T5\n    , typename T6\n    >\ntypename arity_tag<6>::type\narity_helper(type_wrapper< F< T1,T2,T3,T4,T5,T6 > >, arity_tag<6>);\ntemplate< typename F, int N >\nstruct template_arity_impl\n{\n    BOOST_STATIC_CONSTANT(int, value =\n          sizeof(::boost::mpl::aux::arity_helper(type_wrapper<F>(), arity_tag<N>())) - 1\n        );\n};\n\ntemplate< typename F >\nstruct template_arity\n{\n    BOOST_STATIC_CONSTANT(int, value  = (\n          max_arity< template_arity_impl< F,1 >::value, template_arity_impl< F,2 >::value, template_arity_impl< F,3 >::value, template_arity_impl< F,4 >::value, template_arity_impl< F,5 >::value, template_arity_impl< F,6 >::value >::value\n        ));\n    typedef mpl::int_<value> type;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/times.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/times.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct times_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< times_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< times_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct times_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct times_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct times_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct times_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct times\n    : times< times< times< times< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , times\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct times< N1,N2,N3,N4,na >\n\n    : times< times< times< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , times\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct times< N1,N2,N3,na,na >\n\n    : times< times< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , times\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct times< N1,N2,na,na,na >\n    : times_impl<\n          typename times_tag<N1>::type\n        , typename times_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , times\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, times)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct times_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  * BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/unpack_args.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2002-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/unpack_args.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate< int size, typename F, typename Args >\nstruct unpack_args_impl;\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 0,F,Args >\n    : apply0<\n          F\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 1,F,Args >\n    : apply1<\n          F\n        , typename at_c< Args,0 >::type\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 2,F,Args >\n    : apply2<\n          F\n        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 3,F,Args >\n    : apply3<\n          F\n        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n        , typename at_c< Args,2 >::type\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 4,F,Args >\n    : apply4<\n          F\n        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n        , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 5,F,Args >\n    : apply5<\n          F\n        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n        , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type\n        , typename at_c< Args,4 >::type\n        >\n{\n};\n\n}\n\ntemplate<\n      typename F\n    >\nstruct unpack_args\n{\n    template< typename Args > struct apply\n\n        : aux::unpack_args_impl< size<Args>::value,F, Args >\n\n    {\n    };\n};\n\nBOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(1, unpack_args)\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/vector.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/vector.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct vector;\n\ntemplate<\n     \n    >\nstruct vector<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector0<  >\n{\n    typedef vector0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct vector<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector1<T0>\n{\n    typedef typename vector1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct vector<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector2< T0,T1 >\n{\n    typedef typename vector2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct vector<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector3< T0,T1,T2 >\n{\n    typedef typename vector3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct vector<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector4< T0,T1,T2,T3 >\n{\n    typedef typename vector4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector5< T0,T1,T2,T3,T4 >\n{\n    typedef typename vector5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename vector6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename vector7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename vector8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : vector15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename vector15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : vector16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename vector16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : vector17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename vector17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : vector18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename vector18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : vector19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename vector19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct vector\n    : vector20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename vector20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/gcc/vector_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/vector_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX\n    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX\n    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX\n    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX\n    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX\n    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX\n    , long C18 = LONG_MAX, long C19 = LONG_MAX\n    >\nstruct vector_c;\n\ntemplate<\n      typename T\n    >\nstruct vector_c<\n          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector0_c<T>\n{\n    typedef typename vector0_c<T>::type type;\n};\n\ntemplate<\n      typename T, long C0\n    >\nstruct vector_c<\n          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector1_c< T, T(C0) >\n{\n    typedef typename vector1_c< T, T(C0) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1\n    >\nstruct vector_c<\n          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector2_c< T, T(C0), T(C1) >\n{\n    typedef typename vector2_c< T, T(C0), T(C1) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2\n    >\nstruct vector_c<\n          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector3_c< T, T(C0), T(C1), T(C2) >\n{\n    typedef typename vector3_c< T, T(C0), T(C1), T(C2) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector4_c< T, T(C0), T(C1), T(C2), T(C3) >\n{\n    typedef typename vector4_c< T, T(C0), T(C1), T(C2), T(C3) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector5_c< T, T(C0), T(C1), T(C2), T(C3), T(C4) >\n{\n    typedef typename vector5_c< T, T(C0), T(C1), T(C2), T(C3), T(C4) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector6_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5) >\n{\n    typedef typename vector6_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector7_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6) >\n{\n    typedef typename vector7_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX\n        >\n    : vector8_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7) >\n{\n    typedef typename vector8_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : vector9_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8) >\n{\n    typedef typename vector9_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : vector10_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9) >\n{\n    typedef typename vector10_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector11_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10) >\n{\n    typedef typename vector11_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector12_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11) >\n{\n    typedef typename vector12_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector13_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12) >\n{\n    typedef typename vector13_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector14_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13) >\n{\n    typedef typename vector14_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector15_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14) >\n{\n    typedef typename vector15_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector16_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15) >\n{\n    typedef typename vector16_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector17_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16) >\n{\n    typedef typename vector17_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, LONG_MAX, LONG_MAX\n        >\n    : vector18_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17) >\n{\n    typedef typename vector18_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, LONG_MAX\n        >\n    : vector19_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18) >\n{\n    typedef typename vector19_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18) >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n    >\nstruct vector_c\n    : vector20_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19) >\n{\n    typedef typename vector20_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19) >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/advance_backward.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/advance_backward.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< long N > struct advance_backward;\ntemplate<>\nstruct advance_backward<0>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef iter0 type;\n    };\n\n    /// ETI workaround\n    template<> struct apply<int>\n    {\n        typedef int type;\n    };\n\n};\n\ntemplate<>\nstruct advance_backward<1>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef iter1 type;\n    };\n\n    /// ETI workaround\n    template<> struct apply<int>\n    {\n        typedef int type;\n    };\n\n};\n\ntemplate<>\nstruct advance_backward<2>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef typename prior<iter1>::type iter2;\n        typedef iter2 type;\n    };\n\n    /// ETI workaround\n    template<> struct apply<int>\n    {\n        typedef int type;\n    };\n\n};\n\ntemplate<>\nstruct advance_backward<3>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef typename prior<iter1>::type iter2;\n        typedef typename prior<iter2>::type iter3;\n        typedef iter3 type;\n    };\n\n    /// ETI workaround\n    template<> struct apply<int>\n    {\n        typedef int type;\n    };\n\n};\n\ntemplate<>\nstruct advance_backward<4>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef typename prior<iter1>::type iter2;\n        typedef typename prior<iter2>::type iter3;\n        typedef typename prior<iter3>::type iter4;\n        typedef iter4 type;\n    };\n\n    /// ETI workaround\n    template<> struct apply<int>\n    {\n        typedef int type;\n    };\n\n};\n\ntemplate< long N >\nstruct advance_backward\n{\n    template< typename Iterator > struct apply\n    {\n        typedef typename apply_wrap1<\n              advance_backward<4>\n            , Iterator\n            >::type chunk_result_;\n\n        typedef typename apply_wrap1<\n              advance_backward<(\n                (N - 4) < 0\n                    ? 0\n                    : N - 4\n                    )>\n            , chunk_result_\n            >::type type;\n    };\n};\n\n}}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/advance_forward.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/advance_forward.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< long N > struct advance_forward;\ntemplate<>\nstruct advance_forward<0>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef iter0 type;\n    };\n\n    /// ETI workaround\n    template<> struct apply<int>\n    {\n        typedef int type;\n    };\n\n};\n\ntemplate<>\nstruct advance_forward<1>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef iter1 type;\n    };\n\n    /// ETI workaround\n    template<> struct apply<int>\n    {\n        typedef int type;\n    };\n\n};\n\ntemplate<>\nstruct advance_forward<2>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef typename next<iter1>::type iter2;\n        typedef iter2 type;\n    };\n\n    /// ETI workaround\n    template<> struct apply<int>\n    {\n        typedef int type;\n    };\n\n};\n\ntemplate<>\nstruct advance_forward<3>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef typename next<iter1>::type iter2;\n        typedef typename next<iter2>::type iter3;\n        typedef iter3 type;\n    };\n\n    /// ETI workaround\n    template<> struct apply<int>\n    {\n        typedef int type;\n    };\n\n};\n\ntemplate<>\nstruct advance_forward<4>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef typename next<iter1>::type iter2;\n        typedef typename next<iter2>::type iter3;\n        typedef typename next<iter3>::type iter4;\n        typedef iter4 type;\n    };\n\n    /// ETI workaround\n    template<> struct apply<int>\n    {\n        typedef int type;\n    };\n\n};\n\ntemplate< long N >\nstruct advance_forward\n{\n    template< typename Iterator > struct apply\n    {\n        typedef typename apply_wrap1<\n              advance_forward<4>\n            , Iterator\n            >::type chunk_result_;\n\n        typedef typename apply_wrap1<\n              advance_forward<(\n                (N - 4) < 0\n                    ? 0\n                    : N - 4\n                    )>\n            , chunk_result_\n            >::type type;\n    };\n};\n\n}}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/and.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/and.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< bool C_ > struct and_impl\n{\n    template<\n          typename T1, typename T2, typename T3, typename T4\n        >\n    struct result_\n        : false_\n    {\n    };\n};\n\ntemplate<> struct and_impl<true>\n{\n    template<\n          typename T1, typename T2, typename T3, typename T4\n        >\n    struct result_\n        : and_impl<\n              BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n            >::template result_< T2,T3,T4,true_ >\n    {\n    };\n};\n\ntemplate<>\nstruct and_impl<true>\n    ::result_< true_,true_,true_,true_ >\n        : true_\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    , typename T3 = true_, typename T4 = true_, typename T5 = true_\n    >\nstruct and_\n\n    : aux::and_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        >::template result_< T2,T3,T4,T5 >\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , and_\n        , ( T1, T2, T3, T4, T5)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC2(\n      2\n    , 5\n    , and_\n    )\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/apply.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/apply.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F\n    >\nstruct apply0\n\n{\n    typedef typename apply_wrap0<\n          typename lambda<F>::type\n       \n        >::type type;\n\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          1\n        , apply0\n        , (F )\n        )\n};\n\n/// workaround for ETI bug\ntemplate<>\nstruct apply0<int>\n{\n    typedef int type;\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply1\n\n{\n    typedef typename apply_wrap1<\n          typename lambda<F>::type\n        , T1\n        >::type type;\n\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          2\n        , apply1\n        , (F, T1)\n        )\n};\n\n/// workaround for ETI bug\ntemplate<>\nstruct apply1< int,int >\n{\n    typedef int type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply2\n\n{\n    typedef typename apply_wrap2<\n          typename lambda<F>::type\n        , T1, T2\n        >::type type;\n\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          3\n        , apply2\n        , (F, T1, T2)\n        )\n};\n\n/// workaround for ETI bug\ntemplate<>\nstruct apply2< int,int,int >\n{\n    typedef int type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply3\n\n{\n    typedef typename apply_wrap3<\n          typename lambda<F>::type\n        , T1, T2, T3\n        >::type type;\n\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          4\n        , apply3\n        , (F, T1, T2, T3)\n        )\n};\n\n/// workaround for ETI bug\ntemplate<>\nstruct apply3< int,int,int,int >\n{\n    typedef int type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply4\n\n{\n    typedef typename apply_wrap4<\n          typename lambda<F>::type\n        , T1, T2, T3, T4\n        >::type type;\n\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , apply4\n        , (F, T1, T2, T3, T4)\n        )\n};\n\n/// workaround for ETI bug\ntemplate<>\nstruct apply4< int,int,int,int,int >\n{\n    typedef int type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply5\n\n{\n    typedef typename apply_wrap5<\n          typename lambda<F>::type\n        , T1, T2, T3, T4, T5\n        >::type type;\n\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          6\n        , apply5\n        , (F, T1, T2, T3, T4, T5)\n        )\n};\n\n/// workaround for ETI bug\ntemplate<>\nstruct apply5< int,int,int,int,int,int >\n{\n    typedef int type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/apply_fwd.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/apply_fwd.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F\n    >\nstruct apply0;\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply1;\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply2;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply3;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply4;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply5;\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/apply_wrap.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/apply_wrap.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate< typename F>\nstruct msvc_apply0\n{\n    template< bool > struct f_ : F {};\n    template<> struct f_<true>\n    {\n        template< typename P  = int > struct apply\n        {\n            typedef int type;\n        };\n    };\n\n    template< typename T  = int > struct result_\n        : f_< aux::msvc_never_true<F>::value >\n            ::template apply<>\n    {\n    };\n\n};\n\ntemplate<\n      typename F\n    >\nstruct apply_wrap0\n{\n    typedef typename msvc_apply0<F>::template result_<\n         \n        >::type type;\n};\n\n/// workaround for ETI bug\ntemplate<>\nstruct apply_wrap0<int>\n{\n    typedef int type;\n};\n\ntemplate< typename F>\nstruct msvc_apply1\n{\n    template< bool > struct f_ : F {};\n    template<> struct f_<true>\n    {\n        template< typename P1 > struct apply\n        {\n            typedef int type;\n        };\n    };\n\n    template< typename T1 > struct result_\n        : f_< aux::msvc_never_true<F>::value >\n            ::template apply<T1>\n    {\n    };\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply_wrap1\n{\n    typedef typename msvc_apply1<F>::template result_<\n          T1\n        >::type type;\n};\n\n/// workaround for ETI bug\ntemplate<>\nstruct apply_wrap1< int,int >\n{\n    typedef int type;\n};\n\ntemplate< typename F>\nstruct msvc_apply2\n{\n    template< bool > struct f_ : F {};\n    template<> struct f_<true>\n    {\n        template< typename P1, typename P2 > struct apply\n        {\n            typedef int type;\n        };\n    };\n\n    template< typename T1, typename T2 > struct result_\n        : f_< aux::msvc_never_true<F>::value >\n            ::template apply< T1,T2 >\n    {\n    };\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply_wrap2\n{\n    typedef typename msvc_apply2<F>::template result_<\n          T1, T2\n        >::type type;\n};\n\n/// workaround for ETI bug\ntemplate<>\nstruct apply_wrap2< int,int,int >\n{\n    typedef int type;\n};\n\ntemplate< typename F>\nstruct msvc_apply3\n{\n    template< bool > struct f_ : F {};\n    template<> struct f_<true>\n    {\n        template< typename P1, typename P2, typename P3 > struct apply\n        {\n            typedef int type;\n        };\n    };\n\n    template< typename T1, typename T2, typename T3 > struct result_\n        : f_< aux::msvc_never_true<F>::value >\n            ::template apply< T1,T2,T3 >\n    {\n    };\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply_wrap3\n{\n    typedef typename msvc_apply3<F>::template result_<\n          T1, T2, T3\n        >::type type;\n};\n\n/// workaround for ETI bug\ntemplate<>\nstruct apply_wrap3< int,int,int,int >\n{\n    typedef int type;\n};\n\ntemplate< typename F>\nstruct msvc_apply4\n{\n    template< bool > struct f_ : F {};\n    template<> struct f_<true>\n    {\n        template<\n              typename P1, typename P2, typename P3, typename P4\n            >\n        struct apply\n        {\n            typedef int type;\n        };\n    };\n\n    template<\n          typename T1, typename T2, typename T3, typename T4\n        >\n    struct result_\n        : f_< aux::msvc_never_true<F>::value >\n            ::template apply< T1,T2,T3,T4 >\n    {\n    };\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply_wrap4\n{\n    typedef typename msvc_apply4<F>::template result_<\n          T1, T2, T3, T4\n        >::type type;\n};\n\n/// workaround for ETI bug\ntemplate<>\nstruct apply_wrap4< int,int,int,int,int >\n{\n    typedef int type;\n};\n\ntemplate< typename F>\nstruct msvc_apply5\n{\n    template< bool > struct f_ : F {};\n    template<> struct f_<true>\n    {\n        template<\n              typename P1, typename P2, typename P3, typename P4\n            , typename P5\n            >\n        struct apply\n        {\n            typedef int type;\n        };\n    };\n\n    template<\n          typename T1, typename T2, typename T3, typename T4\n        , typename T5\n        >\n    struct result_\n        : f_< aux::msvc_never_true<F>::value >\n            ::template apply< T1,T2,T3,T4,T5 >\n    {\n    };\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply_wrap5\n{\n    typedef typename msvc_apply5<F>::template result_<\n          T1, T2, T3, T4, T5\n        >::type type;\n};\n\n/// workaround for ETI bug\ntemplate<>\nstruct apply_wrap5< int,int,int,int,int,int >\n{\n    typedef int type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/arg.hpp",
    "content": "\n// Copyright Peter Dimov 2001-2002\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/arg.hpp\" header\n// -- DO NOT modify by hand!\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntemplate<> struct arg< -1 >\n{\n    BOOST_STATIC_CONSTANT(int, value  = -1);\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U1 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<1>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 1);\n    typedef arg<2> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U1 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<2>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 2);\n    typedef arg<3> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U2 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<3>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 3);\n    typedef arg<4> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U3 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<4>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 4);\n    typedef arg<5> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U4 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<5>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 5);\n    typedef arg<6> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U5 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\nBOOST_MPL_AUX_NONTYPE_ARITY_SPEC(1,int, arg)\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/basic_bind.hpp",
    "content": "\n// Copyright Peter Dimov 2001\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/basic_bind.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< bool >\nstruct resolve_arg_impl\n{\n    template<\n          typename T, typename U1, typename U2, typename U3\n        , typename U4, typename U5\n        >\n    struct result_\n    {\n        typedef T type;\n    };\n};\n\ntemplate<>\nstruct resolve_arg_impl<true>\n{\n    template<\n          typename T, typename U1, typename U2, typename U3\n        , typename U4, typename U5\n        >\n    struct result_\n    {\n        typedef typename apply_wrap5<\n              T\n            , U1, U2, U3, U4, U5\n            >::type type;\n    };\n};\n\ntemplate< typename T > struct is_bind_template;\n\ntemplate<\n      typename T, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg\n    : resolve_arg_impl< is_bind_template<T>::value >\n            ::template result_< T,U1,U2,U3,U4,U5 >\n{\n};\n\ntemplate< int arity_ > struct bind_chooser;\n\naux::no_tag is_bind_helper(...);\ntemplate< typename T > aux::no_tag is_bind_helper(protect<T>*);\n\ntemplate< int N >\naux::yes_tag is_bind_helper(arg<N>*);\n\ntemplate< bool is_ref_  = true >\nstruct is_bind_template_impl\n{\n    template< typename T > struct result_\n    {\n        BOOST_STATIC_CONSTANT(bool, value  = false);\n    };\n};\n\ntemplate<>\nstruct is_bind_template_impl<false>\n{\n    template< typename T > struct result_\n    {\n        BOOST_STATIC_CONSTANT(bool, value =\n              sizeof(aux::is_bind_helper(static_cast<T*>(0)))\n                == sizeof(aux::yes_tag)\n            );\n    };\n};\n\ntemplate< typename T > struct is_bind_template\n    : is_bind_template_impl< ::boost::detail::is_reference_impl<T>::value >\n        ::template result_<T>\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename F\n    >\nstruct bind0\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n\n     public:\n        typedef typename apply_wrap0<\n              f_\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F\n    >\naux::yes_tag\nis_bind_helper(bind0<F>*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(1, bind0)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind1\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n\n     public:\n        typedef typename apply_wrap1<\n              f_\n            , typename t1::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1\n    >\naux::yes_tag\nis_bind_helper(bind1< F,T1 >*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(2, bind1)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind2\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n\n     public:\n        typedef typename apply_wrap2<\n              f_\n            , typename t1::type, typename t2::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\naux::yes_tag\nis_bind_helper(bind2< F,T1,T2 >*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(3, bind2)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind3\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n\n     public:\n        typedef typename apply_wrap3<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\naux::yes_tag\nis_bind_helper(bind3< F,T1,T2,T3 >*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(4, bind3)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind4\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;\n\n     public:\n        typedef typename apply_wrap4<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\naux::yes_tag\nis_bind_helper(bind4< F,T1,T2,T3,T4 >*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(5, bind4)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind5\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;\n        typedef aux::resolve_bind_arg< T5,U1,U2,U3,U4,U5 > t5;\n\n     public:\n        typedef typename apply_wrap5<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type, typename t5::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\naux::yes_tag\nis_bind_helper(bind5< F,T1,T2,T3,T4,T5 >*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(6, bind5)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/bind.hpp",
    "content": "\n// Copyright Peter Dimov 2001\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bind.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< bool >\nstruct resolve_arg_impl\n{\n    template<\n          typename T, typename U1, typename U2, typename U3\n        , typename U4, typename U5\n        >\n    struct result_\n    {\n        typedef T type;\n    };\n};\n\ntemplate<>\nstruct resolve_arg_impl<true>\n{\n    template<\n          typename T, typename U1, typename U2, typename U3\n        , typename U4, typename U5\n        >\n    struct result_\n    {\n        typedef typename apply_wrap5<\n              T\n            , U1, U2, U3, U4, U5\n            >::type type;\n    };\n};\n\ntemplate< typename T > struct is_bind_template;\n\ntemplate<\n      typename T, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg\n    : resolve_arg_impl< is_bind_template<T>::value >\n            ::template result_< T,U1,U2,U3,U4,U5 >\n{\n};\n\ntemplate< typename T >\nstruct replace_unnamed_arg_impl\n{\n    template< typename Arg > struct result_\n    {\n        typedef Arg next;\n        typedef T type;\n    };\n};\n\ntemplate<>\nstruct replace_unnamed_arg_impl< arg< -1 > >\n{\n    template< typename Arg > struct result_\n    {\n        typedef typename next<Arg>::type next;\n        typedef Arg type;\n    };\n};\n\ntemplate< typename T, typename Arg >\nstruct replace_unnamed_arg\n    : replace_unnamed_arg_impl<T>::template result_<Arg>\n{\n};\n\ntemplate< int arity_ > struct bind_chooser;\n\naux::no_tag is_bind_helper(...);\ntemplate< typename T > aux::no_tag is_bind_helper(protect<T>*);\n\ntemplate< int N >\naux::yes_tag is_bind_helper(arg<N>*);\n\ntemplate< bool is_ref_  = true >\nstruct is_bind_template_impl\n{\n    template< typename T > struct result_\n    {\n        BOOST_STATIC_CONSTANT(bool, value  = false);\n    };\n};\n\ntemplate<>\nstruct is_bind_template_impl<false>\n{\n    template< typename T > struct result_\n    {\n        BOOST_STATIC_CONSTANT(bool, value =\n              sizeof(aux::is_bind_helper(static_cast<T*>(0)))\n                == sizeof(aux::yes_tag)\n            );\n    };\n};\n\ntemplate< typename T > struct is_bind_template\n    : is_bind_template_impl< ::boost::detail::is_reference_impl<T>::value >\n        ::template result_<T>\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename F\n    >\nstruct bind0\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n     public:\n        typedef typename apply_wrap0<\n              f_\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F\n    >\naux::yes_tag\nis_bind_helper(bind0<F>*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(1, bind0)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind1\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n     public:\n        typedef typename apply_wrap1<\n              f_\n            , typename t1::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1\n    >\naux::yes_tag\nis_bind_helper(bind1< F,T1 >*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(2, bind1)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind2\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n     public:\n        typedef typename apply_wrap2<\n              f_\n            , typename t1::type, typename t2::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\naux::yes_tag\nis_bind_helper(bind2< F,T1,T2 >*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(3, bind2)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind3\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n     public:\n        typedef typename apply_wrap3<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\naux::yes_tag\nis_bind_helper(bind3< F,T1,T2,T3 >*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(4, bind3)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind4\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n        typedef aux::replace_unnamed_arg< T4,n4 > r4;\n        typedef typename r4::type a4;\n        typedef typename r4::next n5;\n        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;\n        ///\n     public:\n        typedef typename apply_wrap4<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\naux::yes_tag\nis_bind_helper(bind4< F,T1,T2,T3,T4 >*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(5, bind4)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind5\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n        typedef aux::replace_unnamed_arg< T4,n4 > r4;\n        typedef typename r4::type a4;\n        typedef typename r4::next n5;\n        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;\n        ///\n        typedef aux::replace_unnamed_arg< T5,n5 > r5;\n        typedef typename r5::type a5;\n        typedef typename r5::next n6;\n        typedef aux::resolve_bind_arg< a5,U1,U2,U3,U4,U5 > t5;\n        ///\n     public:\n        typedef typename apply_wrap5<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type, typename t5::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\naux::yes_tag\nis_bind_helper(bind5< F,T1,T2,T3,T4,T5 >*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(6, bind5)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/bind_fwd.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bind_fwd.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F\n    >\nstruct bind0;\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind1;\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind2;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind3;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind4;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind5;\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/bitand.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bitand.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value\n    >\nstruct bitand_impl\n    : if_c<\n          ( tag1_ > tag2_ )\n        , aux::cast2nd_impl< bitand_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< bitand_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct bitand_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct bitand_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct bitand_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct bitand_tag\n{\n    typedef typename T::tag type;\n};\n\n/// forward declaration\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct bitand_2;\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct bitand_\n\n    : if_<\n\n          is_na<N3>\n        , bitand_2< N1,N2 >\n        , bitand_<\n              bitand_2< N1,N2 >\n            , N3, N4, N5\n            >\n        >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , bitand_\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1\n    , typename N2\n    >\nstruct bitand_2\n    : aux::msvc_eti_base< typename apply_wrap2<\n          bitand_impl<\n              typename bitand_tag<N1>::type\n            , typename bitand_tag<N2>::type\n            >\n        , N1\n        , N2\n        >::type >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, bitand_2, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, bitand_)\n\n}}\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< typename T, T n1, T n2 >\nstruct bitand_wknd\n{\n    BOOST_STATIC_CONSTANT(T, value  = (n1 & n2));\n    typedef integral_c< T,value > type;\n};\n\n}\n\ntemplate<>\nstruct bitand_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n        : aux::bitand_wknd<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , N1::value\n            , N2::value\n            >::type\n\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/bitor.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bitor.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value\n    >\nstruct bitor_impl\n    : if_c<\n          ( tag1_ > tag2_ )\n        , aux::cast2nd_impl< bitor_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< bitor_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct bitor_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct bitor_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct bitor_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct bitor_tag\n{\n    typedef typename T::tag type;\n};\n\n/// forward declaration\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct bitor_2;\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct bitor_\n\n    : if_<\n\n          is_na<N3>\n        , bitor_2< N1,N2 >\n        , bitor_<\n              bitor_2< N1,N2 >\n            , N3, N4, N5\n            >\n        >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , bitor_\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1\n    , typename N2\n    >\nstruct bitor_2\n    : aux::msvc_eti_base< typename apply_wrap2<\n          bitor_impl<\n              typename bitor_tag<N1>::type\n            , typename bitor_tag<N2>::type\n            >\n        , N1\n        , N2\n        >::type >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, bitor_2, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, bitor_)\n\n}}\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< typename T, T n1, T n2 >\nstruct bitor_wknd\n{\n    BOOST_STATIC_CONSTANT(T, value  = (n1 | n2));\n    typedef integral_c< T,value > type;\n};\n\n}\n\ntemplate<>\nstruct bitor_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n        : aux::bitor_wknd<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , N1::value\n            , N2::value\n            >::type\n\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/bitxor.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bitxor.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value\n    >\nstruct bitxor_impl\n    : if_c<\n          ( tag1_ > tag2_ )\n        , aux::cast2nd_impl< bitxor_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< bitxor_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct bitxor_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct bitxor_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct bitxor_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct bitxor_tag\n{\n    typedef typename T::tag type;\n};\n\n/// forward declaration\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct bitxor_2;\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct bitxor_\n\n    : if_<\n\n          is_na<N3>\n        , bitxor_2< N1,N2 >\n        , bitxor_<\n              bitxor_2< N1,N2 >\n            , N3, N4, N5\n            >\n        >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , bitxor_\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1\n    , typename N2\n    >\nstruct bitxor_2\n    : aux::msvc_eti_base< typename apply_wrap2<\n          bitxor_impl<\n              typename bitxor_tag<N1>::type\n            , typename bitxor_tag<N2>::type\n            >\n        , N1\n        , N2\n        >::type >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, bitxor_2, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, bitxor_)\n\n}}\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< typename T, T n1, T n2 >\nstruct bitxor_wknd\n{\n    BOOST_STATIC_CONSTANT(T, value  = (n1 ^ n2));\n    typedef integral_c< T,value > type;\n};\n\n}\n\ntemplate<>\nstruct bitxor_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n        : aux::bitxor_wknd<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , N1::value\n            , N2::value\n            >::type\n\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/deque.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/deque.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< int N >\nstruct deque_chooser;\n\n}\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<0>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef vector0<\n             \n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<1>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector1<\n              T0\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<2>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector2<\n              T0, T1\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<3>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector3<\n              T0, T1, T2\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<4>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector4<\n              T0, T1, T2, T3\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<5>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector5<\n              T0, T1, T2, T3, T4\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<6>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector6<\n              T0, T1, T2, T3, T4, T5\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<7>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector7<\n              T0, T1, T2, T3, T4, T5, T6\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<8>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector8<\n              T0, T1, T2, T3, T4, T5, T6, T7\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<9>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector9<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<10>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector10<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<11>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector11<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<12>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector12<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<13>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector13<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<14>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector14<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<15>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector15<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<16>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector16<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<17>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector17<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<18>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector18<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<19>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector19<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<20>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector20<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate< typename T >\nstruct is_deque_arg\n{\n    BOOST_STATIC_CONSTANT(bool, value  = true);\n};\n\ntemplate<>\nstruct is_deque_arg<na>\n{\n    BOOST_STATIC_CONSTANT(bool, value  = false);\n};\n\ntemplate<\n      typename T1, typename T2, typename T3, typename T4, typename T5\n    , typename T6, typename T7, typename T8, typename T9, typename T10\n    , typename T11, typename T12, typename T13, typename T14, typename T15\n    , typename T16, typename T17, typename T18, typename T19, typename T20\n    >\nstruct deque_count_args\n{\n    BOOST_STATIC_CONSTANT(int, value =\n          is_deque_arg<T1>::value + is_deque_arg<T2>::value \n        + is_deque_arg<T3>::value + is_deque_arg<T4>::value \n        + is_deque_arg<T5>::value + is_deque_arg<T6>::value \n        + is_deque_arg<T7>::value + is_deque_arg<T8>::value \n        + is_deque_arg<T9>::value + is_deque_arg<T10>::value \n        + is_deque_arg<T11>::value + is_deque_arg<T12>::value \n        + is_deque_arg<T13>::value + is_deque_arg<T14>::value \n        + is_deque_arg<T15>::value + is_deque_arg<T16>::value \n        + is_deque_arg<T17>::value + is_deque_arg<T18>::value \n        + is_deque_arg<T19>::value + is_deque_arg<T20>::value\n        );\n\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct deque_impl\n{\n    typedef aux::deque_count_args<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        > arg_num_;\n\n    typedef typename aux::deque_chooser< arg_num_::value >\n        ::template result_< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct deque\n    : aux::deque_impl<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        >::type\n{\n    typedef typename aux::deque_impl<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/divides.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/divides.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value\n    >\nstruct divides_impl\n    : if_c<\n          ( tag1_ > tag2_ )\n        , aux::cast2nd_impl< divides_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< divides_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct divides_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct divides_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct divides_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct divides_tag\n{\n    typedef typename T::tag type;\n};\n\n/// forward declaration\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct divides2;\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct divides\n\n    : if_<\n\n          is_na<N3>\n        , divides2< N1,N2 >\n        , divides<\n              divides2< N1,N2 >\n            , N3, N4, N5\n            >\n        >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , divides\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1\n    , typename N2\n    >\nstruct divides2\n    : aux::msvc_eti_base< typename apply_wrap2<\n          divides_impl<\n              typename divides_tag<N1>::type\n            , typename divides_tag<N2>::type\n            >\n        , N1\n        , N2\n        >::type >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, divides2, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, divides)\n\n}}\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< typename T, T n1, T n2 >\nstruct divides_wknd\n{\n    BOOST_STATIC_CONSTANT(T, value  = (n1 / n2));\n    typedef integral_c< T,value > type;\n};\n\n}\n\ntemplate<>\nstruct divides_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n        : aux::divides_wknd<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , N1::value\n            , N2::value\n            >::type\n\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/equal_to.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/equal_to.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value\n    >\nstruct equal_to_impl\n    : if_c<\n          ( tag1_ > tag2_ )\n        , aux::cast2nd_impl< equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct equal_to_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct equal_to_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct equal_to_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct equal_to_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct equal_to\n    : aux::msvc_eti_base< typename apply_wrap2<\n          equal_to_impl<\n              typename equal_to_tag<N1>::type\n            , typename equal_to_tag<N2>::type\n            >\n        , N1\n        , N2\n        >::type >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, equal_to, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, equal_to)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct equal_to_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n    {\n        BOOST_STATIC_CONSTANT(bool, value =\n             ( BOOST_MPL_AUX_VALUE_WKND(N1)::value ==\n             BOOST_MPL_AUX_VALUE_WKND(N2)::value )\n            );\n        typedef bool_<value> type;\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl;\n\ntemplate< int N >\nstruct fold_chunk;\n\ntemplate<> struct fold_chunk<0>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State state0;\n        typedef state0 state;\n        typedef iter0 iterator;\n    };\n\n    /// ETI workaround\n    template<> struct result_< int,int,int,int >\n    {\n        typedef int state;\n        typedef int iterator;\n    };\n\n};\n\ntemplate<> struct fold_chunk<1>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State state0;\n        typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        \n\n        typedef state1 state;\n        typedef iter1 iterator;\n    };\n\n    /// ETI workaround\n    template<> struct result_< int,int,int,int >\n    {\n        typedef int state;\n        typedef int iterator;\n    };\n\n};\n\ntemplate<> struct fold_chunk<2>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State state0;\n        typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        \n\n        typedef state2 state;\n        typedef iter2 iterator;\n    };\n\n    /// ETI workaround\n    template<> struct result_< int,int,int,int >\n    {\n        typedef int state;\n        typedef int iterator;\n    };\n\n};\n\ntemplate<> struct fold_chunk<3>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State state0;\n        typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        \n\n        typedef state3 state;\n        typedef iter3 iterator;\n    };\n\n    /// ETI workaround\n    template<> struct result_< int,int,int,int >\n    {\n        typedef int state;\n        typedef int iterator;\n    };\n\n};\n\ntemplate<> struct fold_chunk<4>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State state0;\n        typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        typedef typename apply2< ForwardOp, state3, typename deref<iter3>::type >::type state4;\n        typedef typename mpl::next<iter3>::type iter4;\n        \n\n        typedef state4 state;\n        typedef iter4 iterator;\n    };\n\n    /// ETI workaround\n    template<> struct result_< int,int,int,int >\n    {\n        typedef int state;\n        typedef int iterator;\n    };\n\n};\n\ntemplate< int N >\nstruct fold_chunk\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef fold_impl<\n              4\n            , First\n            , Last\n            , State\n            , ForwardOp\n            > chunk_;\n\n        typedef fold_impl<\n              ( (N - 4) < 0 ? 0 : N - 4 )\n            , typename chunk_::iterator\n            , Last\n            , typename chunk_::state\n            , ForwardOp\n            > res_;\n\n        typedef typename res_::state state;\n        typedef typename res_::iterator iterator;\n    };\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_step;\n\ntemplate<\n      typename Last\n    , typename State\n    >\nstruct fold_null_step\n{\n    typedef Last iterator;\n    typedef State state;\n};\n\ntemplate<>\nstruct fold_chunk< -1 >\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef typename if_<\n              typename is_same< First,Last >::type\n            , fold_null_step< Last,State >\n            , fold_step< First,Last,State,ForwardOp >\n            >::type res_;\n\n        typedef typename res_::state state;\n        typedef typename res_::iterator iterator;\n    };\n\n    /// ETI workaround\n    template<> struct result_< int,int,int,int >\n    {\n        typedef int state;\n        typedef int iterator;\n    };\n\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_step\n{\n    typedef fold_chunk< -1 >::template result_<\n          typename mpl::next<First>::type\n        , Last\n        , typename apply2<ForwardOp,State, typename deref<First>::type>::type\n        , ForwardOp\n        > chunk_;\n\n    typedef typename chunk_::state state;\n    typedef typename chunk_::iterator iterator;\n};\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl\n    : fold_chunk<N>\n        ::template result_< First,Last,State,ForwardOp >\n{\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/full_lambda.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/full_lambda.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false\n    , bool C5 = false\n    >\nstruct lambda_or\n    : true_\n{\n};\n\ntemplate<>\nstruct lambda_or< false,false,false,false,false >\n    : false_\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename T\n    , typename Tag\n   \n    >\nstruct lambda\n{\n    typedef false_ is_le;\n    typedef T result_;\n    typedef T type;\n};\n\ntemplate<\n      typename T\n    >\nstruct is_lambda_expression\n    : lambda<T>::is_le\n{\n};\n\ntemplate< int N, typename Tag >\nstruct lambda< arg<N>, Tag >\n{\n    typedef true_ is_le;\n    typedef mpl::arg<N> result_; // qualified for the sake of MIPSpro 7.41\n    typedef mpl::protect<result_> type;\n};\n\ntemplate<\n      typename F\n    , typename Tag\n    >\nstruct lambda<\n          bind0<F>\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind0<\n          F\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1 > class F\n    , typename L1\n    >\nstruct le_result1\n{\n    typedef F<\n          typename L1::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1 > class F\n    , typename L1\n    >\nstruct le_result1< true_,Tag,F,L1 >\n{\n    typedef bind1<\n          quote1< F,Tag >\n        , typename L1::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1 > class F\n    , typename T1\n    , typename Tag\n    >\nstruct lambda<\n          F<T1>\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef typename l1::is_le is_le1;\n    typedef typename aux::lambda_or<\n          is_le1::value\n        >::type is_le;\n\n    typedef aux::le_result1<\n          is_le, Tag, F, l1\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1\n    , typename Tag\n    >\nstruct lambda<\n          bind1< F,T1 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind1<\n          F\n        , T1\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2 > class F\n    , typename L1, typename L2\n    >\nstruct le_result2\n{\n    typedef F<\n          typename L1::type, typename L2::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2 > class F\n    , typename L1, typename L2\n    >\nstruct le_result2< true_,Tag,F,L1,L2 >\n{\n    typedef bind2<\n          quote2< F,Tag >\n        , typename L1::result_, typename L2::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1, typename P2 > class F\n    , typename T1, typename T2\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2 >\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value\n        >::type is_le;\n\n    typedef aux::le_result2<\n          is_le, Tag, F, l1, l2\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    , typename Tag\n    >\nstruct lambda<\n          bind2< F,T1,T2 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind2<\n          F\n        , T1, T2\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2, typename P3 > class F\n    , typename L1, typename L2, typename L3\n    >\nstruct le_result3\n{\n    typedef F<\n          typename L1::type, typename L2::type, typename L3::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2, typename P3 > class F\n    , typename L1, typename L2, typename L3\n    >\nstruct le_result3< true_,Tag,F,L1,L2,L3 >\n{\n    typedef bind3<\n          quote3< F,Tag >\n        , typename L1::result_, typename L2::result_, typename L3::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1, typename P2, typename P3 > class F\n    , typename T1, typename T2, typename T3\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2,T3 >\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    typedef lambda< T3,Tag > l3;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    typedef typename l3::is_le is_le3;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value, is_le3::value\n        >::type is_le;\n\n    typedef aux::le_result3<\n          is_le, Tag, F, l1, l2, l3\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    , typename Tag\n    >\nstruct lambda<\n          bind3< F,T1,T2,T3 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind3<\n          F\n        , T1, T2, T3\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename L1, typename L2, typename L3, typename L4\n    >\nstruct le_result4\n{\n    typedef F<\n          typename L1::type, typename L2::type, typename L3::type\n        , typename L4::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename L1, typename L2, typename L3, typename L4\n    >\nstruct le_result4< true_,Tag,F,L1,L2,L3,L4 >\n{\n    typedef bind4<\n          quote4< F,Tag >\n        , typename L1::result_, typename L2::result_, typename L3::result_\n        , typename L4::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename T1, typename T2, typename T3, typename T4\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2,T3,T4 >\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    typedef lambda< T3,Tag > l3;\n    typedef lambda< T4,Tag > l4;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    typedef typename l3::is_le is_le3;\n    typedef typename l4::is_le is_le4;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value, is_le3::value, is_le4::value\n        >::type is_le;\n\n    typedef aux::le_result4<\n          is_le, Tag, F, l1, l2, l3, l4\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename Tag\n    >\nstruct lambda<\n          bind4< F,T1,T2,T3,T4 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind4<\n          F\n        , T1, T2, T3, T4\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F\n    , typename L1, typename L2, typename L3, typename L4, typename L5\n    >\nstruct le_result5\n{\n    typedef F<\n          typename L1::type, typename L2::type, typename L3::type\n        , typename L4::type, typename L5::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F\n    , typename L1, typename L2, typename L3, typename L4, typename L5\n    >\nstruct le_result5< true_,Tag,F,L1,L2,L3,L4,L5 >\n{\n    typedef bind5<\n          quote5< F,Tag >\n        , typename L1::result_, typename L2::result_, typename L3::result_\n        , typename L4::result_, typename L5::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template<\n          typename P1, typename P2, typename P3, typename P4\n        , typename P5\n        >\n      class F\n    , typename T1, typename T2, typename T3, typename T4, typename T5\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2,T3,T4,T5 >\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    typedef lambda< T3,Tag > l3;\n    typedef lambda< T4,Tag > l4;\n    typedef lambda< T5,Tag > l5;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    typedef typename l3::is_le is_le3;\n    typedef typename l4::is_le is_le4;\n    typedef typename l5::is_le is_le5;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value, is_le3::value, is_le4::value\n        , is_le5::value\n        >::type is_le;\n\n    typedef aux::le_result5<\n          is_le, Tag, F, l1, l2, l3, l4, l5\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    , typename Tag\n    >\nstruct lambda<\n          bind5< F,T1,T2,T3,T4,T5 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind5<\n          F\n        , T1, T2, T3, T4, T5\n        > result_;\n\n    typedef result_ type;\n};\n\n/// special case for 'protect'\ntemplate< typename T, typename Tag >\nstruct lambda< mpl::protect<T>, Tag >\n{\n    typedef false_ is_le;\n    typedef mpl::protect<T> result_;\n    typedef result_ type;\n};\n\n/// specializations for the main 'bind' form\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    , typename Tag\n    >\nstruct lambda<\n          bind< F,T1,T2,T3,T4,T5 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind< F,T1,T2,T3,T4,T5 > result_;\n    typedef result_ type;\n};\n\n/// workaround for MWCW 8.3+/EDG < 303, leads to ambiguity on Digital Mars\n\ntemplate<\n      typename F, typename Tag1, typename Tag2\n    >\nstruct lambda<\n          lambda< F,Tag1 >\n        , Tag2\n        >\n{\n    typedef lambda< F,Tag2 > l1;\n    typedef lambda< Tag1,Tag2 > l2;\n    typedef typename l1::is_le is_le;\n    typedef aux::le_result2<is_le, Tag2, mpl::lambda, l1, l2> le_result_;\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\nBOOST_MPL_AUX_NA_SPEC(2, lambda)\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/greater.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/greater.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value\n    >\nstruct greater_impl\n    : if_c<\n          ( tag1_ > tag2_ )\n        , aux::cast2nd_impl< greater_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< greater_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct greater_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct greater_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct greater_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct greater_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct greater\n    : aux::msvc_eti_base< typename apply_wrap2<\n          greater_impl<\n              typename greater_tag<N1>::type\n            , typename greater_tag<N2>::type\n            >\n        , N1\n        , N2\n        >::type >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, greater)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct greater_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n    {\n        BOOST_STATIC_CONSTANT(bool, value =\n             ( BOOST_MPL_AUX_VALUE_WKND(N1)::value >\n             BOOST_MPL_AUX_VALUE_WKND(N2)::value )\n            );\n        typedef bool_<value> type;\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/greater_equal.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/greater_equal.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value\n    >\nstruct greater_equal_impl\n    : if_c<\n          ( tag1_ > tag2_ )\n        , aux::cast2nd_impl< greater_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< greater_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct greater_equal_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct greater_equal_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct greater_equal_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct greater_equal_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct greater_equal\n    : aux::msvc_eti_base< typename apply_wrap2<\n          greater_equal_impl<\n              typename greater_equal_tag<N1>::type\n            , typename greater_equal_tag<N2>::type\n            >\n        , N1\n        , N2\n        >::type >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater_equal, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, greater_equal)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct greater_equal_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n    {\n        BOOST_STATIC_CONSTANT(bool, value =\n             ( BOOST_MPL_AUX_VALUE_WKND(N1)::value >=\n             BOOST_MPL_AUX_VALUE_WKND(N2)::value )\n            );\n        typedef bool_<value> type;\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/inherit.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/inherit.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate< bool C1, bool C2 >\nstruct inherit2_impl\n{\n    template< typename Derived, typename T1, typename T2 > struct result_\n        : T1, T2\n    {\n        typedef Derived type_;\n    };\n};\n\ntemplate<>\nstruct inherit2_impl< false,true >\n{\n    template< typename Derived, typename T1, typename T2 > struct result_\n        : T1\n    {\n        typedef T1 type_;\n    };\n};\n\ntemplate<>\nstruct inherit2_impl< true,false >\n{\n    template< typename Derived, typename T1, typename T2 > struct result_\n        : T2\n    {\n        typedef T2 type_;\n    };\n};\n\ntemplate<>\nstruct inherit2_impl< true,true >\n{\n    template< typename Derived, typename T1, typename T2 > struct result_\n    {\n        typedef T1 type_;\n    };\n};\n\n} // namespace aux\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    >\nstruct inherit2\n    : aux::inherit2_impl<\n          is_empty_base<T1>::value\n        , is_empty_base<T2>::value\n        >::template result_< inherit2< T1,T2 >,T1, T2 >\n{\n    typedef typename inherit2::type_ type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, inherit2, (T1, T2))\n};\n\nBOOST_MPL_AUX_NA_SPEC(2, inherit2)\n\ntemplate<\n      typename T1 = na, typename T2 = na, typename T3 = na\n    >\nstruct inherit3\n    : inherit2<\n          typename inherit2<\n              T1, T2\n            >::type\n        , T3\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          3\n        , inherit3\n        , ( T1, T2, T3)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC(3, inherit3)\n\ntemplate<\n      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na\n    >\nstruct inherit4\n    : inherit2<\n          typename inherit3<\n              T1, T2, T3\n            >::type\n        , T4\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          4\n        , inherit4\n        , ( T1, T2, T3, T4)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC(4, inherit4)\n\ntemplate<\n      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na\n    , typename T5 = na\n    >\nstruct inherit5\n    : inherit2<\n          typename inherit4<\n              T1, T2, T3, T4\n            >::type\n        , T5\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , inherit5\n        , ( T1, T2, T3, T4, T5)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC(5, inherit5)\n\n/// primary template\n\ntemplate<\n      typename T1 = empty_base, typename T2 = empty_base\n    , typename T3 = empty_base, typename T4 = empty_base\n    , typename T5 = empty_base\n    >\nstruct inherit\n    : inherit5< T1,T2,T3,T4,T5 >\n{\n};\n\ntemplate<>\nstruct inherit< na,na,na,na,na >\n{\n    template<\n\n          typename T1 = empty_base, typename T2 = empty_base\n        , typename T3 = empty_base, typename T4 = empty_base\n        , typename T5 = empty_base\n\n        >\n    struct apply\n        : inherit< T1,T2,T3,T4,T5 >\n    {\n    };\n};\n\nBOOST_MPL_AUX_NA_SPEC_LAMBDA(5, inherit)\nBOOST_MPL_AUX_NA_SPEC_ARITY(5, inherit)\nBOOST_MPL_AUX_NA_SPEC_TEMPLATE_ARITY(5, 5, inherit)\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/iter_fold_if_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n// Copyright David Abrahams 2001-2002\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/iter_fold_if_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< typename Iterator, typename State >\nstruct iter_fold_if_null_step\n{\n    typedef State state;\n    typedef Iterator iterator;\n};\n\ntemplate< bool >\nstruct iter_fold_if_step_impl\n{\n    template<\n          typename Iterator\n        , typename State\n        , typename StateOp\n        , typename IteratorOp\n        >\n    struct result_\n    {\n        typedef typename apply2< StateOp,State,Iterator >::type state;\n        typedef typename IteratorOp::type iterator;\n    };\n};\n\ntemplate<>\nstruct iter_fold_if_step_impl<false>\n{\n    template<\n          typename Iterator\n        , typename State\n        , typename StateOp\n        , typename IteratorOp\n        >\n    struct result_\n    {\n        typedef State state;\n        typedef Iterator iterator;\n    };\n};\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename ForwardOp\n    , typename Predicate\n    >\nstruct iter_fold_if_forward_step\n{\n    typedef typename apply2< Predicate,State,Iterator >::type not_last;\n    typedef typename iter_fold_if_step_impl<\n          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value\n        >::template result_< Iterator,State,ForwardOp, mpl::next<Iterator> > impl_;\n\n    typedef typename impl_::state state;\n    typedef typename impl_::iterator iterator;\n};\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename BackwardOp\n    , typename Predicate\n    >\nstruct iter_fold_if_backward_step\n{\n    typedef typename apply2< Predicate,State,Iterator >::type not_last;\n    typedef typename iter_fold_if_step_impl<\n          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value\n        >::template result_< Iterator,State,BackwardOp, identity<Iterator> > impl_;\n\n    typedef typename impl_::state state;\n    typedef typename impl_::iterator iterator;\n};\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename ForwardOp\n    , typename ForwardPredicate\n    , typename BackwardOp\n    , typename BackwardPredicate\n    >\nstruct iter_fold_if_impl\n{\n private:\n    typedef iter_fold_if_null_step< Iterator,State > forward_step0;\n    typedef iter_fold_if_forward_step< typename forward_step0::iterator, typename forward_step0::state, ForwardOp, ForwardPredicate > forward_step1;\n    typedef iter_fold_if_forward_step< typename forward_step1::iterator, typename forward_step1::state, ForwardOp, ForwardPredicate > forward_step2;\n    typedef iter_fold_if_forward_step< typename forward_step2::iterator, typename forward_step2::state, ForwardOp, ForwardPredicate > forward_step3;\n    typedef iter_fold_if_forward_step< typename forward_step3::iterator, typename forward_step3::state, ForwardOp, ForwardPredicate > forward_step4;\n    \n\n    typedef typename if_<\n          typename forward_step4::not_last\n        , iter_fold_if_impl<\n              typename forward_step4::iterator\n            , typename forward_step4::state\n            , ForwardOp\n            , ForwardPredicate\n            , BackwardOp\n            , BackwardPredicate\n            >\n        , iter_fold_if_null_step<\n              typename forward_step4::iterator\n            , typename forward_step4::state\n            >\n        >::type backward_step4;\n\n    typedef iter_fold_if_backward_step< typename forward_step3::iterator, typename backward_step4::state, BackwardOp, BackwardPredicate > backward_step3;\n    typedef iter_fold_if_backward_step< typename forward_step2::iterator, typename backward_step3::state, BackwardOp, BackwardPredicate > backward_step2;\n    typedef iter_fold_if_backward_step< typename forward_step1::iterator, typename backward_step2::state, BackwardOp, BackwardPredicate > backward_step1;\n    typedef iter_fold_if_backward_step< typename forward_step0::iterator, typename backward_step1::state, BackwardOp, BackwardPredicate > backward_step0;\n    \n\n public:\n    typedef typename backward_step0::state state;\n    typedef typename backward_step4::iterator iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/iter_fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/iter_fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl;\n\ntemplate< int N >\nstruct iter_fold_chunk;\n\ntemplate<> struct iter_fold_chunk<0>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State state0;\n        typedef state0 state;\n        typedef iter0 iterator;\n    };\n\n    /// ETI workaround\n    template<> struct result_< int,int,int,int >\n    {\n        typedef int state;\n        typedef int iterator;\n    };\n\n};\n\ntemplate<> struct iter_fold_chunk<1>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State state0;\n        typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        \n\n        typedef state1 state;\n        typedef iter1 iterator;\n    };\n\n    /// ETI workaround\n    template<> struct result_< int,int,int,int >\n    {\n        typedef int state;\n        typedef int iterator;\n    };\n\n};\n\ntemplate<> struct iter_fold_chunk<2>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State state0;\n        typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp,state1,iter1 >::type state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        \n\n        typedef state2 state;\n        typedef iter2 iterator;\n    };\n\n    /// ETI workaround\n    template<> struct result_< int,int,int,int >\n    {\n        typedef int state;\n        typedef int iterator;\n    };\n\n};\n\ntemplate<> struct iter_fold_chunk<3>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State state0;\n        typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp,state1,iter1 >::type state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp,state2,iter2 >::type state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        \n\n        typedef state3 state;\n        typedef iter3 iterator;\n    };\n\n    /// ETI workaround\n    template<> struct result_< int,int,int,int >\n    {\n        typedef int state;\n        typedef int iterator;\n    };\n\n};\n\ntemplate<> struct iter_fold_chunk<4>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State state0;\n        typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp,state1,iter1 >::type state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp,state2,iter2 >::type state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        typedef typename apply2< ForwardOp,state3,iter3 >::type state4;\n        typedef typename mpl::next<iter3>::type iter4;\n        \n\n        typedef state4 state;\n        typedef iter4 iterator;\n    };\n\n    /// ETI workaround\n    template<> struct result_< int,int,int,int >\n    {\n        typedef int state;\n        typedef int iterator;\n    };\n\n};\n\ntemplate< int N >\nstruct iter_fold_chunk\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef iter_fold_impl<\n              4\n            , First\n            , Last\n            , State\n            , ForwardOp\n            > chunk_;\n\n        typedef iter_fold_impl<\n              ( (N - 4) < 0 ? 0 : N - 4 )\n            , typename chunk_::iterator\n            , Last\n            , typename chunk_::state\n            , ForwardOp\n            > res_;\n\n        typedef typename res_::state state;\n        typedef typename res_::iterator iterator;\n    };\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_step;\n\ntemplate<\n      typename Last\n    , typename State\n    >\nstruct iter_fold_null_step\n{\n    typedef Last iterator;\n    typedef State state;\n};\n\ntemplate<>\nstruct iter_fold_chunk< -1 >\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef typename if_<\n              typename is_same< First,Last >::type\n            , iter_fold_null_step< Last,State >\n            , iter_fold_step< First,Last,State,ForwardOp >\n            >::type res_;\n\n        typedef typename res_::state state;\n        typedef typename res_::iterator iterator;\n    };\n\n    /// ETI workaround\n    template<> struct result_< int,int,int,int >\n    {\n        typedef int state;\n        typedef int iterator;\n    };\n\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_step\n{\n    typedef iter_fold_chunk< -1 >::template result_<\n          typename mpl::next<First>::type\n        , Last\n        , typename apply2< ForwardOp,State,First >::type\n        , ForwardOp\n        > chunk_;\n\n    typedef typename chunk_::state state;\n    typedef typename chunk_::iterator iterator;\n};\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl\n    : iter_fold_chunk<N>\n        ::template result_< First,Last,State,ForwardOp >\n{\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/lambda_no_ctps.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/lambda_no_ctps.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false\n    , bool C5 = false\n    >\nstruct lambda_or\n    : true_\n{\n};\n\ntemplate<>\nstruct lambda_or< false,false,false,false,false >\n    : false_\n{\n};\n\ntemplate< typename Arity > struct lambda_impl\n{\n    template< typename T, typename Tag, typename Protect > struct result_\n    {\n        typedef T type;\n        typedef is_placeholder<T> is_le;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<1> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef typename l1::is_le is_le1;\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value\n            > is_le;\n\n        typedef bind1<\n              typename F::rebind\n            , typename l1::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<2> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value\n            > is_le;\n\n        typedef bind2<\n              typename F::rebind\n            , typename l1::type, typename l2::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<3> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        typedef lambda< typename F::arg3, Tag, false_ > l3;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        typedef typename l3::is_le is_le3;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value\n            > is_le;\n\n        typedef bind3<\n              typename F::rebind\n            , typename l1::type, typename l2::type, typename l3::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<4> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        typedef lambda< typename F::arg3, Tag, false_ > l3;\n        typedef lambda< typename F::arg4, Tag, false_ > l4;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        typedef typename l3::is_le is_le3;\n        typedef typename l4::is_le is_le4;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value\n            > is_le;\n\n        typedef bind4<\n              typename F::rebind\n            , typename l1::type, typename l2::type, typename l3::type\n            , typename l4::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<5> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        typedef lambda< typename F::arg3, Tag, false_ > l3;\n        typedef lambda< typename F::arg4, Tag, false_ > l4;\n        typedef lambda< typename F::arg5, Tag, false_ > l5;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        typedef typename l3::is_le is_le3;\n        typedef typename l4::is_le is_le4;\n        typedef typename l5::is_le is_le5;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le5)::value\n            > is_le;\n\n        typedef bind5<\n              typename F::rebind\n            , typename l1::type, typename l2::type, typename l3::type\n            , typename l4::type, typename l5::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\n} // namespace aux\n\ntemplate<\n      typename T\n    , typename Tag\n    , typename Protect\n    >\nstruct lambda\n{\n    /// Metafunction forwarding confuses MSVC 6.x\n    typedef typename aux::template_arity<T>::type arity_;\n    typedef typename aux::lambda_impl<arity_>\n        ::template result_< T,Tag,Protect > l_;\n\n    typedef typename l_::type type;\n    typedef typename l_::is_le is_le;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(3, lambda, (T, Tag, Protect))\n};\n\nBOOST_MPL_AUX_NA_SPEC2(1, 3, lambda)\n\ntemplate<\n      typename T\n    >\nstruct is_lambda_expression\n    : lambda<T>::is_le\n{\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/less.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/less.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value\n    >\nstruct less_impl\n    : if_c<\n          ( tag1_ > tag2_ )\n        , aux::cast2nd_impl< less_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< less_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct less_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct less_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct less_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct less_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct less\n    : aux::msvc_eti_base< typename apply_wrap2<\n          less_impl<\n              typename less_tag<N1>::type\n            , typename less_tag<N2>::type\n            >\n        , N1\n        , N2\n        >::type >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, less)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct less_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n    {\n        BOOST_STATIC_CONSTANT(bool, value =\n             ( BOOST_MPL_AUX_VALUE_WKND(N2)::value >\n             BOOST_MPL_AUX_VALUE_WKND(N1)::value )\n            );\n        typedef bool_<value> type;\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/less_equal.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/less_equal.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value\n    >\nstruct less_equal_impl\n    : if_c<\n          ( tag1_ > tag2_ )\n        , aux::cast2nd_impl< less_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< less_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct less_equal_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct less_equal_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct less_equal_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct less_equal_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct less_equal\n    : aux::msvc_eti_base< typename apply_wrap2<\n          less_equal_impl<\n              typename less_equal_tag<N1>::type\n            , typename less_equal_tag<N2>::type\n            >\n        , N1\n        , N2\n        >::type >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less_equal, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, less_equal)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct less_equal_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n    {\n        BOOST_STATIC_CONSTANT(bool, value =\n             ( BOOST_MPL_AUX_VALUE_WKND(N1)::value <=\n             BOOST_MPL_AUX_VALUE_WKND(N2)::value )\n            );\n        typedef bool_<value> type;\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/list.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/list.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< int N >\nstruct list_chooser;\n\n}\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<0>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef list0<\n             \n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<1>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list1<\n              T0\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<2>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list2<\n              T0, T1\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<3>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list3<\n              T0, T1, T2\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<4>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list4<\n              T0, T1, T2, T3\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<5>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list5<\n              T0, T1, T2, T3, T4\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<6>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list6<\n              T0, T1, T2, T3, T4, T5\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<7>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list7<\n              T0, T1, T2, T3, T4, T5, T6\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<8>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list8<\n              T0, T1, T2, T3, T4, T5, T6, T7\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<9>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list9<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<10>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list10<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<11>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list11<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<12>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list12<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<13>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list13<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<14>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list14<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<15>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list15<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<16>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list16<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<17>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list17<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<18>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list18<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<19>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list19<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<20>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list20<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate< typename T >\nstruct is_list_arg\n{\n    BOOST_STATIC_CONSTANT(bool, value  = true);\n};\n\ntemplate<>\nstruct is_list_arg<na>\n{\n    BOOST_STATIC_CONSTANT(bool, value  = false);\n};\n\ntemplate<\n      typename T1, typename T2, typename T3, typename T4, typename T5\n    , typename T6, typename T7, typename T8, typename T9, typename T10\n    , typename T11, typename T12, typename T13, typename T14, typename T15\n    , typename T16, typename T17, typename T18, typename T19, typename T20\n    >\nstruct list_count_args\n{\n    BOOST_STATIC_CONSTANT(int, value =\n          is_list_arg<T1>::value + is_list_arg<T2>::value \n        + is_list_arg<T3>::value + is_list_arg<T4>::value \n        + is_list_arg<T5>::value + is_list_arg<T6>::value \n        + is_list_arg<T7>::value + is_list_arg<T8>::value \n        + is_list_arg<T9>::value + is_list_arg<T10>::value \n        + is_list_arg<T11>::value + is_list_arg<T12>::value \n        + is_list_arg<T13>::value + is_list_arg<T14>::value \n        + is_list_arg<T15>::value + is_list_arg<T16>::value \n        + is_list_arg<T17>::value + is_list_arg<T18>::value \n        + is_list_arg<T19>::value + is_list_arg<T20>::value\n        );\n\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct list_impl\n{\n    typedef aux::list_count_args<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        > arg_num_;\n\n    typedef typename aux::list_chooser< arg_num_::value >\n        ::template result_< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct list\n    : aux::list_impl<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        >::type\n{\n    typedef typename aux::list_impl<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/list_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/list_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< int N >\nstruct list_c_chooser;\n\n}\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<0>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list0_c<\n              T\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<1>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list1_c<\n              T, C0\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<2>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list2_c<\n              T, C0, C1\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<3>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list3_c<\n              T, C0, C1, C2\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<4>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list4_c<\n              T, C0, C1, C2, C3\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<5>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list5_c<\n              T, C0, C1, C2, C3, C4\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<6>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list6_c<\n              T, C0, C1, C2, C3, C4, C5\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<7>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list7_c<\n              T, C0, C1, C2, C3, C4, C5, C6\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<8>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list8_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<9>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list9_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<10>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list10_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<11>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list11_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<12>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list12_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<13>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list13_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<14>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list14_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<15>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list15_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<16>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list16_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<17>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list17_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<18>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list18_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<19>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list19_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<20>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list20_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate< long C >\nstruct is_list_c_arg\n{\n    BOOST_STATIC_CONSTANT(bool, value  = true);\n};\n\ntemplate<>\nstruct is_list_c_arg<LONG_MAX>\n{\n    BOOST_STATIC_CONSTANT(bool, value  = false);\n};\n\ntemplate<\n      long C1, long C2, long C3, long C4, long C5, long C6, long C7, long C8\n    , long C9, long C10, long C11, long C12, long C13, long C14, long C15\n    , long C16, long C17, long C18, long C19, long C20\n    >\nstruct list_c_count_args\n{\n    BOOST_STATIC_CONSTANT(int, value =\n          is_list_c_arg<C1>::value + is_list_c_arg<C2>::value \n        + is_list_c_arg<C3>::value + is_list_c_arg<C4>::value \n        + is_list_c_arg<C5>::value + is_list_c_arg<C6>::value \n        + is_list_c_arg<C7>::value + is_list_c_arg<C8>::value \n        + is_list_c_arg<C9>::value + is_list_c_arg<C10>::value \n        + is_list_c_arg<C11>::value + is_list_c_arg<C12>::value \n        + is_list_c_arg<C13>::value + is_list_c_arg<C14>::value \n        + is_list_c_arg<C15>::value + is_list_c_arg<C16>::value \n        + is_list_c_arg<C17>::value + is_list_c_arg<C18>::value \n        + is_list_c_arg<C19>::value + is_list_c_arg<C20>::value\n        );\n\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n    >\nstruct list_c_impl\n{\n    typedef aux::list_c_count_args<\n          C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19\n        > arg_num_;\n\n    typedef typename aux::list_c_chooser< arg_num_::value >\n        ::template result_< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX\n    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX\n    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX\n    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX\n    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX\n    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX\n    , long C18 = LONG_MAX, long C19 = LONG_MAX\n    >\nstruct list_c\n    : aux::list_c_impl<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19\n        >::type\n{\n    typedef typename aux::list_c_impl<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19\n        >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/map.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/map.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< int N >\nstruct map_chooser;\n\n}\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<0>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef map0<\n             \n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<1>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map1<\n              T0\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<2>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map2<\n              T0, T1\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<3>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map3<\n              T0, T1, T2\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<4>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map4<\n              T0, T1, T2, T3\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<5>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map5<\n              T0, T1, T2, T3, T4\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<6>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map6<\n              T0, T1, T2, T3, T4, T5\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<7>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map7<\n              T0, T1, T2, T3, T4, T5, T6\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<8>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map8<\n              T0, T1, T2, T3, T4, T5, T6, T7\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<9>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map9<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<10>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map10<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<11>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map11<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<12>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map12<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<13>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map13<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<14>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map14<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<15>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map15<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<16>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map16<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<17>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map17<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<18>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map18<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<19>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map19<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<20>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map20<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate< typename T >\nstruct is_map_arg\n{\n    BOOST_STATIC_CONSTANT(bool, value  = true);\n};\n\ntemplate<>\nstruct is_map_arg<na>\n{\n    BOOST_STATIC_CONSTANT(bool, value  = false);\n};\n\ntemplate<\n      typename T1, typename T2, typename T3, typename T4, typename T5\n    , typename T6, typename T7, typename T8, typename T9, typename T10\n    , typename T11, typename T12, typename T13, typename T14, typename T15\n    , typename T16, typename T17, typename T18, typename T19, typename T20\n    >\nstruct map_count_args\n{\n    BOOST_STATIC_CONSTANT(int, value =\n          is_map_arg<T1>::value + is_map_arg<T2>::value \n        + is_map_arg<T3>::value + is_map_arg<T4>::value \n        + is_map_arg<T5>::value + is_map_arg<T6>::value \n        + is_map_arg<T7>::value + is_map_arg<T8>::value \n        + is_map_arg<T9>::value + is_map_arg<T10>::value \n        + is_map_arg<T11>::value + is_map_arg<T12>::value \n        + is_map_arg<T13>::value + is_map_arg<T14>::value \n        + is_map_arg<T15>::value + is_map_arg<T16>::value \n        + is_map_arg<T17>::value + is_map_arg<T18>::value \n        + is_map_arg<T19>::value + is_map_arg<T20>::value\n        );\n\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct map_impl\n{\n    typedef aux::map_count_args<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        > arg_num_;\n\n    typedef typename aux::map_chooser< arg_num_::value >\n        ::template result_< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct map\n    : aux::map_impl<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        >::type\n{\n    typedef typename aux::map_impl<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/minus.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/minus.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value\n    >\nstruct minus_impl\n    : if_c<\n          ( tag1_ > tag2_ )\n        , aux::cast2nd_impl< minus_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< minus_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct minus_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct minus_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct minus_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct minus_tag\n{\n    typedef typename T::tag type;\n};\n\n/// forward declaration\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct minus2;\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct minus\n\n    : if_<\n\n          is_na<N3>\n        , minus2< N1,N2 >\n        , minus<\n              minus2< N1,N2 >\n            , N3, N4, N5\n            >\n        >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , minus\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1\n    , typename N2\n    >\nstruct minus2\n    : aux::msvc_eti_base< typename apply_wrap2<\n          minus_impl<\n              typename minus_tag<N1>::type\n            , typename minus_tag<N2>::type\n            >\n        , N1\n        , N2\n        >::type >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, minus2, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, minus)\n\n}}\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< typename T, T n1, T n2 >\nstruct minus_wknd\n{\n    BOOST_STATIC_CONSTANT(T, value  = (n1 - n2));\n    typedef integral_c< T,value > type;\n};\n\n}\n\ntemplate<>\nstruct minus_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n        : aux::minus_wknd<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , N1::value\n            , N2::value\n            >::type\n\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/modulus.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/modulus.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value\n    >\nstruct modulus_impl\n    : if_c<\n          ( tag1_ > tag2_ )\n        , aux::cast2nd_impl< modulus_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< modulus_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct modulus_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct modulus_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct modulus_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct modulus_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct modulus\n    : aux::msvc_eti_base< typename apply_wrap2<\n          modulus_impl<\n              typename modulus_tag<N1>::type\n            , typename modulus_tag<N2>::type\n            >\n        , N1\n        , N2\n        >::type >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, modulus, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, modulus)\n\n}}\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< typename T, T n1, T n2 >\nstruct modulus_wknd\n{\n    BOOST_STATIC_CONSTANT(T, value  = (n1 % n2));\n    typedef integral_c< T,value > type;\n};\n\n}\n\ntemplate<>\nstruct modulus_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n        : aux::modulus_wknd<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , N1::value\n            , N2::value\n            >::type\n\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/not_equal_to.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/not_equal_to.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value\n    >\nstruct not_equal_to_impl\n    : if_c<\n          ( tag1_ > tag2_ )\n        , aux::cast2nd_impl< not_equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< not_equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct not_equal_to_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct not_equal_to_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct not_equal_to_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct not_equal_to_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct not_equal_to\n    : aux::msvc_eti_base< typename apply_wrap2<\n          not_equal_to_impl<\n              typename not_equal_to_tag<N1>::type\n            , typename not_equal_to_tag<N2>::type\n            >\n        , N1\n        , N2\n        >::type >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, not_equal_to, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, not_equal_to)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct not_equal_to_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n    {\n        BOOST_STATIC_CONSTANT(bool, value =\n             ( BOOST_MPL_AUX_VALUE_WKND(N1)::value !=\n             BOOST_MPL_AUX_VALUE_WKND(N2)::value )\n            );\n        typedef bool_<value> type;\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/or.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/or.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< bool C_ > struct or_impl\n{\n    template<\n          typename T1, typename T2, typename T3, typename T4\n        >\n    struct result_\n        : true_\n    {\n    };\n};\n\ntemplate<> struct or_impl<false>\n{\n    template<\n          typename T1, typename T2, typename T3, typename T4\n        >\n    struct result_\n        : or_impl<\n              BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n            >::template result_< T2,T3,T4,false_ >\n    {\n    };\n};\n\ntemplate<>\nstruct or_impl<false>\n    ::result_< false_,false_,false_,false_ >\n        : false_\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    , typename T3 = false_, typename T4 = false_, typename T5 = false_\n    >\nstruct or_\n\n    : aux::or_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        >::template result_< T2,T3,T4,T5 >\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , or_\n        , ( T1, T2, T3, T4, T5)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC2(\n      2\n    , 5\n    , or_\n    )\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/placeholders.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n// Copyright Peter Dimov 2001-2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/placeholders.hpp\" header\n// -- DO NOT modify by hand!\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg< -1 > _;\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_;\n}\n\n}}\n\n/// agurt, 17/mar/02: one more placeholder for the last 'apply#' \n/// specialization\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<1> _1;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_1)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_1;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<2> _2;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_2)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_2;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<3> _3;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_3)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_3;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<4> _4;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_4)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_4;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<5> _5;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_5)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_5;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<6> _6;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_6)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_6;\n}\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/plus.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/plus.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value\n    >\nstruct plus_impl\n    : if_c<\n          ( tag1_ > tag2_ )\n        , aux::cast2nd_impl< plus_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< plus_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct plus_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct plus_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct plus_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct plus_tag\n{\n    typedef typename T::tag type;\n};\n\n/// forward declaration\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct plus2;\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct plus\n\n    : if_<\n\n          is_na<N3>\n        , plus2< N1,N2 >\n        , plus<\n              plus2< N1,N2 >\n            , N3, N4, N5\n            >\n        >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , plus\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1\n    , typename N2\n    >\nstruct plus2\n    : aux::msvc_eti_base< typename apply_wrap2<\n          plus_impl<\n              typename plus_tag<N1>::type\n            , typename plus_tag<N2>::type\n            >\n        , N1\n        , N2\n        >::type >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, plus2, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, plus)\n\n}}\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< typename T, T n1, T n2 >\nstruct plus_wknd\n{\n    BOOST_STATIC_CONSTANT(T, value  = (n1 + n2));\n    typedef integral_c< T,value > type;\n};\n\n}\n\ntemplate<>\nstruct plus_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n        : aux::plus_wknd<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , N1::value\n            , N2::value\n            >::type\n\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/quote.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/quote.hpp\" header\n// -- DO NOT modify by hand!\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/reverse_fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/reverse_fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl;\n\ntemplate< long N >\nstruct reverse_fold_chunk;\n\ntemplate<> struct reverse_fold_chunk<0>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef fwd_state0 bkwd_state0;\n        typedef bkwd_state0 state;\n        typedef iter0 iterator;\n    };\n\n    /// ETI workaround\n    template<> struct result_< int,int,int,int,int >\n    {\n        typedef int state;\n        typedef int iterator;\n    };\n\n};\n\ntemplate<> struct reverse_fold_chunk<1>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        \n\n        typedef fwd_state1 bkwd_state1;\n        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n        typedef bkwd_state0 state;\n        typedef iter1 iterator;\n    };\n\n    /// ETI workaround\n    template<> struct result_< int,int,int,int,int >\n    {\n        typedef int state;\n        typedef int iterator;\n    };\n\n};\n\ntemplate<> struct reverse_fold_chunk<2>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        \n\n        typedef fwd_state2 bkwd_state2;\n        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter2 iterator;\n    };\n\n    /// ETI workaround\n    template<> struct result_< int,int,int,int,int >\n    {\n        typedef int state;\n        typedef int iterator;\n    };\n\n};\n\ntemplate<> struct reverse_fold_chunk<3>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        \n\n        typedef fwd_state3 bkwd_state3;\n        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;\n        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter3 iterator;\n    };\n\n    /// ETI workaround\n    template<> struct result_< int,int,int,int,int >\n    {\n        typedef int state;\n        typedef int iterator;\n    };\n\n};\n\ntemplate<> struct reverse_fold_chunk<4>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;\n        typedef typename mpl::next<iter3>::type iter4;\n        \n\n        typedef fwd_state4 bkwd_state4;\n        typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;\n        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;\n        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter4 iterator;\n    };\n\n    /// ETI workaround\n    template<> struct result_< int,int,int,int,int >\n    {\n        typedef int state;\n        typedef int iterator;\n    };\n\n};\n\ntemplate< long N >\nstruct reverse_fold_chunk\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;\n        typedef typename mpl::next<iter3>::type iter4;\n        \n\n        typedef reverse_fold_impl<\n              ( (N - 4) < 0 ? 0 : N - 4 )\n            , iter4\n            , Last\n            , fwd_state4\n            , BackwardOp\n            , ForwardOp\n            > nested_chunk;\n\n        typedef typename nested_chunk::state bkwd_state4;\n        typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;\n        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;\n        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef typename nested_chunk::iterator iterator;\n    };\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_step;\n\ntemplate<\n      typename Last\n    , typename State\n    >\nstruct reverse_fold_null_step\n{\n    typedef Last iterator;\n    typedef State state;\n};\n\ntemplate<>\nstruct reverse_fold_chunk< -1 >\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef typename if_<\n              typename is_same< First,Last >::type\n            , reverse_fold_null_step< Last,State >\n            , reverse_fold_step< First,Last,State,BackwardOp,ForwardOp >\n            >::type res_;\n\n        typedef typename res_::state state;\n        typedef typename res_::iterator iterator;\n    };\n\n    /// ETI workaround\n    template<> struct result_< int,int,int,int,int >\n    {\n        typedef int state;\n        typedef int iterator;\n    };\n\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_step\n{\n    typedef reverse_fold_chunk< -1 >::template result_<\n          typename mpl::next<First>::type\n        , Last\n        , typename apply2<ForwardOp,State, typename deref<First>::type>::type\n        , BackwardOp\n        , ForwardOp\n        > nested_step;\n\n    typedef typename apply2<\n          BackwardOp\n        , typename nested_step::state\n        , typename deref<First>::type\n        >::type state;\n\n    typedef typename nested_step::iterator iterator;\n};\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl\n    : reverse_fold_chunk<N>\n        ::template result_< First,Last,State,BackwardOp,ForwardOp >\n{\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/reverse_iter_fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/reverse_iter_fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl;\n\ntemplate< long N >\nstruct reverse_iter_fold_chunk;\n\ntemplate<> struct reverse_iter_fold_chunk<0>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef fwd_state0 bkwd_state0;\n        typedef bkwd_state0 state;\n        typedef iter0 iterator;\n    };\n\n    /// ETI workaround\n    template<> struct result_< int,int,int,int,int >\n    {\n        typedef int state;\n        typedef int iterator;\n    };\n\n};\n\ntemplate<> struct reverse_iter_fold_chunk<1>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        \n\n        typedef fwd_state1 bkwd_state1;\n        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n        typedef bkwd_state0 state;\n        typedef iter1 iterator;\n    };\n\n    /// ETI workaround\n    template<> struct result_< int,int,int,int,int >\n    {\n        typedef int state;\n        typedef int iterator;\n    };\n\n};\n\ntemplate<> struct reverse_iter_fold_chunk<2>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        \n\n        typedef fwd_state2 bkwd_state2;\n        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter2 iterator;\n    };\n\n    /// ETI workaround\n    template<> struct result_< int,int,int,int,int >\n    {\n        typedef int state;\n        typedef int iterator;\n    };\n\n};\n\ntemplate<> struct reverse_iter_fold_chunk<3>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        \n\n        typedef fwd_state3 bkwd_state3;\n        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;\n        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter3 iterator;\n    };\n\n    /// ETI workaround\n    template<> struct result_< int,int,int,int,int >\n    {\n        typedef int state;\n        typedef int iterator;\n    };\n\n};\n\ntemplate<> struct reverse_iter_fold_chunk<4>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;\n        typedef typename mpl::next<iter3>::type iter4;\n        \n\n        typedef fwd_state4 bkwd_state4;\n        typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;\n        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;\n        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter4 iterator;\n    };\n\n    /// ETI workaround\n    template<> struct result_< int,int,int,int,int >\n    {\n        typedef int state;\n        typedef int iterator;\n    };\n\n};\n\ntemplate< long N >\nstruct reverse_iter_fold_chunk\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;\n        typedef typename mpl::next<iter3>::type iter4;\n        \n\n        typedef reverse_iter_fold_impl<\n              ( (N - 4) < 0 ? 0 : N - 4 )\n            , iter4\n            , Last\n            , fwd_state4\n            , BackwardOp\n            , ForwardOp\n            > nested_chunk;\n\n        typedef typename nested_chunk::state bkwd_state4;\n        typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;\n        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;\n        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef typename nested_chunk::iterator iterator;\n    };\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_step;\n\ntemplate<\n      typename Last\n    , typename State\n    >\nstruct reverse_iter_fold_null_step\n{\n    typedef Last iterator;\n    typedef State state;\n};\n\ntemplate<>\nstruct reverse_iter_fold_chunk< -1 >\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef typename if_<\n              typename is_same< First,Last >::type\n            , reverse_iter_fold_null_step< Last,State >\n            , reverse_iter_fold_step< First,Last,State,BackwardOp,ForwardOp >\n            >::type res_;\n\n        typedef typename res_::state state;\n        typedef typename res_::iterator iterator;\n    };\n\n    /// ETI workaround\n    template<> struct result_< int,int,int,int,int >\n    {\n        typedef int state;\n        typedef int iterator;\n    };\n\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_step\n{\n    typedef reverse_iter_fold_chunk< -1 >::template result_<\n          typename mpl::next<First>::type\n        , Last\n        , typename apply2< ForwardOp,State,First >::type\n        , BackwardOp\n        , ForwardOp\n        > nested_step;\n\n    typedef typename apply2<\n          BackwardOp\n        , typename nested_step::state\n        , First\n        >::type state;\n\n    typedef typename nested_step::iterator iterator;\n};\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl\n    : reverse_iter_fold_chunk<N>\n        ::template result_< First,Last,State,BackwardOp,ForwardOp >\n{\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/set.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/set.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< int N >\nstruct set_chooser;\n\n}\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<0>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef set0<\n             \n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<1>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set1<\n              T0\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<2>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set2<\n              T0, T1\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<3>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set3<\n              T0, T1, T2\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<4>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set4<\n              T0, T1, T2, T3\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<5>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set5<\n              T0, T1, T2, T3, T4\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<6>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set6<\n              T0, T1, T2, T3, T4, T5\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<7>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set7<\n              T0, T1, T2, T3, T4, T5, T6\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<8>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set8<\n              T0, T1, T2, T3, T4, T5, T6, T7\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<9>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set9<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<10>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set10<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<11>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set11<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<12>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set12<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<13>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set13<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<14>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set14<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<15>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set15<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<16>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set16<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<17>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set17<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<18>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set18<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<19>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set19<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<20>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set20<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate< typename T >\nstruct is_set_arg\n{\n    BOOST_STATIC_CONSTANT(bool, value  = true);\n};\n\ntemplate<>\nstruct is_set_arg<na>\n{\n    BOOST_STATIC_CONSTANT(bool, value  = false);\n};\n\ntemplate<\n      typename T1, typename T2, typename T3, typename T4, typename T5\n    , typename T6, typename T7, typename T8, typename T9, typename T10\n    , typename T11, typename T12, typename T13, typename T14, typename T15\n    , typename T16, typename T17, typename T18, typename T19, typename T20\n    >\nstruct set_count_args\n{\n    BOOST_STATIC_CONSTANT(int, value =\n          is_set_arg<T1>::value + is_set_arg<T2>::value \n        + is_set_arg<T3>::value + is_set_arg<T4>::value \n        + is_set_arg<T5>::value + is_set_arg<T6>::value \n        + is_set_arg<T7>::value + is_set_arg<T8>::value \n        + is_set_arg<T9>::value + is_set_arg<T10>::value \n        + is_set_arg<T11>::value + is_set_arg<T12>::value \n        + is_set_arg<T13>::value + is_set_arg<T14>::value \n        + is_set_arg<T15>::value + is_set_arg<T16>::value \n        + is_set_arg<T17>::value + is_set_arg<T18>::value \n        + is_set_arg<T19>::value + is_set_arg<T20>::value\n        );\n\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct set_impl\n{\n    typedef aux::set_count_args<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        > arg_num_;\n\n    typedef typename aux::set_chooser< arg_num_::value >\n        ::template result_< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct set\n    : aux::set_impl<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        >::type\n{\n    typedef typename aux::set_impl<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/set_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/set_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< int N >\nstruct set_c_chooser;\n\n}\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<0>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set0_c<\n              T\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<1>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set1_c<\n              T, C0\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<2>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set2_c<\n              T, C0, C1\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<3>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set3_c<\n              T, C0, C1, C2\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<4>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set4_c<\n              T, C0, C1, C2, C3\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<5>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set5_c<\n              T, C0, C1, C2, C3, C4\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<6>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set6_c<\n              T, C0, C1, C2, C3, C4, C5\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<7>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set7_c<\n              T, C0, C1, C2, C3, C4, C5, C6\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<8>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set8_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<9>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set9_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<10>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set10_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<11>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set11_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<12>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set12_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<13>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set13_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<14>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set14_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<15>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set15_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<16>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set16_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<17>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set17_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<18>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set18_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<19>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set19_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<20>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set20_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate< long C >\nstruct is_set_c_arg\n{\n    BOOST_STATIC_CONSTANT(bool, value  = true);\n};\n\ntemplate<>\nstruct is_set_c_arg<LONG_MAX>\n{\n    BOOST_STATIC_CONSTANT(bool, value  = false);\n};\n\ntemplate<\n      long C1, long C2, long C3, long C4, long C5, long C6, long C7, long C8\n    , long C9, long C10, long C11, long C12, long C13, long C14, long C15\n    , long C16, long C17, long C18, long C19, long C20\n    >\nstruct set_c_count_args\n{\n    BOOST_STATIC_CONSTANT(int, value =\n          is_set_c_arg<C1>::value + is_set_c_arg<C2>::value \n        + is_set_c_arg<C3>::value + is_set_c_arg<C4>::value \n        + is_set_c_arg<C5>::value + is_set_c_arg<C6>::value \n        + is_set_c_arg<C7>::value + is_set_c_arg<C8>::value \n        + is_set_c_arg<C9>::value + is_set_c_arg<C10>::value \n        + is_set_c_arg<C11>::value + is_set_c_arg<C12>::value \n        + is_set_c_arg<C13>::value + is_set_c_arg<C14>::value \n        + is_set_c_arg<C15>::value + is_set_c_arg<C16>::value \n        + is_set_c_arg<C17>::value + is_set_c_arg<C18>::value \n        + is_set_c_arg<C19>::value + is_set_c_arg<C20>::value\n        );\n\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n    >\nstruct set_c_impl\n{\n    typedef aux::set_c_count_args<\n          C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19\n        > arg_num_;\n\n    typedef typename aux::set_c_chooser< arg_num_::value >\n        ::template result_< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX\n    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX\n    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX\n    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX\n    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX\n    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX\n    , long C18 = LONG_MAX, long C19 = LONG_MAX\n    >\nstruct set_c\n    : aux::set_c_impl<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19\n        >::type\n{\n    typedef typename aux::set_c_impl<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19\n        >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/shift_left.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/shift_left.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value\n    >\nstruct shift_left_impl\n    : if_c<\n          ( tag1_ > tag2_ )\n        , aux::cast2nd_impl< shift_left_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< shift_left_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct shift_left_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct shift_left_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct shift_left_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct shift_left_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct shift_left\n    : aux::msvc_eti_base< typename apply_wrap2<\n          shift_left_impl<\n              typename shift_left_tag<N1>::type\n            , typename shift_left_tag<N2>::type\n            >\n        , N1\n        , N2\n        >::type >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_left, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, shift_left)\n\n}}\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< typename T, typename Shift, T n, Shift s >\nstruct shift_left_wknd\n{\n    BOOST_STATIC_CONSTANT(T, value  = (n << s));\n    typedef integral_c< T,value > type;\n};\n\n}\n\ntemplate<>\nstruct shift_left_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N, typename S > struct apply\n        : aux::shift_left_wknd<\n              typename N::value_type\n            , typename S::value_type\n            , N::value\n            , S::value\n            >::type\n\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/shift_right.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/shift_right.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value\n    >\nstruct shift_right_impl\n    : if_c<\n          ( tag1_ > tag2_ )\n        , aux::cast2nd_impl< shift_right_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< shift_right_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct shift_right_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct shift_right_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct shift_right_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct shift_right_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct shift_right\n    : aux::msvc_eti_base< typename apply_wrap2<\n          shift_right_impl<\n              typename shift_right_tag<N1>::type\n            , typename shift_right_tag<N2>::type\n            >\n        , N1\n        , N2\n        >::type >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_right, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, shift_right)\n\n}}\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< typename T, typename Shift, T n, Shift s >\nstruct shift_right_wknd\n{\n    BOOST_STATIC_CONSTANT(T, value  = (n >> s));\n    typedef integral_c< T,value > type;\n};\n\n}\n\ntemplate<>\nstruct shift_right_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N, typename S > struct apply\n        : aux::shift_right_wknd<\n              typename N::value_type\n            , typename S::value_type\n            , N::value\n            , S::value\n            >::type\n\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/template_arity.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/template_arity.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< bool >\nstruct template_arity_impl\n{\n    template< typename F > struct result_\n        : mpl::int_< -1 >\n    {\n    };\n};\n\ntemplate<>\nstruct template_arity_impl<true>\n{\n    template< typename F > struct result_\n        : F::arity\n    {\n    };\n};\n\ntemplate< typename F >\nstruct template_arity\n    : template_arity_impl< ::boost::mpl::aux::has_rebind<F>::value >\n        ::template result_<F>\n{\n};\n\ntemplate<>\nstruct template_arity<int>\n    : mpl::int_< -1 >\n{\n};\n\n}}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/times.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/times.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value\n    >\nstruct times_impl\n    : if_c<\n          ( tag1_ > tag2_ )\n        , aux::cast2nd_impl< times_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< times_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct times_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct times_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct times_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct times_tag\n{\n    typedef typename T::tag type;\n};\n\n/// forward declaration\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct times2;\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct times\n\n    : if_<\n\n          is_na<N3>\n        , times2< N1,N2 >\n        , times<\n              times2< N1,N2 >\n            , N3, N4, N5\n            >\n        >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , times\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1\n    , typename N2\n    >\nstruct times2\n    : aux::msvc_eti_base< typename apply_wrap2<\n          times_impl<\n              typename times_tag<N1>::type\n            , typename times_tag<N2>::type\n            >\n        , N1\n        , N2\n        >::type >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, times2, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, times)\n\n}}\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< typename T, T n1, T n2 >\nstruct times_wknd\n{\n    BOOST_STATIC_CONSTANT(T, value  = (n1 * n2));\n    typedef integral_c< T,value > type;\n};\n\n}\n\ntemplate<>\nstruct times_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n        : aux::times_wknd<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , N1::value\n            , N2::value\n            >::type\n\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/unpack_args.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2002-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/unpack_args.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate< BOOST_MPL_AUX_NTTP_DECL(int, size) > struct unpack_args_impl\n{\n    template< typename F, typename Args > struct apply;\n};\n\ntemplate<> struct unpack_args_impl<0>\n{\n    template< typename F, typename Args > struct apply\n        : apply0<\n              F\n            >\n    {\n    };\n};\n\ntemplate<> struct unpack_args_impl<1>\n{\n    template< typename F, typename Args > struct apply\n        : apply1<\n              F\n            , typename at_c< Args,0 >::type\n            >\n    {\n    };\n};\n\ntemplate<> struct unpack_args_impl<2>\n{\n    template< typename F, typename Args > struct apply\n        : apply2<\n              F\n            , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n            >\n    {\n    };\n};\n\ntemplate<> struct unpack_args_impl<3>\n{\n    template< typename F, typename Args > struct apply\n        : apply3<\n              F\n            , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n            , typename at_c< Args,2 >::type\n            >\n    {\n    };\n};\n\ntemplate<> struct unpack_args_impl<4>\n{\n    template< typename F, typename Args > struct apply\n        : apply4<\n              F\n            , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n            , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type\n            >\n    {\n    };\n};\n\ntemplate<> struct unpack_args_impl<5>\n{\n    template< typename F, typename Args > struct apply\n        : apply5<\n              F\n            , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n            , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type\n            , typename at_c< Args,4 >::type\n            >\n    {\n    };\n};\n\n}\n\ntemplate<\n      typename F\n    >\nstruct unpack_args\n{\n    template< typename Args > struct apply\n\n        : aux::unpack_args_impl< size<Args>::value >\n            ::template apply< F,Args >\n\n    {\n    };\n};\n\nBOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(1, unpack_args)\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/vector.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/vector.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< int N >\nstruct vector_chooser;\n\n}\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<0>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef vector0<\n             \n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<1>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector1<\n              T0\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<2>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector2<\n              T0, T1\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<3>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector3<\n              T0, T1, T2\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<4>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector4<\n              T0, T1, T2, T3\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<5>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector5<\n              T0, T1, T2, T3, T4\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<6>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector6<\n              T0, T1, T2, T3, T4, T5\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<7>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector7<\n              T0, T1, T2, T3, T4, T5, T6\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<8>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector8<\n              T0, T1, T2, T3, T4, T5, T6, T7\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<9>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector9<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<10>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector10<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<11>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector11<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<12>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector12<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<13>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector13<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<14>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector14<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<15>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector15<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<16>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector16<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<17>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector17<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<18>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector18<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<19>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector19<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<20>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector20<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate< typename T >\nstruct is_vector_arg\n{\n    BOOST_STATIC_CONSTANT(bool, value  = true);\n};\n\ntemplate<>\nstruct is_vector_arg<na>\n{\n    BOOST_STATIC_CONSTANT(bool, value  = false);\n};\n\ntemplate<\n      typename T1, typename T2, typename T3, typename T4, typename T5\n    , typename T6, typename T7, typename T8, typename T9, typename T10\n    , typename T11, typename T12, typename T13, typename T14, typename T15\n    , typename T16, typename T17, typename T18, typename T19, typename T20\n    >\nstruct vector_count_args\n{\n    BOOST_STATIC_CONSTANT(int, value =\n          is_vector_arg<T1>::value + is_vector_arg<T2>::value \n        + is_vector_arg<T3>::value + is_vector_arg<T4>::value \n        + is_vector_arg<T5>::value + is_vector_arg<T6>::value \n        + is_vector_arg<T7>::value + is_vector_arg<T8>::value \n        + is_vector_arg<T9>::value + is_vector_arg<T10>::value \n        + is_vector_arg<T11>::value + is_vector_arg<T12>::value \n        + is_vector_arg<T13>::value + is_vector_arg<T14>::value \n        + is_vector_arg<T15>::value + is_vector_arg<T16>::value \n        + is_vector_arg<T17>::value + is_vector_arg<T18>::value \n        + is_vector_arg<T19>::value + is_vector_arg<T20>::value\n        );\n\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct vector_impl\n{\n    typedef aux::vector_count_args<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        > arg_num_;\n\n    typedef typename aux::vector_chooser< arg_num_::value >\n        ::template result_< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct vector\n    : aux::vector_impl<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        >::type\n{\n    typedef typename aux::vector_impl<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc60/vector_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/vector_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< int N >\nstruct vector_c_chooser;\n\n}\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<0>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector0_c<\n              T\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<1>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector1_c<\n              T, T(C0)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<2>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector2_c<\n              T, T(C0), T(C1)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<3>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector3_c<\n              T, T(C0), T(C1), T(C2)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<4>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector4_c<\n              T, T(C0), T(C1), T(C2), T(C3)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<5>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector5_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<6>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector6_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<7>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector7_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<8>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector8_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<9>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector9_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<10>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector10_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<11>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector11_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<12>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector12_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<13>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector13_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<14>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector14_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<15>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector15_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<16>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector16_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<17>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector17_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<18>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector18_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<19>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector19_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<20>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector20_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate< long C >\nstruct is_vector_c_arg\n{\n    BOOST_STATIC_CONSTANT(bool, value  = true);\n};\n\ntemplate<>\nstruct is_vector_c_arg<LONG_MAX>\n{\n    BOOST_STATIC_CONSTANT(bool, value  = false);\n};\n\ntemplate<\n      long C1, long C2, long C3, long C4, long C5, long C6, long C7, long C8\n    , long C9, long C10, long C11, long C12, long C13, long C14, long C15\n    , long C16, long C17, long C18, long C19, long C20\n    >\nstruct vector_c_count_args\n{\n    BOOST_STATIC_CONSTANT(int, value =\n          is_vector_c_arg<C1>::value + is_vector_c_arg<C2>::value \n        + is_vector_c_arg<C3>::value + is_vector_c_arg<C4>::value \n        + is_vector_c_arg<C5>::value + is_vector_c_arg<C6>::value \n        + is_vector_c_arg<C7>::value + is_vector_c_arg<C8>::value \n        + is_vector_c_arg<C9>::value + is_vector_c_arg<C10>::value \n        + is_vector_c_arg<C11>::value + is_vector_c_arg<C12>::value \n        + is_vector_c_arg<C13>::value + is_vector_c_arg<C14>::value \n        + is_vector_c_arg<C15>::value + is_vector_c_arg<C16>::value \n        + is_vector_c_arg<C17>::value + is_vector_c_arg<C18>::value \n        + is_vector_c_arg<C19>::value + is_vector_c_arg<C20>::value\n        );\n\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n    >\nstruct vector_c_impl\n{\n    typedef aux::vector_c_count_args<\n          C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19\n        > arg_num_;\n\n    typedef typename aux::vector_c_chooser< arg_num_::value >\n        ::template result_< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX\n    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX\n    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX\n    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX\n    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX\n    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX\n    , long C18 = LONG_MAX, long C19 = LONG_MAX\n    >\nstruct vector_c\n    : aux::vector_c_impl<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19\n        >::type\n{\n    typedef typename aux::vector_c_impl<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19\n        >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/advance_backward.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/advance_backward.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< long N > struct advance_backward;\ntemplate<>\nstruct advance_backward<0>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef iter0 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<1>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef iter1 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<2>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef typename prior<iter1>::type iter2;\n        typedef iter2 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<3>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef typename prior<iter1>::type iter2;\n        typedef typename prior<iter2>::type iter3;\n        typedef iter3 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<4>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef typename prior<iter1>::type iter2;\n        typedef typename prior<iter2>::type iter3;\n        typedef typename prior<iter3>::type iter4;\n        typedef iter4 type;\n    };\n};\n\ntemplate< long N >\nstruct advance_backward\n{\n    template< typename Iterator > struct apply\n    {\n        typedef typename apply_wrap1<\n              advance_backward<4>\n            , Iterator\n            >::type chunk_result_;\n\n        typedef typename apply_wrap1<\n              advance_backward<(\n                (N - 4) < 0\n                    ? 0\n                    : N - 4\n                    )>\n            , chunk_result_\n            >::type type;\n    };\n};\n\n}}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/advance_forward.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/advance_forward.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< long N > struct advance_forward;\ntemplate<>\nstruct advance_forward<0>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef iter0 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<1>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef iter1 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<2>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef typename next<iter1>::type iter2;\n        typedef iter2 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<3>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef typename next<iter1>::type iter2;\n        typedef typename next<iter2>::type iter3;\n        typedef iter3 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<4>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef typename next<iter1>::type iter2;\n        typedef typename next<iter2>::type iter3;\n        typedef typename next<iter3>::type iter4;\n        typedef iter4 type;\n    };\n};\n\ntemplate< long N >\nstruct advance_forward\n{\n    template< typename Iterator > struct apply\n    {\n        typedef typename apply_wrap1<\n              advance_forward<4>\n            , Iterator\n            >::type chunk_result_;\n\n        typedef typename apply_wrap1<\n              advance_forward<(\n                (N - 4) < 0\n                    ? 0\n                    : N - 4\n                    )>\n            , chunk_result_\n            >::type type;\n    };\n};\n\n}}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/and.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/and.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< bool C_ > struct and_impl\n{\n    template<\n          typename T1, typename T2, typename T3, typename T4\n        >\n    struct result_\n        : false_\n    {\n    };\n};\n\ntemplate<> struct and_impl<true>\n{\n    template<\n          typename T1, typename T2, typename T3, typename T4\n        >\n    struct result_\n        : and_impl<\n              BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n            >::template result_< T2,T3,T4,true_ >\n    {\n    };\n\n    template<> struct result_< true_,true_,true_,true_ >\n        : true_\n    {\n    };\n};\n\n} // namespace aux\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    , typename T3 = true_, typename T4 = true_, typename T5 = true_\n    >\nstruct and_\n\n    : aux::and_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        >::template result_< T2,T3,T4,T5 >\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , and_\n        , ( T1, T2, T3, T4, T5)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC2(\n      2\n    , 5\n    , and_\n    )\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/apply.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/apply.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F\n    >\nstruct apply0\n\n    : apply_wrap0<\n          typename lambda<F>::type\n       \n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          1\n        , apply0\n        , (F )\n        )\n};\n\n/// workaround for ETI bug\ntemplate<>\nstruct apply0<int>\n{\n    typedef int type;\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply1\n\n    : apply_wrap1<\n          typename lambda<F>::type\n        , T1\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          2\n        , apply1\n        , (F, T1)\n        )\n};\n\n/// workaround for ETI bug\ntemplate<>\nstruct apply1< int,int >\n{\n    typedef int type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply2\n\n    : apply_wrap2<\n          typename lambda<F>::type\n        , T1, T2\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          3\n        , apply2\n        , (F, T1, T2)\n        )\n};\n\n/// workaround for ETI bug\ntemplate<>\nstruct apply2< int,int,int >\n{\n    typedef int type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply3\n\n    : apply_wrap3<\n          typename lambda<F>::type\n        , T1, T2, T3\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          4\n        , apply3\n        , (F, T1, T2, T3)\n        )\n};\n\n/// workaround for ETI bug\ntemplate<>\nstruct apply3< int,int,int,int >\n{\n    typedef int type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply4\n\n    : apply_wrap4<\n          typename lambda<F>::type\n        , T1, T2, T3, T4\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , apply4\n        , (F, T1, T2, T3, T4)\n        )\n};\n\n/// workaround for ETI bug\ntemplate<>\nstruct apply4< int,int,int,int,int >\n{\n    typedef int type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply5\n\n    : apply_wrap5<\n          typename lambda<F>::type\n        , T1, T2, T3, T4, T5\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          6\n        , apply5\n        , (F, T1, T2, T3, T4, T5)\n        )\n};\n\n/// workaround for ETI bug\ntemplate<>\nstruct apply5< int,int,int,int,int,int >\n{\n    typedef int type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/apply_fwd.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/apply_fwd.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F\n    >\nstruct apply0;\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply1;\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply2;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply3;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply4;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply5;\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/apply_wrap.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/apply_wrap.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F\n\n    , typename has_apply_ = typename aux::has_apply<F>::type\n\n    >\nstruct apply_wrap0\n\n{\n    typedef typename F::template apply<\n        \n        >::type type;\n\n};\n\n/// workaround for ETI bug\ntemplate<>\nstruct apply_wrap0<int>\n{\n    typedef int type;\n};\n\ntemplate<\n      typename F, typename T1\n\n    >\nstruct apply_wrap1\n\n{\n    typedef typename F::template apply<\n         T1\n        >::type type;\n\n};\n\n/// workaround for ETI bug\ntemplate<>\nstruct apply_wrap1< int,int >\n{\n    typedef int type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n\n    >\nstruct apply_wrap2\n\n{\n    typedef typename F::template apply<\n         T1, T2\n        >::type type;\n\n};\n\n/// workaround for ETI bug\ntemplate<>\nstruct apply_wrap2< int,int,int >\n{\n    typedef int type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n\n    >\nstruct apply_wrap3\n\n{\n    typedef typename F::template apply<\n         T1, T2, T3\n        >::type type;\n\n};\n\n/// workaround for ETI bug\ntemplate<>\nstruct apply_wrap3< int,int,int,int >\n{\n    typedef int type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n\n    >\nstruct apply_wrap4\n\n{\n    typedef typename F::template apply<\n         T1, T2, T3, T4\n        >::type type;\n\n};\n\n/// workaround for ETI bug\ntemplate<>\nstruct apply_wrap4< int,int,int,int,int >\n{\n    typedef int type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n\n    >\nstruct apply_wrap5\n\n{\n    typedef typename F::template apply<\n         T1, T2, T3, T4, T5\n        >::type type;\n\n};\n\n/// workaround for ETI bug\ntemplate<>\nstruct apply_wrap5< int,int,int,int,int,int >\n{\n    typedef int type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/arg.hpp",
    "content": "\n// Copyright Peter Dimov 2001-2002\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/arg.hpp\" header\n// -- DO NOT modify by hand!\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntemplate<> struct arg< -1 >\n{\n    BOOST_STATIC_CONSTANT(int, value  = -1);\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U1 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<1>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 1);\n    typedef arg<2> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U1 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<2>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 2);\n    typedef arg<3> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U2 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<3>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 3);\n    typedef arg<4> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U3 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<4>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 4);\n    typedef arg<5> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U4 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<5>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 5);\n    typedef arg<6> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U5 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\nBOOST_MPL_AUX_NONTYPE_ARITY_SPEC(1,int, arg)\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/basic_bind.hpp",
    "content": "\n// Copyright Peter Dimov 2001\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/basic_bind.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< bool >\nstruct resolve_arg_impl\n{\n    template<\n          typename T, typename U1, typename U2, typename U3\n        , typename U4, typename U5\n        >\n    struct result_\n    {\n        typedef T type;\n    };\n};\n\ntemplate<>\nstruct resolve_arg_impl<true>\n{\n    template<\n          typename T, typename U1, typename U2, typename U3\n        , typename U4, typename U5\n        >\n    struct result_\n    {\n        typedef typename apply_wrap5<\n              T\n            , U1, U2, U3, U4, U5\n            >::type type;\n    };\n};\n\ntemplate< typename T > struct is_bind_template;\n\ntemplate<\n      typename T, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg\n    : resolve_arg_impl< is_bind_template<T>::value >\n            ::template result_< T,U1,U2,U3,U4,U5 >\n{\n};\n\ntemplate< int arity_ > struct bind_chooser;\n\naux::no_tag is_bind_helper(...);\ntemplate< typename T > aux::no_tag is_bind_helper(protect<T>*);\n\ntemplate< int N >\naux::yes_tag is_bind_helper(arg<N>*);\n\ntemplate< bool is_ref_  = true >\nstruct is_bind_template_impl\n{\n    template< typename T > struct result_\n    {\n        BOOST_STATIC_CONSTANT(bool, value  = false);\n    };\n};\n\ntemplate<>\nstruct is_bind_template_impl<false>\n{\n    template< typename T > struct result_\n    {\n        BOOST_STATIC_CONSTANT(bool, value =\n              sizeof(aux::is_bind_helper(static_cast<T*>(0)))\n                == sizeof(aux::yes_tag)\n            );\n    };\n};\n\ntemplate< typename T > struct is_bind_template\n    : is_bind_template_impl< ::boost::detail::is_reference_impl<T>::value >\n        ::template result_<T>\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename F\n    >\nstruct bind0\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n\n     public:\n        typedef typename apply_wrap0<\n              f_\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F\n    >\naux::yes_tag\nis_bind_helper(bind0<F>*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(1, bind0)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind1\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n\n     public:\n        typedef typename apply_wrap1<\n              f_\n            , typename t1::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1\n    >\naux::yes_tag\nis_bind_helper(bind1< F,T1 >*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(2, bind1)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind2\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n\n     public:\n        typedef typename apply_wrap2<\n              f_\n            , typename t1::type, typename t2::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\naux::yes_tag\nis_bind_helper(bind2< F,T1,T2 >*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(3, bind2)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind3\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n\n     public:\n        typedef typename apply_wrap3<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\naux::yes_tag\nis_bind_helper(bind3< F,T1,T2,T3 >*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(4, bind3)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind4\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;\n\n     public:\n        typedef typename apply_wrap4<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\naux::yes_tag\nis_bind_helper(bind4< F,T1,T2,T3,T4 >*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(5, bind4)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind5\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;\n        typedef aux::resolve_bind_arg< T5,U1,U2,U3,U4,U5 > t5;\n\n     public:\n        typedef typename apply_wrap5<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type, typename t5::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\naux::yes_tag\nis_bind_helper(bind5< F,T1,T2,T3,T4,T5 >*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(6, bind5)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/bind.hpp",
    "content": "\n// Copyright Peter Dimov 2001\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bind.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< bool >\nstruct resolve_arg_impl\n{\n    template<\n          typename T, typename U1, typename U2, typename U3\n        , typename U4, typename U5\n        >\n    struct result_\n    {\n        typedef T type;\n    };\n};\n\ntemplate<>\nstruct resolve_arg_impl<true>\n{\n    template<\n          typename T, typename U1, typename U2, typename U3\n        , typename U4, typename U5\n        >\n    struct result_\n    {\n        typedef typename apply_wrap5<\n              T\n            , U1, U2, U3, U4, U5\n            >::type type;\n    };\n};\n\ntemplate< typename T > struct is_bind_template;\n\ntemplate<\n      typename T, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg\n    : resolve_arg_impl< is_bind_template<T>::value >\n            ::template result_< T,U1,U2,U3,U4,U5 >\n{\n};\n\ntemplate< typename T >\nstruct replace_unnamed_arg_impl\n{\n    template< typename Arg > struct result_\n    {\n        typedef Arg next;\n        typedef T type;\n    };\n};\n\ntemplate<>\nstruct replace_unnamed_arg_impl< arg< -1 > >\n{\n    template< typename Arg > struct result_\n    {\n        typedef typename next<Arg>::type next;\n        typedef Arg type;\n    };\n};\n\ntemplate< typename T, typename Arg >\nstruct replace_unnamed_arg\n    : replace_unnamed_arg_impl<T>::template result_<Arg>\n{\n};\n\ntemplate< int arity_ > struct bind_chooser;\n\naux::no_tag is_bind_helper(...);\ntemplate< typename T > aux::no_tag is_bind_helper(protect<T>*);\n\ntemplate< int N >\naux::yes_tag is_bind_helper(arg<N>*);\n\ntemplate< bool is_ref_  = true >\nstruct is_bind_template_impl\n{\n    template< typename T > struct result_\n    {\n        BOOST_STATIC_CONSTANT(bool, value  = false);\n    };\n};\n\ntemplate<>\nstruct is_bind_template_impl<false>\n{\n    template< typename T > struct result_\n    {\n        BOOST_STATIC_CONSTANT(bool, value =\n              sizeof(aux::is_bind_helper(static_cast<T*>(0)))\n                == sizeof(aux::yes_tag)\n            );\n    };\n};\n\ntemplate< typename T > struct is_bind_template\n    : is_bind_template_impl< ::boost::detail::is_reference_impl<T>::value >\n        ::template result_<T>\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename F\n    >\nstruct bind0\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n     public:\n        typedef typename apply_wrap0<\n              f_\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F\n    >\naux::yes_tag\nis_bind_helper(bind0<F>*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(1, bind0)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind1\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n     public:\n        typedef typename apply_wrap1<\n              f_\n            , typename t1::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1\n    >\naux::yes_tag\nis_bind_helper(bind1< F,T1 >*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(2, bind1)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind2\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n     public:\n        typedef typename apply_wrap2<\n              f_\n            , typename t1::type, typename t2::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\naux::yes_tag\nis_bind_helper(bind2< F,T1,T2 >*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(3, bind2)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind3\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n     public:\n        typedef typename apply_wrap3<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\naux::yes_tag\nis_bind_helper(bind3< F,T1,T2,T3 >*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(4, bind3)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind4\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n        typedef aux::replace_unnamed_arg< T4,n4 > r4;\n        typedef typename r4::type a4;\n        typedef typename r4::next n5;\n        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;\n        ///\n     public:\n        typedef typename apply_wrap4<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\naux::yes_tag\nis_bind_helper(bind4< F,T1,T2,T3,T4 >*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(5, bind4)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind5\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n        typedef aux::replace_unnamed_arg< T4,n4 > r4;\n        typedef typename r4::type a4;\n        typedef typename r4::next n5;\n        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;\n        ///\n        typedef aux::replace_unnamed_arg< T5,n5 > r5;\n        typedef typename r5::type a5;\n        typedef typename r5::next n6;\n        typedef aux::resolve_bind_arg< a5,U1,U2,U3,U4,U5 > t5;\n        ///\n     public:\n        typedef typename apply_wrap5<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type, typename t5::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\naux::yes_tag\nis_bind_helper(bind5< F,T1,T2,T3,T4,T5 >*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(6, bind5)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/bind_fwd.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bind_fwd.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F\n    >\nstruct bind0;\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind1;\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind2;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind3;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind4;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind5;\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/bitand.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bitand.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value\n    >\nstruct bitand_impl\n    : if_c<\n          ( tag1_ > tag2_ )\n        , aux::cast2nd_impl< bitand_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< bitand_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct bitand_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct bitand_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct bitand_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct bitand_tag\n    : tag< T,na >\n{\n};\n\n/// forward declaration\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct bitand_2;\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct bitand_\n\n    : aux::msvc_eti_base< typename if_<\n\n          is_na<N3>\n        , bitand_2< N1,N2 >\n        , bitand_<\n              bitand_2< N1,N2 >\n            , N3, N4, N5\n            >\n        >::type\n\n    >\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , bitand_\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1\n    , typename N2\n    >\nstruct bitand_2\n    : aux::msvc_eti_base< typename apply_wrap2<\n          bitand_impl<\n              typename bitand_tag<N1>::type\n            , typename bitand_tag<N2>::type\n            >\n        , N1\n        , N2\n        >::type >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, bitand_2, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, bitand_)\n\n}}\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< typename T, T n1, T n2 >\nstruct bitand_wknd\n{\n    BOOST_STATIC_CONSTANT(T, value  = (n1 & n2));\n    typedef integral_c< T,value > type;\n};\n\n}\n\ntemplate<>\nstruct bitand_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n        : aux::bitand_wknd<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , N1::value\n            , N2::value\n            >::type\n\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/bitor.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bitor.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value\n    >\nstruct bitor_impl\n    : if_c<\n          ( tag1_ > tag2_ )\n        , aux::cast2nd_impl< bitor_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< bitor_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct bitor_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct bitor_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct bitor_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct bitor_tag\n    : tag< T,na >\n{\n};\n\n/// forward declaration\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct bitor_2;\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct bitor_\n\n    : aux::msvc_eti_base< typename if_<\n\n          is_na<N3>\n        , bitor_2< N1,N2 >\n        , bitor_<\n              bitor_2< N1,N2 >\n            , N3, N4, N5\n            >\n        >::type\n\n    >\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , bitor_\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1\n    , typename N2\n    >\nstruct bitor_2\n    : aux::msvc_eti_base< typename apply_wrap2<\n          bitor_impl<\n              typename bitor_tag<N1>::type\n            , typename bitor_tag<N2>::type\n            >\n        , N1\n        , N2\n        >::type >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, bitor_2, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, bitor_)\n\n}}\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< typename T, T n1, T n2 >\nstruct bitor_wknd\n{\n    BOOST_STATIC_CONSTANT(T, value  = (n1 | n2));\n    typedef integral_c< T,value > type;\n};\n\n}\n\ntemplate<>\nstruct bitor_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n        : aux::bitor_wknd<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , N1::value\n            , N2::value\n            >::type\n\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/bitxor.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bitxor.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value\n    >\nstruct bitxor_impl\n    : if_c<\n          ( tag1_ > tag2_ )\n        , aux::cast2nd_impl< bitxor_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< bitxor_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct bitxor_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct bitxor_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct bitxor_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct bitxor_tag\n    : tag< T,na >\n{\n};\n\n/// forward declaration\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct bitxor_2;\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct bitxor_\n\n    : aux::msvc_eti_base< typename if_<\n\n          is_na<N3>\n        , bitxor_2< N1,N2 >\n        , bitxor_<\n              bitxor_2< N1,N2 >\n            , N3, N4, N5\n            >\n        >::type\n\n    >\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , bitxor_\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1\n    , typename N2\n    >\nstruct bitxor_2\n    : aux::msvc_eti_base< typename apply_wrap2<\n          bitxor_impl<\n              typename bitxor_tag<N1>::type\n            , typename bitxor_tag<N2>::type\n            >\n        , N1\n        , N2\n        >::type >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, bitxor_2, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, bitxor_)\n\n}}\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< typename T, T n1, T n2 >\nstruct bitxor_wknd\n{\n    BOOST_STATIC_CONSTANT(T, value  = (n1 ^ n2));\n    typedef integral_c< T,value > type;\n};\n\n}\n\ntemplate<>\nstruct bitxor_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n        : aux::bitxor_wknd<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , N1::value\n            , N2::value\n            >::type\n\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/deque.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/deque.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< int N >\nstruct deque_chooser;\n\n}\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<0>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef vector0<\n             \n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<1>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector1<\n              T0\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<2>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector2<\n              T0, T1\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<3>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector3<\n              T0, T1, T2\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<4>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector4<\n              T0, T1, T2, T3\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<5>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector5<\n              T0, T1, T2, T3, T4\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<6>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector6<\n              T0, T1, T2, T3, T4, T5\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<7>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector7<\n              T0, T1, T2, T3, T4, T5, T6\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<8>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector8<\n              T0, T1, T2, T3, T4, T5, T6, T7\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<9>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector9<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<10>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector10<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<11>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector11<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<12>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector12<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<13>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector13<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<14>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector14<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<15>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector15<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<16>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector16<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<17>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector17<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<18>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector18<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<19>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector19<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<20>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector20<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate< typename T >\nstruct is_deque_arg\n{\n    BOOST_STATIC_CONSTANT(bool, value  = true);\n};\n\ntemplate<>\nstruct is_deque_arg<na>\n{\n    BOOST_STATIC_CONSTANT(bool, value  = false);\n};\n\ntemplate<\n      typename T1, typename T2, typename T3, typename T4, typename T5\n    , typename T6, typename T7, typename T8, typename T9, typename T10\n    , typename T11, typename T12, typename T13, typename T14, typename T15\n    , typename T16, typename T17, typename T18, typename T19, typename T20\n    >\nstruct deque_count_args\n{\n    BOOST_STATIC_CONSTANT(int, value =\n          is_deque_arg<T1>::value + is_deque_arg<T2>::value \n        + is_deque_arg<T3>::value + is_deque_arg<T4>::value \n        + is_deque_arg<T5>::value + is_deque_arg<T6>::value \n        + is_deque_arg<T7>::value + is_deque_arg<T8>::value \n        + is_deque_arg<T9>::value + is_deque_arg<T10>::value \n        + is_deque_arg<T11>::value + is_deque_arg<T12>::value \n        + is_deque_arg<T13>::value + is_deque_arg<T14>::value \n        + is_deque_arg<T15>::value + is_deque_arg<T16>::value \n        + is_deque_arg<T17>::value + is_deque_arg<T18>::value \n        + is_deque_arg<T19>::value + is_deque_arg<T20>::value\n        );\n\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct deque_impl\n{\n    typedef aux::deque_count_args<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        > arg_num_;\n\n    typedef typename aux::deque_chooser< arg_num_::value >\n        ::template result_< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct deque\n    : aux::deque_impl<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        >::type\n{\n    typedef typename aux::deque_impl<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/divides.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/divides.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value\n    >\nstruct divides_impl\n    : if_c<\n          ( tag1_ > tag2_ )\n        , aux::cast2nd_impl< divides_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< divides_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct divides_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct divides_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct divides_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct divides_tag\n    : tag< T,na >\n{\n};\n\n/// forward declaration\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct divides2;\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct divides\n\n    : aux::msvc_eti_base< typename if_<\n\n          is_na<N3>\n        , divides2< N1,N2 >\n        , divides<\n              divides2< N1,N2 >\n            , N3, N4, N5\n            >\n        >::type\n\n    >\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , divides\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1\n    , typename N2\n    >\nstruct divides2\n    : aux::msvc_eti_base< typename apply_wrap2<\n          divides_impl<\n              typename divides_tag<N1>::type\n            , typename divides_tag<N2>::type\n            >\n        , N1\n        , N2\n        >::type >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, divides2, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, divides)\n\n}}\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< typename T, T n1, T n2 >\nstruct divides_wknd\n{\n    BOOST_STATIC_CONSTANT(T, value  = (n1 / n2));\n    typedef integral_c< T,value > type;\n};\n\n}\n\ntemplate<>\nstruct divides_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n        : aux::divides_wknd<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , N1::value\n            , N2::value\n            >::type\n\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/equal_to.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/equal_to.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value\n    >\nstruct equal_to_impl\n    : if_c<\n          ( tag1_ > tag2_ )\n        , aux::cast2nd_impl< equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct equal_to_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct equal_to_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct equal_to_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct equal_to_tag\n    : tag< T,na >\n{\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct equal_to\n    : aux::msvc_eti_base< typename apply_wrap2<\n          equal_to_impl<\n              typename equal_to_tag<N1>::type\n            , typename equal_to_tag<N2>::type\n            >\n        , N1\n        , N2\n        >::type >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, equal_to, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, equal_to)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct equal_to_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n    {\n        BOOST_STATIC_CONSTANT(bool, value =\n             ( BOOST_MPL_AUX_VALUE_WKND(N1)::value ==\n             BOOST_MPL_AUX_VALUE_WKND(N2)::value )\n            );\n        typedef bool_<value> type;\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl;\n\ntemplate< int N >\nstruct fold_chunk;\n\ntemplate<> struct fold_chunk<0>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State state0;\n        typedef state0 state;\n        typedef iter0 iterator;\n    };\n};\n\ntemplate<> struct fold_chunk<1>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State state0;\n        typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        \n\n        typedef state1 state;\n        typedef iter1 iterator;\n    };\n};\n\ntemplate<> struct fold_chunk<2>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State state0;\n        typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        \n\n        typedef state2 state;\n        typedef iter2 iterator;\n    };\n};\n\ntemplate<> struct fold_chunk<3>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State state0;\n        typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        \n\n        typedef state3 state;\n        typedef iter3 iterator;\n    };\n};\n\ntemplate<> struct fold_chunk<4>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State state0;\n        typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        typedef typename apply2< ForwardOp, state3, typename deref<iter3>::type >::type state4;\n        typedef typename mpl::next<iter3>::type iter4;\n        \n\n        typedef state4 state;\n        typedef iter4 iterator;\n    };\n};\n\ntemplate< int N >\nstruct fold_chunk\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef fold_impl<\n              4\n            , First\n            , Last\n            , State\n            , ForwardOp\n            > chunk_;\n\n        typedef fold_impl<\n              ( (N - 4) < 0 ? 0 : N - 4 )\n            , typename chunk_::iterator\n            , Last\n            , typename chunk_::state\n            , ForwardOp\n            > res_;\n\n        typedef typename res_::state state;\n        typedef typename res_::iterator iterator;\n    };\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_step;\n\ntemplate<\n      typename Last\n    , typename State\n    >\nstruct fold_null_step\n{\n    typedef Last iterator;\n    typedef State state;\n};\n\ntemplate<>\nstruct fold_chunk< -1 >\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef typename if_<\n              typename is_same< First,Last >::type\n            , fold_null_step< Last,State >\n            , fold_step< First,Last,State,ForwardOp >\n            >::type res_;\n\n        typedef typename res_::state state;\n        typedef typename res_::iterator iterator;\n    };\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_step\n{\n    typedef fold_chunk< -1 >::template result_<\n          typename mpl::next<First>::type\n        , Last\n        , typename apply2<ForwardOp,State, typename deref<First>::type>::type\n        , ForwardOp\n        > chunk_;\n\n    typedef typename chunk_::state state;\n    typedef typename chunk_::iterator iterator;\n};\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl\n    : fold_chunk<N>\n        ::template result_< First,Last,State,ForwardOp >\n{\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/full_lambda.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/full_lambda.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false\n    , bool C5 = false\n    >\nstruct lambda_or\n    : true_\n{\n};\n\ntemplate<>\nstruct lambda_or< false,false,false,false,false >\n    : false_\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename T\n    , typename Tag\n   \n    >\nstruct lambda\n{\n    typedef false_ is_le;\n    typedef T result_;\n    typedef T type;\n};\n\ntemplate<\n      typename T\n    >\nstruct is_lambda_expression\n    : lambda<T>::is_le\n{\n};\n\ntemplate< int N, typename Tag >\nstruct lambda< arg<N>, Tag >\n{\n    typedef true_ is_le;\n    typedef mpl::arg<N> result_; // qualified for the sake of MIPSpro 7.41\n    typedef mpl::protect<result_> type;\n};\n\ntemplate<\n      typename F\n    , typename Tag\n    >\nstruct lambda<\n          bind0<F>\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind0<\n          F\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1 > class F\n    , typename L1\n    >\nstruct le_result1\n{\n    typedef F<\n          typename L1::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1 > class F\n    , typename L1\n    >\nstruct le_result1< true_,Tag,F,L1 >\n{\n    typedef bind1<\n          quote1< F,Tag >\n        , typename L1::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1 > class F\n    , typename T1\n    , typename Tag\n    >\nstruct lambda<\n          F<T1>\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef typename l1::is_le is_le1;\n    typedef typename aux::lambda_or<\n          is_le1::value\n        >::type is_le;\n\n    typedef aux::le_result1<\n          is_le, Tag, F, l1\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1\n    , typename Tag\n    >\nstruct lambda<\n          bind1< F,T1 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind1<\n          F\n        , T1\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2 > class F\n    , typename L1, typename L2\n    >\nstruct le_result2\n{\n    typedef F<\n          typename L1::type, typename L2::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2 > class F\n    , typename L1, typename L2\n    >\nstruct le_result2< true_,Tag,F,L1,L2 >\n{\n    typedef bind2<\n          quote2< F,Tag >\n        , typename L1::result_, typename L2::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1, typename P2 > class F\n    , typename T1, typename T2\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2 >\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value\n        >::type is_le;\n\n    typedef aux::le_result2<\n          is_le, Tag, F, l1, l2\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    , typename Tag\n    >\nstruct lambda<\n          bind2< F,T1,T2 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind2<\n          F\n        , T1, T2\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2, typename P3 > class F\n    , typename L1, typename L2, typename L3\n    >\nstruct le_result3\n{\n    typedef F<\n          typename L1::type, typename L2::type, typename L3::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2, typename P3 > class F\n    , typename L1, typename L2, typename L3\n    >\nstruct le_result3< true_,Tag,F,L1,L2,L3 >\n{\n    typedef bind3<\n          quote3< F,Tag >\n        , typename L1::result_, typename L2::result_, typename L3::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1, typename P2, typename P3 > class F\n    , typename T1, typename T2, typename T3\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2,T3 >\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    typedef lambda< T3,Tag > l3;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    typedef typename l3::is_le is_le3;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value, is_le3::value\n        >::type is_le;\n\n    typedef aux::le_result3<\n          is_le, Tag, F, l1, l2, l3\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    , typename Tag\n    >\nstruct lambda<\n          bind3< F,T1,T2,T3 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind3<\n          F\n        , T1, T2, T3\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename L1, typename L2, typename L3, typename L4\n    >\nstruct le_result4\n{\n    typedef F<\n          typename L1::type, typename L2::type, typename L3::type\n        , typename L4::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename L1, typename L2, typename L3, typename L4\n    >\nstruct le_result4< true_,Tag,F,L1,L2,L3,L4 >\n{\n    typedef bind4<\n          quote4< F,Tag >\n        , typename L1::result_, typename L2::result_, typename L3::result_\n        , typename L4::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename T1, typename T2, typename T3, typename T4\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2,T3,T4 >\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    typedef lambda< T3,Tag > l3;\n    typedef lambda< T4,Tag > l4;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    typedef typename l3::is_le is_le3;\n    typedef typename l4::is_le is_le4;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value, is_le3::value, is_le4::value\n        >::type is_le;\n\n    typedef aux::le_result4<\n          is_le, Tag, F, l1, l2, l3, l4\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename Tag\n    >\nstruct lambda<\n          bind4< F,T1,T2,T3,T4 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind4<\n          F\n        , T1, T2, T3, T4\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F\n    , typename L1, typename L2, typename L3, typename L4, typename L5\n    >\nstruct le_result5\n{\n    typedef F<\n          typename L1::type, typename L2::type, typename L3::type\n        , typename L4::type, typename L5::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F\n    , typename L1, typename L2, typename L3, typename L4, typename L5\n    >\nstruct le_result5< true_,Tag,F,L1,L2,L3,L4,L5 >\n{\n    typedef bind5<\n          quote5< F,Tag >\n        , typename L1::result_, typename L2::result_, typename L3::result_\n        , typename L4::result_, typename L5::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template<\n          typename P1, typename P2, typename P3, typename P4\n        , typename P5\n        >\n      class F\n    , typename T1, typename T2, typename T3, typename T4, typename T5\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2,T3,T4,T5 >\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    typedef lambda< T3,Tag > l3;\n    typedef lambda< T4,Tag > l4;\n    typedef lambda< T5,Tag > l5;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    typedef typename l3::is_le is_le3;\n    typedef typename l4::is_le is_le4;\n    typedef typename l5::is_le is_le5;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value, is_le3::value, is_le4::value\n        , is_le5::value\n        >::type is_le;\n\n    typedef aux::le_result5<\n          is_le, Tag, F, l1, l2, l3, l4, l5\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    , typename Tag\n    >\nstruct lambda<\n          bind5< F,T1,T2,T3,T4,T5 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind5<\n          F\n        , T1, T2, T3, T4, T5\n        > result_;\n\n    typedef result_ type;\n};\n\n/// special case for 'protect'\ntemplate< typename T, typename Tag >\nstruct lambda< mpl::protect<T>, Tag >\n{\n    typedef false_ is_le;\n    typedef mpl::protect<T> result_;\n    typedef result_ type;\n};\n\n/// specializations for the main 'bind' form\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    , typename Tag\n    >\nstruct lambda<\n          bind< F,T1,T2,T3,T4,T5 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind< F,T1,T2,T3,T4,T5 > result_;\n    typedef result_ type;\n};\n\n/// workaround for MWCW 8.3+/EDG < 303, leads to ambiguity on Digital Mars\n\ntemplate<\n      typename F, typename Tag1, typename Tag2\n    >\nstruct lambda<\n          lambda< F,Tag1 >\n        , Tag2\n        >\n{\n    typedef lambda< F,Tag2 > l1;\n    typedef lambda< Tag1,Tag2 > l2;\n    typedef typename l1::is_le is_le;\n    typedef aux::le_result2<is_le, Tag2, mpl::lambda, l1, l2> le_result_;\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\nBOOST_MPL_AUX_NA_SPEC(2, lambda)\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/greater.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/greater.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value\n    >\nstruct greater_impl\n    : if_c<\n          ( tag1_ > tag2_ )\n        , aux::cast2nd_impl< greater_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< greater_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct greater_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct greater_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct greater_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct greater_tag\n    : tag< T,na >\n{\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct greater\n    : aux::msvc_eti_base< typename apply_wrap2<\n          greater_impl<\n              typename greater_tag<N1>::type\n            , typename greater_tag<N2>::type\n            >\n        , N1\n        , N2\n        >::type >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, greater)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct greater_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n    {\n        BOOST_STATIC_CONSTANT(bool, value =\n             ( BOOST_MPL_AUX_VALUE_WKND(N1)::value >\n             BOOST_MPL_AUX_VALUE_WKND(N2)::value )\n            );\n        typedef bool_<value> type;\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/greater_equal.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/greater_equal.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value\n    >\nstruct greater_equal_impl\n    : if_c<\n          ( tag1_ > tag2_ )\n        , aux::cast2nd_impl< greater_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< greater_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct greater_equal_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct greater_equal_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct greater_equal_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct greater_equal_tag\n    : tag< T,na >\n{\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct greater_equal\n    : aux::msvc_eti_base< typename apply_wrap2<\n          greater_equal_impl<\n              typename greater_equal_tag<N1>::type\n            , typename greater_equal_tag<N2>::type\n            >\n        , N1\n        , N2\n        >::type >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater_equal, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, greater_equal)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct greater_equal_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n    {\n        BOOST_STATIC_CONSTANT(bool, value =\n             ( BOOST_MPL_AUX_VALUE_WKND(N1)::value >=\n             BOOST_MPL_AUX_VALUE_WKND(N2)::value )\n            );\n        typedef bool_<value> type;\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/inherit.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/inherit.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate< bool C1, bool C2 >\nstruct inherit2_impl\n{\n    template< typename Derived, typename T1, typename T2 > struct result_\n        : T1, T2\n    {\n        typedef Derived type_;\n    };\n};\n\ntemplate<>\nstruct inherit2_impl< false,true >\n{\n    template< typename Derived, typename T1, typename T2 > struct result_\n        : T1\n    {\n        typedef T1 type_;\n    };\n};\n\ntemplate<>\nstruct inherit2_impl< true,false >\n{\n    template< typename Derived, typename T1, typename T2 > struct result_\n        : T2\n    {\n        typedef T2 type_;\n    };\n};\n\ntemplate<>\nstruct inherit2_impl< true,true >\n{\n    template< typename Derived, typename T1, typename T2 > struct result_\n    {\n        typedef T1 type_;\n    };\n};\n\n} // namespace aux\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    >\nstruct inherit2\n    : aux::inherit2_impl<\n          is_empty_base<T1>::value\n        , is_empty_base<T2>::value\n        >::template result_< inherit2< T1,T2 >,T1, T2 >\n{\n    typedef typename inherit2::type_ type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, inherit2, (T1, T2))\n};\n\nBOOST_MPL_AUX_NA_SPEC(2, inherit2)\n\ntemplate<\n      typename T1 = na, typename T2 = na, typename T3 = na\n    >\nstruct inherit3\n    : inherit2<\n          typename inherit2<\n              T1, T2\n            >::type\n        , T3\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          3\n        , inherit3\n        , ( T1, T2, T3)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC(3, inherit3)\n\ntemplate<\n      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na\n    >\nstruct inherit4\n    : inherit2<\n          typename inherit3<\n              T1, T2, T3\n            >::type\n        , T4\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          4\n        , inherit4\n        , ( T1, T2, T3, T4)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC(4, inherit4)\n\ntemplate<\n      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na\n    , typename T5 = na\n    >\nstruct inherit5\n    : inherit2<\n          typename inherit4<\n              T1, T2, T3, T4\n            >::type\n        , T5\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , inherit5\n        , ( T1, T2, T3, T4, T5)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC(5, inherit5)\n\n/// primary template\n\ntemplate<\n      typename T1 = empty_base, typename T2 = empty_base\n    , typename T3 = empty_base, typename T4 = empty_base\n    , typename T5 = empty_base\n    >\nstruct inherit\n    : inherit5< T1,T2,T3,T4,T5 >\n{\n};\n\ntemplate<>\nstruct inherit< na,na,na,na,na >\n{\n    template<\n\n          typename T1 = empty_base, typename T2 = empty_base\n        , typename T3 = empty_base, typename T4 = empty_base\n        , typename T5 = empty_base\n\n        >\n    struct apply\n        : inherit< T1,T2,T3,T4,T5 >\n    {\n    };\n};\n\nBOOST_MPL_AUX_NA_SPEC_LAMBDA(5, inherit)\nBOOST_MPL_AUX_NA_SPEC_ARITY(5, inherit)\nBOOST_MPL_AUX_NA_SPEC_TEMPLATE_ARITY(5, 5, inherit)\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/iter_fold_if_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n// Copyright David Abrahams 2001-2002\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/iter_fold_if_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< typename Iterator, typename State >\nstruct iter_fold_if_null_step\n{\n    typedef State state;\n    typedef Iterator iterator;\n};\n\ntemplate< bool >\nstruct iter_fold_if_step_impl\n{\n    template<\n          typename Iterator\n        , typename State\n        , typename StateOp\n        , typename IteratorOp\n        >\n    struct result_\n    {\n        typedef typename apply2< StateOp,State,Iterator >::type state;\n        typedef typename IteratorOp::type iterator;\n    };\n};\n\ntemplate<>\nstruct iter_fold_if_step_impl<false>\n{\n    template<\n          typename Iterator\n        , typename State\n        , typename StateOp\n        , typename IteratorOp\n        >\n    struct result_\n    {\n        typedef State state;\n        typedef Iterator iterator;\n    };\n};\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename ForwardOp\n    , typename Predicate\n    >\nstruct iter_fold_if_forward_step\n{\n    typedef typename apply2< Predicate,State,Iterator >::type not_last;\n    typedef typename iter_fold_if_step_impl<\n          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value\n        >::template result_< Iterator,State,ForwardOp, mpl::next<Iterator> > impl_;\n\n    typedef typename impl_::state state;\n    typedef typename impl_::iterator iterator;\n};\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename BackwardOp\n    , typename Predicate\n    >\nstruct iter_fold_if_backward_step\n{\n    typedef typename apply2< Predicate,State,Iterator >::type not_last;\n    typedef typename iter_fold_if_step_impl<\n          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value\n        >::template result_< Iterator,State,BackwardOp, identity<Iterator> > impl_;\n\n    typedef typename impl_::state state;\n    typedef typename impl_::iterator iterator;\n};\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename ForwardOp\n    , typename ForwardPredicate\n    , typename BackwardOp\n    , typename BackwardPredicate\n    >\nstruct iter_fold_if_impl\n{\n private:\n    typedef iter_fold_if_null_step< Iterator,State > forward_step0;\n    typedef iter_fold_if_forward_step< typename forward_step0::iterator, typename forward_step0::state, ForwardOp, ForwardPredicate > forward_step1;\n    typedef iter_fold_if_forward_step< typename forward_step1::iterator, typename forward_step1::state, ForwardOp, ForwardPredicate > forward_step2;\n    typedef iter_fold_if_forward_step< typename forward_step2::iterator, typename forward_step2::state, ForwardOp, ForwardPredicate > forward_step3;\n    typedef iter_fold_if_forward_step< typename forward_step3::iterator, typename forward_step3::state, ForwardOp, ForwardPredicate > forward_step4;\n    \n\n    typedef typename if_<\n          typename forward_step4::not_last\n        , iter_fold_if_impl<\n              typename forward_step4::iterator\n            , typename forward_step4::state\n            , ForwardOp\n            , ForwardPredicate\n            , BackwardOp\n            , BackwardPredicate\n            >\n        , iter_fold_if_null_step<\n              typename forward_step4::iterator\n            , typename forward_step4::state\n            >\n        >::type backward_step4;\n\n    typedef iter_fold_if_backward_step< typename forward_step3::iterator, typename backward_step4::state, BackwardOp, BackwardPredicate > backward_step3;\n    typedef iter_fold_if_backward_step< typename forward_step2::iterator, typename backward_step3::state, BackwardOp, BackwardPredicate > backward_step2;\n    typedef iter_fold_if_backward_step< typename forward_step1::iterator, typename backward_step2::state, BackwardOp, BackwardPredicate > backward_step1;\n    typedef iter_fold_if_backward_step< typename forward_step0::iterator, typename backward_step1::state, BackwardOp, BackwardPredicate > backward_step0;\n    \n\n public:\n    typedef typename backward_step0::state state;\n    typedef typename backward_step4::iterator iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/iter_fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/iter_fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl;\n\ntemplate< int N >\nstruct iter_fold_chunk;\n\ntemplate<> struct iter_fold_chunk<0>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State state0;\n        typedef state0 state;\n        typedef iter0 iterator;\n    };\n};\n\ntemplate<> struct iter_fold_chunk<1>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State state0;\n        typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        \n\n        typedef state1 state;\n        typedef iter1 iterator;\n    };\n};\n\ntemplate<> struct iter_fold_chunk<2>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State state0;\n        typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp,state1,iter1 >::type state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        \n\n        typedef state2 state;\n        typedef iter2 iterator;\n    };\n};\n\ntemplate<> struct iter_fold_chunk<3>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State state0;\n        typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp,state1,iter1 >::type state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp,state2,iter2 >::type state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        \n\n        typedef state3 state;\n        typedef iter3 iterator;\n    };\n};\n\ntemplate<> struct iter_fold_chunk<4>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State state0;\n        typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp,state1,iter1 >::type state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp,state2,iter2 >::type state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        typedef typename apply2< ForwardOp,state3,iter3 >::type state4;\n        typedef typename mpl::next<iter3>::type iter4;\n        \n\n        typedef state4 state;\n        typedef iter4 iterator;\n    };\n};\n\ntemplate< int N >\nstruct iter_fold_chunk\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef iter_fold_impl<\n              4\n            , First\n            , Last\n            , State\n            , ForwardOp\n            > chunk_;\n\n        typedef iter_fold_impl<\n              ( (N - 4) < 0 ? 0 : N - 4 )\n            , typename chunk_::iterator\n            , Last\n            , typename chunk_::state\n            , ForwardOp\n            > res_;\n\n        typedef typename res_::state state;\n        typedef typename res_::iterator iterator;\n    };\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_step;\n\ntemplate<\n      typename Last\n    , typename State\n    >\nstruct iter_fold_null_step\n{\n    typedef Last iterator;\n    typedef State state;\n};\n\ntemplate<>\nstruct iter_fold_chunk< -1 >\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef typename if_<\n              typename is_same< First,Last >::type\n            , iter_fold_null_step< Last,State >\n            , iter_fold_step< First,Last,State,ForwardOp >\n            >::type res_;\n\n        typedef typename res_::state state;\n        typedef typename res_::iterator iterator;\n    };\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_step\n{\n    typedef iter_fold_chunk< -1 >::template result_<\n          typename mpl::next<First>::type\n        , Last\n        , typename apply2< ForwardOp,State,First >::type\n        , ForwardOp\n        > chunk_;\n\n    typedef typename chunk_::state state;\n    typedef typename chunk_::iterator iterator;\n};\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl\n    : iter_fold_chunk<N>\n        ::template result_< First,Last,State,ForwardOp >\n{\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/lambda_no_ctps.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/lambda_no_ctps.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false\n    , bool C5 = false\n    >\nstruct lambda_or\n    : true_\n{\n};\n\ntemplate<>\nstruct lambda_or< false,false,false,false,false >\n    : false_\n{\n};\n\ntemplate< typename Arity > struct lambda_impl\n{\n    template< typename T, typename Tag, typename Protect > struct result_\n    {\n        typedef T type;\n        typedef is_placeholder<T> is_le;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<1> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef typename l1::is_le is_le1;\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value\n            > is_le;\n\n        typedef bind1<\n              typename F::rebind\n            , typename l1::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<2> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value\n            > is_le;\n\n        typedef bind2<\n              typename F::rebind\n            , typename l1::type, typename l2::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<3> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        typedef lambda< typename F::arg3, Tag, false_ > l3;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        typedef typename l3::is_le is_le3;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value\n            > is_le;\n\n        typedef bind3<\n              typename F::rebind\n            , typename l1::type, typename l2::type, typename l3::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<4> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        typedef lambda< typename F::arg3, Tag, false_ > l3;\n        typedef lambda< typename F::arg4, Tag, false_ > l4;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        typedef typename l3::is_le is_le3;\n        typedef typename l4::is_le is_le4;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value\n            > is_le;\n\n        typedef bind4<\n              typename F::rebind\n            , typename l1::type, typename l2::type, typename l3::type\n            , typename l4::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<5> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        typedef lambda< typename F::arg3, Tag, false_ > l3;\n        typedef lambda< typename F::arg4, Tag, false_ > l4;\n        typedef lambda< typename F::arg5, Tag, false_ > l5;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        typedef typename l3::is_le is_le3;\n        typedef typename l4::is_le is_le4;\n        typedef typename l5::is_le is_le5;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le5)::value\n            > is_le;\n\n        typedef bind5<\n              typename F::rebind\n            , typename l1::type, typename l2::type, typename l3::type\n            , typename l4::type, typename l5::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\n} // namespace aux\n\ntemplate<\n      typename T\n    , typename Tag\n    , typename Protect\n    >\nstruct lambda\n{\n    /// Metafunction forwarding confuses MSVC 6.x\n    typedef typename aux::template_arity<T>::type arity_;\n    typedef typename aux::lambda_impl<arity_>\n        ::template result_< T,Tag,Protect > l_;\n\n    typedef typename l_::type type;\n    typedef typename l_::is_le is_le;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(3, lambda, (T, Tag, Protect))\n};\n\nBOOST_MPL_AUX_NA_SPEC2(1, 3, lambda)\n\ntemplate<\n      typename T\n    >\nstruct is_lambda_expression\n    : lambda<T>::is_le\n{\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/less.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/less.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value\n    >\nstruct less_impl\n    : if_c<\n          ( tag1_ > tag2_ )\n        , aux::cast2nd_impl< less_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< less_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct less_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct less_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct less_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct less_tag\n    : tag< T,na >\n{\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct less\n    : aux::msvc_eti_base< typename apply_wrap2<\n          less_impl<\n              typename less_tag<N1>::type\n            , typename less_tag<N2>::type\n            >\n        , N1\n        , N2\n        >::type >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, less)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct less_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n    {\n        BOOST_STATIC_CONSTANT(bool, value =\n             ( BOOST_MPL_AUX_VALUE_WKND(N2)::value >\n             BOOST_MPL_AUX_VALUE_WKND(N1)::value )\n            );\n        typedef bool_<value> type;\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/less_equal.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/less_equal.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value\n    >\nstruct less_equal_impl\n    : if_c<\n          ( tag1_ > tag2_ )\n        , aux::cast2nd_impl< less_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< less_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct less_equal_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct less_equal_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct less_equal_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct less_equal_tag\n    : tag< T,na >\n{\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct less_equal\n    : aux::msvc_eti_base< typename apply_wrap2<\n          less_equal_impl<\n              typename less_equal_tag<N1>::type\n            , typename less_equal_tag<N2>::type\n            >\n        , N1\n        , N2\n        >::type >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less_equal, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, less_equal)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct less_equal_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n    {\n        BOOST_STATIC_CONSTANT(bool, value =\n             ( BOOST_MPL_AUX_VALUE_WKND(N1)::value <=\n             BOOST_MPL_AUX_VALUE_WKND(N2)::value )\n            );\n        typedef bool_<value> type;\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/list.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/list.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< int N >\nstruct list_chooser;\n\n}\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<0>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef list0<\n             \n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<1>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list1<\n              T0\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<2>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list2<\n              T0, T1\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<3>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list3<\n              T0, T1, T2\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<4>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list4<\n              T0, T1, T2, T3\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<5>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list5<\n              T0, T1, T2, T3, T4\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<6>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list6<\n              T0, T1, T2, T3, T4, T5\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<7>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list7<\n              T0, T1, T2, T3, T4, T5, T6\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<8>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list8<\n              T0, T1, T2, T3, T4, T5, T6, T7\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<9>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list9<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<10>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list10<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<11>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list11<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<12>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list12<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<13>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list13<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<14>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list14<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<15>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list15<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<16>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list16<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<17>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list17<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<18>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list18<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<19>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list19<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<20>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list20<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate< typename T >\nstruct is_list_arg\n{\n    BOOST_STATIC_CONSTANT(bool, value  = true);\n};\n\ntemplate<>\nstruct is_list_arg<na>\n{\n    BOOST_STATIC_CONSTANT(bool, value  = false);\n};\n\ntemplate<\n      typename T1, typename T2, typename T3, typename T4, typename T5\n    , typename T6, typename T7, typename T8, typename T9, typename T10\n    , typename T11, typename T12, typename T13, typename T14, typename T15\n    , typename T16, typename T17, typename T18, typename T19, typename T20\n    >\nstruct list_count_args\n{\n    BOOST_STATIC_CONSTANT(int, value =\n          is_list_arg<T1>::value + is_list_arg<T2>::value \n        + is_list_arg<T3>::value + is_list_arg<T4>::value \n        + is_list_arg<T5>::value + is_list_arg<T6>::value \n        + is_list_arg<T7>::value + is_list_arg<T8>::value \n        + is_list_arg<T9>::value + is_list_arg<T10>::value \n        + is_list_arg<T11>::value + is_list_arg<T12>::value \n        + is_list_arg<T13>::value + is_list_arg<T14>::value \n        + is_list_arg<T15>::value + is_list_arg<T16>::value \n        + is_list_arg<T17>::value + is_list_arg<T18>::value \n        + is_list_arg<T19>::value + is_list_arg<T20>::value\n        );\n\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct list_impl\n{\n    typedef aux::list_count_args<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        > arg_num_;\n\n    typedef typename aux::list_chooser< arg_num_::value >\n        ::template result_< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct list\n    : aux::list_impl<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        >::type\n{\n    typedef typename aux::list_impl<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/list_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/list_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< int N >\nstruct list_c_chooser;\n\n}\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<0>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list0_c<\n              T\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<1>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list1_c<\n              T, C0\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<2>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list2_c<\n              T, C0, C1\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<3>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list3_c<\n              T, C0, C1, C2\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<4>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list4_c<\n              T, C0, C1, C2, C3\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<5>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list5_c<\n              T, C0, C1, C2, C3, C4\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<6>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list6_c<\n              T, C0, C1, C2, C3, C4, C5\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<7>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list7_c<\n              T, C0, C1, C2, C3, C4, C5, C6\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<8>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list8_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<9>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list9_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<10>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list10_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<11>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list11_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<12>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list12_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<13>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list13_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<14>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list14_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<15>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list15_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<16>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list16_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<17>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list17_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<18>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list18_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<19>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list19_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<20>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list20_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate< long C >\nstruct is_list_c_arg\n{\n    BOOST_STATIC_CONSTANT(bool, value  = true);\n};\n\ntemplate<>\nstruct is_list_c_arg<LONG_MAX>\n{\n    BOOST_STATIC_CONSTANT(bool, value  = false);\n};\n\ntemplate<\n      long C1, long C2, long C3, long C4, long C5, long C6, long C7, long C8\n    , long C9, long C10, long C11, long C12, long C13, long C14, long C15\n    , long C16, long C17, long C18, long C19, long C20\n    >\nstruct list_c_count_args\n{\n    BOOST_STATIC_CONSTANT(int, value =\n          is_list_c_arg<C1>::value + is_list_c_arg<C2>::value \n        + is_list_c_arg<C3>::value + is_list_c_arg<C4>::value \n        + is_list_c_arg<C5>::value + is_list_c_arg<C6>::value \n        + is_list_c_arg<C7>::value + is_list_c_arg<C8>::value \n        + is_list_c_arg<C9>::value + is_list_c_arg<C10>::value \n        + is_list_c_arg<C11>::value + is_list_c_arg<C12>::value \n        + is_list_c_arg<C13>::value + is_list_c_arg<C14>::value \n        + is_list_c_arg<C15>::value + is_list_c_arg<C16>::value \n        + is_list_c_arg<C17>::value + is_list_c_arg<C18>::value \n        + is_list_c_arg<C19>::value + is_list_c_arg<C20>::value\n        );\n\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n    >\nstruct list_c_impl\n{\n    typedef aux::list_c_count_args<\n          C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19\n        > arg_num_;\n\n    typedef typename aux::list_c_chooser< arg_num_::value >\n        ::template result_< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX\n    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX\n    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX\n    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX\n    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX\n    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX\n    , long C18 = LONG_MAX, long C19 = LONG_MAX\n    >\nstruct list_c\n    : aux::list_c_impl<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19\n        >::type\n{\n    typedef typename aux::list_c_impl<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19\n        >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/map.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/map.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< int N >\nstruct map_chooser;\n\n}\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<0>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef map0<\n             \n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<1>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map1<\n              T0\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<2>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map2<\n              T0, T1\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<3>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map3<\n              T0, T1, T2\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<4>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map4<\n              T0, T1, T2, T3\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<5>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map5<\n              T0, T1, T2, T3, T4\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<6>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map6<\n              T0, T1, T2, T3, T4, T5\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<7>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map7<\n              T0, T1, T2, T3, T4, T5, T6\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<8>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map8<\n              T0, T1, T2, T3, T4, T5, T6, T7\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<9>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map9<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<10>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map10<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<11>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map11<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<12>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map12<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<13>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map13<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<14>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map14<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<15>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map15<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<16>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map16<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<17>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map17<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<18>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map18<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<19>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map19<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<20>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map20<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate< typename T >\nstruct is_map_arg\n{\n    BOOST_STATIC_CONSTANT(bool, value  = true);\n};\n\ntemplate<>\nstruct is_map_arg<na>\n{\n    BOOST_STATIC_CONSTANT(bool, value  = false);\n};\n\ntemplate<\n      typename T1, typename T2, typename T3, typename T4, typename T5\n    , typename T6, typename T7, typename T8, typename T9, typename T10\n    , typename T11, typename T12, typename T13, typename T14, typename T15\n    , typename T16, typename T17, typename T18, typename T19, typename T20\n    >\nstruct map_count_args\n{\n    BOOST_STATIC_CONSTANT(int, value =\n          is_map_arg<T1>::value + is_map_arg<T2>::value \n        + is_map_arg<T3>::value + is_map_arg<T4>::value \n        + is_map_arg<T5>::value + is_map_arg<T6>::value \n        + is_map_arg<T7>::value + is_map_arg<T8>::value \n        + is_map_arg<T9>::value + is_map_arg<T10>::value \n        + is_map_arg<T11>::value + is_map_arg<T12>::value \n        + is_map_arg<T13>::value + is_map_arg<T14>::value \n        + is_map_arg<T15>::value + is_map_arg<T16>::value \n        + is_map_arg<T17>::value + is_map_arg<T18>::value \n        + is_map_arg<T19>::value + is_map_arg<T20>::value\n        );\n\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct map_impl\n{\n    typedef aux::map_count_args<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        > arg_num_;\n\n    typedef typename aux::map_chooser< arg_num_::value >\n        ::template result_< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct map\n    : aux::map_impl<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        >::type\n{\n    typedef typename aux::map_impl<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/minus.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/minus.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value\n    >\nstruct minus_impl\n    : if_c<\n          ( tag1_ > tag2_ )\n        , aux::cast2nd_impl< minus_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< minus_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct minus_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct minus_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct minus_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct minus_tag\n    : tag< T,na >\n{\n};\n\n/// forward declaration\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct minus2;\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct minus\n\n    : aux::msvc_eti_base< typename if_<\n\n          is_na<N3>\n        , minus2< N1,N2 >\n        , minus<\n              minus2< N1,N2 >\n            , N3, N4, N5\n            >\n        >::type\n\n    >\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , minus\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1\n    , typename N2\n    >\nstruct minus2\n    : aux::msvc_eti_base< typename apply_wrap2<\n          minus_impl<\n              typename minus_tag<N1>::type\n            , typename minus_tag<N2>::type\n            >\n        , N1\n        , N2\n        >::type >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, minus2, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, minus)\n\n}}\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< typename T, T n1, T n2 >\nstruct minus_wknd\n{\n    BOOST_STATIC_CONSTANT(T, value  = (n1 - n2));\n    typedef integral_c< T,value > type;\n};\n\n}\n\ntemplate<>\nstruct minus_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n        : aux::minus_wknd<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , N1::value\n            , N2::value\n            >::type\n\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/modulus.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/modulus.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value\n    >\nstruct modulus_impl\n    : if_c<\n          ( tag1_ > tag2_ )\n        , aux::cast2nd_impl< modulus_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< modulus_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct modulus_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct modulus_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct modulus_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct modulus_tag\n    : tag< T,na >\n{\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct modulus\n    : aux::msvc_eti_base< typename apply_wrap2<\n          modulus_impl<\n              typename modulus_tag<N1>::type\n            , typename modulus_tag<N2>::type\n            >\n        , N1\n        , N2\n        >::type >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, modulus, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, modulus)\n\n}}\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< typename T, T n1, T n2 >\nstruct modulus_wknd\n{\n    BOOST_STATIC_CONSTANT(T, value  = (n1 % n2));\n    typedef integral_c< T,value > type;\n};\n\n}\n\ntemplate<>\nstruct modulus_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n        : aux::modulus_wknd<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , N1::value\n            , N2::value\n            >::type\n\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/not_equal_to.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/not_equal_to.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value\n    >\nstruct not_equal_to_impl\n    : if_c<\n          ( tag1_ > tag2_ )\n        , aux::cast2nd_impl< not_equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< not_equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct not_equal_to_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct not_equal_to_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct not_equal_to_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct not_equal_to_tag\n    : tag< T,na >\n{\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct not_equal_to\n    : aux::msvc_eti_base< typename apply_wrap2<\n          not_equal_to_impl<\n              typename not_equal_to_tag<N1>::type\n            , typename not_equal_to_tag<N2>::type\n            >\n        , N1\n        , N2\n        >::type >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, not_equal_to, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, not_equal_to)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct not_equal_to_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n    {\n        BOOST_STATIC_CONSTANT(bool, value =\n             ( BOOST_MPL_AUX_VALUE_WKND(N1)::value !=\n             BOOST_MPL_AUX_VALUE_WKND(N2)::value )\n            );\n        typedef bool_<value> type;\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/or.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/or.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< bool C_ > struct or_impl\n{\n    template<\n          typename T1, typename T2, typename T3, typename T4\n        >\n    struct result_\n        : true_\n    {\n    };\n};\n\ntemplate<> struct or_impl<false>\n{\n    template<\n          typename T1, typename T2, typename T3, typename T4\n        >\n    struct result_\n        : or_impl<\n              BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n            >::template result_< T2,T3,T4,false_ >\n    {\n    };\n\n    template<> struct result_< false_,false_,false_,false_ >\n        : false_\n    {\n    };\n};\n\n} // namespace aux\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    , typename T3 = false_, typename T4 = false_, typename T5 = false_\n    >\nstruct or_\n\n    : aux::or_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        >::template result_< T2,T3,T4,T5 >\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , or_\n        , ( T1, T2, T3, T4, T5)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC2(\n      2\n    , 5\n    , or_\n    )\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/placeholders.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n// Copyright Peter Dimov 2001-2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/placeholders.hpp\" header\n// -- DO NOT modify by hand!\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg< -1 > _;\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_;\n}\n\n}}\n\n/// agurt, 17/mar/02: one more placeholder for the last 'apply#' \n/// specialization\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<1> _1;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_1)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_1;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<2> _2;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_2)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_2;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<3> _3;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_3)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_3;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<4> _4;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_4)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_4;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<5> _5;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_5)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_5;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<6> _6;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_6)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_6;\n}\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/plus.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/plus.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value\n    >\nstruct plus_impl\n    : if_c<\n          ( tag1_ > tag2_ )\n        , aux::cast2nd_impl< plus_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< plus_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct plus_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct plus_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct plus_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct plus_tag\n    : tag< T,na >\n{\n};\n\n/// forward declaration\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct plus2;\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct plus\n\n    : aux::msvc_eti_base< typename if_<\n\n          is_na<N3>\n        , plus2< N1,N2 >\n        , plus<\n              plus2< N1,N2 >\n            , N3, N4, N5\n            >\n        >::type\n\n    >\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , plus\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1\n    , typename N2\n    >\nstruct plus2\n    : aux::msvc_eti_base< typename apply_wrap2<\n          plus_impl<\n              typename plus_tag<N1>::type\n            , typename plus_tag<N2>::type\n            >\n        , N1\n        , N2\n        >::type >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, plus2, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, plus)\n\n}}\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< typename T, T n1, T n2 >\nstruct plus_wknd\n{\n    BOOST_STATIC_CONSTANT(T, value  = (n1 + n2));\n    typedef integral_c< T,value > type;\n};\n\n}\n\ntemplate<>\nstruct plus_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n        : aux::plus_wknd<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , N1::value\n            , N2::value\n            >::type\n\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/quote.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/quote.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\ntemplate< bool > struct quote_impl\n{\n    template< typename T > struct result_\n        : T\n    {\n    };\n};\n\ntemplate<> struct quote_impl<false>\n{\n    template< typename T > struct result_\n    {\n        typedef T type;\n    };\n};\n\ntemplate<\n      template< typename P1 > class F\n    , typename Tag = void_\n    >\nstruct quote1\n{\n    template< typename U1 > struct apply\n\n        : quote_impl< aux::has_type< F<U1> >::value >\n            ::template result_< F<U1> >\n\n    {\n    };\n};\n\ntemplate<\n      template< typename P1, typename P2 > class F\n    , typename Tag = void_\n    >\nstruct quote2\n{\n    template< typename U1, typename U2 > struct apply\n\n        : quote_impl< aux::has_type< F< U1,U2 > >::value >\n            ::template result_< F< U1,U2 > >\n\n    {\n    };\n};\n\ntemplate<\n      template< typename P1, typename P2, typename P3 > class F\n    , typename Tag = void_\n    >\nstruct quote3\n{\n    template< typename U1, typename U2, typename U3 > struct apply\n\n        : quote_impl< aux::has_type< F< U1,U2,U3 > >::value >\n            ::template result_< F< U1,U2,U3 > >\n\n    {\n    };\n};\n\ntemplate<\n      template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename Tag = void_\n    >\nstruct quote4\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4\n        >\n    struct apply\n\n        : quote_impl< aux::has_type< F< U1,U2,U3,U4 > >::value >\n            ::template result_< F< U1,U2,U3,U4 > >\n\n    {\n    };\n};\n\ntemplate<\n      template<\n          typename P1, typename P2, typename P3, typename P4\n        , typename P5\n        >\n      class F\n    , typename Tag = void_\n    >\nstruct quote5\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4\n        , typename U5\n        >\n    struct apply\n\n        : quote_impl< aux::has_type< F< U1,U2,U3,U4,U5 > >::value >\n            ::template result_< F< U1,U2,U3,U4,U5 > >\n\n    {\n    };\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/reverse_fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/reverse_fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl;\n\ntemplate< long N >\nstruct reverse_fold_chunk;\n\ntemplate<> struct reverse_fold_chunk<0>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef fwd_state0 bkwd_state0;\n        typedef bkwd_state0 state;\n        typedef iter0 iterator;\n    };\n};\n\ntemplate<> struct reverse_fold_chunk<1>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        \n\n        typedef fwd_state1 bkwd_state1;\n        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n        typedef bkwd_state0 state;\n        typedef iter1 iterator;\n    };\n};\n\ntemplate<> struct reverse_fold_chunk<2>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        \n\n        typedef fwd_state2 bkwd_state2;\n        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter2 iterator;\n    };\n};\n\ntemplate<> struct reverse_fold_chunk<3>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        \n\n        typedef fwd_state3 bkwd_state3;\n        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;\n        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter3 iterator;\n    };\n};\n\ntemplate<> struct reverse_fold_chunk<4>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;\n        typedef typename mpl::next<iter3>::type iter4;\n        \n\n        typedef fwd_state4 bkwd_state4;\n        typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;\n        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;\n        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter4 iterator;\n    };\n};\n\ntemplate< long N >\nstruct reverse_fold_chunk\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;\n        typedef typename mpl::next<iter3>::type iter4;\n        \n\n        typedef reverse_fold_impl<\n              ( (N - 4) < 0 ? 0 : N - 4 )\n            , iter4\n            , Last\n            , fwd_state4\n            , BackwardOp\n            , ForwardOp\n            > nested_chunk;\n\n        typedef typename nested_chunk::state bkwd_state4;\n        typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;\n        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;\n        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef typename nested_chunk::iterator iterator;\n    };\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_step;\n\ntemplate<\n      typename Last\n    , typename State\n    >\nstruct reverse_fold_null_step\n{\n    typedef Last iterator;\n    typedef State state;\n};\n\ntemplate<>\nstruct reverse_fold_chunk< -1 >\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef typename if_<\n              typename is_same< First,Last >::type\n            , reverse_fold_null_step< Last,State >\n            , reverse_fold_step< First,Last,State,BackwardOp,ForwardOp >\n            >::type res_;\n\n        typedef typename res_::state state;\n        typedef typename res_::iterator iterator;\n    };\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_step\n{\n    typedef reverse_fold_chunk< -1 >::template result_<\n          typename mpl::next<First>::type\n        , Last\n        , typename apply2<ForwardOp,State, typename deref<First>::type>::type\n        , BackwardOp\n        , ForwardOp\n        > nested_step;\n\n    typedef typename apply2<\n          BackwardOp\n        , typename nested_step::state\n        , typename deref<First>::type\n        >::type state;\n\n    typedef typename nested_step::iterator iterator;\n};\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl\n    : reverse_fold_chunk<N>\n        ::template result_< First,Last,State,BackwardOp,ForwardOp >\n{\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/reverse_iter_fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/reverse_iter_fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl;\n\ntemplate< long N >\nstruct reverse_iter_fold_chunk;\n\ntemplate<> struct reverse_iter_fold_chunk<0>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef fwd_state0 bkwd_state0;\n        typedef bkwd_state0 state;\n        typedef iter0 iterator;\n    };\n};\n\ntemplate<> struct reverse_iter_fold_chunk<1>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        \n\n        typedef fwd_state1 bkwd_state1;\n        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n        typedef bkwd_state0 state;\n        typedef iter1 iterator;\n    };\n};\n\ntemplate<> struct reverse_iter_fold_chunk<2>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        \n\n        typedef fwd_state2 bkwd_state2;\n        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter2 iterator;\n    };\n};\n\ntemplate<> struct reverse_iter_fold_chunk<3>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        \n\n        typedef fwd_state3 bkwd_state3;\n        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;\n        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter3 iterator;\n    };\n};\n\ntemplate<> struct reverse_iter_fold_chunk<4>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;\n        typedef typename mpl::next<iter3>::type iter4;\n        \n\n        typedef fwd_state4 bkwd_state4;\n        typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;\n        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;\n        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter4 iterator;\n    };\n};\n\ntemplate< long N >\nstruct reverse_iter_fold_chunk\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;\n        typedef typename mpl::next<iter3>::type iter4;\n        \n\n        typedef reverse_iter_fold_impl<\n              ( (N - 4) < 0 ? 0 : N - 4 )\n            , iter4\n            , Last\n            , fwd_state4\n            , BackwardOp\n            , ForwardOp\n            > nested_chunk;\n\n        typedef typename nested_chunk::state bkwd_state4;\n        typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;\n        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;\n        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef typename nested_chunk::iterator iterator;\n    };\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_step;\n\ntemplate<\n      typename Last\n    , typename State\n    >\nstruct reverse_iter_fold_null_step\n{\n    typedef Last iterator;\n    typedef State state;\n};\n\ntemplate<>\nstruct reverse_iter_fold_chunk< -1 >\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef typename if_<\n              typename is_same< First,Last >::type\n            , reverse_iter_fold_null_step< Last,State >\n            , reverse_iter_fold_step< First,Last,State,BackwardOp,ForwardOp >\n            >::type res_;\n\n        typedef typename res_::state state;\n        typedef typename res_::iterator iterator;\n    };\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_step\n{\n    typedef reverse_iter_fold_chunk< -1 >::template result_<\n          typename mpl::next<First>::type\n        , Last\n        , typename apply2< ForwardOp,State,First >::type\n        , BackwardOp\n        , ForwardOp\n        > nested_step;\n\n    typedef typename apply2<\n          BackwardOp\n        , typename nested_step::state\n        , First\n        >::type state;\n\n    typedef typename nested_step::iterator iterator;\n};\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl\n    : reverse_iter_fold_chunk<N>\n        ::template result_< First,Last,State,BackwardOp,ForwardOp >\n{\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/set.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/set.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< int N >\nstruct set_chooser;\n\n}\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<0>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef set0<\n             \n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<1>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set1<\n              T0\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<2>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set2<\n              T0, T1\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<3>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set3<\n              T0, T1, T2\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<4>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set4<\n              T0, T1, T2, T3\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<5>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set5<\n              T0, T1, T2, T3, T4\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<6>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set6<\n              T0, T1, T2, T3, T4, T5\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<7>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set7<\n              T0, T1, T2, T3, T4, T5, T6\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<8>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set8<\n              T0, T1, T2, T3, T4, T5, T6, T7\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<9>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set9<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<10>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set10<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<11>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set11<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<12>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set12<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<13>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set13<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<14>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set14<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<15>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set15<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<16>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set16<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<17>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set17<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<18>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set18<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<19>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set19<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<20>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set20<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate< typename T >\nstruct is_set_arg\n{\n    BOOST_STATIC_CONSTANT(bool, value  = true);\n};\n\ntemplate<>\nstruct is_set_arg<na>\n{\n    BOOST_STATIC_CONSTANT(bool, value  = false);\n};\n\ntemplate<\n      typename T1, typename T2, typename T3, typename T4, typename T5\n    , typename T6, typename T7, typename T8, typename T9, typename T10\n    , typename T11, typename T12, typename T13, typename T14, typename T15\n    , typename T16, typename T17, typename T18, typename T19, typename T20\n    >\nstruct set_count_args\n{\n    BOOST_STATIC_CONSTANT(int, value =\n          is_set_arg<T1>::value + is_set_arg<T2>::value \n        + is_set_arg<T3>::value + is_set_arg<T4>::value \n        + is_set_arg<T5>::value + is_set_arg<T6>::value \n        + is_set_arg<T7>::value + is_set_arg<T8>::value \n        + is_set_arg<T9>::value + is_set_arg<T10>::value \n        + is_set_arg<T11>::value + is_set_arg<T12>::value \n        + is_set_arg<T13>::value + is_set_arg<T14>::value \n        + is_set_arg<T15>::value + is_set_arg<T16>::value \n        + is_set_arg<T17>::value + is_set_arg<T18>::value \n        + is_set_arg<T19>::value + is_set_arg<T20>::value\n        );\n\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct set_impl\n{\n    typedef aux::set_count_args<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        > arg_num_;\n\n    typedef typename aux::set_chooser< arg_num_::value >\n        ::template result_< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct set\n    : aux::set_impl<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        >::type\n{\n    typedef typename aux::set_impl<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/set_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/set_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< int N >\nstruct set_c_chooser;\n\n}\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<0>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set0_c<\n              T\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<1>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set1_c<\n              T, C0\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<2>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set2_c<\n              T, C0, C1\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<3>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set3_c<\n              T, C0, C1, C2\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<4>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set4_c<\n              T, C0, C1, C2, C3\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<5>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set5_c<\n              T, C0, C1, C2, C3, C4\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<6>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set6_c<\n              T, C0, C1, C2, C3, C4, C5\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<7>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set7_c<\n              T, C0, C1, C2, C3, C4, C5, C6\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<8>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set8_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<9>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set9_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<10>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set10_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<11>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set11_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<12>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set12_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<13>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set13_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<14>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set14_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<15>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set15_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<16>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set16_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<17>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set17_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<18>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set18_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<19>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set19_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<20>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set20_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate< long C >\nstruct is_set_c_arg\n{\n    BOOST_STATIC_CONSTANT(bool, value  = true);\n};\n\ntemplate<>\nstruct is_set_c_arg<LONG_MAX>\n{\n    BOOST_STATIC_CONSTANT(bool, value  = false);\n};\n\ntemplate<\n      long C1, long C2, long C3, long C4, long C5, long C6, long C7, long C8\n    , long C9, long C10, long C11, long C12, long C13, long C14, long C15\n    , long C16, long C17, long C18, long C19, long C20\n    >\nstruct set_c_count_args\n{\n    BOOST_STATIC_CONSTANT(int, value =\n          is_set_c_arg<C1>::value + is_set_c_arg<C2>::value \n        + is_set_c_arg<C3>::value + is_set_c_arg<C4>::value \n        + is_set_c_arg<C5>::value + is_set_c_arg<C6>::value \n        + is_set_c_arg<C7>::value + is_set_c_arg<C8>::value \n        + is_set_c_arg<C9>::value + is_set_c_arg<C10>::value \n        + is_set_c_arg<C11>::value + is_set_c_arg<C12>::value \n        + is_set_c_arg<C13>::value + is_set_c_arg<C14>::value \n        + is_set_c_arg<C15>::value + is_set_c_arg<C16>::value \n        + is_set_c_arg<C17>::value + is_set_c_arg<C18>::value \n        + is_set_c_arg<C19>::value + is_set_c_arg<C20>::value\n        );\n\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n    >\nstruct set_c_impl\n{\n    typedef aux::set_c_count_args<\n          C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19\n        > arg_num_;\n\n    typedef typename aux::set_c_chooser< arg_num_::value >\n        ::template result_< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX\n    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX\n    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX\n    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX\n    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX\n    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX\n    , long C18 = LONG_MAX, long C19 = LONG_MAX\n    >\nstruct set_c\n    : aux::set_c_impl<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19\n        >::type\n{\n    typedef typename aux::set_c_impl<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19\n        >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/shift_left.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/shift_left.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value\n    >\nstruct shift_left_impl\n    : if_c<\n          ( tag1_ > tag2_ )\n        , aux::cast2nd_impl< shift_left_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< shift_left_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct shift_left_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct shift_left_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct shift_left_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct shift_left_tag\n    : tag< T,na >\n{\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct shift_left\n    : aux::msvc_eti_base< typename apply_wrap2<\n          shift_left_impl<\n              typename shift_left_tag<N1>::type\n            , typename shift_left_tag<N2>::type\n            >\n        , N1\n        , N2\n        >::type >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_left, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, shift_left)\n\n}}\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< typename T, typename Shift, T n, Shift s >\nstruct shift_left_wknd\n{\n    BOOST_STATIC_CONSTANT(T, value  = (n << s));\n    typedef integral_c< T,value > type;\n};\n\n}\n\ntemplate<>\nstruct shift_left_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N, typename S > struct apply\n        : aux::shift_left_wknd<\n              typename N::value_type\n            , typename S::value_type\n            , N::value\n            , S::value\n            >::type\n\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/shift_right.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/shift_right.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value\n    >\nstruct shift_right_impl\n    : if_c<\n          ( tag1_ > tag2_ )\n        , aux::cast2nd_impl< shift_right_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< shift_right_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct shift_right_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct shift_right_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct shift_right_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct shift_right_tag\n    : tag< T,na >\n{\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct shift_right\n    : aux::msvc_eti_base< typename apply_wrap2<\n          shift_right_impl<\n              typename shift_right_tag<N1>::type\n            , typename shift_right_tag<N2>::type\n            >\n        , N1\n        , N2\n        >::type >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_right, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, shift_right)\n\n}}\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< typename T, typename Shift, T n, Shift s >\nstruct shift_right_wknd\n{\n    BOOST_STATIC_CONSTANT(T, value  = (n >> s));\n    typedef integral_c< T,value > type;\n};\n\n}\n\ntemplate<>\nstruct shift_right_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N, typename S > struct apply\n        : aux::shift_right_wknd<\n              typename N::value_type\n            , typename S::value_type\n            , N::value\n            , S::value\n            >::type\n\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/template_arity.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/template_arity.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< bool >\nstruct template_arity_impl\n{\n    template< typename F > struct result_\n        : mpl::int_< -1 >\n    {\n    };\n};\n\ntemplate<>\nstruct template_arity_impl<true>\n{\n    template< typename F > struct result_\n        : F::arity\n    {\n    };\n};\n\ntemplate< typename F >\nstruct template_arity\n    : template_arity_impl< ::boost::mpl::aux::has_rebind<F>::value >\n        ::template result_<F>\n{\n};\n\ntemplate<>\nstruct template_arity<int>\n    : mpl::int_< -1 >\n{\n};\n\n}}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/times.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/times.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag1_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag1)::value\n    , BOOST_MPL_AUX_NTTP_DECL(int, tag2_)  = BOOST_MPL_AUX_MSVC_VALUE_WKND(Tag2)::value\n    >\nstruct times_impl\n    : if_c<\n          ( tag1_ > tag2_ )\n        , aux::cast2nd_impl< times_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< times_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct times_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct times_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct times_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct times_tag\n    : tag< T,na >\n{\n};\n\n/// forward declaration\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct times2;\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct times\n\n    : aux::msvc_eti_base< typename if_<\n\n          is_na<N3>\n        , times2< N1,N2 >\n        , times<\n              times2< N1,N2 >\n            , N3, N4, N5\n            >\n        >::type\n\n    >\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , times\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1\n    , typename N2\n    >\nstruct times2\n    : aux::msvc_eti_base< typename apply_wrap2<\n          times_impl<\n              typename times_tag<N1>::type\n            , typename times_tag<N2>::type\n            >\n        , N1\n        , N2\n        >::type >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, times2, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, times)\n\n}}\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< typename T, T n1, T n2 >\nstruct times_wknd\n{\n    BOOST_STATIC_CONSTANT(T, value  = (n1 * n2));\n    typedef integral_c< T,value > type;\n};\n\n}\n\ntemplate<>\nstruct times_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n        : aux::times_wknd<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , N1::value\n            , N2::value\n            >::type\n\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/unpack_args.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2002-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/unpack_args.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate< BOOST_MPL_AUX_NTTP_DECL(int, size) > struct unpack_args_impl\n{\n    template< typename F, typename Args > struct apply;\n};\n\ntemplate<> struct unpack_args_impl<0>\n{\n    template< typename F, typename Args > struct apply\n        : apply0<\n              F\n            >\n    {\n    };\n};\n\ntemplate<> struct unpack_args_impl<1>\n{\n    template< typename F, typename Args > struct apply\n        : apply1<\n              F\n            , typename at_c< Args,0 >::type\n            >\n    {\n    };\n};\n\ntemplate<> struct unpack_args_impl<2>\n{\n    template< typename F, typename Args > struct apply\n        : apply2<\n              F\n            , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n            >\n    {\n    };\n};\n\ntemplate<> struct unpack_args_impl<3>\n{\n    template< typename F, typename Args > struct apply\n        : apply3<\n              F\n            , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n            , typename at_c< Args,2 >::type\n            >\n    {\n    };\n};\n\ntemplate<> struct unpack_args_impl<4>\n{\n    template< typename F, typename Args > struct apply\n        : apply4<\n              F\n            , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n            , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type\n            >\n    {\n    };\n};\n\ntemplate<> struct unpack_args_impl<5>\n{\n    template< typename F, typename Args > struct apply\n        : apply5<\n              F\n            , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n            , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type\n            , typename at_c< Args,4 >::type\n            >\n    {\n    };\n};\n\n}\n\ntemplate<\n      typename F\n    >\nstruct unpack_args\n{\n    template< typename Args > struct apply\n\n        : aux::unpack_args_impl< size<Args>::value >\n            ::template apply< F,Args >\n\n    {\n    };\n};\n\nBOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(1, unpack_args)\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/vector.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/vector.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< int N >\nstruct vector_chooser;\n\n}\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<0>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef vector0<\n             \n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<1>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector1<\n              T0\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<2>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector2<\n              T0, T1\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<3>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector3<\n              T0, T1, T2\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<4>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector4<\n              T0, T1, T2, T3\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<5>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector5<\n              T0, T1, T2, T3, T4\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<6>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector6<\n              T0, T1, T2, T3, T4, T5\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<7>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector7<\n              T0, T1, T2, T3, T4, T5, T6\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<8>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector8<\n              T0, T1, T2, T3, T4, T5, T6, T7\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<9>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector9<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<10>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector10<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<11>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector11<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<12>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector12<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<13>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector13<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<14>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector14<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<15>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector15<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<16>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector16<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<17>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector17<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<18>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector18<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<19>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector19<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<20>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector20<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate< typename T >\nstruct is_vector_arg\n{\n    BOOST_STATIC_CONSTANT(bool, value  = true);\n};\n\ntemplate<>\nstruct is_vector_arg<na>\n{\n    BOOST_STATIC_CONSTANT(bool, value  = false);\n};\n\ntemplate<\n      typename T1, typename T2, typename T3, typename T4, typename T5\n    , typename T6, typename T7, typename T8, typename T9, typename T10\n    , typename T11, typename T12, typename T13, typename T14, typename T15\n    , typename T16, typename T17, typename T18, typename T19, typename T20\n    >\nstruct vector_count_args\n{\n    BOOST_STATIC_CONSTANT(int, value =\n          is_vector_arg<T1>::value + is_vector_arg<T2>::value \n        + is_vector_arg<T3>::value + is_vector_arg<T4>::value \n        + is_vector_arg<T5>::value + is_vector_arg<T6>::value \n        + is_vector_arg<T7>::value + is_vector_arg<T8>::value \n        + is_vector_arg<T9>::value + is_vector_arg<T10>::value \n        + is_vector_arg<T11>::value + is_vector_arg<T12>::value \n        + is_vector_arg<T13>::value + is_vector_arg<T14>::value \n        + is_vector_arg<T15>::value + is_vector_arg<T16>::value \n        + is_vector_arg<T17>::value + is_vector_arg<T18>::value \n        + is_vector_arg<T19>::value + is_vector_arg<T20>::value\n        );\n\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct vector_impl\n{\n    typedef aux::vector_count_args<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        > arg_num_;\n\n    typedef typename aux::vector_chooser< arg_num_::value >\n        ::template result_< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct vector\n    : aux::vector_impl<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        >::type\n{\n    typedef typename aux::vector_impl<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/msvc70/vector_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/vector_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< int N >\nstruct vector_c_chooser;\n\n}\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<0>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector0_c<\n              T\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<1>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector1_c<\n              T, T(C0)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<2>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector2_c<\n              T, T(C0), T(C1)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<3>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector3_c<\n              T, T(C0), T(C1), T(C2)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<4>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector4_c<\n              T, T(C0), T(C1), T(C2), T(C3)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<5>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector5_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<6>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector6_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<7>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector7_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<8>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector8_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<9>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector9_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<10>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector10_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<11>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector11_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<12>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector12_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<13>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector13_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<14>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector14_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<15>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector15_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<16>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector16_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<17>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector17_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<18>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector18_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<19>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector19_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<20>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector20_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate< long C >\nstruct is_vector_c_arg\n{\n    BOOST_STATIC_CONSTANT(bool, value  = true);\n};\n\ntemplate<>\nstruct is_vector_c_arg<LONG_MAX>\n{\n    BOOST_STATIC_CONSTANT(bool, value  = false);\n};\n\ntemplate<\n      long C1, long C2, long C3, long C4, long C5, long C6, long C7, long C8\n    , long C9, long C10, long C11, long C12, long C13, long C14, long C15\n    , long C16, long C17, long C18, long C19, long C20\n    >\nstruct vector_c_count_args\n{\n    BOOST_STATIC_CONSTANT(int, value =\n          is_vector_c_arg<C1>::value + is_vector_c_arg<C2>::value \n        + is_vector_c_arg<C3>::value + is_vector_c_arg<C4>::value \n        + is_vector_c_arg<C5>::value + is_vector_c_arg<C6>::value \n        + is_vector_c_arg<C7>::value + is_vector_c_arg<C8>::value \n        + is_vector_c_arg<C9>::value + is_vector_c_arg<C10>::value \n        + is_vector_c_arg<C11>::value + is_vector_c_arg<C12>::value \n        + is_vector_c_arg<C13>::value + is_vector_c_arg<C14>::value \n        + is_vector_c_arg<C15>::value + is_vector_c_arg<C16>::value \n        + is_vector_c_arg<C17>::value + is_vector_c_arg<C18>::value \n        + is_vector_c_arg<C19>::value + is_vector_c_arg<C20>::value\n        );\n\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n    >\nstruct vector_c_impl\n{\n    typedef aux::vector_c_count_args<\n          C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19\n        > arg_num_;\n\n    typedef typename aux::vector_c_chooser< arg_num_::value >\n        ::template result_< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX\n    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX\n    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX\n    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX\n    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX\n    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX\n    , long C18 = LONG_MAX, long C19 = LONG_MAX\n    >\nstruct vector_c\n    : aux::vector_c_impl<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19\n        >::type\n{\n    typedef typename aux::vector_c_impl<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19\n        >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/advance_backward.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/advance_backward.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< long N > struct advance_backward;\ntemplate<>\nstruct advance_backward<0>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef iter0 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<1>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef iter1 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<2>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef typename prior<iter1>::type iter2;\n        typedef iter2 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<3>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef typename prior<iter1>::type iter2;\n        typedef typename prior<iter2>::type iter3;\n        typedef iter3 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<4>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef typename prior<iter1>::type iter2;\n        typedef typename prior<iter2>::type iter3;\n        typedef typename prior<iter3>::type iter4;\n        typedef iter4 type;\n    };\n};\n\ntemplate< long N >\nstruct advance_backward\n{\n    template< typename Iterator > struct apply\n    {\n        typedef typename apply_wrap1<\n              advance_backward<4>\n            , Iterator\n            >::type chunk_result_;\n\n        typedef typename apply_wrap1<\n              advance_backward<(\n                (N - 4) < 0\n                    ? 0\n                    : N - 4\n                    )>\n            , chunk_result_\n            >::type type;\n    };\n};\n\n}}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/advance_forward.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/advance_forward.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< long N > struct advance_forward;\ntemplate<>\nstruct advance_forward<0>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef iter0 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<1>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef iter1 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<2>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef typename next<iter1>::type iter2;\n        typedef iter2 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<3>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef typename next<iter1>::type iter2;\n        typedef typename next<iter2>::type iter3;\n        typedef iter3 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<4>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef typename next<iter1>::type iter2;\n        typedef typename next<iter2>::type iter3;\n        typedef typename next<iter3>::type iter4;\n        typedef iter4 type;\n    };\n};\n\ntemplate< long N >\nstruct advance_forward\n{\n    template< typename Iterator > struct apply\n    {\n        typedef typename apply_wrap1<\n              advance_forward<4>\n            , Iterator\n            >::type chunk_result_;\n\n        typedef typename apply_wrap1<\n              advance_forward<(\n                (N - 4) < 0\n                    ? 0\n                    : N - 4\n                    )>\n            , chunk_result_\n            >::type type;\n    };\n};\n\n}}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/and.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/and.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate< bool C_, typename T1, typename T2, typename T3, typename T4 >\nstruct and_impl\n    : false_\n{\n};\n\ntemplate< typename T1, typename T2, typename T3, typename T4 >\nstruct and_impl< true,T1,T2,T3,T4 >\n    : and_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        , T2, T3, T4\n        , true_\n        >\n{\n};\n\ntemplate<>\nstruct and_impl<\n          true\n        , true_, true_, true_, true_\n        >\n    : true_\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    , typename T3 = true_, typename T4 = true_, typename T5 = true_\n    >\nstruct and_\n\n    : aux::and_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        , T2, T3, T4, T5\n        >\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , and_\n        , ( T1, T2, T3, T4, T5)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC2(\n      2\n    , 5\n    , and_\n    )\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/apply.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/apply.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F\n    >\nstruct apply0\n\n    : apply_wrap0<\n          typename lambda<F>::type\n       \n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          1\n        , apply0\n        , (F )\n        )\n};\n\ntemplate<\n      typename F\n    >\nstruct apply< F,na,na,na,na,na >\n    : apply0<F>\n{\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply1\n\n    : apply_wrap1<\n          typename lambda<F>::type\n        , T1\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          2\n        , apply1\n        , (F, T1)\n        )\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply< F,T1,na,na,na,na >\n    : apply1< F,T1 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply2\n\n    : apply_wrap2<\n          typename lambda<F>::type\n        , T1, T2\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          3\n        , apply2\n        , (F, T1, T2)\n        )\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply< F,T1,T2,na,na,na >\n    : apply2< F,T1,T2 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply3\n\n    : apply_wrap3<\n          typename lambda<F>::type\n        , T1, T2, T3\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          4\n        , apply3\n        , (F, T1, T2, T3)\n        )\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply< F,T1,T2,T3,na,na >\n    : apply3< F,T1,T2,T3 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply4\n\n    : apply_wrap4<\n          typename lambda<F>::type\n        , T1, T2, T3, T4\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , apply4\n        , (F, T1, T2, T3, T4)\n        )\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply< F,T1,T2,T3,T4,na >\n    : apply4< F,T1,T2,T3,T4 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply5\n\n    : apply_wrap5<\n          typename lambda<F>::type\n        , T1, T2, T3, T4, T5\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          6\n        , apply5\n        , (F, T1, T2, T3, T4, T5)\n        )\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply\n    : apply5< F,T1,T2,T3,T4,T5 >\n{\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/apply_fwd.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/apply_fwd.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na\n    >\nstruct apply;\n\ntemplate<\n      typename F\n    >\nstruct apply0;\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply1;\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply2;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply3;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply4;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply5;\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/apply_wrap.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/apply_wrap.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      int N, typename F\n    >\nstruct apply_wrap_impl0;\n\ntemplate<\n      typename F\n    >\nstruct apply_wrap_impl0<\n          0\n        , F\n       \n        >\n{\n    typedef typename F::template apply<\n         \n/// since the defaults are \"lost\", we have to pass *something* even for nullary\n/// metafunction classes\n        na\n        > type;\n};\n\ntemplate<\n      typename F\n    >\nstruct apply_wrap_impl0<\n          1\n        , F\n       \n        >\n{\n    typedef typename F::template apply<\n         \n        na\n        > type;\n};\n\ntemplate<\n      typename F\n    >\nstruct apply_wrap_impl0<\n          2\n        , F\n       \n        >\n{\n    typedef typename F::template apply<\n         \n        na, na\n\n        > type;\n};\n\ntemplate<\n      typename F\n    >\nstruct apply_wrap_impl0<\n          3\n        , F\n       \n        >\n{\n    typedef typename F::template apply<\n         \n        na, na, na\n\n        > type;\n};\n\ntemplate<\n      typename F\n    >\nstruct apply_wrap_impl0<\n          4\n        , F\n       \n        >\n{\n    typedef typename F::template apply<\n         \n        na, na, na, na\n\n        > type;\n};\n\ntemplate<\n      typename F\n    >\nstruct apply_wrap_impl0<\n          5\n        , F\n       \n        >\n{\n    typedef typename F::template apply<\n         \n        na, na, na, na, na\n\n        > type;\n};\n\ntemplate<\n      typename F\n    >\nstruct apply_wrap0\n    : apply_wrap_impl0<\n          ::boost::mpl::aux::arity< F,0 >::value\n        , F\n       \n        >::type\n{\n};\n\ntemplate<\n      int N, typename F, typename T1\n    >\nstruct apply_wrap_impl1;\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply_wrap_impl1<\n          1\n        , F\n        , T1\n        >\n{\n    typedef typename F::template apply<\n          T1\n        > type;\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply_wrap_impl1<\n          2\n        , F\n        , T1\n        >\n{\n    typedef typename F::template apply<\n          T1\n        , na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply_wrap_impl1<\n          3\n        , F\n        , T1\n        >\n{\n    typedef typename F::template apply<\n          T1\n        , na, na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply_wrap_impl1<\n          4\n        , F\n        , T1\n        >\n{\n    typedef typename F::template apply<\n          T1\n        , na, na, na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply_wrap_impl1<\n          5\n        , F\n        , T1\n        >\n{\n    typedef typename F::template apply<\n          T1\n        , na, na, na, na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply_wrap1\n    : apply_wrap_impl1<\n          ::boost::mpl::aux::arity< F,1 >::value\n        , F\n        , T1\n        >::type\n{\n};\n\ntemplate<\n      int N, typename F, typename T1, typename T2\n    >\nstruct apply_wrap_impl2;\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply_wrap_impl2<\n          2\n        , F\n        , T1, T2\n        >\n{\n    typedef typename F::template apply<\n          T1, T2\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply_wrap_impl2<\n          3\n        , F\n        , T1, T2\n        >\n{\n    typedef typename F::template apply<\n          T1, T2\n\n        , na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply_wrap_impl2<\n          4\n        , F\n        , T1, T2\n        >\n{\n    typedef typename F::template apply<\n          T1, T2\n\n        , na, na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply_wrap_impl2<\n          5\n        , F\n        , T1, T2\n        >\n{\n    typedef typename F::template apply<\n          T1, T2\n\n        , na, na, na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply_wrap2\n    : apply_wrap_impl2<\n          ::boost::mpl::aux::arity< F,2 >::value\n        , F\n        , T1, T2\n        >::type\n{\n};\n\ntemplate<\n      int N, typename F, typename T1, typename T2, typename T3\n    >\nstruct apply_wrap_impl3;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply_wrap_impl3<\n          3\n        , F\n        , T1, T2, T3\n        >\n{\n    typedef typename F::template apply<\n          T1, T2, T3\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply_wrap_impl3<\n          4\n        , F\n        , T1, T2, T3\n        >\n{\n    typedef typename F::template apply<\n          T1, T2, T3\n\n        , na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply_wrap_impl3<\n          5\n        , F\n        , T1, T2, T3\n        >\n{\n    typedef typename F::template apply<\n          T1, T2, T3\n\n        , na, na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply_wrap3\n    : apply_wrap_impl3<\n          ::boost::mpl::aux::arity< F,3 >::value\n        , F\n        , T1, T2, T3\n        >::type\n{\n};\n\ntemplate<\n      int N, typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply_wrap_impl4;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply_wrap_impl4<\n          4\n        , F\n        , T1, T2, T3, T4\n        >\n{\n    typedef typename F::template apply<\n          T1, T2, T3, T4\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply_wrap_impl4<\n          5\n        , F\n        , T1, T2, T3, T4\n        >\n{\n    typedef typename F::template apply<\n          T1, T2, T3, T4\n\n        , na\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply_wrap4\n    : apply_wrap_impl4<\n          ::boost::mpl::aux::arity< F,4 >::value\n        , F\n        , T1, T2, T3, T4\n        >::type\n{\n};\n\ntemplate<\n      int N, typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply_wrap_impl5;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply_wrap_impl5<\n          5\n        , F\n        , T1, T2, T3, T4, T5\n        >\n{\n    typedef typename F::template apply<\n          T1, T2, T3, T4, T5\n\n        > type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply_wrap5\n    : apply_wrap_impl5<\n          ::boost::mpl::aux::arity< F,5 >::value\n        , F\n        , T1, T2, T3, T4, T5\n        >::type\n{\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/arg.hpp",
    "content": "\n// Copyright Peter Dimov 2001-2002\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/arg.hpp\" header\n// -- DO NOT modify by hand!\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntemplate<> struct arg< -1 >\n{\n    BOOST_STATIC_CONSTANT(int, value  = -1);\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U1 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<1>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 1);\n    typedef arg<2> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U1 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<2>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 2);\n    typedef arg<3> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U2 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<3>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 3);\n    typedef arg<4> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U3 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<4>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 4);\n    typedef arg<5> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U4 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<5>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 5);\n    typedef arg<6> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U5 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\nBOOST_MPL_AUX_NONTYPE_ARITY_SPEC(1,int, arg)\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/basic_bind.hpp",
    "content": "\n// Copyright Peter Dimov 2001\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/basic_bind.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      typename T, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg\n{\n    typedef T type;\n};\n\ntemplate<\n      int N, typename U1, typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 >\n{\n    typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg< bind< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5 >\n{\n    typedef bind< F,T1,T2,T3,T4,T5 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename F\n    >\nstruct bind0\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n\n     public:\n        typedef typename apply_wrap0<\n              f_\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg<\n      bind0<F>, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind0<F> f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(1, bind0)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)\n\ntemplate<\n      typename F\n    >\nstruct bind< F,na,na,na,na,na >\n    : bind0<F>\n{\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind1\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n\n     public:\n        typedef typename apply_wrap1<\n              f_\n            , typename t1::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename U1, typename U2, typename U3\n    , typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind1< F,T1 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind1< F,T1 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(2, bind1)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind< F,T1,na,na,na,na >\n    : bind1< F,T1 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind2\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n\n     public:\n        typedef typename apply_wrap2<\n              f_\n            , typename t1::type, typename t2::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename U1, typename U2\n    , typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind2< F,T1,T2 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind2< F,T1,T2 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(3, bind2)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind< F,T1,T2,na,na,na >\n    : bind2< F,T1,T2 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind3\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n\n     public:\n        typedef typename apply_wrap3<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename U1\n    , typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind3< F,T1,T2,T3 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(4, bind3)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind< F,T1,T2,T3,na,na >\n    : bind3< F,T1,T2,T3 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind4\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;\n\n     public:\n        typedef typename apply_wrap4<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename U1, typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind4< F,T1,T2,T3,T4 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(5, bind4)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind< F,T1,T2,T3,T4,na >\n    : bind4< F,T1,T2,T3,T4 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind5\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;\n        typedef aux::resolve_bind_arg< T5,U1,U2,U3,U4,U5 > t5;\n\n     public:\n        typedef typename apply_wrap5<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type, typename t5::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg<\n      bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind5< F,T1,T2,T3,T4,T5 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(6, bind5)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind\n    : bind5< F,T1,T2,T3,T4,T5 >\n{\n};\n\n/// if_/eval_if specializations\ntemplate< template< typename T1, typename T2, typename T3 > class F, typename Tag >\nstruct quote3;\n\ntemplate< typename T1, typename T2, typename T3 > struct if_;\n\ntemplate<\n      typename Tag, typename T1, typename T2, typename T3\n    >\nstruct bind3<\n      quote3< if_,Tag >\n    , T1, T2, T3\n    >\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef mpl::arg<1> n1;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n        typedef typename if_<\n              typename t1::type\n            , t2, t3\n            >::type f_;\n\n     public:\n        typedef typename f_::type type;\n    };\n};\n\ntemplate<\n      template< typename T1, typename T2, typename T3 > class F, typename Tag\n    >\nstruct quote3;\n\ntemplate< typename T1, typename T2, typename T3 > struct eval_if;\n\ntemplate<\n      typename Tag, typename T1, typename T2, typename T3\n    >\nstruct bind3<\n      quote3< eval_if,Tag >\n    , T1, T2, T3\n    >\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef mpl::arg<1> n1;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n        typedef typename eval_if<\n              typename t1::type\n            , t2, t3\n            >::type f_;\n\n     public:\n        typedef typename f_::type type;\n    };\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/bind.hpp",
    "content": "\n// Copyright Peter Dimov 2001\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bind.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      typename T, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg\n{\n    typedef T type;\n};\n\ntemplate<\n      typename T\n    , typename Arg\n    >\nstruct replace_unnamed_arg\n{\n    typedef Arg next;\n    typedef T type;\n};\n\ntemplate<\n      typename Arg\n    >\nstruct replace_unnamed_arg< arg< -1 >, Arg >\n{\n    typedef typename Arg::next next;\n    typedef Arg type;\n};\n\ntemplate<\n      int N, typename U1, typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 >\n{\n    typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg< bind< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5 >\n{\n    typedef bind< F,T1,T2,T3,T4,T5 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename F\n    >\nstruct bind0\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n     public:\n        typedef typename apply_wrap0<\n              f_\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg<\n      bind0<F>, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind0<F> f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(1, bind0)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)\n\ntemplate<\n      typename F\n    >\nstruct bind< F,na,na,na,na,na >\n    : bind0<F>\n{\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind1\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n     public:\n        typedef typename apply_wrap1<\n              f_\n            , typename t1::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename U1, typename U2, typename U3\n    , typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind1< F,T1 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind1< F,T1 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(2, bind1)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind< F,T1,na,na,na,na >\n    : bind1< F,T1 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind2\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n     public:\n        typedef typename apply_wrap2<\n              f_\n            , typename t1::type, typename t2::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename U1, typename U2\n    , typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind2< F,T1,T2 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind2< F,T1,T2 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(3, bind2)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind< F,T1,T2,na,na,na >\n    : bind2< F,T1,T2 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind3\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n     public:\n        typedef typename apply_wrap3<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename U1\n    , typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind3< F,T1,T2,T3 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(4, bind3)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind< F,T1,T2,T3,na,na >\n    : bind3< F,T1,T2,T3 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind4\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n        typedef aux::replace_unnamed_arg< T4,n4 > r4;\n        typedef typename r4::type a4;\n        typedef typename r4::next n5;\n        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;\n        ///\n     public:\n        typedef typename apply_wrap4<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename U1, typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind4< F,T1,T2,T3,T4 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(5, bind4)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind< F,T1,T2,T3,T4,na >\n    : bind4< F,T1,T2,T3,T4 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind5\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n        typedef aux::replace_unnamed_arg< T4,n4 > r4;\n        typedef typename r4::type a4;\n        typedef typename r4::next n5;\n        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;\n        ///\n        typedef aux::replace_unnamed_arg< T5,n5 > r5;\n        typedef typename r5::type a5;\n        typedef typename r5::next n6;\n        typedef aux::resolve_bind_arg< a5,U1,U2,U3,U4,U5 > t5;\n        ///\n     public:\n        typedef typename apply_wrap5<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type, typename t5::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg<\n      bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind5< F,T1,T2,T3,T4,T5 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(6, bind5)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind\n    : bind5< F,T1,T2,T3,T4,T5 >\n{\n};\n\n/// if_/eval_if specializations\ntemplate< template< typename T1, typename T2, typename T3 > class F, typename Tag >\nstruct quote3;\n\ntemplate< typename T1, typename T2, typename T3 > struct if_;\n\ntemplate<\n      typename Tag, typename T1, typename T2, typename T3\n    >\nstruct bind3<\n      quote3< if_,Tag >\n    , T1, T2, T3\n    >\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef mpl::arg<1> n1;\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n        typedef typename if_<\n              typename t1::type\n            , t2, t3\n            >::type f_;\n\n     public:\n        typedef typename f_::type type;\n    };\n};\n\ntemplate<\n      template< typename T1, typename T2, typename T3 > class F, typename Tag\n    >\nstruct quote3;\n\ntemplate< typename T1, typename T2, typename T3 > struct eval_if;\n\ntemplate<\n      typename Tag, typename T1, typename T2, typename T3\n    >\nstruct bind3<\n      quote3< eval_if,Tag >\n    , T1, T2, T3\n    >\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef mpl::arg<1> n1;\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n        typedef typename eval_if<\n              typename t1::type\n            , t2, t3\n            >::type f_;\n\n     public:\n        typedef typename f_::type type;\n    };\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/bind_fwd.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bind_fwd.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na\n    >\nstruct bind;\n\ntemplate<\n      typename F\n    >\nstruct bind0;\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind1;\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind2;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind3;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind4;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind5;\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/bitand.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bitand.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct bitand_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< bitand_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< bitand_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct bitand_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitand_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitand_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct bitand_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct bitand_\n    : bitand_< bitand_< bitand_< bitand_< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , bitand_\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct bitand_< N1,N2,N3,N4,na >\n\n    : bitand_< bitand_< bitand_< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitand_\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct bitand_< N1,N2,N3,na,na >\n\n    : bitand_< bitand_< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitand_\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct bitand_< N1,N2,na,na,na >\n    : bitand_impl<\n          typename bitand_tag<N1>::type\n        , typename bitand_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitand_\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, bitand_)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct bitand_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  & BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/bitor.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bitor.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct bitor_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< bitor_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< bitor_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct bitor_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitor_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitor_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct bitor_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct bitor_\n    : bitor_< bitor_< bitor_< bitor_< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , bitor_\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct bitor_< N1,N2,N3,N4,na >\n\n    : bitor_< bitor_< bitor_< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitor_\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct bitor_< N1,N2,N3,na,na >\n\n    : bitor_< bitor_< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitor_\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct bitor_< N1,N2,na,na,na >\n    : bitor_impl<\n          typename bitor_tag<N1>::type\n        , typename bitor_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitor_\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, bitor_)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct bitor_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  | BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/bitxor.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bitxor.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct bitxor_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< bitxor_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< bitxor_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct bitxor_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitxor_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitxor_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct bitxor_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct bitxor_\n    : bitxor_< bitxor_< bitxor_< bitxor_< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , bitxor_\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct bitxor_< N1,N2,N3,N4,na >\n\n    : bitxor_< bitxor_< bitxor_< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitxor_\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct bitxor_< N1,N2,N3,na,na >\n\n    : bitxor_< bitxor_< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitxor_\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct bitxor_< N1,N2,na,na,na >\n    : bitxor_impl<\n          typename bitxor_tag<N1>::type\n        , typename bitxor_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitxor_\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, bitxor_)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct bitxor_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  ^ BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/deque.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/deque.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct deque;\n\ntemplate<\n     \n    >\nstruct deque<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector0<  >\n{\n    typedef vector0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct deque<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector1<T0>\n{\n    typedef typename vector1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct deque<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector2< T0,T1 >\n{\n    typedef typename vector2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct deque<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector3< T0,T1,T2 >\n{\n    typedef typename vector3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct deque<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector4< T0,T1,T2,T3 >\n{\n    typedef typename vector4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector5< T0,T1,T2,T3,T4 >\n{\n    typedef typename vector5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename vector6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename vector7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename vector8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : vector15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename vector15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : vector16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename vector16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : vector17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename vector17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : vector18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename vector18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : vector19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename vector19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct deque\n    : vector20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename vector20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/divides.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/divides.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct divides_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< divides_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< divides_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct divides_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct divides_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct divides_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct divides_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct divides\n    : divides< divides< divides< divides< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , divides\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct divides< N1,N2,N3,N4,na >\n\n    : divides< divides< divides< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , divides\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct divides< N1,N2,N3,na,na >\n\n    : divides< divides< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , divides\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct divides< N1,N2,na,na,na >\n    : divides_impl<\n          typename divides_tag<N1>::type\n        , typename divides_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , divides\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, divides)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct divides_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  / BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/equal_to.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/equal_to.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct equal_to_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct equal_to_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct equal_to_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct equal_to_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct equal_to_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct equal_to\n\n    : equal_to_impl<\n          typename equal_to_tag<N1>::type\n        , typename equal_to_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, equal_to, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, equal_to)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct equal_to_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value  == BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl;\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 0,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef state0 state;\n    typedef iter0 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 1,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    \n\n    typedef state1 state;\n    typedef iter1 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 2,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    \n\n    typedef state2 state;\n    typedef iter2 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 3,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    \n\n    typedef state3 state;\n    typedef iter3 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 4,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp, state3, typename deref<iter3>::type >::type state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef state4 state;\n    typedef iter4 iterator;\n};\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl\n{\n    typedef fold_impl<\n          4\n        , First\n        , Last\n        , State\n        , ForwardOp\n        > chunk_;\n\n    typedef fold_impl<\n          ( (N - 4) < 0 ? 0 : N - 4 )\n        , typename chunk_::iterator\n        , Last\n        , typename chunk_::state\n        , ForwardOp\n        > res_;\n\n    typedef typename res_::state state;\n    typedef typename res_::iterator iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< -1,First,Last,State,ForwardOp >\n    : fold_impl<\n          -1\n        , typename mpl::next<First>::type\n        , Last\n        , typename apply2<ForwardOp,State, typename deref<First>::type>::type\n        , ForwardOp\n        >\n{\n};\n\ntemplate<\n      typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< -1,Last,Last,State,ForwardOp >\n{\n    typedef State state;\n    typedef Last iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/full_lambda.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/full_lambda.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false\n    , bool C5 = false\n    >\nstruct lambda_or\n    : true_\n{\n};\n\ntemplate<>\nstruct lambda_or< false,false,false,false,false >\n    : false_\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename T\n    , typename Tag\n   \n    >\nstruct lambda\n{\n    typedef false_ is_le;\n    typedef T result_;\n    typedef T type;\n};\n\ntemplate<\n      typename T\n    >\nstruct is_lambda_expression\n    : lambda<T>::is_le\n{\n};\n\ntemplate< int N, typename Tag >\nstruct lambda< arg<N>, Tag >\n{\n    typedef true_ is_le;\n    typedef mpl::arg<N> result_; // qualified for the sake of MIPSpro 7.41\n    typedef mpl::protect<result_> type;\n};\n\ntemplate<\n      typename F\n    , typename Tag\n    >\nstruct lambda<\n          bind0<F>\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind0<\n          F\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1 > class F\n    , typename L1\n    >\nstruct le_result1\n{\n    typedef F<\n          typename L1::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1 > class F\n    , typename L1\n    >\nstruct le_result1< true_,Tag,F,L1 >\n{\n    typedef bind1<\n          quote1< F,Tag >\n        , typename L1::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1 > class F\n    , typename T1\n    , typename Tag\n    >\nstruct lambda<\n          F<T1>\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef typename l1::is_le is_le1;\n    typedef typename aux::lambda_or<\n          is_le1::value\n        >::type is_le;\n\n    typedef aux::le_result1<\n          is_le, Tag, F, l1\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1\n    , typename Tag\n    >\nstruct lambda<\n          bind1< F,T1 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind1<\n          F\n        , T1\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2 > class F\n    , typename L1, typename L2\n    >\nstruct le_result2\n{\n    typedef F<\n          typename L1::type, typename L2::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2 > class F\n    , typename L1, typename L2\n    >\nstruct le_result2< true_,Tag,F,L1,L2 >\n{\n    typedef bind2<\n          quote2< F,Tag >\n        , typename L1::result_, typename L2::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1, typename P2 > class F\n    , typename T1, typename T2\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2 >\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value\n        >::type is_le;\n\n    typedef aux::le_result2<\n          is_le, Tag, F, l1, l2\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    , typename Tag\n    >\nstruct lambda<\n          bind2< F,T1,T2 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind2<\n          F\n        , T1, T2\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2, typename P3 > class F\n    , typename L1, typename L2, typename L3\n    >\nstruct le_result3\n{\n    typedef F<\n          typename L1::type, typename L2::type, typename L3::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2, typename P3 > class F\n    , typename L1, typename L2, typename L3\n    >\nstruct le_result3< true_,Tag,F,L1,L2,L3 >\n{\n    typedef bind3<\n          quote3< F,Tag >\n        , typename L1::result_, typename L2::result_, typename L3::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1, typename P2, typename P3 > class F\n    , typename T1, typename T2, typename T3\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2,T3 >\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    typedef lambda< T3,Tag > l3;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    typedef typename l3::is_le is_le3;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value, is_le3::value\n        >::type is_le;\n\n    typedef aux::le_result3<\n          is_le, Tag, F, l1, l2, l3\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    , typename Tag\n    >\nstruct lambda<\n          bind3< F,T1,T2,T3 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind3<\n          F\n        , T1, T2, T3\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename L1, typename L2, typename L3, typename L4\n    >\nstruct le_result4\n{\n    typedef F<\n          typename L1::type, typename L2::type, typename L3::type\n        , typename L4::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename L1, typename L2, typename L3, typename L4\n    >\nstruct le_result4< true_,Tag,F,L1,L2,L3,L4 >\n{\n    typedef bind4<\n          quote4< F,Tag >\n        , typename L1::result_, typename L2::result_, typename L3::result_\n        , typename L4::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename T1, typename T2, typename T3, typename T4\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2,T3,T4 >\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    typedef lambda< T3,Tag > l3;\n    typedef lambda< T4,Tag > l4;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    typedef typename l3::is_le is_le3;\n    typedef typename l4::is_le is_le4;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value, is_le3::value, is_le4::value\n        >::type is_le;\n\n    typedef aux::le_result4<\n          is_le, Tag, F, l1, l2, l3, l4\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename Tag\n    >\nstruct lambda<\n          bind4< F,T1,T2,T3,T4 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind4<\n          F\n        , T1, T2, T3, T4\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F\n    , typename L1, typename L2, typename L3, typename L4, typename L5\n    >\nstruct le_result5\n{\n    typedef F<\n          typename L1::type, typename L2::type, typename L3::type\n        , typename L4::type, typename L5::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F\n    , typename L1, typename L2, typename L3, typename L4, typename L5\n    >\nstruct le_result5< true_,Tag,F,L1,L2,L3,L4,L5 >\n{\n    typedef bind5<\n          quote5< F,Tag >\n        , typename L1::result_, typename L2::result_, typename L3::result_\n        , typename L4::result_, typename L5::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template<\n          typename P1, typename P2, typename P3, typename P4\n        , typename P5\n        >\n      class F\n    , typename T1, typename T2, typename T3, typename T4, typename T5\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2,T3,T4,T5 >\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    typedef lambda< T3,Tag > l3;\n    typedef lambda< T4,Tag > l4;\n    typedef lambda< T5,Tag > l5;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    typedef typename l3::is_le is_le3;\n    typedef typename l4::is_le is_le4;\n    typedef typename l5::is_le is_le5;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value, is_le3::value, is_le4::value\n        , is_le5::value\n        >::type is_le;\n\n    typedef aux::le_result5<\n          is_le, Tag, F, l1, l2, l3, l4, l5\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    , typename Tag\n    >\nstruct lambda<\n          bind5< F,T1,T2,T3,T4,T5 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind5<\n          F\n        , T1, T2, T3, T4, T5\n        > result_;\n\n    typedef result_ type;\n};\n\n/// special case for 'protect'\ntemplate< typename T, typename Tag >\nstruct lambda< mpl::protect<T>, Tag >\n{\n    typedef false_ is_le;\n    typedef mpl::protect<T> result_;\n    typedef result_ type;\n};\n\n/// specializations for the main 'bind' form\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    , typename Tag\n    >\nstruct lambda<\n          bind< F,T1,T2,T3,T4,T5 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind< F,T1,T2,T3,T4,T5 > result_;\n    typedef result_ type;\n};\n\n/// workaround for MWCW 8.3+/EDG < 303, leads to ambiguity on Digital Mars\n\ntemplate<\n      typename F, typename Tag1, typename Tag2\n    >\nstruct lambda<\n          lambda< F,Tag1 >\n        , Tag2\n        >\n{\n    typedef lambda< F,Tag2 > l1;\n    typedef lambda< Tag1,Tag2 > l2;\n    typedef typename l1::is_le is_le;\n    typedef aux::le_result2<is_le, Tag2, mpl::lambda, l1, l2> le_result_;\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\nBOOST_MPL_AUX_NA_SPEC(2, lambda)\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/greater.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/greater.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct greater_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< greater_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< greater_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct greater_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct greater_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct greater_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct greater_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct greater\n\n    : greater_impl<\n          typename greater_tag<N1>::type\n        , typename greater_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, greater)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct greater_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value > BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/greater_equal.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/greater_equal.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct greater_equal_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< greater_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< greater_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct greater_equal_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct greater_equal_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct greater_equal_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct greater_equal_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct greater_equal\n\n    : greater_equal_impl<\n          typename greater_equal_tag<N1>::type\n        , typename greater_equal_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater_equal, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, greater_equal)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct greater_equal_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value >= BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/inherit.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/inherit.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    >\nstruct inherit2\n    : T1, T2\n{\n    typedef inherit2 type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, inherit2, (T1, T2))\n};\n\ntemplate< typename T1 >\nstruct inherit2< T1,empty_base >\n{\n    typedef T1 type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (T1, empty_base))\n};\n\ntemplate< typename T2 >\nstruct inherit2< empty_base,T2 >\n{\n    typedef T2 type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base, T2))\n};\n\ntemplate<>\nstruct inherit2< empty_base,empty_base >\n{\n    typedef empty_base type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base, empty_base))\n};\n\nBOOST_MPL_AUX_NA_SPEC(2, inherit2)\n\ntemplate<\n      typename T1 = na, typename T2 = na, typename T3 = na\n    >\nstruct inherit3\n    : inherit2<\n          typename inherit2<\n              T1, T2\n            >::type\n        , T3\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          3\n        , inherit3\n        , ( T1, T2, T3)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC(3, inherit3)\n\ntemplate<\n      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na\n    >\nstruct inherit4\n    : inherit2<\n          typename inherit3<\n              T1, T2, T3\n            >::type\n        , T4\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          4\n        , inherit4\n        , ( T1, T2, T3, T4)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC(4, inherit4)\n\ntemplate<\n      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na\n    , typename T5 = na\n    >\nstruct inherit5\n    : inherit2<\n          typename inherit4<\n              T1, T2, T3, T4\n            >::type\n        , T5\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , inherit5\n        , ( T1, T2, T3, T4, T5)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC(5, inherit5)\n\n/// primary template\n\ntemplate<\n      typename T1 = empty_base, typename T2 = empty_base\n    , typename T3 = empty_base, typename T4 = empty_base\n    , typename T5 = empty_base\n    >\nstruct inherit\n    : inherit5< T1,T2,T3,T4,T5 >\n{\n};\n\ntemplate<>\nstruct inherit< na,na,na,na,na >\n{\n    template<\n\n          typename T1 = empty_base, typename T2 = empty_base\n        , typename T3 = empty_base, typename T4 = empty_base\n        , typename T5 = empty_base\n\n        >\n    struct apply\n        : inherit< T1,T2,T3,T4,T5 >\n    {\n    };\n};\n\nBOOST_MPL_AUX_NA_SPEC_LAMBDA(5, inherit)\nBOOST_MPL_AUX_NA_SPEC_ARITY(5, inherit)\nBOOST_MPL_AUX_NA_SPEC_TEMPLATE_ARITY(5, 5, inherit)\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/iter_fold_if_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n// Copyright David Abrahams 2001-2002\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/iter_fold_if_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< typename Iterator, typename State >\nstruct iter_fold_if_null_step\n{\n    typedef State state;\n    typedef Iterator iterator;\n};\n\ntemplate< bool >\nstruct iter_fold_if_step_impl\n{\n    template<\n          typename Iterator\n        , typename State\n        , typename StateOp\n        , typename IteratorOp\n        >\n    struct result_\n    {\n        typedef typename apply2< StateOp,State,Iterator >::type state;\n        typedef typename IteratorOp::type iterator;\n    };\n};\n\ntemplate<>\nstruct iter_fold_if_step_impl<false>\n{\n    template<\n          typename Iterator\n        , typename State\n        , typename StateOp\n        , typename IteratorOp\n        >\n    struct result_\n    {\n        typedef State state;\n        typedef Iterator iterator;\n    };\n};\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename ForwardOp\n    , typename Predicate\n    >\nstruct iter_fold_if_forward_step\n{\n    typedef typename apply2< Predicate,State,Iterator >::type not_last;\n    typedef typename iter_fold_if_step_impl<\n          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value\n        >::template result_< Iterator,State,ForwardOp, mpl::next<Iterator> > impl_;\n\n    typedef typename impl_::state state;\n    typedef typename impl_::iterator iterator;\n};\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename BackwardOp\n    , typename Predicate\n    >\nstruct iter_fold_if_backward_step\n{\n    typedef typename apply2< Predicate,State,Iterator >::type not_last;\n    typedef typename iter_fold_if_step_impl<\n          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value\n        >::template result_< Iterator,State,BackwardOp, identity<Iterator> > impl_;\n\n    typedef typename impl_::state state;\n    typedef typename impl_::iterator iterator;\n};\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename ForwardOp\n    , typename ForwardPredicate\n    , typename BackwardOp\n    , typename BackwardPredicate\n    >\nstruct iter_fold_if_impl\n{\n private:\n    typedef iter_fold_if_null_step< Iterator,State > forward_step0;\n    typedef iter_fold_if_forward_step< typename forward_step0::iterator, typename forward_step0::state, ForwardOp, ForwardPredicate > forward_step1;\n    typedef iter_fold_if_forward_step< typename forward_step1::iterator, typename forward_step1::state, ForwardOp, ForwardPredicate > forward_step2;\n    typedef iter_fold_if_forward_step< typename forward_step2::iterator, typename forward_step2::state, ForwardOp, ForwardPredicate > forward_step3;\n    typedef iter_fold_if_forward_step< typename forward_step3::iterator, typename forward_step3::state, ForwardOp, ForwardPredicate > forward_step4;\n    \n\n    typedef typename if_<\n          typename forward_step4::not_last\n        , iter_fold_if_impl<\n              typename forward_step4::iterator\n            , typename forward_step4::state\n            , ForwardOp\n            , ForwardPredicate\n            , BackwardOp\n            , BackwardPredicate\n            >\n        , iter_fold_if_null_step<\n              typename forward_step4::iterator\n            , typename forward_step4::state\n            >\n        >::type backward_step4;\n\n    typedef iter_fold_if_backward_step< typename forward_step3::iterator, typename backward_step4::state, BackwardOp, BackwardPredicate > backward_step3;\n    typedef iter_fold_if_backward_step< typename forward_step2::iterator, typename backward_step3::state, BackwardOp, BackwardPredicate > backward_step2;\n    typedef iter_fold_if_backward_step< typename forward_step1::iterator, typename backward_step2::state, BackwardOp, BackwardPredicate > backward_step1;\n    typedef iter_fold_if_backward_step< typename forward_step0::iterator, typename backward_step1::state, BackwardOp, BackwardPredicate > backward_step0;\n    \n\n public:\n    typedef typename backward_step0::state state;\n    typedef typename backward_step4::iterator iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/iter_fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/iter_fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl;\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 0,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef state0 state;\n    typedef iter0 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 1,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    \n\n    typedef state1 state;\n    typedef iter1 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 2,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    \n\n    typedef state2 state;\n    typedef iter2 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 3,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp,state2,iter2 >::type state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    \n\n    typedef state3 state;\n    typedef iter3 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 4,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp,state2,iter2 >::type state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp,state3,iter3 >::type state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef state4 state;\n    typedef iter4 iterator;\n};\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl\n{\n    typedef iter_fold_impl<\n          4\n        , First\n        , Last\n        , State\n        , ForwardOp\n        > chunk_;\n\n    typedef iter_fold_impl<\n          ( (N - 4) < 0 ? 0 : N - 4 )\n        , typename chunk_::iterator\n        , Last\n        , typename chunk_::state\n        , ForwardOp\n        > res_;\n\n    typedef typename res_::state state;\n    typedef typename res_::iterator iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< -1,First,Last,State,ForwardOp >\n    : iter_fold_impl<\n          -1\n        , typename mpl::next<First>::type\n        , Last\n        , typename apply2< ForwardOp,State,First >::type\n        , ForwardOp\n        >\n{\n};\n\ntemplate<\n      typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< -1,Last,Last,State,ForwardOp >\n{\n    typedef State state;\n    typedef Last iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/lambda_no_ctps.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/lambda_no_ctps.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false\n    , bool C5 = false\n    >\nstruct lambda_or\n    : true_\n{\n};\n\ntemplate<>\nstruct lambda_or< false,false,false,false,false >\n    : false_\n{\n};\n\ntemplate< typename Arity > struct lambda_impl\n{\n    template< typename T, typename Tag, typename Protect > struct result_\n    {\n        typedef T type;\n        typedef is_placeholder<T> is_le;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<1> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef typename l1::is_le is_le1;\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value\n            > is_le;\n\n        typedef bind1<\n              typename F::rebind\n            , typename l1::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<2> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value\n            > is_le;\n\n        typedef bind2<\n              typename F::rebind\n            , typename l1::type, typename l2::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<3> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        typedef lambda< typename F::arg3, Tag, false_ > l3;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        typedef typename l3::is_le is_le3;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value\n            > is_le;\n\n        typedef bind3<\n              typename F::rebind\n            , typename l1::type, typename l2::type, typename l3::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<4> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        typedef lambda< typename F::arg3, Tag, false_ > l3;\n        typedef lambda< typename F::arg4, Tag, false_ > l4;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        typedef typename l3::is_le is_le3;\n        typedef typename l4::is_le is_le4;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value\n            > is_le;\n\n        typedef bind4<\n              typename F::rebind\n            , typename l1::type, typename l2::type, typename l3::type\n            , typename l4::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<5> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        typedef lambda< typename F::arg3, Tag, false_ > l3;\n        typedef lambda< typename F::arg4, Tag, false_ > l4;\n        typedef lambda< typename F::arg5, Tag, false_ > l5;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        typedef typename l3::is_le is_le3;\n        typedef typename l4::is_le is_le4;\n        typedef typename l5::is_le is_le5;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le5)::value\n            > is_le;\n\n        typedef bind5<\n              typename F::rebind\n            , typename l1::type, typename l2::type, typename l3::type\n            , typename l4::type, typename l5::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\n} // namespace aux\n\ntemplate<\n      typename T\n    , typename Tag\n    , typename Protect\n    >\nstruct lambda\n{\n    /// Metafunction forwarding confuses MSVC 6.x\n    typedef typename aux::template_arity<T>::type arity_;\n    typedef typename aux::lambda_impl<arity_>\n        ::template result_< T,Tag,Protect > l_;\n\n    typedef typename l_::type type;\n    typedef typename l_::is_le is_le;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(3, lambda, (T, Tag, Protect))\n};\n\nBOOST_MPL_AUX_NA_SPEC2(1, 3, lambda)\n\ntemplate<\n      typename T\n    >\nstruct is_lambda_expression\n    : lambda<T>::is_le\n{\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/less.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/less.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct less_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< less_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< less_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct less_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct less_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct less_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct less_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct less\n\n    : less_impl<\n          typename less_tag<N1>::type\n        , typename less_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, less)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct less_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N2)::value > BOOST_MPL_AUX_VALUE_WKND(N1)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/less_equal.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/less_equal.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct less_equal_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< less_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< less_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct less_equal_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct less_equal_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct less_equal_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct less_equal_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct less_equal\n\n    : less_equal_impl<\n          typename less_equal_tag<N1>::type\n        , typename less_equal_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less_equal, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, less_equal)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct less_equal_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value <= BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/list.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/list.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct list;\n\ntemplate<\n     \n    >\nstruct list<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list0<  >\n{\n    typedef list0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct list<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list1<T0>\n{\n    typedef typename list1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct list<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list2< T0,T1 >\n{\n    typedef typename list2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct list<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list3< T0,T1,T2 >\n{\n    typedef typename list3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct list<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list4< T0,T1,T2,T3 >\n{\n    typedef typename list4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct list<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list5< T0,T1,T2,T3,T4 >\n{\n    typedef typename list5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename list6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename list7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename list8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename list9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename list10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename list11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : list12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename list12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : list13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename list13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : list14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename list14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : list15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename list15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : list16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename list16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : list17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename list17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : list18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename list18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : list19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename list19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct list\n    : list20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename list20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/list_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/list_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX\n    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX\n    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX\n    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX\n    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX\n    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX\n    , long C18 = LONG_MAX, long C19 = LONG_MAX\n    >\nstruct list_c;\n\ntemplate<\n      typename T\n    >\nstruct list_c<\n          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list0_c<T>\n{\n    typedef typename list0_c<T>::type type;\n};\n\ntemplate<\n      typename T, long C0\n    >\nstruct list_c<\n          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list1_c< T,C0 >\n{\n    typedef typename list1_c< T,C0 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1\n    >\nstruct list_c<\n          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list2_c< T,C0,C1 >\n{\n    typedef typename list2_c< T,C0,C1 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2\n    >\nstruct list_c<\n          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list3_c< T,C0,C1,C2 >\n{\n    typedef typename list3_c< T,C0,C1,C2 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list4_c< T,C0,C1,C2,C3 >\n{\n    typedef typename list4_c< T,C0,C1,C2,C3 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list5_c< T,C0,C1,C2,C3,C4 >\n{\n    typedef typename list5_c< T,C0,C1,C2,C3,C4 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list6_c< T,C0,C1,C2,C3,C4,C5 >\n{\n    typedef typename list6_c< T,C0,C1,C2,C3,C4,C5 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list7_c< T,C0,C1,C2,C3,C4,C5,C6 >\n{\n    typedef typename list7_c< T,C0,C1,C2,C3,C4,C5,C6 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX\n        >\n    : list8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >\n{\n    typedef typename list8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : list9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >\n{\n    typedef typename list9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : list10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >\n{\n    typedef typename list10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >\n{\n    typedef typename list11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >\n{\n    typedef typename list12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >\n{\n    typedef typename list13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list14_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        >\n{\n    typedef typename list14_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list15_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        >\n{\n    typedef typename list15_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list16_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15\n        >\n{\n    typedef typename list16_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list17_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16\n        >\n{\n    typedef typename list17_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, LONG_MAX, LONG_MAX\n        >\n    : list18_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17\n        >\n{\n    typedef typename list18_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, LONG_MAX\n        >\n    : list19_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18\n        >\n{\n    typedef typename list19_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n    >\nstruct list_c\n    : list20_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, C19\n        >\n{\n    typedef typename list20_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/map.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/map.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct map;\n\ntemplate<\n     \n    >\nstruct map<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map0<  >\n{\n    typedef map0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct map<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map1<T0>\n{\n    typedef typename map1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct map<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map2< T0,T1 >\n{\n    typedef typename map2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct map<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map3< T0,T1,T2 >\n{\n    typedef typename map3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct map<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map4< T0,T1,T2,T3 >\n{\n    typedef typename map4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct map<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map5< T0,T1,T2,T3,T4 >\n{\n    typedef typename map5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename map6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename map7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename map8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename map9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename map10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename map11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : map12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename map12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : map13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename map13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : map14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename map14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : map15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename map15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : map16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename map16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : map17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename map17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : map18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename map18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : map19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename map19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct map\n    : map20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename map20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/minus.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/minus.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct minus_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< minus_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< minus_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct minus_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct minus_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct minus_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct minus_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct minus\n    : minus< minus< minus< minus< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , minus\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct minus< N1,N2,N3,N4,na >\n\n    : minus< minus< minus< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , minus\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct minus< N1,N2,N3,na,na >\n\n    : minus< minus< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , minus\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct minus< N1,N2,na,na,na >\n    : minus_impl<\n          typename minus_tag<N1>::type\n        , typename minus_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , minus\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, minus)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct minus_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  - BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/modulus.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/modulus.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct modulus_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< modulus_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< modulus_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct modulus_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct modulus_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct modulus_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct modulus_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct modulus\n\n    : modulus_impl<\n          typename modulus_tag<N1>::type\n        , typename modulus_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, modulus, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, modulus)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct modulus_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  % BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/not_equal_to.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/not_equal_to.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct not_equal_to_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< not_equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< not_equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct not_equal_to_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct not_equal_to_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct not_equal_to_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct not_equal_to_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct not_equal_to\n\n    : not_equal_to_impl<\n          typename not_equal_to_tag<N1>::type\n        , typename not_equal_to_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, not_equal_to, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, not_equal_to)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct not_equal_to_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value != BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/or.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/or.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate< bool C_, typename T1, typename T2, typename T3, typename T4 >\nstruct or_impl\n    : true_\n{\n};\n\ntemplate< typename T1, typename T2, typename T3, typename T4 >\nstruct or_impl< false,T1,T2,T3,T4 >\n    : or_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        , T2, T3, T4\n        , false_\n        >\n{\n};\n\ntemplate<>\nstruct or_impl<\n          false\n        , false_, false_, false_, false_\n        >\n    : false_\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    , typename T3 = false_, typename T4 = false_, typename T5 = false_\n    >\nstruct or_\n\n    : aux::or_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        , T2, T3, T4, T5\n        >\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , or_\n        , ( T1, T2, T3, T4, T5)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC2(\n      2\n    , 5\n    , or_\n    )\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/placeholders.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n// Copyright Peter Dimov 2001-2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/placeholders.hpp\" header\n// -- DO NOT modify by hand!\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg< -1 > _;\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_;\n}\n\n}}\n\n/// agurt, 17/mar/02: one more placeholder for the last 'apply#' \n/// specialization\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<1> _1;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_1)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_1;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<2> _2;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_2)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_2;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<3> _3;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_3)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_3;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<4> _4;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_4)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_4;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<5> _5;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_5)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_5;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<6> _6;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_6)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_6;\n}\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/plus.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/plus.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct plus_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< plus_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< plus_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct plus_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct plus_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct plus_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct plus_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct plus\n    : plus< plus< plus< plus< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , plus\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct plus< N1,N2,N3,N4,na >\n\n    : plus< plus< plus< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , plus\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct plus< N1,N2,N3,na,na >\n\n    : plus< plus< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , plus\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct plus< N1,N2,na,na,na >\n    : plus_impl<\n          typename plus_tag<N1>::type\n        , typename plus_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , plus\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, plus)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct plus_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  + BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/quote.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/quote.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate< typename T, bool has_type_ >\nstruct quote_impl\n    : T\n{\n};\n\ntemplate< typename T >\nstruct quote_impl< T,false >\n{\n    typedef T type;\n};\n\ntemplate<\n      template< typename P1 > class F\n    , typename Tag = void_\n    >\nstruct quote1\n{\n    template< typename U1 > struct apply\n\n        : quote_impl<\n              F<U1>\n            , aux::has_type< F<U1> >::value\n            >\n\n    {\n    };\n};\n\ntemplate<\n      template< typename P1, typename P2 > class F\n    , typename Tag = void_\n    >\nstruct quote2\n{\n    template< typename U1, typename U2 > struct apply\n\n        : quote_impl<\n              F< U1,U2 >\n            , aux::has_type< F< U1,U2 > >::value\n            >\n\n    {\n    };\n};\n\ntemplate<\n      template< typename P1, typename P2, typename P3 > class F\n    , typename Tag = void_\n    >\nstruct quote3\n{\n    template< typename U1, typename U2, typename U3 > struct apply\n\n        : quote_impl<\n              F< U1,U2,U3 >\n            , aux::has_type< F< U1,U2,U3 > >::value\n            >\n\n    {\n    };\n};\n\ntemplate<\n      template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename Tag = void_\n    >\nstruct quote4\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4\n        >\n    struct apply\n\n        : quote_impl<\n              F< U1,U2,U3,U4 >\n            , aux::has_type< F< U1,U2,U3,U4 > >::value\n            >\n\n    {\n    };\n};\n\ntemplate<\n      template<\n          typename P1, typename P2, typename P3, typename P4\n        , typename P5\n        >\n      class F\n    , typename Tag = void_\n    >\nstruct quote5\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4\n        , typename U5\n        >\n    struct apply\n\n        : quote_impl<\n              F< U1,U2,U3,U4,U5 >\n            , aux::has_type< F< U1,U2,U3,U4,U5 > >::value\n            >\n\n    {\n    };\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/reverse_fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/reverse_fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl;\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< 0,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef fwd_state0 bkwd_state0;\n    typedef bkwd_state0 state;\n    typedef iter0 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< 1,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    \n\n    typedef fwd_state1 bkwd_state1;\n    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n    typedef bkwd_state0 state;\n    typedef iter1 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< 2,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    \n\n    typedef fwd_state2 bkwd_state2;\n    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef iter2 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< 3,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    \n\n    typedef fwd_state3 bkwd_state3;\n    typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;\n    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef iter3 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< 4,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef fwd_state4 bkwd_state4;\n    typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;\n    typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;\n    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef iter4 iterator;\n};\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef reverse_fold_impl<\n          ( (N - 4) < 0 ? 0 : N - 4 )\n        , iter4\n        , Last\n        , fwd_state4\n        , BackwardOp\n        , ForwardOp\n        > nested_chunk;\n\n    typedef typename nested_chunk::state bkwd_state4;\n    typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;\n    typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;\n    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef typename nested_chunk::iterator iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< -1,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef reverse_fold_impl<\n          -1\n        , typename mpl::next<First>::type\n        , Last\n        , typename apply2<ForwardOp,State, typename deref<First>::type>::type\n        , BackwardOp\n        , ForwardOp\n        > nested_step;\n\n    typedef typename apply2<\n          BackwardOp\n        , typename nested_step::state\n        , typename deref<First>::type\n        >::type state;\n\n    typedef typename nested_step::iterator iterator;\n};\n\ntemplate<\n      typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< -1,Last,Last,State,BackwardOp,ForwardOp >\n{\n    typedef State state;\n    typedef Last iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/reverse_iter_fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/reverse_iter_fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl;\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< 0,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef fwd_state0 bkwd_state0;\n    typedef bkwd_state0 state;\n    typedef iter0 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< 1,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    \n\n    typedef fwd_state1 bkwd_state1;\n    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n    typedef bkwd_state0 state;\n    typedef iter1 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< 2,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    \n\n    typedef fwd_state2 bkwd_state2;\n    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef iter2 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< 3,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    \n\n    typedef fwd_state3 bkwd_state3;\n    typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;\n    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef iter3 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< 4,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef fwd_state4 bkwd_state4;\n    typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;\n    typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;\n    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef iter4 iterator;\n};\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef reverse_iter_fold_impl<\n          ( (N - 4) < 0 ? 0 : N - 4 )\n        , iter4\n        , Last\n        , fwd_state4\n        , BackwardOp\n        , ForwardOp\n        > nested_chunk;\n\n    typedef typename nested_chunk::state bkwd_state4;\n    typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;\n    typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;\n    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef typename nested_chunk::iterator iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< -1,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef reverse_iter_fold_impl<\n          -1\n        , typename mpl::next<First>::type\n        , Last\n        , typename apply2< ForwardOp,State,First >::type\n        , BackwardOp\n        , ForwardOp\n        > nested_step;\n\n    typedef typename apply2<\n          BackwardOp\n        , typename nested_step::state\n        , First\n        >::type state;\n\n    typedef typename nested_step::iterator iterator;\n};\n\ntemplate<\n      typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< -1,Last,Last,State,BackwardOp,ForwardOp >\n{\n    typedef State state;\n    typedef Last iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/set.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/set.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct set;\n\ntemplate<\n     \n    >\nstruct set<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set0<  >\n{\n    typedef set0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct set<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set1<T0>\n{\n    typedef typename set1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct set<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set2< T0,T1 >\n{\n    typedef typename set2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct set<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set3< T0,T1,T2 >\n{\n    typedef typename set3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct set<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set4< T0,T1,T2,T3 >\n{\n    typedef typename set4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct set<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set5< T0,T1,T2,T3,T4 >\n{\n    typedef typename set5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename set6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename set7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename set8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename set9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename set10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename set11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : set12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename set12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : set13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename set13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : set14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename set14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : set15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename set15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : set16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename set16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : set17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename set17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : set18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename set18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : set19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename set19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct set\n    : set20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename set20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/set_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/set_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX\n    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX\n    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX\n    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX\n    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX\n    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX\n    , long C18 = LONG_MAX, long C19 = LONG_MAX\n    >\nstruct set_c;\n\ntemplate<\n      typename T\n    >\nstruct set_c<\n          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set0_c<T>\n{\n    typedef typename set0_c<T>::type type;\n};\n\ntemplate<\n      typename T, long C0\n    >\nstruct set_c<\n          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set1_c< T,C0 >\n{\n    typedef typename set1_c< T,C0 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1\n    >\nstruct set_c<\n          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set2_c< T,C0,C1 >\n{\n    typedef typename set2_c< T,C0,C1 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2\n    >\nstruct set_c<\n          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set3_c< T,C0,C1,C2 >\n{\n    typedef typename set3_c< T,C0,C1,C2 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set4_c< T,C0,C1,C2,C3 >\n{\n    typedef typename set4_c< T,C0,C1,C2,C3 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set5_c< T,C0,C1,C2,C3,C4 >\n{\n    typedef typename set5_c< T,C0,C1,C2,C3,C4 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set6_c< T,C0,C1,C2,C3,C4,C5 >\n{\n    typedef typename set6_c< T,C0,C1,C2,C3,C4,C5 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set7_c< T,C0,C1,C2,C3,C4,C5,C6 >\n{\n    typedef typename set7_c< T,C0,C1,C2,C3,C4,C5,C6 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX\n        >\n    : set8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >\n{\n    typedef typename set8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : set9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >\n{\n    typedef typename set9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : set10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >\n{\n    typedef typename set10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >\n{\n    typedef typename set11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >\n{\n    typedef typename set12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >\n{\n    typedef typename set13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set14_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        >\n{\n    typedef typename set14_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set15_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        >\n{\n    typedef typename set15_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set16_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15\n        >\n{\n    typedef typename set16_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set17_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16\n        >\n{\n    typedef typename set17_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, LONG_MAX, LONG_MAX\n        >\n    : set18_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17\n        >\n{\n    typedef typename set18_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, LONG_MAX\n        >\n    : set19_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18\n        >\n{\n    typedef typename set19_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n    >\nstruct set_c\n    : set20_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, C19\n        >\n{\n    typedef typename set20_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/shift_left.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/shift_left.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct shift_left_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< shift_left_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< shift_left_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct shift_left_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct shift_left_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct shift_left_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct shift_left_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct shift_left\n\n    : shift_left_impl<\n          typename shift_left_tag<N1>::type\n        , typename shift_left_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_left, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, shift_left)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct shift_left_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N, typename S > struct apply\n\n        : integral_c<\n              typename N::value_type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N)::value\n                  << BOOST_MPL_AUX_VALUE_WKND(S)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/shift_right.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/shift_right.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct shift_right_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< shift_right_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< shift_right_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct shift_right_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct shift_right_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct shift_right_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct shift_right_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct shift_right\n\n    : shift_right_impl<\n          typename shift_right_tag<N1>::type\n        , typename shift_right_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_right, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, shift_right)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct shift_right_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N, typename S > struct apply\n\n        : integral_c<\n              typename N::value_type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N)::value\n                  >> BOOST_MPL_AUX_VALUE_WKND(S)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/template_arity.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/template_arity.hpp\" header\n// -- DO NOT modify by hand!\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/times.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/times.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct times_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< times_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< times_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct times_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct times_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct times_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct times_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct times\n    : times< times< times< times< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , times\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct times< N1,N2,N3,N4,na >\n\n    : times< times< times< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , times\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct times< N1,N2,N3,na,na >\n\n    : times< times< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , times\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct times< N1,N2,na,na,na >\n    : times_impl<\n          typename times_tag<N1>::type\n        , typename times_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , times\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, times)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct times_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  * BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/unpack_args.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2002-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/unpack_args.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate< int size, typename F, typename Args >\nstruct unpack_args_impl;\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 0,F,Args >\n    : apply0<\n          F\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 1,F,Args >\n    : apply1<\n          F\n        , typename at_c< Args,0 >::type\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 2,F,Args >\n    : apply2<\n          F\n        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 3,F,Args >\n    : apply3<\n          F\n        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n        , typename at_c< Args,2 >::type\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 4,F,Args >\n    : apply4<\n          F\n        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n        , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 5,F,Args >\n    : apply5<\n          F\n        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n        , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type\n        , typename at_c< Args,4 >::type\n        >\n{\n};\n\n}\n\ntemplate<\n      typename F\n    >\nstruct unpack_args\n{\n    template< typename Args > struct apply\n\n        : aux::unpack_args_impl< size<Args>::value,F, Args >\n\n    {\n    };\n};\n\nBOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(1, unpack_args)\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/vector.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/vector.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct vector;\n\ntemplate<\n     \n    >\nstruct vector<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector0<  >\n{\n    typedef vector0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct vector<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector1<T0>\n{\n    typedef typename vector1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct vector<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector2< T0,T1 >\n{\n    typedef typename vector2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct vector<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector3< T0,T1,T2 >\n{\n    typedef typename vector3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct vector<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector4< T0,T1,T2,T3 >\n{\n    typedef typename vector4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector5< T0,T1,T2,T3,T4 >\n{\n    typedef typename vector5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename vector6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename vector7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename vector8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : vector15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename vector15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : vector16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename vector16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : vector17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename vector17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : vector18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename vector18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : vector19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename vector19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct vector\n    : vector20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename vector20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/mwcw/vector_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/vector_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX\n    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX\n    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX\n    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX\n    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX\n    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX\n    , long C18 = LONG_MAX, long C19 = LONG_MAX\n    >\nstruct vector_c;\n\ntemplate<\n      typename T\n    >\nstruct vector_c<\n          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector0_c<T>\n{\n    typedef typename vector0_c<T>::type type;\n};\n\ntemplate<\n      typename T, long C0\n    >\nstruct vector_c<\n          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector1_c< T, T(C0) >\n{\n    typedef typename vector1_c< T, T(C0) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1\n    >\nstruct vector_c<\n          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector2_c< T, T(C0), T(C1) >\n{\n    typedef typename vector2_c< T, T(C0), T(C1) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2\n    >\nstruct vector_c<\n          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector3_c< T, T(C0), T(C1), T(C2) >\n{\n    typedef typename vector3_c< T, T(C0), T(C1), T(C2) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector4_c< T, T(C0), T(C1), T(C2), T(C3) >\n{\n    typedef typename vector4_c< T, T(C0), T(C1), T(C2), T(C3) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector5_c< T, T(C0), T(C1), T(C2), T(C3), T(C4) >\n{\n    typedef typename vector5_c< T, T(C0), T(C1), T(C2), T(C3), T(C4) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector6_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5) >\n{\n    typedef typename vector6_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector7_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6) >\n{\n    typedef typename vector7_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX\n        >\n    : vector8_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7) >\n{\n    typedef typename vector8_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : vector9_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8) >\n{\n    typedef typename vector9_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : vector10_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9) >\n{\n    typedef typename vector10_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector11_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10) >\n{\n    typedef typename vector11_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector12_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11) >\n{\n    typedef typename vector12_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector13_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12) >\n{\n    typedef typename vector13_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector14_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13) >\n{\n    typedef typename vector14_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector15_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14) >\n{\n    typedef typename vector15_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector16_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15) >\n{\n    typedef typename vector16_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector17_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16) >\n{\n    typedef typename vector17_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, LONG_MAX, LONG_MAX\n        >\n    : vector18_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17) >\n{\n    typedef typename vector18_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, LONG_MAX\n        >\n    : vector19_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18) >\n{\n    typedef typename vector19_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18) >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n    >\nstruct vector_c\n    : vector20_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19) >\n{\n    typedef typename vector20_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19) >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/advance_backward.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/advance_backward.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< long N > struct advance_backward;\ntemplate<>\nstruct advance_backward<0>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef iter0 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<1>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef iter1 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<2>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef typename prior<iter1>::type iter2;\n        typedef iter2 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<3>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef typename prior<iter1>::type iter2;\n        typedef typename prior<iter2>::type iter3;\n        typedef iter3 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<4>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef typename prior<iter1>::type iter2;\n        typedef typename prior<iter2>::type iter3;\n        typedef typename prior<iter3>::type iter4;\n        typedef iter4 type;\n    };\n};\n\ntemplate< long N >\nstruct advance_backward\n{\n    template< typename Iterator > struct apply\n    {\n        typedef typename apply_wrap1<\n              advance_backward<4>\n            , Iterator\n            >::type chunk_result_;\n\n        typedef typename apply_wrap1<\n              advance_backward<(\n                (N - 4) < 0\n                    ? 0\n                    : N - 4\n                    )>\n            , chunk_result_\n            >::type type;\n    };\n};\n\n}}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/advance_forward.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/advance_forward.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< long N > struct advance_forward;\ntemplate<>\nstruct advance_forward<0>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef iter0 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<1>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef iter1 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<2>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef typename next<iter1>::type iter2;\n        typedef iter2 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<3>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef typename next<iter1>::type iter2;\n        typedef typename next<iter2>::type iter3;\n        typedef iter3 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<4>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef typename next<iter1>::type iter2;\n        typedef typename next<iter2>::type iter3;\n        typedef typename next<iter3>::type iter4;\n        typedef iter4 type;\n    };\n};\n\ntemplate< long N >\nstruct advance_forward\n{\n    template< typename Iterator > struct apply\n    {\n        typedef typename apply_wrap1<\n              advance_forward<4>\n            , Iterator\n            >::type chunk_result_;\n\n        typedef typename apply_wrap1<\n              advance_forward<(\n                (N - 4) < 0\n                    ? 0\n                    : N - 4\n                    )>\n            , chunk_result_\n            >::type type;\n    };\n};\n\n}}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/and.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/and.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< bool C_ > struct and_impl\n{\n    template<\n          typename T1, typename T2, typename T3, typename T4\n        >\n    struct result_\n        : false_\n    {\n    };\n};\n\ntemplate<> struct and_impl<true>\n{\n    template<\n          typename T1, typename T2, typename T3, typename T4\n        >\n    struct result_\n        : and_impl<\n              BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n            >::template result_< T2,T3,T4,true_ >\n    {\n    };\n};\n\ntemplate<>\nstruct and_impl<true>\n    ::result_< true_,true_,true_,true_ >\n        : true_\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    , typename T3 = true_, typename T4 = true_, typename T5 = true_\n    >\nstruct and_\n\n    : aux::and_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        >::template result_< T2,T3,T4,T5 >\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , and_\n        , ( T1, T2, T3, T4, T5)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC2(\n      2\n    , 5\n    , and_\n    )\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/apply.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/apply.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F\n    >\nstruct apply0\n\n    : apply_wrap0<\n          typename lambda<F>::type\n       \n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          1\n        , apply0\n        , (F )\n        )\n};\n\nnamespace aux {\n\ntemplate<>\nstruct apply_chooser<0>\n{\n    template<\n          typename F, typename T1, typename T2, typename T3, typename T4\n        , typename T5\n        >\n    struct result_\n    {\n        typedef apply0<\n              F\n            > type;\n    };\n};\n\n} // namespace aux\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply1\n\n    : apply_wrap1<\n          typename lambda<F>::type\n        , T1\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          2\n        , apply1\n        , (F, T1)\n        )\n};\n\nnamespace aux {\n\ntemplate<>\nstruct apply_chooser<1>\n{\n    template<\n          typename F, typename T1, typename T2, typename T3, typename T4\n        , typename T5\n        >\n    struct result_\n    {\n        typedef apply1<\n              F, T1\n            > type;\n    };\n};\n\n} // namespace aux\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply2\n\n    : apply_wrap2<\n          typename lambda<F>::type\n        , T1, T2\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          3\n        , apply2\n        , (F, T1, T2)\n        )\n};\n\nnamespace aux {\n\ntemplate<>\nstruct apply_chooser<2>\n{\n    template<\n          typename F, typename T1, typename T2, typename T3, typename T4\n        , typename T5\n        >\n    struct result_\n    {\n        typedef apply2<\n              F, T1, T2\n            > type;\n    };\n};\n\n} // namespace aux\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply3\n\n    : apply_wrap3<\n          typename lambda<F>::type\n        , T1, T2, T3\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          4\n        , apply3\n        , (F, T1, T2, T3)\n        )\n};\n\nnamespace aux {\n\ntemplate<>\nstruct apply_chooser<3>\n{\n    template<\n          typename F, typename T1, typename T2, typename T3, typename T4\n        , typename T5\n        >\n    struct result_\n    {\n        typedef apply3<\n              F, T1, T2, T3\n            > type;\n    };\n};\n\n} // namespace aux\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply4\n\n    : apply_wrap4<\n          typename lambda<F>::type\n        , T1, T2, T3, T4\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , apply4\n        , (F, T1, T2, T3, T4)\n        )\n};\n\nnamespace aux {\n\ntemplate<>\nstruct apply_chooser<4>\n{\n    template<\n          typename F, typename T1, typename T2, typename T3, typename T4\n        , typename T5\n        >\n    struct result_\n    {\n        typedef apply4<\n              F, T1, T2, T3, T4\n            > type;\n    };\n};\n\n} // namespace aux\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply5\n\n    : apply_wrap5<\n          typename lambda<F>::type\n        , T1, T2, T3, T4, T5\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          6\n        , apply5\n        , (F, T1, T2, T3, T4, T5)\n        )\n};\n\nnamespace aux {\n\ntemplate<>\nstruct apply_chooser<5>\n{\n    template<\n          typename F, typename T1, typename T2, typename T3, typename T4\n        , typename T5\n        >\n    struct result_\n    {\n        typedef apply5<\n              F, T1, T2, T3, T4, T5\n            > type;\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate< typename T >\nstruct is_apply_arg\n{\n    static bool const value  = true;\n};\n\ntemplate<>\nstruct is_apply_arg<na>\n{\n    static bool const value  = false;\n};\n\ntemplate<\n      typename T1, typename T2, typename T3, typename T4, typename T5\n    >\nstruct apply_count_args\n{\n    static int const value  = is_apply_arg<T1>::value + is_apply_arg<T2>::value + is_apply_arg<T3>::value + is_apply_arg<T4>::value + is_apply_arg<T5>::value;\n\n};\n\n}\n\ntemplate<\n      typename F, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na\n    >\nstruct apply\n    : aux::apply_chooser<\n          aux::apply_count_args< T1,T2,T3,T4,T5 >::value\n        >::template result_< F,T1,T2,T3,T4,T5 >::type\n{\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/apply_fwd.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/apply_fwd.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< BOOST_AUX_NTTP_DECL(int, arity_) > struct apply_chooser;\n}\n\ntemplate<\n      typename F\n    >\nstruct apply0;\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply1;\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply2;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply3;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply4;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply5;\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/apply_wrap.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/apply_wrap.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F\n\n    , typename has_apply_ = typename aux::has_apply<F>::type\n\n    >\nstruct apply_wrap0\n\n    : F::template apply<  >\n{\n};\n\ntemplate<\n      typename F, typename T1\n\n    >\nstruct apply_wrap1\n\n    : F::template apply<T1>\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n\n    >\nstruct apply_wrap2\n\n    : F::template apply< T1,T2 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n\n    >\nstruct apply_wrap3\n\n    : F::template apply< T1,T2,T3 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n\n    >\nstruct apply_wrap4\n\n    : F::template apply< T1,T2,T3,T4 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n\n    >\nstruct apply_wrap5\n\n    : F::template apply< T1,T2,T3,T4,T5 >\n{\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/arg.hpp",
    "content": "\n// Copyright Peter Dimov 2001-2002\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/arg.hpp\" header\n// -- DO NOT modify by hand!\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntemplate<> struct arg< -1 >\n{\n    BOOST_STATIC_CONSTANT(int, value  = -1);\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U1 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<1>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 1);\n    typedef arg<2> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U1 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<2>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 2);\n    typedef arg<3> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U2 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<3>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 3);\n    typedef arg<4> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U3 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<4>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 4);\n    typedef arg<5> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U4 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<5>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 5);\n    typedef arg<6> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U5 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\nBOOST_MPL_AUX_NONTYPE_ARITY_SPEC(1,int, arg)\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/basic_bind.hpp",
    "content": "\n// Copyright Peter Dimov 2001\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/basic_bind.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< bool >\nstruct resolve_arg_impl\n{\n    template<\n          typename T, typename U1, typename U2, typename U3\n        , typename U4, typename U5\n        >\n    struct result_\n    {\n        typedef T type;\n    };\n};\n\ntemplate<>\nstruct resolve_arg_impl<true>\n{\n    template<\n          typename T, typename U1, typename U2, typename U3\n        , typename U4, typename U5\n        >\n    struct result_\n    {\n        typedef typename apply_wrap5<\n              T\n            , U1, U2, U3, U4, U5\n            >::type type;\n    };\n};\n\ntemplate< typename T > struct is_bind_template;\n\ntemplate<\n      typename T, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg\n    : resolve_arg_impl< is_bind_template<T>::value >\n            ::template result_< T,U1,U2,U3,U4,U5 >\n{\n};\n\ntemplate< int arity_ > struct bind_chooser;\n\naux::no_tag is_bind_helper(...);\ntemplate< typename T > aux::no_tag is_bind_helper(protect<T>*);\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\naux::yes_tag is_bind_helper(bind< F,T1,T2,T3,T4,T5 >*);\n\ntemplate< int N >\naux::yes_tag is_bind_helper(arg<N>*);\n\ntemplate< bool is_ref_  = true >\nstruct is_bind_template_impl\n{\n    template< typename T > struct result_\n    {\n        BOOST_STATIC_CONSTANT(bool, value  = false);\n    };\n};\n\ntemplate<>\nstruct is_bind_template_impl<false>\n{\n    template< typename T > struct result_\n    {\n        BOOST_STATIC_CONSTANT(bool, value =\n              sizeof(aux::is_bind_helper(static_cast<T*>(0)))\n                == sizeof(aux::yes_tag)\n            );\n    };\n};\n\ntemplate< typename T > struct is_bind_template\n    : is_bind_template_impl< ::boost::detail::is_reference_impl<T>::value >\n        ::template result_<T>\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename F\n    >\nstruct bind0\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n\n     public:\n        typedef typename apply_wrap0<\n              f_\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F\n    >\naux::yes_tag\nis_bind_helper(bind0<F>*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(1, bind0)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)\n\nnamespace aux {\n\ntemplate<>\nstruct bind_chooser<0>\n{\n    template<\n          typename F, typename T1, typename T2, typename T3, typename T4\n        , typename T5\n        >\n    struct result_\n    {\n        typedef bind0<F> type;\n    };\n};\n\n} // namespace aux\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind1\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n\n     public:\n        typedef typename apply_wrap1<\n              f_\n            , typename t1::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1\n    >\naux::yes_tag\nis_bind_helper(bind1< F,T1 >*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(2, bind1)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)\n\nnamespace aux {\n\ntemplate<>\nstruct bind_chooser<1>\n{\n    template<\n          typename F, typename T1, typename T2, typename T3, typename T4\n        , typename T5\n        >\n    struct result_\n    {\n        typedef bind1< F,T1 > type;\n    };\n};\n\n} // namespace aux\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind2\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n\n     public:\n        typedef typename apply_wrap2<\n              f_\n            , typename t1::type, typename t2::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\naux::yes_tag\nis_bind_helper(bind2< F,T1,T2 >*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(3, bind2)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)\n\nnamespace aux {\n\ntemplate<>\nstruct bind_chooser<2>\n{\n    template<\n          typename F, typename T1, typename T2, typename T3, typename T4\n        , typename T5\n        >\n    struct result_\n    {\n        typedef bind2< F,T1,T2 > type;\n    };\n};\n\n} // namespace aux\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind3\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n\n     public:\n        typedef typename apply_wrap3<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\naux::yes_tag\nis_bind_helper(bind3< F,T1,T2,T3 >*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(4, bind3)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)\n\nnamespace aux {\n\ntemplate<>\nstruct bind_chooser<3>\n{\n    template<\n          typename F, typename T1, typename T2, typename T3, typename T4\n        , typename T5\n        >\n    struct result_\n    {\n        typedef bind3< F,T1,T2,T3 > type;\n    };\n};\n\n} // namespace aux\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind4\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;\n\n     public:\n        typedef typename apply_wrap4<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\naux::yes_tag\nis_bind_helper(bind4< F,T1,T2,T3,T4 >*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(5, bind4)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)\n\nnamespace aux {\n\ntemplate<>\nstruct bind_chooser<4>\n{\n    template<\n          typename F, typename T1, typename T2, typename T3, typename T4\n        , typename T5\n        >\n    struct result_\n    {\n        typedef bind4< F,T1,T2,T3,T4 > type;\n    };\n};\n\n} // namespace aux\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind5\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;\n        typedef aux::resolve_bind_arg< T5,U1,U2,U3,U4,U5 > t5;\n\n     public:\n        typedef typename apply_wrap5<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type, typename t5::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\naux::yes_tag\nis_bind_helper(bind5< F,T1,T2,T3,T4,T5 >*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(6, bind5)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)\n\nnamespace aux {\n\ntemplate<>\nstruct bind_chooser<5>\n{\n    template<\n          typename F, typename T1, typename T2, typename T3, typename T4\n        , typename T5\n        >\n    struct result_\n    {\n        typedef bind5< F,T1,T2,T3,T4,T5 > type;\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate< typename T >\nstruct is_bind_arg\n{\n    BOOST_STATIC_CONSTANT(bool, value  = true);\n};\n\ntemplate<>\nstruct is_bind_arg<na>\n{\n    BOOST_STATIC_CONSTANT(bool, value  = false);\n};\n\ntemplate<\n      typename T1, typename T2, typename T3, typename T4, typename T5\n    >\nstruct bind_count_args\n{\n    BOOST_STATIC_CONSTANT(int, value =\n          is_bind_arg<T1>::value + is_bind_arg<T2>::value \n        + is_bind_arg<T3>::value + is_bind_arg<T4>::value \n        + is_bind_arg<T5>::value\n        );\n\n};\n\n}\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind\n    : aux::bind_chooser<\n          aux::bind_count_args< T1,T2,T3,T4,T5 >::value\n        >::template result_< F,T1,T2,T3,T4,T5 >::type\n{\n};\n\nBOOST_MPL_AUX_ARITY_SPEC(\n      6\n    , bind\n    )\n\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(\n      6\n    , bind\n    )\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/bind.hpp",
    "content": "\n// Copyright Peter Dimov 2001\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bind.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< bool >\nstruct resolve_arg_impl\n{\n    template<\n          typename T, typename U1, typename U2, typename U3\n        , typename U4, typename U5\n        >\n    struct result_\n    {\n        typedef T type;\n    };\n};\n\ntemplate<>\nstruct resolve_arg_impl<true>\n{\n    template<\n          typename T, typename U1, typename U2, typename U3\n        , typename U4, typename U5\n        >\n    struct result_\n    {\n        typedef typename apply_wrap5<\n              T\n            , U1, U2, U3, U4, U5\n            >::type type;\n    };\n};\n\ntemplate< typename T > struct is_bind_template;\n\ntemplate<\n      typename T, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg\n    : resolve_arg_impl< is_bind_template<T>::value >\n            ::template result_< T,U1,U2,U3,U4,U5 >\n{\n};\n\ntemplate< typename T >\nstruct replace_unnamed_arg_impl\n{\n    template< typename Arg > struct result_\n    {\n        typedef Arg next;\n        typedef T type;\n    };\n};\n\ntemplate<>\nstruct replace_unnamed_arg_impl< arg< -1 > >\n{\n    template< typename Arg > struct result_\n    {\n        typedef typename next<Arg>::type next;\n        typedef Arg type;\n    };\n};\n\ntemplate< typename T, typename Arg >\nstruct replace_unnamed_arg\n    : replace_unnamed_arg_impl<T>::template result_<Arg>\n{\n};\n\ntemplate< int arity_ > struct bind_chooser;\n\naux::no_tag is_bind_helper(...);\ntemplate< typename T > aux::no_tag is_bind_helper(protect<T>*);\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\naux::yes_tag is_bind_helper(bind< F,T1,T2,T3,T4,T5 >*);\n\ntemplate< int N >\naux::yes_tag is_bind_helper(arg<N>*);\n\ntemplate< bool is_ref_  = true >\nstruct is_bind_template_impl\n{\n    template< typename T > struct result_\n    {\n        BOOST_STATIC_CONSTANT(bool, value  = false);\n    };\n};\n\ntemplate<>\nstruct is_bind_template_impl<false>\n{\n    template< typename T > struct result_\n    {\n        BOOST_STATIC_CONSTANT(bool, value =\n              sizeof(aux::is_bind_helper(static_cast<T*>(0)))\n                == sizeof(aux::yes_tag)\n            );\n    };\n};\n\ntemplate< typename T > struct is_bind_template\n    : is_bind_template_impl< ::boost::detail::is_reference_impl<T>::value >\n        ::template result_<T>\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename F\n    >\nstruct bind0\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n     public:\n        typedef typename apply_wrap0<\n              f_\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F\n    >\naux::yes_tag\nis_bind_helper(bind0<F>*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(1, bind0)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)\n\nnamespace aux {\n\ntemplate<>\nstruct bind_chooser<0>\n{\n    template<\n          typename F, typename T1, typename T2, typename T3, typename T4\n        , typename T5\n        >\n    struct result_\n    {\n        typedef bind0<F> type;\n    };\n};\n\n} // namespace aux\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind1\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n     public:\n        typedef typename apply_wrap1<\n              f_\n            , typename t1::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1\n    >\naux::yes_tag\nis_bind_helper(bind1< F,T1 >*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(2, bind1)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)\n\nnamespace aux {\n\ntemplate<>\nstruct bind_chooser<1>\n{\n    template<\n          typename F, typename T1, typename T2, typename T3, typename T4\n        , typename T5\n        >\n    struct result_\n    {\n        typedef bind1< F,T1 > type;\n    };\n};\n\n} // namespace aux\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind2\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n     public:\n        typedef typename apply_wrap2<\n              f_\n            , typename t1::type, typename t2::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\naux::yes_tag\nis_bind_helper(bind2< F,T1,T2 >*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(3, bind2)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)\n\nnamespace aux {\n\ntemplate<>\nstruct bind_chooser<2>\n{\n    template<\n          typename F, typename T1, typename T2, typename T3, typename T4\n        , typename T5\n        >\n    struct result_\n    {\n        typedef bind2< F,T1,T2 > type;\n    };\n};\n\n} // namespace aux\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind3\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n     public:\n        typedef typename apply_wrap3<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\naux::yes_tag\nis_bind_helper(bind3< F,T1,T2,T3 >*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(4, bind3)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)\n\nnamespace aux {\n\ntemplate<>\nstruct bind_chooser<3>\n{\n    template<\n          typename F, typename T1, typename T2, typename T3, typename T4\n        , typename T5\n        >\n    struct result_\n    {\n        typedef bind3< F,T1,T2,T3 > type;\n    };\n};\n\n} // namespace aux\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind4\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n        typedef aux::replace_unnamed_arg< T4,n4 > r4;\n        typedef typename r4::type a4;\n        typedef typename r4::next n5;\n        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;\n        ///\n     public:\n        typedef typename apply_wrap4<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\naux::yes_tag\nis_bind_helper(bind4< F,T1,T2,T3,T4 >*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(5, bind4)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)\n\nnamespace aux {\n\ntemplate<>\nstruct bind_chooser<4>\n{\n    template<\n          typename F, typename T1, typename T2, typename T3, typename T4\n        , typename T5\n        >\n    struct result_\n    {\n        typedef bind4< F,T1,T2,T3,T4 > type;\n    };\n};\n\n} // namespace aux\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind5\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n        typedef aux::replace_unnamed_arg< T4,n4 > r4;\n        typedef typename r4::type a4;\n        typedef typename r4::next n5;\n        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;\n        ///\n        typedef aux::replace_unnamed_arg< T5,n5 > r5;\n        typedef typename r5::type a5;\n        typedef typename r5::next n6;\n        typedef aux::resolve_bind_arg< a5,U1,U2,U3,U4,U5 > t5;\n        ///\n     public:\n        typedef typename apply_wrap5<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type, typename t5::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\naux::yes_tag\nis_bind_helper(bind5< F,T1,T2,T3,T4,T5 >*);\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(6, bind5)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)\n\nnamespace aux {\n\ntemplate<>\nstruct bind_chooser<5>\n{\n    template<\n          typename F, typename T1, typename T2, typename T3, typename T4\n        , typename T5\n        >\n    struct result_\n    {\n        typedef bind5< F,T1,T2,T3,T4,T5 > type;\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate< typename T >\nstruct is_bind_arg\n{\n    BOOST_STATIC_CONSTANT(bool, value  = true);\n};\n\ntemplate<>\nstruct is_bind_arg<na>\n{\n    BOOST_STATIC_CONSTANT(bool, value  = false);\n};\n\ntemplate<\n      typename T1, typename T2, typename T3, typename T4, typename T5\n    >\nstruct bind_count_args\n{\n    BOOST_STATIC_CONSTANT(int, value =\n          is_bind_arg<T1>::value + is_bind_arg<T2>::value \n        + is_bind_arg<T3>::value + is_bind_arg<T4>::value \n        + is_bind_arg<T5>::value\n        );\n\n};\n\n}\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind\n    : aux::bind_chooser<\n          aux::bind_count_args< T1,T2,T3,T4,T5 >::value\n        >::template result_< F,T1,T2,T3,T4,T5 >::type\n{\n};\n\nBOOST_MPL_AUX_ARITY_SPEC(\n      6\n    , bind\n    )\n\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(\n      6\n    , bind\n    )\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/bind_fwd.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bind_fwd.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na\n    >\nstruct bind;\n\ntemplate<\n      typename F\n    >\nstruct bind0;\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind1;\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind2;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind3;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind4;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind5;\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/bitand.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bitand.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct bitand_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< bitand_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< bitand_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct bitand_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct bitand_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct bitand_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct bitand_tag\n{\n    typedef typename T::tag type;\n};\n\n/// forward declaration\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct bitand_2;\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct bitand_\n\n    : if_<\n\n          is_na<N3>\n        , bitand_2< N1,N2 >\n        , bitand_<\n              bitand_2< N1,N2 >\n            , N3, N4, N5\n            >\n        >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , bitand_\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1\n    , typename N2\n    >\nstruct bitand_2\n    : bitand_impl<\n          typename bitand_tag<N1>::type\n        , typename bitand_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, bitand_2, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, bitand_)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct bitand_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  & BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/bitor.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bitor.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct bitor_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< bitor_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< bitor_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct bitor_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct bitor_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct bitor_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct bitor_tag\n{\n    typedef typename T::tag type;\n};\n\n/// forward declaration\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct bitor_2;\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct bitor_\n\n    : if_<\n\n          is_na<N3>\n        , bitor_2< N1,N2 >\n        , bitor_<\n              bitor_2< N1,N2 >\n            , N3, N4, N5\n            >\n        >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , bitor_\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1\n    , typename N2\n    >\nstruct bitor_2\n    : bitor_impl<\n          typename bitor_tag<N1>::type\n        , typename bitor_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, bitor_2, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, bitor_)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct bitor_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  | BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/bitxor.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bitxor.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct bitxor_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< bitxor_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< bitxor_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct bitxor_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct bitxor_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct bitxor_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct bitxor_tag\n{\n    typedef typename T::tag type;\n};\n\n/// forward declaration\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct bitxor_2;\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct bitxor_\n\n    : if_<\n\n          is_na<N3>\n        , bitxor_2< N1,N2 >\n        , bitxor_<\n              bitxor_2< N1,N2 >\n            , N3, N4, N5\n            >\n        >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , bitxor_\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1\n    , typename N2\n    >\nstruct bitxor_2\n    : bitxor_impl<\n          typename bitxor_tag<N1>::type\n        , typename bitxor_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, bitxor_2, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, bitxor_)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct bitxor_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  ^ BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/deque.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/deque.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< int N >\nstruct deque_chooser;\n\n}\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<0>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef vector0<\n             \n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<1>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector1<\n              T0\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<2>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector2<\n              T0, T1\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<3>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector3<\n              T0, T1, T2\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<4>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector4<\n              T0, T1, T2, T3\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<5>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector5<\n              T0, T1, T2, T3, T4\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<6>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector6<\n              T0, T1, T2, T3, T4, T5\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<7>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector7<\n              T0, T1, T2, T3, T4, T5, T6\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<8>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector8<\n              T0, T1, T2, T3, T4, T5, T6, T7\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<9>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector9<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<10>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector10<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<11>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector11<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<12>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector12<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<13>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector13<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<14>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector14<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<15>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector15<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<16>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector16<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<17>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector17<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<18>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector18<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<19>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector19<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct deque_chooser<20>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector20<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate< typename T >\nstruct is_deque_arg\n{\n    BOOST_STATIC_CONSTANT(bool, value  = true);\n};\n\ntemplate<>\nstruct is_deque_arg<na>\n{\n    BOOST_STATIC_CONSTANT(bool, value  = false);\n};\n\ntemplate<\n      typename T1, typename T2, typename T3, typename T4, typename T5\n    , typename T6, typename T7, typename T8, typename T9, typename T10\n    , typename T11, typename T12, typename T13, typename T14, typename T15\n    , typename T16, typename T17, typename T18, typename T19, typename T20\n    >\nstruct deque_count_args\n{\n    BOOST_STATIC_CONSTANT(int, value =\n          is_deque_arg<T1>::value + is_deque_arg<T2>::value \n        + is_deque_arg<T3>::value + is_deque_arg<T4>::value \n        + is_deque_arg<T5>::value + is_deque_arg<T6>::value \n        + is_deque_arg<T7>::value + is_deque_arg<T8>::value \n        + is_deque_arg<T9>::value + is_deque_arg<T10>::value \n        + is_deque_arg<T11>::value + is_deque_arg<T12>::value \n        + is_deque_arg<T13>::value + is_deque_arg<T14>::value \n        + is_deque_arg<T15>::value + is_deque_arg<T16>::value \n        + is_deque_arg<T17>::value + is_deque_arg<T18>::value \n        + is_deque_arg<T19>::value + is_deque_arg<T20>::value\n        );\n\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct deque_impl\n{\n    typedef aux::deque_count_args<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        > arg_num_;\n\n    typedef typename aux::deque_chooser< arg_num_::value >\n        ::template result_< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct deque\n    : aux::deque_impl<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        >::type\n{\n    typedef typename aux::deque_impl<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/divides.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/divides.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct divides_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< divides_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< divides_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct divides_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct divides_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct divides_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct divides_tag\n{\n    typedef typename T::tag type;\n};\n\n/// forward declaration\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct divides2;\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct divides\n\n    : if_<\n\n          is_na<N3>\n        , divides2< N1,N2 >\n        , divides<\n              divides2< N1,N2 >\n            , N3, N4, N5\n            >\n        >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , divides\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1\n    , typename N2\n    >\nstruct divides2\n    : divides_impl<\n          typename divides_tag<N1>::type\n        , typename divides_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, divides2, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, divides)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct divides_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  / BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/equal_to.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/equal_to.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct equal_to_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct equal_to_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct equal_to_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct equal_to_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct equal_to_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct equal_to\n\n    : equal_to_impl<\n          typename equal_to_tag<N1>::type\n        , typename equal_to_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, equal_to, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, equal_to)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct equal_to_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value  == BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl;\n\ntemplate< int N >\nstruct fold_chunk;\n\ntemplate<> struct fold_chunk<0>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State state0;\n        typedef state0 state;\n        typedef iter0 iterator;\n    };\n};\n\ntemplate<> struct fold_chunk<1>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State state0;\n        typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        \n\n        typedef state1 state;\n        typedef iter1 iterator;\n    };\n};\n\ntemplate<> struct fold_chunk<2>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State state0;\n        typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        \n\n        typedef state2 state;\n        typedef iter2 iterator;\n    };\n};\n\ntemplate<> struct fold_chunk<3>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State state0;\n        typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        \n\n        typedef state3 state;\n        typedef iter3 iterator;\n    };\n};\n\ntemplate<> struct fold_chunk<4>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State state0;\n        typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        typedef typename apply2< ForwardOp, state3, typename deref<iter3>::type >::type state4;\n        typedef typename mpl::next<iter3>::type iter4;\n        \n\n        typedef state4 state;\n        typedef iter4 iterator;\n    };\n};\n\ntemplate< int N >\nstruct fold_chunk\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef fold_impl<\n              4\n            , First\n            , Last\n            , State\n            , ForwardOp\n            > chunk_;\n\n        typedef fold_impl<\n              ( (N - 4) < 0 ? 0 : N - 4 )\n            , typename chunk_::iterator\n            , Last\n            , typename chunk_::state\n            , ForwardOp\n            > res_;\n\n        typedef typename res_::state state;\n        typedef typename res_::iterator iterator;\n    };\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_step;\n\ntemplate<\n      typename Last\n    , typename State\n    >\nstruct fold_null_step\n{\n    typedef Last iterator;\n    typedef State state;\n};\n\ntemplate<>\nstruct fold_chunk< -1 >\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef typename if_<\n              typename is_same< First,Last >::type\n            , fold_null_step< Last,State >\n            , fold_step< First,Last,State,ForwardOp >\n            >::type res_;\n\n        typedef typename res_::state state;\n        typedef typename res_::iterator iterator;\n    };\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_step\n{\n    typedef fold_chunk< -1 >::template result_<\n          typename mpl::next<First>::type\n        , Last\n        , typename apply2<ForwardOp,State, typename deref<First>::type>::type\n        , ForwardOp\n        > chunk_;\n\n    typedef typename chunk_::state state;\n    typedef typename chunk_::iterator iterator;\n};\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl\n    : fold_chunk<N>\n        ::template result_< First,Last,State,ForwardOp >\n{\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/full_lambda.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/full_lambda.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false\n    , bool C5 = false\n    >\nstruct lambda_or\n    : true_\n{\n};\n\ntemplate<>\nstruct lambda_or< false,false,false,false,false >\n    : false_\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename T\n    , typename Tag\n   \n    >\nstruct lambda\n{\n    typedef false_ is_le;\n    typedef T result_;\n    typedef T type;\n};\n\ntemplate<\n      typename T\n    >\nstruct is_lambda_expression\n    : lambda<T>::is_le\n{\n};\n\ntemplate< int N, typename Tag >\nstruct lambda< arg<N>, Tag >\n{\n    typedef true_ is_le;\n    typedef mpl::arg<N> result_; // qualified for the sake of MIPSpro 7.41\n    typedef mpl::protect<result_> type;\n};\n\ntemplate<\n      typename F\n    , typename Tag\n    >\nstruct lambda<\n          bind0<F>\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind0<\n          F\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1 > class F\n    , typename L1\n    >\nstruct le_result1\n{\n    typedef F<\n          typename L1::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1 > class F\n    , typename L1\n    >\nstruct le_result1< true_,Tag,F,L1 >\n{\n    typedef bind1<\n          quote1< F,Tag >\n        , typename L1::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1 > class F\n    , typename T1\n    , typename Tag\n    >\nstruct lambda<\n          F<T1>\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef typename l1::is_le is_le1;\n    typedef typename aux::lambda_or<\n          is_le1::value\n        >::type is_le;\n\n    typedef aux::le_result1<\n          is_le, Tag, F, l1\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1\n    , typename Tag\n    >\nstruct lambda<\n          bind1< F,T1 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind1<\n          F\n        , T1\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2 > class F\n    , typename L1, typename L2\n    >\nstruct le_result2\n{\n    typedef F<\n          typename L1::type, typename L2::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2 > class F\n    , typename L1, typename L2\n    >\nstruct le_result2< true_,Tag,F,L1,L2 >\n{\n    typedef bind2<\n          quote2< F,Tag >\n        , typename L1::result_, typename L2::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1, typename P2 > class F\n    , typename T1, typename T2\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2 >\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value\n        >::type is_le;\n\n    typedef aux::le_result2<\n          is_le, Tag, F, l1, l2\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    , typename Tag\n    >\nstruct lambda<\n          bind2< F,T1,T2 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind2<\n          F\n        , T1, T2\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2, typename P3 > class F\n    , typename L1, typename L2, typename L3\n    >\nstruct le_result3\n{\n    typedef F<\n          typename L1::type, typename L2::type, typename L3::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2, typename P3 > class F\n    , typename L1, typename L2, typename L3\n    >\nstruct le_result3< true_,Tag,F,L1,L2,L3 >\n{\n    typedef bind3<\n          quote3< F,Tag >\n        , typename L1::result_, typename L2::result_, typename L3::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1, typename P2, typename P3 > class F\n    , typename T1, typename T2, typename T3\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2,T3 >\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    typedef lambda< T3,Tag > l3;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    typedef typename l3::is_le is_le3;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value, is_le3::value\n        >::type is_le;\n\n    typedef aux::le_result3<\n          is_le, Tag, F, l1, l2, l3\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    , typename Tag\n    >\nstruct lambda<\n          bind3< F,T1,T2,T3 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind3<\n          F\n        , T1, T2, T3\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename L1, typename L2, typename L3, typename L4\n    >\nstruct le_result4\n{\n    typedef F<\n          typename L1::type, typename L2::type, typename L3::type\n        , typename L4::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename L1, typename L2, typename L3, typename L4\n    >\nstruct le_result4< true_,Tag,F,L1,L2,L3,L4 >\n{\n    typedef bind4<\n          quote4< F,Tag >\n        , typename L1::result_, typename L2::result_, typename L3::result_\n        , typename L4::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename T1, typename T2, typename T3, typename T4\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2,T3,T4 >\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    typedef lambda< T3,Tag > l3;\n    typedef lambda< T4,Tag > l4;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    typedef typename l3::is_le is_le3;\n    typedef typename l4::is_le is_le4;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value, is_le3::value, is_le4::value\n        >::type is_le;\n\n    typedef aux::le_result4<\n          is_le, Tag, F, l1, l2, l3, l4\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename Tag\n    >\nstruct lambda<\n          bind4< F,T1,T2,T3,T4 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind4<\n          F\n        , T1, T2, T3, T4\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F\n    , typename L1, typename L2, typename L3, typename L4, typename L5\n    >\nstruct le_result5\n{\n    typedef F<\n          typename L1::type, typename L2::type, typename L3::type\n        , typename L4::type, typename L5::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F\n    , typename L1, typename L2, typename L3, typename L4, typename L5\n    >\nstruct le_result5< true_,Tag,F,L1,L2,L3,L4,L5 >\n{\n    typedef bind5<\n          quote5< F,Tag >\n        , typename L1::result_, typename L2::result_, typename L3::result_\n        , typename L4::result_, typename L5::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template<\n          typename P1, typename P2, typename P3, typename P4\n        , typename P5\n        >\n      class F\n    , typename T1, typename T2, typename T3, typename T4, typename T5\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2,T3,T4,T5 >\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    typedef lambda< T3,Tag > l3;\n    typedef lambda< T4,Tag > l4;\n    typedef lambda< T5,Tag > l5;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    typedef typename l3::is_le is_le3;\n    typedef typename l4::is_le is_le4;\n    typedef typename l5::is_le is_le5;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value, is_le3::value, is_le4::value\n        , is_le5::value\n        >::type is_le;\n\n    typedef aux::le_result5<\n          is_le, Tag, F, l1, l2, l3, l4, l5\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    , typename Tag\n    >\nstruct lambda<\n          bind5< F,T1,T2,T3,T4,T5 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind5<\n          F\n        , T1, T2, T3, T4, T5\n        > result_;\n\n    typedef result_ type;\n};\n\n/// special case for 'protect'\ntemplate< typename T, typename Tag >\nstruct lambda< mpl::protect<T>, Tag >\n{\n    typedef false_ is_le;\n    typedef mpl::protect<T> result_;\n    typedef result_ type;\n};\n\n/// specializations for the main 'bind' form\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    , typename Tag\n    >\nstruct lambda<\n          bind< F,T1,T2,T3,T4,T5 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind< F,T1,T2,T3,T4,T5 > result_;\n    typedef result_ type;\n};\n\n/// workaround for MWCW 8.3+/EDG < 303, leads to ambiguity on Digital Mars\n\ntemplate<\n      typename F, typename Tag1, typename Tag2\n    >\nstruct lambda<\n          lambda< F,Tag1 >\n        , Tag2\n        >\n{\n    typedef lambda< F,Tag2 > l1;\n    typedef lambda< Tag1,Tag2 > l2;\n    typedef typename l1::is_le is_le;\n    typedef aux::le_result2<is_le, Tag2, mpl::lambda, l1, l2> le_result_;\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\nBOOST_MPL_AUX_NA_SPEC(2, lambda)\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/greater.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/greater.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct greater_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< greater_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< greater_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct greater_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct greater_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct greater_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct greater_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct greater\n\n    : greater_impl<\n          typename greater_tag<N1>::type\n        , typename greater_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, greater)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct greater_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value > BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/greater_equal.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/greater_equal.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct greater_equal_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< greater_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< greater_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct greater_equal_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct greater_equal_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct greater_equal_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct greater_equal_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct greater_equal\n\n    : greater_equal_impl<\n          typename greater_equal_tag<N1>::type\n        , typename greater_equal_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater_equal, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, greater_equal)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct greater_equal_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value >= BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/inherit.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/inherit.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate< bool C1, bool C2 >\nstruct inherit2_impl\n{\n    template< typename Derived, typename T1, typename T2 > struct result_\n        : T1, T2\n    {\n        typedef Derived type_;\n    };\n};\n\ntemplate<>\nstruct inherit2_impl< false,true >\n{\n    template< typename Derived, typename T1, typename T2 > struct result_\n        : T1\n    {\n        typedef T1 type_;\n    };\n};\n\ntemplate<>\nstruct inherit2_impl< true,false >\n{\n    template< typename Derived, typename T1, typename T2 > struct result_\n        : T2\n    {\n        typedef T2 type_;\n    };\n};\n\ntemplate<>\nstruct inherit2_impl< true,true >\n{\n    template< typename Derived, typename T1, typename T2 > struct result_\n    {\n        typedef T1 type_;\n    };\n};\n\n} // namespace aux\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    >\nstruct inherit2\n    : aux::inherit2_impl<\n          is_empty_base<T1>::value\n        , is_empty_base<T2>::value\n        >::template result_< inherit2< T1,T2 >,T1, T2 >\n{\n    typedef typename inherit2::type_ type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, inherit2, (T1, T2))\n};\n\nBOOST_MPL_AUX_NA_SPEC(2, inherit2)\n\ntemplate<\n      typename T1 = na, typename T2 = na, typename T3 = na\n    >\nstruct inherit3\n    : inherit2<\n          typename inherit2<\n              T1, T2\n            >::type\n        , T3\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          3\n        , inherit3\n        , ( T1, T2, T3)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC(3, inherit3)\n\ntemplate<\n      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na\n    >\nstruct inherit4\n    : inherit2<\n          typename inherit3<\n              T1, T2, T3\n            >::type\n        , T4\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          4\n        , inherit4\n        , ( T1, T2, T3, T4)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC(4, inherit4)\n\ntemplate<\n      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na\n    , typename T5 = na\n    >\nstruct inherit5\n    : inherit2<\n          typename inherit4<\n              T1, T2, T3, T4\n            >::type\n        , T5\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , inherit5\n        , ( T1, T2, T3, T4, T5)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC(5, inherit5)\n\n/// primary template\n\ntemplate<\n      typename T1 = empty_base, typename T2 = empty_base\n    , typename T3 = empty_base, typename T4 = empty_base\n    , typename T5 = empty_base\n    >\nstruct inherit\n    : inherit5< T1,T2,T3,T4,T5 >\n{\n};\n\ntemplate<>\nstruct inherit< na,na,na,na,na >\n{\n    template<\n\n          typename T1 = empty_base, typename T2 = empty_base\n        , typename T3 = empty_base, typename T4 = empty_base\n        , typename T5 = empty_base\n\n        >\n    struct apply\n        : inherit< T1,T2,T3,T4,T5 >\n    {\n    };\n};\n\nBOOST_MPL_AUX_NA_SPEC_LAMBDA(5, inherit)\nBOOST_MPL_AUX_NA_SPEC_ARITY(5, inherit)\nBOOST_MPL_AUX_NA_SPEC_TEMPLATE_ARITY(5, 5, inherit)\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/iter_fold_if_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n// Copyright David Abrahams 2001-2002\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/iter_fold_if_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< typename Iterator, typename State >\nstruct iter_fold_if_null_step\n{\n    typedef State state;\n    typedef Iterator iterator;\n};\n\ntemplate< bool >\nstruct iter_fold_if_step_impl\n{\n    template<\n          typename Iterator\n        , typename State\n        , typename StateOp\n        , typename IteratorOp\n        >\n    struct result_\n    {\n        typedef typename apply2< StateOp,State,Iterator >::type state;\n        typedef typename IteratorOp::type iterator;\n    };\n};\n\ntemplate<>\nstruct iter_fold_if_step_impl<false>\n{\n    template<\n          typename Iterator\n        , typename State\n        , typename StateOp\n        , typename IteratorOp\n        >\n    struct result_\n    {\n        typedef State state;\n        typedef Iterator iterator;\n    };\n};\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename ForwardOp\n    , typename Predicate\n    >\nstruct iter_fold_if_forward_step\n{\n    typedef typename apply2< Predicate,State,Iterator >::type not_last;\n    typedef typename iter_fold_if_step_impl<\n          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value\n        >::template result_< Iterator,State,ForwardOp, mpl::next<Iterator> > impl_;\n\n    typedef typename impl_::state state;\n    typedef typename impl_::iterator iterator;\n};\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename BackwardOp\n    , typename Predicate\n    >\nstruct iter_fold_if_backward_step\n{\n    typedef typename apply2< Predicate,State,Iterator >::type not_last;\n    typedef typename iter_fold_if_step_impl<\n          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value\n        >::template result_< Iterator,State,BackwardOp, identity<Iterator> > impl_;\n\n    typedef typename impl_::state state;\n    typedef typename impl_::iterator iterator;\n};\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename ForwardOp\n    , typename ForwardPredicate\n    , typename BackwardOp\n    , typename BackwardPredicate\n    >\nstruct iter_fold_if_impl\n{\n private:\n    typedef iter_fold_if_null_step< Iterator,State > forward_step0;\n    typedef iter_fold_if_forward_step< typename forward_step0::iterator, typename forward_step0::state, ForwardOp, ForwardPredicate > forward_step1;\n    typedef iter_fold_if_forward_step< typename forward_step1::iterator, typename forward_step1::state, ForwardOp, ForwardPredicate > forward_step2;\n    typedef iter_fold_if_forward_step< typename forward_step2::iterator, typename forward_step2::state, ForwardOp, ForwardPredicate > forward_step3;\n    typedef iter_fold_if_forward_step< typename forward_step3::iterator, typename forward_step3::state, ForwardOp, ForwardPredicate > forward_step4;\n    \n\n    typedef typename if_<\n          typename forward_step4::not_last\n        , iter_fold_if_impl<\n              typename forward_step4::iterator\n            , typename forward_step4::state\n            , ForwardOp\n            , ForwardPredicate\n            , BackwardOp\n            , BackwardPredicate\n            >\n        , iter_fold_if_null_step<\n              typename forward_step4::iterator\n            , typename forward_step4::state\n            >\n        >::type backward_step4;\n\n    typedef iter_fold_if_backward_step< typename forward_step3::iterator, typename backward_step4::state, BackwardOp, BackwardPredicate > backward_step3;\n    typedef iter_fold_if_backward_step< typename forward_step2::iterator, typename backward_step3::state, BackwardOp, BackwardPredicate > backward_step2;\n    typedef iter_fold_if_backward_step< typename forward_step1::iterator, typename backward_step2::state, BackwardOp, BackwardPredicate > backward_step1;\n    typedef iter_fold_if_backward_step< typename forward_step0::iterator, typename backward_step1::state, BackwardOp, BackwardPredicate > backward_step0;\n    \n\n public:\n    typedef typename backward_step0::state state;\n    typedef typename backward_step4::iterator iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/iter_fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/iter_fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl;\n\ntemplate< int N >\nstruct iter_fold_chunk;\n\ntemplate<> struct iter_fold_chunk<0>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State state0;\n        typedef state0 state;\n        typedef iter0 iterator;\n    };\n};\n\ntemplate<> struct iter_fold_chunk<1>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State state0;\n        typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        \n\n        typedef state1 state;\n        typedef iter1 iterator;\n    };\n};\n\ntemplate<> struct iter_fold_chunk<2>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State state0;\n        typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp,state1,iter1 >::type state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        \n\n        typedef state2 state;\n        typedef iter2 iterator;\n    };\n};\n\ntemplate<> struct iter_fold_chunk<3>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State state0;\n        typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp,state1,iter1 >::type state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp,state2,iter2 >::type state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        \n\n        typedef state3 state;\n        typedef iter3 iterator;\n    };\n};\n\ntemplate<> struct iter_fold_chunk<4>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State state0;\n        typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp,state1,iter1 >::type state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp,state2,iter2 >::type state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        typedef typename apply2< ForwardOp,state3,iter3 >::type state4;\n        typedef typename mpl::next<iter3>::type iter4;\n        \n\n        typedef state4 state;\n        typedef iter4 iterator;\n    };\n};\n\ntemplate< int N >\nstruct iter_fold_chunk\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef iter_fold_impl<\n              4\n            , First\n            , Last\n            , State\n            , ForwardOp\n            > chunk_;\n\n        typedef iter_fold_impl<\n              ( (N - 4) < 0 ? 0 : N - 4 )\n            , typename chunk_::iterator\n            , Last\n            , typename chunk_::state\n            , ForwardOp\n            > res_;\n\n        typedef typename res_::state state;\n        typedef typename res_::iterator iterator;\n    };\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_step;\n\ntemplate<\n      typename Last\n    , typename State\n    >\nstruct iter_fold_null_step\n{\n    typedef Last iterator;\n    typedef State state;\n};\n\ntemplate<>\nstruct iter_fold_chunk< -1 >\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef typename if_<\n              typename is_same< First,Last >::type\n            , iter_fold_null_step< Last,State >\n            , iter_fold_step< First,Last,State,ForwardOp >\n            >::type res_;\n\n        typedef typename res_::state state;\n        typedef typename res_::iterator iterator;\n    };\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_step\n{\n    typedef iter_fold_chunk< -1 >::template result_<\n          typename mpl::next<First>::type\n        , Last\n        , typename apply2< ForwardOp,State,First >::type\n        , ForwardOp\n        > chunk_;\n\n    typedef typename chunk_::state state;\n    typedef typename chunk_::iterator iterator;\n};\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl\n    : iter_fold_chunk<N>\n        ::template result_< First,Last,State,ForwardOp >\n{\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/lambda_no_ctps.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/lambda_no_ctps.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false\n    , bool C5 = false\n    >\nstruct lambda_or\n    : true_\n{\n};\n\ntemplate<>\nstruct lambda_or< false,false,false,false,false >\n    : false_\n{\n};\n\ntemplate< typename Arity > struct lambda_impl\n{\n    template< typename T, typename Tag, typename Protect > struct result_\n    {\n        typedef T type;\n        typedef is_placeholder<T> is_le;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<1> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef typename l1::is_le is_le1;\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value\n            > is_le;\n\n        typedef bind1<\n              typename F::rebind\n            , typename l1::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<2> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value\n            > is_le;\n\n        typedef bind2<\n              typename F::rebind\n            , typename l1::type, typename l2::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<3> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        typedef lambda< typename F::arg3, Tag, false_ > l3;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        typedef typename l3::is_le is_le3;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value\n            > is_le;\n\n        typedef bind3<\n              typename F::rebind\n            , typename l1::type, typename l2::type, typename l3::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<4> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        typedef lambda< typename F::arg3, Tag, false_ > l3;\n        typedef lambda< typename F::arg4, Tag, false_ > l4;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        typedef typename l3::is_le is_le3;\n        typedef typename l4::is_le is_le4;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value\n            > is_le;\n\n        typedef bind4<\n              typename F::rebind\n            , typename l1::type, typename l2::type, typename l3::type\n            , typename l4::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<5> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        typedef lambda< typename F::arg3, Tag, false_ > l3;\n        typedef lambda< typename F::arg4, Tag, false_ > l4;\n        typedef lambda< typename F::arg5, Tag, false_ > l5;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        typedef typename l3::is_le is_le3;\n        typedef typename l4::is_le is_le4;\n        typedef typename l5::is_le is_le5;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le5)::value\n            > is_le;\n\n        typedef bind5<\n              typename F::rebind\n            , typename l1::type, typename l2::type, typename l3::type\n            , typename l4::type, typename l5::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\n} // namespace aux\n\ntemplate<\n      typename T\n    , typename Tag\n    , typename Protect\n    >\nstruct lambda\n{\n    /// Metafunction forwarding confuses MSVC 6.x\n    typedef typename aux::template_arity<T>::type arity_;\n    typedef typename aux::lambda_impl<arity_>\n        ::template result_< T,Tag,Protect > l_;\n\n    typedef typename l_::type type;\n    typedef typename l_::is_le is_le;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(3, lambda, (T, Tag, Protect))\n};\n\nBOOST_MPL_AUX_NA_SPEC2(1, 3, lambda)\n\ntemplate<\n      typename T\n    >\nstruct is_lambda_expression\n    : lambda<T>::is_le\n{\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/less.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/less.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct less_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< less_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< less_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct less_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct less_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct less_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct less_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct less\n\n    : less_impl<\n          typename less_tag<N1>::type\n        , typename less_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, less)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct less_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N2)::value > BOOST_MPL_AUX_VALUE_WKND(N1)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/less_equal.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/less_equal.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct less_equal_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< less_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< less_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct less_equal_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct less_equal_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct less_equal_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct less_equal_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct less_equal\n\n    : less_equal_impl<\n          typename less_equal_tag<N1>::type\n        , typename less_equal_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less_equal, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, less_equal)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct less_equal_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value <= BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/list.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/list.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< int N >\nstruct list_chooser;\n\n}\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<0>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef list0<\n             \n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<1>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list1<\n              T0\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<2>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list2<\n              T0, T1\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<3>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list3<\n              T0, T1, T2\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<4>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list4<\n              T0, T1, T2, T3\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<5>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list5<\n              T0, T1, T2, T3, T4\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<6>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list6<\n              T0, T1, T2, T3, T4, T5\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<7>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list7<\n              T0, T1, T2, T3, T4, T5, T6\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<8>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list8<\n              T0, T1, T2, T3, T4, T5, T6, T7\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<9>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list9<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<10>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list10<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<11>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list11<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<12>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list12<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<13>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list13<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<14>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list14<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<15>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list15<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<16>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list16<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<17>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list17<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<18>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list18<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<19>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list19<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_chooser<20>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename list20<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate< typename T >\nstruct is_list_arg\n{\n    BOOST_STATIC_CONSTANT(bool, value  = true);\n};\n\ntemplate<>\nstruct is_list_arg<na>\n{\n    BOOST_STATIC_CONSTANT(bool, value  = false);\n};\n\ntemplate<\n      typename T1, typename T2, typename T3, typename T4, typename T5\n    , typename T6, typename T7, typename T8, typename T9, typename T10\n    , typename T11, typename T12, typename T13, typename T14, typename T15\n    , typename T16, typename T17, typename T18, typename T19, typename T20\n    >\nstruct list_count_args\n{\n    BOOST_STATIC_CONSTANT(int, value =\n          is_list_arg<T1>::value + is_list_arg<T2>::value \n        + is_list_arg<T3>::value + is_list_arg<T4>::value \n        + is_list_arg<T5>::value + is_list_arg<T6>::value \n        + is_list_arg<T7>::value + is_list_arg<T8>::value \n        + is_list_arg<T9>::value + is_list_arg<T10>::value \n        + is_list_arg<T11>::value + is_list_arg<T12>::value \n        + is_list_arg<T13>::value + is_list_arg<T14>::value \n        + is_list_arg<T15>::value + is_list_arg<T16>::value \n        + is_list_arg<T17>::value + is_list_arg<T18>::value \n        + is_list_arg<T19>::value + is_list_arg<T20>::value\n        );\n\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct list_impl\n{\n    typedef aux::list_count_args<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        > arg_num_;\n\n    typedef typename aux::list_chooser< arg_num_::value >\n        ::template result_< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct list\n    : aux::list_impl<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        >::type\n{\n    typedef typename aux::list_impl<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/list_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/list_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< int N >\nstruct list_c_chooser;\n\n}\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<0>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list0_c<\n              T\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<1>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list1_c<\n              T, C0\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<2>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list2_c<\n              T, C0, C1\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<3>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list3_c<\n              T, C0, C1, C2\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<4>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list4_c<\n              T, C0, C1, C2, C3\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<5>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list5_c<\n              T, C0, C1, C2, C3, C4\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<6>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list6_c<\n              T, C0, C1, C2, C3, C4, C5\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<7>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list7_c<\n              T, C0, C1, C2, C3, C4, C5, C6\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<8>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list8_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<9>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list9_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<10>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list10_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<11>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list11_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<12>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list12_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<13>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list13_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<14>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list14_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<15>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list15_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<16>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list16_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<17>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list17_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<18>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list18_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<19>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list19_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct list_c_chooser<20>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename list20_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate< long C >\nstruct is_list_c_arg\n{\n    BOOST_STATIC_CONSTANT(bool, value  = true);\n};\n\ntemplate<>\nstruct is_list_c_arg<LONG_MAX>\n{\n    BOOST_STATIC_CONSTANT(bool, value  = false);\n};\n\ntemplate<\n      long C1, long C2, long C3, long C4, long C5, long C6, long C7, long C8\n    , long C9, long C10, long C11, long C12, long C13, long C14, long C15\n    , long C16, long C17, long C18, long C19, long C20\n    >\nstruct list_c_count_args\n{\n    BOOST_STATIC_CONSTANT(int, value =\n          is_list_c_arg<C1>::value + is_list_c_arg<C2>::value \n        + is_list_c_arg<C3>::value + is_list_c_arg<C4>::value \n        + is_list_c_arg<C5>::value + is_list_c_arg<C6>::value \n        + is_list_c_arg<C7>::value + is_list_c_arg<C8>::value \n        + is_list_c_arg<C9>::value + is_list_c_arg<C10>::value \n        + is_list_c_arg<C11>::value + is_list_c_arg<C12>::value \n        + is_list_c_arg<C13>::value + is_list_c_arg<C14>::value \n        + is_list_c_arg<C15>::value + is_list_c_arg<C16>::value \n        + is_list_c_arg<C17>::value + is_list_c_arg<C18>::value \n        + is_list_c_arg<C19>::value + is_list_c_arg<C20>::value\n        );\n\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n    >\nstruct list_c_impl\n{\n    typedef aux::list_c_count_args<\n          C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19\n        > arg_num_;\n\n    typedef typename aux::list_c_chooser< arg_num_::value >\n        ::template result_< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX\n    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX\n    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX\n    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX\n    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX\n    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX\n    , long C18 = LONG_MAX, long C19 = LONG_MAX\n    >\nstruct list_c\n    : aux::list_c_impl<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19\n        >::type\n{\n    typedef typename aux::list_c_impl<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19\n        >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/map.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/map.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< int N >\nstruct map_chooser;\n\n}\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<0>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef map0<\n             \n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<1>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map1<\n              T0\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<2>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map2<\n              T0, T1\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<3>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map3<\n              T0, T1, T2\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<4>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map4<\n              T0, T1, T2, T3\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<5>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map5<\n              T0, T1, T2, T3, T4\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<6>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map6<\n              T0, T1, T2, T3, T4, T5\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<7>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map7<\n              T0, T1, T2, T3, T4, T5, T6\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<8>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map8<\n              T0, T1, T2, T3, T4, T5, T6, T7\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<9>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map9<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<10>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map10<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<11>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map11<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<12>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map12<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<13>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map13<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<14>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map14<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<15>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map15<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<16>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map16<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<17>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map17<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<18>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map18<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<19>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map19<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct map_chooser<20>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename map20<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate< typename T >\nstruct is_map_arg\n{\n    BOOST_STATIC_CONSTANT(bool, value  = true);\n};\n\ntemplate<>\nstruct is_map_arg<na>\n{\n    BOOST_STATIC_CONSTANT(bool, value  = false);\n};\n\ntemplate<\n      typename T1, typename T2, typename T3, typename T4, typename T5\n    , typename T6, typename T7, typename T8, typename T9, typename T10\n    , typename T11, typename T12, typename T13, typename T14, typename T15\n    , typename T16, typename T17, typename T18, typename T19, typename T20\n    >\nstruct map_count_args\n{\n    BOOST_STATIC_CONSTANT(int, value =\n          is_map_arg<T1>::value + is_map_arg<T2>::value \n        + is_map_arg<T3>::value + is_map_arg<T4>::value \n        + is_map_arg<T5>::value + is_map_arg<T6>::value \n        + is_map_arg<T7>::value + is_map_arg<T8>::value \n        + is_map_arg<T9>::value + is_map_arg<T10>::value \n        + is_map_arg<T11>::value + is_map_arg<T12>::value \n        + is_map_arg<T13>::value + is_map_arg<T14>::value \n        + is_map_arg<T15>::value + is_map_arg<T16>::value \n        + is_map_arg<T17>::value + is_map_arg<T18>::value \n        + is_map_arg<T19>::value + is_map_arg<T20>::value\n        );\n\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct map_impl\n{\n    typedef aux::map_count_args<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        > arg_num_;\n\n    typedef typename aux::map_chooser< arg_num_::value >\n        ::template result_< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct map\n    : aux::map_impl<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        >::type\n{\n    typedef typename aux::map_impl<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/minus.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/minus.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct minus_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< minus_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< minus_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct minus_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct minus_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct minus_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct minus_tag\n{\n    typedef typename T::tag type;\n};\n\n/// forward declaration\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct minus2;\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct minus\n\n    : if_<\n\n          is_na<N3>\n        , minus2< N1,N2 >\n        , minus<\n              minus2< N1,N2 >\n            , N3, N4, N5\n            >\n        >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , minus\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1\n    , typename N2\n    >\nstruct minus2\n    : minus_impl<\n          typename minus_tag<N1>::type\n        , typename minus_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, minus2, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, minus)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct minus_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  - BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/modulus.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/modulus.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct modulus_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< modulus_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< modulus_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct modulus_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct modulus_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct modulus_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct modulus_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct modulus\n\n    : modulus_impl<\n          typename modulus_tag<N1>::type\n        , typename modulus_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, modulus, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, modulus)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct modulus_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  % BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/not_equal_to.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/not_equal_to.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct not_equal_to_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< not_equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< not_equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct not_equal_to_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct not_equal_to_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct not_equal_to_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct not_equal_to_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct not_equal_to\n\n    : not_equal_to_impl<\n          typename not_equal_to_tag<N1>::type\n        , typename not_equal_to_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, not_equal_to, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, not_equal_to)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct not_equal_to_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value != BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/or.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/or.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< bool C_ > struct or_impl\n{\n    template<\n          typename T1, typename T2, typename T3, typename T4\n        >\n    struct result_\n        : true_\n    {\n    };\n};\n\ntemplate<> struct or_impl<false>\n{\n    template<\n          typename T1, typename T2, typename T3, typename T4\n        >\n    struct result_\n        : or_impl<\n              BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n            >::template result_< T2,T3,T4,false_ >\n    {\n    };\n};\n\ntemplate<>\nstruct or_impl<false>\n    ::result_< false_,false_,false_,false_ >\n        : false_\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    , typename T3 = false_, typename T4 = false_, typename T5 = false_\n    >\nstruct or_\n\n    : aux::or_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        >::template result_< T2,T3,T4,T5 >\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , or_\n        , ( T1, T2, T3, T4, T5)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC2(\n      2\n    , 5\n    , or_\n    )\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/placeholders.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n// Copyright Peter Dimov 2001-2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/placeholders.hpp\" header\n// -- DO NOT modify by hand!\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg< -1 > _;\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_;\n}\n\n}}\n\n/// agurt, 17/mar/02: one more placeholder for the last 'apply#' \n/// specialization\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<1> _1;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_1)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_1;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<2> _2;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_2)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_2;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<3> _3;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_3)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_3;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<4> _4;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_4)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_4;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<5> _5;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_5)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_5;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<6> _6;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_6)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_6;\n}\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/plus.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/plus.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct plus_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< plus_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< plus_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct plus_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct plus_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct plus_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct plus_tag\n{\n    typedef typename T::tag type;\n};\n\n/// forward declaration\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct plus2;\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct plus\n\n    : if_<\n\n          is_na<N3>\n        , plus2< N1,N2 >\n        , plus<\n              plus2< N1,N2 >\n            , N3, N4, N5\n            >\n        >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , plus\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1\n    , typename N2\n    >\nstruct plus2\n    : plus_impl<\n          typename plus_tag<N1>::type\n        , typename plus_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, plus2, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, plus)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct plus_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  + BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/quote.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/quote.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\ntemplate< bool > struct quote_impl\n{\n    template< typename T > struct result_\n        : T\n    {\n    };\n};\n\ntemplate<> struct quote_impl<false>\n{\n    template< typename T > struct result_\n    {\n        typedef T type;\n    };\n};\n\ntemplate<\n      template< typename P1 > class F\n    , typename Tag = void_\n    >\nstruct quote1\n{\n    template< typename U1 > struct apply\n\n        : quote_impl< aux::has_type< F<U1> >::value >\n            ::template result_< F<U1> >\n\n    {\n    };\n};\n\ntemplate<\n      template< typename P1, typename P2 > class F\n    , typename Tag = void_\n    >\nstruct quote2\n{\n    template< typename U1, typename U2 > struct apply\n\n        : quote_impl< aux::has_type< F< U1,U2 > >::value >\n            ::template result_< F< U1,U2 > >\n\n    {\n    };\n};\n\ntemplate<\n      template< typename P1, typename P2, typename P3 > class F\n    , typename Tag = void_\n    >\nstruct quote3\n{\n    template< typename U1, typename U2, typename U3 > struct apply\n\n        : quote_impl< aux::has_type< F< U1,U2,U3 > >::value >\n            ::template result_< F< U1,U2,U3 > >\n\n    {\n    };\n};\n\ntemplate<\n      template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename Tag = void_\n    >\nstruct quote4\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4\n        >\n    struct apply\n\n        : quote_impl< aux::has_type< F< U1,U2,U3,U4 > >::value >\n            ::template result_< F< U1,U2,U3,U4 > >\n\n    {\n    };\n};\n\ntemplate<\n      template<\n          typename P1, typename P2, typename P3, typename P4\n        , typename P5\n        >\n      class F\n    , typename Tag = void_\n    >\nstruct quote5\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4\n        , typename U5\n        >\n    struct apply\n\n        : quote_impl< aux::has_type< F< U1,U2,U3,U4,U5 > >::value >\n            ::template result_< F< U1,U2,U3,U4,U5 > >\n\n    {\n    };\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/reverse_fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/reverse_fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl;\n\ntemplate< long N >\nstruct reverse_fold_chunk;\n\ntemplate<> struct reverse_fold_chunk<0>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef fwd_state0 bkwd_state0;\n        typedef bkwd_state0 state;\n        typedef iter0 iterator;\n    };\n};\n\ntemplate<> struct reverse_fold_chunk<1>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        \n\n        typedef fwd_state1 bkwd_state1;\n        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n        typedef bkwd_state0 state;\n        typedef iter1 iterator;\n    };\n};\n\ntemplate<> struct reverse_fold_chunk<2>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        \n\n        typedef fwd_state2 bkwd_state2;\n        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter2 iterator;\n    };\n};\n\ntemplate<> struct reverse_fold_chunk<3>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        \n\n        typedef fwd_state3 bkwd_state3;\n        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;\n        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter3 iterator;\n    };\n};\n\ntemplate<> struct reverse_fold_chunk<4>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;\n        typedef typename mpl::next<iter3>::type iter4;\n        \n\n        typedef fwd_state4 bkwd_state4;\n        typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;\n        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;\n        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter4 iterator;\n    };\n};\n\ntemplate< long N >\nstruct reverse_fold_chunk\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;\n        typedef typename mpl::next<iter3>::type iter4;\n        \n\n        typedef reverse_fold_impl<\n              ( (N - 4) < 0 ? 0 : N - 4 )\n            , iter4\n            , Last\n            , fwd_state4\n            , BackwardOp\n            , ForwardOp\n            > nested_chunk;\n\n        typedef typename nested_chunk::state bkwd_state4;\n        typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;\n        typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;\n        typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n        typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef typename nested_chunk::iterator iterator;\n    };\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_step;\n\ntemplate<\n      typename Last\n    , typename State\n    >\nstruct reverse_fold_null_step\n{\n    typedef Last iterator;\n    typedef State state;\n};\n\ntemplate<>\nstruct reverse_fold_chunk< -1 >\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef typename if_<\n              typename is_same< First,Last >::type\n            , reverse_fold_null_step< Last,State >\n            , reverse_fold_step< First,Last,State,BackwardOp,ForwardOp >\n            >::type res_;\n\n        typedef typename res_::state state;\n        typedef typename res_::iterator iterator;\n    };\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_step\n{\n    typedef reverse_fold_chunk< -1 >::template result_<\n          typename mpl::next<First>::type\n        , Last\n        , typename apply2<ForwardOp,State, typename deref<First>::type>::type\n        , BackwardOp\n        , ForwardOp\n        > nested_step;\n\n    typedef typename apply2<\n          BackwardOp\n        , typename nested_step::state\n        , typename deref<First>::type\n        >::type state;\n\n    typedef typename nested_step::iterator iterator;\n};\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl\n    : reverse_fold_chunk<N>\n        ::template result_< First,Last,State,BackwardOp,ForwardOp >\n{\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/reverse_iter_fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/reverse_iter_fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl;\n\ntemplate< long N >\nstruct reverse_iter_fold_chunk;\n\ntemplate<> struct reverse_iter_fold_chunk<0>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef fwd_state0 bkwd_state0;\n        typedef bkwd_state0 state;\n        typedef iter0 iterator;\n    };\n};\n\ntemplate<> struct reverse_iter_fold_chunk<1>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        \n\n        typedef fwd_state1 bkwd_state1;\n        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n        typedef bkwd_state0 state;\n        typedef iter1 iterator;\n    };\n};\n\ntemplate<> struct reverse_iter_fold_chunk<2>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        \n\n        typedef fwd_state2 bkwd_state2;\n        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter2 iterator;\n    };\n};\n\ntemplate<> struct reverse_iter_fold_chunk<3>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        \n\n        typedef fwd_state3 bkwd_state3;\n        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;\n        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter3 iterator;\n    };\n};\n\ntemplate<> struct reverse_iter_fold_chunk<4>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;\n        typedef typename mpl::next<iter3>::type iter4;\n        \n\n        typedef fwd_state4 bkwd_state4;\n        typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;\n        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;\n        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef iter4 iterator;\n    };\n};\n\ntemplate< long N >\nstruct reverse_iter_fold_chunk\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n        typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n        typedef typename mpl::next<iter0>::type iter1;\n        typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n        typedef typename mpl::next<iter1>::type iter2;\n        typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;\n        typedef typename mpl::next<iter2>::type iter3;\n        typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;\n        typedef typename mpl::next<iter3>::type iter4;\n        \n\n        typedef reverse_iter_fold_impl<\n              ( (N - 4) < 0 ? 0 : N - 4 )\n            , iter4\n            , Last\n            , fwd_state4\n            , BackwardOp\n            , ForwardOp\n            > nested_chunk;\n\n        typedef typename nested_chunk::state bkwd_state4;\n        typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;\n        typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;\n        typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n        typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n        \n\n        typedef bkwd_state0 state;\n        typedef typename nested_chunk::iterator iterator;\n    };\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_step;\n\ntemplate<\n      typename Last\n    , typename State\n    >\nstruct reverse_iter_fold_null_step\n{\n    typedef Last iterator;\n    typedef State state;\n};\n\ntemplate<>\nstruct reverse_iter_fold_chunk< -1 >\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef typename if_<\n              typename is_same< First,Last >::type\n            , reverse_iter_fold_null_step< Last,State >\n            , reverse_iter_fold_step< First,Last,State,BackwardOp,ForwardOp >\n            >::type res_;\n\n        typedef typename res_::state state;\n        typedef typename res_::iterator iterator;\n    };\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_step\n{\n    typedef reverse_iter_fold_chunk< -1 >::template result_<\n          typename mpl::next<First>::type\n        , Last\n        , typename apply2< ForwardOp,State,First >::type\n        , BackwardOp\n        , ForwardOp\n        > nested_step;\n\n    typedef typename apply2<\n          BackwardOp\n        , typename nested_step::state\n        , First\n        >::type state;\n\n    typedef typename nested_step::iterator iterator;\n};\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl\n    : reverse_iter_fold_chunk<N>\n        ::template result_< First,Last,State,BackwardOp,ForwardOp >\n{\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/set.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/set.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< int N >\nstruct set_chooser;\n\n}\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<0>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef set0<\n             \n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<1>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set1<\n              T0\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<2>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set2<\n              T0, T1\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<3>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set3<\n              T0, T1, T2\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<4>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set4<\n              T0, T1, T2, T3\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<5>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set5<\n              T0, T1, T2, T3, T4\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<6>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set6<\n              T0, T1, T2, T3, T4, T5\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<7>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set7<\n              T0, T1, T2, T3, T4, T5, T6\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<8>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set8<\n              T0, T1, T2, T3, T4, T5, T6, T7\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<9>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set9<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<10>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set10<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<11>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set11<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<12>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set12<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<13>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set13<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<14>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set14<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<15>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set15<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<16>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set16<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<17>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set17<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<18>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set18<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<19>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set19<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_chooser<20>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename set20<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate< typename T >\nstruct is_set_arg\n{\n    BOOST_STATIC_CONSTANT(bool, value  = true);\n};\n\ntemplate<>\nstruct is_set_arg<na>\n{\n    BOOST_STATIC_CONSTANT(bool, value  = false);\n};\n\ntemplate<\n      typename T1, typename T2, typename T3, typename T4, typename T5\n    , typename T6, typename T7, typename T8, typename T9, typename T10\n    , typename T11, typename T12, typename T13, typename T14, typename T15\n    , typename T16, typename T17, typename T18, typename T19, typename T20\n    >\nstruct set_count_args\n{\n    BOOST_STATIC_CONSTANT(int, value =\n          is_set_arg<T1>::value + is_set_arg<T2>::value \n        + is_set_arg<T3>::value + is_set_arg<T4>::value \n        + is_set_arg<T5>::value + is_set_arg<T6>::value \n        + is_set_arg<T7>::value + is_set_arg<T8>::value \n        + is_set_arg<T9>::value + is_set_arg<T10>::value \n        + is_set_arg<T11>::value + is_set_arg<T12>::value \n        + is_set_arg<T13>::value + is_set_arg<T14>::value \n        + is_set_arg<T15>::value + is_set_arg<T16>::value \n        + is_set_arg<T17>::value + is_set_arg<T18>::value \n        + is_set_arg<T19>::value + is_set_arg<T20>::value\n        );\n\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct set_impl\n{\n    typedef aux::set_count_args<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        > arg_num_;\n\n    typedef typename aux::set_chooser< arg_num_::value >\n        ::template result_< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct set\n    : aux::set_impl<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        >::type\n{\n    typedef typename aux::set_impl<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/set_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/set_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< int N >\nstruct set_c_chooser;\n\n}\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<0>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set0_c<\n              T\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<1>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set1_c<\n              T, C0\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<2>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set2_c<\n              T, C0, C1\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<3>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set3_c<\n              T, C0, C1, C2\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<4>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set4_c<\n              T, C0, C1, C2, C3\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<5>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set5_c<\n              T, C0, C1, C2, C3, C4\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<6>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set6_c<\n              T, C0, C1, C2, C3, C4, C5\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<7>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set7_c<\n              T, C0, C1, C2, C3, C4, C5, C6\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<8>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set8_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<9>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set9_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<10>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set10_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<11>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set11_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<12>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set12_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<13>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set13_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<14>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set14_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<15>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set15_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<16>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set16_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<17>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set17_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<18>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set18_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<19>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set19_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct set_c_chooser<20>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename set20_c<\n              T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate< long C >\nstruct is_set_c_arg\n{\n    BOOST_STATIC_CONSTANT(bool, value  = true);\n};\n\ntemplate<>\nstruct is_set_c_arg<LONG_MAX>\n{\n    BOOST_STATIC_CONSTANT(bool, value  = false);\n};\n\ntemplate<\n      long C1, long C2, long C3, long C4, long C5, long C6, long C7, long C8\n    , long C9, long C10, long C11, long C12, long C13, long C14, long C15\n    , long C16, long C17, long C18, long C19, long C20\n    >\nstruct set_c_count_args\n{\n    BOOST_STATIC_CONSTANT(int, value =\n          is_set_c_arg<C1>::value + is_set_c_arg<C2>::value \n        + is_set_c_arg<C3>::value + is_set_c_arg<C4>::value \n        + is_set_c_arg<C5>::value + is_set_c_arg<C6>::value \n        + is_set_c_arg<C7>::value + is_set_c_arg<C8>::value \n        + is_set_c_arg<C9>::value + is_set_c_arg<C10>::value \n        + is_set_c_arg<C11>::value + is_set_c_arg<C12>::value \n        + is_set_c_arg<C13>::value + is_set_c_arg<C14>::value \n        + is_set_c_arg<C15>::value + is_set_c_arg<C16>::value \n        + is_set_c_arg<C17>::value + is_set_c_arg<C18>::value \n        + is_set_c_arg<C19>::value + is_set_c_arg<C20>::value\n        );\n\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n    >\nstruct set_c_impl\n{\n    typedef aux::set_c_count_args<\n          C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19\n        > arg_num_;\n\n    typedef typename aux::set_c_chooser< arg_num_::value >\n        ::template result_< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX\n    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX\n    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX\n    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX\n    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX\n    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX\n    , long C18 = LONG_MAX, long C19 = LONG_MAX\n    >\nstruct set_c\n    : aux::set_c_impl<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19\n        >::type\n{\n    typedef typename aux::set_c_impl<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19\n        >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/shift_left.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/shift_left.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct shift_left_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< shift_left_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< shift_left_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct shift_left_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct shift_left_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct shift_left_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct shift_left_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct shift_left\n\n    : shift_left_impl<\n          typename shift_left_tag<N1>::type\n        , typename shift_left_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_left, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, shift_left)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct shift_left_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N, typename S > struct apply\n\n        : integral_c<\n              typename N::value_type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N)::value\n                  << BOOST_MPL_AUX_VALUE_WKND(S)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/shift_right.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/shift_right.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct shift_right_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< shift_right_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< shift_right_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct shift_right_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct shift_right_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct shift_right_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct shift_right_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct shift_right\n\n    : shift_right_impl<\n          typename shift_right_tag<N1>::type\n        , typename shift_right_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_right, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, shift_right)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct shift_right_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N, typename S > struct apply\n\n        : integral_c<\n              typename N::value_type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N)::value\n                  >> BOOST_MPL_AUX_VALUE_WKND(S)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/template_arity.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/template_arity.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< bool >\nstruct template_arity_impl\n{\n    template< typename F > struct result_\n        : mpl::int_< -1 >\n    {\n    };\n};\n\ntemplate<>\nstruct template_arity_impl<true>\n{\n    template< typename F > struct result_\n        : F::arity\n    {\n    };\n};\n\ntemplate< typename F >\nstruct template_arity\n    : template_arity_impl< ::boost::mpl::aux::has_rebind<F>::value >\n        ::template result_<F>\n{\n};\n\n}}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/times.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/times.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct times_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< times_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< times_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct times_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct times_impl< na,integral_c_tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate<> struct times_impl< integral_c_tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct times_tag\n{\n    typedef typename T::tag type;\n};\n\n/// forward declaration\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct times2;\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct times\n\n    : if_<\n\n          is_na<N3>\n        , times2< N1,N2 >\n        , times<\n              times2< N1,N2 >\n            , N3, N4, N5\n            >\n        >::type\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , times\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1\n    , typename N2\n    >\nstruct times2\n    : times_impl<\n          typename times_tag<N1>::type\n        , typename times_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, times2, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, times)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct times_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  * BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/unpack_args.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2002-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/unpack_args.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate< BOOST_MPL_AUX_NTTP_DECL(int, size) > struct unpack_args_impl\n{\n    template< typename F, typename Args > struct apply;\n};\n\ntemplate<> struct unpack_args_impl<0>\n{\n    template< typename F, typename Args > struct apply\n        : apply0<\n              F\n            >\n    {\n    };\n};\n\ntemplate<> struct unpack_args_impl<1>\n{\n    template< typename F, typename Args > struct apply\n        : apply1<\n              F\n            , typename at_c< Args,0 >::type\n            >\n    {\n    };\n};\n\ntemplate<> struct unpack_args_impl<2>\n{\n    template< typename F, typename Args > struct apply\n        : apply2<\n              F\n            , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n            >\n    {\n    };\n};\n\ntemplate<> struct unpack_args_impl<3>\n{\n    template< typename F, typename Args > struct apply\n        : apply3<\n              F\n            , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n            , typename at_c< Args,2 >::type\n            >\n    {\n    };\n};\n\ntemplate<> struct unpack_args_impl<4>\n{\n    template< typename F, typename Args > struct apply\n        : apply4<\n              F\n            , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n            , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type\n            >\n    {\n    };\n};\n\ntemplate<> struct unpack_args_impl<5>\n{\n    template< typename F, typename Args > struct apply\n        : apply5<\n              F\n            , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n            , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type\n            , typename at_c< Args,4 >::type\n            >\n    {\n    };\n};\n\n}\n\ntemplate<\n      typename F\n    >\nstruct unpack_args\n{\n    template< typename Args > struct apply\n\n        : aux::unpack_args_impl< size<Args>::value >\n            ::template apply< F,Args >\n\n    {\n    };\n};\n\nBOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(1, unpack_args)\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/vector.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/vector.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< int N >\nstruct vector_chooser;\n\n}\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<0>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef vector0<\n             \n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<1>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector1<\n              T0\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<2>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector2<\n              T0, T1\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<3>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector3<\n              T0, T1, T2\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<4>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector4<\n              T0, T1, T2, T3\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<5>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector5<\n              T0, T1, T2, T3, T4\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<6>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector6<\n              T0, T1, T2, T3, T4, T5\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<7>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector7<\n              T0, T1, T2, T3, T4, T5, T6\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<8>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector8<\n              T0, T1, T2, T3, T4, T5, T6, T7\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<9>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector9<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<10>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector10<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<11>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector11<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<12>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector12<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<13>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector13<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<14>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector14<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<15>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector15<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<16>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector16<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<17>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector17<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<18>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector18<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<19>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector19<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_chooser<20>\n{\n    template<\n          typename T0, typename T1, typename T2, typename T3, typename T4\n        , typename T5, typename T6, typename T7, typename T8, typename T9\n        , typename T10, typename T11, typename T12, typename T13, typename T14\n        , typename T15, typename T16, typename T17, typename T18, typename T19\n        >\n    struct result_\n    {\n        typedef typename vector20<\n              T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate< typename T >\nstruct is_vector_arg\n{\n    BOOST_STATIC_CONSTANT(bool, value  = true);\n};\n\ntemplate<>\nstruct is_vector_arg<na>\n{\n    BOOST_STATIC_CONSTANT(bool, value  = false);\n};\n\ntemplate<\n      typename T1, typename T2, typename T3, typename T4, typename T5\n    , typename T6, typename T7, typename T8, typename T9, typename T10\n    , typename T11, typename T12, typename T13, typename T14, typename T15\n    , typename T16, typename T17, typename T18, typename T19, typename T20\n    >\nstruct vector_count_args\n{\n    BOOST_STATIC_CONSTANT(int, value =\n          is_vector_arg<T1>::value + is_vector_arg<T2>::value \n        + is_vector_arg<T3>::value + is_vector_arg<T4>::value \n        + is_vector_arg<T5>::value + is_vector_arg<T6>::value \n        + is_vector_arg<T7>::value + is_vector_arg<T8>::value \n        + is_vector_arg<T9>::value + is_vector_arg<T10>::value \n        + is_vector_arg<T11>::value + is_vector_arg<T12>::value \n        + is_vector_arg<T13>::value + is_vector_arg<T14>::value \n        + is_vector_arg<T15>::value + is_vector_arg<T16>::value \n        + is_vector_arg<T17>::value + is_vector_arg<T18>::value \n        + is_vector_arg<T19>::value + is_vector_arg<T20>::value\n        );\n\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct vector_impl\n{\n    typedef aux::vector_count_args<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        > arg_num_;\n\n    typedef typename aux::vector_chooser< arg_num_::value >\n        ::template result_< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct vector\n    : aux::vector_impl<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        >::type\n{\n    typedef typename aux::vector_impl<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19\n        >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ctps/vector_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/vector_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< int N >\nstruct vector_c_chooser;\n\n}\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<0>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector0_c<\n              T\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<1>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector1_c<\n              T, T(C0)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<2>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector2_c<\n              T, T(C0), T(C1)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<3>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector3_c<\n              T, T(C0), T(C1), T(C2)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<4>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector4_c<\n              T, T(C0), T(C1), T(C2), T(C3)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<5>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector5_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<6>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector6_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<7>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector7_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<8>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector8_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<9>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector9_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<10>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector10_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<11>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector11_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<12>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector12_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<13>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector13_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<14>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector14_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<15>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector15_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<16>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector16_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<17>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector17_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<18>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector18_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<19>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector19_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate<>\nstruct vector_c_chooser<20>\n{\n    template<\n          typename T, long C0, long C1, long C2, long C3, long C4, long C5\n        , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n        , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n        >\n    struct result_\n    {\n        typedef typename vector20_c<\n              T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19)\n            >::type type;\n\n    };\n};\n\n} // namespace aux\n\nnamespace aux {\n\ntemplate< long C >\nstruct is_vector_c_arg\n{\n    BOOST_STATIC_CONSTANT(bool, value  = true);\n};\n\ntemplate<>\nstruct is_vector_c_arg<LONG_MAX>\n{\n    BOOST_STATIC_CONSTANT(bool, value  = false);\n};\n\ntemplate<\n      long C1, long C2, long C3, long C4, long C5, long C6, long C7, long C8\n    , long C9, long C10, long C11, long C12, long C13, long C14, long C15\n    , long C16, long C17, long C18, long C19, long C20\n    >\nstruct vector_c_count_args\n{\n    BOOST_STATIC_CONSTANT(int, value =\n          is_vector_c_arg<C1>::value + is_vector_c_arg<C2>::value \n        + is_vector_c_arg<C3>::value + is_vector_c_arg<C4>::value \n        + is_vector_c_arg<C5>::value + is_vector_c_arg<C6>::value \n        + is_vector_c_arg<C7>::value + is_vector_c_arg<C8>::value \n        + is_vector_c_arg<C9>::value + is_vector_c_arg<C10>::value \n        + is_vector_c_arg<C11>::value + is_vector_c_arg<C12>::value \n        + is_vector_c_arg<C13>::value + is_vector_c_arg<C14>::value \n        + is_vector_c_arg<C15>::value + is_vector_c_arg<C16>::value \n        + is_vector_c_arg<C17>::value + is_vector_c_arg<C18>::value \n        + is_vector_c_arg<C19>::value + is_vector_c_arg<C20>::value\n        );\n\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n    >\nstruct vector_c_impl\n{\n    typedef aux::vector_c_count_args<\n          C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19\n        > arg_num_;\n\n    typedef typename aux::vector_c_chooser< arg_num_::value >\n        ::template result_< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX\n    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX\n    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX\n    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX\n    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX\n    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX\n    , long C18 = LONG_MAX, long C19 = LONG_MAX\n    >\nstruct vector_c\n    : aux::vector_c_impl<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19\n        >::type\n{\n    typedef typename aux::vector_c_impl<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19\n        >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/advance_backward.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/advance_backward.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< long N > struct advance_backward;\ntemplate<>\nstruct advance_backward<0>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef iter0 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<1>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef iter1 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<2>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef typename prior<iter1>::type iter2;\n        typedef iter2 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<3>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef typename prior<iter1>::type iter2;\n        typedef typename prior<iter2>::type iter3;\n        typedef iter3 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<4>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef typename prior<iter1>::type iter2;\n        typedef typename prior<iter2>::type iter3;\n        typedef typename prior<iter3>::type iter4;\n        typedef iter4 type;\n    };\n};\n\ntemplate< long N >\nstruct advance_backward\n{\n    template< typename Iterator > struct apply\n    {\n        typedef typename apply_wrap1<\n              advance_backward<4>\n            , Iterator\n            >::type chunk_result_;\n\n        typedef typename apply_wrap1<\n              advance_backward<(\n                (N - 4) < 0\n                    ? 0\n                    : N - 4\n                    )>\n            , chunk_result_\n            >::type type;\n    };\n};\n\n}}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/advance_forward.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/advance_forward.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< long N > struct advance_forward;\ntemplate<>\nstruct advance_forward<0>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef iter0 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<1>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef iter1 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<2>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef typename next<iter1>::type iter2;\n        typedef iter2 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<3>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef typename next<iter1>::type iter2;\n        typedef typename next<iter2>::type iter3;\n        typedef iter3 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<4>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef typename next<iter1>::type iter2;\n        typedef typename next<iter2>::type iter3;\n        typedef typename next<iter3>::type iter4;\n        typedef iter4 type;\n    };\n};\n\ntemplate< long N >\nstruct advance_forward\n{\n    template< typename Iterator > struct apply\n    {\n        typedef typename apply_wrap1<\n              advance_forward<4>\n            , Iterator\n            >::type chunk_result_;\n\n        typedef typename apply_wrap1<\n              advance_forward<(\n                (N - 4) < 0\n                    ? 0\n                    : N - 4\n                    )>\n            , chunk_result_\n            >::type type;\n    };\n};\n\n}}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/and.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/and.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate< bool C_, typename T1, typename T2, typename T3, typename T4 >\nstruct and_impl\n    : false_\n{\n};\n\ntemplate< typename T1, typename T2, typename T3, typename T4 >\nstruct and_impl< true,T1,T2,T3,T4 >\n    : and_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        , T2, T3, T4\n        , true_\n        >\n{\n};\n\ntemplate<>\nstruct and_impl<\n          true\n        , true_, true_, true_, true_\n        >\n    : true_\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    , typename T3 = true_, typename T4 = true_, typename T5 = true_\n    >\nstruct and_\n\n    : aux::and_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        , T2, T3, T4, T5\n        >\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , and_\n        , ( T1, T2, T3, T4, T5)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC2(\n      2\n    , 5\n    , and_\n    )\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/apply.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/apply.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F\n    >\nstruct apply0\n\n    : apply_wrap0<\n          typename lambda<F>::type\n       \n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          1\n        , apply0\n        , (F )\n        )\n};\n\ntemplate<\n      typename F\n    >\nstruct apply< F,na,na,na,na,na >\n    : apply0<F>\n{\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply1\n\n    : apply_wrap1<\n          typename lambda<F>::type\n        , T1\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          2\n        , apply1\n        , (F, T1)\n        )\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply< F,T1,na,na,na,na >\n    : apply1< F,T1 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply2\n\n    : apply_wrap2<\n          typename lambda<F>::type\n        , T1, T2\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          3\n        , apply2\n        , (F, T1, T2)\n        )\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply< F,T1,T2,na,na,na >\n    : apply2< F,T1,T2 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply3\n\n    : apply_wrap3<\n          typename lambda<F>::type\n        , T1, T2, T3\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          4\n        , apply3\n        , (F, T1, T2, T3)\n        )\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply< F,T1,T2,T3,na,na >\n    : apply3< F,T1,T2,T3 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply4\n\n    : apply_wrap4<\n          typename lambda<F>::type\n        , T1, T2, T3, T4\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , apply4\n        , (F, T1, T2, T3, T4)\n        )\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply< F,T1,T2,T3,T4,na >\n    : apply4< F,T1,T2,T3,T4 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply5\n\n    : apply_wrap5<\n          typename lambda<F>::type\n        , T1, T2, T3, T4, T5\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          6\n        , apply5\n        , (F, T1, T2, T3, T4, T5)\n        )\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply\n    : apply5< F,T1,T2,T3,T4,T5 >\n{\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/apply_fwd.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/apply_fwd.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na\n    >\nstruct apply;\n\ntemplate<\n      typename F\n    >\nstruct apply0;\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply1;\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply2;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply3;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply4;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply5;\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/apply_wrap.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/apply_wrap.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F\n\n    , typename has_apply_ = typename aux::has_apply<F>::type\n\n    >\nstruct apply_wrap0\n\n    : F::template apply<  >\n{\n};\n\ntemplate< typename F >\nstruct apply_wrap0< F,true_ >\n    : F::apply\n{\n};\n\ntemplate<\n      typename F, typename T1\n\n    >\nstruct apply_wrap1\n\n    : F::template apply<T1>\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n\n    >\nstruct apply_wrap2\n\n    : F::template apply< T1,T2 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n\n    >\nstruct apply_wrap3\n\n    : F::template apply< T1,T2,T3 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n\n    >\nstruct apply_wrap4\n\n    : F::template apply< T1,T2,T3,T4 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n\n    >\nstruct apply_wrap5\n\n    : F::template apply< T1,T2,T3,T4,T5 >\n{\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/arg.hpp",
    "content": "\n// Copyright Peter Dimov 2001-2002\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/arg.hpp\" header\n// -- DO NOT modify by hand!\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntemplate<> struct arg< -1 >\n{\n    BOOST_STATIC_CONSTANT(int, value  = -1);\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U1 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<1>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 1);\n    typedef arg<2> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U1 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<2>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 2);\n    typedef arg<3> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U2 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<3>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 3);\n    typedef arg<4> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U3 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<4>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 4);\n    typedef arg<5> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U4 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<5>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 5);\n    typedef arg<6> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U5 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\nBOOST_MPL_AUX_NONTYPE_ARITY_SPEC(1,int, arg)\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/basic_bind.hpp",
    "content": "\n// Copyright Peter Dimov 2001\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/basic_bind.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      typename T, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg\n{\n    typedef T type;\n};\n\ntemplate<\n      int N, typename U1, typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 >\n{\n    typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg< bind< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5 >\n{\n    typedef bind< F,T1,T2,T3,T4,T5 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename F\n    >\nstruct bind0\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n\n     public:\n        typedef typename apply_wrap0<\n              f_\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg<\n      bind0<F>, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind0<F> f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(1, bind0)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)\n\ntemplate<\n      typename F\n    >\nstruct bind< F,na,na,na,na,na >\n    : bind0<F>\n{\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind1\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n\n     public:\n        typedef typename apply_wrap1<\n              f_\n            , typename t1::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename U1, typename U2, typename U3\n    , typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind1< F,T1 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind1< F,T1 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(2, bind1)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind< F,T1,na,na,na,na >\n    : bind1< F,T1 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind2\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n\n     public:\n        typedef typename apply_wrap2<\n              f_\n            , typename t1::type, typename t2::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename U1, typename U2\n    , typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind2< F,T1,T2 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind2< F,T1,T2 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(3, bind2)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind< F,T1,T2,na,na,na >\n    : bind2< F,T1,T2 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind3\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n\n     public:\n        typedef typename apply_wrap3<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename U1\n    , typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind3< F,T1,T2,T3 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(4, bind3)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind< F,T1,T2,T3,na,na >\n    : bind3< F,T1,T2,T3 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind4\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;\n\n     public:\n        typedef typename apply_wrap4<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename U1, typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind4< F,T1,T2,T3,T4 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(5, bind4)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind< F,T1,T2,T3,T4,na >\n    : bind4< F,T1,T2,T3,T4 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind5\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;\n        typedef aux::resolve_bind_arg< T5,U1,U2,U3,U4,U5 > t5;\n\n     public:\n        typedef typename apply_wrap5<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type, typename t5::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg<\n      bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind5< F,T1,T2,T3,T4,T5 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(6, bind5)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind\n    : bind5< F,T1,T2,T3,T4,T5 >\n{\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/bind.hpp",
    "content": "\n// Copyright Peter Dimov 2001\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bind.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      typename T, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg\n{\n    typedef T type;\n};\n\ntemplate<\n      typename T\n    , typename Arg\n    >\nstruct replace_unnamed_arg\n{\n    typedef Arg next;\n    typedef T type;\n};\n\ntemplate<\n      typename Arg\n    >\nstruct replace_unnamed_arg< arg< -1 >, Arg >\n{\n    typedef typename Arg::next next;\n    typedef Arg type;\n};\n\ntemplate<\n      int N, typename U1, typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 >\n{\n    typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg< bind< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5 >\n{\n    typedef bind< F,T1,T2,T3,T4,T5 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename F\n    >\nstruct bind0\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n     public:\n        typedef typename apply_wrap0<\n              f_\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg<\n      bind0<F>, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind0<F> f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(1, bind0)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)\n\ntemplate<\n      typename F\n    >\nstruct bind< F,na,na,na,na,na >\n    : bind0<F>\n{\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind1\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n     public:\n        typedef typename apply_wrap1<\n              f_\n            , typename t1::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename U1, typename U2, typename U3\n    , typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind1< F,T1 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind1< F,T1 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(2, bind1)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind< F,T1,na,na,na,na >\n    : bind1< F,T1 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind2\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n     public:\n        typedef typename apply_wrap2<\n              f_\n            , typename t1::type, typename t2::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename U1, typename U2\n    , typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind2< F,T1,T2 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind2< F,T1,T2 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(3, bind2)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind< F,T1,T2,na,na,na >\n    : bind2< F,T1,T2 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind3\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n     public:\n        typedef typename apply_wrap3<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename U1\n    , typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind3< F,T1,T2,T3 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(4, bind3)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind< F,T1,T2,T3,na,na >\n    : bind3< F,T1,T2,T3 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind4\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n        typedef aux::replace_unnamed_arg< T4,n4 > r4;\n        typedef typename r4::type a4;\n        typedef typename r4::next n5;\n        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;\n        ///\n     public:\n        typedef typename apply_wrap4<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename U1, typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind4< F,T1,T2,T3,T4 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(5, bind4)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind< F,T1,T2,T3,T4,na >\n    : bind4< F,T1,T2,T3,T4 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind5\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n        typedef aux::replace_unnamed_arg< T4,n4 > r4;\n        typedef typename r4::type a4;\n        typedef typename r4::next n5;\n        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;\n        ///\n        typedef aux::replace_unnamed_arg< T5,n5 > r5;\n        typedef typename r5::type a5;\n        typedef typename r5::next n6;\n        typedef aux::resolve_bind_arg< a5,U1,U2,U3,U4,U5 > t5;\n        ///\n     public:\n        typedef typename apply_wrap5<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type, typename t5::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg<\n      bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind5< F,T1,T2,T3,T4,T5 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(6, bind5)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind\n    : bind5< F,T1,T2,T3,T4,T5 >\n{\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/bind_fwd.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bind_fwd.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na\n    >\nstruct bind;\n\ntemplate<\n      typename F\n    >\nstruct bind0;\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind1;\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind2;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind3;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind4;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind5;\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/bitand.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bitand.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct bitand_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< bitand_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< bitand_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct bitand_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitand_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitand_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct bitand_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct bitand_\n    : bitand_< bitand_< bitand_< bitand_< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , bitand_\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct bitand_< N1,N2,N3,N4,na >\n\n    : bitand_< bitand_< bitand_< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitand_\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct bitand_< N1,N2,N3,na,na >\n\n    : bitand_< bitand_< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitand_\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct bitand_< N1,N2,na,na,na >\n    : bitand_impl<\n          typename bitand_tag<N1>::type\n        , typename bitand_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitand_\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, bitand_)\n\n}}\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< typename T, T n1, T n2 >\nstruct bitand_wknd\n{\n    BOOST_STATIC_CONSTANT(T, value  = (n1 & n2));\n    typedef integral_c< T,value > type;\n};\n\n}\n\ntemplate<>\nstruct bitand_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n        : aux::bitand_wknd<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , N1::value\n            , N2::value\n            >::type\n\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/bitor.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bitor.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct bitor_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< bitor_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< bitor_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct bitor_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitor_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitor_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct bitor_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct bitor_\n    : bitor_< bitor_< bitor_< bitor_< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , bitor_\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct bitor_< N1,N2,N3,N4,na >\n\n    : bitor_< bitor_< bitor_< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitor_\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct bitor_< N1,N2,N3,na,na >\n\n    : bitor_< bitor_< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitor_\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct bitor_< N1,N2,na,na,na >\n    : bitor_impl<\n          typename bitor_tag<N1>::type\n        , typename bitor_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitor_\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, bitor_)\n\n}}\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< typename T, T n1, T n2 >\nstruct bitor_wknd\n{\n    BOOST_STATIC_CONSTANT(T, value  = (n1 | n2));\n    typedef integral_c< T,value > type;\n};\n\n}\n\ntemplate<>\nstruct bitor_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n        : aux::bitor_wknd<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , N1::value\n            , N2::value\n            >::type\n\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/bitxor.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bitxor.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct bitxor_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< bitxor_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< bitxor_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct bitxor_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitxor_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitxor_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct bitxor_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct bitxor_\n    : bitxor_< bitxor_< bitxor_< bitxor_< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , bitxor_\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct bitxor_< N1,N2,N3,N4,na >\n\n    : bitxor_< bitxor_< bitxor_< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitxor_\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct bitxor_< N1,N2,N3,na,na >\n\n    : bitxor_< bitxor_< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitxor_\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct bitxor_< N1,N2,na,na,na >\n    : bitxor_impl<\n          typename bitxor_tag<N1>::type\n        , typename bitxor_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitxor_\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, bitxor_)\n\n}}\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< typename T, T n1, T n2 >\nstruct bitxor_wknd\n{\n    BOOST_STATIC_CONSTANT(T, value  = (n1 ^ n2));\n    typedef integral_c< T,value > type;\n};\n\n}\n\ntemplate<>\nstruct bitxor_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n        : aux::bitxor_wknd<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , N1::value\n            , N2::value\n            >::type\n\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/deque.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/deque.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct deque;\n\ntemplate<\n     \n    >\nstruct deque<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector0<  >\n{\n    typedef vector0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct deque<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector1<T0>\n{\n    typedef typename vector1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct deque<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector2< T0,T1 >\n{\n    typedef typename vector2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct deque<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector3< T0,T1,T2 >\n{\n    typedef typename vector3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct deque<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector4< T0,T1,T2,T3 >\n{\n    typedef typename vector4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector5< T0,T1,T2,T3,T4 >\n{\n    typedef typename vector5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename vector6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename vector7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename vector8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : vector15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename vector15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : vector16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename vector16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : vector17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename vector17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : vector18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename vector18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : vector19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename vector19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct deque\n    : vector20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename vector20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/divides.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/divides.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct divides_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< divides_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< divides_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct divides_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct divides_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct divides_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct divides_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct divides\n    : divides< divides< divides< divides< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , divides\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct divides< N1,N2,N3,N4,na >\n\n    : divides< divides< divides< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , divides\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct divides< N1,N2,N3,na,na >\n\n    : divides< divides< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , divides\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct divides< N1,N2,na,na,na >\n    : divides_impl<\n          typename divides_tag<N1>::type\n        , typename divides_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , divides\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, divides)\n\n}}\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< typename T, T n1, T n2 >\nstruct divides_wknd\n{\n    BOOST_STATIC_CONSTANT(T, value  = (n1 / n2));\n    typedef integral_c< T,value > type;\n};\n\n}\n\ntemplate<>\nstruct divides_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n        : aux::divides_wknd<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , N1::value\n            , N2::value\n            >::type\n\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/equal_to.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/equal_to.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct equal_to_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct equal_to_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct equal_to_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct equal_to_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct equal_to_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct equal_to\n\n    : equal_to_impl<\n          typename equal_to_tag<N1>::type\n        , typename equal_to_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, equal_to, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, equal_to)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct equal_to_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n    {\n        BOOST_STATIC_CONSTANT(bool, value =\n             ( BOOST_MPL_AUX_VALUE_WKND(N1)::value ==\n             BOOST_MPL_AUX_VALUE_WKND(N2)::value )\n            );\n        typedef bool_<value> type;\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl;\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 0,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef state0 state;\n    typedef iter0 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 1,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    \n\n    typedef state1 state;\n    typedef iter1 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 2,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    \n\n    typedef state2 state;\n    typedef iter2 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 3,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    \n\n    typedef state3 state;\n    typedef iter3 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 4,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp, state3, typename deref<iter3>::type >::type state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef state4 state;\n    typedef iter4 iterator;\n};\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl\n{\n    typedef fold_impl<\n          4\n        , First\n        , Last\n        , State\n        , ForwardOp\n        > chunk_;\n\n    typedef fold_impl<\n          ( (N - 4) < 0 ? 0 : N - 4 )\n        , typename chunk_::iterator\n        , Last\n        , typename chunk_::state\n        , ForwardOp\n        > res_;\n\n    typedef typename res_::state state;\n    typedef typename res_::iterator iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< -1,First,Last,State,ForwardOp >\n    : fold_impl<\n          -1\n        , typename mpl::next<First>::type\n        , Last\n        , typename apply2<ForwardOp,State, typename deref<First>::type>::type\n        , ForwardOp\n        >\n{\n};\n\ntemplate<\n      typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< -1,Last,Last,State,ForwardOp >\n{\n    typedef State state;\n    typedef Last iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/full_lambda.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/full_lambda.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false\n    , bool C5 = false\n    >\nstruct lambda_or\n    : true_\n{\n};\n\ntemplate<>\nstruct lambda_or< false,false,false,false,false >\n    : false_\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename T\n    , typename Tag\n   \n    >\nstruct lambda\n{\n    typedef false_ is_le;\n    typedef T result_;\n    typedef T type;\n};\n\ntemplate<\n      typename T\n    >\nstruct is_lambda_expression\n    : lambda<T>::is_le\n{\n};\n\ntemplate< int N, typename Tag >\nstruct lambda< arg<N>, Tag >\n{\n    typedef true_ is_le;\n    typedef mpl::arg<N> result_; // qualified for the sake of MIPSpro 7.41\n    typedef mpl::protect<result_> type;\n};\n\ntemplate<\n      typename F\n    , typename Tag\n    >\nstruct lambda<\n          bind0<F>\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind0<\n          F\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1 > class F\n    , typename L1\n    >\nstruct le_result1\n{\n    typedef F<\n          typename L1::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1 > class F\n    , typename L1\n    >\nstruct le_result1< true_,Tag,F,L1 >\n{\n    typedef bind1<\n          quote1< F,Tag >\n        , typename L1::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1 > class F\n    , typename T1\n    , typename Tag\n    >\nstruct lambda<\n          F<T1>\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef typename l1::is_le is_le1;\n    typedef typename aux::lambda_or<\n          is_le1::value\n        >::type is_le;\n\n    typedef aux::le_result1<\n          is_le, Tag, F, l1\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1\n    , typename Tag\n    >\nstruct lambda<\n          bind1< F,T1 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind1<\n          F\n        , T1\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2 > class F\n    , typename L1, typename L2\n    >\nstruct le_result2\n{\n    typedef F<\n          typename L1::type, typename L2::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2 > class F\n    , typename L1, typename L2\n    >\nstruct le_result2< true_,Tag,F,L1,L2 >\n{\n    typedef bind2<\n          quote2< F,Tag >\n        , typename L1::result_, typename L2::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1, typename P2 > class F\n    , typename T1, typename T2\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2 >\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value\n        >::type is_le;\n\n    typedef aux::le_result2<\n          is_le, Tag, F, l1, l2\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    , typename Tag\n    >\nstruct lambda<\n          bind2< F,T1,T2 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind2<\n          F\n        , T1, T2\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2, typename P3 > class F\n    , typename L1, typename L2, typename L3\n    >\nstruct le_result3\n{\n    typedef F<\n          typename L1::type, typename L2::type, typename L3::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2, typename P3 > class F\n    , typename L1, typename L2, typename L3\n    >\nstruct le_result3< true_,Tag,F,L1,L2,L3 >\n{\n    typedef bind3<\n          quote3< F,Tag >\n        , typename L1::result_, typename L2::result_, typename L3::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1, typename P2, typename P3 > class F\n    , typename T1, typename T2, typename T3\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2,T3 >\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    typedef lambda< T3,Tag > l3;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    typedef typename l3::is_le is_le3;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value, is_le3::value\n        >::type is_le;\n\n    typedef aux::le_result3<\n          is_le, Tag, F, l1, l2, l3\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    , typename Tag\n    >\nstruct lambda<\n          bind3< F,T1,T2,T3 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind3<\n          F\n        , T1, T2, T3\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename L1, typename L2, typename L3, typename L4\n    >\nstruct le_result4\n{\n    typedef F<\n          typename L1::type, typename L2::type, typename L3::type\n        , typename L4::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename L1, typename L2, typename L3, typename L4\n    >\nstruct le_result4< true_,Tag,F,L1,L2,L3,L4 >\n{\n    typedef bind4<\n          quote4< F,Tag >\n        , typename L1::result_, typename L2::result_, typename L3::result_\n        , typename L4::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename T1, typename T2, typename T3, typename T4\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2,T3,T4 >\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    typedef lambda< T3,Tag > l3;\n    typedef lambda< T4,Tag > l4;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    typedef typename l3::is_le is_le3;\n    typedef typename l4::is_le is_le4;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value, is_le3::value, is_le4::value\n        >::type is_le;\n\n    typedef aux::le_result4<\n          is_le, Tag, F, l1, l2, l3, l4\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename Tag\n    >\nstruct lambda<\n          bind4< F,T1,T2,T3,T4 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind4<\n          F\n        , T1, T2, T3, T4\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F\n    , typename L1, typename L2, typename L3, typename L4, typename L5\n    >\nstruct le_result5\n{\n    typedef F<\n          typename L1::type, typename L2::type, typename L3::type\n        , typename L4::type, typename L5::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F\n    , typename L1, typename L2, typename L3, typename L4, typename L5\n    >\nstruct le_result5< true_,Tag,F,L1,L2,L3,L4,L5 >\n{\n    typedef bind5<\n          quote5< F,Tag >\n        , typename L1::result_, typename L2::result_, typename L3::result_\n        , typename L4::result_, typename L5::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template<\n          typename P1, typename P2, typename P3, typename P4\n        , typename P5\n        >\n      class F\n    , typename T1, typename T2, typename T3, typename T4, typename T5\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2,T3,T4,T5 >\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    typedef lambda< T3,Tag > l3;\n    typedef lambda< T4,Tag > l4;\n    typedef lambda< T5,Tag > l5;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    typedef typename l3::is_le is_le3;\n    typedef typename l4::is_le is_le4;\n    typedef typename l5::is_le is_le5;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value, is_le3::value, is_le4::value\n        , is_le5::value\n        >::type is_le;\n\n    typedef aux::le_result5<\n          is_le, Tag, F, l1, l2, l3, l4, l5\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    , typename Tag\n    >\nstruct lambda<\n          bind5< F,T1,T2,T3,T4,T5 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind5<\n          F\n        , T1, T2, T3, T4, T5\n        > result_;\n\n    typedef result_ type;\n};\n\n/// special case for 'protect'\ntemplate< typename T, typename Tag >\nstruct lambda< mpl::protect<T>, Tag >\n{\n    typedef false_ is_le;\n    typedef mpl::protect<T> result_;\n    typedef result_ type;\n};\n\n/// specializations for the main 'bind' form\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    , typename Tag\n    >\nstruct lambda<\n          bind< F,T1,T2,T3,T4,T5 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind< F,T1,T2,T3,T4,T5 > result_;\n    typedef result_ type;\n};\n\n/// workaround for MWCW 8.3+/EDG < 303, leads to ambiguity on Digital Mars\n\ntemplate<\n      typename F, typename Tag1, typename Tag2\n    >\nstruct lambda<\n          lambda< F,Tag1 >\n        , Tag2\n        >\n{\n    typedef lambda< F,Tag2 > l1;\n    typedef lambda< Tag1,Tag2 > l2;\n    typedef typename l1::is_le is_le;\n    typedef aux::le_result2<is_le, Tag2, mpl::lambda, l1, l2> le_result_;\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\nBOOST_MPL_AUX_NA_SPEC(2, lambda)\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/greater.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/greater.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct greater_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< greater_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< greater_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct greater_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct greater_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct greater_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct greater_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct greater\n\n    : greater_impl<\n          typename greater_tag<N1>::type\n        , typename greater_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, greater)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct greater_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n    {\n        BOOST_STATIC_CONSTANT(bool, value =\n             ( BOOST_MPL_AUX_VALUE_WKND(N1)::value >\n             BOOST_MPL_AUX_VALUE_WKND(N2)::value )\n            );\n        typedef bool_<value> type;\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/greater_equal.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/greater_equal.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct greater_equal_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< greater_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< greater_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct greater_equal_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct greater_equal_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct greater_equal_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct greater_equal_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct greater_equal\n\n    : greater_equal_impl<\n          typename greater_equal_tag<N1>::type\n        , typename greater_equal_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, greater_equal, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, greater_equal)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct greater_equal_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n    {\n        BOOST_STATIC_CONSTANT(bool, value =\n             ( BOOST_MPL_AUX_VALUE_WKND(N1)::value >=\n             BOOST_MPL_AUX_VALUE_WKND(N2)::value )\n            );\n        typedef bool_<value> type;\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/inherit.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/inherit.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    >\nstruct inherit2\n    : T1, T2\n{\n    typedef inherit2 type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, inherit2, (T1, T2))\n};\n\ntemplate< typename T1 >\nstruct inherit2< T1,empty_base >\n{\n    typedef T1 type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (T1, empty_base))\n};\n\ntemplate< typename T2 >\nstruct inherit2< empty_base,T2 >\n{\n    typedef T2 type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base, T2))\n};\n\ntemplate<>\nstruct inherit2< empty_base,empty_base >\n{\n    typedef empty_base type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base, empty_base))\n};\n\nBOOST_MPL_AUX_NA_SPEC(2, inherit2)\n\ntemplate<\n      typename T1 = na, typename T2 = na, typename T3 = na\n    >\nstruct inherit3\n    : inherit2<\n          typename inherit2<\n              T1, T2\n            >::type\n        , T3\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          3\n        , inherit3\n        , ( T1, T2, T3)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC(3, inherit3)\n\ntemplate<\n      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na\n    >\nstruct inherit4\n    : inherit2<\n          typename inherit3<\n              T1, T2, T3\n            >::type\n        , T4\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          4\n        , inherit4\n        , ( T1, T2, T3, T4)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC(4, inherit4)\n\ntemplate<\n      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na\n    , typename T5 = na\n    >\nstruct inherit5\n    : inherit2<\n          typename inherit4<\n              T1, T2, T3, T4\n            >::type\n        , T5\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , inherit5\n        , ( T1, T2, T3, T4, T5)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC(5, inherit5)\n\n/// primary template\n\ntemplate<\n      typename T1 = empty_base, typename T2 = empty_base\n    , typename T3 = empty_base, typename T4 = empty_base\n    , typename T5 = empty_base\n    >\nstruct inherit\n    : inherit5< T1,T2,T3,T4,T5 >\n{\n};\n\ntemplate<>\nstruct inherit< na,na,na,na,na >\n{\n    template<\n\n          typename T1 = empty_base, typename T2 = empty_base\n        , typename T3 = empty_base, typename T4 = empty_base\n        , typename T5 = empty_base\n\n        >\n    struct apply\n        : inherit< T1,T2,T3,T4,T5 >\n    {\n    };\n};\n\nBOOST_MPL_AUX_NA_SPEC_LAMBDA(5, inherit)\nBOOST_MPL_AUX_NA_SPEC_ARITY(5, inherit)\nBOOST_MPL_AUX_NA_SPEC_TEMPLATE_ARITY(5, 5, inherit)\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/iter_fold_if_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n// Copyright David Abrahams 2001-2002\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/iter_fold_if_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< typename Iterator, typename State >\nstruct iter_fold_if_null_step\n{\n    typedef State state;\n    typedef Iterator iterator;\n};\n\ntemplate< bool >\nstruct iter_fold_if_step_impl\n{\n    template<\n          typename Iterator\n        , typename State\n        , typename StateOp\n        , typename IteratorOp\n        >\n    struct result_\n    {\n        typedef typename apply2< StateOp,State,Iterator >::type state;\n        typedef typename IteratorOp::type iterator;\n    };\n};\n\ntemplate<>\nstruct iter_fold_if_step_impl<false>\n{\n    template<\n          typename Iterator\n        , typename State\n        , typename StateOp\n        , typename IteratorOp\n        >\n    struct result_\n    {\n        typedef State state;\n        typedef Iterator iterator;\n    };\n};\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename ForwardOp\n    , typename Predicate\n    >\nstruct iter_fold_if_forward_step\n{\n    typedef typename apply2< Predicate,State,Iterator >::type not_last;\n    typedef typename iter_fold_if_step_impl<\n          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value\n        >::template result_< Iterator,State,ForwardOp, mpl::next<Iterator> > impl_;\n\n    typedef typename impl_::state state;\n    typedef typename impl_::iterator iterator;\n};\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename BackwardOp\n    , typename Predicate\n    >\nstruct iter_fold_if_backward_step\n{\n    typedef typename apply2< Predicate,State,Iterator >::type not_last;\n    typedef typename iter_fold_if_step_impl<\n          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value\n        >::template result_< Iterator,State,BackwardOp, identity<Iterator> > impl_;\n\n    typedef typename impl_::state state;\n    typedef typename impl_::iterator iterator;\n};\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename ForwardOp\n    , typename ForwardPredicate\n    , typename BackwardOp\n    , typename BackwardPredicate\n    >\nstruct iter_fold_if_impl\n{\n private:\n    typedef iter_fold_if_null_step< Iterator,State > forward_step0;\n    typedef iter_fold_if_forward_step< typename forward_step0::iterator, typename forward_step0::state, ForwardOp, ForwardPredicate > forward_step1;\n    typedef iter_fold_if_forward_step< typename forward_step1::iterator, typename forward_step1::state, ForwardOp, ForwardPredicate > forward_step2;\n    typedef iter_fold_if_forward_step< typename forward_step2::iterator, typename forward_step2::state, ForwardOp, ForwardPredicate > forward_step3;\n    typedef iter_fold_if_forward_step< typename forward_step3::iterator, typename forward_step3::state, ForwardOp, ForwardPredicate > forward_step4;\n    \n\n    typedef typename if_<\n          typename forward_step4::not_last\n        , iter_fold_if_impl<\n              typename forward_step4::iterator\n            , typename forward_step4::state\n            , ForwardOp\n            , ForwardPredicate\n            , BackwardOp\n            , BackwardPredicate\n            >\n        , iter_fold_if_null_step<\n              typename forward_step4::iterator\n            , typename forward_step4::state\n            >\n        >::type backward_step4;\n\n    typedef iter_fold_if_backward_step< typename forward_step3::iterator, typename backward_step4::state, BackwardOp, BackwardPredicate > backward_step3;\n    typedef iter_fold_if_backward_step< typename forward_step2::iterator, typename backward_step3::state, BackwardOp, BackwardPredicate > backward_step2;\n    typedef iter_fold_if_backward_step< typename forward_step1::iterator, typename backward_step2::state, BackwardOp, BackwardPredicate > backward_step1;\n    typedef iter_fold_if_backward_step< typename forward_step0::iterator, typename backward_step1::state, BackwardOp, BackwardPredicate > backward_step0;\n    \n\n public:\n    typedef typename backward_step0::state state;\n    typedef typename backward_step4::iterator iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/iter_fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/iter_fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl;\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 0,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef state0 state;\n    typedef iter0 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 1,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    \n\n    typedef state1 state;\n    typedef iter1 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 2,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    \n\n    typedef state2 state;\n    typedef iter2 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 3,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp,state2,iter2 >::type state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    \n\n    typedef state3 state;\n    typedef iter3 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 4,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp,state2,iter2 >::type state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp,state3,iter3 >::type state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef state4 state;\n    typedef iter4 iterator;\n};\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl\n{\n    typedef iter_fold_impl<\n          4\n        , First\n        , Last\n        , State\n        , ForwardOp\n        > chunk_;\n\n    typedef iter_fold_impl<\n          ( (N - 4) < 0 ? 0 : N - 4 )\n        , typename chunk_::iterator\n        , Last\n        , typename chunk_::state\n        , ForwardOp\n        > res_;\n\n    typedef typename res_::state state;\n    typedef typename res_::iterator iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< -1,First,Last,State,ForwardOp >\n    : iter_fold_impl<\n          -1\n        , typename mpl::next<First>::type\n        , Last\n        , typename apply2< ForwardOp,State,First >::type\n        , ForwardOp\n        >\n{\n};\n\ntemplate<\n      typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< -1,Last,Last,State,ForwardOp >\n{\n    typedef State state;\n    typedef Last iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/lambda_no_ctps.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/lambda_no_ctps.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false\n    , bool C5 = false\n    >\nstruct lambda_or\n    : true_\n{\n};\n\ntemplate<>\nstruct lambda_or< false,false,false,false,false >\n    : false_\n{\n};\n\ntemplate< typename Arity > struct lambda_impl\n{\n    template< typename T, typename Tag, typename Protect > struct result_\n    {\n        typedef T type;\n        typedef is_placeholder<T> is_le;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<1> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef typename l1::is_le is_le1;\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value\n            > is_le;\n\n        typedef bind1<\n              typename F::rebind\n            , typename l1::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<2> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value\n            > is_le;\n\n        typedef bind2<\n              typename F::rebind\n            , typename l1::type, typename l2::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<3> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        typedef lambda< typename F::arg3, Tag, false_ > l3;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        typedef typename l3::is_le is_le3;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value\n            > is_le;\n\n        typedef bind3<\n              typename F::rebind\n            , typename l1::type, typename l2::type, typename l3::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<4> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        typedef lambda< typename F::arg3, Tag, false_ > l3;\n        typedef lambda< typename F::arg4, Tag, false_ > l4;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        typedef typename l3::is_le is_le3;\n        typedef typename l4::is_le is_le4;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value\n            > is_le;\n\n        typedef bind4<\n              typename F::rebind\n            , typename l1::type, typename l2::type, typename l3::type\n            , typename l4::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<5> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        typedef lambda< typename F::arg3, Tag, false_ > l3;\n        typedef lambda< typename F::arg4, Tag, false_ > l4;\n        typedef lambda< typename F::arg5, Tag, false_ > l5;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        typedef typename l3::is_le is_le3;\n        typedef typename l4::is_le is_le4;\n        typedef typename l5::is_le is_le5;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le5)::value\n            > is_le;\n\n        typedef bind5<\n              typename F::rebind\n            , typename l1::type, typename l2::type, typename l3::type\n            , typename l4::type, typename l5::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\n} // namespace aux\n\ntemplate<\n      typename T\n    , typename Tag\n    , typename Protect\n    >\nstruct lambda\n{\n    /// Metafunction forwarding confuses MSVC 6.x\n    typedef typename aux::template_arity<T>::type arity_;\n    typedef typename aux::lambda_impl<arity_>\n        ::template result_< T,Tag,Protect > l_;\n\n    typedef typename l_::type type;\n    typedef typename l_::is_le is_le;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(3, lambda, (T, Tag, Protect))\n};\n\nBOOST_MPL_AUX_NA_SPEC2(1, 3, lambda)\n\ntemplate<\n      typename T\n    >\nstruct is_lambda_expression\n    : lambda<T>::is_le\n{\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/less.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/less.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct less_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< less_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< less_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct less_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct less_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct less_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct less_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct less\n\n    : less_impl<\n          typename less_tag<N1>::type\n        , typename less_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, less)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct less_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n    {\n        BOOST_STATIC_CONSTANT(bool, value =\n             ( BOOST_MPL_AUX_VALUE_WKND(N2)::value >\n             BOOST_MPL_AUX_VALUE_WKND(N1)::value )\n            );\n        typedef bool_<value> type;\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/less_equal.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/less_equal.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct less_equal_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< less_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< less_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct less_equal_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct less_equal_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct less_equal_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct less_equal_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct less_equal\n\n    : less_equal_impl<\n          typename less_equal_tag<N1>::type\n        , typename less_equal_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, less_equal, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, less_equal)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct less_equal_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n    {\n        BOOST_STATIC_CONSTANT(bool, value =\n             ( BOOST_MPL_AUX_VALUE_WKND(N1)::value <=\n             BOOST_MPL_AUX_VALUE_WKND(N2)::value )\n            );\n        typedef bool_<value> type;\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/list.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/list.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct list;\n\ntemplate<\n     \n    >\nstruct list<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list0<  >\n{\n    typedef list0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct list<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list1<T0>\n{\n    typedef typename list1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct list<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list2< T0,T1 >\n{\n    typedef typename list2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct list<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list3< T0,T1,T2 >\n{\n    typedef typename list3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct list<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list4< T0,T1,T2,T3 >\n{\n    typedef typename list4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct list<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list5< T0,T1,T2,T3,T4 >\n{\n    typedef typename list5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename list6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename list7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename list8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename list9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename list10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename list11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : list12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename list12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : list13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename list13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : list14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename list14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : list15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename list15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : list16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename list16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : list17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename list17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : list18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename list18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : list19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename list19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct list\n    : list20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename list20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/list_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/list_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX\n    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX\n    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX\n    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX\n    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX\n    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX\n    , long C18 = LONG_MAX, long C19 = LONG_MAX\n    >\nstruct list_c;\n\ntemplate<\n      typename T\n    >\nstruct list_c<\n          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list0_c<T>\n{\n    typedef typename list0_c<T>::type type;\n};\n\ntemplate<\n      typename T, long C0\n    >\nstruct list_c<\n          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list1_c< T,C0 >\n{\n    typedef typename list1_c< T,C0 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1\n    >\nstruct list_c<\n          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list2_c< T,C0,C1 >\n{\n    typedef typename list2_c< T,C0,C1 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2\n    >\nstruct list_c<\n          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list3_c< T,C0,C1,C2 >\n{\n    typedef typename list3_c< T,C0,C1,C2 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list4_c< T,C0,C1,C2,C3 >\n{\n    typedef typename list4_c< T,C0,C1,C2,C3 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list5_c< T,C0,C1,C2,C3,C4 >\n{\n    typedef typename list5_c< T,C0,C1,C2,C3,C4 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list6_c< T,C0,C1,C2,C3,C4,C5 >\n{\n    typedef typename list6_c< T,C0,C1,C2,C3,C4,C5 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list7_c< T,C0,C1,C2,C3,C4,C5,C6 >\n{\n    typedef typename list7_c< T,C0,C1,C2,C3,C4,C5,C6 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX\n        >\n    : list8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >\n{\n    typedef typename list8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : list9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >\n{\n    typedef typename list9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : list10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >\n{\n    typedef typename list10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >\n{\n    typedef typename list11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >\n{\n    typedef typename list12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >\n{\n    typedef typename list13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list14_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        >\n{\n    typedef typename list14_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list15_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        >\n{\n    typedef typename list15_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list16_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15\n        >\n{\n    typedef typename list16_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list17_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16\n        >\n{\n    typedef typename list17_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, LONG_MAX, LONG_MAX\n        >\n    : list18_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17\n        >\n{\n    typedef typename list18_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, LONG_MAX\n        >\n    : list19_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18\n        >\n{\n    typedef typename list19_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n    >\nstruct list_c\n    : list20_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, C19\n        >\n{\n    typedef typename list20_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/map.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/map.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct map;\n\ntemplate<\n     \n    >\nstruct map<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map0<  >\n{\n    typedef map0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct map<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map1<T0>\n{\n    typedef typename map1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct map<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map2< T0,T1 >\n{\n    typedef typename map2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct map<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map3< T0,T1,T2 >\n{\n    typedef typename map3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct map<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map4< T0,T1,T2,T3 >\n{\n    typedef typename map4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct map<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map5< T0,T1,T2,T3,T4 >\n{\n    typedef typename map5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename map6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename map7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename map8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename map9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename map10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename map11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : map12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename map12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : map13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename map13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : map14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename map14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : map15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename map15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : map16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename map16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : map17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename map17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : map18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename map18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : map19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename map19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct map\n    : map20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename map20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/minus.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/minus.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct minus_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< minus_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< minus_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct minus_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct minus_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct minus_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct minus_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct minus\n    : minus< minus< minus< minus< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , minus\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct minus< N1,N2,N3,N4,na >\n\n    : minus< minus< minus< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , minus\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct minus< N1,N2,N3,na,na >\n\n    : minus< minus< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , minus\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct minus< N1,N2,na,na,na >\n    : minus_impl<\n          typename minus_tag<N1>::type\n        , typename minus_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , minus\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, minus)\n\n}}\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< typename T, T n1, T n2 >\nstruct minus_wknd\n{\n    BOOST_STATIC_CONSTANT(T, value  = (n1 - n2));\n    typedef integral_c< T,value > type;\n};\n\n}\n\ntemplate<>\nstruct minus_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n        : aux::minus_wknd<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , N1::value\n            , N2::value\n            >::type\n\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/modulus.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/modulus.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct modulus_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< modulus_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< modulus_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct modulus_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct modulus_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct modulus_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct modulus_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct modulus\n\n    : modulus_impl<\n          typename modulus_tag<N1>::type\n        , typename modulus_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, modulus, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, modulus)\n\n}}\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< typename T, T n1, T n2 >\nstruct modulus_wknd\n{\n    BOOST_STATIC_CONSTANT(T, value  = (n1 % n2));\n    typedef integral_c< T,value > type;\n};\n\n}\n\ntemplate<>\nstruct modulus_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n        : aux::modulus_wknd<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , N1::value\n            , N2::value\n            >::type\n\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/not_equal_to.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/not_equal_to.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct not_equal_to_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< not_equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< not_equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct not_equal_to_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct not_equal_to_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct not_equal_to_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct not_equal_to_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct not_equal_to\n\n    : not_equal_to_impl<\n          typename not_equal_to_tag<N1>::type\n        , typename not_equal_to_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, not_equal_to, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, not_equal_to)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct not_equal_to_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n    {\n        BOOST_STATIC_CONSTANT(bool, value =\n             ( BOOST_MPL_AUX_VALUE_WKND(N1)::value !=\n             BOOST_MPL_AUX_VALUE_WKND(N2)::value )\n            );\n        typedef bool_<value> type;\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/or.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/or.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate< bool C_, typename T1, typename T2, typename T3, typename T4 >\nstruct or_impl\n    : true_\n{\n};\n\ntemplate< typename T1, typename T2, typename T3, typename T4 >\nstruct or_impl< false,T1,T2,T3,T4 >\n    : or_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        , T2, T3, T4\n        , false_\n        >\n{\n};\n\ntemplate<>\nstruct or_impl<\n          false\n        , false_, false_, false_, false_\n        >\n    : false_\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    , typename T3 = false_, typename T4 = false_, typename T5 = false_\n    >\nstruct or_\n\n    : aux::or_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        , T2, T3, T4, T5\n        >\n\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , or_\n        , ( T1, T2, T3, T4, T5)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC2(\n      2\n    , 5\n    , or_\n    )\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/placeholders.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n// Copyright Peter Dimov 2001-2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/placeholders.hpp\" header\n// -- DO NOT modify by hand!\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg< -1 > _;\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_;\n}\n\n}}\n\n/// agurt, 17/mar/02: one more placeholder for the last 'apply#' \n/// specialization\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<1> _1;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_1)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_1;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<2> _2;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_2)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_2;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<3> _3;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_3)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_3;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<4> _4;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_4)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_4;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<5> _5;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_5)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_5;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<6> _6;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_6)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_6;\n}\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/plus.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/plus.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct plus_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< plus_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< plus_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct plus_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct plus_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct plus_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct plus_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct plus\n    : plus< plus< plus< plus< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , plus\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct plus< N1,N2,N3,N4,na >\n\n    : plus< plus< plus< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , plus\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct plus< N1,N2,N3,na,na >\n\n    : plus< plus< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , plus\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct plus< N1,N2,na,na,na >\n    : plus_impl<\n          typename plus_tag<N1>::type\n        , typename plus_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , plus\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, plus)\n\n}}\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< typename T, T n1, T n2 >\nstruct plus_wknd\n{\n    BOOST_STATIC_CONSTANT(T, value  = (n1 + n2));\n    typedef integral_c< T,value > type;\n};\n\n}\n\ntemplate<>\nstruct plus_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n        : aux::plus_wknd<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , N1::value\n            , N2::value\n            >::type\n\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/quote.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/quote.hpp\" header\n// -- DO NOT modify by hand!\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/reverse_fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/reverse_fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl;\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< 0,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef fwd_state0 bkwd_state0;\n    typedef bkwd_state0 state;\n    typedef iter0 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< 1,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    \n\n    typedef fwd_state1 bkwd_state1;\n    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n    typedef bkwd_state0 state;\n    typedef iter1 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< 2,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    \n\n    typedef fwd_state2 bkwd_state2;\n    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef iter2 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< 3,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    \n\n    typedef fwd_state3 bkwd_state3;\n    typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;\n    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef iter3 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< 4,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef fwd_state4 bkwd_state4;\n    typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;\n    typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;\n    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef iter4 iterator;\n};\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef reverse_fold_impl<\n          ( (N - 4) < 0 ? 0 : N - 4 )\n        , iter4\n        , Last\n        , fwd_state4\n        , BackwardOp\n        , ForwardOp\n        > nested_chunk;\n\n    typedef typename nested_chunk::state bkwd_state4;\n    typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;\n    typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;\n    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef typename nested_chunk::iterator iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< -1,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef reverse_fold_impl<\n          -1\n        , typename mpl::next<First>::type\n        , Last\n        , typename apply2<ForwardOp,State, typename deref<First>::type>::type\n        , BackwardOp\n        , ForwardOp\n        > nested_step;\n\n    typedef typename apply2<\n          BackwardOp\n        , typename nested_step::state\n        , typename deref<First>::type\n        >::type state;\n\n    typedef typename nested_step::iterator iterator;\n};\n\ntemplate<\n      typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< -1,Last,Last,State,BackwardOp,ForwardOp >\n{\n    typedef State state;\n    typedef Last iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/reverse_iter_fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/reverse_iter_fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl;\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< 0,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef fwd_state0 bkwd_state0;\n    typedef bkwd_state0 state;\n    typedef iter0 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< 1,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    \n\n    typedef fwd_state1 bkwd_state1;\n    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n    typedef bkwd_state0 state;\n    typedef iter1 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< 2,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    \n\n    typedef fwd_state2 bkwd_state2;\n    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef iter2 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< 3,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    \n\n    typedef fwd_state3 bkwd_state3;\n    typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;\n    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef iter3 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< 4,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef fwd_state4 bkwd_state4;\n    typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;\n    typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;\n    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef iter4 iterator;\n};\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef reverse_iter_fold_impl<\n          ( (N - 4) < 0 ? 0 : N - 4 )\n        , iter4\n        , Last\n        , fwd_state4\n        , BackwardOp\n        , ForwardOp\n        > nested_chunk;\n\n    typedef typename nested_chunk::state bkwd_state4;\n    typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;\n    typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;\n    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef typename nested_chunk::iterator iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< -1,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef reverse_iter_fold_impl<\n          -1\n        , typename mpl::next<First>::type\n        , Last\n        , typename apply2< ForwardOp,State,First >::type\n        , BackwardOp\n        , ForwardOp\n        > nested_step;\n\n    typedef typename apply2<\n          BackwardOp\n        , typename nested_step::state\n        , First\n        >::type state;\n\n    typedef typename nested_step::iterator iterator;\n};\n\ntemplate<\n      typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< -1,Last,Last,State,BackwardOp,ForwardOp >\n{\n    typedef State state;\n    typedef Last iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/set.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/set.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct set;\n\ntemplate<\n     \n    >\nstruct set<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set0<  >\n{\n    typedef set0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct set<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set1<T0>\n{\n    typedef typename set1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct set<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set2< T0,T1 >\n{\n    typedef typename set2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct set<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set3< T0,T1,T2 >\n{\n    typedef typename set3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct set<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set4< T0,T1,T2,T3 >\n{\n    typedef typename set4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct set<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set5< T0,T1,T2,T3,T4 >\n{\n    typedef typename set5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename set6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename set7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename set8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename set9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename set10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename set11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : set12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename set12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : set13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename set13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : set14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename set14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : set15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename set15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : set16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename set16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : set17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename set17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : set18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename set18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : set19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename set19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct set\n    : set20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename set20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/set_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/set_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX\n    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX\n    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX\n    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX\n    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX\n    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX\n    , long C18 = LONG_MAX, long C19 = LONG_MAX\n    >\nstruct set_c;\n\ntemplate<\n      typename T\n    >\nstruct set_c<\n          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set0_c<T>\n{\n    typedef typename set0_c<T>::type type;\n};\n\ntemplate<\n      typename T, long C0\n    >\nstruct set_c<\n          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set1_c< T,C0 >\n{\n    typedef typename set1_c< T,C0 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1\n    >\nstruct set_c<\n          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set2_c< T,C0,C1 >\n{\n    typedef typename set2_c< T,C0,C1 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2\n    >\nstruct set_c<\n          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set3_c< T,C0,C1,C2 >\n{\n    typedef typename set3_c< T,C0,C1,C2 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set4_c< T,C0,C1,C2,C3 >\n{\n    typedef typename set4_c< T,C0,C1,C2,C3 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set5_c< T,C0,C1,C2,C3,C4 >\n{\n    typedef typename set5_c< T,C0,C1,C2,C3,C4 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set6_c< T,C0,C1,C2,C3,C4,C5 >\n{\n    typedef typename set6_c< T,C0,C1,C2,C3,C4,C5 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set7_c< T,C0,C1,C2,C3,C4,C5,C6 >\n{\n    typedef typename set7_c< T,C0,C1,C2,C3,C4,C5,C6 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX\n        >\n    : set8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >\n{\n    typedef typename set8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : set9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >\n{\n    typedef typename set9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : set10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >\n{\n    typedef typename set10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >\n{\n    typedef typename set11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >\n{\n    typedef typename set12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >\n{\n    typedef typename set13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set14_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        >\n{\n    typedef typename set14_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set15_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        >\n{\n    typedef typename set15_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set16_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15\n        >\n{\n    typedef typename set16_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set17_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16\n        >\n{\n    typedef typename set17_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, LONG_MAX, LONG_MAX\n        >\n    : set18_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17\n        >\n{\n    typedef typename set18_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, LONG_MAX\n        >\n    : set19_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18\n        >\n{\n    typedef typename set19_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n    >\nstruct set_c\n    : set20_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, C19\n        >\n{\n    typedef typename set20_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/shift_left.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/shift_left.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct shift_left_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< shift_left_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< shift_left_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct shift_left_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct shift_left_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct shift_left_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct shift_left_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct shift_left\n\n    : shift_left_impl<\n          typename shift_left_tag<N1>::type\n        , typename shift_left_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_left, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, shift_left)\n\n}}\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< typename T, typename Shift, T n, Shift s >\nstruct shift_left_wknd\n{\n    BOOST_STATIC_CONSTANT(T, value  = (n << s));\n    typedef integral_c< T,value > type;\n};\n\n}\n\ntemplate<>\nstruct shift_left_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N, typename S > struct apply\n        : aux::shift_left_wknd<\n              typename N::value_type\n            , typename S::value_type\n            , N::value\n            , S::value\n            >::type\n\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/shift_right.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/shift_right.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct shift_right_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< shift_right_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< shift_right_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct shift_right_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct shift_right_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct shift_right_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct shift_right_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct shift_right\n\n    : shift_right_impl<\n          typename shift_right_tag<N1>::type\n        , typename shift_right_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2, shift_right, (N1, N2))\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, shift_right)\n\n}}\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< typename T, typename Shift, T n, Shift s >\nstruct shift_right_wknd\n{\n    BOOST_STATIC_CONSTANT(T, value  = (n >> s));\n    typedef integral_c< T,value > type;\n};\n\n}\n\ntemplate<>\nstruct shift_right_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N, typename S > struct apply\n        : aux::shift_right_wknd<\n              typename N::value_type\n            , typename S::value_type\n            , N::value\n            , S::value\n            >::type\n\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/template_arity.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/template_arity.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< bool >\nstruct template_arity_impl\n{\n    template< typename F > struct result_\n        : mpl::int_< -1 >\n    {\n    };\n};\n\ntemplate<>\nstruct template_arity_impl<true>\n{\n    template< typename F > struct result_\n        : F::arity\n    {\n    };\n};\n\ntemplate< typename F >\nstruct template_arity\n    : template_arity_impl< ::boost::mpl::aux::has_rebind<F>::value >\n        ::template result_<F>\n{\n};\n\n}}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/times.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/times.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct times_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< times_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< times_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct times_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct times_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct times_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct times_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct times\n    : times< times< times< times< N1,N2 >, N3>, N4>, N5>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          5\n        , times\n        , ( N1, N2, N3, N4, N5 )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct times< N1,N2,N3,N4,na >\n\n    : times< times< times< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , times\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct times< N1,N2,N3,na,na >\n\n    : times< times< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , times\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct times< N1,N2,na,na,na >\n    : times_impl<\n          typename times_tag<N1>::type\n        , typename times_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , times\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, times)\n\n}}\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate< typename T, T n1, T n2 >\nstruct times_wknd\n{\n    BOOST_STATIC_CONSTANT(T, value  = (n1 * n2));\n    typedef integral_c< T,value > type;\n};\n\n}\n\ntemplate<>\nstruct times_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n        : aux::times_wknd<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , N1::value\n            , N2::value\n            >::type\n\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/unpack_args.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2002-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/unpack_args.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate< int size, typename F, typename Args >\nstruct unpack_args_impl;\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 0,F,Args >\n    : apply0<\n          F\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 1,F,Args >\n    : apply1<\n          F\n        , typename at_c< Args,0 >::type\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 2,F,Args >\n    : apply2<\n          F\n        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 3,F,Args >\n    : apply3<\n          F\n        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n        , typename at_c< Args,2 >::type\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 4,F,Args >\n    : apply4<\n          F\n        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n        , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 5,F,Args >\n    : apply5<\n          F\n        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n        , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type\n        , typename at_c< Args,4 >::type\n        >\n{\n};\n\n}\n\ntemplate<\n      typename F\n    >\nstruct unpack_args\n{\n    template< typename Args > struct apply\n\n        : aux::unpack_args_impl< size<Args>::value,F, Args >\n\n    {\n    };\n};\n\nBOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(1, unpack_args)\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/vector.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/vector.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct vector;\n\ntemplate<\n     \n    >\nstruct vector<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector0<  >\n{\n    typedef vector0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct vector<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector1<T0>\n{\n    typedef typename vector1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct vector<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector2< T0,T1 >\n{\n    typedef typename vector2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct vector<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector3< T0,T1,T2 >\n{\n    typedef typename vector3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct vector<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector4< T0,T1,T2,T3 >\n{\n    typedef typename vector4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector5< T0,T1,T2,T3,T4 >\n{\n    typedef typename vector5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename vector6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename vector7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename vector8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : vector15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename vector15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : vector16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename vector16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : vector17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename vector17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : vector18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename vector18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : vector19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename vector19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct vector\n    : vector20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename vector20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/no_ttp/vector_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/vector_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX\n    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX\n    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX\n    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX\n    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX\n    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX\n    , long C18 = LONG_MAX, long C19 = LONG_MAX\n    >\nstruct vector_c;\n\ntemplate<\n      typename T\n    >\nstruct vector_c<\n          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector0_c<T>\n{\n    typedef typename vector0_c<T>::type type;\n};\n\ntemplate<\n      typename T, long C0\n    >\nstruct vector_c<\n          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector1_c< T, T(C0) >\n{\n    typedef typename vector1_c< T, T(C0) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1\n    >\nstruct vector_c<\n          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector2_c< T, T(C0), T(C1) >\n{\n    typedef typename vector2_c< T, T(C0), T(C1) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2\n    >\nstruct vector_c<\n          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector3_c< T, T(C0), T(C1), T(C2) >\n{\n    typedef typename vector3_c< T, T(C0), T(C1), T(C2) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector4_c< T, T(C0), T(C1), T(C2), T(C3) >\n{\n    typedef typename vector4_c< T, T(C0), T(C1), T(C2), T(C3) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector5_c< T, T(C0), T(C1), T(C2), T(C3), T(C4) >\n{\n    typedef typename vector5_c< T, T(C0), T(C1), T(C2), T(C3), T(C4) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector6_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5) >\n{\n    typedef typename vector6_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector7_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6) >\n{\n    typedef typename vector7_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX\n        >\n    : vector8_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7) >\n{\n    typedef typename vector8_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : vector9_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8) >\n{\n    typedef typename vector9_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : vector10_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9) >\n{\n    typedef typename vector10_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector11_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10) >\n{\n    typedef typename vector11_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector12_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11) >\n{\n    typedef typename vector12_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector13_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12) >\n{\n    typedef typename vector13_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector14_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13) >\n{\n    typedef typename vector14_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector15_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14) >\n{\n    typedef typename vector15_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector16_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15) >\n{\n    typedef typename vector16_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector17_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16) >\n{\n    typedef typename vector17_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, LONG_MAX, LONG_MAX\n        >\n    : vector18_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17) >\n{\n    typedef typename vector18_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, LONG_MAX\n        >\n    : vector19_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18) >\n{\n    typedef typename vector19_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18) >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n    >\nstruct vector_c\n    : vector20_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19) >\n{\n    typedef typename vector20_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19) >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/advance_backward.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/advance_backward.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< long N > struct advance_backward;\ntemplate<>\nstruct advance_backward<0>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef iter0 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<1>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef iter1 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<2>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef typename prior<iter1>::type iter2;\n        typedef iter2 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<3>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef typename prior<iter1>::type iter2;\n        typedef typename prior<iter2>::type iter3;\n        typedef iter3 type;\n    };\n};\n\ntemplate<>\nstruct advance_backward<4>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename prior<iter0>::type iter1;\n        typedef typename prior<iter1>::type iter2;\n        typedef typename prior<iter2>::type iter3;\n        typedef typename prior<iter3>::type iter4;\n        typedef iter4 type;\n    };\n};\n\ntemplate< long N >\nstruct advance_backward\n{\n    template< typename Iterator > struct apply\n    {\n        typedef typename apply_wrap1<\n              advance_backward<4>\n            , Iterator\n            >::type chunk_result_;\n\n        typedef typename apply_wrap1<\n              advance_backward<(\n                (N - 4) < 0\n                    ? 0\n                    : N - 4\n                    )>\n            , chunk_result_\n            >::type type;\n    };\n};\n\n}}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/advance_forward.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/advance_forward.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< long N > struct advance_forward;\ntemplate<>\nstruct advance_forward<0>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef iter0 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<1>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef iter1 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<2>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef typename next<iter1>::type iter2;\n        typedef iter2 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<3>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef typename next<iter1>::type iter2;\n        typedef typename next<iter2>::type iter3;\n        typedef iter3 type;\n    };\n};\n\ntemplate<>\nstruct advance_forward<4>\n{\n    template< typename Iterator > struct apply\n    {\n        typedef Iterator iter0;\n        typedef typename next<iter0>::type iter1;\n        typedef typename next<iter1>::type iter2;\n        typedef typename next<iter2>::type iter3;\n        typedef typename next<iter3>::type iter4;\n        typedef iter4 type;\n    };\n};\n\ntemplate< long N >\nstruct advance_forward\n{\n    template< typename Iterator > struct apply\n    {\n        typedef typename apply_wrap1<\n              advance_forward<4>\n            , Iterator\n            >::type chunk_result_;\n\n        typedef typename apply_wrap1<\n              advance_forward<(\n                (N - 4) < 0\n                    ? 0\n                    : N - 4\n                    )>\n            , chunk_result_\n            >::type type;\n    };\n};\n\n}}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/and.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/and.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate< bool C_, typename T1, typename T2, typename T3, typename T4 >\nstruct and_impl\n    : false_\n{\n};\n\ntemplate< typename T1, typename T2, typename T3, typename T4 >\nstruct and_impl< true,T1,T2,T3,T4 >\n    : and_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        , T2, T3, T4\n        , true_\n        >\n{\n};\n\ntemplate<>\nstruct and_impl<\n          true\n        , true_, true_, true_, true_\n        >\n    : true_\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    , typename T3 = true_, typename T4 = true_, typename T5 = true_\n    >\nstruct and_\n\n    : aux::and_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        , T2, T3, T4, T5\n        >\n\n{\n};\n\nBOOST_MPL_AUX_NA_SPEC2(\n      2\n    , 5\n    , and_\n    )\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/apply.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/apply.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F\n    >\nstruct apply0\n\n    : apply_wrap0<\n          typename lambda<F>::type\n       \n        >\n{\n};\n\ntemplate<\n      typename F\n    >\nstruct apply< F,na,na,na,na,na >\n    : apply0<F>\n{\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply1\n\n    : apply_wrap1<\n          typename lambda<F>::type\n        , T1\n        >\n{\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply< F,T1,na,na,na,na >\n    : apply1< F,T1 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply2\n\n    : apply_wrap2<\n          typename lambda<F>::type\n        , T1, T2\n        >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply< F,T1,T2,na,na,na >\n    : apply2< F,T1,T2 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply3\n\n    : apply_wrap3<\n          typename lambda<F>::type\n        , T1, T2, T3\n        >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply< F,T1,T2,T3,na,na >\n    : apply3< F,T1,T2,T3 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply4\n\n    : apply_wrap4<\n          typename lambda<F>::type\n        , T1, T2, T3, T4\n        >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply< F,T1,T2,T3,T4,na >\n    : apply4< F,T1,T2,T3,T4 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply5\n\n    : apply_wrap5<\n          typename lambda<F>::type\n        , T1, T2, T3, T4, T5\n        >\n{\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply\n    : apply5< F,T1,T2,T3,T4,T5 >\n{\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/apply_fwd.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/apply_fwd.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na\n    >\nstruct apply;\n\ntemplate<\n      typename F\n    >\nstruct apply0;\n\ntemplate<\n      typename F, typename T1\n    >\nstruct apply1;\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct apply2;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct apply3;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct apply4;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct apply5;\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/apply_wrap.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/apply_wrap.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F\n\n    , typename has_apply_ = typename aux::has_apply<F>::type\n\n    >\nstruct apply_wrap0\n\n    : F::template apply<  >\n{\n};\n\ntemplate< typename F >\nstruct apply_wrap0< F,true_ >\n    : F::apply\n{\n};\n\ntemplate<\n      typename F, typename T1\n\n    >\nstruct apply_wrap1\n\n    : F::template apply<T1>\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n\n    >\nstruct apply_wrap2\n\n    : F::template apply< T1,T2 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n\n    >\nstruct apply_wrap3\n\n    : F::template apply< T1,T2,T3 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n\n    >\nstruct apply_wrap4\n\n    : F::template apply< T1,T2,T3,T4 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n\n    >\nstruct apply_wrap5\n\n    : F::template apply< T1,T2,T3,T4,T5 >\n{\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/arg.hpp",
    "content": "\n// Copyright Peter Dimov 2001-2002\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/arg.hpp\" header\n// -- DO NOT modify by hand!\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntemplate<> struct arg< -1 >\n{\n    BOOST_STATIC_CONSTANT(int, value  = -1);\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U1 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<1>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 1);\n    typedef arg<2> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U1 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<2>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 2);\n    typedef arg<3> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U2 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<3>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 3);\n    typedef arg<4> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U3 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<4>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 4);\n    typedef arg<5> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U4 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\ntemplate<> struct arg<5>\n{\n    BOOST_STATIC_CONSTANT(int, value  = 5);\n    typedef arg<6> next;\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, tag)\n    BOOST_MPL_AUX_ARG_TYPEDEF(na, type)\n\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n        typedef U5 type;\n        BOOST_MPL_AUX_ASSERT_NOT_NA(type);\n    };\n};\n\nBOOST_MPL_AUX_NONTYPE_ARITY_SPEC(1,int, arg)\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/basic_bind.hpp",
    "content": "\n// Copyright Peter Dimov 2001\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/basic_bind.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      typename T, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg\n{\n    typedef T type;\n};\n\ntemplate<\n      int N, typename U1, typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 >\n{\n    typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg< bind< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5 >\n{\n    typedef bind< F,T1,T2,T3,T4,T5 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename F\n    >\nstruct bind0\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n\n     public:\n        typedef typename apply_wrap0<\n              f_\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg<\n      bind0<F>, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind0<F> f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(1, bind0)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)\n\ntemplate<\n      typename F\n    >\nstruct bind< F,na,na,na,na,na >\n    : bind0<F>\n{\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind1\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n\n     public:\n        typedef typename apply_wrap1<\n              f_\n            , typename t1::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename U1, typename U2, typename U3\n    , typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind1< F,T1 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind1< F,T1 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(2, bind1)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind< F,T1,na,na,na,na >\n    : bind1< F,T1 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind2\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n\n     public:\n        typedef typename apply_wrap2<\n              f_\n            , typename t1::type, typename t2::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename U1, typename U2\n    , typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind2< F,T1,T2 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind2< F,T1,T2 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(3, bind2)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind< F,T1,T2,na,na,na >\n    : bind2< F,T1,T2 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind3\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n\n     public:\n        typedef typename apply_wrap3<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename U1\n    , typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind3< F,T1,T2,T3 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(4, bind3)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind< F,T1,T2,T3,na,na >\n    : bind3< F,T1,T2,T3 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind4\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;\n\n     public:\n        typedef typename apply_wrap4<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename U1, typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind4< F,T1,T2,T3,T4 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(5, bind4)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind< F,T1,T2,T3,T4,na >\n    : bind4< F,T1,T2,T3,T4 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind5\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n        typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;\n        typedef aux::resolve_bind_arg< T5,U1,U2,U3,U4,U5 > t5;\n\n     public:\n        typedef typename apply_wrap5<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type, typename t5::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg<\n      bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind5< F,T1,T2,T3,T4,T5 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(6, bind5)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind\n    : bind5< F,T1,T2,T3,T4,T5 >\n{\n};\n\n/// if_/eval_if specializations\ntemplate< template< typename T1, typename T2, typename T3 > class F, typename Tag >\nstruct quote3;\n\ntemplate< typename T1, typename T2, typename T3 > struct if_;\n\ntemplate<\n      typename Tag, typename T1, typename T2, typename T3\n    >\nstruct bind3<\n      quote3< if_,Tag >\n    , T1, T2, T3\n    >\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef mpl::arg<1> n1;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n        typedef typename if_<\n              typename t1::type\n            , t2, t3\n            >::type f_;\n\n     public:\n        typedef typename f_::type type;\n    };\n};\n\ntemplate<\n      template< typename T1, typename T2, typename T3 > class F, typename Tag\n    >\nstruct quote3;\n\ntemplate< typename T1, typename T2, typename T3 > struct eval_if;\n\ntemplate<\n      typename Tag, typename T1, typename T2, typename T3\n    >\nstruct bind3<\n      quote3< eval_if,Tag >\n    , T1, T2, T3\n    >\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef mpl::arg<1> n1;\n        typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\n        typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\n        typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\n        typedef typename eval_if<\n              typename t1::type\n            , t2, t3\n            >::type f_;\n\n     public:\n        typedef typename f_::type type;\n    };\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/bind.hpp",
    "content": "\n// Copyright Peter Dimov 2001\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bind.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      typename T, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg\n{\n    typedef T type;\n};\n\ntemplate<\n      typename T\n    , typename Arg\n    >\nstruct replace_unnamed_arg\n{\n    typedef Arg next;\n    typedef T type;\n};\n\ntemplate<\n      typename Arg\n    >\nstruct replace_unnamed_arg< arg< -1 >, Arg >\n{\n    typedef typename Arg::next next;\n    typedef Arg type;\n};\n\ntemplate<\n      int N, typename U1, typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 >\n{\n    typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg< bind< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5 >\n{\n    typedef bind< F,T1,T2,T3,T4,T5 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      typename F\n    >\nstruct bind0\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n     public:\n        typedef typename apply_wrap0<\n              f_\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg<\n      bind0<F>, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind0<F> f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(1, bind0)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)\n\ntemplate<\n      typename F\n    >\nstruct bind< F,na,na,na,na,na >\n    : bind0<F>\n{\n};\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind1\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n     public:\n        typedef typename apply_wrap1<\n              f_\n            , typename t1::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename U1, typename U2, typename U3\n    , typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind1< F,T1 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind1< F,T1 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(2, bind1)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind< F,T1,na,na,na,na >\n    : bind1< F,T1 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind2\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n     public:\n        typedef typename apply_wrap2<\n              f_\n            , typename t1::type, typename t2::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename U1, typename U2\n    , typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind2< F,T1,T2 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind2< F,T1,T2 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(3, bind2)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind< F,T1,T2,na,na,na >\n    : bind2< F,T1,T2 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind3\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n     public:\n        typedef typename apply_wrap3<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename U1\n    , typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind3< F,T1,T2,T3 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(4, bind3)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind< F,T1,T2,T3,na,na >\n    : bind3< F,T1,T2,T3 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind4\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n        typedef aux::replace_unnamed_arg< T4,n4 > r4;\n        typedef typename r4::type a4;\n        typedef typename r4::next n5;\n        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;\n        ///\n     public:\n        typedef typename apply_wrap4<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename U1, typename U2, typename U3, typename U4, typename U5\n    >\nstruct resolve_bind_arg<\n      bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind4< F,T1,T2,T3,T4 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(5, bind4)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind< F,T1,T2,T3,T4,na >\n    : bind4< F,T1,T2,T3,T4 >\n{\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind5\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_;\n        ///\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n        typedef aux::replace_unnamed_arg< T4,n4 > r4;\n        typedef typename r4::type a4;\n        typedef typename r4::next n5;\n        typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4;\n        ///\n        typedef aux::replace_unnamed_arg< T5,n5 > r5;\n        typedef typename r5::type a5;\n        typedef typename r5::next n6;\n        typedef aux::resolve_bind_arg< a5,U1,U2,U3,U4,U5 > t5;\n        ///\n     public:\n        typedef typename apply_wrap5<\n              f_\n            , typename t1::type, typename t2::type, typename t3::type\n            , typename t4::type, typename t5::type\n            >::type type;\n\n    };\n};\n\nnamespace aux {\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename U1, typename U2, typename U3, typename U4\n    , typename U5\n    >\nstruct resolve_bind_arg<\n      bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5\n    >\n{\n    typedef bind5< F,T1,T2,T3,T4,T5 > f_;\n    typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\n};\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(6, bind5)\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind\n    : bind5< F,T1,T2,T3,T4,T5 >\n{\n};\n\n/// if_/eval_if specializations\ntemplate< template< typename T1, typename T2, typename T3 > class F, typename Tag >\nstruct quote3;\n\ntemplate< typename T1, typename T2, typename T3 > struct if_;\n\ntemplate<\n      typename Tag, typename T1, typename T2, typename T3\n    >\nstruct bind3<\n      quote3< if_,Tag >\n    , T1, T2, T3\n    >\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef mpl::arg<1> n1;\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n        typedef typename if_<\n              typename t1::type\n            , t2, t3\n            >::type f_;\n\n     public:\n        typedef typename f_::type type;\n    };\n};\n\ntemplate<\n      template< typename T1, typename T2, typename T3 > class F, typename Tag\n    >\nstruct quote3;\n\ntemplate< typename T1, typename T2, typename T3 > struct eval_if;\n\ntemplate<\n      typename Tag, typename T1, typename T2, typename T3\n    >\nstruct bind3<\n      quote3< eval_if,Tag >\n    , T1, T2, T3\n    >\n{\n    template<\n          typename U1 = na, typename U2 = na, typename U3 = na\n        , typename U4 = na, typename U5 = na\n        >\n    struct apply\n    {\n     private:\n        typedef mpl::arg<1> n1;\n        typedef aux::replace_unnamed_arg< T1,n1 > r1;\n        typedef typename r1::type a1;\n        typedef typename r1::next n2;\n        typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1;\n        ///\n        typedef aux::replace_unnamed_arg< T2,n2 > r2;\n        typedef typename r2::type a2;\n        typedef typename r2::next n3;\n        typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2;\n        ///\n        typedef aux::replace_unnamed_arg< T3,n3 > r3;\n        typedef typename r3::type a3;\n        typedef typename r3::next n4;\n        typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3;\n        ///\n        typedef typename eval_if<\n              typename t1::type\n            , t2, t3\n            >::type f_;\n\n     public:\n        typedef typename f_::type type;\n    };\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/bind_fwd.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bind_fwd.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename F, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na\n    >\nstruct bind;\n\ntemplate<\n      typename F\n    >\nstruct bind0;\n\ntemplate<\n      typename F, typename T1\n    >\nstruct bind1;\n\ntemplate<\n      typename F, typename T1, typename T2\n    >\nstruct bind2;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    >\nstruct bind3;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    >\nstruct bind4;\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct bind5;\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/bitand.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bitand.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct bitand_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< bitand_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< bitand_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct bitand_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitand_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitand_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct bitand_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct bitand_\n    : bitand_< bitand_< bitand_< bitand_< N1,N2 >, N3>, N4>, N5>\n{\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct bitand_< N1,N2,N3,N4,na >\n\n    : bitand_< bitand_< bitand_< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitand_\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct bitand_< N1,N2,N3,na,na >\n\n    : bitand_< bitand_< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitand_\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct bitand_< N1,N2,na,na,na >\n    : bitand_impl<\n          typename bitand_tag<N1>::type\n        , typename bitand_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitand_\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, bitand_)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct bitand_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  & BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/bitor.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bitor.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct bitor_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< bitor_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< bitor_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct bitor_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitor_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitor_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct bitor_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct bitor_\n    : bitor_< bitor_< bitor_< bitor_< N1,N2 >, N3>, N4>, N5>\n{\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct bitor_< N1,N2,N3,N4,na >\n\n    : bitor_< bitor_< bitor_< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitor_\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct bitor_< N1,N2,N3,na,na >\n\n    : bitor_< bitor_< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitor_\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct bitor_< N1,N2,na,na,na >\n    : bitor_impl<\n          typename bitor_tag<N1>::type\n        , typename bitor_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitor_\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, bitor_)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct bitor_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  | BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/bitxor.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/bitxor.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct bitxor_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< bitxor_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< bitxor_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct bitxor_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitxor_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct bitxor_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct bitxor_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct bitxor_\n    : bitxor_< bitxor_< bitxor_< bitxor_< N1,N2 >, N3>, N4>, N5>\n{\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct bitxor_< N1,N2,N3,N4,na >\n\n    : bitxor_< bitxor_< bitxor_< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitxor_\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct bitxor_< N1,N2,N3,na,na >\n\n    : bitxor_< bitxor_< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitxor_\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct bitxor_< N1,N2,na,na,na >\n    : bitxor_impl<\n          typename bitxor_tag<N1>::type\n        , typename bitxor_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , bitxor_\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, bitxor_)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct bitxor_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  ^ BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/deque.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/deque.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct deque;\n\ntemplate<\n     \n    >\nstruct deque<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector0<  >\n{\n    typedef vector0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct deque<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector1<T0>\n{\n    typedef typename vector1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct deque<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector2< T0,T1 >\n{\n    typedef typename vector2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct deque<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector3< T0,T1,T2 >\n{\n    typedef typename vector3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct deque<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector4< T0,T1,T2,T3 >\n{\n    typedef typename vector4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector5< T0,T1,T2,T3,T4 >\n{\n    typedef typename vector5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename vector6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename vector7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename vector8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : vector15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename vector15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : vector16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename vector16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : vector17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename vector17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : vector18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename vector18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct deque<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : vector19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename vector19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct deque\n    : vector20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename vector20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/divides.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/divides.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct divides_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< divides_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< divides_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct divides_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct divides_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct divides_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct divides_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct divides\n    : divides< divides< divides< divides< N1,N2 >, N3>, N4>, N5>\n{\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct divides< N1,N2,N3,N4,na >\n\n    : divides< divides< divides< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , divides\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct divides< N1,N2,N3,na,na >\n\n    : divides< divides< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , divides\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct divides< N1,N2,na,na,na >\n    : divides_impl<\n          typename divides_tag<N1>::type\n        , typename divides_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , divides\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, divides)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct divides_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  / BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/equal_to.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/equal_to.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct equal_to_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct equal_to_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct equal_to_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct equal_to_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct equal_to_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct equal_to\n\n    : equal_to_impl<\n          typename equal_to_tag<N1>::type\n        , typename equal_to_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, equal_to)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct equal_to_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value  == BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl;\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 0,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef state0 state;\n    typedef iter0 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 1,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    \n\n    typedef state1 state;\n    typedef iter1 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 2,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    \n\n    typedef state2 state;\n    typedef iter2 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 3,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    \n\n    typedef state3 state;\n    typedef iter3 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< 4,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp, state0, typename deref<iter0>::type >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, state1, typename deref<iter1>::type >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp, state2, typename deref<iter2>::type >::type state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp, state3, typename deref<iter3>::type >::type state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef state4 state;\n    typedef iter4 iterator;\n};\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl\n{\n    typedef fold_impl<\n          4\n        , First\n        , Last\n        , State\n        , ForwardOp\n        > chunk_;\n\n    typedef fold_impl<\n          ( (N - 4) < 0 ? 0 : N - 4 )\n        , typename chunk_::iterator\n        , Last\n        , typename chunk_::state\n        , ForwardOp\n        > res_;\n\n    typedef typename res_::state state;\n    typedef typename res_::iterator iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< -1,First,Last,State,ForwardOp >\n    : fold_impl<\n          -1\n        , typename mpl::next<First>::type\n        , Last\n        , typename apply2<ForwardOp,State, typename deref<First>::type>::type\n        , ForwardOp\n        >\n{\n};\n\ntemplate<\n      typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct fold_impl< -1,Last,Last,State,ForwardOp >\n{\n    typedef State state;\n    typedef Last iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/full_lambda.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/full_lambda.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false\n    , bool C5 = false\n    >\nstruct lambda_or\n    : true_\n{\n};\n\ntemplate<>\nstruct lambda_or< false,false,false,false,false >\n    : false_\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename T\n    , typename Tag\n   \n    >\nstruct lambda\n{\n    typedef false_ is_le;\n    typedef T result_;\n    typedef T type;\n};\n\ntemplate<\n      typename T\n    >\nstruct is_lambda_expression\n    : lambda<T>::is_le\n{\n};\n\ntemplate< int N, typename Tag >\nstruct lambda< arg<N>, Tag >\n{\n    typedef true_ is_le;\n    typedef mpl::arg<N> result_; // qualified for the sake of MIPSpro 7.41\n    typedef mpl::protect<result_> type;\n};\n\ntemplate<\n      typename F\n    , typename Tag\n    >\nstruct lambda<\n          bind0<F>\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind0<\n          F\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1 > class F\n    , typename L1\n    >\nstruct le_result1\n{\n    typedef F<\n          typename L1::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1 > class F\n    , typename L1\n    >\nstruct le_result1< true_,Tag,F,L1 >\n{\n    typedef bind1<\n          quote1< F,Tag >\n        , typename L1::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1 > class F\n    , typename T1\n    , typename Tag\n    >\nstruct lambda<\n          F<T1>\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef typename l1::is_le is_le1;\n    typedef typename aux::lambda_or<\n          is_le1::value\n        >::type is_le;\n\n    typedef aux::le_result1<\n          is_le, Tag, F, l1\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1\n    , typename Tag\n    >\nstruct lambda<\n          bind1< F,T1 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind1<\n          F\n        , T1\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2 > class F\n    , typename L1, typename L2\n    >\nstruct le_result2\n{\n    typedef F<\n          typename L1::type, typename L2::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2 > class F\n    , typename L1, typename L2\n    >\nstruct le_result2< true_,Tag,F,L1,L2 >\n{\n    typedef bind2<\n          quote2< F,Tag >\n        , typename L1::result_, typename L2::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1, typename P2 > class F\n    , typename T1, typename T2\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2 >\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value\n        >::type is_le;\n\n    typedef aux::le_result2<\n          is_le, Tag, F, l1, l2\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2\n    , typename Tag\n    >\nstruct lambda<\n          bind2< F,T1,T2 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind2<\n          F\n        , T1, T2\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2, typename P3 > class F\n    , typename L1, typename L2, typename L3\n    >\nstruct le_result3\n{\n    typedef F<\n          typename L1::type, typename L2::type, typename L3::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2, typename P3 > class F\n    , typename L1, typename L2, typename L3\n    >\nstruct le_result3< true_,Tag,F,L1,L2,L3 >\n{\n    typedef bind3<\n          quote3< F,Tag >\n        , typename L1::result_, typename L2::result_, typename L3::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1, typename P2, typename P3 > class F\n    , typename T1, typename T2, typename T3\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2,T3 >\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    typedef lambda< T3,Tag > l3;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    typedef typename l3::is_le is_le3;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value, is_le3::value\n        >::type is_le;\n\n    typedef aux::le_result3<\n          is_le, Tag, F, l1, l2, l3\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3\n    , typename Tag\n    >\nstruct lambda<\n          bind3< F,T1,T2,T3 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind3<\n          F\n        , T1, T2, T3\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename L1, typename L2, typename L3, typename L4\n    >\nstruct le_result4\n{\n    typedef F<\n          typename L1::type, typename L2::type, typename L3::type\n        , typename L4::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename L1, typename L2, typename L3, typename L4\n    >\nstruct le_result4< true_,Tag,F,L1,L2,L3,L4 >\n{\n    typedef bind4<\n          quote4< F,Tag >\n        , typename L1::result_, typename L2::result_, typename L3::result_\n        , typename L4::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename T1, typename T2, typename T3, typename T4\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2,T3,T4 >\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    typedef lambda< T3,Tag > l3;\n    typedef lambda< T4,Tag > l4;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    typedef typename l3::is_le is_le3;\n    typedef typename l4::is_le is_le4;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value, is_le3::value, is_le4::value\n        >::type is_le;\n\n    typedef aux::le_result4<\n          is_le, Tag, F, l1, l2, l3, l4\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename Tag\n    >\nstruct lambda<\n          bind4< F,T1,T2,T3,T4 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind4<\n          F\n        , T1, T2, T3, T4\n        > result_;\n\n    typedef result_ type;\n};\n\nnamespace aux {\n\ntemplate<\n      typename IsLE, typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F\n    , typename L1, typename L2, typename L3, typename L4, typename L5\n    >\nstruct le_result5\n{\n    typedef F<\n          typename L1::type, typename L2::type, typename L3::type\n        , typename L4::type, typename L5::type\n        > result_;\n\n    typedef result_ type;\n};\n\ntemplate<\n      typename Tag\n    , template< typename P1, typename P2, typename P3, typename P4, typename P5 > class F\n    , typename L1, typename L2, typename L3, typename L4, typename L5\n    >\nstruct le_result5< true_,Tag,F,L1,L2,L3,L4,L5 >\n{\n    typedef bind5<\n          quote5< F,Tag >\n        , typename L1::result_, typename L2::result_, typename L3::result_\n        , typename L4::result_, typename L5::result_\n        > result_;\n\n    typedef mpl::protect<result_> type;\n};\n\n} // namespace aux\n\ntemplate<\n      template<\n          typename P1, typename P2, typename P3, typename P4\n        , typename P5\n        >\n      class F\n    , typename T1, typename T2, typename T3, typename T4, typename T5\n    , typename Tag\n    >\nstruct lambda<\n          F< T1,T2,T3,T4,T5 >\n        , Tag\n       \n        >\n{\n    typedef lambda< T1,Tag > l1;\n    typedef lambda< T2,Tag > l2;\n    typedef lambda< T3,Tag > l3;\n    typedef lambda< T4,Tag > l4;\n    typedef lambda< T5,Tag > l5;\n    \n    typedef typename l1::is_le is_le1;\n    typedef typename l2::is_le is_le2;\n    typedef typename l3::is_le is_le3;\n    typedef typename l4::is_le is_le4;\n    typedef typename l5::is_le is_le5;\n    \n\n    typedef typename aux::lambda_or<\n          is_le1::value, is_le2::value, is_le3::value, is_le4::value\n        , is_le5::value\n        >::type is_le;\n\n    typedef aux::le_result5<\n          is_le, Tag, F, l1, l2, l3, l4, l5\n        > le_result_;\n\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    , typename Tag\n    >\nstruct lambda<\n          bind5< F,T1,T2,T3,T4,T5 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind5<\n          F\n        , T1, T2, T3, T4, T5\n        > result_;\n\n    typedef result_ type;\n};\n\n/// special case for 'protect'\ntemplate< typename T, typename Tag >\nstruct lambda< mpl::protect<T>, Tag >\n{\n    typedef false_ is_le;\n    typedef mpl::protect<T> result_;\n    typedef result_ type;\n};\n\n/// specializations for the main 'bind' form\n\ntemplate<\n      typename F, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    , typename Tag\n    >\nstruct lambda<\n          bind< F,T1,T2,T3,T4,T5 >\n        , Tag\n       \n        >\n{\n    typedef false_ is_le;\n    typedef bind< F,T1,T2,T3,T4,T5 > result_;\n    typedef result_ type;\n};\n\n/// workaround for MWCW 8.3+/EDG < 303, leads to ambiguity on Digital Mars\n\ntemplate<\n      typename F, typename Tag1, typename Tag2\n    >\nstruct lambda<\n          lambda< F,Tag1 >\n        , Tag2\n        >\n{\n    typedef lambda< F,Tag2 > l1;\n    typedef lambda< Tag1,Tag2 > l2;\n    typedef typename l1::is_le is_le;\n    typedef aux::le_result2<is_le, Tag2, mpl::lambda, l1, l2> le_result_;\n    typedef typename le_result_::result_ result_;\n    typedef typename le_result_::type type;\n};\n\nBOOST_MPL_AUX_NA_SPEC(2, lambda)\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/greater.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/greater.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct greater_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< greater_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< greater_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct greater_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct greater_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct greater_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct greater_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct greater\n\n    : greater_impl<\n          typename greater_tag<N1>::type\n        , typename greater_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, greater)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct greater_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value > BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/greater_equal.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/greater_equal.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct greater_equal_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< greater_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< greater_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct greater_equal_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct greater_equal_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct greater_equal_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct greater_equal_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct greater_equal\n\n    : greater_equal_impl<\n          typename greater_equal_tag<N1>::type\n        , typename greater_equal_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, greater_equal)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct greater_equal_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value >= BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/inherit.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/inherit.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    >\nstruct inherit2\n    : T1, T2\n{\n    typedef inherit2 type;\n};\n\ntemplate< typename T1 >\nstruct inherit2< T1,empty_base >\n{\n    typedef T1 type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (T1, empty_base))\n};\n\ntemplate< typename T2 >\nstruct inherit2< empty_base,T2 >\n{\n    typedef T2 type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base, T2))\n};\n\ntemplate<>\nstruct inherit2< empty_base,empty_base >\n{\n    typedef empty_base type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base, empty_base))\n};\n\nBOOST_MPL_AUX_NA_SPEC(2, inherit2)\n\ntemplate<\n      typename T1 = na, typename T2 = na, typename T3 = na\n    >\nstruct inherit3\n    : inherit2<\n          typename inherit2<\n              T1, T2\n            >::type\n        , T3\n        >\n{\n};\n\nBOOST_MPL_AUX_NA_SPEC(3, inherit3)\n\ntemplate<\n      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na\n    >\nstruct inherit4\n    : inherit2<\n          typename inherit3<\n              T1, T2, T3\n            >::type\n        , T4\n        >\n{\n};\n\nBOOST_MPL_AUX_NA_SPEC(4, inherit4)\n\ntemplate<\n      typename T1 = na, typename T2 = na, typename T3 = na, typename T4 = na\n    , typename T5 = na\n    >\nstruct inherit5\n    : inherit2<\n          typename inherit4<\n              T1, T2, T3, T4\n            >::type\n        , T5\n        >\n{\n};\n\nBOOST_MPL_AUX_NA_SPEC(5, inherit5)\n\n/// primary template\n\ntemplate<\n      typename T1 = empty_base, typename T2 = empty_base\n    , typename T3 = empty_base, typename T4 = empty_base\n    , typename T5 = empty_base\n    >\nstruct inherit\n    : inherit5< T1,T2,T3,T4,T5 >\n{\n};\n\ntemplate<>\nstruct inherit< na,na,na,na,na >\n{\n    template<\n\n          typename T1 = empty_base, typename T2 = empty_base\n        , typename T3 = empty_base, typename T4 = empty_base\n        , typename T5 = empty_base\n\n        >\n    struct apply\n        : inherit< T1,T2,T3,T4,T5 >\n    {\n    };\n};\n\nBOOST_MPL_AUX_NA_SPEC_LAMBDA(5, inherit)\nBOOST_MPL_AUX_NA_SPEC_ARITY(5, inherit)\nBOOST_MPL_AUX_NA_SPEC_TEMPLATE_ARITY(5, 5, inherit)\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/iter_fold_if_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n// Copyright David Abrahams 2001-2002\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/iter_fold_if_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< typename Iterator, typename State >\nstruct iter_fold_if_null_step\n{\n    typedef State state;\n    typedef Iterator iterator;\n};\n\ntemplate< bool >\nstruct iter_fold_if_step_impl\n{\n    template<\n          typename Iterator\n        , typename State\n        , typename StateOp\n        , typename IteratorOp\n        >\n    struct result_\n    {\n        typedef typename apply2< StateOp,State,Iterator >::type state;\n        typedef typename IteratorOp::type iterator;\n    };\n};\n\ntemplate<>\nstruct iter_fold_if_step_impl<false>\n{\n    template<\n          typename Iterator\n        , typename State\n        , typename StateOp\n        , typename IteratorOp\n        >\n    struct result_\n    {\n        typedef State state;\n        typedef Iterator iterator;\n    };\n};\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename ForwardOp\n    , typename Predicate\n    >\nstruct iter_fold_if_forward_step\n{\n    typedef typename apply2< Predicate,State,Iterator >::type not_last;\n    typedef typename iter_fold_if_step_impl<\n          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value\n        >::template result_< Iterator,State,ForwardOp, mpl::next<Iterator> > impl_;\n\n    typedef typename impl_::state state;\n    typedef typename impl_::iterator iterator;\n};\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename BackwardOp\n    , typename Predicate\n    >\nstruct iter_fold_if_backward_step\n{\n    typedef typename apply2< Predicate,State,Iterator >::type not_last;\n    typedef typename iter_fold_if_step_impl<\n          BOOST_MPL_AUX_MSVC_VALUE_WKND(not_last)::value\n        >::template result_< Iterator,State,BackwardOp, identity<Iterator> > impl_;\n\n    typedef typename impl_::state state;\n    typedef typename impl_::iterator iterator;\n};\n\ntemplate<\n      typename Iterator\n    , typename State\n    , typename ForwardOp\n    , typename ForwardPredicate\n    , typename BackwardOp\n    , typename BackwardPredicate\n    >\nstruct iter_fold_if_impl\n{\n private:\n    typedef iter_fold_if_null_step< Iterator,State > forward_step0;\n    typedef iter_fold_if_forward_step< typename forward_step0::iterator, typename forward_step0::state, ForwardOp, ForwardPredicate > forward_step1;\n    typedef iter_fold_if_forward_step< typename forward_step1::iterator, typename forward_step1::state, ForwardOp, ForwardPredicate > forward_step2;\n    typedef iter_fold_if_forward_step< typename forward_step2::iterator, typename forward_step2::state, ForwardOp, ForwardPredicate > forward_step3;\n    typedef iter_fold_if_forward_step< typename forward_step3::iterator, typename forward_step3::state, ForwardOp, ForwardPredicate > forward_step4;\n    \n\n    typedef typename if_<\n          typename forward_step4::not_last\n        , iter_fold_if_impl<\n              typename forward_step4::iterator\n            , typename forward_step4::state\n            , ForwardOp\n            , ForwardPredicate\n            , BackwardOp\n            , BackwardPredicate\n            >\n        , iter_fold_if_null_step<\n              typename forward_step4::iterator\n            , typename forward_step4::state\n            >\n        >::type backward_step4;\n\n    typedef iter_fold_if_backward_step< typename forward_step3::iterator, typename backward_step4::state, BackwardOp, BackwardPredicate > backward_step3;\n    typedef iter_fold_if_backward_step< typename forward_step2::iterator, typename backward_step3::state, BackwardOp, BackwardPredicate > backward_step2;\n    typedef iter_fold_if_backward_step< typename forward_step1::iterator, typename backward_step2::state, BackwardOp, BackwardPredicate > backward_step1;\n    typedef iter_fold_if_backward_step< typename forward_step0::iterator, typename backward_step1::state, BackwardOp, BackwardPredicate > backward_step0;\n    \n\n public:\n    typedef typename backward_step0::state state;\n    typedef typename backward_step4::iterator iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/iter_fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/iter_fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl;\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 0,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef state0 state;\n    typedef iter0 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 1,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    \n\n    typedef state1 state;\n    typedef iter1 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 2,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    \n\n    typedef state2 state;\n    typedef iter2 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 3,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp,state2,iter2 >::type state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    \n\n    typedef state3 state;\n    typedef iter3 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< 4,First,Last,State,ForwardOp >\n{\n    typedef First iter0;\n    typedef State state0;\n    typedef typename apply2< ForwardOp,state0,iter0 >::type state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,state1,iter1 >::type state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp,state2,iter2 >::type state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp,state3,iter3 >::type state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef state4 state;\n    typedef iter4 iterator;\n};\n\ntemplate<\n      int N\n    , typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl\n{\n    typedef iter_fold_impl<\n          4\n        , First\n        , Last\n        , State\n        , ForwardOp\n        > chunk_;\n\n    typedef iter_fold_impl<\n          ( (N - 4) < 0 ? 0 : N - 4 )\n        , typename chunk_::iterator\n        , Last\n        , typename chunk_::state\n        , ForwardOp\n        > res_;\n\n    typedef typename res_::state state;\n    typedef typename res_::iterator iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< -1,First,Last,State,ForwardOp >\n    : iter_fold_impl<\n          -1\n        , typename mpl::next<First>::type\n        , Last\n        , typename apply2< ForwardOp,State,First >::type\n        , ForwardOp\n        >\n{\n};\n\ntemplate<\n      typename Last\n    , typename State\n    , typename ForwardOp\n    >\nstruct iter_fold_impl< -1,Last,Last,State,ForwardOp >\n{\n    typedef State state;\n    typedef Last iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/lambda_no_ctps.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/lambda_no_ctps.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate<\n      bool C1 = false, bool C2 = false, bool C3 = false, bool C4 = false\n    , bool C5 = false\n    >\nstruct lambda_or\n    : true_\n{\n};\n\ntemplate<>\nstruct lambda_or< false,false,false,false,false >\n    : false_\n{\n};\n\ntemplate< typename Arity > struct lambda_impl\n{\n    template< typename T, typename Tag, typename Protect > struct result_\n    {\n        typedef T type;\n        typedef is_placeholder<T> is_le;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<1> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef typename l1::is_le is_le1;\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value\n            > is_le;\n\n        typedef bind1<\n              typename F::rebind\n            , typename l1::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<2> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value\n            > is_le;\n\n        typedef bind2<\n              typename F::rebind\n            , typename l1::type, typename l2::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<3> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        typedef lambda< typename F::arg3, Tag, false_ > l3;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        typedef typename l3::is_le is_le3;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value\n            > is_le;\n\n        typedef bind3<\n              typename F::rebind\n            , typename l1::type, typename l2::type, typename l3::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<4> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        typedef lambda< typename F::arg3, Tag, false_ > l3;\n        typedef lambda< typename F::arg4, Tag, false_ > l4;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        typedef typename l3::is_le is_le3;\n        typedef typename l4::is_le is_le4;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value\n            > is_le;\n\n        typedef bind4<\n              typename F::rebind\n            , typename l1::type, typename l2::type, typename l3::type\n            , typename l4::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\ntemplate<> struct lambda_impl< int_<5> >\n{\n    template< typename F, typename Tag, typename Protect > struct result_\n    {\n        typedef lambda< typename F::arg1, Tag, false_ > l1;\n        typedef lambda< typename F::arg2, Tag, false_ > l2;\n        typedef lambda< typename F::arg3, Tag, false_ > l3;\n        typedef lambda< typename F::arg4, Tag, false_ > l4;\n        typedef lambda< typename F::arg5, Tag, false_ > l5;\n        \n        typedef typename l1::is_le is_le1;\n        typedef typename l2::is_le is_le2;\n        typedef typename l3::is_le is_le3;\n        typedef typename l4::is_le is_le4;\n        typedef typename l5::is_le is_le5;\n        \n\n        typedef aux::lambda_or<\n              BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le1)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le2)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le3)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le4)::value, BOOST_MPL_AUX_MSVC_VALUE_WKND(is_le5)::value\n            > is_le;\n\n        typedef bind5<\n              typename F::rebind\n            , typename l1::type, typename l2::type, typename l3::type\n            , typename l4::type, typename l5::type\n            > bind_;\n\n        typedef typename if_<\n              is_le\n            , if_< Protect, mpl::protect<bind_>, bind_ >\n            , identity<F>\n            >::type type_;\n\n        typedef typename type_::type type;\n    };\n};\n\n} // namespace aux\n\ntemplate<\n      typename T\n    , typename Tag\n    , typename Protect\n    >\nstruct lambda\n{\n    /// Metafunction forwarding confuses MSVC 6.x\n    typedef typename aux::template_arity<T>::type arity_;\n    typedef typename aux::lambda_impl<arity_>\n        ::template result_< T,Tag,Protect > l_;\n\n    typedef typename l_::type type;\n    typedef typename l_::is_le is_le;\n};\n\nBOOST_MPL_AUX_NA_SPEC2(1, 3, lambda)\n\ntemplate<\n      typename T\n    >\nstruct is_lambda_expression\n    : lambda<T>::is_le\n{\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/less.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/less.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct less_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< less_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< less_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct less_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct less_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct less_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct less_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct less\n\n    : less_impl<\n          typename less_tag<N1>::type\n        , typename less_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, less)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct less_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N2)::value > BOOST_MPL_AUX_VALUE_WKND(N1)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/less_equal.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/less_equal.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct less_equal_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< less_equal_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< less_equal_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct less_equal_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct less_equal_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct less_equal_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct less_equal_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct less_equal\n\n    : less_equal_impl<\n          typename less_equal_tag<N1>::type\n        , typename less_equal_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, less_equal)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct less_equal_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value <= BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/list.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/list.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct list;\n\ntemplate<\n     \n    >\nstruct list<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list0<  >\n{\n    typedef list0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct list<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list1<T0>\n{\n    typedef typename list1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct list<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list2< T0,T1 >\n{\n    typedef typename list2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct list<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list3< T0,T1,T2 >\n{\n    typedef typename list3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct list<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list4< T0,T1,T2,T3 >\n{\n    typedef typename list4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct list<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list5< T0,T1,T2,T3,T4 >\n{\n    typedef typename list5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename list6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename list7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename list8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename list9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename list10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : list11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename list11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : list12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename list12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : list13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename list13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : list14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename list14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : list15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename list15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : list16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename list16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : list17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename list17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : list18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename list18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct list<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : list19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename list19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct list\n    : list20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename list20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/list_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/list_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX\n    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX\n    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX\n    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX\n    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX\n    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX\n    , long C18 = LONG_MAX, long C19 = LONG_MAX\n    >\nstruct list_c;\n\ntemplate<\n      typename T\n    >\nstruct list_c<\n          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list0_c<T>\n{\n    typedef typename list0_c<T>::type type;\n};\n\ntemplate<\n      typename T, long C0\n    >\nstruct list_c<\n          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list1_c< T,C0 >\n{\n    typedef typename list1_c< T,C0 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1\n    >\nstruct list_c<\n          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list2_c< T,C0,C1 >\n{\n    typedef typename list2_c< T,C0,C1 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2\n    >\nstruct list_c<\n          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list3_c< T,C0,C1,C2 >\n{\n    typedef typename list3_c< T,C0,C1,C2 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list4_c< T,C0,C1,C2,C3 >\n{\n    typedef typename list4_c< T,C0,C1,C2,C3 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list5_c< T,C0,C1,C2,C3,C4 >\n{\n    typedef typename list5_c< T,C0,C1,C2,C3,C4 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list6_c< T,C0,C1,C2,C3,C4,C5 >\n{\n    typedef typename list6_c< T,C0,C1,C2,C3,C4,C5 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list7_c< T,C0,C1,C2,C3,C4,C5,C6 >\n{\n    typedef typename list7_c< T,C0,C1,C2,C3,C4,C5,C6 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX\n        >\n    : list8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >\n{\n    typedef typename list8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : list9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >\n{\n    typedef typename list9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : list10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >\n{\n    typedef typename list10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >\n{\n    typedef typename list11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >\n{\n    typedef typename list12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >\n{\n    typedef typename list13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list14_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        >\n{\n    typedef typename list14_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list15_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        >\n{\n    typedef typename list15_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list16_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15\n        >\n{\n    typedef typename list16_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : list17_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16\n        >\n{\n    typedef typename list17_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, LONG_MAX, LONG_MAX\n        >\n    : list18_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17\n        >\n{\n    typedef typename list18_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18\n    >\nstruct list_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, LONG_MAX\n        >\n    : list19_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18\n        >\n{\n    typedef typename list19_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n    >\nstruct list_c\n    : list20_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, C19\n        >\n{\n    typedef typename list20_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/map.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/map.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct map;\n\ntemplate<\n     \n    >\nstruct map<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map0<  >\n{\n    typedef map0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct map<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map1<T0>\n{\n    typedef typename map1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct map<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map2< T0,T1 >\n{\n    typedef typename map2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct map<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map3< T0,T1,T2 >\n{\n    typedef typename map3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct map<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map4< T0,T1,T2,T3 >\n{\n    typedef typename map4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct map<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map5< T0,T1,T2,T3,T4 >\n{\n    typedef typename map5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename map6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename map7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename map8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename map9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename map10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : map11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename map11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : map12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename map12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : map13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename map13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : map14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename map14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : map15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename map15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : map16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename map16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : map17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename map17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : map18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename map18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct map<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : map19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename map19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct map\n    : map20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename map20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/minus.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/minus.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct minus_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< minus_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< minus_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct minus_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct minus_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct minus_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct minus_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct minus\n    : minus< minus< minus< minus< N1,N2 >, N3>, N4>, N5>\n{\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct minus< N1,N2,N3,N4,na >\n\n    : minus< minus< minus< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , minus\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct minus< N1,N2,N3,na,na >\n\n    : minus< minus< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , minus\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct minus< N1,N2,na,na,na >\n    : minus_impl<\n          typename minus_tag<N1>::type\n        , typename minus_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , minus\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, minus)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct minus_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  - BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/modulus.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/modulus.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct modulus_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< modulus_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< modulus_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct modulus_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct modulus_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct modulus_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct modulus_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct modulus\n\n    : modulus_impl<\n          typename modulus_tag<N1>::type\n        , typename modulus_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, modulus)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct modulus_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  % BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/not_equal_to.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/not_equal_to.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct not_equal_to_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< not_equal_to_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< not_equal_to_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct not_equal_to_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct not_equal_to_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct not_equal_to_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct not_equal_to_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct not_equal_to\n\n    : not_equal_to_impl<\n          typename not_equal_to_tag<N1>::type\n        , typename not_equal_to_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, not_equal_to)\n\n}}\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct not_equal_to_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : bool_< ( BOOST_MPL_AUX_VALUE_WKND(N1)::value != BOOST_MPL_AUX_VALUE_WKND(N2)::value ) >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/or.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/or.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate< bool C_, typename T1, typename T2, typename T3, typename T4 >\nstruct or_impl\n    : true_\n{\n};\n\ntemplate< typename T1, typename T2, typename T3, typename T4 >\nstruct or_impl< false,T1,T2,T3,T4 >\n    : or_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        , T2, T3, T4\n        , false_\n        >\n{\n};\n\ntemplate<>\nstruct or_impl<\n          false\n        , false_, false_, false_, false_\n        >\n    : false_\n{\n};\n\n} // namespace aux\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    , typename T3 = false_, typename T4 = false_, typename T5 = false_\n    >\nstruct or_\n\n    : aux::or_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T1)::value\n        , T2, T3, T4, T5\n        >\n\n{\n};\n\nBOOST_MPL_AUX_NA_SPEC2(\n      2\n    , 5\n    , or_\n    )\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/placeholders.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n// Copyright Peter Dimov 2001-2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/placeholders.hpp\" header\n// -- DO NOT modify by hand!\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg< -1 > _;\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_;\n}\n\n}}\n\n/// agurt, 17/mar/02: one more placeholder for the last 'apply#' \n/// specialization\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<1> _1;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_1)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_1;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<2> _2;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_2)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_2;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<3> _3;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_3)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_3;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<4> _4;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_4)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_4;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<5> _5;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_5)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_5;\n}\n\n}}\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<6> _6;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_6)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_6;\n}\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/plus.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/plus.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct plus_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< plus_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< plus_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct plus_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct plus_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct plus_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct plus_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct plus\n    : plus< plus< plus< plus< N1,N2 >, N3>, N4>, N5>\n{\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct plus< N1,N2,N3,N4,na >\n\n    : plus< plus< plus< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , plus\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct plus< N1,N2,N3,na,na >\n\n    : plus< plus< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , plus\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct plus< N1,N2,na,na,na >\n    : plus_impl<\n          typename plus_tag<N1>::type\n        , typename plus_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , plus\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, plus)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct plus_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  + BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/quote.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/quote.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate< typename T, bool has_type_ >\nstruct quote_impl\n    : T\n{\n};\n\ntemplate< typename T >\nstruct quote_impl< T,false >\n{\n    typedef T type;\n};\n\ntemplate<\n      template< typename P1 > class F\n    , typename Tag = void_\n    >\nstruct quote1\n{\n    template< typename U1 > struct apply\n\n        : quote_impl<\n              F<U1>\n            , aux::has_type< F<U1> >::value\n            >\n\n    {\n    };\n};\n\ntemplate<\n      template< typename P1, typename P2 > class F\n    , typename Tag = void_\n    >\nstruct quote2\n{\n    template< typename U1, typename U2 > struct apply\n\n        : quote_impl<\n              F< U1,U2 >\n            , aux::has_type< F< U1,U2 > >::value\n            >\n\n    {\n    };\n};\n\ntemplate<\n      template< typename P1, typename P2, typename P3 > class F\n    , typename Tag = void_\n    >\nstruct quote3\n{\n    template< typename U1, typename U2, typename U3 > struct apply\n\n        : quote_impl<\n              F< U1,U2,U3 >\n            , aux::has_type< F< U1,U2,U3 > >::value\n            >\n\n    {\n    };\n};\n\ntemplate<\n      template< typename P1, typename P2, typename P3, typename P4 > class F\n    , typename Tag = void_\n    >\nstruct quote4\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4\n        >\n    struct apply\n\n        : quote_impl<\n              F< U1,U2,U3,U4 >\n            , aux::has_type< F< U1,U2,U3,U4 > >::value\n            >\n\n    {\n    };\n};\n\ntemplate<\n      template<\n          typename P1, typename P2, typename P3, typename P4\n        , typename P5\n        >\n      class F\n    , typename Tag = void_\n    >\nstruct quote5\n{\n    template<\n          typename U1, typename U2, typename U3, typename U4\n        , typename U5\n        >\n    struct apply\n\n        : quote_impl<\n              F< U1,U2,U3,U4,U5 >\n            , aux::has_type< F< U1,U2,U3,U4,U5 > >::value\n            >\n\n    {\n    };\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/reverse_fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/reverse_fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl;\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< 0,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef fwd_state0 bkwd_state0;\n    typedef bkwd_state0 state;\n    typedef iter0 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< 1,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    \n\n    typedef fwd_state1 bkwd_state1;\n    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n    typedef bkwd_state0 state;\n    typedef iter1 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< 2,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    \n\n    typedef fwd_state2 bkwd_state2;\n    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef iter2 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< 3,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    \n\n    typedef fwd_state3 bkwd_state3;\n    typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;\n    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef iter3 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< 4,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef fwd_state4 bkwd_state4;\n    typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;\n    typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;\n    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef iter4 iterator;\n};\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp, fwd_state0, typename deref<iter0>::type >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp, fwd_state1, typename deref<iter1>::type >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp, fwd_state2, typename deref<iter2>::type >::type fwd_state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp, fwd_state3, typename deref<iter3>::type >::type fwd_state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef reverse_fold_impl<\n          ( (N - 4) < 0 ? 0 : N - 4 )\n        , iter4\n        , Last\n        , fwd_state4\n        , BackwardOp\n        , ForwardOp\n        > nested_chunk;\n\n    typedef typename nested_chunk::state bkwd_state4;\n    typedef typename apply2< BackwardOp, bkwd_state4, typename deref<iter3>::type >::type bkwd_state3;\n    typedef typename apply2< BackwardOp, bkwd_state3, typename deref<iter2>::type >::type bkwd_state2;\n    typedef typename apply2< BackwardOp, bkwd_state2, typename deref<iter1>::type >::type bkwd_state1;\n    typedef typename apply2< BackwardOp, bkwd_state1, typename deref<iter0>::type >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef typename nested_chunk::iterator iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< -1,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef reverse_fold_impl<\n          -1\n        , typename mpl::next<First>::type\n        , Last\n        , typename apply2<ForwardOp,State, typename deref<First>::type>::type\n        , BackwardOp\n        , ForwardOp\n        > nested_step;\n\n    typedef typename apply2<\n          BackwardOp\n        , typename nested_step::state\n        , typename deref<First>::type\n        >::type state;\n\n    typedef typename nested_step::iterator iterator;\n};\n\ntemplate<\n      typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_fold_impl< -1,Last,Last,State,BackwardOp,ForwardOp >\n{\n    typedef State state;\n    typedef Last iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/reverse_iter_fold_impl.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/reverse_iter_fold_impl.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl;\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< 0,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef fwd_state0 bkwd_state0;\n    typedef bkwd_state0 state;\n    typedef iter0 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< 1,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    \n\n    typedef fwd_state1 bkwd_state1;\n    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n    typedef bkwd_state0 state;\n    typedef iter1 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< 2,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    \n\n    typedef fwd_state2 bkwd_state2;\n    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef iter2 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< 3,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    \n\n    typedef fwd_state3 bkwd_state3;\n    typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;\n    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef iter3 iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< 4,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef fwd_state4 bkwd_state4;\n    typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;\n    typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;\n    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef iter4 iterator;\n};\n\ntemplate<\n      long N\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n    typedef typename apply2< ForwardOp,fwd_state0,iter0 >::type fwd_state1;\n    typedef typename mpl::next<iter0>::type iter1;\n    typedef typename apply2< ForwardOp,fwd_state1,iter1 >::type fwd_state2;\n    typedef typename mpl::next<iter1>::type iter2;\n    typedef typename apply2< ForwardOp,fwd_state2,iter2 >::type fwd_state3;\n    typedef typename mpl::next<iter2>::type iter3;\n    typedef typename apply2< ForwardOp,fwd_state3,iter3 >::type fwd_state4;\n    typedef typename mpl::next<iter3>::type iter4;\n    \n\n    typedef reverse_iter_fold_impl<\n          ( (N - 4) < 0 ? 0 : N - 4 )\n        , iter4\n        , Last\n        , fwd_state4\n        , BackwardOp\n        , ForwardOp\n        > nested_chunk;\n\n    typedef typename nested_chunk::state bkwd_state4;\n    typedef typename apply2< BackwardOp,bkwd_state4,iter3 >::type bkwd_state3;\n    typedef typename apply2< BackwardOp,bkwd_state3,iter2 >::type bkwd_state2;\n    typedef typename apply2< BackwardOp,bkwd_state2,iter1 >::type bkwd_state1;\n    typedef typename apply2< BackwardOp,bkwd_state1,iter0 >::type bkwd_state0;\n    \n\n    typedef bkwd_state0 state;\n    typedef typename nested_chunk::iterator iterator;\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< -1,First,Last,State,BackwardOp,ForwardOp >\n{\n    typedef reverse_iter_fold_impl<\n          -1\n        , typename mpl::next<First>::type\n        , Last\n        , typename apply2< ForwardOp,State,First >::type\n        , BackwardOp\n        , ForwardOp\n        > nested_step;\n\n    typedef typename apply2<\n          BackwardOp\n        , typename nested_step::state\n        , First\n        >::type state;\n\n    typedef typename nested_step::iterator iterator;\n};\n\ntemplate<\n      typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct reverse_iter_fold_impl< -1,Last,Last,State,BackwardOp,ForwardOp >\n{\n    typedef State state;\n    typedef Last iterator;\n};\n\n}}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/set.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/set.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct set;\n\ntemplate<\n     \n    >\nstruct set<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set0<  >\n{\n    typedef set0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct set<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set1<T0>\n{\n    typedef typename set1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct set<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set2< T0,T1 >\n{\n    typedef typename set2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct set<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set3< T0,T1,T2 >\n{\n    typedef typename set3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct set<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set4< T0,T1,T2,T3 >\n{\n    typedef typename set4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct set<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set5< T0,T1,T2,T3,T4 >\n{\n    typedef typename set5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename set6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename set7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename set8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename set9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename set10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : set11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename set11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : set12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename set12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : set13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename set13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : set14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename set14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : set15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename set15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : set16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename set16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : set17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename set17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : set18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename set18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct set<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : set19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename set19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct set\n    : set20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename set20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/set_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/set_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX\n    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX\n    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX\n    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX\n    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX\n    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX\n    , long C18 = LONG_MAX, long C19 = LONG_MAX\n    >\nstruct set_c;\n\ntemplate<\n      typename T\n    >\nstruct set_c<\n          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set0_c<T>\n{\n    typedef typename set0_c<T>::type type;\n};\n\ntemplate<\n      typename T, long C0\n    >\nstruct set_c<\n          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set1_c< T,C0 >\n{\n    typedef typename set1_c< T,C0 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1\n    >\nstruct set_c<\n          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set2_c< T,C0,C1 >\n{\n    typedef typename set2_c< T,C0,C1 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2\n    >\nstruct set_c<\n          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set3_c< T,C0,C1,C2 >\n{\n    typedef typename set3_c< T,C0,C1,C2 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set4_c< T,C0,C1,C2,C3 >\n{\n    typedef typename set4_c< T,C0,C1,C2,C3 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set5_c< T,C0,C1,C2,C3,C4 >\n{\n    typedef typename set5_c< T,C0,C1,C2,C3,C4 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set6_c< T,C0,C1,C2,C3,C4,C5 >\n{\n    typedef typename set6_c< T,C0,C1,C2,C3,C4,C5 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set7_c< T,C0,C1,C2,C3,C4,C5,C6 >\n{\n    typedef typename set7_c< T,C0,C1,C2,C3,C4,C5,C6 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX\n        >\n    : set8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >\n{\n    typedef typename set8_c< T,C0,C1,C2,C3,C4,C5,C6,C7 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : set9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >\n{\n    typedef typename set9_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : set10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >\n{\n    typedef typename set10_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >\n{\n    typedef typename set11_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >\n{\n    typedef typename set12_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >\n{\n    typedef typename set13_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set14_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        >\n{\n    typedef typename set14_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set15_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        >\n{\n    typedef typename set15_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set16_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15\n        >\n{\n    typedef typename set16_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : set17_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16\n        >\n{\n    typedef typename set17_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, LONG_MAX, LONG_MAX\n        >\n    : set18_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17\n        >\n{\n    typedef typename set18_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18\n    >\nstruct set_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, LONG_MAX\n        >\n    : set19_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18\n        >\n{\n    typedef typename set19_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n    >\nstruct set_c\n    : set20_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, C19\n        >\n{\n    typedef typename set20_c< T,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/shift_left.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/shift_left.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct shift_left_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< shift_left_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< shift_left_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct shift_left_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct shift_left_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct shift_left_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct shift_left_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct shift_left\n\n    : shift_left_impl<\n          typename shift_left_tag<N1>::type\n        , typename shift_left_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, shift_left)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct shift_left_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N, typename S > struct apply\n\n        : integral_c<\n              typename N::value_type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N)::value\n                  << BOOST_MPL_AUX_VALUE_WKND(S)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/shift_right.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Jaap Suter 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/shift_right.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct shift_right_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< shift_right_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< shift_right_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct shift_right_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct shift_right_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct shift_right_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct shift_right_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    >\nstruct shift_right\n\n    : shift_right_impl<\n          typename shift_right_tag<N1>::type\n        , typename shift_right_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 2, shift_right)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct shift_right_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N, typename S > struct apply\n\n        : integral_c<\n              typename N::value_type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N)::value\n                  >> BOOST_MPL_AUX_VALUE_WKND(S)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/template_arity.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/aux_/template_arity.hpp\" header\n// -- DO NOT modify by hand!\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/times.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/times.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Tag1\n    , typename Tag2\n    >\nstruct times_impl\n    : if_c<\n          ( BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag1)\n              > BOOST_MPL_AUX_NESTED_VALUE_WKND(int, Tag2)\n            )\n\n        , aux::cast2nd_impl< times_impl< Tag1,Tag1 >,Tag1, Tag2 >\n        , aux::cast1st_impl< times_impl< Tag2,Tag2 >,Tag1, Tag2 >\n        >::type\n{\n};\n\n/// for Digital Mars C++/compilers with no CTPS/TTP support\ntemplate<> struct times_impl< na,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct times_impl< na,Tag >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename Tag > struct times_impl< Tag,na >\n{\n    template< typename U1, typename U2 > struct apply\n    {\n        typedef apply type;\n        BOOST_STATIC_CONSTANT(int, value  = 0);\n    };\n};\n\ntemplate< typename T > struct times_tag\n{\n    typedef typename T::tag type;\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(N1)\n    , typename BOOST_MPL_AUX_NA_PARAM(N2)\n    , typename N3 = na, typename N4 = na, typename N5 = na\n    >\nstruct times\n    : times< times< times< times< N1,N2 >, N3>, N4>, N5>\n{\n};\n\ntemplate<\n      typename N1, typename N2, typename N3, typename N4\n    >\nstruct times< N1,N2,N3,N4,na >\n\n    : times< times< times< N1,N2 >, N3>, N4>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , times\n        , ( N1, N2, N3, N4, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2, typename N3\n    >\nstruct times< N1,N2,N3,na,na >\n\n    : times< times< N1,N2 >, N3>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , times\n        , ( N1, N2, N3, na, na )\n        )\n};\n\ntemplate<\n      typename N1, typename N2\n    >\nstruct times< N1,N2,na,na,na >\n    : times_impl<\n          typename times_tag<N1>::type\n        , typename times_tag<N2>::type\n        >::template apply< N1,N2 >::type\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(\n          5\n        , times\n        , ( N1, N2, na, na, na )\n        )\n\n};\n\nBOOST_MPL_AUX_NA_SPEC2(2, 5, times)\n\n}}\n\nnamespace boost { namespace mpl {\ntemplate<>\nstruct times_impl< integral_c_tag,integral_c_tag >\n{\n    template< typename N1, typename N2 > struct apply\n\n        : integral_c<\n              typename aux::largest_int<\n                  typename N1::value_type\n                , typename N2::value_type\n                >::type\n            , ( BOOST_MPL_AUX_VALUE_WKND(N1)::value\n                  * BOOST_MPL_AUX_VALUE_WKND(N2)::value\n                )\n            >\n    {\n    };\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/unpack_args.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2002-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/unpack_args.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate< int size, typename F, typename Args >\nstruct unpack_args_impl;\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 0,F,Args >\n    : apply0<\n          F\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 1,F,Args >\n    : apply1<\n          F\n        , typename at_c< Args,0 >::type\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 2,F,Args >\n    : apply2<\n          F\n        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 3,F,Args >\n    : apply3<\n          F\n        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n        , typename at_c< Args,2 >::type\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 4,F,Args >\n    : apply4<\n          F\n        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n        , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type\n        >\n{\n};\n\ntemplate< typename F, typename Args >\nstruct unpack_args_impl< 5,F,Args >\n    : apply5<\n          F\n        , typename at_c< Args,0 >::type, typename at_c< Args,1 >::type\n        , typename at_c< Args,2 >::type, typename at_c< Args,3 >::type\n        , typename at_c< Args,4 >::type\n        >\n{\n};\n\n}\n\ntemplate<\n      typename F\n    >\nstruct unpack_args\n{\n    template< typename Args > struct apply\n\n        : aux::unpack_args_impl< size<Args>::value,F, Args >\n\n    {\n    };\n};\n\nBOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(1, unpack_args)\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/vector.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/vector.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na\n    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na\n    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na\n    , typename T12 = na, typename T13 = na, typename T14 = na\n    , typename T15 = na, typename T16 = na, typename T17 = na\n    , typename T18 = na, typename T19 = na\n    >\nstruct vector;\n\ntemplate<\n     \n    >\nstruct vector<\n          na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector0<  >\n{\n    typedef vector0<  >::type type;\n};\n\ntemplate<\n      typename T0\n    >\nstruct vector<\n          T0, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector1<T0>\n{\n    typedef typename vector1<T0>::type type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct vector<\n          T0, T1, na, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector2< T0,T1 >\n{\n    typedef typename vector2< T0,T1 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct vector<\n          T0, T1, T2, na, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector3< T0,T1,T2 >\n{\n    typedef typename vector3< T0,T1,T2 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct vector<\n          T0, T1, T2, T3, na, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector4< T0,T1,T2,T3 >\n{\n    typedef typename vector4< T0,T1,T2,T3 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, na, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector5< T0,T1,T2,T3,T4 >\n{\n    typedef typename vector5< T0,T1,T2,T3,T4 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, na, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector6< T0,T1,T2,T3,T4,T5 >\n{\n    typedef typename vector6< T0,T1,T2,T3,T4,T5 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, na, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector7< T0,T1,T2,T3,T4,T5,T6 >\n{\n    typedef typename vector7< T0,T1,T2,T3,T4,T5,T6 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, na, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector8< T0,T1,T2,T3,T4,T5,T6,T7 >\n{\n    typedef typename vector8< T0,T1,T2,T3,T4,T5,T6,T7 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, na, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >\n{\n    typedef typename vector9< T0,T1,T2,T3,T4,T5,T6,T7,T8 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, na, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n{\n    typedef typename vector10< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, na, na, na, na, na, na\n        , na, na, na\n        >\n    : vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n{\n    typedef typename vector11< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, na, na, na, na\n        , na, na, na, na\n        >\n    : vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n{\n    typedef typename vector12< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, na, na, na\n        , na, na, na, na\n        >\n    : vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n{\n    typedef typename vector13< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, na, na\n        , na, na, na, na\n        >\n    : vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n{\n    typedef typename vector14< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, na\n        , na, na, na, na\n        >\n    : vector15<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        >\n{\n    typedef typename vector15< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, na, na, na, na\n        >\n    : vector16<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15\n        >\n{\n    typedef typename vector16< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, na, na, na\n        >\n    : vector17<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16\n        >\n{\n    typedef typename vector17< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, na, na\n        >\n    : vector18<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17\n        >\n{\n    typedef typename vector18< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >::type type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct vector<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, na\n        >\n    : vector19<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18\n        >\n{\n    typedef typename vector19< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct vector\n    : vector20<\n          T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14\n        , T15, T16, T17, T18, T19\n        >\n{\n    typedef typename vector20< T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessed/plain/vector_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/vector_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T, long C0 = LONG_MAX, long C1 = LONG_MAX, long C2 = LONG_MAX\n    , long C3 = LONG_MAX, long C4 = LONG_MAX, long C5 = LONG_MAX\n    , long C6 = LONG_MAX, long C7 = LONG_MAX, long C8 = LONG_MAX\n    , long C9 = LONG_MAX, long C10 = LONG_MAX, long C11 = LONG_MAX\n    , long C12 = LONG_MAX, long C13 = LONG_MAX, long C14 = LONG_MAX\n    , long C15 = LONG_MAX, long C16 = LONG_MAX, long C17 = LONG_MAX\n    , long C18 = LONG_MAX, long C19 = LONG_MAX\n    >\nstruct vector_c;\n\ntemplate<\n      typename T\n    >\nstruct vector_c<\n          T, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector0_c<T>\n{\n    typedef typename vector0_c<T>::type type;\n};\n\ntemplate<\n      typename T, long C0\n    >\nstruct vector_c<\n          T, C0, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector1_c< T, T(C0) >\n{\n    typedef typename vector1_c< T, T(C0) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1\n    >\nstruct vector_c<\n          T, C0, C1, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector2_c< T, T(C0), T(C1) >\n{\n    typedef typename vector2_c< T, T(C0), T(C1) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2\n    >\nstruct vector_c<\n          T, C0, C1, C2, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector3_c< T, T(C0), T(C1), T(C2) >\n{\n    typedef typename vector3_c< T, T(C0), T(C1), T(C2) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector4_c< T, T(C0), T(C1), T(C2), T(C3) >\n{\n    typedef typename vector4_c< T, T(C0), T(C1), T(C2), T(C3) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector5_c< T, T(C0), T(C1), T(C2), T(C3), T(C4) >\n{\n    typedef typename vector5_c< T, T(C0), T(C1), T(C2), T(C3), T(C4) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector6_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5) >\n{\n    typedef typename vector6_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector7_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6) >\n{\n    typedef typename vector7_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX\n        >\n    : vector8_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7) >\n{\n    typedef typename vector8_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : vector9_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8) >\n{\n    typedef typename vector9_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        , LONG_MAX\n        >\n    : vector10_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9) >\n{\n    typedef typename vector10_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, LONG_MAX, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector11_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10) >\n{\n    typedef typename vector11_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector12_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11) >\n{\n    typedef typename vector12_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, LONG_MAX\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector13_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12) >\n{\n    typedef typename vector13_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector14_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13) >\n{\n    typedef typename vector14_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector15_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14) >\n{\n    typedef typename vector15_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, LONG_MAX, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector16_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15) >\n{\n    typedef typename vector16_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, LONG_MAX, LONG_MAX, LONG_MAX\n        >\n    : vector17_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16) >\n{\n    typedef typename vector17_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, LONG_MAX, LONG_MAX\n        >\n    : vector18_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17) >\n{\n    typedef typename vector18_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17) >::type type;\n};\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18\n    >\nstruct vector_c<\n          T, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14\n        , C15, C16, C17, C18, LONG_MAX\n        >\n    : vector19_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18) >\n{\n    typedef typename vector19_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18) >::type type;\n};\n\n/// primary template (not a specialization!)\n\ntemplate<\n      typename T, long C0, long C1, long C2, long C3, long C4, long C5\n    , long C6, long C7, long C8, long C9, long C10, long C11, long C12\n    , long C13, long C14, long C15, long C16, long C17, long C18, long C19\n    >\nstruct vector_c\n    : vector20_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19) >\n{\n    typedef typename vector20_c< T, T(C0), T(C1), T(C2), T(C3), T(C4), T(C5), T(C6), T(C7), T(C8), T(C9), T(C10), T(C11), T(C12), T(C13), T(C14), T(C15), T(C16), T(C17), T(C18), T(C19) >::type type;\n};\n\n}}\n\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessor/add.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_PREPROCESSOR_ADD_HPP_INCLUDED\n#define BOOST_MPL_AUX_PREPROCESSOR_ADD_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2002-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/preprocessor.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_OWN_PP_PRIMITIVES)\n\n#   include <boost/mpl/aux_/preprocessor/tuple.hpp>\n\n#if defined(BOOST_MPL_CFG_BROKEN_PP_MACRO_EXPANSION)\n#   include <boost/preprocessor/cat.hpp>\n\n#   define BOOST_MPL_PP_ADD(i,j) \\\n    BOOST_MPL_PP_ADD_DELAY(i,j) \\\n    /**/\n\n#   define BOOST_MPL_PP_ADD_DELAY(i,j) \\\n    BOOST_PP_CAT(BOOST_MPL_PP_TUPLE_11_ELEM_##i,BOOST_MPL_PP_ADD_##j) \\\n    /**/\n#else\n#   define BOOST_MPL_PP_ADD(i,j) \\\n    BOOST_MPL_PP_ADD_DELAY(i,j) \\\n    /**/\n\n#   define BOOST_MPL_PP_ADD_DELAY(i,j) \\\n    BOOST_MPL_PP_TUPLE_11_ELEM_##i BOOST_MPL_PP_ADD_##j \\\n    /**/\n#endif\n\n#   define BOOST_MPL_PP_ADD_0 (0,1,2,3,4,5,6,7,8,9,10)\n#   define BOOST_MPL_PP_ADD_1 (1,2,3,4,5,6,7,8,9,10,0)\n#   define BOOST_MPL_PP_ADD_2 (2,3,4,5,6,7,8,9,10,0,0)\n#   define BOOST_MPL_PP_ADD_3 (3,4,5,6,7,8,9,10,0,0,0)\n#   define BOOST_MPL_PP_ADD_4 (4,5,6,7,8,9,10,0,0,0,0)\n#   define BOOST_MPL_PP_ADD_5 (5,6,7,8,9,10,0,0,0,0,0)\n#   define BOOST_MPL_PP_ADD_6 (6,7,8,9,10,0,0,0,0,0,0)\n#   define BOOST_MPL_PP_ADD_7 (7,8,9,10,0,0,0,0,0,0,0)\n#   define BOOST_MPL_PP_ADD_8 (8,9,10,0,0,0,0,0,0,0,0)\n#   define BOOST_MPL_PP_ADD_9 (9,10,0,0,0,0,0,0,0,0,0)\n#   define BOOST_MPL_PP_ADD_10 (10,0,0,0,0,0,0,0,0,0,0)\n\n#else\n\n#   include <boost/preprocessor/arithmetic/add.hpp>\n\n#   define BOOST_MPL_PP_ADD(i,j) \\\n    BOOST_PP_ADD(i,j) \\\n    /**/\n    \n#endif \n\n#endif // BOOST_MPL_AUX_PREPROCESSOR_ADD_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessor/def_params_tail.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_PREPROCESSOR_DEF_PARAMS_TAIL_HPP_INCLUDED\n#define BOOST_MPL_AUX_PREPROCESSOR_DEF_PARAMS_TAIL_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/limits/arity.hpp>\n#include <boost/mpl/aux_/config/dtp.hpp>\n#include <boost/mpl/aux_/config/preprocessor.hpp>\n\n#include <boost/preprocessor/comma_if.hpp>\n#include <boost/preprocessor/logical/and.hpp>\n#include <boost/preprocessor/identity.hpp>\n#include <boost/preprocessor/empty.hpp>\n\n// BOOST_MPL_PP_DEF_PARAMS_TAIL(1,T,value): , T1 = value, .., Tn = value\n// BOOST_MPL_PP_DEF_PARAMS_TAIL(2,T,value): , T2 = value, .., Tn = value\n// BOOST_MPL_PP_DEF_PARAMS_TAIL(n,T,value): <nothing>\n\n#if !defined(BOOST_MPL_CFG_NO_OWN_PP_PRIMITIVES)\n\n#   include <boost/mpl/aux_/preprocessor/filter_params.hpp>\n#   include <boost/mpl/aux_/preprocessor/sub.hpp>\n\n#   define BOOST_MPL_PP_DEF_PARAMS_TAIL_IMPL(i, param, value_func) \\\n    BOOST_MPL_PP_DEF_PARAMS_TAIL_DELAY_1( \\\n          i \\\n        , BOOST_MPL_PP_SUB(BOOST_MPL_LIMIT_METAFUNCTION_ARITY,i) \\\n        , param \\\n        , value_func \\\n        ) \\\n    /**/\n\n#   define BOOST_MPL_PP_DEF_PARAMS_TAIL_DELAY_1(i, n, param, value_func) \\\n    BOOST_MPL_PP_DEF_PARAMS_TAIL_DELAY_2(i,n,param,value_func) \\\n    /**/\n\n#   define BOOST_MPL_PP_DEF_PARAMS_TAIL_DELAY_2(i, n, param, value_func) \\\n    BOOST_PP_COMMA_IF(BOOST_PP_AND(i,n)) \\\n    BOOST_MPL_PP_DEF_PARAMS_TAIL_##i(n,param,value_func) \\\n    /**/\n\n#   define BOOST_MPL_PP_DEF_PARAMS_TAIL_0(i,p,v) BOOST_MPL_PP_FILTER_PARAMS_##i(p##1 v(),p##2 v(),p##3 v(),p##4 v(),p##5 v(),p##6 v(),p##7 v(),p##8 v(),p##9 v())\n#   define BOOST_MPL_PP_DEF_PARAMS_TAIL_1(i,p,v) BOOST_MPL_PP_FILTER_PARAMS_##i(p##2 v(),p##3 v(),p##4 v(),p##5 v(),p##6 v(),p##7 v(),p##8 v(),p##9 v(),p1)\n#   define BOOST_MPL_PP_DEF_PARAMS_TAIL_2(i,p,v) BOOST_MPL_PP_FILTER_PARAMS_##i(p##3 v(),p##4 v(),p##5 v(),p##6 v(),p##7 v(),p##8 v(),p##9 v(),p1,p2)\n#   define BOOST_MPL_PP_DEF_PARAMS_TAIL_3(i,p,v) BOOST_MPL_PP_FILTER_PARAMS_##i(p##4 v(),p##5 v(),p##6 v(),p##7 v(),p##8 v(),p##9 v(),p1,p2,p3)\n#   define BOOST_MPL_PP_DEF_PARAMS_TAIL_4(i,p,v) BOOST_MPL_PP_FILTER_PARAMS_##i(p##5 v(),p##6 v(),p##7 v(),p##8 v(),p##9 v(),p1,p2,p3,p4)\n#   define BOOST_MPL_PP_DEF_PARAMS_TAIL_5(i,p,v) BOOST_MPL_PP_FILTER_PARAMS_##i(p##6 v(),p##7 v(),p##8 v(),p##9 v(),p1,p2,p3,p4,p5)\n#   define BOOST_MPL_PP_DEF_PARAMS_TAIL_6(i,p,v) BOOST_MPL_PP_FILTER_PARAMS_##i(p##7 v(),p##8 v(),p##9 v(),p1,p2,p3,p4,p5,p6)\n#   define BOOST_MPL_PP_DEF_PARAMS_TAIL_7(i,p,v) BOOST_MPL_PP_FILTER_PARAMS_##i(p##8 v(),p##9 v(),p1,p2,p3,p4,p5,p6,p7)\n#   define BOOST_MPL_PP_DEF_PARAMS_TAIL_8(i,p,v) BOOST_MPL_PP_FILTER_PARAMS_##i(p##9 v(),p1,p2,p3,p4,p5,p6,p7,p8)\n#   define BOOST_MPL_PP_DEF_PARAMS_TAIL_9(i,p,v) BOOST_MPL_PP_FILTER_PARAMS_##i(p1,p2,p3,p4,p5,p6,p7,p8,p9)\n\n#else\n\n#   include <boost/preprocessor/arithmetic/add.hpp>\n#   include <boost/preprocessor/arithmetic/sub.hpp>\n#   include <boost/preprocessor/inc.hpp>\n#   include <boost/preprocessor/tuple/elem.hpp>\n#   include <boost/preprocessor/repeat.hpp>\n#   include <boost/preprocessor/cat.hpp>\n\n#   define BOOST_MPL_PP_AUX_TAIL_PARAM_FUNC(unused, i, op) \\\n    , BOOST_PP_CAT( \\\n          BOOST_PP_TUPLE_ELEM(3, 1, op) \\\n        , BOOST_PP_ADD_D(1, i, BOOST_PP_INC(BOOST_PP_TUPLE_ELEM(3, 0, op))) \\\n        ) BOOST_PP_TUPLE_ELEM(3, 2, op)() \\\n    /**/\n\n#   define BOOST_MPL_PP_DEF_PARAMS_TAIL_IMPL(i, param, value_func) \\\n    BOOST_PP_REPEAT( \\\n          BOOST_PP_SUB_D(1, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, i) \\\n        , BOOST_MPL_PP_AUX_TAIL_PARAM_FUNC \\\n        , (i, param, value_func) \\\n        ) \\\n    /**/\n\n\n#endif // BOOST_MPL_CFG_NO_OWN_PP_PRIMITIVES\n\n#define BOOST_MPL_PP_DEF_PARAMS_TAIL(i, param, value) \\\n    BOOST_MPL_PP_DEF_PARAMS_TAIL_IMPL(i, param, BOOST_PP_IDENTITY(=value)) \\\n    /**/\n\n#if !defined(BOOST_MPL_CFG_NO_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES)\n#   define BOOST_MPL_PP_NESTED_DEF_PARAMS_TAIL(i, param, value) \\\n    BOOST_MPL_PP_DEF_PARAMS_TAIL_IMPL(i, param, BOOST_PP_IDENTITY(=value)) \\\n    /**/\n#else\n#   define BOOST_MPL_PP_NESTED_DEF_PARAMS_TAIL(i, param, value) \\\n    BOOST_MPL_PP_DEF_PARAMS_TAIL_IMPL(i, param, BOOST_PP_EMPTY) \\\n    /**/\n#endif\n\n#endif // BOOST_MPL_AUX_PREPROCESSOR_DEF_PARAMS_TAIL_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessor/default_params.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_PREPROCESSOR_DEFAULT_PARAMS_HPP_INCLUDED\n#define BOOST_MPL_AUX_PREPROCESSOR_DEFAULT_PARAMS_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2002-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/preprocessor.hpp>\n\n// BOOST_MPL_PP_DEFAULT_PARAMS(0,T,int): <nothing>\n// BOOST_MPL_PP_DEFAULT_PARAMS(1,T,int): T1 = int\n// BOOST_MPL_PP_DEFAULT_PARAMS(2,T,int): T1 = int, T2 = int\n// BOOST_MPL_PP_DEFAULT_PARAMS(n,T,int): T1 = int, T2 = int, .., Tn = int\n\n#if !defined(BOOST_MPL_CFG_NO_OWN_PP_PRIMITIVES)\n\n#   include <boost/preprocessor/cat.hpp>\n\n#   define BOOST_MPL_PP_DEFAULT_PARAMS(n,p,v) \\\n    BOOST_PP_CAT(BOOST_MPL_PP_DEFAULT_PARAMS_,n)(p,v) \\\n    /**/\n    \n#   define BOOST_MPL_PP_DEFAULT_PARAMS_0(p,v)\n#   define BOOST_MPL_PP_DEFAULT_PARAMS_1(p,v) p##1=v\n#   define BOOST_MPL_PP_DEFAULT_PARAMS_2(p,v) p##1=v,p##2=v\n#   define BOOST_MPL_PP_DEFAULT_PARAMS_3(p,v) p##1=v,p##2=v,p##3=v\n#   define BOOST_MPL_PP_DEFAULT_PARAMS_4(p,v) p##1=v,p##2=v,p##3=v,p##4=v\n#   define BOOST_MPL_PP_DEFAULT_PARAMS_5(p,v) p##1=v,p##2=v,p##3=v,p##4=v,p##5=v\n#   define BOOST_MPL_PP_DEFAULT_PARAMS_6(p,v) p##1=v,p##2=v,p##3=v,p##4=v,p##5=v,p##6=v\n#   define BOOST_MPL_PP_DEFAULT_PARAMS_7(p,v) p##1=v,p##2=v,p##3=v,p##4=v,p##5=v,p##6=v,p##7=v\n#   define BOOST_MPL_PP_DEFAULT_PARAMS_8(p,v) p##1=v,p##2=v,p##3=v,p##4=v,p##5=v,p##6=v,p##7=v,p##8=v\n#   define BOOST_MPL_PP_DEFAULT_PARAMS_9(p,v) p##1=v,p##2=v,p##3=v,p##4=v,p##5=v,p##6=v,p##7=v,p##8=v,p##9=v\n\n#else\n\n#   include <boost/preprocessor/tuple/elem.hpp>\n#   include <boost/preprocessor/comma_if.hpp>\n#   include <boost/preprocessor/repeat.hpp>\n#   include <boost/preprocessor/inc.hpp>\n#   include <boost/preprocessor/cat.hpp>\n\n#   define BOOST_MPL_PP_AUX_DEFAULT_PARAM_FUNC(unused, i, pv) \\\n    BOOST_PP_COMMA_IF(i) \\\n    BOOST_PP_CAT( BOOST_PP_TUPLE_ELEM(2,0,pv), BOOST_PP_INC(i) ) \\\n        = BOOST_PP_TUPLE_ELEM(2,1,pv) \\\n    /**/\n\n#   define BOOST_MPL_PP_DEFAULT_PARAMS(n, param, value) \\\n    BOOST_PP_REPEAT( \\\n          n \\\n        , BOOST_MPL_PP_AUX_DEFAULT_PARAM_FUNC \\\n        , (param,value) \\\n        ) \\\n    /**/\n\n#endif\n\n#endif // BOOST_MPL_AUX_PREPROCESSOR_DEFAULT_PARAMS_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessor/enum.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_PREPROCESSOR_ENUM_HPP_INCLUDED\n#define BOOST_MPL_AUX_PREPROCESSOR_ENUM_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/preprocessor.hpp>\n\n// BOOST_MPL_PP_ENUM(0,int): <nothing>\n// BOOST_MPL_PP_ENUM(1,int): int\n// BOOST_MPL_PP_ENUM(2,int): int, int\n// BOOST_MPL_PP_ENUM(n,int): int, int, .., int\n\n#if !defined(BOOST_MPL_CFG_NO_OWN_PP_PRIMITIVES)\n\n#   include <boost/preprocessor/cat.hpp>\n\n#   define BOOST_MPL_PP_ENUM(n, param) \\\n    BOOST_PP_CAT(BOOST_MPL_PP_ENUM_,n)(param) \\\n    /**/\n    \n#   define BOOST_MPL_PP_ENUM_0(p)\n#   define BOOST_MPL_PP_ENUM_1(p) p\n#   define BOOST_MPL_PP_ENUM_2(p) p,p\n#   define BOOST_MPL_PP_ENUM_3(p) p,p,p\n#   define BOOST_MPL_PP_ENUM_4(p) p,p,p,p\n#   define BOOST_MPL_PP_ENUM_5(p) p,p,p,p,p\n#   define BOOST_MPL_PP_ENUM_6(p) p,p,p,p,p,p\n#   define BOOST_MPL_PP_ENUM_7(p) p,p,p,p,p,p,p\n#   define BOOST_MPL_PP_ENUM_8(p) p,p,p,p,p,p,p,p\n#   define BOOST_MPL_PP_ENUM_9(p) p,p,p,p,p,p,p,p,p\n\n#else\n\n#   include <boost/preprocessor/comma_if.hpp>\n#   include <boost/preprocessor/repeat.hpp>\n\n#   define BOOST_MPL_PP_AUX_ENUM_FUNC(unused, i, param) \\\n    BOOST_PP_COMMA_IF(i) param \\\n    /**/\n\n#   define BOOST_MPL_PP_ENUM(n, param) \\\n    BOOST_PP_REPEAT( \\\n          n \\\n        , BOOST_MPL_PP_AUX_ENUM_FUNC \\\n        , param \\\n        ) \\\n    /**/\n\n#endif\n\n#endif // BOOST_MPL_AUX_PREPROCESSOR_ENUM_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessor/ext_params.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_PREPROCESSOR_EXT_PARAMS_HPP_INCLUDED\n#define BOOST_MPL_AUX_PREPROCESSOR_EXT_PARAMS_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/preprocessor.hpp>\n\n// BOOST_MPL_PP_EXT_PARAMS(2,2,T): <nothing>\n// BOOST_MPL_PP_EXT_PARAMS(2,3,T): T2\n// BOOST_MPL_PP_EXT_PARAMS(2,4,T): T2, T3\n// BOOST_MPL_PP_EXT_PARAMS(2,n,T): T2, T3, .., Tn-1\n\n#if !defined(BOOST_MPL_CFG_NO_OWN_PP_PRIMITIVES)\n\n#   include <boost/mpl/aux_/preprocessor/filter_params.hpp>\n#   include <boost/mpl/aux_/preprocessor/sub.hpp>\n\n#   define BOOST_MPL_PP_EXT_PARAMS(i,j,p) \\\n    BOOST_MPL_PP_EXT_PARAMS_DELAY_1(i,BOOST_MPL_PP_SUB(j,i),p) \\\n    /**/\n\n#   define BOOST_MPL_PP_EXT_PARAMS_DELAY_1(i,n,p) \\\n    BOOST_MPL_PP_EXT_PARAMS_DELAY_2(i,n,p) \\\n    /**/\n\n#   define BOOST_MPL_PP_EXT_PARAMS_DELAY_2(i,n,p) \\\n    BOOST_MPL_PP_EXT_PARAMS_##i(n,p) \\\n    /**/\n\n#   define BOOST_MPL_PP_EXT_PARAMS_1(i,p) BOOST_MPL_PP_FILTER_PARAMS_##i(p##1,p##2,p##3,p##4,p##5,p##6,p##7,p##8,p##9)\n#   define BOOST_MPL_PP_EXT_PARAMS_2(i,p) BOOST_MPL_PP_FILTER_PARAMS_##i(p##2,p##3,p##4,p##5,p##6,p##7,p##8,p##9,p1)\n#   define BOOST_MPL_PP_EXT_PARAMS_3(i,p) BOOST_MPL_PP_FILTER_PARAMS_##i(p##3,p##4,p##5,p##6,p##7,p##8,p##9,p1,p2)\n#   define BOOST_MPL_PP_EXT_PARAMS_4(i,p) BOOST_MPL_PP_FILTER_PARAMS_##i(p##4,p##5,p##6,p##7,p##8,p##9,p1,p2,p3)\n#   define BOOST_MPL_PP_EXT_PARAMS_5(i,p) BOOST_MPL_PP_FILTER_PARAMS_##i(p##5,p##6,p##7,p##8,p##9,p1,p2,p3,p4)\n#   define BOOST_MPL_PP_EXT_PARAMS_6(i,p) BOOST_MPL_PP_FILTER_PARAMS_##i(p##6,p##7,p##8,p##9,p1,p2,p3,p4,p5)\n#   define BOOST_MPL_PP_EXT_PARAMS_7(i,p) BOOST_MPL_PP_FILTER_PARAMS_##i(p##7,p##8,p##9,p1,p2,p3,p4,p5,p6)\n#   define BOOST_MPL_PP_EXT_PARAMS_8(i,p) BOOST_MPL_PP_FILTER_PARAMS_##i(p##8,p##9,p1,p2,p3,p4,p5,p6,p7)\n#   define BOOST_MPL_PP_EXT_PARAMS_9(i,p) BOOST_MPL_PP_FILTER_PARAMS_##i(p##9,p1,p2,p3,p4,p5,p6,p7,p8)\n\n#else\n\n#   include <boost/preprocessor/arithmetic/add.hpp>\n#   include <boost/preprocessor/arithmetic/sub.hpp>\n#   include <boost/preprocessor/comma_if.hpp>\n#   include <boost/preprocessor/repeat.hpp>\n#   include <boost/preprocessor/tuple/elem.hpp>\n#   include <boost/preprocessor/cat.hpp>\n\n#   define BOOST_MPL_PP_AUX_EXT_PARAM_FUNC(unused, i, op) \\\n    BOOST_PP_COMMA_IF(i) \\\n    BOOST_PP_CAT( \\\n          BOOST_PP_TUPLE_ELEM(2,1,op) \\\n        , BOOST_PP_ADD_D(1, i, BOOST_PP_TUPLE_ELEM(2,0,op)) \\\n        ) \\\n    /**/\n\n#   define BOOST_MPL_PP_EXT_PARAMS(i, j, param) \\\n    BOOST_PP_REPEAT( \\\n          BOOST_PP_SUB_D(1,j,i) \\\n        , BOOST_MPL_PP_AUX_EXT_PARAM_FUNC \\\n        , (i,param) \\\n        ) \\\n    /**/\n\n#endif\n\n#endif // BOOST_MPL_AUX_PREPROCESSOR_EXT_PARAMS_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessor/filter_params.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_PREPROCESSOR_FILTER_PARAMS_HPP_INCLUDED\n#define BOOST_MPL_AUX_PREPROCESSOR_FILTER_PARAMS_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#define BOOST_MPL_PP_FILTER_PARAMS_0(p1,p2,p3,p4,p5,p6,p7,p8,p9) \n#define BOOST_MPL_PP_FILTER_PARAMS_1(p1,p2,p3,p4,p5,p6,p7,p8,p9) p1\n#define BOOST_MPL_PP_FILTER_PARAMS_2(p1,p2,p3,p4,p5,p6,p7,p8,p9) p1,p2\n#define BOOST_MPL_PP_FILTER_PARAMS_3(p1,p2,p3,p4,p5,p6,p7,p8,p9) p1,p2,p3\n#define BOOST_MPL_PP_FILTER_PARAMS_4(p1,p2,p3,p4,p5,p6,p7,p8,p9) p1,p2,p3,p4\n#define BOOST_MPL_PP_FILTER_PARAMS_5(p1,p2,p3,p4,p5,p6,p7,p8,p9) p1,p2,p3,p4,p5\n#define BOOST_MPL_PP_FILTER_PARAMS_6(p1,p2,p3,p4,p5,p6,p7,p8,p9) p1,p2,p3,p4,p5,p6\n#define BOOST_MPL_PP_FILTER_PARAMS_7(p1,p2,p3,p4,p5,p6,p7,p8,p9) p1,p2,p3,p4,p5,p6,p7\n#define BOOST_MPL_PP_FILTER_PARAMS_8(p1,p2,p3,p4,p5,p6,p7,p8,p9) p1,p2,p3,p4,p5,p6,p7,p8\n#define BOOST_MPL_PP_FILTER_PARAMS_9(p1,p2,p3,p4,p5,p6,p7,p8,p9) p1,p2,p3,p4,p5,p6,p7,p8,p9\n\n#endif // BOOST_MPL_AUX_PREPROCESSOR_FILTER_PARAMS_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessor/params.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_PREPROCESSOR_PARAMS_HPP_INCLUDED\n#define BOOST_MPL_AUX_PREPROCESSOR_PARAMS_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/preprocessor.hpp>\n\n// BOOST_MPL_PP_PARAMS(0,T): <nothing>\n// BOOST_MPL_PP_PARAMS(1,T): T1\n// BOOST_MPL_PP_PARAMS(2,T): T1, T2\n// BOOST_MPL_PP_PARAMS(n,T): T1, T2, .., Tn\n\n#if !defined(BOOST_MPL_CFG_NO_OWN_PP_PRIMITIVES)\n\n#   include <boost/preprocessor/cat.hpp>\n\n#   define BOOST_MPL_PP_PARAMS(n,p) \\\n    BOOST_PP_CAT(BOOST_MPL_PP_PARAMS_,n)(p) \\\n    /**/\n\n#   define BOOST_MPL_PP_PARAMS_0(p)\n#   define BOOST_MPL_PP_PARAMS_1(p) p##1\n#   define BOOST_MPL_PP_PARAMS_2(p) p##1,p##2\n#   define BOOST_MPL_PP_PARAMS_3(p) p##1,p##2,p##3\n#   define BOOST_MPL_PP_PARAMS_4(p) p##1,p##2,p##3,p##4\n#   define BOOST_MPL_PP_PARAMS_5(p) p##1,p##2,p##3,p##4,p##5\n#   define BOOST_MPL_PP_PARAMS_6(p) p##1,p##2,p##3,p##4,p##5,p##6\n#   define BOOST_MPL_PP_PARAMS_7(p) p##1,p##2,p##3,p##4,p##5,p##6,p##7\n#   define BOOST_MPL_PP_PARAMS_8(p) p##1,p##2,p##3,p##4,p##5,p##6,p##7,p##8\n#   define BOOST_MPL_PP_PARAMS_9(p) p##1,p##2,p##3,p##4,p##5,p##6,p##7,p##8,p##9\n\n#else\n\n#   include <boost/preprocessor/comma_if.hpp>\n#   include <boost/preprocessor/repeat.hpp>\n#   include <boost/preprocessor/inc.hpp>\n#   include <boost/preprocessor/cat.hpp>\n\n#   define BOOST_MPL_PP_AUX_PARAM_FUNC(unused, i, param) \\\n    BOOST_PP_COMMA_IF(i) \\\n    BOOST_PP_CAT(param, BOOST_PP_INC(i)) \\\n    /**/\n\n#   define BOOST_MPL_PP_PARAMS(n, param) \\\n    BOOST_PP_REPEAT( \\\n          n \\\n        , BOOST_MPL_PP_AUX_PARAM_FUNC \\\n        , param \\\n        ) \\\n    /**/\n\n#endif \n\n#endif // BOOST_MPL_AUX_PREPROCESSOR_PARAMS_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessor/partial_spec_params.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_PREPROCESSOR_PARTIAL_SPEC_PARAMS_HPP_INCLUDED\n#define BOOST_MPL_AUX_PREPROCESSOR_PARTIAL_SPEC_PARAMS_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/limits/arity.hpp>\n#include <boost/mpl/aux_/preprocessor/params.hpp>\n#include <boost/mpl/aux_/preprocessor/enum.hpp>\n#include <boost/mpl/aux_/preprocessor/sub.hpp>\n#include <boost/preprocessor/comma_if.hpp>\n\n#define BOOST_MPL_PP_PARTIAL_SPEC_PARAMS(n, param, def) \\\nBOOST_MPL_PP_PARAMS(n, param) \\\nBOOST_PP_COMMA_IF(BOOST_MPL_PP_SUB(BOOST_MPL_LIMIT_METAFUNCTION_ARITY,n)) \\\nBOOST_MPL_PP_ENUM( \\\n      BOOST_MPL_PP_SUB(BOOST_MPL_LIMIT_METAFUNCTION_ARITY,n) \\\n    , def \\\n    ) \\\n/**/\n\n#endif // BOOST_MPL_AUX_PREPROCESSOR_PARTIAL_SPEC_PARAMS_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessor/range.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_PREPROCESSOR_RANGE_HPP_INCLUDED\n#define BOOST_MPL_AUX_PREPROCESSOR_RANGE_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2002-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/preprocessor/seq/subseq.hpp>\n#include <boost/preprocessor/repetition/repeat.hpp>\n#include <boost/preprocessor/arithmetic/add.hpp>\n\n#define BOOST_MPL_PP_RANGE_ITEM(z,n,_) (n)\n\n#define BOOST_MPL_PP_RANGE(first, length) \\\n    BOOST_PP_SEQ_SUBSEQ( \\\n        BOOST_PP_REPEAT(BOOST_PP_ADD(first,length), BOOST_MPL_PP_RANGE_ITEM, _), \\\n        first, length \\\n    ) \\\n/**/\n\n#endif // BOOST_MPL_AUX_PREPROCESSOR_RANGE_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessor/repeat.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_PREPROCESSOR_REPEAT_HPP_INCLUDED\n#define BOOST_MPL_AUX_PREPROCESSOR_REPEAT_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2002-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/preprocessor.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_OWN_PP_PRIMITIVES)\n\n#   include <boost/preprocessor/cat.hpp>\n\n#   define BOOST_MPL_PP_REPEAT(n,f,param) \\\n    BOOST_PP_CAT(BOOST_MPL_PP_REPEAT_,n)(f,param) \\\n    /**/\n    \n#   define BOOST_MPL_PP_REPEAT_0(f,p)\n#   define BOOST_MPL_PP_REPEAT_1(f,p) f(0,0,p)\n#   define BOOST_MPL_PP_REPEAT_2(f,p) f(0,0,p) f(0,1,p)\n#   define BOOST_MPL_PP_REPEAT_3(f,p) f(0,0,p) f(0,1,p) f(0,2,p)\n#   define BOOST_MPL_PP_REPEAT_4(f,p) f(0,0,p) f(0,1,p) f(0,2,p) f(0,3,p)\n#   define BOOST_MPL_PP_REPEAT_5(f,p) f(0,0,p) f(0,1,p) f(0,2,p) f(0,3,p) f(0,4,p)\n#   define BOOST_MPL_PP_REPEAT_6(f,p) f(0,0,p) f(0,1,p) f(0,2,p) f(0,3,p) f(0,4,p) f(0,5,p)\n#   define BOOST_MPL_PP_REPEAT_7(f,p) f(0,0,p) f(0,1,p) f(0,2,p) f(0,3,p) f(0,4,p) f(0,5,p) f(0,6,p)\n#   define BOOST_MPL_PP_REPEAT_8(f,p) f(0,0,p) f(0,1,p) f(0,2,p) f(0,3,p) f(0,4,p) f(0,5,p) f(0,6,p) f(0,7,p)\n#   define BOOST_MPL_PP_REPEAT_9(f,p) f(0,0,p) f(0,1,p) f(0,2,p) f(0,3,p) f(0,4,p) f(0,5,p) f(0,6,p) f(0,7,p) f(0,8,p)\n#   define BOOST_MPL_PP_REPEAT_10(f,p) f(0,0,p) f(0,1,p) f(0,2,p) f(0,3,p) f(0,4,p) f(0,5,p) f(0,6,p) f(0,7,p) f(0,8,p) f(0,9,p)\n\n#else \n\n#   include <boost/preprocessor/repeat.hpp>\n\n#   define BOOST_MPL_PP_REPEAT(n,f,param) \\\n    BOOST_PP_REPEAT(n,f,param) \\\n    /**/\n\n#endif \n\n#define BOOST_MPL_PP_REPEAT_IDENTITY_FUNC(unused1, unused2, x) x\n\n#endif // BOOST_MPL_AUX_PREPROCESSOR_REPEAT_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessor/sub.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_PREPROCESSOR_SUB_HPP_INCLUDED\n#define BOOST_MPL_AUX_PREPROCESSOR_SUB_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2002-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/preprocessor.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_OWN_PP_PRIMITIVES)\n\n#   include <boost/mpl/aux_/preprocessor/tuple.hpp>\n\n#if defined(BOOST_MPL_CFG_BROKEN_PP_MACRO_EXPANSION)\n#   include <boost/preprocessor/cat.hpp>\n\n#   define BOOST_MPL_PP_SUB(i,j) \\\n    BOOST_MPL_PP_SUB_DELAY(i,j) \\\n    /**/\n\n#   define BOOST_MPL_PP_SUB_DELAY(i,j) \\\n    BOOST_PP_CAT(BOOST_MPL_PP_TUPLE_11_ELEM_##i,BOOST_MPL_PP_SUB_##j) \\\n    /**/\n#else\n#   define BOOST_MPL_PP_SUB(i,j) \\\n    BOOST_MPL_PP_SUB_DELAY(i,j) \\\n    /**/\n\n#   define BOOST_MPL_PP_SUB_DELAY(i,j) \\\n    BOOST_MPL_PP_TUPLE_11_ELEM_##i BOOST_MPL_PP_SUB_##j \\\n    /**/\n#endif\n\n#   define BOOST_MPL_PP_SUB_0 (0,1,2,3,4,5,6,7,8,9,10)\n#   define BOOST_MPL_PP_SUB_1 (0,0,1,2,3,4,5,6,7,8,9)\n#   define BOOST_MPL_PP_SUB_2 (0,0,0,1,2,3,4,5,6,7,8)\n#   define BOOST_MPL_PP_SUB_3 (0,0,0,0,1,2,3,4,5,6,7)\n#   define BOOST_MPL_PP_SUB_4 (0,0,0,0,0,1,2,3,4,5,6)\n#   define BOOST_MPL_PP_SUB_5 (0,0,0,0,0,0,1,2,3,4,5)\n#   define BOOST_MPL_PP_SUB_6 (0,0,0,0,0,0,0,1,2,3,4)\n#   define BOOST_MPL_PP_SUB_7 (0,0,0,0,0,0,0,0,1,2,3)\n#   define BOOST_MPL_PP_SUB_8 (0,0,0,0,0,0,0,0,0,1,2)\n#   define BOOST_MPL_PP_SUB_9 (0,0,0,0,0,0,0,0,0,0,1)\n#   define BOOST_MPL_PP_SUB_10 (0,0,0,0,0,0,0,0,0,0,0)\n\n#else\n\n#   include <boost/preprocessor/arithmetic/sub.hpp>\n\n#   define BOOST_MPL_PP_SUB(i,j) \\\n    BOOST_PP_SUB(i,j) \\\n    /**/\n    \n#endif\n\n#endif // BOOST_MPL_AUX_PREPROCESSOR_SUB_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/preprocessor/tuple.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_PREPROCESSOR_TUPLE_HPP_INCLUDED\n#define BOOST_MPL_AUX_PREPROCESSOR_TUPLE_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2002-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#define BOOST_MPL_PP_TUPLE_11_ELEM_0(e0,e1,e2,e3,e4,e5,e6,e7,e8,e9,e10) e0\n#define BOOST_MPL_PP_TUPLE_11_ELEM_1(e0,e1,e2,e3,e4,e5,e6,e7,e8,e9,e10) e1\n#define BOOST_MPL_PP_TUPLE_11_ELEM_2(e0,e1,e2,e3,e4,e5,e6,e7,e8,e9,e10) e2\n#define BOOST_MPL_PP_TUPLE_11_ELEM_3(e0,e1,e2,e3,e4,e5,e6,e7,e8,e9,e10) e3\n#define BOOST_MPL_PP_TUPLE_11_ELEM_4(e0,e1,e2,e3,e4,e5,e6,e7,e8,e9,e10) e4\n#define BOOST_MPL_PP_TUPLE_11_ELEM_5(e0,e1,e2,e3,e4,e5,e6,e7,e8,e9,e10) e5\n#define BOOST_MPL_PP_TUPLE_11_ELEM_6(e0,e1,e2,e3,e4,e5,e6,e7,e8,e9,e10) e6\n#define BOOST_MPL_PP_TUPLE_11_ELEM_7(e0,e1,e2,e3,e4,e5,e6,e7,e8,e9,e10) e7\n#define BOOST_MPL_PP_TUPLE_11_ELEM_8(e0,e1,e2,e3,e4,e5,e6,e7,e8,e9,e10) e8\n#define BOOST_MPL_PP_TUPLE_11_ELEM_9(e0,e1,e2,e3,e4,e5,e6,e7,e8,e9,e10) e9\n#define BOOST_MPL_PP_TUPLE_11_ELEM_10(e0,e1,e2,e3,e4,e5,e6,e7,e8,e9,e10) e10\n\n#endif // BOOST_MPL_AUX_PREPROCESSOR_TUPLE_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/ptr_to_ref.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_PTR_TO_REF_HPP_INCLUDED\n#define BOOST_MPL_AUX_PTR_TO_REF_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2003-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/static_cast.hpp>\n#include <boost/mpl/aux_/config/msvc.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n\n#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1400)) \\\n    ||  ( BOOST_WORKAROUND(__EDG_VERSION__, <= 245) \\\n        && !(defined(__STD_STRICT_ANSI) \\\n            || defined(__STD_STRICT_ANSI_ERRORS)) )\n\n#   define BOOST_MPL_AUX_PTR_TO_REF(X) \\\n    *BOOST_MPL_AUX_STATIC_CAST(X*, 0) \\\n/**/\n\n#else\n\n#   define BOOST_MPL_AUX_PTR_TO_REF(X) \\\n    aux::ptr_to_ref(BOOST_MPL_AUX_STATIC_CAST(X*, 0)) \\\n/**/\n\n#endif\n\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< typename T > static T const& ptr_to_ref(T*);\n\n}}}\n\n#endif // BOOST_MPL_AUX_PTR_TO_REF_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/push_front_impl.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_PUSH_FRONT_IMPL_HPP_INCLUDED\n#define BOOST_MPL_AUX_PUSH_FRONT_IMPL_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2008\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/push_front_fwd.hpp>\n#include <boost/mpl/assert.hpp>\n#include <boost/mpl/aux_/has_type.hpp>\n#include <boost/mpl/aux_/traits_lambda_spec.hpp>\n#include <boost/mpl/aux_/config/forwarding.hpp>\n#include <boost/mpl/aux_/config/static_constant.hpp>\n\n#include <boost/type_traits/is_same.hpp>\n\nnamespace boost { namespace mpl {\n\nstruct has_push_front_arg {};\n\n// agurt 05/feb/04: no default implementation; the stub definition is needed \n// to enable the default 'has_push_front' implementation below\n\ntemplate< typename Tag >\nstruct push_front_impl\n{\n    template< typename Sequence, typename T > struct apply\n    {\n        // should be instantiated only in the context of 'has_push_front_impl';\n        // if you've got an assert here, you are requesting a 'push_front' \n        // specialization that doesn't exist.\n        BOOST_MPL_ASSERT_MSG(\n              ( boost::is_same< T, has_push_front_arg >::value )\n            , REQUESTED_PUSH_FRONT_SPECIALIZATION_FOR_SEQUENCE_DOES_NOT_EXIST\n            , ( Sequence )\n            );\n    };\n};\n\ntemplate< typename Tag >\nstruct has_push_front_impl\n{\n    template< typename Seq > struct apply\n#if !defined(BOOST_MPL_CFG_NO_NESTED_FORWARDING)\n        : aux::has_type< push_front< Seq, has_push_front_arg > >\n    {\n#else\n    {\n        typedef aux::has_type< push_front< Seq, has_push_front_arg > > type;\n        BOOST_STATIC_CONSTANT(bool, value = \n              (aux::has_type< push_front< Seq, has_push_front_arg > >::value)\n            );\n#endif\n    };\n};\n\nBOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC(2, push_front_impl)\nBOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC(1, has_push_front_impl)\n\n}}\n\n#endif // BOOST_MPL_AUX_PUSH_FRONT_IMPL_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/reverse_fold_impl.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_REVERSE_FOLD_IMPL_HPP_INCLUDED\n#define BOOST_MPL_AUX_REVERSE_FOLD_IMPL_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#if !defined(BOOST_MPL_PREPROCESSING_MODE)\n#   include <boost/mpl/next_prior.hpp>\n#   include <boost/mpl/deref.hpp>\n#   include <boost/mpl/apply.hpp>\n#   include <boost/mpl/aux_/config/ctps.hpp>\n#   if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \\\n    || defined(BOOST_MPL_CFG_NO_NONTYPE_TEMPLATE_PARTIAL_SPEC)\n#       include <boost/mpl/if.hpp>\n#       include <boost/type_traits/is_same.hpp>\n#   endif\n#endif\n\n#include <boost/mpl/aux_/config/use_preprocessed.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \\\n    && !defined(BOOST_MPL_PREPROCESSING_MODE)\n\n#   define BOOST_MPL_PREPROCESSED_HEADER reverse_fold_impl.hpp\n#   include <boost/mpl/aux_/include_preprocessed.hpp>\n\n#else\n\n#   define AUX778076_FOLD_IMPL_OP(iter) typename deref<iter>::type\n#   define AUX778076_FOLD_IMPL_NAME_PREFIX reverse_fold\n#   include <boost/mpl/aux_/reverse_fold_impl_body.hpp>\n\n#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS\n#endif // BOOST_MPL_AUX_REVERSE_FOLD_IMPL_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/reverse_fold_impl_body.hpp",
    "content": "\n// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION!\n\n#if !defined(BOOST_PP_IS_ITERATING)\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#   include <boost/mpl/limits/unrolling.hpp>\n#   include <boost/mpl/aux_/preprocessor/repeat.hpp>\n#   include <boost/mpl/aux_/config/ctps.hpp>\n#   include <boost/mpl/aux_/nttp_decl.hpp>\n\n#   include <boost/preprocessor/arithmetic/sub.hpp>\n#   include <boost/preprocessor/iterate.hpp>\n#   include <boost/preprocessor/dec.hpp>\n#   include <boost/preprocessor/inc.hpp>\n#   include <boost/preprocessor/cat.hpp>\n\n// local macros, #undef-ined at the end of the header\n\n#   define AUX778076_ITER_FOLD_FORWARD_STEP(unused, n_, unused2) \\\n    typedef typename apply2< \\\n          ForwardOp \\\n        , BOOST_PP_CAT(fwd_state,n_) \\\n        , AUX778076_FOLD_IMPL_OP(BOOST_PP_CAT(iter,n_)) \\\n        >::type BOOST_PP_CAT(fwd_state,BOOST_PP_INC(n_)); \\\n    typedef typename mpl::next<BOOST_PP_CAT(iter,n_)>::type \\\n        BOOST_PP_CAT(iter,BOOST_PP_INC(n_)); \\\n    /**/\n\n#   define AUX778076_ITER_FOLD_BACKWARD_STEP_FUNC(n_) \\\n    typedef typename apply2< \\\n          BackwardOp \\\n        , BOOST_PP_CAT(bkwd_state,n_) \\\n        , AUX778076_FOLD_IMPL_OP(BOOST_PP_CAT(iter,BOOST_PP_DEC(n_))) \\\n        >::type BOOST_PP_CAT(bkwd_state,BOOST_PP_DEC(n_)); \\\n    /**/\n\n#   define AUX778076_ITER_FOLD_BACKWARD_STEP(unused, n_, j) \\\n    AUX778076_ITER_FOLD_BACKWARD_STEP_FUNC( \\\n          BOOST_PP_SUB_D(1,j,n_) \\\n        ) \\\n    /**/\n\n#   define AUX778076_FIRST_BACKWARD_STATE_TYPEDEF(n_) \\\n    typedef typename nested_chunk::state BOOST_PP_CAT(bkwd_state,n_);\n    /**/\n\n#   define AUX778076_FOLD_IMPL_NAME \\\n    BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_impl) \\\n    /**/\n\n#   define AUX778076_FOLD_CHUNK_NAME \\\n    BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_chunk) \\\n    /**/\n\nnamespace boost { namespace mpl { namespace aux {\n\n/// forward declaration\ntemplate<\n      BOOST_MPL_AUX_NTTP_DECL(long, N)\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    > \nstruct AUX778076_FOLD_IMPL_NAME;\n\n#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \\\n    && !defined(BOOST_MPL_CFG_NO_NONTYPE_TEMPLATE_PARTIAL_SPEC)\n\n#   define BOOST_PP_ITERATION_PARAMS_1 \\\n    (3,(0, BOOST_MPL_LIMIT_UNROLLING, <boost/mpl/aux_/reverse_fold_impl_body.hpp>))\n#   include BOOST_PP_ITERATE()\n\n// implementation for N that exceeds BOOST_MPL_LIMIT_UNROLLING\ntemplate<\n      BOOST_MPL_AUX_NTTP_DECL(long, N)\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    > \nstruct AUX778076_FOLD_IMPL_NAME\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n\n    BOOST_MPL_PP_REPEAT(\n          BOOST_MPL_LIMIT_UNROLLING\n        , AUX778076_ITER_FOLD_FORWARD_STEP\n        , unused\n        )\n\n    typedef AUX778076_FOLD_IMPL_NAME<\n          ( (N - BOOST_MPL_LIMIT_UNROLLING) < 0 ? 0 : N - BOOST_MPL_LIMIT_UNROLLING )\n        , BOOST_PP_CAT(iter,BOOST_MPL_LIMIT_UNROLLING)\n        , Last\n        , BOOST_PP_CAT(fwd_state,BOOST_MPL_LIMIT_UNROLLING)\n        , BackwardOp\n        , ForwardOp\n        > nested_chunk;\n        \n    AUX778076_FIRST_BACKWARD_STATE_TYPEDEF(BOOST_MPL_LIMIT_UNROLLING)\n\n    BOOST_MPL_PP_REPEAT(\n          BOOST_MPL_LIMIT_UNROLLING\n        , AUX778076_ITER_FOLD_BACKWARD_STEP\n        , BOOST_MPL_LIMIT_UNROLLING\n        )\n\n    typedef bkwd_state0 state;\n    typedef typename nested_chunk::iterator iterator;\n};\n\n// fallback implementation for sequences of unknown size\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    > \nstruct AUX778076_FOLD_IMPL_NAME<-1,First,Last,State,BackwardOp,ForwardOp>\n{\n    typedef AUX778076_FOLD_IMPL_NAME<\n          -1\n        , typename mpl::next<First>::type\n        , Last\n        , typename apply2<ForwardOp,State,AUX778076_FOLD_IMPL_OP(First)>::type\n        , BackwardOp\n        , ForwardOp\n        > nested_step;\n\n    typedef typename apply2<\n          BackwardOp\n        , typename nested_step::state\n        , AUX778076_FOLD_IMPL_OP(First)\n        >::type state;\n\n    typedef typename nested_step::iterator iterator;\n};\n\ntemplate<\n      typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    > \nstruct AUX778076_FOLD_IMPL_NAME<-1,Last,Last,State,BackwardOp,ForwardOp>\n{\n    typedef State state;\n    typedef Last iterator;\n};\n\n#else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION\n\ntemplate< BOOST_MPL_AUX_NTTP_DECL(long, N) >\nstruct AUX778076_FOLD_CHUNK_NAME;\n\n#   define BOOST_PP_ITERATION_PARAMS_1 \\\n    (3,(0, BOOST_MPL_LIMIT_UNROLLING, <boost/mpl/aux_/reverse_fold_impl_body.hpp>))\n#   include BOOST_PP_ITERATE()\n\n// implementation for N that exceeds BOOST_MPL_LIMIT_UNROLLING\ntemplate< BOOST_MPL_AUX_NTTP_DECL(long, N) > \nstruct AUX778076_FOLD_CHUNK_NAME\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        > \n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n\n        BOOST_MPL_PP_REPEAT(\n              BOOST_MPL_LIMIT_UNROLLING\n            , AUX778076_ITER_FOLD_FORWARD_STEP\n            , unused\n            )\n\n        typedef AUX778076_FOLD_IMPL_NAME<\n              ( (N - BOOST_MPL_LIMIT_UNROLLING) < 0 ? 0 : N - BOOST_MPL_LIMIT_UNROLLING )\n            , BOOST_PP_CAT(iter,BOOST_MPL_LIMIT_UNROLLING)\n            , Last\n            , BOOST_PP_CAT(fwd_state,BOOST_MPL_LIMIT_UNROLLING)\n            , BackwardOp\n            , ForwardOp\n            > nested_chunk;\n            \n        AUX778076_FIRST_BACKWARD_STATE_TYPEDEF(BOOST_MPL_LIMIT_UNROLLING)\n\n        BOOST_MPL_PP_REPEAT(\n              BOOST_MPL_LIMIT_UNROLLING\n            , AUX778076_ITER_FOLD_BACKWARD_STEP\n            , BOOST_MPL_LIMIT_UNROLLING\n            )\n\n        typedef bkwd_state0 state;\n        typedef typename nested_chunk::iterator iterator;\n    };\n};\n\n// fallback implementation for sequences of unknown size\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    > \nstruct BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_step);\n\ntemplate<\n      typename Last\n    , typename State\n    >\nstruct BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_null_step)\n{\n    typedef Last iterator;\n    typedef State state;\n};\n\ntemplate<> \nstruct AUX778076_FOLD_CHUNK_NAME<-1>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        > \n    struct result_\n    {\n        typedef typename if_<\n              typename is_same<First,Last>::type\n            , BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_null_step)<Last,State>\n            , BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_step)<First,Last,State,BackwardOp,ForwardOp>\n            >::type res_;\n\n        typedef typename res_::state state;\n        typedef typename res_::iterator iterator;\n    };\n\n#if defined(BOOST_MPL_CFG_MSVC_60_ETI_BUG)\n    /// ETI workaround\n    template<> struct result_<int,int,int,int,int>\n    {\n        typedef int state;\n        typedef int iterator;\n    };\n#endif\n};\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    > \nstruct BOOST_PP_CAT(AUX778076_FOLD_IMPL_NAME_PREFIX,_step)\n{\n    typedef AUX778076_FOLD_CHUNK_NAME<-1>::template result_<\n          typename mpl::next<First>::type\n        , Last\n        , typename apply2<ForwardOp,State,AUX778076_FOLD_IMPL_OP(First)>::type\n        , BackwardOp\n        , ForwardOp\n        > nested_step;\n\n    typedef typename apply2<\n          BackwardOp\n        , typename nested_step::state\n        , AUX778076_FOLD_IMPL_OP(First)\n        >::type state;\n\n    typedef typename nested_step::iterator iterator;\n};\n\ntemplate<\n      BOOST_MPL_AUX_NTTP_DECL(long, N)\n    , typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    > \nstruct AUX778076_FOLD_IMPL_NAME\n    : AUX778076_FOLD_CHUNK_NAME<N>\n        ::template result_<First,Last,State,BackwardOp,ForwardOp>\n{\n};\n\n#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION\n\n}}}\n\n#   undef AUX778076_FIRST_BACKWARD_STATE_TYPEDEF\n#   undef AUX778076_ITER_FOLD_BACKWARD_STEP\n#   undef AUX778076_ITER_FOLD_BACKWARD_STEP_FUNC\n#   undef AUX778076_ITER_FOLD_FORWARD_STEP\n\n#undef AUX778076_FOLD_IMPL_OP\n#undef AUX778076_FOLD_IMPL_NAME_PREFIX\n\n///// iteration\n\n#else\n\n#   define n_ BOOST_PP_FRAME_ITERATION(1)\n\n#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \\\n    && !defined(BOOST_MPL_CFG_NO_NONTYPE_TEMPLATE_PARTIAL_SPEC)\n\ntemplate<\n      typename First\n    , typename Last\n    , typename State\n    , typename BackwardOp\n    , typename ForwardOp\n    >\nstruct AUX778076_FOLD_IMPL_NAME<n_,First,Last,State,BackwardOp,ForwardOp>\n{\n    typedef First iter0;\n    typedef State fwd_state0;\n\n    BOOST_MPL_PP_REPEAT(\n          n_\n        , AUX778076_ITER_FOLD_FORWARD_STEP\n        , unused\n        )\n\n    typedef BOOST_PP_CAT(fwd_state,n_) BOOST_PP_CAT(bkwd_state,n_);\n\n    BOOST_MPL_PP_REPEAT(\n          n_\n        , AUX778076_ITER_FOLD_BACKWARD_STEP\n        , n_\n        )\n\n    typedef bkwd_state0 state;\n    typedef BOOST_PP_CAT(iter,n_) iterator;\n};\n\n#else\n\ntemplate<> struct AUX778076_FOLD_CHUNK_NAME<n_>\n{\n    template<\n          typename First\n        , typename Last\n        , typename State\n        , typename BackwardOp\n        , typename ForwardOp\n        >\n    struct result_\n    {\n        typedef First iter0;\n        typedef State fwd_state0;\n\n        BOOST_MPL_PP_REPEAT(\n              n_\n            , AUX778076_ITER_FOLD_FORWARD_STEP\n            , unused\n            )\n\n        typedef BOOST_PP_CAT(fwd_state,n_) BOOST_PP_CAT(bkwd_state,n_);\n\n        BOOST_MPL_PP_REPEAT(\n              n_\n            , AUX778076_ITER_FOLD_BACKWARD_STEP\n            , n_\n            )\n\n        typedef bkwd_state0 state;\n        typedef BOOST_PP_CAT(iter,n_) iterator;\n    };\n\n#if defined(BOOST_MPL_CFG_MSVC_60_ETI_BUG)\n    /// ETI workaround\n    template<> struct result_<int,int,int,int,int>\n    {\n        typedef int state;\n        typedef int iterator;\n    };\n#endif\n};\n\n#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION\n\n#   undef n_\n\n#endif // BOOST_PP_IS_ITERATING\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/sequence_wrapper.hpp",
    "content": "\n// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION\n\n#if !defined(BOOST_PP_IS_ITERATING)\n\n///// header body\n\n// Copyright Aleksey Gurtovoy 2000-2008\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#   include <boost/mpl/aux_/config/ctps.hpp>\n#   include <boost/mpl/aux_/config/static_constant.hpp>\n#   include <boost/mpl/aux_/nttp_decl.hpp>\n\n#   include <boost/preprocessor/arithmetic/sub.hpp>\n#   include <boost/preprocessor/tuple/elem.hpp>\n#   include <boost/preprocessor/enum_params_with_a_default.hpp>\n#   include <boost/preprocessor/enum_params.hpp>\n#   include <boost/preprocessor/enum.hpp>\n#   include <boost/preprocessor/repeat.hpp>\n#   include <boost/preprocessor/comma_if.hpp>\n#   include <boost/preprocessor/iterate.hpp>\n\n#if defined(BOOST_MPL_PREPROCESSING_MODE)\n#   undef LONG_MAX\n#endif\n\nnamespace boost { namespace mpl {\n\n#if !defined(AUX778076_SEQUENCE_BASE_NAME)\n#   define AUX778076_SEQUENCE_BASE_NAME AUX778076_SEQUENCE_NAME\n#endif\n\n#if !defined(AUX778076_SEQUENCE_INTEGRAL_WRAPPER)\n\n#   define AUX778076_SEQUENCE_PARAM_NAME T\n#   define AUX778076_SEQUENCE_TEMPLATE_PARAM typename T\n#   define AUX778076_SEQUENCE_DEFAULT na\n\n#   define AUX778076_SEQUENCE_NAME_N(n) \\\n    BOOST_PP_CAT(AUX778076_SEQUENCE_BASE_NAME,n) \\\n    /**/\n\n#   define AUX778076_SEQUENCE_PARAMS() \\\n    BOOST_PP_ENUM_PARAMS( \\\n          AUX778076_SEQUENCE_LIMIT \\\n        , AUX778076_SEQUENCE_TEMPLATE_PARAM \\\n        ) \\\n    /**/\n\n#   define AUX778076_SEQUENCE_ARGS() \\\n    BOOST_PP_ENUM_PARAMS( \\\n          AUX778076_SEQUENCE_LIMIT \\\n        , T \\\n        ) \\\n    /**/\n\n#   define AUX778076_SEQUENCE_DEFAULT_PARAMS() \\\n     BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT( \\\n          AUX778076_SEQUENCE_LIMIT \\\n        , AUX778076_SEQUENCE_TEMPLATE_PARAM \\\n        , AUX778076_SEQUENCE_DEFAULT \\\n        ) \\\n    /**/\n\n#   define AUX778076_SEQUENCE_N_PARAMS(n) \\\n    BOOST_PP_ENUM_PARAMS(n, AUX778076_SEQUENCE_TEMPLATE_PARAM) \\\n    /**/\n\n#   define AUX778076_SEQUENCE_N_ARGS(n) \\\n    BOOST_PP_ENUM_PARAMS(n, T) \\\n    /**/\n\n#   define AUX778076_SEQUENCE_N_PARTIAL_SPEC_ARGS(n) \\\n    BOOST_PP_ENUM_PARAMS(n, T) \\\n    BOOST_PP_COMMA_IF(n) \\\n    BOOST_PP_ENUM( \\\n          BOOST_PP_SUB_D(1,AUX778076_SEQUENCE_LIMIT,n) \\\n        , BOOST_PP_TUPLE_ELEM_3_2 \\\n        , AUX778076_SEQUENCE_DEFAULT \\\n        ) \\\n    /**/\n\n#else // AUX778076_SEQUENCE_INTEGRAL_WRAPPER\n\n#   define AUX778076_SEQUENCE_PARAM_NAME C\n#   define AUX778076_SEQUENCE_TEMPLATE_PARAM BOOST_MPL_AUX_NTTP_DECL(long, C)\n#   define AUX778076_SEQUENCE_DEFAULT LONG_MAX\n\n#   define AUX778076_SEQUENCE_PARAMS() \\\n    typename T, BOOST_PP_ENUM_PARAMS( \\\n          AUX778076_SEQUENCE_LIMIT \\\n        , AUX778076_SEQUENCE_TEMPLATE_PARAM \\\n        ) \\\n    /**/\n\n#   define AUX778076_SEQUENCE_ARGS() \\\n    T, BOOST_PP_ENUM_PARAMS( \\\n          AUX778076_SEQUENCE_LIMIT \\\n        , C \\\n        ) \\\n    /**/\n\n#   define AUX778076_SEQUENCE_DEFAULT_PARAMS() \\\n    typename T, \\\n    BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT( \\\n          AUX778076_SEQUENCE_LIMIT \\\n        , AUX778076_SEQUENCE_TEMPLATE_PARAM \\\n        , AUX778076_SEQUENCE_DEFAULT \\\n        ) \\\n    /**/\n\n#   define AUX778076_SEQUENCE_N_PARAMS(n) \\\n    typename T BOOST_PP_COMMA_IF(n) \\\n    BOOST_PP_ENUM_PARAMS(n, AUX778076_SEQUENCE_TEMPLATE_PARAM) \\\n    /**/\n\n#   if !defined(AUX778076_SEQUENCE_CONVERT_CN_TO)\n#       define AUX778076_SEQUENCE_CONVERT_CN_TO(z,n,TARGET) BOOST_PP_CAT(C,n)\n#   endif\n\n#   define AUX778076_SEQUENCE_N_ARGS(n) \\\n    T BOOST_PP_COMMA_IF(n) \\\n    BOOST_PP_ENUM(n,AUX778076_SEQUENCE_CONVERT_CN_TO,T) \\\n    /**/\n\n#   define AUX778076_SEQUENCE_N_PARTIAL_SPEC_ARGS(n) \\\n    T, BOOST_PP_ENUM_PARAMS(n, C) \\\n    BOOST_PP_COMMA_IF(n) \\\n    BOOST_PP_ENUM( \\\n          BOOST_PP_SUB_D(1,AUX778076_SEQUENCE_LIMIT,n) \\\n        , BOOST_PP_TUPLE_ELEM_3_2 \\\n        , AUX778076_SEQUENCE_DEFAULT \\\n        ) \\\n    /**/\n\n#endif // AUX778076_SEQUENCE_INTEGRAL_WRAPPER\n\n\n#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)\n// forward declaration\ntemplate<\n      AUX778076_SEQUENCE_DEFAULT_PARAMS()\n    >\nstruct AUX778076_SEQUENCE_NAME;\n#else\nnamespace aux {\ntemplate< BOOST_MPL_AUX_NTTP_DECL(int, N) > \nstruct BOOST_PP_CAT(AUX778076_SEQUENCE_NAME,_chooser);\n}\n#endif\n\n#define BOOST_PP_ITERATION_PARAMS_1 \\\n    (3,(0, AUX778076_SEQUENCE_LIMIT, <boost/mpl/aux_/sequence_wrapper.hpp>))\n#include BOOST_PP_ITERATE()\n\n// real C++ version is already taken care of\n#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)\n\nnamespace aux {\n// ???_count_args\n#define AUX778076_COUNT_ARGS_PREFIX         AUX778076_SEQUENCE_NAME\n#define AUX778076_COUNT_ARGS_DEFAULT        AUX778076_SEQUENCE_DEFAULT\n#define AUX778076_COUNT_ARGS_PARAM_NAME     AUX778076_SEQUENCE_PARAM_NAME\n#define AUX778076_COUNT_ARGS_TEMPLATE_PARAM AUX778076_SEQUENCE_TEMPLATE_PARAM\n#define AUX778076_COUNT_ARGS_ARITY          AUX778076_SEQUENCE_LIMIT\n#define AUX778076_COUNT_ARGS_USE_STANDARD_PP_PRIMITIVES\n#include <boost/mpl/aux_/count_args.hpp>\n\ntemplate<\n      AUX778076_SEQUENCE_PARAMS()\n    >\nstruct BOOST_PP_CAT(AUX778076_SEQUENCE_NAME,_impl)\n{\n    typedef aux::BOOST_PP_CAT(AUX778076_SEQUENCE_NAME,_count_args)<\n          BOOST_PP_ENUM_PARAMS(AUX778076_SEQUENCE_LIMIT, AUX778076_SEQUENCE_PARAM_NAME)\n        > arg_num_;\n    \n    typedef typename aux::BOOST_PP_CAT(AUX778076_SEQUENCE_NAME,_chooser)< arg_num_::value >\n        ::template result_< AUX778076_SEQUENCE_ARGS() >::type type;\n};\n\n} // namespace aux\n\ntemplate<\n      AUX778076_SEQUENCE_DEFAULT_PARAMS()\n    >\nstruct AUX778076_SEQUENCE_NAME\n    : aux::BOOST_PP_CAT(AUX778076_SEQUENCE_NAME,_impl)<\n          AUX778076_SEQUENCE_ARGS()\n        >::type\n{\n    typedef typename aux::BOOST_PP_CAT(AUX778076_SEQUENCE_NAME,_impl)<\n          AUX778076_SEQUENCE_ARGS()\n        >::type type;\n};\n\n#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION\n\n#   undef AUX778076_SEQUENCE_N_PARTIAL_SPEC_ARGS\n#   undef AUX778076_SEQUENCE_N_ARGS\n#   undef AUX778076_SEQUENCE_CONVERT_CN_TO\n#   undef AUX778076_SEQUENCE_N_PARAMS\n#   undef AUX778076_SEQUENCE_DEFAULT_PARAMS\n#   undef AUX778076_SEQUENCE_ARGS\n#   undef AUX778076_SEQUENCE_PARAMS\n#   undef AUX778076_SEQUENCE_NAME_N\n#   undef AUX778076_SEQUENCE_DEFAULT\n#   undef AUX778076_SEQUENCE_TEMPLATE_PARAM\n#   undef AUX778076_SEQUENCE_PARAM_NAME\n#   undef AUX778076_SEQUENCE_LIMIT\n#   undef AUX778076_SEQUENCE_BASE_NAME\n#   undef AUX778076_SEQUENCE_NAME\n#   undef AUX778076_SEQUENCE_INTEGRAL_WRAPPER\n\n}}\n\n///// iteration\n\n#else\n#define i_ BOOST_PP_FRAME_ITERATION(1)\n\n#   if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)\n\n#if i_ == AUX778076_SEQUENCE_LIMIT\n\n/// primary template (not a specialization!)\ntemplate<\n      AUX778076_SEQUENCE_N_PARAMS(i_)\n    >\nstruct AUX778076_SEQUENCE_NAME\n    : AUX778076_SEQUENCE_NAME_N(i_)< AUX778076_SEQUENCE_N_ARGS(i_) >\n{\n    typedef typename AUX778076_SEQUENCE_NAME_N(i_)< AUX778076_SEQUENCE_N_ARGS(i_) >::type type;\n};\n\n#else\n\ntemplate<\n      AUX778076_SEQUENCE_N_PARAMS(i_)\n    >\nstruct AUX778076_SEQUENCE_NAME< AUX778076_SEQUENCE_N_PARTIAL_SPEC_ARGS(i_) >\n    : AUX778076_SEQUENCE_NAME_N(i_)< AUX778076_SEQUENCE_N_ARGS(i_) >\n{\n#if i_ > 0 || defined(AUX778076_SEQUENCE_INTEGRAL_WRAPPER)\n    typedef typename AUX778076_SEQUENCE_NAME_N(i_)< AUX778076_SEQUENCE_N_ARGS(i_) >::type type;\n#else\n    typedef AUX778076_SEQUENCE_NAME_N(i_)< AUX778076_SEQUENCE_N_ARGS(i_) >::type type;\n#endif\n};\n\n#endif // i_ == AUX778076_SEQUENCE_LIMIT\n\n#   else\n\nnamespace aux {\n\ntemplate<>\nstruct BOOST_PP_CAT(AUX778076_SEQUENCE_NAME,_chooser)<i_>\n{\n    template<\n          AUX778076_SEQUENCE_PARAMS()\n        >\n    struct result_\n    {\n#if i_ > 0 || defined(AUX778076_SEQUENCE_INTEGRAL_WRAPPER)\n        typedef typename AUX778076_SEQUENCE_NAME_N(i_)<\n              AUX778076_SEQUENCE_N_ARGS(i_)\n            >::type type;\n#else\n        typedef AUX778076_SEQUENCE_NAME_N(i_)<\n              AUX778076_SEQUENCE_N_ARGS(i_)\n            >::type type;\n#endif\n    };\n};\n\n} // namespace aux\n\n#   endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION\n\n#undef i_\n#endif // BOOST_PP_IS_ITERATING\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/static_cast.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_STATIC_CAST_HPP_INCLUDED\n#define BOOST_MPL_AUX_STATIC_CAST_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x561)) \\\n || BOOST_WORKAROUND(__GNUC__, < 3) \\\n || BOOST_WORKAROUND(__MWERKS__, <= 0x3001)\n#   define BOOST_MPL_AUX_STATIC_CAST(T, expr) (T)(expr)\n#else\n#   define BOOST_MPL_AUX_STATIC_CAST(T, expr) static_cast<T>(expr)\n#endif\n\n#endif // BOOST_MPL_AUX_STATIC_CAST_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/template_arity.hpp",
    "content": "\n#if !defined(BOOST_PP_IS_ITERATING)\n\n///// header body\n\n#ifndef BOOST_MPL_AUX_TEMPLATE_ARITY_HPP_INCLUDED\n#define BOOST_MPL_AUX_TEMPLATE_ARITY_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/ttp.hpp>\n#include <boost/mpl/aux_/config/lambda.hpp>\n\n#if !defined(BOOST_MPL_PREPROCESSING_MODE)\n#   include <boost/mpl/aux_/template_arity_fwd.hpp>\n#   include <boost/mpl/int.hpp>\n#   if !defined(BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT)\n#   if defined(BOOST_MPL_CFG_EXTENDED_TEMPLATE_PARAMETERS_MATCHING)\n#       include <boost/mpl/aux_/type_wrapper.hpp>\n#   endif\n#   else\n#       include <boost/mpl/aux_/has_rebind.hpp>\n#   endif\n#endif\n\n#include <boost/mpl/aux_/config/static_constant.hpp>\n#include <boost/mpl/aux_/config/use_preprocessed.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \\\n    && !defined(BOOST_MPL_PREPROCESSING_MODE)\n\n#   define BOOST_MPL_PREPROCESSED_HEADER template_arity.hpp\n#   include <boost/mpl/aux_/include_preprocessed.hpp>\n\n#else\n\n#   if !defined(BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT)\n#   if defined(BOOST_MPL_CFG_EXTENDED_TEMPLATE_PARAMETERS_MATCHING)\n\n#   include <boost/mpl/limits/arity.hpp>\n#   include <boost/mpl/aux_/preprocessor/range.hpp>\n#   include <boost/mpl/aux_/preprocessor/repeat.hpp>\n#   include <boost/mpl/aux_/preprocessor/params.hpp>\n#   include <boost/mpl/aux_/nttp_decl.hpp>\n\n#   include <boost/preprocessor/seq/fold_left.hpp>\n#   include <boost/preprocessor/comma_if.hpp>\n#   include <boost/preprocessor/iterate.hpp>\n#   include <boost/preprocessor/inc.hpp>\n#   include <boost/preprocessor/cat.hpp>\n\n#   define AUX778076_ARITY BOOST_PP_INC(BOOST_MPL_LIMIT_METAFUNCTION_ARITY)\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< BOOST_MPL_AUX_NTTP_DECL(int, N) > struct arity_tag\n{\n    typedef char (&type)[N + 1];\n};\n\n#   define AUX778076_MAX_ARITY_OP(unused, state, i_) \\\n    ( BOOST_PP_CAT(C,i_) > 0 ? BOOST_PP_CAT(C,i_) : state ) \\\n/**/\n\ntemplate<\n      BOOST_MPL_PP_PARAMS(AUX778076_ARITY, BOOST_MPL_AUX_NTTP_DECL(int, C))\n    >\nstruct max_arity\n{\n    BOOST_STATIC_CONSTANT(int, value = \n          BOOST_PP_SEQ_FOLD_LEFT(\n              AUX778076_MAX_ARITY_OP\n            , -1\n            , BOOST_MPL_PP_RANGE(1, AUX778076_ARITY)\n            )\n        );\n};\n\n#   undef AUX778076_MAX_ARITY_OP\n\narity_tag<0>::type arity_helper(...);\n\n#   define BOOST_PP_ITERATION_LIMITS (1, AUX778076_ARITY)\n#   define BOOST_PP_FILENAME_1 <boost/mpl/aux_/template_arity.hpp>\n#   include BOOST_PP_ITERATE()\n\ntemplate< typename F, BOOST_MPL_AUX_NTTP_DECL(int, N) >\nstruct template_arity_impl\n{\n    BOOST_STATIC_CONSTANT(int, value = \n          sizeof(::boost::mpl::aux::arity_helper(type_wrapper<F>(),arity_tag<N>())) - 1\n        );\n};\n\n#   define AUX778076_TEMPLATE_ARITY_IMPL_INVOCATION(unused, i_, F) \\\n    BOOST_PP_COMMA_IF(i_) template_arity_impl<F,BOOST_PP_INC(i_)>::value \\\n/**/\n\ntemplate< typename F >\nstruct template_arity\n{\n    BOOST_STATIC_CONSTANT(int, value = (\n          max_arity< BOOST_MPL_PP_REPEAT(\n              AUX778076_ARITY\n            , AUX778076_TEMPLATE_ARITY_IMPL_INVOCATION\n            , F\n            ) >::value\n        ));\n        \n    typedef mpl::int_<value> type;\n};\n\n#   undef AUX778076_TEMPLATE_ARITY_IMPL_INVOCATION\n\n#   undef AUX778076_ARITY\n\n}}}\n\n#   endif // BOOST_MPL_CFG_EXTENDED_TEMPLATE_PARAMETERS_MATCHING\n#   else // BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT\n\n#   include <boost/mpl/aux_/config/eti.hpp>\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< bool >\nstruct template_arity_impl\n{\n    template< typename F > struct result_\n        : mpl::int_<-1>\n    {\n    };\n};\n\ntemplate<>\nstruct template_arity_impl<true>\n{\n    template< typename F > struct result_\n        : F::arity\n    {\n    };\n};\n\ntemplate< typename F >\nstruct template_arity\n    : template_arity_impl< ::boost::mpl::aux::has_rebind<F>::value >\n        ::template result_<F>\n{\n};\n\n#if defined(BOOST_MPL_CFG_MSVC_ETI_BUG)\ntemplate<>\nstruct template_arity<int>\n    : mpl::int_<-1>\n{\n};\n#endif\n\n}}}\n\n#   endif // BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT\n\n#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS\n#endif // BOOST_MPL_AUX_TEMPLATE_ARITY_HPP_INCLUDED\n\n///// iteration\n\n#else\n#define i_ BOOST_PP_FRAME_ITERATION(1)\n\ntemplate<\n      template< BOOST_MPL_PP_PARAMS(i_, typename P) > class F\n    , BOOST_MPL_PP_PARAMS(i_, typename T)\n    >\ntypename arity_tag<i_>::type\narity_helper(type_wrapper< F<BOOST_MPL_PP_PARAMS(i_, T)> >, arity_tag<i_>);\n\n#undef i_\n#endif // BOOST_PP_IS_ITERATING\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/template_arity_fwd.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_TEMPLATE_ARITY_FWD_HPP_INCLUDED\n#define BOOST_MPL_AUX_TEMPLATE_ARITY_FWD_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< typename F > struct template_arity;\n\n}}}\n\n#endif // BOOST_MPL_AUX_TEMPLATE_ARITY_FWD_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/traits_lambda_spec.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_TRAITS_LAMBDA_SPEC_HPP_INCLUDED\n#define BOOST_MPL_AUX_TRAITS_LAMBDA_SPEC_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2008\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/sequence_tag_fwd.hpp>\n#include <boost/mpl/void.hpp>\n#include <boost/mpl/aux_/preprocessor/params.hpp>\n#include <boost/mpl/aux_/config/lambda.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT)\n\n#   define BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC_IMPL(i, trait) /**/\n\n#elif !defined(BOOST_MPL_CFG_MSVC_ETI_BUG)\n\n#   define BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC_IMPL(i, trait) \\\ntemplate<> struct trait<void_> \\\n{ \\\n    template< BOOST_MPL_PP_PARAMS(i, typename T) > struct apply \\\n    { \\\n    }; \\\n}; \\\n/**/\n\n#else\n\n#   define BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC_IMPL(i, trait) \\\ntemplate<> struct trait<void_> \\\n{ \\\n    template< BOOST_MPL_PP_PARAMS(i, typename T) > struct apply \\\n    { \\\n    }; \\\n}; \\\ntemplate<> struct trait<int> \\\n{ \\\n    template< BOOST_MPL_PP_PARAMS(i, typename T) > struct apply \\\n    { \\\n        typedef int type; \\\n    }; \\\n}; \\\n/**/\n\n#endif // BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT\n\n\n#define BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC(i, trait) \\\n    BOOST_MPL_ALGORITM_TRAITS_LAMBDA_SPEC_IMPL(i, trait) \\\n    template<> struct trait<non_sequence_tag> {}; \\\n/**/\n\n#endif // BOOST_MPL_AUX_TRAITS_LAMBDA_SPEC_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/type_wrapper.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_TYPE_WRAPPER_HPP_INCLUDED\n#define BOOST_MPL_AUX_TYPE_WRAPPER_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n// Copyright Peter Dimov 2000-2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/ctps.hpp>\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< typename T > struct type_wrapper\n{\n    typedef T type;\n};\n\n#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)\n// agurt 08/may/03: a complicated way to extract the wrapped type; need it \n// mostly for the sake of GCC (3.2.x), which ICEs if you try to extract the \n// nested 'type' from 'type_wrapper<T>' when the latter was the result of a\n// 'typeof' expression\ntemplate< typename T > struct wrapped_type;\n\ntemplate< typename T > struct wrapped_type< type_wrapper<T> >\n{\n    typedef T type;\n};\n#else\ntemplate< typename W > struct wrapped_type\n{\n    typedef typename W::type type;\n};\n#endif\n\n}}}\n\n#endif // BOOST_MPL_AUX_TYPE_WRAPPER_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/value_wknd.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_VALUE_WKND_HPP_INCLUDED\n#define BOOST_MPL_AUX_VALUE_WKND_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/static_cast.hpp>\n#include <boost/mpl/aux_/config/integral.hpp>\n#include <boost/mpl/aux_/config/eti.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n#if defined(BOOST_MPL_CFG_BCC_INTEGRAL_CONSTANTS) \\\n    || defined(BOOST_MPL_CFG_MSVC_60_ETI_BUG)\n\n#   include <boost/mpl/int.hpp>\n\nnamespace boost { namespace mpl { namespace aux {\ntemplate< typename C_ > struct value_wknd\n    : C_\n{\n};\n\n#if defined(BOOST_MPL_CFG_MSVC_60_ETI_BUG)\ntemplate<> struct value_wknd<int>\n    : int_<1>\n{\n    using int_<1>::value;\n};\n#endif\n}}}\n\n\n#if !defined(BOOST_MPL_CFG_MSVC_60_ETI_BUG)\n#   define BOOST_MPL_AUX_VALUE_WKND(C) \\\n    ::BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::aux::value_wknd< C > \\\n/**/\n#    define BOOST_MPL_AUX_MSVC_VALUE_WKND(C) BOOST_MPL_AUX_VALUE_WKND(C)\n#else\n#   define BOOST_MPL_AUX_VALUE_WKND(C) C\n#   define BOOST_MPL_AUX_MSVC_VALUE_WKND(C) \\\n    ::boost::mpl::aux::value_wknd< C > \\\n/**/\n#endif\n\n#else // BOOST_MPL_CFG_BCC_INTEGRAL_CONSTANTS\n\n#   define BOOST_MPL_AUX_VALUE_WKND(C) C\n#   define BOOST_MPL_AUX_MSVC_VALUE_WKND(C) C\n\n#endif\n\n#if BOOST_WORKAROUND(__EDG_VERSION__, <= 238)\n#   define BOOST_MPL_AUX_NESTED_VALUE_WKND(T, C) \\\n    BOOST_MPL_AUX_STATIC_CAST(T, C::value) \\\n/**/\n#else\n#   define BOOST_MPL_AUX_NESTED_VALUE_WKND(T, C) \\\n    BOOST_MPL_AUX_VALUE_WKND(C)::value \\\n/**/\n#endif\n\n\nnamespace boost { namespace mpl { namespace aux {\n\ntemplate< typename T > struct value_type_wknd\n{\n    typedef typename T::value_type type;\n};\n\n#if defined(BOOST_MPL_CFG_MSVC_ETI_BUG)\ntemplate<> struct value_type_wknd<int>\n{\n    typedef int type;\n};\n#endif\n\n}}}\n\n#endif // BOOST_MPL_AUX_VALUE_WKND_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/aux_/yes_no.hpp",
    "content": "\n#ifndef BOOST_MPL_AUX_YES_NO_HPP_INCLUDED\n#define BOOST_MPL_AUX_YES_NO_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/nttp_decl.hpp>\n#include <boost/mpl/aux_/config/arrays.hpp>\n#include <boost/mpl/aux_/config/msvc.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n\nnamespace boost { namespace mpl { namespace aux {\n\ntypedef char (&no_tag)[1];\ntypedef char (&yes_tag)[2];\n\ntemplate< bool C_ > struct yes_no_tag\n{\n    typedef no_tag type;\n};\n\ntemplate<> struct yes_no_tag<true>\n{\n    typedef yes_tag type;\n};\n\n\ntemplate< BOOST_MPL_AUX_NTTP_DECL(long, n) > struct weighted_tag\n{\n#if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)\n    typedef char (&type)[n];\n#else\n    char buf[n];\n    typedef weighted_tag type;\n#endif\n};\n\n#if defined(BOOST_MPL_CFG_NO_DEPENDENT_ARRAY_TYPES)\ntemplate<> struct weighted_tag<0>\n{\n    typedef char (&type)[1];\n};\n#endif\n\n}}}\n\n#endif // BOOST_MPL_AUX_YES_NO_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/base.hpp",
    "content": "\n#ifndef BOOST_MPL_BASE_HPP_INCLUDED\n#define BOOST_MPL_BASE_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/na_spec.hpp>\n#include <boost/mpl/aux_/lambda_support.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T)\n    >\nstruct base\n{\n    typedef typename T::base type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,base,(T))\n};\n\nBOOST_MPL_AUX_NA_SPEC(1, base)\n\n}}\n\n#endif // BOOST_MPL_BASE_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/begin.hpp",
    "content": "\n#ifndef BOOST_MPL_BEGIN_HPP_INCLUDED\n#define BOOST_MPL_BEGIN_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/begin_end.hpp>\n\n#endif // BOOST_MPL_BEGIN_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/begin_end.hpp",
    "content": "\n#ifndef BOOST_MPL_BEGIN_END_HPP_INCLUDED\n#define BOOST_MPL_BEGIN_END_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/begin_end_fwd.hpp>\n#include <boost/mpl/aux_/begin_end_impl.hpp>\n#include <boost/mpl/sequence_tag.hpp>\n#include <boost/mpl/aux_/na_spec.hpp>\n#include <boost/mpl/aux_/lambda_support.hpp>\n\nnamespace boost { namespace mpl {\n\n// agurt, 13/sep/02: switched from inheritance to typedef; MSVC is more\n// happy this way (less ETI-related errors), and it doesn't affect \n// anything else\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(Sequence)\n    >\nstruct begin\n{\n    typedef typename sequence_tag<Sequence>::type tag_;\n    typedef typename begin_impl< tag_ >\n        ::template apply< Sequence >::type type;\n\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,begin,(Sequence))\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(Sequence)\n    >\nstruct end\n{\n    typedef typename sequence_tag<Sequence>::type tag_;\n    typedef typename end_impl< tag_ >\n        ::template apply< Sequence >::type type;\n\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,end,(Sequence))\n};\n\nBOOST_MPL_AUX_NA_SPEC(1, begin)\nBOOST_MPL_AUX_NA_SPEC(1, end)\n\n}}\n\n#endif // BOOST_MPL_BEGIN_END_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/begin_end_fwd.hpp",
    "content": "\n#ifndef BOOST_MPL_BEGIN_END_FWD_HPP_INCLUDED\n#define BOOST_MPL_BEGIN_END_FWD_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\nnamespace boost { namespace mpl {\n\ntemplate< typename Tag > struct begin_impl;\ntemplate< typename Tag > struct end_impl;\n\ntemplate< typename Sequence > struct begin;\ntemplate< typename Sequence > struct end;\n\n}}\n\n#endif // BOOST_MPL_BEGIN_END_FWD_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/bind.hpp",
    "content": "\n#if !defined(BOOST_PP_IS_ITERATING)\n\n///// header body\n\n#ifndef BOOST_MPL_BIND_HPP_INCLUDED\n#define BOOST_MPL_BIND_HPP_INCLUDED\n\n// Copyright Peter Dimov 2001\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#if !defined(BOOST_MPL_PREPROCESSING_MODE)\n#   include <boost/mpl/bind_fwd.hpp>\n#   include <boost/mpl/placeholders.hpp>\n#   include <boost/mpl/next.hpp>\n#   include <boost/mpl/protect.hpp>\n#   include <boost/mpl/apply_wrap.hpp>\n#   include <boost/mpl/limits/arity.hpp>\n#   include <boost/mpl/aux_/na.hpp>\n#   include <boost/mpl/aux_/arity_spec.hpp>\n#   include <boost/mpl/aux_/type_wrapper.hpp>\n#   include <boost/mpl/aux_/yes_no.hpp>\n#   if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)\n#       include <boost/type_traits/is_reference.hpp>\n#   endif \n#endif\n\n#include <boost/mpl/aux_/config/bind.hpp>\n#include <boost/mpl/aux_/config/static_constant.hpp>\n#include <boost/mpl/aux_/config/use_preprocessed.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \\\n    && !defined(BOOST_MPL_PREPROCESSING_MODE)\n\n#   if defined(BOOST_MPL_CFG_NO_UNNAMED_PLACEHOLDER_SUPPORT)\n#       define BOOST_MPL_PREPROCESSED_HEADER basic_bind.hpp\n#   else\n#       define BOOST_MPL_PREPROCESSED_HEADER bind.hpp\n#   endif\n#   include <boost/mpl/aux_/include_preprocessed.hpp>\n\n#else\n\n#   include <boost/mpl/aux_/preprocessor/params.hpp>\n#   include <boost/mpl/aux_/preprocessor/default_params.hpp>\n#   include <boost/mpl/aux_/preprocessor/def_params_tail.hpp>\n#   include <boost/mpl/aux_/preprocessor/partial_spec_params.hpp>\n#   include <boost/mpl/aux_/preprocessor/ext_params.hpp>\n#   include <boost/mpl/aux_/preprocessor/repeat.hpp>\n#   include <boost/mpl/aux_/preprocessor/enum.hpp>\n#   include <boost/mpl/aux_/preprocessor/add.hpp>\n#   include <boost/mpl/aux_/config/dmc_ambiguous_ctps.hpp>\n#   include <boost/mpl/aux_/config/ctps.hpp>\n#   include <boost/mpl/aux_/config/ttp.hpp>\n#   include <boost/mpl/aux_/config/dtp.hpp>\n#   include <boost/mpl/aux_/nttp_decl.hpp>\n\n#   include <boost/preprocessor/iterate.hpp>\n#   include <boost/preprocessor/comma_if.hpp>\n#   include <boost/preprocessor/cat.hpp>\n#   include <boost/preprocessor/inc.hpp>\n\nnamespace boost { namespace mpl {\n\n// local macros, #undef-ined at the end of the header\n#   define AUX778076_APPLY \\\n    BOOST_PP_CAT(apply_wrap,BOOST_MPL_LIMIT_METAFUNCTION_ARITY) \\\n    /**/\n\n#   if defined(BOOST_MPL_CFG_DMC_AMBIGUOUS_CTPS)\n#       define AUX778076_DMC_PARAM() , int dummy_\n#   else\n#       define AUX778076_DMC_PARAM()\n#   endif\n\n#   define AUX778076_BIND_PARAMS(param) \\\n    BOOST_MPL_PP_PARAMS( \\\n          BOOST_MPL_LIMIT_METAFUNCTION_ARITY \\\n        , param \\\n        ) \\\n    /**/\n\n#   define AUX778076_BIND_DEFAULT_PARAMS(param, value) \\\n    BOOST_MPL_PP_DEFAULT_PARAMS( \\\n          BOOST_MPL_LIMIT_METAFUNCTION_ARITY \\\n        , param \\\n        , value \\\n        ) \\\n    /**/\n\n#   define AUX778076_BIND_N_PARAMS(n, param) \\\n    BOOST_PP_COMMA_IF(n) BOOST_MPL_PP_PARAMS(n, param) \\\n    /**/\n\n#   define AUX778076_BIND_N_SPEC_PARAMS(n, param, def) \\\n    BOOST_PP_COMMA_IF(n) \\\n    BOOST_MPL_PP_PARTIAL_SPEC_PARAMS(n, param, def) \\\n    /**/\n\n#if !defined(BOOST_MPL_CFG_NO_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES)\n#   define AUX778076_BIND_NESTED_DEFAULT_PARAMS(param, value) \\\n    AUX778076_BIND_DEFAULT_PARAMS(param, value) \\\n    /**/\n#else\n#   define AUX778076_BIND_NESTED_DEFAULT_PARAMS(param, value) \\\n    AUX778076_BIND_PARAMS(param) \\\n    /**/\n#endif\n\nnamespace aux {\n\n#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)\n\ntemplate<\n      typename T, AUX778076_BIND_PARAMS(typename U)\n    >\nstruct resolve_bind_arg\n{\n    typedef T type;\n};\n\n#   if !defined(BOOST_MPL_CFG_NO_UNNAMED_PLACEHOLDER_SUPPORT)\n\ntemplate<\n      typename T\n    , typename Arg\n    >\nstruct replace_unnamed_arg\n{\n    typedef Arg next;\n    typedef T type;\n};\n\ntemplate<\n      typename Arg\n    >\nstruct replace_unnamed_arg< arg<-1>,Arg >\n{\n    typedef typename Arg::next next;\n    typedef Arg type;\n};\n\n#   endif // BOOST_MPL_CFG_NO_UNNAMED_PLACEHOLDER_SUPPORT\n\ntemplate<\n      BOOST_MPL_AUX_NTTP_DECL(int, N), AUX778076_BIND_PARAMS(typename U)\n    >\nstruct resolve_bind_arg< arg<N>,AUX778076_BIND_PARAMS(U) >\n{\n    typedef typename AUX778076_APPLY<mpl::arg<N>, AUX778076_BIND_PARAMS(U)>::type type;\n};\n\n#if !defined(BOOST_MPL_CFG_NO_BIND_TEMPLATE)\ntemplate<\n      typename F, AUX778076_BIND_PARAMS(typename T), AUX778076_BIND_PARAMS(typename U)\n    >\nstruct resolve_bind_arg< bind<F,AUX778076_BIND_PARAMS(T)>,AUX778076_BIND_PARAMS(U) >\n{\n    typedef bind<F,AUX778076_BIND_PARAMS(T)> f_;\n    typedef typename AUX778076_APPLY<f_, AUX778076_BIND_PARAMS(U)>::type type;\n};\n#endif\n\n#else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION\n\n// agurt, 15/jan/02: it's not a intended to be used as a function class, and \n// MSVC6.5 has problems with 'apply' name here (the code compiles, but doesn't\n// work), so I went with the 'result_' here, and in all other similar cases\ntemplate< bool >\nstruct resolve_arg_impl\n{\n    template< typename T, AUX778076_BIND_PARAMS(typename U) > struct result_\n    {\n        typedef T type;\n    };\n};\n\ntemplate<> \nstruct resolve_arg_impl<true>\n{\n    template< typename T, AUX778076_BIND_PARAMS(typename U) > struct result_\n    {\n        typedef typename AUX778076_APPLY<\n              T\n            , AUX778076_BIND_PARAMS(U)\n            >::type type;\n    };\n};\n\n// for 'resolve_bind_arg'\ntemplate< typename T > struct is_bind_template;\n\ntemplate< \n      typename T, AUX778076_BIND_PARAMS(typename U)\n    >\nstruct resolve_bind_arg\n    : resolve_arg_impl< is_bind_template<T>::value >\n            ::template result_< T,AUX778076_BIND_PARAMS(U) >\n{\n};\n\n#   if !defined(BOOST_MPL_CFG_NO_UNNAMED_PLACEHOLDER_SUPPORT)\n\ntemplate< typename T > \nstruct replace_unnamed_arg_impl\n{\n    template< typename Arg > struct result_\n    {\n        typedef Arg next;\n        typedef T type;\n    };\n};\n\ntemplate<> \nstruct replace_unnamed_arg_impl< arg<-1> >\n{\n    template< typename Arg > struct result_\n    {\n        typedef typename next<Arg>::type next;\n        typedef Arg type;\n    };\n};\n\ntemplate< typename T, typename Arg > \nstruct replace_unnamed_arg\n    : replace_unnamed_arg_impl<T>::template result_<Arg>\n{\n};\n\n#   endif // BOOST_MPL_CFG_NO_UNNAMED_PLACEHOLDER_SUPPORT\n\n// agurt, 10/mar/02: the forward declaration has to appear before any of\n// 'is_bind_helper' overloads, otherwise MSVC6.5 issues an ICE on it\ntemplate< BOOST_MPL_AUX_NTTP_DECL(int, arity_) > struct bind_chooser;\n\naux::no_tag is_bind_helper(...);\ntemplate< typename T > aux::no_tag is_bind_helper(protect<T>*);\n\n// overload for \"main\" form\n// agurt, 15/mar/02: MSVC 6.5 fails to properly resolve the overload \n// in case if we use 'aux::type_wrapper< bind<...> >' here, and all \n// 'bind' instantiations form a complete type anyway\n#if !defined(BOOST_MPL_CFG_NO_BIND_TEMPLATE)\ntemplate<\n      typename F, AUX778076_BIND_PARAMS(typename T)\n    >\naux::yes_tag is_bind_helper(bind<F,AUX778076_BIND_PARAMS(T)>*);\n#endif\n\ntemplate< BOOST_MPL_AUX_NTTP_DECL(int, N) >\naux::yes_tag is_bind_helper(arg<N>*);\n\ntemplate< bool is_ref_ = true >\nstruct is_bind_template_impl\n{\n    template< typename T > struct result_\n    {\n        BOOST_STATIC_CONSTANT(bool, value = false);\n    };\n};\n\ntemplate<>\nstruct is_bind_template_impl<false>\n{\n    template< typename T > struct result_\n    {\n        BOOST_STATIC_CONSTANT(bool, value = \n              sizeof(aux::is_bind_helper(static_cast<T*>(0))) \n                == sizeof(aux::yes_tag)\n            );\n    };\n};\n\ntemplate< typename T > struct is_bind_template\n    : is_bind_template_impl< ::boost::detail::is_reference_impl<T>::value >\n        ::template result_<T>\n{\n};\n\n#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION\n\n} // namespace aux\n\n\n#define BOOST_PP_ITERATION_PARAMS_1 \\\n    (3,(0, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, <boost/mpl/bind.hpp>))\n#include BOOST_PP_ITERATE()\n\n#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \\\n    && !defined(BOOST_MPL_CFG_NO_TEMPLATE_TEMPLATE_PARAMETERS)\n/// if_/eval_if specializations\n#   define AUX778076_SPEC_NAME if_\n#   define BOOST_PP_ITERATION_PARAMS_1 (3,(3, 3, <boost/mpl/bind.hpp>))\n#   include BOOST_PP_ITERATE()\n\n#if !defined(BOOST_MPL_CFG_DMC_AMBIGUOUS_CTPS)\n#   define AUX778076_SPEC_NAME eval_if\n#   define BOOST_PP_ITERATION_PARAMS_1 (3,(3, 3, <boost/mpl/bind.hpp>))\n#   include BOOST_PP_ITERATE()\n#endif\n#endif\n\n// real C++ version is already taken care of\n#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \\\n    && !defined(BOOST_MPL_CFG_NO_BIND_TEMPLATE)\n\nnamespace aux {\n// apply_count_args\n#define AUX778076_COUNT_ARGS_PREFIX bind\n#define AUX778076_COUNT_ARGS_DEFAULT na\n#define AUX778076_COUNT_ARGS_ARITY BOOST_MPL_LIMIT_METAFUNCTION_ARITY\n#include <boost/mpl/aux_/count_args.hpp>\n}\n\n// bind\ntemplate<\n      typename F, AUX778076_BIND_PARAMS(typename T) AUX778076_DMC_PARAM()\n    >\nstruct bind\n    : aux::bind_chooser<\n          aux::bind_count_args<AUX778076_BIND_PARAMS(T)>::value\n        >::template result_< F,AUX778076_BIND_PARAMS(T) >::type\n{\n};\n\nBOOST_MPL_AUX_ARITY_SPEC(\n      BOOST_PP_INC(BOOST_MPL_LIMIT_METAFUNCTION_ARITY)\n    , bind\n    )\n\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(\n      BOOST_PP_INC(BOOST_MPL_LIMIT_METAFUNCTION_ARITY)\n    , bind\n    )\n\n\n#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION\n\n#   undef AUX778076_BIND_NESTED_DEFAULT_PARAMS\n#   undef AUX778076_BIND_N_SPEC_PARAMS\n#   undef AUX778076_BIND_N_PARAMS\n#   undef AUX778076_BIND_DEFAULT_PARAMS\n#   undef AUX778076_BIND_PARAMS\n#   undef AUX778076_DMC_PARAM\n#   undef AUX778076_APPLY\n\n}}\n\n#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS\n#endif // BOOST_MPL_BIND_HPP_INCLUDED\n\n///// iteration, depth == 1\n\n// For gcc 4.4 compatability, we must include the\n// BOOST_PP_ITERATION_DEPTH test inside an #else clause.\n#else // BOOST_PP_IS_ITERATING\n#if BOOST_PP_ITERATION_DEPTH() == 1\n\n#   define i_ BOOST_PP_FRAME_ITERATION(1)\n\n#if defined(AUX778076_SPEC_NAME)\n\n// lazy metafunction specialization\ntemplate< template< BOOST_MPL_PP_PARAMS(i_, typename T) > class F, typename Tag >\nstruct BOOST_PP_CAT(quote,i_);\n\ntemplate< BOOST_MPL_PP_PARAMS(i_, typename T) > struct AUX778076_SPEC_NAME;\n\ntemplate<\n      typename Tag AUX778076_BIND_N_PARAMS(i_, typename T)\n    >\nstruct BOOST_PP_CAT(bind,i_)< \n      BOOST_PP_CAT(quote,i_)<AUX778076_SPEC_NAME,Tag>\n    AUX778076_BIND_N_PARAMS(i_,T)\n    >\n{\n    template<\n          AUX778076_BIND_NESTED_DEFAULT_PARAMS(typename U, na)\n        >\n    struct apply\n    {\n     private:\n        typedef mpl::arg<1> n1;\n#       define BOOST_PP_ITERATION_PARAMS_2 (3,(1, i_, <boost/mpl/bind.hpp>))\n#       include BOOST_PP_ITERATE()\n\n        typedef typename AUX778076_SPEC_NAME<\n              typename t1::type\n            , BOOST_MPL_PP_EXT_PARAMS(2, BOOST_PP_INC(i_), t)\n            >::type f_;\n\n     public:\n        typedef typename f_::type type;\n    };\n};\n\n#undef AUX778076_SPEC_NAME\n\n#else // AUX778076_SPEC_NAME\n\ntemplate<\n      typename F AUX778076_BIND_N_PARAMS(i_, typename T) AUX778076_DMC_PARAM()\n    >\nstruct BOOST_PP_CAT(bind,i_)\n{\n    template<\n          AUX778076_BIND_NESTED_DEFAULT_PARAMS(typename U, na)\n        >\n    struct apply\n    {\n     private:\n#   if !defined(BOOST_MPL_CFG_NO_UNNAMED_PLACEHOLDER_SUPPORT)\n\n        typedef aux::replace_unnamed_arg< F,mpl::arg<1> > r0;\n        typedef typename r0::type a0;\n        typedef typename r0::next n1;\n        typedef typename aux::resolve_bind_arg<a0,AUX778076_BIND_PARAMS(U)>::type f_;\n        ///\n#   else\n        typedef typename aux::resolve_bind_arg<F,AUX778076_BIND_PARAMS(U)>::type f_;\n\n#   endif // BOOST_MPL_CFG_NO_UNNAMED_PLACEHOLDER_SUPPORT\n\n#   if i_ > 0\n#       define BOOST_PP_ITERATION_PARAMS_2 (3,(1, i_, <boost/mpl/bind.hpp>))\n#       include BOOST_PP_ITERATE()\n#   endif\n\n     public:\n\n#   define AUX778076_ARG(unused, i_, t) \\\n    BOOST_PP_COMMA_IF(i_) \\\n    typename BOOST_PP_CAT(t,BOOST_PP_INC(i_))::type \\\n/**/\n\n        typedef typename BOOST_PP_CAT(apply_wrap,i_)<\n              f_ \n            BOOST_PP_COMMA_IF(i_) BOOST_MPL_PP_REPEAT(i_, AUX778076_ARG, t)\n            >::type type;\n\n#   undef AUX778076_ARG\n    };\n};\n\nnamespace aux {\n\n#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)\n\ntemplate<\n      typename F AUX778076_BIND_N_PARAMS(i_, typename T), AUX778076_BIND_PARAMS(typename U)\n    >\nstruct resolve_bind_arg<\n      BOOST_PP_CAT(bind,i_)<F AUX778076_BIND_N_PARAMS(i_,T)>,AUX778076_BIND_PARAMS(U)\n    >\n{\n    typedef BOOST_PP_CAT(bind,i_)<F AUX778076_BIND_N_PARAMS(i_,T)> f_;\n    typedef typename AUX778076_APPLY<f_, AUX778076_BIND_PARAMS(U)>::type type;\n};\n\n#else\n\ntemplate<\n      typename F AUX778076_BIND_N_PARAMS(i_, typename T)\n    >\naux::yes_tag\nis_bind_helper(BOOST_PP_CAT(bind,i_)<F AUX778076_BIND_N_PARAMS(i_,T)>*);\n\n#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION\n\n} // namespace aux\n\nBOOST_MPL_AUX_ARITY_SPEC(BOOST_PP_INC(i_), BOOST_PP_CAT(bind,i_))\nBOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(BOOST_PP_INC(i_), BOOST_PP_CAT(bind,i_))\n\n#   if !defined(BOOST_MPL_CFG_NO_BIND_TEMPLATE)\n#   if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)\n    \n#if i_ == BOOST_MPL_LIMIT_METAFUNCTION_ARITY\n/// primary template (not a specialization!)\ntemplate<\n      typename F AUX778076_BIND_N_PARAMS(i_, typename T) AUX778076_DMC_PARAM()\n    >\nstruct bind\n    : BOOST_PP_CAT(bind,i_)<F AUX778076_BIND_N_PARAMS(i_,T) >\n{\n};\n#else\ntemplate<\n      typename F AUX778076_BIND_N_PARAMS(i_, typename T) AUX778076_DMC_PARAM()\n    >\nstruct bind< F AUX778076_BIND_N_SPEC_PARAMS(i_, T, na) >\n    : BOOST_PP_CAT(bind,i_)<F AUX778076_BIND_N_PARAMS(i_,T) >\n{\n};\n#endif\n\n#   else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION\n\nnamespace aux {\n\ntemplate<>\nstruct bind_chooser<i_>\n{\n    template<\n          typename F, AUX778076_BIND_PARAMS(typename T)\n        >\n    struct result_\n    {\n        typedef BOOST_PP_CAT(bind,i_)< F AUX778076_BIND_N_PARAMS(i_,T) > type;\n    };\n};\n\n} // namespace aux\n\n#   endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION\n#   endif // BOOST_MPL_CFG_NO_BIND_TEMPLATE\n\n#endif // AUX778076_SPEC_NAME\n\n#   undef i_\n\n///// iteration, depth == 2\n\n#elif BOOST_PP_ITERATION_DEPTH() == 2\n\n#   define j_ BOOST_PP_FRAME_ITERATION(2)\n#   if !defined(BOOST_MPL_CFG_NO_UNNAMED_PLACEHOLDER_SUPPORT)\n\n        typedef aux::replace_unnamed_arg< BOOST_PP_CAT(T,j_),BOOST_PP_CAT(n,j_) > BOOST_PP_CAT(r,j_);\n        typedef typename BOOST_PP_CAT(r,j_)::type BOOST_PP_CAT(a,j_);\n        typedef typename BOOST_PP_CAT(r,j_)::next BOOST_PP_CAT(n,BOOST_PP_INC(j_));\n        typedef aux::resolve_bind_arg<BOOST_PP_CAT(a,j_), AUX778076_BIND_PARAMS(U)> BOOST_PP_CAT(t,j_);\n        ///\n#   else\n        typedef aux::resolve_bind_arg< BOOST_PP_CAT(T,j_),AUX778076_BIND_PARAMS(U)> BOOST_PP_CAT(t,j_);\n\n#   endif\n#   undef j_\n\n#endif // BOOST_PP_ITERATION_DEPTH()\n#endif // BOOST_PP_IS_ITERATING\n"
  },
  {
    "path": "benchmarks/boost/mpl/bind_fwd.hpp",
    "content": "\n#if !defined(BOOST_PP_IS_ITERATING)\n\n///// header body\n\n#ifndef BOOST_MPL_BIND_FWD_HPP_INCLUDED\n#define BOOST_MPL_BIND_FWD_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#if !defined(BOOST_MPL_PREPROCESSING_MODE)\n#   include <boost/mpl/aux_/na.hpp>\n#endif\n\n#include <boost/mpl/aux_/config/bind.hpp>\n#include <boost/mpl/aux_/config/use_preprocessed.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \\\n    && !defined(BOOST_MPL_PREPROCESSING_MODE)\n\n#   define BOOST_MPL_PREPROCESSED_HEADER bind_fwd.hpp\n#   include <boost/mpl/aux_/include_preprocessed.hpp>\n\n#else\n\n#   include <boost/mpl/limits/arity.hpp>\n#   include <boost/mpl/aux_/preprocessor/params.hpp>\n#   include <boost/mpl/aux_/preprocessor/default_params.hpp>\n#   include <boost/mpl/aux_/config/dmc_ambiguous_ctps.hpp>\n\n#   include <boost/preprocessor/comma_if.hpp>\n#   include <boost/preprocessor/iterate.hpp>\n#   include <boost/preprocessor/cat.hpp>\n\nnamespace boost { namespace mpl {\n\n// local macros, #undef-ined at the end of the header\n\n#   if defined(BOOST_MPL_CFG_DMC_AMBIGUOUS_CTPS)\n#       define AUX778076_DMC_PARAM() , int dummy_ = 0\n#   else\n#       define AUX778076_DMC_PARAM()\n#   endif\n\n#   define AUX778076_BIND_DEFAULT_PARAMS(param, value) \\\n    BOOST_MPL_PP_DEFAULT_PARAMS( \\\n          BOOST_MPL_LIMIT_METAFUNCTION_ARITY \\\n        , param \\\n        , value \\\n        ) \\\n    AUX778076_DMC_PARAM() \\\n    /**/\n\n#   define AUX778076_BIND_N_PARAMS(n, param) \\\n    BOOST_PP_COMMA_IF(n) BOOST_MPL_PP_PARAMS(n, param) \\\n    AUX778076_DMC_PARAM() \\\n    /**/\n\n#if !defined(BOOST_MPL_CFG_NO_BIND_TEMPLATE)\ntemplate<\n      typename F, AUX778076_BIND_DEFAULT_PARAMS(typename T, na)\n    >\nstruct bind;\n#endif\n\n#define BOOST_PP_ITERATION_PARAMS_1 \\\n    (3,(0, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, <boost/mpl/bind_fwd.hpp>))\n#include BOOST_PP_ITERATE()\n\n#   undef AUX778076_BIND_N_PARAMS\n#   undef AUX778076_BIND_DEFAULT_PARAMS\n#   undef AUX778076_DMC_PARAM\n}}\n\n#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS\n#endif // BOOST_MPL_BIND_FWD_HPP_INCLUDED\n\n///// iteration\n\n#else\n#define i_ BOOST_PP_FRAME_ITERATION(1)\n\ntemplate<\n      typename F AUX778076_BIND_N_PARAMS(i_, typename T)\n    >\nstruct BOOST_PP_CAT(bind,i_);\n\n#undef i_\n#endif // BOOST_PP_IS_ITERATING\n"
  },
  {
    "path": "benchmarks/boost/mpl/bool.hpp",
    "content": "\n#ifndef BOOST_MPL_BOOL_HPP_INCLUDED\n#define BOOST_MPL_BOOL_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/bool_fwd.hpp>\n#include <boost/mpl/integral_c_tag.hpp>\n#include <boost/mpl/aux_/config/static_constant.hpp>\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\n\ntemplate< bool C_ > struct bool_\n{\n    BOOST_STATIC_CONSTANT(bool, value = C_);\n    typedef integral_c_tag tag;\n    typedef bool_ type;\n    typedef bool value_type;\n    BOOST_CONSTEXPR operator bool() const { return this->value; }\n};\n\n#if !defined(BOOST_NO_INCLASS_MEMBER_INITIALIZATION)\ntemplate< bool C_ >\nbool const bool_<C_>::value;\n#endif\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\n\n#endif // BOOST_MPL_BOOL_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/bool_fwd.hpp",
    "content": "\n#ifndef BOOST_MPL_BOOL_FWD_HPP_INCLUDED\n#define BOOST_MPL_BOOL_FWD_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/adl_barrier.hpp>\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\n\ntemplate< bool C_ > struct bool_;\n\n// shorcuts\ntypedef bool_<true> true_;\ntypedef bool_<false> false_;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\n\nBOOST_MPL_AUX_ADL_BARRIER_DECL(bool_)\nBOOST_MPL_AUX_ADL_BARRIER_DECL(true_)\nBOOST_MPL_AUX_ADL_BARRIER_DECL(false_)\n\n#endif // BOOST_MPL_BOOL_FWD_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/clear.hpp",
    "content": "\n#ifndef BOOST_MPL_CLEAR_HPP_INCLUDED\n#define BOOST_MPL_CLEAR_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/clear_fwd.hpp>\n#include <boost/mpl/aux_/clear_impl.hpp>\n#include <boost/mpl/sequence_tag.hpp>\n#include <boost/mpl/aux_/na_spec.hpp>\n#include <boost/mpl/aux_/lambda_support.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(Sequence)\n    >\nstruct clear\n    : clear_impl< typename sequence_tag<Sequence>::type >\n        ::template apply< Sequence >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,clear,(Sequence))\n};\n\nBOOST_MPL_AUX_NA_SPEC(1, clear)\n\n}}\n\n#endif // BOOST_MPL_CLEAR_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/clear_fwd.hpp",
    "content": "\n#ifndef BOOST_MPL_CLEAR_FWD_HPP_INCLUDED\n#define BOOST_MPL_CLEAR_FWD_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\nnamespace boost { namespace mpl {\n\ntemplate< typename Tag > struct clear_impl;\ntemplate< typename Sequence > struct clear;\n\n}}\n\n#endif // BOOST_MPL_CLEAR_FWD_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/deref.hpp",
    "content": "\n#ifndef BOOST_MPL_DEREF_HPP_INCLUDED\n#define BOOST_MPL_DEREF_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2002-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/msvc_type.hpp>\n#include <boost/mpl/aux_/na_spec.hpp>\n#include <boost/mpl/aux_/lambda_support.hpp>\n#include <boost/mpl/aux_/config/eti.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(Iterator)\n    >\nstruct deref\n{\n#if !defined(BOOST_MPL_CFG_MSVC_70_ETI_BUG)\n    typedef typename Iterator::type type;\n#else\n    typedef typename aux::msvc_type<Iterator>::type type;\n#endif\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,deref,(Iterator))\n};\n\nBOOST_MPL_AUX_NA_SPEC(1, deref)\n\n}}\n\n#endif // BOOST_MPL_DEREF_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/empty_fwd.hpp",
    "content": "\n#ifndef BOOST_MPL_EMPTY_FWD_HPP_INCLUDED\n#define BOOST_MPL_EMPTY_FWD_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\nnamespace boost { namespace mpl {\n\ntemplate< typename Tag > struct empty_impl;\ntemplate< typename Sequence > struct empty;\n\n}}\n\n#endif // BOOST_MPL_EMPTY_FWD_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/end.hpp",
    "content": "\n#ifndef BOOST_MPL_END_HPP_INCLUDED\n#define BOOST_MPL_END_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/begin_end.hpp>\n\n#endif // BOOST_MPL_END_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/erase_fwd.hpp",
    "content": "\n#ifndef BOOST_MPL_ERASE_FWD_HPP_INCLUDED\n#define BOOST_MPL_ERASE_FWD_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\nnamespace boost { namespace mpl {\n\ntemplate< typename Tag > struct erase_impl;\ntemplate< typename Sequence, typename First, typename Last > struct erase;\n\n}}\n\n#endif // BOOST_MPL_ERASE_FWD_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/erase_key_fwd.hpp",
    "content": "\n#ifndef BOOST_MPL_ERASE_KEY_FWD_HPP_INCLUDED\n#define BOOST_MPL_ERASE_KEY_FWD_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\nnamespace boost { namespace mpl {\n\ntemplate< typename Tag > struct erase_key_impl;\ntemplate< typename Sequence, typename Key > struct erase_key;\n\n}}\n\n#endif // BOOST_MPL_ERASE_KEY_FWD_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/eval_if.hpp",
    "content": "\n#ifndef BOOST_MPL_EVAL_IF_HPP_INCLUDED\n#define BOOST_MPL_EVAL_IF_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0.\n// (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/if.hpp>\n#include <boost/mpl/aux_/na_spec.hpp>\n#include <boost/mpl/aux_/lambda_support.hpp>\n#include <boost/mpl/aux_/config/msvc.hpp>\n#include <boost/mpl/aux_/config/gcc.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(C)\n    , typename BOOST_MPL_AUX_NA_PARAM(F1)\n    , typename BOOST_MPL_AUX_NA_PARAM(F2)\n    >\nstruct eval_if\n#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) \\\n     || ( BOOST_WORKAROUND(BOOST_MPL_CFG_GCC, >= 0x0300) \\\n        && BOOST_WORKAROUND(BOOST_MPL_CFG_GCC, BOOST_TESTED_AT(0x0304)) \\\n        )\n{\n    typedef typename if_<C,F1,F2>::type f_;\n    typedef typename f_::type type;\n#else\n    : if_<C,F1,F2>::type\n{\n#endif\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(3,eval_if,(C,F1,F2))\n};\n\n// (almost) copy & paste in order to save one more\n// recursively nested template instantiation to user\ntemplate<\n      bool C\n    , typename F1\n    , typename F2\n    >\nstruct eval_if_c\n#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) \\\n     || ( BOOST_WORKAROUND(BOOST_MPL_CFG_GCC, >= 0x0300) \\\n        && BOOST_WORKAROUND(BOOST_MPL_CFG_GCC, BOOST_TESTED_AT(0x0304)) \\\n        )\n{\n    typedef typename if_c<C,F1,F2>::type f_;\n    typedef typename f_::type type;\n#else\n    : if_c<C,F1,F2>::type\n{\n#endif\n};\n\nBOOST_MPL_AUX_NA_SPEC(3, eval_if)\n\n}}\n\n#endif // BOOST_MPL_EVAL_IF_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/find.hpp",
    "content": "\n#ifndef BOOST_MPL_FIND_HPP_INCLUDED\n#define BOOST_MPL_FIND_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2002\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/find_if.hpp>\n#include <boost/mpl/same_as.hpp>\n#include <boost/mpl/aux_/na_spec.hpp>\n#include <boost/mpl/aux_/lambda_support.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(Sequence)\n    , typename BOOST_MPL_AUX_NA_PARAM(T)\n    >\nstruct find\n    : find_if< Sequence,same_as<T> >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2,find,(Sequence,T))\n};\n\nBOOST_MPL_AUX_NA_SPEC(2, find)\n\n}}\n\n#endif // BOOST_MPL_FIND_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/find_if.hpp",
    "content": "\n#ifndef BOOST_MPL_FIND_IF_HPP_INCLUDED\n#define BOOST_MPL_FIND_IF_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/find_if_pred.hpp>\n#include <boost/mpl/arg.hpp>\n#include <boost/mpl/iter_fold_if.hpp>\n#include <boost/mpl/aux_/common_name_wknd.hpp>\n#include <boost/mpl/aux_/na_spec.hpp>\n#include <boost/mpl/aux_/lambda_support.hpp>\n\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_COMMON_NAME_WKND(find_if)\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(Sequence)\n    , typename BOOST_MPL_AUX_NA_PARAM(Predicate)\n    >\nstruct find_if\n{\n    typedef typename iter_fold_if<\n          Sequence\n        , void\n        , mpl::arg<1> // ignore\n        , protect< aux::find_if_pred<Predicate> >\n        >::type result_;\n\n    typedef typename second<result_>::type type;\n\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2,find_if,(Sequence,Predicate))\n};\n\nBOOST_MPL_AUX_NA_SPEC(2,find_if)\n\n}}\n\n#endif // BOOST_MPL_FIND_IF_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/fold.hpp",
    "content": "\n#ifndef BOOST_MPL_FOLD_HPP_INCLUDED\n#define BOOST_MPL_FOLD_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2001-2004\n// Copyright David Abrahams 2001-2002\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/begin_end.hpp>\n#include <boost/mpl/O1_size.hpp>\n#include <boost/mpl/aux_/fold_impl.hpp>\n#include <boost/mpl/aux_/na_spec.hpp>\n#include <boost/mpl/aux_/lambda_support.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(Sequence)\n    , typename BOOST_MPL_AUX_NA_PARAM(State)\n    , typename BOOST_MPL_AUX_NA_PARAM(ForwardOp)\n    >\nstruct fold\n{\n    typedef typename aux::fold_impl<\n          ::boost::mpl::O1_size<Sequence>::value\n        , typename begin<Sequence>::type\n        , typename end<Sequence>::type\n        , State\n        , ForwardOp\n        >::state type;\n\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(3,fold,(Sequence,State,ForwardOp))\n};\n\nBOOST_MPL_AUX_NA_SPEC(3, fold)\n\n}}\n\n#endif // BOOST_MPL_FOLD_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/front_fwd.hpp",
    "content": "\n#ifndef BOOST_MPL_FRONT_FWD_HPP_INCLUDED\n#define BOOST_MPL_FRONT_FWD_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\nnamespace boost { namespace mpl {\n\ntemplate< typename Tag > struct front_impl;\ntemplate< typename Sequence > struct front;\n\n}}\n\n#endif // BOOST_MPL_FRONT_FWD_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/has_key.hpp",
    "content": "\n#ifndef BOOST_MPL_HAS_KEY_HPP_INCLUDED\n#define BOOST_MPL_HAS_KEY_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2003-2004\n// Copyright David Abrahams 2003-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/has_key_fwd.hpp>\n#include <boost/mpl/sequence_tag.hpp>\n#include <boost/mpl/aux_/has_key_impl.hpp>\n#include <boost/mpl/aux_/na_spec.hpp>\n#include <boost/mpl/aux_/lambda_support.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(AssociativeSequence)\n    , typename BOOST_MPL_AUX_NA_PARAM(Key)\n    >\nstruct has_key\n    : has_key_impl< typename sequence_tag<AssociativeSequence>::type >\n        ::template apply<AssociativeSequence,Key>\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2,has_key,(AssociativeSequence,Key))\n};\n\nBOOST_MPL_AUX_NA_SPEC(2, has_key)\n\n}}\n\n#endif // BOOST_MPL_HAS_KEY_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/has_key_fwd.hpp",
    "content": "\n#ifndef BOOST_MPL_HAS_KEY_FWD_HPP_INCLUDED\n#define BOOST_MPL_HAS_KEY_FWD_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2003-2004\n// Copyright David Abrahams 2003-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\nnamespace boost { namespace mpl {\n\ntemplate< typename Tag > struct has_key_impl;\ntemplate< typename AssociativeSequence, typename Key > struct has_key;\n\n}}\n\n#endif // BOOST_MPL_HAS_KEY_FWD_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/has_xxx.hpp",
    "content": "\n#ifndef BOOST_MPL_HAS_XXX_HPP_INCLUDED\n#define BOOST_MPL_HAS_XXX_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2002-2006\n// Copyright David Abrahams 2002-2003\n// Copyright Daniel Walker 2007\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/bool.hpp>\n#include <boost/mpl/aux_/na_spec.hpp>\n#include <boost/mpl/aux_/type_wrapper.hpp>\n#include <boost/mpl/aux_/yes_no.hpp>\n#include <boost/mpl/aux_/config/gcc.hpp>\n#include <boost/mpl/aux_/config/has_xxx.hpp>\n#include <boost/mpl/aux_/config/msvc_typename.hpp>\n#include <boost/mpl/aux_/config/msvc.hpp>\n#include <boost/mpl/aux_/config/static_constant.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n#include <boost/preprocessor/array/elem.hpp>\n#include <boost/preprocessor/cat.hpp>\n#include <boost/preprocessor/control/if.hpp>\n#include <boost/preprocessor/repetition/enum_params.hpp>\n#include <boost/preprocessor/repetition/enum_trailing_params.hpp>\n\n#if BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT(0x590) )\n# include <boost/type_traits/is_class.hpp>\n#endif\n\n#if !defined(BOOST_MPL_CFG_NO_HAS_XXX)\n\n#   if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)\n\n// agurt, 11/sep/02: MSVC-specific version (< 7.1), based on a USENET \n// newsgroup's posting by John Madsen (comp.lang.c++.moderated, \n// 1999-11-12 19:17:06 GMT); the code is _not_ standard-conforming, but \n// it works way more reliably than the SFINAE-based implementation\n\n// Modified dwa 8/Oct/02 to handle reference types.\n\n#   include <boost/mpl/if.hpp>\n#   include <boost/mpl/bool.hpp>\n\nnamespace boost { namespace mpl { namespace aux {\n\nstruct has_xxx_tag;\n\n#if BOOST_WORKAROUND(BOOST_MSVC, == 1300)\ntemplate< typename U > struct msvc_incomplete_array\n{\n    typedef char (&type)[sizeof(U) + 1];\n};\n#endif\n\ntemplate< typename T >\nstruct msvc_is_incomplete\n{\n    // MSVC is capable of some kinds of SFINAE.  If U is an incomplete\n    // type, it won't pick the second overload\n    static char tester(...);\n\n#if BOOST_WORKAROUND(BOOST_MSVC, == 1300)\n    template< typename U >\n    static typename msvc_incomplete_array<U>::type tester(type_wrapper<U>);\n#else\n    template< typename U >\n    static char (& tester(type_wrapper<U>) )[sizeof(U)+1];\n#endif \n    \n    BOOST_STATIC_CONSTANT(bool, value = \n          sizeof(tester(type_wrapper<T>())) == 1\n        );\n};\n\ntemplate<>\nstruct msvc_is_incomplete<int>\n{\n    BOOST_STATIC_CONSTANT(bool, value = false);\n};\n\n}}}\n\n#   define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF_(trait, name, default_) \\\ntemplate< typename T, typename name = ::boost::mpl::aux::has_xxx_tag > \\\nstruct BOOST_PP_CAT(trait,_impl) : T \\\n{ \\\n    static boost::mpl::aux::no_tag \\\n    test(void(*)(::boost::mpl::aux::has_xxx_tag)); \\\n    \\\n    static boost::mpl::aux::yes_tag test(...); \\\n    \\\n    BOOST_STATIC_CONSTANT(bool, value = \\\n          sizeof(test(static_cast<void(*)(name)>(0))) \\\n            != sizeof(boost::mpl::aux::no_tag) \\\n        ); \\\n    typedef boost::mpl::bool_<value> type; \\\n}; \\\n\\\ntemplate< typename T, typename fallback_ = boost::mpl::bool_<default_> > \\\nstruct trait \\\n    : boost::mpl::if_c< \\\n          boost::mpl::aux::msvc_is_incomplete<T>::value \\\n        , boost::mpl::bool_<false> \\\n        , BOOST_PP_CAT(trait,_impl)<T> \\\n        >::type \\\n{ \\\n}; \\\n\\\nBOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, void) \\\nBOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, bool) \\\nBOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, char) \\\nBOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, signed char) \\\nBOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, unsigned char) \\\nBOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, signed short) \\\nBOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, unsigned short) \\\nBOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, signed int) \\\nBOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, unsigned int) \\\nBOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, signed long) \\\nBOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, unsigned long) \\\nBOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, float) \\\nBOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, double) \\\nBOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, long double) \\\n/**/\n\n#   define BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, T) \\\ntemplate<> struct trait<T> \\\n{ \\\n    BOOST_STATIC_CONSTANT(bool, value = false); \\\n    typedef boost::mpl::bool_<false> type; \\\n}; \\\n/**/\n\n#if !defined(BOOST_NO_INTRINSIC_WCHAR_T)\n#   define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, unused) \\\n    BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF_(trait, name, unused) \\\n    BOOST_MPL_AUX_HAS_XXX_TRAIT_SPEC(trait, wchar_t) \\\n/**/\n#else\n#   define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, unused) \\\n    BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF_(trait, name, unused) \\\n/**/\n#endif\n\n\n// SFINAE-based implementations below are derived from a USENET newsgroup's \n// posting by Rani Sharoni (comp.lang.c++.moderated, 2002-03-17 07:45:09 PST)\n\n#   elif BOOST_WORKAROUND(BOOST_MSVC, <= 1400) \\\n      || (BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1800)) && defined(__CUDACC__)) \\\n      || BOOST_WORKAROUND(__IBMCPP__, <= 700)\n\n// MSVC 7.1 & MSVC 8.0 & VACPP\n\n// agurt, 15/jun/05: replace overload-based SFINAE implementation with SFINAE\n// applied to partial specialization to fix some apparently random failures \n// (thanks to Daniel Wallin for researching this!)\n\n#   define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, default_) \\\ntemplate< typename T > \\\nstruct BOOST_PP_CAT(trait, _msvc_sfinae_helper) \\\n{ \\\n    typedef void type; \\\n};\\\n\\\ntemplate< typename T, typename U = void > \\\nstruct BOOST_PP_CAT(trait,_impl_) \\\n{ \\\n    BOOST_STATIC_CONSTANT(bool, value = false); \\\n    typedef boost::mpl::bool_<value> type; \\\n}; \\\n\\\ntemplate< typename T > \\\nstruct BOOST_PP_CAT(trait,_impl_)< \\\n      T \\\n    , typename BOOST_PP_CAT(trait, _msvc_sfinae_helper)< typename T::name >::type \\\n    > \\\n{ \\\n    BOOST_STATIC_CONSTANT(bool, value = true); \\\n    typedef boost::mpl::bool_<value> type; \\\n}; \\\n\\\ntemplate< typename T, typename fallback_ = boost::mpl::bool_<default_> > \\\nstruct trait \\\n    : BOOST_PP_CAT(trait,_impl_)<T> \\\n{ \\\n}; \\\n/**/\n\n#   elif BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT(0x590) )\n\n#   define BOOST_MPL_HAS_XXX_TRAIT_NAMED_BCB_DEF(trait, trait_tester, name, default_) \\\ntemplate< typename T, bool IS_CLASS > \\\nstruct trait_tester \\\n{ \\\n    BOOST_STATIC_CONSTANT( bool,  value = false ); \\\n}; \\\ntemplate< typename T > \\\nstruct trait_tester< T, true > \\\n{ \\\n    struct trait_tester_impl \\\n    { \\\n        template < class U > \\\n        static int  resolve( boost::mpl::aux::type_wrapper<U> const volatile * \\\n                           , boost::mpl::aux::type_wrapper<typename U::name >* = 0 ); \\\n        static char resolve( ... ); \\\n    }; \\\n    typedef boost::mpl::aux::type_wrapper<T> t_; \\\n    BOOST_STATIC_CONSTANT( bool, value = ( sizeof( trait_tester_impl::resolve( static_cast< t_ * >(0) ) ) == sizeof(int) ) ); \\\n}; \\\ntemplate< typename T, typename fallback_ = boost::mpl::bool_<default_> > \\\nstruct trait           \\\n{                      \\\n    BOOST_STATIC_CONSTANT( bool, value = (trait_tester< T, boost::is_class< T >::value >::value) );     \\\n    typedef boost::mpl::bool_< trait< T, fallback_ >::value > type; \\\n};\n\n#   define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, default_) \\\n    BOOST_MPL_HAS_XXX_TRAIT_NAMED_BCB_DEF( trait \\\n                                         , BOOST_PP_CAT(trait,_tester)      \\\n                                         , name       \\\n                                         , default_ ) \\\n/**/\n\n#   else // other SFINAE-capable compilers\n\n#   define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, default_) \\\ntemplate< typename T, typename fallback_ = boost::mpl::bool_<default_> > \\\nstruct trait \\\n{ \\\n    struct gcc_3_2_wknd \\\n    { \\\n        template< typename U > \\\n        static boost::mpl::aux::yes_tag test( \\\n              boost::mpl::aux::type_wrapper<U> const volatile* \\\n            , boost::mpl::aux::type_wrapper<BOOST_MSVC_TYPENAME U::name>* = 0 \\\n            ); \\\n    \\\n        static boost::mpl::aux::no_tag test(...); \\\n    }; \\\n    \\\n    typedef boost::mpl::aux::type_wrapper<T> t_; \\\n    BOOST_STATIC_CONSTANT(bool, value = \\\n          sizeof(gcc_3_2_wknd::test(static_cast<t_*>(0))) \\\n            == sizeof(boost::mpl::aux::yes_tag) \\\n        ); \\\n    typedef boost::mpl::bool_<value> type; \\\n}; \\\n/**/\n\n#   endif // BOOST_WORKAROUND(BOOST_MSVC, <= 1300)\n\n\n#else // BOOST_MPL_CFG_NO_HAS_XXX\n\n// placeholder implementation\n\n#   define BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, default_) \\\ntemplate< typename T, typename fallback_ = boost::mpl::bool_<default_> > \\\nstruct trait \\\n{ \\\n    BOOST_STATIC_CONSTANT(bool, value = fallback_::value); \\\n    typedef fallback_ type; \\\n}; \\\n/**/\n\n#endif\n\n#define BOOST_MPL_HAS_XXX_TRAIT_DEF(name) \\\n    BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(BOOST_PP_CAT(has_,name), name, false) \\\n/**/\n\n\n#if !defined(BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE)\n\n// Create a boolean Metafunction to detect a nested template\n// member. This implementation is based on a USENET newsgroup's\n// posting by Aleksey Gurtovoy (comp.lang.c++.moderated, 2002-03-19),\n// Rani Sharoni's USENET posting cited above, the non-template has_xxx\n// implementations above, and discussion on the Boost mailing list.\n\n#   if !defined(BOOST_MPL_HAS_XXX_NO_WRAPPED_TYPES)\n#     if BOOST_WORKAROUND(BOOST_MSVC, <= 1400)\n#       define BOOST_MPL_HAS_XXX_NO_WRAPPED_TYPES 1\n#     else\n#       define BOOST_MPL_HAS_XXX_NO_WRAPPED_TYPES 0\n#     endif\n#   endif\n\n#   if !defined(BOOST_MPL_HAS_XXX_NO_EXPLICIT_TEST_FUNCTION)\n#     if (defined(BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS))\n#       define BOOST_MPL_HAS_XXX_NO_EXPLICIT_TEST_FUNCTION 1\n#     else\n#       define BOOST_MPL_HAS_XXX_NO_EXPLICIT_TEST_FUNCTION 0\n#     endif\n#   endif\n\n#   if !defined(BOOST_MPL_HAS_XXX_NEEDS_TEMPLATE_SFINAE)\n#     if BOOST_WORKAROUND(BOOST_MSVC, <= 1400)\n#       define BOOST_MPL_HAS_XXX_NEEDS_TEMPLATE_SFINAE 1\n#     else\n#       define BOOST_MPL_HAS_XXX_NEEDS_TEMPLATE_SFINAE 0\n#     endif\n#   endif\n\n// NOTE: Many internal implementation macros take a Boost.Preprocessor\n// array argument called args which is of the following form.\n//           ( 4, ( trait, name, max_arity, default_ ) )\n\n#   define BOOST_MPL_HAS_MEMBER_INTROSPECTION_NAME(args) \\\n      BOOST_PP_CAT(BOOST_PP_ARRAY_ELEM(0, args) , _introspect) \\\n    /**/\n\n#   define BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME(args, n) \\\n      BOOST_PP_CAT(BOOST_PP_CAT(BOOST_PP_ARRAY_ELEM(0, args) , _substitute), n) \\\n    /**/\n\n#   define BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args) \\\n      BOOST_PP_CAT(BOOST_PP_ARRAY_ELEM(0, args) , _test) \\\n    /**/\n\n// Thanks to Guillaume Melquiond for pointing out the need for the\n// \"substitute\" template as an argument to the overloaded test\n// functions to get SFINAE to work for member templates with the\n// correct name but different number of arguments.\n#   define BOOST_MPL_HAS_MEMBER_MULTI_SUBSTITUTE(z, n, args) \\\n      template< \\\n          template< BOOST_PP_ENUM_PARAMS(BOOST_PP_INC(n), typename V) > class V \\\n       > \\\n      struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME(args, n) { \\\n      }; \\\n    /**/\n\n#   define BOOST_MPL_HAS_MEMBER_SUBSTITUTE(args, substitute_macro) \\\n      BOOST_PP_REPEAT( \\\n          BOOST_PP_ARRAY_ELEM(2, args) \\\n        , BOOST_MPL_HAS_MEMBER_MULTI_SUBSTITUTE \\\n        , args \\\n      ) \\\n    /**/\n\n#   if !BOOST_MPL_HAS_XXX_NO_EXPLICIT_TEST_FUNCTION\n#     define BOOST_MPL_HAS_MEMBER_REJECT(args, member_macro) \\\n        template< typename V > \\\n        static boost::mpl::aux::no_tag \\\n        BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args)(...); \\\n      /**/\n#   else\n#     define BOOST_MPL_HAS_MEMBER_REJECT(args, member_macro) \\\n        static boost::mpl::aux::no_tag \\\n        BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args)(...); \\\n      /**/\n#   endif\n\n#   if !BOOST_MPL_HAS_XXX_NO_WRAPPED_TYPES\n#     define BOOST_MPL_HAS_MEMBER_MULTI_ACCEPT(z, n, args) \\\n        template< typename V > \\\n        static boost::mpl::aux::yes_tag \\\n        BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args)( \\\n            boost::mpl::aux::type_wrapper< V > const volatile* \\\n          , BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME(args, n) < \\\n                V::template BOOST_PP_ARRAY_ELEM(1, args) \\\n            >* = 0 \\\n        ); \\\n      /**/\n#     define BOOST_MPL_HAS_MEMBER_ACCEPT(args, member_macro) \\\n        BOOST_PP_REPEAT( \\\n            BOOST_PP_ARRAY_ELEM(2, args) \\\n          , BOOST_MPL_HAS_MEMBER_MULTI_ACCEPT \\\n          , args \\\n        ) \\\n      /**/\n#   else\n#     define BOOST_MPL_HAS_MEMBER_ACCEPT(args, member_macro) \\\n        template< typename V > \\\n        static boost::mpl::aux::yes_tag \\\n        BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args)( \\\n            V const volatile* \\\n          , member_macro(args, V, T)* = 0 \\\n        ); \\\n      /**/\n#   endif\n\n#   if !BOOST_MPL_HAS_XXX_NO_EXPLICIT_TEST_FUNCTION\n#     define BOOST_MPL_HAS_MEMBER_TEST(args) \\\n          sizeof(BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args)< U >(0)) \\\n              == sizeof(boost::mpl::aux::yes_tag) \\\n      /**/\n#   else\n#     if !BOOST_MPL_HAS_XXX_NO_WRAPPED_TYPES\n#       define BOOST_MPL_HAS_MEMBER_TEST(args) \\\n          sizeof( \\\n              BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args)( \\\n                  static_cast< boost::mpl::aux::type_wrapper< U >* >(0) \\\n              ) \\\n          ) == sizeof(boost::mpl::aux::yes_tag) \\\n        /**/\n#     else\n#       define BOOST_MPL_HAS_MEMBER_TEST(args) \\\n          sizeof( \\\n              BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args)( \\\n                  static_cast< U* >(0) \\\n              ) \\\n          ) == sizeof(boost::mpl::aux::yes_tag) \\\n        /**/\n#     endif\n#   endif\n\n#   define BOOST_MPL_HAS_MEMBER_INTROSPECT( \\\n               args, substitute_macro, member_macro \\\n           ) \\\n      template< typename U > \\\n      struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_NAME(args) { \\\n          BOOST_MPL_HAS_MEMBER_SUBSTITUTE(args, substitute_macro) \\\n          BOOST_MPL_HAS_MEMBER_REJECT(args, member_macro) \\\n          BOOST_MPL_HAS_MEMBER_ACCEPT(args, member_macro) \\\n          BOOST_STATIC_CONSTANT( \\\n              bool, value = BOOST_MPL_HAS_MEMBER_TEST(args) \\\n          ); \\\n          typedef boost::mpl::bool_< value > type; \\\n      }; \\\n    /**/\n\n#   define BOOST_MPL_HAS_MEMBER_IMPLEMENTATION( \\\n               args, introspect_macro, substitute_macro, member_macro \\\n           ) \\\n      template< \\\n          typename T \\\n        , typename fallback_ \\\n              = boost::mpl::bool_< BOOST_PP_ARRAY_ELEM(3, args) > \\\n      > \\\n      class BOOST_PP_ARRAY_ELEM(0, args) { \\\n          introspect_macro(args, substitute_macro, member_macro) \\\n      public: \\\n          static const bool value \\\n              = BOOST_MPL_HAS_MEMBER_INTROSPECTION_NAME(args)< T >::value; \\\n          typedef typename BOOST_MPL_HAS_MEMBER_INTROSPECTION_NAME(args)< \\\n              T \\\n          >::type type; \\\n      }; \\\n    /**/\n\n// BOOST_MPL_HAS_MEMBER_WITH_FUNCTION_SFINAE expands to the full\n// implementation of the function-based metafunction. Compile with -E\n// to see the preprocessor output for this macro.\n#   define BOOST_MPL_HAS_MEMBER_WITH_FUNCTION_SFINAE( \\\n               args, substitute_macro, member_macro \\\n           ) \\\n      BOOST_MPL_HAS_MEMBER_IMPLEMENTATION( \\\n          args \\\n        , BOOST_MPL_HAS_MEMBER_INTROSPECT \\\n        , substitute_macro \\\n        , member_macro \\\n      ) \\\n    /**/\n\n#   if BOOST_MPL_HAS_XXX_NEEDS_TEMPLATE_SFINAE\n\n#     if !defined(BOOST_MPL_HAS_XXX_NEEDS_NAMESPACE_LEVEL_SUBSTITUTE)\n#       if BOOST_WORKAROUND(BOOST_MSVC, <= 1400)\n#         define BOOST_MPL_HAS_XXX_NEEDS_NAMESPACE_LEVEL_SUBSTITUTE 1\n#       endif\n#     endif\n\n#     if !BOOST_MPL_HAS_XXX_NEEDS_NAMESPACE_LEVEL_SUBSTITUTE\n#       define BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME_WITH_TEMPLATE_SFINAE( \\\n                   args, n \\\n               ) \\\n          BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME(args, n) \\\n        /**/\n#     else\n#       define BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME_WITH_TEMPLATE_SFINAE( \\\n                   args, n \\\n               ) \\\n          BOOST_PP_CAT( \\\n              boost_mpl_has_xxx_ \\\n            , BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME(args, n) \\\n          ) \\\n        /**/\n#     endif\n\n#     define BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_TAG_NAME( \\\n                 args \\\n             ) \\\n        BOOST_PP_CAT( \\\n            BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME_WITH_TEMPLATE_SFINAE( \\\n                args, 0 \\\n            ) \\\n          , _tag \\\n        ) \\\n      /**/\n\n#     define BOOST_MPL_HAS_MEMBER_MULTI_SUBSTITUTE_WITH_TEMPLATE_SFINAE( \\\n                 z, n, args \\\n             ) \\\n        template< \\\n             template< BOOST_PP_ENUM_PARAMS(BOOST_PP_INC(n), typename U) > class U \\\n        > \\\n        struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME_WITH_TEMPLATE_SFINAE( \\\n                args, n \\\n               ) { \\\n            typedef \\\n                BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_TAG_NAME(args) \\\n                type; \\\n        }; \\\n      /**/\n\n#     define BOOST_MPL_HAS_MEMBER_SUBSTITUTE_WITH_TEMPLATE_SFINAE( \\\n                 args, substitute_macro \\\n             ) \\\n        typedef void \\\n            BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_TAG_NAME(args); \\\n        BOOST_PP_REPEAT( \\\n            BOOST_PP_ARRAY_ELEM(2, args) \\\n          , BOOST_MPL_HAS_MEMBER_MULTI_SUBSTITUTE_WITH_TEMPLATE_SFINAE \\\n          , args \\\n        ) \\\n      /**/\n\n#     define BOOST_MPL_HAS_MEMBER_REJECT_WITH_TEMPLATE_SFINAE( \\\n                 args, member_macro \\\n             ) \\\n        template< \\\n            typename U \\\n          , typename V \\\n                = BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_TAG_NAME(args) \\\n        > \\\n        struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args) { \\\n            BOOST_STATIC_CONSTANT(bool, value = false); \\\n            typedef boost::mpl::bool_< value > type; \\\n        }; \\\n      /**/\n\n#     define BOOST_MPL_HAS_MEMBER_MULTI_ACCEPT_WITH_TEMPLATE_SFINAE( \\\n                 z, n, args \\\n             ) \\\n        template< typename U > \\\n        struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args)< \\\n            U \\\n          , typename \\\n                BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME_WITH_TEMPLATE_SFINAE( \\\n                    args, n \\\n                )< \\\n                    BOOST_MSVC_TYPENAME U::BOOST_PP_ARRAY_ELEM(1, args)< > \\\n                >::type \\\n        > { \\\n            BOOST_STATIC_CONSTANT(bool, value = true); \\\n            typedef boost::mpl::bool_< value > type; \\\n        }; \\\n      /**/\n\n#     define BOOST_MPL_HAS_MEMBER_ACCEPT_WITH_TEMPLATE_SFINAE( \\\n                 args, member_macro \\\n             ) \\\n        BOOST_PP_REPEAT( \\\n            BOOST_PP_ARRAY_ELEM(2, args) \\\n          , BOOST_MPL_HAS_MEMBER_MULTI_ACCEPT_WITH_TEMPLATE_SFINAE \\\n          , args \\\n        ) \\\n      /**/\n\n#     define BOOST_MPL_HAS_MEMBER_INTROSPECT_WITH_TEMPLATE_SFINAE( \\\n                 args, substitute_macro, member_macro \\\n             ) \\\n        BOOST_MPL_HAS_MEMBER_REJECT_WITH_TEMPLATE_SFINAE(args, member_macro) \\\n        BOOST_MPL_HAS_MEMBER_ACCEPT_WITH_TEMPLATE_SFINAE(args, member_macro) \\\n        template< typename U > \\\n        struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_NAME(args) \\\n            : BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args)< U > { \\\n        }; \\\n      /**/\n \n// BOOST_MPL_HAS_MEMBER_WITH_TEMPLATE_SFINAE expands to the full\n// implementation of the template-based metafunction. Compile with -E\n// to see the preprocessor output for this macro.\n//\n// Note that if BOOST_MPL_HAS_XXX_NEEDS_NAMESPACE_LEVEL_SUBSTITUTE is\n// defined BOOST_MPL_HAS_MEMBER_SUBSTITUTE_WITH_TEMPLATE_SFINAE needs\n// to be expanded at namespace level before\n// BOOST_MPL_HAS_MEMBER_WITH_TEMPLATE_SFINAE can be used.\n#     define BOOST_MPL_HAS_MEMBER_WITH_TEMPLATE_SFINAE( \\\n                 args, substitute_macro, member_macro \\\n             ) \\\n        BOOST_MPL_HAS_MEMBER_SUBSTITUTE_WITH_TEMPLATE_SFINAE( \\\n            args, substitute_macro \\\n        ) \\\n        BOOST_MPL_HAS_MEMBER_IMPLEMENTATION( \\\n            args \\\n          , BOOST_MPL_HAS_MEMBER_INTROSPECT_WITH_TEMPLATE_SFINAE \\\n          , substitute_macro \\\n          , member_macro \\\n        ) \\\n      /**/\n\n#   endif // BOOST_MPL_HAS_XXX_NEEDS_TEMPLATE_SFINAE\n\n// Note: In the current implementation the parameter and access macros\n// are no longer expanded.\n#   if !BOOST_WORKAROUND(BOOST_MSVC, <= 1400)\n#     define BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF(trait, name, default_) \\\n        BOOST_MPL_HAS_MEMBER_WITH_FUNCTION_SFINAE( \\\n            ( 4, ( trait, name, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, default_ ) ) \\\n          , BOOST_MPL_HAS_MEMBER_TEMPLATE_SUBSTITUTE_PARAMETER \\\n          , BOOST_MPL_HAS_MEMBER_TEMPLATE_ACCESS \\\n        ) \\\n      /**/\n#   else\n#     define BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF(trait, name, default_) \\\n        BOOST_MPL_HAS_MEMBER_WITH_TEMPLATE_SFINAE( \\\n            ( 4, ( trait, name, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, default_ ) ) \\\n          , BOOST_MPL_HAS_MEMBER_TEMPLATE_SUBSTITUTE_PARAMETER \\\n          , BOOST_MPL_HAS_MEMBER_TEMPLATE_ACCESS \\\n        ) \\\n      /**/\n#   endif\n\n#else // BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE\n\n// placeholder implementation\n\n#   define BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF(trait, name, default_) \\\n      template< typename T \\\n              , typename fallback_ = boost::mpl::bool_< default_ > > \\\n      struct trait { \\\n          BOOST_STATIC_CONSTANT(bool, value = fallback_::value); \\\n          typedef fallback_ type; \\\n      }; \\\n    /**/\n\n#endif // BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE\n\n#   define BOOST_MPL_HAS_XXX_TEMPLATE_DEF(name) \\\n      BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF( \\\n          BOOST_PP_CAT(has_, name), name, false \\\n      ) \\\n    /**/\n\n#endif // BOOST_MPL_HAS_XXX_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/identity.hpp",
    "content": "\n#ifndef BOOST_MPL_IDENTITY_HPP_INCLUDED\n#define BOOST_MPL_IDENTITY_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/na_spec.hpp>\n#include <boost/mpl/aux_/lambda_support.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T)\n    >\nstruct identity\n{\n    typedef T type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(1, identity, (T))\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T)\n    >\nstruct make_identity\n{\n    typedef identity<T> type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(1, make_identity, (T))\n};\n\nBOOST_MPL_AUX_NA_SPEC_NO_ETI(1, identity)\nBOOST_MPL_AUX_NA_SPEC_NO_ETI(1, make_identity)\n\n}}\n\n#endif // BOOST_MPL_IDENTITY_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/if.hpp",
    "content": "\n#ifndef BOOST_MPL_IF_HPP_INCLUDED\n#define BOOST_MPL_IF_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/value_wknd.hpp>\n#include <boost/mpl/aux_/static_cast.hpp>\n#include <boost/mpl/aux_/na_spec.hpp>\n#include <boost/mpl/aux_/lambda_support.hpp>\n#include <boost/mpl/aux_/config/integral.hpp>\n#include <boost/mpl/aux_/config/ctps.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n\nnamespace boost { namespace mpl {\n\n#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)\n\ntemplate<\n      bool C\n    , typename T1\n    , typename T2\n    >\nstruct if_c\n{\n    typedef T1 type;\n};\n\ntemplate<\n      typename T1\n    , typename T2\n    >\nstruct if_c<false,T1,T2>\n{\n    typedef T2 type;\n};\n\n// agurt, 05/sep/04: nondescriptive parameter names for the sake of DigitalMars\n// (and possibly MWCW < 8.0); see http://article.gmane.org/gmane.comp.lib.boost.devel/108959\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    , typename BOOST_MPL_AUX_NA_PARAM(T3)\n    >\nstruct if_\n{\n private:\n    // agurt, 02/jan/03: two-step 'type' definition for the sake of aCC \n    typedef if_c<\n#if defined(BOOST_MPL_CFG_BCC_INTEGRAL_CONSTANTS)\n          BOOST_MPL_AUX_VALUE_WKND(T1)::value\n#else\n          BOOST_MPL_AUX_STATIC_CAST(bool, BOOST_MPL_AUX_VALUE_WKND(T1)::value)\n#endif\n        , T2\n        , T3\n        > almost_type_;\n \n public:\n    typedef typename almost_type_::type type;\n    \n    BOOST_MPL_AUX_LAMBDA_SUPPORT(3,if_,(T1,T2,T3))\n};\n\n#else\n\n// no partial class template specialization\n\nnamespace aux {\n\ntemplate< bool C >\nstruct if_impl\n{\n    template< typename T1, typename T2 > struct result_\n    {\n        typedef T1 type;\n    };\n};\n\ntemplate<>\nstruct if_impl<false>\n{\n    template< typename T1, typename T2 > struct result_\n    { \n        typedef T2 type;\n    };\n};\n\n} // namespace aux\n\ntemplate<\n      bool C_\n    , typename T1\n    , typename T2\n    >\nstruct if_c\n{\n    typedef typename aux::if_impl< C_ >\n        ::template result_<T1,T2>::type type;\n};\n\n// (almost) copy & paste in order to save one more \n// recursively nested template instantiation to user\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(C_)\n    , typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    >\nstruct if_\n{\n    enum { msvc_wknd_ = BOOST_MPL_AUX_MSVC_VALUE_WKND(C_)::value };\n\n    typedef typename aux::if_impl< BOOST_MPL_AUX_STATIC_CAST(bool, msvc_wknd_) >\n        ::template result_<T1,T2>::type type;\n\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(3,if_,(C_,T1,T2))\n};\n\n#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION\n\nBOOST_MPL_AUX_NA_SPEC(3, if_)\n\n}}\n\n#endif // BOOST_MPL_IF_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/insert.hpp",
    "content": "\n#ifndef BOOST_MPL_INSERT_HPP_INCLUDED\n#define BOOST_MPL_INSERT_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/insert_fwd.hpp>\n#include <boost/mpl/sequence_tag.hpp>\n#include <boost/mpl/aux_/insert_impl.hpp>\n#include <boost/mpl/aux_/na_spec.hpp>\n#include <boost/mpl/aux_/lambda_support.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(Sequence)\n    , typename BOOST_MPL_AUX_NA_PARAM(Pos_or_T)\n    , typename BOOST_MPL_AUX_NA_PARAM(T)\n    >\nstruct insert\n    : insert_impl< typename sequence_tag<Sequence>::type >\n        ::template apply< Sequence,Pos_or_T,T >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(3,insert,(Sequence,Pos_or_T,T))\n};\n\nBOOST_MPL_AUX_NA_SPEC(3, insert)\n\n}}\n\n#endif // BOOST_MPL_INSERT_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/insert_fwd.hpp",
    "content": "\n#ifndef BOOST_MPL_INSERT_FWD_HPP_INCLUDED\n#define BOOST_MPL_INSERT_FWD_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\nnamespace boost { namespace mpl {\n\ntemplate< typename Tag > struct insert_impl;\ntemplate< typename Sequence, typename Pos_or_T, typename T > struct insert;\n\n}}\n\n#endif // BOOST_MPL_INSERT_FWD_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/insert_range_fwd.hpp",
    "content": "\n#ifndef BOOST_MPL_INSERT_RANGE_FWD_HPP_INCLUDED\n#define BOOST_MPL_INSERT_RANGE_FWD_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\nnamespace boost { namespace mpl {\n\ntemplate< typename Tag > struct insert_range_impl;\ntemplate< typename Sequence, typename Pos, typename Range > struct insert_range;\n\n}}\n\n#endif // BOOST_MPL_INSERT_RANGE_FWD_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/int.hpp",
    "content": "\n#ifndef BOOST_MPL_INT_HPP_INCLUDED\n#define BOOST_MPL_INT_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/int_fwd.hpp>\n\n#define AUX_WRAPPER_VALUE_TYPE int\n#include <boost/mpl/aux_/integral_wrapper.hpp>\n\n#endif // BOOST_MPL_INT_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/int_fwd.hpp",
    "content": "\n#ifndef BOOST_MPL_INT_FWD_HPP_INCLUDED\n#define BOOST_MPL_INT_FWD_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/adl_barrier.hpp>\n#include <boost/mpl/aux_/nttp_decl.hpp>\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\n\ntemplate< BOOST_MPL_AUX_NTTP_DECL(int, N) > struct int_;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nBOOST_MPL_AUX_ADL_BARRIER_DECL(int_)\n\n#endif // BOOST_MPL_INT_FWD_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/integral_c.hpp",
    "content": "\n#ifndef BOOST_MPL_INTEGRAL_C_HPP_INCLUDED\n#define BOOST_MPL_INTEGRAL_C_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2006\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/integral_c_fwd.hpp>\n#include <boost/mpl/aux_/config/ctps.hpp>\n#include <boost/mpl/aux_/config/static_constant.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n#if BOOST_WORKAROUND(__HP_aCC, <= 53800)\n// the type of non-type template arguments may not depend on template arguments\n#   define AUX_WRAPPER_PARAMS(N) typename T, long N\n#else\n#   define AUX_WRAPPER_PARAMS(N) typename T, T N\n#endif\n\n#define AUX_WRAPPER_NAME integral_c\n#define AUX_WRAPPER_VALUE_TYPE T\n#define AUX_WRAPPER_INST(value) AUX_WRAPPER_NAME< T, value >\n#include <boost/mpl/aux_/integral_wrapper.hpp>\n\n\n#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \\\n && !BOOST_WORKAROUND(__BORLANDC__, <= 0x551)\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\n// 'bool' constant doesn't have 'next'/'prior' members\ntemplate< bool C >\nstruct integral_c<bool, C>\n{\n    BOOST_STATIC_CONSTANT(bool, value = C);\n    typedef integral_c_tag tag;\n    typedef integral_c type;\n    typedef bool value_type;\n    operator bool() const { return this->value; }\n};\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\n#endif\n\n#endif // BOOST_MPL_INTEGRAL_C_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/integral_c_fwd.hpp",
    "content": "\n#ifndef BOOST_MPL_INTEGRAL_C_FWD_HPP_INCLUDED\n#define BOOST_MPL_INTEGRAL_C_FWD_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2006\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/workaround.hpp>\n#include <boost/mpl/aux_/adl_barrier.hpp>\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\n\n#if BOOST_WORKAROUND(__HP_aCC, <= 53800)\n// the type of non-type template arguments may not depend on template arguments\ntemplate< typename T, long N > struct integral_c;\n#else\ntemplate< typename T, T N > struct integral_c;\n#endif\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nBOOST_MPL_AUX_ADL_BARRIER_DECL(integral_c)\n\n#endif // BOOST_MPL_INTEGRAL_C_FWD_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/integral_c_tag.hpp",
    "content": "\n#ifndef BOOST_MPL_INTEGRAL_C_TAG_HPP_INCLUDED\n#define BOOST_MPL_INTEGRAL_C_TAG_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n\n#include <boost/mpl/aux_/adl_barrier.hpp>\n#include <boost/mpl/aux_/config/static_constant.hpp>\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\nstruct integral_c_tag { BOOST_STATIC_CONSTANT(int, value = 0); };\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nBOOST_MPL_AUX_ADL_BARRIER_DECL(integral_c_tag)\n\n#endif // BOOST_MPL_INTEGRAL_C_TAG_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/is_placeholder.hpp",
    "content": "\n#ifndef BOOST_MPL_IS_PLACEHOLDER_HPP_INCLUDED\n#define BOOST_MPL_IS_PLACEHOLDER_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/arg_fwd.hpp>\n#include <boost/mpl/bool.hpp>\n#include <boost/mpl/aux_/yes_no.hpp>\n#include <boost/mpl/aux_/type_wrapper.hpp>\n#include <boost/mpl/aux_/nttp_decl.hpp>\n#include <boost/mpl/aux_/config/ctps.hpp>\n#include <boost/mpl/aux_/config/static_constant.hpp>\n\nnamespace boost { namespace mpl {\n\n#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)\n\ntemplate< typename T >\nstruct is_placeholder\n    : bool_<false>\n{\n};\n\ntemplate< BOOST_MPL_AUX_NTTP_DECL(int, N) >\nstruct is_placeholder< arg<N> >\n    : bool_<true>\n{\n};\n\n#else\n\nnamespace aux {\n\naux::no_tag is_placeholder_helper(...);\n\ntemplate< BOOST_MPL_AUX_NTTP_DECL(int, N) >\naux::yes_tag is_placeholder_helper(aux::type_wrapper< arg<N> >*);\n\n} // namespace aux\n\ntemplate< typename T >\nstruct is_placeholder\n{\n    static aux::type_wrapper<T>* get();\n    BOOST_STATIC_CONSTANT(bool, value = \n          sizeof(aux::is_placeholder_helper(get())) == sizeof(aux::yes_tag)\n        );\n    \n    typedef bool_<value> type;\n};\n\n#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION\n\n}}\n\n#endif // BOOST_MPL_IS_PLACEHOLDER_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/iter_fold_if.hpp",
    "content": "\n#ifndef BOOST_MPL_ITER_FOLD_IF_HPP_INCLUDED\n#define BOOST_MPL_ITER_FOLD_IF_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2003-2004\n// Copyright Eric Friedman 2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/begin_end.hpp>\n#include <boost/mpl/logical.hpp>\n#include <boost/mpl/always.hpp>\n#include <boost/mpl/eval_if.hpp>\n#include <boost/mpl/if.hpp>\n#include <boost/mpl/pair.hpp>\n#include <boost/mpl/apply.hpp>\n#include <boost/mpl/aux_/iter_fold_if_impl.hpp>\n#include <boost/mpl/aux_/na_spec.hpp>\n#include <boost/mpl/aux_/lambda_support.hpp>\n#include <boost/mpl/aux_/config/forwarding.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n#include <boost/type_traits/is_same.hpp>\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate< typename Predicate, typename LastIterator >\nstruct iter_fold_if_pred\n{\n    template< typename State, typename Iterator > struct apply\n#if !defined(BOOST_MPL_CFG_NO_NESTED_FORWARDING)\n        : and_<\n              not_< is_same<Iterator,LastIterator> >\n            , apply1<Predicate,Iterator>\n            >\n    {\n#else\n    {\n        typedef and_<\n              not_< is_same<Iterator,LastIterator> >\n            , apply1<Predicate,Iterator>\n            > type;\n#endif\n    };\n};\n\n} // namespace aux\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(Sequence)\n    , typename BOOST_MPL_AUX_NA_PARAM(State)\n    , typename BOOST_MPL_AUX_NA_PARAM(ForwardOp)\n    , typename BOOST_MPL_AUX_NA_PARAM(ForwardPredicate)\n    , typename BOOST_MPL_AUX_NA_PARAM(BackwardOp)\n    , typename BOOST_MPL_AUX_NA_PARAM(BackwardPredicate)\n    >\nstruct iter_fold_if\n{\n\n    typedef typename begin<Sequence>::type first_;\n    typedef typename end<Sequence>::type last_;\n\n    typedef typename eval_if<\n          is_na<BackwardPredicate>\n        , if_< is_na<BackwardOp>, always<false_>, always<true_> >\n        , identity<BackwardPredicate>\n        >::type backward_pred_;\n\n// cwpro8 doesn't like 'cut-off' type here (use typedef instead)\n#if !BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003)) && !BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(600))\n    struct result_ :\n#else\n    typedef\n#endif\n        aux::iter_fold_if_impl<\n          first_\n        , State\n        , ForwardOp\n        , protect< aux::iter_fold_if_pred< ForwardPredicate,last_ > >\n        , BackwardOp\n        , backward_pred_\n        >\n#if !BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003)) && !BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(600))\n    { };\n#else\n    result_;\n#endif\n\npublic:\n\n    typedef pair<\n          typename result_::state\n        , typename result_::iterator\n        > type;\n\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(\n          6\n        , iter_fold_if\n        , (Sequence,State,ForwardOp,ForwardPredicate,BackwardOp,BackwardPredicate)\n        )\n};\n\nBOOST_MPL_AUX_NA_SPEC(6, iter_fold_if)\n\n}}\n\n#endif // BOOST_MPL_ITER_FOLD_IF_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/iterator_range.hpp",
    "content": "\n#ifndef BOOST_MPL_ITERATOR_RANGE_HPP_INCLUDED\n#define BOOST_MPL_ITERATOR_RANGE_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/na_spec.hpp>\n#include <boost/mpl/aux_/lambda_support.hpp>\n\nnamespace boost { namespace mpl {\n\nstruct iterator_range_tag;\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(First)\n    , typename BOOST_MPL_AUX_NA_PARAM(Last)\n    >\nstruct iterator_range\n{\n    typedef iterator_range_tag tag;\n    typedef iterator_range type;\n    typedef First begin;\n    typedef Last end;\n\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2,iterator_range,(First,Last))\n};\n\nBOOST_MPL_AUX_NA_SPEC(2, iterator_range)\n\n}}\n\n#endif // BOOST_MPL_ITERATOR_RANGE_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/iterator_tags.hpp",
    "content": "\n#ifndef BOOST_MPL_ITERATOR_TAG_HPP_INCLUDED\n#define BOOST_MPL_ITERATOR_TAG_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/int.hpp>\n\nnamespace boost { namespace mpl {\n\nstruct forward_iterator_tag       : int_<0> { typedef forward_iterator_tag type; };\nstruct bidirectional_iterator_tag : int_<1> { typedef bidirectional_iterator_tag type; };\nstruct random_access_iterator_tag : int_<2> { typedef random_access_iterator_tag type; };\n\n}}\n\n#endif // BOOST_MPL_ITERATOR_TAG_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/key_type_fwd.hpp",
    "content": "\n#ifndef BOOST_MPL_KEY_TYPE_FWD_HPP_INCLUDED\n#define BOOST_MPL_KEY_TYPE_FWD_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2003-2004\n// Copyright David Abrahams 2003-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\nnamespace boost { namespace mpl {\n\ntemplate< typename Tag > struct key_type_impl;\ntemplate< typename AssociativeSequence, typename T > struct key_type;\n\n}}\n\n#endif // BOOST_MPL_KEY_TYPE_FWD_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/lambda.hpp",
    "content": "\n#ifndef BOOST_MPL_LAMBDA_HPP_INCLUDED\n#define BOOST_MPL_LAMBDA_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/lambda_fwd.hpp>\n#include <boost/mpl/bind.hpp>\n#include <boost/mpl/aux_/config/lambda.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT)\n#   include <boost/mpl/aux_/full_lambda.hpp>\n#else\n#   include <boost/mpl/aux_/lambda_no_ctps.hpp>\n#   include <boost/mpl/aux_/lambda_support.hpp>\n#   define BOOST_MPL_CFG_NO_IMPLICIT_METAFUNCTIONS\n#endif\n\n#endif // BOOST_MPL_LAMBDA_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/lambda_fwd.hpp",
    "content": "\n#ifndef BOOST_MPL_LAMBDA_FWD_HPP_INCLUDED\n#define BOOST_MPL_LAMBDA_FWD_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/void_fwd.hpp>\n#include <boost/mpl/aux_/na.hpp>\n#include <boost/mpl/aux_/config/lambda.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT)\n\n#   include <boost/mpl/int.hpp>\n#   include <boost/mpl/aux_/lambda_arity_param.hpp>\n#   include <boost/mpl/aux_/template_arity_fwd.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate< \n      typename T = na\n    , typename Tag = void_\n    BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(\n          typename Arity = int_< aux::template_arity<T>::value >\n        )\n    >\nstruct lambda;\n\n}}\n\n#else // BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT\n\n#   include <boost/mpl/bool.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate< \n      typename T = na\n    , typename Tag = void_\n    , typename Protect = true_\n    > \nstruct lambda;\n\n}}\n\n#endif\n\n#endif // BOOST_MPL_LAMBDA_FWD_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/limits/arity.hpp",
    "content": "\n#ifndef BOOST_MPL_LIMITS_ARITY_HPP_INCLUDED\n#define BOOST_MPL_LIMITS_ARITY_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#if !defined(BOOST_MPL_LIMIT_METAFUNCTION_ARITY)\n#   define BOOST_MPL_LIMIT_METAFUNCTION_ARITY 5\n#endif\n\n#endif // BOOST_MPL_LIMITS_ARITY_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/limits/list.hpp",
    "content": "\n#ifndef BOOST_MPL_LIMITS_LIST_HPP_INCLUDED\n#define BOOST_MPL_LIMITS_LIST_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#if !defined(BOOST_MPL_LIMIT_LIST_SIZE)\n#   define BOOST_MPL_LIMIT_LIST_SIZE 20\n#endif\n\n#endif // BOOST_MPL_LIMITS_LIST_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/limits/unrolling.hpp",
    "content": "\n#ifndef BOOST_MPL_LIMITS_UNROLLING_HPP_INCLUDED\n#define BOOST_MPL_LIMITS_UNROLLING_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#if !defined(BOOST_MPL_LIMIT_UNROLLING)\n#   define BOOST_MPL_LIMIT_UNROLLING 4\n#endif\n\n#endif // BOOST_MPL_LIMITS_UNROLLING_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/aux_/O1_size.hpp",
    "content": "\n#ifndef BOOST_MPL_LIST_AUX_O1_SIZE_HPP_INCLUDED\n#define BOOST_MPL_LIST_AUX_O1_SIZE_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/O1_size_fwd.hpp>\n#include <boost/mpl/list/aux_/tag.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct O1_size_impl< aux::list_tag >\n{\n    template< typename List > struct apply\n        : List::size\n    {\n    };\n};\n\n}}\n\n#endif // BOOST_MPL_LIST_AUX_O1_SIZE_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/aux_/begin_end.hpp",
    "content": "\n#ifndef BOOST_MPL_LIST_AUX_BEGIN_END_HPP_INCLUDED\n#define BOOST_MPL_LIST_AUX_BEGIN_END_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/begin_end_fwd.hpp>\n#include <boost/mpl/list/aux_/iterator.hpp>\n#include <boost/mpl/list/aux_/tag.hpp>\n#include <boost/mpl/list/aux_/item.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct begin_impl< aux::list_tag >\n{\n    template< typename List > struct apply\n    {\n        typedef l_iter<typename List::type> type;\n    };\n};\n\ntemplate<>\nstruct end_impl< aux::list_tag >\n{\n    template< typename > struct apply\n    {\n        typedef l_iter<l_end> type;\n    };\n};\n\n}}\n\n#endif // BOOST_MPL_LIST_AUX_BEGIN_END_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/aux_/clear.hpp",
    "content": "\n#ifndef BOOST_MPL_LIST_AUX_CLEAR_HPP_INCLUDED\n#define BOOST_MPL_LIST_AUX_CLEAR_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/clear_fwd.hpp>\n#include <boost/mpl/list/aux_/item.hpp>\n#include <boost/mpl/list/aux_/tag.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct clear_impl< aux::list_tag >\n{\n    template< typename List > struct apply\n    {\n        typedef l_end type;\n    };\n};\n\n}}\n\n#endif // BOOST_MPL_LIST_AUX_CLEAR_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/aux_/empty.hpp",
    "content": "\n#ifndef BOOST_MPL_LIST_AUX_EMPTY_HPP_INCLUDED\n#define BOOST_MPL_LIST_AUX_EMPTY_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/empty_fwd.hpp>\n#include <boost/mpl/not.hpp>\n#include <boost/mpl/list/aux_/tag.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct empty_impl< aux::list_tag >\n{\n    template< typename List > struct apply\n        : not_<typename List::size>\n    {\n    };\n};\n\n}}\n\n#endif // BOOST_MPL_LIST_AUX_EMPTY_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/aux_/front.hpp",
    "content": "\n#ifndef BOOST_MPL_LIST_AUX_FRONT_HPP_INCLUDED\n#define BOOST_MPL_LIST_AUX_FRONT_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/front_fwd.hpp>\n#include <boost/mpl/list/aux_/tag.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct front_impl< aux::list_tag >\n{\n    template< typename List > struct apply\n    {\n        typedef typename List::item type;\n    };\n};\n\n}}\n\n#endif // BOOST_MPL_LIST_AUX_FRONT_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/aux_/include_preprocessed.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2001-2006\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION!\n\n#include <boost/mpl/aux_/config/workaround.hpp>\n\n#include <boost/preprocessor/cat.hpp>\n#include <boost/preprocessor/stringize.hpp>\n\n#   define AUX778076_HEADER \\\n    aux_/preprocessed/plain/BOOST_MPL_PREPROCESSED_HEADER \\\n/**/\n\n#if BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(700))\n#   define AUX778076_INCLUDE_STRING BOOST_PP_STRINGIZE(boost/mpl/list/AUX778076_HEADER)\n#   include AUX778076_INCLUDE_STRING\n#   undef AUX778076_INCLUDE_STRING\n#else\n#   include BOOST_PP_STRINGIZE(boost/mpl/list/AUX778076_HEADER)\n#endif\n\n#   undef AUX778076_HEADER\n\n#undef BOOST_MPL_PREPROCESSED_HEADER\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/aux_/item.hpp",
    "content": "\n#ifndef BOOST_MPL_LIST_AUX_NODE_HPP_INCLUDED\n#define BOOST_MPL_LIST_AUX_NODE_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/long.hpp>\n#include <boost/mpl/list/aux_/tag.hpp>\n#include <boost/mpl/aux_/config/msvc.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename Size\n    , typename T\n    , typename Next\n    >\nstruct l_item\n{\n// agurt, 17/jul/03: to facilitate the deficient 'is_sequence' implementation \n#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)\n    typedef int begin;\n#endif\n    typedef aux::list_tag tag;\n    typedef l_item type;\n\n    typedef Size size;\n    typedef T item;\n    typedef Next next;\n};\n\nstruct l_end\n{\n#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)\n    typedef int begin;\n#endif\n    typedef aux::list_tag tag;\n    typedef l_end type;\n    typedef long_<0> size;\n};\n\n}}\n\n#endif // BOOST_MPL_LIST_AUX_NODE_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/aux_/iterator.hpp",
    "content": "\n#ifndef BOOST_MPL_LIST_AUX_ITERATOR_HPP_INCLUDED\n#define BOOST_MPL_LIST_AUX_ITERATOR_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/iterator_tags.hpp>\n#include <boost/mpl/next_prior.hpp>\n#include <boost/mpl/deref.hpp>\n#include <boost/mpl/list/aux_/item.hpp>\n#include <boost/mpl/aux_/na.hpp>\n#include <boost/mpl/aux_/lambda_spec.hpp>\n#include <boost/mpl/aux_/config/ctps.hpp>\n\nnamespace boost { namespace mpl {\n\n#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)\n\ntemplate< typename Node >\nstruct l_iter\n{\n    typedef aux::l_iter_tag tag;\n    typedef forward_iterator_tag category;\n};\n\ntemplate< typename Node >\nstruct deref< l_iter<Node> >\n{\n    typedef typename Node::item type;\n};\n\ntemplate< typename Node >\nstruct next< l_iter<Node> >\n{\n    typedef l_iter< typename Node::next > type;\n};\n\n#else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION\n\ntemplate< typename Node >\nstruct l_iter\n{\n    typedef aux::l_iter_tag tag;\n    typedef forward_iterator_tag category;\n    typedef typename Node::item type;\n    typedef l_iter< typename mpl::next<Node>::type > next;\n};\n\n#endif\n\n\ntemplate<> struct l_iter<l_end>\n{\n    typedef aux::l_iter_tag tag;\n    typedef forward_iterator_tag category;\n#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)\n    typedef na type;\n    typedef l_iter next;\n#endif\n};\n\nBOOST_MPL_AUX_PASS_THROUGH_LAMBDA_SPEC(1, l_iter)\n\n}}\n\n#endif // BOOST_MPL_LIST_AUX_ITERATOR_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/aux_/numbered.hpp",
    "content": "\n// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION\n\n// Copyright Peter Dimov 2000-2002\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#if defined(BOOST_PP_IS_ITERATING)\n\n#include <boost/preprocessor/enum_params.hpp>\n#include <boost/preprocessor/enum_shifted_params.hpp>\n#include <boost/preprocessor/dec.hpp>\n#include <boost/preprocessor/cat.hpp>\n\n#define i BOOST_PP_FRAME_ITERATION(1)\n\n#if i == 1\n\ntemplate<\n      BOOST_PP_ENUM_PARAMS(i, typename T)\n    >\nstruct list1\n    : l_item<\n          long_<1>\n        , T0\n        , l_end\n        >\n{\n    typedef list1 type;\n};\n\n#else\n\n#   define MPL_AUX_LIST_TAIL(list, i, T) \\\n    BOOST_PP_CAT(list,BOOST_PP_DEC(i))< \\\n      BOOST_PP_ENUM_SHIFTED_PARAMS(i, T) \\\n    > \\\n    /**/\n    \ntemplate<\n      BOOST_PP_ENUM_PARAMS(i, typename T)\n    >\nstruct BOOST_PP_CAT(list,i)\n    : l_item<\n          long_<i>\n        , T0\n        , MPL_AUX_LIST_TAIL(list,i,T)\n        >\n{\n    typedef BOOST_PP_CAT(list,i) type;\n};\n\n#   undef MPL_AUX_LIST_TAIL\n\n#endif // i == 1\n\n#undef i\n\n#endif // BOOST_PP_IS_ITERATING\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/aux_/numbered_c.hpp",
    "content": "\n// NO INCLUDE GUARDS, THE HEADER IS INTENDED FOR MULTIPLE INCLUSION\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#if defined(BOOST_PP_IS_ITERATING)\n\n#include <boost/preprocessor/enum_params.hpp>\n#include <boost/preprocessor/enum_shifted_params.hpp>\n#include <boost/preprocessor/dec.hpp>\n#include <boost/preprocessor/cat.hpp>\n\n#define i BOOST_PP_FRAME_ITERATION(1)\n\n#if i == 1\n\ntemplate<\n      typename T\n    , BOOST_PP_ENUM_PARAMS(i, T C)\n    >\nstruct list1_c\n    : l_item<\n          long_<1>\n        , integral_c<T,C0>\n        , l_end\n        >\n{\n    typedef list1_c type;\n    typedef T value_type;\n};\n\n#else\n\n#   define MPL_AUX_LIST_C_TAIL(list, i, C) \\\n    BOOST_PP_CAT(BOOST_PP_CAT(list,BOOST_PP_DEC(i)),_c)<T, \\\n      BOOST_PP_ENUM_SHIFTED_PARAMS(i, C) \\\n    > \\\n    /**/\n    \ntemplate<\n      typename T\n    , BOOST_PP_ENUM_PARAMS(i, T C)\n    >\nstruct BOOST_PP_CAT(BOOST_PP_CAT(list,i),_c)\n    : l_item<\n          long_<i>\n        , integral_c<T,C0>\n        , MPL_AUX_LIST_C_TAIL(list,i,C)\n        >\n{\n    typedef BOOST_PP_CAT(BOOST_PP_CAT(list,i),_c) type;\n    typedef T value_type;\n};\n\n#   undef MPL_AUX_LIST_C_TAIL\n\n#endif // i == 1\n\n#undef i\n\n#endif // BOOST_PP_IS_ITERATING\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/aux_/pop_front.hpp",
    "content": "\n#ifndef BOOST_MPL_LIST_AUX_POP_FRONT_HPP_INCLUDED\n#define BOOST_MPL_LIST_AUX_POP_FRONT_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/pop_front_fwd.hpp>\n#include <boost/mpl/next_prior.hpp>\n#include <boost/mpl/list/aux_/tag.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct pop_front_impl< aux::list_tag >\n{\n    template< typename List > struct apply\n    {\n        typedef typename mpl::next<List>::type type;\n    };\n};\n\n}}\n\n#endif // BOOST_MPL_LIST_AUX_POP_FRONT_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/aux_/preprocessed/plain/list10.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/list/list10.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0\n    >\nstruct list1\n    : l_item<\n          long_<1>\n        , T0\n        , l_end\n        >\n{\n    typedef list1 type;\n};\n\ntemplate<\n      typename T0, typename T1\n    >\nstruct list2\n    : l_item<\n          long_<2>\n        , T0\n        , list1<T1>\n        >\n{\n    typedef list2 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2\n    >\nstruct list3\n    : l_item<\n          long_<3>\n        , T0\n        , list2< T1,T2 >\n        >\n{\n    typedef list3 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3\n    >\nstruct list4\n    : l_item<\n          long_<4>\n        , T0\n        , list3< T1,T2,T3 >\n        >\n{\n    typedef list4 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    >\nstruct list5\n    : l_item<\n          long_<5>\n        , T0\n        , list4< T1,T2,T3,T4 >\n        >\n{\n    typedef list5 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5\n    >\nstruct list6\n    : l_item<\n          long_<6>\n        , T0\n        , list5< T1,T2,T3,T4,T5 >\n        >\n{\n    typedef list6 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6\n    >\nstruct list7\n    : l_item<\n          long_<7>\n        , T0\n        , list6< T1,T2,T3,T4,T5,T6 >\n        >\n{\n    typedef list7 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7\n    >\nstruct list8\n    : l_item<\n          long_<8>\n        , T0\n        , list7< T1,T2,T3,T4,T5,T6,T7 >\n        >\n{\n    typedef list8 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8\n    >\nstruct list9\n    : l_item<\n          long_<9>\n        , T0\n        , list8< T1,T2,T3,T4,T5,T6,T7,T8 >\n        >\n{\n    typedef list9 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    >\nstruct list10\n    : l_item<\n          long_<10>\n        , T0\n        , list9< T1,T2,T3,T4,T5,T6,T7,T8,T9 >\n        >\n{\n    typedef list10 type;\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/aux_/preprocessed/plain/list10_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/list/list10_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T\n    , T C0\n    >\nstruct list1_c\n    : l_item<\n          long_<1>\n        , integral_c< T,C0 >\n        , l_end\n        >\n{\n    typedef list1_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1\n    >\nstruct list2_c\n    : l_item<\n          long_<2>\n        , integral_c< T,C0 >\n        , list1_c< T,C1 >\n        >\n{\n    typedef list2_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2\n    >\nstruct list3_c\n    : l_item<\n          long_<3>\n        , integral_c< T,C0 >\n        , list2_c< T,C1,C2 >\n        >\n{\n    typedef list3_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3\n    >\nstruct list4_c\n    : l_item<\n          long_<4>\n        , integral_c< T,C0 >\n        , list3_c< T,C1,C2,C3 >\n        >\n{\n    typedef list4_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4\n    >\nstruct list5_c\n    : l_item<\n          long_<5>\n        , integral_c< T,C0 >\n        , list4_c< T,C1,C2,C3,C4 >\n        >\n{\n    typedef list5_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5\n    >\nstruct list6_c\n    : l_item<\n          long_<6>\n        , integral_c< T,C0 >\n        , list5_c< T,C1,C2,C3,C4,C5 >\n        >\n{\n    typedef list6_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6\n    >\nstruct list7_c\n    : l_item<\n          long_<7>\n        , integral_c< T,C0 >\n        , list6_c< T,C1,C2,C3,C4,C5,C6 >\n        >\n{\n    typedef list7_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7\n    >\nstruct list8_c\n    : l_item<\n          long_<8>\n        , integral_c< T,C0 >\n        , list7_c< T,C1,C2,C3,C4,C5,C6,C7 >\n        >\n{\n    typedef list8_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8\n    >\nstruct list9_c\n    : l_item<\n          long_<9>\n        , integral_c< T,C0 >\n        , list8_c< T,C1,C2,C3,C4,C5,C6,C7,C8 >\n        >\n{\n    typedef list9_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9\n    >\nstruct list10_c\n    : l_item<\n          long_<10>\n        , integral_c< T,C0 >\n        , list9_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9 >\n        >\n{\n    typedef list10_c type;\n    typedef T value_type;\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/aux_/preprocessed/plain/list20.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/list/list20.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10\n    >\nstruct list11\n    : l_item<\n          long_<11>\n        , T0\n        , list10< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10 >\n        >\n{\n    typedef list11 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11\n    >\nstruct list12\n    : l_item<\n          long_<12>\n        , T0\n        , list11< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11 >\n        >\n{\n    typedef list12 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12\n    >\nstruct list13\n    : l_item<\n          long_<13>\n        , T0\n        , list12< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12 >\n        >\n{\n    typedef list13 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13\n    >\nstruct list14\n    : l_item<\n          long_<14>\n        , T0\n        , list13< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13 >\n        >\n{\n    typedef list14 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    >\nstruct list15\n    : l_item<\n          long_<15>\n        , T0\n        , list14< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14 >\n        >\n{\n    typedef list15 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15\n    >\nstruct list16\n    : l_item<\n          long_<16>\n        , T0\n        , list15< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15 >\n        >\n{\n    typedef list16 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16\n    >\nstruct list17\n    : l_item<\n          long_<17>\n        , T0\n        , list16< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16 >\n        >\n{\n    typedef list17 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17\n    >\nstruct list18\n    : l_item<\n          long_<18>\n        , T0\n        , list17< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17 >\n        >\n{\n    typedef list18 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18\n    >\nstruct list19\n    : l_item<\n          long_<19>\n        , T0\n        , list18< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18 >\n        >\n{\n    typedef list19 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    >\nstruct list20\n    : l_item<\n          long_<20>\n        , T0\n        , list19< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19 >\n        >\n{\n    typedef list20 type;\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/aux_/preprocessed/plain/list20_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/list/list20_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    >\nstruct list11_c\n    : l_item<\n          long_<11>\n        , integral_c< T,C0 >\n        , list10_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10 >\n        >\n{\n    typedef list11_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11\n    >\nstruct list12_c\n    : l_item<\n          long_<12>\n        , integral_c< T,C0 >\n        , list11_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11 >\n        >\n{\n    typedef list12_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12\n    >\nstruct list13_c\n    : l_item<\n          long_<13>\n        , integral_c< T,C0 >\n        , list12_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12 >\n        >\n{\n    typedef list13_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13\n    >\nstruct list14_c\n    : l_item<\n          long_<14>\n        , integral_c< T,C0 >\n        , list13_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13 >\n        >\n{\n    typedef list14_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14\n    >\nstruct list15_c\n    : l_item<\n          long_<15>\n        , integral_c< T,C0 >\n        , list14_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14 >\n        >\n{\n    typedef list15_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15\n    >\nstruct list16_c\n    : l_item<\n          long_<16>\n        , integral_c< T,C0 >\n        , list15_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15 >\n        >\n{\n    typedef list16_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15, T C16\n    >\nstruct list17_c\n    : l_item<\n          long_<17>\n        , integral_c< T,C0 >\n        , list16_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16 >\n        >\n{\n    typedef list17_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15, T C16, T C17\n    >\nstruct list18_c\n    : l_item<\n          long_<18>\n        , integral_c< T,C0 >\n        , list17_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17 >\n        >\n{\n    typedef list18_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18\n    >\nstruct list19_c\n    : l_item<\n          long_<19>\n        , integral_c< T,C0 >\n        , list18_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18 >\n        >\n{\n    typedef list19_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19\n    >\nstruct list20_c\n    : l_item<\n          long_<20>\n        , integral_c< T,C0 >\n        , list19_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19 >\n        >\n{\n    typedef list20_c type;\n    typedef T value_type;\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/aux_/preprocessed/plain/list30.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/list/list30.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    , typename T20\n    >\nstruct list21\n    : l_item<\n          long_<21>\n        , T0\n        , list20< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20 >\n        >\n{\n    typedef list21 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    , typename T20, typename T21\n    >\nstruct list22\n    : l_item<\n          long_<22>\n        , T0\n        , list21< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21 >\n        >\n{\n    typedef list22 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    , typename T20, typename T21, typename T22\n    >\nstruct list23\n    : l_item<\n          long_<23>\n        , T0\n        , list22< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22 >\n        >\n{\n    typedef list23 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    , typename T20, typename T21, typename T22, typename T23\n    >\nstruct list24\n    : l_item<\n          long_<24>\n        , T0\n        , list23< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23 >\n        >\n{\n    typedef list24 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    , typename T20, typename T21, typename T22, typename T23, typename T24\n    >\nstruct list25\n    : l_item<\n          long_<25>\n        , T0\n        , list24< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24 >\n        >\n{\n    typedef list25 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    , typename T20, typename T21, typename T22, typename T23, typename T24\n    , typename T25\n    >\nstruct list26\n    : l_item<\n          long_<26>\n        , T0\n        , list25< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25 >\n        >\n{\n    typedef list26 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    , typename T20, typename T21, typename T22, typename T23, typename T24\n    , typename T25, typename T26\n    >\nstruct list27\n    : l_item<\n          long_<27>\n        , T0\n        , list26< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26 >\n        >\n{\n    typedef list27 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    , typename T20, typename T21, typename T22, typename T23, typename T24\n    , typename T25, typename T26, typename T27\n    >\nstruct list28\n    : l_item<\n          long_<28>\n        , T0\n        , list27< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27 >\n        >\n{\n    typedef list28 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    , typename T20, typename T21, typename T22, typename T23, typename T24\n    , typename T25, typename T26, typename T27, typename T28\n    >\nstruct list29\n    : l_item<\n          long_<29>\n        , T0\n        , list28< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28 >\n        >\n{\n    typedef list29 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    , typename T20, typename T21, typename T22, typename T23, typename T24\n    , typename T25, typename T26, typename T27, typename T28, typename T29\n    >\nstruct list30\n    : l_item<\n          long_<30>\n        , T0\n        , list29< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29 >\n        >\n{\n    typedef list30 type;\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/aux_/preprocessed/plain/list30_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/list/list30_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20\n    >\nstruct list21_c\n    : l_item<\n          long_<21>\n        , integral_c< T,C0 >\n        , list20_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20 >\n        >\n{\n    typedef list21_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20\n    , T C21\n    >\nstruct list22_c\n    : l_item<\n          long_<22>\n        , integral_c< T,C0 >\n        , list21_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21 >\n        >\n{\n    typedef list22_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20\n    , T C21, T C22\n    >\nstruct list23_c\n    : l_item<\n          long_<23>\n        , integral_c< T,C0 >\n        , list22_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22 >\n        >\n{\n    typedef list23_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20\n    , T C21, T C22, T C23\n    >\nstruct list24_c\n    : l_item<\n          long_<24>\n        , integral_c< T,C0 >\n        , list23_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23 >\n        >\n{\n    typedef list24_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20\n    , T C21, T C22, T C23, T C24\n    >\nstruct list25_c\n    : l_item<\n          long_<25>\n        , integral_c< T,C0 >\n        , list24_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24 >\n        >\n{\n    typedef list25_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20\n    , T C21, T C22, T C23, T C24, T C25\n    >\nstruct list26_c\n    : l_item<\n          long_<26>\n        , integral_c< T,C0 >\n        , list25_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25 >\n        >\n{\n    typedef list26_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20\n    , T C21, T C22, T C23, T C24, T C25, T C26\n    >\nstruct list27_c\n    : l_item<\n          long_<27>\n        , integral_c< T,C0 >\n        , list26_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26 >\n        >\n{\n    typedef list27_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20\n    , T C21, T C22, T C23, T C24, T C25, T C26, T C27\n    >\nstruct list28_c\n    : l_item<\n          long_<28>\n        , integral_c< T,C0 >\n        , list27_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27 >\n        >\n{\n    typedef list28_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20\n    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28\n    >\nstruct list29_c\n    : l_item<\n          long_<29>\n        , integral_c< T,C0 >\n        , list28_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28 >\n        >\n{\n    typedef list29_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20\n    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29\n    >\nstruct list30_c\n    : l_item<\n          long_<30>\n        , integral_c< T,C0 >\n        , list29_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29 >\n        >\n{\n    typedef list30_c type;\n    typedef T value_type;\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/aux_/preprocessed/plain/list40.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/list/list40.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    , typename T20, typename T21, typename T22, typename T23, typename T24\n    , typename T25, typename T26, typename T27, typename T28, typename T29\n    , typename T30\n    >\nstruct list31\n    : l_item<\n          long_<31>\n        , T0\n        , list30< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30 >\n        >\n{\n    typedef list31 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    , typename T20, typename T21, typename T22, typename T23, typename T24\n    , typename T25, typename T26, typename T27, typename T28, typename T29\n    , typename T30, typename T31\n    >\nstruct list32\n    : l_item<\n          long_<32>\n        , T0\n        , list31< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31 >\n        >\n{\n    typedef list32 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    , typename T20, typename T21, typename T22, typename T23, typename T24\n    , typename T25, typename T26, typename T27, typename T28, typename T29\n    , typename T30, typename T31, typename T32\n    >\nstruct list33\n    : l_item<\n          long_<33>\n        , T0\n        , list32< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32 >\n        >\n{\n    typedef list33 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    , typename T20, typename T21, typename T22, typename T23, typename T24\n    , typename T25, typename T26, typename T27, typename T28, typename T29\n    , typename T30, typename T31, typename T32, typename T33\n    >\nstruct list34\n    : l_item<\n          long_<34>\n        , T0\n        , list33< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33 >\n        >\n{\n    typedef list34 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    , typename T20, typename T21, typename T22, typename T23, typename T24\n    , typename T25, typename T26, typename T27, typename T28, typename T29\n    , typename T30, typename T31, typename T32, typename T33, typename T34\n    >\nstruct list35\n    : l_item<\n          long_<35>\n        , T0\n        , list34< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34 >\n        >\n{\n    typedef list35 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    , typename T20, typename T21, typename T22, typename T23, typename T24\n    , typename T25, typename T26, typename T27, typename T28, typename T29\n    , typename T30, typename T31, typename T32, typename T33, typename T34\n    , typename T35\n    >\nstruct list36\n    : l_item<\n          long_<36>\n        , T0\n        , list35< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35 >\n        >\n{\n    typedef list36 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    , typename T20, typename T21, typename T22, typename T23, typename T24\n    , typename T25, typename T26, typename T27, typename T28, typename T29\n    , typename T30, typename T31, typename T32, typename T33, typename T34\n    , typename T35, typename T36\n    >\nstruct list37\n    : l_item<\n          long_<37>\n        , T0\n        , list36< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36 >\n        >\n{\n    typedef list37 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    , typename T20, typename T21, typename T22, typename T23, typename T24\n    , typename T25, typename T26, typename T27, typename T28, typename T29\n    , typename T30, typename T31, typename T32, typename T33, typename T34\n    , typename T35, typename T36, typename T37\n    >\nstruct list38\n    : l_item<\n          long_<38>\n        , T0\n        , list37< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37 >\n        >\n{\n    typedef list38 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    , typename T20, typename T21, typename T22, typename T23, typename T24\n    , typename T25, typename T26, typename T27, typename T28, typename T29\n    , typename T30, typename T31, typename T32, typename T33, typename T34\n    , typename T35, typename T36, typename T37, typename T38\n    >\nstruct list39\n    : l_item<\n          long_<39>\n        , T0\n        , list38< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38 >\n        >\n{\n    typedef list39 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    , typename T20, typename T21, typename T22, typename T23, typename T24\n    , typename T25, typename T26, typename T27, typename T28, typename T29\n    , typename T30, typename T31, typename T32, typename T33, typename T34\n    , typename T35, typename T36, typename T37, typename T38, typename T39\n    >\nstruct list40\n    : l_item<\n          long_<40>\n        , T0\n        , list39< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38,T39 >\n        >\n{\n    typedef list40 type;\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/aux_/preprocessed/plain/list40_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/list/list40_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20\n    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30\n    >\nstruct list31_c\n    : l_item<\n          long_<31>\n        , integral_c< T,C0 >\n        , list30_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30 >\n        >\n{\n    typedef list31_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20\n    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30\n    , T C31\n    >\nstruct list32_c\n    : l_item<\n          long_<32>\n        , integral_c< T,C0 >\n        , list31_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31 >\n        >\n{\n    typedef list32_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20\n    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30\n    , T C31, T C32\n    >\nstruct list33_c\n    : l_item<\n          long_<33>\n        , integral_c< T,C0 >\n        , list32_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32 >\n        >\n{\n    typedef list33_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20\n    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30\n    , T C31, T C32, T C33\n    >\nstruct list34_c\n    : l_item<\n          long_<34>\n        , integral_c< T,C0 >\n        , list33_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33 >\n        >\n{\n    typedef list34_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20\n    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30\n    , T C31, T C32, T C33, T C34\n    >\nstruct list35_c\n    : l_item<\n          long_<35>\n        , integral_c< T,C0 >\n        , list34_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34 >\n        >\n{\n    typedef list35_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20\n    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30\n    , T C31, T C32, T C33, T C34, T C35\n    >\nstruct list36_c\n    : l_item<\n          long_<36>\n        , integral_c< T,C0 >\n        , list35_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35 >\n        >\n{\n    typedef list36_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20\n    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30\n    , T C31, T C32, T C33, T C34, T C35, T C36\n    >\nstruct list37_c\n    : l_item<\n          long_<37>\n        , integral_c< T,C0 >\n        , list36_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36 >\n        >\n{\n    typedef list37_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20\n    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30\n    , T C31, T C32, T C33, T C34, T C35, T C36, T C37\n    >\nstruct list38_c\n    : l_item<\n          long_<38>\n        , integral_c< T,C0 >\n        , list37_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37 >\n        >\n{\n    typedef list38_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20\n    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30\n    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38\n    >\nstruct list39_c\n    : l_item<\n          long_<39>\n        , integral_c< T,C0 >\n        , list38_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38 >\n        >\n{\n    typedef list39_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20\n    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30\n    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39\n    >\nstruct list40_c\n    : l_item<\n          long_<40>\n        , integral_c< T,C0 >\n        , list39_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39 >\n        >\n{\n    typedef list40_c type;\n    typedef T value_type;\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/aux_/preprocessed/plain/list50.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/list/list50.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    , typename T20, typename T21, typename T22, typename T23, typename T24\n    , typename T25, typename T26, typename T27, typename T28, typename T29\n    , typename T30, typename T31, typename T32, typename T33, typename T34\n    , typename T35, typename T36, typename T37, typename T38, typename T39\n    , typename T40\n    >\nstruct list41\n    : l_item<\n          long_<41>\n        , T0\n        , list40< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38,T39,T40 >\n        >\n{\n    typedef list41 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    , typename T20, typename T21, typename T22, typename T23, typename T24\n    , typename T25, typename T26, typename T27, typename T28, typename T29\n    , typename T30, typename T31, typename T32, typename T33, typename T34\n    , typename T35, typename T36, typename T37, typename T38, typename T39\n    , typename T40, typename T41\n    >\nstruct list42\n    : l_item<\n          long_<42>\n        , T0\n        , list41< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38,T39,T40,T41 >\n        >\n{\n    typedef list42 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    , typename T20, typename T21, typename T22, typename T23, typename T24\n    , typename T25, typename T26, typename T27, typename T28, typename T29\n    , typename T30, typename T31, typename T32, typename T33, typename T34\n    , typename T35, typename T36, typename T37, typename T38, typename T39\n    , typename T40, typename T41, typename T42\n    >\nstruct list43\n    : l_item<\n          long_<43>\n        , T0\n        , list42< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38,T39,T40,T41,T42 >\n        >\n{\n    typedef list43 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    , typename T20, typename T21, typename T22, typename T23, typename T24\n    , typename T25, typename T26, typename T27, typename T28, typename T29\n    , typename T30, typename T31, typename T32, typename T33, typename T34\n    , typename T35, typename T36, typename T37, typename T38, typename T39\n    , typename T40, typename T41, typename T42, typename T43\n    >\nstruct list44\n    : l_item<\n          long_<44>\n        , T0\n        , list43< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38,T39,T40,T41,T42,T43 >\n        >\n{\n    typedef list44 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    , typename T20, typename T21, typename T22, typename T23, typename T24\n    , typename T25, typename T26, typename T27, typename T28, typename T29\n    , typename T30, typename T31, typename T32, typename T33, typename T34\n    , typename T35, typename T36, typename T37, typename T38, typename T39\n    , typename T40, typename T41, typename T42, typename T43, typename T44\n    >\nstruct list45\n    : l_item<\n          long_<45>\n        , T0\n        , list44< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38,T39,T40,T41,T42,T43,T44 >\n        >\n{\n    typedef list45 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    , typename T20, typename T21, typename T22, typename T23, typename T24\n    , typename T25, typename T26, typename T27, typename T28, typename T29\n    , typename T30, typename T31, typename T32, typename T33, typename T34\n    , typename T35, typename T36, typename T37, typename T38, typename T39\n    , typename T40, typename T41, typename T42, typename T43, typename T44\n    , typename T45\n    >\nstruct list46\n    : l_item<\n          long_<46>\n        , T0\n        , list45< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38,T39,T40,T41,T42,T43,T44,T45 >\n        >\n{\n    typedef list46 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    , typename T20, typename T21, typename T22, typename T23, typename T24\n    , typename T25, typename T26, typename T27, typename T28, typename T29\n    , typename T30, typename T31, typename T32, typename T33, typename T34\n    , typename T35, typename T36, typename T37, typename T38, typename T39\n    , typename T40, typename T41, typename T42, typename T43, typename T44\n    , typename T45, typename T46\n    >\nstruct list47\n    : l_item<\n          long_<47>\n        , T0\n        , list46< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38,T39,T40,T41,T42,T43,T44,T45,T46 >\n        >\n{\n    typedef list47 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    , typename T20, typename T21, typename T22, typename T23, typename T24\n    , typename T25, typename T26, typename T27, typename T28, typename T29\n    , typename T30, typename T31, typename T32, typename T33, typename T34\n    , typename T35, typename T36, typename T37, typename T38, typename T39\n    , typename T40, typename T41, typename T42, typename T43, typename T44\n    , typename T45, typename T46, typename T47\n    >\nstruct list48\n    : l_item<\n          long_<48>\n        , T0\n        , list47< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38,T39,T40,T41,T42,T43,T44,T45,T46,T47 >\n        >\n{\n    typedef list48 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    , typename T20, typename T21, typename T22, typename T23, typename T24\n    , typename T25, typename T26, typename T27, typename T28, typename T29\n    , typename T30, typename T31, typename T32, typename T33, typename T34\n    , typename T35, typename T36, typename T37, typename T38, typename T39\n    , typename T40, typename T41, typename T42, typename T43, typename T44\n    , typename T45, typename T46, typename T47, typename T48\n    >\nstruct list49\n    : l_item<\n          long_<49>\n        , T0\n        , list48< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38,T39,T40,T41,T42,T43,T44,T45,T46,T47,T48 >\n        >\n{\n    typedef list49 type;\n};\n\ntemplate<\n      typename T0, typename T1, typename T2, typename T3, typename T4\n    , typename T5, typename T6, typename T7, typename T8, typename T9\n    , typename T10, typename T11, typename T12, typename T13, typename T14\n    , typename T15, typename T16, typename T17, typename T18, typename T19\n    , typename T20, typename T21, typename T22, typename T23, typename T24\n    , typename T25, typename T26, typename T27, typename T28, typename T29\n    , typename T30, typename T31, typename T32, typename T33, typename T34\n    , typename T35, typename T36, typename T37, typename T38, typename T39\n    , typename T40, typename T41, typename T42, typename T43, typename T44\n    , typename T45, typename T46, typename T47, typename T48, typename T49\n    >\nstruct list50\n    : l_item<\n          long_<50>\n        , T0\n        , list49< T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,T31,T32,T33,T34,T35,T36,T37,T38,T39,T40,T41,T42,T43,T44,T45,T46,T47,T48,T49 >\n        >\n{\n    typedef list50 type;\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/aux_/preprocessed/plain/list50_c.hpp",
    "content": "\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n\n// Preprocessed version of \"boost/mpl/list/list50_c.hpp\" header\n// -- DO NOT modify by hand!\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20\n    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30\n    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40\n    >\nstruct list41_c\n    : l_item<\n          long_<41>\n        , integral_c< T,C0 >\n        , list40_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40 >\n        >\n{\n    typedef list41_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20\n    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30\n    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40\n    , T C41\n    >\nstruct list42_c\n    : l_item<\n          long_<42>\n        , integral_c< T,C0 >\n        , list41_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41 >\n        >\n{\n    typedef list42_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20\n    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30\n    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40\n    , T C41, T C42\n    >\nstruct list43_c\n    : l_item<\n          long_<43>\n        , integral_c< T,C0 >\n        , list42_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41,C42 >\n        >\n{\n    typedef list43_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20\n    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30\n    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40\n    , T C41, T C42, T C43\n    >\nstruct list44_c\n    : l_item<\n          long_<44>\n        , integral_c< T,C0 >\n        , list43_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41,C42,C43 >\n        >\n{\n    typedef list44_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20\n    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30\n    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40\n    , T C41, T C42, T C43, T C44\n    >\nstruct list45_c\n    : l_item<\n          long_<45>\n        , integral_c< T,C0 >\n        , list44_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41,C42,C43,C44 >\n        >\n{\n    typedef list45_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20\n    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30\n    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40\n    , T C41, T C42, T C43, T C44, T C45\n    >\nstruct list46_c\n    : l_item<\n          long_<46>\n        , integral_c< T,C0 >\n        , list45_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41,C42,C43,C44,C45 >\n        >\n{\n    typedef list46_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20\n    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30\n    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40\n    , T C41, T C42, T C43, T C44, T C45, T C46\n    >\nstruct list47_c\n    : l_item<\n          long_<47>\n        , integral_c< T,C0 >\n        , list46_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41,C42,C43,C44,C45,C46 >\n        >\n{\n    typedef list47_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20\n    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30\n    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40\n    , T C41, T C42, T C43, T C44, T C45, T C46, T C47\n    >\nstruct list48_c\n    : l_item<\n          long_<48>\n        , integral_c< T,C0 >\n        , list47_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41,C42,C43,C44,C45,C46,C47 >\n        >\n{\n    typedef list48_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20\n    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30\n    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40\n    , T C41, T C42, T C43, T C44, T C45, T C46, T C47, T C48\n    >\nstruct list49_c\n    : l_item<\n          long_<49>\n        , integral_c< T,C0 >\n        , list48_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41,C42,C43,C44,C45,C46,C47,C48 >\n        >\n{\n    typedef list49_c type;\n    typedef T value_type;\n};\n\ntemplate<\n      typename T\n    , T C0, T C1, T C2, T C3, T C4, T C5, T C6, T C7, T C8, T C9, T C10\n    , T C11, T C12, T C13, T C14, T C15, T C16, T C17, T C18, T C19, T C20\n    , T C21, T C22, T C23, T C24, T C25, T C26, T C27, T C28, T C29, T C30\n    , T C31, T C32, T C33, T C34, T C35, T C36, T C37, T C38, T C39, T C40\n    , T C41, T C42, T C43, T C44, T C45, T C46, T C47, T C48, T C49\n    >\nstruct list50_c\n    : l_item<\n          long_<50>\n        , integral_c< T,C0 >\n        , list49_c< T,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41,C42,C43,C44,C45,C46,C47,C48,C49 >\n        >\n{\n    typedef list50_c type;\n    typedef T value_type;\n};\n\n}}\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/aux_/push_back.hpp",
    "content": "\n#ifndef BOOST_MPL_LIST_AUX_PUSH_BACK_HPP_INCLUDED\n#define BOOST_MPL_LIST_AUX_PUSH_BACK_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/push_back_fwd.hpp>\n#include <boost/mpl/bool.hpp>\n#include <boost/mpl/list/aux_/tag.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate< typename Tag > struct has_push_back_impl;\n\ntemplate<>\nstruct has_push_back_impl< aux::list_tag >\n{\n    template< typename Seq > struct apply\n        : false_\n    {\n    };\n};\n\n}}\n\n#endif // BOOST_MPL_LIST_AUX_PUSH_BACK_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/aux_/push_front.hpp",
    "content": "\n#ifndef BOOST_MPL_LIST_AUX_PUSH_FRONT_HPP_INCLUDED\n#define BOOST_MPL_LIST_AUX_PUSH_FRONT_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/push_front_fwd.hpp>\n#include <boost/mpl/next.hpp>\n#include <boost/mpl/list/aux_/item.hpp>\n#include <boost/mpl/list/aux_/tag.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct push_front_impl< aux::list_tag >\n{\n    template< typename List, typename T > struct apply\n    {\n        typedef l_item<\n              typename next<typename List::size>::type\n            , T\n            , typename List::type\n            > type;\n    };\n};\n\n}}\n\n#endif // BOOST_MPL_LIST_AUX_PUSH_FRONT_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/aux_/size.hpp",
    "content": "\n#ifndef BOOST_MPL_LIST_AUX_SIZE_HPP_INCLUDED\n#define BOOST_MPL_LIST_AUX_SIZE_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/size_fwd.hpp>\n#include <boost/mpl/list/aux_/tag.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct size_impl< aux::list_tag >\n{\n    template< typename List > struct apply\n        : List::size\n    {\n    };\n};\n\n}}\n\n#endif // BOOST_MPL_LIST_AUX_SIZE_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/aux_/tag.hpp",
    "content": "\n#ifndef BOOST_MPL_LIST_AUX_TAG_HPP_INCLUDED\n#define BOOST_MPL_LIST_AUX_TAG_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\nnamespace boost { namespace mpl { namespace aux {\n\nstruct list_tag;\nstruct l_iter_tag;\n\n}}}\n\n#endif // BOOST_MPL_LIST_AUX_TAG_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/list0.hpp",
    "content": "\n#ifndef BOOST_MPL_LIST_LIST0_HPP_INCLUDED\n#define BOOST_MPL_LIST_LIST0_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/long.hpp>\n#include <boost/mpl/aux_/na.hpp>\n#include <boost/mpl/list/aux_/push_front.hpp>\n#include <boost/mpl/list/aux_/pop_front.hpp>\n#include <boost/mpl/list/aux_/push_back.hpp>\n#include <boost/mpl/list/aux_/front.hpp>\n#include <boost/mpl/list/aux_/clear.hpp>\n#include <boost/mpl/list/aux_/O1_size.hpp>\n#include <boost/mpl/list/aux_/size.hpp>\n#include <boost/mpl/list/aux_/empty.hpp>\n#include <boost/mpl/list/aux_/begin_end.hpp>\n#include <boost/mpl/list/aux_/item.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate< typename Dummy = na > struct list0;\n\ntemplate<> struct list0<na>\n    : l_end\n{\n    typedef l_end type;\n};\n\n}}\n\n#endif // BOOST_MPL_LIST_LIST0_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/list0_c.hpp",
    "content": "\n#ifndef BOOST_MPL_LIST_LIST0_C_HPP_INCLUDED\n#define BOOST_MPL_LIST_LIST0_C_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/list/list0.hpp>\n#include <boost/mpl/integral_c.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate< typename T > struct list0_c\n    : l_end\n{\n    typedef l_end type;\n    typedef T value_type;\n};\n\n}}\n\n#endif // BOOST_MPL_LIST_LIST0_C_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/list10.hpp",
    "content": "\n#ifndef BOOST_MPL_LIST_LIST10_HPP_INCLUDED\n#define BOOST_MPL_LIST_LIST10_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#if !defined(BOOST_MPL_PREPROCESSING_MODE)\n#   include <boost/mpl/list/list0.hpp>\n#endif\n\n#include <boost/mpl/aux_/config/use_preprocessed.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \\\n    && !defined(BOOST_MPL_PREPROCESSING_MODE)\n\n#   define BOOST_MPL_PREPROCESSED_HEADER list10.hpp\n#   include <boost/mpl/list/aux_/include_preprocessed.hpp>\n\n#else\n\n#   include <boost/preprocessor/iterate.hpp>\n\nnamespace boost { namespace mpl {\n\n#   define BOOST_PP_ITERATION_PARAMS_1 \\\n    (3,(1, 10, <boost/mpl/list/aux_/numbered.hpp>))\n#   include BOOST_PP_ITERATE()\n\n}}\n\n#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS\n\n#endif // BOOST_MPL_LIST_LIST10_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/list10_c.hpp",
    "content": "\n#ifndef BOOST_MPL_LIST_LIST10_C_HPP_INCLUDED\n#define BOOST_MPL_LIST_LIST10_C_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#if !defined(BOOST_MPL_PREPROCESSING_MODE)\n#   include <boost/mpl/list/list0_c.hpp>\n#endif\n\n#include <boost/mpl/aux_/config/use_preprocessed.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \\\n && !defined(BOOST_MPL_PREPROCESSING_MODE)\n\n#   define BOOST_MPL_PREPROCESSED_HEADER list10_c.hpp\n#   include <boost/mpl/list/aux_/include_preprocessed.hpp>\n\n#else\n\n#   include <boost/preprocessor/iterate.hpp>\n\nnamespace boost { namespace mpl {\n\n#   define BOOST_PP_ITERATION_PARAMS_1 \\\n    (3,(1, 10, <boost/mpl/list/aux_/numbered_c.hpp>))\n#   include BOOST_PP_ITERATE()\n\n}}\n\n#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS\n\n#endif // BOOST_MPL_LIST_LIST10_C_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/list20.hpp",
    "content": "\n#ifndef BOOST_MPL_LIST_LIST20_HPP_INCLUDED\n#define BOOST_MPL_LIST_LIST20_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#if !defined(BOOST_MPL_PREPROCESSING_MODE)\n#   include <boost/mpl/list/list10.hpp>\n#endif\n\n#include <boost/mpl/aux_/config/use_preprocessed.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \\\n && !defined(BOOST_MPL_PREPROCESSING_MODE)\n\n#   define BOOST_MPL_PREPROCESSED_HEADER list20.hpp\n#   include <boost/mpl/list/aux_/include_preprocessed.hpp>\n\n#else\n\n#   include <boost/preprocessor/iterate.hpp>\n\nnamespace boost { namespace mpl {\n\n#   define BOOST_PP_ITERATION_PARAMS_1 \\\n    (3,(11, 20, <boost/mpl/list/aux_/numbered.hpp>))\n#   include BOOST_PP_ITERATE()\n\n}}\n\n#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS\n\n#endif // BOOST_MPL_LIST_LIST20_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/list20_c.hpp",
    "content": "\n#ifndef BOOST_MPL_LIST_LIST20_C_HPP_INCLUDED\n#define BOOST_MPL_LIST_LIST20_C_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#if !defined(BOOST_MPL_PREPROCESSING_MODE)\n#   include <boost/mpl/list/list10_c.hpp>\n#endif\n\n#include <boost/mpl/aux_/config/use_preprocessed.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \\\n && !defined(BOOST_MPL_PREPROCESSING_MODE)\n\n#   define BOOST_MPL_PREPROCESSED_HEADER list20_c.hpp\n#   include <boost/mpl/list/aux_/include_preprocessed.hpp>\n\n#else\n\n#   include <boost/preprocessor/iterate.hpp>\n\nnamespace boost { namespace mpl {\n\n#   define BOOST_PP_ITERATION_PARAMS_1 \\\n    (3,(11, 20, <boost/mpl/list/aux_/numbered_c.hpp>))\n#   include BOOST_PP_ITERATE()\n\n}}\n\n#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS\n\n#endif // BOOST_MPL_LIST_LIST20_C_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/list30.hpp",
    "content": "\n#ifndef BOOST_MPL_LIST_LIST30_HPP_INCLUDED\n#define BOOST_MPL_LIST_LIST30_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#if !defined(BOOST_MPL_PREPROCESSING_MODE)\n#   include <boost/mpl/list/list20.hpp>\n#endif\n\n#include <boost/mpl/aux_/config/use_preprocessed.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \\\n && !defined(BOOST_MPL_PREPROCESSING_MODE)\n\n#   define BOOST_MPL_PREPROCESSED_HEADER list30.hpp\n#   include <boost/mpl/list/aux_/include_preprocessed.hpp>\n\n#else\n\n#   include <boost/preprocessor/iterate.hpp>\n\nnamespace boost { namespace mpl {\n\n#   define BOOST_PP_ITERATION_PARAMS_1 \\\n    (3,(21, 30, <boost/mpl/list/aux_/numbered.hpp>))\n#   include BOOST_PP_ITERATE()\n\n}}\n\n#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS\n\n#endif // BOOST_MPL_LIST_LIST30_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/list30_c.hpp",
    "content": "\n#ifndef BOOST_MPL_LIST_LIST30_C_HPP_INCLUDED\n#define BOOST_MPL_LIST_LIST30_C_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#if !defined(BOOST_MPL_PREPROCESSING_MODE)\n#   include <boost/mpl/list/list20_c.hpp>\n#endif\n\n#include <boost/mpl/aux_/config/use_preprocessed.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \\\n && !defined(BOOST_MPL_PREPROCESSING_MODE)\n\n#   define BOOST_MPL_PREPROCESSED_HEADER list30_c.hpp\n#   include <boost/mpl/list/aux_/include_preprocessed.hpp>\n\n#else\n\n#   include <boost/preprocessor/iterate.hpp>\n\nnamespace boost { namespace mpl {\n\n#   define BOOST_PP_ITERATION_PARAMS_1 \\\n    (3,(21, 30, <boost/mpl/list/aux_/numbered_c.hpp>))\n#   include BOOST_PP_ITERATE()\n\n}}\n\n#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS\n\n#endif // BOOST_MPL_LIST_LIST30_C_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/list40.hpp",
    "content": "\n#ifndef BOOST_MPL_LIST_LIST40_HPP_INCLUDED\n#define BOOST_MPL_LIST_LIST40_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#if !defined(BOOST_MPL_PREPROCESSING_MODE)\n#   include <boost/mpl/list/list30.hpp>\n#endif\n\n#include <boost/mpl/aux_/config/use_preprocessed.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \\\n && !defined(BOOST_MPL_PREPROCESSING_MODE)\n\n#   define BOOST_MPL_PREPROCESSED_HEADER list40.hpp\n#   include <boost/mpl/list/aux_/include_preprocessed.hpp>\n\n#else\n\n#   include <boost/preprocessor/iterate.hpp>\n\nnamespace boost { namespace mpl {\n\n#   define BOOST_PP_ITERATION_PARAMS_1 \\\n    (3,(31, 40, <boost/mpl/list/aux_/numbered.hpp>))\n#   include BOOST_PP_ITERATE()\n\n}}\n\n#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS\n\n#endif // BOOST_MPL_LIST_LIST40_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/list40_c.hpp",
    "content": "\n#ifndef BOOST_MPL_LIST_LIST40_C_HPP_INCLUDED\n#define BOOST_MPL_LIST_LIST40_C_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#if !defined(BOOST_MPL_PREPROCESSING_MODE)\n#   include <boost/mpl/list/list30_c.hpp>\n#endif\n\n#include <boost/mpl/aux_/config/use_preprocessed.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \\\n && !defined(BOOST_MPL_PREPROCESSING_MODE)\n\n#   define BOOST_MPL_PREPROCESSED_HEADER list40_c.hpp\n#   include <boost/mpl/list/aux_/include_preprocessed.hpp>\n\n#else\n\n#   include <boost/preprocessor/iterate.hpp>\n\nnamespace boost { namespace mpl {\n\n#   define BOOST_PP_ITERATION_PARAMS_1 \\\n    (3,(31, 40, <boost/mpl/list/aux_/numbered_c.hpp>))\n#   include BOOST_PP_ITERATE()\n\n}}\n\n#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS\n\n#endif // BOOST_MPL_LIST_LIST40_C_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/list50.hpp",
    "content": "\n#ifndef BOOST_MPL_LIST_LIST50_HPP_INCLUDED\n#define BOOST_MPL_LIST_LIST50_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#if !defined(BOOST_MPL_PREPROCESSING_MODE)\n#   include <boost/mpl/list/list40.hpp>\n#endif\n\n#include <boost/mpl/aux_/config/use_preprocessed.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \\\n && !defined(BOOST_MPL_PREPROCESSING_MODE)\n\n#   define BOOST_MPL_PREPROCESSED_HEADER list50.hpp\n#   include <boost/mpl/list/aux_/include_preprocessed.hpp>\n\n#else\n\n#   include <boost/preprocessor/iterate.hpp>\n\nnamespace boost { namespace mpl {\n\n#   define BOOST_PP_ITERATION_PARAMS_1 \\\n    (3,(41, 50, <boost/mpl/list/aux_/numbered.hpp>))\n#   include BOOST_PP_ITERATE()\n\n}}\n\n#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS\n\n#endif // BOOST_MPL_LIST_LIST50_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/list/list50_c.hpp",
    "content": "\n#ifndef BOOST_MPL_LIST_LIST50_C_HPP_INCLUDED\n#define BOOST_MPL_LIST_LIST50_C_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#if !defined(BOOST_MPL_PREPROCESSING_MODE)\n#   include <boost/mpl/list/list40_c.hpp>\n#endif\n\n#include <boost/mpl/aux_/config/use_preprocessed.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \\\n && !defined(BOOST_MPL_PREPROCESSING_MODE)\n\n#   define BOOST_MPL_PREPROCESSED_HEADER list50_c.hpp\n#   include <boost/mpl/list/aux_/include_preprocessed.hpp>\n\n#else\n\n#   include <boost/preprocessor/iterate.hpp>\n\nnamespace boost { namespace mpl {\n\n#   define BOOST_PP_ITERATION_PARAMS_1 \\\n    (3,(41, 50, <boost/mpl/list/aux_/numbered_c.hpp>))\n#   include BOOST_PP_ITERATE()\n\n}}\n\n#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS\n\n#endif // BOOST_MPL_LIST_LIST50_C_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/list.hpp",
    "content": "\n#ifndef BOOST_MPL_LIST_HPP_INCLUDED\n#define BOOST_MPL_LIST_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#if !defined(BOOST_MPL_PREPROCESSING_MODE)\n#   include <boost/mpl/limits/list.hpp>\n#   include <boost/mpl/aux_/na.hpp>\n#   include <boost/mpl/aux_/config/preprocessor.hpp>\n\n#   include <boost/preprocessor/inc.hpp>\n#   include <boost/preprocessor/cat.hpp>\n#   include <boost/preprocessor/stringize.hpp>\n\n#if !defined(BOOST_NEEDS_TOKEN_PASTING_OP_FOR_TOKENS_JUXTAPOSING)\n#   define AUX778076_LIST_HEADER \\\n    BOOST_PP_CAT(list,BOOST_MPL_LIMIT_LIST_SIZE).hpp \\\n    /**/\n#else\n#   define AUX778076_LIST_HEADER \\\n    BOOST_PP_CAT(list,BOOST_MPL_LIMIT_LIST_SIZE)##.hpp \\\n    /**/\n#endif\n\n#   include BOOST_PP_STRINGIZE(boost/mpl/list/AUX778076_LIST_HEADER)\n#   undef AUX778076_LIST_HEADER\n#endif\n\n#include <boost/mpl/aux_/config/use_preprocessed.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \\\n    && !defined(BOOST_MPL_PREPROCESSING_MODE)\n\n#   define BOOST_MPL_PREPROCESSED_HEADER list.hpp\n#   include <boost/mpl/aux_/include_preprocessed.hpp>\n\n#else\n\n#   include <boost/mpl/limits/list.hpp>\n\n#   define AUX778076_SEQUENCE_NAME list\n#   define AUX778076_SEQUENCE_LIMIT BOOST_MPL_LIMIT_LIST_SIZE\n#   include <boost/mpl/aux_/sequence_wrapper.hpp>\n\n#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS\n#endif // BOOST_MPL_LIST_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/logical.hpp",
    "content": "\n#ifndef BOOST_MPL_LOGICAL_HPP_INCLUDED\n#define BOOST_MPL_LOGICAL_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/or.hpp>\n#include <boost/mpl/and.hpp>\n#include <boost/mpl/not.hpp>\n\n#endif // BOOST_MPL_LOGICAL_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/long.hpp",
    "content": "\n#ifndef BOOST_MPL_LONG_HPP_INCLUDED\n#define BOOST_MPL_LONG_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/long_fwd.hpp>\n\n#define AUX_WRAPPER_VALUE_TYPE long\n#include <boost/mpl/aux_/integral_wrapper.hpp>\n\n#endif // BOOST_MPL_LONG_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/long_fwd.hpp",
    "content": "\n#ifndef BOOST_MPL_LONG_FWD_HPP_INCLUDED\n#define BOOST_MPL_LONG_FWD_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/adl_barrier.hpp>\n#include <boost/mpl/aux_/nttp_decl.hpp>\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\n\ntemplate< BOOST_MPL_AUX_NTTP_DECL(long, N) > struct long_;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nBOOST_MPL_AUX_ADL_BARRIER_DECL(long_)\n\n#endif // BOOST_MPL_LONG_FWD_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/next.hpp",
    "content": "\n#ifndef BOOST_MPL_NEXT_HPP_INCLUDED\n#define BOOST_MPL_NEXT_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/next_prior.hpp>\n\n#endif // BOOST_MPL_NEXT_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/next_prior.hpp",
    "content": "\n#ifndef BOOST_MPL_NEXT_PRIOR_HPP_INCLUDED\n#define BOOST_MPL_NEXT_PRIOR_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/common_name_wknd.hpp>\n#include <boost/mpl/aux_/na_spec.hpp>\n#include <boost/mpl/aux_/lambda_support.hpp>\n\nnamespace boost { namespace mpl {\n\nBOOST_MPL_AUX_COMMON_NAME_WKND(next)\nBOOST_MPL_AUX_COMMON_NAME_WKND(prior)\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T)\n    >\nstruct next\n{\n    typedef typename T::next type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,next,(T))\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T)\n    >\nstruct prior\n{\n    typedef typename T::prior type;\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,prior,(T))\n};\n\nBOOST_MPL_AUX_NA_SPEC(1, next)\nBOOST_MPL_AUX_NA_SPEC(1, prior)\n\n}}\n\n#endif // BOOST_MPL_NEXT_PRIOR_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/not.hpp",
    "content": "\n#ifndef BOOST_MPL_NOT_HPP_INCLUDED\n#define BOOST_MPL_NOT_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/bool.hpp>\n#include <boost/mpl/aux_/nttp_decl.hpp>\n#include <boost/mpl/aux_/nested_type_wknd.hpp>\n#include <boost/mpl/aux_/na_spec.hpp>\n#include <boost/mpl/aux_/lambda_support.hpp>\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\n\ntemplate< BOOST_MPL_AUX_NTTP_DECL(long, C_) > // 'long' is intentional here\nstruct not_impl\n    : bool_<!C_>\n{\n};\n\n} // namespace aux\n\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T)\n    >\nstruct not_\n    : aux::not_impl<\n          BOOST_MPL_AUX_NESTED_TYPE_WKND(T)::value\n        >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,not_,(T))\n};\n\nBOOST_MPL_AUX_NA_SPEC(1,not_)\n\n}}\n\n#endif // BOOST_MPL_NOT_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/or.hpp",
    "content": "\n#ifndef BOOST_MPL_OR_HPP_INCLUDED\n#define BOOST_MPL_OR_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/config/use_preprocessed.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \\\n    && !defined(BOOST_MPL_PREPROCESSING_MODE)\n\n#   include <boost/mpl/bool.hpp>\n#   include <boost/mpl/aux_/nested_type_wknd.hpp>\n#   include <boost/mpl/aux_/na_spec.hpp>\n#   include <boost/mpl/aux_/lambda_support.hpp>\n#   include <boost/mpl/aux_/config/msvc.hpp>\n\n// agurt, 19/may/04: workaround a conflict with <iso646.h> header's \n// 'or' and 'and' macros, see http://tinyurl.com/3et69; 'defined(or)'\n// has to be checked in a separate condition, otherwise GCC complains \n// about 'or' being an alternative token\n#if defined(_MSC_VER) && !defined(__clang__)\n#ifndef __GCCXML__\n#if defined(or)\n#   pragma push_macro(\"or\")\n#   undef or\n#   define or(x)\n#endif\n#endif\n#endif\n\n#   define BOOST_MPL_PREPROCESSED_HEADER or.hpp\n#   include <boost/mpl/aux_/include_preprocessed.hpp>\n\n#if defined(_MSC_VER) && !defined(__clang__)\n#ifndef __GCCXML__\n#if defined(or)\n#   pragma pop_macro(\"or\")\n#endif\n#endif\n#endif\n\n#else\n\n#   define AUX778076_OP_NAME or_\n#   define AUX778076_OP_VALUE1 true\n#   define AUX778076_OP_VALUE2 false\n#   include <boost/mpl/aux_/logical_op.hpp>\n\n#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS\n#endif // BOOST_MPL_OR_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/pair.hpp",
    "content": "\n#ifndef BOOST_MPL_PAIR_HPP_INCLUDED\n#define BOOST_MPL_PAIR_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/msvc_eti_base.hpp>\n#include <boost/mpl/aux_/na_spec.hpp>\n#include <boost/mpl/aux_/lambda_support.hpp>\n#include <boost/mpl/aux_/config/eti.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T1)\n    , typename BOOST_MPL_AUX_NA_PARAM(T2)\n    >\nstruct pair\n{\n    typedef pair type;\n    typedef T1 first;\n    typedef T2 second;\n\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2,pair,(T1,T2))\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(P)\n    >\nstruct first\n{\n#if !defined(BOOST_MPL_CFG_MSVC_70_ETI_BUG)\n    typedef typename P::first type;\n#else\n    typedef typename aux::msvc_eti_base<P>::first type;\n#endif\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,first,(P))\n};\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(P)\n    >\nstruct second\n{\n#if !defined(BOOST_MPL_CFG_MSVC_70_ETI_BUG)\n    typedef typename P::second type;\n#else\n    typedef typename aux::msvc_eti_base<P>::second type;\n#endif\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,second,(P))\n};\n\n\nBOOST_MPL_AUX_NA_SPEC_NO_ETI(2, pair)\nBOOST_MPL_AUX_NA_SPEC(1, first)\nBOOST_MPL_AUX_NA_SPEC(1, second)\n\n}}\n\n#endif // BOOST_MPL_PAIR_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/placeholders.hpp",
    "content": "\n#if !defined(BOOST_PP_IS_ITERATING)\n\n///// header body\n\n#ifndef BOOST_MPL_PLACEHOLDERS_HPP_INCLUDED\n#define BOOST_MPL_PLACEHOLDERS_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2001-2004\n// Copyright Peter Dimov 2001-2003\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n\n#if !defined(BOOST_MPL_PREPROCESSING_MODE)\n#   include <boost/mpl/arg.hpp>\n#   include <boost/mpl/aux_/adl_barrier.hpp>\n\n#   if !defined(BOOST_MPL_CFG_NO_ADL_BARRIER_NAMESPACE)\n#       define BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(type) \\\n        using ::BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::type; \\\n        /**/\n#   else\n#       define BOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(type) /**/\n#   endif\n\n#endif\n\n#include <boost/mpl/aux_/config/use_preprocessed.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \\\n && !defined(BOOST_MPL_PREPROCESSING_MODE)\n\n#   define BOOST_MPL_PREPROCESSED_HEADER placeholders.hpp\n#   include <boost/mpl/aux_/include_preprocessed.hpp>\n\n#else\n\n#   include <boost/mpl/aux_/nttp_decl.hpp>\n#   include <boost/mpl/limits/arity.hpp>\n#   include <boost/preprocessor/iterate.hpp>\n#   include <boost/preprocessor/cat.hpp>\n\n// watch out for GNU gettext users, who #define _(x)\n#if !defined(_) || defined(BOOST_MPL_CFG_NO_UNNAMED_PLACEHOLDER_SUPPORT)\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\ntypedef arg<-1> _;\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\n\nnamespace boost { namespace mpl { \n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(_)\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::_;\n}\n\n}}\n#endif\n\n/// agurt, 17/mar/02: one more placeholder for the last 'apply#' \n/// specialization\n#define BOOST_PP_ITERATION_PARAMS_1 \\\n    (3,(1, BOOST_MPL_LIMIT_METAFUNCTION_ARITY + 1, <boost/mpl/placeholders.hpp>))\n#include BOOST_PP_ITERATE()\n\n#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS\n#endif // BOOST_MPL_PLACEHOLDERS_HPP_INCLUDED\n\n///// iteration\n\n#else\n#define i_ BOOST_PP_FRAME_ITERATION(1)\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\n\ntypedef arg<i_> BOOST_PP_CAT(_,i_);\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\n\nnamespace boost { namespace mpl { \n\nBOOST_MPL_AUX_ARG_ADL_BARRIER_DECL(BOOST_PP_CAT(_,i_))\n\nnamespace placeholders {\nusing BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE::BOOST_PP_CAT(_,i_);\n}\n\n}}\n\n#undef i_\n#endif // BOOST_PP_IS_ITERATING\n"
  },
  {
    "path": "benchmarks/boost/mpl/pop_front_fwd.hpp",
    "content": "\n#ifndef BOOST_MPL_POP_FRONT_FWD_HPP_INCLUDED\n#define BOOST_MPL_POP_FRONT_FWD_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\nnamespace boost { namespace mpl {\n\ntemplate< typename Tag > struct pop_front_impl;\ntemplate< typename Sequence > struct pop_front;\n\n}}\n\n#endif // BOOST_MPL_POP_FRONT_FWD_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/prior.hpp",
    "content": "\n#ifndef BOOST_MPL_PRIOR_HPP_INCLUDED\n#define BOOST_MPL_PRIOR_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/next_prior.hpp>\n\n#endif // BOOST_MPL_PRIOR_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/protect.hpp",
    "content": "\n#ifndef BOOST_MPL_PROTECT_HPP_INCLUDED\n#define BOOST_MPL_PROTECT_HPP_INCLUDED\n\n// Copyright Peter Dimov 2001\n// Copyright Aleksey Gurtovoy 2002-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/arity.hpp>\n#include <boost/mpl/aux_/config/dtp.hpp>\n#include <boost/mpl/aux_/nttp_decl.hpp>\n#include <boost/mpl/aux_/na_spec.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(T)\n    , int not_le_ = 0\n    >\nstruct protect : T\n{\n#if BOOST_WORKAROUND(__EDG_VERSION__, == 238)\n    typedef mpl::protect type;\n#else\n    typedef protect type;\n#endif\n};\n\n#if defined(BOOST_MPL_CFG_BROKEN_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES)\nnamespace aux { \ntemplate< BOOST_MPL_AUX_NTTP_DECL(int, N), typename T >\nstruct arity< protect<T>, N > \n    : arity<T,N>\n{ \n};\n} // namespace aux\n#endif\n\nBOOST_MPL_AUX_NA_SPEC_MAIN(1, protect)\n#if !defined(BOOST_MPL_CFG_NO_FULL_LAMBDA_SUPPORT)\nBOOST_MPL_AUX_NA_SPEC_TEMPLATE_ARITY(1, 1, protect)\n#endif\n\n}}\n\n#endif // BOOST_MPL_PROTECT_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/push_back_fwd.hpp",
    "content": "\n#ifndef BOOST_MPL_PUSH_BACK_FWD_HPP_INCLUDED\n#define BOOST_MPL_PUSH_BACK_FWD_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\nnamespace boost { namespace mpl {\n\ntemplate< typename Tag > struct push_back_impl;\ntemplate< typename Sequence, typename T > struct push_back;\n\n}}\n\n#endif // BOOST_MPL_PUSH_BACK_FWD_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/push_front.hpp",
    "content": "\n#ifndef BOOST_MPL_PUSH_FRONT_HPP_INCLUDED\n#define BOOST_MPL_PUSH_FRONT_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/push_front_fwd.hpp>\n#include <boost/mpl/aux_/push_front_impl.hpp>\n#include <boost/mpl/sequence_tag.hpp>\n#include <boost/mpl/aux_/na_spec.hpp>\n#include <boost/mpl/aux_/lambda_support.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(Sequence)\n    , typename BOOST_MPL_AUX_NA_PARAM(T)\n    >\nstruct push_front\n    : push_front_impl< typename sequence_tag<Sequence>::type >\n        ::template apply< Sequence,T >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(2,push_front,(Sequence,T))\n};\n\n\ntemplate< \n      typename BOOST_MPL_AUX_NA_PARAM(Sequence)\n    >\nstruct has_push_front\n    : has_push_front_impl< typename sequence_tag<Sequence>::type >\n        ::template apply< Sequence >\n{\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,has_push_front,(Sequence))\n};\n\nBOOST_MPL_AUX_NA_SPEC(2, push_front)\nBOOST_MPL_AUX_NA_SPEC(1, has_push_front)\n\n}}\n\n#endif // BOOST_MPL_PUSH_FRONT_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/push_front_fwd.hpp",
    "content": "\n#ifndef BOOST_MPL_PUSH_FRONT_FWD_HPP_INCLUDED\n#define BOOST_MPL_PUSH_FRONT_FWD_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\nnamespace boost { namespace mpl {\n\ntemplate< typename Tag > struct push_front_impl;\ntemplate< typename Sequence, typename T > struct push_front;\n\n}}\n\n#endif // BOOST_MPL_PUSH_FRONT_FWD_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/quote.hpp",
    "content": "\n#if !defined(BOOST_PP_IS_ITERATING)\n\n///// header body\n\n#ifndef BOOST_MPL_QUOTE_HPP_INCLUDED\n#define BOOST_MPL_QUOTE_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2008\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#if !defined(BOOST_MPL_PREPROCESSING_MODE)\n#   include <boost/mpl/void.hpp>\n#   include <boost/mpl/aux_/has_type.hpp>\n#endif\n\n#include <boost/mpl/aux_/config/bcc.hpp>\n#include <boost/mpl/aux_/config/ttp.hpp>\n\n#if defined(BOOST_MPL_CFG_NO_TEMPLATE_TEMPLATE_PARAMETERS) \\\n    && !defined(BOOST_MPL_CFG_BCC590_WORKAROUNDS)\n#   define BOOST_MPL_CFG_NO_QUOTE_TEMPLATE\n#endif\n\n#if !defined(BOOST_MPL_CFG_NO_IMPLICIT_METAFUNCTIONS) \\\n    && defined(BOOST_MPL_CFG_NO_HAS_XXX)\n#   define BOOST_MPL_CFG_NO_IMPLICIT_METAFUNCTIONS\n#endif\n\n#include <boost/mpl/aux_/config/use_preprocessed.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \\\n && !defined(BOOST_MPL_PREPROCESSING_MODE)\n\n#   define BOOST_MPL_PREPROCESSED_HEADER quote.hpp\n#   include <boost/mpl/aux_/include_preprocessed.hpp>\n\n#else\n\n#   include <boost/mpl/limits/arity.hpp>\n#   include <boost/mpl/aux_/preprocessor/params.hpp>\n#   include <boost/mpl/aux_/config/ctps.hpp>\n#   include <boost/mpl/aux_/config/workaround.hpp>\n\n#   include <boost/preprocessor/iterate.hpp>\n#   include <boost/preprocessor/cat.hpp>\n\n#if !defined(BOOST_MPL_CFG_NO_QUOTE_TEMPLATE)\n\nnamespace boost { namespace mpl {\n\n#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)\n\ntemplate< typename T, bool has_type_ >\nstruct quote_impl\n// GCC has a problem with metafunction forwarding when T is a\n// specialization of a template called 'type'.\n# if BOOST_WORKAROUND(__GNUC__, BOOST_TESTED_AT(4)) \\\n    && BOOST_WORKAROUND(__GNUC_MINOR__, BOOST_TESTED_AT(0)) \\\n    && BOOST_WORKAROUND(__GNUC_PATCHLEVEL__, BOOST_TESTED_AT(2))\n{\n    typedef typename T::type type;\n};\n# else \n    : T\n{\n};\n# endif \n\ntemplate< typename T >\nstruct quote_impl<T,false>\n{\n    typedef T type;\n};\n\n#else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION\n\ntemplate< bool > struct quote_impl\n{\n    template< typename T > struct result_\n        : T\n    {\n    };\n};\n\ntemplate<> struct quote_impl<false>\n{\n    template< typename T > struct result_\n    {\n        typedef T type;\n    };\n};\n\n#endif \n\n#define BOOST_PP_ITERATION_PARAMS_1 \\\n    (3,(1, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, <boost/mpl/quote.hpp>))\n#include BOOST_PP_ITERATE()\n\n}}\n\n#endif // BOOST_MPL_CFG_NO_QUOTE_TEMPLATE\n\n#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS\n#endif // BOOST_MPL_QUOTE_HPP_INCLUDED\n\n///// iteration\n\n#else\n#define i_ BOOST_PP_FRAME_ITERATION(1)\n\ntemplate<\n      template< BOOST_MPL_PP_PARAMS(i_, typename P) > class F\n    , typename Tag = void_\n    >\nstruct BOOST_PP_CAT(quote,i_)\n{\n    template< BOOST_MPL_PP_PARAMS(i_, typename U) > struct apply\n#if defined(BOOST_MPL_CFG_BCC590_WORKAROUNDS)\n    {\n        typedef typename quote_impl<\n              F< BOOST_MPL_PP_PARAMS(i_, U) >\n            , aux::has_type< F< BOOST_MPL_PP_PARAMS(i_, U) > >::value\n            >::type type;\n    };\n#elif !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)\n        : quote_impl<\n              F< BOOST_MPL_PP_PARAMS(i_, U) >\n            , aux::has_type< F< BOOST_MPL_PP_PARAMS(i_, U) > >::value\n            >\n    {\n    };\n#else\n        : quote_impl< aux::has_type< F< BOOST_MPL_PP_PARAMS(i_, U) > >::value >\n            ::template result_< F< BOOST_MPL_PP_PARAMS(i_, U) > >\n    {\n    };\n#endif\n};\n\n#undef i_\n#endif // BOOST_PP_IS_ITERATING\n"
  },
  {
    "path": "benchmarks/boost/mpl/reverse_fold.hpp",
    "content": "\n#ifndef BOOST_MPL_REVERSE_FOLD_HPP_INCLUDED\n#define BOOST_MPL_REVERSE_FOLD_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2001-2004\n// Copyright David Abrahams 2001-2002\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/begin_end.hpp>\n#include <boost/mpl/O1_size.hpp>\n#include <boost/mpl/arg.hpp>\n#include <boost/mpl/aux_/reverse_fold_impl.hpp>\n#include <boost/mpl/aux_/na_spec.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(Sequence)\n    , typename BOOST_MPL_AUX_NA_PARAM(State)\n    , typename BOOST_MPL_AUX_NA_PARAM(BackwardOp)\n    , typename ForwardOp = arg<1>\n    >\nstruct reverse_fold\n{\n    typedef typename aux::reverse_fold_impl<\n          ::boost::mpl::O1_size<Sequence>::value\n        , typename begin<Sequence>::type\n        , typename end<Sequence>::type\n        , State\n        , BackwardOp\n        , ForwardOp\n        >::state type;\n\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(3,reverse_fold,(Sequence,State,BackwardOp))\n};\n\nBOOST_MPL_AUX_NA_SPEC(3, reverse_fold)\n\n}}\n\n#endif // BOOST_MPL_REVERSE_FOLD_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/same_as.hpp",
    "content": "\n#ifndef BOOST_MPL_SAME_AS_HPP_INCLUDED\n#define BOOST_MPL_SAME_AS_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/not.hpp>\n#include <boost/mpl/aux_/lambda_spec.hpp>\n#include <boost/mpl/aux_/config/forwarding.hpp>\n\n#include <boost/type_traits/is_same.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate< typename T1 >\nstruct same_as\n{\n    template< typename T2 > struct apply\n#if !defined(BOOST_MPL_CFG_NO_NESTED_FORWARDING)\n        : is_same<T1,T2>\n    {\n#else\n    {\n        typedef typename is_same<T1,T2>::type type;\n#endif\n    };\n};\n\ntemplate< typename T1 >\nstruct not_same_as\n{\n    template< typename T2 > struct apply\n#if !defined(BOOST_MPL_CFG_NO_NESTED_FORWARDING)\n        : not_< is_same<T1,T2> >\n    {\n#else\n    {\n        typedef typename not_< is_same<T1,T2> >::type type;\n#endif\n    };\n};\n\n}}\n\n#endif // BOOST_MPL_SAME_AS_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/sequence_tag.hpp",
    "content": "\n#ifndef BOOST_MPL_SEQUENCE_TAG_HPP_INCLUDED\n#define BOOST_MPL_SEQUENCE_TAG_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/sequence_tag_fwd.hpp>\n#include <boost/mpl/aux_/has_tag.hpp>\n#include <boost/mpl/aux_/has_begin.hpp>\n#include <boost/mpl/aux_/na_spec.hpp>\n#include <boost/mpl/aux_/is_msvc_eti_arg.hpp>\n#include <boost/mpl/aux_/config/eti.hpp>\n#include <boost/mpl/aux_/yes_no.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n\nnamespace boost { namespace mpl {\n\n// agurt, 27/nov/02: have to use a simplistic 'sequence_tag' implementation\n// on MSVC to avoid dreadful \"internal structure overflow\" error\n#if BOOST_WORKAROUND(BOOST_MSVC, < 1300) \\\n    || defined(BOOST_MPL_CFG_NO_HAS_XXX)\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(Sequence)\n    >\nstruct sequence_tag\n{\n    typedef typename Sequence::tag type;\n};\n\n#elif BOOST_WORKAROUND(BOOST_MSVC, == 1300)\n\n// agurt, 07/feb/03: workaround for what seems to be MSVC 7.0-specific ETI issue\n\nnamespace aux {\n\ntemplate< bool >\nstruct sequence_tag_impl\n{\n    template< typename Sequence > struct result_\n    {\n        typedef typename Sequence::tag type;\n    };\n};\n\ntemplate<>\nstruct sequence_tag_impl<false>\n{\n    template< typename Sequence > struct result_\n    {\n        typedef int type;\n    };\n};\n\n} // namespace aux\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(Sequence)\n    >\nstruct sequence_tag\n    : aux::sequence_tag_impl< !aux::is_msvc_eti_arg<Sequence>::value >\n        ::template result_<Sequence>\n{\n};\n\n#else\n\nnamespace aux {\n\ntemplate< bool has_tag_, bool has_begin_ >\nstruct sequence_tag_impl\n{\n    // agurt 24/nov/02: MSVC 6.5 gets confused in 'sequence_tag_impl<true>' \n    // specialization below, if we name it 'result_' here\n    template< typename Sequence > struct result2_;\n};\n\n#   define AUX_CLASS_SEQUENCE_TAG_SPEC(has_tag, has_begin, result_type) \\\ntemplate<> struct sequence_tag_impl<has_tag,has_begin> \\\n{ \\\n    template< typename Sequence > struct result2_ \\\n    { \\\n        typedef result_type type; \\\n    }; \\\n}; \\\n/**/\n\nAUX_CLASS_SEQUENCE_TAG_SPEC(true, true, typename Sequence::tag)\nAUX_CLASS_SEQUENCE_TAG_SPEC(true, false, typename Sequence::tag)\nAUX_CLASS_SEQUENCE_TAG_SPEC(false, true, nested_begin_end_tag)\nAUX_CLASS_SEQUENCE_TAG_SPEC(false, false, non_sequence_tag)\n\n#   undef AUX_CLASS_SEQUENCE_TAG_SPEC\n\n} // namespace aux\n\ntemplate<\n      typename BOOST_MPL_AUX_NA_PARAM(Sequence)\n    >\nstruct sequence_tag\n    : aux::sequence_tag_impl<\n          ::boost::mpl::aux::has_tag<Sequence>::value\n        , ::boost::mpl::aux::has_begin<Sequence>::value\n        >::template result2_<Sequence>\n{\n};\n\n#endif // BOOST_MSVC\n\nBOOST_MPL_AUX_NA_SPEC(1, sequence_tag)\n\n}}\n\n#endif // BOOST_MPL_SEQUENCE_TAG_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/sequence_tag_fwd.hpp",
    "content": "\n#ifndef BOOST_MPL_SEQUENCE_TAG_FWD_HPP_INCLUDED\n#define BOOST_MPL_SEQUENCE_TAG_FWD_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\nnamespace boost { namespace mpl {\n\nstruct nested_begin_end_tag;\nstruct non_sequence_tag;\n\ntemplate< typename Sequence > struct sequence_tag;\n\n}}\n\n#endif // BOOST_MPL_SEQUENCE_TAG_FWD_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/set/aux_/at_impl.hpp",
    "content": "\n#ifndef BOOST_MPL_SET_AUX_AT_IMPL_HPP_INCLUDED\n#define BOOST_MPL_SET_AUX_AT_IMPL_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2003-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/at_fwd.hpp>\n#include <boost/mpl/set/aux_/has_key_impl.hpp>\n#include <boost/mpl/set/aux_/tag.hpp>\n#include <boost/mpl/if.hpp>\n#include <boost/mpl/void.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct at_impl< aux::set_tag >\n{\n    template< typename Set, typename T > struct apply\n    {\n        typedef typename if_< \n              has_key_impl<aux::set_tag>::apply<Set,T>\n            , T\n            , void_\n            >::type type;            \n    };\n};\n\n}}\n\n#endif // BOOST_MPL_SET_AUX_AT_IMPL_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/set/aux_/begin_end_impl.hpp",
    "content": "\n#ifndef BOOST_MPL_SET_AUX_BEGIN_END_IMPL_HPP_INCLUDED\n#define BOOST_MPL_SET_AUX_BEGIN_END_IMPL_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2003-2007\n// Copyright David Abrahams 2003-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/begin_end_fwd.hpp>\n#include <boost/mpl/set/aux_/iterator.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct begin_impl< aux::set_tag >\n{\n    template< typename Set > struct apply\n        : s_iter_get<Set,typename Set::item_>\n    {\n    };\n};\n\ntemplate<>\nstruct end_impl< aux::set_tag >\n{\n    template< typename Set > struct apply\n    {\n        typedef s_iter< Set,set0<> > type;\n    };\n};\n\n}}\n\n#endif // BOOST_MPL_SET_AUX_BEGIN_END_IMPL_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/set/aux_/clear_impl.hpp",
    "content": "\n#ifndef BOOST_MPL_SET_AUX_CLEAR_IMPL_HPP_INCLUDED\n#define BOOST_MPL_SET_AUX_CLEAR_IMPL_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2003-2004\n// Copyright David Abrahams 2003-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/clear_fwd.hpp>\n#include <boost/mpl/set/aux_/set0.hpp>\n#include <boost/mpl/set/aux_/tag.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct clear_impl< aux::set_tag >\n{\n    template< typename Set > struct apply\n    {\n        typedef set0<> type;\n    };\n};\n\n}}\n\n#endif // BOOST_MPL_SET_AUX_CLEAR_IMPL_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/set/aux_/empty_impl.hpp",
    "content": "\n#ifndef BOOST_MPL_SET_AUX_EMPTY_IMPL_HPP_INCLUDED\n#define BOOST_MPL_SET_AUX_EMPTY_IMPL_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2003-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/empty_fwd.hpp>\n#include <boost/mpl/not.hpp>\n#include <boost/mpl/set/aux_/tag.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct empty_impl< aux::set_tag >\n{\n    template< typename Set > struct apply\n        : not_< typename Set::size >\n    {\n    };\n};\n\n}}\n\n#endif // BOOST_MPL_SET_AUX_EMPTY_IMPL_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/set/aux_/erase_impl.hpp",
    "content": "\n#ifndef BOOST_MPL_SET_AUX_ERASE_IMPL_HPP_INCLUDED\n#define BOOST_MPL_SET_AUX_ERASE_IMPL_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2003-2004\n// Copyright David Abrahams 2003-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/erase_fwd.hpp>\n#include <boost/mpl/set/aux_/erase_key_impl.hpp>\n#include <boost/mpl/set/aux_/tag.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct erase_impl< aux::set_tag >\n{\n    template< \n          typename Set\n        , typename Pos\n        , typename unused_\n        > \n    struct apply\n        : erase_key_impl<aux::set_tag>\n            ::apply<Set,typename Pos::type>\n    {\n    };\n};\n\n}}\n\n#endif // BOOST_MPL_SET_AUX_ERASE_IMPL_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/set/aux_/erase_key_impl.hpp",
    "content": "\n#ifndef BOOST_MPL_SET_AUX_ERASE_KEY_IMPL_HPP_INCLUDED\n#define BOOST_MPL_SET_AUX_ERASE_KEY_IMPL_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2003-2007\n// Copyright David Abrahams 2003-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/erase_key_fwd.hpp>\n#include <boost/mpl/set/aux_/has_key_impl.hpp>\n#include <boost/mpl/set/aux_/item.hpp>\n#include <boost/mpl/set/aux_/tag.hpp>\n#include <boost/mpl/identity.hpp>\n#include <boost/mpl/base.hpp>\n#include <boost/mpl/eval_if.hpp>\n\n#include <boost/type_traits/is_same.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct erase_key_impl< aux::set_tag >\n{\n    template< \n          typename Set\n        , typename T\n        > \n    struct apply\n        : eval_if< \n              has_key_impl<aux::set_tag>::apply<Set,T>\n            , eval_if< \n                  is_same< T,typename Set::item_type_ > \n                , base<Set>\n                , identity< s_mask<T,typename Set::item_> >\n                >\n            , identity<Set>\n            >\n    {\n    };\n};\n\n}}\n\n#endif // BOOST_MPL_SET_AUX_ERASE_KEY_IMPL_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/set/aux_/has_key_impl.hpp",
    "content": "\n#ifndef BOOST_MPL_SET_AUX_HAS_KEY_IMPL_HPP_INCLUDED\n#define BOOST_MPL_SET_AUX_HAS_KEY_IMPL_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2003-2004\n// Copyright David Abrahams 2003-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/set/aux_/tag.hpp>\n#include <boost/mpl/has_key_fwd.hpp>\n#include <boost/mpl/bool.hpp>\n#include <boost/mpl/aux_/overload_names.hpp>\n#include <boost/mpl/aux_/static_cast.hpp>\n#include <boost/mpl/aux_/yes_no.hpp>\n#include <boost/mpl/aux_/type_wrapper.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n#include <boost/mpl/aux_/config/static_constant.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct has_key_impl< aux::set_tag >\n{\n    template< typename Set, typename T > struct apply\n#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1400)) \\\n    || BOOST_WORKAROUND(__EDG_VERSION__, <= 245)\n    {\n        BOOST_STATIC_CONSTANT(bool, value = \n              ( sizeof( BOOST_MPL_AUX_OVERLOAD_CALL_IS_MASKED(\n                    Set\n                  , BOOST_MPL_AUX_STATIC_CAST(aux::type_wrapper<T>*, 0)\n                  ) ) == sizeof(aux::no_tag) )\n            );\n\n        typedef bool_<value> type;\n\n#else // ISO98 C++\n        : bool_< \n              ( sizeof( BOOST_MPL_AUX_OVERLOAD_CALL_IS_MASKED(\n                    Set\n                  , BOOST_MPL_AUX_STATIC_CAST(aux::type_wrapper<T>*, 0)\n                  ) ) == sizeof(aux::no_tag) )\n            >\n    {\n#endif\n    };\n};\n\n}}\n\n#endif // BOOST_MPL_SET_AUX_HAS_KEY_IMPL_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/set/aux_/insert_impl.hpp",
    "content": "\n#ifndef BOOST_MPL_SET_AUX_INSERT_IMPL_HPP_INCLUDED\n#define BOOST_MPL_SET_AUX_INSERT_IMPL_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2003-2007\n// Copyright David Abrahams 2003-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/insert_fwd.hpp>\n#include <boost/mpl/set/aux_/has_key_impl.hpp>\n#include <boost/mpl/set/aux_/item.hpp>\n#include <boost/mpl/set/aux_/tag.hpp>\n#include <boost/mpl/identity.hpp>\n#include <boost/mpl/base.hpp>\n#include <boost/mpl/eval_if.hpp>\n#include <boost/mpl/aux_/na.hpp>\n\n#include <boost/type_traits/is_same.hpp>\n\nnamespace boost { namespace mpl {\n\nnamespace aux {\ntemplate<  typename Set, typename T > struct set_insert_impl\n    : eval_if< \n          has_key_impl<aux::set_tag>::apply<Set,T>\n        , identity<Set>\n        , eval_if< \n              is_same< T,typename Set::last_masked_ > \n            , base<Set>\n            , identity< s_item<T,typename Set::item_> >\n            >\n        >\n{\n};\n}\n\ntemplate<>\nstruct insert_impl< aux::set_tag >\n{\n    template< \n          typename Set\n        , typename PosOrKey\n        , typename KeyOrNA\n        > \n    struct apply\n        : aux::set_insert_impl<\n              Set\n            , typename if_na<KeyOrNA,PosOrKey>::type\n            >\n    {\n    };\n};\n\n}}\n\n#endif // BOOST_MPL_SET_AUX_INSERT_IMPL_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/set/aux_/insert_range_impl.hpp",
    "content": "\n#ifndef BOOST_MPL_SET_AUX_INSERT_RANGE_IMPL_HPP_INCLUDED\n#define BOOST_MPL_SET_AUX_INSERT_RANGE_IMPL_HPP_INCLUDED\n\n// Copyright Bruno Dutra 2015\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/insert_range_fwd.hpp>\n#include <boost/mpl/set/aux_/tag.hpp>\n#include <boost/mpl/placeholders.hpp>\n#include <boost/mpl/fold.hpp>\n#include <boost/mpl/insert.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct insert_range_impl< aux::set_tag >\n{\n    template<\n          typename Sequence\n        , typename /*Pos*/\n        , typename Range\n        >\n    struct apply\n        : fold<Range, Sequence, insert<_1, _2> >\n    {\n    };\n};\n\n}}\n\n#endif // BOOST_MPL_SET_AUX_INSERT_RANGE_IMPL_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/set/aux_/item.hpp",
    "content": "\n#ifndef BOOST_MPL_SET_AUX_ITEM_HPP_INCLUDED\n#define BOOST_MPL_SET_AUX_ITEM_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2003-2007\n// Copyright David Abrahams 2003-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/long.hpp>\n#include <boost/mpl/void.hpp>\n#include <boost/mpl/next.hpp>\n#include <boost/mpl/prior.hpp>\n#include <boost/mpl/set/aux_/set0.hpp>\n#include <boost/mpl/aux_/type_wrapper.hpp>\n#include <boost/mpl/aux_/config/arrays.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate< typename T, typename Base >\nstruct s_item\n    : Base\n{\n    typedef s_item<T,Base> item_;\n    typedef void_       last_masked_;\n    typedef T           item_type_;\n    typedef typename Base::item_ base;\n    typedef s_item type;\n    \n    typedef typename next< typename Base::size >::type  size;\n    typedef typename next< typename Base::order >::type order;\n\n#if defined(BOOST_MPL_CFG_NO_DEPENDENT_ARRAY_TYPES)\n    typedef typename aux::weighted_tag<BOOST_MPL_AUX_MSVC_VALUE_WKND(order)::value>::type order_tag_;\n#else\n    typedef char (&order_tag_)[BOOST_MPL_AUX_MSVC_VALUE_WKND(order)::value];\n#endif\n\n    BOOST_MPL_AUX_SET_OVERLOAD( order_tag_, ORDER_BY_KEY, s_item, aux::type_wrapper<T>* );\n    BOOST_MPL_AUX_SET_OVERLOAD( aux::no_tag, IS_MASKED, s_item, aux::type_wrapper<T>* );\n};\n\n\ntemplate< typename T, typename Base >\nstruct s_mask\n    : Base\n{\n    typedef s_mask<T,Base> item_;\n    typedef T       last_masked_;\n    typedef void_   item_type_;\n    typedef typename Base::item_ base;\n    typedef typename prior< typename Base::size >::type  size;\n    typedef s_mask type;\n\n    BOOST_MPL_AUX_SET_OVERLOAD( aux::yes_tag, IS_MASKED, s_mask, aux::type_wrapper<T>* );\n};\n\n\ntemplate< typename T, typename Base >\nstruct s_unmask\n    : Base\n{\n    typedef s_unmask<T,Base> item_;\n    typedef void_   last_masked_;\n    typedef T       item_type_;\n    typedef typename Base::item_ base;\n    typedef typename next< typename Base::size >::type  size;\n\n    BOOST_MPL_AUX_SET_OVERLOAD( aux::no_tag, IS_MASKED, s_unmask, aux::type_wrapper<T>* );\n};\n\n}}\n\n#endif // BOOST_MPL_SET_AUX_ITEM_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/set/aux_/iterator.hpp",
    "content": "\n#ifndef BOOST_MPL_SET_AUX_ITERATOR_HPP_INCLUDED\n#define BOOST_MPL_SET_AUX_ITERATOR_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2003-2007\n// Copyright David Abrahams 2003-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/set/aux_/set0.hpp>\n#include <boost/mpl/has_key.hpp>\n#include <boost/mpl/iterator_tags.hpp>\n#include <boost/mpl/next.hpp>\n#include <boost/mpl/eval_if.hpp>\n#include <boost/mpl/if.hpp>\n#include <boost/mpl/identity.hpp>\n#include <boost/mpl/aux_/config/ctps.hpp>\n\nnamespace boost { namespace mpl {\n\n// used by 's_iter_get'\ntemplate< typename Set, typename Tail > struct s_iter;\n\ntemplate< typename Set, typename Tail > struct s_iter_get\n    : eval_if< \n          has_key< Set,typename Tail::item_type_ >\n        , identity< s_iter<Set,Tail> >\n        , next< s_iter<Set,Tail> >\n        >\n{\n};\n\ntemplate< typename Set, typename Tail > struct s_iter_impl\n{\n    typedef Tail                        tail_;\n    typedef forward_iterator_tag        category;\n    typedef typename Tail::item_type_   type;\n\n#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)\n    typedef typename s_iter_get< Set,typename Tail::base >::type next;\n#endif\n};\n\n#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)\n\ntemplate< typename Set, typename Tail > \nstruct next< s_iter<Set,Tail> >\n    : s_iter_get< Set,typename Tail::base >\n{\n};\n\ntemplate< typename Set > \nstruct next< s_iter<Set,set0<> > >\n{\n    typedef s_iter<Set,set0<> > type;\n};\n\ntemplate< typename Set, typename Tail > struct s_iter\n    : s_iter_impl<Set,Tail>\n{\n};\n\ntemplate< typename Set > struct s_iter<Set, set0<> >\n{\n    typedef forward_iterator_tag category;\n};\n\n#else\n\ntemplate< typename Set >\nstruct s_end_iter\n{\n    typedef forward_iterator_tag    category;\n    typedef s_iter<Set,set0<> >     next;\n};\n\ntemplate< typename Set, typename Tail > struct s_iter\n    : if_< \n          is_same< Tail,set0<> >\n        , s_end_iter<Set>\n        , s_iter_impl<Set,Tail>\n        >::type\n{\n};\n\n#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION\n\n}}\n\n#endif // BOOST_MPL_SET_AUX_ITERATOR_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/set/aux_/key_type_impl.hpp",
    "content": "\n#ifndef BOOST_MPL_SET_AUX_KEY_TYPE_IMPL_HPP_INCLUDED\n#define BOOST_MPL_SET_AUX_KEY_TYPE_IMPL_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2003-2004\n// Copyright David Abrahams 2003-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/key_type_fwd.hpp>\n#include <boost/mpl/set/aux_/tag.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct key_type_impl< aux::set_tag >\n{\n    template< typename Set, typename T > struct apply\n    {\n        typedef T type;\n    };\n};\n\n}}\n\n#endif // BOOST_MPL_SET_AUX_KEY_TYPE_IMPL_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/set/aux_/set0.hpp",
    "content": "\n#ifndef BOOST_MPL_SET_AUX_SET0_HPP_INCLUDED\n#define BOOST_MPL_SET_AUX_SET0_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2003-2004\n// Copyright David Abrahams 2003-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/long.hpp>\n#include <boost/mpl/void.hpp>\n#include <boost/mpl/aux_/na.hpp>\n#include <boost/mpl/set/aux_/tag.hpp>\n#include <boost/mpl/aux_/yes_no.hpp>\n#include <boost/mpl/aux_/overload_names.hpp>\n#include <boost/mpl/aux_/config/operators.hpp>\n\n#include <boost/preprocessor/cat.hpp>\n\nnamespace boost { namespace mpl {\n\n#if defined(BOOST_MPL_CFG_USE_OPERATORS_OVERLOADING)\n\n#   define BOOST_MPL_AUX_SET0_OVERLOAD(R, f, X, T) \\\n    friend R BOOST_PP_CAT(BOOST_MPL_AUX_OVERLOAD_,f)(X const&, T) \\\n/**/\n\n#   define BOOST_MPL_AUX_SET_OVERLOAD(R, f, X, T) \\\n    BOOST_MPL_AUX_SET0_OVERLOAD(R, f, X, T) \\\n/**/\n\n#else\n\n#   define BOOST_MPL_AUX_SET0_OVERLOAD(R, f, X, T) \\\n    static R BOOST_PP_CAT(BOOST_MPL_AUX_OVERLOAD_,f)(X const&, T) \\\n/**/\n\n#   define BOOST_MPL_AUX_SET_OVERLOAD(R, f, X, T) \\\n    BOOST_MPL_AUX_SET0_OVERLOAD(R, f, X, T); \\\n    using Base::BOOST_PP_CAT(BOOST_MPL_AUX_OVERLOAD_,f) \\\n/**/\n\n#endif\n\ntemplate< typename Dummy = na > struct set0\n{\n    typedef set0<>          item_;\n    typedef item_           type;\n    typedef aux::set_tag    tag;\n    typedef void_           last_masked_;\n    typedef void_           item_type_;\n    typedef long_<0>        size;\n    typedef long_<1>        order;\n\n    BOOST_MPL_AUX_SET0_OVERLOAD( aux::no_tag, ORDER_BY_KEY, set0<>, void const volatile* );\n    BOOST_MPL_AUX_SET0_OVERLOAD( aux::yes_tag, IS_MASKED, set0<>, void const volatile* );\n};\n\n}}\n\n#endif // BOOST_MPL_SET_AUX_SET0_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/set/aux_/size_impl.hpp",
    "content": "\n#ifndef BOOST_MPL_SET_AUX_SIZE_IMPL_HPP_INCLUDED\n#define BOOST_MPL_SET_AUX_SIZE_IMPL_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2003-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/size_fwd.hpp>\n#include <boost/mpl/set/aux_/tag.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct size_impl< aux::set_tag >\n{\n    template< typename Set > struct apply\n        : Set::size\n    {\n    };\n};\n\n}}\n\n#endif // BOOST_MPL_SET_AUX_SIZE_IMPL_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/set/aux_/tag.hpp",
    "content": "\n#ifndef BOOST_MPL_SET_AUX_TAG_HPP_INCLUDED\n#define BOOST_MPL_SET_AUX_TAG_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2003-2004\n// Copyright David Abrahams 2003-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\nnamespace boost { namespace mpl { namespace aux {\n\nstruct set_tag;\n\n}}}\n\n#endif // BOOST_MPL_SET_AUX_TAG_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/set/aux_/value_type_impl.hpp",
    "content": "\n#ifndef BOOST_MPL_SET_AUX_VALUE_TYPE_IMPL_HPP_INCLUDED\n#define BOOST_MPL_SET_AUX_VALUE_TYPE_IMPL_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2003-2004\n// Copyright David Abrahams 2003-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/value_type_fwd.hpp>\n#include <boost/mpl/set/aux_/tag.hpp>\n\nnamespace boost { namespace mpl {\n\ntemplate<>\nstruct value_type_impl< aux::set_tag >\n{\n    template< typename Set, typename T > struct apply\n    {\n        typedef T type;\n    };\n};\n\n}}\n\n#endif // BOOST_MPL_SET_AUX_VALUE_TYPE_IMPL_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/set/set0.hpp",
    "content": "\n#ifndef BOOST_MPL_SET_SET0_HPP_INCLUDED\n#define BOOST_MPL_SET_SET0_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2003-2004\n// Copyright David Abrahams 2003-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/set/aux_/at_impl.hpp>\n#include <boost/mpl/set/aux_/clear_impl.hpp>\n//#include <boost/mpl/set/aux_/O1_size.hpp>\n#include <boost/mpl/set/aux_/size_impl.hpp>\n#include <boost/mpl/set/aux_/empty_impl.hpp>\n#include <boost/mpl/set/aux_/insert_impl.hpp>\n#include <boost/mpl/set/aux_/insert_range_impl.hpp>\n#include <boost/mpl/set/aux_/erase_impl.hpp>\n#include <boost/mpl/set/aux_/erase_key_impl.hpp>\n#include <boost/mpl/set/aux_/has_key_impl.hpp>\n#include <boost/mpl/set/aux_/key_type_impl.hpp>\n#include <boost/mpl/set/aux_/value_type_impl.hpp>\n#include <boost/mpl/set/aux_/begin_end_impl.hpp>\n#include <boost/mpl/set/aux_/iterator.hpp>\n#include <boost/mpl/set/aux_/item.hpp>\n#include <boost/mpl/set/aux_/set0.hpp>\n#include <boost/mpl/set/aux_/tag.hpp>\n\n#endif // BOOST_MPL_SET_SET0_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/size_fwd.hpp",
    "content": "\n#ifndef BOOST_MPL_SIZE_FWD_HPP_INCLUDED\n#define BOOST_MPL_SIZE_FWD_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\nnamespace boost { namespace mpl {\n\ntemplate< typename Tag > struct size_impl;\ntemplate< typename Sequence > struct size;\n\n}}\n\n#endif // BOOST_MPL_SIZE_FWD_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/size_t.hpp",
    "content": "\n#ifndef BOOST_MPL_SIZE_T_HPP_INCLUDED\n#define BOOST_MPL_SIZE_T_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/size_t_fwd.hpp>\n\n#define AUX_WRAPPER_VALUE_TYPE std::size_t\n#define AUX_WRAPPER_NAME size_t\n#define AUX_WRAPPER_PARAMS(N) std::size_t N\n\n#include <boost/mpl/aux_/integral_wrapper.hpp>\n\n#endif // BOOST_MPL_SIZE_T_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/size_t_fwd.hpp",
    "content": "\n#ifndef BOOST_MPL_SIZE_T_FWD_HPP_INCLUDED\n#define BOOST_MPL_SIZE_T_FWD_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2000-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/adl_barrier.hpp>\n#include <boost/config.hpp> // make sure 'size_t' is placed into 'std'\n#include <cstddef>\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\n\ntemplate< std::size_t N > struct size_t;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nBOOST_MPL_AUX_ADL_BARRIER_DECL(size_t)\n\n#endif // BOOST_MPL_SIZE_T_FWD_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/value_type_fwd.hpp",
    "content": "\n#ifndef BOOST_MPL_VALUE_TYPE_FWD_HPP_INCLUDED\n#define BOOST_MPL_VALUE_TYPE_FWD_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2003-2004\n// Copyright David Abrahams 2003-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\nnamespace boost { namespace mpl {\n\ntemplate< typename Tag > struct value_type_impl;\ntemplate< typename AssociativeSequence, typename T > struct value_type;\n\n}}\n\n#endif // BOOST_MPL_VALUE_TYPE_FWD_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/void.hpp",
    "content": "\n#ifndef BOOST_MPL_VOID_HPP_INCLUDED\n#define BOOST_MPL_VOID_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/void_fwd.hpp>\n#include <boost/mpl/bool.hpp>\n#include <boost/mpl/aux_/na_spec.hpp>\n#include <boost/mpl/aux_/config/msvc.hpp>\n#include <boost/mpl/aux_/config/workaround.hpp>\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\n\n//  [JDG Feb-4-2003] made void_ a complete type to allow it to be\n//  instantiated so that it can be passed in as an object that can be\n//  used to select an overloaded function. Possible use includes signaling\n//  a zero arity functor evaluation call.\nstruct void_ { typedef void_ type; };\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\n\nnamespace boost { namespace mpl {\n\ntemplate< typename T >\nstruct is_void_\n    : false_\n{\n#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)\n    using false_::value;\n#endif\n};\n\ntemplate<>\nstruct is_void_<void_>\n    : true_\n{\n#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)\n    using true_::value;\n#endif\n};\n\ntemplate< typename T >\nstruct is_not_void_\n    : true_\n{\n#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)\n    using true_::value;\n#endif\n};\n\ntemplate<>\nstruct is_not_void_<void_>\n    : false_\n{\n#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)\n    using false_::value;\n#endif\n};\n\nBOOST_MPL_AUX_NA_SPEC(1, is_void_)\nBOOST_MPL_AUX_NA_SPEC(1, is_not_void_)\n\n}}\n\n#endif // BOOST_MPL_VOID_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/mpl/void_fwd.hpp",
    "content": "\n#ifndef BOOST_MPL_VOID_FWD_HPP_INCLUDED\n#define BOOST_MPL_VOID_FWD_HPP_INCLUDED\n\n// Copyright Aleksey Gurtovoy 2001-2004\n//\n// Distributed under the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n//\n// See http://www.boost.org/libs/mpl for documentation.\n\n// $Id$\n// $Date$\n// $Revision$\n\n#include <boost/mpl/aux_/adl_barrier.hpp>\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN\n\nstruct void_;\n\nBOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE\nBOOST_MPL_AUX_ADL_BARRIER_DECL(void_)\n\n#endif // BOOST_MPL_VOID_FWD_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/noncopyable.hpp",
    "content": "/*\n * Copyright (c) 2014 Glen Fernandes\n *\n * Distributed under the Boost Software License, Version 1.0. (See\n * accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n */\n\n#ifndef BOOST_NONCOPYABLE_HPP\n#define BOOST_NONCOPYABLE_HPP\n\n// The header file at this path is deprecated;\n// use boost/core/noncopyable.hpp instead.\n\n#include <boost/core/noncopyable.hpp>\n\n#endif\n"
  },
  {
    "path": "benchmarks/boost/parameter/aux_/arg_list.hpp",
    "content": "// Copyright Daniel Wallin, David Abrahams 2005. Use, modification and\n// distribution is subject to the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef ARG_LIST_050329_HPP\n#define ARG_LIST_050329_HPP\n\n#include <boost/parameter/aux_/void.hpp>\n#include <boost/parameter/aux_/result_of0.hpp>\n#include <boost/parameter/aux_/default.hpp>\n#include <boost/parameter/aux_/parameter_requirements.hpp>\n#include <boost/parameter/aux_/yesno.hpp>\n#include <boost/parameter/aux_/is_maybe.hpp>\n#include <boost/parameter/config.hpp>\n\n#include <boost/mpl/apply.hpp>\n#include <boost/mpl/assert.hpp>\n#include <boost/mpl/begin.hpp>\n#include <boost/mpl/end.hpp>\n#include <boost/mpl/iterator_tags.hpp>\n\n#include <boost/type_traits/add_reference.hpp>\n#include <boost/type_traits/is_same.hpp>\n#include <boost/preprocessor/repetition/enum_params.hpp>\n#include <boost/preprocessor/repetition/enum_binary_params.hpp>\n#include <boost/preprocessor/facilities/intercept.hpp>\n\nnamespace boost { namespace parameter {\n\n// Forward declaration for aux::arg_list, below.\ntemplate<class T> struct keyword;\n\nnamespace aux {\n\n// Tag type passed to MPL lambda.\nstruct lambda_tag;\n\n//\n// Structures used to build the tuple of actual arguments.  The\n// tuple is a nested cons-style list of arg_list specializations\n// terminated by an empty_arg_list.\n//\n// Each specialization of arg_list is derived from its successor in\n// the list type.  This feature is used along with using\n// declarations to build member function overload sets that can\n// match against keywords.\n//\n\n// MPL sequence support\nstruct arg_list_tag;\n\n// Terminates arg_list<> and represents an empty list.  Since this\n// is just the terminating case you might want to look at arg_list\n// first, to get a feel for what's really happening here.\n\nstruct empty_arg_list\n{\n    empty_arg_list() {}\n\n    // Constructor taking BOOST_PARAMETER_MAX_ARITY empty_arg_list\n    // arguments; this makes initialization\n    empty_arg_list(\n        BOOST_PP_ENUM_PARAMS(\n            BOOST_PARAMETER_MAX_ARITY, void_ BOOST_PP_INTERCEPT\n        ))\n    {}\n\n    // A metafunction class that, given a keyword and a default\n    // type, returns the appropriate result type for a keyword\n    // lookup given that default\n    struct binding\n    {\n        template<class KW, class Default, class Reference>\n        struct apply\n        {\n            typedef Default type;\n        };\n    };\n\n    // Terminator for has_key, indicating that the keyword is unique\n    template <class KW>\n    static no_tag has_key(KW*);\n\n#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))\n\n    // The overload set technique doesn't work with these older\n    // compilers, so they need some explicit handholding.\n\n    // A metafunction class that, given a keyword, returns the type\n    // of the base sublist whose get() function can produce the\n    // value for that key\n    struct key_owner\n    {\n        template<class KW>\n        struct apply\n        {\n            typedef empty_arg_list type;\n        };\n    };\n\n    template <class K, class T>\n    T& get(default_<K,T> x) const\n    {\n        return x.value;\n    }\n\n    template <class K, class F>\n    typename result_of0<F>::type\n    get(lazy_default<K,F> x) const\n    {\n        return x.compute_default();\n    }\n#endif\n\n    // If this function is called, it means there is no argument\n    // in the list that matches the supplied keyword. Just return\n    // the default value.\n    template <class K, class Default>\n    Default& operator[](default_<K, Default> x) const\n    {\n        return x.value;\n    }\n\n    // If this function is called, it means there is no argument\n    // in the list that matches the supplied keyword. Just evaluate\n    // and return the default value.\n    template <class K, class F>\n    typename result_of0<F>::type\n    operator[](\n        BOOST_PARAMETER_lazy_default_fallback<K,F> x) const\n    {\n        return x.compute_default();\n    }\n\n    // No argument corresponding to ParameterRequirements::key_type\n    // was found if we match this overload, so unless that parameter\n    // has a default, we indicate that the actual arguments don't\n    // match the function's requirements.\n    template <class ParameterRequirements, class ArgPack>\n    static typename ParameterRequirements::has_default\n    satisfies(ParameterRequirements*, ArgPack*);\n\n    // MPL sequence support\n    typedef empty_arg_list type;   // convenience\n    typedef arg_list_tag tag; // For dispatching to sequence intrinsics\n};\n\n// Forward declaration for arg_list::operator,\ntemplate <class KW, class T>\nstruct tagged_argument;\n\ntemplate <class T>\nstruct get_reference\n{\n    typedef typename T::reference type;\n};\n\n// A tuple of tagged arguments, terminated with empty_arg_list.\n// Every TaggedArg is an instance of tagged_argument<>.\ntemplate <class TaggedArg, class Next = empty_arg_list>\nstruct arg_list : Next\n{\n    typedef arg_list<TaggedArg,Next> self;\n    typedef typename TaggedArg::key_type key_type;\n\n    typedef typename is_maybe<typename TaggedArg::value_type>::type holds_maybe;\n\n    typedef typename mpl::eval_if<\n        holds_maybe\n      , get_reference<typename TaggedArg::value_type>\n      , get_reference<TaggedArg>\n    >::type reference;\n\n    typedef typename mpl::if_<\n        holds_maybe\n      , reference\n      , typename TaggedArg::value_type\n    >::type value_type;\n\n    TaggedArg arg;      // Stores the argument\n\n    // Store the arguments in successive nodes of this list\n    template< // class A0, class A1, ...\n        BOOST_PP_ENUM_PARAMS(BOOST_PARAMETER_MAX_ARITY, class A)\n    >\n    arg_list( // A0& a0, A1& a1, ...\n        BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PARAMETER_MAX_ARITY, A, & a)\n    )\n      : Next( // a1, a2, ...\n            BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PARAMETER_MAX_ARITY, a)\n          , void_reference()\n        )\n      , arg(a0)\n    {}\n\n    // Create a new list by prepending arg to a copy of tail.  Used\n    // when incrementally building this structure with the comma\n    // operator.\n    arg_list(TaggedArg head, Next const& tail)\n      : Next(tail)\n      , arg(head)\n    {}\n\n    // A metafunction class that, given a keyword and a default\n    // type, returns the appropriate result type for a keyword\n    // lookup given that default\n    struct binding\n    {\n        template <class KW, class Default, class Reference>\n        struct apply\n        {\n          typedef typename mpl::eval_if<\n                boost::is_same<KW, key_type>\n              , mpl::if_<Reference, reference, value_type>\n              , mpl::apply_wrap3<typename Next::binding, KW, Default, Reference>\n          >::type type;\n        };\n    };\n\n#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))\n    // Overload for key_type, so the assert below will fire if the\n    // same keyword is used again\n    static yes_tag has_key(key_type*);\n    using Next::has_key;\n\n    BOOST_MPL_ASSERT_MSG(\n        sizeof(Next::has_key((key_type*)0)) == sizeof(no_tag)\n      , duplicate_keyword, (key_type)\n    );\n\n#endif\n    //\n    // Begin implementation of indexing operators for looking up\n    // specific arguments by name\n    //\n\n    // Helpers that handle the case when TaggedArg is\n    // empty<T>.\n    template <class D>\n    reference get_default(D const&, mpl::false_) const\n    {\n        return arg.value;\n    }\n\n    template <class D>\n    reference get_default(D const& d, mpl::true_) const\n    {\n        return arg.value ? arg.value.get() : arg.value.construct(d.value);\n    }\n\n#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))\n    // These older compilers don't support the overload set creation\n    // idiom well, so we need to do all the return type calculation\n    // for the compiler and dispatch through an outer function template\n\n    // A metafunction class that, given a keyword, returns the base\n    // sublist whose get() function can produce the value for that\n    // key.\n    struct key_owner\n    {\n        template<class KW>\n        struct apply\n        {\n          typedef typename mpl::eval_if<\n                boost::is_same<KW, key_type>\n              , mpl::identity<arg_list<TaggedArg,Next> >\n              , mpl::apply_wrap1<typename Next::key_owner,KW>\n          >::type type;\n        };\n    };\n\n    // Outer indexing operators that dispatch to the right node's\n    // get() function.\n    template <class KW>\n    typename mpl::apply_wrap3<binding, KW, void_, mpl::true_>::type\n    operator[](keyword<KW> const& x) const\n    {\n        typename mpl::apply_wrap1<key_owner, KW>::type const& sublist = *this;\n        return sublist.get(x);\n    }\n\n    template <class KW, class Default>\n    typename mpl::apply_wrap3<binding, KW, Default&, mpl::true_>::type\n    operator[](default_<KW, Default> x) const\n    {\n        typename mpl::apply_wrap1<key_owner, KW>::type const& sublist = *this;\n        return sublist.get(x);\n    }\n\n    template <class KW, class F>\n    typename mpl::apply_wrap3<\n        binding,KW\n      , typename result_of0<F>::type\n      , mpl::true_\n    >::type\n    operator[](lazy_default<KW,F> x) const\n    {\n        typename mpl::apply_wrap1<key_owner, KW>::type const& sublist = *this;\n        return sublist.get(x);\n    }\n\n    // These just return the stored value; when empty_arg_list is\n    // reached, indicating no matching argument was passed, the\n    // default is returned, or if no default_ or lazy_default was\n    // passed, compilation fails.\n    reference get(keyword<key_type> const&) const\n    {\n        BOOST_MPL_ASSERT_NOT((holds_maybe));\n        return arg.value;\n    }\n\n    template <class Default>\n    reference get(default_<key_type,Default> const& d) const\n    {\n        return get_default(d, holds_maybe());\n    }\n\n    template <class Default>\n    reference get(lazy_default<key_type, Default>) const\n    {\n        return arg.value;\n    }\n\n#else\n\n    reference operator[](keyword<key_type> const&) const\n    {\n        BOOST_MPL_ASSERT_NOT((holds_maybe));\n        return arg.value;\n    }\n\n    template <class Default>\n    reference operator[](default_<key_type, Default> const& d) const\n    {\n        return get_default(d, holds_maybe());\n    }\n\n    template <class Default>\n    reference operator[](lazy_default<key_type, Default>) const\n    {\n        return arg.value;\n    }\n\n    // Builds an overload set including operator[]s defined in base\n    // classes.\n    using Next::operator[];\n\n    //\n    // End of indexing support\n    //\n\n\n    //\n    // For parameter_requirements matching this node's key_type,\n    // return a bool constant wrapper indicating whether the\n    // requirements are satisfied by TaggedArg.  Used only for\n    // compile-time computation and never really called, so a\n    // declaration is enough.\n    //\n    template <class HasDefault, class Predicate, class ArgPack>\n    static typename mpl::apply_wrap2<\n        typename mpl::lambda<Predicate, lambda_tag>::type\n      , value_type, ArgPack\n    >::type\n    satisfies(\n        parameter_requirements<key_type,Predicate,HasDefault>*\n      , ArgPack*\n    );\n\n    // Builds an overload set including satisfies functions defined\n    // in base classes.\n    using Next::satisfies;\n#endif\n\n    // Comma operator to compose argument list without using parameters<>.\n    // Useful for argument lists with undetermined length.\n    template <class KW, class T2>\n    arg_list<tagged_argument<KW, T2>, self>\n    operator,(tagged_argument<KW,T2> x) const\n    {\n        return arg_list<tagged_argument<KW,T2>, self>(x, *this);\n    }\n\n    // MPL sequence support\n    typedef self type;             // Convenience for users\n    typedef Next tail_type;        // For the benefit of iterators\n    typedef arg_list_tag tag; // For dispatching to sequence intrinsics\n};\n\n// MPL sequence support\ntemplate <class ArgumentPack>\nstruct arg_list_iterator\n{\n    typedef mpl::forward_iterator_tag category;\n\n    // The incremented iterator\n    typedef arg_list_iterator<typename ArgumentPack::tail_type> next;\n\n    // dereferencing yields the key type\n    typedef typename ArgumentPack::key_type type;\n};\n\ntemplate <>\nstruct arg_list_iterator<empty_arg_list> {};\n\n}} // namespace parameter::aux\n\n// MPL sequence support\nnamespace mpl\n{\n  template <>\n  struct begin_impl<parameter::aux::arg_list_tag>\n  {\n      template <class S>\n      struct apply\n      {\n          typedef parameter::aux::arg_list_iterator<S> type;\n      };\n  };\n\n  template <>\n  struct end_impl<parameter::aux::arg_list_tag>\n  {\n      template <class>\n      struct apply\n      {\n          typedef parameter::aux::arg_list_iterator<parameter::aux::empty_arg_list> type;\n      };\n  };\n}\n\n} // namespace boost\n\n#endif // ARG_LIST_050329_HPP\n\n"
  },
  {
    "path": "benchmarks/boost/parameter/aux_/cast.hpp",
    "content": "// Copyright Daniel Wallin 2006. Use, modification and distribution is\n// subject to the Boost Software License, Version 1.0. (See accompanying\n// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_PARAMETER_CAST_060902_HPP\n# define BOOST_PARAMETER_CAST_060902_HPP\n\n# include <boost/detail/workaround.hpp>\n\n# if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))\n#  include <boost/type_traits/add_reference.hpp>\n#  include <boost/type_traits/remove_const.hpp>\n# endif\n\nnamespace boost { namespace parameter { namespace aux {\n\nstruct use_default_tag {};\n\n# if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))\n\n#  define BOOST_PARAMETER_FUNCTION_CAST(value, predicate) value\n\n# else\n\n// Handles possible implicit casts. Used by preprocessor.hpp to\n// normalize user input.\n//\n// cast<void*>::execute() is identity\n// cast<void*(X)>::execute() is identity\n// cast<void(X)>::execute() casts to X\n//\n// preprocessor.hpp uses this like this:\n//\n//   #define X(value, predicate)\n//      cast<void predicate>::execute(value)\n//\n//   X(something, *)\n//   X(something, *(predicate))\n//   X(something, (int))\n\ntemplate <class T, class Args>\nstruct cast;\n\ntemplate <class Args>\nstruct cast<void*, Args>\n{\n    static use_default_tag execute(use_default_tag)\n    {\n        return use_default_tag();\n    }\n\n    static use_default_tag remove_const(use_default_tag)\n    {\n        return use_default_tag();\n    }\n\n    template <class U>\n    static U& execute(U& value)\n    {\n        return value;\n    }\n\n    template <class U>\n    static U& remove_const(U& x)\n    {\n        return x;\n    }\n};\n\n#if BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x580))\n\ntypedef void* voidstar;\n\ntemplate <class T, class Args>\nstruct cast<voidstar(T), Args>\n  : cast<void*, Args>\n{\n};\n\n#else\n\ntemplate <class T, class Args>\nstruct cast<void*(T), Args>\n  : cast<void*, Args>\n{\n};\n\n#endif\n\n// This is a hack used in cast<> to turn the user supplied type,\n// which may or may not be a placeholder expression into one, so\n// that it will be properly evaluated by mpl::apply.\ntemplate <class T, class Dummy = mpl::_1>\nstruct as_placeholder_expr\n{\n    typedef T type;\n};\n\ntemplate <class T, class Args>\nstruct cast<void(T), Args>\n{\n    typedef typename mpl::apply2<\n        as_placeholder_expr<T>, Args, Args>::type type0;\n\n    typedef typename boost::add_reference<\n        typename boost::remove_const<type0>::type \n    >::type reference;\n\n    static use_default_tag execute(use_default_tag)\n    {\n        return use_default_tag();\n    }\n\n    static use_default_tag remove_const(use_default_tag)\n    {\n        return use_default_tag();\n    }\n\n    static type0 execute(type0 value)\n    {\n        return value;\n    }\n\n    template <class U>\n    static reference remove_const(U const& x)\n    {\n        return const_cast<reference>(x);\n    }\n};\n\n#  define BOOST_PARAMETER_FUNCTION_CAST(value, predicate, args) \\\n    boost::parameter::aux::cast<void predicate, args>::remove_const( \\\n        boost::parameter::aux::cast<void predicate, args>::execute(value) \\\n    )\n\n# endif\n\n}}} // namespace boost::parameter::aux\n\n#endif // BOOST_PARAMETER_CAST_060902_HPP\n\n"
  },
  {
    "path": "benchmarks/boost/parameter/aux_/default.hpp",
    "content": "// Copyright Daniel Wallin, David Abrahams 2005. Use, modification and\n// distribution is subject to the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef DEFAULT_050329_HPP\n# define DEFAULT_050329_HPP\n\n# include <boost/detail/workaround.hpp>\n\nnamespace boost { namespace parameter { namespace aux {\n\n// A wrapper for the default value passed by the user when resolving\n// the value of the parameter with the given Keyword\ntemplate <class Keyword, class Value>\nstruct default_\n{\n    default_(Value& x)\n      : value(x)\n    {}\n\n    Value& value;\n};\n\n//\n// lazy_default -- \n//\n//    A wrapper for the default value computation function passed by\n//    the user when resolving the value of the parameter with the\n//    given keyword\n//\n# if BOOST_WORKAROUND(__EDG_VERSION__, <= 300)\n// These compilers need a little extra help with overload\n// resolution; we have empty_arg_list's operator[] accept a base\n// class to make that overload less preferable.\ntemplate <class KW, class DefaultComputer>\nstruct lazy_default_base\n{\n    lazy_default_base(DefaultComputer const& x)\n      : compute_default(x)\n    {}\n    DefaultComputer const& compute_default;\n};\n\ntemplate <class KW, class DefaultComputer>\nstruct lazy_default\n  : lazy_default_base<KW,DefaultComputer>\n  {\n      lazy_default(DefaultComputer const & x)\n        : lazy_default_base<KW,DefaultComputer>(x)\n      {}\n  };\n#  define BOOST_PARAMETER_lazy_default_fallback lazy_default_base\n# else \ntemplate <class KW, class DefaultComputer>\nstruct lazy_default\n{\n    lazy_default(const DefaultComputer& x)\n      : compute_default(x)\n    {}\n    DefaultComputer const& compute_default;\n};\n#  define BOOST_PARAMETER_lazy_default_fallback lazy_default\n# endif \n\n}}} // namespace boost::parameter::aux\n\n#endif // DEFAULT_050329_HPP\n\n"
  },
  {
    "path": "benchmarks/boost/parameter/aux_/is_maybe.hpp",
    "content": "// Copyright Daniel Wallin, David Abrahams 2010. Use, modification and\n// distribution is subject to the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_PARAMETER_IS_MAYBE_050329_HPP\n#define BOOST_PARAMETER_IS_MAYBE_050329_HPP\n\n#include <boost/type_traits/is_base_and_derived.hpp>\n\nnamespace boost {\nnamespace parameter {\nnamespace aux {\n\nstruct maybe_base {};\n\ntemplate <class T>\nstruct is_maybe\n  : is_base_and_derived<maybe_base, T>\n{};\n\n} // namespace aux\n} // namespace parameter\n} // namespace boost\n\n#endif // BOOST_PARAMETER_IS_MAYBE_050329_HPP\n"
  },
  {
    "path": "benchmarks/boost/parameter/aux_/overloads.hpp",
    "content": "// Copyright David Abrahams, Daniel Wallin 2003. Use, modification and \n// distribution is subject to the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n\n// This file generates overloads in this format:\n//\n//     template<class A0, class A1>\n//     typename mpl::apply_wrap1<\n//         aux::make_arg_list<\n//             PS0,A0\n//           , aux::make_arg_list<\n//                 PS1,A1\n//               , mpl::identity<aux::empty_arg_list>\n//             >\n//         >\n//      , unnamed_list\n//     >::type\n//     operator()(A0 const& a0, A1 const& a1) const\n//     {\n//         typedef typename mpl::apply_wrap1<\n//             aux::make_arg_list<\n//                 PS0,A0\n//               , aux::make_arg_list<\n//                     PS1,A1\n//                   , mpl::identity<aux::empty_arg_list>\n//                 >\n//             >\n//         >::type arg_tuple;\n//\n//         return arg_tuple(\n//             a0\n//           , a1\n//           , aux::void_()\n//             ...\n//         );\n//     }\n//\n\n#if !defined(BOOST_PP_IS_ITERATING)\n# error Boost.Parameters - do not include this file!\n#endif\n\n#define N BOOST_PP_ITERATION()\n\n#define BOOST_PARAMETER_open_list(z, n, text) \\\n    aux::item< \\\n        BOOST_PP_CAT(PS, n), BOOST_PP_CAT(A, n)\n\n#define BOOST_PARAMETER_close_list(z, n, text) > \n\n#define BOOST_PARAMETER_arg_list(n) \\\n    aux::make_arg_list< \\\n        BOOST_PP_ENUM(N, BOOST_PARAMETER_open_list, _) \\\n      , void_ \\\n        BOOST_PP_REPEAT(N, BOOST_PARAMETER_close_list, _) \\\n      , deduced_list \\\n      , aux::tag_keyword_arg \\\n    >\n\n#define BOOST_PARAMETER_arg_pack_init(z, n, limit) \\\n    BOOST_PP_CAT(a, BOOST_PP_SUB(limit,n))\n\ntemplate<BOOST_PP_ENUM_PARAMS(N, class A)>\ntypename mpl::first<\n    typename BOOST_PARAMETER_arg_list(N)::type\n>::type\noperator()(BOOST_PP_ENUM_BINARY_PARAMS(N, A, & a)) const\n{\n    typedef typename BOOST_PARAMETER_arg_list(N)::type result;\n\n    typedef typename mpl::first<result>::type result_type;\n    typedef typename mpl::second<result>::type error;\n    error();\n\n    return result_type(\n        BOOST_PP_ENUM(N, BOOST_PARAMETER_arg_pack_init, BOOST_PP_DEC(N))\n        BOOST_PP_ENUM_TRAILING_PARAMS(\n            BOOST_PP_SUB(BOOST_PARAMETER_MAX_ARITY, N)\n          , aux::void_reference() BOOST_PP_INTERCEPT\n        ));\n}\n\n#undef BOOST_PARAMETER_arg_list\n#undef BOOST_PARAMETER_open_list\n#undef BOOST_PARAMETER_close_list\n#undef N\n\n"
  },
  {
    "path": "benchmarks/boost/parameter/aux_/parameter_requirements.hpp",
    "content": "// Copyright Daniel Wallin, David Abrahams 2005. Use, modification and\n// distribution is subject to the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef PARAMETER_REQUIREMENTS_050331_HPP\n#define PARAMETER_REQUIREMENTS_050331_HPP\n\nnamespace boost { namespace parameter { namespace aux {\n\n// Used to pass static information about parameter requirements\n// through the satisfies() overload set (below).  The\n// matched function is never invoked, but its type indicates whether\n// a parameter matches at compile-time\ntemplate <class Keyword, class Predicate, class HasDefault>\nstruct parameter_requirements\n{\n    typedef Keyword keyword;\n    typedef Predicate predicate;\n    typedef HasDefault has_default;\n};\n\n}}} // namespace boost::parameter::aux\n\n#endif // PARAMETER_REQUIREMENTS_050331_HPP\n"
  },
  {
    "path": "benchmarks/boost/parameter/aux_/parenthesized_type.hpp",
    "content": "// Copyright David Abrahams 2006. Distributed under the Boost\n// Software License, Version 1.0. (See accompanying\n// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n#ifndef BOOST_PARAMETER_AUX_PARENTHESIZED_TYPE_DWA2006414_HPP\n# define BOOST_PARAMETER_AUX_PARENTHESIZED_TYPE_DWA2006414_HPP\n\n# include <boost/config.hpp>\n# include <boost/detail/workaround.hpp>\n\nnamespace boost { namespace parameter { namespace aux { \n\n// A macro that takes a parenthesized C++ type name (T) and transforms\n// it into an un-parenthesized type expression equivalent to T.\n#  define BOOST_PARAMETER_PARENTHESIZED_TYPE(x)                    \\\n    boost::parameter::aux::unaryfunptr_arg_type< void(*)x >::type\n\n// A metafunction that transforms void(*)(T) -> T\ntemplate <class UnaryFunctionPointer>\nstruct unaryfunptr_arg_type;\n\ntemplate <class Arg>\nstruct unaryfunptr_arg_type<void(*)(Arg)>\n{\n    typedef Arg type;\n};\n\ntemplate <>\nstruct unaryfunptr_arg_type<void(*)(void)>\n{\n    typedef void type;\n};\n    \n}}} // namespace boost::parameter::aux\n\n#endif // BOOST_PARAMETER_AUX_PARENTHESIZED_TYPE_DWA2006414_HPP\n"
  },
  {
    "path": "benchmarks/boost/parameter/aux_/preprocessor/flatten.hpp",
    "content": "// Copyright Daniel Wallin 2005. Use, modification and distribution is\n// subject to the Boost Software License, Version 1.0. (See accompanying\n// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_PARAMETER_FLATTEN_051217_HPP\n# define BOOST_PARAMETER_FLATTEN_051217_HPP\n\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/seq/for_each.hpp>\n# include <boost/preprocessor/seq/for_each_i.hpp>\n# include <boost/preprocessor/identity.hpp>\n# include <boost/preprocessor/selection/max.hpp>\n# include <boost/preprocessor/arithmetic/sub.hpp>\n# include <boost/preprocessor/repetition/enum_trailing.hpp>\n# include <boost/parameter/aux_/preprocessor/for_each.hpp>\n\n# define BOOST_PARAMETER_FLATTEN_SPLIT_required required,\n# define BOOST_PARAMETER_FLATTEN_SPLIT_optional optional,\n# define BOOST_PARAMETER_FLATTEN_SPLIT_deduced deduced,\n\n# define BOOST_PARAMETER_FLATTEN_SPLIT(sub) \\\n    BOOST_PP_CAT(BOOST_PARAMETER_FLATTEN_SPLIT_, sub)\n\n# define BOOST_PARAMETER_FLATTEN_QUALIFIER(sub) \\\n    BOOST_PP_SPLIT(0, BOOST_PARAMETER_FLATTEN_SPLIT(sub))\n\n# define BOOST_PARAMETER_FLATTEN_ARGS(sub) \\\n    BOOST_PP_SPLIT(1, BOOST_PARAMETER_FLATTEN_SPLIT(sub))\n\n# define BOOST_PARAMETER_FLATTEN_ARITY_optional(arities) \\\n    BOOST_PP_TUPLE_ELEM(3,0,arities)\n\n# define BOOST_PARAMETER_FLATTEN_ARITY_required(arities) \\\n    BOOST_PP_TUPLE_ELEM(3,1,arities)\n\n# define BOOST_PARAMETER_FLATTEN_SPEC0_DUMMY_ELEM(z, n, data) ~\n# define BOOST_PARAMETER_FLATTEN_SPEC0(r, n, elem, data) \\\n    (( \\\n        BOOST_PP_TUPLE_ELEM(3,2,data) \\\n      , BOOST_PP_TUPLE_REM(BOOST_PP_TUPLE_ELEM(3,0,data)) elem \\\n        BOOST_PP_ENUM_TRAILING( \\\n            BOOST_PP_SUB( \\\n                BOOST_PP_TUPLE_ELEM(3,1,data) \\\n              , BOOST_PP_TUPLE_ELEM(3,0,data) \\\n            ) \\\n          , BOOST_PARAMETER_FLATTEN_SPEC0_DUMMY_ELEM \\\n          , ~ \\\n        ) \\\n    ))\n\n# define BOOST_PARAMETER_FLATTEN_SPEC_AUX(r, arity, max_arity, spec, transform) \\\n    BOOST_PARAMETER_FOR_EACH_R( \\\n        r \\\n      , arity \\\n      , BOOST_PARAMETER_FLATTEN_ARGS(spec) \\\n      , (arity, max_arity, transform(BOOST_PARAMETER_FLATTEN_QUALIFIER(spec))) \\\n      , BOOST_PARAMETER_FLATTEN_SPEC0 \\\n    )\n\n# define BOOST_PARAMETER_FLATTEN_IDENTITY(x) x\n\n# define BOOST_PARAMETER_FLATTEN_SPEC_optional(r, arities, spec) \\\n    BOOST_PARAMETER_FLATTEN_SPEC_AUX( \\\n        r \\\n      , BOOST_PP_CAT( \\\n            BOOST_PARAMETER_FLATTEN_ARITY_, BOOST_PARAMETER_FLATTEN_QUALIFIER(spec) \\\n        )(arities) \\\n      , BOOST_PP_TUPLE_ELEM(3,2,arities) \\\n      , spec \\\n      , BOOST_PARAMETER_FLATTEN_IDENTITY \\\n    )\n\n# define BOOST_PARAMETER_FLATTEN_SPEC_required(r, arities, spec) \\\n    BOOST_PARAMETER_FLATTEN_SPEC_optional(r, arities, spec)\n\n# define BOOST_PARAMETER_FLATTEN_SPEC_AS_DEDUCED(x) BOOST_PP_CAT(deduced_,x)\n\n# define BOOST_PARAMETER_FLATTEN_SPEC_deduced_M(r, arities, n, spec) \\\n    BOOST_PARAMETER_FLATTEN_SPEC_AUX( \\\n        r \\\n      , BOOST_PP_CAT( \\\n            BOOST_PARAMETER_FLATTEN_ARITY_, BOOST_PARAMETER_FLATTEN_QUALIFIER(spec) \\\n        )(arities) \\\n      , BOOST_PP_TUPLE_ELEM(3,2,arities) \\\n      , spec \\\n      , BOOST_PARAMETER_FLATTEN_SPEC_AS_DEDUCED \\\n    )\n\n# define BOOST_PARAMETER_FLATTEN_SPEC_deduced(r, arities, spec) \\\n    BOOST_PP_SEQ_FOR_EACH_I_R( \\\n        r \\\n      , BOOST_PARAMETER_FLATTEN_SPEC_deduced_M \\\n      , arities \\\n      , BOOST_PARAMETER_FLATTEN_ARGS(spec) \\\n    )\n\n# define BOOST_PARAMETER_FLATTEN_SPEC(r, arities, spec) \\\n    BOOST_PP_CAT( \\\n        BOOST_PARAMETER_FLATTEN_SPEC_, BOOST_PARAMETER_FLATTEN_QUALIFIER(spec) \\\n    )(r, arities, spec)\n\n# define BOOST_PARAMETER_FLATTEN(optional_arity, required_arity, wanted_arity, specs) \\\n    BOOST_PP_SEQ_FOR_EACH( \\\n        BOOST_PARAMETER_FLATTEN_SPEC \\\n      , ( \\\n            optional_arity, required_arity \\\n          , wanted_arity \\\n        ) \\\n      , specs \\\n    )\n\n#endif // BOOST_PARAMETER_FLATTEN_051217_HPP\n\n"
  },
  {
    "path": "benchmarks/boost/parameter/aux_/preprocessor/for_each.hpp",
    "content": "// Copyright Daniel Wallin 2005. Use, modification and distribution is\n// subject to the Boost Software License, Version 1.0. (See accompanying\n// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_PARAMETER_FOR_EACH_051217_HPP\n# define BOOST_PARAMETER_FOR_EACH_051217_HPP\n\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/detail/split.hpp>\n# include <boost/preprocessor/logical/not.hpp>\n# include <boost/preprocessor/facilities/is_empty.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n# include <boost/preprocessor/arithmetic/inc.hpp>\n# include <boost/preprocessor/repeat.hpp>\n# include <boost/preprocessor/punctuation/comma_if.hpp>\n# include <boost/preprocessor/for.hpp>\n# include <boost/preprocessor/repetition/deduce_r.hpp>\n\n# define BOOST_PARAMETER_FOR_EACH_head_aux2(x,y) (x,y), ~\n# define BOOST_PARAMETER_FOR_EACH_head_aux3(x,y,z) (x,y,z), ~\n# define BOOST_PARAMETER_FOR_EACH_head_aux4(x,y,z,u) (x,y,z,u), ~\n# define BOOST_PARAMETER_FOR_EACH_head(n,x) \\\n    BOOST_PP_SPLIT(0, BOOST_PP_CAT(BOOST_PARAMETER_FOR_EACH_head_aux,n) x)\n\n# define BOOST_PARAMETER_FOR_EACH_pred_aux_BOOST_PARAMETER_FOR_EACH_END_SENTINEL\n# define BOOST_PARAMETER_FOR_EACH_pred_aux_check(x) \\\n    BOOST_PP_NOT(BOOST_PP_IS_EMPTY( \\\n        BOOST_PP_CAT(BOOST_PARAMETER_FOR_EACH_pred_aux_, x) \\\n    )), ~\n\n# define BOOST_PARAMETER_FOR_EACH_pred_aux2(x,y) \\\n    BOOST_PARAMETER_FOR_EACH_pred_aux_check(x)\n# define BOOST_PARAMETER_FOR_EACH_pred_aux3(x,y,z) \\\n    BOOST_PARAMETER_FOR_EACH_pred_aux_check(x)\n# define BOOST_PARAMETER_FOR_EACH_pred_aux4(x,y,z,u) \\\n    BOOST_PARAMETER_FOR_EACH_pred_aux_check(x)\n\n# define BOOST_PARAMETER_FOR_EACH_pred_aux0(n,x) \\\n    BOOST_PP_CAT(BOOST_PARAMETER_FOR_EACH_pred_aux,n) x\n\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#  define BOOST_PARAMETER_FOR_EACH_pred_SPLIT_FIRST(x) \\\n    BOOST_PP_SPLIT(0, x)\n\n#  define BOOST_PARAMETER_FOR_EACH_pred(r, state) \\\n    BOOST_PARAMETER_FOR_EACH_pred_SPLIT_FIRST( \\\n        BOOST_PARAMETER_FOR_EACH_pred_aux0( \\\n            BOOST_PP_TUPLE_ELEM(5,3,state) \\\n          , BOOST_PP_TUPLE_ELEM(5,0,state) \\\n        ) \\\n    )\n# else\n#  define BOOST_PARAMETER_FOR_EACH_pred(r, state) \\\n    BOOST_PP_SPLIT( \\\n        0 \\\n      , BOOST_PARAMETER_FOR_EACH_pred_aux0( \\\n            BOOST_PP_TUPLE_ELEM(5,3,state) \\\n          , BOOST_PP_TUPLE_ELEM(5,0,state) \\\n        ) \\\n    )\n# endif\n\n# define BOOST_PARAMETER_FOR_EACH_op(r, state) \\\n    ( \\\n        BOOST_PP_TUPLE_EAT(BOOST_PP_TUPLE_ELEM(5,3,state)) \\\n          BOOST_PP_TUPLE_ELEM(5,0,state) \\\n      , BOOST_PP_TUPLE_ELEM(5,1,state) \\\n      , BOOST_PP_TUPLE_ELEM(5,2,state) \\\n      , BOOST_PP_TUPLE_ELEM(5,3,state) \\\n      , BOOST_PP_INC(BOOST_PP_TUPLE_ELEM(5,4,state)) \\\n    )\n\n# define BOOST_PARAMETER_FOR_EACH_macro(r, state) \\\n    BOOST_PP_TUPLE_ELEM(5,2,state)( \\\n        r \\\n      , BOOST_PP_TUPLE_ELEM(5,4,state) \\\n      , BOOST_PARAMETER_FOR_EACH_head( \\\n            BOOST_PP_TUPLE_ELEM(5,3,state) \\\n          , BOOST_PP_TUPLE_ELEM(5,0,state) \\\n        ) \\\n      , BOOST_PP_TUPLE_ELEM(5,1,state) \\\n    )\n\n# define BOOST_PARAMETER_FOR_EACH_build_end_sentinel(z,n,text) \\\n    BOOST_PP_COMMA_IF(n) BOOST_PARAMETER_FOR_EACH_END_SENTINEL\n# define BOOST_PARAMETER_FOR_EACH_build_end_sentinel_tuple(arity) \\\n    ( \\\n        BOOST_PP_REPEAT(arity, BOOST_PARAMETER_FOR_EACH_build_end_sentinel, _) \\\n    )\n\n# define BOOST_PARAMETER_FOR_EACH_R(r, arity, list, data, macro) \\\n    BOOST_PP_CAT(BOOST_PP_FOR_, r)( \\\n        (list BOOST_PARAMETER_FOR_EACH_build_end_sentinel_tuple(arity), data, macro, arity, 0) \\\n      , BOOST_PARAMETER_FOR_EACH_pred \\\n      , BOOST_PARAMETER_FOR_EACH_op \\\n      , BOOST_PARAMETER_FOR_EACH_macro \\\n    )\n\n# define BOOST_PARAMETER_FOR_EACH(arity, list, data, macro) \\\n    BOOST_PARAMETER_FOR_EACH_R(BOOST_PP_DEDUCE_R(), arity, list, data, macro)\n\n#endif // BOOST_PARAMETER_FOR_EACH_051217_HPP\n\n"
  },
  {
    "path": "benchmarks/boost/parameter/aux_/result_of0.hpp",
    "content": "// Copyright David Abrahams 2005. Distributed under the Boost\n// Software License, Version 1.0. (See accompanying\n// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n#ifndef BOOST_PARAMETER_AUX_RESULT_OF0_DWA2005511_HPP\n# define BOOST_PARAMETER_AUX_RESULT_OF0_DWA2005511_HPP\n\n# include <boost/utility/result_of.hpp>\n\n// A metafunction returning the result of invoking a nullary function\n// object of the given type.\n\n#ifndef BOOST_NO_RESULT_OF\n\n# include <boost/utility/result_of.hpp>\nnamespace boost { namespace parameter { namespace aux { \ntemplate <class F>\nstruct result_of0 : result_of<F()>\n{};\n\n}}} // namespace boost::parameter::aux_\n\n#else\n\nnamespace boost { namespace parameter { namespace aux { \ntemplate <class F>\nstruct result_of0\n{\n    typedef typename F::result_type type;\n};\n\n}}} // namespace boost::parameter::aux_\n\n#endif \n\n\n#endif // BOOST_PARAMETER_AUX_RESULT_OF0_DWA2005511_HPP\n"
  },
  {
    "path": "benchmarks/boost/parameter/aux_/set.hpp",
    "content": "// Copyright Daniel Wallin 2006. Use, modification and distribution is\n// subject to the Boost Software License, Version 1.0. (See accompanying\n// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_PARAMETER_SET_060912_HPP\n# define BOOST_PARAMETER_SET_060912_HPP\n\n# include <boost/detail/workaround.hpp>\n\n# if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))\n#  include <boost/mpl/insert.hpp>\n#  include <boost/mpl/set/set0.hpp>\n#  include <boost/mpl/has_key.hpp>\n\nnamespace boost { namespace parameter { namespace aux {\n\ntypedef mpl::set0<> set0;\n\ntemplate <class Set, class K>\nstruct insert_\n{\n    typedef typename mpl::insert<Set, K>::type type;\n};\n\ntemplate <class Set, class K>\nstruct has_key_\n{\n    typedef typename mpl::has_key<Set, K>::type type;\n};\n\n}}} // namespace boost::parameter::aux\n\n# else\n\n#  include <boost/mpl/list.hpp>\n#  include <boost/mpl/end.hpp>\n#  include <boost/mpl/find.hpp>\n#  include <boost/mpl/not.hpp>\n#  include <boost/mpl/push_front.hpp>\n\nnamespace boost { namespace parameter { namespace aux {\n\ntypedef mpl::list0<> set0;\n\ntemplate <class Set, class K>\nstruct insert_\n{\n    typedef typename mpl::push_front<Set, K>::type type;\n};\n\ntemplate <class Set, class K>\nstruct has_key_\n{\n    typedef typename mpl::find<Set, K>::type iter;\n    typedef mpl::not_<\n        is_same<iter, typename mpl::end<Set>::type> \n    > type;\n};\n\n}}} // namespace boost::parameter::aux\n\n# endif\n\n\n#endif // BOOST_PARAMETER_SET_060912_HPP\n\n"
  },
  {
    "path": "benchmarks/boost/parameter/aux_/tag.hpp",
    "content": "// Copyright David Abrahams 2005. Distributed under the Boost\n// Software License, Version 1.0. (See accompanying\n// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n#ifndef BOOST_PARAMETER_AUX_TAG_DWA2005610_HPP\n# define BOOST_PARAMETER_AUX_TAG_DWA2005610_HPP\n\n# include <boost/parameter/aux_/unwrap_cv_reference.hpp>\n# include <boost/parameter/aux_/tagged_argument.hpp>\n\nnamespace boost { namespace parameter { namespace aux { \n\ntemplate <class Keyword, class ActualArg\n#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))\n        , class = typename is_cv_reference_wrapper<ActualArg>::type\n#endif \n          >\nstruct tag\n{\n    typedef tagged_argument<\n        Keyword\n      , typename unwrap_cv_reference<ActualArg>::type\n    > type;\n};\n\n#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))\ntemplate <class Keyword, class ActualArg>\nstruct tag<Keyword,ActualArg,mpl::false_>\n{\n    typedef tagged_argument<\n        Keyword\n      , ActualArg\n    > type;\n};\n#endif \n\n}}} // namespace boost::parameter::aux_\n\n#endif // BOOST_PARAMETER_AUX_TAG_DWA2005610_HPP\n"
  },
  {
    "path": "benchmarks/boost/parameter/aux_/tagged_argument.hpp",
    "content": "// Copyright Daniel Wallin, David Abrahams 2005. Use, modification and\n// distribution is subject to the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_PARAMETER_TAGGED_ARGUMENT_050328_HPP\n# define BOOST_PARAMETER_TAGGED_ARGUMENT_050328_HPP\n\n# include <boost/parameter/aux_/void.hpp>\n# include <boost/parameter/aux_/arg_list.hpp>\n# include <boost/parameter/aux_/result_of0.hpp>\n# include <boost/mpl/if.hpp>\n# include <boost/mpl/apply_wrap.hpp>\n# include <boost/mpl/and.hpp>\n# include <boost/mpl/not.hpp>\n# include <boost/type_traits/is_same.hpp>\n# include <boost/type_traits/is_convertible.hpp>\n# include <boost/type_traits/is_reference.hpp>\n\nnamespace boost { namespace parameter { namespace aux {\n\nstruct empty_arg_list;\nstruct arg_list_tag;\n\nstruct tagged_argument_base {};\n\n// Holds a reference to an argument of type Arg associated with\n// keyword Keyword\n    \ntemplate <class Keyword, class Arg>\nstruct tagged_argument : tagged_argument_base\n{\n    typedef Keyword key_type;\n    typedef Arg value_type;\n    typedef Arg& reference;\n\n    tagged_argument(reference x) : value(x) {}\n\n    // A metafunction class that, given a keyword and a default\n    // type, returns the appropriate result type for a keyword\n    // lookup given that default\n    struct binding\n    {\n        template <class KW, class Default, class Reference>\n        struct apply\n        {\n          typedef typename mpl::eval_if<\n                boost::is_same<KW, key_type>\n              , mpl::if_<Reference, reference, value_type>\n              , mpl::identity<Default>\n          >::type type;\n        };\n    };\n\n    // Comma operator to compose argument list without using parameters<>.\n    // Useful for argument lists with undetermined length.\n    template <class Keyword2, class Arg2>\n    arg_list<\n        tagged_argument<Keyword, Arg>\n      , arg_list<tagged_argument<Keyword2, Arg2> > \n    >\n    operator,(tagged_argument<Keyword2, Arg2> x) const\n    {\n        return arg_list<\n            tagged_argument<Keyword, Arg>\n          , arg_list<tagged_argument<Keyword2, Arg2> > \n        >(\n            *this\n          , arg_list<tagged_argument<Keyword2, Arg2> >(x, empty_arg_list())\n        );\n    }\n\n    reference operator[](keyword<Keyword> const&) const\n    {\n        return value;\n    }\n\n# if defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))\n    template <class KW, class Default>\n    Default& get_with_default(default_<KW,Default> const& x, int) const\n    {\n        return x.value;\n    }\n\n    template <class Default>\n    reference get_with_default(default_<key_type,Default> const&, long) const\n    {\n        return value;\n    }\n\n    template <class KW, class Default>\n    typename mpl::apply_wrap3<binding, KW, Default&, mpl::true_>::type\n    operator[](default_<KW,Default> const& x) const\n    {\n        return get_with_default(x, 0L);\n    }\n\n    template <class KW, class F>\n    typename result_of0<F>::type \n    get_with_lazy_default(lazy_default<KW,F> const& x, int) const\n    {\n        return x.compute_default();\n    }\n\n    template <class F>\n    reference get_with_lazy_default(lazy_default<key_type,F> const&, long) const\n    {\n        return value;\n    }\n\n    template <class KW, class F>\n    typename mpl::apply_wrap3<\n        binding,KW\n      , typename result_of0<F>::type\n      , mpl::true_\n    >::type\n    operator[](lazy_default<KW,F> const& x) const\n    {\n        return get_with_lazy_default(x, 0L);\n    }\n# else\n    template <class Default>\n    reference operator[](default_<key_type,Default> const& ) const\n    {\n        return value;\n    }\n\n    template <class F>\n    reference operator[](lazy_default<key_type,F> const& ) const\n    {\n        return value;\n    }\n\n    template <class KW, class Default>\n    Default& operator[](default_<KW,Default> const& x) const\n    {\n        return x.value;\n    }\n\n    template <class KW, class F>\n    typename result_of0<F>::type operator[](lazy_default<KW,F> const& x) const\n    {\n        return x.compute_default();\n    }\n\n    template <class ParameterRequirements>\n    static typename ParameterRequirements::has_default\n    satisfies(ParameterRequirements*);\n\n    template <class HasDefault, class Predicate>\n    static typename mpl::apply1<Predicate, value_type>::type\n    satisfies(\n        parameter_requirements<key_type,Predicate,HasDefault>*\n    );\n# endif\n\n    reference value;\n# if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310))\n    // warning suppression\n private:\n    void operator=(tagged_argument const&);\n public:    \n# endif\n    // MPL sequence support\n    typedef tagged_argument type;            // Convenience for users\n    typedef empty_arg_list tail_type;        // For the benefit of iterators\n    typedef arg_list_tag tag; // For dispatching to sequence intrinsics\n};\n\n// Defines a metafunction, is_tagged_argument, that identifies\n// tagged_argument specializations and their derived classes.\ntemplate <class T>\nstruct is_tagged_argument_aux\n  : is_convertible<T*,tagged_argument_base const*>\n{};\n\ntemplate <class T>\nstruct is_tagged_argument\n  : mpl::and_<\n        mpl::not_<is_reference<T> >\n      , is_tagged_argument_aux<T>\n    >\n{};\n\n}}} // namespace boost::parameter::aux\n\n#endif // BOOST_PARAMETER_TAGGED_ARGUMENT_050328_HPP\n\n"
  },
  {
    "path": "benchmarks/boost/parameter/aux_/template_keyword.hpp",
    "content": "// Copyright Daniel Wallin 2006. Use, modification and distribution is\n// subject to the Boost Software License, Version 1.0. (See accompanying\n// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_PARAMETER_TEMPLATE_KEYWORD_060203_HPP\n# define BOOST_PARAMETER_TEMPLATE_KEYWORD_060203_HPP\n\n# include <boost/mpl/and.hpp>\n# include <boost/mpl/not.hpp>\n# include <boost/type_traits/is_convertible.hpp>\n# include <boost/type_traits/is_reference.hpp>\n\nnamespace boost { namespace parameter { \n\nnamespace aux \n{\n\n  struct template_keyword_tag {}; \n\n  template <class T, class U>\n  struct is_pointer_convertible\n    : is_convertible<T*, U*>\n  {};\n\n  template <class T>\n  struct is_template_keyword\n    : mpl::and_<\n          mpl::not_<is_reference<T> >\n        , is_pointer_convertible<T, template_keyword_tag>\n      >\n  {};\n\n} // namespace aux\n\ntemplate <class Tag, class T>\nstruct template_keyword\n  : aux::template_keyword_tag\n{\n    typedef Tag key_type;\n    typedef T value_type;\n    typedef value_type reference;\n};\n\n}} // namespace boost::parameter\n\n#endif // BOOST_PARAMETER_TEMPLATE_KEYWORD_060203_HPP\n\n"
  },
  {
    "path": "benchmarks/boost/parameter/aux_/unwrap_cv_reference.hpp",
    "content": "// Copyright Daniel Wallin, David Abrahams 2005. Use, modification and\n// distribution is subject to the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef UNWRAP_CV_REFERENCE_050328_HPP\n#define UNWRAP_CV_REFERENCE_050328_HPP\n\n#include <boost/parameter/aux_/yesno.hpp>\n#include <boost/mpl/bool.hpp>\n#include <boost/mpl/identity.hpp>\n#include <boost/mpl/eval_if.hpp>\n\nnamespace boost { template<class T> class reference_wrapper; }\n\nnamespace boost { namespace parameter { namespace aux {\n\n//\n// reference_wrapper support -- because of the forwarding problem,\n// when passing arguments positionally by non-const reference, we\n// ask users of named parameter interfaces to use ref(x) to wrap\n// them.\n//\n\n// is_cv_reference_wrapper returns mpl::true_ if T is of type\n// reference_wrapper<U> cv\ntemplate <class U>\nyes_tag is_cv_reference_wrapper_check(reference_wrapper<U> const volatile*);\nno_tag is_cv_reference_wrapper_check(...);\n\ntemplate <class T>\nstruct is_cv_reference_wrapper\n{\n    BOOST_STATIC_CONSTANT(\n        bool, value = (\n            sizeof(is_cv_reference_wrapper_check((T*)0)) == sizeof(yes_tag)\n        )\n    );\n\n    typedef mpl::bool_<\n#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))\n        is_cv_reference_wrapper::\n#endif \n    value> type;\n};\n\n// Needed for unwrap_cv_reference below. T might be const, so\n// eval_if might fail because of deriving from T const on EDG.\ntemplate <class T>\nstruct get_type\n{\n    typedef typename T::type type;\n};\n\n#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))\ntemplate <class T, class is_reference_wrapper = typename is_cv_reference_wrapper<T>::type>\nstruct unwrap_cv_reference\n{\n    typedef T type;\n};\n\ntemplate <class T>\nstruct unwrap_cv_reference<T const, mpl::false_>\n{\n    typedef T const type;\n};\n\ntemplate <class T>\nstruct unwrap_cv_reference<T, mpl::true_>\n  : T\n{};\n\n#else \n// Produces the unwrapped type to hold a reference to in named<>\n// Can't use boost::unwrap_reference<> here because it\n// doesn't handle the case where T = reference_wrapper<U> cv\ntemplate <class T>\nstruct unwrap_cv_reference\n{\n    typedef typename mpl::eval_if<\n        is_cv_reference_wrapper<T>\n      , get_type<T>\n      , mpl::identity<T>\n    >::type type;\n};\n#endif\n\n}}} // namespace boost::parameter::aux\n\n#endif // UNWRAP_CV_REFERENCE_050328_HPP\n\n"
  },
  {
    "path": "benchmarks/boost/parameter/aux_/void.hpp",
    "content": "// Copyright Daniel Wallin, David Abrahams 2005. Use, modification and\n// distribution is subject to the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_PARAMETER_VOID_050329_HPP\n#define BOOST_PARAMETER_VOID_050329_HPP\n\nnamespace boost { namespace parameter { \n\n// A placemarker for \"no argument passed.\"\n// MAINTAINER NOTE: Do not make this into a metafunction\nstruct void_ {}; \n\nnamespace aux \n{\n\n  inline void_& void_reference()\n  {\n      static void_ instance;\n      return instance;\n  }\n\n} // namespace aux\n\n}} // namespace boost::parameter\n\n#endif // BOOST_PARAMETER_VOID_050329_HPP\n\n"
  },
  {
    "path": "benchmarks/boost/parameter/aux_/yesno.hpp",
    "content": "// Copyright Daniel Wallin, David Abrahams 2005. Use, modification and\n// distribution is subject to the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef YESNO_050328_HPP\n#define YESNO_050328_HPP\n\n#include <boost/mpl/bool.hpp>\n\nnamespace boost { namespace parameter { namespace aux {\n\n// types used with the \"sizeof trick\" to capture the results of\n// overload resolution at compile-time.\ntypedef char yes_tag;\ntypedef char (&no_tag)[2];\n\n// mpl::true_ and mpl::false_ are not distinguishable by sizeof(),\n// so we pass them through these functions to get a type that is.\nyes_tag to_yesno(mpl::true_);\nno_tag to_yesno(mpl::false_);\n\n}}} // namespace boost::parameter::aux\n\n#endif // YESNO_050328_HPP\n\n"
  },
  {
    "path": "benchmarks/boost/parameter/binding.hpp",
    "content": "// Copyright David Abrahams 2005. Distributed under the Boost\n// Software License, Version 1.0. (See accompanying\n// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n#ifndef BOOST_PARAMETER_BINDING_DWA200558_HPP\n# define BOOST_PARAMETER_BINDING_DWA200558_HPP\n\n# include <boost/mpl/apply.hpp>\n# include <boost/mpl/assert.hpp>\n# include <boost/mpl/and.hpp>\n# include <boost/parameter/aux_/result_of0.hpp>\n# include <boost/parameter/aux_/void.hpp>\n# include <boost/type_traits/is_same.hpp>\n\nnamespace boost { namespace parameter { \n\n// A metafunction that, given an argument pack, returns the type of\n// the parameter identified by the given keyword.  If no such\n// parameter has been specified, returns Default\n\n# if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))\ntemplate <class Parameters, class Keyword, class Default>\nstruct binding0\n{\n    typedef typename mpl::apply_wrap3<\n        typename Parameters::binding,Keyword,Default,mpl::true_\n    >::type type;\n\n    BOOST_MPL_ASSERT_NOT((\n        mpl::and_<\n            is_same<Default, void_>\n          , is_same<type, void_>\n        >\n    ));\n};\n# endif\n\ntemplate <class Parameters, class Keyword, class Default = void_>\nstruct binding\n{\n# if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))\n    typedef typename mpl::eval_if<\n        mpl::is_placeholder<Parameters>\n      , mpl::identity<int>\n      , binding0<Parameters,Keyword,Default>\n    >::type type;\n# else\n    typedef typename mpl::apply_wrap3<\n        typename Parameters::binding,Keyword,Default,mpl::true_\n    >::type type;\n\n    BOOST_MPL_ASSERT_NOT((\n        mpl::and_<\n            is_same<Default, void_>\n          , is_same<type, void_>\n        >\n    ));\n# endif\n\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(3,binding,(Parameters,Keyword,Default))\n};\n\n// A metafunction that, given an argument pack, returns the type of\n// the parameter identified by the given keyword.  If no such\n// parameter has been specified, returns the type returned by invoking\n// DefaultFn\ntemplate <class Parameters, class Keyword, class DefaultFn>\nstruct lazy_binding\n{\n  typedef typename mpl::apply_wrap3<\n      typename Parameters::binding\n    , Keyword\n    , typename aux::result_of0<DefaultFn>::type\n    , mpl::true_\n  >::type type;\n};\n\n\n}} // namespace boost::parameter\n\n#endif // BOOST_PARAMETER_BINDING_DWA200558_HPP\n"
  },
  {
    "path": "benchmarks/boost/parameter/config.hpp",
    "content": "// Copyright Daniel Wallin, David Abrahams 2005. Use, modification and\n// distribution is subject to the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_PARAMETER_CONFIG_050403_HPP\n#define BOOST_PARAMETER_CONFIG_050403_HPP\n\n#ifndef BOOST_PARAMETER_MAX_ARITY\n# define BOOST_PARAMETER_MAX_ARITY 8\n#endif\n\n#endif // BOOST_PARAMETER_CONFIG_050403_HPP\n\n"
  },
  {
    "path": "benchmarks/boost/parameter/keyword.hpp",
    "content": "// Copyright Daniel Wallin, David Abrahams 2005. Use, modification and\n// distribution is subject to the Boost Software License, Version 1.0. (See\n// accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef KEYWORD_050328_HPP\n#define KEYWORD_050328_HPP\n\n#include <boost/parameter/aux_/unwrap_cv_reference.hpp>\n#include <boost/parameter/aux_/tag.hpp>\n#include <boost/parameter/aux_/default.hpp>\n\nnamespace boost { namespace parameter {\n\n// Instances of unique specializations of keyword<...> serve to\n// associate arguments with parameter names.  For example:\n//\n//    struct rate_;           // parameter names\n//    struct skew_;\n//    namespace\n//    {\n//      keyword<rate_> rate;  // keywords\n//      keyword<skew_> skew;\n//    }\n//\n//    ...\n//\n//    f(rate = 1, skew = 2.4);\n//\ntemplate <class Tag>\nstruct keyword\n{\n    template <class T>\n    typename aux::tag<Tag, T>::type const\n    operator=(T& x) const\n    {\n        typedef typename aux::tag<Tag, T>::type result;\n        return result(x);\n    }\n\n    template <class Default>\n    aux::default_<Tag, Default>\n    operator|(Default& default_) const\n    {\n        return aux::default_<Tag, Default>(default_);\n    }\n\n    template <class Default>\n    aux::lazy_default<Tag, Default>\n    operator||(Default& default_) const\n    {\n        return aux::lazy_default<Tag, Default>(default_);\n    }\n\n    template <class T>\n    typename aux::tag<Tag, T const>::type const\n    operator=(T const& x) const\n    {\n        typedef typename aux::tag<Tag, T const>::type result;\n        return result(x);\n    }\n\n    template <class Default>\n    aux::default_<Tag, const Default>\n    operator|(const Default& default_) const\n    {\n        return aux::default_<Tag, const Default>(default_);\n    }\n\n    template <class Default>\n    aux::lazy_default<Tag, Default>\n    operator||(Default const& default_) const\n    {\n        return aux::lazy_default<Tag, Default>(default_);\n    }\n\n public: // Insurance against ODR violations\n    \n    // People will need to define these keywords in header files.  To\n    // prevent ODR violations, it's important that the keyword used in\n    // every instantiation of a function template is the same object.\n    // We provide a reference to a common instance of each keyword\n    // object and prevent construction by users.\n    static keyword<Tag> const instance;\n\n    // This interface is deprecated\n    static keyword<Tag>& get()\n    {\n        return const_cast<keyword<Tag>&>(instance);\n    }\n};\n\ntemplate <class Tag>\nkeyword<Tag> const keyword<Tag>::instance = {};\n\n// Reduces boilerplate required to declare and initialize keywords\n// without violating ODR.  Declares a keyword tag type with the given\n// name in namespace tag_namespace, and declares and initializes a\n// reference in an anonymous namespace to a singleton instance of that\n// type.\n\n#define BOOST_PARAMETER_KEYWORD(tag_namespace,name)                 \\\n    namespace tag_namespace                                         \\\n    {                                                               \\\n      struct name                                                   \\\n      {                                                             \\\n          static char const* keyword_name()                         \\\n          {                                                         \\\n              return #name;                                         \\\n          }                                                         \\\n      };                                                            \\\n    }                                                               \\\n    namespace                                                       \\\n    {                                                               \\\n       ::boost::parameter::keyword<tag_namespace::name> const& name \\\n       = ::boost::parameter::keyword<tag_namespace::name>::instance;\\\n    }\n\n}} // namespace boost::parameter\n\n#endif // KEYWORD_050328_HPP\n\n"
  },
  {
    "path": "benchmarks/boost/parameter/macros.hpp",
    "content": "// Copyright David Abrahams, Daniel Wallin 2003. Use, modification and \n// distribution is subject to the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_PARAMETER_MACROS_050412_HPP\n#define BOOST_PARAMETER_MACROS_050412_HPP\n\n#include <boost/preprocessor/tuple/elem.hpp>\n#include <boost/preprocessor/repetition/repeat_from_to.hpp>\n#include <boost/preprocessor/arithmetic/inc.hpp>\n#include <boost/preprocessor/logical/bool.hpp>\n#include <boost/preprocessor/punctuation/comma_if.hpp>\n#include <boost/preprocessor/control/expr_if.hpp>\n#include <boost/preprocessor/repetition/enum_params.hpp>\n#include <boost/preprocessor/repetition/enum_binary_params.hpp>\n#include <boost/preprocessor/cat.hpp>\n#include <boost/detail/workaround.hpp>\n\n#define BOOST_PARAMETER_FUN_TEMPLATE_HEAD1(n) \\\n    template<BOOST_PP_ENUM_PARAMS(n, class T)>\n\n#define BOOST_PARAMETER_FUN_TEMPLATE_HEAD0(n)\n\n#if ! defined(BOOST_NO_SFINAE) && ! BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592)) \n\n# define BOOST_PARAMETER_MATCH_TYPE(n, param)           \\\n            BOOST_PP_EXPR_IF(n, typename) param::match  \\\n            <                                           \\\n                BOOST_PP_ENUM_PARAMS(n, T)              \\\n            >::type \n\n#else\n\n# define BOOST_PARAMETER_MATCH_TYPE(n, param) param\n\n#endif\n\n#define BOOST_PARAMETER_FUN_DECL(z, n, params)                                      \\\n                                                                                    \\\n    BOOST_PP_CAT(BOOST_PARAMETER_FUN_TEMPLATE_HEAD, BOOST_PP_BOOL(n))(n)            \\\n                                                                                    \\\n    BOOST_PP_TUPLE_ELEM(3, 0, params)                                               \\\n        BOOST_PP_TUPLE_ELEM(3, 1, params)(                                          \\\n            BOOST_PP_ENUM_BINARY_PARAMS(n, T, const& p)                             \\\n            BOOST_PP_COMMA_IF(n)                                                    \\\n            BOOST_PARAMETER_MATCH_TYPE(n,BOOST_PP_TUPLE_ELEM(3, 2, params))         \\\n            kw = BOOST_PP_TUPLE_ELEM(3, 2, params)()                                \\\n        )                                                                           \\\n    {                                                                               \\\n        return BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(3, 1, params), _with_named_params)( \\\n            kw(BOOST_PP_ENUM_PARAMS(n, p))                                          \\\n        );                                                                          \\\n    }\n\n// Generates:\n//\n// template<class Params>\n// ret name ## _with_named_params(Params const&);\n//\n// template<class T0>\n// ret name(T0 const& p0, typename parameters::match<T0>::type kw = parameters())\n// {\n//     return name ## _with_named_params(kw(p0));\n// }\n//\n// template<class T0, ..., class TN>\n// ret name(T0 const& p0, ..., TN const& PN\n//    , typename parameters::match<T0, ..., TN>::type kw = parameters())\n// {\n//     return name ## _with_named_params(kw(p0, ..., pN));\n// }\n//\n// template<class Params>\n// ret name ## _with_named_params(Params const&)\n//\n// lo and hi determines the min and max arity of the generated functions.\n\n#define BOOST_PARAMETER_FUN(ret, name, lo, hi, parameters)                          \\\n                                                                                    \\\n    template<class Params>                                                          \\\n    ret BOOST_PP_CAT(name, _with_named_params)(Params const& p);                    \\\n                                                                                    \\\n    BOOST_PP_REPEAT_FROM_TO(                                                        \\\n        lo, BOOST_PP_INC(hi), BOOST_PARAMETER_FUN_DECL, (ret, name, parameters))    \\\n                                                                                    \\\n    template<class Params>                                                          \\\n    ret BOOST_PP_CAT(name, _with_named_params)(Params const& p)\n\n#define BOOST_PARAMETER_MEMFUN(ret, name, lo, hi, parameters)                       \\\n                                                                                    \\\n    BOOST_PP_REPEAT_FROM_TO(                                                        \\\n        lo, BOOST_PP_INC(hi), BOOST_PARAMETER_FUN_DECL, (ret, name, parameters))    \\\n                                                                                    \\\n    template<class Params>                                                          \\\n    ret BOOST_PP_CAT(name, _with_named_params)(Params const& p)\n\n#endif // BOOST_PARAMETER_MACROS_050412_HPP\n\n"
  },
  {
    "path": "benchmarks/boost/parameter/match.hpp",
    "content": "// Copyright David Abrahams 2005. Distributed under the Boost\n// Software License, Version 1.0. (See accompanying\n// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n#ifndef BOOST_PARAMETER_MATCH_DWA2005714_HPP\n# define BOOST_PARAMETER_MATCH_DWA2005714_HPP\n\n# include <boost/detail/workaround.hpp>\n# include <boost/preprocessor/seq/enum.hpp>\n\n# if BOOST_WORKAROUND(__MWERKS__, <= 0x3003)\n// Temporary version of BOOST_PP_SEQ_ENUM until Paul M. integrates the workaround.\n#  define BOOST_PARAMETER_SEQ_ENUM_I(size,seq) BOOST_PP_CAT(BOOST_PP_SEQ_ENUM_, size) seq\n#  define BOOST_PARAMETER_SEQ_ENUM(seq) BOOST_PARAMETER_SEQ_ENUM_I(BOOST_PP_SEQ_SIZE(seq), seq)\n# else\n#  define BOOST_PARAMETER_SEQ_ENUM(seq) BOOST_PP_SEQ_ENUM(seq)\n# endif \n\n# if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))\n\n#  include <boost/parameter/config.hpp>\n#  include <boost/parameter/aux_/void.hpp>\n#  include <boost/preprocessor/arithmetic/sub.hpp>\n#  include <boost/preprocessor/facilities/intercept.hpp>\n#  include <boost/preprocessor/repetition/enum_trailing_params.hpp>\n\n#  define BOOST_PARAMETER_MATCH_DEFAULTS(ArgTypes)              \\\n        BOOST_PP_ENUM_TRAILING_PARAMS(                          \\\n            BOOST_PP_SUB(                                       \\\n                BOOST_PARAMETER_MAX_ARITY                       \\\n              , BOOST_PP_SEQ_SIZE(ArgTypes)                     \\\n            )                                                   \\\n          , ::boost::parameter::void_ BOOST_PP_INTERCEPT   \\\n        )\n\n# else\n\n#  define BOOST_PARAMETER_MATCH_DEFAULTS(ArgTypes)\n\n# endif \n\n//\n// Generates, e.g.\n//\n//    typename dfs_params::match<A1,A2>::type name = dfs_params()\n//\n// with workarounds for Borland compatibility.\n//\n\n# define BOOST_PARAMETER_MATCH(ParameterSpec, ArgTypes, name)   \\\n    typename ParameterSpec ::match<                             \\\n        BOOST_PARAMETER_SEQ_ENUM(ArgTypes)                      \\\n        BOOST_PARAMETER_MATCH_DEFAULTS(ArgTypes)                \\\n    >::type name = ParameterSpec ()\n\n#endif // BOOST_PARAMETER_MATCH_DWA2005714_HPP\n"
  },
  {
    "path": "benchmarks/boost/parameter/name.hpp",
    "content": "// Copyright Daniel Wallin 2006. Use, modification and distribution is\n// subject to the Boost Software License, Version 1.0. (See accompanying\n// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_PARAMETER_NAME_060806_HPP\n# define BOOST_PARAMETER_NAME_060806_HPP\n\n# include <boost/parameter/keyword.hpp>\n# include <boost/parameter/value_type.hpp>\n# include <boost/detail/workaround.hpp>\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/stringize.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/mpl/placeholders.hpp>\n\n# if !defined(BOOST_NO_SFINAE) \\\n  && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592))\n\n#  include <boost/utility/enable_if.hpp>\n#  include <boost/mpl/lambda.hpp>\n\nnamespace boost { namespace parameter { namespace aux {\n\n// Tag type passed to MPL lambda.\nstruct lambda_tag;\n\nstruct name_tag_base\n{};\n\ntemplate <class Tag>\nstruct name_tag\n{};\n\ntemplate <class T>\nstruct is_name_tag\n  : mpl::false_\n{};\n\n}}} // namespace boost::parameter::aux\n\nnamespace boost { namespace mpl {\n\ntemplate <class T>\nstruct lambda<\n    T\n  , typename boost::enable_if<\n        parameter::aux::is_name_tag<T>, parameter::aux::lambda_tag\n    >::type\n>\n{\n    typedef true_ is_le;\n    typedef bind3< quote3<parameter::value_type>, arg<2>, T, void> result_;\n    typedef result_ type;\n};\n\n}} // namespace boost::mpl\n\n# endif\n\n# if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))\n# include <boost/preprocessor/detail/split.hpp>\n// From Paul Mensonides\n#  define BOOST_PARAMETER_IS_BINARY(x) \\\n    BOOST_PP_SPLIT(1, BOOST_PARAMETER_IS_BINARY_C x BOOST_PP_COMMA() 0) \\\n    /**/\n#  define BOOST_PARAMETER_IS_BINARY_C(x,y) \\\n    ~, 1 BOOST_PP_RPAREN() \\\n    BOOST_PP_TUPLE_EAT(2) BOOST_PP_LPAREN() ~ \\\n    /**/\n# else\n#  include <boost/preprocessor/detail/is_binary.hpp>\n#  define BOOST_PARAMETER_IS_BINARY(x) BOOST_PP_IS_BINARY(x)\n# endif\n\n# define BOOST_PARAMETER_BASIC_NAME(tag_namespace, tag, name)       \\\n    namespace tag_namespace                                         \\\n    {                                                               \\\n      struct tag                                                    \\\n      {                                                             \\\n          static char const* keyword_name()                         \\\n          {                                                         \\\n              return BOOST_PP_STRINGIZE(tag);                       \\\n          }                                                         \\\n                                                                    \\\n          typedef boost::parameter::value_type<                     \\\n              boost::mpl::_2, tag, boost::parameter::void_          \\\n          > _;                                                      \\\n                                                                    \\\n          typedef boost::parameter::value_type<                     \\\n              boost::mpl::_2, tag, boost::parameter::void_          \\\n          > _1;                                                     \\\n      };                                                            \\\n    }                                                               \\\n    namespace                                                       \\\n    {                                                               \\\n       ::boost::parameter::keyword<tag_namespace::tag> const& name  \\\n       = ::boost::parameter::keyword<tag_namespace::tag>::instance; \\\n    }\n\n# define BOOST_PARAMETER_COMPLEX_NAME_TUPLE1(tag,namespace)         \\\n    (tag, namespace), ~\n\n# define BOOST_PARAMETER_COMPLEX_NAME_TUPLE(name)                   \\\n    BOOST_PP_TUPLE_ELEM(2, 0, (BOOST_PARAMETER_COMPLEX_NAME_TUPLE1 name))\n\n# define BOOST_PARAMETER_COMPLEX_NAME_TAG(name)                     \\\n    BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PARAMETER_COMPLEX_NAME_TUPLE(name))\n\n# define BOOST_PARAMETER_COMPLEX_NAME_NAMESPACE(name)               \\\n    BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PARAMETER_COMPLEX_NAME_TUPLE(name))\n\n# define BOOST_PARAMETER_COMPLEX_NAME(name)                         \\\n    BOOST_PARAMETER_BASIC_NAME(                                     \\\n        BOOST_PARAMETER_COMPLEX_NAME_NAMESPACE(name)                \\\n      , BOOST_PP_TUPLE_EAT(2) name                                  \\\n      , BOOST_PARAMETER_COMPLEX_NAME_TAG(name)                      \\\n    )                                                               \\\n/**/\n\n# define BOOST_PARAMETER_SIMPLE_NAME(name)                          \\\n    BOOST_PARAMETER_BASIC_NAME(tag, name, BOOST_PP_CAT(_, name))\n\n# define BOOST_PARAMETER_NAME(name)                                 \\\n    BOOST_PP_IIF(                                                   \\\n        BOOST_PARAMETER_IS_BINARY(name)                             \\\n      , BOOST_PARAMETER_COMPLEX_NAME                                \\\n      , BOOST_PARAMETER_SIMPLE_NAME                                 \\\n    )(name)                                                         \\\n/**/\n\n\n# define BOOST_PARAMETER_TEMPLATE_KEYWORD(name)                     \\\n    namespace tag                                                   \\\n    {                                                               \\\n      struct name;                                                  \\\n    }                                                               \\\n    template <class T>                                              \\\n    struct name                                                     \\\n      : boost::parameter::template_keyword<tag::name, T>            \\\n    {};                                                             \\\n/**/\n\n#endif // BOOST_PARAMETER_NAME_060806_HPP\n\n"
  },
  {
    "path": "benchmarks/boost/parameter/parameters.hpp",
    "content": "// Copyright David Abrahams, Daniel Wallin 2003. Use, modification and \n// distribution is subject to the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_PARAMETERS_031014_HPP\n#define BOOST_PARAMETERS_031014_HPP\n\n#include <boost/detail/is_xxx.hpp>\n\n#include <boost/type_traits/is_const.hpp>\n\n#include <boost/mpl/lambda.hpp>\n#include <boost/mpl/apply.hpp>\n#include <boost/mpl/always.hpp>\n#include <boost/mpl/and.hpp>\n#include <boost/mpl/or.hpp>\n#include <boost/mpl/if.hpp>\n#include <boost/mpl/identity.hpp>\n#include <boost/mpl/not.hpp>\n#include <boost/mpl/eval_if.hpp>\n#include <boost/mpl/pair.hpp>\n\n#include <boost/type_traits/is_same.hpp>\n#include <boost/type_traits/remove_reference.hpp>\n\n#include <boost/preprocessor/repetition/enum.hpp>\n#include <boost/preprocessor/repetition/enum_params.hpp>\n#include <boost/preprocessor/repetition/enum_trailing_params.hpp>\n#include <boost/preprocessor/arithmetic/sub.hpp>\n#include <boost/preprocessor/repetition/repeat.hpp>\n#include <boost/preprocessor/repetition/enum_shifted.hpp>\n#include <boost/preprocessor/repetition/enum_binary_params.hpp>\n#include <boost/preprocessor/repetition/enum_shifted_params.hpp>\n#include <boost/preprocessor/seq/elem.hpp>\n#include <boost/preprocessor/iteration/iterate.hpp>\n#include <boost/preprocessor/facilities/intercept.hpp>\n#include <boost/preprocessor/cat.hpp>\n\n#include <boost/parameter/aux_/arg_list.hpp>\n#include <boost/parameter/aux_/yesno.hpp>\n#include <boost/parameter/aux_/void.hpp>\n#include <boost/parameter/aux_/default.hpp>\n#include <boost/parameter/aux_/unwrap_cv_reference.hpp>\n#include <boost/parameter/aux_/tagged_argument.hpp>\n#include <boost/parameter/aux_/tag.hpp>\n#include <boost/parameter/aux_/template_keyword.hpp>\n#include <boost/parameter/aux_/set.hpp>\n#include <boost/parameter/config.hpp>\n\nnamespace parameter_\n{\n  template <class T>\n  struct unmatched_argument\n  {\n      BOOST_MPL_ASSERT((boost::is_same<T,void>));\n      typedef int type;\n  }; \n} // namespace parameter_\n\nnamespace boost {\n\ntemplate<class T> class reference_wrapper;\n\nnamespace parameter {\n\nnamespace aux { struct use_default {}; }\n\n// These templates can be used to describe the treatment of particular\n// named parameters for the purposes of overload elimination with\n// SFINAE, by placing specializations in the parameters<...> list.  In\n// order for a treated function to participate in overload resolution:\n//\n//   - all keyword tags wrapped in required<...> must have a matching\n//     actual argument\n//\n//   - The actual argument type matched by every keyword tag\n//     associated with a predicate must satisfy that predicate\n//\n// If a keyword k is specified without an optional<...> or\n// required<...>, wrapper, it is treated as though optional<k> were\n// specified.\n//\n// If a keyword k is specified with deduced<...>, that keyword\n// will be automatically deduced from the argument list.\n//\ntemplate <class Tag, class Predicate = aux::use_default>\nstruct required\n{\n    typedef Tag key_type;\n    typedef Predicate predicate;\n};\n\ntemplate <class Tag, class Predicate = aux::use_default>\nstruct optional\n{\n    typedef Tag key_type;\n    typedef Predicate predicate;\n};\n\ntemplate <class Tag>\nstruct deduced\n{\n    typedef Tag key_type;\n};\n\nnamespace aux\n{\n  // Defines metafunctions, is_required and is_optional, that\n  // identify required<...>, optional<...> and deduced<...> specializations.\n  BOOST_DETAIL_IS_XXX_DEF(required, required, 2)\n  BOOST_DETAIL_IS_XXX_DEF(optional, optional, 2)\n  BOOST_DETAIL_IS_XXX_DEF(deduced_aux, deduced, 1)\n\n  template <class S>\n  struct is_deduced0\n    : is_deduced_aux<\n          typename S::key_type\n      >::type\n  {};\n\n  template <class S>\n  struct is_deduced\n    : mpl::eval_if<\n          mpl::or_<\n              is_optional<S>, is_required<S>\n          >\n        , is_deduced0<S>\n        , mpl::false_\n      >::type\n  {};\n\n  //\n  // key_type, has_default, and predicate --\n  //\n  // These metafunctions accept a ParameterSpec and extract the\n  // keyword tag, whether or not a default is supplied for the\n  // parameter, and the predicate that the corresponding actual\n  // argument type is required match.\n  //\n  // a ParameterSpec is a specialization of either keyword<...>,\n  // required<...>, optional<...>\n  //\n\n  // helper for key_type<...>, below.\n  template <class T>\n  struct get_tag_type0\n  {\n      typedef typename T::key_type type;\n  };\n\n  template <class T>\n  struct get_tag_type\n    : mpl::eval_if<\n          is_deduced_aux<typename T::key_type>\n        , get_tag_type0<typename T::key_type>\n        , mpl::identity<typename T::key_type>\n      >\n  {};\n\n  template <class T>\n  struct tag_type\n    : mpl::eval_if<\n          mpl::or_<\n              is_optional<T>\n            , is_required<T>\n          >\n        , get_tag_type<T>\n        , mpl::identity<T>\n      >\n  {};\n\n  template <class T>\n  struct has_default\n    : mpl::not_<is_required<T> >\n  {};\n\n  // helper for get_predicate<...>, below\n  template <class T>\n  struct get_predicate_or_default\n  {\n      typedef T type;\n  };\n\n  template <>\n  struct get_predicate_or_default<use_default>\n  {\n      typedef mpl::always<mpl::true_> type;\n  };\n\n  // helper for predicate<...>, below\n  template <class T>\n  struct get_predicate\n  {\n      typedef typename\n          get_predicate_or_default<typename T::predicate>::type\n      type;\n  };\n\n  template <class T>\n  struct predicate\n    : mpl::eval_if<\n         mpl::or_<\n              is_optional<T>\n            , is_required<T>\n          >\n        , get_predicate<T>\n        , mpl::identity<mpl::always<mpl::true_> >\n      >\n  {\n  };\n\n\n  // Converts a ParameterSpec into a specialization of\n  // parameter_requirements.  We need to do this in order to get the\n  // tag_type into the type in a way that can be conveniently matched\n  // by a satisfies(...) member function in arg_list.\n  template <class ParameterSpec>\n  struct as_parameter_requirements\n  {\n      typedef parameter_requirements<\n          typename tag_type<ParameterSpec>::type\n        , typename predicate<ParameterSpec>::type\n        , typename has_default<ParameterSpec>::type\n      > type;\n  };\n\n  template <class T>\n  struct is_named_argument\n    : mpl::or_<\n          is_template_keyword<T>\n        , is_tagged_argument<T>\n      >\n  {};\n  \n  // Returns mpl::true_ iff the given ParameterRequirements are\n  // satisfied by ArgList.\n  template <class ArgList, class ParameterRequirements>\n  struct satisfies\n  {\n#if BOOST_WORKAROUND(BOOST_MSVC, == 1310)\n      // VC7.1 can't handle the sizeof() implementation below,\n      // so we use this instead.\n      typedef typename mpl::apply_wrap3<\n          typename ArgList::binding\n        , typename ParameterRequirements::keyword\n        , void_\n        , mpl::false_\n      >::type bound;\n\n      typedef typename mpl::eval_if<\n          is_same<bound, void_>\n        , typename ParameterRequirements::has_default\n        , mpl::apply_wrap2<\n              typename mpl::lambda<\n                  typename ParameterRequirements::predicate, lambda_tag\n              >::type\n            , bound\n            , ArgList\n          >\n      >::type type;\n#else\n      BOOST_STATIC_CONSTANT(\n          bool, value = (\n              sizeof(\n                  aux::to_yesno(\n                      ArgList::satisfies((ParameterRequirements*)0, (ArgList*)0)\n                  )\n              ) == sizeof(yes_tag)\n          )\n      );\n\n      typedef mpl::bool_<satisfies::value> type;\n#endif\n  };\n\n  // Returns mpl::true_ if the requirements of the given ParameterSpec\n  // are satisfied by ArgList.\n  template <class ArgList, class ParameterSpec>\n  struct satisfies_requirements_of\n    : satisfies<\n          ArgList\n        , typename as_parameter_requirements<ParameterSpec>::type\n      >\n  {};\n\n  // Tags a deduced argument Arg with the keyword tag of Spec using TagFn.\n  // Returns the tagged argument and the mpl::set<> UsedArgs with the\n  // tag of Spec inserted.\n  template <class UsedArgs, class Spec, class Arg, class TagFn>\n  struct tag_deduced\n  {\n      typedef mpl::pair<\n          typename mpl::apply_wrap2<TagFn, typename tag_type<Spec>::type, Arg>::type\n        , typename aux::insert_<UsedArgs, typename tag_type<Spec>::type>::type\n      > type;\n  };\n\n  template <\n      class Argument\n    , class ArgumentPack\n    , class DeducedArgs\n    , class UsedArgs\n    , class TagFn\n  >\n  struct deduce_tag;\n\n  // Tag type passed to MPL lambda.\n  struct lambda_tag;\n\n  // Helper for deduce_tag<> below.\n  template <\n      class Argument\n    , class ArgumentPack\n    , class DeducedArgs\n    , class UsedArgs\n    , class TagFn\n  >\n  struct deduce_tag0\n  {\n      typedef typename DeducedArgs::spec spec;\n\n      typedef typename mpl::apply_wrap2<\n          typename mpl::lambda<\n              typename spec::predicate, lambda_tag\n          >::type\n        , Argument\n        , ArgumentPack\n      >::type condition;\n\n      // Deduced parameter matches several arguments.\n\n      BOOST_MPL_ASSERT((\n          mpl::not_<mpl::and_<\n              condition\n            , aux::has_key_<UsedArgs, typename tag_type<spec>::type>\n          > >\n      ));\n\n      typedef typename mpl::eval_if<\n          condition\n        , tag_deduced<UsedArgs, spec, Argument, TagFn>\n        , deduce_tag<Argument, ArgumentPack, typename DeducedArgs::tail, UsedArgs, TagFn>\n      >::type type;\n  };\n\n  // Tries to deduced a keyword tag for a given Argument.\n  // Returns an mpl::pair<> consisting of the tagged_argument<>, \n  // and an mpl::set<> where the new tag has been inserted.\n  //\n  //  Argument: The argument type to be tagged.\n  //\n  //  ArgumentPack: The ArgumentPack built so far.\n  //\n  //  DeducedArgs: A specialization of deduced_item<> (see below).\n  //               A list containing only the deduced ParameterSpecs.\n  //\n  //  UsedArgs: An mpl::set<> containing the keyword tags used so far.\n  //\n  //  TagFn: A metafunction class used to tag positional or deduced\n  //         arguments with a keyword tag.\n\n  template <\n      class Argument\n    , class ArgumentPack\n    , class DeducedArgs\n    , class UsedArgs\n    , class TagFn\n  >\n  struct deduce_tag\n  {\n      typedef typename mpl::eval_if<\n          is_same<DeducedArgs, void_>\n        , mpl::pair<void_, UsedArgs>\n        , deduce_tag0<Argument, ArgumentPack, DeducedArgs, UsedArgs, TagFn>\n      >::type type;\n  };\n\n  template <\n      class List\n    , class DeducedArgs\n    , class TagFn\n    , class Positional\n    , class UsedArgs\n    , class ArgumentPack\n    , class Error\n  >\n  struct make_arg_list_aux;\n\n  // Inserts Tagged::key_type into the UserArgs set.\n  // Extra indirection to lazily evaluate Tagged::key_type.\n  template <class UsedArgs, class Tagged>\n  struct insert_tagged\n  {\n      typedef typename aux::insert_<\n          UsedArgs, typename Tagged::key_type\n      >::type type;\n  };\n\n  // Borland needs the insane extra-indirection workaround below\n  // so that it doesn't magically drop the const qualifier from\n  // the argument type.\n\n  template <\n      class List\n    , class DeducedArgs\n    , class TagFn\n    , class Positional\n    , class UsedArgs\n    , class ArgumentPack\n#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))\n    , class argument\n#endif\n    , class Error\n  >\n#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))\n  struct make_arg_list00\n#else\n  struct make_arg_list0\n#endif\n  {\n#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))\n      typedef typename List::arg argument;\n#endif\n      typedef typename List::spec parameter_spec;\n      typedef typename tag_type<parameter_spec>::type tag_;\n\n      typedef is_named_argument<argument> is_tagged;\n\n      // If this argument is either explicitly tagged or a deduced\n      // parameter, we turn off positional matching.\n      typedef mpl::and_<\n          mpl::not_<\n              mpl::or_<is_deduced<parameter_spec>, is_tagged> \n          > \n        , Positional\n      > positional;\n\n      // If this parameter is explicitly tagged we add it to the\n      // used-parmeters set. We only really need to add parameters\n      // that are deduced, but we would need a way to check if\n      // a given tag corresponds to a deduced parameter spec.\n      typedef typename mpl::eval_if<\n          is_tagged\n        , insert_tagged<UsedArgs, argument>\n        , mpl::identity<UsedArgs>\n      >::type used_args;\n\n      // If this parameter is neither explicitly tagged, nor\n      // positionally matched; deduce the tag from the deduced\n      // parameter specs.\n      typedef typename mpl::eval_if<\n          mpl::or_<is_tagged, positional>\n        , mpl::pair<void_, used_args>\n        , deduce_tag<argument, ArgumentPack, DeducedArgs, used_args, TagFn>\n      >::type deduced_data;\n\n      // If this parameter is explicitly tagged..\n      typedef typename mpl::eval_if<\n          is_tagged\n        , mpl::identity<argument>                        // .. just use it\n        , mpl::eval_if<                                  // .. else, if positional matching is turned on..\n                positional\n              , mpl::apply_wrap2<TagFn, tag_, argument>  // .. tag it positionally\n              , mpl::first<deduced_data>                 // .. else, use the deduced tag\n          >\n      >::type tagged;\n\n      // We build the arg_list incrementally as we go, prepending new\n      // nodes.\n\n      typedef typename mpl::if_<\n          mpl::and_<\n              is_same<Error, void_>\n            , is_same<tagged, void_>\n          >\n        , parameter_::unmatched_argument<argument>\n        , void_\n      >::type error;\n\n      typedef typename mpl::if_<\n          is_same<tagged, void_>\n        , ArgumentPack\n        , arg_list<tagged, ArgumentPack>\n      >::type argument_pack;\n\n      typedef typename make_arg_list_aux<\n          typename List::tail\n        , DeducedArgs\n        , TagFn\n        , positional\n        , typename deduced_data::second\n        , argument_pack\n        , error\n      >::type type;\n  };\n\n#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))\n  template <\n      class List\n    , class DeducedArgs\n    , class TagFn\n    , class Positional\n    , class UsedArgs\n    , class ArgumentPack\n    , class Error\n  >\n  struct make_arg_list0\n  {\n      typedef typename mpl::eval_if<\n          typename List::is_arg_const\n        , make_arg_list00<\n              List\n            , DeducedArgs\n            , TagFn\n            , Positional\n            , UsedArgs\n            , ArgumentPack\n            , typename List::arg const\n            , Error\n          >\n        , make_arg_list00<\n              List\n            , DeducedArgs\n            , TagFn\n            , Positional\n            , UsedArgs\n            , ArgumentPack\n            , typename List::arg\n            , Error\n          >\n      >::type type;\n  };\n#endif\n\n  // Returns an ArgumentPack where the list of arguments has\n  // been tagged with keyword tags.\n  //\n  //   List: A specialization of item<> (see below). Contains\n  //         both the ordered ParameterSpecs, and the given arguments.\n  //\n  //   DeducedArgs: A specialization of deduced_item<> (see below).\n  //                A list containing only the deduced ParameterSpecs.\n  //\n  //   TagFn: A metafunction class used to tag positional or deduced\n  //          arguments with a keyword tag.\n  //\n  //   Position: An mpl::bool_<> specialization indicating if positional\n  //             matching is to be performed.\n  //\n  //   DeducedSet: An mpl::set<> containing the keyword tags used so far.\n  //\n  //   ArgumentPack: The ArgumentPack built so far. This is initially an\n  //                 empty_arg_list and is built incrementally.\n  //\n\n  template <\n      class List\n    , class DeducedArgs\n    , class TagFn\n    , class Positional\n    , class DeducedSet\n    , class ArgumentPack\n    , class Error\n  >\n  struct make_arg_list_aux\n  {\n      typedef typename mpl::eval_if<\n          is_same<List, void_>\n        , mpl::identity<mpl::pair<ArgumentPack, Error> >\n        , make_arg_list0<List, DeducedArgs, TagFn, Positional, DeducedSet, ArgumentPack, Error>\n      >::type type;\n  };\n\n  // VC6.5 was choking on the default parameters for make_arg_list_aux, so\n  // this just forwards to that adding in the defaults.\n  template <\n      class List\n    , class DeducedArgs\n    , class TagFn\n    , class EmitErrors = mpl::true_\n  >\n  struct make_arg_list\n  {\n      typedef typename make_arg_list_aux<\n          List, DeducedArgs, TagFn, mpl::true_, aux::set0, empty_arg_list, void_\n      >::type type;\n  };\n\n  // A parameter spec item typelist.\n  template <class Spec, class Arg, class Tail = void_>\n  struct item\n  {\n      typedef Spec spec;\n\n#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))\n      typedef is_const<Arg> is_arg_const;\n#endif\n\n      typedef Arg arg;\n      typedef Tail tail;\n  };\n\n  template <class Spec, class Arg, class Tail>\n  struct make_item\n  {\n      typedef item<Spec, Arg, typename Tail::type> type;\n  };\n\n  // Creates a item typelist.\n  template <class Spec, class Arg, class Tail>\n  struct make_items\n  {\n      typedef typename mpl::eval_if<\n          is_same<Arg, void_>\n        , mpl::identity<void_>\n        , make_item<Spec, Arg, Tail>\n      >::type type;\n  };\n\n  // A typelist that stored deduced parameter specs.\n  template <class ParameterSpec, class Tail = void_>\n  struct deduced_item\n  {\n      typedef ParameterSpec spec;\n      typedef Tail tail;\n  };\n\n  // Evaluate Tail and construct deduced_item list.\n  template <class Spec, class Tail>\n  struct make_deduced_item\n  {\n      typedef deduced_item<Spec, typename Tail::type> type;\n  };\n\n  template <class Spec, class Tail>\n  struct make_deduced_items\n  {\n      typedef typename mpl::eval_if<\n          is_same<Spec, void_>\n        , mpl::identity<void_>\n        , mpl::eval_if<\n              is_deduced<Spec>\n            , make_deduced_item<Spec, Tail>\n            , Tail\n          >\n      >::type type;\n  };\n\n  // Generates:\n  //\n  //   make<\n  //       parameter_spec#0, argument_type#0\n  //     , make<\n  //           parameter_spec#1, argument_type#1\n  //         , ... mpl::identity<aux::empty_arg_list>\n  //    ...>\n  //   >\n#define BOOST_PARAMETER_make_arg_list(z, n, names)      \\\n      BOOST_PP_SEQ_ELEM(0,names)<                       \\\n          BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(1,names), n),  \\\n          BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(2,names), n), \n\n#define BOOST_PARAMETER_right_angle(z, n, text) >\n\n#define BOOST_PARAMETER_build_arg_list(n, make, parameter_spec, argument_type)      \\\n  BOOST_PP_REPEAT(                                                                  \\\n      n, BOOST_PARAMETER_make_arg_list, (make)(parameter_spec)(argument_type))      \\\n      mpl::identity<void_>                                                          \\\n  BOOST_PP_REPEAT(n, BOOST_PARAMETER_right_angle, _)\n\n#define BOOST_PARAMETER_make_deduced_list(z, n, names)  \\\n      BOOST_PP_SEQ_ELEM(0,names)<                       \\\n          BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(1,names), n),\n\n#define BOOST_PARAMETER_build_deduced_list(n, make, parameter_spec)                 \\\n  BOOST_PP_REPEAT(                                                                  \\\n      n, BOOST_PARAMETER_make_deduced_list, (make)(parameter_spec))                 \\\n  mpl::identity<void_>                                                              \\\n  BOOST_PP_REPEAT(n, BOOST_PARAMETER_right_angle, _)\n\n  struct tag_keyword_arg\n  {\n      template <class K, class T>\n      struct apply\n        : tag<K,T>\n      {};\n  };\n\n  struct tag_template_keyword_arg\n  {\n      template <class K, class T>\n      struct apply\n      {\n          typedef template_keyword<K,T> type;\n      };\n  };\n\n} // namespace aux\n\n#define BOOST_PARAMETER_FORWARD_TYPEDEF(z, i, names) \\\n    typedef BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(0,names),i) BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(1,names),i);\n\n#define BOOST_PARAMETER_FORWARD_TYPEDEFS(n, src, dest) \\\n    BOOST_PP_REPEAT(n, BOOST_PARAMETER_FORWARD_TYPEDEF, (src)(dest))\n\n\n#define BOOST_PARAMETER_TEMPLATE_ARGS(z, n, text) class BOOST_PP_CAT(PS, n) = void_\n\ntemplate<\n     class PS0\n   , BOOST_PP_ENUM_SHIFTED(BOOST_PARAMETER_MAX_ARITY, BOOST_PARAMETER_TEMPLATE_ARGS, _)\n>\nstruct parameters\n{\n#undef BOOST_PARAMETER_TEMPLATE_ARGS\n\n    typedef typename BOOST_PARAMETER_build_deduced_list(\n        BOOST_PARAMETER_MAX_ARITY, aux::make_deduced_items, PS\n    )::type deduced_list;\n\n    // if the elements of NamedList match the criteria of overload\n    // resolution, returns a type which can be constructed from\n    // parameters.  Otherwise, this is not a valid metafunction (no nested\n    // ::type).\n\n\n#if ! defined(BOOST_NO_SFINAE) && ! BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592))\n    // If NamedList satisfies the PS0, PS1, ..., this is a\n    // metafunction returning parameters.  Otherwise it \n    // has no nested ::type.\n    template <class ArgumentPackAndError>\n    struct match_base\n      : mpl::if_<\n            // mpl::and_<\n            //    aux::satisfies_requirements_of<NamedList,PS0>\n            //  , mpl::and_<\n            //       aux::satisfies_requirements_of<NamedList,PS1>...\n            //           ..., mpl::true_\n            // ...> >\n            \n# define BOOST_PARAMETER_satisfies(z, n, text)                                      \\\n            mpl::and_<                                                              \\\n                aux::satisfies_requirements_of<                                     \\\n                    typename mpl::first<ArgumentPackAndError>::type                 \\\n                  , BOOST_PP_CAT(PS, n)>                                            \\\n                  ,\n            mpl::and_<\n                is_same<typename mpl::second<ArgumentPackAndError>::type, void_>\n              , BOOST_PP_REPEAT(BOOST_PARAMETER_MAX_ARITY, BOOST_PARAMETER_satisfies, _)\n                mpl::true_\n                BOOST_PP_REPEAT(BOOST_PARAMETER_MAX_ARITY, BOOST_PARAMETER_right_angle, _)\n            >\n\n# undef BOOST_PARAMETER_satisfies\n\n          , mpl::identity<parameters>\n          , void_\n        >\n    {};\n#endif\n    \n    // Specializations are to be used as an optional argument to\n    // eliminate overloads via SFINAE\n    template<\n#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))\n        // Borland simply can't handle default arguments in member\n        // class templates.  People wishing to write portable code can\n        // explicitly specify BOOST_PARAMETER_MAX_ARITY arguments\n        BOOST_PP_ENUM_PARAMS(BOOST_PARAMETER_MAX_ARITY, class A)\n#else \n        BOOST_PP_ENUM_BINARY_PARAMS(\n            BOOST_PARAMETER_MAX_ARITY, class A, = void_ BOOST_PP_INTERCEPT\n        )\n#endif\n    >\n    struct match\n# if ! defined(BOOST_NO_SFINAE) && ! BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592))\n      : match_base<\n            typename aux::make_arg_list<\n                typename BOOST_PARAMETER_build_arg_list(\n                    BOOST_PARAMETER_MAX_ARITY, aux::make_items, PS, A\n                )::type\n              , deduced_list\n              , aux::tag_keyword_arg\n              , mpl::false_ // Don't emit errors when doing SFINAE\n            >::type\n        >::type\n    {};\n# else\n    { \n        typedef parameters<\n            BOOST_PP_ENUM_PARAMS(BOOST_PARAMETER_MAX_ARITY, PS)\n        > type; \n    };\n# endif\n\n    // Metafunction that returns an ArgumentPack.\n\n    // TODO, bind has to instantiate the error type in the result\n    // of make_arg_list.\n\n    template <\n#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))\n        // Borland simply can't handle default arguments in member\n        // class templates.  People wishing to write portable code can\n        // explicitly specify BOOST_PARAMETER_MAX_ARITY arguments\n        BOOST_PP_ENUM_PARAMS(BOOST_PARAMETER_MAX_ARITY, class A)\n#else \n        BOOST_PP_ENUM_BINARY_PARAMS(\n            BOOST_PARAMETER_MAX_ARITY, class A, = void_ BOOST_PP_INTERCEPT\n        )\n#endif            \n    >\n    struct bind\n    {\n        typedef typename aux::make_arg_list<\n            typename BOOST_PARAMETER_build_arg_list(\n                BOOST_PARAMETER_MAX_ARITY, aux::make_items, PS, A\n            )::type\n          , deduced_list\n          , aux::tag_template_keyword_arg\n        >::type result;\n\n        typedef typename mpl::first<result>::type type;\n    };\n\n    BOOST_PARAMETER_FORWARD_TYPEDEFS(BOOST_PARAMETER_MAX_ARITY, PS, parameter_spec)\n\n    //\n    // The function call operator is used to build an arg_list that\n    // labels the positional parameters and maintains whatever other\n    // tags may have been specified by the caller.\n    //\n    // !!!NOTE!!!\n    //\n    // The make_arg_list<> produces a reversed arg_list, so\n    // we need to pass the arguments to its constructor\n    // reversed.\n    //\n    aux::empty_arg_list operator()() const\n    {\n       return aux::empty_arg_list();\n    }\n\n    template<class A0>\n    typename mpl::first<\n        typename aux::make_arg_list<\n            aux::item<\n                PS0,A0\n            >\n          , deduced_list\n          , aux::tag_keyword_arg\n        >::type\n    >::type\n    operator()(A0& a0) const\n    {\n        typedef typename aux::make_arg_list<\n            aux::item<\n                PS0,A0\n            >\n          , deduced_list\n          , aux::tag_keyword_arg\n        >::type result;\n\n        typedef typename mpl::first<result>::type result_type;\n        typedef typename mpl::second<result>::type error;\n        error();\n\n        return result_type(\n            a0\n            // , void_(), void_(), void_() ...\n            BOOST_PP_ENUM_TRAILING_PARAMS(\n                BOOST_PP_SUB(BOOST_PARAMETER_MAX_ARITY, 1)\n              , aux::void_reference() BOOST_PP_INTERCEPT)\n        );\n    }\n\n    template<class A0, class A1>\n    typename mpl::first<\n        typename aux::make_arg_list<\n            aux::item<\n                PS0,A0\n              , aux::item<\n                    PS1,A1\n                >\n            >\n          , deduced_list\n          , aux::tag_keyword_arg\n        >::type\n    >::type\n    operator()(A0& a0, A1& a1) const\n    {\n        typedef typename aux::make_arg_list<\n            aux::item<\n                PS0,A0\n              , aux::item<\n                    PS1,A1\n                >\n            >\n          , deduced_list\n          , aux::tag_keyword_arg\n        >::type result;\n\n        typedef typename mpl::first<result>::type result_type;\n        typedef typename mpl::second<result>::type error;\n        error();\n\n        return result_type(\n            a1,a0\n            // , void_(), void_() ...\n            BOOST_PP_ENUM_TRAILING_PARAMS(\n                BOOST_PP_SUB(BOOST_PARAMETER_MAX_ARITY, 2)\n              , aux::void_reference() BOOST_PP_INTERCEPT)\n        );\n    }\n\n    // Higher arities are handled by the preprocessor\n#define BOOST_PP_ITERATION_PARAMS_1 (3,( \\\n        3,BOOST_PARAMETER_MAX_ARITY,<boost/parameter/aux_/overloads.hpp> \\\n    ))\n#include BOOST_PP_ITERATE()\n\n};\n\n} // namespace parameter\n\n} // namespace boost\n\n#endif // BOOST_PARAMETERS_031014_HPP\n\n"
  },
  {
    "path": "benchmarks/boost/parameter/preprocessor.hpp",
    "content": "// Copyright Daniel Wallin 2006. Use, modification and distribution is\n// subject to the Boost Software License, Version 1.0. (See accompanying\n// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_PARAMETER_PREPROCESSOR_060206_HPP\n# define BOOST_PARAMETER_PREPROCESSOR_060206_HPP\n\n# include <boost/parameter/parameters.hpp>\n# include <boost/parameter/binding.hpp>\n# include <boost/parameter/match.hpp>\n\n# include <boost/parameter/aux_/parenthesized_type.hpp>\n# include <boost/parameter/aux_/cast.hpp>\n# include <boost/parameter/aux_/preprocessor/flatten.hpp>\n\n# include <boost/preprocessor/repetition/repeat_from_to.hpp>\n# include <boost/preprocessor/comparison/equal.hpp>\n# include <boost/preprocessor/control/if.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/control/expr_if.hpp>\n# include <boost/preprocessor/repetition/enum_params.hpp>\n# include <boost/preprocessor/repetition/enum_binary_params.hpp>\n# include <boost/preprocessor/repetition/enum_trailing.hpp>\n# include <boost/preprocessor/seq/first_n.hpp>\n# include <boost/preprocessor/seq/for_each_product.hpp>\n# include <boost/preprocessor/seq/for_each_i.hpp> \n# include <boost/preprocessor/tuple/elem.hpp> \n# include <boost/preprocessor/tuple/eat.hpp>\n# include <boost/preprocessor/seq/fold_left.hpp>\n# include <boost/preprocessor/seq/push_back.hpp>\n# include <boost/preprocessor/seq/size.hpp>\n# include <boost/preprocessor/seq/enum.hpp>\n# include <boost/preprocessor/seq/push_back.hpp>\n\n# include <boost/preprocessor/detail/is_nullary.hpp>\n\n# include <boost/mpl/always.hpp>\n# include <boost/mpl/apply_wrap.hpp>\n\nnamespace boost { namespace parameter { namespace aux {\n\n#  if ! defined(BOOST_NO_SFINAE) && ! BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592))\n\n// Given Match, which is \"void x\" where x is an argument matching\n// criterion, extract a corresponding MPL predicate.\ntemplate <class Match>\nstruct unwrap_predicate;\n\n// Match anything\ntemplate <>\nstruct unwrap_predicate<void*>\n{\n    typedef mpl::always<mpl::true_> type;\n};\n\n#if BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x580))\n\ntypedef void* voidstar;\n\n// A matching predicate is explicitly specified\ntemplate <class Predicate>\nstruct unwrap_predicate<voidstar (Predicate)>\n{\n    typedef Predicate type;\n};\n\n#else\n\n// A matching predicate is explicitly specified\ntemplate <class Predicate>\nstruct unwrap_predicate<void *(Predicate)>\n{\n    typedef Predicate type;\n};\n\n#endif \n\n\n// A type to which the argument is supposed to be convertible is\n// specified\ntemplate <class Target>\nstruct unwrap_predicate<void (Target)>\n{\n    typedef is_convertible<mpl::_, Target> type;\n};\n\n// Recast the ParameterSpec's nested match metafunction as a free metafunction\ntemplate <\n    class Parameters\n  , BOOST_PP_ENUM_BINARY_PARAMS(\n        BOOST_PARAMETER_MAX_ARITY, class A, = boost::parameter::void_ BOOST_PP_INTERCEPT\n    )\n>\nstruct match\n  : Parameters::template match<\n        BOOST_PP_ENUM_PARAMS(BOOST_PARAMETER_MAX_ARITY, A)\n    >\n{};\n# endif \n\n# undef false_\n\ntemplate <\n    class Parameters\n  , BOOST_PP_ENUM_BINARY_PARAMS(\n        BOOST_PARAMETER_MAX_ARITY, class A, = boost::parameter::void_ BOOST_PP_INTERCEPT\n    )\n>\nstruct argument_pack\n{\n    typedef typename make_arg_list<\n        typename BOOST_PARAMETER_build_arg_list(\n            BOOST_PARAMETER_MAX_ARITY, make_items, typename Parameters::parameter_spec, A\n        )::type\n      , typename Parameters::deduced_list\n      , tag_keyword_arg\n      , mpl::false_\n    >::type result;\n    typedef typename mpl::first<result>::type type;\n};\n\n// Works around VC6 problem where it won't accept rvalues.\ntemplate <class T>\nT& as_lvalue(T& value, long)\n{\n    return value;\n}\n\ntemplate <class T>\nT const& as_lvalue(T const& value, int)\n{\n    return value;\n}\n\n\n# if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))\n\ntemplate <class Predicate, class T, class Args>\nstruct apply_predicate\n{\n    BOOST_MPL_ASSERT((\n        mpl::and_<mpl::false_,T>\n    ));\n\n    typedef typename mpl::if_<\n        typename mpl::apply2<Predicate,T,Args>::type\n      , char\n      , int\n    >::type type;\n};\n\ntemplate <class P>\nstruct funptr_predicate\n{\n    static P p;\n\n    template <class T, class Args, class P0>\n    static typename apply_predicate<P0,T,Args>::type\n    check_predicate(type<T>, Args*, void**(*)(P0));\n\n    template <class T, class Args, class P0>\n    static typename mpl::if_<\n        is_convertible<T,P0>\n      , char\n      , int\n     >::type check_predicate(type<T>, Args*, void*(*)(P0));\n\n    template <class T, class Args>\n    struct apply\n    {\n        BOOST_STATIC_CONSTANT(bool, result = \n            sizeof(check_predicate(boost::type<T>(), (Args*)0, &p)) == 1\n        );\n\n        typedef mpl::bool_<apply<T,Args>::result> type;\n    };\n};\n\ntemplate <>\nstruct funptr_predicate<void**>\n  : mpl::always<mpl::true_>\n{};\n\n# endif\n\n}}} // namespace boost::parameter::aux\n\n# if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))\n// From Paul Mensonides\n#  define BOOST_PARAMETER_IS_NULLARY(x) \\\n    BOOST_PP_SPLIT(1, BOOST_PARAMETER_IS_NULLARY_C x BOOST_PP_COMMA() 0) \\\n    /**/\n#  define BOOST_PARAMETER_IS_NULLARY_C() \\\n    ~, 1 BOOST_PP_RPAREN() \\\n    BOOST_PP_TUPLE_EAT(2) BOOST_PP_LPAREN() ~ \\\n    /**/\n# else\n#  define BOOST_PARAMETER_IS_NULLARY(x) BOOST_PP_IS_NULLARY(x)\n# endif\n\n# define BOOST_PARAMETER_MEMBER_FUNCTION_CHECK_STATIC_static ()\n# define BOOST_PARAMETER_MEMBER_FUNCTION_IS_STATIC(name) \\\n    BOOST_PARAMETER_IS_NULLARY( \\\n        BOOST_PP_CAT(BOOST_PARAMETER_MEMBER_FUNCTION_CHECK_STATIC_,name) \\\n    )\n\n# if !defined(BOOST_MSVC)\n#  define BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC_static\n#  define BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC(name) \\\n    BOOST_PP_CAT(BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC_, name)\n# else\n// Workaround for MSVC preprocessor.\n//\n// When stripping static from \"static f\", msvc will produce\n// \" f\". The leading whitespace doesn't go away when pasting\n// the token with something else, so this thing is a hack to\n// strip the whitespace.\n#  define BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC_static (\n#  define BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC_AUX(name) \\\n    BOOST_PP_CAT(BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC_, name))\n#  define BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC(name) \\\n    BOOST_PP_SEQ_HEAD( \\\n        BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC_AUX(name) \\\n    )\n# endif\n\n# define BOOST_PARAMETER_MEMBER_FUNCTION_STATIC(name) \\\n    BOOST_PP_EXPR_IF( \\\n        BOOST_PARAMETER_MEMBER_FUNCTION_IS_STATIC(name) \\\n      , static \\\n    )\n\n# define BOOST_PARAMETER_MEMBER_FUNCTION_NAME(name) \\\n    BOOST_PP_IF( \\\n        BOOST_PARAMETER_MEMBER_FUNCTION_IS_STATIC(name) \\\n      , BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC \\\n      , name BOOST_PP_TUPLE_EAT(1) \\\n    )(name)\n\n// Calculates [begin, end) arity range.\n\n# define BOOST_PARAMETER_ARITY_RANGE_M_optional(state) state\n# define BOOST_PARAMETER_ARITY_RANGE_M_deduced_optional(state) state\n# define BOOST_PARAMETER_ARITY_RANGE_M_required(state) BOOST_PP_INC(state)\n# define BOOST_PARAMETER_ARITY_RANGE_M_deduced_required(state) BOOST_PP_INC(state)\n\n# define BOOST_PARAMETER_ARITY_RANGE_M(s, state, x) \\\n    BOOST_PP_CAT( \\\n        BOOST_PARAMETER_ARITY_RANGE_M_ \\\n      , BOOST_PARAMETER_FN_ARG_QUALIFIER(x) \\\n    )(state)\n/**/\n\n# define BOOST_PARAMETER_ARITY_RANGE(args) \\\n    ( \\\n        BOOST_PP_SEQ_FOLD_LEFT(BOOST_PARAMETER_ARITY_RANGE_M, 0, args) \\\n      , BOOST_PP_INC(BOOST_PP_SEQ_SIZE(args)) \\\n    )\n/**/\n\n// Accessor macros for the argument specs tuple.\n# define BOOST_PARAMETER_FN_ARG_QUALIFIER(x) \\\n    BOOST_PP_TUPLE_ELEM(4,0,x)\n/**/\n\n# define BOOST_PARAMETER_FN_ARG_NAME(x) \\\n    BOOST_PP_TUPLE_ELEM(4,1,x)\n/**/\n\n# define BOOST_PARAMETER_FN_ARG_PRED(x) \\\n    BOOST_PP_TUPLE_ELEM(4,2,x)\n/**/\n\n# define BOOST_PARAMETER_FN_ARG_DEFAULT(x) \\\n    BOOST_PP_TUPLE_ELEM(4,3,x)\n/**/\n\n# define BOOST_PARAMETETER_FUNCTION_EAT_KEYWORD_QUALIFIER_out(x)\n# define BOOST_PARAMETETER_FUNCTION_EAT_KEYWORD_QUALIFIER_in_out(x)\n\n// Returns 1 if x is either \"out(k)\" or \"in_out(k)\".\n# define BOOST_PARAMETER_FUNCTION_IS_KEYWORD_QUALIFIER(x) \\\n    BOOST_PP_IS_EMPTY( \\\n        BOOST_PP_CAT(BOOST_PARAMETETER_FUNCTION_EAT_KEYWORD_QUALIFIER_, x) \\\n    ) \\\n/**/\n\n# define BOOST_PARAMETETER_FUNCTION_GET_KEYWORD_QUALIFIER_out(x) x\n# define BOOST_PARAMETETER_FUNCTION_GET_KEYWORD_QUALIFIER_in_out(x) x\n# define BOOST_PARAMETER_FUNCTION_KEYWORD_GET(x) \\\n    BOOST_PP_CAT(BOOST_PARAMETETER_FUNCTION_GET_KEYWORD_QUALIFIER_, x)\n/**/\n\n// Returns the keyword of x, where x is either a keyword qualifier\n// or a keyword.\n//\n//   k => k\n//   out(k) => k\n//   in_out(k) => k\n//\n# define BOOST_PARAMETER_FUNCTION_KEYWORD(x) \\\n    BOOST_PP_IF( \\\n        BOOST_PARAMETER_FUNCTION_IS_KEYWORD_QUALIFIER(x) \\\n      , BOOST_PARAMETER_FUNCTION_KEYWORD_GET \\\n      , x BOOST_PP_TUPLE_EAT(1) \\\n    )(x)\n/**/\n\n# define BOOST_PARAMETER_FN_ARG_KEYWORD(x) \\\n    BOOST_PARAMETER_FUNCTION_KEYWORD( \\\n        BOOST_PARAMETER_FN_ARG_NAME(x) \\\n    )\n\n// Builds forwarding functions.\n\n# define BOOST_PARAMETER_FUNCTION_FWD_FUNCTION_TEMPLATE_Z(z, n) \\\n    template<BOOST_PP_ENUM_PARAMS_Z(z, n, class ParameterArgumentType)>\n/**/\n\n# if ! defined(BOOST_NO_SFINAE) && ! BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592))\n#  define BOOST_PARAMETER_FUNCTION_FWD_MATCH_Z(z, name, parameters, n) \\\n    , typename boost::parameter::aux::match< \\\n          parameters, BOOST_PP_ENUM_PARAMS(n, ParameterArgumentType) \\\n      >::type = parameters()\n# else\n#  define BOOST_PARAMETER_FUNCTION_FWD_MATCH_Z(z, name, parameters, n)\n# endif\n/**/\n\n# define BOOST_PARAMETER_FUNCTION_PARAMETERS_NAME(base) \\\n    BOOST_PP_CAT( \\\n        boost_param_parameters_ \\\n      , BOOST_PP_CAT(__LINE__, BOOST_PARAMETER_MEMBER_FUNCTION_NAME(base)) \\\n    )\n\n// Produce a name for a result type metafunction for the function\n// named base\n# define BOOST_PARAMETER_FUNCTION_RESULT_NAME(base) \\\n    BOOST_PP_CAT( \\\n        boost_param_result_ \\\n      , BOOST_PP_CAT(__LINE__,BOOST_PARAMETER_MEMBER_FUNCTION_NAME(base)) \\\n    )\n\n// Can't do boost_param_impl_ ## basee because base might start with an underscore\n// daniel: what? how is that relevant? the reason for using CAT() is to make sure\n// base is expanded. i'm not sure we need to here, but it's more stable to do it.\n# define BOOST_PARAMETER_IMPL(base) \\\n    BOOST_PP_CAT(boost_param_impl,BOOST_PARAMETER_MEMBER_FUNCTION_NAME(base))\n\n# define BOOST_PARAMETER_FUNCTION_FWD_FUNCTION00(z, n, r, data, elem) \\\n    BOOST_PP_IF( \\\n        n \\\n      , BOOST_PARAMETER_FUNCTION_FWD_FUNCTION_TEMPLATE_Z, BOOST_PP_TUPLE_EAT(2) \\\n    )(z,n) \\\n    BOOST_PARAMETER_MEMBER_FUNCTION_STATIC(BOOST_PP_TUPLE_ELEM(7,3,data)) \\\n    inline \\\n    BOOST_PP_EXPR_IF(n, typename) \\\n        BOOST_PARAMETER_FUNCTION_RESULT_NAME(BOOST_PP_TUPLE_ELEM(7,3,data))<   \\\n        BOOST_PP_EXPR_IF(n, typename) \\\n        boost::parameter::aux::argument_pack< \\\n            BOOST_PARAMETER_FUNCTION_PARAMETERS_NAME(BOOST_PP_TUPLE_ELEM(7,3,data)) \\\n            BOOST_PP_COMMA_IF(n) \\\n            BOOST_PP_IF( \\\n                n, BOOST_PP_SEQ_ENUM, BOOST_PP_TUPLE_EAT(1) \\\n            )(elem) \\\n        >::type \\\n    >::type \\\n    BOOST_PARAMETER_MEMBER_FUNCTION_NAME(BOOST_PP_TUPLE_ELEM(7,3,data))( \\\n        BOOST_PP_IF( \\\n            n \\\n          , BOOST_PP_SEQ_FOR_EACH_I_R \\\n          , BOOST_PP_TUPLE_EAT(4) \\\n        )( \\\n            r \\\n          , BOOST_PARAMETER_FUNCTION_ARGUMENT \\\n          , ~ \\\n          , elem \\\n        ) \\\n        BOOST_PP_IF(n, BOOST_PARAMETER_FUNCTION_FWD_MATCH_Z, BOOST_PP_TUPLE_EAT(4))( \\\n            z \\\n          , BOOST_PP_TUPLE_ELEM(7,3,data) \\\n          , BOOST_PARAMETER_FUNCTION_PARAMETERS_NAME(BOOST_PP_TUPLE_ELEM(7,3,data)) \\\n          , n \\\n        ) \\\n    ) BOOST_PP_EXPR_IF(BOOST_PP_TUPLE_ELEM(7,4,data), const) \\\n    { \\\n        return BOOST_PARAMETER_IMPL(BOOST_PP_TUPLE_ELEM(7,3,data))( \\\n            BOOST_PARAMETER_FUNCTION_PARAMETERS_NAME(BOOST_PP_TUPLE_ELEM(7,3,data))()( \\\n                BOOST_PP_ENUM_PARAMS_Z(z, n, a) \\\n            ) \\\n        ); \\\n    }\n/**/\n\n# define BOOST_PARAMETER_FUNCTION_FWD_FUNCTION0(r, data, elem) \\\n    BOOST_PARAMETER_FUNCTION_FWD_FUNCTION00( \\\n        BOOST_PP_TUPLE_ELEM(7,0,data) \\\n      , BOOST_PP_TUPLE_ELEM(7,1,data) \\\n      , r \\\n      , data \\\n      , elem \\\n    )\n/**/\n\n# define BOOST_PARAMETER_FUNCTION_FWD_FUNCTION_ARITY_0(z, n, data) \\\n    BOOST_PARAMETER_FUNCTION_FWD_FUNCTION00( \\\n        z, n, BOOST_PP_DEDUCE_R() \\\n      , (z, n, BOOST_PP_TUPLE_REM(5) data) \\\n      , ~ \\\n    )\n/**/\n\n# define BOOST_PARAMETER_FUNCTION_FWD_FUNCTION_ARITY_N(z, n, data) \\\n    BOOST_PP_SEQ_FOR_EACH( \\\n        BOOST_PARAMETER_FUNCTION_FWD_FUNCTION0 \\\n      , (z, n, BOOST_PP_TUPLE_REM(5) data) \\\n      , BOOST_PP_SEQ_FOR_EACH_PRODUCT( \\\n            BOOST_PARAMETER_FUNCTION_FWD_PRODUCT \\\n          , BOOST_PP_SEQ_FIRST_N( \\\n                n, BOOST_PP_TUPLE_ELEM(5,3,data) \\\n            ) \\\n        ) \\\n    )\n/**/\n\n# define BOOST_PARAMETER_FUNCTION_FWD_FUNCTION(z, n, data) \\\n    BOOST_PP_IF( \\\n        n \\\n      , BOOST_PARAMETER_FUNCTION_FWD_FUNCTION_ARITY_N \\\n      , BOOST_PARAMETER_FUNCTION_FWD_FUNCTION_ARITY_0 \\\n    )(z,n,data) \\\n/**/\n\n# define BOOST_PARAMETER_FUNCTION_FWD_FUNCTIONS0( \\\n    result,name,args,const_,combinations,range \\\n) \\\n    BOOST_PP_REPEAT_FROM_TO( \\\n        BOOST_PP_TUPLE_ELEM(2,0,range), BOOST_PP_TUPLE_ELEM(2,1,range) \\\n      , BOOST_PARAMETER_FUNCTION_FWD_FUNCTION \\\n      , (result,name,const_,combinations,BOOST_PP_TUPLE_ELEM(2,1,range)) \\\n    )\n/**/\n\n# define BOOST_PARAMETER_FUNCTION_FWD_FUNCTIONS(result,name,args, const_, combinations) \\\n    BOOST_PARAMETER_FUNCTION_FWD_FUNCTIONS0( \\\n        result, name, args, const_, combinations, BOOST_PARAMETER_ARITY_RANGE(args) \\\n    )\n/**/\n\n// Builds boost::parameter::parameters<> specialization\n#  define BOOST_PARAMETER_FUNCTION_PARAMETERS_QUALIFIER_optional(tag) \\\n    optional<tag\n\n#  define BOOST_PARAMETER_FUNCTION_PARAMETERS_QUALIFIER_required(tag) \\\n    required<tag\n\n#  define BOOST_PARAMETER_FUNCTION_PARAMETERS_QUALIFIER_deduced_optional(tag) \\\n    optional<boost::parameter::deduced<tag>\n\n#  define BOOST_PARAMETER_FUNCTION_PARAMETERS_QUALIFIER_deduced_required(tag) \\\n    required<boost::parameter::deduced<tag>\n\n# if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))\n\n#  define BOOST_PARAMETER_FUNCTION_PARAMETERS_M(r,tag_namespace,i,elem) \\\n    BOOST_PP_COMMA_IF(i) \\\n    boost::parameter::BOOST_PP_CAT( \\\n        BOOST_PARAMETER_FUNCTION_PARAMETERS_QUALIFIER_ \\\n      , BOOST_PARAMETER_FN_ARG_QUALIFIER(elem) \\\n    )( \\\n        tag_namespace::BOOST_PARAMETER_FUNCTION_KEYWORD( \\\n            BOOST_PARAMETER_FN_ARG_KEYWORD(elem) \\\n        ) \\\n    ) \\\n      , typename boost::parameter::aux::unwrap_predicate< \\\n            void BOOST_PARAMETER_FN_ARG_PRED(elem) \\\n        >::type \\\n    >\n# elif BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))\n#  define BOOST_PARAMETER_FUNCTION_PARAMETERS_M(r,tag_namespace,i,elem) \\\n    BOOST_PP_COMMA_IF(i) \\\n    boost::parameter::BOOST_PP_CAT( \\\n        BOOST_PARAMETER_FUNCTION_PARAMETERS_QUALIFIER_ \\\n      , BOOST_PARAMETER_FN_ARG_QUALIFIER(elem) \\\n    )( \\\n        tag_namespace::BOOST_PARAMETER_FUNCTION_KEYWORD( \\\n            BOOST_PARAMETER_FN_ARG_KEYWORD(elem) \\\n        ) \\\n    ) \\\n      , boost::mpl::always<boost::mpl::true_> \\\n    >\n# endif\n\n# define BOOST_PARAMETER_FUNCTION_PARAMETERS(tag_namespace, base, args)             \\\n    template <class BoostParameterDummy>                                            \\\n    struct BOOST_PP_CAT(                                                            \\\n            BOOST_PP_CAT(boost_param_params_, __LINE__)                             \\\n          , BOOST_PARAMETER_MEMBER_FUNCTION_NAME(base)                              \\\n    ) : boost::parameter::parameters<                                               \\\n            BOOST_PP_SEQ_FOR_EACH_I(                                                \\\n                BOOST_PARAMETER_FUNCTION_PARAMETERS_M, tag_namespace, args          \\\n            )                                                                       \\\n        >                                                                           \\\n    {};                                                                             \\\n                                                                                    \\\n    typedef BOOST_PP_CAT( \\\n            BOOST_PP_CAT(boost_param_params_, __LINE__) \\\n          , BOOST_PARAMETER_MEMBER_FUNCTION_NAME(base) \\\n    )<int>\n\n// Defines result type metafunction\n# define BOOST_PARAMETER_FUNCTION_RESULT_ARG(z, _, i, x) \\\n    BOOST_PP_COMMA_IF(i) class BOOST_PP_TUPLE_ELEM(3,1,x)\n/**/\n\n# define BOOST_PARAMETER_FUNCTION_RESULT_(result, name, args)                                   \\\n    template <class Args>                                                                       \\\n    struct BOOST_PARAMETER_FUNCTION_RESULT_NAME(name)                                           \\\n    {                                                                                           \\\n        typedef typename BOOST_PARAMETER_PARENTHESIZED_TYPE(result) type;                       \\\n    };\n\n// Defines implementation function\n# define BOOST_PARAMETER_FUNCTION_IMPL_HEAD(name)           \\\n    template <class Args>                                   \\\n    typename BOOST_PARAMETER_FUNCTION_RESULT_NAME(name)<    \\\n       Args                                                 \\\n    >::type BOOST_PARAMETER_IMPL(name)(Args const& args)\n\n# define BOOST_PARAMETER_FUNCTION_IMPL_FWD(name) \\\n    BOOST_PARAMETER_FUNCTION_IMPL_HEAD(name);\n/**/\n\n# define BOOST_PARAMETER_FUNCTION_SPLIT_ARG_required(state, arg) \\\n    ( \\\n        BOOST_PP_INC(BOOST_PP_TUPLE_ELEM(4, 0, state)) \\\n      , BOOST_PP_SEQ_PUSH_BACK(BOOST_PP_TUPLE_ELEM(4, 1, state), arg) \\\n      , BOOST_PP_TUPLE_ELEM(4, 2, state) \\\n      , BOOST_PP_TUPLE_ELEM(4, 3, state) \\\n    )\n\n# define BOOST_PARAMETER_FUNCTION_SPLIT_ARG_deduced_required(state, arg) \\\n    BOOST_PARAMETER_FUNCTION_SPLIT_ARG_required(state, arg)\n\n# define BOOST_PARAMETER_FUNCTION_SPLIT_ARG_optional(state, arg) \\\n    ( \\\n        BOOST_PP_TUPLE_ELEM(4, 0, state) \\\n      , BOOST_PP_TUPLE_ELEM(4, 1, state) \\\n      , BOOST_PP_INC(BOOST_PP_TUPLE_ELEM(4, 2, state)) \\\n      , BOOST_PP_SEQ_PUSH_BACK(BOOST_PP_TUPLE_ELEM(4, 3, state), arg) \\\n    )\n\n# define BOOST_PARAMETER_FUNCTION_SPLIT_ARG_deduced_optional(state, arg) \\\n    BOOST_PARAMETER_FUNCTION_SPLIT_ARG_optional(state, arg)\n\n# define BOOST_PARAMETER_FUNCTION_SPLIT_ARG(s, state, arg) \\\n    BOOST_PP_CAT( \\\n        BOOST_PARAMETER_FUNCTION_SPLIT_ARG_ \\\n      , BOOST_PARAMETER_FN_ARG_QUALIFIER(arg) \\\n    )(state, arg)\n\n// Returns (required_count, required, optional_count, optionals) tuple\n# define BOOST_PARAMETER_FUNCTION_SPLIT_ARGS(args) \\\n    BOOST_PP_SEQ_FOLD_LEFT( \\\n        BOOST_PARAMETER_FUNCTION_SPLIT_ARG \\\n      , (0,BOOST_PP_SEQ_NIL, 0,BOOST_PP_SEQ_NIL) \\\n      , args \\\n    )\n\n# define BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_ARG_NAME(keyword) \\\n    BOOST_PP_CAT(BOOST_PP_CAT(keyword,_),type)\n\n// Helpers used as parameters to BOOST_PARAMETER_FUNCTION_DEFAULT_ARGUMENTS.\n# define BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_TEMPLATE_ARG(r, _, arg) \\\n    , class BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_ARG_NAME( \\\n              BOOST_PARAMETER_FN_ARG_KEYWORD(arg) \\\n      )\n\n# define BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_ARG(r, _, arg) \\\n    , BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_ARG_NAME( \\\n              BOOST_PARAMETER_FN_ARG_KEYWORD(arg) \\\n      )& BOOST_PARAMETER_FN_ARG_KEYWORD(arg)\n\n# define BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_PARAMETER(r, _, arg) \\\n    , BOOST_PARAMETER_FN_ARG_KEYWORD(arg)\n\n// Produces a name for the dispatch functions.\n# define BOOST_PARAMETER_FUNCTION_DEFAULT_NAME(name) \\\n    BOOST_PP_CAT( \\\n        boost_param_default_ \\\n      , BOOST_PP_CAT(__LINE__, BOOST_PARAMETER_MEMBER_FUNCTION_NAME(name)) \\\n    )\n\n// Helper macro used below to produce lists based on the keyword argument\n// names. macro is applied to every element. n is the number of\n// optional arguments that should be included.\n# define BOOST_PARAMETER_FUNCTION_DEFAULT_ARGUMENTS(macro, n, split_args) \\\n    BOOST_PP_SEQ_FOR_EACH( \\\n        macro \\\n      , ~ \\\n      , BOOST_PP_TUPLE_ELEM(4,1,split_args) \\\n    ) \\\n    BOOST_PP_SEQ_FOR_EACH( \\\n        macro \\\n      , ~ \\\n      , BOOST_PP_SEQ_FIRST_N( \\\n          BOOST_PP_SUB(BOOST_PP_TUPLE_ELEM(4,2,split_args), n) \\\n        , BOOST_PP_TUPLE_ELEM(4,3,split_args) \\\n        ) \\\n    )\n\n// Generates a keyword | default expression.\n# define BOOST_PARAMETER_FUNCTION_DEFAULT_EVAL_DEFAULT(arg, tag_namespace) \\\n    boost::parameter::keyword< \\\n        tag_namespace::BOOST_PARAMETER_FN_ARG_KEYWORD(arg) \\\n    >::instance | boost::parameter::aux::use_default_tag()\n\n# define BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_GET_ARG(arg, tag_ns) \\\n    BOOST_PARAMETER_FUNCTION_CAST( \\\n        args[ \\\n            BOOST_PARAMETER_FUNCTION_DEFAULT_EVAL_DEFAULT( \\\n                arg, tag_ns \\\n            ) \\\n        ] \\\n      , BOOST_PARAMETER_FN_ARG_PRED(arg) \\\n      , Args \\\n    )\n\n# define BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_BODY(name, n, split_args, tag_namespace) \\\n    { \\\n        return BOOST_PARAMETER_FUNCTION_DEFAULT_NAME(name)( \\\n            (ResultType(*)())0 \\\n          , args \\\n          , 0L \\\n            BOOST_PARAMETER_FUNCTION_DEFAULT_ARGUMENTS( \\\n                BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_PARAMETER \\\n              , n \\\n              , split_args \\\n            ) \\\n          , BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_GET_ARG( \\\n                BOOST_PP_SEQ_ELEM( \\\n                    BOOST_PP_SUB(BOOST_PP_TUPLE_ELEM(4,2,split_args), n) \\\n                  , BOOST_PP_TUPLE_ELEM(4,3,split_args) \\\n                ) \\\n              , tag_namespace \\\n            ) \\\n        ); \\\n    }\n\n# define BOOST_PARAMETER_FUNCTION_DEFAULT_EVAL_ACTUAL_DEFAULT(arg) \\\n    BOOST_PARAMETER_FUNCTION_CAST( \\\n        boost::parameter::aux::as_lvalue(BOOST_PARAMETER_FN_ARG_DEFAULT(arg), 0L) \\\n      , BOOST_PARAMETER_FN_ARG_PRED(arg) \\\n      , Args \\\n    )\n\n# define BOOST_PARAMETER_FUNCTION_DEFAULT_EVAL_DEFAULT_BODY(name, n, split_args, tag_ns, const_) \\\n    template < \\\n        class ResultType \\\n      , class Args \\\n        BOOST_PARAMETER_FUNCTION_DEFAULT_ARGUMENTS( \\\n            BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_TEMPLATE_ARG \\\n          , BOOST_PP_INC(n) \\\n          , split_args \\\n        ) \\\n    > \\\n    BOOST_PARAMETER_MEMBER_FUNCTION_STATIC(name) \\\n    ResultType BOOST_PARAMETER_FUNCTION_DEFAULT_NAME(name)( \\\n        ResultType(*)() \\\n      , Args const& args \\\n      , long \\\n        BOOST_PARAMETER_FUNCTION_DEFAULT_ARGUMENTS( \\\n            BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_ARG \\\n          , BOOST_PP_INC(n) \\\n          , split_args \\\n        ) \\\n      , boost::parameter::aux::use_default_tag \\\n    ) BOOST_PP_EXPR_IF(const_, const) \\\n    { \\\n        return BOOST_PARAMETER_FUNCTION_DEFAULT_NAME(name)( \\\n            (ResultType(*)())0 \\\n          , args \\\n          , 0L \\\n            BOOST_PARAMETER_FUNCTION_DEFAULT_ARGUMENTS( \\\n                BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_PARAMETER \\\n              , BOOST_PP_INC(n) \\\n              , split_args \\\n            ) \\\n          , BOOST_PARAMETER_FUNCTION_DEFAULT_EVAL_ACTUAL_DEFAULT( \\\n                BOOST_PP_SEQ_ELEM( \\\n                    BOOST_PP_SUB(BOOST_PP_TUPLE_ELEM(4,2,split_args), BOOST_PP_INC(n)) \\\n                  , BOOST_PP_TUPLE_ELEM(4,3,split_args) \\\n                ) \\\n            ) \\\n        ); \\\n    }\n\n// Produces a forwarding layer in the default evaluation machine.\n//\n// data is a tuple:\n//\n//   (name, split_args)\n//\n// Where name is the base name of the function, and split_args is a tuple:\n//\n//   (required_count, required_args, optional_count, required_args)\n//\n\n\n// defines the actual function body for BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION below.\n# define BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION0(z, n, data) \\\n    template < \\\n        class ResultType \\\n      , class Args \\\n        BOOST_PARAMETER_FUNCTION_DEFAULT_ARGUMENTS( \\\n            BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_TEMPLATE_ARG \\\n          , n \\\n          , BOOST_PP_TUPLE_ELEM(5,1,data) \\\n        ) \\\n    > \\\n    BOOST_PARAMETER_MEMBER_FUNCTION_STATIC(BOOST_PP_TUPLE_ELEM(5,0,data)) \\\n    ResultType BOOST_PARAMETER_FUNCTION_DEFAULT_NAME(BOOST_PP_TUPLE_ELEM(5,0,data))( \\\n        ResultType(*)() \\\n      , Args const& args \\\n      , int \\\n        BOOST_PARAMETER_FUNCTION_DEFAULT_ARGUMENTS( \\\n            BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_ARG \\\n          , n \\\n          , BOOST_PP_TUPLE_ELEM(5,1,data) \\\n        ) \\\n    ) BOOST_PP_EXPR_IF(BOOST_PP_TUPLE_ELEM(5,2,data), const) \\\n    BOOST_PP_IF( \\\n        n \\\n      , BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_BODY \\\n      , ; BOOST_PP_TUPLE_EAT(4) \\\n    )( \\\n        BOOST_PP_TUPLE_ELEM(5,0,data) \\\n      , n \\\n      , BOOST_PP_TUPLE_ELEM(5,1,data) \\\n      , BOOST_PP_TUPLE_ELEM(5,3,data) \\\n    )\n\n# define BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION(z, n, data) \\\n    BOOST_PP_IF( \\\n        BOOST_PP_AND( \\\n            BOOST_PP_NOT(n) \\\n          , BOOST_PP_TUPLE_ELEM(5,4,data) \\\n        ) \\\n      , BOOST_PP_TUPLE_EAT(3) \\\n      , BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION0 \\\n    )(z, n, data) \\\n    BOOST_PP_IF( \\\n        BOOST_PP_EQUAL(n, BOOST_PP_TUPLE_ELEM(4,2,BOOST_PP_TUPLE_ELEM(5,1,data))) \\\n      , BOOST_PP_TUPLE_EAT(5) \\\n      , BOOST_PARAMETER_FUNCTION_DEFAULT_EVAL_DEFAULT_BODY \\\n    )( \\\n        BOOST_PP_TUPLE_ELEM(5,0,data) \\\n      , n \\\n      , BOOST_PP_TUPLE_ELEM(5,1,data) \\\n      , BOOST_PP_TUPLE_ELEM(5,3,data) \\\n      , BOOST_PP_TUPLE_ELEM(5,2,data) \\\n    )\n\n# define BOOST_PARAMETER_FUNCTION_DEFAULT_GET_ARG(r, tag_ns, arg) \\\n    , BOOST_PARAMETER_FUNCTION_CAST( \\\n          args[ \\\n              boost::parameter::keyword<tag_ns::BOOST_PARAMETER_FN_ARG_KEYWORD(arg)>::instance \\\n          ] \\\n        , BOOST_PARAMETER_FN_ARG_PRED(arg) \\\n        , Args \\\n      )\n\n// Generates the function template that recives a ArgumentPack, and then\n// goes on to call the layers of overloads generated by \n// BOOST_PARAMETER_FUNCTION_DEFAULT_LAYER.\n# define BOOST_PARAMETER_FUNCTION_INITIAL_DISPATCH_FUNCTION(name, split_args, const_, tag_ns) \\\n    template <class Args> \\\n    typename BOOST_PARAMETER_FUNCTION_RESULT_NAME(name)<Args>::type \\\n    BOOST_PARAMETER_MEMBER_FUNCTION_STATIC(name) \\\n    BOOST_PARAMETER_IMPL(name)(Args const& args) BOOST_PP_EXPR_IF(const_, const) \\\n    { \\\n        return BOOST_PARAMETER_FUNCTION_DEFAULT_NAME(name)( \\\n            (typename BOOST_PARAMETER_FUNCTION_RESULT_NAME(name)<Args>::type(*)())0 \\\n          , args \\\n          , 0L \\\n \\\n            BOOST_PP_SEQ_FOR_EACH( \\\n                BOOST_PARAMETER_FUNCTION_DEFAULT_GET_ARG \\\n              , tag_ns \\\n              , BOOST_PP_TUPLE_ELEM(4,1,split_args) \\\n            ) \\\n \\\n        ); \\\n    }\n\n// Helper for BOOST_PARAMETER_FUNCTION_DEFAULT_LAYER below.\n# define BOOST_PARAMETER_FUNCTION_DEFAULT_LAYER_AUX( \\\n    name, split_args, skip_fwd_decl, const_, tag_namespace \\\n  ) \\\n    BOOST_PP_REPEAT_FROM_TO( \\\n        0 \\\n      , BOOST_PP_INC(BOOST_PP_TUPLE_ELEM(4, 2, split_args)) \\\n      , BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION \\\n      , (name, split_args, const_, tag_namespace, skip_fwd_decl) \\\n    ) \\\n \\\n    BOOST_PARAMETER_FUNCTION_INITIAL_DISPATCH_FUNCTION(name, split_args, const_, tag_namespace) \\\n\\\n    template < \\\n        class ResultType \\\n      , class Args \\\n        BOOST_PARAMETER_FUNCTION_DEFAULT_ARGUMENTS( \\\n            BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_TEMPLATE_ARG \\\n          , 0 \\\n          , split_args \\\n        ) \\\n    > \\\n    BOOST_PARAMETER_MEMBER_FUNCTION_STATIC(name) \\\n    ResultType BOOST_PARAMETER_FUNCTION_DEFAULT_NAME(name)( \\\n        ResultType(*)() \\\n      , Args const& \\\n      , int \\\n        BOOST_PARAMETER_FUNCTION_DEFAULT_ARGUMENTS( \\\n            BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_ARG \\\n          , 0 \\\n          , split_args \\\n        ) \\\n    ) BOOST_PP_EXPR_IF(const_, const)\n\n// Generates a bunch of forwarding functions that each extract\n// one more argument.\n# define BOOST_PARAMETER_FUNCTION_DEFAULT_LAYER(name, args, skip_fwd_decl, const_, tag_ns) \\\n    BOOST_PARAMETER_FUNCTION_DEFAULT_LAYER_AUX( \\\n        name, BOOST_PARAMETER_FUNCTION_SPLIT_ARGS(args), skip_fwd_decl, const_, tag_ns \\\n    )\n/**/\n\n// Defines the result metafunction and the parameters specialization.\n# define BOOST_PARAMETER_FUNCTION_HEAD(result, name, tag_namespace, args)   \\\n      BOOST_PARAMETER_FUNCTION_RESULT_(result, name, args)                   \\\n                                                                            \\\n          BOOST_PARAMETER_FUNCTION_PARAMETERS(tag_namespace, name, args)    \\\n          BOOST_PARAMETER_FUNCTION_PARAMETERS_NAME(name);                   \\\n\n// Helper for BOOST_PARAMETER_FUNCTION below.\n# define BOOST_PARAMETER_FUNCTION_AUX(result, name, tag_namespace, args)    \\\n    BOOST_PARAMETER_FUNCTION_HEAD(result, name, tag_namespace, args)         \\\n    BOOST_PARAMETER_FUNCTION_IMPL_HEAD(name); \\\n\\\n    BOOST_PARAMETER_FUNCTION_FWD_FUNCTIONS(                                  \\\n        result, name, args, 0                                                \\\n      , BOOST_PARAMETER_FUNCTION_FWD_COMBINATIONS(args)                      \\\n    )                                                                        \\\n                                                                             \\\n    BOOST_PARAMETER_FUNCTION_DEFAULT_LAYER(name, args, 0, 0, tag_namespace)\n\n// Defines a Boost.Parameter enabled function with the new syntax.\n# define BOOST_PARAMETER_FUNCTION(result, name, tag_namespace, args)    \\\n    BOOST_PARAMETER_FUNCTION_AUX(                                       \\\n        result, name, tag_namespace                                      \\\n      , BOOST_PARAMETER_FLATTEN(3, 2, 3, args)                           \\\n    )                                                                    \\\n/**/\n\n// Defines a Boost.Parameter enabled function.\n# define BOOST_PARAMETER_BASIC_FUNCTION_AUX(result, name, tag_namespace, args)    \\\n    BOOST_PARAMETER_FUNCTION_HEAD(result, name, tag_namespace, args)        \\\n                                                                            \\\n    BOOST_PARAMETER_FUNCTION_IMPL_FWD(name)                                 \\\n                                                                            \\\n    BOOST_PARAMETER_FUNCTION_FWD_FUNCTIONS(                                 \\\n        result, name, args, 0                                               \\\n      , BOOST_PARAMETER_FUNCTION_FWD_COMBINATIONS(args)                     \\\n    )                                                                       \\\n                                                                            \\\n    BOOST_PARAMETER_FUNCTION_IMPL_HEAD(name)\n\n# define BOOST_PARAMETER_BASIC_FUNCTION(result, name, tag_namespace, args)  \\\n    BOOST_PARAMETER_BASIC_FUNCTION_AUX(                                     \\\n        result, name, tag_namespace                                     \\\n      , BOOST_PARAMETER_FLATTEN(2, 2, 3, args)                          \\\n    )                                                                   \\\n/**/\n\n// Defines a Boost.Parameter enabled member function.\n# define BOOST_PARAMETER_BASIC_MEMBER_FUNCTION_AUX(result, name, tag_namespace, args, const_) \\\n    BOOST_PARAMETER_FUNCTION_HEAD(result, name, tag_namespace, args)                    \\\n                                                                                        \\\n    BOOST_PARAMETER_FUNCTION_FWD_FUNCTIONS(                                             \\\n        result, name, args, const_                                                      \\\n      , BOOST_PARAMETER_FUNCTION_FWD_COMBINATIONS(args)                                 \\\n    )                                                                                   \\\n                                                                                        \\\n    BOOST_PARAMETER_FUNCTION_IMPL_HEAD(name) BOOST_PP_EXPR_IF(const_, const)            \\\n/**/\n\n# define BOOST_PARAMETER_BASIC_MEMBER_FUNCTION(result, name, tag_namespace, args) \\\n    BOOST_PARAMETER_BASIC_MEMBER_FUNCTION_AUX( \\\n        result, name, tag_namespace \\\n      , BOOST_PARAMETER_FLATTEN(2, 2, 3, args) \\\n      , 0 \\\n    )\n/**/\n\n# define BOOST_PARAMETER_BASIC_CONST_MEMBER_FUNCTION(result, name, tag_namespace, args) \\\n    BOOST_PARAMETER_BASIC_MEMBER_FUNCTION_AUX( \\\n        result, name, tag_namespace \\\n      , BOOST_PARAMETER_FLATTEN(2, 2, 3, args) \\\n      , 1 \\\n    )\n/**/\n\n\n\n# define BOOST_PARAMETER_MEMBER_FUNCTION_AUX(result, name, tag_namespace, const_, args)    \\\n    BOOST_PARAMETER_FUNCTION_HEAD(result, name, tag_namespace, args)         \\\n\\\n    BOOST_PARAMETER_FUNCTION_FWD_FUNCTIONS(                                  \\\n        result, name, args, const_                                           \\\n      , BOOST_PARAMETER_FUNCTION_FWD_COMBINATIONS(args)                      \\\n    )                                                                        \\\n                                                                             \\\n    BOOST_PARAMETER_FUNCTION_DEFAULT_LAYER(name, args, 1, const_, tag_namespace)\n\n// Defines a Boost.Parameter enabled function with the new syntax.\n# define BOOST_PARAMETER_MEMBER_FUNCTION(result, name, tag_namespace, args)    \\\n    BOOST_PARAMETER_MEMBER_FUNCTION_AUX(                                       \\\n        result, name, tag_namespace, 0                                     \\\n      , BOOST_PARAMETER_FLATTEN(3, 2, 3, args)                           \\\n    )                                                                    \\\n/**/\n\n# define BOOST_PARAMETER_CONST_MEMBER_FUNCTION(result, name, tag_namespace, args)    \\\n    BOOST_PARAMETER_MEMBER_FUNCTION_AUX(                                       \\\n        result, name, tag_namespace, 1                                     \\\n      , BOOST_PARAMETER_FLATTEN(3, 2, 3, args)                           \\\n    )                                                                    \\\n/**/\n\n// Defines a Boost.Parameter enabled constructor.\n\n# define BOOST_PARAMETER_FUNCTION_ARGUMENT(r, _, i, elem) \\\n    BOOST_PP_COMMA_IF(i) elem& BOOST_PP_CAT(a, i)\n/**/\n\n# define BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTOR00(z, n, r, data, elem) \\\n    BOOST_PP_IF( \\\n        n \\\n      , BOOST_PARAMETER_FUNCTION_FWD_FUNCTION_TEMPLATE_Z, BOOST_PP_TUPLE_EAT(2) \\\n    )(z, n) \\\n    BOOST_PP_EXPR_IF(BOOST_PP_EQUAL(n,1), explicit) \\\n    BOOST_PP_TUPLE_ELEM(6,2,data)( \\\n        BOOST_PP_IF( \\\n            n \\\n          , BOOST_PP_SEQ_FOR_EACH_I_R \\\n          , BOOST_PP_TUPLE_EAT(4) \\\n        )( \\\n            r \\\n          , BOOST_PARAMETER_FUNCTION_ARGUMENT \\\n          , ~ \\\n          , elem \\\n        ) \\\n        BOOST_PP_IF(n, BOOST_PARAMETER_FUNCTION_FWD_MATCH_Z, BOOST_PP_TUPLE_EAT(4))( \\\n            z \\\n          , BOOST_PP_TUPLE_ELEM(6,3,data) \\\n          , BOOST_PP_CAT(constructor_parameters, __LINE__) \\\n          , n \\\n        ) \\\n    ) \\\n      : BOOST_PARAMETER_PARENTHESIZED_TYPE(BOOST_PP_TUPLE_ELEM(6,3,data)) ( \\\n            BOOST_PP_CAT(constructor_parameters, __LINE__)()( \\\n                BOOST_PP_ENUM_PARAMS_Z(z, n, a) \\\n            ) \\\n        ) \\\n    {}\n/**/\n\n# define BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTOR0(r, data, elem) \\\n    BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTOR00( \\\n        BOOST_PP_TUPLE_ELEM(6,0,data) \\\n      , BOOST_PP_TUPLE_ELEM(6,1,data) \\\n      , r \\\n      , data \\\n      , elem \\\n    )\n/**/\n\n# define BOOST_PARAMETER_FUNCTION_FWD_PRODUCT(r, product) \\\n    (product)\n/**/\n\n# define BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTOR_ARITY_0(z, n, data) \\\n    BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTOR00( \\\n        z, n, BOOST_PP_DEDUCE_R() \\\n      , (z, n, BOOST_PP_TUPLE_REM(4) data) \\\n      , ~ \\\n    )\n/**/\n\n# define BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTOR_ARITY_N(z, n, data) \\\n    BOOST_PP_SEQ_FOR_EACH( \\\n        BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTOR0 \\\n      , (z, n, BOOST_PP_TUPLE_REM(4) data) \\\n      , BOOST_PP_SEQ_FOR_EACH_PRODUCT( \\\n            BOOST_PARAMETER_FUNCTION_FWD_PRODUCT \\\n          , BOOST_PP_SEQ_FIRST_N( \\\n                n, BOOST_PP_TUPLE_ELEM(4,2,data) \\\n            ) \\\n        ) \\\n    )\n/**/\n\n# define BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTOR(z, n, data) \\\n    BOOST_PP_IF( \\\n        n \\\n      , BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTOR_ARITY_N \\\n      , BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTOR_ARITY_0 \\\n    )(z,n,data) \\\n/**/\n\n# define BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTORS0(class_,base,args,combinations,range) \\\n    BOOST_PP_REPEAT_FROM_TO( \\\n        BOOST_PP_TUPLE_ELEM(2,0,range), BOOST_PP_TUPLE_ELEM(2,1,range) \\\n      , BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTOR \\\n      , (class_,base,combinations,BOOST_PP_TUPLE_ELEM(2,1,range)) \\\n    )\n/**/\n\n# define BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTORS(class_,base,args,combinations) \\\n    BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTORS0( \\\n        class_, base, args, combinations, BOOST_PARAMETER_ARITY_RANGE(args) \\\n    )\n/**/\n\n# define BOOST_PARAMETER_CONSTRUCTOR_AUX(class_, base, tag_namespace, args) \\\n    BOOST_PARAMETER_FUNCTION_PARAMETERS(tag_namespace, ctor, args)          \\\n        BOOST_PP_CAT(constructor_parameters, __LINE__); \\\n\\\n    BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTORS( \\\n        class_, base, args \\\n      , BOOST_PARAMETER_FUNCTION_FWD_COMBINATIONS(args) \\\n    ) \\\n/**/\n\n# define BOOST_PARAMETER_CONSTRUCTOR(class_, base, tag_namespace, args) \\\n    BOOST_PARAMETER_CONSTRUCTOR_AUX( \\\n        class_, base, tag_namespace \\\n      , BOOST_PARAMETER_FLATTEN(2, 2, 3, args) \\\n    )\n/**/\n\n# ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING\n#  define BOOST_PARAMETER_FUNCTION_FWD_COMBINATION(r, _, i, elem) \\\n    (BOOST_PP_IF( \\\n        BOOST_PARAMETER_FUNCTION_IS_KEYWORD_QUALIFIER( \\\n            BOOST_PARAMETER_FN_ARG_NAME(elem) \\\n        ) \\\n      , (const ParameterArgumentType ## i)(ParameterArgumentType ## i) \\\n      , (const ParameterArgumentType ## i) \\\n    ))\n// No partial ordering. This feature doesn't work.\n# else\n#  define BOOST_PARAMETER_FUNCTION_FWD_COMBINATION(r, _, i, elem) \\\n    (BOOST_PP_IF( \\\n        BOOST_PARAMETER_FUNCTION_IS_KEYWORD_QUALIFIER( \\\n            BOOST_PARAMETER_FN_ARG_NAME(elem) \\\n        ) \\\n      , (ParameterArgumentType ## i) \\\n      , (const ParameterArgumentType ## i) \\\n    ))\n# endif\n\n# define BOOST_PARAMETER_FUNCTION_FWD_COMBINATIONS(args) \\\n    BOOST_PP_SEQ_FOR_EACH_I(BOOST_PARAMETER_FUNCTION_FWD_COMBINATION, ~, args)\n\n#endif // BOOST_PARAMETER_PREPROCESSOR_060206_HPP\n\n"
  },
  {
    "path": "benchmarks/boost/parameter/value_type.hpp",
    "content": "// Copyright Daniel Wallin 2006. Use, modification and distribution is\n// subject to the Boost Software License, Version 1.0. (See accompanying\n// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_PARAMETER_VALUE_TYPE_060921_HPP\n# define BOOST_PARAMETER_VALUE_TYPE_060921_HPP\n\n# include <boost/mpl/apply.hpp>\n# include <boost/mpl/assert.hpp>\n# include <boost/mpl/and.hpp>\n# include <boost/parameter/aux_/result_of0.hpp>\n# include <boost/parameter/aux_/void.hpp>\n# include <boost/type_traits/is_same.hpp>\n\nnamespace boost { namespace parameter { \n\n// A metafunction that, given an argument pack, returns the type of\n// the parameter identified by the given keyword.  If no such\n// parameter has been specified, returns Default\n\n# if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))\ntemplate <class Parameters, class Keyword, class Default>\nstruct value_type0\n{\n    typedef typename mpl::apply_wrap3<\n        typename Parameters::binding,Keyword,Default,mpl::false_\n    >::type type;\n\n    BOOST_MPL_ASSERT_NOT((\n        mpl::and_<\n            is_same<Default, void_>\n          , is_same<type, void_>\n        >\n    ));\n};\n# endif\n\ntemplate <class Parameters, class Keyword, class Default = void_>\nstruct value_type\n{\n# if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))\n    typedef typename mpl::eval_if<\n        mpl::is_placeholder<Parameters>\n      , mpl::identity<int>\n      , value_type0<Parameters,Keyword,Default>\n    >::type type;\n# else\n    typedef typename mpl::apply_wrap3<\n        typename Parameters::binding,Keyword,Default,mpl::false_\n    >::type type;\n\n    BOOST_MPL_ASSERT_NOT((\n        mpl::and_<\n            is_same<Default, void_>\n          , is_same<type, void_>\n        >\n    ));\n# endif\n\n    BOOST_MPL_AUX_LAMBDA_SUPPORT(3,value_type,(Parameters,Keyword,Default))\n};\n\n// A metafunction that, given an argument pack, returns the type of\n// the parameter identified by the given keyword.  If no such\n// parameter has been specified, returns the type returned by invoking\n// DefaultFn\ntemplate <class Parameters, class Keyword, class DefaultFn>\nstruct lazy_value_type\n{\n  typedef typename mpl::apply_wrap3<\n      typename Parameters::binding\n    , Keyword\n    , typename aux::result_of0<DefaultFn>::type\n    , mpl::false_\n  >::type type;\n};\n\n\n}} // namespace boost::parameter\n\n#endif // BOOST_PARAMETER_VALUE_TYPE_060921_HPP\n\n"
  },
  {
    "path": "benchmarks/boost/parameter.hpp",
    "content": "// Copyright David Abrahams, Daniel Wallin 2005. Use, modification and \n// distribution is subject to the Boost Software License, Version 1.0. \n// (See accompanying file LICENSE_1_0.txt or copy at \n// http://www.boost.org/LICENSE_1_0.txt)\n\n//  See www.boost.org/libs/parameter for documentation.\n\n#ifndef BOOST_PARAMETER_050401_HPP\n#define BOOST_PARAMETER_050401_HPP\n\n#include <boost/parameter/parameters.hpp>\n#include <boost/parameter/keyword.hpp>\n#include <boost/parameter/binding.hpp>\n#include <boost/parameter/value_type.hpp>\n#include <boost/parameter/macros.hpp>\n#include <boost/parameter/match.hpp>\n#include <boost/parameter/name.hpp>\n#include <boost/parameter/preprocessor.hpp>\n\n#endif // BOOST_PARAMETER_050401_HPP\n\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/arithmetic/add.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ARITHMETIC_ADD_HPP\n# define BOOST_PREPROCESSOR_ARITHMETIC_ADD_HPP\n#\n# include <boost/preprocessor/arithmetic/dec.hpp>\n# include <boost/preprocessor/arithmetic/inc.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/while.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n#\n# /* BOOST_PP_ADD */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ADD(x, y) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE(BOOST_PP_ADD_P, BOOST_PP_ADD_O, (x, y)))\n# else\n#    define BOOST_PP_ADD(x, y) BOOST_PP_ADD_I(x, y)\n#    define BOOST_PP_ADD_I(x, y) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE(BOOST_PP_ADD_P, BOOST_PP_ADD_O, (x, y)))\n# endif\n#\n# define BOOST_PP_ADD_P(d, xy) BOOST_PP_TUPLE_ELEM(2, 1, xy)\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_ADD_O(d, xy) BOOST_PP_ADD_O_I xy\n# else\n#    define BOOST_PP_ADD_O(d, xy) BOOST_PP_ADD_O_I(BOOST_PP_TUPLE_ELEM(2, 0, xy), BOOST_PP_TUPLE_ELEM(2, 1, xy))\n# endif\n#\n# define BOOST_PP_ADD_O_I(x, y) (BOOST_PP_INC(x), BOOST_PP_DEC(y))\n#\n# /* BOOST_PP_ADD_D */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ADD_D(d, x, y) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE_ ## d(BOOST_PP_ADD_P, BOOST_PP_ADD_O, (x, y)))\n# else\n#    define BOOST_PP_ADD_D(d, x, y) BOOST_PP_ADD_D_I(d, x, y)\n#    define BOOST_PP_ADD_D_I(d, x, y) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE_ ## d(BOOST_PP_ADD_P, BOOST_PP_ADD_O, (x, y)))\n# endif\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/arithmetic/dec.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ARITHMETIC_DEC_HPP\n# define BOOST_PREPROCESSOR_ARITHMETIC_DEC_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_DEC */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_DEC(x) BOOST_PP_DEC_I(x)\n# else\n#    define BOOST_PP_DEC(x) BOOST_PP_DEC_OO((x))\n#    define BOOST_PP_DEC_OO(par) BOOST_PP_DEC_I ## par\n# endif\n#\n# define BOOST_PP_DEC_I(x) BOOST_PP_DEC_ ## x\n#\n# define BOOST_PP_DEC_0 0\n# define BOOST_PP_DEC_1 0\n# define BOOST_PP_DEC_2 1\n# define BOOST_PP_DEC_3 2\n# define BOOST_PP_DEC_4 3\n# define BOOST_PP_DEC_5 4\n# define BOOST_PP_DEC_6 5\n# define BOOST_PP_DEC_7 6\n# define BOOST_PP_DEC_8 7\n# define BOOST_PP_DEC_9 8\n# define BOOST_PP_DEC_10 9\n# define BOOST_PP_DEC_11 10\n# define BOOST_PP_DEC_12 11\n# define BOOST_PP_DEC_13 12\n# define BOOST_PP_DEC_14 13\n# define BOOST_PP_DEC_15 14\n# define BOOST_PP_DEC_16 15\n# define BOOST_PP_DEC_17 16\n# define BOOST_PP_DEC_18 17\n# define BOOST_PP_DEC_19 18\n# define BOOST_PP_DEC_20 19\n# define BOOST_PP_DEC_21 20\n# define BOOST_PP_DEC_22 21\n# define BOOST_PP_DEC_23 22\n# define BOOST_PP_DEC_24 23\n# define BOOST_PP_DEC_25 24\n# define BOOST_PP_DEC_26 25\n# define BOOST_PP_DEC_27 26\n# define BOOST_PP_DEC_28 27\n# define BOOST_PP_DEC_29 28\n# define BOOST_PP_DEC_30 29\n# define BOOST_PP_DEC_31 30\n# define BOOST_PP_DEC_32 31\n# define BOOST_PP_DEC_33 32\n# define BOOST_PP_DEC_34 33\n# define BOOST_PP_DEC_35 34\n# define BOOST_PP_DEC_36 35\n# define BOOST_PP_DEC_37 36\n# define BOOST_PP_DEC_38 37\n# define BOOST_PP_DEC_39 38\n# define BOOST_PP_DEC_40 39\n# define BOOST_PP_DEC_41 40\n# define BOOST_PP_DEC_42 41\n# define BOOST_PP_DEC_43 42\n# define BOOST_PP_DEC_44 43\n# define BOOST_PP_DEC_45 44\n# define BOOST_PP_DEC_46 45\n# define BOOST_PP_DEC_47 46\n# define BOOST_PP_DEC_48 47\n# define BOOST_PP_DEC_49 48\n# define BOOST_PP_DEC_50 49\n# define BOOST_PP_DEC_51 50\n# define BOOST_PP_DEC_52 51\n# define BOOST_PP_DEC_53 52\n# define BOOST_PP_DEC_54 53\n# define BOOST_PP_DEC_55 54\n# define BOOST_PP_DEC_56 55\n# define BOOST_PP_DEC_57 56\n# define BOOST_PP_DEC_58 57\n# define BOOST_PP_DEC_59 58\n# define BOOST_PP_DEC_60 59\n# define BOOST_PP_DEC_61 60\n# define BOOST_PP_DEC_62 61\n# define BOOST_PP_DEC_63 62\n# define BOOST_PP_DEC_64 63\n# define BOOST_PP_DEC_65 64\n# define BOOST_PP_DEC_66 65\n# define BOOST_PP_DEC_67 66\n# define BOOST_PP_DEC_68 67\n# define BOOST_PP_DEC_69 68\n# define BOOST_PP_DEC_70 69\n# define BOOST_PP_DEC_71 70\n# define BOOST_PP_DEC_72 71\n# define BOOST_PP_DEC_73 72\n# define BOOST_PP_DEC_74 73\n# define BOOST_PP_DEC_75 74\n# define BOOST_PP_DEC_76 75\n# define BOOST_PP_DEC_77 76\n# define BOOST_PP_DEC_78 77\n# define BOOST_PP_DEC_79 78\n# define BOOST_PP_DEC_80 79\n# define BOOST_PP_DEC_81 80\n# define BOOST_PP_DEC_82 81\n# define BOOST_PP_DEC_83 82\n# define BOOST_PP_DEC_84 83\n# define BOOST_PP_DEC_85 84\n# define BOOST_PP_DEC_86 85\n# define BOOST_PP_DEC_87 86\n# define BOOST_PP_DEC_88 87\n# define BOOST_PP_DEC_89 88\n# define BOOST_PP_DEC_90 89\n# define BOOST_PP_DEC_91 90\n# define BOOST_PP_DEC_92 91\n# define BOOST_PP_DEC_93 92\n# define BOOST_PP_DEC_94 93\n# define BOOST_PP_DEC_95 94\n# define BOOST_PP_DEC_96 95\n# define BOOST_PP_DEC_97 96\n# define BOOST_PP_DEC_98 97\n# define BOOST_PP_DEC_99 98\n# define BOOST_PP_DEC_100 99\n# define BOOST_PP_DEC_101 100\n# define BOOST_PP_DEC_102 101\n# define BOOST_PP_DEC_103 102\n# define BOOST_PP_DEC_104 103\n# define BOOST_PP_DEC_105 104\n# define BOOST_PP_DEC_106 105\n# define BOOST_PP_DEC_107 106\n# define BOOST_PP_DEC_108 107\n# define BOOST_PP_DEC_109 108\n# define BOOST_PP_DEC_110 109\n# define BOOST_PP_DEC_111 110\n# define BOOST_PP_DEC_112 111\n# define BOOST_PP_DEC_113 112\n# define BOOST_PP_DEC_114 113\n# define BOOST_PP_DEC_115 114\n# define BOOST_PP_DEC_116 115\n# define BOOST_PP_DEC_117 116\n# define BOOST_PP_DEC_118 117\n# define BOOST_PP_DEC_119 118\n# define BOOST_PP_DEC_120 119\n# define BOOST_PP_DEC_121 120\n# define BOOST_PP_DEC_122 121\n# define BOOST_PP_DEC_123 122\n# define BOOST_PP_DEC_124 123\n# define BOOST_PP_DEC_125 124\n# define BOOST_PP_DEC_126 125\n# define BOOST_PP_DEC_127 126\n# define BOOST_PP_DEC_128 127\n# define BOOST_PP_DEC_129 128\n# define BOOST_PP_DEC_130 129\n# define BOOST_PP_DEC_131 130\n# define BOOST_PP_DEC_132 131\n# define BOOST_PP_DEC_133 132\n# define BOOST_PP_DEC_134 133\n# define BOOST_PP_DEC_135 134\n# define BOOST_PP_DEC_136 135\n# define BOOST_PP_DEC_137 136\n# define BOOST_PP_DEC_138 137\n# define BOOST_PP_DEC_139 138\n# define BOOST_PP_DEC_140 139\n# define BOOST_PP_DEC_141 140\n# define BOOST_PP_DEC_142 141\n# define BOOST_PP_DEC_143 142\n# define BOOST_PP_DEC_144 143\n# define BOOST_PP_DEC_145 144\n# define BOOST_PP_DEC_146 145\n# define BOOST_PP_DEC_147 146\n# define BOOST_PP_DEC_148 147\n# define BOOST_PP_DEC_149 148\n# define BOOST_PP_DEC_150 149\n# define BOOST_PP_DEC_151 150\n# define BOOST_PP_DEC_152 151\n# define BOOST_PP_DEC_153 152\n# define BOOST_PP_DEC_154 153\n# define BOOST_PP_DEC_155 154\n# define BOOST_PP_DEC_156 155\n# define BOOST_PP_DEC_157 156\n# define BOOST_PP_DEC_158 157\n# define BOOST_PP_DEC_159 158\n# define BOOST_PP_DEC_160 159\n# define BOOST_PP_DEC_161 160\n# define BOOST_PP_DEC_162 161\n# define BOOST_PP_DEC_163 162\n# define BOOST_PP_DEC_164 163\n# define BOOST_PP_DEC_165 164\n# define BOOST_PP_DEC_166 165\n# define BOOST_PP_DEC_167 166\n# define BOOST_PP_DEC_168 167\n# define BOOST_PP_DEC_169 168\n# define BOOST_PP_DEC_170 169\n# define BOOST_PP_DEC_171 170\n# define BOOST_PP_DEC_172 171\n# define BOOST_PP_DEC_173 172\n# define BOOST_PP_DEC_174 173\n# define BOOST_PP_DEC_175 174\n# define BOOST_PP_DEC_176 175\n# define BOOST_PP_DEC_177 176\n# define BOOST_PP_DEC_178 177\n# define BOOST_PP_DEC_179 178\n# define BOOST_PP_DEC_180 179\n# define BOOST_PP_DEC_181 180\n# define BOOST_PP_DEC_182 181\n# define BOOST_PP_DEC_183 182\n# define BOOST_PP_DEC_184 183\n# define BOOST_PP_DEC_185 184\n# define BOOST_PP_DEC_186 185\n# define BOOST_PP_DEC_187 186\n# define BOOST_PP_DEC_188 187\n# define BOOST_PP_DEC_189 188\n# define BOOST_PP_DEC_190 189\n# define BOOST_PP_DEC_191 190\n# define BOOST_PP_DEC_192 191\n# define BOOST_PP_DEC_193 192\n# define BOOST_PP_DEC_194 193\n# define BOOST_PP_DEC_195 194\n# define BOOST_PP_DEC_196 195\n# define BOOST_PP_DEC_197 196\n# define BOOST_PP_DEC_198 197\n# define BOOST_PP_DEC_199 198\n# define BOOST_PP_DEC_200 199\n# define BOOST_PP_DEC_201 200\n# define BOOST_PP_DEC_202 201\n# define BOOST_PP_DEC_203 202\n# define BOOST_PP_DEC_204 203\n# define BOOST_PP_DEC_205 204\n# define BOOST_PP_DEC_206 205\n# define BOOST_PP_DEC_207 206\n# define BOOST_PP_DEC_208 207\n# define BOOST_PP_DEC_209 208\n# define BOOST_PP_DEC_210 209\n# define BOOST_PP_DEC_211 210\n# define BOOST_PP_DEC_212 211\n# define BOOST_PP_DEC_213 212\n# define BOOST_PP_DEC_214 213\n# define BOOST_PP_DEC_215 214\n# define BOOST_PP_DEC_216 215\n# define BOOST_PP_DEC_217 216\n# define BOOST_PP_DEC_218 217\n# define BOOST_PP_DEC_219 218\n# define BOOST_PP_DEC_220 219\n# define BOOST_PP_DEC_221 220\n# define BOOST_PP_DEC_222 221\n# define BOOST_PP_DEC_223 222\n# define BOOST_PP_DEC_224 223\n# define BOOST_PP_DEC_225 224\n# define BOOST_PP_DEC_226 225\n# define BOOST_PP_DEC_227 226\n# define BOOST_PP_DEC_228 227\n# define BOOST_PP_DEC_229 228\n# define BOOST_PP_DEC_230 229\n# define BOOST_PP_DEC_231 230\n# define BOOST_PP_DEC_232 231\n# define BOOST_PP_DEC_233 232\n# define BOOST_PP_DEC_234 233\n# define BOOST_PP_DEC_235 234\n# define BOOST_PP_DEC_236 235\n# define BOOST_PP_DEC_237 236\n# define BOOST_PP_DEC_238 237\n# define BOOST_PP_DEC_239 238\n# define BOOST_PP_DEC_240 239\n# define BOOST_PP_DEC_241 240\n# define BOOST_PP_DEC_242 241\n# define BOOST_PP_DEC_243 242\n# define BOOST_PP_DEC_244 243\n# define BOOST_PP_DEC_245 244\n# define BOOST_PP_DEC_246 245\n# define BOOST_PP_DEC_247 246\n# define BOOST_PP_DEC_248 247\n# define BOOST_PP_DEC_249 248\n# define BOOST_PP_DEC_250 249\n# define BOOST_PP_DEC_251 250\n# define BOOST_PP_DEC_252 251\n# define BOOST_PP_DEC_253 252\n# define BOOST_PP_DEC_254 253\n# define BOOST_PP_DEC_255 254\n# define BOOST_PP_DEC_256 255\n# define BOOST_PP_DEC_257 256\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/arithmetic/inc.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ARITHMETIC_INC_HPP\n# define BOOST_PREPROCESSOR_ARITHMETIC_INC_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_INC */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_INC(x) BOOST_PP_INC_I(x)\n# else\n#    define BOOST_PP_INC(x) BOOST_PP_INC_OO((x))\n#    define BOOST_PP_INC_OO(par) BOOST_PP_INC_I ## par\n# endif\n#\n# define BOOST_PP_INC_I(x) BOOST_PP_INC_ ## x\n#\n# define BOOST_PP_INC_0 1\n# define BOOST_PP_INC_1 2\n# define BOOST_PP_INC_2 3\n# define BOOST_PP_INC_3 4\n# define BOOST_PP_INC_4 5\n# define BOOST_PP_INC_5 6\n# define BOOST_PP_INC_6 7\n# define BOOST_PP_INC_7 8\n# define BOOST_PP_INC_8 9\n# define BOOST_PP_INC_9 10\n# define BOOST_PP_INC_10 11\n# define BOOST_PP_INC_11 12\n# define BOOST_PP_INC_12 13\n# define BOOST_PP_INC_13 14\n# define BOOST_PP_INC_14 15\n# define BOOST_PP_INC_15 16\n# define BOOST_PP_INC_16 17\n# define BOOST_PP_INC_17 18\n# define BOOST_PP_INC_18 19\n# define BOOST_PP_INC_19 20\n# define BOOST_PP_INC_20 21\n# define BOOST_PP_INC_21 22\n# define BOOST_PP_INC_22 23\n# define BOOST_PP_INC_23 24\n# define BOOST_PP_INC_24 25\n# define BOOST_PP_INC_25 26\n# define BOOST_PP_INC_26 27\n# define BOOST_PP_INC_27 28\n# define BOOST_PP_INC_28 29\n# define BOOST_PP_INC_29 30\n# define BOOST_PP_INC_30 31\n# define BOOST_PP_INC_31 32\n# define BOOST_PP_INC_32 33\n# define BOOST_PP_INC_33 34\n# define BOOST_PP_INC_34 35\n# define BOOST_PP_INC_35 36\n# define BOOST_PP_INC_36 37\n# define BOOST_PP_INC_37 38\n# define BOOST_PP_INC_38 39\n# define BOOST_PP_INC_39 40\n# define BOOST_PP_INC_40 41\n# define BOOST_PP_INC_41 42\n# define BOOST_PP_INC_42 43\n# define BOOST_PP_INC_43 44\n# define BOOST_PP_INC_44 45\n# define BOOST_PP_INC_45 46\n# define BOOST_PP_INC_46 47\n# define BOOST_PP_INC_47 48\n# define BOOST_PP_INC_48 49\n# define BOOST_PP_INC_49 50\n# define BOOST_PP_INC_50 51\n# define BOOST_PP_INC_51 52\n# define BOOST_PP_INC_52 53\n# define BOOST_PP_INC_53 54\n# define BOOST_PP_INC_54 55\n# define BOOST_PP_INC_55 56\n# define BOOST_PP_INC_56 57\n# define BOOST_PP_INC_57 58\n# define BOOST_PP_INC_58 59\n# define BOOST_PP_INC_59 60\n# define BOOST_PP_INC_60 61\n# define BOOST_PP_INC_61 62\n# define BOOST_PP_INC_62 63\n# define BOOST_PP_INC_63 64\n# define BOOST_PP_INC_64 65\n# define BOOST_PP_INC_65 66\n# define BOOST_PP_INC_66 67\n# define BOOST_PP_INC_67 68\n# define BOOST_PP_INC_68 69\n# define BOOST_PP_INC_69 70\n# define BOOST_PP_INC_70 71\n# define BOOST_PP_INC_71 72\n# define BOOST_PP_INC_72 73\n# define BOOST_PP_INC_73 74\n# define BOOST_PP_INC_74 75\n# define BOOST_PP_INC_75 76\n# define BOOST_PP_INC_76 77\n# define BOOST_PP_INC_77 78\n# define BOOST_PP_INC_78 79\n# define BOOST_PP_INC_79 80\n# define BOOST_PP_INC_80 81\n# define BOOST_PP_INC_81 82\n# define BOOST_PP_INC_82 83\n# define BOOST_PP_INC_83 84\n# define BOOST_PP_INC_84 85\n# define BOOST_PP_INC_85 86\n# define BOOST_PP_INC_86 87\n# define BOOST_PP_INC_87 88\n# define BOOST_PP_INC_88 89\n# define BOOST_PP_INC_89 90\n# define BOOST_PP_INC_90 91\n# define BOOST_PP_INC_91 92\n# define BOOST_PP_INC_92 93\n# define BOOST_PP_INC_93 94\n# define BOOST_PP_INC_94 95\n# define BOOST_PP_INC_95 96\n# define BOOST_PP_INC_96 97\n# define BOOST_PP_INC_97 98\n# define BOOST_PP_INC_98 99\n# define BOOST_PP_INC_99 100\n# define BOOST_PP_INC_100 101\n# define BOOST_PP_INC_101 102\n# define BOOST_PP_INC_102 103\n# define BOOST_PP_INC_103 104\n# define BOOST_PP_INC_104 105\n# define BOOST_PP_INC_105 106\n# define BOOST_PP_INC_106 107\n# define BOOST_PP_INC_107 108\n# define BOOST_PP_INC_108 109\n# define BOOST_PP_INC_109 110\n# define BOOST_PP_INC_110 111\n# define BOOST_PP_INC_111 112\n# define BOOST_PP_INC_112 113\n# define BOOST_PP_INC_113 114\n# define BOOST_PP_INC_114 115\n# define BOOST_PP_INC_115 116\n# define BOOST_PP_INC_116 117\n# define BOOST_PP_INC_117 118\n# define BOOST_PP_INC_118 119\n# define BOOST_PP_INC_119 120\n# define BOOST_PP_INC_120 121\n# define BOOST_PP_INC_121 122\n# define BOOST_PP_INC_122 123\n# define BOOST_PP_INC_123 124\n# define BOOST_PP_INC_124 125\n# define BOOST_PP_INC_125 126\n# define BOOST_PP_INC_126 127\n# define BOOST_PP_INC_127 128\n# define BOOST_PP_INC_128 129\n# define BOOST_PP_INC_129 130\n# define BOOST_PP_INC_130 131\n# define BOOST_PP_INC_131 132\n# define BOOST_PP_INC_132 133\n# define BOOST_PP_INC_133 134\n# define BOOST_PP_INC_134 135\n# define BOOST_PP_INC_135 136\n# define BOOST_PP_INC_136 137\n# define BOOST_PP_INC_137 138\n# define BOOST_PP_INC_138 139\n# define BOOST_PP_INC_139 140\n# define BOOST_PP_INC_140 141\n# define BOOST_PP_INC_141 142\n# define BOOST_PP_INC_142 143\n# define BOOST_PP_INC_143 144\n# define BOOST_PP_INC_144 145\n# define BOOST_PP_INC_145 146\n# define BOOST_PP_INC_146 147\n# define BOOST_PP_INC_147 148\n# define BOOST_PP_INC_148 149\n# define BOOST_PP_INC_149 150\n# define BOOST_PP_INC_150 151\n# define BOOST_PP_INC_151 152\n# define BOOST_PP_INC_152 153\n# define BOOST_PP_INC_153 154\n# define BOOST_PP_INC_154 155\n# define BOOST_PP_INC_155 156\n# define BOOST_PP_INC_156 157\n# define BOOST_PP_INC_157 158\n# define BOOST_PP_INC_158 159\n# define BOOST_PP_INC_159 160\n# define BOOST_PP_INC_160 161\n# define BOOST_PP_INC_161 162\n# define BOOST_PP_INC_162 163\n# define BOOST_PP_INC_163 164\n# define BOOST_PP_INC_164 165\n# define BOOST_PP_INC_165 166\n# define BOOST_PP_INC_166 167\n# define BOOST_PP_INC_167 168\n# define BOOST_PP_INC_168 169\n# define BOOST_PP_INC_169 170\n# define BOOST_PP_INC_170 171\n# define BOOST_PP_INC_171 172\n# define BOOST_PP_INC_172 173\n# define BOOST_PP_INC_173 174\n# define BOOST_PP_INC_174 175\n# define BOOST_PP_INC_175 176\n# define BOOST_PP_INC_176 177\n# define BOOST_PP_INC_177 178\n# define BOOST_PP_INC_178 179\n# define BOOST_PP_INC_179 180\n# define BOOST_PP_INC_180 181\n# define BOOST_PP_INC_181 182\n# define BOOST_PP_INC_182 183\n# define BOOST_PP_INC_183 184\n# define BOOST_PP_INC_184 185\n# define BOOST_PP_INC_185 186\n# define BOOST_PP_INC_186 187\n# define BOOST_PP_INC_187 188\n# define BOOST_PP_INC_188 189\n# define BOOST_PP_INC_189 190\n# define BOOST_PP_INC_190 191\n# define BOOST_PP_INC_191 192\n# define BOOST_PP_INC_192 193\n# define BOOST_PP_INC_193 194\n# define BOOST_PP_INC_194 195\n# define BOOST_PP_INC_195 196\n# define BOOST_PP_INC_196 197\n# define BOOST_PP_INC_197 198\n# define BOOST_PP_INC_198 199\n# define BOOST_PP_INC_199 200\n# define BOOST_PP_INC_200 201\n# define BOOST_PP_INC_201 202\n# define BOOST_PP_INC_202 203\n# define BOOST_PP_INC_203 204\n# define BOOST_PP_INC_204 205\n# define BOOST_PP_INC_205 206\n# define BOOST_PP_INC_206 207\n# define BOOST_PP_INC_207 208\n# define BOOST_PP_INC_208 209\n# define BOOST_PP_INC_209 210\n# define BOOST_PP_INC_210 211\n# define BOOST_PP_INC_211 212\n# define BOOST_PP_INC_212 213\n# define BOOST_PP_INC_213 214\n# define BOOST_PP_INC_214 215\n# define BOOST_PP_INC_215 216\n# define BOOST_PP_INC_216 217\n# define BOOST_PP_INC_217 218\n# define BOOST_PP_INC_218 219\n# define BOOST_PP_INC_219 220\n# define BOOST_PP_INC_220 221\n# define BOOST_PP_INC_221 222\n# define BOOST_PP_INC_222 223\n# define BOOST_PP_INC_223 224\n# define BOOST_PP_INC_224 225\n# define BOOST_PP_INC_225 226\n# define BOOST_PP_INC_226 227\n# define BOOST_PP_INC_227 228\n# define BOOST_PP_INC_228 229\n# define BOOST_PP_INC_229 230\n# define BOOST_PP_INC_230 231\n# define BOOST_PP_INC_231 232\n# define BOOST_PP_INC_232 233\n# define BOOST_PP_INC_233 234\n# define BOOST_PP_INC_234 235\n# define BOOST_PP_INC_235 236\n# define BOOST_PP_INC_236 237\n# define BOOST_PP_INC_237 238\n# define BOOST_PP_INC_238 239\n# define BOOST_PP_INC_239 240\n# define BOOST_PP_INC_240 241\n# define BOOST_PP_INC_241 242\n# define BOOST_PP_INC_242 243\n# define BOOST_PP_INC_243 244\n# define BOOST_PP_INC_244 245\n# define BOOST_PP_INC_245 246\n# define BOOST_PP_INC_246 247\n# define BOOST_PP_INC_247 248\n# define BOOST_PP_INC_248 249\n# define BOOST_PP_INC_249 250\n# define BOOST_PP_INC_250 251\n# define BOOST_PP_INC_251 252\n# define BOOST_PP_INC_252 253\n# define BOOST_PP_INC_253 254\n# define BOOST_PP_INC_254 255\n# define BOOST_PP_INC_255 256\n# define BOOST_PP_INC_256 256\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/arithmetic/sub.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ARITHMETIC_SUB_HPP\n# define BOOST_PREPROCESSOR_ARITHMETIC_SUB_HPP\n#\n# include <boost/preprocessor/arithmetic/dec.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/while.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n#\n# /* BOOST_PP_SUB */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SUB(x, y) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE(BOOST_PP_SUB_P, BOOST_PP_SUB_O, (x, y)))\n# else\n#    define BOOST_PP_SUB(x, y) BOOST_PP_SUB_I(x, y)\n#    define BOOST_PP_SUB_I(x, y) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE(BOOST_PP_SUB_P, BOOST_PP_SUB_O, (x, y)))\n# endif\n#\n# define BOOST_PP_SUB_P(d, xy) BOOST_PP_TUPLE_ELEM(2, 1, xy)\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_SUB_O(d, xy) BOOST_PP_SUB_O_I xy\n# else\n#    define BOOST_PP_SUB_O(d, xy) BOOST_PP_SUB_O_I(BOOST_PP_TUPLE_ELEM(2, 0, xy), BOOST_PP_TUPLE_ELEM(2, 1, xy))\n# endif\n#\n# define BOOST_PP_SUB_O_I(x, y) (BOOST_PP_DEC(x), BOOST_PP_DEC(y))\n#\n# /* BOOST_PP_SUB_D */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SUB_D(d, x, y) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE_ ## d(BOOST_PP_SUB_P, BOOST_PP_SUB_O, (x, y)))\n# else\n#    define BOOST_PP_SUB_D(d, x, y) BOOST_PP_SUB_D_I(d, x, y)\n#    define BOOST_PP_SUB_D_I(d, x, y) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE_ ## d(BOOST_PP_SUB_P, BOOST_PP_SUB_O, (x, y)))\n# endif\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/array/data.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ARRAY_DATA_HPP\n# define BOOST_PREPROCESSOR_ARRAY_DATA_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n#\n# /* BOOST_PP_ARRAY_DATA */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ARRAY_DATA(array) BOOST_PP_TUPLE_ELEM(2, 1, array)\n# else\n#    define BOOST_PP_ARRAY_DATA(array) BOOST_PP_ARRAY_DATA_I(array)\n#    define BOOST_PP_ARRAY_DATA_I(array) BOOST_PP_ARRAY_DATA_II array\n#    define BOOST_PP_ARRAY_DATA_II(size, data) data\n# endif\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/array/elem.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ARRAY_ELEM_HPP\n# define BOOST_PREPROCESSOR_ARRAY_ELEM_HPP\n#\n# include <boost/preprocessor/array/data.hpp>\n# include <boost/preprocessor/array/size.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n#\n# /* BOOST_PP_ARRAY_ELEM */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ARRAY_ELEM(i, array) BOOST_PP_TUPLE_ELEM(BOOST_PP_ARRAY_SIZE(array), i, BOOST_PP_ARRAY_DATA(array))\n# else\n#    define BOOST_PP_ARRAY_ELEM(i, array) BOOST_PP_ARRAY_ELEM_I(i, array)\n#    define BOOST_PP_ARRAY_ELEM_I(i, array) BOOST_PP_TUPLE_ELEM(BOOST_PP_ARRAY_SIZE(array), i, BOOST_PP_ARRAY_DATA(array))\n# endif\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/array/size.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ARRAY_SIZE_HPP\n# define BOOST_PREPROCESSOR_ARRAY_SIZE_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n#\n# /* BOOST_PP_ARRAY_SIZE */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ARRAY_SIZE(array) BOOST_PP_TUPLE_ELEM(2, 0, array)\n# else\n#    define BOOST_PP_ARRAY_SIZE(array) BOOST_PP_ARRAY_SIZE_I(array)\n#    define BOOST_PP_ARRAY_SIZE_I(array) BOOST_PP_ARRAY_SIZE_II array\n#    define BOOST_PP_ARRAY_SIZE_II(size, data) size\n# endif\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/cat.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_CAT_HPP\n# define BOOST_PREPROCESSOR_CAT_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_CAT */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_CAT(a, b) BOOST_PP_CAT_I(a, b)\n# else\n#    define BOOST_PP_CAT(a, b) BOOST_PP_CAT_OO((a, b))\n#    define BOOST_PP_CAT_OO(par) BOOST_PP_CAT_I ## par\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    define BOOST_PP_CAT_I(a, b) a ## b\n# else\n#    define BOOST_PP_CAT_I(a, b) BOOST_PP_CAT_II(~, a ## b)\n#    define BOOST_PP_CAT_II(p, res) res\n# endif\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/comma_if.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_COMMA_IF_HPP\n# define BOOST_PREPROCESSOR_COMMA_IF_HPP\n#\n# include <boost/preprocessor/punctuation/comma_if.hpp>\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/comparison/equal.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_COMPARISON_EQUAL_HPP\n# define BOOST_PREPROCESSOR_COMPARISON_EQUAL_HPP\n#\n# include <boost/preprocessor/comparison/not_equal.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/logical/compl.hpp>\n#\n# /* BOOST_PP_EQUAL */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_EQUAL(x, y) BOOST_PP_COMPL(BOOST_PP_NOT_EQUAL(x, y))\n# else\n#    define BOOST_PP_EQUAL(x, y) BOOST_PP_EQUAL_I(x, y)\n#    define BOOST_PP_EQUAL_I(x, y) BOOST_PP_COMPL(BOOST_PP_NOT_EQUAL(x, y))\n# endif\n#\n# /* BOOST_PP_EQUAL_D */\n#\n# define BOOST_PP_EQUAL_D(d, x, y) BOOST_PP_EQUAL(x, y)\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/comparison/less_equal.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_COMPARISON_LESS_EQUAL_HPP\n# define BOOST_PREPROCESSOR_COMPARISON_LESS_EQUAL_HPP\n#\n# include <boost/preprocessor/arithmetic/sub.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/logical/not.hpp>\n#\n# /* BOOST_PP_LESS_EQUAL */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LESS_EQUAL(x, y) BOOST_PP_NOT(BOOST_PP_SUB(x, y))\n# else\n#    define BOOST_PP_LESS_EQUAL(x, y) BOOST_PP_LESS_EQUAL_I(x, y)\n#    define BOOST_PP_LESS_EQUAL_I(x, y) BOOST_PP_NOT(BOOST_PP_SUB(x, y))\n# endif\n#\n# /* BOOST_PP_LESS_EQUAL_D */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LESS_EQUAL_D(d, x, y) BOOST_PP_NOT(BOOST_PP_SUB_D(d, x, y))\n# else\n#    define BOOST_PP_LESS_EQUAL_D(d, x, y) BOOST_PP_LESS_EQUAL_D_I(d, x, y)\n#    define BOOST_PP_LESS_EQUAL_D_I(d, x, y) BOOST_PP_NOT(BOOST_PP_SUB_D(d, x, y))\n# endif\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/comparison/not_equal.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_COMPARISON_NOT_EQUAL_HPP\n# define BOOST_PREPROCESSOR_COMPARISON_NOT_EQUAL_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n#\n# /* BOOST_PP_NOT_EQUAL */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_NOT_EQUAL(x, y) BOOST_PP_NOT_EQUAL_I(x, y)\n# else\n#    define BOOST_PP_NOT_EQUAL(x, y) BOOST_PP_NOT_EQUAL_OO((x, y))\n#    define BOOST_PP_NOT_EQUAL_OO(par) BOOST_PP_NOT_EQUAL_I ## par\n# endif\n#\n# define BOOST_PP_NOT_EQUAL_I(x, y) BOOST_PP_CAT(BOOST_PP_NOT_EQUAL_CHECK_, BOOST_PP_NOT_EQUAL_ ## x(0, BOOST_PP_NOT_EQUAL_ ## y))\n#\n# /* BOOST_PP_NOT_EQUAL_D */\n#\n# define BOOST_PP_NOT_EQUAL_D(d, x, y) BOOST_PP_NOT_EQUAL(x, y)\n#\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NIL 1\n#\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_0(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_1(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_2(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_3(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_4(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_5(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_6(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_7(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_8(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_9(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_10(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_11(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_12(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_13(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_14(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_15(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_16(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_17(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_18(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_19(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_20(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_21(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_22(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_23(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_24(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_25(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_26(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_27(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_28(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_29(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_30(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_31(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_32(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_33(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_34(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_35(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_36(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_37(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_38(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_39(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_40(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_41(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_42(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_43(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_44(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_45(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_46(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_47(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_48(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_49(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_50(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_51(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_52(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_53(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_54(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_55(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_56(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_57(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_58(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_59(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_60(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_61(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_62(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_63(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_64(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_65(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_66(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_67(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_68(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_69(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_70(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_71(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_72(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_73(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_74(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_75(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_76(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_77(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_78(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_79(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_80(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_81(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_82(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_83(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_84(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_85(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_86(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_87(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_88(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_89(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_90(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_91(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_92(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_93(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_94(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_95(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_96(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_97(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_98(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_99(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_100(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_101(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_102(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_103(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_104(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_105(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_106(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_107(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_108(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_109(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_110(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_111(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_112(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_113(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_114(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_115(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_116(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_117(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_118(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_119(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_120(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_121(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_122(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_123(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_124(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_125(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_126(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_127(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_128(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_129(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_130(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_131(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_132(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_133(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_134(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_135(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_136(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_137(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_138(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_139(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_140(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_141(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_142(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_143(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_144(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_145(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_146(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_147(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_148(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_149(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_150(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_151(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_152(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_153(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_154(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_155(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_156(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_157(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_158(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_159(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_160(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_161(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_162(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_163(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_164(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_165(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_166(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_167(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_168(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_169(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_170(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_171(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_172(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_173(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_174(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_175(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_176(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_177(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_178(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_179(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_180(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_181(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_182(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_183(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_184(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_185(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_186(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_187(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_188(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_189(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_190(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_191(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_192(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_193(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_194(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_195(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_196(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_197(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_198(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_199(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_200(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_201(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_202(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_203(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_204(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_205(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_206(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_207(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_208(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_209(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_210(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_211(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_212(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_213(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_214(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_215(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_216(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_217(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_218(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_219(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_220(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_221(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_222(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_223(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_224(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_225(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_226(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_227(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_228(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_229(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_230(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_231(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_232(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_233(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_234(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_235(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_236(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_237(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_238(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_239(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_240(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_241(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_242(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_243(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_244(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_245(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_246(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_247(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_248(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_249(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_250(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_251(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_252(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_253(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_254(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_255(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_256(c, y) 0\n#\n#if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()\n#    define BOOST_PP_NOT_EQUAL_0(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_1(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_2(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_3(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_4(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_5(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_6(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_7(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_8(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_9(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_10(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_11(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_12(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_13(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_14(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_15(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_16(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_17(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_18(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_19(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_20(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_21(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_22(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_23(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_24(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_25(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_26(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_27(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_28(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_29(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_30(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_31(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_32(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_33(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_34(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_35(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_36(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_37(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_38(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_39(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_40(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_41(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_42(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_43(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_44(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_45(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_46(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_47(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_48(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_49(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_50(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_51(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_52(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_53(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_54(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_55(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_56(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_57(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_58(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_59(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_60(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_61(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_62(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_63(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_64(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_65(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_66(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_67(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_68(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_69(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_70(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_71(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_72(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_73(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_74(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_75(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_76(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_77(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_78(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_79(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_80(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_81(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_82(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_83(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_84(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_85(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_86(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_87(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_88(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_89(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_90(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_91(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_92(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_93(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_94(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_95(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_96(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_97(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_98(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_99(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_100(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_101(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_102(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_103(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_104(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_105(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_106(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_107(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_108(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_109(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_110(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_111(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_112(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_113(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_114(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_115(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_116(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_117(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_118(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_119(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_120(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_121(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_122(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_123(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_124(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_125(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_126(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_127(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_128(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_129(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_130(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_131(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_132(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_133(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_134(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_135(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_136(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_137(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_138(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_139(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_140(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_141(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_142(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_143(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_144(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_145(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_146(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_147(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_148(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_149(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_150(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_151(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_152(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_153(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_154(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_155(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_156(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_157(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_158(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_159(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_160(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_161(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_162(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_163(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_164(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_165(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_166(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_167(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_168(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_169(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_170(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_171(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_172(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_173(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_174(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_175(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_176(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_177(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_178(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_179(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_180(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_181(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_182(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_183(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_184(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_185(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_186(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_187(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_188(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_189(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_190(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_191(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_192(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_193(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_194(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_195(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_196(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_197(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_198(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_199(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_200(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_201(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_202(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_203(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_204(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_205(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_206(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_207(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_208(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_209(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_210(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_211(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_212(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_213(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_214(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_215(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_216(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_217(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_218(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_219(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_220(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_221(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_222(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_223(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_224(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_225(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_226(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_227(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_228(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_229(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_230(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_231(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_232(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_233(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_234(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_235(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_236(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_237(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_238(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_239(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_240(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_241(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_242(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_243(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_244(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_245(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_246(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_247(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_248(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_249(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_250(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_251(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_252(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_253(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_254(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_255(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_256(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n# else\n#    define BOOST_PP_NOT_EQUAL_0(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_1(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_2(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_3(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_4(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_5(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_6(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_7(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_8(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_9(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_10(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_11(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_12(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_13(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_14(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_15(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_16(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_17(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_18(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_19(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_20(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_21(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_22(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_23(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_24(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_25(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_26(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_27(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_28(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_29(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_30(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_31(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_32(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_33(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_34(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_35(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_36(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_37(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_38(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_39(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_40(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_41(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_42(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_43(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_44(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_45(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_46(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_47(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_48(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_49(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_50(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_51(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_52(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_53(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_54(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_55(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_56(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_57(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_58(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_59(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_60(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_61(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_62(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_63(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_64(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_65(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_66(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_67(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_68(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_69(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_70(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_71(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_72(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_73(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_74(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_75(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_76(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_77(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_78(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_79(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_80(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_81(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_82(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_83(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_84(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_85(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_86(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_87(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_88(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_89(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_90(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_91(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_92(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_93(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_94(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_95(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_96(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_97(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_98(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_99(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_100(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_101(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_102(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_103(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_104(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_105(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_106(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_107(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_108(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_109(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_110(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_111(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_112(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_113(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_114(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_115(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_116(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_117(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_118(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_119(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_120(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_121(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_122(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_123(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_124(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_125(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_126(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_127(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_128(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_129(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_130(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_131(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_132(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_133(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_134(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_135(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_136(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_137(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_138(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_139(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_140(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_141(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_142(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_143(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_144(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_145(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_146(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_147(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_148(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_149(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_150(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_151(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_152(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_153(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_154(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_155(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_156(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_157(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_158(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_159(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_160(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_161(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_162(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_163(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_164(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_165(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_166(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_167(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_168(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_169(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_170(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_171(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_172(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_173(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_174(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_175(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_176(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_177(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_178(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_179(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_180(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_181(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_182(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_183(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_184(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_185(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_186(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_187(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_188(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_189(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_190(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_191(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_192(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_193(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_194(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_195(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_196(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_197(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_198(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_199(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_200(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_201(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_202(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_203(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_204(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_205(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_206(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_207(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_208(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_209(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_210(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_211(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_212(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_213(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_214(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_215(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_216(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_217(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_218(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_219(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_220(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_221(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_222(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_223(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_224(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_225(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_226(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_227(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_228(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_229(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_230(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_231(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_232(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_233(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_234(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_235(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_236(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_237(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_238(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_239(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_240(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_241(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_242(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_243(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_244(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_245(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_246(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_247(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_248(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_249(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_250(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_251(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_252(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_253(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_254(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_255(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_256(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n# endif\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/config/config.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002-2011.                             *\n#  *     (C) Copyright Edward Diener 2011.                                    *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_CONFIG_CONFIG_HPP\n# define BOOST_PREPROCESSOR_CONFIG_CONFIG_HPP\n#\n# /* BOOST_PP_CONFIG_FLAGS */\n#\n# define BOOST_PP_CONFIG_STRICT() 0x0001\n# define BOOST_PP_CONFIG_IDEAL() 0x0002\n#\n# define BOOST_PP_CONFIG_MSVC() 0x0004\n# define BOOST_PP_CONFIG_MWCC() 0x0008\n# define BOOST_PP_CONFIG_BCC() 0x0010\n# define BOOST_PP_CONFIG_EDG() 0x0020\n# define BOOST_PP_CONFIG_DMC() 0x0040\n#\n# ifndef BOOST_PP_CONFIG_FLAGS\n#    if defined(__GCCXML__)\n#        define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_STRICT())\n#    elif defined(__WAVE__)\n#        define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_STRICT())\n#    elif defined(__MWERKS__) && __MWERKS__ >= 0x3200\n#        define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_STRICT())\n#    elif defined(__EDG__) || defined(__EDG_VERSION__)\n#        if defined(_MSC_VER) && (defined(__INTELLISENSE__) || __EDG_VERSION__ >= 308)\n#            define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_MSVC())\n#        else\n#            define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_EDG() | BOOST_PP_CONFIG_STRICT())\n#        endif\n#    elif defined(__MWERKS__)\n#        define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_MWCC())\n#    elif defined(__DMC__)\n#        define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_DMC())\n#    elif defined(__BORLANDC__) && __BORLANDC__ >= 0x581\n#        define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_STRICT())\n#    elif defined(__BORLANDC__) || defined(__IBMC__) || defined(__IBMCPP__) || defined(__SUNPRO_CC)\n#        define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_BCC())\n#    elif defined(_MSC_VER) && !defined(__clang__)\n#        define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_MSVC())\n#    else\n#        define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_STRICT())\n#    endif\n# endif\n#\n# /* BOOST_PP_CONFIG_EXTENDED_LINE_INFO */\n#\n# ifndef BOOST_PP_CONFIG_EXTENDED_LINE_INFO\n#    define BOOST_PP_CONFIG_EXTENDED_LINE_INFO 0\n# endif\n#\n# /* BOOST_PP_CONFIG_ERRORS */\n#\n# ifndef BOOST_PP_CONFIG_ERRORS\n#    ifdef NDEBUG\n#        define BOOST_PP_CONFIG_ERRORS 0\n#    else\n#        define BOOST_PP_CONFIG_ERRORS 1\n#    endif\n# endif\n#\n# /* BOOST_PP_VARIADICS */\n#\n# define BOOST_PP_VARIADICS_MSVC 0\n# if !defined BOOST_PP_VARIADICS\n#    /* variadic support explicitly disabled for all untested compilers */\n#    if defined __GCCXML__ || defined __CUDACC__ || defined __PATHSCALE__ || defined __DMC__ || defined __CODEGEARC__ || defined __BORLANDC__ || defined __MWERKS__ || ( defined __SUNPRO_CC && __SUNPRO_CC < 0x5130 ) || defined __HP_aCC && !defined __EDG__ || defined __MRC__ || defined __SC__ || defined __IBMCPP__ || defined __PGI\n#        define BOOST_PP_VARIADICS 0\n#    /* VC++ (C/C++) */\n#    elif defined _MSC_VER && _MSC_VER >= 1400 && (!defined __EDG__ || defined(__INTELLISENSE__)) && !defined __clang__\n#        define BOOST_PP_VARIADICS 1\n#        undef BOOST_PP_VARIADICS_MSVC\n#        define BOOST_PP_VARIADICS_MSVC 1\n#    /* Wave (C/C++), GCC (C++) */\n#    elif defined __WAVE__ && __WAVE_HAS_VARIADICS__ || defined __GNUC__ && defined __GXX_EXPERIMENTAL_CXX0X__ && __GXX_EXPERIMENTAL_CXX0X__\n#        define BOOST_PP_VARIADICS 1\n#    /* EDG-based (C/C++), GCC (C), and unknown (C/C++) */\n#    elif !defined __cplusplus && __STDC_VERSION__ >= 199901L || __cplusplus >= 201103L\n#        define BOOST_PP_VARIADICS 1\n#    else\n#        define BOOST_PP_VARIADICS 0\n#    endif\n# elif !BOOST_PP_VARIADICS + 1 < 2\n#    undef BOOST_PP_VARIADICS\n#    define BOOST_PP_VARIADICS 1\n#    if defined _MSC_VER && _MSC_VER >= 1400 && (defined(__INTELLISENSE__) || !(defined __EDG__ || defined __GCCXML__ || defined __CUDACC__ || defined __PATHSCALE__ || defined __clang__ || defined __DMC__ || defined __CODEGEARC__ || defined __BORLANDC__ || defined __MWERKS__ || defined __SUNPRO_CC || defined __HP_aCC || defined __MRC__ || defined __SC__ || defined __IBMCPP__ || defined __PGI))\n#        undef BOOST_PP_VARIADICS_MSVC\n#        define BOOST_PP_VARIADICS_MSVC 1\n#    endif\n# else\n#    undef BOOST_PP_VARIADICS\n#    define BOOST_PP_VARIADICS 0\n# endif\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/control/detail/dmc/while.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_CONTROL_DETAIL_WHILE_HPP\n# define BOOST_PREPROCESSOR_CONTROL_DETAIL_WHILE_HPP\n#\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/logical/bool.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n#\n# define BOOST_PP_WHILE_1(p, o, s) BOOST_PP_WHILE_1_C(BOOST_PP_BOOL(p##(2, s)), p, o, s)\n# define BOOST_PP_WHILE_2(p, o, s) BOOST_PP_WHILE_2_C(BOOST_PP_BOOL(p##(3, s)), p, o, s)\n# define BOOST_PP_WHILE_3(p, o, s) BOOST_PP_WHILE_3_C(BOOST_PP_BOOL(p##(4, s)), p, o, s)\n# define BOOST_PP_WHILE_4(p, o, s) BOOST_PP_WHILE_4_C(BOOST_PP_BOOL(p##(5, s)), p, o, s)\n# define BOOST_PP_WHILE_5(p, o, s) BOOST_PP_WHILE_5_C(BOOST_PP_BOOL(p##(6, s)), p, o, s)\n# define BOOST_PP_WHILE_6(p, o, s) BOOST_PP_WHILE_6_C(BOOST_PP_BOOL(p##(7, s)), p, o, s)\n# define BOOST_PP_WHILE_7(p, o, s) BOOST_PP_WHILE_7_C(BOOST_PP_BOOL(p##(8, s)), p, o, s)\n# define BOOST_PP_WHILE_8(p, o, s) BOOST_PP_WHILE_8_C(BOOST_PP_BOOL(p##(9, s)), p, o, s)\n# define BOOST_PP_WHILE_9(p, o, s) BOOST_PP_WHILE_9_C(BOOST_PP_BOOL(p##(10, s)), p, o, s)\n# define BOOST_PP_WHILE_10(p, o, s) BOOST_PP_WHILE_10_C(BOOST_PP_BOOL(p##(11, s)), p, o, s)\n# define BOOST_PP_WHILE_11(p, o, s) BOOST_PP_WHILE_11_C(BOOST_PP_BOOL(p##(12, s)), p, o, s)\n# define BOOST_PP_WHILE_12(p, o, s) BOOST_PP_WHILE_12_C(BOOST_PP_BOOL(p##(13, s)), p, o, s)\n# define BOOST_PP_WHILE_13(p, o, s) BOOST_PP_WHILE_13_C(BOOST_PP_BOOL(p##(14, s)), p, o, s)\n# define BOOST_PP_WHILE_14(p, o, s) BOOST_PP_WHILE_14_C(BOOST_PP_BOOL(p##(15, s)), p, o, s)\n# define BOOST_PP_WHILE_15(p, o, s) BOOST_PP_WHILE_15_C(BOOST_PP_BOOL(p##(16, s)), p, o, s)\n# define BOOST_PP_WHILE_16(p, o, s) BOOST_PP_WHILE_16_C(BOOST_PP_BOOL(p##(17, s)), p, o, s)\n# define BOOST_PP_WHILE_17(p, o, s) BOOST_PP_WHILE_17_C(BOOST_PP_BOOL(p##(18, s)), p, o, s)\n# define BOOST_PP_WHILE_18(p, o, s) BOOST_PP_WHILE_18_C(BOOST_PP_BOOL(p##(19, s)), p, o, s)\n# define BOOST_PP_WHILE_19(p, o, s) BOOST_PP_WHILE_19_C(BOOST_PP_BOOL(p##(20, s)), p, o, s)\n# define BOOST_PP_WHILE_20(p, o, s) BOOST_PP_WHILE_20_C(BOOST_PP_BOOL(p##(21, s)), p, o, s)\n# define BOOST_PP_WHILE_21(p, o, s) BOOST_PP_WHILE_21_C(BOOST_PP_BOOL(p##(22, s)), p, o, s)\n# define BOOST_PP_WHILE_22(p, o, s) BOOST_PP_WHILE_22_C(BOOST_PP_BOOL(p##(23, s)), p, o, s)\n# define BOOST_PP_WHILE_23(p, o, s) BOOST_PP_WHILE_23_C(BOOST_PP_BOOL(p##(24, s)), p, o, s)\n# define BOOST_PP_WHILE_24(p, o, s) BOOST_PP_WHILE_24_C(BOOST_PP_BOOL(p##(25, s)), p, o, s)\n# define BOOST_PP_WHILE_25(p, o, s) BOOST_PP_WHILE_25_C(BOOST_PP_BOOL(p##(26, s)), p, o, s)\n# define BOOST_PP_WHILE_26(p, o, s) BOOST_PP_WHILE_26_C(BOOST_PP_BOOL(p##(27, s)), p, o, s)\n# define BOOST_PP_WHILE_27(p, o, s) BOOST_PP_WHILE_27_C(BOOST_PP_BOOL(p##(28, s)), p, o, s)\n# define BOOST_PP_WHILE_28(p, o, s) BOOST_PP_WHILE_28_C(BOOST_PP_BOOL(p##(29, s)), p, o, s)\n# define BOOST_PP_WHILE_29(p, o, s) BOOST_PP_WHILE_29_C(BOOST_PP_BOOL(p##(30, s)), p, o, s)\n# define BOOST_PP_WHILE_30(p, o, s) BOOST_PP_WHILE_30_C(BOOST_PP_BOOL(p##(31, s)), p, o, s)\n# define BOOST_PP_WHILE_31(p, o, s) BOOST_PP_WHILE_31_C(BOOST_PP_BOOL(p##(32, s)), p, o, s)\n# define BOOST_PP_WHILE_32(p, o, s) BOOST_PP_WHILE_32_C(BOOST_PP_BOOL(p##(33, s)), p, o, s)\n# define BOOST_PP_WHILE_33(p, o, s) BOOST_PP_WHILE_33_C(BOOST_PP_BOOL(p##(34, s)), p, o, s)\n# define BOOST_PP_WHILE_34(p, o, s) BOOST_PP_WHILE_34_C(BOOST_PP_BOOL(p##(35, s)), p, o, s)\n# define BOOST_PP_WHILE_35(p, o, s) BOOST_PP_WHILE_35_C(BOOST_PP_BOOL(p##(36, s)), p, o, s)\n# define BOOST_PP_WHILE_36(p, o, s) BOOST_PP_WHILE_36_C(BOOST_PP_BOOL(p##(37, s)), p, o, s)\n# define BOOST_PP_WHILE_37(p, o, s) BOOST_PP_WHILE_37_C(BOOST_PP_BOOL(p##(38, s)), p, o, s)\n# define BOOST_PP_WHILE_38(p, o, s) BOOST_PP_WHILE_38_C(BOOST_PP_BOOL(p##(39, s)), p, o, s)\n# define BOOST_PP_WHILE_39(p, o, s) BOOST_PP_WHILE_39_C(BOOST_PP_BOOL(p##(40, s)), p, o, s)\n# define BOOST_PP_WHILE_40(p, o, s) BOOST_PP_WHILE_40_C(BOOST_PP_BOOL(p##(41, s)), p, o, s)\n# define BOOST_PP_WHILE_41(p, o, s) BOOST_PP_WHILE_41_C(BOOST_PP_BOOL(p##(42, s)), p, o, s)\n# define BOOST_PP_WHILE_42(p, o, s) BOOST_PP_WHILE_42_C(BOOST_PP_BOOL(p##(43, s)), p, o, s)\n# define BOOST_PP_WHILE_43(p, o, s) BOOST_PP_WHILE_43_C(BOOST_PP_BOOL(p##(44, s)), p, o, s)\n# define BOOST_PP_WHILE_44(p, o, s) BOOST_PP_WHILE_44_C(BOOST_PP_BOOL(p##(45, s)), p, o, s)\n# define BOOST_PP_WHILE_45(p, o, s) BOOST_PP_WHILE_45_C(BOOST_PP_BOOL(p##(46, s)), p, o, s)\n# define BOOST_PP_WHILE_46(p, o, s) BOOST_PP_WHILE_46_C(BOOST_PP_BOOL(p##(47, s)), p, o, s)\n# define BOOST_PP_WHILE_47(p, o, s) BOOST_PP_WHILE_47_C(BOOST_PP_BOOL(p##(48, s)), p, o, s)\n# define BOOST_PP_WHILE_48(p, o, s) BOOST_PP_WHILE_48_C(BOOST_PP_BOOL(p##(49, s)), p, o, s)\n# define BOOST_PP_WHILE_49(p, o, s) BOOST_PP_WHILE_49_C(BOOST_PP_BOOL(p##(50, s)), p, o, s)\n# define BOOST_PP_WHILE_50(p, o, s) BOOST_PP_WHILE_50_C(BOOST_PP_BOOL(p##(51, s)), p, o, s)\n# define BOOST_PP_WHILE_51(p, o, s) BOOST_PP_WHILE_51_C(BOOST_PP_BOOL(p##(52, s)), p, o, s)\n# define BOOST_PP_WHILE_52(p, o, s) BOOST_PP_WHILE_52_C(BOOST_PP_BOOL(p##(53, s)), p, o, s)\n# define BOOST_PP_WHILE_53(p, o, s) BOOST_PP_WHILE_53_C(BOOST_PP_BOOL(p##(54, s)), p, o, s)\n# define BOOST_PP_WHILE_54(p, o, s) BOOST_PP_WHILE_54_C(BOOST_PP_BOOL(p##(55, s)), p, o, s)\n# define BOOST_PP_WHILE_55(p, o, s) BOOST_PP_WHILE_55_C(BOOST_PP_BOOL(p##(56, s)), p, o, s)\n# define BOOST_PP_WHILE_56(p, o, s) BOOST_PP_WHILE_56_C(BOOST_PP_BOOL(p##(57, s)), p, o, s)\n# define BOOST_PP_WHILE_57(p, o, s) BOOST_PP_WHILE_57_C(BOOST_PP_BOOL(p##(58, s)), p, o, s)\n# define BOOST_PP_WHILE_58(p, o, s) BOOST_PP_WHILE_58_C(BOOST_PP_BOOL(p##(59, s)), p, o, s)\n# define BOOST_PP_WHILE_59(p, o, s) BOOST_PP_WHILE_59_C(BOOST_PP_BOOL(p##(60, s)), p, o, s)\n# define BOOST_PP_WHILE_60(p, o, s) BOOST_PP_WHILE_60_C(BOOST_PP_BOOL(p##(61, s)), p, o, s)\n# define BOOST_PP_WHILE_61(p, o, s) BOOST_PP_WHILE_61_C(BOOST_PP_BOOL(p##(62, s)), p, o, s)\n# define BOOST_PP_WHILE_62(p, o, s) BOOST_PP_WHILE_62_C(BOOST_PP_BOOL(p##(63, s)), p, o, s)\n# define BOOST_PP_WHILE_63(p, o, s) BOOST_PP_WHILE_63_C(BOOST_PP_BOOL(p##(64, s)), p, o, s)\n# define BOOST_PP_WHILE_64(p, o, s) BOOST_PP_WHILE_64_C(BOOST_PP_BOOL(p##(65, s)), p, o, s)\n# define BOOST_PP_WHILE_65(p, o, s) BOOST_PP_WHILE_65_C(BOOST_PP_BOOL(p##(66, s)), p, o, s)\n# define BOOST_PP_WHILE_66(p, o, s) BOOST_PP_WHILE_66_C(BOOST_PP_BOOL(p##(67, s)), p, o, s)\n# define BOOST_PP_WHILE_67(p, o, s) BOOST_PP_WHILE_67_C(BOOST_PP_BOOL(p##(68, s)), p, o, s)\n# define BOOST_PP_WHILE_68(p, o, s) BOOST_PP_WHILE_68_C(BOOST_PP_BOOL(p##(69, s)), p, o, s)\n# define BOOST_PP_WHILE_69(p, o, s) BOOST_PP_WHILE_69_C(BOOST_PP_BOOL(p##(70, s)), p, o, s)\n# define BOOST_PP_WHILE_70(p, o, s) BOOST_PP_WHILE_70_C(BOOST_PP_BOOL(p##(71, s)), p, o, s)\n# define BOOST_PP_WHILE_71(p, o, s) BOOST_PP_WHILE_71_C(BOOST_PP_BOOL(p##(72, s)), p, o, s)\n# define BOOST_PP_WHILE_72(p, o, s) BOOST_PP_WHILE_72_C(BOOST_PP_BOOL(p##(73, s)), p, o, s)\n# define BOOST_PP_WHILE_73(p, o, s) BOOST_PP_WHILE_73_C(BOOST_PP_BOOL(p##(74, s)), p, o, s)\n# define BOOST_PP_WHILE_74(p, o, s) BOOST_PP_WHILE_74_C(BOOST_PP_BOOL(p##(75, s)), p, o, s)\n# define BOOST_PP_WHILE_75(p, o, s) BOOST_PP_WHILE_75_C(BOOST_PP_BOOL(p##(76, s)), p, o, s)\n# define BOOST_PP_WHILE_76(p, o, s) BOOST_PP_WHILE_76_C(BOOST_PP_BOOL(p##(77, s)), p, o, s)\n# define BOOST_PP_WHILE_77(p, o, s) BOOST_PP_WHILE_77_C(BOOST_PP_BOOL(p##(78, s)), p, o, s)\n# define BOOST_PP_WHILE_78(p, o, s) BOOST_PP_WHILE_78_C(BOOST_PP_BOOL(p##(79, s)), p, o, s)\n# define BOOST_PP_WHILE_79(p, o, s) BOOST_PP_WHILE_79_C(BOOST_PP_BOOL(p##(80, s)), p, o, s)\n# define BOOST_PP_WHILE_80(p, o, s) BOOST_PP_WHILE_80_C(BOOST_PP_BOOL(p##(81, s)), p, o, s)\n# define BOOST_PP_WHILE_81(p, o, s) BOOST_PP_WHILE_81_C(BOOST_PP_BOOL(p##(82, s)), p, o, s)\n# define BOOST_PP_WHILE_82(p, o, s) BOOST_PP_WHILE_82_C(BOOST_PP_BOOL(p##(83, s)), p, o, s)\n# define BOOST_PP_WHILE_83(p, o, s) BOOST_PP_WHILE_83_C(BOOST_PP_BOOL(p##(84, s)), p, o, s)\n# define BOOST_PP_WHILE_84(p, o, s) BOOST_PP_WHILE_84_C(BOOST_PP_BOOL(p##(85, s)), p, o, s)\n# define BOOST_PP_WHILE_85(p, o, s) BOOST_PP_WHILE_85_C(BOOST_PP_BOOL(p##(86, s)), p, o, s)\n# define BOOST_PP_WHILE_86(p, o, s) BOOST_PP_WHILE_86_C(BOOST_PP_BOOL(p##(87, s)), p, o, s)\n# define BOOST_PP_WHILE_87(p, o, s) BOOST_PP_WHILE_87_C(BOOST_PP_BOOL(p##(88, s)), p, o, s)\n# define BOOST_PP_WHILE_88(p, o, s) BOOST_PP_WHILE_88_C(BOOST_PP_BOOL(p##(89, s)), p, o, s)\n# define BOOST_PP_WHILE_89(p, o, s) BOOST_PP_WHILE_89_C(BOOST_PP_BOOL(p##(90, s)), p, o, s)\n# define BOOST_PP_WHILE_90(p, o, s) BOOST_PP_WHILE_90_C(BOOST_PP_BOOL(p##(91, s)), p, o, s)\n# define BOOST_PP_WHILE_91(p, o, s) BOOST_PP_WHILE_91_C(BOOST_PP_BOOL(p##(92, s)), p, o, s)\n# define BOOST_PP_WHILE_92(p, o, s) BOOST_PP_WHILE_92_C(BOOST_PP_BOOL(p##(93, s)), p, o, s)\n# define BOOST_PP_WHILE_93(p, o, s) BOOST_PP_WHILE_93_C(BOOST_PP_BOOL(p##(94, s)), p, o, s)\n# define BOOST_PP_WHILE_94(p, o, s) BOOST_PP_WHILE_94_C(BOOST_PP_BOOL(p##(95, s)), p, o, s)\n# define BOOST_PP_WHILE_95(p, o, s) BOOST_PP_WHILE_95_C(BOOST_PP_BOOL(p##(96, s)), p, o, s)\n# define BOOST_PP_WHILE_96(p, o, s) BOOST_PP_WHILE_96_C(BOOST_PP_BOOL(p##(97, s)), p, o, s)\n# define BOOST_PP_WHILE_97(p, o, s) BOOST_PP_WHILE_97_C(BOOST_PP_BOOL(p##(98, s)), p, o, s)\n# define BOOST_PP_WHILE_98(p, o, s) BOOST_PP_WHILE_98_C(BOOST_PP_BOOL(p##(99, s)), p, o, s)\n# define BOOST_PP_WHILE_99(p, o, s) BOOST_PP_WHILE_99_C(BOOST_PP_BOOL(p##(100, s)), p, o, s)\n# define BOOST_PP_WHILE_100(p, o, s) BOOST_PP_WHILE_100_C(BOOST_PP_BOOL(p##(101, s)), p, o, s)\n# define BOOST_PP_WHILE_101(p, o, s) BOOST_PP_WHILE_101_C(BOOST_PP_BOOL(p##(102, s)), p, o, s)\n# define BOOST_PP_WHILE_102(p, o, s) BOOST_PP_WHILE_102_C(BOOST_PP_BOOL(p##(103, s)), p, o, s)\n# define BOOST_PP_WHILE_103(p, o, s) BOOST_PP_WHILE_103_C(BOOST_PP_BOOL(p##(104, s)), p, o, s)\n# define BOOST_PP_WHILE_104(p, o, s) BOOST_PP_WHILE_104_C(BOOST_PP_BOOL(p##(105, s)), p, o, s)\n# define BOOST_PP_WHILE_105(p, o, s) BOOST_PP_WHILE_105_C(BOOST_PP_BOOL(p##(106, s)), p, o, s)\n# define BOOST_PP_WHILE_106(p, o, s) BOOST_PP_WHILE_106_C(BOOST_PP_BOOL(p##(107, s)), p, o, s)\n# define BOOST_PP_WHILE_107(p, o, s) BOOST_PP_WHILE_107_C(BOOST_PP_BOOL(p##(108, s)), p, o, s)\n# define BOOST_PP_WHILE_108(p, o, s) BOOST_PP_WHILE_108_C(BOOST_PP_BOOL(p##(109, s)), p, o, s)\n# define BOOST_PP_WHILE_109(p, o, s) BOOST_PP_WHILE_109_C(BOOST_PP_BOOL(p##(110, s)), p, o, s)\n# define BOOST_PP_WHILE_110(p, o, s) BOOST_PP_WHILE_110_C(BOOST_PP_BOOL(p##(111, s)), p, o, s)\n# define BOOST_PP_WHILE_111(p, o, s) BOOST_PP_WHILE_111_C(BOOST_PP_BOOL(p##(112, s)), p, o, s)\n# define BOOST_PP_WHILE_112(p, o, s) BOOST_PP_WHILE_112_C(BOOST_PP_BOOL(p##(113, s)), p, o, s)\n# define BOOST_PP_WHILE_113(p, o, s) BOOST_PP_WHILE_113_C(BOOST_PP_BOOL(p##(114, s)), p, o, s)\n# define BOOST_PP_WHILE_114(p, o, s) BOOST_PP_WHILE_114_C(BOOST_PP_BOOL(p##(115, s)), p, o, s)\n# define BOOST_PP_WHILE_115(p, o, s) BOOST_PP_WHILE_115_C(BOOST_PP_BOOL(p##(116, s)), p, o, s)\n# define BOOST_PP_WHILE_116(p, o, s) BOOST_PP_WHILE_116_C(BOOST_PP_BOOL(p##(117, s)), p, o, s)\n# define BOOST_PP_WHILE_117(p, o, s) BOOST_PP_WHILE_117_C(BOOST_PP_BOOL(p##(118, s)), p, o, s)\n# define BOOST_PP_WHILE_118(p, o, s) BOOST_PP_WHILE_118_C(BOOST_PP_BOOL(p##(119, s)), p, o, s)\n# define BOOST_PP_WHILE_119(p, o, s) BOOST_PP_WHILE_119_C(BOOST_PP_BOOL(p##(120, s)), p, o, s)\n# define BOOST_PP_WHILE_120(p, o, s) BOOST_PP_WHILE_120_C(BOOST_PP_BOOL(p##(121, s)), p, o, s)\n# define BOOST_PP_WHILE_121(p, o, s) BOOST_PP_WHILE_121_C(BOOST_PP_BOOL(p##(122, s)), p, o, s)\n# define BOOST_PP_WHILE_122(p, o, s) BOOST_PP_WHILE_122_C(BOOST_PP_BOOL(p##(123, s)), p, o, s)\n# define BOOST_PP_WHILE_123(p, o, s) BOOST_PP_WHILE_123_C(BOOST_PP_BOOL(p##(124, s)), p, o, s)\n# define BOOST_PP_WHILE_124(p, o, s) BOOST_PP_WHILE_124_C(BOOST_PP_BOOL(p##(125, s)), p, o, s)\n# define BOOST_PP_WHILE_125(p, o, s) BOOST_PP_WHILE_125_C(BOOST_PP_BOOL(p##(126, s)), p, o, s)\n# define BOOST_PP_WHILE_126(p, o, s) BOOST_PP_WHILE_126_C(BOOST_PP_BOOL(p##(127, s)), p, o, s)\n# define BOOST_PP_WHILE_127(p, o, s) BOOST_PP_WHILE_127_C(BOOST_PP_BOOL(p##(128, s)), p, o, s)\n# define BOOST_PP_WHILE_128(p, o, s) BOOST_PP_WHILE_128_C(BOOST_PP_BOOL(p##(129, s)), p, o, s)\n# define BOOST_PP_WHILE_129(p, o, s) BOOST_PP_WHILE_129_C(BOOST_PP_BOOL(p##(130, s)), p, o, s)\n# define BOOST_PP_WHILE_130(p, o, s) BOOST_PP_WHILE_130_C(BOOST_PP_BOOL(p##(131, s)), p, o, s)\n# define BOOST_PP_WHILE_131(p, o, s) BOOST_PP_WHILE_131_C(BOOST_PP_BOOL(p##(132, s)), p, o, s)\n# define BOOST_PP_WHILE_132(p, o, s) BOOST_PP_WHILE_132_C(BOOST_PP_BOOL(p##(133, s)), p, o, s)\n# define BOOST_PP_WHILE_133(p, o, s) BOOST_PP_WHILE_133_C(BOOST_PP_BOOL(p##(134, s)), p, o, s)\n# define BOOST_PP_WHILE_134(p, o, s) BOOST_PP_WHILE_134_C(BOOST_PP_BOOL(p##(135, s)), p, o, s)\n# define BOOST_PP_WHILE_135(p, o, s) BOOST_PP_WHILE_135_C(BOOST_PP_BOOL(p##(136, s)), p, o, s)\n# define BOOST_PP_WHILE_136(p, o, s) BOOST_PP_WHILE_136_C(BOOST_PP_BOOL(p##(137, s)), p, o, s)\n# define BOOST_PP_WHILE_137(p, o, s) BOOST_PP_WHILE_137_C(BOOST_PP_BOOL(p##(138, s)), p, o, s)\n# define BOOST_PP_WHILE_138(p, o, s) BOOST_PP_WHILE_138_C(BOOST_PP_BOOL(p##(139, s)), p, o, s)\n# define BOOST_PP_WHILE_139(p, o, s) BOOST_PP_WHILE_139_C(BOOST_PP_BOOL(p##(140, s)), p, o, s)\n# define BOOST_PP_WHILE_140(p, o, s) BOOST_PP_WHILE_140_C(BOOST_PP_BOOL(p##(141, s)), p, o, s)\n# define BOOST_PP_WHILE_141(p, o, s) BOOST_PP_WHILE_141_C(BOOST_PP_BOOL(p##(142, s)), p, o, s)\n# define BOOST_PP_WHILE_142(p, o, s) BOOST_PP_WHILE_142_C(BOOST_PP_BOOL(p##(143, s)), p, o, s)\n# define BOOST_PP_WHILE_143(p, o, s) BOOST_PP_WHILE_143_C(BOOST_PP_BOOL(p##(144, s)), p, o, s)\n# define BOOST_PP_WHILE_144(p, o, s) BOOST_PP_WHILE_144_C(BOOST_PP_BOOL(p##(145, s)), p, o, s)\n# define BOOST_PP_WHILE_145(p, o, s) BOOST_PP_WHILE_145_C(BOOST_PP_BOOL(p##(146, s)), p, o, s)\n# define BOOST_PP_WHILE_146(p, o, s) BOOST_PP_WHILE_146_C(BOOST_PP_BOOL(p##(147, s)), p, o, s)\n# define BOOST_PP_WHILE_147(p, o, s) BOOST_PP_WHILE_147_C(BOOST_PP_BOOL(p##(148, s)), p, o, s)\n# define BOOST_PP_WHILE_148(p, o, s) BOOST_PP_WHILE_148_C(BOOST_PP_BOOL(p##(149, s)), p, o, s)\n# define BOOST_PP_WHILE_149(p, o, s) BOOST_PP_WHILE_149_C(BOOST_PP_BOOL(p##(150, s)), p, o, s)\n# define BOOST_PP_WHILE_150(p, o, s) BOOST_PP_WHILE_150_C(BOOST_PP_BOOL(p##(151, s)), p, o, s)\n# define BOOST_PP_WHILE_151(p, o, s) BOOST_PP_WHILE_151_C(BOOST_PP_BOOL(p##(152, s)), p, o, s)\n# define BOOST_PP_WHILE_152(p, o, s) BOOST_PP_WHILE_152_C(BOOST_PP_BOOL(p##(153, s)), p, o, s)\n# define BOOST_PP_WHILE_153(p, o, s) BOOST_PP_WHILE_153_C(BOOST_PP_BOOL(p##(154, s)), p, o, s)\n# define BOOST_PP_WHILE_154(p, o, s) BOOST_PP_WHILE_154_C(BOOST_PP_BOOL(p##(155, s)), p, o, s)\n# define BOOST_PP_WHILE_155(p, o, s) BOOST_PP_WHILE_155_C(BOOST_PP_BOOL(p##(156, s)), p, o, s)\n# define BOOST_PP_WHILE_156(p, o, s) BOOST_PP_WHILE_156_C(BOOST_PP_BOOL(p##(157, s)), p, o, s)\n# define BOOST_PP_WHILE_157(p, o, s) BOOST_PP_WHILE_157_C(BOOST_PP_BOOL(p##(158, s)), p, o, s)\n# define BOOST_PP_WHILE_158(p, o, s) BOOST_PP_WHILE_158_C(BOOST_PP_BOOL(p##(159, s)), p, o, s)\n# define BOOST_PP_WHILE_159(p, o, s) BOOST_PP_WHILE_159_C(BOOST_PP_BOOL(p##(160, s)), p, o, s)\n# define BOOST_PP_WHILE_160(p, o, s) BOOST_PP_WHILE_160_C(BOOST_PP_BOOL(p##(161, s)), p, o, s)\n# define BOOST_PP_WHILE_161(p, o, s) BOOST_PP_WHILE_161_C(BOOST_PP_BOOL(p##(162, s)), p, o, s)\n# define BOOST_PP_WHILE_162(p, o, s) BOOST_PP_WHILE_162_C(BOOST_PP_BOOL(p##(163, s)), p, o, s)\n# define BOOST_PP_WHILE_163(p, o, s) BOOST_PP_WHILE_163_C(BOOST_PP_BOOL(p##(164, s)), p, o, s)\n# define BOOST_PP_WHILE_164(p, o, s) BOOST_PP_WHILE_164_C(BOOST_PP_BOOL(p##(165, s)), p, o, s)\n# define BOOST_PP_WHILE_165(p, o, s) BOOST_PP_WHILE_165_C(BOOST_PP_BOOL(p##(166, s)), p, o, s)\n# define BOOST_PP_WHILE_166(p, o, s) BOOST_PP_WHILE_166_C(BOOST_PP_BOOL(p##(167, s)), p, o, s)\n# define BOOST_PP_WHILE_167(p, o, s) BOOST_PP_WHILE_167_C(BOOST_PP_BOOL(p##(168, s)), p, o, s)\n# define BOOST_PP_WHILE_168(p, o, s) BOOST_PP_WHILE_168_C(BOOST_PP_BOOL(p##(169, s)), p, o, s)\n# define BOOST_PP_WHILE_169(p, o, s) BOOST_PP_WHILE_169_C(BOOST_PP_BOOL(p##(170, s)), p, o, s)\n# define BOOST_PP_WHILE_170(p, o, s) BOOST_PP_WHILE_170_C(BOOST_PP_BOOL(p##(171, s)), p, o, s)\n# define BOOST_PP_WHILE_171(p, o, s) BOOST_PP_WHILE_171_C(BOOST_PP_BOOL(p##(172, s)), p, o, s)\n# define BOOST_PP_WHILE_172(p, o, s) BOOST_PP_WHILE_172_C(BOOST_PP_BOOL(p##(173, s)), p, o, s)\n# define BOOST_PP_WHILE_173(p, o, s) BOOST_PP_WHILE_173_C(BOOST_PP_BOOL(p##(174, s)), p, o, s)\n# define BOOST_PP_WHILE_174(p, o, s) BOOST_PP_WHILE_174_C(BOOST_PP_BOOL(p##(175, s)), p, o, s)\n# define BOOST_PP_WHILE_175(p, o, s) BOOST_PP_WHILE_175_C(BOOST_PP_BOOL(p##(176, s)), p, o, s)\n# define BOOST_PP_WHILE_176(p, o, s) BOOST_PP_WHILE_176_C(BOOST_PP_BOOL(p##(177, s)), p, o, s)\n# define BOOST_PP_WHILE_177(p, o, s) BOOST_PP_WHILE_177_C(BOOST_PP_BOOL(p##(178, s)), p, o, s)\n# define BOOST_PP_WHILE_178(p, o, s) BOOST_PP_WHILE_178_C(BOOST_PP_BOOL(p##(179, s)), p, o, s)\n# define BOOST_PP_WHILE_179(p, o, s) BOOST_PP_WHILE_179_C(BOOST_PP_BOOL(p##(180, s)), p, o, s)\n# define BOOST_PP_WHILE_180(p, o, s) BOOST_PP_WHILE_180_C(BOOST_PP_BOOL(p##(181, s)), p, o, s)\n# define BOOST_PP_WHILE_181(p, o, s) BOOST_PP_WHILE_181_C(BOOST_PP_BOOL(p##(182, s)), p, o, s)\n# define BOOST_PP_WHILE_182(p, o, s) BOOST_PP_WHILE_182_C(BOOST_PP_BOOL(p##(183, s)), p, o, s)\n# define BOOST_PP_WHILE_183(p, o, s) BOOST_PP_WHILE_183_C(BOOST_PP_BOOL(p##(184, s)), p, o, s)\n# define BOOST_PP_WHILE_184(p, o, s) BOOST_PP_WHILE_184_C(BOOST_PP_BOOL(p##(185, s)), p, o, s)\n# define BOOST_PP_WHILE_185(p, o, s) BOOST_PP_WHILE_185_C(BOOST_PP_BOOL(p##(186, s)), p, o, s)\n# define BOOST_PP_WHILE_186(p, o, s) BOOST_PP_WHILE_186_C(BOOST_PP_BOOL(p##(187, s)), p, o, s)\n# define BOOST_PP_WHILE_187(p, o, s) BOOST_PP_WHILE_187_C(BOOST_PP_BOOL(p##(188, s)), p, o, s)\n# define BOOST_PP_WHILE_188(p, o, s) BOOST_PP_WHILE_188_C(BOOST_PP_BOOL(p##(189, s)), p, o, s)\n# define BOOST_PP_WHILE_189(p, o, s) BOOST_PP_WHILE_189_C(BOOST_PP_BOOL(p##(190, s)), p, o, s)\n# define BOOST_PP_WHILE_190(p, o, s) BOOST_PP_WHILE_190_C(BOOST_PP_BOOL(p##(191, s)), p, o, s)\n# define BOOST_PP_WHILE_191(p, o, s) BOOST_PP_WHILE_191_C(BOOST_PP_BOOL(p##(192, s)), p, o, s)\n# define BOOST_PP_WHILE_192(p, o, s) BOOST_PP_WHILE_192_C(BOOST_PP_BOOL(p##(193, s)), p, o, s)\n# define BOOST_PP_WHILE_193(p, o, s) BOOST_PP_WHILE_193_C(BOOST_PP_BOOL(p##(194, s)), p, o, s)\n# define BOOST_PP_WHILE_194(p, o, s) BOOST_PP_WHILE_194_C(BOOST_PP_BOOL(p##(195, s)), p, o, s)\n# define BOOST_PP_WHILE_195(p, o, s) BOOST_PP_WHILE_195_C(BOOST_PP_BOOL(p##(196, s)), p, o, s)\n# define BOOST_PP_WHILE_196(p, o, s) BOOST_PP_WHILE_196_C(BOOST_PP_BOOL(p##(197, s)), p, o, s)\n# define BOOST_PP_WHILE_197(p, o, s) BOOST_PP_WHILE_197_C(BOOST_PP_BOOL(p##(198, s)), p, o, s)\n# define BOOST_PP_WHILE_198(p, o, s) BOOST_PP_WHILE_198_C(BOOST_PP_BOOL(p##(199, s)), p, o, s)\n# define BOOST_PP_WHILE_199(p, o, s) BOOST_PP_WHILE_199_C(BOOST_PP_BOOL(p##(200, s)), p, o, s)\n# define BOOST_PP_WHILE_200(p, o, s) BOOST_PP_WHILE_200_C(BOOST_PP_BOOL(p##(201, s)), p, o, s)\n# define BOOST_PP_WHILE_201(p, o, s) BOOST_PP_WHILE_201_C(BOOST_PP_BOOL(p##(202, s)), p, o, s)\n# define BOOST_PP_WHILE_202(p, o, s) BOOST_PP_WHILE_202_C(BOOST_PP_BOOL(p##(203, s)), p, o, s)\n# define BOOST_PP_WHILE_203(p, o, s) BOOST_PP_WHILE_203_C(BOOST_PP_BOOL(p##(204, s)), p, o, s)\n# define BOOST_PP_WHILE_204(p, o, s) BOOST_PP_WHILE_204_C(BOOST_PP_BOOL(p##(205, s)), p, o, s)\n# define BOOST_PP_WHILE_205(p, o, s) BOOST_PP_WHILE_205_C(BOOST_PP_BOOL(p##(206, s)), p, o, s)\n# define BOOST_PP_WHILE_206(p, o, s) BOOST_PP_WHILE_206_C(BOOST_PP_BOOL(p##(207, s)), p, o, s)\n# define BOOST_PP_WHILE_207(p, o, s) BOOST_PP_WHILE_207_C(BOOST_PP_BOOL(p##(208, s)), p, o, s)\n# define BOOST_PP_WHILE_208(p, o, s) BOOST_PP_WHILE_208_C(BOOST_PP_BOOL(p##(209, s)), p, o, s)\n# define BOOST_PP_WHILE_209(p, o, s) BOOST_PP_WHILE_209_C(BOOST_PP_BOOL(p##(210, s)), p, o, s)\n# define BOOST_PP_WHILE_210(p, o, s) BOOST_PP_WHILE_210_C(BOOST_PP_BOOL(p##(211, s)), p, o, s)\n# define BOOST_PP_WHILE_211(p, o, s) BOOST_PP_WHILE_211_C(BOOST_PP_BOOL(p##(212, s)), p, o, s)\n# define BOOST_PP_WHILE_212(p, o, s) BOOST_PP_WHILE_212_C(BOOST_PP_BOOL(p##(213, s)), p, o, s)\n# define BOOST_PP_WHILE_213(p, o, s) BOOST_PP_WHILE_213_C(BOOST_PP_BOOL(p##(214, s)), p, o, s)\n# define BOOST_PP_WHILE_214(p, o, s) BOOST_PP_WHILE_214_C(BOOST_PP_BOOL(p##(215, s)), p, o, s)\n# define BOOST_PP_WHILE_215(p, o, s) BOOST_PP_WHILE_215_C(BOOST_PP_BOOL(p##(216, s)), p, o, s)\n# define BOOST_PP_WHILE_216(p, o, s) BOOST_PP_WHILE_216_C(BOOST_PP_BOOL(p##(217, s)), p, o, s)\n# define BOOST_PP_WHILE_217(p, o, s) BOOST_PP_WHILE_217_C(BOOST_PP_BOOL(p##(218, s)), p, o, s)\n# define BOOST_PP_WHILE_218(p, o, s) BOOST_PP_WHILE_218_C(BOOST_PP_BOOL(p##(219, s)), p, o, s)\n# define BOOST_PP_WHILE_219(p, o, s) BOOST_PP_WHILE_219_C(BOOST_PP_BOOL(p##(220, s)), p, o, s)\n# define BOOST_PP_WHILE_220(p, o, s) BOOST_PP_WHILE_220_C(BOOST_PP_BOOL(p##(221, s)), p, o, s)\n# define BOOST_PP_WHILE_221(p, o, s) BOOST_PP_WHILE_221_C(BOOST_PP_BOOL(p##(222, s)), p, o, s)\n# define BOOST_PP_WHILE_222(p, o, s) BOOST_PP_WHILE_222_C(BOOST_PP_BOOL(p##(223, s)), p, o, s)\n# define BOOST_PP_WHILE_223(p, o, s) BOOST_PP_WHILE_223_C(BOOST_PP_BOOL(p##(224, s)), p, o, s)\n# define BOOST_PP_WHILE_224(p, o, s) BOOST_PP_WHILE_224_C(BOOST_PP_BOOL(p##(225, s)), p, o, s)\n# define BOOST_PP_WHILE_225(p, o, s) BOOST_PP_WHILE_225_C(BOOST_PP_BOOL(p##(226, s)), p, o, s)\n# define BOOST_PP_WHILE_226(p, o, s) BOOST_PP_WHILE_226_C(BOOST_PP_BOOL(p##(227, s)), p, o, s)\n# define BOOST_PP_WHILE_227(p, o, s) BOOST_PP_WHILE_227_C(BOOST_PP_BOOL(p##(228, s)), p, o, s)\n# define BOOST_PP_WHILE_228(p, o, s) BOOST_PP_WHILE_228_C(BOOST_PP_BOOL(p##(229, s)), p, o, s)\n# define BOOST_PP_WHILE_229(p, o, s) BOOST_PP_WHILE_229_C(BOOST_PP_BOOL(p##(230, s)), p, o, s)\n# define BOOST_PP_WHILE_230(p, o, s) BOOST_PP_WHILE_230_C(BOOST_PP_BOOL(p##(231, s)), p, o, s)\n# define BOOST_PP_WHILE_231(p, o, s) BOOST_PP_WHILE_231_C(BOOST_PP_BOOL(p##(232, s)), p, o, s)\n# define BOOST_PP_WHILE_232(p, o, s) BOOST_PP_WHILE_232_C(BOOST_PP_BOOL(p##(233, s)), p, o, s)\n# define BOOST_PP_WHILE_233(p, o, s) BOOST_PP_WHILE_233_C(BOOST_PP_BOOL(p##(234, s)), p, o, s)\n# define BOOST_PP_WHILE_234(p, o, s) BOOST_PP_WHILE_234_C(BOOST_PP_BOOL(p##(235, s)), p, o, s)\n# define BOOST_PP_WHILE_235(p, o, s) BOOST_PP_WHILE_235_C(BOOST_PP_BOOL(p##(236, s)), p, o, s)\n# define BOOST_PP_WHILE_236(p, o, s) BOOST_PP_WHILE_236_C(BOOST_PP_BOOL(p##(237, s)), p, o, s)\n# define BOOST_PP_WHILE_237(p, o, s) BOOST_PP_WHILE_237_C(BOOST_PP_BOOL(p##(238, s)), p, o, s)\n# define BOOST_PP_WHILE_238(p, o, s) BOOST_PP_WHILE_238_C(BOOST_PP_BOOL(p##(239, s)), p, o, s)\n# define BOOST_PP_WHILE_239(p, o, s) BOOST_PP_WHILE_239_C(BOOST_PP_BOOL(p##(240, s)), p, o, s)\n# define BOOST_PP_WHILE_240(p, o, s) BOOST_PP_WHILE_240_C(BOOST_PP_BOOL(p##(241, s)), p, o, s)\n# define BOOST_PP_WHILE_241(p, o, s) BOOST_PP_WHILE_241_C(BOOST_PP_BOOL(p##(242, s)), p, o, s)\n# define BOOST_PP_WHILE_242(p, o, s) BOOST_PP_WHILE_242_C(BOOST_PP_BOOL(p##(243, s)), p, o, s)\n# define BOOST_PP_WHILE_243(p, o, s) BOOST_PP_WHILE_243_C(BOOST_PP_BOOL(p##(244, s)), p, o, s)\n# define BOOST_PP_WHILE_244(p, o, s) BOOST_PP_WHILE_244_C(BOOST_PP_BOOL(p##(245, s)), p, o, s)\n# define BOOST_PP_WHILE_245(p, o, s) BOOST_PP_WHILE_245_C(BOOST_PP_BOOL(p##(246, s)), p, o, s)\n# define BOOST_PP_WHILE_246(p, o, s) BOOST_PP_WHILE_246_C(BOOST_PP_BOOL(p##(247, s)), p, o, s)\n# define BOOST_PP_WHILE_247(p, o, s) BOOST_PP_WHILE_247_C(BOOST_PP_BOOL(p##(248, s)), p, o, s)\n# define BOOST_PP_WHILE_248(p, o, s) BOOST_PP_WHILE_248_C(BOOST_PP_BOOL(p##(249, s)), p, o, s)\n# define BOOST_PP_WHILE_249(p, o, s) BOOST_PP_WHILE_249_C(BOOST_PP_BOOL(p##(250, s)), p, o, s)\n# define BOOST_PP_WHILE_250(p, o, s) BOOST_PP_WHILE_250_C(BOOST_PP_BOOL(p##(251, s)), p, o, s)\n# define BOOST_PP_WHILE_251(p, o, s) BOOST_PP_WHILE_251_C(BOOST_PP_BOOL(p##(252, s)), p, o, s)\n# define BOOST_PP_WHILE_252(p, o, s) BOOST_PP_WHILE_252_C(BOOST_PP_BOOL(p##(253, s)), p, o, s)\n# define BOOST_PP_WHILE_253(p, o, s) BOOST_PP_WHILE_253_C(BOOST_PP_BOOL(p##(254, s)), p, o, s)\n# define BOOST_PP_WHILE_254(p, o, s) BOOST_PP_WHILE_254_C(BOOST_PP_BOOL(p##(255, s)), p, o, s)\n# define BOOST_PP_WHILE_255(p, o, s) BOOST_PP_WHILE_255_C(BOOST_PP_BOOL(p##(256, s)), p, o, s)\n# define BOOST_PP_WHILE_256(p, o, s) BOOST_PP_WHILE_256_C(BOOST_PP_BOOL(p##(257, s)), p, o, s)\n#\n# define BOOST_PP_WHILE_1_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_2, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(2, s))\n# define BOOST_PP_WHILE_2_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_3, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(3, s))\n# define BOOST_PP_WHILE_3_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_4, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(4, s))\n# define BOOST_PP_WHILE_4_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_5, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(5, s))\n# define BOOST_PP_WHILE_5_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_6, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(6, s))\n# define BOOST_PP_WHILE_6_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_7, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(7, s))\n# define BOOST_PP_WHILE_7_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_8, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(8, s))\n# define BOOST_PP_WHILE_8_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_9, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(9, s))\n# define BOOST_PP_WHILE_9_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_10, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(10, s))\n# define BOOST_PP_WHILE_10_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_11, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(11, s))\n# define BOOST_PP_WHILE_11_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_12, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(12, s))\n# define BOOST_PP_WHILE_12_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_13, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(13, s))\n# define BOOST_PP_WHILE_13_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_14, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(14, s))\n# define BOOST_PP_WHILE_14_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_15, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(15, s))\n# define BOOST_PP_WHILE_15_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_16, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(16, s))\n# define BOOST_PP_WHILE_16_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_17, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(17, s))\n# define BOOST_PP_WHILE_17_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_18, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(18, s))\n# define BOOST_PP_WHILE_18_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_19, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(19, s))\n# define BOOST_PP_WHILE_19_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_20, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(20, s))\n# define BOOST_PP_WHILE_20_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_21, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(21, s))\n# define BOOST_PP_WHILE_21_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_22, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(22, s))\n# define BOOST_PP_WHILE_22_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_23, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(23, s))\n# define BOOST_PP_WHILE_23_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_24, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(24, s))\n# define BOOST_PP_WHILE_24_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_25, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(25, s))\n# define BOOST_PP_WHILE_25_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_26, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(26, s))\n# define BOOST_PP_WHILE_26_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_27, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(27, s))\n# define BOOST_PP_WHILE_27_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_28, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(28, s))\n# define BOOST_PP_WHILE_28_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_29, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(29, s))\n# define BOOST_PP_WHILE_29_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_30, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(30, s))\n# define BOOST_PP_WHILE_30_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_31, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(31, s))\n# define BOOST_PP_WHILE_31_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_32, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(32, s))\n# define BOOST_PP_WHILE_32_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_33, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(33, s))\n# define BOOST_PP_WHILE_33_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_34, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(34, s))\n# define BOOST_PP_WHILE_34_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_35, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(35, s))\n# define BOOST_PP_WHILE_35_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_36, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(36, s))\n# define BOOST_PP_WHILE_36_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_37, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(37, s))\n# define BOOST_PP_WHILE_37_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_38, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(38, s))\n# define BOOST_PP_WHILE_38_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_39, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(39, s))\n# define BOOST_PP_WHILE_39_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_40, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(40, s))\n# define BOOST_PP_WHILE_40_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_41, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(41, s))\n# define BOOST_PP_WHILE_41_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_42, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(42, s))\n# define BOOST_PP_WHILE_42_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_43, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(43, s))\n# define BOOST_PP_WHILE_43_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_44, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(44, s))\n# define BOOST_PP_WHILE_44_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_45, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(45, s))\n# define BOOST_PP_WHILE_45_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_46, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(46, s))\n# define BOOST_PP_WHILE_46_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_47, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(47, s))\n# define BOOST_PP_WHILE_47_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_48, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(48, s))\n# define BOOST_PP_WHILE_48_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_49, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(49, s))\n# define BOOST_PP_WHILE_49_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_50, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(50, s))\n# define BOOST_PP_WHILE_50_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_51, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(51, s))\n# define BOOST_PP_WHILE_51_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_52, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(52, s))\n# define BOOST_PP_WHILE_52_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_53, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(53, s))\n# define BOOST_PP_WHILE_53_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_54, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(54, s))\n# define BOOST_PP_WHILE_54_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_55, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(55, s))\n# define BOOST_PP_WHILE_55_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_56, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(56, s))\n# define BOOST_PP_WHILE_56_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_57, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(57, s))\n# define BOOST_PP_WHILE_57_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_58, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(58, s))\n# define BOOST_PP_WHILE_58_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_59, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(59, s))\n# define BOOST_PP_WHILE_59_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_60, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(60, s))\n# define BOOST_PP_WHILE_60_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_61, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(61, s))\n# define BOOST_PP_WHILE_61_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_62, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(62, s))\n# define BOOST_PP_WHILE_62_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_63, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(63, s))\n# define BOOST_PP_WHILE_63_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_64, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(64, s))\n# define BOOST_PP_WHILE_64_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_65, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(65, s))\n# define BOOST_PP_WHILE_65_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_66, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(66, s))\n# define BOOST_PP_WHILE_66_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_67, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(67, s))\n# define BOOST_PP_WHILE_67_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_68, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(68, s))\n# define BOOST_PP_WHILE_68_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_69, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(69, s))\n# define BOOST_PP_WHILE_69_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_70, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(70, s))\n# define BOOST_PP_WHILE_70_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_71, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(71, s))\n# define BOOST_PP_WHILE_71_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_72, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(72, s))\n# define BOOST_PP_WHILE_72_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_73, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(73, s))\n# define BOOST_PP_WHILE_73_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_74, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(74, s))\n# define BOOST_PP_WHILE_74_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_75, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(75, s))\n# define BOOST_PP_WHILE_75_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_76, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(76, s))\n# define BOOST_PP_WHILE_76_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_77, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(77, s))\n# define BOOST_PP_WHILE_77_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_78, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(78, s))\n# define BOOST_PP_WHILE_78_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_79, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(79, s))\n# define BOOST_PP_WHILE_79_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_80, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(80, s))\n# define BOOST_PP_WHILE_80_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_81, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(81, s))\n# define BOOST_PP_WHILE_81_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_82, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(82, s))\n# define BOOST_PP_WHILE_82_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_83, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(83, s))\n# define BOOST_PP_WHILE_83_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_84, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(84, s))\n# define BOOST_PP_WHILE_84_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_85, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(85, s))\n# define BOOST_PP_WHILE_85_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_86, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(86, s))\n# define BOOST_PP_WHILE_86_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_87, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(87, s))\n# define BOOST_PP_WHILE_87_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_88, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(88, s))\n# define BOOST_PP_WHILE_88_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_89, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(89, s))\n# define BOOST_PP_WHILE_89_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_90, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(90, s))\n# define BOOST_PP_WHILE_90_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_91, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(91, s))\n# define BOOST_PP_WHILE_91_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_92, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(92, s))\n# define BOOST_PP_WHILE_92_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_93, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(93, s))\n# define BOOST_PP_WHILE_93_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_94, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(94, s))\n# define BOOST_PP_WHILE_94_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_95, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(95, s))\n# define BOOST_PP_WHILE_95_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_96, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(96, s))\n# define BOOST_PP_WHILE_96_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_97, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(97, s))\n# define BOOST_PP_WHILE_97_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_98, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(98, s))\n# define BOOST_PP_WHILE_98_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_99, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(99, s))\n# define BOOST_PP_WHILE_99_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_100, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(100, s))\n# define BOOST_PP_WHILE_100_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_101, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(101, s))\n# define BOOST_PP_WHILE_101_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_102, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(102, s))\n# define BOOST_PP_WHILE_102_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_103, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(103, s))\n# define BOOST_PP_WHILE_103_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_104, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(104, s))\n# define BOOST_PP_WHILE_104_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_105, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(105, s))\n# define BOOST_PP_WHILE_105_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_106, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(106, s))\n# define BOOST_PP_WHILE_106_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_107, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(107, s))\n# define BOOST_PP_WHILE_107_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_108, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(108, s))\n# define BOOST_PP_WHILE_108_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_109, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(109, s))\n# define BOOST_PP_WHILE_109_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_110, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(110, s))\n# define BOOST_PP_WHILE_110_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_111, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(111, s))\n# define BOOST_PP_WHILE_111_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_112, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(112, s))\n# define BOOST_PP_WHILE_112_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_113, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(113, s))\n# define BOOST_PP_WHILE_113_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_114, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(114, s))\n# define BOOST_PP_WHILE_114_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_115, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(115, s))\n# define BOOST_PP_WHILE_115_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_116, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(116, s))\n# define BOOST_PP_WHILE_116_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_117, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(117, s))\n# define BOOST_PP_WHILE_117_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_118, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(118, s))\n# define BOOST_PP_WHILE_118_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_119, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(119, s))\n# define BOOST_PP_WHILE_119_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_120, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(120, s))\n# define BOOST_PP_WHILE_120_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_121, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(121, s))\n# define BOOST_PP_WHILE_121_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_122, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(122, s))\n# define BOOST_PP_WHILE_122_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_123, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(123, s))\n# define BOOST_PP_WHILE_123_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_124, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(124, s))\n# define BOOST_PP_WHILE_124_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_125, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(125, s))\n# define BOOST_PP_WHILE_125_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_126, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(126, s))\n# define BOOST_PP_WHILE_126_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_127, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(127, s))\n# define BOOST_PP_WHILE_127_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_128, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(128, s))\n# define BOOST_PP_WHILE_128_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_129, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(129, s))\n# define BOOST_PP_WHILE_129_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_130, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(130, s))\n# define BOOST_PP_WHILE_130_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_131, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(131, s))\n# define BOOST_PP_WHILE_131_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_132, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(132, s))\n# define BOOST_PP_WHILE_132_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_133, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(133, s))\n# define BOOST_PP_WHILE_133_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_134, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(134, s))\n# define BOOST_PP_WHILE_134_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_135, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(135, s))\n# define BOOST_PP_WHILE_135_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_136, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(136, s))\n# define BOOST_PP_WHILE_136_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_137, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(137, s))\n# define BOOST_PP_WHILE_137_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_138, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(138, s))\n# define BOOST_PP_WHILE_138_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_139, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(139, s))\n# define BOOST_PP_WHILE_139_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_140, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(140, s))\n# define BOOST_PP_WHILE_140_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_141, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(141, s))\n# define BOOST_PP_WHILE_141_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_142, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(142, s))\n# define BOOST_PP_WHILE_142_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_143, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(143, s))\n# define BOOST_PP_WHILE_143_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_144, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(144, s))\n# define BOOST_PP_WHILE_144_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_145, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(145, s))\n# define BOOST_PP_WHILE_145_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_146, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(146, s))\n# define BOOST_PP_WHILE_146_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_147, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(147, s))\n# define BOOST_PP_WHILE_147_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_148, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(148, s))\n# define BOOST_PP_WHILE_148_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_149, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(149, s))\n# define BOOST_PP_WHILE_149_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_150, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(150, s))\n# define BOOST_PP_WHILE_150_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_151, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(151, s))\n# define BOOST_PP_WHILE_151_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_152, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(152, s))\n# define BOOST_PP_WHILE_152_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_153, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(153, s))\n# define BOOST_PP_WHILE_153_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_154, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(154, s))\n# define BOOST_PP_WHILE_154_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_155, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(155, s))\n# define BOOST_PP_WHILE_155_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_156, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(156, s))\n# define BOOST_PP_WHILE_156_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_157, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(157, s))\n# define BOOST_PP_WHILE_157_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_158, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(158, s))\n# define BOOST_PP_WHILE_158_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_159, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(159, s))\n# define BOOST_PP_WHILE_159_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_160, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(160, s))\n# define BOOST_PP_WHILE_160_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_161, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(161, s))\n# define BOOST_PP_WHILE_161_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_162, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(162, s))\n# define BOOST_PP_WHILE_162_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_163, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(163, s))\n# define BOOST_PP_WHILE_163_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_164, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(164, s))\n# define BOOST_PP_WHILE_164_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_165, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(165, s))\n# define BOOST_PP_WHILE_165_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_166, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(166, s))\n# define BOOST_PP_WHILE_166_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_167, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(167, s))\n# define BOOST_PP_WHILE_167_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_168, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(168, s))\n# define BOOST_PP_WHILE_168_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_169, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(169, s))\n# define BOOST_PP_WHILE_169_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_170, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(170, s))\n# define BOOST_PP_WHILE_170_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_171, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(171, s))\n# define BOOST_PP_WHILE_171_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_172, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(172, s))\n# define BOOST_PP_WHILE_172_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_173, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(173, s))\n# define BOOST_PP_WHILE_173_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_174, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(174, s))\n# define BOOST_PP_WHILE_174_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_175, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(175, s))\n# define BOOST_PP_WHILE_175_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_176, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(176, s))\n# define BOOST_PP_WHILE_176_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_177, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(177, s))\n# define BOOST_PP_WHILE_177_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_178, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(178, s))\n# define BOOST_PP_WHILE_178_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_179, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(179, s))\n# define BOOST_PP_WHILE_179_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_180, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(180, s))\n# define BOOST_PP_WHILE_180_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_181, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(181, s))\n# define BOOST_PP_WHILE_181_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_182, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(182, s))\n# define BOOST_PP_WHILE_182_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_183, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(183, s))\n# define BOOST_PP_WHILE_183_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_184, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(184, s))\n# define BOOST_PP_WHILE_184_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_185, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(185, s))\n# define BOOST_PP_WHILE_185_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_186, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(186, s))\n# define BOOST_PP_WHILE_186_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_187, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(187, s))\n# define BOOST_PP_WHILE_187_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_188, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(188, s))\n# define BOOST_PP_WHILE_188_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_189, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(189, s))\n# define BOOST_PP_WHILE_189_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_190, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(190, s))\n# define BOOST_PP_WHILE_190_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_191, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(191, s))\n# define BOOST_PP_WHILE_191_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_192, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(192, s))\n# define BOOST_PP_WHILE_192_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_193, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(193, s))\n# define BOOST_PP_WHILE_193_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_194, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(194, s))\n# define BOOST_PP_WHILE_194_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_195, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(195, s))\n# define BOOST_PP_WHILE_195_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_196, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(196, s))\n# define BOOST_PP_WHILE_196_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_197, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(197, s))\n# define BOOST_PP_WHILE_197_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_198, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(198, s))\n# define BOOST_PP_WHILE_198_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_199, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(199, s))\n# define BOOST_PP_WHILE_199_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_200, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(200, s))\n# define BOOST_PP_WHILE_200_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_201, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(201, s))\n# define BOOST_PP_WHILE_201_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_202, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(202, s))\n# define BOOST_PP_WHILE_202_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_203, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(203, s))\n# define BOOST_PP_WHILE_203_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_204, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(204, s))\n# define BOOST_PP_WHILE_204_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_205, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(205, s))\n# define BOOST_PP_WHILE_205_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_206, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(206, s))\n# define BOOST_PP_WHILE_206_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_207, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(207, s))\n# define BOOST_PP_WHILE_207_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_208, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(208, s))\n# define BOOST_PP_WHILE_208_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_209, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(209, s))\n# define BOOST_PP_WHILE_209_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_210, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(210, s))\n# define BOOST_PP_WHILE_210_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_211, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(211, s))\n# define BOOST_PP_WHILE_211_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_212, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(212, s))\n# define BOOST_PP_WHILE_212_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_213, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(213, s))\n# define BOOST_PP_WHILE_213_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_214, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(214, s))\n# define BOOST_PP_WHILE_214_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_215, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(215, s))\n# define BOOST_PP_WHILE_215_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_216, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(216, s))\n# define BOOST_PP_WHILE_216_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_217, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(217, s))\n# define BOOST_PP_WHILE_217_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_218, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(218, s))\n# define BOOST_PP_WHILE_218_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_219, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(219, s))\n# define BOOST_PP_WHILE_219_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_220, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(220, s))\n# define BOOST_PP_WHILE_220_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_221, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(221, s))\n# define BOOST_PP_WHILE_221_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_222, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(222, s))\n# define BOOST_PP_WHILE_222_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_223, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(223, s))\n# define BOOST_PP_WHILE_223_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_224, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(224, s))\n# define BOOST_PP_WHILE_224_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_225, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(225, s))\n# define BOOST_PP_WHILE_225_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_226, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(226, s))\n# define BOOST_PP_WHILE_226_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_227, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(227, s))\n# define BOOST_PP_WHILE_227_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_228, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(228, s))\n# define BOOST_PP_WHILE_228_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_229, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(229, s))\n# define BOOST_PP_WHILE_229_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_230, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(230, s))\n# define BOOST_PP_WHILE_230_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_231, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(231, s))\n# define BOOST_PP_WHILE_231_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_232, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(232, s))\n# define BOOST_PP_WHILE_232_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_233, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(233, s))\n# define BOOST_PP_WHILE_233_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_234, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(234, s))\n# define BOOST_PP_WHILE_234_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_235, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(235, s))\n# define BOOST_PP_WHILE_235_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_236, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(236, s))\n# define BOOST_PP_WHILE_236_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_237, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(237, s))\n# define BOOST_PP_WHILE_237_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_238, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(238, s))\n# define BOOST_PP_WHILE_238_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_239, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(239, s))\n# define BOOST_PP_WHILE_239_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_240, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(240, s))\n# define BOOST_PP_WHILE_240_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_241, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(241, s))\n# define BOOST_PP_WHILE_241_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_242, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(242, s))\n# define BOOST_PP_WHILE_242_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_243, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(243, s))\n# define BOOST_PP_WHILE_243_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_244, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(244, s))\n# define BOOST_PP_WHILE_244_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_245, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(245, s))\n# define BOOST_PP_WHILE_245_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_246, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(246, s))\n# define BOOST_PP_WHILE_246_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_247, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(247, s))\n# define BOOST_PP_WHILE_247_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_248, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(248, s))\n# define BOOST_PP_WHILE_248_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_249, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(249, s))\n# define BOOST_PP_WHILE_249_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_250, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(250, s))\n# define BOOST_PP_WHILE_250_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_251, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(251, s))\n# define BOOST_PP_WHILE_251_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_252, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(252, s))\n# define BOOST_PP_WHILE_252_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_253, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(253, s))\n# define BOOST_PP_WHILE_253_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_254, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(254, s))\n# define BOOST_PP_WHILE_254_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_255, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(255, s))\n# define BOOST_PP_WHILE_255_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_256, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(256, s))\n# define BOOST_PP_WHILE_256_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_257, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(257, s))\n#\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/control/detail/edg/while.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_CONTROL_DETAIL_EDG_WHILE_HPP\n# define BOOST_PREPROCESSOR_CONTROL_DETAIL_EDG_WHILE_HPP\n#\n# include <boost/preprocessor/control/if.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n#\n# define BOOST_PP_WHILE_1(p, o, s) BOOST_PP_WHILE_1_I(p, o, s)\n# define BOOST_PP_WHILE_2(p, o, s) BOOST_PP_WHILE_2_I(p, o, s)\n# define BOOST_PP_WHILE_3(p, o, s) BOOST_PP_WHILE_3_I(p, o, s)\n# define BOOST_PP_WHILE_4(p, o, s) BOOST_PP_WHILE_4_I(p, o, s)\n# define BOOST_PP_WHILE_5(p, o, s) BOOST_PP_WHILE_5_I(p, o, s)\n# define BOOST_PP_WHILE_6(p, o, s) BOOST_PP_WHILE_6_I(p, o, s)\n# define BOOST_PP_WHILE_7(p, o, s) BOOST_PP_WHILE_7_I(p, o, s)\n# define BOOST_PP_WHILE_8(p, o, s) BOOST_PP_WHILE_8_I(p, o, s)\n# define BOOST_PP_WHILE_9(p, o, s) BOOST_PP_WHILE_9_I(p, o, s)\n# define BOOST_PP_WHILE_10(p, o, s) BOOST_PP_WHILE_10_I(p, o, s)\n# define BOOST_PP_WHILE_11(p, o, s) BOOST_PP_WHILE_11_I(p, o, s)\n# define BOOST_PP_WHILE_12(p, o, s) BOOST_PP_WHILE_12_I(p, o, s)\n# define BOOST_PP_WHILE_13(p, o, s) BOOST_PP_WHILE_13_I(p, o, s)\n# define BOOST_PP_WHILE_14(p, o, s) BOOST_PP_WHILE_14_I(p, o, s)\n# define BOOST_PP_WHILE_15(p, o, s) BOOST_PP_WHILE_15_I(p, o, s)\n# define BOOST_PP_WHILE_16(p, o, s) BOOST_PP_WHILE_16_I(p, o, s)\n# define BOOST_PP_WHILE_17(p, o, s) BOOST_PP_WHILE_17_I(p, o, s)\n# define BOOST_PP_WHILE_18(p, o, s) BOOST_PP_WHILE_18_I(p, o, s)\n# define BOOST_PP_WHILE_19(p, o, s) BOOST_PP_WHILE_19_I(p, o, s)\n# define BOOST_PP_WHILE_20(p, o, s) BOOST_PP_WHILE_20_I(p, o, s)\n# define BOOST_PP_WHILE_21(p, o, s) BOOST_PP_WHILE_21_I(p, o, s)\n# define BOOST_PP_WHILE_22(p, o, s) BOOST_PP_WHILE_22_I(p, o, s)\n# define BOOST_PP_WHILE_23(p, o, s) BOOST_PP_WHILE_23_I(p, o, s)\n# define BOOST_PP_WHILE_24(p, o, s) BOOST_PP_WHILE_24_I(p, o, s)\n# define BOOST_PP_WHILE_25(p, o, s) BOOST_PP_WHILE_25_I(p, o, s)\n# define BOOST_PP_WHILE_26(p, o, s) BOOST_PP_WHILE_26_I(p, o, s)\n# define BOOST_PP_WHILE_27(p, o, s) BOOST_PP_WHILE_27_I(p, o, s)\n# define BOOST_PP_WHILE_28(p, o, s) BOOST_PP_WHILE_28_I(p, o, s)\n# define BOOST_PP_WHILE_29(p, o, s) BOOST_PP_WHILE_29_I(p, o, s)\n# define BOOST_PP_WHILE_30(p, o, s) BOOST_PP_WHILE_30_I(p, o, s)\n# define BOOST_PP_WHILE_31(p, o, s) BOOST_PP_WHILE_31_I(p, o, s)\n# define BOOST_PP_WHILE_32(p, o, s) BOOST_PP_WHILE_32_I(p, o, s)\n# define BOOST_PP_WHILE_33(p, o, s) BOOST_PP_WHILE_33_I(p, o, s)\n# define BOOST_PP_WHILE_34(p, o, s) BOOST_PP_WHILE_34_I(p, o, s)\n# define BOOST_PP_WHILE_35(p, o, s) BOOST_PP_WHILE_35_I(p, o, s)\n# define BOOST_PP_WHILE_36(p, o, s) BOOST_PP_WHILE_36_I(p, o, s)\n# define BOOST_PP_WHILE_37(p, o, s) BOOST_PP_WHILE_37_I(p, o, s)\n# define BOOST_PP_WHILE_38(p, o, s) BOOST_PP_WHILE_38_I(p, o, s)\n# define BOOST_PP_WHILE_39(p, o, s) BOOST_PP_WHILE_39_I(p, o, s)\n# define BOOST_PP_WHILE_40(p, o, s) BOOST_PP_WHILE_40_I(p, o, s)\n# define BOOST_PP_WHILE_41(p, o, s) BOOST_PP_WHILE_41_I(p, o, s)\n# define BOOST_PP_WHILE_42(p, o, s) BOOST_PP_WHILE_42_I(p, o, s)\n# define BOOST_PP_WHILE_43(p, o, s) BOOST_PP_WHILE_43_I(p, o, s)\n# define BOOST_PP_WHILE_44(p, o, s) BOOST_PP_WHILE_44_I(p, o, s)\n# define BOOST_PP_WHILE_45(p, o, s) BOOST_PP_WHILE_45_I(p, o, s)\n# define BOOST_PP_WHILE_46(p, o, s) BOOST_PP_WHILE_46_I(p, o, s)\n# define BOOST_PP_WHILE_47(p, o, s) BOOST_PP_WHILE_47_I(p, o, s)\n# define BOOST_PP_WHILE_48(p, o, s) BOOST_PP_WHILE_48_I(p, o, s)\n# define BOOST_PP_WHILE_49(p, o, s) BOOST_PP_WHILE_49_I(p, o, s)\n# define BOOST_PP_WHILE_50(p, o, s) BOOST_PP_WHILE_50_I(p, o, s)\n# define BOOST_PP_WHILE_51(p, o, s) BOOST_PP_WHILE_51_I(p, o, s)\n# define BOOST_PP_WHILE_52(p, o, s) BOOST_PP_WHILE_52_I(p, o, s)\n# define BOOST_PP_WHILE_53(p, o, s) BOOST_PP_WHILE_53_I(p, o, s)\n# define BOOST_PP_WHILE_54(p, o, s) BOOST_PP_WHILE_54_I(p, o, s)\n# define BOOST_PP_WHILE_55(p, o, s) BOOST_PP_WHILE_55_I(p, o, s)\n# define BOOST_PP_WHILE_56(p, o, s) BOOST_PP_WHILE_56_I(p, o, s)\n# define BOOST_PP_WHILE_57(p, o, s) BOOST_PP_WHILE_57_I(p, o, s)\n# define BOOST_PP_WHILE_58(p, o, s) BOOST_PP_WHILE_58_I(p, o, s)\n# define BOOST_PP_WHILE_59(p, o, s) BOOST_PP_WHILE_59_I(p, o, s)\n# define BOOST_PP_WHILE_60(p, o, s) BOOST_PP_WHILE_60_I(p, o, s)\n# define BOOST_PP_WHILE_61(p, o, s) BOOST_PP_WHILE_61_I(p, o, s)\n# define BOOST_PP_WHILE_62(p, o, s) BOOST_PP_WHILE_62_I(p, o, s)\n# define BOOST_PP_WHILE_63(p, o, s) BOOST_PP_WHILE_63_I(p, o, s)\n# define BOOST_PP_WHILE_64(p, o, s) BOOST_PP_WHILE_64_I(p, o, s)\n# define BOOST_PP_WHILE_65(p, o, s) BOOST_PP_WHILE_65_I(p, o, s)\n# define BOOST_PP_WHILE_66(p, o, s) BOOST_PP_WHILE_66_I(p, o, s)\n# define BOOST_PP_WHILE_67(p, o, s) BOOST_PP_WHILE_67_I(p, o, s)\n# define BOOST_PP_WHILE_68(p, o, s) BOOST_PP_WHILE_68_I(p, o, s)\n# define BOOST_PP_WHILE_69(p, o, s) BOOST_PP_WHILE_69_I(p, o, s)\n# define BOOST_PP_WHILE_70(p, o, s) BOOST_PP_WHILE_70_I(p, o, s)\n# define BOOST_PP_WHILE_71(p, o, s) BOOST_PP_WHILE_71_I(p, o, s)\n# define BOOST_PP_WHILE_72(p, o, s) BOOST_PP_WHILE_72_I(p, o, s)\n# define BOOST_PP_WHILE_73(p, o, s) BOOST_PP_WHILE_73_I(p, o, s)\n# define BOOST_PP_WHILE_74(p, o, s) BOOST_PP_WHILE_74_I(p, o, s)\n# define BOOST_PP_WHILE_75(p, o, s) BOOST_PP_WHILE_75_I(p, o, s)\n# define BOOST_PP_WHILE_76(p, o, s) BOOST_PP_WHILE_76_I(p, o, s)\n# define BOOST_PP_WHILE_77(p, o, s) BOOST_PP_WHILE_77_I(p, o, s)\n# define BOOST_PP_WHILE_78(p, o, s) BOOST_PP_WHILE_78_I(p, o, s)\n# define BOOST_PP_WHILE_79(p, o, s) BOOST_PP_WHILE_79_I(p, o, s)\n# define BOOST_PP_WHILE_80(p, o, s) BOOST_PP_WHILE_80_I(p, o, s)\n# define BOOST_PP_WHILE_81(p, o, s) BOOST_PP_WHILE_81_I(p, o, s)\n# define BOOST_PP_WHILE_82(p, o, s) BOOST_PP_WHILE_82_I(p, o, s)\n# define BOOST_PP_WHILE_83(p, o, s) BOOST_PP_WHILE_83_I(p, o, s)\n# define BOOST_PP_WHILE_84(p, o, s) BOOST_PP_WHILE_84_I(p, o, s)\n# define BOOST_PP_WHILE_85(p, o, s) BOOST_PP_WHILE_85_I(p, o, s)\n# define BOOST_PP_WHILE_86(p, o, s) BOOST_PP_WHILE_86_I(p, o, s)\n# define BOOST_PP_WHILE_87(p, o, s) BOOST_PP_WHILE_87_I(p, o, s)\n# define BOOST_PP_WHILE_88(p, o, s) BOOST_PP_WHILE_88_I(p, o, s)\n# define BOOST_PP_WHILE_89(p, o, s) BOOST_PP_WHILE_89_I(p, o, s)\n# define BOOST_PP_WHILE_90(p, o, s) BOOST_PP_WHILE_90_I(p, o, s)\n# define BOOST_PP_WHILE_91(p, o, s) BOOST_PP_WHILE_91_I(p, o, s)\n# define BOOST_PP_WHILE_92(p, o, s) BOOST_PP_WHILE_92_I(p, o, s)\n# define BOOST_PP_WHILE_93(p, o, s) BOOST_PP_WHILE_93_I(p, o, s)\n# define BOOST_PP_WHILE_94(p, o, s) BOOST_PP_WHILE_94_I(p, o, s)\n# define BOOST_PP_WHILE_95(p, o, s) BOOST_PP_WHILE_95_I(p, o, s)\n# define BOOST_PP_WHILE_96(p, o, s) BOOST_PP_WHILE_96_I(p, o, s)\n# define BOOST_PP_WHILE_97(p, o, s) BOOST_PP_WHILE_97_I(p, o, s)\n# define BOOST_PP_WHILE_98(p, o, s) BOOST_PP_WHILE_98_I(p, o, s)\n# define BOOST_PP_WHILE_99(p, o, s) BOOST_PP_WHILE_99_I(p, o, s)\n# define BOOST_PP_WHILE_100(p, o, s) BOOST_PP_WHILE_100_I(p, o, s)\n# define BOOST_PP_WHILE_101(p, o, s) BOOST_PP_WHILE_101_I(p, o, s)\n# define BOOST_PP_WHILE_102(p, o, s) BOOST_PP_WHILE_102_I(p, o, s)\n# define BOOST_PP_WHILE_103(p, o, s) BOOST_PP_WHILE_103_I(p, o, s)\n# define BOOST_PP_WHILE_104(p, o, s) BOOST_PP_WHILE_104_I(p, o, s)\n# define BOOST_PP_WHILE_105(p, o, s) BOOST_PP_WHILE_105_I(p, o, s)\n# define BOOST_PP_WHILE_106(p, o, s) BOOST_PP_WHILE_106_I(p, o, s)\n# define BOOST_PP_WHILE_107(p, o, s) BOOST_PP_WHILE_107_I(p, o, s)\n# define BOOST_PP_WHILE_108(p, o, s) BOOST_PP_WHILE_108_I(p, o, s)\n# define BOOST_PP_WHILE_109(p, o, s) BOOST_PP_WHILE_109_I(p, o, s)\n# define BOOST_PP_WHILE_110(p, o, s) BOOST_PP_WHILE_110_I(p, o, s)\n# define BOOST_PP_WHILE_111(p, o, s) BOOST_PP_WHILE_111_I(p, o, s)\n# define BOOST_PP_WHILE_112(p, o, s) BOOST_PP_WHILE_112_I(p, o, s)\n# define BOOST_PP_WHILE_113(p, o, s) BOOST_PP_WHILE_113_I(p, o, s)\n# define BOOST_PP_WHILE_114(p, o, s) BOOST_PP_WHILE_114_I(p, o, s)\n# define BOOST_PP_WHILE_115(p, o, s) BOOST_PP_WHILE_115_I(p, o, s)\n# define BOOST_PP_WHILE_116(p, o, s) BOOST_PP_WHILE_116_I(p, o, s)\n# define BOOST_PP_WHILE_117(p, o, s) BOOST_PP_WHILE_117_I(p, o, s)\n# define BOOST_PP_WHILE_118(p, o, s) BOOST_PP_WHILE_118_I(p, o, s)\n# define BOOST_PP_WHILE_119(p, o, s) BOOST_PP_WHILE_119_I(p, o, s)\n# define BOOST_PP_WHILE_120(p, o, s) BOOST_PP_WHILE_120_I(p, o, s)\n# define BOOST_PP_WHILE_121(p, o, s) BOOST_PP_WHILE_121_I(p, o, s)\n# define BOOST_PP_WHILE_122(p, o, s) BOOST_PP_WHILE_122_I(p, o, s)\n# define BOOST_PP_WHILE_123(p, o, s) BOOST_PP_WHILE_123_I(p, o, s)\n# define BOOST_PP_WHILE_124(p, o, s) BOOST_PP_WHILE_124_I(p, o, s)\n# define BOOST_PP_WHILE_125(p, o, s) BOOST_PP_WHILE_125_I(p, o, s)\n# define BOOST_PP_WHILE_126(p, o, s) BOOST_PP_WHILE_126_I(p, o, s)\n# define BOOST_PP_WHILE_127(p, o, s) BOOST_PP_WHILE_127_I(p, o, s)\n# define BOOST_PP_WHILE_128(p, o, s) BOOST_PP_WHILE_128_I(p, o, s)\n# define BOOST_PP_WHILE_129(p, o, s) BOOST_PP_WHILE_129_I(p, o, s)\n# define BOOST_PP_WHILE_130(p, o, s) BOOST_PP_WHILE_130_I(p, o, s)\n# define BOOST_PP_WHILE_131(p, o, s) BOOST_PP_WHILE_131_I(p, o, s)\n# define BOOST_PP_WHILE_132(p, o, s) BOOST_PP_WHILE_132_I(p, o, s)\n# define BOOST_PP_WHILE_133(p, o, s) BOOST_PP_WHILE_133_I(p, o, s)\n# define BOOST_PP_WHILE_134(p, o, s) BOOST_PP_WHILE_134_I(p, o, s)\n# define BOOST_PP_WHILE_135(p, o, s) BOOST_PP_WHILE_135_I(p, o, s)\n# define BOOST_PP_WHILE_136(p, o, s) BOOST_PP_WHILE_136_I(p, o, s)\n# define BOOST_PP_WHILE_137(p, o, s) BOOST_PP_WHILE_137_I(p, o, s)\n# define BOOST_PP_WHILE_138(p, o, s) BOOST_PP_WHILE_138_I(p, o, s)\n# define BOOST_PP_WHILE_139(p, o, s) BOOST_PP_WHILE_139_I(p, o, s)\n# define BOOST_PP_WHILE_140(p, o, s) BOOST_PP_WHILE_140_I(p, o, s)\n# define BOOST_PP_WHILE_141(p, o, s) BOOST_PP_WHILE_141_I(p, o, s)\n# define BOOST_PP_WHILE_142(p, o, s) BOOST_PP_WHILE_142_I(p, o, s)\n# define BOOST_PP_WHILE_143(p, o, s) BOOST_PP_WHILE_143_I(p, o, s)\n# define BOOST_PP_WHILE_144(p, o, s) BOOST_PP_WHILE_144_I(p, o, s)\n# define BOOST_PP_WHILE_145(p, o, s) BOOST_PP_WHILE_145_I(p, o, s)\n# define BOOST_PP_WHILE_146(p, o, s) BOOST_PP_WHILE_146_I(p, o, s)\n# define BOOST_PP_WHILE_147(p, o, s) BOOST_PP_WHILE_147_I(p, o, s)\n# define BOOST_PP_WHILE_148(p, o, s) BOOST_PP_WHILE_148_I(p, o, s)\n# define BOOST_PP_WHILE_149(p, o, s) BOOST_PP_WHILE_149_I(p, o, s)\n# define BOOST_PP_WHILE_150(p, o, s) BOOST_PP_WHILE_150_I(p, o, s)\n# define BOOST_PP_WHILE_151(p, o, s) BOOST_PP_WHILE_151_I(p, o, s)\n# define BOOST_PP_WHILE_152(p, o, s) BOOST_PP_WHILE_152_I(p, o, s)\n# define BOOST_PP_WHILE_153(p, o, s) BOOST_PP_WHILE_153_I(p, o, s)\n# define BOOST_PP_WHILE_154(p, o, s) BOOST_PP_WHILE_154_I(p, o, s)\n# define BOOST_PP_WHILE_155(p, o, s) BOOST_PP_WHILE_155_I(p, o, s)\n# define BOOST_PP_WHILE_156(p, o, s) BOOST_PP_WHILE_156_I(p, o, s)\n# define BOOST_PP_WHILE_157(p, o, s) BOOST_PP_WHILE_157_I(p, o, s)\n# define BOOST_PP_WHILE_158(p, o, s) BOOST_PP_WHILE_158_I(p, o, s)\n# define BOOST_PP_WHILE_159(p, o, s) BOOST_PP_WHILE_159_I(p, o, s)\n# define BOOST_PP_WHILE_160(p, o, s) BOOST_PP_WHILE_160_I(p, o, s)\n# define BOOST_PP_WHILE_161(p, o, s) BOOST_PP_WHILE_161_I(p, o, s)\n# define BOOST_PP_WHILE_162(p, o, s) BOOST_PP_WHILE_162_I(p, o, s)\n# define BOOST_PP_WHILE_163(p, o, s) BOOST_PP_WHILE_163_I(p, o, s)\n# define BOOST_PP_WHILE_164(p, o, s) BOOST_PP_WHILE_164_I(p, o, s)\n# define BOOST_PP_WHILE_165(p, o, s) BOOST_PP_WHILE_165_I(p, o, s)\n# define BOOST_PP_WHILE_166(p, o, s) BOOST_PP_WHILE_166_I(p, o, s)\n# define BOOST_PP_WHILE_167(p, o, s) BOOST_PP_WHILE_167_I(p, o, s)\n# define BOOST_PP_WHILE_168(p, o, s) BOOST_PP_WHILE_168_I(p, o, s)\n# define BOOST_PP_WHILE_169(p, o, s) BOOST_PP_WHILE_169_I(p, o, s)\n# define BOOST_PP_WHILE_170(p, o, s) BOOST_PP_WHILE_170_I(p, o, s)\n# define BOOST_PP_WHILE_171(p, o, s) BOOST_PP_WHILE_171_I(p, o, s)\n# define BOOST_PP_WHILE_172(p, o, s) BOOST_PP_WHILE_172_I(p, o, s)\n# define BOOST_PP_WHILE_173(p, o, s) BOOST_PP_WHILE_173_I(p, o, s)\n# define BOOST_PP_WHILE_174(p, o, s) BOOST_PP_WHILE_174_I(p, o, s)\n# define BOOST_PP_WHILE_175(p, o, s) BOOST_PP_WHILE_175_I(p, o, s)\n# define BOOST_PP_WHILE_176(p, o, s) BOOST_PP_WHILE_176_I(p, o, s)\n# define BOOST_PP_WHILE_177(p, o, s) BOOST_PP_WHILE_177_I(p, o, s)\n# define BOOST_PP_WHILE_178(p, o, s) BOOST_PP_WHILE_178_I(p, o, s)\n# define BOOST_PP_WHILE_179(p, o, s) BOOST_PP_WHILE_179_I(p, o, s)\n# define BOOST_PP_WHILE_180(p, o, s) BOOST_PP_WHILE_180_I(p, o, s)\n# define BOOST_PP_WHILE_181(p, o, s) BOOST_PP_WHILE_181_I(p, o, s)\n# define BOOST_PP_WHILE_182(p, o, s) BOOST_PP_WHILE_182_I(p, o, s)\n# define BOOST_PP_WHILE_183(p, o, s) BOOST_PP_WHILE_183_I(p, o, s)\n# define BOOST_PP_WHILE_184(p, o, s) BOOST_PP_WHILE_184_I(p, o, s)\n# define BOOST_PP_WHILE_185(p, o, s) BOOST_PP_WHILE_185_I(p, o, s)\n# define BOOST_PP_WHILE_186(p, o, s) BOOST_PP_WHILE_186_I(p, o, s)\n# define BOOST_PP_WHILE_187(p, o, s) BOOST_PP_WHILE_187_I(p, o, s)\n# define BOOST_PP_WHILE_188(p, o, s) BOOST_PP_WHILE_188_I(p, o, s)\n# define BOOST_PP_WHILE_189(p, o, s) BOOST_PP_WHILE_189_I(p, o, s)\n# define BOOST_PP_WHILE_190(p, o, s) BOOST_PP_WHILE_190_I(p, o, s)\n# define BOOST_PP_WHILE_191(p, o, s) BOOST_PP_WHILE_191_I(p, o, s)\n# define BOOST_PP_WHILE_192(p, o, s) BOOST_PP_WHILE_192_I(p, o, s)\n# define BOOST_PP_WHILE_193(p, o, s) BOOST_PP_WHILE_193_I(p, o, s)\n# define BOOST_PP_WHILE_194(p, o, s) BOOST_PP_WHILE_194_I(p, o, s)\n# define BOOST_PP_WHILE_195(p, o, s) BOOST_PP_WHILE_195_I(p, o, s)\n# define BOOST_PP_WHILE_196(p, o, s) BOOST_PP_WHILE_196_I(p, o, s)\n# define BOOST_PP_WHILE_197(p, o, s) BOOST_PP_WHILE_197_I(p, o, s)\n# define BOOST_PP_WHILE_198(p, o, s) BOOST_PP_WHILE_198_I(p, o, s)\n# define BOOST_PP_WHILE_199(p, o, s) BOOST_PP_WHILE_199_I(p, o, s)\n# define BOOST_PP_WHILE_200(p, o, s) BOOST_PP_WHILE_200_I(p, o, s)\n# define BOOST_PP_WHILE_201(p, o, s) BOOST_PP_WHILE_201_I(p, o, s)\n# define BOOST_PP_WHILE_202(p, o, s) BOOST_PP_WHILE_202_I(p, o, s)\n# define BOOST_PP_WHILE_203(p, o, s) BOOST_PP_WHILE_203_I(p, o, s)\n# define BOOST_PP_WHILE_204(p, o, s) BOOST_PP_WHILE_204_I(p, o, s)\n# define BOOST_PP_WHILE_205(p, o, s) BOOST_PP_WHILE_205_I(p, o, s)\n# define BOOST_PP_WHILE_206(p, o, s) BOOST_PP_WHILE_206_I(p, o, s)\n# define BOOST_PP_WHILE_207(p, o, s) BOOST_PP_WHILE_207_I(p, o, s)\n# define BOOST_PP_WHILE_208(p, o, s) BOOST_PP_WHILE_208_I(p, o, s)\n# define BOOST_PP_WHILE_209(p, o, s) BOOST_PP_WHILE_209_I(p, o, s)\n# define BOOST_PP_WHILE_210(p, o, s) BOOST_PP_WHILE_210_I(p, o, s)\n# define BOOST_PP_WHILE_211(p, o, s) BOOST_PP_WHILE_211_I(p, o, s)\n# define BOOST_PP_WHILE_212(p, o, s) BOOST_PP_WHILE_212_I(p, o, s)\n# define BOOST_PP_WHILE_213(p, o, s) BOOST_PP_WHILE_213_I(p, o, s)\n# define BOOST_PP_WHILE_214(p, o, s) BOOST_PP_WHILE_214_I(p, o, s)\n# define BOOST_PP_WHILE_215(p, o, s) BOOST_PP_WHILE_215_I(p, o, s)\n# define BOOST_PP_WHILE_216(p, o, s) BOOST_PP_WHILE_216_I(p, o, s)\n# define BOOST_PP_WHILE_217(p, o, s) BOOST_PP_WHILE_217_I(p, o, s)\n# define BOOST_PP_WHILE_218(p, o, s) BOOST_PP_WHILE_218_I(p, o, s)\n# define BOOST_PP_WHILE_219(p, o, s) BOOST_PP_WHILE_219_I(p, o, s)\n# define BOOST_PP_WHILE_220(p, o, s) BOOST_PP_WHILE_220_I(p, o, s)\n# define BOOST_PP_WHILE_221(p, o, s) BOOST_PP_WHILE_221_I(p, o, s)\n# define BOOST_PP_WHILE_222(p, o, s) BOOST_PP_WHILE_222_I(p, o, s)\n# define BOOST_PP_WHILE_223(p, o, s) BOOST_PP_WHILE_223_I(p, o, s)\n# define BOOST_PP_WHILE_224(p, o, s) BOOST_PP_WHILE_224_I(p, o, s)\n# define BOOST_PP_WHILE_225(p, o, s) BOOST_PP_WHILE_225_I(p, o, s)\n# define BOOST_PP_WHILE_226(p, o, s) BOOST_PP_WHILE_226_I(p, o, s)\n# define BOOST_PP_WHILE_227(p, o, s) BOOST_PP_WHILE_227_I(p, o, s)\n# define BOOST_PP_WHILE_228(p, o, s) BOOST_PP_WHILE_228_I(p, o, s)\n# define BOOST_PP_WHILE_229(p, o, s) BOOST_PP_WHILE_229_I(p, o, s)\n# define BOOST_PP_WHILE_230(p, o, s) BOOST_PP_WHILE_230_I(p, o, s)\n# define BOOST_PP_WHILE_231(p, o, s) BOOST_PP_WHILE_231_I(p, o, s)\n# define BOOST_PP_WHILE_232(p, o, s) BOOST_PP_WHILE_232_I(p, o, s)\n# define BOOST_PP_WHILE_233(p, o, s) BOOST_PP_WHILE_233_I(p, o, s)\n# define BOOST_PP_WHILE_234(p, o, s) BOOST_PP_WHILE_234_I(p, o, s)\n# define BOOST_PP_WHILE_235(p, o, s) BOOST_PP_WHILE_235_I(p, o, s)\n# define BOOST_PP_WHILE_236(p, o, s) BOOST_PP_WHILE_236_I(p, o, s)\n# define BOOST_PP_WHILE_237(p, o, s) BOOST_PP_WHILE_237_I(p, o, s)\n# define BOOST_PP_WHILE_238(p, o, s) BOOST_PP_WHILE_238_I(p, o, s)\n# define BOOST_PP_WHILE_239(p, o, s) BOOST_PP_WHILE_239_I(p, o, s)\n# define BOOST_PP_WHILE_240(p, o, s) BOOST_PP_WHILE_240_I(p, o, s)\n# define BOOST_PP_WHILE_241(p, o, s) BOOST_PP_WHILE_241_I(p, o, s)\n# define BOOST_PP_WHILE_242(p, o, s) BOOST_PP_WHILE_242_I(p, o, s)\n# define BOOST_PP_WHILE_243(p, o, s) BOOST_PP_WHILE_243_I(p, o, s)\n# define BOOST_PP_WHILE_244(p, o, s) BOOST_PP_WHILE_244_I(p, o, s)\n# define BOOST_PP_WHILE_245(p, o, s) BOOST_PP_WHILE_245_I(p, o, s)\n# define BOOST_PP_WHILE_246(p, o, s) BOOST_PP_WHILE_246_I(p, o, s)\n# define BOOST_PP_WHILE_247(p, o, s) BOOST_PP_WHILE_247_I(p, o, s)\n# define BOOST_PP_WHILE_248(p, o, s) BOOST_PP_WHILE_248_I(p, o, s)\n# define BOOST_PP_WHILE_249(p, o, s) BOOST_PP_WHILE_249_I(p, o, s)\n# define BOOST_PP_WHILE_250(p, o, s) BOOST_PP_WHILE_250_I(p, o, s)\n# define BOOST_PP_WHILE_251(p, o, s) BOOST_PP_WHILE_251_I(p, o, s)\n# define BOOST_PP_WHILE_252(p, o, s) BOOST_PP_WHILE_252_I(p, o, s)\n# define BOOST_PP_WHILE_253(p, o, s) BOOST_PP_WHILE_253_I(p, o, s)\n# define BOOST_PP_WHILE_254(p, o, s) BOOST_PP_WHILE_254_I(p, o, s)\n# define BOOST_PP_WHILE_255(p, o, s) BOOST_PP_WHILE_255_I(p, o, s)\n# define BOOST_PP_WHILE_256(p, o, s) BOOST_PP_WHILE_256_I(p, o, s)\n#\n# define BOOST_PP_WHILE_1_I(p, o, s) BOOST_PP_IF(p(2, s), BOOST_PP_WHILE_2, s BOOST_PP_TUPLE_EAT_3)(p, o, o(2, s))\n# define BOOST_PP_WHILE_2_I(p, o, s) BOOST_PP_IF(p(3, s), BOOST_PP_WHILE_3, s BOOST_PP_TUPLE_EAT_3)(p, o, o(3, s))\n# define BOOST_PP_WHILE_3_I(p, o, s) BOOST_PP_IF(p(4, s), BOOST_PP_WHILE_4, s BOOST_PP_TUPLE_EAT_3)(p, o, o(4, s))\n# define BOOST_PP_WHILE_4_I(p, o, s) BOOST_PP_IF(p(5, s), BOOST_PP_WHILE_5, s BOOST_PP_TUPLE_EAT_3)(p, o, o(5, s))\n# define BOOST_PP_WHILE_5_I(p, o, s) BOOST_PP_IF(p(6, s), BOOST_PP_WHILE_6, s BOOST_PP_TUPLE_EAT_3)(p, o, o(6, s))\n# define BOOST_PP_WHILE_6_I(p, o, s) BOOST_PP_IF(p(7, s), BOOST_PP_WHILE_7, s BOOST_PP_TUPLE_EAT_3)(p, o, o(7, s))\n# define BOOST_PP_WHILE_7_I(p, o, s) BOOST_PP_IF(p(8, s), BOOST_PP_WHILE_8, s BOOST_PP_TUPLE_EAT_3)(p, o, o(8, s))\n# define BOOST_PP_WHILE_8_I(p, o, s) BOOST_PP_IF(p(9, s), BOOST_PP_WHILE_9, s BOOST_PP_TUPLE_EAT_3)(p, o, o(9, s))\n# define BOOST_PP_WHILE_9_I(p, o, s) BOOST_PP_IF(p(10, s), BOOST_PP_WHILE_10, s BOOST_PP_TUPLE_EAT_3)(p, o, o(10, s))\n# define BOOST_PP_WHILE_10_I(p, o, s) BOOST_PP_IF(p(11, s), BOOST_PP_WHILE_11, s BOOST_PP_TUPLE_EAT_3)(p, o, o(11, s))\n# define BOOST_PP_WHILE_11_I(p, o, s) BOOST_PP_IF(p(12, s), BOOST_PP_WHILE_12, s BOOST_PP_TUPLE_EAT_3)(p, o, o(12, s))\n# define BOOST_PP_WHILE_12_I(p, o, s) BOOST_PP_IF(p(13, s), BOOST_PP_WHILE_13, s BOOST_PP_TUPLE_EAT_3)(p, o, o(13, s))\n# define BOOST_PP_WHILE_13_I(p, o, s) BOOST_PP_IF(p(14, s), BOOST_PP_WHILE_14, s BOOST_PP_TUPLE_EAT_3)(p, o, o(14, s))\n# define BOOST_PP_WHILE_14_I(p, o, s) BOOST_PP_IF(p(15, s), BOOST_PP_WHILE_15, s BOOST_PP_TUPLE_EAT_3)(p, o, o(15, s))\n# define BOOST_PP_WHILE_15_I(p, o, s) BOOST_PP_IF(p(16, s), BOOST_PP_WHILE_16, s BOOST_PP_TUPLE_EAT_3)(p, o, o(16, s))\n# define BOOST_PP_WHILE_16_I(p, o, s) BOOST_PP_IF(p(17, s), BOOST_PP_WHILE_17, s BOOST_PP_TUPLE_EAT_3)(p, o, o(17, s))\n# define BOOST_PP_WHILE_17_I(p, o, s) BOOST_PP_IF(p(18, s), BOOST_PP_WHILE_18, s BOOST_PP_TUPLE_EAT_3)(p, o, o(18, s))\n# define BOOST_PP_WHILE_18_I(p, o, s) BOOST_PP_IF(p(19, s), BOOST_PP_WHILE_19, s BOOST_PP_TUPLE_EAT_3)(p, o, o(19, s))\n# define BOOST_PP_WHILE_19_I(p, o, s) BOOST_PP_IF(p(20, s), BOOST_PP_WHILE_20, s BOOST_PP_TUPLE_EAT_3)(p, o, o(20, s))\n# define BOOST_PP_WHILE_20_I(p, o, s) BOOST_PP_IF(p(21, s), BOOST_PP_WHILE_21, s BOOST_PP_TUPLE_EAT_3)(p, o, o(21, s))\n# define BOOST_PP_WHILE_21_I(p, o, s) BOOST_PP_IF(p(22, s), BOOST_PP_WHILE_22, s BOOST_PP_TUPLE_EAT_3)(p, o, o(22, s))\n# define BOOST_PP_WHILE_22_I(p, o, s) BOOST_PP_IF(p(23, s), BOOST_PP_WHILE_23, s BOOST_PP_TUPLE_EAT_3)(p, o, o(23, s))\n# define BOOST_PP_WHILE_23_I(p, o, s) BOOST_PP_IF(p(24, s), BOOST_PP_WHILE_24, s BOOST_PP_TUPLE_EAT_3)(p, o, o(24, s))\n# define BOOST_PP_WHILE_24_I(p, o, s) BOOST_PP_IF(p(25, s), BOOST_PP_WHILE_25, s BOOST_PP_TUPLE_EAT_3)(p, o, o(25, s))\n# define BOOST_PP_WHILE_25_I(p, o, s) BOOST_PP_IF(p(26, s), BOOST_PP_WHILE_26, s BOOST_PP_TUPLE_EAT_3)(p, o, o(26, s))\n# define BOOST_PP_WHILE_26_I(p, o, s) BOOST_PP_IF(p(27, s), BOOST_PP_WHILE_27, s BOOST_PP_TUPLE_EAT_3)(p, o, o(27, s))\n# define BOOST_PP_WHILE_27_I(p, o, s) BOOST_PP_IF(p(28, s), BOOST_PP_WHILE_28, s BOOST_PP_TUPLE_EAT_3)(p, o, o(28, s))\n# define BOOST_PP_WHILE_28_I(p, o, s) BOOST_PP_IF(p(29, s), BOOST_PP_WHILE_29, s BOOST_PP_TUPLE_EAT_3)(p, o, o(29, s))\n# define BOOST_PP_WHILE_29_I(p, o, s) BOOST_PP_IF(p(30, s), BOOST_PP_WHILE_30, s BOOST_PP_TUPLE_EAT_3)(p, o, o(30, s))\n# define BOOST_PP_WHILE_30_I(p, o, s) BOOST_PP_IF(p(31, s), BOOST_PP_WHILE_31, s BOOST_PP_TUPLE_EAT_3)(p, o, o(31, s))\n# define BOOST_PP_WHILE_31_I(p, o, s) BOOST_PP_IF(p(32, s), BOOST_PP_WHILE_32, s BOOST_PP_TUPLE_EAT_3)(p, o, o(32, s))\n# define BOOST_PP_WHILE_32_I(p, o, s) BOOST_PP_IF(p(33, s), BOOST_PP_WHILE_33, s BOOST_PP_TUPLE_EAT_3)(p, o, o(33, s))\n# define BOOST_PP_WHILE_33_I(p, o, s) BOOST_PP_IF(p(34, s), BOOST_PP_WHILE_34, s BOOST_PP_TUPLE_EAT_3)(p, o, o(34, s))\n# define BOOST_PP_WHILE_34_I(p, o, s) BOOST_PP_IF(p(35, s), BOOST_PP_WHILE_35, s BOOST_PP_TUPLE_EAT_3)(p, o, o(35, s))\n# define BOOST_PP_WHILE_35_I(p, o, s) BOOST_PP_IF(p(36, s), BOOST_PP_WHILE_36, s BOOST_PP_TUPLE_EAT_3)(p, o, o(36, s))\n# define BOOST_PP_WHILE_36_I(p, o, s) BOOST_PP_IF(p(37, s), BOOST_PP_WHILE_37, s BOOST_PP_TUPLE_EAT_3)(p, o, o(37, s))\n# define BOOST_PP_WHILE_37_I(p, o, s) BOOST_PP_IF(p(38, s), BOOST_PP_WHILE_38, s BOOST_PP_TUPLE_EAT_3)(p, o, o(38, s))\n# define BOOST_PP_WHILE_38_I(p, o, s) BOOST_PP_IF(p(39, s), BOOST_PP_WHILE_39, s BOOST_PP_TUPLE_EAT_3)(p, o, o(39, s))\n# define BOOST_PP_WHILE_39_I(p, o, s) BOOST_PP_IF(p(40, s), BOOST_PP_WHILE_40, s BOOST_PP_TUPLE_EAT_3)(p, o, o(40, s))\n# define BOOST_PP_WHILE_40_I(p, o, s) BOOST_PP_IF(p(41, s), BOOST_PP_WHILE_41, s BOOST_PP_TUPLE_EAT_3)(p, o, o(41, s))\n# define BOOST_PP_WHILE_41_I(p, o, s) BOOST_PP_IF(p(42, s), BOOST_PP_WHILE_42, s BOOST_PP_TUPLE_EAT_3)(p, o, o(42, s))\n# define BOOST_PP_WHILE_42_I(p, o, s) BOOST_PP_IF(p(43, s), BOOST_PP_WHILE_43, s BOOST_PP_TUPLE_EAT_3)(p, o, o(43, s))\n# define BOOST_PP_WHILE_43_I(p, o, s) BOOST_PP_IF(p(44, s), BOOST_PP_WHILE_44, s BOOST_PP_TUPLE_EAT_3)(p, o, o(44, s))\n# define BOOST_PP_WHILE_44_I(p, o, s) BOOST_PP_IF(p(45, s), BOOST_PP_WHILE_45, s BOOST_PP_TUPLE_EAT_3)(p, o, o(45, s))\n# define BOOST_PP_WHILE_45_I(p, o, s) BOOST_PP_IF(p(46, s), BOOST_PP_WHILE_46, s BOOST_PP_TUPLE_EAT_3)(p, o, o(46, s))\n# define BOOST_PP_WHILE_46_I(p, o, s) BOOST_PP_IF(p(47, s), BOOST_PP_WHILE_47, s BOOST_PP_TUPLE_EAT_3)(p, o, o(47, s))\n# define BOOST_PP_WHILE_47_I(p, o, s) BOOST_PP_IF(p(48, s), BOOST_PP_WHILE_48, s BOOST_PP_TUPLE_EAT_3)(p, o, o(48, s))\n# define BOOST_PP_WHILE_48_I(p, o, s) BOOST_PP_IF(p(49, s), BOOST_PP_WHILE_49, s BOOST_PP_TUPLE_EAT_3)(p, o, o(49, s))\n# define BOOST_PP_WHILE_49_I(p, o, s) BOOST_PP_IF(p(50, s), BOOST_PP_WHILE_50, s BOOST_PP_TUPLE_EAT_3)(p, o, o(50, s))\n# define BOOST_PP_WHILE_50_I(p, o, s) BOOST_PP_IF(p(51, s), BOOST_PP_WHILE_51, s BOOST_PP_TUPLE_EAT_3)(p, o, o(51, s))\n# define BOOST_PP_WHILE_51_I(p, o, s) BOOST_PP_IF(p(52, s), BOOST_PP_WHILE_52, s BOOST_PP_TUPLE_EAT_3)(p, o, o(52, s))\n# define BOOST_PP_WHILE_52_I(p, o, s) BOOST_PP_IF(p(53, s), BOOST_PP_WHILE_53, s BOOST_PP_TUPLE_EAT_3)(p, o, o(53, s))\n# define BOOST_PP_WHILE_53_I(p, o, s) BOOST_PP_IF(p(54, s), BOOST_PP_WHILE_54, s BOOST_PP_TUPLE_EAT_3)(p, o, o(54, s))\n# define BOOST_PP_WHILE_54_I(p, o, s) BOOST_PP_IF(p(55, s), BOOST_PP_WHILE_55, s BOOST_PP_TUPLE_EAT_3)(p, o, o(55, s))\n# define BOOST_PP_WHILE_55_I(p, o, s) BOOST_PP_IF(p(56, s), BOOST_PP_WHILE_56, s BOOST_PP_TUPLE_EAT_3)(p, o, o(56, s))\n# define BOOST_PP_WHILE_56_I(p, o, s) BOOST_PP_IF(p(57, s), BOOST_PP_WHILE_57, s BOOST_PP_TUPLE_EAT_3)(p, o, o(57, s))\n# define BOOST_PP_WHILE_57_I(p, o, s) BOOST_PP_IF(p(58, s), BOOST_PP_WHILE_58, s BOOST_PP_TUPLE_EAT_3)(p, o, o(58, s))\n# define BOOST_PP_WHILE_58_I(p, o, s) BOOST_PP_IF(p(59, s), BOOST_PP_WHILE_59, s BOOST_PP_TUPLE_EAT_3)(p, o, o(59, s))\n# define BOOST_PP_WHILE_59_I(p, o, s) BOOST_PP_IF(p(60, s), BOOST_PP_WHILE_60, s BOOST_PP_TUPLE_EAT_3)(p, o, o(60, s))\n# define BOOST_PP_WHILE_60_I(p, o, s) BOOST_PP_IF(p(61, s), BOOST_PP_WHILE_61, s BOOST_PP_TUPLE_EAT_3)(p, o, o(61, s))\n# define BOOST_PP_WHILE_61_I(p, o, s) BOOST_PP_IF(p(62, s), BOOST_PP_WHILE_62, s BOOST_PP_TUPLE_EAT_3)(p, o, o(62, s))\n# define BOOST_PP_WHILE_62_I(p, o, s) BOOST_PP_IF(p(63, s), BOOST_PP_WHILE_63, s BOOST_PP_TUPLE_EAT_3)(p, o, o(63, s))\n# define BOOST_PP_WHILE_63_I(p, o, s) BOOST_PP_IF(p(64, s), BOOST_PP_WHILE_64, s BOOST_PP_TUPLE_EAT_3)(p, o, o(64, s))\n# define BOOST_PP_WHILE_64_I(p, o, s) BOOST_PP_IF(p(65, s), BOOST_PP_WHILE_65, s BOOST_PP_TUPLE_EAT_3)(p, o, o(65, s))\n# define BOOST_PP_WHILE_65_I(p, o, s) BOOST_PP_IF(p(66, s), BOOST_PP_WHILE_66, s BOOST_PP_TUPLE_EAT_3)(p, o, o(66, s))\n# define BOOST_PP_WHILE_66_I(p, o, s) BOOST_PP_IF(p(67, s), BOOST_PP_WHILE_67, s BOOST_PP_TUPLE_EAT_3)(p, o, o(67, s))\n# define BOOST_PP_WHILE_67_I(p, o, s) BOOST_PP_IF(p(68, s), BOOST_PP_WHILE_68, s BOOST_PP_TUPLE_EAT_3)(p, o, o(68, s))\n# define BOOST_PP_WHILE_68_I(p, o, s) BOOST_PP_IF(p(69, s), BOOST_PP_WHILE_69, s BOOST_PP_TUPLE_EAT_3)(p, o, o(69, s))\n# define BOOST_PP_WHILE_69_I(p, o, s) BOOST_PP_IF(p(70, s), BOOST_PP_WHILE_70, s BOOST_PP_TUPLE_EAT_3)(p, o, o(70, s))\n# define BOOST_PP_WHILE_70_I(p, o, s) BOOST_PP_IF(p(71, s), BOOST_PP_WHILE_71, s BOOST_PP_TUPLE_EAT_3)(p, o, o(71, s))\n# define BOOST_PP_WHILE_71_I(p, o, s) BOOST_PP_IF(p(72, s), BOOST_PP_WHILE_72, s BOOST_PP_TUPLE_EAT_3)(p, o, o(72, s))\n# define BOOST_PP_WHILE_72_I(p, o, s) BOOST_PP_IF(p(73, s), BOOST_PP_WHILE_73, s BOOST_PP_TUPLE_EAT_3)(p, o, o(73, s))\n# define BOOST_PP_WHILE_73_I(p, o, s) BOOST_PP_IF(p(74, s), BOOST_PP_WHILE_74, s BOOST_PP_TUPLE_EAT_3)(p, o, o(74, s))\n# define BOOST_PP_WHILE_74_I(p, o, s) BOOST_PP_IF(p(75, s), BOOST_PP_WHILE_75, s BOOST_PP_TUPLE_EAT_3)(p, o, o(75, s))\n# define BOOST_PP_WHILE_75_I(p, o, s) BOOST_PP_IF(p(76, s), BOOST_PP_WHILE_76, s BOOST_PP_TUPLE_EAT_3)(p, o, o(76, s))\n# define BOOST_PP_WHILE_76_I(p, o, s) BOOST_PP_IF(p(77, s), BOOST_PP_WHILE_77, s BOOST_PP_TUPLE_EAT_3)(p, o, o(77, s))\n# define BOOST_PP_WHILE_77_I(p, o, s) BOOST_PP_IF(p(78, s), BOOST_PP_WHILE_78, s BOOST_PP_TUPLE_EAT_3)(p, o, o(78, s))\n# define BOOST_PP_WHILE_78_I(p, o, s) BOOST_PP_IF(p(79, s), BOOST_PP_WHILE_79, s BOOST_PP_TUPLE_EAT_3)(p, o, o(79, s))\n# define BOOST_PP_WHILE_79_I(p, o, s) BOOST_PP_IF(p(80, s), BOOST_PP_WHILE_80, s BOOST_PP_TUPLE_EAT_3)(p, o, o(80, s))\n# define BOOST_PP_WHILE_80_I(p, o, s) BOOST_PP_IF(p(81, s), BOOST_PP_WHILE_81, s BOOST_PP_TUPLE_EAT_3)(p, o, o(81, s))\n# define BOOST_PP_WHILE_81_I(p, o, s) BOOST_PP_IF(p(82, s), BOOST_PP_WHILE_82, s BOOST_PP_TUPLE_EAT_3)(p, o, o(82, s))\n# define BOOST_PP_WHILE_82_I(p, o, s) BOOST_PP_IF(p(83, s), BOOST_PP_WHILE_83, s BOOST_PP_TUPLE_EAT_3)(p, o, o(83, s))\n# define BOOST_PP_WHILE_83_I(p, o, s) BOOST_PP_IF(p(84, s), BOOST_PP_WHILE_84, s BOOST_PP_TUPLE_EAT_3)(p, o, o(84, s))\n# define BOOST_PP_WHILE_84_I(p, o, s) BOOST_PP_IF(p(85, s), BOOST_PP_WHILE_85, s BOOST_PP_TUPLE_EAT_3)(p, o, o(85, s))\n# define BOOST_PP_WHILE_85_I(p, o, s) BOOST_PP_IF(p(86, s), BOOST_PP_WHILE_86, s BOOST_PP_TUPLE_EAT_3)(p, o, o(86, s))\n# define BOOST_PP_WHILE_86_I(p, o, s) BOOST_PP_IF(p(87, s), BOOST_PP_WHILE_87, s BOOST_PP_TUPLE_EAT_3)(p, o, o(87, s))\n# define BOOST_PP_WHILE_87_I(p, o, s) BOOST_PP_IF(p(88, s), BOOST_PP_WHILE_88, s BOOST_PP_TUPLE_EAT_3)(p, o, o(88, s))\n# define BOOST_PP_WHILE_88_I(p, o, s) BOOST_PP_IF(p(89, s), BOOST_PP_WHILE_89, s BOOST_PP_TUPLE_EAT_3)(p, o, o(89, s))\n# define BOOST_PP_WHILE_89_I(p, o, s) BOOST_PP_IF(p(90, s), BOOST_PP_WHILE_90, s BOOST_PP_TUPLE_EAT_3)(p, o, o(90, s))\n# define BOOST_PP_WHILE_90_I(p, o, s) BOOST_PP_IF(p(91, s), BOOST_PP_WHILE_91, s BOOST_PP_TUPLE_EAT_3)(p, o, o(91, s))\n# define BOOST_PP_WHILE_91_I(p, o, s) BOOST_PP_IF(p(92, s), BOOST_PP_WHILE_92, s BOOST_PP_TUPLE_EAT_3)(p, o, o(92, s))\n# define BOOST_PP_WHILE_92_I(p, o, s) BOOST_PP_IF(p(93, s), BOOST_PP_WHILE_93, s BOOST_PP_TUPLE_EAT_3)(p, o, o(93, s))\n# define BOOST_PP_WHILE_93_I(p, o, s) BOOST_PP_IF(p(94, s), BOOST_PP_WHILE_94, s BOOST_PP_TUPLE_EAT_3)(p, o, o(94, s))\n# define BOOST_PP_WHILE_94_I(p, o, s) BOOST_PP_IF(p(95, s), BOOST_PP_WHILE_95, s BOOST_PP_TUPLE_EAT_3)(p, o, o(95, s))\n# define BOOST_PP_WHILE_95_I(p, o, s) BOOST_PP_IF(p(96, s), BOOST_PP_WHILE_96, s BOOST_PP_TUPLE_EAT_3)(p, o, o(96, s))\n# define BOOST_PP_WHILE_96_I(p, o, s) BOOST_PP_IF(p(97, s), BOOST_PP_WHILE_97, s BOOST_PP_TUPLE_EAT_3)(p, o, o(97, s))\n# define BOOST_PP_WHILE_97_I(p, o, s) BOOST_PP_IF(p(98, s), BOOST_PP_WHILE_98, s BOOST_PP_TUPLE_EAT_3)(p, o, o(98, s))\n# define BOOST_PP_WHILE_98_I(p, o, s) BOOST_PP_IF(p(99, s), BOOST_PP_WHILE_99, s BOOST_PP_TUPLE_EAT_3)(p, o, o(99, s))\n# define BOOST_PP_WHILE_99_I(p, o, s) BOOST_PP_IF(p(100, s), BOOST_PP_WHILE_100, s BOOST_PP_TUPLE_EAT_3)(p, o, o(100, s))\n# define BOOST_PP_WHILE_100_I(p, o, s) BOOST_PP_IF(p(101, s), BOOST_PP_WHILE_101, s BOOST_PP_TUPLE_EAT_3)(p, o, o(101, s))\n# define BOOST_PP_WHILE_101_I(p, o, s) BOOST_PP_IF(p(102, s), BOOST_PP_WHILE_102, s BOOST_PP_TUPLE_EAT_3)(p, o, o(102, s))\n# define BOOST_PP_WHILE_102_I(p, o, s) BOOST_PP_IF(p(103, s), BOOST_PP_WHILE_103, s BOOST_PP_TUPLE_EAT_3)(p, o, o(103, s))\n# define BOOST_PP_WHILE_103_I(p, o, s) BOOST_PP_IF(p(104, s), BOOST_PP_WHILE_104, s BOOST_PP_TUPLE_EAT_3)(p, o, o(104, s))\n# define BOOST_PP_WHILE_104_I(p, o, s) BOOST_PP_IF(p(105, s), BOOST_PP_WHILE_105, s BOOST_PP_TUPLE_EAT_3)(p, o, o(105, s))\n# define BOOST_PP_WHILE_105_I(p, o, s) BOOST_PP_IF(p(106, s), BOOST_PP_WHILE_106, s BOOST_PP_TUPLE_EAT_3)(p, o, o(106, s))\n# define BOOST_PP_WHILE_106_I(p, o, s) BOOST_PP_IF(p(107, s), BOOST_PP_WHILE_107, s BOOST_PP_TUPLE_EAT_3)(p, o, o(107, s))\n# define BOOST_PP_WHILE_107_I(p, o, s) BOOST_PP_IF(p(108, s), BOOST_PP_WHILE_108, s BOOST_PP_TUPLE_EAT_3)(p, o, o(108, s))\n# define BOOST_PP_WHILE_108_I(p, o, s) BOOST_PP_IF(p(109, s), BOOST_PP_WHILE_109, s BOOST_PP_TUPLE_EAT_3)(p, o, o(109, s))\n# define BOOST_PP_WHILE_109_I(p, o, s) BOOST_PP_IF(p(110, s), BOOST_PP_WHILE_110, s BOOST_PP_TUPLE_EAT_3)(p, o, o(110, s))\n# define BOOST_PP_WHILE_110_I(p, o, s) BOOST_PP_IF(p(111, s), BOOST_PP_WHILE_111, s BOOST_PP_TUPLE_EAT_3)(p, o, o(111, s))\n# define BOOST_PP_WHILE_111_I(p, o, s) BOOST_PP_IF(p(112, s), BOOST_PP_WHILE_112, s BOOST_PP_TUPLE_EAT_3)(p, o, o(112, s))\n# define BOOST_PP_WHILE_112_I(p, o, s) BOOST_PP_IF(p(113, s), BOOST_PP_WHILE_113, s BOOST_PP_TUPLE_EAT_3)(p, o, o(113, s))\n# define BOOST_PP_WHILE_113_I(p, o, s) BOOST_PP_IF(p(114, s), BOOST_PP_WHILE_114, s BOOST_PP_TUPLE_EAT_3)(p, o, o(114, s))\n# define BOOST_PP_WHILE_114_I(p, o, s) BOOST_PP_IF(p(115, s), BOOST_PP_WHILE_115, s BOOST_PP_TUPLE_EAT_3)(p, o, o(115, s))\n# define BOOST_PP_WHILE_115_I(p, o, s) BOOST_PP_IF(p(116, s), BOOST_PP_WHILE_116, s BOOST_PP_TUPLE_EAT_3)(p, o, o(116, s))\n# define BOOST_PP_WHILE_116_I(p, o, s) BOOST_PP_IF(p(117, s), BOOST_PP_WHILE_117, s BOOST_PP_TUPLE_EAT_3)(p, o, o(117, s))\n# define BOOST_PP_WHILE_117_I(p, o, s) BOOST_PP_IF(p(118, s), BOOST_PP_WHILE_118, s BOOST_PP_TUPLE_EAT_3)(p, o, o(118, s))\n# define BOOST_PP_WHILE_118_I(p, o, s) BOOST_PP_IF(p(119, s), BOOST_PP_WHILE_119, s BOOST_PP_TUPLE_EAT_3)(p, o, o(119, s))\n# define BOOST_PP_WHILE_119_I(p, o, s) BOOST_PP_IF(p(120, s), BOOST_PP_WHILE_120, s BOOST_PP_TUPLE_EAT_3)(p, o, o(120, s))\n# define BOOST_PP_WHILE_120_I(p, o, s) BOOST_PP_IF(p(121, s), BOOST_PP_WHILE_121, s BOOST_PP_TUPLE_EAT_3)(p, o, o(121, s))\n# define BOOST_PP_WHILE_121_I(p, o, s) BOOST_PP_IF(p(122, s), BOOST_PP_WHILE_122, s BOOST_PP_TUPLE_EAT_3)(p, o, o(122, s))\n# define BOOST_PP_WHILE_122_I(p, o, s) BOOST_PP_IF(p(123, s), BOOST_PP_WHILE_123, s BOOST_PP_TUPLE_EAT_3)(p, o, o(123, s))\n# define BOOST_PP_WHILE_123_I(p, o, s) BOOST_PP_IF(p(124, s), BOOST_PP_WHILE_124, s BOOST_PP_TUPLE_EAT_3)(p, o, o(124, s))\n# define BOOST_PP_WHILE_124_I(p, o, s) BOOST_PP_IF(p(125, s), BOOST_PP_WHILE_125, s BOOST_PP_TUPLE_EAT_3)(p, o, o(125, s))\n# define BOOST_PP_WHILE_125_I(p, o, s) BOOST_PP_IF(p(126, s), BOOST_PP_WHILE_126, s BOOST_PP_TUPLE_EAT_3)(p, o, o(126, s))\n# define BOOST_PP_WHILE_126_I(p, o, s) BOOST_PP_IF(p(127, s), BOOST_PP_WHILE_127, s BOOST_PP_TUPLE_EAT_3)(p, o, o(127, s))\n# define BOOST_PP_WHILE_127_I(p, o, s) BOOST_PP_IF(p(128, s), BOOST_PP_WHILE_128, s BOOST_PP_TUPLE_EAT_3)(p, o, o(128, s))\n# define BOOST_PP_WHILE_128_I(p, o, s) BOOST_PP_IF(p(129, s), BOOST_PP_WHILE_129, s BOOST_PP_TUPLE_EAT_3)(p, o, o(129, s))\n# define BOOST_PP_WHILE_129_I(p, o, s) BOOST_PP_IF(p(130, s), BOOST_PP_WHILE_130, s BOOST_PP_TUPLE_EAT_3)(p, o, o(130, s))\n# define BOOST_PP_WHILE_130_I(p, o, s) BOOST_PP_IF(p(131, s), BOOST_PP_WHILE_131, s BOOST_PP_TUPLE_EAT_3)(p, o, o(131, s))\n# define BOOST_PP_WHILE_131_I(p, o, s) BOOST_PP_IF(p(132, s), BOOST_PP_WHILE_132, s BOOST_PP_TUPLE_EAT_3)(p, o, o(132, s))\n# define BOOST_PP_WHILE_132_I(p, o, s) BOOST_PP_IF(p(133, s), BOOST_PP_WHILE_133, s BOOST_PP_TUPLE_EAT_3)(p, o, o(133, s))\n# define BOOST_PP_WHILE_133_I(p, o, s) BOOST_PP_IF(p(134, s), BOOST_PP_WHILE_134, s BOOST_PP_TUPLE_EAT_3)(p, o, o(134, s))\n# define BOOST_PP_WHILE_134_I(p, o, s) BOOST_PP_IF(p(135, s), BOOST_PP_WHILE_135, s BOOST_PP_TUPLE_EAT_3)(p, o, o(135, s))\n# define BOOST_PP_WHILE_135_I(p, o, s) BOOST_PP_IF(p(136, s), BOOST_PP_WHILE_136, s BOOST_PP_TUPLE_EAT_3)(p, o, o(136, s))\n# define BOOST_PP_WHILE_136_I(p, o, s) BOOST_PP_IF(p(137, s), BOOST_PP_WHILE_137, s BOOST_PP_TUPLE_EAT_3)(p, o, o(137, s))\n# define BOOST_PP_WHILE_137_I(p, o, s) BOOST_PP_IF(p(138, s), BOOST_PP_WHILE_138, s BOOST_PP_TUPLE_EAT_3)(p, o, o(138, s))\n# define BOOST_PP_WHILE_138_I(p, o, s) BOOST_PP_IF(p(139, s), BOOST_PP_WHILE_139, s BOOST_PP_TUPLE_EAT_3)(p, o, o(139, s))\n# define BOOST_PP_WHILE_139_I(p, o, s) BOOST_PP_IF(p(140, s), BOOST_PP_WHILE_140, s BOOST_PP_TUPLE_EAT_3)(p, o, o(140, s))\n# define BOOST_PP_WHILE_140_I(p, o, s) BOOST_PP_IF(p(141, s), BOOST_PP_WHILE_141, s BOOST_PP_TUPLE_EAT_3)(p, o, o(141, s))\n# define BOOST_PP_WHILE_141_I(p, o, s) BOOST_PP_IF(p(142, s), BOOST_PP_WHILE_142, s BOOST_PP_TUPLE_EAT_3)(p, o, o(142, s))\n# define BOOST_PP_WHILE_142_I(p, o, s) BOOST_PP_IF(p(143, s), BOOST_PP_WHILE_143, s BOOST_PP_TUPLE_EAT_3)(p, o, o(143, s))\n# define BOOST_PP_WHILE_143_I(p, o, s) BOOST_PP_IF(p(144, s), BOOST_PP_WHILE_144, s BOOST_PP_TUPLE_EAT_3)(p, o, o(144, s))\n# define BOOST_PP_WHILE_144_I(p, o, s) BOOST_PP_IF(p(145, s), BOOST_PP_WHILE_145, s BOOST_PP_TUPLE_EAT_3)(p, o, o(145, s))\n# define BOOST_PP_WHILE_145_I(p, o, s) BOOST_PP_IF(p(146, s), BOOST_PP_WHILE_146, s BOOST_PP_TUPLE_EAT_3)(p, o, o(146, s))\n# define BOOST_PP_WHILE_146_I(p, o, s) BOOST_PP_IF(p(147, s), BOOST_PP_WHILE_147, s BOOST_PP_TUPLE_EAT_3)(p, o, o(147, s))\n# define BOOST_PP_WHILE_147_I(p, o, s) BOOST_PP_IF(p(148, s), BOOST_PP_WHILE_148, s BOOST_PP_TUPLE_EAT_3)(p, o, o(148, s))\n# define BOOST_PP_WHILE_148_I(p, o, s) BOOST_PP_IF(p(149, s), BOOST_PP_WHILE_149, s BOOST_PP_TUPLE_EAT_3)(p, o, o(149, s))\n# define BOOST_PP_WHILE_149_I(p, o, s) BOOST_PP_IF(p(150, s), BOOST_PP_WHILE_150, s BOOST_PP_TUPLE_EAT_3)(p, o, o(150, s))\n# define BOOST_PP_WHILE_150_I(p, o, s) BOOST_PP_IF(p(151, s), BOOST_PP_WHILE_151, s BOOST_PP_TUPLE_EAT_3)(p, o, o(151, s))\n# define BOOST_PP_WHILE_151_I(p, o, s) BOOST_PP_IF(p(152, s), BOOST_PP_WHILE_152, s BOOST_PP_TUPLE_EAT_3)(p, o, o(152, s))\n# define BOOST_PP_WHILE_152_I(p, o, s) BOOST_PP_IF(p(153, s), BOOST_PP_WHILE_153, s BOOST_PP_TUPLE_EAT_3)(p, o, o(153, s))\n# define BOOST_PP_WHILE_153_I(p, o, s) BOOST_PP_IF(p(154, s), BOOST_PP_WHILE_154, s BOOST_PP_TUPLE_EAT_3)(p, o, o(154, s))\n# define BOOST_PP_WHILE_154_I(p, o, s) BOOST_PP_IF(p(155, s), BOOST_PP_WHILE_155, s BOOST_PP_TUPLE_EAT_3)(p, o, o(155, s))\n# define BOOST_PP_WHILE_155_I(p, o, s) BOOST_PP_IF(p(156, s), BOOST_PP_WHILE_156, s BOOST_PP_TUPLE_EAT_3)(p, o, o(156, s))\n# define BOOST_PP_WHILE_156_I(p, o, s) BOOST_PP_IF(p(157, s), BOOST_PP_WHILE_157, s BOOST_PP_TUPLE_EAT_3)(p, o, o(157, s))\n# define BOOST_PP_WHILE_157_I(p, o, s) BOOST_PP_IF(p(158, s), BOOST_PP_WHILE_158, s BOOST_PP_TUPLE_EAT_3)(p, o, o(158, s))\n# define BOOST_PP_WHILE_158_I(p, o, s) BOOST_PP_IF(p(159, s), BOOST_PP_WHILE_159, s BOOST_PP_TUPLE_EAT_3)(p, o, o(159, s))\n# define BOOST_PP_WHILE_159_I(p, o, s) BOOST_PP_IF(p(160, s), BOOST_PP_WHILE_160, s BOOST_PP_TUPLE_EAT_3)(p, o, o(160, s))\n# define BOOST_PP_WHILE_160_I(p, o, s) BOOST_PP_IF(p(161, s), BOOST_PP_WHILE_161, s BOOST_PP_TUPLE_EAT_3)(p, o, o(161, s))\n# define BOOST_PP_WHILE_161_I(p, o, s) BOOST_PP_IF(p(162, s), BOOST_PP_WHILE_162, s BOOST_PP_TUPLE_EAT_3)(p, o, o(162, s))\n# define BOOST_PP_WHILE_162_I(p, o, s) BOOST_PP_IF(p(163, s), BOOST_PP_WHILE_163, s BOOST_PP_TUPLE_EAT_3)(p, o, o(163, s))\n# define BOOST_PP_WHILE_163_I(p, o, s) BOOST_PP_IF(p(164, s), BOOST_PP_WHILE_164, s BOOST_PP_TUPLE_EAT_3)(p, o, o(164, s))\n# define BOOST_PP_WHILE_164_I(p, o, s) BOOST_PP_IF(p(165, s), BOOST_PP_WHILE_165, s BOOST_PP_TUPLE_EAT_3)(p, o, o(165, s))\n# define BOOST_PP_WHILE_165_I(p, o, s) BOOST_PP_IF(p(166, s), BOOST_PP_WHILE_166, s BOOST_PP_TUPLE_EAT_3)(p, o, o(166, s))\n# define BOOST_PP_WHILE_166_I(p, o, s) BOOST_PP_IF(p(167, s), BOOST_PP_WHILE_167, s BOOST_PP_TUPLE_EAT_3)(p, o, o(167, s))\n# define BOOST_PP_WHILE_167_I(p, o, s) BOOST_PP_IF(p(168, s), BOOST_PP_WHILE_168, s BOOST_PP_TUPLE_EAT_3)(p, o, o(168, s))\n# define BOOST_PP_WHILE_168_I(p, o, s) BOOST_PP_IF(p(169, s), BOOST_PP_WHILE_169, s BOOST_PP_TUPLE_EAT_3)(p, o, o(169, s))\n# define BOOST_PP_WHILE_169_I(p, o, s) BOOST_PP_IF(p(170, s), BOOST_PP_WHILE_170, s BOOST_PP_TUPLE_EAT_3)(p, o, o(170, s))\n# define BOOST_PP_WHILE_170_I(p, o, s) BOOST_PP_IF(p(171, s), BOOST_PP_WHILE_171, s BOOST_PP_TUPLE_EAT_3)(p, o, o(171, s))\n# define BOOST_PP_WHILE_171_I(p, o, s) BOOST_PP_IF(p(172, s), BOOST_PP_WHILE_172, s BOOST_PP_TUPLE_EAT_3)(p, o, o(172, s))\n# define BOOST_PP_WHILE_172_I(p, o, s) BOOST_PP_IF(p(173, s), BOOST_PP_WHILE_173, s BOOST_PP_TUPLE_EAT_3)(p, o, o(173, s))\n# define BOOST_PP_WHILE_173_I(p, o, s) BOOST_PP_IF(p(174, s), BOOST_PP_WHILE_174, s BOOST_PP_TUPLE_EAT_3)(p, o, o(174, s))\n# define BOOST_PP_WHILE_174_I(p, o, s) BOOST_PP_IF(p(175, s), BOOST_PP_WHILE_175, s BOOST_PP_TUPLE_EAT_3)(p, o, o(175, s))\n# define BOOST_PP_WHILE_175_I(p, o, s) BOOST_PP_IF(p(176, s), BOOST_PP_WHILE_176, s BOOST_PP_TUPLE_EAT_3)(p, o, o(176, s))\n# define BOOST_PP_WHILE_176_I(p, o, s) BOOST_PP_IF(p(177, s), BOOST_PP_WHILE_177, s BOOST_PP_TUPLE_EAT_3)(p, o, o(177, s))\n# define BOOST_PP_WHILE_177_I(p, o, s) BOOST_PP_IF(p(178, s), BOOST_PP_WHILE_178, s BOOST_PP_TUPLE_EAT_3)(p, o, o(178, s))\n# define BOOST_PP_WHILE_178_I(p, o, s) BOOST_PP_IF(p(179, s), BOOST_PP_WHILE_179, s BOOST_PP_TUPLE_EAT_3)(p, o, o(179, s))\n# define BOOST_PP_WHILE_179_I(p, o, s) BOOST_PP_IF(p(180, s), BOOST_PP_WHILE_180, s BOOST_PP_TUPLE_EAT_3)(p, o, o(180, s))\n# define BOOST_PP_WHILE_180_I(p, o, s) BOOST_PP_IF(p(181, s), BOOST_PP_WHILE_181, s BOOST_PP_TUPLE_EAT_3)(p, o, o(181, s))\n# define BOOST_PP_WHILE_181_I(p, o, s) BOOST_PP_IF(p(182, s), BOOST_PP_WHILE_182, s BOOST_PP_TUPLE_EAT_3)(p, o, o(182, s))\n# define BOOST_PP_WHILE_182_I(p, o, s) BOOST_PP_IF(p(183, s), BOOST_PP_WHILE_183, s BOOST_PP_TUPLE_EAT_3)(p, o, o(183, s))\n# define BOOST_PP_WHILE_183_I(p, o, s) BOOST_PP_IF(p(184, s), BOOST_PP_WHILE_184, s BOOST_PP_TUPLE_EAT_3)(p, o, o(184, s))\n# define BOOST_PP_WHILE_184_I(p, o, s) BOOST_PP_IF(p(185, s), BOOST_PP_WHILE_185, s BOOST_PP_TUPLE_EAT_3)(p, o, o(185, s))\n# define BOOST_PP_WHILE_185_I(p, o, s) BOOST_PP_IF(p(186, s), BOOST_PP_WHILE_186, s BOOST_PP_TUPLE_EAT_3)(p, o, o(186, s))\n# define BOOST_PP_WHILE_186_I(p, o, s) BOOST_PP_IF(p(187, s), BOOST_PP_WHILE_187, s BOOST_PP_TUPLE_EAT_3)(p, o, o(187, s))\n# define BOOST_PP_WHILE_187_I(p, o, s) BOOST_PP_IF(p(188, s), BOOST_PP_WHILE_188, s BOOST_PP_TUPLE_EAT_3)(p, o, o(188, s))\n# define BOOST_PP_WHILE_188_I(p, o, s) BOOST_PP_IF(p(189, s), BOOST_PP_WHILE_189, s BOOST_PP_TUPLE_EAT_3)(p, o, o(189, s))\n# define BOOST_PP_WHILE_189_I(p, o, s) BOOST_PP_IF(p(190, s), BOOST_PP_WHILE_190, s BOOST_PP_TUPLE_EAT_3)(p, o, o(190, s))\n# define BOOST_PP_WHILE_190_I(p, o, s) BOOST_PP_IF(p(191, s), BOOST_PP_WHILE_191, s BOOST_PP_TUPLE_EAT_3)(p, o, o(191, s))\n# define BOOST_PP_WHILE_191_I(p, o, s) BOOST_PP_IF(p(192, s), BOOST_PP_WHILE_192, s BOOST_PP_TUPLE_EAT_3)(p, o, o(192, s))\n# define BOOST_PP_WHILE_192_I(p, o, s) BOOST_PP_IF(p(193, s), BOOST_PP_WHILE_193, s BOOST_PP_TUPLE_EAT_3)(p, o, o(193, s))\n# define BOOST_PP_WHILE_193_I(p, o, s) BOOST_PP_IF(p(194, s), BOOST_PP_WHILE_194, s BOOST_PP_TUPLE_EAT_3)(p, o, o(194, s))\n# define BOOST_PP_WHILE_194_I(p, o, s) BOOST_PP_IF(p(195, s), BOOST_PP_WHILE_195, s BOOST_PP_TUPLE_EAT_3)(p, o, o(195, s))\n# define BOOST_PP_WHILE_195_I(p, o, s) BOOST_PP_IF(p(196, s), BOOST_PP_WHILE_196, s BOOST_PP_TUPLE_EAT_3)(p, o, o(196, s))\n# define BOOST_PP_WHILE_196_I(p, o, s) BOOST_PP_IF(p(197, s), BOOST_PP_WHILE_197, s BOOST_PP_TUPLE_EAT_3)(p, o, o(197, s))\n# define BOOST_PP_WHILE_197_I(p, o, s) BOOST_PP_IF(p(198, s), BOOST_PP_WHILE_198, s BOOST_PP_TUPLE_EAT_3)(p, o, o(198, s))\n# define BOOST_PP_WHILE_198_I(p, o, s) BOOST_PP_IF(p(199, s), BOOST_PP_WHILE_199, s BOOST_PP_TUPLE_EAT_3)(p, o, o(199, s))\n# define BOOST_PP_WHILE_199_I(p, o, s) BOOST_PP_IF(p(200, s), BOOST_PP_WHILE_200, s BOOST_PP_TUPLE_EAT_3)(p, o, o(200, s))\n# define BOOST_PP_WHILE_200_I(p, o, s) BOOST_PP_IF(p(201, s), BOOST_PP_WHILE_201, s BOOST_PP_TUPLE_EAT_3)(p, o, o(201, s))\n# define BOOST_PP_WHILE_201_I(p, o, s) BOOST_PP_IF(p(202, s), BOOST_PP_WHILE_202, s BOOST_PP_TUPLE_EAT_3)(p, o, o(202, s))\n# define BOOST_PP_WHILE_202_I(p, o, s) BOOST_PP_IF(p(203, s), BOOST_PP_WHILE_203, s BOOST_PP_TUPLE_EAT_3)(p, o, o(203, s))\n# define BOOST_PP_WHILE_203_I(p, o, s) BOOST_PP_IF(p(204, s), BOOST_PP_WHILE_204, s BOOST_PP_TUPLE_EAT_3)(p, o, o(204, s))\n# define BOOST_PP_WHILE_204_I(p, o, s) BOOST_PP_IF(p(205, s), BOOST_PP_WHILE_205, s BOOST_PP_TUPLE_EAT_3)(p, o, o(205, s))\n# define BOOST_PP_WHILE_205_I(p, o, s) BOOST_PP_IF(p(206, s), BOOST_PP_WHILE_206, s BOOST_PP_TUPLE_EAT_3)(p, o, o(206, s))\n# define BOOST_PP_WHILE_206_I(p, o, s) BOOST_PP_IF(p(207, s), BOOST_PP_WHILE_207, s BOOST_PP_TUPLE_EAT_3)(p, o, o(207, s))\n# define BOOST_PP_WHILE_207_I(p, o, s) BOOST_PP_IF(p(208, s), BOOST_PP_WHILE_208, s BOOST_PP_TUPLE_EAT_3)(p, o, o(208, s))\n# define BOOST_PP_WHILE_208_I(p, o, s) BOOST_PP_IF(p(209, s), BOOST_PP_WHILE_209, s BOOST_PP_TUPLE_EAT_3)(p, o, o(209, s))\n# define BOOST_PP_WHILE_209_I(p, o, s) BOOST_PP_IF(p(210, s), BOOST_PP_WHILE_210, s BOOST_PP_TUPLE_EAT_3)(p, o, o(210, s))\n# define BOOST_PP_WHILE_210_I(p, o, s) BOOST_PP_IF(p(211, s), BOOST_PP_WHILE_211, s BOOST_PP_TUPLE_EAT_3)(p, o, o(211, s))\n# define BOOST_PP_WHILE_211_I(p, o, s) BOOST_PP_IF(p(212, s), BOOST_PP_WHILE_212, s BOOST_PP_TUPLE_EAT_3)(p, o, o(212, s))\n# define BOOST_PP_WHILE_212_I(p, o, s) BOOST_PP_IF(p(213, s), BOOST_PP_WHILE_213, s BOOST_PP_TUPLE_EAT_3)(p, o, o(213, s))\n# define BOOST_PP_WHILE_213_I(p, o, s) BOOST_PP_IF(p(214, s), BOOST_PP_WHILE_214, s BOOST_PP_TUPLE_EAT_3)(p, o, o(214, s))\n# define BOOST_PP_WHILE_214_I(p, o, s) BOOST_PP_IF(p(215, s), BOOST_PP_WHILE_215, s BOOST_PP_TUPLE_EAT_3)(p, o, o(215, s))\n# define BOOST_PP_WHILE_215_I(p, o, s) BOOST_PP_IF(p(216, s), BOOST_PP_WHILE_216, s BOOST_PP_TUPLE_EAT_3)(p, o, o(216, s))\n# define BOOST_PP_WHILE_216_I(p, o, s) BOOST_PP_IF(p(217, s), BOOST_PP_WHILE_217, s BOOST_PP_TUPLE_EAT_3)(p, o, o(217, s))\n# define BOOST_PP_WHILE_217_I(p, o, s) BOOST_PP_IF(p(218, s), BOOST_PP_WHILE_218, s BOOST_PP_TUPLE_EAT_3)(p, o, o(218, s))\n# define BOOST_PP_WHILE_218_I(p, o, s) BOOST_PP_IF(p(219, s), BOOST_PP_WHILE_219, s BOOST_PP_TUPLE_EAT_3)(p, o, o(219, s))\n# define BOOST_PP_WHILE_219_I(p, o, s) BOOST_PP_IF(p(220, s), BOOST_PP_WHILE_220, s BOOST_PP_TUPLE_EAT_3)(p, o, o(220, s))\n# define BOOST_PP_WHILE_220_I(p, o, s) BOOST_PP_IF(p(221, s), BOOST_PP_WHILE_221, s BOOST_PP_TUPLE_EAT_3)(p, o, o(221, s))\n# define BOOST_PP_WHILE_221_I(p, o, s) BOOST_PP_IF(p(222, s), BOOST_PP_WHILE_222, s BOOST_PP_TUPLE_EAT_3)(p, o, o(222, s))\n# define BOOST_PP_WHILE_222_I(p, o, s) BOOST_PP_IF(p(223, s), BOOST_PP_WHILE_223, s BOOST_PP_TUPLE_EAT_3)(p, o, o(223, s))\n# define BOOST_PP_WHILE_223_I(p, o, s) BOOST_PP_IF(p(224, s), BOOST_PP_WHILE_224, s BOOST_PP_TUPLE_EAT_3)(p, o, o(224, s))\n# define BOOST_PP_WHILE_224_I(p, o, s) BOOST_PP_IF(p(225, s), BOOST_PP_WHILE_225, s BOOST_PP_TUPLE_EAT_3)(p, o, o(225, s))\n# define BOOST_PP_WHILE_225_I(p, o, s) BOOST_PP_IF(p(226, s), BOOST_PP_WHILE_226, s BOOST_PP_TUPLE_EAT_3)(p, o, o(226, s))\n# define BOOST_PP_WHILE_226_I(p, o, s) BOOST_PP_IF(p(227, s), BOOST_PP_WHILE_227, s BOOST_PP_TUPLE_EAT_3)(p, o, o(227, s))\n# define BOOST_PP_WHILE_227_I(p, o, s) BOOST_PP_IF(p(228, s), BOOST_PP_WHILE_228, s BOOST_PP_TUPLE_EAT_3)(p, o, o(228, s))\n# define BOOST_PP_WHILE_228_I(p, o, s) BOOST_PP_IF(p(229, s), BOOST_PP_WHILE_229, s BOOST_PP_TUPLE_EAT_3)(p, o, o(229, s))\n# define BOOST_PP_WHILE_229_I(p, o, s) BOOST_PP_IF(p(230, s), BOOST_PP_WHILE_230, s BOOST_PP_TUPLE_EAT_3)(p, o, o(230, s))\n# define BOOST_PP_WHILE_230_I(p, o, s) BOOST_PP_IF(p(231, s), BOOST_PP_WHILE_231, s BOOST_PP_TUPLE_EAT_3)(p, o, o(231, s))\n# define BOOST_PP_WHILE_231_I(p, o, s) BOOST_PP_IF(p(232, s), BOOST_PP_WHILE_232, s BOOST_PP_TUPLE_EAT_3)(p, o, o(232, s))\n# define BOOST_PP_WHILE_232_I(p, o, s) BOOST_PP_IF(p(233, s), BOOST_PP_WHILE_233, s BOOST_PP_TUPLE_EAT_3)(p, o, o(233, s))\n# define BOOST_PP_WHILE_233_I(p, o, s) BOOST_PP_IF(p(234, s), BOOST_PP_WHILE_234, s BOOST_PP_TUPLE_EAT_3)(p, o, o(234, s))\n# define BOOST_PP_WHILE_234_I(p, o, s) BOOST_PP_IF(p(235, s), BOOST_PP_WHILE_235, s BOOST_PP_TUPLE_EAT_3)(p, o, o(235, s))\n# define BOOST_PP_WHILE_235_I(p, o, s) BOOST_PP_IF(p(236, s), BOOST_PP_WHILE_236, s BOOST_PP_TUPLE_EAT_3)(p, o, o(236, s))\n# define BOOST_PP_WHILE_236_I(p, o, s) BOOST_PP_IF(p(237, s), BOOST_PP_WHILE_237, s BOOST_PP_TUPLE_EAT_3)(p, o, o(237, s))\n# define BOOST_PP_WHILE_237_I(p, o, s) BOOST_PP_IF(p(238, s), BOOST_PP_WHILE_238, s BOOST_PP_TUPLE_EAT_3)(p, o, o(238, s))\n# define BOOST_PP_WHILE_238_I(p, o, s) BOOST_PP_IF(p(239, s), BOOST_PP_WHILE_239, s BOOST_PP_TUPLE_EAT_3)(p, o, o(239, s))\n# define BOOST_PP_WHILE_239_I(p, o, s) BOOST_PP_IF(p(240, s), BOOST_PP_WHILE_240, s BOOST_PP_TUPLE_EAT_3)(p, o, o(240, s))\n# define BOOST_PP_WHILE_240_I(p, o, s) BOOST_PP_IF(p(241, s), BOOST_PP_WHILE_241, s BOOST_PP_TUPLE_EAT_3)(p, o, o(241, s))\n# define BOOST_PP_WHILE_241_I(p, o, s) BOOST_PP_IF(p(242, s), BOOST_PP_WHILE_242, s BOOST_PP_TUPLE_EAT_3)(p, o, o(242, s))\n# define BOOST_PP_WHILE_242_I(p, o, s) BOOST_PP_IF(p(243, s), BOOST_PP_WHILE_243, s BOOST_PP_TUPLE_EAT_3)(p, o, o(243, s))\n# define BOOST_PP_WHILE_243_I(p, o, s) BOOST_PP_IF(p(244, s), BOOST_PP_WHILE_244, s BOOST_PP_TUPLE_EAT_3)(p, o, o(244, s))\n# define BOOST_PP_WHILE_244_I(p, o, s) BOOST_PP_IF(p(245, s), BOOST_PP_WHILE_245, s BOOST_PP_TUPLE_EAT_3)(p, o, o(245, s))\n# define BOOST_PP_WHILE_245_I(p, o, s) BOOST_PP_IF(p(246, s), BOOST_PP_WHILE_246, s BOOST_PP_TUPLE_EAT_3)(p, o, o(246, s))\n# define BOOST_PP_WHILE_246_I(p, o, s) BOOST_PP_IF(p(247, s), BOOST_PP_WHILE_247, s BOOST_PP_TUPLE_EAT_3)(p, o, o(247, s))\n# define BOOST_PP_WHILE_247_I(p, o, s) BOOST_PP_IF(p(248, s), BOOST_PP_WHILE_248, s BOOST_PP_TUPLE_EAT_3)(p, o, o(248, s))\n# define BOOST_PP_WHILE_248_I(p, o, s) BOOST_PP_IF(p(249, s), BOOST_PP_WHILE_249, s BOOST_PP_TUPLE_EAT_3)(p, o, o(249, s))\n# define BOOST_PP_WHILE_249_I(p, o, s) BOOST_PP_IF(p(250, s), BOOST_PP_WHILE_250, s BOOST_PP_TUPLE_EAT_3)(p, o, o(250, s))\n# define BOOST_PP_WHILE_250_I(p, o, s) BOOST_PP_IF(p(251, s), BOOST_PP_WHILE_251, s BOOST_PP_TUPLE_EAT_3)(p, o, o(251, s))\n# define BOOST_PP_WHILE_251_I(p, o, s) BOOST_PP_IF(p(252, s), BOOST_PP_WHILE_252, s BOOST_PP_TUPLE_EAT_3)(p, o, o(252, s))\n# define BOOST_PP_WHILE_252_I(p, o, s) BOOST_PP_IF(p(253, s), BOOST_PP_WHILE_253, s BOOST_PP_TUPLE_EAT_3)(p, o, o(253, s))\n# define BOOST_PP_WHILE_253_I(p, o, s) BOOST_PP_IF(p(254, s), BOOST_PP_WHILE_254, s BOOST_PP_TUPLE_EAT_3)(p, o, o(254, s))\n# define BOOST_PP_WHILE_254_I(p, o, s) BOOST_PP_IF(p(255, s), BOOST_PP_WHILE_255, s BOOST_PP_TUPLE_EAT_3)(p, o, o(255, s))\n# define BOOST_PP_WHILE_255_I(p, o, s) BOOST_PP_IF(p(256, s), BOOST_PP_WHILE_256, s BOOST_PP_TUPLE_EAT_3)(p, o, o(256, s))\n# define BOOST_PP_WHILE_256_I(p, o, s) BOOST_PP_IF(p(257, s), BOOST_PP_WHILE_257, s BOOST_PP_TUPLE_EAT_3)(p, o, o(257, s))\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/control/detail/msvc/while.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_CONTROL_DETAIL_MSVC_WHILE_HPP\n# define BOOST_PREPROCESSOR_CONTROL_DETAIL_MSVC_WHILE_HPP\n#\n# include <boost/preprocessor/control/if.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n#\n# define BOOST_PP_WHILE_1(p, o, s) BOOST_PP_IF(p(2, s), BOOST_PP_WHILE_2, s BOOST_PP_TUPLE_EAT_3)(p, o, o(2, s))\n# define BOOST_PP_WHILE_2(p, o, s) BOOST_PP_IF(p(3, s), BOOST_PP_WHILE_3, s BOOST_PP_TUPLE_EAT_3)(p, o, o(3, s))\n# define BOOST_PP_WHILE_3(p, o, s) BOOST_PP_IF(p(4, s), BOOST_PP_WHILE_4, s BOOST_PP_TUPLE_EAT_3)(p, o, o(4, s))\n# define BOOST_PP_WHILE_4(p, o, s) BOOST_PP_IF(p(5, s), BOOST_PP_WHILE_5, s BOOST_PP_TUPLE_EAT_3)(p, o, o(5, s))\n# define BOOST_PP_WHILE_5(p, o, s) BOOST_PP_IF(p(6, s), BOOST_PP_WHILE_6, s BOOST_PP_TUPLE_EAT_3)(p, o, o(6, s))\n# define BOOST_PP_WHILE_6(p, o, s) BOOST_PP_IF(p(7, s), BOOST_PP_WHILE_7, s BOOST_PP_TUPLE_EAT_3)(p, o, o(7, s))\n# define BOOST_PP_WHILE_7(p, o, s) BOOST_PP_IF(p(8, s), BOOST_PP_WHILE_8, s BOOST_PP_TUPLE_EAT_3)(p, o, o(8, s))\n# define BOOST_PP_WHILE_8(p, o, s) BOOST_PP_IF(p(9, s), BOOST_PP_WHILE_9, s BOOST_PP_TUPLE_EAT_3)(p, o, o(9, s))\n# define BOOST_PP_WHILE_9(p, o, s) BOOST_PP_IF(p(10, s), BOOST_PP_WHILE_10, s BOOST_PP_TUPLE_EAT_3)(p, o, o(10, s))\n# define BOOST_PP_WHILE_10(p, o, s) BOOST_PP_IF(p(11, s), BOOST_PP_WHILE_11, s BOOST_PP_TUPLE_EAT_3)(p, o, o(11, s))\n# define BOOST_PP_WHILE_11(p, o, s) BOOST_PP_IF(p(12, s), BOOST_PP_WHILE_12, s BOOST_PP_TUPLE_EAT_3)(p, o, o(12, s))\n# define BOOST_PP_WHILE_12(p, o, s) BOOST_PP_IF(p(13, s), BOOST_PP_WHILE_13, s BOOST_PP_TUPLE_EAT_3)(p, o, o(13, s))\n# define BOOST_PP_WHILE_13(p, o, s) BOOST_PP_IF(p(14, s), BOOST_PP_WHILE_14, s BOOST_PP_TUPLE_EAT_3)(p, o, o(14, s))\n# define BOOST_PP_WHILE_14(p, o, s) BOOST_PP_IF(p(15, s), BOOST_PP_WHILE_15, s BOOST_PP_TUPLE_EAT_3)(p, o, o(15, s))\n# define BOOST_PP_WHILE_15(p, o, s) BOOST_PP_IF(p(16, s), BOOST_PP_WHILE_16, s BOOST_PP_TUPLE_EAT_3)(p, o, o(16, s))\n# define BOOST_PP_WHILE_16(p, o, s) BOOST_PP_IF(p(17, s), BOOST_PP_WHILE_17, s BOOST_PP_TUPLE_EAT_3)(p, o, o(17, s))\n# define BOOST_PP_WHILE_17(p, o, s) BOOST_PP_IF(p(18, s), BOOST_PP_WHILE_18, s BOOST_PP_TUPLE_EAT_3)(p, o, o(18, s))\n# define BOOST_PP_WHILE_18(p, o, s) BOOST_PP_IF(p(19, s), BOOST_PP_WHILE_19, s BOOST_PP_TUPLE_EAT_3)(p, o, o(19, s))\n# define BOOST_PP_WHILE_19(p, o, s) BOOST_PP_IF(p(20, s), BOOST_PP_WHILE_20, s BOOST_PP_TUPLE_EAT_3)(p, o, o(20, s))\n# define BOOST_PP_WHILE_20(p, o, s) BOOST_PP_IF(p(21, s), BOOST_PP_WHILE_21, s BOOST_PP_TUPLE_EAT_3)(p, o, o(21, s))\n# define BOOST_PP_WHILE_21(p, o, s) BOOST_PP_IF(p(22, s), BOOST_PP_WHILE_22, s BOOST_PP_TUPLE_EAT_3)(p, o, o(22, s))\n# define BOOST_PP_WHILE_22(p, o, s) BOOST_PP_IF(p(23, s), BOOST_PP_WHILE_23, s BOOST_PP_TUPLE_EAT_3)(p, o, o(23, s))\n# define BOOST_PP_WHILE_23(p, o, s) BOOST_PP_IF(p(24, s), BOOST_PP_WHILE_24, s BOOST_PP_TUPLE_EAT_3)(p, o, o(24, s))\n# define BOOST_PP_WHILE_24(p, o, s) BOOST_PP_IF(p(25, s), BOOST_PP_WHILE_25, s BOOST_PP_TUPLE_EAT_3)(p, o, o(25, s))\n# define BOOST_PP_WHILE_25(p, o, s) BOOST_PP_IF(p(26, s), BOOST_PP_WHILE_26, s BOOST_PP_TUPLE_EAT_3)(p, o, o(26, s))\n# define BOOST_PP_WHILE_26(p, o, s) BOOST_PP_IF(p(27, s), BOOST_PP_WHILE_27, s BOOST_PP_TUPLE_EAT_3)(p, o, o(27, s))\n# define BOOST_PP_WHILE_27(p, o, s) BOOST_PP_IF(p(28, s), BOOST_PP_WHILE_28, s BOOST_PP_TUPLE_EAT_3)(p, o, o(28, s))\n# define BOOST_PP_WHILE_28(p, o, s) BOOST_PP_IF(p(29, s), BOOST_PP_WHILE_29, s BOOST_PP_TUPLE_EAT_3)(p, o, o(29, s))\n# define BOOST_PP_WHILE_29(p, o, s) BOOST_PP_IF(p(30, s), BOOST_PP_WHILE_30, s BOOST_PP_TUPLE_EAT_3)(p, o, o(30, s))\n# define BOOST_PP_WHILE_30(p, o, s) BOOST_PP_IF(p(31, s), BOOST_PP_WHILE_31, s BOOST_PP_TUPLE_EAT_3)(p, o, o(31, s))\n# define BOOST_PP_WHILE_31(p, o, s) BOOST_PP_IF(p(32, s), BOOST_PP_WHILE_32, s BOOST_PP_TUPLE_EAT_3)(p, o, o(32, s))\n# define BOOST_PP_WHILE_32(p, o, s) BOOST_PP_IF(p(33, s), BOOST_PP_WHILE_33, s BOOST_PP_TUPLE_EAT_3)(p, o, o(33, s))\n# define BOOST_PP_WHILE_33(p, o, s) BOOST_PP_IF(p(34, s), BOOST_PP_WHILE_34, s BOOST_PP_TUPLE_EAT_3)(p, o, o(34, s))\n# define BOOST_PP_WHILE_34(p, o, s) BOOST_PP_IF(p(35, s), BOOST_PP_WHILE_35, s BOOST_PP_TUPLE_EAT_3)(p, o, o(35, s))\n# define BOOST_PP_WHILE_35(p, o, s) BOOST_PP_IF(p(36, s), BOOST_PP_WHILE_36, s BOOST_PP_TUPLE_EAT_3)(p, o, o(36, s))\n# define BOOST_PP_WHILE_36(p, o, s) BOOST_PP_IF(p(37, s), BOOST_PP_WHILE_37, s BOOST_PP_TUPLE_EAT_3)(p, o, o(37, s))\n# define BOOST_PP_WHILE_37(p, o, s) BOOST_PP_IF(p(38, s), BOOST_PP_WHILE_38, s BOOST_PP_TUPLE_EAT_3)(p, o, o(38, s))\n# define BOOST_PP_WHILE_38(p, o, s) BOOST_PP_IF(p(39, s), BOOST_PP_WHILE_39, s BOOST_PP_TUPLE_EAT_3)(p, o, o(39, s))\n# define BOOST_PP_WHILE_39(p, o, s) BOOST_PP_IF(p(40, s), BOOST_PP_WHILE_40, s BOOST_PP_TUPLE_EAT_3)(p, o, o(40, s))\n# define BOOST_PP_WHILE_40(p, o, s) BOOST_PP_IF(p(41, s), BOOST_PP_WHILE_41, s BOOST_PP_TUPLE_EAT_3)(p, o, o(41, s))\n# define BOOST_PP_WHILE_41(p, o, s) BOOST_PP_IF(p(42, s), BOOST_PP_WHILE_42, s BOOST_PP_TUPLE_EAT_3)(p, o, o(42, s))\n# define BOOST_PP_WHILE_42(p, o, s) BOOST_PP_IF(p(43, s), BOOST_PP_WHILE_43, s BOOST_PP_TUPLE_EAT_3)(p, o, o(43, s))\n# define BOOST_PP_WHILE_43(p, o, s) BOOST_PP_IF(p(44, s), BOOST_PP_WHILE_44, s BOOST_PP_TUPLE_EAT_3)(p, o, o(44, s))\n# define BOOST_PP_WHILE_44(p, o, s) BOOST_PP_IF(p(45, s), BOOST_PP_WHILE_45, s BOOST_PP_TUPLE_EAT_3)(p, o, o(45, s))\n# define BOOST_PP_WHILE_45(p, o, s) BOOST_PP_IF(p(46, s), BOOST_PP_WHILE_46, s BOOST_PP_TUPLE_EAT_3)(p, o, o(46, s))\n# define BOOST_PP_WHILE_46(p, o, s) BOOST_PP_IF(p(47, s), BOOST_PP_WHILE_47, s BOOST_PP_TUPLE_EAT_3)(p, o, o(47, s))\n# define BOOST_PP_WHILE_47(p, o, s) BOOST_PP_IF(p(48, s), BOOST_PP_WHILE_48, s BOOST_PP_TUPLE_EAT_3)(p, o, o(48, s))\n# define BOOST_PP_WHILE_48(p, o, s) BOOST_PP_IF(p(49, s), BOOST_PP_WHILE_49, s BOOST_PP_TUPLE_EAT_3)(p, o, o(49, s))\n# define BOOST_PP_WHILE_49(p, o, s) BOOST_PP_IF(p(50, s), BOOST_PP_WHILE_50, s BOOST_PP_TUPLE_EAT_3)(p, o, o(50, s))\n# define BOOST_PP_WHILE_50(p, o, s) BOOST_PP_IF(p(51, s), BOOST_PP_WHILE_51, s BOOST_PP_TUPLE_EAT_3)(p, o, o(51, s))\n# define BOOST_PP_WHILE_51(p, o, s) BOOST_PP_IF(p(52, s), BOOST_PP_WHILE_52, s BOOST_PP_TUPLE_EAT_3)(p, o, o(52, s))\n# define BOOST_PP_WHILE_52(p, o, s) BOOST_PP_IF(p(53, s), BOOST_PP_WHILE_53, s BOOST_PP_TUPLE_EAT_3)(p, o, o(53, s))\n# define BOOST_PP_WHILE_53(p, o, s) BOOST_PP_IF(p(54, s), BOOST_PP_WHILE_54, s BOOST_PP_TUPLE_EAT_3)(p, o, o(54, s))\n# define BOOST_PP_WHILE_54(p, o, s) BOOST_PP_IF(p(55, s), BOOST_PP_WHILE_55, s BOOST_PP_TUPLE_EAT_3)(p, o, o(55, s))\n# define BOOST_PP_WHILE_55(p, o, s) BOOST_PP_IF(p(56, s), BOOST_PP_WHILE_56, s BOOST_PP_TUPLE_EAT_3)(p, o, o(56, s))\n# define BOOST_PP_WHILE_56(p, o, s) BOOST_PP_IF(p(57, s), BOOST_PP_WHILE_57, s BOOST_PP_TUPLE_EAT_3)(p, o, o(57, s))\n# define BOOST_PP_WHILE_57(p, o, s) BOOST_PP_IF(p(58, s), BOOST_PP_WHILE_58, s BOOST_PP_TUPLE_EAT_3)(p, o, o(58, s))\n# define BOOST_PP_WHILE_58(p, o, s) BOOST_PP_IF(p(59, s), BOOST_PP_WHILE_59, s BOOST_PP_TUPLE_EAT_3)(p, o, o(59, s))\n# define BOOST_PP_WHILE_59(p, o, s) BOOST_PP_IF(p(60, s), BOOST_PP_WHILE_60, s BOOST_PP_TUPLE_EAT_3)(p, o, o(60, s))\n# define BOOST_PP_WHILE_60(p, o, s) BOOST_PP_IF(p(61, s), BOOST_PP_WHILE_61, s BOOST_PP_TUPLE_EAT_3)(p, o, o(61, s))\n# define BOOST_PP_WHILE_61(p, o, s) BOOST_PP_IF(p(62, s), BOOST_PP_WHILE_62, s BOOST_PP_TUPLE_EAT_3)(p, o, o(62, s))\n# define BOOST_PP_WHILE_62(p, o, s) BOOST_PP_IF(p(63, s), BOOST_PP_WHILE_63, s BOOST_PP_TUPLE_EAT_3)(p, o, o(63, s))\n# define BOOST_PP_WHILE_63(p, o, s) BOOST_PP_IF(p(64, s), BOOST_PP_WHILE_64, s BOOST_PP_TUPLE_EAT_3)(p, o, o(64, s))\n# define BOOST_PP_WHILE_64(p, o, s) BOOST_PP_IF(p(65, s), BOOST_PP_WHILE_65, s BOOST_PP_TUPLE_EAT_3)(p, o, o(65, s))\n# define BOOST_PP_WHILE_65(p, o, s) BOOST_PP_IF(p(66, s), BOOST_PP_WHILE_66, s BOOST_PP_TUPLE_EAT_3)(p, o, o(66, s))\n# define BOOST_PP_WHILE_66(p, o, s) BOOST_PP_IF(p(67, s), BOOST_PP_WHILE_67, s BOOST_PP_TUPLE_EAT_3)(p, o, o(67, s))\n# define BOOST_PP_WHILE_67(p, o, s) BOOST_PP_IF(p(68, s), BOOST_PP_WHILE_68, s BOOST_PP_TUPLE_EAT_3)(p, o, o(68, s))\n# define BOOST_PP_WHILE_68(p, o, s) BOOST_PP_IF(p(69, s), BOOST_PP_WHILE_69, s BOOST_PP_TUPLE_EAT_3)(p, o, o(69, s))\n# define BOOST_PP_WHILE_69(p, o, s) BOOST_PP_IF(p(70, s), BOOST_PP_WHILE_70, s BOOST_PP_TUPLE_EAT_3)(p, o, o(70, s))\n# define BOOST_PP_WHILE_70(p, o, s) BOOST_PP_IF(p(71, s), BOOST_PP_WHILE_71, s BOOST_PP_TUPLE_EAT_3)(p, o, o(71, s))\n# define BOOST_PP_WHILE_71(p, o, s) BOOST_PP_IF(p(72, s), BOOST_PP_WHILE_72, s BOOST_PP_TUPLE_EAT_3)(p, o, o(72, s))\n# define BOOST_PP_WHILE_72(p, o, s) BOOST_PP_IF(p(73, s), BOOST_PP_WHILE_73, s BOOST_PP_TUPLE_EAT_3)(p, o, o(73, s))\n# define BOOST_PP_WHILE_73(p, o, s) BOOST_PP_IF(p(74, s), BOOST_PP_WHILE_74, s BOOST_PP_TUPLE_EAT_3)(p, o, o(74, s))\n# define BOOST_PP_WHILE_74(p, o, s) BOOST_PP_IF(p(75, s), BOOST_PP_WHILE_75, s BOOST_PP_TUPLE_EAT_3)(p, o, o(75, s))\n# define BOOST_PP_WHILE_75(p, o, s) BOOST_PP_IF(p(76, s), BOOST_PP_WHILE_76, s BOOST_PP_TUPLE_EAT_3)(p, o, o(76, s))\n# define BOOST_PP_WHILE_76(p, o, s) BOOST_PP_IF(p(77, s), BOOST_PP_WHILE_77, s BOOST_PP_TUPLE_EAT_3)(p, o, o(77, s))\n# define BOOST_PP_WHILE_77(p, o, s) BOOST_PP_IF(p(78, s), BOOST_PP_WHILE_78, s BOOST_PP_TUPLE_EAT_3)(p, o, o(78, s))\n# define BOOST_PP_WHILE_78(p, o, s) BOOST_PP_IF(p(79, s), BOOST_PP_WHILE_79, s BOOST_PP_TUPLE_EAT_3)(p, o, o(79, s))\n# define BOOST_PP_WHILE_79(p, o, s) BOOST_PP_IF(p(80, s), BOOST_PP_WHILE_80, s BOOST_PP_TUPLE_EAT_3)(p, o, o(80, s))\n# define BOOST_PP_WHILE_80(p, o, s) BOOST_PP_IF(p(81, s), BOOST_PP_WHILE_81, s BOOST_PP_TUPLE_EAT_3)(p, o, o(81, s))\n# define BOOST_PP_WHILE_81(p, o, s) BOOST_PP_IF(p(82, s), BOOST_PP_WHILE_82, s BOOST_PP_TUPLE_EAT_3)(p, o, o(82, s))\n# define BOOST_PP_WHILE_82(p, o, s) BOOST_PP_IF(p(83, s), BOOST_PP_WHILE_83, s BOOST_PP_TUPLE_EAT_3)(p, o, o(83, s))\n# define BOOST_PP_WHILE_83(p, o, s) BOOST_PP_IF(p(84, s), BOOST_PP_WHILE_84, s BOOST_PP_TUPLE_EAT_3)(p, o, o(84, s))\n# define BOOST_PP_WHILE_84(p, o, s) BOOST_PP_IF(p(85, s), BOOST_PP_WHILE_85, s BOOST_PP_TUPLE_EAT_3)(p, o, o(85, s))\n# define BOOST_PP_WHILE_85(p, o, s) BOOST_PP_IF(p(86, s), BOOST_PP_WHILE_86, s BOOST_PP_TUPLE_EAT_3)(p, o, o(86, s))\n# define BOOST_PP_WHILE_86(p, o, s) BOOST_PP_IF(p(87, s), BOOST_PP_WHILE_87, s BOOST_PP_TUPLE_EAT_3)(p, o, o(87, s))\n# define BOOST_PP_WHILE_87(p, o, s) BOOST_PP_IF(p(88, s), BOOST_PP_WHILE_88, s BOOST_PP_TUPLE_EAT_3)(p, o, o(88, s))\n# define BOOST_PP_WHILE_88(p, o, s) BOOST_PP_IF(p(89, s), BOOST_PP_WHILE_89, s BOOST_PP_TUPLE_EAT_3)(p, o, o(89, s))\n# define BOOST_PP_WHILE_89(p, o, s) BOOST_PP_IF(p(90, s), BOOST_PP_WHILE_90, s BOOST_PP_TUPLE_EAT_3)(p, o, o(90, s))\n# define BOOST_PP_WHILE_90(p, o, s) BOOST_PP_IF(p(91, s), BOOST_PP_WHILE_91, s BOOST_PP_TUPLE_EAT_3)(p, o, o(91, s))\n# define BOOST_PP_WHILE_91(p, o, s) BOOST_PP_IF(p(92, s), BOOST_PP_WHILE_92, s BOOST_PP_TUPLE_EAT_3)(p, o, o(92, s))\n# define BOOST_PP_WHILE_92(p, o, s) BOOST_PP_IF(p(93, s), BOOST_PP_WHILE_93, s BOOST_PP_TUPLE_EAT_3)(p, o, o(93, s))\n# define BOOST_PP_WHILE_93(p, o, s) BOOST_PP_IF(p(94, s), BOOST_PP_WHILE_94, s BOOST_PP_TUPLE_EAT_3)(p, o, o(94, s))\n# define BOOST_PP_WHILE_94(p, o, s) BOOST_PP_IF(p(95, s), BOOST_PP_WHILE_95, s BOOST_PP_TUPLE_EAT_3)(p, o, o(95, s))\n# define BOOST_PP_WHILE_95(p, o, s) BOOST_PP_IF(p(96, s), BOOST_PP_WHILE_96, s BOOST_PP_TUPLE_EAT_3)(p, o, o(96, s))\n# define BOOST_PP_WHILE_96(p, o, s) BOOST_PP_IF(p(97, s), BOOST_PP_WHILE_97, s BOOST_PP_TUPLE_EAT_3)(p, o, o(97, s))\n# define BOOST_PP_WHILE_97(p, o, s) BOOST_PP_IF(p(98, s), BOOST_PP_WHILE_98, s BOOST_PP_TUPLE_EAT_3)(p, o, o(98, s))\n# define BOOST_PP_WHILE_98(p, o, s) BOOST_PP_IF(p(99, s), BOOST_PP_WHILE_99, s BOOST_PP_TUPLE_EAT_3)(p, o, o(99, s))\n# define BOOST_PP_WHILE_99(p, o, s) BOOST_PP_IF(p(100, s), BOOST_PP_WHILE_100, s BOOST_PP_TUPLE_EAT_3)(p, o, o(100, s))\n# define BOOST_PP_WHILE_100(p, o, s) BOOST_PP_IF(p(101, s), BOOST_PP_WHILE_101, s BOOST_PP_TUPLE_EAT_3)(p, o, o(101, s))\n# define BOOST_PP_WHILE_101(p, o, s) BOOST_PP_IF(p(102, s), BOOST_PP_WHILE_102, s BOOST_PP_TUPLE_EAT_3)(p, o, o(102, s))\n# define BOOST_PP_WHILE_102(p, o, s) BOOST_PP_IF(p(103, s), BOOST_PP_WHILE_103, s BOOST_PP_TUPLE_EAT_3)(p, o, o(103, s))\n# define BOOST_PP_WHILE_103(p, o, s) BOOST_PP_IF(p(104, s), BOOST_PP_WHILE_104, s BOOST_PP_TUPLE_EAT_3)(p, o, o(104, s))\n# define BOOST_PP_WHILE_104(p, o, s) BOOST_PP_IF(p(105, s), BOOST_PP_WHILE_105, s BOOST_PP_TUPLE_EAT_3)(p, o, o(105, s))\n# define BOOST_PP_WHILE_105(p, o, s) BOOST_PP_IF(p(106, s), BOOST_PP_WHILE_106, s BOOST_PP_TUPLE_EAT_3)(p, o, o(106, s))\n# define BOOST_PP_WHILE_106(p, o, s) BOOST_PP_IF(p(107, s), BOOST_PP_WHILE_107, s BOOST_PP_TUPLE_EAT_3)(p, o, o(107, s))\n# define BOOST_PP_WHILE_107(p, o, s) BOOST_PP_IF(p(108, s), BOOST_PP_WHILE_108, s BOOST_PP_TUPLE_EAT_3)(p, o, o(108, s))\n# define BOOST_PP_WHILE_108(p, o, s) BOOST_PP_IF(p(109, s), BOOST_PP_WHILE_109, s BOOST_PP_TUPLE_EAT_3)(p, o, o(109, s))\n# define BOOST_PP_WHILE_109(p, o, s) BOOST_PP_IF(p(110, s), BOOST_PP_WHILE_110, s BOOST_PP_TUPLE_EAT_3)(p, o, o(110, s))\n# define BOOST_PP_WHILE_110(p, o, s) BOOST_PP_IF(p(111, s), BOOST_PP_WHILE_111, s BOOST_PP_TUPLE_EAT_3)(p, o, o(111, s))\n# define BOOST_PP_WHILE_111(p, o, s) BOOST_PP_IF(p(112, s), BOOST_PP_WHILE_112, s BOOST_PP_TUPLE_EAT_3)(p, o, o(112, s))\n# define BOOST_PP_WHILE_112(p, o, s) BOOST_PP_IF(p(113, s), BOOST_PP_WHILE_113, s BOOST_PP_TUPLE_EAT_3)(p, o, o(113, s))\n# define BOOST_PP_WHILE_113(p, o, s) BOOST_PP_IF(p(114, s), BOOST_PP_WHILE_114, s BOOST_PP_TUPLE_EAT_3)(p, o, o(114, s))\n# define BOOST_PP_WHILE_114(p, o, s) BOOST_PP_IF(p(115, s), BOOST_PP_WHILE_115, s BOOST_PP_TUPLE_EAT_3)(p, o, o(115, s))\n# define BOOST_PP_WHILE_115(p, o, s) BOOST_PP_IF(p(116, s), BOOST_PP_WHILE_116, s BOOST_PP_TUPLE_EAT_3)(p, o, o(116, s))\n# define BOOST_PP_WHILE_116(p, o, s) BOOST_PP_IF(p(117, s), BOOST_PP_WHILE_117, s BOOST_PP_TUPLE_EAT_3)(p, o, o(117, s))\n# define BOOST_PP_WHILE_117(p, o, s) BOOST_PP_IF(p(118, s), BOOST_PP_WHILE_118, s BOOST_PP_TUPLE_EAT_3)(p, o, o(118, s))\n# define BOOST_PP_WHILE_118(p, o, s) BOOST_PP_IF(p(119, s), BOOST_PP_WHILE_119, s BOOST_PP_TUPLE_EAT_3)(p, o, o(119, s))\n# define BOOST_PP_WHILE_119(p, o, s) BOOST_PP_IF(p(120, s), BOOST_PP_WHILE_120, s BOOST_PP_TUPLE_EAT_3)(p, o, o(120, s))\n# define BOOST_PP_WHILE_120(p, o, s) BOOST_PP_IF(p(121, s), BOOST_PP_WHILE_121, s BOOST_PP_TUPLE_EAT_3)(p, o, o(121, s))\n# define BOOST_PP_WHILE_121(p, o, s) BOOST_PP_IF(p(122, s), BOOST_PP_WHILE_122, s BOOST_PP_TUPLE_EAT_3)(p, o, o(122, s))\n# define BOOST_PP_WHILE_122(p, o, s) BOOST_PP_IF(p(123, s), BOOST_PP_WHILE_123, s BOOST_PP_TUPLE_EAT_3)(p, o, o(123, s))\n# define BOOST_PP_WHILE_123(p, o, s) BOOST_PP_IF(p(124, s), BOOST_PP_WHILE_124, s BOOST_PP_TUPLE_EAT_3)(p, o, o(124, s))\n# define BOOST_PP_WHILE_124(p, o, s) BOOST_PP_IF(p(125, s), BOOST_PP_WHILE_125, s BOOST_PP_TUPLE_EAT_3)(p, o, o(125, s))\n# define BOOST_PP_WHILE_125(p, o, s) BOOST_PP_IF(p(126, s), BOOST_PP_WHILE_126, s BOOST_PP_TUPLE_EAT_3)(p, o, o(126, s))\n# define BOOST_PP_WHILE_126(p, o, s) BOOST_PP_IF(p(127, s), BOOST_PP_WHILE_127, s BOOST_PP_TUPLE_EAT_3)(p, o, o(127, s))\n# define BOOST_PP_WHILE_127(p, o, s) BOOST_PP_IF(p(128, s), BOOST_PP_WHILE_128, s BOOST_PP_TUPLE_EAT_3)(p, o, o(128, s))\n# define BOOST_PP_WHILE_128(p, o, s) BOOST_PP_IF(p(129, s), BOOST_PP_WHILE_129, s BOOST_PP_TUPLE_EAT_3)(p, o, o(129, s))\n# define BOOST_PP_WHILE_129(p, o, s) BOOST_PP_IF(p(130, s), BOOST_PP_WHILE_130, s BOOST_PP_TUPLE_EAT_3)(p, o, o(130, s))\n# define BOOST_PP_WHILE_130(p, o, s) BOOST_PP_IF(p(131, s), BOOST_PP_WHILE_131, s BOOST_PP_TUPLE_EAT_3)(p, o, o(131, s))\n# define BOOST_PP_WHILE_131(p, o, s) BOOST_PP_IF(p(132, s), BOOST_PP_WHILE_132, s BOOST_PP_TUPLE_EAT_3)(p, o, o(132, s))\n# define BOOST_PP_WHILE_132(p, o, s) BOOST_PP_IF(p(133, s), BOOST_PP_WHILE_133, s BOOST_PP_TUPLE_EAT_3)(p, o, o(133, s))\n# define BOOST_PP_WHILE_133(p, o, s) BOOST_PP_IF(p(134, s), BOOST_PP_WHILE_134, s BOOST_PP_TUPLE_EAT_3)(p, o, o(134, s))\n# define BOOST_PP_WHILE_134(p, o, s) BOOST_PP_IF(p(135, s), BOOST_PP_WHILE_135, s BOOST_PP_TUPLE_EAT_3)(p, o, o(135, s))\n# define BOOST_PP_WHILE_135(p, o, s) BOOST_PP_IF(p(136, s), BOOST_PP_WHILE_136, s BOOST_PP_TUPLE_EAT_3)(p, o, o(136, s))\n# define BOOST_PP_WHILE_136(p, o, s) BOOST_PP_IF(p(137, s), BOOST_PP_WHILE_137, s BOOST_PP_TUPLE_EAT_3)(p, o, o(137, s))\n# define BOOST_PP_WHILE_137(p, o, s) BOOST_PP_IF(p(138, s), BOOST_PP_WHILE_138, s BOOST_PP_TUPLE_EAT_3)(p, o, o(138, s))\n# define BOOST_PP_WHILE_138(p, o, s) BOOST_PP_IF(p(139, s), BOOST_PP_WHILE_139, s BOOST_PP_TUPLE_EAT_3)(p, o, o(139, s))\n# define BOOST_PP_WHILE_139(p, o, s) BOOST_PP_IF(p(140, s), BOOST_PP_WHILE_140, s BOOST_PP_TUPLE_EAT_3)(p, o, o(140, s))\n# define BOOST_PP_WHILE_140(p, o, s) BOOST_PP_IF(p(141, s), BOOST_PP_WHILE_141, s BOOST_PP_TUPLE_EAT_3)(p, o, o(141, s))\n# define BOOST_PP_WHILE_141(p, o, s) BOOST_PP_IF(p(142, s), BOOST_PP_WHILE_142, s BOOST_PP_TUPLE_EAT_3)(p, o, o(142, s))\n# define BOOST_PP_WHILE_142(p, o, s) BOOST_PP_IF(p(143, s), BOOST_PP_WHILE_143, s BOOST_PP_TUPLE_EAT_3)(p, o, o(143, s))\n# define BOOST_PP_WHILE_143(p, o, s) BOOST_PP_IF(p(144, s), BOOST_PP_WHILE_144, s BOOST_PP_TUPLE_EAT_3)(p, o, o(144, s))\n# define BOOST_PP_WHILE_144(p, o, s) BOOST_PP_IF(p(145, s), BOOST_PP_WHILE_145, s BOOST_PP_TUPLE_EAT_3)(p, o, o(145, s))\n# define BOOST_PP_WHILE_145(p, o, s) BOOST_PP_IF(p(146, s), BOOST_PP_WHILE_146, s BOOST_PP_TUPLE_EAT_3)(p, o, o(146, s))\n# define BOOST_PP_WHILE_146(p, o, s) BOOST_PP_IF(p(147, s), BOOST_PP_WHILE_147, s BOOST_PP_TUPLE_EAT_3)(p, o, o(147, s))\n# define BOOST_PP_WHILE_147(p, o, s) BOOST_PP_IF(p(148, s), BOOST_PP_WHILE_148, s BOOST_PP_TUPLE_EAT_3)(p, o, o(148, s))\n# define BOOST_PP_WHILE_148(p, o, s) BOOST_PP_IF(p(149, s), BOOST_PP_WHILE_149, s BOOST_PP_TUPLE_EAT_3)(p, o, o(149, s))\n# define BOOST_PP_WHILE_149(p, o, s) BOOST_PP_IF(p(150, s), BOOST_PP_WHILE_150, s BOOST_PP_TUPLE_EAT_3)(p, o, o(150, s))\n# define BOOST_PP_WHILE_150(p, o, s) BOOST_PP_IF(p(151, s), BOOST_PP_WHILE_151, s BOOST_PP_TUPLE_EAT_3)(p, o, o(151, s))\n# define BOOST_PP_WHILE_151(p, o, s) BOOST_PP_IF(p(152, s), BOOST_PP_WHILE_152, s BOOST_PP_TUPLE_EAT_3)(p, o, o(152, s))\n# define BOOST_PP_WHILE_152(p, o, s) BOOST_PP_IF(p(153, s), BOOST_PP_WHILE_153, s BOOST_PP_TUPLE_EAT_3)(p, o, o(153, s))\n# define BOOST_PP_WHILE_153(p, o, s) BOOST_PP_IF(p(154, s), BOOST_PP_WHILE_154, s BOOST_PP_TUPLE_EAT_3)(p, o, o(154, s))\n# define BOOST_PP_WHILE_154(p, o, s) BOOST_PP_IF(p(155, s), BOOST_PP_WHILE_155, s BOOST_PP_TUPLE_EAT_3)(p, o, o(155, s))\n# define BOOST_PP_WHILE_155(p, o, s) BOOST_PP_IF(p(156, s), BOOST_PP_WHILE_156, s BOOST_PP_TUPLE_EAT_3)(p, o, o(156, s))\n# define BOOST_PP_WHILE_156(p, o, s) BOOST_PP_IF(p(157, s), BOOST_PP_WHILE_157, s BOOST_PP_TUPLE_EAT_3)(p, o, o(157, s))\n# define BOOST_PP_WHILE_157(p, o, s) BOOST_PP_IF(p(158, s), BOOST_PP_WHILE_158, s BOOST_PP_TUPLE_EAT_3)(p, o, o(158, s))\n# define BOOST_PP_WHILE_158(p, o, s) BOOST_PP_IF(p(159, s), BOOST_PP_WHILE_159, s BOOST_PP_TUPLE_EAT_3)(p, o, o(159, s))\n# define BOOST_PP_WHILE_159(p, o, s) BOOST_PP_IF(p(160, s), BOOST_PP_WHILE_160, s BOOST_PP_TUPLE_EAT_3)(p, o, o(160, s))\n# define BOOST_PP_WHILE_160(p, o, s) BOOST_PP_IF(p(161, s), BOOST_PP_WHILE_161, s BOOST_PP_TUPLE_EAT_3)(p, o, o(161, s))\n# define BOOST_PP_WHILE_161(p, o, s) BOOST_PP_IF(p(162, s), BOOST_PP_WHILE_162, s BOOST_PP_TUPLE_EAT_3)(p, o, o(162, s))\n# define BOOST_PP_WHILE_162(p, o, s) BOOST_PP_IF(p(163, s), BOOST_PP_WHILE_163, s BOOST_PP_TUPLE_EAT_3)(p, o, o(163, s))\n# define BOOST_PP_WHILE_163(p, o, s) BOOST_PP_IF(p(164, s), BOOST_PP_WHILE_164, s BOOST_PP_TUPLE_EAT_3)(p, o, o(164, s))\n# define BOOST_PP_WHILE_164(p, o, s) BOOST_PP_IF(p(165, s), BOOST_PP_WHILE_165, s BOOST_PP_TUPLE_EAT_3)(p, o, o(165, s))\n# define BOOST_PP_WHILE_165(p, o, s) BOOST_PP_IF(p(166, s), BOOST_PP_WHILE_166, s BOOST_PP_TUPLE_EAT_3)(p, o, o(166, s))\n# define BOOST_PP_WHILE_166(p, o, s) BOOST_PP_IF(p(167, s), BOOST_PP_WHILE_167, s BOOST_PP_TUPLE_EAT_3)(p, o, o(167, s))\n# define BOOST_PP_WHILE_167(p, o, s) BOOST_PP_IF(p(168, s), BOOST_PP_WHILE_168, s BOOST_PP_TUPLE_EAT_3)(p, o, o(168, s))\n# define BOOST_PP_WHILE_168(p, o, s) BOOST_PP_IF(p(169, s), BOOST_PP_WHILE_169, s BOOST_PP_TUPLE_EAT_3)(p, o, o(169, s))\n# define BOOST_PP_WHILE_169(p, o, s) BOOST_PP_IF(p(170, s), BOOST_PP_WHILE_170, s BOOST_PP_TUPLE_EAT_3)(p, o, o(170, s))\n# define BOOST_PP_WHILE_170(p, o, s) BOOST_PP_IF(p(171, s), BOOST_PP_WHILE_171, s BOOST_PP_TUPLE_EAT_3)(p, o, o(171, s))\n# define BOOST_PP_WHILE_171(p, o, s) BOOST_PP_IF(p(172, s), BOOST_PP_WHILE_172, s BOOST_PP_TUPLE_EAT_3)(p, o, o(172, s))\n# define BOOST_PP_WHILE_172(p, o, s) BOOST_PP_IF(p(173, s), BOOST_PP_WHILE_173, s BOOST_PP_TUPLE_EAT_3)(p, o, o(173, s))\n# define BOOST_PP_WHILE_173(p, o, s) BOOST_PP_IF(p(174, s), BOOST_PP_WHILE_174, s BOOST_PP_TUPLE_EAT_3)(p, o, o(174, s))\n# define BOOST_PP_WHILE_174(p, o, s) BOOST_PP_IF(p(175, s), BOOST_PP_WHILE_175, s BOOST_PP_TUPLE_EAT_3)(p, o, o(175, s))\n# define BOOST_PP_WHILE_175(p, o, s) BOOST_PP_IF(p(176, s), BOOST_PP_WHILE_176, s BOOST_PP_TUPLE_EAT_3)(p, o, o(176, s))\n# define BOOST_PP_WHILE_176(p, o, s) BOOST_PP_IF(p(177, s), BOOST_PP_WHILE_177, s BOOST_PP_TUPLE_EAT_3)(p, o, o(177, s))\n# define BOOST_PP_WHILE_177(p, o, s) BOOST_PP_IF(p(178, s), BOOST_PP_WHILE_178, s BOOST_PP_TUPLE_EAT_3)(p, o, o(178, s))\n# define BOOST_PP_WHILE_178(p, o, s) BOOST_PP_IF(p(179, s), BOOST_PP_WHILE_179, s BOOST_PP_TUPLE_EAT_3)(p, o, o(179, s))\n# define BOOST_PP_WHILE_179(p, o, s) BOOST_PP_IF(p(180, s), BOOST_PP_WHILE_180, s BOOST_PP_TUPLE_EAT_3)(p, o, o(180, s))\n# define BOOST_PP_WHILE_180(p, o, s) BOOST_PP_IF(p(181, s), BOOST_PP_WHILE_181, s BOOST_PP_TUPLE_EAT_3)(p, o, o(181, s))\n# define BOOST_PP_WHILE_181(p, o, s) BOOST_PP_IF(p(182, s), BOOST_PP_WHILE_182, s BOOST_PP_TUPLE_EAT_3)(p, o, o(182, s))\n# define BOOST_PP_WHILE_182(p, o, s) BOOST_PP_IF(p(183, s), BOOST_PP_WHILE_183, s BOOST_PP_TUPLE_EAT_3)(p, o, o(183, s))\n# define BOOST_PP_WHILE_183(p, o, s) BOOST_PP_IF(p(184, s), BOOST_PP_WHILE_184, s BOOST_PP_TUPLE_EAT_3)(p, o, o(184, s))\n# define BOOST_PP_WHILE_184(p, o, s) BOOST_PP_IF(p(185, s), BOOST_PP_WHILE_185, s BOOST_PP_TUPLE_EAT_3)(p, o, o(185, s))\n# define BOOST_PP_WHILE_185(p, o, s) BOOST_PP_IF(p(186, s), BOOST_PP_WHILE_186, s BOOST_PP_TUPLE_EAT_3)(p, o, o(186, s))\n# define BOOST_PP_WHILE_186(p, o, s) BOOST_PP_IF(p(187, s), BOOST_PP_WHILE_187, s BOOST_PP_TUPLE_EAT_3)(p, o, o(187, s))\n# define BOOST_PP_WHILE_187(p, o, s) BOOST_PP_IF(p(188, s), BOOST_PP_WHILE_188, s BOOST_PP_TUPLE_EAT_3)(p, o, o(188, s))\n# define BOOST_PP_WHILE_188(p, o, s) BOOST_PP_IF(p(189, s), BOOST_PP_WHILE_189, s BOOST_PP_TUPLE_EAT_3)(p, o, o(189, s))\n# define BOOST_PP_WHILE_189(p, o, s) BOOST_PP_IF(p(190, s), BOOST_PP_WHILE_190, s BOOST_PP_TUPLE_EAT_3)(p, o, o(190, s))\n# define BOOST_PP_WHILE_190(p, o, s) BOOST_PP_IF(p(191, s), BOOST_PP_WHILE_191, s BOOST_PP_TUPLE_EAT_3)(p, o, o(191, s))\n# define BOOST_PP_WHILE_191(p, o, s) BOOST_PP_IF(p(192, s), BOOST_PP_WHILE_192, s BOOST_PP_TUPLE_EAT_3)(p, o, o(192, s))\n# define BOOST_PP_WHILE_192(p, o, s) BOOST_PP_IF(p(193, s), BOOST_PP_WHILE_193, s BOOST_PP_TUPLE_EAT_3)(p, o, o(193, s))\n# define BOOST_PP_WHILE_193(p, o, s) BOOST_PP_IF(p(194, s), BOOST_PP_WHILE_194, s BOOST_PP_TUPLE_EAT_3)(p, o, o(194, s))\n# define BOOST_PP_WHILE_194(p, o, s) BOOST_PP_IF(p(195, s), BOOST_PP_WHILE_195, s BOOST_PP_TUPLE_EAT_3)(p, o, o(195, s))\n# define BOOST_PP_WHILE_195(p, o, s) BOOST_PP_IF(p(196, s), BOOST_PP_WHILE_196, s BOOST_PP_TUPLE_EAT_3)(p, o, o(196, s))\n# define BOOST_PP_WHILE_196(p, o, s) BOOST_PP_IF(p(197, s), BOOST_PP_WHILE_197, s BOOST_PP_TUPLE_EAT_3)(p, o, o(197, s))\n# define BOOST_PP_WHILE_197(p, o, s) BOOST_PP_IF(p(198, s), BOOST_PP_WHILE_198, s BOOST_PP_TUPLE_EAT_3)(p, o, o(198, s))\n# define BOOST_PP_WHILE_198(p, o, s) BOOST_PP_IF(p(199, s), BOOST_PP_WHILE_199, s BOOST_PP_TUPLE_EAT_3)(p, o, o(199, s))\n# define BOOST_PP_WHILE_199(p, o, s) BOOST_PP_IF(p(200, s), BOOST_PP_WHILE_200, s BOOST_PP_TUPLE_EAT_3)(p, o, o(200, s))\n# define BOOST_PP_WHILE_200(p, o, s) BOOST_PP_IF(p(201, s), BOOST_PP_WHILE_201, s BOOST_PP_TUPLE_EAT_3)(p, o, o(201, s))\n# define BOOST_PP_WHILE_201(p, o, s) BOOST_PP_IF(p(202, s), BOOST_PP_WHILE_202, s BOOST_PP_TUPLE_EAT_3)(p, o, o(202, s))\n# define BOOST_PP_WHILE_202(p, o, s) BOOST_PP_IF(p(203, s), BOOST_PP_WHILE_203, s BOOST_PP_TUPLE_EAT_3)(p, o, o(203, s))\n# define BOOST_PP_WHILE_203(p, o, s) BOOST_PP_IF(p(204, s), BOOST_PP_WHILE_204, s BOOST_PP_TUPLE_EAT_3)(p, o, o(204, s))\n# define BOOST_PP_WHILE_204(p, o, s) BOOST_PP_IF(p(205, s), BOOST_PP_WHILE_205, s BOOST_PP_TUPLE_EAT_3)(p, o, o(205, s))\n# define BOOST_PP_WHILE_205(p, o, s) BOOST_PP_IF(p(206, s), BOOST_PP_WHILE_206, s BOOST_PP_TUPLE_EAT_3)(p, o, o(206, s))\n# define BOOST_PP_WHILE_206(p, o, s) BOOST_PP_IF(p(207, s), BOOST_PP_WHILE_207, s BOOST_PP_TUPLE_EAT_3)(p, o, o(207, s))\n# define BOOST_PP_WHILE_207(p, o, s) BOOST_PP_IF(p(208, s), BOOST_PP_WHILE_208, s BOOST_PP_TUPLE_EAT_3)(p, o, o(208, s))\n# define BOOST_PP_WHILE_208(p, o, s) BOOST_PP_IF(p(209, s), BOOST_PP_WHILE_209, s BOOST_PP_TUPLE_EAT_3)(p, o, o(209, s))\n# define BOOST_PP_WHILE_209(p, o, s) BOOST_PP_IF(p(210, s), BOOST_PP_WHILE_210, s BOOST_PP_TUPLE_EAT_3)(p, o, o(210, s))\n# define BOOST_PP_WHILE_210(p, o, s) BOOST_PP_IF(p(211, s), BOOST_PP_WHILE_211, s BOOST_PP_TUPLE_EAT_3)(p, o, o(211, s))\n# define BOOST_PP_WHILE_211(p, o, s) BOOST_PP_IF(p(212, s), BOOST_PP_WHILE_212, s BOOST_PP_TUPLE_EAT_3)(p, o, o(212, s))\n# define BOOST_PP_WHILE_212(p, o, s) BOOST_PP_IF(p(213, s), BOOST_PP_WHILE_213, s BOOST_PP_TUPLE_EAT_3)(p, o, o(213, s))\n# define BOOST_PP_WHILE_213(p, o, s) BOOST_PP_IF(p(214, s), BOOST_PP_WHILE_214, s BOOST_PP_TUPLE_EAT_3)(p, o, o(214, s))\n# define BOOST_PP_WHILE_214(p, o, s) BOOST_PP_IF(p(215, s), BOOST_PP_WHILE_215, s BOOST_PP_TUPLE_EAT_3)(p, o, o(215, s))\n# define BOOST_PP_WHILE_215(p, o, s) BOOST_PP_IF(p(216, s), BOOST_PP_WHILE_216, s BOOST_PP_TUPLE_EAT_3)(p, o, o(216, s))\n# define BOOST_PP_WHILE_216(p, o, s) BOOST_PP_IF(p(217, s), BOOST_PP_WHILE_217, s BOOST_PP_TUPLE_EAT_3)(p, o, o(217, s))\n# define BOOST_PP_WHILE_217(p, o, s) BOOST_PP_IF(p(218, s), BOOST_PP_WHILE_218, s BOOST_PP_TUPLE_EAT_3)(p, o, o(218, s))\n# define BOOST_PP_WHILE_218(p, o, s) BOOST_PP_IF(p(219, s), BOOST_PP_WHILE_219, s BOOST_PP_TUPLE_EAT_3)(p, o, o(219, s))\n# define BOOST_PP_WHILE_219(p, o, s) BOOST_PP_IF(p(220, s), BOOST_PP_WHILE_220, s BOOST_PP_TUPLE_EAT_3)(p, o, o(220, s))\n# define BOOST_PP_WHILE_220(p, o, s) BOOST_PP_IF(p(221, s), BOOST_PP_WHILE_221, s BOOST_PP_TUPLE_EAT_3)(p, o, o(221, s))\n# define BOOST_PP_WHILE_221(p, o, s) BOOST_PP_IF(p(222, s), BOOST_PP_WHILE_222, s BOOST_PP_TUPLE_EAT_3)(p, o, o(222, s))\n# define BOOST_PP_WHILE_222(p, o, s) BOOST_PP_IF(p(223, s), BOOST_PP_WHILE_223, s BOOST_PP_TUPLE_EAT_3)(p, o, o(223, s))\n# define BOOST_PP_WHILE_223(p, o, s) BOOST_PP_IF(p(224, s), BOOST_PP_WHILE_224, s BOOST_PP_TUPLE_EAT_3)(p, o, o(224, s))\n# define BOOST_PP_WHILE_224(p, o, s) BOOST_PP_IF(p(225, s), BOOST_PP_WHILE_225, s BOOST_PP_TUPLE_EAT_3)(p, o, o(225, s))\n# define BOOST_PP_WHILE_225(p, o, s) BOOST_PP_IF(p(226, s), BOOST_PP_WHILE_226, s BOOST_PP_TUPLE_EAT_3)(p, o, o(226, s))\n# define BOOST_PP_WHILE_226(p, o, s) BOOST_PP_IF(p(227, s), BOOST_PP_WHILE_227, s BOOST_PP_TUPLE_EAT_3)(p, o, o(227, s))\n# define BOOST_PP_WHILE_227(p, o, s) BOOST_PP_IF(p(228, s), BOOST_PP_WHILE_228, s BOOST_PP_TUPLE_EAT_3)(p, o, o(228, s))\n# define BOOST_PP_WHILE_228(p, o, s) BOOST_PP_IF(p(229, s), BOOST_PP_WHILE_229, s BOOST_PP_TUPLE_EAT_3)(p, o, o(229, s))\n# define BOOST_PP_WHILE_229(p, o, s) BOOST_PP_IF(p(230, s), BOOST_PP_WHILE_230, s BOOST_PP_TUPLE_EAT_3)(p, o, o(230, s))\n# define BOOST_PP_WHILE_230(p, o, s) BOOST_PP_IF(p(231, s), BOOST_PP_WHILE_231, s BOOST_PP_TUPLE_EAT_3)(p, o, o(231, s))\n# define BOOST_PP_WHILE_231(p, o, s) BOOST_PP_IF(p(232, s), BOOST_PP_WHILE_232, s BOOST_PP_TUPLE_EAT_3)(p, o, o(232, s))\n# define BOOST_PP_WHILE_232(p, o, s) BOOST_PP_IF(p(233, s), BOOST_PP_WHILE_233, s BOOST_PP_TUPLE_EAT_3)(p, o, o(233, s))\n# define BOOST_PP_WHILE_233(p, o, s) BOOST_PP_IF(p(234, s), BOOST_PP_WHILE_234, s BOOST_PP_TUPLE_EAT_3)(p, o, o(234, s))\n# define BOOST_PP_WHILE_234(p, o, s) BOOST_PP_IF(p(235, s), BOOST_PP_WHILE_235, s BOOST_PP_TUPLE_EAT_3)(p, o, o(235, s))\n# define BOOST_PP_WHILE_235(p, o, s) BOOST_PP_IF(p(236, s), BOOST_PP_WHILE_236, s BOOST_PP_TUPLE_EAT_3)(p, o, o(236, s))\n# define BOOST_PP_WHILE_236(p, o, s) BOOST_PP_IF(p(237, s), BOOST_PP_WHILE_237, s BOOST_PP_TUPLE_EAT_3)(p, o, o(237, s))\n# define BOOST_PP_WHILE_237(p, o, s) BOOST_PP_IF(p(238, s), BOOST_PP_WHILE_238, s BOOST_PP_TUPLE_EAT_3)(p, o, o(238, s))\n# define BOOST_PP_WHILE_238(p, o, s) BOOST_PP_IF(p(239, s), BOOST_PP_WHILE_239, s BOOST_PP_TUPLE_EAT_3)(p, o, o(239, s))\n# define BOOST_PP_WHILE_239(p, o, s) BOOST_PP_IF(p(240, s), BOOST_PP_WHILE_240, s BOOST_PP_TUPLE_EAT_3)(p, o, o(240, s))\n# define BOOST_PP_WHILE_240(p, o, s) BOOST_PP_IF(p(241, s), BOOST_PP_WHILE_241, s BOOST_PP_TUPLE_EAT_3)(p, o, o(241, s))\n# define BOOST_PP_WHILE_241(p, o, s) BOOST_PP_IF(p(242, s), BOOST_PP_WHILE_242, s BOOST_PP_TUPLE_EAT_3)(p, o, o(242, s))\n# define BOOST_PP_WHILE_242(p, o, s) BOOST_PP_IF(p(243, s), BOOST_PP_WHILE_243, s BOOST_PP_TUPLE_EAT_3)(p, o, o(243, s))\n# define BOOST_PP_WHILE_243(p, o, s) BOOST_PP_IF(p(244, s), BOOST_PP_WHILE_244, s BOOST_PP_TUPLE_EAT_3)(p, o, o(244, s))\n# define BOOST_PP_WHILE_244(p, o, s) BOOST_PP_IF(p(245, s), BOOST_PP_WHILE_245, s BOOST_PP_TUPLE_EAT_3)(p, o, o(245, s))\n# define BOOST_PP_WHILE_245(p, o, s) BOOST_PP_IF(p(246, s), BOOST_PP_WHILE_246, s BOOST_PP_TUPLE_EAT_3)(p, o, o(246, s))\n# define BOOST_PP_WHILE_246(p, o, s) BOOST_PP_IF(p(247, s), BOOST_PP_WHILE_247, s BOOST_PP_TUPLE_EAT_3)(p, o, o(247, s))\n# define BOOST_PP_WHILE_247(p, o, s) BOOST_PP_IF(p(248, s), BOOST_PP_WHILE_248, s BOOST_PP_TUPLE_EAT_3)(p, o, o(248, s))\n# define BOOST_PP_WHILE_248(p, o, s) BOOST_PP_IF(p(249, s), BOOST_PP_WHILE_249, s BOOST_PP_TUPLE_EAT_3)(p, o, o(249, s))\n# define BOOST_PP_WHILE_249(p, o, s) BOOST_PP_IF(p(250, s), BOOST_PP_WHILE_250, s BOOST_PP_TUPLE_EAT_3)(p, o, o(250, s))\n# define BOOST_PP_WHILE_250(p, o, s) BOOST_PP_IF(p(251, s), BOOST_PP_WHILE_251, s BOOST_PP_TUPLE_EAT_3)(p, o, o(251, s))\n# define BOOST_PP_WHILE_251(p, o, s) BOOST_PP_IF(p(252, s), BOOST_PP_WHILE_252, s BOOST_PP_TUPLE_EAT_3)(p, o, o(252, s))\n# define BOOST_PP_WHILE_252(p, o, s) BOOST_PP_IF(p(253, s), BOOST_PP_WHILE_253, s BOOST_PP_TUPLE_EAT_3)(p, o, o(253, s))\n# define BOOST_PP_WHILE_253(p, o, s) BOOST_PP_IF(p(254, s), BOOST_PP_WHILE_254, s BOOST_PP_TUPLE_EAT_3)(p, o, o(254, s))\n# define BOOST_PP_WHILE_254(p, o, s) BOOST_PP_IF(p(255, s), BOOST_PP_WHILE_255, s BOOST_PP_TUPLE_EAT_3)(p, o, o(255, s))\n# define BOOST_PP_WHILE_255(p, o, s) BOOST_PP_IF(p(256, s), BOOST_PP_WHILE_256, s BOOST_PP_TUPLE_EAT_3)(p, o, o(256, s))\n# define BOOST_PP_WHILE_256(p, o, s) BOOST_PP_IF(p(257, s), BOOST_PP_WHILE_257, s BOOST_PP_TUPLE_EAT_3)(p, o, o(257, s))\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/control/detail/while.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_CONTROL_DETAIL_WHILE_HPP\n# define BOOST_PREPROCESSOR_CONTROL_DETAIL_WHILE_HPP\n#\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/logical/bool.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n#\n# define BOOST_PP_WHILE_1(p, o, s) BOOST_PP_WHILE_1_C(BOOST_PP_BOOL(p(2, s)), p, o, s)\n# define BOOST_PP_WHILE_2(p, o, s) BOOST_PP_WHILE_2_C(BOOST_PP_BOOL(p(3, s)), p, o, s)\n# define BOOST_PP_WHILE_3(p, o, s) BOOST_PP_WHILE_3_C(BOOST_PP_BOOL(p(4, s)), p, o, s)\n# define BOOST_PP_WHILE_4(p, o, s) BOOST_PP_WHILE_4_C(BOOST_PP_BOOL(p(5, s)), p, o, s)\n# define BOOST_PP_WHILE_5(p, o, s) BOOST_PP_WHILE_5_C(BOOST_PP_BOOL(p(6, s)), p, o, s)\n# define BOOST_PP_WHILE_6(p, o, s) BOOST_PP_WHILE_6_C(BOOST_PP_BOOL(p(7, s)), p, o, s)\n# define BOOST_PP_WHILE_7(p, o, s) BOOST_PP_WHILE_7_C(BOOST_PP_BOOL(p(8, s)), p, o, s)\n# define BOOST_PP_WHILE_8(p, o, s) BOOST_PP_WHILE_8_C(BOOST_PP_BOOL(p(9, s)), p, o, s)\n# define BOOST_PP_WHILE_9(p, o, s) BOOST_PP_WHILE_9_C(BOOST_PP_BOOL(p(10, s)), p, o, s)\n# define BOOST_PP_WHILE_10(p, o, s) BOOST_PP_WHILE_10_C(BOOST_PP_BOOL(p(11, s)), p, o, s)\n# define BOOST_PP_WHILE_11(p, o, s) BOOST_PP_WHILE_11_C(BOOST_PP_BOOL(p(12, s)), p, o, s)\n# define BOOST_PP_WHILE_12(p, o, s) BOOST_PP_WHILE_12_C(BOOST_PP_BOOL(p(13, s)), p, o, s)\n# define BOOST_PP_WHILE_13(p, o, s) BOOST_PP_WHILE_13_C(BOOST_PP_BOOL(p(14, s)), p, o, s)\n# define BOOST_PP_WHILE_14(p, o, s) BOOST_PP_WHILE_14_C(BOOST_PP_BOOL(p(15, s)), p, o, s)\n# define BOOST_PP_WHILE_15(p, o, s) BOOST_PP_WHILE_15_C(BOOST_PP_BOOL(p(16, s)), p, o, s)\n# define BOOST_PP_WHILE_16(p, o, s) BOOST_PP_WHILE_16_C(BOOST_PP_BOOL(p(17, s)), p, o, s)\n# define BOOST_PP_WHILE_17(p, o, s) BOOST_PP_WHILE_17_C(BOOST_PP_BOOL(p(18, s)), p, o, s)\n# define BOOST_PP_WHILE_18(p, o, s) BOOST_PP_WHILE_18_C(BOOST_PP_BOOL(p(19, s)), p, o, s)\n# define BOOST_PP_WHILE_19(p, o, s) BOOST_PP_WHILE_19_C(BOOST_PP_BOOL(p(20, s)), p, o, s)\n# define BOOST_PP_WHILE_20(p, o, s) BOOST_PP_WHILE_20_C(BOOST_PP_BOOL(p(21, s)), p, o, s)\n# define BOOST_PP_WHILE_21(p, o, s) BOOST_PP_WHILE_21_C(BOOST_PP_BOOL(p(22, s)), p, o, s)\n# define BOOST_PP_WHILE_22(p, o, s) BOOST_PP_WHILE_22_C(BOOST_PP_BOOL(p(23, s)), p, o, s)\n# define BOOST_PP_WHILE_23(p, o, s) BOOST_PP_WHILE_23_C(BOOST_PP_BOOL(p(24, s)), p, o, s)\n# define BOOST_PP_WHILE_24(p, o, s) BOOST_PP_WHILE_24_C(BOOST_PP_BOOL(p(25, s)), p, o, s)\n# define BOOST_PP_WHILE_25(p, o, s) BOOST_PP_WHILE_25_C(BOOST_PP_BOOL(p(26, s)), p, o, s)\n# define BOOST_PP_WHILE_26(p, o, s) BOOST_PP_WHILE_26_C(BOOST_PP_BOOL(p(27, s)), p, o, s)\n# define BOOST_PP_WHILE_27(p, o, s) BOOST_PP_WHILE_27_C(BOOST_PP_BOOL(p(28, s)), p, o, s)\n# define BOOST_PP_WHILE_28(p, o, s) BOOST_PP_WHILE_28_C(BOOST_PP_BOOL(p(29, s)), p, o, s)\n# define BOOST_PP_WHILE_29(p, o, s) BOOST_PP_WHILE_29_C(BOOST_PP_BOOL(p(30, s)), p, o, s)\n# define BOOST_PP_WHILE_30(p, o, s) BOOST_PP_WHILE_30_C(BOOST_PP_BOOL(p(31, s)), p, o, s)\n# define BOOST_PP_WHILE_31(p, o, s) BOOST_PP_WHILE_31_C(BOOST_PP_BOOL(p(32, s)), p, o, s)\n# define BOOST_PP_WHILE_32(p, o, s) BOOST_PP_WHILE_32_C(BOOST_PP_BOOL(p(33, s)), p, o, s)\n# define BOOST_PP_WHILE_33(p, o, s) BOOST_PP_WHILE_33_C(BOOST_PP_BOOL(p(34, s)), p, o, s)\n# define BOOST_PP_WHILE_34(p, o, s) BOOST_PP_WHILE_34_C(BOOST_PP_BOOL(p(35, s)), p, o, s)\n# define BOOST_PP_WHILE_35(p, o, s) BOOST_PP_WHILE_35_C(BOOST_PP_BOOL(p(36, s)), p, o, s)\n# define BOOST_PP_WHILE_36(p, o, s) BOOST_PP_WHILE_36_C(BOOST_PP_BOOL(p(37, s)), p, o, s)\n# define BOOST_PP_WHILE_37(p, o, s) BOOST_PP_WHILE_37_C(BOOST_PP_BOOL(p(38, s)), p, o, s)\n# define BOOST_PP_WHILE_38(p, o, s) BOOST_PP_WHILE_38_C(BOOST_PP_BOOL(p(39, s)), p, o, s)\n# define BOOST_PP_WHILE_39(p, o, s) BOOST_PP_WHILE_39_C(BOOST_PP_BOOL(p(40, s)), p, o, s)\n# define BOOST_PP_WHILE_40(p, o, s) BOOST_PP_WHILE_40_C(BOOST_PP_BOOL(p(41, s)), p, o, s)\n# define BOOST_PP_WHILE_41(p, o, s) BOOST_PP_WHILE_41_C(BOOST_PP_BOOL(p(42, s)), p, o, s)\n# define BOOST_PP_WHILE_42(p, o, s) BOOST_PP_WHILE_42_C(BOOST_PP_BOOL(p(43, s)), p, o, s)\n# define BOOST_PP_WHILE_43(p, o, s) BOOST_PP_WHILE_43_C(BOOST_PP_BOOL(p(44, s)), p, o, s)\n# define BOOST_PP_WHILE_44(p, o, s) BOOST_PP_WHILE_44_C(BOOST_PP_BOOL(p(45, s)), p, o, s)\n# define BOOST_PP_WHILE_45(p, o, s) BOOST_PP_WHILE_45_C(BOOST_PP_BOOL(p(46, s)), p, o, s)\n# define BOOST_PP_WHILE_46(p, o, s) BOOST_PP_WHILE_46_C(BOOST_PP_BOOL(p(47, s)), p, o, s)\n# define BOOST_PP_WHILE_47(p, o, s) BOOST_PP_WHILE_47_C(BOOST_PP_BOOL(p(48, s)), p, o, s)\n# define BOOST_PP_WHILE_48(p, o, s) BOOST_PP_WHILE_48_C(BOOST_PP_BOOL(p(49, s)), p, o, s)\n# define BOOST_PP_WHILE_49(p, o, s) BOOST_PP_WHILE_49_C(BOOST_PP_BOOL(p(50, s)), p, o, s)\n# define BOOST_PP_WHILE_50(p, o, s) BOOST_PP_WHILE_50_C(BOOST_PP_BOOL(p(51, s)), p, o, s)\n# define BOOST_PP_WHILE_51(p, o, s) BOOST_PP_WHILE_51_C(BOOST_PP_BOOL(p(52, s)), p, o, s)\n# define BOOST_PP_WHILE_52(p, o, s) BOOST_PP_WHILE_52_C(BOOST_PP_BOOL(p(53, s)), p, o, s)\n# define BOOST_PP_WHILE_53(p, o, s) BOOST_PP_WHILE_53_C(BOOST_PP_BOOL(p(54, s)), p, o, s)\n# define BOOST_PP_WHILE_54(p, o, s) BOOST_PP_WHILE_54_C(BOOST_PP_BOOL(p(55, s)), p, o, s)\n# define BOOST_PP_WHILE_55(p, o, s) BOOST_PP_WHILE_55_C(BOOST_PP_BOOL(p(56, s)), p, o, s)\n# define BOOST_PP_WHILE_56(p, o, s) BOOST_PP_WHILE_56_C(BOOST_PP_BOOL(p(57, s)), p, o, s)\n# define BOOST_PP_WHILE_57(p, o, s) BOOST_PP_WHILE_57_C(BOOST_PP_BOOL(p(58, s)), p, o, s)\n# define BOOST_PP_WHILE_58(p, o, s) BOOST_PP_WHILE_58_C(BOOST_PP_BOOL(p(59, s)), p, o, s)\n# define BOOST_PP_WHILE_59(p, o, s) BOOST_PP_WHILE_59_C(BOOST_PP_BOOL(p(60, s)), p, o, s)\n# define BOOST_PP_WHILE_60(p, o, s) BOOST_PP_WHILE_60_C(BOOST_PP_BOOL(p(61, s)), p, o, s)\n# define BOOST_PP_WHILE_61(p, o, s) BOOST_PP_WHILE_61_C(BOOST_PP_BOOL(p(62, s)), p, o, s)\n# define BOOST_PP_WHILE_62(p, o, s) BOOST_PP_WHILE_62_C(BOOST_PP_BOOL(p(63, s)), p, o, s)\n# define BOOST_PP_WHILE_63(p, o, s) BOOST_PP_WHILE_63_C(BOOST_PP_BOOL(p(64, s)), p, o, s)\n# define BOOST_PP_WHILE_64(p, o, s) BOOST_PP_WHILE_64_C(BOOST_PP_BOOL(p(65, s)), p, o, s)\n# define BOOST_PP_WHILE_65(p, o, s) BOOST_PP_WHILE_65_C(BOOST_PP_BOOL(p(66, s)), p, o, s)\n# define BOOST_PP_WHILE_66(p, o, s) BOOST_PP_WHILE_66_C(BOOST_PP_BOOL(p(67, s)), p, o, s)\n# define BOOST_PP_WHILE_67(p, o, s) BOOST_PP_WHILE_67_C(BOOST_PP_BOOL(p(68, s)), p, o, s)\n# define BOOST_PP_WHILE_68(p, o, s) BOOST_PP_WHILE_68_C(BOOST_PP_BOOL(p(69, s)), p, o, s)\n# define BOOST_PP_WHILE_69(p, o, s) BOOST_PP_WHILE_69_C(BOOST_PP_BOOL(p(70, s)), p, o, s)\n# define BOOST_PP_WHILE_70(p, o, s) BOOST_PP_WHILE_70_C(BOOST_PP_BOOL(p(71, s)), p, o, s)\n# define BOOST_PP_WHILE_71(p, o, s) BOOST_PP_WHILE_71_C(BOOST_PP_BOOL(p(72, s)), p, o, s)\n# define BOOST_PP_WHILE_72(p, o, s) BOOST_PP_WHILE_72_C(BOOST_PP_BOOL(p(73, s)), p, o, s)\n# define BOOST_PP_WHILE_73(p, o, s) BOOST_PP_WHILE_73_C(BOOST_PP_BOOL(p(74, s)), p, o, s)\n# define BOOST_PP_WHILE_74(p, o, s) BOOST_PP_WHILE_74_C(BOOST_PP_BOOL(p(75, s)), p, o, s)\n# define BOOST_PP_WHILE_75(p, o, s) BOOST_PP_WHILE_75_C(BOOST_PP_BOOL(p(76, s)), p, o, s)\n# define BOOST_PP_WHILE_76(p, o, s) BOOST_PP_WHILE_76_C(BOOST_PP_BOOL(p(77, s)), p, o, s)\n# define BOOST_PP_WHILE_77(p, o, s) BOOST_PP_WHILE_77_C(BOOST_PP_BOOL(p(78, s)), p, o, s)\n# define BOOST_PP_WHILE_78(p, o, s) BOOST_PP_WHILE_78_C(BOOST_PP_BOOL(p(79, s)), p, o, s)\n# define BOOST_PP_WHILE_79(p, o, s) BOOST_PP_WHILE_79_C(BOOST_PP_BOOL(p(80, s)), p, o, s)\n# define BOOST_PP_WHILE_80(p, o, s) BOOST_PP_WHILE_80_C(BOOST_PP_BOOL(p(81, s)), p, o, s)\n# define BOOST_PP_WHILE_81(p, o, s) BOOST_PP_WHILE_81_C(BOOST_PP_BOOL(p(82, s)), p, o, s)\n# define BOOST_PP_WHILE_82(p, o, s) BOOST_PP_WHILE_82_C(BOOST_PP_BOOL(p(83, s)), p, o, s)\n# define BOOST_PP_WHILE_83(p, o, s) BOOST_PP_WHILE_83_C(BOOST_PP_BOOL(p(84, s)), p, o, s)\n# define BOOST_PP_WHILE_84(p, o, s) BOOST_PP_WHILE_84_C(BOOST_PP_BOOL(p(85, s)), p, o, s)\n# define BOOST_PP_WHILE_85(p, o, s) BOOST_PP_WHILE_85_C(BOOST_PP_BOOL(p(86, s)), p, o, s)\n# define BOOST_PP_WHILE_86(p, o, s) BOOST_PP_WHILE_86_C(BOOST_PP_BOOL(p(87, s)), p, o, s)\n# define BOOST_PP_WHILE_87(p, o, s) BOOST_PP_WHILE_87_C(BOOST_PP_BOOL(p(88, s)), p, o, s)\n# define BOOST_PP_WHILE_88(p, o, s) BOOST_PP_WHILE_88_C(BOOST_PP_BOOL(p(89, s)), p, o, s)\n# define BOOST_PP_WHILE_89(p, o, s) BOOST_PP_WHILE_89_C(BOOST_PP_BOOL(p(90, s)), p, o, s)\n# define BOOST_PP_WHILE_90(p, o, s) BOOST_PP_WHILE_90_C(BOOST_PP_BOOL(p(91, s)), p, o, s)\n# define BOOST_PP_WHILE_91(p, o, s) BOOST_PP_WHILE_91_C(BOOST_PP_BOOL(p(92, s)), p, o, s)\n# define BOOST_PP_WHILE_92(p, o, s) BOOST_PP_WHILE_92_C(BOOST_PP_BOOL(p(93, s)), p, o, s)\n# define BOOST_PP_WHILE_93(p, o, s) BOOST_PP_WHILE_93_C(BOOST_PP_BOOL(p(94, s)), p, o, s)\n# define BOOST_PP_WHILE_94(p, o, s) BOOST_PP_WHILE_94_C(BOOST_PP_BOOL(p(95, s)), p, o, s)\n# define BOOST_PP_WHILE_95(p, o, s) BOOST_PP_WHILE_95_C(BOOST_PP_BOOL(p(96, s)), p, o, s)\n# define BOOST_PP_WHILE_96(p, o, s) BOOST_PP_WHILE_96_C(BOOST_PP_BOOL(p(97, s)), p, o, s)\n# define BOOST_PP_WHILE_97(p, o, s) BOOST_PP_WHILE_97_C(BOOST_PP_BOOL(p(98, s)), p, o, s)\n# define BOOST_PP_WHILE_98(p, o, s) BOOST_PP_WHILE_98_C(BOOST_PP_BOOL(p(99, s)), p, o, s)\n# define BOOST_PP_WHILE_99(p, o, s) BOOST_PP_WHILE_99_C(BOOST_PP_BOOL(p(100, s)), p, o, s)\n# define BOOST_PP_WHILE_100(p, o, s) BOOST_PP_WHILE_100_C(BOOST_PP_BOOL(p(101, s)), p, o, s)\n# define BOOST_PP_WHILE_101(p, o, s) BOOST_PP_WHILE_101_C(BOOST_PP_BOOL(p(102, s)), p, o, s)\n# define BOOST_PP_WHILE_102(p, o, s) BOOST_PP_WHILE_102_C(BOOST_PP_BOOL(p(103, s)), p, o, s)\n# define BOOST_PP_WHILE_103(p, o, s) BOOST_PP_WHILE_103_C(BOOST_PP_BOOL(p(104, s)), p, o, s)\n# define BOOST_PP_WHILE_104(p, o, s) BOOST_PP_WHILE_104_C(BOOST_PP_BOOL(p(105, s)), p, o, s)\n# define BOOST_PP_WHILE_105(p, o, s) BOOST_PP_WHILE_105_C(BOOST_PP_BOOL(p(106, s)), p, o, s)\n# define BOOST_PP_WHILE_106(p, o, s) BOOST_PP_WHILE_106_C(BOOST_PP_BOOL(p(107, s)), p, o, s)\n# define BOOST_PP_WHILE_107(p, o, s) BOOST_PP_WHILE_107_C(BOOST_PP_BOOL(p(108, s)), p, o, s)\n# define BOOST_PP_WHILE_108(p, o, s) BOOST_PP_WHILE_108_C(BOOST_PP_BOOL(p(109, s)), p, o, s)\n# define BOOST_PP_WHILE_109(p, o, s) BOOST_PP_WHILE_109_C(BOOST_PP_BOOL(p(110, s)), p, o, s)\n# define BOOST_PP_WHILE_110(p, o, s) BOOST_PP_WHILE_110_C(BOOST_PP_BOOL(p(111, s)), p, o, s)\n# define BOOST_PP_WHILE_111(p, o, s) BOOST_PP_WHILE_111_C(BOOST_PP_BOOL(p(112, s)), p, o, s)\n# define BOOST_PP_WHILE_112(p, o, s) BOOST_PP_WHILE_112_C(BOOST_PP_BOOL(p(113, s)), p, o, s)\n# define BOOST_PP_WHILE_113(p, o, s) BOOST_PP_WHILE_113_C(BOOST_PP_BOOL(p(114, s)), p, o, s)\n# define BOOST_PP_WHILE_114(p, o, s) BOOST_PP_WHILE_114_C(BOOST_PP_BOOL(p(115, s)), p, o, s)\n# define BOOST_PP_WHILE_115(p, o, s) BOOST_PP_WHILE_115_C(BOOST_PP_BOOL(p(116, s)), p, o, s)\n# define BOOST_PP_WHILE_116(p, o, s) BOOST_PP_WHILE_116_C(BOOST_PP_BOOL(p(117, s)), p, o, s)\n# define BOOST_PP_WHILE_117(p, o, s) BOOST_PP_WHILE_117_C(BOOST_PP_BOOL(p(118, s)), p, o, s)\n# define BOOST_PP_WHILE_118(p, o, s) BOOST_PP_WHILE_118_C(BOOST_PP_BOOL(p(119, s)), p, o, s)\n# define BOOST_PP_WHILE_119(p, o, s) BOOST_PP_WHILE_119_C(BOOST_PP_BOOL(p(120, s)), p, o, s)\n# define BOOST_PP_WHILE_120(p, o, s) BOOST_PP_WHILE_120_C(BOOST_PP_BOOL(p(121, s)), p, o, s)\n# define BOOST_PP_WHILE_121(p, o, s) BOOST_PP_WHILE_121_C(BOOST_PP_BOOL(p(122, s)), p, o, s)\n# define BOOST_PP_WHILE_122(p, o, s) BOOST_PP_WHILE_122_C(BOOST_PP_BOOL(p(123, s)), p, o, s)\n# define BOOST_PP_WHILE_123(p, o, s) BOOST_PP_WHILE_123_C(BOOST_PP_BOOL(p(124, s)), p, o, s)\n# define BOOST_PP_WHILE_124(p, o, s) BOOST_PP_WHILE_124_C(BOOST_PP_BOOL(p(125, s)), p, o, s)\n# define BOOST_PP_WHILE_125(p, o, s) BOOST_PP_WHILE_125_C(BOOST_PP_BOOL(p(126, s)), p, o, s)\n# define BOOST_PP_WHILE_126(p, o, s) BOOST_PP_WHILE_126_C(BOOST_PP_BOOL(p(127, s)), p, o, s)\n# define BOOST_PP_WHILE_127(p, o, s) BOOST_PP_WHILE_127_C(BOOST_PP_BOOL(p(128, s)), p, o, s)\n# define BOOST_PP_WHILE_128(p, o, s) BOOST_PP_WHILE_128_C(BOOST_PP_BOOL(p(129, s)), p, o, s)\n# define BOOST_PP_WHILE_129(p, o, s) BOOST_PP_WHILE_129_C(BOOST_PP_BOOL(p(130, s)), p, o, s)\n# define BOOST_PP_WHILE_130(p, o, s) BOOST_PP_WHILE_130_C(BOOST_PP_BOOL(p(131, s)), p, o, s)\n# define BOOST_PP_WHILE_131(p, o, s) BOOST_PP_WHILE_131_C(BOOST_PP_BOOL(p(132, s)), p, o, s)\n# define BOOST_PP_WHILE_132(p, o, s) BOOST_PP_WHILE_132_C(BOOST_PP_BOOL(p(133, s)), p, o, s)\n# define BOOST_PP_WHILE_133(p, o, s) BOOST_PP_WHILE_133_C(BOOST_PP_BOOL(p(134, s)), p, o, s)\n# define BOOST_PP_WHILE_134(p, o, s) BOOST_PP_WHILE_134_C(BOOST_PP_BOOL(p(135, s)), p, o, s)\n# define BOOST_PP_WHILE_135(p, o, s) BOOST_PP_WHILE_135_C(BOOST_PP_BOOL(p(136, s)), p, o, s)\n# define BOOST_PP_WHILE_136(p, o, s) BOOST_PP_WHILE_136_C(BOOST_PP_BOOL(p(137, s)), p, o, s)\n# define BOOST_PP_WHILE_137(p, o, s) BOOST_PP_WHILE_137_C(BOOST_PP_BOOL(p(138, s)), p, o, s)\n# define BOOST_PP_WHILE_138(p, o, s) BOOST_PP_WHILE_138_C(BOOST_PP_BOOL(p(139, s)), p, o, s)\n# define BOOST_PP_WHILE_139(p, o, s) BOOST_PP_WHILE_139_C(BOOST_PP_BOOL(p(140, s)), p, o, s)\n# define BOOST_PP_WHILE_140(p, o, s) BOOST_PP_WHILE_140_C(BOOST_PP_BOOL(p(141, s)), p, o, s)\n# define BOOST_PP_WHILE_141(p, o, s) BOOST_PP_WHILE_141_C(BOOST_PP_BOOL(p(142, s)), p, o, s)\n# define BOOST_PP_WHILE_142(p, o, s) BOOST_PP_WHILE_142_C(BOOST_PP_BOOL(p(143, s)), p, o, s)\n# define BOOST_PP_WHILE_143(p, o, s) BOOST_PP_WHILE_143_C(BOOST_PP_BOOL(p(144, s)), p, o, s)\n# define BOOST_PP_WHILE_144(p, o, s) BOOST_PP_WHILE_144_C(BOOST_PP_BOOL(p(145, s)), p, o, s)\n# define BOOST_PP_WHILE_145(p, o, s) BOOST_PP_WHILE_145_C(BOOST_PP_BOOL(p(146, s)), p, o, s)\n# define BOOST_PP_WHILE_146(p, o, s) BOOST_PP_WHILE_146_C(BOOST_PP_BOOL(p(147, s)), p, o, s)\n# define BOOST_PP_WHILE_147(p, o, s) BOOST_PP_WHILE_147_C(BOOST_PP_BOOL(p(148, s)), p, o, s)\n# define BOOST_PP_WHILE_148(p, o, s) BOOST_PP_WHILE_148_C(BOOST_PP_BOOL(p(149, s)), p, o, s)\n# define BOOST_PP_WHILE_149(p, o, s) BOOST_PP_WHILE_149_C(BOOST_PP_BOOL(p(150, s)), p, o, s)\n# define BOOST_PP_WHILE_150(p, o, s) BOOST_PP_WHILE_150_C(BOOST_PP_BOOL(p(151, s)), p, o, s)\n# define BOOST_PP_WHILE_151(p, o, s) BOOST_PP_WHILE_151_C(BOOST_PP_BOOL(p(152, s)), p, o, s)\n# define BOOST_PP_WHILE_152(p, o, s) BOOST_PP_WHILE_152_C(BOOST_PP_BOOL(p(153, s)), p, o, s)\n# define BOOST_PP_WHILE_153(p, o, s) BOOST_PP_WHILE_153_C(BOOST_PP_BOOL(p(154, s)), p, o, s)\n# define BOOST_PP_WHILE_154(p, o, s) BOOST_PP_WHILE_154_C(BOOST_PP_BOOL(p(155, s)), p, o, s)\n# define BOOST_PP_WHILE_155(p, o, s) BOOST_PP_WHILE_155_C(BOOST_PP_BOOL(p(156, s)), p, o, s)\n# define BOOST_PP_WHILE_156(p, o, s) BOOST_PP_WHILE_156_C(BOOST_PP_BOOL(p(157, s)), p, o, s)\n# define BOOST_PP_WHILE_157(p, o, s) BOOST_PP_WHILE_157_C(BOOST_PP_BOOL(p(158, s)), p, o, s)\n# define BOOST_PP_WHILE_158(p, o, s) BOOST_PP_WHILE_158_C(BOOST_PP_BOOL(p(159, s)), p, o, s)\n# define BOOST_PP_WHILE_159(p, o, s) BOOST_PP_WHILE_159_C(BOOST_PP_BOOL(p(160, s)), p, o, s)\n# define BOOST_PP_WHILE_160(p, o, s) BOOST_PP_WHILE_160_C(BOOST_PP_BOOL(p(161, s)), p, o, s)\n# define BOOST_PP_WHILE_161(p, o, s) BOOST_PP_WHILE_161_C(BOOST_PP_BOOL(p(162, s)), p, o, s)\n# define BOOST_PP_WHILE_162(p, o, s) BOOST_PP_WHILE_162_C(BOOST_PP_BOOL(p(163, s)), p, o, s)\n# define BOOST_PP_WHILE_163(p, o, s) BOOST_PP_WHILE_163_C(BOOST_PP_BOOL(p(164, s)), p, o, s)\n# define BOOST_PP_WHILE_164(p, o, s) BOOST_PP_WHILE_164_C(BOOST_PP_BOOL(p(165, s)), p, o, s)\n# define BOOST_PP_WHILE_165(p, o, s) BOOST_PP_WHILE_165_C(BOOST_PP_BOOL(p(166, s)), p, o, s)\n# define BOOST_PP_WHILE_166(p, o, s) BOOST_PP_WHILE_166_C(BOOST_PP_BOOL(p(167, s)), p, o, s)\n# define BOOST_PP_WHILE_167(p, o, s) BOOST_PP_WHILE_167_C(BOOST_PP_BOOL(p(168, s)), p, o, s)\n# define BOOST_PP_WHILE_168(p, o, s) BOOST_PP_WHILE_168_C(BOOST_PP_BOOL(p(169, s)), p, o, s)\n# define BOOST_PP_WHILE_169(p, o, s) BOOST_PP_WHILE_169_C(BOOST_PP_BOOL(p(170, s)), p, o, s)\n# define BOOST_PP_WHILE_170(p, o, s) BOOST_PP_WHILE_170_C(BOOST_PP_BOOL(p(171, s)), p, o, s)\n# define BOOST_PP_WHILE_171(p, o, s) BOOST_PP_WHILE_171_C(BOOST_PP_BOOL(p(172, s)), p, o, s)\n# define BOOST_PP_WHILE_172(p, o, s) BOOST_PP_WHILE_172_C(BOOST_PP_BOOL(p(173, s)), p, o, s)\n# define BOOST_PP_WHILE_173(p, o, s) BOOST_PP_WHILE_173_C(BOOST_PP_BOOL(p(174, s)), p, o, s)\n# define BOOST_PP_WHILE_174(p, o, s) BOOST_PP_WHILE_174_C(BOOST_PP_BOOL(p(175, s)), p, o, s)\n# define BOOST_PP_WHILE_175(p, o, s) BOOST_PP_WHILE_175_C(BOOST_PP_BOOL(p(176, s)), p, o, s)\n# define BOOST_PP_WHILE_176(p, o, s) BOOST_PP_WHILE_176_C(BOOST_PP_BOOL(p(177, s)), p, o, s)\n# define BOOST_PP_WHILE_177(p, o, s) BOOST_PP_WHILE_177_C(BOOST_PP_BOOL(p(178, s)), p, o, s)\n# define BOOST_PP_WHILE_178(p, o, s) BOOST_PP_WHILE_178_C(BOOST_PP_BOOL(p(179, s)), p, o, s)\n# define BOOST_PP_WHILE_179(p, o, s) BOOST_PP_WHILE_179_C(BOOST_PP_BOOL(p(180, s)), p, o, s)\n# define BOOST_PP_WHILE_180(p, o, s) BOOST_PP_WHILE_180_C(BOOST_PP_BOOL(p(181, s)), p, o, s)\n# define BOOST_PP_WHILE_181(p, o, s) BOOST_PP_WHILE_181_C(BOOST_PP_BOOL(p(182, s)), p, o, s)\n# define BOOST_PP_WHILE_182(p, o, s) BOOST_PP_WHILE_182_C(BOOST_PP_BOOL(p(183, s)), p, o, s)\n# define BOOST_PP_WHILE_183(p, o, s) BOOST_PP_WHILE_183_C(BOOST_PP_BOOL(p(184, s)), p, o, s)\n# define BOOST_PP_WHILE_184(p, o, s) BOOST_PP_WHILE_184_C(BOOST_PP_BOOL(p(185, s)), p, o, s)\n# define BOOST_PP_WHILE_185(p, o, s) BOOST_PP_WHILE_185_C(BOOST_PP_BOOL(p(186, s)), p, o, s)\n# define BOOST_PP_WHILE_186(p, o, s) BOOST_PP_WHILE_186_C(BOOST_PP_BOOL(p(187, s)), p, o, s)\n# define BOOST_PP_WHILE_187(p, o, s) BOOST_PP_WHILE_187_C(BOOST_PP_BOOL(p(188, s)), p, o, s)\n# define BOOST_PP_WHILE_188(p, o, s) BOOST_PP_WHILE_188_C(BOOST_PP_BOOL(p(189, s)), p, o, s)\n# define BOOST_PP_WHILE_189(p, o, s) BOOST_PP_WHILE_189_C(BOOST_PP_BOOL(p(190, s)), p, o, s)\n# define BOOST_PP_WHILE_190(p, o, s) BOOST_PP_WHILE_190_C(BOOST_PP_BOOL(p(191, s)), p, o, s)\n# define BOOST_PP_WHILE_191(p, o, s) BOOST_PP_WHILE_191_C(BOOST_PP_BOOL(p(192, s)), p, o, s)\n# define BOOST_PP_WHILE_192(p, o, s) BOOST_PP_WHILE_192_C(BOOST_PP_BOOL(p(193, s)), p, o, s)\n# define BOOST_PP_WHILE_193(p, o, s) BOOST_PP_WHILE_193_C(BOOST_PP_BOOL(p(194, s)), p, o, s)\n# define BOOST_PP_WHILE_194(p, o, s) BOOST_PP_WHILE_194_C(BOOST_PP_BOOL(p(195, s)), p, o, s)\n# define BOOST_PP_WHILE_195(p, o, s) BOOST_PP_WHILE_195_C(BOOST_PP_BOOL(p(196, s)), p, o, s)\n# define BOOST_PP_WHILE_196(p, o, s) BOOST_PP_WHILE_196_C(BOOST_PP_BOOL(p(197, s)), p, o, s)\n# define BOOST_PP_WHILE_197(p, o, s) BOOST_PP_WHILE_197_C(BOOST_PP_BOOL(p(198, s)), p, o, s)\n# define BOOST_PP_WHILE_198(p, o, s) BOOST_PP_WHILE_198_C(BOOST_PP_BOOL(p(199, s)), p, o, s)\n# define BOOST_PP_WHILE_199(p, o, s) BOOST_PP_WHILE_199_C(BOOST_PP_BOOL(p(200, s)), p, o, s)\n# define BOOST_PP_WHILE_200(p, o, s) BOOST_PP_WHILE_200_C(BOOST_PP_BOOL(p(201, s)), p, o, s)\n# define BOOST_PP_WHILE_201(p, o, s) BOOST_PP_WHILE_201_C(BOOST_PP_BOOL(p(202, s)), p, o, s)\n# define BOOST_PP_WHILE_202(p, o, s) BOOST_PP_WHILE_202_C(BOOST_PP_BOOL(p(203, s)), p, o, s)\n# define BOOST_PP_WHILE_203(p, o, s) BOOST_PP_WHILE_203_C(BOOST_PP_BOOL(p(204, s)), p, o, s)\n# define BOOST_PP_WHILE_204(p, o, s) BOOST_PP_WHILE_204_C(BOOST_PP_BOOL(p(205, s)), p, o, s)\n# define BOOST_PP_WHILE_205(p, o, s) BOOST_PP_WHILE_205_C(BOOST_PP_BOOL(p(206, s)), p, o, s)\n# define BOOST_PP_WHILE_206(p, o, s) BOOST_PP_WHILE_206_C(BOOST_PP_BOOL(p(207, s)), p, o, s)\n# define BOOST_PP_WHILE_207(p, o, s) BOOST_PP_WHILE_207_C(BOOST_PP_BOOL(p(208, s)), p, o, s)\n# define BOOST_PP_WHILE_208(p, o, s) BOOST_PP_WHILE_208_C(BOOST_PP_BOOL(p(209, s)), p, o, s)\n# define BOOST_PP_WHILE_209(p, o, s) BOOST_PP_WHILE_209_C(BOOST_PP_BOOL(p(210, s)), p, o, s)\n# define BOOST_PP_WHILE_210(p, o, s) BOOST_PP_WHILE_210_C(BOOST_PP_BOOL(p(211, s)), p, o, s)\n# define BOOST_PP_WHILE_211(p, o, s) BOOST_PP_WHILE_211_C(BOOST_PP_BOOL(p(212, s)), p, o, s)\n# define BOOST_PP_WHILE_212(p, o, s) BOOST_PP_WHILE_212_C(BOOST_PP_BOOL(p(213, s)), p, o, s)\n# define BOOST_PP_WHILE_213(p, o, s) BOOST_PP_WHILE_213_C(BOOST_PP_BOOL(p(214, s)), p, o, s)\n# define BOOST_PP_WHILE_214(p, o, s) BOOST_PP_WHILE_214_C(BOOST_PP_BOOL(p(215, s)), p, o, s)\n# define BOOST_PP_WHILE_215(p, o, s) BOOST_PP_WHILE_215_C(BOOST_PP_BOOL(p(216, s)), p, o, s)\n# define BOOST_PP_WHILE_216(p, o, s) BOOST_PP_WHILE_216_C(BOOST_PP_BOOL(p(217, s)), p, o, s)\n# define BOOST_PP_WHILE_217(p, o, s) BOOST_PP_WHILE_217_C(BOOST_PP_BOOL(p(218, s)), p, o, s)\n# define BOOST_PP_WHILE_218(p, o, s) BOOST_PP_WHILE_218_C(BOOST_PP_BOOL(p(219, s)), p, o, s)\n# define BOOST_PP_WHILE_219(p, o, s) BOOST_PP_WHILE_219_C(BOOST_PP_BOOL(p(220, s)), p, o, s)\n# define BOOST_PP_WHILE_220(p, o, s) BOOST_PP_WHILE_220_C(BOOST_PP_BOOL(p(221, s)), p, o, s)\n# define BOOST_PP_WHILE_221(p, o, s) BOOST_PP_WHILE_221_C(BOOST_PP_BOOL(p(222, s)), p, o, s)\n# define BOOST_PP_WHILE_222(p, o, s) BOOST_PP_WHILE_222_C(BOOST_PP_BOOL(p(223, s)), p, o, s)\n# define BOOST_PP_WHILE_223(p, o, s) BOOST_PP_WHILE_223_C(BOOST_PP_BOOL(p(224, s)), p, o, s)\n# define BOOST_PP_WHILE_224(p, o, s) BOOST_PP_WHILE_224_C(BOOST_PP_BOOL(p(225, s)), p, o, s)\n# define BOOST_PP_WHILE_225(p, o, s) BOOST_PP_WHILE_225_C(BOOST_PP_BOOL(p(226, s)), p, o, s)\n# define BOOST_PP_WHILE_226(p, o, s) BOOST_PP_WHILE_226_C(BOOST_PP_BOOL(p(227, s)), p, o, s)\n# define BOOST_PP_WHILE_227(p, o, s) BOOST_PP_WHILE_227_C(BOOST_PP_BOOL(p(228, s)), p, o, s)\n# define BOOST_PP_WHILE_228(p, o, s) BOOST_PP_WHILE_228_C(BOOST_PP_BOOL(p(229, s)), p, o, s)\n# define BOOST_PP_WHILE_229(p, o, s) BOOST_PP_WHILE_229_C(BOOST_PP_BOOL(p(230, s)), p, o, s)\n# define BOOST_PP_WHILE_230(p, o, s) BOOST_PP_WHILE_230_C(BOOST_PP_BOOL(p(231, s)), p, o, s)\n# define BOOST_PP_WHILE_231(p, o, s) BOOST_PP_WHILE_231_C(BOOST_PP_BOOL(p(232, s)), p, o, s)\n# define BOOST_PP_WHILE_232(p, o, s) BOOST_PP_WHILE_232_C(BOOST_PP_BOOL(p(233, s)), p, o, s)\n# define BOOST_PP_WHILE_233(p, o, s) BOOST_PP_WHILE_233_C(BOOST_PP_BOOL(p(234, s)), p, o, s)\n# define BOOST_PP_WHILE_234(p, o, s) BOOST_PP_WHILE_234_C(BOOST_PP_BOOL(p(235, s)), p, o, s)\n# define BOOST_PP_WHILE_235(p, o, s) BOOST_PP_WHILE_235_C(BOOST_PP_BOOL(p(236, s)), p, o, s)\n# define BOOST_PP_WHILE_236(p, o, s) BOOST_PP_WHILE_236_C(BOOST_PP_BOOL(p(237, s)), p, o, s)\n# define BOOST_PP_WHILE_237(p, o, s) BOOST_PP_WHILE_237_C(BOOST_PP_BOOL(p(238, s)), p, o, s)\n# define BOOST_PP_WHILE_238(p, o, s) BOOST_PP_WHILE_238_C(BOOST_PP_BOOL(p(239, s)), p, o, s)\n# define BOOST_PP_WHILE_239(p, o, s) BOOST_PP_WHILE_239_C(BOOST_PP_BOOL(p(240, s)), p, o, s)\n# define BOOST_PP_WHILE_240(p, o, s) BOOST_PP_WHILE_240_C(BOOST_PP_BOOL(p(241, s)), p, o, s)\n# define BOOST_PP_WHILE_241(p, o, s) BOOST_PP_WHILE_241_C(BOOST_PP_BOOL(p(242, s)), p, o, s)\n# define BOOST_PP_WHILE_242(p, o, s) BOOST_PP_WHILE_242_C(BOOST_PP_BOOL(p(243, s)), p, o, s)\n# define BOOST_PP_WHILE_243(p, o, s) BOOST_PP_WHILE_243_C(BOOST_PP_BOOL(p(244, s)), p, o, s)\n# define BOOST_PP_WHILE_244(p, o, s) BOOST_PP_WHILE_244_C(BOOST_PP_BOOL(p(245, s)), p, o, s)\n# define BOOST_PP_WHILE_245(p, o, s) BOOST_PP_WHILE_245_C(BOOST_PP_BOOL(p(246, s)), p, o, s)\n# define BOOST_PP_WHILE_246(p, o, s) BOOST_PP_WHILE_246_C(BOOST_PP_BOOL(p(247, s)), p, o, s)\n# define BOOST_PP_WHILE_247(p, o, s) BOOST_PP_WHILE_247_C(BOOST_PP_BOOL(p(248, s)), p, o, s)\n# define BOOST_PP_WHILE_248(p, o, s) BOOST_PP_WHILE_248_C(BOOST_PP_BOOL(p(249, s)), p, o, s)\n# define BOOST_PP_WHILE_249(p, o, s) BOOST_PP_WHILE_249_C(BOOST_PP_BOOL(p(250, s)), p, o, s)\n# define BOOST_PP_WHILE_250(p, o, s) BOOST_PP_WHILE_250_C(BOOST_PP_BOOL(p(251, s)), p, o, s)\n# define BOOST_PP_WHILE_251(p, o, s) BOOST_PP_WHILE_251_C(BOOST_PP_BOOL(p(252, s)), p, o, s)\n# define BOOST_PP_WHILE_252(p, o, s) BOOST_PP_WHILE_252_C(BOOST_PP_BOOL(p(253, s)), p, o, s)\n# define BOOST_PP_WHILE_253(p, o, s) BOOST_PP_WHILE_253_C(BOOST_PP_BOOL(p(254, s)), p, o, s)\n# define BOOST_PP_WHILE_254(p, o, s) BOOST_PP_WHILE_254_C(BOOST_PP_BOOL(p(255, s)), p, o, s)\n# define BOOST_PP_WHILE_255(p, o, s) BOOST_PP_WHILE_255_C(BOOST_PP_BOOL(p(256, s)), p, o, s)\n# define BOOST_PP_WHILE_256(p, o, s) BOOST_PP_WHILE_256_C(BOOST_PP_BOOL(p(257, s)), p, o, s)\n#\n# define BOOST_PP_WHILE_1_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_2, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(2, s))\n# define BOOST_PP_WHILE_2_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_3, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(3, s))\n# define BOOST_PP_WHILE_3_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_4, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(4, s))\n# define BOOST_PP_WHILE_4_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_5, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(5, s))\n# define BOOST_PP_WHILE_5_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_6, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(6, s))\n# define BOOST_PP_WHILE_6_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_7, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(7, s))\n# define BOOST_PP_WHILE_7_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_8, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(8, s))\n# define BOOST_PP_WHILE_8_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_9, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(9, s))\n# define BOOST_PP_WHILE_9_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_10, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(10, s))\n# define BOOST_PP_WHILE_10_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_11, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(11, s))\n# define BOOST_PP_WHILE_11_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_12, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(12, s))\n# define BOOST_PP_WHILE_12_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_13, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(13, s))\n# define BOOST_PP_WHILE_13_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_14, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(14, s))\n# define BOOST_PP_WHILE_14_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_15, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(15, s))\n# define BOOST_PP_WHILE_15_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_16, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(16, s))\n# define BOOST_PP_WHILE_16_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_17, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(17, s))\n# define BOOST_PP_WHILE_17_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_18, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(18, s))\n# define BOOST_PP_WHILE_18_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_19, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(19, s))\n# define BOOST_PP_WHILE_19_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_20, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(20, s))\n# define BOOST_PP_WHILE_20_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_21, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(21, s))\n# define BOOST_PP_WHILE_21_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_22, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(22, s))\n# define BOOST_PP_WHILE_22_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_23, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(23, s))\n# define BOOST_PP_WHILE_23_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_24, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(24, s))\n# define BOOST_PP_WHILE_24_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_25, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(25, s))\n# define BOOST_PP_WHILE_25_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_26, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(26, s))\n# define BOOST_PP_WHILE_26_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_27, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(27, s))\n# define BOOST_PP_WHILE_27_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_28, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(28, s))\n# define BOOST_PP_WHILE_28_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_29, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(29, s))\n# define BOOST_PP_WHILE_29_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_30, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(30, s))\n# define BOOST_PP_WHILE_30_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_31, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(31, s))\n# define BOOST_PP_WHILE_31_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_32, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(32, s))\n# define BOOST_PP_WHILE_32_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_33, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(33, s))\n# define BOOST_PP_WHILE_33_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_34, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(34, s))\n# define BOOST_PP_WHILE_34_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_35, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(35, s))\n# define BOOST_PP_WHILE_35_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_36, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(36, s))\n# define BOOST_PP_WHILE_36_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_37, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(37, s))\n# define BOOST_PP_WHILE_37_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_38, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(38, s))\n# define BOOST_PP_WHILE_38_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_39, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(39, s))\n# define BOOST_PP_WHILE_39_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_40, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(40, s))\n# define BOOST_PP_WHILE_40_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_41, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(41, s))\n# define BOOST_PP_WHILE_41_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_42, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(42, s))\n# define BOOST_PP_WHILE_42_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_43, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(43, s))\n# define BOOST_PP_WHILE_43_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_44, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(44, s))\n# define BOOST_PP_WHILE_44_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_45, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(45, s))\n# define BOOST_PP_WHILE_45_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_46, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(46, s))\n# define BOOST_PP_WHILE_46_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_47, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(47, s))\n# define BOOST_PP_WHILE_47_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_48, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(48, s))\n# define BOOST_PP_WHILE_48_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_49, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(49, s))\n# define BOOST_PP_WHILE_49_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_50, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(50, s))\n# define BOOST_PP_WHILE_50_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_51, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(51, s))\n# define BOOST_PP_WHILE_51_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_52, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(52, s))\n# define BOOST_PP_WHILE_52_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_53, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(53, s))\n# define BOOST_PP_WHILE_53_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_54, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(54, s))\n# define BOOST_PP_WHILE_54_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_55, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(55, s))\n# define BOOST_PP_WHILE_55_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_56, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(56, s))\n# define BOOST_PP_WHILE_56_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_57, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(57, s))\n# define BOOST_PP_WHILE_57_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_58, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(58, s))\n# define BOOST_PP_WHILE_58_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_59, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(59, s))\n# define BOOST_PP_WHILE_59_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_60, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(60, s))\n# define BOOST_PP_WHILE_60_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_61, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(61, s))\n# define BOOST_PP_WHILE_61_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_62, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(62, s))\n# define BOOST_PP_WHILE_62_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_63, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(63, s))\n# define BOOST_PP_WHILE_63_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_64, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(64, s))\n# define BOOST_PP_WHILE_64_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_65, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(65, s))\n# define BOOST_PP_WHILE_65_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_66, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(66, s))\n# define BOOST_PP_WHILE_66_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_67, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(67, s))\n# define BOOST_PP_WHILE_67_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_68, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(68, s))\n# define BOOST_PP_WHILE_68_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_69, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(69, s))\n# define BOOST_PP_WHILE_69_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_70, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(70, s))\n# define BOOST_PP_WHILE_70_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_71, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(71, s))\n# define BOOST_PP_WHILE_71_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_72, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(72, s))\n# define BOOST_PP_WHILE_72_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_73, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(73, s))\n# define BOOST_PP_WHILE_73_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_74, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(74, s))\n# define BOOST_PP_WHILE_74_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_75, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(75, s))\n# define BOOST_PP_WHILE_75_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_76, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(76, s))\n# define BOOST_PP_WHILE_76_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_77, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(77, s))\n# define BOOST_PP_WHILE_77_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_78, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(78, s))\n# define BOOST_PP_WHILE_78_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_79, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(79, s))\n# define BOOST_PP_WHILE_79_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_80, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(80, s))\n# define BOOST_PP_WHILE_80_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_81, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(81, s))\n# define BOOST_PP_WHILE_81_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_82, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(82, s))\n# define BOOST_PP_WHILE_82_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_83, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(83, s))\n# define BOOST_PP_WHILE_83_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_84, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(84, s))\n# define BOOST_PP_WHILE_84_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_85, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(85, s))\n# define BOOST_PP_WHILE_85_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_86, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(86, s))\n# define BOOST_PP_WHILE_86_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_87, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(87, s))\n# define BOOST_PP_WHILE_87_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_88, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(88, s))\n# define BOOST_PP_WHILE_88_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_89, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(89, s))\n# define BOOST_PP_WHILE_89_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_90, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(90, s))\n# define BOOST_PP_WHILE_90_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_91, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(91, s))\n# define BOOST_PP_WHILE_91_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_92, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(92, s))\n# define BOOST_PP_WHILE_92_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_93, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(93, s))\n# define BOOST_PP_WHILE_93_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_94, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(94, s))\n# define BOOST_PP_WHILE_94_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_95, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(95, s))\n# define BOOST_PP_WHILE_95_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_96, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(96, s))\n# define BOOST_PP_WHILE_96_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_97, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(97, s))\n# define BOOST_PP_WHILE_97_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_98, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(98, s))\n# define BOOST_PP_WHILE_98_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_99, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(99, s))\n# define BOOST_PP_WHILE_99_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_100, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(100, s))\n# define BOOST_PP_WHILE_100_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_101, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(101, s))\n# define BOOST_PP_WHILE_101_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_102, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(102, s))\n# define BOOST_PP_WHILE_102_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_103, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(103, s))\n# define BOOST_PP_WHILE_103_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_104, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(104, s))\n# define BOOST_PP_WHILE_104_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_105, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(105, s))\n# define BOOST_PP_WHILE_105_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_106, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(106, s))\n# define BOOST_PP_WHILE_106_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_107, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(107, s))\n# define BOOST_PP_WHILE_107_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_108, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(108, s))\n# define BOOST_PP_WHILE_108_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_109, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(109, s))\n# define BOOST_PP_WHILE_109_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_110, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(110, s))\n# define BOOST_PP_WHILE_110_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_111, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(111, s))\n# define BOOST_PP_WHILE_111_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_112, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(112, s))\n# define BOOST_PP_WHILE_112_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_113, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(113, s))\n# define BOOST_PP_WHILE_113_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_114, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(114, s))\n# define BOOST_PP_WHILE_114_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_115, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(115, s))\n# define BOOST_PP_WHILE_115_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_116, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(116, s))\n# define BOOST_PP_WHILE_116_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_117, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(117, s))\n# define BOOST_PP_WHILE_117_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_118, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(118, s))\n# define BOOST_PP_WHILE_118_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_119, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(119, s))\n# define BOOST_PP_WHILE_119_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_120, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(120, s))\n# define BOOST_PP_WHILE_120_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_121, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(121, s))\n# define BOOST_PP_WHILE_121_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_122, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(122, s))\n# define BOOST_PP_WHILE_122_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_123, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(123, s))\n# define BOOST_PP_WHILE_123_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_124, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(124, s))\n# define BOOST_PP_WHILE_124_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_125, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(125, s))\n# define BOOST_PP_WHILE_125_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_126, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(126, s))\n# define BOOST_PP_WHILE_126_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_127, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(127, s))\n# define BOOST_PP_WHILE_127_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_128, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(128, s))\n# define BOOST_PP_WHILE_128_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_129, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(129, s))\n# define BOOST_PP_WHILE_129_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_130, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(130, s))\n# define BOOST_PP_WHILE_130_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_131, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(131, s))\n# define BOOST_PP_WHILE_131_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_132, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(132, s))\n# define BOOST_PP_WHILE_132_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_133, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(133, s))\n# define BOOST_PP_WHILE_133_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_134, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(134, s))\n# define BOOST_PP_WHILE_134_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_135, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(135, s))\n# define BOOST_PP_WHILE_135_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_136, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(136, s))\n# define BOOST_PP_WHILE_136_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_137, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(137, s))\n# define BOOST_PP_WHILE_137_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_138, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(138, s))\n# define BOOST_PP_WHILE_138_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_139, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(139, s))\n# define BOOST_PP_WHILE_139_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_140, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(140, s))\n# define BOOST_PP_WHILE_140_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_141, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(141, s))\n# define BOOST_PP_WHILE_141_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_142, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(142, s))\n# define BOOST_PP_WHILE_142_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_143, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(143, s))\n# define BOOST_PP_WHILE_143_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_144, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(144, s))\n# define BOOST_PP_WHILE_144_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_145, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(145, s))\n# define BOOST_PP_WHILE_145_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_146, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(146, s))\n# define BOOST_PP_WHILE_146_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_147, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(147, s))\n# define BOOST_PP_WHILE_147_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_148, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(148, s))\n# define BOOST_PP_WHILE_148_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_149, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(149, s))\n# define BOOST_PP_WHILE_149_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_150, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(150, s))\n# define BOOST_PP_WHILE_150_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_151, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(151, s))\n# define BOOST_PP_WHILE_151_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_152, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(152, s))\n# define BOOST_PP_WHILE_152_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_153, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(153, s))\n# define BOOST_PP_WHILE_153_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_154, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(154, s))\n# define BOOST_PP_WHILE_154_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_155, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(155, s))\n# define BOOST_PP_WHILE_155_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_156, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(156, s))\n# define BOOST_PP_WHILE_156_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_157, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(157, s))\n# define BOOST_PP_WHILE_157_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_158, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(158, s))\n# define BOOST_PP_WHILE_158_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_159, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(159, s))\n# define BOOST_PP_WHILE_159_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_160, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(160, s))\n# define BOOST_PP_WHILE_160_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_161, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(161, s))\n# define BOOST_PP_WHILE_161_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_162, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(162, s))\n# define BOOST_PP_WHILE_162_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_163, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(163, s))\n# define BOOST_PP_WHILE_163_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_164, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(164, s))\n# define BOOST_PP_WHILE_164_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_165, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(165, s))\n# define BOOST_PP_WHILE_165_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_166, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(166, s))\n# define BOOST_PP_WHILE_166_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_167, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(167, s))\n# define BOOST_PP_WHILE_167_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_168, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(168, s))\n# define BOOST_PP_WHILE_168_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_169, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(169, s))\n# define BOOST_PP_WHILE_169_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_170, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(170, s))\n# define BOOST_PP_WHILE_170_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_171, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(171, s))\n# define BOOST_PP_WHILE_171_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_172, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(172, s))\n# define BOOST_PP_WHILE_172_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_173, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(173, s))\n# define BOOST_PP_WHILE_173_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_174, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(174, s))\n# define BOOST_PP_WHILE_174_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_175, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(175, s))\n# define BOOST_PP_WHILE_175_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_176, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(176, s))\n# define BOOST_PP_WHILE_176_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_177, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(177, s))\n# define BOOST_PP_WHILE_177_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_178, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(178, s))\n# define BOOST_PP_WHILE_178_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_179, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(179, s))\n# define BOOST_PP_WHILE_179_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_180, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(180, s))\n# define BOOST_PP_WHILE_180_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_181, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(181, s))\n# define BOOST_PP_WHILE_181_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_182, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(182, s))\n# define BOOST_PP_WHILE_182_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_183, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(183, s))\n# define BOOST_PP_WHILE_183_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_184, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(184, s))\n# define BOOST_PP_WHILE_184_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_185, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(185, s))\n# define BOOST_PP_WHILE_185_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_186, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(186, s))\n# define BOOST_PP_WHILE_186_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_187, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(187, s))\n# define BOOST_PP_WHILE_187_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_188, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(188, s))\n# define BOOST_PP_WHILE_188_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_189, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(189, s))\n# define BOOST_PP_WHILE_189_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_190, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(190, s))\n# define BOOST_PP_WHILE_190_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_191, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(191, s))\n# define BOOST_PP_WHILE_191_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_192, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(192, s))\n# define BOOST_PP_WHILE_192_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_193, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(193, s))\n# define BOOST_PP_WHILE_193_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_194, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(194, s))\n# define BOOST_PP_WHILE_194_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_195, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(195, s))\n# define BOOST_PP_WHILE_195_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_196, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(196, s))\n# define BOOST_PP_WHILE_196_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_197, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(197, s))\n# define BOOST_PP_WHILE_197_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_198, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(198, s))\n# define BOOST_PP_WHILE_198_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_199, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(199, s))\n# define BOOST_PP_WHILE_199_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_200, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(200, s))\n# define BOOST_PP_WHILE_200_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_201, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(201, s))\n# define BOOST_PP_WHILE_201_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_202, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(202, s))\n# define BOOST_PP_WHILE_202_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_203, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(203, s))\n# define BOOST_PP_WHILE_203_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_204, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(204, s))\n# define BOOST_PP_WHILE_204_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_205, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(205, s))\n# define BOOST_PP_WHILE_205_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_206, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(206, s))\n# define BOOST_PP_WHILE_206_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_207, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(207, s))\n# define BOOST_PP_WHILE_207_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_208, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(208, s))\n# define BOOST_PP_WHILE_208_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_209, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(209, s))\n# define BOOST_PP_WHILE_209_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_210, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(210, s))\n# define BOOST_PP_WHILE_210_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_211, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(211, s))\n# define BOOST_PP_WHILE_211_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_212, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(212, s))\n# define BOOST_PP_WHILE_212_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_213, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(213, s))\n# define BOOST_PP_WHILE_213_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_214, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(214, s))\n# define BOOST_PP_WHILE_214_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_215, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(215, s))\n# define BOOST_PP_WHILE_215_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_216, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(216, s))\n# define BOOST_PP_WHILE_216_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_217, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(217, s))\n# define BOOST_PP_WHILE_217_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_218, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(218, s))\n# define BOOST_PP_WHILE_218_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_219, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(219, s))\n# define BOOST_PP_WHILE_219_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_220, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(220, s))\n# define BOOST_PP_WHILE_220_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_221, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(221, s))\n# define BOOST_PP_WHILE_221_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_222, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(222, s))\n# define BOOST_PP_WHILE_222_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_223, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(223, s))\n# define BOOST_PP_WHILE_223_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_224, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(224, s))\n# define BOOST_PP_WHILE_224_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_225, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(225, s))\n# define BOOST_PP_WHILE_225_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_226, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(226, s))\n# define BOOST_PP_WHILE_226_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_227, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(227, s))\n# define BOOST_PP_WHILE_227_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_228, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(228, s))\n# define BOOST_PP_WHILE_228_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_229, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(229, s))\n# define BOOST_PP_WHILE_229_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_230, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(230, s))\n# define BOOST_PP_WHILE_230_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_231, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(231, s))\n# define BOOST_PP_WHILE_231_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_232, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(232, s))\n# define BOOST_PP_WHILE_232_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_233, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(233, s))\n# define BOOST_PP_WHILE_233_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_234, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(234, s))\n# define BOOST_PP_WHILE_234_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_235, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(235, s))\n# define BOOST_PP_WHILE_235_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_236, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(236, s))\n# define BOOST_PP_WHILE_236_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_237, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(237, s))\n# define BOOST_PP_WHILE_237_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_238, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(238, s))\n# define BOOST_PP_WHILE_238_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_239, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(239, s))\n# define BOOST_PP_WHILE_239_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_240, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(240, s))\n# define BOOST_PP_WHILE_240_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_241, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(241, s))\n# define BOOST_PP_WHILE_241_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_242, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(242, s))\n# define BOOST_PP_WHILE_242_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_243, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(243, s))\n# define BOOST_PP_WHILE_243_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_244, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(244, s))\n# define BOOST_PP_WHILE_244_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_245, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(245, s))\n# define BOOST_PP_WHILE_245_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_246, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(246, s))\n# define BOOST_PP_WHILE_246_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_247, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(247, s))\n# define BOOST_PP_WHILE_247_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_248, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(248, s))\n# define BOOST_PP_WHILE_248_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_249, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(249, s))\n# define BOOST_PP_WHILE_249_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_250, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(250, s))\n# define BOOST_PP_WHILE_250_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_251, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(251, s))\n# define BOOST_PP_WHILE_251_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_252, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(252, s))\n# define BOOST_PP_WHILE_252_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_253, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(253, s))\n# define BOOST_PP_WHILE_253_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_254, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(254, s))\n# define BOOST_PP_WHILE_254_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_255, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(255, s))\n# define BOOST_PP_WHILE_255_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_256, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(256, s))\n# define BOOST_PP_WHILE_256_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_257, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(257, s))\n#\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/control/expr_if.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_CONTROL_EXPR_IF_HPP\n# define BOOST_PREPROCESSOR_CONTROL_EXPR_IF_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/expr_iif.hpp>\n# include <boost/preprocessor/logical/bool.hpp>\n#\n# /* BOOST_PP_EXPR_IF */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_EXPR_IF(cond, expr) BOOST_PP_EXPR_IIF(BOOST_PP_BOOL(cond), expr)\n# else\n#    define BOOST_PP_EXPR_IF(cond, expr) BOOST_PP_EXPR_IF_I(cond, expr)\n#    define BOOST_PP_EXPR_IF_I(cond, expr) BOOST_PP_EXPR_IIF(BOOST_PP_BOOL(cond), expr)\n# endif\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/control/expr_iif.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_CONTROL_EXPR_IIF_HPP\n# define BOOST_PREPROCESSOR_CONTROL_EXPR_IIF_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_EXPR_IIF */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_EXPR_IIF(bit, expr) BOOST_PP_EXPR_IIF_I(bit, expr)\n# else\n#    define BOOST_PP_EXPR_IIF(bit, expr) BOOST_PP_EXPR_IIF_OO((bit, expr))\n#    define BOOST_PP_EXPR_IIF_OO(par) BOOST_PP_EXPR_IIF_I ## par\n# endif\n#\n# define BOOST_PP_EXPR_IIF_I(bit, expr) BOOST_PP_EXPR_IIF_ ## bit(expr)\n#\n# define BOOST_PP_EXPR_IIF_0(expr)\n# define BOOST_PP_EXPR_IIF_1(expr) expr\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/control/if.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_CONTROL_IF_HPP\n# define BOOST_PREPROCESSOR_CONTROL_IF_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/logical/bool.hpp>\n#\n# /* BOOST_PP_IF */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_IF(cond, t, f) BOOST_PP_IIF(BOOST_PP_BOOL(cond), t, f)\n# else\n#    define BOOST_PP_IF(cond, t, f) BOOST_PP_IF_I(cond, t, f)\n#    define BOOST_PP_IF_I(cond, t, f) BOOST_PP_IIF(BOOST_PP_BOOL(cond), t, f)\n# endif\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/control/iif.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_CONTROL_IIF_HPP\n# define BOOST_PREPROCESSOR_CONTROL_IIF_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_IIF(bit, t, f) BOOST_PP_IIF_I(bit, t, f)\n# else\n#    define BOOST_PP_IIF(bit, t, f) BOOST_PP_IIF_OO((bit, t, f))\n#    define BOOST_PP_IIF_OO(par) BOOST_PP_IIF_I ## par\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    define BOOST_PP_IIF_I(bit, t, f) BOOST_PP_IIF_ ## bit(t, f)\n# else\n#    define BOOST_PP_IIF_I(bit, t, f) BOOST_PP_IIF_II(BOOST_PP_IIF_ ## bit(t, f))\n#    define BOOST_PP_IIF_II(id) id\n# endif\n#\n# define BOOST_PP_IIF_0(t, f) f\n# define BOOST_PP_IIF_1(t, f) t\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/control/while.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_CONTROL_WHILE_HPP\n# define BOOST_PREPROCESSOR_CONTROL_WHILE_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/debug/error.hpp>\n# include <boost/preprocessor/detail/auto_rec.hpp>\n# include <boost/preprocessor/list/fold_left.hpp>\n# include <boost/preprocessor/list/fold_right.hpp>\n# include <boost/preprocessor/logical/bitand.hpp>\n#\n# /* BOOST_PP_WHILE */\n#\n# if 0\n#    define BOOST_PP_WHILE(pred, op, state)\n# endif\n#\n# define BOOST_PP_WHILE BOOST_PP_CAT(BOOST_PP_WHILE_, BOOST_PP_AUTO_REC(BOOST_PP_WHILE_P, 256))\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_WHILE_P(n) BOOST_PP_BITAND(BOOST_PP_CAT(BOOST_PP_WHILE_CHECK_, BOOST_PP_WHILE_ ## n(BOOST_PP_WHILE_F, BOOST_PP_NIL, BOOST_PP_NIL)), BOOST_PP_BITAND(BOOST_PP_CAT(BOOST_PP_LIST_FOLD_LEFT_CHECK_, BOOST_PP_LIST_FOLD_LEFT_ ## n(BOOST_PP_NIL, BOOST_PP_NIL, BOOST_PP_NIL)), BOOST_PP_CAT(BOOST_PP_LIST_FOLD_RIGHT_CHECK_, BOOST_PP_LIST_FOLD_RIGHT_ ## n(BOOST_PP_NIL, BOOST_PP_NIL, BOOST_PP_NIL))))\n# else\n#    define BOOST_PP_WHILE_P(n) BOOST_PP_BITAND(BOOST_PP_CAT(BOOST_PP_WHILE_CHECK_, BOOST_PP_WHILE_ ## n(BOOST_PP_WHILE_F, BOOST_PP_NIL, BOOST_PP_NIL)), BOOST_PP_CAT(BOOST_PP_LIST_FOLD_LEFT_CHECK_, BOOST_PP_LIST_FOLD_LEFT_ ## n(BOOST_PP_NIL, BOOST_PP_NIL, BOOST_PP_NIL)))\n# endif\n#\n# define BOOST_PP_WHILE_F(d, _) 0\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    include <boost/preprocessor/control/detail/edg/while.hpp>\n# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    include <boost/preprocessor/control/detail/msvc/while.hpp>\n# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()\n#    include <boost/preprocessor/control/detail/dmc/while.hpp>\n# else\n#    include <boost/preprocessor/control/detail/while.hpp>\n# endif\n#\n# define BOOST_PP_WHILE_257(p, o, s) BOOST_PP_ERROR(0x0001)\n#\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_NIL 1\n#\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_1(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_2(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_3(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_4(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_5(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_6(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_7(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_8(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_9(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_10(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_11(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_12(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_13(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_14(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_15(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_16(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_17(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_18(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_19(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_20(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_21(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_22(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_23(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_24(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_25(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_26(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_27(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_28(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_29(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_30(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_31(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_32(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_33(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_34(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_35(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_36(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_37(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_38(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_39(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_40(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_41(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_42(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_43(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_44(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_45(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_46(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_47(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_48(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_49(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_50(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_51(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_52(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_53(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_54(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_55(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_56(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_57(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_58(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_59(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_60(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_61(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_62(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_63(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_64(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_65(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_66(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_67(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_68(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_69(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_70(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_71(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_72(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_73(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_74(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_75(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_76(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_77(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_78(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_79(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_80(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_81(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_82(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_83(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_84(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_85(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_86(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_87(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_88(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_89(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_90(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_91(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_92(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_93(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_94(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_95(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_96(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_97(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_98(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_99(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_100(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_101(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_102(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_103(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_104(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_105(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_106(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_107(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_108(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_109(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_110(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_111(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_112(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_113(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_114(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_115(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_116(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_117(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_118(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_119(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_120(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_121(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_122(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_123(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_124(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_125(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_126(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_127(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_128(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_129(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_130(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_131(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_132(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_133(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_134(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_135(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_136(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_137(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_138(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_139(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_140(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_141(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_142(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_143(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_144(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_145(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_146(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_147(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_148(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_149(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_150(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_151(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_152(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_153(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_154(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_155(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_156(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_157(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_158(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_159(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_160(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_161(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_162(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_163(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_164(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_165(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_166(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_167(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_168(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_169(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_170(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_171(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_172(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_173(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_174(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_175(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_176(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_177(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_178(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_179(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_180(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_181(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_182(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_183(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_184(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_185(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_186(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_187(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_188(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_189(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_190(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_191(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_192(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_193(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_194(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_195(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_196(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_197(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_198(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_199(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_200(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_201(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_202(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_203(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_204(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_205(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_206(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_207(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_208(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_209(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_210(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_211(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_212(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_213(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_214(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_215(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_216(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_217(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_218(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_219(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_220(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_221(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_222(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_223(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_224(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_225(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_226(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_227(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_228(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_229(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_230(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_231(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_232(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_233(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_234(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_235(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_236(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_237(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_238(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_239(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_240(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_241(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_242(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_243(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_244(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_245(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_246(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_247(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_248(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_249(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_250(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_251(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_252(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_253(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_254(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_255(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_256(p, o, s) 0\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/debug/error.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_DEBUG_ERROR_HPP\n# define BOOST_PREPROCESSOR_DEBUG_ERROR_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_ERROR */\n#\n# if BOOST_PP_CONFIG_ERRORS\n#    define BOOST_PP_ERROR(code) BOOST_PP_CAT(BOOST_PP_ERROR_, code)\n# endif\n#\n# define BOOST_PP_ERROR_0x0000 BOOST_PP_ERROR(0x0000, BOOST_PP_INDEX_OUT_OF_BOUNDS)\n# define BOOST_PP_ERROR_0x0001 BOOST_PP_ERROR(0x0001, BOOST_PP_WHILE_OVERFLOW)\n# define BOOST_PP_ERROR_0x0002 BOOST_PP_ERROR(0x0002, BOOST_PP_FOR_OVERFLOW)\n# define BOOST_PP_ERROR_0x0003 BOOST_PP_ERROR(0x0003, BOOST_PP_REPEAT_OVERFLOW)\n# define BOOST_PP_ERROR_0x0004 BOOST_PP_ERROR(0x0004, BOOST_PP_LIST_FOLD_OVERFLOW)\n# define BOOST_PP_ERROR_0x0005 BOOST_PP_ERROR(0x0005, BOOST_PP_SEQ_FOLD_OVERFLOW)\n# define BOOST_PP_ERROR_0x0006 BOOST_PP_ERROR(0x0006, BOOST_PP_ARITHMETIC_OVERFLOW)\n# define BOOST_PP_ERROR_0x0007 BOOST_PP_ERROR(0x0007, BOOST_PP_DIVISION_BY_ZERO)\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/dec.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_DEC_HPP\n# define BOOST_PREPROCESSOR_DEC_HPP\n#\n# include <boost/preprocessor/arithmetic/dec.hpp>\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/detail/auto_rec.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()\n#     include <boost/preprocessor/detail/dmc/auto_rec.hpp>\n# else\n#\n# ifndef BOOST_PREPROCESSOR_DETAIL_AUTO_REC_HPP\n# define BOOST_PREPROCESSOR_DETAIL_AUTO_REC_HPP\n#\n# include <boost/preprocessor/control/iif.hpp>\n#\n# /* BOOST_PP_AUTO_REC */\n#\n# define BOOST_PP_AUTO_REC(pred, n) BOOST_PP_NODE_ENTRY_ ## n(pred)\n#\n# define BOOST_PP_NODE_ENTRY_256(p) BOOST_PP_NODE_128(p)(p)(p)(p)(p)(p)(p)(p)\n# define BOOST_PP_NODE_ENTRY_128(p) BOOST_PP_NODE_64(p)(p)(p)(p)(p)(p)(p)\n# define BOOST_PP_NODE_ENTRY_64(p) BOOST_PP_NODE_32(p)(p)(p)(p)(p)(p)\n# define BOOST_PP_NODE_ENTRY_32(p) BOOST_PP_NODE_16(p)(p)(p)(p)(p)\n# define BOOST_PP_NODE_ENTRY_16(p) BOOST_PP_NODE_8(p)(p)(p)(p)\n# define BOOST_PP_NODE_ENTRY_8(p) BOOST_PP_NODE_4(p)(p)(p)\n# define BOOST_PP_NODE_ENTRY_4(p) BOOST_PP_NODE_2(p)(p)\n# define BOOST_PP_NODE_ENTRY_2(p) BOOST_PP_NODE_1(p)\n#\n# define BOOST_PP_NODE_128(p) BOOST_PP_IIF(p(128), BOOST_PP_NODE_64, BOOST_PP_NODE_192)\n#    define BOOST_PP_NODE_64(p) BOOST_PP_IIF(p(64), BOOST_PP_NODE_32, BOOST_PP_NODE_96)\n#        define BOOST_PP_NODE_32(p) BOOST_PP_IIF(p(32), BOOST_PP_NODE_16, BOOST_PP_NODE_48)\n#            define BOOST_PP_NODE_16(p) BOOST_PP_IIF(p(16), BOOST_PP_NODE_8, BOOST_PP_NODE_24)\n#                define BOOST_PP_NODE_8(p) BOOST_PP_IIF(p(8), BOOST_PP_NODE_4, BOOST_PP_NODE_12)\n#                    define BOOST_PP_NODE_4(p) BOOST_PP_IIF(p(4), BOOST_PP_NODE_2, BOOST_PP_NODE_6)\n#                        define BOOST_PP_NODE_2(p) BOOST_PP_IIF(p(2), BOOST_PP_NODE_1, BOOST_PP_NODE_3)\n#                            define BOOST_PP_NODE_1(p) BOOST_PP_IIF(p(1), 1, 2)\n#                            define BOOST_PP_NODE_3(p) BOOST_PP_IIF(p(3), 3, 4)\n#                        define BOOST_PP_NODE_6(p) BOOST_PP_IIF(p(6), BOOST_PP_NODE_5, BOOST_PP_NODE_7)\n#                            define BOOST_PP_NODE_5(p) BOOST_PP_IIF(p(5), 5, 6)\n#                            define BOOST_PP_NODE_7(p) BOOST_PP_IIF(p(7), 7, 8)\n#                    define BOOST_PP_NODE_12(p) BOOST_PP_IIF(p(12), BOOST_PP_NODE_10, BOOST_PP_NODE_14)\n#                        define BOOST_PP_NODE_10(p) BOOST_PP_IIF(p(10), BOOST_PP_NODE_9, BOOST_PP_NODE_11)\n#                            define BOOST_PP_NODE_9(p) BOOST_PP_IIF(p(9), 9, 10)\n#                            define BOOST_PP_NODE_11(p) BOOST_PP_IIF(p(11), 11, 12)\n#                        define BOOST_PP_NODE_14(p) BOOST_PP_IIF(p(14), BOOST_PP_NODE_13, BOOST_PP_NODE_15)\n#                            define BOOST_PP_NODE_13(p) BOOST_PP_IIF(p(13), 13, 14)\n#                            define BOOST_PP_NODE_15(p) BOOST_PP_IIF(p(15), 15, 16)\n#                define BOOST_PP_NODE_24(p) BOOST_PP_IIF(p(24), BOOST_PP_NODE_20, BOOST_PP_NODE_28)\n#                    define BOOST_PP_NODE_20(p) BOOST_PP_IIF(p(20), BOOST_PP_NODE_18, BOOST_PP_NODE_22)\n#                        define BOOST_PP_NODE_18(p) BOOST_PP_IIF(p(18), BOOST_PP_NODE_17, BOOST_PP_NODE_19)\n#                            define BOOST_PP_NODE_17(p) BOOST_PP_IIF(p(17), 17, 18)\n#                            define BOOST_PP_NODE_19(p) BOOST_PP_IIF(p(19), 19, 20)\n#                        define BOOST_PP_NODE_22(p) BOOST_PP_IIF(p(22), BOOST_PP_NODE_21, BOOST_PP_NODE_23)\n#                            define BOOST_PP_NODE_21(p) BOOST_PP_IIF(p(21), 21, 22)\n#                            define BOOST_PP_NODE_23(p) BOOST_PP_IIF(p(23), 23, 24)\n#                    define BOOST_PP_NODE_28(p) BOOST_PP_IIF(p(28), BOOST_PP_NODE_26, BOOST_PP_NODE_30)\n#                        define BOOST_PP_NODE_26(p) BOOST_PP_IIF(p(26), BOOST_PP_NODE_25, BOOST_PP_NODE_27)\n#                            define BOOST_PP_NODE_25(p) BOOST_PP_IIF(p(25), 25, 26)\n#                            define BOOST_PP_NODE_27(p) BOOST_PP_IIF(p(27), 27, 28)\n#                        define BOOST_PP_NODE_30(p) BOOST_PP_IIF(p(30), BOOST_PP_NODE_29, BOOST_PP_NODE_31)\n#                            define BOOST_PP_NODE_29(p) BOOST_PP_IIF(p(29), 29, 30)\n#                            define BOOST_PP_NODE_31(p) BOOST_PP_IIF(p(31), 31, 32)\n#            define BOOST_PP_NODE_48(p) BOOST_PP_IIF(p(48), BOOST_PP_NODE_40, BOOST_PP_NODE_56)\n#                define BOOST_PP_NODE_40(p) BOOST_PP_IIF(p(40), BOOST_PP_NODE_36, BOOST_PP_NODE_44)\n#                    define BOOST_PP_NODE_36(p) BOOST_PP_IIF(p(36), BOOST_PP_NODE_34, BOOST_PP_NODE_38)\n#                        define BOOST_PP_NODE_34(p) BOOST_PP_IIF(p(34), BOOST_PP_NODE_33, BOOST_PP_NODE_35)\n#                            define BOOST_PP_NODE_33(p) BOOST_PP_IIF(p(33), 33, 34)\n#                            define BOOST_PP_NODE_35(p) BOOST_PP_IIF(p(35), 35, 36)\n#                        define BOOST_PP_NODE_38(p) BOOST_PP_IIF(p(38), BOOST_PP_NODE_37, BOOST_PP_NODE_39)\n#                            define BOOST_PP_NODE_37(p) BOOST_PP_IIF(p(37), 37, 38)\n#                            define BOOST_PP_NODE_39(p) BOOST_PP_IIF(p(39), 39, 40)\n#                    define BOOST_PP_NODE_44(p) BOOST_PP_IIF(p(44), BOOST_PP_NODE_42, BOOST_PP_NODE_46)\n#                        define BOOST_PP_NODE_42(p) BOOST_PP_IIF(p(42), BOOST_PP_NODE_41, BOOST_PP_NODE_43)\n#                            define BOOST_PP_NODE_41(p) BOOST_PP_IIF(p(41), 41, 42)\n#                            define BOOST_PP_NODE_43(p) BOOST_PP_IIF(p(43), 43, 44)\n#                        define BOOST_PP_NODE_46(p) BOOST_PP_IIF(p(46), BOOST_PP_NODE_45, BOOST_PP_NODE_47)\n#                            define BOOST_PP_NODE_45(p) BOOST_PP_IIF(p(45), 45, 46)\n#                            define BOOST_PP_NODE_47(p) BOOST_PP_IIF(p(47), 47, 48)\n#                define BOOST_PP_NODE_56(p) BOOST_PP_IIF(p(56), BOOST_PP_NODE_52, BOOST_PP_NODE_60)\n#                    define BOOST_PP_NODE_52(p) BOOST_PP_IIF(p(52), BOOST_PP_NODE_50, BOOST_PP_NODE_54)\n#                        define BOOST_PP_NODE_50(p) BOOST_PP_IIF(p(50), BOOST_PP_NODE_49, BOOST_PP_NODE_51)\n#                            define BOOST_PP_NODE_49(p) BOOST_PP_IIF(p(49), 49, 50)\n#                            define BOOST_PP_NODE_51(p) BOOST_PP_IIF(p(51), 51, 52)\n#                        define BOOST_PP_NODE_54(p) BOOST_PP_IIF(p(54), BOOST_PP_NODE_53, BOOST_PP_NODE_55)\n#                            define BOOST_PP_NODE_53(p) BOOST_PP_IIF(p(53), 53, 54)\n#                            define BOOST_PP_NODE_55(p) BOOST_PP_IIF(p(55), 55, 56)\n#                    define BOOST_PP_NODE_60(p) BOOST_PP_IIF(p(60), BOOST_PP_NODE_58, BOOST_PP_NODE_62)\n#                        define BOOST_PP_NODE_58(p) BOOST_PP_IIF(p(58), BOOST_PP_NODE_57, BOOST_PP_NODE_59)\n#                            define BOOST_PP_NODE_57(p) BOOST_PP_IIF(p(57), 57, 58)\n#                            define BOOST_PP_NODE_59(p) BOOST_PP_IIF(p(59), 59, 60)\n#                        define BOOST_PP_NODE_62(p) BOOST_PP_IIF(p(62), BOOST_PP_NODE_61, BOOST_PP_NODE_63)\n#                            define BOOST_PP_NODE_61(p) BOOST_PP_IIF(p(61), 61, 62)\n#                            define BOOST_PP_NODE_63(p) BOOST_PP_IIF(p(63), 63, 64)\n#        define BOOST_PP_NODE_96(p) BOOST_PP_IIF(p(96), BOOST_PP_NODE_80, BOOST_PP_NODE_112)\n#            define BOOST_PP_NODE_80(p) BOOST_PP_IIF(p(80), BOOST_PP_NODE_72, BOOST_PP_NODE_88)\n#                define BOOST_PP_NODE_72(p) BOOST_PP_IIF(p(72), BOOST_PP_NODE_68, BOOST_PP_NODE_76)\n#                    define BOOST_PP_NODE_68(p) BOOST_PP_IIF(p(68), BOOST_PP_NODE_66, BOOST_PP_NODE_70)\n#                        define BOOST_PP_NODE_66(p) BOOST_PP_IIF(p(66), BOOST_PP_NODE_65, BOOST_PP_NODE_67)\n#                            define BOOST_PP_NODE_65(p) BOOST_PP_IIF(p(65), 65, 66)\n#                            define BOOST_PP_NODE_67(p) BOOST_PP_IIF(p(67), 67, 68)\n#                        define BOOST_PP_NODE_70(p) BOOST_PP_IIF(p(70), BOOST_PP_NODE_69, BOOST_PP_NODE_71)\n#                            define BOOST_PP_NODE_69(p) BOOST_PP_IIF(p(69), 69, 70)\n#                            define BOOST_PP_NODE_71(p) BOOST_PP_IIF(p(71), 71, 72)\n#                    define BOOST_PP_NODE_76(p) BOOST_PP_IIF(p(76), BOOST_PP_NODE_74, BOOST_PP_NODE_78)\n#                        define BOOST_PP_NODE_74(p) BOOST_PP_IIF(p(74), BOOST_PP_NODE_73, BOOST_PP_NODE_75)\n#                            define BOOST_PP_NODE_73(p) BOOST_PP_IIF(p(73), 73, 74)\n#                            define BOOST_PP_NODE_75(p) BOOST_PP_IIF(p(75), 75, 76)\n#                        define BOOST_PP_NODE_78(p) BOOST_PP_IIF(p(78), BOOST_PP_NODE_77, BOOST_PP_NODE_79)\n#                            define BOOST_PP_NODE_77(p) BOOST_PP_IIF(p(77), 77, 78)\n#                            define BOOST_PP_NODE_79(p) BOOST_PP_IIF(p(79), 79, 80)\n#                define BOOST_PP_NODE_88(p) BOOST_PP_IIF(p(88), BOOST_PP_NODE_84, BOOST_PP_NODE_92)\n#                    define BOOST_PP_NODE_84(p) BOOST_PP_IIF(p(84), BOOST_PP_NODE_82, BOOST_PP_NODE_86)\n#                        define BOOST_PP_NODE_82(p) BOOST_PP_IIF(p(82), BOOST_PP_NODE_81, BOOST_PP_NODE_83)\n#                            define BOOST_PP_NODE_81(p) BOOST_PP_IIF(p(81), 81, 82)\n#                            define BOOST_PP_NODE_83(p) BOOST_PP_IIF(p(83), 83, 84)\n#                        define BOOST_PP_NODE_86(p) BOOST_PP_IIF(p(86), BOOST_PP_NODE_85, BOOST_PP_NODE_87)\n#                            define BOOST_PP_NODE_85(p) BOOST_PP_IIF(p(85), 85, 86)\n#                            define BOOST_PP_NODE_87(p) BOOST_PP_IIF(p(87), 87, 88)\n#                    define BOOST_PP_NODE_92(p) BOOST_PP_IIF(p(92), BOOST_PP_NODE_90, BOOST_PP_NODE_94)\n#                        define BOOST_PP_NODE_90(p) BOOST_PP_IIF(p(90), BOOST_PP_NODE_89, BOOST_PP_NODE_91)\n#                            define BOOST_PP_NODE_89(p) BOOST_PP_IIF(p(89), 89, 90)\n#                            define BOOST_PP_NODE_91(p) BOOST_PP_IIF(p(91), 91, 92)\n#                        define BOOST_PP_NODE_94(p) BOOST_PP_IIF(p(94), BOOST_PP_NODE_93, BOOST_PP_NODE_95)\n#                            define BOOST_PP_NODE_93(p) BOOST_PP_IIF(p(93), 93, 94)\n#                            define BOOST_PP_NODE_95(p) BOOST_PP_IIF(p(95), 95, 96)\n#            define BOOST_PP_NODE_112(p) BOOST_PP_IIF(p(112), BOOST_PP_NODE_104, BOOST_PP_NODE_120)\n#                define BOOST_PP_NODE_104(p) BOOST_PP_IIF(p(104), BOOST_PP_NODE_100, BOOST_PP_NODE_108)\n#                    define BOOST_PP_NODE_100(p) BOOST_PP_IIF(p(100), BOOST_PP_NODE_98, BOOST_PP_NODE_102)\n#                        define BOOST_PP_NODE_98(p) BOOST_PP_IIF(p(98), BOOST_PP_NODE_97, BOOST_PP_NODE_99)\n#                            define BOOST_PP_NODE_97(p) BOOST_PP_IIF(p(97), 97, 98)\n#                            define BOOST_PP_NODE_99(p) BOOST_PP_IIF(p(99), 99, 100)\n#                        define BOOST_PP_NODE_102(p) BOOST_PP_IIF(p(102), BOOST_PP_NODE_101, BOOST_PP_NODE_103)\n#                            define BOOST_PP_NODE_101(p) BOOST_PP_IIF(p(101), 101, 102)\n#                            define BOOST_PP_NODE_103(p) BOOST_PP_IIF(p(103), 103, 104)\n#                    define BOOST_PP_NODE_108(p) BOOST_PP_IIF(p(108), BOOST_PP_NODE_106, BOOST_PP_NODE_110)\n#                        define BOOST_PP_NODE_106(p) BOOST_PP_IIF(p(106), BOOST_PP_NODE_105, BOOST_PP_NODE_107)\n#                            define BOOST_PP_NODE_105(p) BOOST_PP_IIF(p(105), 105, 106)\n#                            define BOOST_PP_NODE_107(p) BOOST_PP_IIF(p(107), 107, 108)\n#                        define BOOST_PP_NODE_110(p) BOOST_PP_IIF(p(110), BOOST_PP_NODE_109, BOOST_PP_NODE_111)\n#                            define BOOST_PP_NODE_109(p) BOOST_PP_IIF(p(109), 109, 110)\n#                            define BOOST_PP_NODE_111(p) BOOST_PP_IIF(p(111), 111, 112)\n#                define BOOST_PP_NODE_120(p) BOOST_PP_IIF(p(120), BOOST_PP_NODE_116, BOOST_PP_NODE_124)\n#                    define BOOST_PP_NODE_116(p) BOOST_PP_IIF(p(116), BOOST_PP_NODE_114, BOOST_PP_NODE_118)\n#                        define BOOST_PP_NODE_114(p) BOOST_PP_IIF(p(114), BOOST_PP_NODE_113, BOOST_PP_NODE_115)\n#                            define BOOST_PP_NODE_113(p) BOOST_PP_IIF(p(113), 113, 114)\n#                            define BOOST_PP_NODE_115(p) BOOST_PP_IIF(p(115), 115, 116)\n#                        define BOOST_PP_NODE_118(p) BOOST_PP_IIF(p(118), BOOST_PP_NODE_117, BOOST_PP_NODE_119)\n#                            define BOOST_PP_NODE_117(p) BOOST_PP_IIF(p(117), 117, 118)\n#                            define BOOST_PP_NODE_119(p) BOOST_PP_IIF(p(119), 119, 120)\n#                    define BOOST_PP_NODE_124(p) BOOST_PP_IIF(p(124), BOOST_PP_NODE_122, BOOST_PP_NODE_126)\n#                        define BOOST_PP_NODE_122(p) BOOST_PP_IIF(p(122), BOOST_PP_NODE_121, BOOST_PP_NODE_123)\n#                            define BOOST_PP_NODE_121(p) BOOST_PP_IIF(p(121), 121, 122)\n#                            define BOOST_PP_NODE_123(p) BOOST_PP_IIF(p(123), 123, 124)\n#                        define BOOST_PP_NODE_126(p) BOOST_PP_IIF(p(126), BOOST_PP_NODE_125, BOOST_PP_NODE_127)\n#                            define BOOST_PP_NODE_125(p) BOOST_PP_IIF(p(125), 125, 126)\n#                            define BOOST_PP_NODE_127(p) BOOST_PP_IIF(p(127), 127, 128)\n#    define BOOST_PP_NODE_192(p) BOOST_PP_IIF(p(192), BOOST_PP_NODE_160, BOOST_PP_NODE_224)\n#        define BOOST_PP_NODE_160(p) BOOST_PP_IIF(p(160), BOOST_PP_NODE_144, BOOST_PP_NODE_176)\n#            define BOOST_PP_NODE_144(p) BOOST_PP_IIF(p(144), BOOST_PP_NODE_136, BOOST_PP_NODE_152)\n#                define BOOST_PP_NODE_136(p) BOOST_PP_IIF(p(136), BOOST_PP_NODE_132, BOOST_PP_NODE_140)\n#                    define BOOST_PP_NODE_132(p) BOOST_PP_IIF(p(132), BOOST_PP_NODE_130, BOOST_PP_NODE_134)\n#                        define BOOST_PP_NODE_130(p) BOOST_PP_IIF(p(130), BOOST_PP_NODE_129, BOOST_PP_NODE_131)\n#                            define BOOST_PP_NODE_129(p) BOOST_PP_IIF(p(129), 129, 130)\n#                            define BOOST_PP_NODE_131(p) BOOST_PP_IIF(p(131), 131, 132)\n#                        define BOOST_PP_NODE_134(p) BOOST_PP_IIF(p(134), BOOST_PP_NODE_133, BOOST_PP_NODE_135)\n#                            define BOOST_PP_NODE_133(p) BOOST_PP_IIF(p(133), 133, 134)\n#                            define BOOST_PP_NODE_135(p) BOOST_PP_IIF(p(135), 135, 136)\n#                    define BOOST_PP_NODE_140(p) BOOST_PP_IIF(p(140), BOOST_PP_NODE_138, BOOST_PP_NODE_142)\n#                        define BOOST_PP_NODE_138(p) BOOST_PP_IIF(p(138), BOOST_PP_NODE_137, BOOST_PP_NODE_139)\n#                            define BOOST_PP_NODE_137(p) BOOST_PP_IIF(p(137), 137, 138)\n#                            define BOOST_PP_NODE_139(p) BOOST_PP_IIF(p(139), 139, 140)\n#                        define BOOST_PP_NODE_142(p) BOOST_PP_IIF(p(142), BOOST_PP_NODE_141, BOOST_PP_NODE_143)\n#                            define BOOST_PP_NODE_141(p) BOOST_PP_IIF(p(141), 141, 142)\n#                            define BOOST_PP_NODE_143(p) BOOST_PP_IIF(p(143), 143, 144)\n#                define BOOST_PP_NODE_152(p) BOOST_PP_IIF(p(152), BOOST_PP_NODE_148, BOOST_PP_NODE_156)\n#                    define BOOST_PP_NODE_148(p) BOOST_PP_IIF(p(148), BOOST_PP_NODE_146, BOOST_PP_NODE_150)\n#                        define BOOST_PP_NODE_146(p) BOOST_PP_IIF(p(146), BOOST_PP_NODE_145, BOOST_PP_NODE_147)\n#                            define BOOST_PP_NODE_145(p) BOOST_PP_IIF(p(145), 145, 146)\n#                            define BOOST_PP_NODE_147(p) BOOST_PP_IIF(p(147), 147, 148)\n#                        define BOOST_PP_NODE_150(p) BOOST_PP_IIF(p(150), BOOST_PP_NODE_149, BOOST_PP_NODE_151)\n#                            define BOOST_PP_NODE_149(p) BOOST_PP_IIF(p(149), 149, 150)\n#                            define BOOST_PP_NODE_151(p) BOOST_PP_IIF(p(151), 151, 152)\n#                    define BOOST_PP_NODE_156(p) BOOST_PP_IIF(p(156), BOOST_PP_NODE_154, BOOST_PP_NODE_158)\n#                        define BOOST_PP_NODE_154(p) BOOST_PP_IIF(p(154), BOOST_PP_NODE_153, BOOST_PP_NODE_155)\n#                            define BOOST_PP_NODE_153(p) BOOST_PP_IIF(p(153), 153, 154)\n#                            define BOOST_PP_NODE_155(p) BOOST_PP_IIF(p(155), 155, 156)\n#                        define BOOST_PP_NODE_158(p) BOOST_PP_IIF(p(158), BOOST_PP_NODE_157, BOOST_PP_NODE_159)\n#                            define BOOST_PP_NODE_157(p) BOOST_PP_IIF(p(157), 157, 158)\n#                            define BOOST_PP_NODE_159(p) BOOST_PP_IIF(p(159), 159, 160)\n#            define BOOST_PP_NODE_176(p) BOOST_PP_IIF(p(176), BOOST_PP_NODE_168, BOOST_PP_NODE_184)\n#                define BOOST_PP_NODE_168(p) BOOST_PP_IIF(p(168), BOOST_PP_NODE_164, BOOST_PP_NODE_172)\n#                    define BOOST_PP_NODE_164(p) BOOST_PP_IIF(p(164), BOOST_PP_NODE_162, BOOST_PP_NODE_166)\n#                        define BOOST_PP_NODE_162(p) BOOST_PP_IIF(p(162), BOOST_PP_NODE_161, BOOST_PP_NODE_163)\n#                            define BOOST_PP_NODE_161(p) BOOST_PP_IIF(p(161), 161, 162)\n#                            define BOOST_PP_NODE_163(p) BOOST_PP_IIF(p(163), 163, 164)\n#                        define BOOST_PP_NODE_166(p) BOOST_PP_IIF(p(166), BOOST_PP_NODE_165, BOOST_PP_NODE_167)\n#                            define BOOST_PP_NODE_165(p) BOOST_PP_IIF(p(165), 165, 166)\n#                            define BOOST_PP_NODE_167(p) BOOST_PP_IIF(p(167), 167, 168)\n#                    define BOOST_PP_NODE_172(p) BOOST_PP_IIF(p(172), BOOST_PP_NODE_170, BOOST_PP_NODE_174)\n#                        define BOOST_PP_NODE_170(p) BOOST_PP_IIF(p(170), BOOST_PP_NODE_169, BOOST_PP_NODE_171)\n#                            define BOOST_PP_NODE_169(p) BOOST_PP_IIF(p(169), 169, 170)\n#                            define BOOST_PP_NODE_171(p) BOOST_PP_IIF(p(171), 171, 172)\n#                        define BOOST_PP_NODE_174(p) BOOST_PP_IIF(p(174), BOOST_PP_NODE_173, BOOST_PP_NODE_175)\n#                            define BOOST_PP_NODE_173(p) BOOST_PP_IIF(p(173), 173, 174)\n#                            define BOOST_PP_NODE_175(p) BOOST_PP_IIF(p(175), 175, 176)\n#                define BOOST_PP_NODE_184(p) BOOST_PP_IIF(p(184), BOOST_PP_NODE_180, BOOST_PP_NODE_188)\n#                    define BOOST_PP_NODE_180(p) BOOST_PP_IIF(p(180), BOOST_PP_NODE_178, BOOST_PP_NODE_182)\n#                        define BOOST_PP_NODE_178(p) BOOST_PP_IIF(p(178), BOOST_PP_NODE_177, BOOST_PP_NODE_179)\n#                            define BOOST_PP_NODE_177(p) BOOST_PP_IIF(p(177), 177, 178)\n#                            define BOOST_PP_NODE_179(p) BOOST_PP_IIF(p(179), 179, 180)\n#                        define BOOST_PP_NODE_182(p) BOOST_PP_IIF(p(182), BOOST_PP_NODE_181, BOOST_PP_NODE_183)\n#                            define BOOST_PP_NODE_181(p) BOOST_PP_IIF(p(181), 181, 182)\n#                            define BOOST_PP_NODE_183(p) BOOST_PP_IIF(p(183), 183, 184)\n#                    define BOOST_PP_NODE_188(p) BOOST_PP_IIF(p(188), BOOST_PP_NODE_186, BOOST_PP_NODE_190)\n#                        define BOOST_PP_NODE_186(p) BOOST_PP_IIF(p(186), BOOST_PP_NODE_185, BOOST_PP_NODE_187)\n#                            define BOOST_PP_NODE_185(p) BOOST_PP_IIF(p(185), 185, 186)\n#                            define BOOST_PP_NODE_187(p) BOOST_PP_IIF(p(187), 187, 188)\n#                        define BOOST_PP_NODE_190(p) BOOST_PP_IIF(p(190), BOOST_PP_NODE_189, BOOST_PP_NODE_191)\n#                            define BOOST_PP_NODE_189(p) BOOST_PP_IIF(p(189), 189, 190)\n#                            define BOOST_PP_NODE_191(p) BOOST_PP_IIF(p(191), 191, 192)\n#        define BOOST_PP_NODE_224(p) BOOST_PP_IIF(p(224), BOOST_PP_NODE_208, BOOST_PP_NODE_240)\n#            define BOOST_PP_NODE_208(p) BOOST_PP_IIF(p(208), BOOST_PP_NODE_200, BOOST_PP_NODE_216)\n#                define BOOST_PP_NODE_200(p) BOOST_PP_IIF(p(200), BOOST_PP_NODE_196, BOOST_PP_NODE_204)\n#                    define BOOST_PP_NODE_196(p) BOOST_PP_IIF(p(196), BOOST_PP_NODE_194, BOOST_PP_NODE_198)\n#                        define BOOST_PP_NODE_194(p) BOOST_PP_IIF(p(194), BOOST_PP_NODE_193, BOOST_PP_NODE_195)\n#                            define BOOST_PP_NODE_193(p) BOOST_PP_IIF(p(193), 193, 194)\n#                            define BOOST_PP_NODE_195(p) BOOST_PP_IIF(p(195), 195, 196)\n#                        define BOOST_PP_NODE_198(p) BOOST_PP_IIF(p(198), BOOST_PP_NODE_197, BOOST_PP_NODE_199)\n#                            define BOOST_PP_NODE_197(p) BOOST_PP_IIF(p(197), 197, 198)\n#                            define BOOST_PP_NODE_199(p) BOOST_PP_IIF(p(199), 199, 200)\n#                    define BOOST_PP_NODE_204(p) BOOST_PP_IIF(p(204), BOOST_PP_NODE_202, BOOST_PP_NODE_206)\n#                        define BOOST_PP_NODE_202(p) BOOST_PP_IIF(p(202), BOOST_PP_NODE_201, BOOST_PP_NODE_203)\n#                            define BOOST_PP_NODE_201(p) BOOST_PP_IIF(p(201), 201, 202)\n#                            define BOOST_PP_NODE_203(p) BOOST_PP_IIF(p(203), 203, 204)\n#                        define BOOST_PP_NODE_206(p) BOOST_PP_IIF(p(206), BOOST_PP_NODE_205, BOOST_PP_NODE_207)\n#                            define BOOST_PP_NODE_205(p) BOOST_PP_IIF(p(205), 205, 206)\n#                            define BOOST_PP_NODE_207(p) BOOST_PP_IIF(p(207), 207, 208)\n#                define BOOST_PP_NODE_216(p) BOOST_PP_IIF(p(216), BOOST_PP_NODE_212, BOOST_PP_NODE_220)\n#                    define BOOST_PP_NODE_212(p) BOOST_PP_IIF(p(212), BOOST_PP_NODE_210, BOOST_PP_NODE_214)\n#                        define BOOST_PP_NODE_210(p) BOOST_PP_IIF(p(210), BOOST_PP_NODE_209, BOOST_PP_NODE_211)\n#                            define BOOST_PP_NODE_209(p) BOOST_PP_IIF(p(209), 209, 210)\n#                            define BOOST_PP_NODE_211(p) BOOST_PP_IIF(p(211), 211, 212)\n#                        define BOOST_PP_NODE_214(p) BOOST_PP_IIF(p(214), BOOST_PP_NODE_213, BOOST_PP_NODE_215)\n#                            define BOOST_PP_NODE_213(p) BOOST_PP_IIF(p(213), 213, 214)\n#                            define BOOST_PP_NODE_215(p) BOOST_PP_IIF(p(215), 215, 216)\n#                    define BOOST_PP_NODE_220(p) BOOST_PP_IIF(p(220), BOOST_PP_NODE_218, BOOST_PP_NODE_222)\n#                        define BOOST_PP_NODE_218(p) BOOST_PP_IIF(p(218), BOOST_PP_NODE_217, BOOST_PP_NODE_219)\n#                            define BOOST_PP_NODE_217(p) BOOST_PP_IIF(p(217), 217, 218)\n#                            define BOOST_PP_NODE_219(p) BOOST_PP_IIF(p(219), 219, 220)\n#                        define BOOST_PP_NODE_222(p) BOOST_PP_IIF(p(222), BOOST_PP_NODE_221, BOOST_PP_NODE_223)\n#                            define BOOST_PP_NODE_221(p) BOOST_PP_IIF(p(221), 221, 222)\n#                            define BOOST_PP_NODE_223(p) BOOST_PP_IIF(p(223), 223, 224)\n#            define BOOST_PP_NODE_240(p) BOOST_PP_IIF(p(240), BOOST_PP_NODE_232, BOOST_PP_NODE_248)\n#                define BOOST_PP_NODE_232(p) BOOST_PP_IIF(p(232), BOOST_PP_NODE_228, BOOST_PP_NODE_236)\n#                    define BOOST_PP_NODE_228(p) BOOST_PP_IIF(p(228), BOOST_PP_NODE_226, BOOST_PP_NODE_230)\n#                        define BOOST_PP_NODE_226(p) BOOST_PP_IIF(p(226), BOOST_PP_NODE_225, BOOST_PP_NODE_227)\n#                            define BOOST_PP_NODE_225(p) BOOST_PP_IIF(p(225), 225, 226)\n#                            define BOOST_PP_NODE_227(p) BOOST_PP_IIF(p(227), 227, 228)\n#                        define BOOST_PP_NODE_230(p) BOOST_PP_IIF(p(230), BOOST_PP_NODE_229, BOOST_PP_NODE_231)\n#                            define BOOST_PP_NODE_229(p) BOOST_PP_IIF(p(229), 229, 230)\n#                            define BOOST_PP_NODE_231(p) BOOST_PP_IIF(p(231), 231, 232)\n#                    define BOOST_PP_NODE_236(p) BOOST_PP_IIF(p(236), BOOST_PP_NODE_234, BOOST_PP_NODE_238)\n#                        define BOOST_PP_NODE_234(p) BOOST_PP_IIF(p(234), BOOST_PP_NODE_233, BOOST_PP_NODE_235)\n#                            define BOOST_PP_NODE_233(p) BOOST_PP_IIF(p(233), 233, 234)\n#                            define BOOST_PP_NODE_235(p) BOOST_PP_IIF(p(235), 235, 236)\n#                        define BOOST_PP_NODE_238(p) BOOST_PP_IIF(p(238), BOOST_PP_NODE_237, BOOST_PP_NODE_239)\n#                            define BOOST_PP_NODE_237(p) BOOST_PP_IIF(p(237), 237, 238)\n#                            define BOOST_PP_NODE_239(p) BOOST_PP_IIF(p(239), 239, 240)\n#                define BOOST_PP_NODE_248(p) BOOST_PP_IIF(p(248), BOOST_PP_NODE_244, BOOST_PP_NODE_252)\n#                    define BOOST_PP_NODE_244(p) BOOST_PP_IIF(p(244), BOOST_PP_NODE_242, BOOST_PP_NODE_246)\n#                        define BOOST_PP_NODE_242(p) BOOST_PP_IIF(p(242), BOOST_PP_NODE_241, BOOST_PP_NODE_243)\n#                            define BOOST_PP_NODE_241(p) BOOST_PP_IIF(p(241), 241, 242)\n#                            define BOOST_PP_NODE_243(p) BOOST_PP_IIF(p(243), 243, 244)\n#                        define BOOST_PP_NODE_246(p) BOOST_PP_IIF(p(246), BOOST_PP_NODE_245, BOOST_PP_NODE_247)\n#                            define BOOST_PP_NODE_245(p) BOOST_PP_IIF(p(245), 245, 246)\n#                            define BOOST_PP_NODE_247(p) BOOST_PP_IIF(p(247), 247, 248)\n#                    define BOOST_PP_NODE_252(p) BOOST_PP_IIF(p(252), BOOST_PP_NODE_250, BOOST_PP_NODE_254)\n#                        define BOOST_PP_NODE_250(p) BOOST_PP_IIF(p(250), BOOST_PP_NODE_249, BOOST_PP_NODE_251)\n#                            define BOOST_PP_NODE_249(p) BOOST_PP_IIF(p(249), 249, 250)\n#                            define BOOST_PP_NODE_251(p) BOOST_PP_IIF(p(251), 251, 252)\n#                        define BOOST_PP_NODE_254(p) BOOST_PP_IIF(p(254), BOOST_PP_NODE_253, BOOST_PP_NODE_255)\n#                            define BOOST_PP_NODE_253(p) BOOST_PP_IIF(p(253), 253, 254)\n#                            define BOOST_PP_NODE_255(p) BOOST_PP_IIF(p(255), 255, 256)\n#\n# endif\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/detail/check.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_DETAIL_CHECK_HPP\n# define BOOST_PREPROCESSOR_DETAIL_CHECK_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_CHECK */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_CHECK(x, type) BOOST_PP_CHECK_D(x, type)\n# else\n#    define BOOST_PP_CHECK(x, type) BOOST_PP_CHECK_OO((x, type))\n#    define BOOST_PP_CHECK_OO(par) BOOST_PP_CHECK_D ## par\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC() && ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()\n#    define BOOST_PP_CHECK_D(x, type) BOOST_PP_CHECK_1(BOOST_PP_CAT(BOOST_PP_CHECK_RESULT_, type x))\n#    define BOOST_PP_CHECK_1(chk) BOOST_PP_CHECK_2(chk)\n#    define BOOST_PP_CHECK_2(res, _) res\n# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    define BOOST_PP_CHECK_D(x, type) BOOST_PP_CHECK_1(type x)\n#    define BOOST_PP_CHECK_1(chk) BOOST_PP_CHECK_2(chk)\n#    define BOOST_PP_CHECK_2(chk) BOOST_PP_CHECK_3((BOOST_PP_CHECK_RESULT_ ## chk))\n#    define BOOST_PP_CHECK_3(im) BOOST_PP_CHECK_5(BOOST_PP_CHECK_4 im)\n#    define BOOST_PP_CHECK_4(res, _) res\n#    define BOOST_PP_CHECK_5(res) res\n# else /* DMC */\n#    define BOOST_PP_CHECK_D(x, type) BOOST_PP_CHECK_OO((type x))\n#    define BOOST_PP_CHECK_OO(par) BOOST_PP_CHECK_0 ## par\n#    define BOOST_PP_CHECK_0(chk) BOOST_PP_CHECK_1(BOOST_PP_CAT(BOOST_PP_CHECK_RESULT_, chk))\n#    define BOOST_PP_CHECK_1(chk) BOOST_PP_CHECK_2(chk)\n#    define BOOST_PP_CHECK_2(res, _) res\n# endif\n#\n# define BOOST_PP_CHECK_RESULT_1 1, BOOST_PP_NIL\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/detail/dmc/auto_rec.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_DETAIL_AUTO_REC_HPP\n# define BOOST_PREPROCESSOR_DETAIL_AUTO_REC_HPP\n#\n# include <boost/preprocessor/control/iif.hpp>\n#\n# /* BOOST_PP_AUTO_REC */\n#\n# define BOOST_PP_AUTO_REC(pred, n) BOOST_PP_NODE_ENTRY_ ## n(pred)\n#\n# define BOOST_PP_NODE_ENTRY_256(p) BOOST_PP_NODE_128(p)(p)(p)(p)(p)(p)(p)(p)\n# define BOOST_PP_NODE_ENTRY_128(p) BOOST_PP_NODE_64(p)(p)(p)(p)(p)(p)(p)\n# define BOOST_PP_NODE_ENTRY_64(p) BOOST_PP_NODE_32(p)(p)(p)(p)(p)(p)\n# define BOOST_PP_NODE_ENTRY_32(p) BOOST_PP_NODE_16(p)(p)(p)(p)(p)\n# define BOOST_PP_NODE_ENTRY_16(p) BOOST_PP_NODE_8(p)(p)(p)(p)\n# define BOOST_PP_NODE_ENTRY_8(p) BOOST_PP_NODE_4(p)(p)(p)\n# define BOOST_PP_NODE_ENTRY_4(p) BOOST_PP_NODE_2(p)(p)\n# define BOOST_PP_NODE_ENTRY_2(p) BOOST_PP_NODE_1(p)\n#\n# define BOOST_PP_NODE_128(p) BOOST_PP_IIF(p##(128), BOOST_PP_NODE_64, BOOST_PP_NODE_192)\n#    define BOOST_PP_NODE_64(p) BOOST_PP_IIF(p##(64), BOOST_PP_NODE_32, BOOST_PP_NODE_96)\n#        define BOOST_PP_NODE_32(p) BOOST_PP_IIF(p##(32), BOOST_PP_NODE_16, BOOST_PP_NODE_48)\n#            define BOOST_PP_NODE_16(p) BOOST_PP_IIF(p##(16), BOOST_PP_NODE_8, BOOST_PP_NODE_24)\n#                define BOOST_PP_NODE_8(p) BOOST_PP_IIF(p##(8), BOOST_PP_NODE_4, BOOST_PP_NODE_12)\n#                    define BOOST_PP_NODE_4(p) BOOST_PP_IIF(p##(4), BOOST_PP_NODE_2, BOOST_PP_NODE_6)\n#                        define BOOST_PP_NODE_2(p) BOOST_PP_IIF(p##(2), BOOST_PP_NODE_1, BOOST_PP_NODE_3)\n#                            define BOOST_PP_NODE_1(p) BOOST_PP_IIF(p##(1), 1, 2)\n#                            define BOOST_PP_NODE_3(p) BOOST_PP_IIF(p##(3), 3, 4)\n#                        define BOOST_PP_NODE_6(p) BOOST_PP_IIF(p##(6), BOOST_PP_NODE_5, BOOST_PP_NODE_7)\n#                            define BOOST_PP_NODE_5(p) BOOST_PP_IIF(p##(5), 5, 6)\n#                            define BOOST_PP_NODE_7(p) BOOST_PP_IIF(p##(7), 7, 8)\n#                    define BOOST_PP_NODE_12(p) BOOST_PP_IIF(p##(12), BOOST_PP_NODE_10, BOOST_PP_NODE_14)\n#                        define BOOST_PP_NODE_10(p) BOOST_PP_IIF(p##(10), BOOST_PP_NODE_9, BOOST_PP_NODE_11)\n#                            define BOOST_PP_NODE_9(p) BOOST_PP_IIF(p##(9), 9, 10)\n#                            define BOOST_PP_NODE_11(p) BOOST_PP_IIF(p##(11), 11, 12)\n#                        define BOOST_PP_NODE_14(p) BOOST_PP_IIF(p##(14), BOOST_PP_NODE_13, BOOST_PP_NODE_15)\n#                            define BOOST_PP_NODE_13(p) BOOST_PP_IIF(p##(13), 13, 14)\n#                            define BOOST_PP_NODE_15(p) BOOST_PP_IIF(p##(15), 15, 16)\n#                define BOOST_PP_NODE_24(p) BOOST_PP_IIF(p##(24), BOOST_PP_NODE_20, BOOST_PP_NODE_28)\n#                    define BOOST_PP_NODE_20(p) BOOST_PP_IIF(p##(20), BOOST_PP_NODE_18, BOOST_PP_NODE_22)\n#                        define BOOST_PP_NODE_18(p) BOOST_PP_IIF(p##(18), BOOST_PP_NODE_17, BOOST_PP_NODE_19)\n#                            define BOOST_PP_NODE_17(p) BOOST_PP_IIF(p##(17), 17, 18)\n#                            define BOOST_PP_NODE_19(p) BOOST_PP_IIF(p##(19), 19, 20)\n#                        define BOOST_PP_NODE_22(p) BOOST_PP_IIF(p##(22), BOOST_PP_NODE_21, BOOST_PP_NODE_23)\n#                            define BOOST_PP_NODE_21(p) BOOST_PP_IIF(p##(21), 21, 22)\n#                            define BOOST_PP_NODE_23(p) BOOST_PP_IIF(p##(23), 23, 24)\n#                    define BOOST_PP_NODE_28(p) BOOST_PP_IIF(p##(28), BOOST_PP_NODE_26, BOOST_PP_NODE_30)\n#                        define BOOST_PP_NODE_26(p) BOOST_PP_IIF(p##(26), BOOST_PP_NODE_25, BOOST_PP_NODE_27)\n#                            define BOOST_PP_NODE_25(p) BOOST_PP_IIF(p##(25), 25, 26)\n#                            define BOOST_PP_NODE_27(p) BOOST_PP_IIF(p##(27), 27, 28)\n#                        define BOOST_PP_NODE_30(p) BOOST_PP_IIF(p##(30), BOOST_PP_NODE_29, BOOST_PP_NODE_31)\n#                            define BOOST_PP_NODE_29(p) BOOST_PP_IIF(p##(29), 29, 30)\n#                            define BOOST_PP_NODE_31(p) BOOST_PP_IIF(p##(31), 31, 32)\n#            define BOOST_PP_NODE_48(p) BOOST_PP_IIF(p##(48), BOOST_PP_NODE_40, BOOST_PP_NODE_56)\n#                define BOOST_PP_NODE_40(p) BOOST_PP_IIF(p##(40), BOOST_PP_NODE_36, BOOST_PP_NODE_44)\n#                    define BOOST_PP_NODE_36(p) BOOST_PP_IIF(p##(36), BOOST_PP_NODE_34, BOOST_PP_NODE_38)\n#                        define BOOST_PP_NODE_34(p) BOOST_PP_IIF(p##(34), BOOST_PP_NODE_33, BOOST_PP_NODE_35)\n#                            define BOOST_PP_NODE_33(p) BOOST_PP_IIF(p##(33), 33, 34)\n#                            define BOOST_PP_NODE_35(p) BOOST_PP_IIF(p##(35), 35, 36)\n#                        define BOOST_PP_NODE_38(p) BOOST_PP_IIF(p##(38), BOOST_PP_NODE_37, BOOST_PP_NODE_39)\n#                            define BOOST_PP_NODE_37(p) BOOST_PP_IIF(p##(37), 37, 38)\n#                            define BOOST_PP_NODE_39(p) BOOST_PP_IIF(p##(39), 39, 40)\n#                    define BOOST_PP_NODE_44(p) BOOST_PP_IIF(p##(44), BOOST_PP_NODE_42, BOOST_PP_NODE_46)\n#                        define BOOST_PP_NODE_42(p) BOOST_PP_IIF(p##(42), BOOST_PP_NODE_41, BOOST_PP_NODE_43)\n#                            define BOOST_PP_NODE_41(p) BOOST_PP_IIF(p##(41), 41, 42)\n#                            define BOOST_PP_NODE_43(p) BOOST_PP_IIF(p##(43), 43, 44)\n#                        define BOOST_PP_NODE_46(p) BOOST_PP_IIF(p##(46), BOOST_PP_NODE_45, BOOST_PP_NODE_47)\n#                            define BOOST_PP_NODE_45(p) BOOST_PP_IIF(p##(45), 45, 46)\n#                            define BOOST_PP_NODE_47(p) BOOST_PP_IIF(p##(47), 47, 48)\n#                define BOOST_PP_NODE_56(p) BOOST_PP_IIF(p##(56), BOOST_PP_NODE_52, BOOST_PP_NODE_60)\n#                    define BOOST_PP_NODE_52(p) BOOST_PP_IIF(p##(52), BOOST_PP_NODE_50, BOOST_PP_NODE_54)\n#                        define BOOST_PP_NODE_50(p) BOOST_PP_IIF(p##(50), BOOST_PP_NODE_49, BOOST_PP_NODE_51)\n#                            define BOOST_PP_NODE_49(p) BOOST_PP_IIF(p##(49), 49, 50)\n#                            define BOOST_PP_NODE_51(p) BOOST_PP_IIF(p##(51), 51, 52)\n#                        define BOOST_PP_NODE_54(p) BOOST_PP_IIF(p##(54), BOOST_PP_NODE_53, BOOST_PP_NODE_55)\n#                            define BOOST_PP_NODE_53(p) BOOST_PP_IIF(p##(53), 53, 54)\n#                            define BOOST_PP_NODE_55(p) BOOST_PP_IIF(p##(55), 55, 56)\n#                    define BOOST_PP_NODE_60(p) BOOST_PP_IIF(p##(60), BOOST_PP_NODE_58, BOOST_PP_NODE_62)\n#                        define BOOST_PP_NODE_58(p) BOOST_PP_IIF(p##(58), BOOST_PP_NODE_57, BOOST_PP_NODE_59)\n#                            define BOOST_PP_NODE_57(p) BOOST_PP_IIF(p##(57), 57, 58)\n#                            define BOOST_PP_NODE_59(p) BOOST_PP_IIF(p##(59), 59, 60)\n#                        define BOOST_PP_NODE_62(p) BOOST_PP_IIF(p##(62), BOOST_PP_NODE_61, BOOST_PP_NODE_63)\n#                            define BOOST_PP_NODE_61(p) BOOST_PP_IIF(p##(61), 61, 62)\n#                            define BOOST_PP_NODE_63(p) BOOST_PP_IIF(p##(63), 63, 64)\n#        define BOOST_PP_NODE_96(p) BOOST_PP_IIF(p##(96), BOOST_PP_NODE_80, BOOST_PP_NODE_112)\n#            define BOOST_PP_NODE_80(p) BOOST_PP_IIF(p##(80), BOOST_PP_NODE_72, BOOST_PP_NODE_88)\n#                define BOOST_PP_NODE_72(p) BOOST_PP_IIF(p##(72), BOOST_PP_NODE_68, BOOST_PP_NODE_76)\n#                    define BOOST_PP_NODE_68(p) BOOST_PP_IIF(p##(68), BOOST_PP_NODE_66, BOOST_PP_NODE_70)\n#                        define BOOST_PP_NODE_66(p) BOOST_PP_IIF(p##(66), BOOST_PP_NODE_65, BOOST_PP_NODE_67)\n#                            define BOOST_PP_NODE_65(p) BOOST_PP_IIF(p##(65), 65, 66)\n#                            define BOOST_PP_NODE_67(p) BOOST_PP_IIF(p##(67), 67, 68)\n#                        define BOOST_PP_NODE_70(p) BOOST_PP_IIF(p##(70), BOOST_PP_NODE_69, BOOST_PP_NODE_71)\n#                            define BOOST_PP_NODE_69(p) BOOST_PP_IIF(p##(69), 69, 70)\n#                            define BOOST_PP_NODE_71(p) BOOST_PP_IIF(p##(71), 71, 72)\n#                    define BOOST_PP_NODE_76(p) BOOST_PP_IIF(p##(76), BOOST_PP_NODE_74, BOOST_PP_NODE_78)\n#                        define BOOST_PP_NODE_74(p) BOOST_PP_IIF(p##(74), BOOST_PP_NODE_73, BOOST_PP_NODE_75)\n#                            define BOOST_PP_NODE_73(p) BOOST_PP_IIF(p##(73), 73, 74)\n#                            define BOOST_PP_NODE_75(p) BOOST_PP_IIF(p##(75), 75, 76)\n#                        define BOOST_PP_NODE_78(p) BOOST_PP_IIF(p##(78), BOOST_PP_NODE_77, BOOST_PP_NODE_79)\n#                            define BOOST_PP_NODE_77(p) BOOST_PP_IIF(p##(77), 77, 78)\n#                            define BOOST_PP_NODE_79(p) BOOST_PP_IIF(p##(79), 79, 80)\n#                define BOOST_PP_NODE_88(p) BOOST_PP_IIF(p##(88), BOOST_PP_NODE_84, BOOST_PP_NODE_92)\n#                    define BOOST_PP_NODE_84(p) BOOST_PP_IIF(p##(84), BOOST_PP_NODE_82, BOOST_PP_NODE_86)\n#                        define BOOST_PP_NODE_82(p) BOOST_PP_IIF(p##(82), BOOST_PP_NODE_81, BOOST_PP_NODE_83)\n#                            define BOOST_PP_NODE_81(p) BOOST_PP_IIF(p##(81), 81, 82)\n#                            define BOOST_PP_NODE_83(p) BOOST_PP_IIF(p##(83), 83, 84)\n#                        define BOOST_PP_NODE_86(p) BOOST_PP_IIF(p##(86), BOOST_PP_NODE_85, BOOST_PP_NODE_87)\n#                            define BOOST_PP_NODE_85(p) BOOST_PP_IIF(p##(85), 85, 86)\n#                            define BOOST_PP_NODE_87(p) BOOST_PP_IIF(p##(87), 87, 88)\n#                    define BOOST_PP_NODE_92(p) BOOST_PP_IIF(p##(92), BOOST_PP_NODE_90, BOOST_PP_NODE_94)\n#                        define BOOST_PP_NODE_90(p) BOOST_PP_IIF(p##(90), BOOST_PP_NODE_89, BOOST_PP_NODE_91)\n#                            define BOOST_PP_NODE_89(p) BOOST_PP_IIF(p##(89), 89, 90)\n#                            define BOOST_PP_NODE_91(p) BOOST_PP_IIF(p##(91), 91, 92)\n#                        define BOOST_PP_NODE_94(p) BOOST_PP_IIF(p##(94), BOOST_PP_NODE_93, BOOST_PP_NODE_95)\n#                            define BOOST_PP_NODE_93(p) BOOST_PP_IIF(p##(93), 93, 94)\n#                            define BOOST_PP_NODE_95(p) BOOST_PP_IIF(p##(95), 95, 96)\n#            define BOOST_PP_NODE_112(p) BOOST_PP_IIF(p##(112), BOOST_PP_NODE_104, BOOST_PP_NODE_120)\n#                define BOOST_PP_NODE_104(p) BOOST_PP_IIF(p##(104), BOOST_PP_NODE_100, BOOST_PP_NODE_108)\n#                    define BOOST_PP_NODE_100(p) BOOST_PP_IIF(p##(100), BOOST_PP_NODE_98, BOOST_PP_NODE_102)\n#                        define BOOST_PP_NODE_98(p) BOOST_PP_IIF(p##(98), BOOST_PP_NODE_97, BOOST_PP_NODE_99)\n#                            define BOOST_PP_NODE_97(p) BOOST_PP_IIF(p##(97), 97, 98)\n#                            define BOOST_PP_NODE_99(p) BOOST_PP_IIF(p##(99), 99, 100)\n#                        define BOOST_PP_NODE_102(p) BOOST_PP_IIF(p##(102), BOOST_PP_NODE_101, BOOST_PP_NODE_103)\n#                            define BOOST_PP_NODE_101(p) BOOST_PP_IIF(p##(101), 101, 102)\n#                            define BOOST_PP_NODE_103(p) BOOST_PP_IIF(p##(103), 103, 104)\n#                    define BOOST_PP_NODE_108(p) BOOST_PP_IIF(p##(108), BOOST_PP_NODE_106, BOOST_PP_NODE_110)\n#                        define BOOST_PP_NODE_106(p) BOOST_PP_IIF(p##(106), BOOST_PP_NODE_105, BOOST_PP_NODE_107)\n#                            define BOOST_PP_NODE_105(p) BOOST_PP_IIF(p##(105), 105, 106)\n#                            define BOOST_PP_NODE_107(p) BOOST_PP_IIF(p##(107), 107, 108)\n#                        define BOOST_PP_NODE_110(p) BOOST_PP_IIF(p##(110), BOOST_PP_NODE_109, BOOST_PP_NODE_111)\n#                            define BOOST_PP_NODE_109(p) BOOST_PP_IIF(p##(109), 109, 110)\n#                            define BOOST_PP_NODE_111(p) BOOST_PP_IIF(p##(111), 111, 112)\n#                define BOOST_PP_NODE_120(p) BOOST_PP_IIF(p##(120), BOOST_PP_NODE_116, BOOST_PP_NODE_124)\n#                    define BOOST_PP_NODE_116(p) BOOST_PP_IIF(p##(116), BOOST_PP_NODE_114, BOOST_PP_NODE_118)\n#                        define BOOST_PP_NODE_114(p) BOOST_PP_IIF(p##(114), BOOST_PP_NODE_113, BOOST_PP_NODE_115)\n#                            define BOOST_PP_NODE_113(p) BOOST_PP_IIF(p##(113), 113, 114)\n#                            define BOOST_PP_NODE_115(p) BOOST_PP_IIF(p##(115), 115, 116)\n#                        define BOOST_PP_NODE_118(p) BOOST_PP_IIF(p##(118), BOOST_PP_NODE_117, BOOST_PP_NODE_119)\n#                            define BOOST_PP_NODE_117(p) BOOST_PP_IIF(p##(117), 117, 118)\n#                            define BOOST_PP_NODE_119(p) BOOST_PP_IIF(p##(119), 119, 120)\n#                    define BOOST_PP_NODE_124(p) BOOST_PP_IIF(p##(124), BOOST_PP_NODE_122, BOOST_PP_NODE_126)\n#                        define BOOST_PP_NODE_122(p) BOOST_PP_IIF(p##(122), BOOST_PP_NODE_121, BOOST_PP_NODE_123)\n#                            define BOOST_PP_NODE_121(p) BOOST_PP_IIF(p##(121), 121, 122)\n#                            define BOOST_PP_NODE_123(p) BOOST_PP_IIF(p##(123), 123, 124)\n#                        define BOOST_PP_NODE_126(p) BOOST_PP_IIF(p##(126), BOOST_PP_NODE_125, BOOST_PP_NODE_127)\n#                            define BOOST_PP_NODE_125(p) BOOST_PP_IIF(p##(125), 125, 126)\n#                            define BOOST_PP_NODE_127(p) BOOST_PP_IIF(p##(127), 127, 128)\n#    define BOOST_PP_NODE_192(p) BOOST_PP_IIF(p##(192), BOOST_PP_NODE_160, BOOST_PP_NODE_224)\n#        define BOOST_PP_NODE_160(p) BOOST_PP_IIF(p##(160), BOOST_PP_NODE_144, BOOST_PP_NODE_176)\n#            define BOOST_PP_NODE_144(p) BOOST_PP_IIF(p##(144), BOOST_PP_NODE_136, BOOST_PP_NODE_152)\n#                define BOOST_PP_NODE_136(p) BOOST_PP_IIF(p##(136), BOOST_PP_NODE_132, BOOST_PP_NODE_140)\n#                    define BOOST_PP_NODE_132(p) BOOST_PP_IIF(p##(132), BOOST_PP_NODE_130, BOOST_PP_NODE_134)\n#                        define BOOST_PP_NODE_130(p) BOOST_PP_IIF(p##(130), BOOST_PP_NODE_129, BOOST_PP_NODE_131)\n#                            define BOOST_PP_NODE_129(p) BOOST_PP_IIF(p##(129), 129, 130)\n#                            define BOOST_PP_NODE_131(p) BOOST_PP_IIF(p##(131), 131, 132)\n#                        define BOOST_PP_NODE_134(p) BOOST_PP_IIF(p##(134), BOOST_PP_NODE_133, BOOST_PP_NODE_135)\n#                            define BOOST_PP_NODE_133(p) BOOST_PP_IIF(p##(133), 133, 134)\n#                            define BOOST_PP_NODE_135(p) BOOST_PP_IIF(p##(135), 135, 136)\n#                    define BOOST_PP_NODE_140(p) BOOST_PP_IIF(p##(140), BOOST_PP_NODE_138, BOOST_PP_NODE_142)\n#                        define BOOST_PP_NODE_138(p) BOOST_PP_IIF(p##(138), BOOST_PP_NODE_137, BOOST_PP_NODE_139)\n#                            define BOOST_PP_NODE_137(p) BOOST_PP_IIF(p##(137), 137, 138)\n#                            define BOOST_PP_NODE_139(p) BOOST_PP_IIF(p##(139), 139, 140)\n#                        define BOOST_PP_NODE_142(p) BOOST_PP_IIF(p##(142), BOOST_PP_NODE_141, BOOST_PP_NODE_143)\n#                            define BOOST_PP_NODE_141(p) BOOST_PP_IIF(p##(141), 141, 142)\n#                            define BOOST_PP_NODE_143(p) BOOST_PP_IIF(p##(143), 143, 144)\n#                define BOOST_PP_NODE_152(p) BOOST_PP_IIF(p##(152), BOOST_PP_NODE_148, BOOST_PP_NODE_156)\n#                    define BOOST_PP_NODE_148(p) BOOST_PP_IIF(p##(148), BOOST_PP_NODE_146, BOOST_PP_NODE_150)\n#                        define BOOST_PP_NODE_146(p) BOOST_PP_IIF(p##(146), BOOST_PP_NODE_145, BOOST_PP_NODE_147)\n#                            define BOOST_PP_NODE_145(p) BOOST_PP_IIF(p##(145), 145, 146)\n#                            define BOOST_PP_NODE_147(p) BOOST_PP_IIF(p##(147), 147, 148)\n#                        define BOOST_PP_NODE_150(p) BOOST_PP_IIF(p##(150), BOOST_PP_NODE_149, BOOST_PP_NODE_151)\n#                            define BOOST_PP_NODE_149(p) BOOST_PP_IIF(p##(149), 149, 150)\n#                            define BOOST_PP_NODE_151(p) BOOST_PP_IIF(p##(151), 151, 152)\n#                    define BOOST_PP_NODE_156(p) BOOST_PP_IIF(p##(156), BOOST_PP_NODE_154, BOOST_PP_NODE_158)\n#                        define BOOST_PP_NODE_154(p) BOOST_PP_IIF(p##(154), BOOST_PP_NODE_153, BOOST_PP_NODE_155)\n#                            define BOOST_PP_NODE_153(p) BOOST_PP_IIF(p##(153), 153, 154)\n#                            define BOOST_PP_NODE_155(p) BOOST_PP_IIF(p##(155), 155, 156)\n#                        define BOOST_PP_NODE_158(p) BOOST_PP_IIF(p##(158), BOOST_PP_NODE_157, BOOST_PP_NODE_159)\n#                            define BOOST_PP_NODE_157(p) BOOST_PP_IIF(p##(157), 157, 158)\n#                            define BOOST_PP_NODE_159(p) BOOST_PP_IIF(p##(159), 159, 160)\n#            define BOOST_PP_NODE_176(p) BOOST_PP_IIF(p##(176), BOOST_PP_NODE_168, BOOST_PP_NODE_184)\n#                define BOOST_PP_NODE_168(p) BOOST_PP_IIF(p##(168), BOOST_PP_NODE_164, BOOST_PP_NODE_172)\n#                    define BOOST_PP_NODE_164(p) BOOST_PP_IIF(p##(164), BOOST_PP_NODE_162, BOOST_PP_NODE_166)\n#                        define BOOST_PP_NODE_162(p) BOOST_PP_IIF(p##(162), BOOST_PP_NODE_161, BOOST_PP_NODE_163)\n#                            define BOOST_PP_NODE_161(p) BOOST_PP_IIF(p##(161), 161, 162)\n#                            define BOOST_PP_NODE_163(p) BOOST_PP_IIF(p##(163), 163, 164)\n#                        define BOOST_PP_NODE_166(p) BOOST_PP_IIF(p##(166), BOOST_PP_NODE_165, BOOST_PP_NODE_167)\n#                            define BOOST_PP_NODE_165(p) BOOST_PP_IIF(p##(165), 165, 166)\n#                            define BOOST_PP_NODE_167(p) BOOST_PP_IIF(p##(167), 167, 168)\n#                    define BOOST_PP_NODE_172(p) BOOST_PP_IIF(p##(172), BOOST_PP_NODE_170, BOOST_PP_NODE_174)\n#                        define BOOST_PP_NODE_170(p) BOOST_PP_IIF(p##(170), BOOST_PP_NODE_169, BOOST_PP_NODE_171)\n#                            define BOOST_PP_NODE_169(p) BOOST_PP_IIF(p##(169), 169, 170)\n#                            define BOOST_PP_NODE_171(p) BOOST_PP_IIF(p##(171), 171, 172)\n#                        define BOOST_PP_NODE_174(p) BOOST_PP_IIF(p##(174), BOOST_PP_NODE_173, BOOST_PP_NODE_175)\n#                            define BOOST_PP_NODE_173(p) BOOST_PP_IIF(p##(173), 173, 174)\n#                            define BOOST_PP_NODE_175(p) BOOST_PP_IIF(p##(175), 175, 176)\n#                define BOOST_PP_NODE_184(p) BOOST_PP_IIF(p##(184), BOOST_PP_NODE_180, BOOST_PP_NODE_188)\n#                    define BOOST_PP_NODE_180(p) BOOST_PP_IIF(p##(180), BOOST_PP_NODE_178, BOOST_PP_NODE_182)\n#                        define BOOST_PP_NODE_178(p) BOOST_PP_IIF(p##(178), BOOST_PP_NODE_177, BOOST_PP_NODE_179)\n#                            define BOOST_PP_NODE_177(p) BOOST_PP_IIF(p##(177), 177, 178)\n#                            define BOOST_PP_NODE_179(p) BOOST_PP_IIF(p##(179), 179, 180)\n#                        define BOOST_PP_NODE_182(p) BOOST_PP_IIF(p##(182), BOOST_PP_NODE_181, BOOST_PP_NODE_183)\n#                            define BOOST_PP_NODE_181(p) BOOST_PP_IIF(p##(181), 181, 182)\n#                            define BOOST_PP_NODE_183(p) BOOST_PP_IIF(p##(183), 183, 184)\n#                    define BOOST_PP_NODE_188(p) BOOST_PP_IIF(p##(188), BOOST_PP_NODE_186, BOOST_PP_NODE_190)\n#                        define BOOST_PP_NODE_186(p) BOOST_PP_IIF(p##(186), BOOST_PP_NODE_185, BOOST_PP_NODE_187)\n#                            define BOOST_PP_NODE_185(p) BOOST_PP_IIF(p##(185), 185, 186)\n#                            define BOOST_PP_NODE_187(p) BOOST_PP_IIF(p##(187), 187, 188)\n#                        define BOOST_PP_NODE_190(p) BOOST_PP_IIF(p##(190), BOOST_PP_NODE_189, BOOST_PP_NODE_191)\n#                            define BOOST_PP_NODE_189(p) BOOST_PP_IIF(p##(189), 189, 190)\n#                            define BOOST_PP_NODE_191(p) BOOST_PP_IIF(p##(191), 191, 192)\n#        define BOOST_PP_NODE_224(p) BOOST_PP_IIF(p##(224), BOOST_PP_NODE_208, BOOST_PP_NODE_240)\n#            define BOOST_PP_NODE_208(p) BOOST_PP_IIF(p##(208), BOOST_PP_NODE_200, BOOST_PP_NODE_216)\n#                define BOOST_PP_NODE_200(p) BOOST_PP_IIF(p##(200), BOOST_PP_NODE_196, BOOST_PP_NODE_204)\n#                    define BOOST_PP_NODE_196(p) BOOST_PP_IIF(p##(196), BOOST_PP_NODE_194, BOOST_PP_NODE_198)\n#                        define BOOST_PP_NODE_194(p) BOOST_PP_IIF(p##(194), BOOST_PP_NODE_193, BOOST_PP_NODE_195)\n#                            define BOOST_PP_NODE_193(p) BOOST_PP_IIF(p##(193), 193, 194)\n#                            define BOOST_PP_NODE_195(p) BOOST_PP_IIF(p##(195), 195, 196)\n#                        define BOOST_PP_NODE_198(p) BOOST_PP_IIF(p##(198), BOOST_PP_NODE_197, BOOST_PP_NODE_199)\n#                            define BOOST_PP_NODE_197(p) BOOST_PP_IIF(p##(197), 197, 198)\n#                            define BOOST_PP_NODE_199(p) BOOST_PP_IIF(p##(199), 199, 200)\n#                    define BOOST_PP_NODE_204(p) BOOST_PP_IIF(p##(204), BOOST_PP_NODE_202, BOOST_PP_NODE_206)\n#                        define BOOST_PP_NODE_202(p) BOOST_PP_IIF(p##(202), BOOST_PP_NODE_201, BOOST_PP_NODE_203)\n#                            define BOOST_PP_NODE_201(p) BOOST_PP_IIF(p##(201), 201, 202)\n#                            define BOOST_PP_NODE_203(p) BOOST_PP_IIF(p##(203), 203, 204)\n#                        define BOOST_PP_NODE_206(p) BOOST_PP_IIF(p##(206), BOOST_PP_NODE_205, BOOST_PP_NODE_207)\n#                            define BOOST_PP_NODE_205(p) BOOST_PP_IIF(p##(205), 205, 206)\n#                            define BOOST_PP_NODE_207(p) BOOST_PP_IIF(p##(207), 207, 208)\n#                define BOOST_PP_NODE_216(p) BOOST_PP_IIF(p##(216), BOOST_PP_NODE_212, BOOST_PP_NODE_220)\n#                    define BOOST_PP_NODE_212(p) BOOST_PP_IIF(p##(212), BOOST_PP_NODE_210, BOOST_PP_NODE_214)\n#                        define BOOST_PP_NODE_210(p) BOOST_PP_IIF(p##(210), BOOST_PP_NODE_209, BOOST_PP_NODE_211)\n#                            define BOOST_PP_NODE_209(p) BOOST_PP_IIF(p##(209), 209, 210)\n#                            define BOOST_PP_NODE_211(p) BOOST_PP_IIF(p##(211), 211, 212)\n#                        define BOOST_PP_NODE_214(p) BOOST_PP_IIF(p##(214), BOOST_PP_NODE_213, BOOST_PP_NODE_215)\n#                            define BOOST_PP_NODE_213(p) BOOST_PP_IIF(p##(213), 213, 214)\n#                            define BOOST_PP_NODE_215(p) BOOST_PP_IIF(p##(215), 215, 216)\n#                    define BOOST_PP_NODE_220(p) BOOST_PP_IIF(p##(220), BOOST_PP_NODE_218, BOOST_PP_NODE_222)\n#                        define BOOST_PP_NODE_218(p) BOOST_PP_IIF(p##(218), BOOST_PP_NODE_217, BOOST_PP_NODE_219)\n#                            define BOOST_PP_NODE_217(p) BOOST_PP_IIF(p##(217), 217, 218)\n#                            define BOOST_PP_NODE_219(p) BOOST_PP_IIF(p##(219), 219, 220)\n#                        define BOOST_PP_NODE_222(p) BOOST_PP_IIF(p##(222), BOOST_PP_NODE_221, BOOST_PP_NODE_223)\n#                            define BOOST_PP_NODE_221(p) BOOST_PP_IIF(p##(221), 221, 222)\n#                            define BOOST_PP_NODE_223(p) BOOST_PP_IIF(p##(223), 223, 224)\n#            define BOOST_PP_NODE_240(p) BOOST_PP_IIF(p##(240), BOOST_PP_NODE_232, BOOST_PP_NODE_248)\n#                define BOOST_PP_NODE_232(p) BOOST_PP_IIF(p##(232), BOOST_PP_NODE_228, BOOST_PP_NODE_236)\n#                    define BOOST_PP_NODE_228(p) BOOST_PP_IIF(p##(228), BOOST_PP_NODE_226, BOOST_PP_NODE_230)\n#                        define BOOST_PP_NODE_226(p) BOOST_PP_IIF(p##(226), BOOST_PP_NODE_225, BOOST_PP_NODE_227)\n#                            define BOOST_PP_NODE_225(p) BOOST_PP_IIF(p##(225), 225, 226)\n#                            define BOOST_PP_NODE_227(p) BOOST_PP_IIF(p##(227), 227, 228)\n#                        define BOOST_PP_NODE_230(p) BOOST_PP_IIF(p##(230), BOOST_PP_NODE_229, BOOST_PP_NODE_231)\n#                            define BOOST_PP_NODE_229(p) BOOST_PP_IIF(p##(229), 229, 230)\n#                            define BOOST_PP_NODE_231(p) BOOST_PP_IIF(p##(231), 231, 232)\n#                    define BOOST_PP_NODE_236(p) BOOST_PP_IIF(p##(236), BOOST_PP_NODE_234, BOOST_PP_NODE_238)\n#                        define BOOST_PP_NODE_234(p) BOOST_PP_IIF(p##(234), BOOST_PP_NODE_233, BOOST_PP_NODE_235)\n#                            define BOOST_PP_NODE_233(p) BOOST_PP_IIF(p##(233), 233, 234)\n#                            define BOOST_PP_NODE_235(p) BOOST_PP_IIF(p##(235), 235, 236)\n#                        define BOOST_PP_NODE_238(p) BOOST_PP_IIF(p##(238), BOOST_PP_NODE_237, BOOST_PP_NODE_239)\n#                            define BOOST_PP_NODE_237(p) BOOST_PP_IIF(p##(237), 237, 238)\n#                            define BOOST_PP_NODE_239(p) BOOST_PP_IIF(p##(239), 239, 240)\n#                define BOOST_PP_NODE_248(p) BOOST_PP_IIF(p##(248), BOOST_PP_NODE_244, BOOST_PP_NODE_252)\n#                    define BOOST_PP_NODE_244(p) BOOST_PP_IIF(p##(244), BOOST_PP_NODE_242, BOOST_PP_NODE_246)\n#                        define BOOST_PP_NODE_242(p) BOOST_PP_IIF(p##(242), BOOST_PP_NODE_241, BOOST_PP_NODE_243)\n#                            define BOOST_PP_NODE_241(p) BOOST_PP_IIF(p##(241), 241, 242)\n#                            define BOOST_PP_NODE_243(p) BOOST_PP_IIF(p##(243), 243, 244)\n#                        define BOOST_PP_NODE_246(p) BOOST_PP_IIF(p##(246), BOOST_PP_NODE_245, BOOST_PP_NODE_247)\n#                            define BOOST_PP_NODE_245(p) BOOST_PP_IIF(p##(245), 245, 246)\n#                            define BOOST_PP_NODE_247(p) BOOST_PP_IIF(p##(247), 247, 248)\n#                    define BOOST_PP_NODE_252(p) BOOST_PP_IIF(p##(252), BOOST_PP_NODE_250, BOOST_PP_NODE_254)\n#                        define BOOST_PP_NODE_250(p) BOOST_PP_IIF(p##(250), BOOST_PP_NODE_249, BOOST_PP_NODE_251)\n#                            define BOOST_PP_NODE_249(p) BOOST_PP_IIF(p##(249), 249, 250)\n#                            define BOOST_PP_NODE_251(p) BOOST_PP_IIF(p##(251), 251, 252)\n#                        define BOOST_PP_NODE_254(p) BOOST_PP_IIF(p##(254), BOOST_PP_NODE_253, BOOST_PP_NODE_255)\n#                            define BOOST_PP_NODE_253(p) BOOST_PP_IIF(p##(253), 253, 254)\n#                            define BOOST_PP_NODE_255(p) BOOST_PP_IIF(p##(255), 255, 256)\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/detail/is_binary.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_DETAIL_IS_BINARY_HPP\n# define BOOST_PREPROCESSOR_DETAIL_IS_BINARY_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/detail/check.hpp>\n#\n# /* BOOST_PP_IS_BINARY */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_IS_BINARY(x) BOOST_PP_CHECK(x, BOOST_PP_IS_BINARY_CHECK)\n# else\n#    define BOOST_PP_IS_BINARY(x) BOOST_PP_IS_BINARY_I(x)\n#    define BOOST_PP_IS_BINARY_I(x) BOOST_PP_CHECK(x, BOOST_PP_IS_BINARY_CHECK)\n# endif\n#\n# define BOOST_PP_IS_BINARY_CHECK(a, b) 1\n# define BOOST_PP_CHECK_RESULT_BOOST_PP_IS_BINARY_CHECK 0, BOOST_PP_NIL\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/detail/is_nullary.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_DETAIL_IS_NULLARY_HPP\n# define BOOST_PREPROCESSOR_DETAIL_IS_NULLARY_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/detail/check.hpp>\n#\n# /* BOOST_PP_IS_NULLARY */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_IS_NULLARY(x) BOOST_PP_CHECK(x, BOOST_PP_IS_NULLARY_CHECK)\n# else\n#    define BOOST_PP_IS_NULLARY(x) BOOST_PP_IS_NULLARY_I(x)\n#    define BOOST_PP_IS_NULLARY_I(x) BOOST_PP_CHECK(x, BOOST_PP_IS_NULLARY_CHECK)\n# endif\n#\n# define BOOST_PP_IS_NULLARY_CHECK() 1\n# define BOOST_PP_CHECK_RESULT_BOOST_PP_IS_NULLARY_CHECK 0, BOOST_PP_NIL\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/detail/split.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# ifndef BOOST_PREPROCESSOR_DETAIL_SPLIT_HPP\n# define BOOST_PREPROCESSOR_DETAIL_SPLIT_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_SPLIT */\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_SPLIT(n, im) BOOST_PP_SPLIT_I((n, im))\n#    define BOOST_PP_SPLIT_I(par) BOOST_PP_SPLIT_II ## par\n#    define BOOST_PP_SPLIT_II(n, a, b) BOOST_PP_SPLIT_ ## n(a, b)\n# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    define BOOST_PP_SPLIT(n, im) BOOST_PP_SPLIT_I(n((im)))\n#    define BOOST_PP_SPLIT_I(n) BOOST_PP_SPLIT_ID(BOOST_PP_SPLIT_II_ ## n)\n#    define BOOST_PP_SPLIT_II_0(s) BOOST_PP_SPLIT_ID(BOOST_PP_SPLIT_0 s)\n#    define BOOST_PP_SPLIT_II_1(s) BOOST_PP_SPLIT_ID(BOOST_PP_SPLIT_1 s)\n#    define BOOST_PP_SPLIT_ID(id) id\n# else\n#    define BOOST_PP_SPLIT(n, im) BOOST_PP_SPLIT_I(n)(im)\n#    define BOOST_PP_SPLIT_I(n) BOOST_PP_SPLIT_ ## n\n# endif\n#\n# define BOOST_PP_SPLIT_0(a, b) a\n# define BOOST_PP_SPLIT_1(a, b) b\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/empty.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_EMPTY_HPP\n# define BOOST_PREPROCESSOR_EMPTY_HPP\n#\n# include <boost/preprocessor/facilities/empty.hpp>\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/enum.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ENUM_HPP\n# define BOOST_PREPROCESSOR_ENUM_HPP\n#\n# include <boost/preprocessor/repetition/enum.hpp>\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/enum_params.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ENUM_PARAMS_HPP\n# define BOOST_PREPROCESSOR_ENUM_PARAMS_HPP\n#\n# include <boost/preprocessor/repetition/enum_params.hpp>\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/enum_params_with_a_default.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ENUM_PARAMS_WITH_A_DEFAULT_HPP\n# define BOOST_PREPROCESSOR_ENUM_PARAMS_WITH_A_DEFAULT_HPP\n#\n# include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/enum_shifted_params.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ENUM_SHIFTED_PARAMS_HPP\n# define BOOST_PREPROCESSOR_ENUM_SHIFTED_PARAMS_HPP\n#\n# include <boost/preprocessor/repetition/enum_shifted_params.hpp>\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/expr_if.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_EXPR_IF_HPP\n# define BOOST_PREPROCESSOR_EXPR_IF_HPP\n#\n# include <boost/preprocessor/control/expr_if.hpp>\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/facilities/detail/is_empty.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2014.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n#ifndef BOOST_PREPROCESSOR_DETAIL_IS_EMPTY_HPP\n#define BOOST_PREPROCESSOR_DETAIL_IS_EMPTY_HPP\n\n#include <boost/preprocessor/punctuation/is_begin_parens.hpp>\n\n#if BOOST_PP_VARIADICS_MSVC\n\n# pragma warning(once:4002)\n\n#define BOOST_PP_DETAIL_IS_EMPTY_IIF_0(t, b) b\n#define BOOST_PP_DETAIL_IS_EMPTY_IIF_1(t, b) t\n\n#else\n\n#define BOOST_PP_DETAIL_IS_EMPTY_IIF_0(t, ...) __VA_ARGS__\n#define BOOST_PP_DETAIL_IS_EMPTY_IIF_1(t, ...) t\n\n#endif\n\n#if BOOST_PP_VARIADICS_MSVC && _MSC_VER <= 1400\n\n#define BOOST_PP_DETAIL_IS_EMPTY_PROCESS(param) \\\n\tBOOST_PP_IS_BEGIN_PARENS \\\n    \t( \\\n        BOOST_PP_DETAIL_IS_EMPTY_NON_FUNCTION_C param () \\\n        ) \\\n/**/\n\n#else\n\n#define BOOST_PP_DETAIL_IS_EMPTY_PROCESS(...) \\\n\tBOOST_PP_IS_BEGIN_PARENS \\\n        ( \\\n        BOOST_PP_DETAIL_IS_EMPTY_NON_FUNCTION_C __VA_ARGS__ () \\\n        ) \\\n/**/\n\n#endif\n\n#define BOOST_PP_DETAIL_IS_EMPTY_PRIMITIVE_CAT(a, b) a ## b\n#define BOOST_PP_DETAIL_IS_EMPTY_IIF(bit) BOOST_PP_DETAIL_IS_EMPTY_PRIMITIVE_CAT(BOOST_PP_DETAIL_IS_EMPTY_IIF_,bit)\n#define BOOST_PP_DETAIL_IS_EMPTY_NON_FUNCTION_C(...) ()\n\n#endif /* BOOST_PREPROCESSOR_DETAIL_IS_EMPTY_HPP */\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/facilities/empty.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_FACILITIES_EMPTY_HPP\n# define BOOST_PREPROCESSOR_FACILITIES_EMPTY_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_EMPTY */\n#\n# define BOOST_PP_EMPTY()\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/facilities/expand.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_FACILITIES_EXPAND_HPP\n# define BOOST_PREPROCESSOR_FACILITIES_EXPAND_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC() && ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()\n#    define BOOST_PP_EXPAND(x) BOOST_PP_EXPAND_I(x)\n# else\n#    define BOOST_PP_EXPAND(x) BOOST_PP_EXPAND_OO((x))\n#    define BOOST_PP_EXPAND_OO(par) BOOST_PP_EXPAND_I ## par\n# endif\n#\n# define BOOST_PP_EXPAND_I(x) x\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/facilities/identity.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n# /* Revised by Edward Diener (2015) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_FACILITIES_IDENTITY_HPP\n# define BOOST_PREPROCESSOR_FACILITIES_IDENTITY_HPP\n#\n# include <boost/preprocessor/facilities/empty.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n#\n# /* BOOST_PP_IDENTITY */\n#\n# define BOOST_PP_IDENTITY(item) item BOOST_PP_EMPTY\n#\n# define BOOST_PP_IDENTITY_N(item,n) item BOOST_PP_TUPLE_EAT_N(n)\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/facilities/intercept.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_FACILITIES_INTERCEPT_HPP\n# define BOOST_PREPROCESSOR_FACILITIES_INTERCEPT_HPP\n#\n# /* BOOST_PP_INTERCEPT */\n#\n# define BOOST_PP_INTERCEPT BOOST_PP_INTERCEPT_\n#\n# define BOOST_PP_INTERCEPT_0\n# define BOOST_PP_INTERCEPT_1\n# define BOOST_PP_INTERCEPT_2\n# define BOOST_PP_INTERCEPT_3\n# define BOOST_PP_INTERCEPT_4\n# define BOOST_PP_INTERCEPT_5\n# define BOOST_PP_INTERCEPT_6\n# define BOOST_PP_INTERCEPT_7\n# define BOOST_PP_INTERCEPT_8\n# define BOOST_PP_INTERCEPT_9\n# define BOOST_PP_INTERCEPT_10\n# define BOOST_PP_INTERCEPT_11\n# define BOOST_PP_INTERCEPT_12\n# define BOOST_PP_INTERCEPT_13\n# define BOOST_PP_INTERCEPT_14\n# define BOOST_PP_INTERCEPT_15\n# define BOOST_PP_INTERCEPT_16\n# define BOOST_PP_INTERCEPT_17\n# define BOOST_PP_INTERCEPT_18\n# define BOOST_PP_INTERCEPT_19\n# define BOOST_PP_INTERCEPT_20\n# define BOOST_PP_INTERCEPT_21\n# define BOOST_PP_INTERCEPT_22\n# define BOOST_PP_INTERCEPT_23\n# define BOOST_PP_INTERCEPT_24\n# define BOOST_PP_INTERCEPT_25\n# define BOOST_PP_INTERCEPT_26\n# define BOOST_PP_INTERCEPT_27\n# define BOOST_PP_INTERCEPT_28\n# define BOOST_PP_INTERCEPT_29\n# define BOOST_PP_INTERCEPT_30\n# define BOOST_PP_INTERCEPT_31\n# define BOOST_PP_INTERCEPT_32\n# define BOOST_PP_INTERCEPT_33\n# define BOOST_PP_INTERCEPT_34\n# define BOOST_PP_INTERCEPT_35\n# define BOOST_PP_INTERCEPT_36\n# define BOOST_PP_INTERCEPT_37\n# define BOOST_PP_INTERCEPT_38\n# define BOOST_PP_INTERCEPT_39\n# define BOOST_PP_INTERCEPT_40\n# define BOOST_PP_INTERCEPT_41\n# define BOOST_PP_INTERCEPT_42\n# define BOOST_PP_INTERCEPT_43\n# define BOOST_PP_INTERCEPT_44\n# define BOOST_PP_INTERCEPT_45\n# define BOOST_PP_INTERCEPT_46\n# define BOOST_PP_INTERCEPT_47\n# define BOOST_PP_INTERCEPT_48\n# define BOOST_PP_INTERCEPT_49\n# define BOOST_PP_INTERCEPT_50\n# define BOOST_PP_INTERCEPT_51\n# define BOOST_PP_INTERCEPT_52\n# define BOOST_PP_INTERCEPT_53\n# define BOOST_PP_INTERCEPT_54\n# define BOOST_PP_INTERCEPT_55\n# define BOOST_PP_INTERCEPT_56\n# define BOOST_PP_INTERCEPT_57\n# define BOOST_PP_INTERCEPT_58\n# define BOOST_PP_INTERCEPT_59\n# define BOOST_PP_INTERCEPT_60\n# define BOOST_PP_INTERCEPT_61\n# define BOOST_PP_INTERCEPT_62\n# define BOOST_PP_INTERCEPT_63\n# define BOOST_PP_INTERCEPT_64\n# define BOOST_PP_INTERCEPT_65\n# define BOOST_PP_INTERCEPT_66\n# define BOOST_PP_INTERCEPT_67\n# define BOOST_PP_INTERCEPT_68\n# define BOOST_PP_INTERCEPT_69\n# define BOOST_PP_INTERCEPT_70\n# define BOOST_PP_INTERCEPT_71\n# define BOOST_PP_INTERCEPT_72\n# define BOOST_PP_INTERCEPT_73\n# define BOOST_PP_INTERCEPT_74\n# define BOOST_PP_INTERCEPT_75\n# define BOOST_PP_INTERCEPT_76\n# define BOOST_PP_INTERCEPT_77\n# define BOOST_PP_INTERCEPT_78\n# define BOOST_PP_INTERCEPT_79\n# define BOOST_PP_INTERCEPT_80\n# define BOOST_PP_INTERCEPT_81\n# define BOOST_PP_INTERCEPT_82\n# define BOOST_PP_INTERCEPT_83\n# define BOOST_PP_INTERCEPT_84\n# define BOOST_PP_INTERCEPT_85\n# define BOOST_PP_INTERCEPT_86\n# define BOOST_PP_INTERCEPT_87\n# define BOOST_PP_INTERCEPT_88\n# define BOOST_PP_INTERCEPT_89\n# define BOOST_PP_INTERCEPT_90\n# define BOOST_PP_INTERCEPT_91\n# define BOOST_PP_INTERCEPT_92\n# define BOOST_PP_INTERCEPT_93\n# define BOOST_PP_INTERCEPT_94\n# define BOOST_PP_INTERCEPT_95\n# define BOOST_PP_INTERCEPT_96\n# define BOOST_PP_INTERCEPT_97\n# define BOOST_PP_INTERCEPT_98\n# define BOOST_PP_INTERCEPT_99\n# define BOOST_PP_INTERCEPT_100\n# define BOOST_PP_INTERCEPT_101\n# define BOOST_PP_INTERCEPT_102\n# define BOOST_PP_INTERCEPT_103\n# define BOOST_PP_INTERCEPT_104\n# define BOOST_PP_INTERCEPT_105\n# define BOOST_PP_INTERCEPT_106\n# define BOOST_PP_INTERCEPT_107\n# define BOOST_PP_INTERCEPT_108\n# define BOOST_PP_INTERCEPT_109\n# define BOOST_PP_INTERCEPT_110\n# define BOOST_PP_INTERCEPT_111\n# define BOOST_PP_INTERCEPT_112\n# define BOOST_PP_INTERCEPT_113\n# define BOOST_PP_INTERCEPT_114\n# define BOOST_PP_INTERCEPT_115\n# define BOOST_PP_INTERCEPT_116\n# define BOOST_PP_INTERCEPT_117\n# define BOOST_PP_INTERCEPT_118\n# define BOOST_PP_INTERCEPT_119\n# define BOOST_PP_INTERCEPT_120\n# define BOOST_PP_INTERCEPT_121\n# define BOOST_PP_INTERCEPT_122\n# define BOOST_PP_INTERCEPT_123\n# define BOOST_PP_INTERCEPT_124\n# define BOOST_PP_INTERCEPT_125\n# define BOOST_PP_INTERCEPT_126\n# define BOOST_PP_INTERCEPT_127\n# define BOOST_PP_INTERCEPT_128\n# define BOOST_PP_INTERCEPT_129\n# define BOOST_PP_INTERCEPT_130\n# define BOOST_PP_INTERCEPT_131\n# define BOOST_PP_INTERCEPT_132\n# define BOOST_PP_INTERCEPT_133\n# define BOOST_PP_INTERCEPT_134\n# define BOOST_PP_INTERCEPT_135\n# define BOOST_PP_INTERCEPT_136\n# define BOOST_PP_INTERCEPT_137\n# define BOOST_PP_INTERCEPT_138\n# define BOOST_PP_INTERCEPT_139\n# define BOOST_PP_INTERCEPT_140\n# define BOOST_PP_INTERCEPT_141\n# define BOOST_PP_INTERCEPT_142\n# define BOOST_PP_INTERCEPT_143\n# define BOOST_PP_INTERCEPT_144\n# define BOOST_PP_INTERCEPT_145\n# define BOOST_PP_INTERCEPT_146\n# define BOOST_PP_INTERCEPT_147\n# define BOOST_PP_INTERCEPT_148\n# define BOOST_PP_INTERCEPT_149\n# define BOOST_PP_INTERCEPT_150\n# define BOOST_PP_INTERCEPT_151\n# define BOOST_PP_INTERCEPT_152\n# define BOOST_PP_INTERCEPT_153\n# define BOOST_PP_INTERCEPT_154\n# define BOOST_PP_INTERCEPT_155\n# define BOOST_PP_INTERCEPT_156\n# define BOOST_PP_INTERCEPT_157\n# define BOOST_PP_INTERCEPT_158\n# define BOOST_PP_INTERCEPT_159\n# define BOOST_PP_INTERCEPT_160\n# define BOOST_PP_INTERCEPT_161\n# define BOOST_PP_INTERCEPT_162\n# define BOOST_PP_INTERCEPT_163\n# define BOOST_PP_INTERCEPT_164\n# define BOOST_PP_INTERCEPT_165\n# define BOOST_PP_INTERCEPT_166\n# define BOOST_PP_INTERCEPT_167\n# define BOOST_PP_INTERCEPT_168\n# define BOOST_PP_INTERCEPT_169\n# define BOOST_PP_INTERCEPT_170\n# define BOOST_PP_INTERCEPT_171\n# define BOOST_PP_INTERCEPT_172\n# define BOOST_PP_INTERCEPT_173\n# define BOOST_PP_INTERCEPT_174\n# define BOOST_PP_INTERCEPT_175\n# define BOOST_PP_INTERCEPT_176\n# define BOOST_PP_INTERCEPT_177\n# define BOOST_PP_INTERCEPT_178\n# define BOOST_PP_INTERCEPT_179\n# define BOOST_PP_INTERCEPT_180\n# define BOOST_PP_INTERCEPT_181\n# define BOOST_PP_INTERCEPT_182\n# define BOOST_PP_INTERCEPT_183\n# define BOOST_PP_INTERCEPT_184\n# define BOOST_PP_INTERCEPT_185\n# define BOOST_PP_INTERCEPT_186\n# define BOOST_PP_INTERCEPT_187\n# define BOOST_PP_INTERCEPT_188\n# define BOOST_PP_INTERCEPT_189\n# define BOOST_PP_INTERCEPT_190\n# define BOOST_PP_INTERCEPT_191\n# define BOOST_PP_INTERCEPT_192\n# define BOOST_PP_INTERCEPT_193\n# define BOOST_PP_INTERCEPT_194\n# define BOOST_PP_INTERCEPT_195\n# define BOOST_PP_INTERCEPT_196\n# define BOOST_PP_INTERCEPT_197\n# define BOOST_PP_INTERCEPT_198\n# define BOOST_PP_INTERCEPT_199\n# define BOOST_PP_INTERCEPT_200\n# define BOOST_PP_INTERCEPT_201\n# define BOOST_PP_INTERCEPT_202\n# define BOOST_PP_INTERCEPT_203\n# define BOOST_PP_INTERCEPT_204\n# define BOOST_PP_INTERCEPT_205\n# define BOOST_PP_INTERCEPT_206\n# define BOOST_PP_INTERCEPT_207\n# define BOOST_PP_INTERCEPT_208\n# define BOOST_PP_INTERCEPT_209\n# define BOOST_PP_INTERCEPT_210\n# define BOOST_PP_INTERCEPT_211\n# define BOOST_PP_INTERCEPT_212\n# define BOOST_PP_INTERCEPT_213\n# define BOOST_PP_INTERCEPT_214\n# define BOOST_PP_INTERCEPT_215\n# define BOOST_PP_INTERCEPT_216\n# define BOOST_PP_INTERCEPT_217\n# define BOOST_PP_INTERCEPT_218\n# define BOOST_PP_INTERCEPT_219\n# define BOOST_PP_INTERCEPT_220\n# define BOOST_PP_INTERCEPT_221\n# define BOOST_PP_INTERCEPT_222\n# define BOOST_PP_INTERCEPT_223\n# define BOOST_PP_INTERCEPT_224\n# define BOOST_PP_INTERCEPT_225\n# define BOOST_PP_INTERCEPT_226\n# define BOOST_PP_INTERCEPT_227\n# define BOOST_PP_INTERCEPT_228\n# define BOOST_PP_INTERCEPT_229\n# define BOOST_PP_INTERCEPT_230\n# define BOOST_PP_INTERCEPT_231\n# define BOOST_PP_INTERCEPT_232\n# define BOOST_PP_INTERCEPT_233\n# define BOOST_PP_INTERCEPT_234\n# define BOOST_PP_INTERCEPT_235\n# define BOOST_PP_INTERCEPT_236\n# define BOOST_PP_INTERCEPT_237\n# define BOOST_PP_INTERCEPT_238\n# define BOOST_PP_INTERCEPT_239\n# define BOOST_PP_INTERCEPT_240\n# define BOOST_PP_INTERCEPT_241\n# define BOOST_PP_INTERCEPT_242\n# define BOOST_PP_INTERCEPT_243\n# define BOOST_PP_INTERCEPT_244\n# define BOOST_PP_INTERCEPT_245\n# define BOOST_PP_INTERCEPT_246\n# define BOOST_PP_INTERCEPT_247\n# define BOOST_PP_INTERCEPT_248\n# define BOOST_PP_INTERCEPT_249\n# define BOOST_PP_INTERCEPT_250\n# define BOOST_PP_INTERCEPT_251\n# define BOOST_PP_INTERCEPT_252\n# define BOOST_PP_INTERCEPT_253\n# define BOOST_PP_INTERCEPT_254\n# define BOOST_PP_INTERCEPT_255\n# define BOOST_PP_INTERCEPT_256\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/facilities/is_1.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2003.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_FACILITIES_IS_1_HPP\n# define BOOST_PREPROCESSOR_FACILITIES_IS_1_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/facilities/is_empty.hpp>\n#\n# /* BOOST_PP_IS_1 */\n#\n# define BOOST_PP_IS_1(x) BOOST_PP_IS_EMPTY(BOOST_PP_CAT(BOOST_PP_IS_1_HELPER_, x))\n# define BOOST_PP_IS_1_HELPER_1\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/facilities/is_empty.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2003.\n#  *     (C) Copyright Edward Diener 2014.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_FACILITIES_IS_EMPTY_HPP\n# define BOOST_PREPROCESSOR_FACILITIES_IS_EMPTY_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# if BOOST_PP_VARIADICS\n#\n# include <boost/preprocessor/facilities/is_empty_variadic.hpp>\n#\n# else\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC() && ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/facilities/identity.hpp>\n# else\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/detail/split.hpp>\n# endif\n#\n# /* BOOST_PP_IS_EMPTY */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC() && ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_IS_EMPTY(x) BOOST_PP_IS_EMPTY_I(x BOOST_PP_IS_EMPTY_HELPER)\n#    define BOOST_PP_IS_EMPTY_I(contents) BOOST_PP_TUPLE_ELEM(2, 1, (BOOST_PP_IS_EMPTY_DEF_ ## contents()))\n#    define BOOST_PP_IS_EMPTY_DEF_BOOST_PP_IS_EMPTY_HELPER 1, BOOST_PP_IDENTITY(1)\n#    define BOOST_PP_IS_EMPTY_HELPER() , 0\n# else\n#    if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#        define BOOST_PP_IS_EMPTY(x) BOOST_PP_IS_EMPTY_I(BOOST_PP_IS_EMPTY_HELPER x ())\n#        define BOOST_PP_IS_EMPTY_I(test) BOOST_PP_IS_EMPTY_II(BOOST_PP_SPLIT(0, BOOST_PP_CAT(BOOST_PP_IS_EMPTY_DEF_, test)))\n#        define BOOST_PP_IS_EMPTY_II(id) id\n#    else\n#        define BOOST_PP_IS_EMPTY(x) BOOST_PP_IS_EMPTY_I((BOOST_PP_IS_EMPTY_HELPER x ()))\n#        define BOOST_PP_IS_EMPTY_I(par) BOOST_PP_IS_EMPTY_II ## par\n#        define BOOST_PP_IS_EMPTY_II(test) BOOST_PP_SPLIT(0, BOOST_PP_CAT(BOOST_PP_IS_EMPTY_DEF_, test))\n#    endif\n#    define BOOST_PP_IS_EMPTY_HELPER() 1\n#    define BOOST_PP_IS_EMPTY_DEF_1 1, BOOST_PP_NIL\n#    define BOOST_PP_IS_EMPTY_DEF_BOOST_PP_IS_EMPTY_HELPER 0, BOOST_PP_NIL\n# endif\n#\n# endif /* BOOST_PP_VARIADICS */\n#\n# endif /* BOOST_PREPROCESSOR_FACILITIES_IS_EMPTY_HPP */\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/facilities/is_empty_variadic.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2014.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_FACILITIES_IS_EMPTY_VARIADIC_HPP\n# define BOOST_PREPROCESSOR_FACILITIES_IS_EMPTY_VARIADIC_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# if BOOST_PP_VARIADICS\n#\n# include <boost/preprocessor/punctuation/is_begin_parens.hpp>\n# include <boost/preprocessor/facilities/detail/is_empty.hpp>\n#\n#if BOOST_PP_VARIADICS_MSVC && _MSC_VER <= 1400\n#\n#define BOOST_PP_IS_EMPTY(param) \\\n    BOOST_PP_DETAIL_IS_EMPTY_IIF \\\n      ( \\\n      BOOST_PP_IS_BEGIN_PARENS \\\n        ( \\\n        param \\\n        ) \\\n      ) \\\n      ( \\\n      BOOST_PP_IS_EMPTY_ZERO, \\\n      BOOST_PP_DETAIL_IS_EMPTY_PROCESS \\\n      ) \\\n    (param) \\\n/**/\n#define BOOST_PP_IS_EMPTY_ZERO(param) 0\n# else\n#define BOOST_PP_IS_EMPTY(...) \\\n    BOOST_PP_DETAIL_IS_EMPTY_IIF \\\n      ( \\\n      BOOST_PP_IS_BEGIN_PARENS \\\n        ( \\\n        __VA_ARGS__ \\\n        ) \\\n      ) \\\n      ( \\\n      BOOST_PP_IS_EMPTY_ZERO, \\\n      BOOST_PP_DETAIL_IS_EMPTY_PROCESS \\\n      ) \\\n    (__VA_ARGS__) \\\n/**/\n#define BOOST_PP_IS_EMPTY_ZERO(...) 0\n# endif /* BOOST_PP_VARIADICS_MSVC && _MSC_VER <= 1400 */\n# endif /* BOOST_PP_VARIADICS */\n# endif /* BOOST_PREPROCESSOR_FACILITIES_IS_EMPTY_VARIADIC_HPP */\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/facilities/overload.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2011.                                  *\n#  *     (C) Copyright Edward Diener 2011.                                    *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_FACILITIES_OVERLOAD_HPP\n# define BOOST_PREPROCESSOR_FACILITIES_OVERLOAD_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/variadic/size.hpp>\n#\n# /* BOOST_PP_OVERLOAD */\n#\n# if BOOST_PP_VARIADICS\n#    define BOOST_PP_OVERLOAD(prefix, ...) BOOST_PP_CAT(prefix, BOOST_PP_VARIADIC_SIZE(__VA_ARGS__))\n# endif\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/for.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_FOR_HPP\n# define BOOST_PREPROCESSOR_FOR_HPP\n#\n# include <boost/preprocessor/repetition/for.hpp>\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/identity.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_IDENTITY_HPP\n# define BOOST_PREPROCESSOR_IDENTITY_HPP\n#\n# include <boost/preprocessor/facilities/identity.hpp>\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/inc.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_INC_HPP\n# define BOOST_PREPROCESSOR_INC_HPP\n#\n# include <boost/preprocessor/arithmetic/inc.hpp>\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/iterate.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ITERATE_HPP\n# define BOOST_PREPROCESSOR_ITERATE_HPP\n#\n# include <boost/preprocessor/iteration/iterate.hpp>\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/iteration/detail/bounds/lower1.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_ITERATION_START_1\n#\n# undef BOOST_PP_ITERATION_START_1_DIGIT_1\n# undef BOOST_PP_ITERATION_START_1_DIGIT_2\n# undef BOOST_PP_ITERATION_START_1_DIGIT_3\n# undef BOOST_PP_ITERATION_START_1_DIGIT_4\n# undef BOOST_PP_ITERATION_START_1_DIGIT_5\n# undef BOOST_PP_ITERATION_START_1_DIGIT_6\n# undef BOOST_PP_ITERATION_START_1_DIGIT_7\n# undef BOOST_PP_ITERATION_START_1_DIGIT_8\n# undef BOOST_PP_ITERATION_START_1_DIGIT_9\n# undef BOOST_PP_ITERATION_START_1_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_ITERATION_START_1_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_ITERATION_START_1_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_ITERATION_START_1_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_ITERATION_START_1_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_ITERATION_START_1_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_ITERATION_START_1_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_ITERATION_START_1_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_ITERATION_START_1_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_ITERATION_START_1_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_ITERATION_START_1_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_ITERATION_START_1_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_ITERATION_START_1_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_ITERATION_START_1_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_ITERATION_START_1_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_ITERATION_START_1_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_ITERATION_START_1_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_ITERATION_START_1_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_ITERATION_START_1_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_ITERATION_START_1_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_ITERATION_START_1_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_ITERATION_START_1_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_ITERATION_START_1_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_ITERATION_START_1_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_ITERATION_START_1_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_ITERATION_START_1_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_ITERATION_START_1_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_ITERATION_START_1_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_ITERATION_START_1_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_ITERATION_START_1_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_ITERATION_START_1_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_ITERATION_START_1_DIGIT_3\n#    define BOOST_PP_ITERATION_START_1 BOOST_PP_SLOT_CC_3(BOOST_PP_ITERATION_START_1_DIGIT_3, BOOST_PP_ITERATION_START_1_DIGIT_2, BOOST_PP_ITERATION_START_1_DIGIT_1)\n# elif BOOST_PP_ITERATION_START_1_DIGIT_2\n#    define BOOST_PP_ITERATION_START_1 BOOST_PP_SLOT_CC_2(BOOST_PP_ITERATION_START_1_DIGIT_2, BOOST_PP_ITERATION_START_1_DIGIT_1)\n# else\n#    define BOOST_PP_ITERATION_START_1 BOOST_PP_ITERATION_START_1_DIGIT_1\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/iteration/detail/bounds/lower2.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_ITERATION_START_2\n#\n# undef BOOST_PP_ITERATION_START_2_DIGIT_1\n# undef BOOST_PP_ITERATION_START_2_DIGIT_2\n# undef BOOST_PP_ITERATION_START_2_DIGIT_3\n# undef BOOST_PP_ITERATION_START_2_DIGIT_4\n# undef BOOST_PP_ITERATION_START_2_DIGIT_5\n# undef BOOST_PP_ITERATION_START_2_DIGIT_6\n# undef BOOST_PP_ITERATION_START_2_DIGIT_7\n# undef BOOST_PP_ITERATION_START_2_DIGIT_8\n# undef BOOST_PP_ITERATION_START_2_DIGIT_9\n# undef BOOST_PP_ITERATION_START_2_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_ITERATION_START_2_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_ITERATION_START_2_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_ITERATION_START_2_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_ITERATION_START_2_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_ITERATION_START_2_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_ITERATION_START_2_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_ITERATION_START_2_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_ITERATION_START_2_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_ITERATION_START_2_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_ITERATION_START_2_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_ITERATION_START_2_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_ITERATION_START_2_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_ITERATION_START_2_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_ITERATION_START_2_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_ITERATION_START_2_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_ITERATION_START_2_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_ITERATION_START_2_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_ITERATION_START_2_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_ITERATION_START_2_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_ITERATION_START_2_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_ITERATION_START_2_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_ITERATION_START_2_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_ITERATION_START_2_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_ITERATION_START_2_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_ITERATION_START_2_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_ITERATION_START_2_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_ITERATION_START_2_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_ITERATION_START_2_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_ITERATION_START_2_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_ITERATION_START_2_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_ITERATION_START_2_DIGIT_3\n#    define BOOST_PP_ITERATION_START_2 BOOST_PP_SLOT_CC_3(BOOST_PP_ITERATION_START_2_DIGIT_3, BOOST_PP_ITERATION_START_2_DIGIT_2, BOOST_PP_ITERATION_START_2_DIGIT_1)\n# elif BOOST_PP_ITERATION_START_2_DIGIT_2\n#    define BOOST_PP_ITERATION_START_2 BOOST_PP_SLOT_CC_2(BOOST_PP_ITERATION_START_2_DIGIT_2, BOOST_PP_ITERATION_START_2_DIGIT_1)\n# else\n#    define BOOST_PP_ITERATION_START_2 BOOST_PP_ITERATION_START_2_DIGIT_1\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/iteration/detail/bounds/lower3.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_ITERATION_START_3\n#\n# undef BOOST_PP_ITERATION_START_3_DIGIT_1\n# undef BOOST_PP_ITERATION_START_3_DIGIT_2\n# undef BOOST_PP_ITERATION_START_3_DIGIT_3\n# undef BOOST_PP_ITERATION_START_3_DIGIT_4\n# undef BOOST_PP_ITERATION_START_3_DIGIT_5\n# undef BOOST_PP_ITERATION_START_3_DIGIT_6\n# undef BOOST_PP_ITERATION_START_3_DIGIT_7\n# undef BOOST_PP_ITERATION_START_3_DIGIT_8\n# undef BOOST_PP_ITERATION_START_3_DIGIT_9\n# undef BOOST_PP_ITERATION_START_3_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_ITERATION_START_3_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_ITERATION_START_3_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_ITERATION_START_3_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_ITERATION_START_3_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_ITERATION_START_3_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_ITERATION_START_3_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_ITERATION_START_3_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_ITERATION_START_3_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_ITERATION_START_3_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_ITERATION_START_3_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_ITERATION_START_3_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_ITERATION_START_3_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_ITERATION_START_3_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_ITERATION_START_3_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_ITERATION_START_3_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_ITERATION_START_3_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_ITERATION_START_3_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_ITERATION_START_3_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_ITERATION_START_3_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_ITERATION_START_3_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_ITERATION_START_3_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_ITERATION_START_3_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_ITERATION_START_3_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_ITERATION_START_3_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_ITERATION_START_3_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_ITERATION_START_3_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_ITERATION_START_3_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_ITERATION_START_3_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_ITERATION_START_3_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_ITERATION_START_3_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_ITERATION_START_3_DIGIT_3\n#    define BOOST_PP_ITERATION_START_3 BOOST_PP_SLOT_CC_3(BOOST_PP_ITERATION_START_3_DIGIT_3, BOOST_PP_ITERATION_START_3_DIGIT_2, BOOST_PP_ITERATION_START_3_DIGIT_1)\n# elif BOOST_PP_ITERATION_START_3_DIGIT_2\n#    define BOOST_PP_ITERATION_START_3 BOOST_PP_SLOT_CC_2(BOOST_PP_ITERATION_START_3_DIGIT_2, BOOST_PP_ITERATION_START_3_DIGIT_1)\n# else\n#    define BOOST_PP_ITERATION_START_3 BOOST_PP_ITERATION_START_3_DIGIT_1\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/iteration/detail/bounds/lower4.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_ITERATION_START_4\n#\n# undef BOOST_PP_ITERATION_START_4_DIGIT_1\n# undef BOOST_PP_ITERATION_START_4_DIGIT_2\n# undef BOOST_PP_ITERATION_START_4_DIGIT_3\n# undef BOOST_PP_ITERATION_START_4_DIGIT_4\n# undef BOOST_PP_ITERATION_START_4_DIGIT_5\n# undef BOOST_PP_ITERATION_START_4_DIGIT_6\n# undef BOOST_PP_ITERATION_START_4_DIGIT_7\n# undef BOOST_PP_ITERATION_START_4_DIGIT_8\n# undef BOOST_PP_ITERATION_START_4_DIGIT_9\n# undef BOOST_PP_ITERATION_START_4_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_ITERATION_START_4_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_ITERATION_START_4_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_ITERATION_START_4_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_ITERATION_START_4_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_ITERATION_START_4_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_ITERATION_START_4_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_ITERATION_START_4_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_ITERATION_START_4_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_ITERATION_START_4_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_ITERATION_START_4_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_ITERATION_START_4_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_ITERATION_START_4_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_ITERATION_START_4_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_ITERATION_START_4_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_ITERATION_START_4_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_ITERATION_START_4_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_ITERATION_START_4_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_ITERATION_START_4_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_ITERATION_START_4_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_ITERATION_START_4_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_ITERATION_START_4_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_ITERATION_START_4_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_ITERATION_START_4_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_ITERATION_START_4_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_ITERATION_START_4_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_ITERATION_START_4_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_ITERATION_START_4_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_ITERATION_START_4_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_ITERATION_START_4_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_ITERATION_START_4_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_ITERATION_START_4_DIGIT_3\n#    define BOOST_PP_ITERATION_START_4 BOOST_PP_SLOT_CC_3(BOOST_PP_ITERATION_START_4_DIGIT_3, BOOST_PP_ITERATION_START_4_DIGIT_2, BOOST_PP_ITERATION_START_4_DIGIT_1)\n# elif BOOST_PP_ITERATION_START_4_DIGIT_2\n#    define BOOST_PP_ITERATION_START_4 BOOST_PP_SLOT_CC_2(BOOST_PP_ITERATION_START_4_DIGIT_2, BOOST_PP_ITERATION_START_4_DIGIT_1)\n# else\n#    define BOOST_PP_ITERATION_START_4 BOOST_PP_ITERATION_START_4_DIGIT_1\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/iteration/detail/bounds/lower5.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_ITERATION_START_5\n#\n# undef BOOST_PP_ITERATION_START_5_DIGIT_1\n# undef BOOST_PP_ITERATION_START_5_DIGIT_2\n# undef BOOST_PP_ITERATION_START_5_DIGIT_3\n# undef BOOST_PP_ITERATION_START_5_DIGIT_4\n# undef BOOST_PP_ITERATION_START_5_DIGIT_5\n# undef BOOST_PP_ITERATION_START_5_DIGIT_6\n# undef BOOST_PP_ITERATION_START_5_DIGIT_7\n# undef BOOST_PP_ITERATION_START_5_DIGIT_8\n# undef BOOST_PP_ITERATION_START_5_DIGIT_9\n# undef BOOST_PP_ITERATION_START_5_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_ITERATION_START_5_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_ITERATION_START_5_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_ITERATION_START_5_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_ITERATION_START_5_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_ITERATION_START_5_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_ITERATION_START_5_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_ITERATION_START_5_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_ITERATION_START_5_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_ITERATION_START_5_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_ITERATION_START_5_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_ITERATION_START_5_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_ITERATION_START_5_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_ITERATION_START_5_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_ITERATION_START_5_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_ITERATION_START_5_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_ITERATION_START_5_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_ITERATION_START_5_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_ITERATION_START_5_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_ITERATION_START_5_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_ITERATION_START_5_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_ITERATION_START_5_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_ITERATION_START_5_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_ITERATION_START_5_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_ITERATION_START_5_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_ITERATION_START_5_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_ITERATION_START_5_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_ITERATION_START_5_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_ITERATION_START_5_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_ITERATION_START_5_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_ITERATION_START_5_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_ITERATION_START_5_DIGIT_3\n#    define BOOST_PP_ITERATION_START_5 BOOST_PP_SLOT_CC_3(BOOST_PP_ITERATION_START_5_DIGIT_3, BOOST_PP_ITERATION_START_5_DIGIT_2, BOOST_PP_ITERATION_START_5_DIGIT_1)\n# elif BOOST_PP_ITERATION_START_5_DIGIT_2\n#    define BOOST_PP_ITERATION_START_5 BOOST_PP_SLOT_CC_2(BOOST_PP_ITERATION_START_5_DIGIT_2, BOOST_PP_ITERATION_START_5_DIGIT_1)\n# else\n#    define BOOST_PP_ITERATION_START_5 BOOST_PP_ITERATION_START_5_DIGIT_1\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/iteration/detail/bounds/upper1.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_ITERATION_FINISH_1\n#\n# undef BOOST_PP_ITERATION_FINISH_1_DIGIT_1\n# undef BOOST_PP_ITERATION_FINISH_1_DIGIT_2\n# undef BOOST_PP_ITERATION_FINISH_1_DIGIT_3\n# undef BOOST_PP_ITERATION_FINISH_1_DIGIT_4\n# undef BOOST_PP_ITERATION_FINISH_1_DIGIT_5\n# undef BOOST_PP_ITERATION_FINISH_1_DIGIT_6\n# undef BOOST_PP_ITERATION_FINISH_1_DIGIT_7\n# undef BOOST_PP_ITERATION_FINISH_1_DIGIT_8\n# undef BOOST_PP_ITERATION_FINISH_1_DIGIT_9\n# undef BOOST_PP_ITERATION_FINISH_1_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_ITERATION_FINISH_1_DIGIT_3\n#    define BOOST_PP_ITERATION_FINISH_1 BOOST_PP_SLOT_CC_3(BOOST_PP_ITERATION_FINISH_1_DIGIT_3, BOOST_PP_ITERATION_FINISH_1_DIGIT_2, BOOST_PP_ITERATION_FINISH_1_DIGIT_1)\n# elif BOOST_PP_ITERATION_FINISH_1_DIGIT_2\n#    define BOOST_PP_ITERATION_FINISH_1 BOOST_PP_SLOT_CC_2(BOOST_PP_ITERATION_FINISH_1_DIGIT_2, BOOST_PP_ITERATION_FINISH_1_DIGIT_1)\n# else\n#    define BOOST_PP_ITERATION_FINISH_1 BOOST_PP_ITERATION_FINISH_1_DIGIT_1\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/iteration/detail/bounds/upper2.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_ITERATION_FINISH_2\n#\n# undef BOOST_PP_ITERATION_FINISH_2_DIGIT_1\n# undef BOOST_PP_ITERATION_FINISH_2_DIGIT_2\n# undef BOOST_PP_ITERATION_FINISH_2_DIGIT_3\n# undef BOOST_PP_ITERATION_FINISH_2_DIGIT_4\n# undef BOOST_PP_ITERATION_FINISH_2_DIGIT_5\n# undef BOOST_PP_ITERATION_FINISH_2_DIGIT_6\n# undef BOOST_PP_ITERATION_FINISH_2_DIGIT_7\n# undef BOOST_PP_ITERATION_FINISH_2_DIGIT_8\n# undef BOOST_PP_ITERATION_FINISH_2_DIGIT_9\n# undef BOOST_PP_ITERATION_FINISH_2_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_ITERATION_FINISH_2_DIGIT_3\n#    define BOOST_PP_ITERATION_FINISH_2 BOOST_PP_SLOT_CC_3(BOOST_PP_ITERATION_FINISH_2_DIGIT_3, BOOST_PP_ITERATION_FINISH_2_DIGIT_2, BOOST_PP_ITERATION_FINISH_2_DIGIT_1)\n# elif BOOST_PP_ITERATION_FINISH_2_DIGIT_2\n#    define BOOST_PP_ITERATION_FINISH_2 BOOST_PP_SLOT_CC_2(BOOST_PP_ITERATION_FINISH_2_DIGIT_2, BOOST_PP_ITERATION_FINISH_2_DIGIT_1)\n# else\n#    define BOOST_PP_ITERATION_FINISH_2 BOOST_PP_ITERATION_FINISH_2_DIGIT_1\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/iteration/detail/bounds/upper3.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_ITERATION_FINISH_3\n#\n# undef BOOST_PP_ITERATION_FINISH_3_DIGIT_1\n# undef BOOST_PP_ITERATION_FINISH_3_DIGIT_2\n# undef BOOST_PP_ITERATION_FINISH_3_DIGIT_3\n# undef BOOST_PP_ITERATION_FINISH_3_DIGIT_4\n# undef BOOST_PP_ITERATION_FINISH_3_DIGIT_5\n# undef BOOST_PP_ITERATION_FINISH_3_DIGIT_6\n# undef BOOST_PP_ITERATION_FINISH_3_DIGIT_7\n# undef BOOST_PP_ITERATION_FINISH_3_DIGIT_8\n# undef BOOST_PP_ITERATION_FINISH_3_DIGIT_9\n# undef BOOST_PP_ITERATION_FINISH_3_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_ITERATION_FINISH_3_DIGIT_3\n#    define BOOST_PP_ITERATION_FINISH_3 BOOST_PP_SLOT_CC_3(BOOST_PP_ITERATION_FINISH_3_DIGIT_3, BOOST_PP_ITERATION_FINISH_3_DIGIT_2, BOOST_PP_ITERATION_FINISH_3_DIGIT_1)\n# elif BOOST_PP_ITERATION_FINISH_3_DIGIT_2\n#    define BOOST_PP_ITERATION_FINISH_3 BOOST_PP_SLOT_CC_2(BOOST_PP_ITERATION_FINISH_3_DIGIT_2, BOOST_PP_ITERATION_FINISH_3_DIGIT_1)\n# else\n#    define BOOST_PP_ITERATION_FINISH_3 BOOST_PP_ITERATION_FINISH_3_DIGIT_1\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/iteration/detail/bounds/upper4.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_ITERATION_FINISH_4\n#\n# undef BOOST_PP_ITERATION_FINISH_4_DIGIT_1\n# undef BOOST_PP_ITERATION_FINISH_4_DIGIT_2\n# undef BOOST_PP_ITERATION_FINISH_4_DIGIT_3\n# undef BOOST_PP_ITERATION_FINISH_4_DIGIT_4\n# undef BOOST_PP_ITERATION_FINISH_4_DIGIT_5\n# undef BOOST_PP_ITERATION_FINISH_4_DIGIT_6\n# undef BOOST_PP_ITERATION_FINISH_4_DIGIT_7\n# undef BOOST_PP_ITERATION_FINISH_4_DIGIT_8\n# undef BOOST_PP_ITERATION_FINISH_4_DIGIT_9\n# undef BOOST_PP_ITERATION_FINISH_4_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_ITERATION_FINISH_4_DIGIT_3\n#    define BOOST_PP_ITERATION_FINISH_4 BOOST_PP_SLOT_CC_3(BOOST_PP_ITERATION_FINISH_4_DIGIT_3, BOOST_PP_ITERATION_FINISH_4_DIGIT_2, BOOST_PP_ITERATION_FINISH_4_DIGIT_1)\n# elif BOOST_PP_ITERATION_FINISH_4_DIGIT_2\n#    define BOOST_PP_ITERATION_FINISH_4 BOOST_PP_SLOT_CC_2(BOOST_PP_ITERATION_FINISH_4_DIGIT_2, BOOST_PP_ITERATION_FINISH_4_DIGIT_1)\n# else\n#    define BOOST_PP_ITERATION_FINISH_4 BOOST_PP_ITERATION_FINISH_4_DIGIT_1\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/iteration/detail/bounds/upper5.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_ITERATION_FINISH_5\n#\n# undef BOOST_PP_ITERATION_FINISH_5_DIGIT_1\n# undef BOOST_PP_ITERATION_FINISH_5_DIGIT_2\n# undef BOOST_PP_ITERATION_FINISH_5_DIGIT_3\n# undef BOOST_PP_ITERATION_FINISH_5_DIGIT_4\n# undef BOOST_PP_ITERATION_FINISH_5_DIGIT_5\n# undef BOOST_PP_ITERATION_FINISH_5_DIGIT_6\n# undef BOOST_PP_ITERATION_FINISH_5_DIGIT_7\n# undef BOOST_PP_ITERATION_FINISH_5_DIGIT_8\n# undef BOOST_PP_ITERATION_FINISH_5_DIGIT_9\n# undef BOOST_PP_ITERATION_FINISH_5_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_ITERATION_FINISH_5_DIGIT_3\n#    define BOOST_PP_ITERATION_FINISH_5 BOOST_PP_SLOT_CC_3(BOOST_PP_ITERATION_FINISH_5_DIGIT_3, BOOST_PP_ITERATION_FINISH_5_DIGIT_2, BOOST_PP_ITERATION_FINISH_5_DIGIT_1)\n# elif BOOST_PP_ITERATION_FINISH_5_DIGIT_2\n#    define BOOST_PP_ITERATION_FINISH_5 BOOST_PP_SLOT_CC_2(BOOST_PP_ITERATION_FINISH_5_DIGIT_2, BOOST_PP_ITERATION_FINISH_5_DIGIT_1)\n# else\n#    define BOOST_PP_ITERATION_FINISH_5 BOOST_PP_ITERATION_FINISH_5_DIGIT_1\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/iteration/detail/finish.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_LOCAL_FE\n#\n# undef BOOST_PP_LOCAL_FE_DIGIT_1\n# undef BOOST_PP_LOCAL_FE_DIGIT_2\n# undef BOOST_PP_LOCAL_FE_DIGIT_3\n# undef BOOST_PP_LOCAL_FE_DIGIT_4\n# undef BOOST_PP_LOCAL_FE_DIGIT_5\n# undef BOOST_PP_LOCAL_FE_DIGIT_6\n# undef BOOST_PP_LOCAL_FE_DIGIT_7\n# undef BOOST_PP_LOCAL_FE_DIGIT_8\n# undef BOOST_PP_LOCAL_FE_DIGIT_9\n# undef BOOST_PP_LOCAL_FE_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_LOCAL_FE_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_LOCAL_FE_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_LOCAL_FE_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_LOCAL_FE_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_LOCAL_FE_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_LOCAL_FE_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_LOCAL_FE_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_LOCAL_FE_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_LOCAL_FE_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_LOCAL_FE_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_LOCAL_FE_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_LOCAL_FE_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_LOCAL_FE_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_LOCAL_FE_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_LOCAL_FE_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_LOCAL_FE_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_LOCAL_FE_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_LOCAL_FE_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_LOCAL_FE_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_LOCAL_FE_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_LOCAL_FE_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_LOCAL_FE_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_LOCAL_FE_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_LOCAL_FE_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_LOCAL_FE_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_LOCAL_FE_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_LOCAL_FE_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_LOCAL_FE_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_LOCAL_FE_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_LOCAL_FE_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_LOCAL_FE_DIGIT_3\n#    define BOOST_PP_LOCAL_FE() BOOST_PP_SLOT_CC_3(BOOST_PP_LOCAL_FE_DIGIT_3, BOOST_PP_LOCAL_FE_DIGIT_2, BOOST_PP_LOCAL_FE_DIGIT_1)\n# elif BOOST_PP_LOCAL_FE_DIGIT_2\n#    define BOOST_PP_LOCAL_FE() BOOST_PP_SLOT_CC_2(BOOST_PP_LOCAL_FE_DIGIT_2, BOOST_PP_LOCAL_FE_DIGIT_1)\n# else\n#    define BOOST_PP_LOCAL_FE() BOOST_PP_LOCAL_FE_DIGIT_1\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/iteration/detail/iter/forward1.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# if defined(BOOST_PP_ITERATION_LIMITS)\n#    if !defined(BOOST_PP_FILENAME_1)\n#        error BOOST_PP_ERROR:  depth #1 filename is not defined\n#    endif\n#    define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_ITERATION_LIMITS)\n#    include <boost/preprocessor/iteration/detail/bounds/lower1.hpp>\n#    define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_ITERATION_LIMITS)\n#    include <boost/preprocessor/iteration/detail/bounds/upper1.hpp>\n#    define BOOST_PP_ITERATION_FLAGS_1() 0\n#    undef BOOST_PP_ITERATION_LIMITS\n# elif defined(BOOST_PP_ITERATION_PARAMS_1)\n#    define BOOST_PP_VALUE BOOST_PP_ARRAY_ELEM(0, BOOST_PP_ITERATION_PARAMS_1)\n#    include <boost/preprocessor/iteration/detail/bounds/lower1.hpp>\n#    define BOOST_PP_VALUE BOOST_PP_ARRAY_ELEM(1, BOOST_PP_ITERATION_PARAMS_1)\n#    include <boost/preprocessor/iteration/detail/bounds/upper1.hpp>\n#    define BOOST_PP_FILENAME_1 BOOST_PP_ARRAY_ELEM(2, BOOST_PP_ITERATION_PARAMS_1)\n#    if BOOST_PP_ARRAY_SIZE(BOOST_PP_ITERATION_PARAMS_1) >= 4\n#        define BOOST_PP_ITERATION_FLAGS_1() BOOST_PP_ARRAY_ELEM(3, BOOST_PP_ITERATION_PARAMS_1)\n#    else\n#        define BOOST_PP_ITERATION_FLAGS_1() 0\n#    endif\n# else\n#    error BOOST_PP_ERROR:  depth #1 iteration boundaries or filename not defined\n# endif\n#\n# undef BOOST_PP_ITERATION_DEPTH\n# define BOOST_PP_ITERATION_DEPTH() 1\n#\n# define BOOST_PP_IS_ITERATING 1\n#\n# if (BOOST_PP_ITERATION_START_1) > (BOOST_PP_ITERATION_FINISH_1)\n#    include <boost/preprocessor/iteration/detail/iter/reverse1.hpp>\n# else\n#    if BOOST_PP_ITERATION_START_1 <= 0 && BOOST_PP_ITERATION_FINISH_1 >= 0\n#        define BOOST_PP_ITERATION_1 0\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 1 && BOOST_PP_ITERATION_FINISH_1 >= 1\n#        define BOOST_PP_ITERATION_1 1\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 2 && BOOST_PP_ITERATION_FINISH_1 >= 2\n#        define BOOST_PP_ITERATION_1 2\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 3 && BOOST_PP_ITERATION_FINISH_1 >= 3\n#        define BOOST_PP_ITERATION_1 3\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 4 && BOOST_PP_ITERATION_FINISH_1 >= 4\n#        define BOOST_PP_ITERATION_1 4\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 5 && BOOST_PP_ITERATION_FINISH_1 >= 5\n#        define BOOST_PP_ITERATION_1 5\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 6 && BOOST_PP_ITERATION_FINISH_1 >= 6\n#        define BOOST_PP_ITERATION_1 6\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 7 && BOOST_PP_ITERATION_FINISH_1 >= 7\n#        define BOOST_PP_ITERATION_1 7\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 8 && BOOST_PP_ITERATION_FINISH_1 >= 8\n#        define BOOST_PP_ITERATION_1 8\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 9 && BOOST_PP_ITERATION_FINISH_1 >= 9\n#        define BOOST_PP_ITERATION_1 9\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 10 && BOOST_PP_ITERATION_FINISH_1 >= 10\n#        define BOOST_PP_ITERATION_1 10\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 11 && BOOST_PP_ITERATION_FINISH_1 >= 11\n#        define BOOST_PP_ITERATION_1 11\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 12 && BOOST_PP_ITERATION_FINISH_1 >= 12\n#        define BOOST_PP_ITERATION_1 12\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 13 && BOOST_PP_ITERATION_FINISH_1 >= 13\n#        define BOOST_PP_ITERATION_1 13\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 14 && BOOST_PP_ITERATION_FINISH_1 >= 14\n#        define BOOST_PP_ITERATION_1 14\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 15 && BOOST_PP_ITERATION_FINISH_1 >= 15\n#        define BOOST_PP_ITERATION_1 15\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 16 && BOOST_PP_ITERATION_FINISH_1 >= 16\n#        define BOOST_PP_ITERATION_1 16\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 17 && BOOST_PP_ITERATION_FINISH_1 >= 17\n#        define BOOST_PP_ITERATION_1 17\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 18 && BOOST_PP_ITERATION_FINISH_1 >= 18\n#        define BOOST_PP_ITERATION_1 18\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 19 && BOOST_PP_ITERATION_FINISH_1 >= 19\n#        define BOOST_PP_ITERATION_1 19\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 20 && BOOST_PP_ITERATION_FINISH_1 >= 20\n#        define BOOST_PP_ITERATION_1 20\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 21 && BOOST_PP_ITERATION_FINISH_1 >= 21\n#        define BOOST_PP_ITERATION_1 21\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 22 && BOOST_PP_ITERATION_FINISH_1 >= 22\n#        define BOOST_PP_ITERATION_1 22\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 23 && BOOST_PP_ITERATION_FINISH_1 >= 23\n#        define BOOST_PP_ITERATION_1 23\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 24 && BOOST_PP_ITERATION_FINISH_1 >= 24\n#        define BOOST_PP_ITERATION_1 24\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 25 && BOOST_PP_ITERATION_FINISH_1 >= 25\n#        define BOOST_PP_ITERATION_1 25\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 26 && BOOST_PP_ITERATION_FINISH_1 >= 26\n#        define BOOST_PP_ITERATION_1 26\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 27 && BOOST_PP_ITERATION_FINISH_1 >= 27\n#        define BOOST_PP_ITERATION_1 27\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 28 && BOOST_PP_ITERATION_FINISH_1 >= 28\n#        define BOOST_PP_ITERATION_1 28\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 29 && BOOST_PP_ITERATION_FINISH_1 >= 29\n#        define BOOST_PP_ITERATION_1 29\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 30 && BOOST_PP_ITERATION_FINISH_1 >= 30\n#        define BOOST_PP_ITERATION_1 30\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 31 && BOOST_PP_ITERATION_FINISH_1 >= 31\n#        define BOOST_PP_ITERATION_1 31\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 32 && BOOST_PP_ITERATION_FINISH_1 >= 32\n#        define BOOST_PP_ITERATION_1 32\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 33 && BOOST_PP_ITERATION_FINISH_1 >= 33\n#        define BOOST_PP_ITERATION_1 33\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 34 && BOOST_PP_ITERATION_FINISH_1 >= 34\n#        define BOOST_PP_ITERATION_1 34\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 35 && BOOST_PP_ITERATION_FINISH_1 >= 35\n#        define BOOST_PP_ITERATION_1 35\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 36 && BOOST_PP_ITERATION_FINISH_1 >= 36\n#        define BOOST_PP_ITERATION_1 36\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 37 && BOOST_PP_ITERATION_FINISH_1 >= 37\n#        define BOOST_PP_ITERATION_1 37\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 38 && BOOST_PP_ITERATION_FINISH_1 >= 38\n#        define BOOST_PP_ITERATION_1 38\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 39 && BOOST_PP_ITERATION_FINISH_1 >= 39\n#        define BOOST_PP_ITERATION_1 39\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 40 && BOOST_PP_ITERATION_FINISH_1 >= 40\n#        define BOOST_PP_ITERATION_1 40\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 41 && BOOST_PP_ITERATION_FINISH_1 >= 41\n#        define BOOST_PP_ITERATION_1 41\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 42 && BOOST_PP_ITERATION_FINISH_1 >= 42\n#        define BOOST_PP_ITERATION_1 42\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 43 && BOOST_PP_ITERATION_FINISH_1 >= 43\n#        define BOOST_PP_ITERATION_1 43\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 44 && BOOST_PP_ITERATION_FINISH_1 >= 44\n#        define BOOST_PP_ITERATION_1 44\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 45 && BOOST_PP_ITERATION_FINISH_1 >= 45\n#        define BOOST_PP_ITERATION_1 45\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 46 && BOOST_PP_ITERATION_FINISH_1 >= 46\n#        define BOOST_PP_ITERATION_1 46\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 47 && BOOST_PP_ITERATION_FINISH_1 >= 47\n#        define BOOST_PP_ITERATION_1 47\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 48 && BOOST_PP_ITERATION_FINISH_1 >= 48\n#        define BOOST_PP_ITERATION_1 48\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 49 && BOOST_PP_ITERATION_FINISH_1 >= 49\n#        define BOOST_PP_ITERATION_1 49\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 50 && BOOST_PP_ITERATION_FINISH_1 >= 50\n#        define BOOST_PP_ITERATION_1 50\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 51 && BOOST_PP_ITERATION_FINISH_1 >= 51\n#        define BOOST_PP_ITERATION_1 51\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 52 && BOOST_PP_ITERATION_FINISH_1 >= 52\n#        define BOOST_PP_ITERATION_1 52\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 53 && BOOST_PP_ITERATION_FINISH_1 >= 53\n#        define BOOST_PP_ITERATION_1 53\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 54 && BOOST_PP_ITERATION_FINISH_1 >= 54\n#        define BOOST_PP_ITERATION_1 54\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 55 && BOOST_PP_ITERATION_FINISH_1 >= 55\n#        define BOOST_PP_ITERATION_1 55\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 56 && BOOST_PP_ITERATION_FINISH_1 >= 56\n#        define BOOST_PP_ITERATION_1 56\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 57 && BOOST_PP_ITERATION_FINISH_1 >= 57\n#        define BOOST_PP_ITERATION_1 57\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 58 && BOOST_PP_ITERATION_FINISH_1 >= 58\n#        define BOOST_PP_ITERATION_1 58\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 59 && BOOST_PP_ITERATION_FINISH_1 >= 59\n#        define BOOST_PP_ITERATION_1 59\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 60 && BOOST_PP_ITERATION_FINISH_1 >= 60\n#        define BOOST_PP_ITERATION_1 60\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 61 && BOOST_PP_ITERATION_FINISH_1 >= 61\n#        define BOOST_PP_ITERATION_1 61\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 62 && BOOST_PP_ITERATION_FINISH_1 >= 62\n#        define BOOST_PP_ITERATION_1 62\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 63 && BOOST_PP_ITERATION_FINISH_1 >= 63\n#        define BOOST_PP_ITERATION_1 63\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 64 && BOOST_PP_ITERATION_FINISH_1 >= 64\n#        define BOOST_PP_ITERATION_1 64\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 65 && BOOST_PP_ITERATION_FINISH_1 >= 65\n#        define BOOST_PP_ITERATION_1 65\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 66 && BOOST_PP_ITERATION_FINISH_1 >= 66\n#        define BOOST_PP_ITERATION_1 66\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 67 && BOOST_PP_ITERATION_FINISH_1 >= 67\n#        define BOOST_PP_ITERATION_1 67\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 68 && BOOST_PP_ITERATION_FINISH_1 >= 68\n#        define BOOST_PP_ITERATION_1 68\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 69 && BOOST_PP_ITERATION_FINISH_1 >= 69\n#        define BOOST_PP_ITERATION_1 69\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 70 && BOOST_PP_ITERATION_FINISH_1 >= 70\n#        define BOOST_PP_ITERATION_1 70\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 71 && BOOST_PP_ITERATION_FINISH_1 >= 71\n#        define BOOST_PP_ITERATION_1 71\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 72 && BOOST_PP_ITERATION_FINISH_1 >= 72\n#        define BOOST_PP_ITERATION_1 72\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 73 && BOOST_PP_ITERATION_FINISH_1 >= 73\n#        define BOOST_PP_ITERATION_1 73\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 74 && BOOST_PP_ITERATION_FINISH_1 >= 74\n#        define BOOST_PP_ITERATION_1 74\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 75 && BOOST_PP_ITERATION_FINISH_1 >= 75\n#        define BOOST_PP_ITERATION_1 75\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 76 && BOOST_PP_ITERATION_FINISH_1 >= 76\n#        define BOOST_PP_ITERATION_1 76\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 77 && BOOST_PP_ITERATION_FINISH_1 >= 77\n#        define BOOST_PP_ITERATION_1 77\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 78 && BOOST_PP_ITERATION_FINISH_1 >= 78\n#        define BOOST_PP_ITERATION_1 78\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 79 && BOOST_PP_ITERATION_FINISH_1 >= 79\n#        define BOOST_PP_ITERATION_1 79\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 80 && BOOST_PP_ITERATION_FINISH_1 >= 80\n#        define BOOST_PP_ITERATION_1 80\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 81 && BOOST_PP_ITERATION_FINISH_1 >= 81\n#        define BOOST_PP_ITERATION_1 81\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 82 && BOOST_PP_ITERATION_FINISH_1 >= 82\n#        define BOOST_PP_ITERATION_1 82\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 83 && BOOST_PP_ITERATION_FINISH_1 >= 83\n#        define BOOST_PP_ITERATION_1 83\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 84 && BOOST_PP_ITERATION_FINISH_1 >= 84\n#        define BOOST_PP_ITERATION_1 84\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 85 && BOOST_PP_ITERATION_FINISH_1 >= 85\n#        define BOOST_PP_ITERATION_1 85\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 86 && BOOST_PP_ITERATION_FINISH_1 >= 86\n#        define BOOST_PP_ITERATION_1 86\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 87 && BOOST_PP_ITERATION_FINISH_1 >= 87\n#        define BOOST_PP_ITERATION_1 87\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 88 && BOOST_PP_ITERATION_FINISH_1 >= 88\n#        define BOOST_PP_ITERATION_1 88\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 89 && BOOST_PP_ITERATION_FINISH_1 >= 89\n#        define BOOST_PP_ITERATION_1 89\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 90 && BOOST_PP_ITERATION_FINISH_1 >= 90\n#        define BOOST_PP_ITERATION_1 90\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 91 && BOOST_PP_ITERATION_FINISH_1 >= 91\n#        define BOOST_PP_ITERATION_1 91\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 92 && BOOST_PP_ITERATION_FINISH_1 >= 92\n#        define BOOST_PP_ITERATION_1 92\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 93 && BOOST_PP_ITERATION_FINISH_1 >= 93\n#        define BOOST_PP_ITERATION_1 93\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 94 && BOOST_PP_ITERATION_FINISH_1 >= 94\n#        define BOOST_PP_ITERATION_1 94\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 95 && BOOST_PP_ITERATION_FINISH_1 >= 95\n#        define BOOST_PP_ITERATION_1 95\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 96 && BOOST_PP_ITERATION_FINISH_1 >= 96\n#        define BOOST_PP_ITERATION_1 96\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 97 && BOOST_PP_ITERATION_FINISH_1 >= 97\n#        define BOOST_PP_ITERATION_1 97\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 98 && BOOST_PP_ITERATION_FINISH_1 >= 98\n#        define BOOST_PP_ITERATION_1 98\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 99 && BOOST_PP_ITERATION_FINISH_1 >= 99\n#        define BOOST_PP_ITERATION_1 99\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 100 && BOOST_PP_ITERATION_FINISH_1 >= 100\n#        define BOOST_PP_ITERATION_1 100\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 101 && BOOST_PP_ITERATION_FINISH_1 >= 101\n#        define BOOST_PP_ITERATION_1 101\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 102 && BOOST_PP_ITERATION_FINISH_1 >= 102\n#        define BOOST_PP_ITERATION_1 102\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 103 && BOOST_PP_ITERATION_FINISH_1 >= 103\n#        define BOOST_PP_ITERATION_1 103\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 104 && BOOST_PP_ITERATION_FINISH_1 >= 104\n#        define BOOST_PP_ITERATION_1 104\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 105 && BOOST_PP_ITERATION_FINISH_1 >= 105\n#        define BOOST_PP_ITERATION_1 105\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 106 && BOOST_PP_ITERATION_FINISH_1 >= 106\n#        define BOOST_PP_ITERATION_1 106\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 107 && BOOST_PP_ITERATION_FINISH_1 >= 107\n#        define BOOST_PP_ITERATION_1 107\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 108 && BOOST_PP_ITERATION_FINISH_1 >= 108\n#        define BOOST_PP_ITERATION_1 108\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 109 && BOOST_PP_ITERATION_FINISH_1 >= 109\n#        define BOOST_PP_ITERATION_1 109\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 110 && BOOST_PP_ITERATION_FINISH_1 >= 110\n#        define BOOST_PP_ITERATION_1 110\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 111 && BOOST_PP_ITERATION_FINISH_1 >= 111\n#        define BOOST_PP_ITERATION_1 111\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 112 && BOOST_PP_ITERATION_FINISH_1 >= 112\n#        define BOOST_PP_ITERATION_1 112\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 113 && BOOST_PP_ITERATION_FINISH_1 >= 113\n#        define BOOST_PP_ITERATION_1 113\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 114 && BOOST_PP_ITERATION_FINISH_1 >= 114\n#        define BOOST_PP_ITERATION_1 114\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 115 && BOOST_PP_ITERATION_FINISH_1 >= 115\n#        define BOOST_PP_ITERATION_1 115\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 116 && BOOST_PP_ITERATION_FINISH_1 >= 116\n#        define BOOST_PP_ITERATION_1 116\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 117 && BOOST_PP_ITERATION_FINISH_1 >= 117\n#        define BOOST_PP_ITERATION_1 117\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 118 && BOOST_PP_ITERATION_FINISH_1 >= 118\n#        define BOOST_PP_ITERATION_1 118\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 119 && BOOST_PP_ITERATION_FINISH_1 >= 119\n#        define BOOST_PP_ITERATION_1 119\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 120 && BOOST_PP_ITERATION_FINISH_1 >= 120\n#        define BOOST_PP_ITERATION_1 120\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 121 && BOOST_PP_ITERATION_FINISH_1 >= 121\n#        define BOOST_PP_ITERATION_1 121\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 122 && BOOST_PP_ITERATION_FINISH_1 >= 122\n#        define BOOST_PP_ITERATION_1 122\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 123 && BOOST_PP_ITERATION_FINISH_1 >= 123\n#        define BOOST_PP_ITERATION_1 123\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 124 && BOOST_PP_ITERATION_FINISH_1 >= 124\n#        define BOOST_PP_ITERATION_1 124\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 125 && BOOST_PP_ITERATION_FINISH_1 >= 125\n#        define BOOST_PP_ITERATION_1 125\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 126 && BOOST_PP_ITERATION_FINISH_1 >= 126\n#        define BOOST_PP_ITERATION_1 126\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 127 && BOOST_PP_ITERATION_FINISH_1 >= 127\n#        define BOOST_PP_ITERATION_1 127\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 128 && BOOST_PP_ITERATION_FINISH_1 >= 128\n#        define BOOST_PP_ITERATION_1 128\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 129 && BOOST_PP_ITERATION_FINISH_1 >= 129\n#        define BOOST_PP_ITERATION_1 129\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 130 && BOOST_PP_ITERATION_FINISH_1 >= 130\n#        define BOOST_PP_ITERATION_1 130\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 131 && BOOST_PP_ITERATION_FINISH_1 >= 131\n#        define BOOST_PP_ITERATION_1 131\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 132 && BOOST_PP_ITERATION_FINISH_1 >= 132\n#        define BOOST_PP_ITERATION_1 132\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 133 && BOOST_PP_ITERATION_FINISH_1 >= 133\n#        define BOOST_PP_ITERATION_1 133\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 134 && BOOST_PP_ITERATION_FINISH_1 >= 134\n#        define BOOST_PP_ITERATION_1 134\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 135 && BOOST_PP_ITERATION_FINISH_1 >= 135\n#        define BOOST_PP_ITERATION_1 135\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 136 && BOOST_PP_ITERATION_FINISH_1 >= 136\n#        define BOOST_PP_ITERATION_1 136\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 137 && BOOST_PP_ITERATION_FINISH_1 >= 137\n#        define BOOST_PP_ITERATION_1 137\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 138 && BOOST_PP_ITERATION_FINISH_1 >= 138\n#        define BOOST_PP_ITERATION_1 138\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 139 && BOOST_PP_ITERATION_FINISH_1 >= 139\n#        define BOOST_PP_ITERATION_1 139\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 140 && BOOST_PP_ITERATION_FINISH_1 >= 140\n#        define BOOST_PP_ITERATION_1 140\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 141 && BOOST_PP_ITERATION_FINISH_1 >= 141\n#        define BOOST_PP_ITERATION_1 141\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 142 && BOOST_PP_ITERATION_FINISH_1 >= 142\n#        define BOOST_PP_ITERATION_1 142\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 143 && BOOST_PP_ITERATION_FINISH_1 >= 143\n#        define BOOST_PP_ITERATION_1 143\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 144 && BOOST_PP_ITERATION_FINISH_1 >= 144\n#        define BOOST_PP_ITERATION_1 144\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 145 && BOOST_PP_ITERATION_FINISH_1 >= 145\n#        define BOOST_PP_ITERATION_1 145\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 146 && BOOST_PP_ITERATION_FINISH_1 >= 146\n#        define BOOST_PP_ITERATION_1 146\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 147 && BOOST_PP_ITERATION_FINISH_1 >= 147\n#        define BOOST_PP_ITERATION_1 147\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 148 && BOOST_PP_ITERATION_FINISH_1 >= 148\n#        define BOOST_PP_ITERATION_1 148\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 149 && BOOST_PP_ITERATION_FINISH_1 >= 149\n#        define BOOST_PP_ITERATION_1 149\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 150 && BOOST_PP_ITERATION_FINISH_1 >= 150\n#        define BOOST_PP_ITERATION_1 150\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 151 && BOOST_PP_ITERATION_FINISH_1 >= 151\n#        define BOOST_PP_ITERATION_1 151\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 152 && BOOST_PP_ITERATION_FINISH_1 >= 152\n#        define BOOST_PP_ITERATION_1 152\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 153 && BOOST_PP_ITERATION_FINISH_1 >= 153\n#        define BOOST_PP_ITERATION_1 153\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 154 && BOOST_PP_ITERATION_FINISH_1 >= 154\n#        define BOOST_PP_ITERATION_1 154\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 155 && BOOST_PP_ITERATION_FINISH_1 >= 155\n#        define BOOST_PP_ITERATION_1 155\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 156 && BOOST_PP_ITERATION_FINISH_1 >= 156\n#        define BOOST_PP_ITERATION_1 156\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 157 && BOOST_PP_ITERATION_FINISH_1 >= 157\n#        define BOOST_PP_ITERATION_1 157\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 158 && BOOST_PP_ITERATION_FINISH_1 >= 158\n#        define BOOST_PP_ITERATION_1 158\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 159 && BOOST_PP_ITERATION_FINISH_1 >= 159\n#        define BOOST_PP_ITERATION_1 159\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 160 && BOOST_PP_ITERATION_FINISH_1 >= 160\n#        define BOOST_PP_ITERATION_1 160\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 161 && BOOST_PP_ITERATION_FINISH_1 >= 161\n#        define BOOST_PP_ITERATION_1 161\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 162 && BOOST_PP_ITERATION_FINISH_1 >= 162\n#        define BOOST_PP_ITERATION_1 162\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 163 && BOOST_PP_ITERATION_FINISH_1 >= 163\n#        define BOOST_PP_ITERATION_1 163\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 164 && BOOST_PP_ITERATION_FINISH_1 >= 164\n#        define BOOST_PP_ITERATION_1 164\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 165 && BOOST_PP_ITERATION_FINISH_1 >= 165\n#        define BOOST_PP_ITERATION_1 165\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 166 && BOOST_PP_ITERATION_FINISH_1 >= 166\n#        define BOOST_PP_ITERATION_1 166\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 167 && BOOST_PP_ITERATION_FINISH_1 >= 167\n#        define BOOST_PP_ITERATION_1 167\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 168 && BOOST_PP_ITERATION_FINISH_1 >= 168\n#        define BOOST_PP_ITERATION_1 168\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 169 && BOOST_PP_ITERATION_FINISH_1 >= 169\n#        define BOOST_PP_ITERATION_1 169\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 170 && BOOST_PP_ITERATION_FINISH_1 >= 170\n#        define BOOST_PP_ITERATION_1 170\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 171 && BOOST_PP_ITERATION_FINISH_1 >= 171\n#        define BOOST_PP_ITERATION_1 171\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 172 && BOOST_PP_ITERATION_FINISH_1 >= 172\n#        define BOOST_PP_ITERATION_1 172\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 173 && BOOST_PP_ITERATION_FINISH_1 >= 173\n#        define BOOST_PP_ITERATION_1 173\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 174 && BOOST_PP_ITERATION_FINISH_1 >= 174\n#        define BOOST_PP_ITERATION_1 174\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 175 && BOOST_PP_ITERATION_FINISH_1 >= 175\n#        define BOOST_PP_ITERATION_1 175\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 176 && BOOST_PP_ITERATION_FINISH_1 >= 176\n#        define BOOST_PP_ITERATION_1 176\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 177 && BOOST_PP_ITERATION_FINISH_1 >= 177\n#        define BOOST_PP_ITERATION_1 177\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 178 && BOOST_PP_ITERATION_FINISH_1 >= 178\n#        define BOOST_PP_ITERATION_1 178\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 179 && BOOST_PP_ITERATION_FINISH_1 >= 179\n#        define BOOST_PP_ITERATION_1 179\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 180 && BOOST_PP_ITERATION_FINISH_1 >= 180\n#        define BOOST_PP_ITERATION_1 180\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 181 && BOOST_PP_ITERATION_FINISH_1 >= 181\n#        define BOOST_PP_ITERATION_1 181\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 182 && BOOST_PP_ITERATION_FINISH_1 >= 182\n#        define BOOST_PP_ITERATION_1 182\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 183 && BOOST_PP_ITERATION_FINISH_1 >= 183\n#        define BOOST_PP_ITERATION_1 183\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 184 && BOOST_PP_ITERATION_FINISH_1 >= 184\n#        define BOOST_PP_ITERATION_1 184\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 185 && BOOST_PP_ITERATION_FINISH_1 >= 185\n#        define BOOST_PP_ITERATION_1 185\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 186 && BOOST_PP_ITERATION_FINISH_1 >= 186\n#        define BOOST_PP_ITERATION_1 186\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 187 && BOOST_PP_ITERATION_FINISH_1 >= 187\n#        define BOOST_PP_ITERATION_1 187\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 188 && BOOST_PP_ITERATION_FINISH_1 >= 188\n#        define BOOST_PP_ITERATION_1 188\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 189 && BOOST_PP_ITERATION_FINISH_1 >= 189\n#        define BOOST_PP_ITERATION_1 189\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 190 && BOOST_PP_ITERATION_FINISH_1 >= 190\n#        define BOOST_PP_ITERATION_1 190\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 191 && BOOST_PP_ITERATION_FINISH_1 >= 191\n#        define BOOST_PP_ITERATION_1 191\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 192 && BOOST_PP_ITERATION_FINISH_1 >= 192\n#        define BOOST_PP_ITERATION_1 192\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 193 && BOOST_PP_ITERATION_FINISH_1 >= 193\n#        define BOOST_PP_ITERATION_1 193\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 194 && BOOST_PP_ITERATION_FINISH_1 >= 194\n#        define BOOST_PP_ITERATION_1 194\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 195 && BOOST_PP_ITERATION_FINISH_1 >= 195\n#        define BOOST_PP_ITERATION_1 195\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 196 && BOOST_PP_ITERATION_FINISH_1 >= 196\n#        define BOOST_PP_ITERATION_1 196\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 197 && BOOST_PP_ITERATION_FINISH_1 >= 197\n#        define BOOST_PP_ITERATION_1 197\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 198 && BOOST_PP_ITERATION_FINISH_1 >= 198\n#        define BOOST_PP_ITERATION_1 198\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 199 && BOOST_PP_ITERATION_FINISH_1 >= 199\n#        define BOOST_PP_ITERATION_1 199\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 200 && BOOST_PP_ITERATION_FINISH_1 >= 200\n#        define BOOST_PP_ITERATION_1 200\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 201 && BOOST_PP_ITERATION_FINISH_1 >= 201\n#        define BOOST_PP_ITERATION_1 201\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 202 && BOOST_PP_ITERATION_FINISH_1 >= 202\n#        define BOOST_PP_ITERATION_1 202\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 203 && BOOST_PP_ITERATION_FINISH_1 >= 203\n#        define BOOST_PP_ITERATION_1 203\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 204 && BOOST_PP_ITERATION_FINISH_1 >= 204\n#        define BOOST_PP_ITERATION_1 204\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 205 && BOOST_PP_ITERATION_FINISH_1 >= 205\n#        define BOOST_PP_ITERATION_1 205\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 206 && BOOST_PP_ITERATION_FINISH_1 >= 206\n#        define BOOST_PP_ITERATION_1 206\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 207 && BOOST_PP_ITERATION_FINISH_1 >= 207\n#        define BOOST_PP_ITERATION_1 207\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 208 && BOOST_PP_ITERATION_FINISH_1 >= 208\n#        define BOOST_PP_ITERATION_1 208\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 209 && BOOST_PP_ITERATION_FINISH_1 >= 209\n#        define BOOST_PP_ITERATION_1 209\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 210 && BOOST_PP_ITERATION_FINISH_1 >= 210\n#        define BOOST_PP_ITERATION_1 210\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 211 && BOOST_PP_ITERATION_FINISH_1 >= 211\n#        define BOOST_PP_ITERATION_1 211\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 212 && BOOST_PP_ITERATION_FINISH_1 >= 212\n#        define BOOST_PP_ITERATION_1 212\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 213 && BOOST_PP_ITERATION_FINISH_1 >= 213\n#        define BOOST_PP_ITERATION_1 213\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 214 && BOOST_PP_ITERATION_FINISH_1 >= 214\n#        define BOOST_PP_ITERATION_1 214\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 215 && BOOST_PP_ITERATION_FINISH_1 >= 215\n#        define BOOST_PP_ITERATION_1 215\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 216 && BOOST_PP_ITERATION_FINISH_1 >= 216\n#        define BOOST_PP_ITERATION_1 216\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 217 && BOOST_PP_ITERATION_FINISH_1 >= 217\n#        define BOOST_PP_ITERATION_1 217\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 218 && BOOST_PP_ITERATION_FINISH_1 >= 218\n#        define BOOST_PP_ITERATION_1 218\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 219 && BOOST_PP_ITERATION_FINISH_1 >= 219\n#        define BOOST_PP_ITERATION_1 219\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 220 && BOOST_PP_ITERATION_FINISH_1 >= 220\n#        define BOOST_PP_ITERATION_1 220\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 221 && BOOST_PP_ITERATION_FINISH_1 >= 221\n#        define BOOST_PP_ITERATION_1 221\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 222 && BOOST_PP_ITERATION_FINISH_1 >= 222\n#        define BOOST_PP_ITERATION_1 222\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 223 && BOOST_PP_ITERATION_FINISH_1 >= 223\n#        define BOOST_PP_ITERATION_1 223\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 224 && BOOST_PP_ITERATION_FINISH_1 >= 224\n#        define BOOST_PP_ITERATION_1 224\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 225 && BOOST_PP_ITERATION_FINISH_1 >= 225\n#        define BOOST_PP_ITERATION_1 225\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 226 && BOOST_PP_ITERATION_FINISH_1 >= 226\n#        define BOOST_PP_ITERATION_1 226\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 227 && BOOST_PP_ITERATION_FINISH_1 >= 227\n#        define BOOST_PP_ITERATION_1 227\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 228 && BOOST_PP_ITERATION_FINISH_1 >= 228\n#        define BOOST_PP_ITERATION_1 228\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 229 && BOOST_PP_ITERATION_FINISH_1 >= 229\n#        define BOOST_PP_ITERATION_1 229\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 230 && BOOST_PP_ITERATION_FINISH_1 >= 230\n#        define BOOST_PP_ITERATION_1 230\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 231 && BOOST_PP_ITERATION_FINISH_1 >= 231\n#        define BOOST_PP_ITERATION_1 231\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 232 && BOOST_PP_ITERATION_FINISH_1 >= 232\n#        define BOOST_PP_ITERATION_1 232\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 233 && BOOST_PP_ITERATION_FINISH_1 >= 233\n#        define BOOST_PP_ITERATION_1 233\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 234 && BOOST_PP_ITERATION_FINISH_1 >= 234\n#        define BOOST_PP_ITERATION_1 234\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 235 && BOOST_PP_ITERATION_FINISH_1 >= 235\n#        define BOOST_PP_ITERATION_1 235\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 236 && BOOST_PP_ITERATION_FINISH_1 >= 236\n#        define BOOST_PP_ITERATION_1 236\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 237 && BOOST_PP_ITERATION_FINISH_1 >= 237\n#        define BOOST_PP_ITERATION_1 237\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 238 && BOOST_PP_ITERATION_FINISH_1 >= 238\n#        define BOOST_PP_ITERATION_1 238\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 239 && BOOST_PP_ITERATION_FINISH_1 >= 239\n#        define BOOST_PP_ITERATION_1 239\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 240 && BOOST_PP_ITERATION_FINISH_1 >= 240\n#        define BOOST_PP_ITERATION_1 240\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 241 && BOOST_PP_ITERATION_FINISH_1 >= 241\n#        define BOOST_PP_ITERATION_1 241\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 242 && BOOST_PP_ITERATION_FINISH_1 >= 242\n#        define BOOST_PP_ITERATION_1 242\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 243 && BOOST_PP_ITERATION_FINISH_1 >= 243\n#        define BOOST_PP_ITERATION_1 243\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 244 && BOOST_PP_ITERATION_FINISH_1 >= 244\n#        define BOOST_PP_ITERATION_1 244\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 245 && BOOST_PP_ITERATION_FINISH_1 >= 245\n#        define BOOST_PP_ITERATION_1 245\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 246 && BOOST_PP_ITERATION_FINISH_1 >= 246\n#        define BOOST_PP_ITERATION_1 246\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 247 && BOOST_PP_ITERATION_FINISH_1 >= 247\n#        define BOOST_PP_ITERATION_1 247\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 248 && BOOST_PP_ITERATION_FINISH_1 >= 248\n#        define BOOST_PP_ITERATION_1 248\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 249 && BOOST_PP_ITERATION_FINISH_1 >= 249\n#        define BOOST_PP_ITERATION_1 249\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 250 && BOOST_PP_ITERATION_FINISH_1 >= 250\n#        define BOOST_PP_ITERATION_1 250\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 251 && BOOST_PP_ITERATION_FINISH_1 >= 251\n#        define BOOST_PP_ITERATION_1 251\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 252 && BOOST_PP_ITERATION_FINISH_1 >= 252\n#        define BOOST_PP_ITERATION_1 252\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 253 && BOOST_PP_ITERATION_FINISH_1 >= 253\n#        define BOOST_PP_ITERATION_1 253\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 254 && BOOST_PP_ITERATION_FINISH_1 >= 254\n#        define BOOST_PP_ITERATION_1 254\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 255 && BOOST_PP_ITERATION_FINISH_1 >= 255\n#        define BOOST_PP_ITERATION_1 255\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 256 && BOOST_PP_ITERATION_FINISH_1 >= 256\n#        define BOOST_PP_ITERATION_1 256\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n# endif\n#\n# undef BOOST_PP_IS_ITERATING\n#\n# undef BOOST_PP_ITERATION_DEPTH\n# define BOOST_PP_ITERATION_DEPTH() 0\n#\n# undef BOOST_PP_ITERATION_START_1\n# undef BOOST_PP_ITERATION_FINISH_1\n# undef BOOST_PP_FILENAME_1\n#\n# undef BOOST_PP_ITERATION_FLAGS_1\n# undef BOOST_PP_ITERATION_PARAMS_1\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/iteration/detail/iter/forward2.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# if defined(BOOST_PP_ITERATION_LIMITS)\n#    if !defined(BOOST_PP_FILENAME_2)\n#        error BOOST_PP_ERROR:  depth #2 filename is not defined\n#    endif\n#    define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_ITERATION_LIMITS)\n#    include <boost/preprocessor/iteration/detail/bounds/lower2.hpp>\n#    define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_ITERATION_LIMITS)\n#    include <boost/preprocessor/iteration/detail/bounds/upper2.hpp>\n#    define BOOST_PP_ITERATION_FLAGS_2() 0\n#    undef BOOST_PP_ITERATION_LIMITS\n# elif defined(BOOST_PP_ITERATION_PARAMS_2)\n#    define BOOST_PP_VALUE BOOST_PP_ARRAY_ELEM(0, BOOST_PP_ITERATION_PARAMS_2)\n#    include <boost/preprocessor/iteration/detail/bounds/lower2.hpp>\n#    define BOOST_PP_VALUE BOOST_PP_ARRAY_ELEM(1, BOOST_PP_ITERATION_PARAMS_2)\n#    include <boost/preprocessor/iteration/detail/bounds/upper2.hpp>\n#    define BOOST_PP_FILENAME_2 BOOST_PP_ARRAY_ELEM(2, BOOST_PP_ITERATION_PARAMS_2)\n#    if BOOST_PP_ARRAY_SIZE(BOOST_PP_ITERATION_PARAMS_2) >= 4\n#        define BOOST_PP_ITERATION_FLAGS_2() BOOST_PP_ARRAY_ELEM(3, BOOST_PP_ITERATION_PARAMS_2)\n#    else\n#        define BOOST_PP_ITERATION_FLAGS_2() 0\n#    endif\n# else\n#    error BOOST_PP_ERROR:  depth #2 iteration boundaries or filename not defined\n# endif\n#\n# undef BOOST_PP_ITERATION_DEPTH\n# define BOOST_PP_ITERATION_DEPTH() 2\n#\n# if (BOOST_PP_ITERATION_START_2) > (BOOST_PP_ITERATION_FINISH_2)\n#    include <boost/preprocessor/iteration/detail/iter/reverse2.hpp>\n# else\n#    if BOOST_PP_ITERATION_START_2 <= 0 && BOOST_PP_ITERATION_FINISH_2 >= 0\n#        define BOOST_PP_ITERATION_2 0\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 1 && BOOST_PP_ITERATION_FINISH_2 >= 1\n#        define BOOST_PP_ITERATION_2 1\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 2 && BOOST_PP_ITERATION_FINISH_2 >= 2\n#        define BOOST_PP_ITERATION_2 2\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 3 && BOOST_PP_ITERATION_FINISH_2 >= 3\n#        define BOOST_PP_ITERATION_2 3\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 4 && BOOST_PP_ITERATION_FINISH_2 >= 4\n#        define BOOST_PP_ITERATION_2 4\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 5 && BOOST_PP_ITERATION_FINISH_2 >= 5\n#        define BOOST_PP_ITERATION_2 5\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 6 && BOOST_PP_ITERATION_FINISH_2 >= 6\n#        define BOOST_PP_ITERATION_2 6\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 7 && BOOST_PP_ITERATION_FINISH_2 >= 7\n#        define BOOST_PP_ITERATION_2 7\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 8 && BOOST_PP_ITERATION_FINISH_2 >= 8\n#        define BOOST_PP_ITERATION_2 8\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 9 && BOOST_PP_ITERATION_FINISH_2 >= 9\n#        define BOOST_PP_ITERATION_2 9\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 10 && BOOST_PP_ITERATION_FINISH_2 >= 10\n#        define BOOST_PP_ITERATION_2 10\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 11 && BOOST_PP_ITERATION_FINISH_2 >= 11\n#        define BOOST_PP_ITERATION_2 11\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 12 && BOOST_PP_ITERATION_FINISH_2 >= 12\n#        define BOOST_PP_ITERATION_2 12\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 13 && BOOST_PP_ITERATION_FINISH_2 >= 13\n#        define BOOST_PP_ITERATION_2 13\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 14 && BOOST_PP_ITERATION_FINISH_2 >= 14\n#        define BOOST_PP_ITERATION_2 14\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 15 && BOOST_PP_ITERATION_FINISH_2 >= 15\n#        define BOOST_PP_ITERATION_2 15\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 16 && BOOST_PP_ITERATION_FINISH_2 >= 16\n#        define BOOST_PP_ITERATION_2 16\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 17 && BOOST_PP_ITERATION_FINISH_2 >= 17\n#        define BOOST_PP_ITERATION_2 17\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 18 && BOOST_PP_ITERATION_FINISH_2 >= 18\n#        define BOOST_PP_ITERATION_2 18\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 19 && BOOST_PP_ITERATION_FINISH_2 >= 19\n#        define BOOST_PP_ITERATION_2 19\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 20 && BOOST_PP_ITERATION_FINISH_2 >= 20\n#        define BOOST_PP_ITERATION_2 20\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 21 && BOOST_PP_ITERATION_FINISH_2 >= 21\n#        define BOOST_PP_ITERATION_2 21\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 22 && BOOST_PP_ITERATION_FINISH_2 >= 22\n#        define BOOST_PP_ITERATION_2 22\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 23 && BOOST_PP_ITERATION_FINISH_2 >= 23\n#        define BOOST_PP_ITERATION_2 23\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 24 && BOOST_PP_ITERATION_FINISH_2 >= 24\n#        define BOOST_PP_ITERATION_2 24\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 25 && BOOST_PP_ITERATION_FINISH_2 >= 25\n#        define BOOST_PP_ITERATION_2 25\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 26 && BOOST_PP_ITERATION_FINISH_2 >= 26\n#        define BOOST_PP_ITERATION_2 26\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 27 && BOOST_PP_ITERATION_FINISH_2 >= 27\n#        define BOOST_PP_ITERATION_2 27\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 28 && BOOST_PP_ITERATION_FINISH_2 >= 28\n#        define BOOST_PP_ITERATION_2 28\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 29 && BOOST_PP_ITERATION_FINISH_2 >= 29\n#        define BOOST_PP_ITERATION_2 29\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 30 && BOOST_PP_ITERATION_FINISH_2 >= 30\n#        define BOOST_PP_ITERATION_2 30\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 31 && BOOST_PP_ITERATION_FINISH_2 >= 31\n#        define BOOST_PP_ITERATION_2 31\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 32 && BOOST_PP_ITERATION_FINISH_2 >= 32\n#        define BOOST_PP_ITERATION_2 32\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 33 && BOOST_PP_ITERATION_FINISH_2 >= 33\n#        define BOOST_PP_ITERATION_2 33\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 34 && BOOST_PP_ITERATION_FINISH_2 >= 34\n#        define BOOST_PP_ITERATION_2 34\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 35 && BOOST_PP_ITERATION_FINISH_2 >= 35\n#        define BOOST_PP_ITERATION_2 35\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 36 && BOOST_PP_ITERATION_FINISH_2 >= 36\n#        define BOOST_PP_ITERATION_2 36\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 37 && BOOST_PP_ITERATION_FINISH_2 >= 37\n#        define BOOST_PP_ITERATION_2 37\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 38 && BOOST_PP_ITERATION_FINISH_2 >= 38\n#        define BOOST_PP_ITERATION_2 38\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 39 && BOOST_PP_ITERATION_FINISH_2 >= 39\n#        define BOOST_PP_ITERATION_2 39\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 40 && BOOST_PP_ITERATION_FINISH_2 >= 40\n#        define BOOST_PP_ITERATION_2 40\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 41 && BOOST_PP_ITERATION_FINISH_2 >= 41\n#        define BOOST_PP_ITERATION_2 41\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 42 && BOOST_PP_ITERATION_FINISH_2 >= 42\n#        define BOOST_PP_ITERATION_2 42\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 43 && BOOST_PP_ITERATION_FINISH_2 >= 43\n#        define BOOST_PP_ITERATION_2 43\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 44 && BOOST_PP_ITERATION_FINISH_2 >= 44\n#        define BOOST_PP_ITERATION_2 44\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 45 && BOOST_PP_ITERATION_FINISH_2 >= 45\n#        define BOOST_PP_ITERATION_2 45\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 46 && BOOST_PP_ITERATION_FINISH_2 >= 46\n#        define BOOST_PP_ITERATION_2 46\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 47 && BOOST_PP_ITERATION_FINISH_2 >= 47\n#        define BOOST_PP_ITERATION_2 47\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 48 && BOOST_PP_ITERATION_FINISH_2 >= 48\n#        define BOOST_PP_ITERATION_2 48\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 49 && BOOST_PP_ITERATION_FINISH_2 >= 49\n#        define BOOST_PP_ITERATION_2 49\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 50 && BOOST_PP_ITERATION_FINISH_2 >= 50\n#        define BOOST_PP_ITERATION_2 50\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 51 && BOOST_PP_ITERATION_FINISH_2 >= 51\n#        define BOOST_PP_ITERATION_2 51\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 52 && BOOST_PP_ITERATION_FINISH_2 >= 52\n#        define BOOST_PP_ITERATION_2 52\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 53 && BOOST_PP_ITERATION_FINISH_2 >= 53\n#        define BOOST_PP_ITERATION_2 53\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 54 && BOOST_PP_ITERATION_FINISH_2 >= 54\n#        define BOOST_PP_ITERATION_2 54\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 55 && BOOST_PP_ITERATION_FINISH_2 >= 55\n#        define BOOST_PP_ITERATION_2 55\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 56 && BOOST_PP_ITERATION_FINISH_2 >= 56\n#        define BOOST_PP_ITERATION_2 56\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 57 && BOOST_PP_ITERATION_FINISH_2 >= 57\n#        define BOOST_PP_ITERATION_2 57\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 58 && BOOST_PP_ITERATION_FINISH_2 >= 58\n#        define BOOST_PP_ITERATION_2 58\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 59 && BOOST_PP_ITERATION_FINISH_2 >= 59\n#        define BOOST_PP_ITERATION_2 59\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 60 && BOOST_PP_ITERATION_FINISH_2 >= 60\n#        define BOOST_PP_ITERATION_2 60\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 61 && BOOST_PP_ITERATION_FINISH_2 >= 61\n#        define BOOST_PP_ITERATION_2 61\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 62 && BOOST_PP_ITERATION_FINISH_2 >= 62\n#        define BOOST_PP_ITERATION_2 62\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 63 && BOOST_PP_ITERATION_FINISH_2 >= 63\n#        define BOOST_PP_ITERATION_2 63\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 64 && BOOST_PP_ITERATION_FINISH_2 >= 64\n#        define BOOST_PP_ITERATION_2 64\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 65 && BOOST_PP_ITERATION_FINISH_2 >= 65\n#        define BOOST_PP_ITERATION_2 65\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 66 && BOOST_PP_ITERATION_FINISH_2 >= 66\n#        define BOOST_PP_ITERATION_2 66\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 67 && BOOST_PP_ITERATION_FINISH_2 >= 67\n#        define BOOST_PP_ITERATION_2 67\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 68 && BOOST_PP_ITERATION_FINISH_2 >= 68\n#        define BOOST_PP_ITERATION_2 68\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 69 && BOOST_PP_ITERATION_FINISH_2 >= 69\n#        define BOOST_PP_ITERATION_2 69\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 70 && BOOST_PP_ITERATION_FINISH_2 >= 70\n#        define BOOST_PP_ITERATION_2 70\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 71 && BOOST_PP_ITERATION_FINISH_2 >= 71\n#        define BOOST_PP_ITERATION_2 71\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 72 && BOOST_PP_ITERATION_FINISH_2 >= 72\n#        define BOOST_PP_ITERATION_2 72\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 73 && BOOST_PP_ITERATION_FINISH_2 >= 73\n#        define BOOST_PP_ITERATION_2 73\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 74 && BOOST_PP_ITERATION_FINISH_2 >= 74\n#        define BOOST_PP_ITERATION_2 74\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 75 && BOOST_PP_ITERATION_FINISH_2 >= 75\n#        define BOOST_PP_ITERATION_2 75\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 76 && BOOST_PP_ITERATION_FINISH_2 >= 76\n#        define BOOST_PP_ITERATION_2 76\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 77 && BOOST_PP_ITERATION_FINISH_2 >= 77\n#        define BOOST_PP_ITERATION_2 77\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 78 && BOOST_PP_ITERATION_FINISH_2 >= 78\n#        define BOOST_PP_ITERATION_2 78\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 79 && BOOST_PP_ITERATION_FINISH_2 >= 79\n#        define BOOST_PP_ITERATION_2 79\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 80 && BOOST_PP_ITERATION_FINISH_2 >= 80\n#        define BOOST_PP_ITERATION_2 80\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 81 && BOOST_PP_ITERATION_FINISH_2 >= 81\n#        define BOOST_PP_ITERATION_2 81\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 82 && BOOST_PP_ITERATION_FINISH_2 >= 82\n#        define BOOST_PP_ITERATION_2 82\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 83 && BOOST_PP_ITERATION_FINISH_2 >= 83\n#        define BOOST_PP_ITERATION_2 83\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 84 && BOOST_PP_ITERATION_FINISH_2 >= 84\n#        define BOOST_PP_ITERATION_2 84\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 85 && BOOST_PP_ITERATION_FINISH_2 >= 85\n#        define BOOST_PP_ITERATION_2 85\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 86 && BOOST_PP_ITERATION_FINISH_2 >= 86\n#        define BOOST_PP_ITERATION_2 86\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 87 && BOOST_PP_ITERATION_FINISH_2 >= 87\n#        define BOOST_PP_ITERATION_2 87\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 88 && BOOST_PP_ITERATION_FINISH_2 >= 88\n#        define BOOST_PP_ITERATION_2 88\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 89 && BOOST_PP_ITERATION_FINISH_2 >= 89\n#        define BOOST_PP_ITERATION_2 89\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 90 && BOOST_PP_ITERATION_FINISH_2 >= 90\n#        define BOOST_PP_ITERATION_2 90\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 91 && BOOST_PP_ITERATION_FINISH_2 >= 91\n#        define BOOST_PP_ITERATION_2 91\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 92 && BOOST_PP_ITERATION_FINISH_2 >= 92\n#        define BOOST_PP_ITERATION_2 92\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 93 && BOOST_PP_ITERATION_FINISH_2 >= 93\n#        define BOOST_PP_ITERATION_2 93\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 94 && BOOST_PP_ITERATION_FINISH_2 >= 94\n#        define BOOST_PP_ITERATION_2 94\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 95 && BOOST_PP_ITERATION_FINISH_2 >= 95\n#        define BOOST_PP_ITERATION_2 95\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 96 && BOOST_PP_ITERATION_FINISH_2 >= 96\n#        define BOOST_PP_ITERATION_2 96\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 97 && BOOST_PP_ITERATION_FINISH_2 >= 97\n#        define BOOST_PP_ITERATION_2 97\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 98 && BOOST_PP_ITERATION_FINISH_2 >= 98\n#        define BOOST_PP_ITERATION_2 98\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 99 && BOOST_PP_ITERATION_FINISH_2 >= 99\n#        define BOOST_PP_ITERATION_2 99\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 100 && BOOST_PP_ITERATION_FINISH_2 >= 100\n#        define BOOST_PP_ITERATION_2 100\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 101 && BOOST_PP_ITERATION_FINISH_2 >= 101\n#        define BOOST_PP_ITERATION_2 101\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 102 && BOOST_PP_ITERATION_FINISH_2 >= 102\n#        define BOOST_PP_ITERATION_2 102\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 103 && BOOST_PP_ITERATION_FINISH_2 >= 103\n#        define BOOST_PP_ITERATION_2 103\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 104 && BOOST_PP_ITERATION_FINISH_2 >= 104\n#        define BOOST_PP_ITERATION_2 104\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 105 && BOOST_PP_ITERATION_FINISH_2 >= 105\n#        define BOOST_PP_ITERATION_2 105\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 106 && BOOST_PP_ITERATION_FINISH_2 >= 106\n#        define BOOST_PP_ITERATION_2 106\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 107 && BOOST_PP_ITERATION_FINISH_2 >= 107\n#        define BOOST_PP_ITERATION_2 107\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 108 && BOOST_PP_ITERATION_FINISH_2 >= 108\n#        define BOOST_PP_ITERATION_2 108\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 109 && BOOST_PP_ITERATION_FINISH_2 >= 109\n#        define BOOST_PP_ITERATION_2 109\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 110 && BOOST_PP_ITERATION_FINISH_2 >= 110\n#        define BOOST_PP_ITERATION_2 110\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 111 && BOOST_PP_ITERATION_FINISH_2 >= 111\n#        define BOOST_PP_ITERATION_2 111\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 112 && BOOST_PP_ITERATION_FINISH_2 >= 112\n#        define BOOST_PP_ITERATION_2 112\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 113 && BOOST_PP_ITERATION_FINISH_2 >= 113\n#        define BOOST_PP_ITERATION_2 113\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 114 && BOOST_PP_ITERATION_FINISH_2 >= 114\n#        define BOOST_PP_ITERATION_2 114\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 115 && BOOST_PP_ITERATION_FINISH_2 >= 115\n#        define BOOST_PP_ITERATION_2 115\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 116 && BOOST_PP_ITERATION_FINISH_2 >= 116\n#        define BOOST_PP_ITERATION_2 116\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 117 && BOOST_PP_ITERATION_FINISH_2 >= 117\n#        define BOOST_PP_ITERATION_2 117\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 118 && BOOST_PP_ITERATION_FINISH_2 >= 118\n#        define BOOST_PP_ITERATION_2 118\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 119 && BOOST_PP_ITERATION_FINISH_2 >= 119\n#        define BOOST_PP_ITERATION_2 119\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 120 && BOOST_PP_ITERATION_FINISH_2 >= 120\n#        define BOOST_PP_ITERATION_2 120\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 121 && BOOST_PP_ITERATION_FINISH_2 >= 121\n#        define BOOST_PP_ITERATION_2 121\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 122 && BOOST_PP_ITERATION_FINISH_2 >= 122\n#        define BOOST_PP_ITERATION_2 122\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 123 && BOOST_PP_ITERATION_FINISH_2 >= 123\n#        define BOOST_PP_ITERATION_2 123\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 124 && BOOST_PP_ITERATION_FINISH_2 >= 124\n#        define BOOST_PP_ITERATION_2 124\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 125 && BOOST_PP_ITERATION_FINISH_2 >= 125\n#        define BOOST_PP_ITERATION_2 125\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 126 && BOOST_PP_ITERATION_FINISH_2 >= 126\n#        define BOOST_PP_ITERATION_2 126\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 127 && BOOST_PP_ITERATION_FINISH_2 >= 127\n#        define BOOST_PP_ITERATION_2 127\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 128 && BOOST_PP_ITERATION_FINISH_2 >= 128\n#        define BOOST_PP_ITERATION_2 128\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 129 && BOOST_PP_ITERATION_FINISH_2 >= 129\n#        define BOOST_PP_ITERATION_2 129\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 130 && BOOST_PP_ITERATION_FINISH_2 >= 130\n#        define BOOST_PP_ITERATION_2 130\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 131 && BOOST_PP_ITERATION_FINISH_2 >= 131\n#        define BOOST_PP_ITERATION_2 131\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 132 && BOOST_PP_ITERATION_FINISH_2 >= 132\n#        define BOOST_PP_ITERATION_2 132\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 133 && BOOST_PP_ITERATION_FINISH_2 >= 133\n#        define BOOST_PP_ITERATION_2 133\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 134 && BOOST_PP_ITERATION_FINISH_2 >= 134\n#        define BOOST_PP_ITERATION_2 134\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 135 && BOOST_PP_ITERATION_FINISH_2 >= 135\n#        define BOOST_PP_ITERATION_2 135\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 136 && BOOST_PP_ITERATION_FINISH_2 >= 136\n#        define BOOST_PP_ITERATION_2 136\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 137 && BOOST_PP_ITERATION_FINISH_2 >= 137\n#        define BOOST_PP_ITERATION_2 137\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 138 && BOOST_PP_ITERATION_FINISH_2 >= 138\n#        define BOOST_PP_ITERATION_2 138\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 139 && BOOST_PP_ITERATION_FINISH_2 >= 139\n#        define BOOST_PP_ITERATION_2 139\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 140 && BOOST_PP_ITERATION_FINISH_2 >= 140\n#        define BOOST_PP_ITERATION_2 140\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 141 && BOOST_PP_ITERATION_FINISH_2 >= 141\n#        define BOOST_PP_ITERATION_2 141\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 142 && BOOST_PP_ITERATION_FINISH_2 >= 142\n#        define BOOST_PP_ITERATION_2 142\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 143 && BOOST_PP_ITERATION_FINISH_2 >= 143\n#        define BOOST_PP_ITERATION_2 143\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 144 && BOOST_PP_ITERATION_FINISH_2 >= 144\n#        define BOOST_PP_ITERATION_2 144\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 145 && BOOST_PP_ITERATION_FINISH_2 >= 145\n#        define BOOST_PP_ITERATION_2 145\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 146 && BOOST_PP_ITERATION_FINISH_2 >= 146\n#        define BOOST_PP_ITERATION_2 146\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 147 && BOOST_PP_ITERATION_FINISH_2 >= 147\n#        define BOOST_PP_ITERATION_2 147\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 148 && BOOST_PP_ITERATION_FINISH_2 >= 148\n#        define BOOST_PP_ITERATION_2 148\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 149 && BOOST_PP_ITERATION_FINISH_2 >= 149\n#        define BOOST_PP_ITERATION_2 149\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 150 && BOOST_PP_ITERATION_FINISH_2 >= 150\n#        define BOOST_PP_ITERATION_2 150\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 151 && BOOST_PP_ITERATION_FINISH_2 >= 151\n#        define BOOST_PP_ITERATION_2 151\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 152 && BOOST_PP_ITERATION_FINISH_2 >= 152\n#        define BOOST_PP_ITERATION_2 152\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 153 && BOOST_PP_ITERATION_FINISH_2 >= 153\n#        define BOOST_PP_ITERATION_2 153\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 154 && BOOST_PP_ITERATION_FINISH_2 >= 154\n#        define BOOST_PP_ITERATION_2 154\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 155 && BOOST_PP_ITERATION_FINISH_2 >= 155\n#        define BOOST_PP_ITERATION_2 155\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 156 && BOOST_PP_ITERATION_FINISH_2 >= 156\n#        define BOOST_PP_ITERATION_2 156\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 157 && BOOST_PP_ITERATION_FINISH_2 >= 157\n#        define BOOST_PP_ITERATION_2 157\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 158 && BOOST_PP_ITERATION_FINISH_2 >= 158\n#        define BOOST_PP_ITERATION_2 158\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 159 && BOOST_PP_ITERATION_FINISH_2 >= 159\n#        define BOOST_PP_ITERATION_2 159\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 160 && BOOST_PP_ITERATION_FINISH_2 >= 160\n#        define BOOST_PP_ITERATION_2 160\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 161 && BOOST_PP_ITERATION_FINISH_2 >= 161\n#        define BOOST_PP_ITERATION_2 161\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 162 && BOOST_PP_ITERATION_FINISH_2 >= 162\n#        define BOOST_PP_ITERATION_2 162\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 163 && BOOST_PP_ITERATION_FINISH_2 >= 163\n#        define BOOST_PP_ITERATION_2 163\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 164 && BOOST_PP_ITERATION_FINISH_2 >= 164\n#        define BOOST_PP_ITERATION_2 164\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 165 && BOOST_PP_ITERATION_FINISH_2 >= 165\n#        define BOOST_PP_ITERATION_2 165\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 166 && BOOST_PP_ITERATION_FINISH_2 >= 166\n#        define BOOST_PP_ITERATION_2 166\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 167 && BOOST_PP_ITERATION_FINISH_2 >= 167\n#        define BOOST_PP_ITERATION_2 167\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 168 && BOOST_PP_ITERATION_FINISH_2 >= 168\n#        define BOOST_PP_ITERATION_2 168\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 169 && BOOST_PP_ITERATION_FINISH_2 >= 169\n#        define BOOST_PP_ITERATION_2 169\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 170 && BOOST_PP_ITERATION_FINISH_2 >= 170\n#        define BOOST_PP_ITERATION_2 170\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 171 && BOOST_PP_ITERATION_FINISH_2 >= 171\n#        define BOOST_PP_ITERATION_2 171\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 172 && BOOST_PP_ITERATION_FINISH_2 >= 172\n#        define BOOST_PP_ITERATION_2 172\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 173 && BOOST_PP_ITERATION_FINISH_2 >= 173\n#        define BOOST_PP_ITERATION_2 173\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 174 && BOOST_PP_ITERATION_FINISH_2 >= 174\n#        define BOOST_PP_ITERATION_2 174\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 175 && BOOST_PP_ITERATION_FINISH_2 >= 175\n#        define BOOST_PP_ITERATION_2 175\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 176 && BOOST_PP_ITERATION_FINISH_2 >= 176\n#        define BOOST_PP_ITERATION_2 176\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 177 && BOOST_PP_ITERATION_FINISH_2 >= 177\n#        define BOOST_PP_ITERATION_2 177\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 178 && BOOST_PP_ITERATION_FINISH_2 >= 178\n#        define BOOST_PP_ITERATION_2 178\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 179 && BOOST_PP_ITERATION_FINISH_2 >= 179\n#        define BOOST_PP_ITERATION_2 179\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 180 && BOOST_PP_ITERATION_FINISH_2 >= 180\n#        define BOOST_PP_ITERATION_2 180\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 181 && BOOST_PP_ITERATION_FINISH_2 >= 181\n#        define BOOST_PP_ITERATION_2 181\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 182 && BOOST_PP_ITERATION_FINISH_2 >= 182\n#        define BOOST_PP_ITERATION_2 182\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 183 && BOOST_PP_ITERATION_FINISH_2 >= 183\n#        define BOOST_PP_ITERATION_2 183\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 184 && BOOST_PP_ITERATION_FINISH_2 >= 184\n#        define BOOST_PP_ITERATION_2 184\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 185 && BOOST_PP_ITERATION_FINISH_2 >= 185\n#        define BOOST_PP_ITERATION_2 185\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 186 && BOOST_PP_ITERATION_FINISH_2 >= 186\n#        define BOOST_PP_ITERATION_2 186\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 187 && BOOST_PP_ITERATION_FINISH_2 >= 187\n#        define BOOST_PP_ITERATION_2 187\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 188 && BOOST_PP_ITERATION_FINISH_2 >= 188\n#        define BOOST_PP_ITERATION_2 188\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 189 && BOOST_PP_ITERATION_FINISH_2 >= 189\n#        define BOOST_PP_ITERATION_2 189\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 190 && BOOST_PP_ITERATION_FINISH_2 >= 190\n#        define BOOST_PP_ITERATION_2 190\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 191 && BOOST_PP_ITERATION_FINISH_2 >= 191\n#        define BOOST_PP_ITERATION_2 191\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 192 && BOOST_PP_ITERATION_FINISH_2 >= 192\n#        define BOOST_PP_ITERATION_2 192\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 193 && BOOST_PP_ITERATION_FINISH_2 >= 193\n#        define BOOST_PP_ITERATION_2 193\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 194 && BOOST_PP_ITERATION_FINISH_2 >= 194\n#        define BOOST_PP_ITERATION_2 194\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 195 && BOOST_PP_ITERATION_FINISH_2 >= 195\n#        define BOOST_PP_ITERATION_2 195\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 196 && BOOST_PP_ITERATION_FINISH_2 >= 196\n#        define BOOST_PP_ITERATION_2 196\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 197 && BOOST_PP_ITERATION_FINISH_2 >= 197\n#        define BOOST_PP_ITERATION_2 197\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 198 && BOOST_PP_ITERATION_FINISH_2 >= 198\n#        define BOOST_PP_ITERATION_2 198\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 199 && BOOST_PP_ITERATION_FINISH_2 >= 199\n#        define BOOST_PP_ITERATION_2 199\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 200 && BOOST_PP_ITERATION_FINISH_2 >= 200\n#        define BOOST_PP_ITERATION_2 200\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 201 && BOOST_PP_ITERATION_FINISH_2 >= 201\n#        define BOOST_PP_ITERATION_2 201\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 202 && BOOST_PP_ITERATION_FINISH_2 >= 202\n#        define BOOST_PP_ITERATION_2 202\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 203 && BOOST_PP_ITERATION_FINISH_2 >= 203\n#        define BOOST_PP_ITERATION_2 203\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 204 && BOOST_PP_ITERATION_FINISH_2 >= 204\n#        define BOOST_PP_ITERATION_2 204\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 205 && BOOST_PP_ITERATION_FINISH_2 >= 205\n#        define BOOST_PP_ITERATION_2 205\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 206 && BOOST_PP_ITERATION_FINISH_2 >= 206\n#        define BOOST_PP_ITERATION_2 206\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 207 && BOOST_PP_ITERATION_FINISH_2 >= 207\n#        define BOOST_PP_ITERATION_2 207\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 208 && BOOST_PP_ITERATION_FINISH_2 >= 208\n#        define BOOST_PP_ITERATION_2 208\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 209 && BOOST_PP_ITERATION_FINISH_2 >= 209\n#        define BOOST_PP_ITERATION_2 209\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 210 && BOOST_PP_ITERATION_FINISH_2 >= 210\n#        define BOOST_PP_ITERATION_2 210\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 211 && BOOST_PP_ITERATION_FINISH_2 >= 211\n#        define BOOST_PP_ITERATION_2 211\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 212 && BOOST_PP_ITERATION_FINISH_2 >= 212\n#        define BOOST_PP_ITERATION_2 212\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 213 && BOOST_PP_ITERATION_FINISH_2 >= 213\n#        define BOOST_PP_ITERATION_2 213\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 214 && BOOST_PP_ITERATION_FINISH_2 >= 214\n#        define BOOST_PP_ITERATION_2 214\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 215 && BOOST_PP_ITERATION_FINISH_2 >= 215\n#        define BOOST_PP_ITERATION_2 215\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 216 && BOOST_PP_ITERATION_FINISH_2 >= 216\n#        define BOOST_PP_ITERATION_2 216\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 217 && BOOST_PP_ITERATION_FINISH_2 >= 217\n#        define BOOST_PP_ITERATION_2 217\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 218 && BOOST_PP_ITERATION_FINISH_2 >= 218\n#        define BOOST_PP_ITERATION_2 218\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 219 && BOOST_PP_ITERATION_FINISH_2 >= 219\n#        define BOOST_PP_ITERATION_2 219\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 220 && BOOST_PP_ITERATION_FINISH_2 >= 220\n#        define BOOST_PP_ITERATION_2 220\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 221 && BOOST_PP_ITERATION_FINISH_2 >= 221\n#        define BOOST_PP_ITERATION_2 221\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 222 && BOOST_PP_ITERATION_FINISH_2 >= 222\n#        define BOOST_PP_ITERATION_2 222\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 223 && BOOST_PP_ITERATION_FINISH_2 >= 223\n#        define BOOST_PP_ITERATION_2 223\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 224 && BOOST_PP_ITERATION_FINISH_2 >= 224\n#        define BOOST_PP_ITERATION_2 224\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 225 && BOOST_PP_ITERATION_FINISH_2 >= 225\n#        define BOOST_PP_ITERATION_2 225\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 226 && BOOST_PP_ITERATION_FINISH_2 >= 226\n#        define BOOST_PP_ITERATION_2 226\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 227 && BOOST_PP_ITERATION_FINISH_2 >= 227\n#        define BOOST_PP_ITERATION_2 227\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 228 && BOOST_PP_ITERATION_FINISH_2 >= 228\n#        define BOOST_PP_ITERATION_2 228\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 229 && BOOST_PP_ITERATION_FINISH_2 >= 229\n#        define BOOST_PP_ITERATION_2 229\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 230 && BOOST_PP_ITERATION_FINISH_2 >= 230\n#        define BOOST_PP_ITERATION_2 230\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 231 && BOOST_PP_ITERATION_FINISH_2 >= 231\n#        define BOOST_PP_ITERATION_2 231\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 232 && BOOST_PP_ITERATION_FINISH_2 >= 232\n#        define BOOST_PP_ITERATION_2 232\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 233 && BOOST_PP_ITERATION_FINISH_2 >= 233\n#        define BOOST_PP_ITERATION_2 233\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 234 && BOOST_PP_ITERATION_FINISH_2 >= 234\n#        define BOOST_PP_ITERATION_2 234\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 235 && BOOST_PP_ITERATION_FINISH_2 >= 235\n#        define BOOST_PP_ITERATION_2 235\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 236 && BOOST_PP_ITERATION_FINISH_2 >= 236\n#        define BOOST_PP_ITERATION_2 236\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 237 && BOOST_PP_ITERATION_FINISH_2 >= 237\n#        define BOOST_PP_ITERATION_2 237\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 238 && BOOST_PP_ITERATION_FINISH_2 >= 238\n#        define BOOST_PP_ITERATION_2 238\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 239 && BOOST_PP_ITERATION_FINISH_2 >= 239\n#        define BOOST_PP_ITERATION_2 239\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 240 && BOOST_PP_ITERATION_FINISH_2 >= 240\n#        define BOOST_PP_ITERATION_2 240\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 241 && BOOST_PP_ITERATION_FINISH_2 >= 241\n#        define BOOST_PP_ITERATION_2 241\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 242 && BOOST_PP_ITERATION_FINISH_2 >= 242\n#        define BOOST_PP_ITERATION_2 242\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 243 && BOOST_PP_ITERATION_FINISH_2 >= 243\n#        define BOOST_PP_ITERATION_2 243\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 244 && BOOST_PP_ITERATION_FINISH_2 >= 244\n#        define BOOST_PP_ITERATION_2 244\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 245 && BOOST_PP_ITERATION_FINISH_2 >= 245\n#        define BOOST_PP_ITERATION_2 245\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 246 && BOOST_PP_ITERATION_FINISH_2 >= 246\n#        define BOOST_PP_ITERATION_2 246\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 247 && BOOST_PP_ITERATION_FINISH_2 >= 247\n#        define BOOST_PP_ITERATION_2 247\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 248 && BOOST_PP_ITERATION_FINISH_2 >= 248\n#        define BOOST_PP_ITERATION_2 248\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 249 && BOOST_PP_ITERATION_FINISH_2 >= 249\n#        define BOOST_PP_ITERATION_2 249\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 250 && BOOST_PP_ITERATION_FINISH_2 >= 250\n#        define BOOST_PP_ITERATION_2 250\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 251 && BOOST_PP_ITERATION_FINISH_2 >= 251\n#        define BOOST_PP_ITERATION_2 251\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 252 && BOOST_PP_ITERATION_FINISH_2 >= 252\n#        define BOOST_PP_ITERATION_2 252\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 253 && BOOST_PP_ITERATION_FINISH_2 >= 253\n#        define BOOST_PP_ITERATION_2 253\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 254 && BOOST_PP_ITERATION_FINISH_2 >= 254\n#        define BOOST_PP_ITERATION_2 254\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 255 && BOOST_PP_ITERATION_FINISH_2 >= 255\n#        define BOOST_PP_ITERATION_2 255\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 256 && BOOST_PP_ITERATION_FINISH_2 >= 256\n#        define BOOST_PP_ITERATION_2 256\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n# endif\n#\n# undef BOOST_PP_ITERATION_DEPTH\n# define BOOST_PP_ITERATION_DEPTH() 1\n#\n# undef BOOST_PP_ITERATION_START_2\n# undef BOOST_PP_ITERATION_FINISH_2\n# undef BOOST_PP_FILENAME_2\n#\n# undef BOOST_PP_ITERATION_FLAGS_2\n# undef BOOST_PP_ITERATION_PARAMS_2\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/iteration/detail/iter/forward3.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# if defined(BOOST_PP_ITERATION_LIMITS)\n#    if !defined(BOOST_PP_FILENAME_3)\n#        error BOOST_PP_ERROR:  depth #3 filename is not defined\n#    endif\n#    define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_ITERATION_LIMITS)\n#    include <boost/preprocessor/iteration/detail/bounds/lower3.hpp>\n#    define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_ITERATION_LIMITS)\n#    include <boost/preprocessor/iteration/detail/bounds/upper3.hpp>\n#    define BOOST_PP_ITERATION_FLAGS_3() 0\n#    undef BOOST_PP_ITERATION_LIMITS\n# elif defined(BOOST_PP_ITERATION_PARAMS_3)\n#    define BOOST_PP_VALUE BOOST_PP_ARRAY_ELEM(0, BOOST_PP_ITERATION_PARAMS_3)\n#    include <boost/preprocessor/iteration/detail/bounds/lower3.hpp>\n#    define BOOST_PP_VALUE BOOST_PP_ARRAY_ELEM(1, BOOST_PP_ITERATION_PARAMS_3)\n#    include <boost/preprocessor/iteration/detail/bounds/upper3.hpp>\n#    define BOOST_PP_FILENAME_3 BOOST_PP_ARRAY_ELEM(2, BOOST_PP_ITERATION_PARAMS_3)\n#    if BOOST_PP_ARRAY_SIZE(BOOST_PP_ITERATION_PARAMS_3) >= 4\n#        define BOOST_PP_ITERATION_FLAGS_3() BOOST_PP_ARRAY_ELEM(3, BOOST_PP_ITERATION_PARAMS_3)\n#    else\n#        define BOOST_PP_ITERATION_FLAGS_3() 0\n#    endif\n# else\n#    error BOOST_PP_ERROR:  depth #3 iteration boundaries or filename not defined\n# endif\n#\n# undef BOOST_PP_ITERATION_DEPTH\n# define BOOST_PP_ITERATION_DEPTH() 3\n#\n# if (BOOST_PP_ITERATION_START_3) > (BOOST_PP_ITERATION_FINISH_3)\n#    include <boost/preprocessor/iteration/detail/iter/reverse3.hpp>\n# else\n#    if BOOST_PP_ITERATION_START_3 <= 0 && BOOST_PP_ITERATION_FINISH_3 >= 0\n#        define BOOST_PP_ITERATION_3 0\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 1 && BOOST_PP_ITERATION_FINISH_3 >= 1\n#        define BOOST_PP_ITERATION_3 1\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 2 && BOOST_PP_ITERATION_FINISH_3 >= 2\n#        define BOOST_PP_ITERATION_3 2\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 3 && BOOST_PP_ITERATION_FINISH_3 >= 3\n#        define BOOST_PP_ITERATION_3 3\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 4 && BOOST_PP_ITERATION_FINISH_3 >= 4\n#        define BOOST_PP_ITERATION_3 4\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 5 && BOOST_PP_ITERATION_FINISH_3 >= 5\n#        define BOOST_PP_ITERATION_3 5\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 6 && BOOST_PP_ITERATION_FINISH_3 >= 6\n#        define BOOST_PP_ITERATION_3 6\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 7 && BOOST_PP_ITERATION_FINISH_3 >= 7\n#        define BOOST_PP_ITERATION_3 7\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 8 && BOOST_PP_ITERATION_FINISH_3 >= 8\n#        define BOOST_PP_ITERATION_3 8\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 9 && BOOST_PP_ITERATION_FINISH_3 >= 9\n#        define BOOST_PP_ITERATION_3 9\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 10 && BOOST_PP_ITERATION_FINISH_3 >= 10\n#        define BOOST_PP_ITERATION_3 10\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 11 && BOOST_PP_ITERATION_FINISH_3 >= 11\n#        define BOOST_PP_ITERATION_3 11\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 12 && BOOST_PP_ITERATION_FINISH_3 >= 12\n#        define BOOST_PP_ITERATION_3 12\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 13 && BOOST_PP_ITERATION_FINISH_3 >= 13\n#        define BOOST_PP_ITERATION_3 13\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 14 && BOOST_PP_ITERATION_FINISH_3 >= 14\n#        define BOOST_PP_ITERATION_3 14\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 15 && BOOST_PP_ITERATION_FINISH_3 >= 15\n#        define BOOST_PP_ITERATION_3 15\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 16 && BOOST_PP_ITERATION_FINISH_3 >= 16\n#        define BOOST_PP_ITERATION_3 16\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 17 && BOOST_PP_ITERATION_FINISH_3 >= 17\n#        define BOOST_PP_ITERATION_3 17\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 18 && BOOST_PP_ITERATION_FINISH_3 >= 18\n#        define BOOST_PP_ITERATION_3 18\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 19 && BOOST_PP_ITERATION_FINISH_3 >= 19\n#        define BOOST_PP_ITERATION_3 19\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 20 && BOOST_PP_ITERATION_FINISH_3 >= 20\n#        define BOOST_PP_ITERATION_3 20\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 21 && BOOST_PP_ITERATION_FINISH_3 >= 21\n#        define BOOST_PP_ITERATION_3 21\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 22 && BOOST_PP_ITERATION_FINISH_3 >= 22\n#        define BOOST_PP_ITERATION_3 22\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 23 && BOOST_PP_ITERATION_FINISH_3 >= 23\n#        define BOOST_PP_ITERATION_3 23\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 24 && BOOST_PP_ITERATION_FINISH_3 >= 24\n#        define BOOST_PP_ITERATION_3 24\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 25 && BOOST_PP_ITERATION_FINISH_3 >= 25\n#        define BOOST_PP_ITERATION_3 25\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 26 && BOOST_PP_ITERATION_FINISH_3 >= 26\n#        define BOOST_PP_ITERATION_3 26\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 27 && BOOST_PP_ITERATION_FINISH_3 >= 27\n#        define BOOST_PP_ITERATION_3 27\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 28 && BOOST_PP_ITERATION_FINISH_3 >= 28\n#        define BOOST_PP_ITERATION_3 28\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 29 && BOOST_PP_ITERATION_FINISH_3 >= 29\n#        define BOOST_PP_ITERATION_3 29\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 30 && BOOST_PP_ITERATION_FINISH_3 >= 30\n#        define BOOST_PP_ITERATION_3 30\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 31 && BOOST_PP_ITERATION_FINISH_3 >= 31\n#        define BOOST_PP_ITERATION_3 31\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 32 && BOOST_PP_ITERATION_FINISH_3 >= 32\n#        define BOOST_PP_ITERATION_3 32\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 33 && BOOST_PP_ITERATION_FINISH_3 >= 33\n#        define BOOST_PP_ITERATION_3 33\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 34 && BOOST_PP_ITERATION_FINISH_3 >= 34\n#        define BOOST_PP_ITERATION_3 34\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 35 && BOOST_PP_ITERATION_FINISH_3 >= 35\n#        define BOOST_PP_ITERATION_3 35\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 36 && BOOST_PP_ITERATION_FINISH_3 >= 36\n#        define BOOST_PP_ITERATION_3 36\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 37 && BOOST_PP_ITERATION_FINISH_3 >= 37\n#        define BOOST_PP_ITERATION_3 37\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 38 && BOOST_PP_ITERATION_FINISH_3 >= 38\n#        define BOOST_PP_ITERATION_3 38\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 39 && BOOST_PP_ITERATION_FINISH_3 >= 39\n#        define BOOST_PP_ITERATION_3 39\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 40 && BOOST_PP_ITERATION_FINISH_3 >= 40\n#        define BOOST_PP_ITERATION_3 40\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 41 && BOOST_PP_ITERATION_FINISH_3 >= 41\n#        define BOOST_PP_ITERATION_3 41\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 42 && BOOST_PP_ITERATION_FINISH_3 >= 42\n#        define BOOST_PP_ITERATION_3 42\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 43 && BOOST_PP_ITERATION_FINISH_3 >= 43\n#        define BOOST_PP_ITERATION_3 43\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 44 && BOOST_PP_ITERATION_FINISH_3 >= 44\n#        define BOOST_PP_ITERATION_3 44\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 45 && BOOST_PP_ITERATION_FINISH_3 >= 45\n#        define BOOST_PP_ITERATION_3 45\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 46 && BOOST_PP_ITERATION_FINISH_3 >= 46\n#        define BOOST_PP_ITERATION_3 46\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 47 && BOOST_PP_ITERATION_FINISH_3 >= 47\n#        define BOOST_PP_ITERATION_3 47\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 48 && BOOST_PP_ITERATION_FINISH_3 >= 48\n#        define BOOST_PP_ITERATION_3 48\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 49 && BOOST_PP_ITERATION_FINISH_3 >= 49\n#        define BOOST_PP_ITERATION_3 49\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 50 && BOOST_PP_ITERATION_FINISH_3 >= 50\n#        define BOOST_PP_ITERATION_3 50\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 51 && BOOST_PP_ITERATION_FINISH_3 >= 51\n#        define BOOST_PP_ITERATION_3 51\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 52 && BOOST_PP_ITERATION_FINISH_3 >= 52\n#        define BOOST_PP_ITERATION_3 52\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 53 && BOOST_PP_ITERATION_FINISH_3 >= 53\n#        define BOOST_PP_ITERATION_3 53\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 54 && BOOST_PP_ITERATION_FINISH_3 >= 54\n#        define BOOST_PP_ITERATION_3 54\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 55 && BOOST_PP_ITERATION_FINISH_3 >= 55\n#        define BOOST_PP_ITERATION_3 55\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 56 && BOOST_PP_ITERATION_FINISH_3 >= 56\n#        define BOOST_PP_ITERATION_3 56\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 57 && BOOST_PP_ITERATION_FINISH_3 >= 57\n#        define BOOST_PP_ITERATION_3 57\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 58 && BOOST_PP_ITERATION_FINISH_3 >= 58\n#        define BOOST_PP_ITERATION_3 58\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 59 && BOOST_PP_ITERATION_FINISH_3 >= 59\n#        define BOOST_PP_ITERATION_3 59\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 60 && BOOST_PP_ITERATION_FINISH_3 >= 60\n#        define BOOST_PP_ITERATION_3 60\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 61 && BOOST_PP_ITERATION_FINISH_3 >= 61\n#        define BOOST_PP_ITERATION_3 61\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 62 && BOOST_PP_ITERATION_FINISH_3 >= 62\n#        define BOOST_PP_ITERATION_3 62\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 63 && BOOST_PP_ITERATION_FINISH_3 >= 63\n#        define BOOST_PP_ITERATION_3 63\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 64 && BOOST_PP_ITERATION_FINISH_3 >= 64\n#        define BOOST_PP_ITERATION_3 64\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 65 && BOOST_PP_ITERATION_FINISH_3 >= 65\n#        define BOOST_PP_ITERATION_3 65\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 66 && BOOST_PP_ITERATION_FINISH_3 >= 66\n#        define BOOST_PP_ITERATION_3 66\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 67 && BOOST_PP_ITERATION_FINISH_3 >= 67\n#        define BOOST_PP_ITERATION_3 67\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 68 && BOOST_PP_ITERATION_FINISH_3 >= 68\n#        define BOOST_PP_ITERATION_3 68\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 69 && BOOST_PP_ITERATION_FINISH_3 >= 69\n#        define BOOST_PP_ITERATION_3 69\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 70 && BOOST_PP_ITERATION_FINISH_3 >= 70\n#        define BOOST_PP_ITERATION_3 70\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 71 && BOOST_PP_ITERATION_FINISH_3 >= 71\n#        define BOOST_PP_ITERATION_3 71\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 72 && BOOST_PP_ITERATION_FINISH_3 >= 72\n#        define BOOST_PP_ITERATION_3 72\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 73 && BOOST_PP_ITERATION_FINISH_3 >= 73\n#        define BOOST_PP_ITERATION_3 73\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 74 && BOOST_PP_ITERATION_FINISH_3 >= 74\n#        define BOOST_PP_ITERATION_3 74\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 75 && BOOST_PP_ITERATION_FINISH_3 >= 75\n#        define BOOST_PP_ITERATION_3 75\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 76 && BOOST_PP_ITERATION_FINISH_3 >= 76\n#        define BOOST_PP_ITERATION_3 76\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 77 && BOOST_PP_ITERATION_FINISH_3 >= 77\n#        define BOOST_PP_ITERATION_3 77\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 78 && BOOST_PP_ITERATION_FINISH_3 >= 78\n#        define BOOST_PP_ITERATION_3 78\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 79 && BOOST_PP_ITERATION_FINISH_3 >= 79\n#        define BOOST_PP_ITERATION_3 79\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 80 && BOOST_PP_ITERATION_FINISH_3 >= 80\n#        define BOOST_PP_ITERATION_3 80\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 81 && BOOST_PP_ITERATION_FINISH_3 >= 81\n#        define BOOST_PP_ITERATION_3 81\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 82 && BOOST_PP_ITERATION_FINISH_3 >= 82\n#        define BOOST_PP_ITERATION_3 82\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 83 && BOOST_PP_ITERATION_FINISH_3 >= 83\n#        define BOOST_PP_ITERATION_3 83\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 84 && BOOST_PP_ITERATION_FINISH_3 >= 84\n#        define BOOST_PP_ITERATION_3 84\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 85 && BOOST_PP_ITERATION_FINISH_3 >= 85\n#        define BOOST_PP_ITERATION_3 85\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 86 && BOOST_PP_ITERATION_FINISH_3 >= 86\n#        define BOOST_PP_ITERATION_3 86\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 87 && BOOST_PP_ITERATION_FINISH_3 >= 87\n#        define BOOST_PP_ITERATION_3 87\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 88 && BOOST_PP_ITERATION_FINISH_3 >= 88\n#        define BOOST_PP_ITERATION_3 88\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 89 && BOOST_PP_ITERATION_FINISH_3 >= 89\n#        define BOOST_PP_ITERATION_3 89\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 90 && BOOST_PP_ITERATION_FINISH_3 >= 90\n#        define BOOST_PP_ITERATION_3 90\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 91 && BOOST_PP_ITERATION_FINISH_3 >= 91\n#        define BOOST_PP_ITERATION_3 91\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 92 && BOOST_PP_ITERATION_FINISH_3 >= 92\n#        define BOOST_PP_ITERATION_3 92\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 93 && BOOST_PP_ITERATION_FINISH_3 >= 93\n#        define BOOST_PP_ITERATION_3 93\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 94 && BOOST_PP_ITERATION_FINISH_3 >= 94\n#        define BOOST_PP_ITERATION_3 94\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 95 && BOOST_PP_ITERATION_FINISH_3 >= 95\n#        define BOOST_PP_ITERATION_3 95\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 96 && BOOST_PP_ITERATION_FINISH_3 >= 96\n#        define BOOST_PP_ITERATION_3 96\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 97 && BOOST_PP_ITERATION_FINISH_3 >= 97\n#        define BOOST_PP_ITERATION_3 97\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 98 && BOOST_PP_ITERATION_FINISH_3 >= 98\n#        define BOOST_PP_ITERATION_3 98\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 99 && BOOST_PP_ITERATION_FINISH_3 >= 99\n#        define BOOST_PP_ITERATION_3 99\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 100 && BOOST_PP_ITERATION_FINISH_3 >= 100\n#        define BOOST_PP_ITERATION_3 100\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 101 && BOOST_PP_ITERATION_FINISH_3 >= 101\n#        define BOOST_PP_ITERATION_3 101\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 102 && BOOST_PP_ITERATION_FINISH_3 >= 102\n#        define BOOST_PP_ITERATION_3 102\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 103 && BOOST_PP_ITERATION_FINISH_3 >= 103\n#        define BOOST_PP_ITERATION_3 103\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 104 && BOOST_PP_ITERATION_FINISH_3 >= 104\n#        define BOOST_PP_ITERATION_3 104\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 105 && BOOST_PP_ITERATION_FINISH_3 >= 105\n#        define BOOST_PP_ITERATION_3 105\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 106 && BOOST_PP_ITERATION_FINISH_3 >= 106\n#        define BOOST_PP_ITERATION_3 106\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 107 && BOOST_PP_ITERATION_FINISH_3 >= 107\n#        define BOOST_PP_ITERATION_3 107\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 108 && BOOST_PP_ITERATION_FINISH_3 >= 108\n#        define BOOST_PP_ITERATION_3 108\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 109 && BOOST_PP_ITERATION_FINISH_3 >= 109\n#        define BOOST_PP_ITERATION_3 109\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 110 && BOOST_PP_ITERATION_FINISH_3 >= 110\n#        define BOOST_PP_ITERATION_3 110\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 111 && BOOST_PP_ITERATION_FINISH_3 >= 111\n#        define BOOST_PP_ITERATION_3 111\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 112 && BOOST_PP_ITERATION_FINISH_3 >= 112\n#        define BOOST_PP_ITERATION_3 112\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 113 && BOOST_PP_ITERATION_FINISH_3 >= 113\n#        define BOOST_PP_ITERATION_3 113\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 114 && BOOST_PP_ITERATION_FINISH_3 >= 114\n#        define BOOST_PP_ITERATION_3 114\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 115 && BOOST_PP_ITERATION_FINISH_3 >= 115\n#        define BOOST_PP_ITERATION_3 115\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 116 && BOOST_PP_ITERATION_FINISH_3 >= 116\n#        define BOOST_PP_ITERATION_3 116\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 117 && BOOST_PP_ITERATION_FINISH_3 >= 117\n#        define BOOST_PP_ITERATION_3 117\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 118 && BOOST_PP_ITERATION_FINISH_3 >= 118\n#        define BOOST_PP_ITERATION_3 118\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 119 && BOOST_PP_ITERATION_FINISH_3 >= 119\n#        define BOOST_PP_ITERATION_3 119\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 120 && BOOST_PP_ITERATION_FINISH_3 >= 120\n#        define BOOST_PP_ITERATION_3 120\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 121 && BOOST_PP_ITERATION_FINISH_3 >= 121\n#        define BOOST_PP_ITERATION_3 121\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 122 && BOOST_PP_ITERATION_FINISH_3 >= 122\n#        define BOOST_PP_ITERATION_3 122\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 123 && BOOST_PP_ITERATION_FINISH_3 >= 123\n#        define BOOST_PP_ITERATION_3 123\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 124 && BOOST_PP_ITERATION_FINISH_3 >= 124\n#        define BOOST_PP_ITERATION_3 124\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 125 && BOOST_PP_ITERATION_FINISH_3 >= 125\n#        define BOOST_PP_ITERATION_3 125\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 126 && BOOST_PP_ITERATION_FINISH_3 >= 126\n#        define BOOST_PP_ITERATION_3 126\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 127 && BOOST_PP_ITERATION_FINISH_3 >= 127\n#        define BOOST_PP_ITERATION_3 127\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 128 && BOOST_PP_ITERATION_FINISH_3 >= 128\n#        define BOOST_PP_ITERATION_3 128\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 129 && BOOST_PP_ITERATION_FINISH_3 >= 129\n#        define BOOST_PP_ITERATION_3 129\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 130 && BOOST_PP_ITERATION_FINISH_3 >= 130\n#        define BOOST_PP_ITERATION_3 130\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 131 && BOOST_PP_ITERATION_FINISH_3 >= 131\n#        define BOOST_PP_ITERATION_3 131\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 132 && BOOST_PP_ITERATION_FINISH_3 >= 132\n#        define BOOST_PP_ITERATION_3 132\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 133 && BOOST_PP_ITERATION_FINISH_3 >= 133\n#        define BOOST_PP_ITERATION_3 133\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 134 && BOOST_PP_ITERATION_FINISH_3 >= 134\n#        define BOOST_PP_ITERATION_3 134\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 135 && BOOST_PP_ITERATION_FINISH_3 >= 135\n#        define BOOST_PP_ITERATION_3 135\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 136 && BOOST_PP_ITERATION_FINISH_3 >= 136\n#        define BOOST_PP_ITERATION_3 136\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 137 && BOOST_PP_ITERATION_FINISH_3 >= 137\n#        define BOOST_PP_ITERATION_3 137\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 138 && BOOST_PP_ITERATION_FINISH_3 >= 138\n#        define BOOST_PP_ITERATION_3 138\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 139 && BOOST_PP_ITERATION_FINISH_3 >= 139\n#        define BOOST_PP_ITERATION_3 139\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 140 && BOOST_PP_ITERATION_FINISH_3 >= 140\n#        define BOOST_PP_ITERATION_3 140\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 141 && BOOST_PP_ITERATION_FINISH_3 >= 141\n#        define BOOST_PP_ITERATION_3 141\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 142 && BOOST_PP_ITERATION_FINISH_3 >= 142\n#        define BOOST_PP_ITERATION_3 142\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 143 && BOOST_PP_ITERATION_FINISH_3 >= 143\n#        define BOOST_PP_ITERATION_3 143\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 144 && BOOST_PP_ITERATION_FINISH_3 >= 144\n#        define BOOST_PP_ITERATION_3 144\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 145 && BOOST_PP_ITERATION_FINISH_3 >= 145\n#        define BOOST_PP_ITERATION_3 145\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 146 && BOOST_PP_ITERATION_FINISH_3 >= 146\n#        define BOOST_PP_ITERATION_3 146\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 147 && BOOST_PP_ITERATION_FINISH_3 >= 147\n#        define BOOST_PP_ITERATION_3 147\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 148 && BOOST_PP_ITERATION_FINISH_3 >= 148\n#        define BOOST_PP_ITERATION_3 148\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 149 && BOOST_PP_ITERATION_FINISH_3 >= 149\n#        define BOOST_PP_ITERATION_3 149\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 150 && BOOST_PP_ITERATION_FINISH_3 >= 150\n#        define BOOST_PP_ITERATION_3 150\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 151 && BOOST_PP_ITERATION_FINISH_3 >= 151\n#        define BOOST_PP_ITERATION_3 151\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 152 && BOOST_PP_ITERATION_FINISH_3 >= 152\n#        define BOOST_PP_ITERATION_3 152\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 153 && BOOST_PP_ITERATION_FINISH_3 >= 153\n#        define BOOST_PP_ITERATION_3 153\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 154 && BOOST_PP_ITERATION_FINISH_3 >= 154\n#        define BOOST_PP_ITERATION_3 154\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 155 && BOOST_PP_ITERATION_FINISH_3 >= 155\n#        define BOOST_PP_ITERATION_3 155\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 156 && BOOST_PP_ITERATION_FINISH_3 >= 156\n#        define BOOST_PP_ITERATION_3 156\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 157 && BOOST_PP_ITERATION_FINISH_3 >= 157\n#        define BOOST_PP_ITERATION_3 157\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 158 && BOOST_PP_ITERATION_FINISH_3 >= 158\n#        define BOOST_PP_ITERATION_3 158\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 159 && BOOST_PP_ITERATION_FINISH_3 >= 159\n#        define BOOST_PP_ITERATION_3 159\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 160 && BOOST_PP_ITERATION_FINISH_3 >= 160\n#        define BOOST_PP_ITERATION_3 160\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 161 && BOOST_PP_ITERATION_FINISH_3 >= 161\n#        define BOOST_PP_ITERATION_3 161\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 162 && BOOST_PP_ITERATION_FINISH_3 >= 162\n#        define BOOST_PP_ITERATION_3 162\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 163 && BOOST_PP_ITERATION_FINISH_3 >= 163\n#        define BOOST_PP_ITERATION_3 163\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 164 && BOOST_PP_ITERATION_FINISH_3 >= 164\n#        define BOOST_PP_ITERATION_3 164\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 165 && BOOST_PP_ITERATION_FINISH_3 >= 165\n#        define BOOST_PP_ITERATION_3 165\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 166 && BOOST_PP_ITERATION_FINISH_3 >= 166\n#        define BOOST_PP_ITERATION_3 166\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 167 && BOOST_PP_ITERATION_FINISH_3 >= 167\n#        define BOOST_PP_ITERATION_3 167\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 168 && BOOST_PP_ITERATION_FINISH_3 >= 168\n#        define BOOST_PP_ITERATION_3 168\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 169 && BOOST_PP_ITERATION_FINISH_3 >= 169\n#        define BOOST_PP_ITERATION_3 169\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 170 && BOOST_PP_ITERATION_FINISH_3 >= 170\n#        define BOOST_PP_ITERATION_3 170\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 171 && BOOST_PP_ITERATION_FINISH_3 >= 171\n#        define BOOST_PP_ITERATION_3 171\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 172 && BOOST_PP_ITERATION_FINISH_3 >= 172\n#        define BOOST_PP_ITERATION_3 172\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 173 && BOOST_PP_ITERATION_FINISH_3 >= 173\n#        define BOOST_PP_ITERATION_3 173\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 174 && BOOST_PP_ITERATION_FINISH_3 >= 174\n#        define BOOST_PP_ITERATION_3 174\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 175 && BOOST_PP_ITERATION_FINISH_3 >= 175\n#        define BOOST_PP_ITERATION_3 175\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 176 && BOOST_PP_ITERATION_FINISH_3 >= 176\n#        define BOOST_PP_ITERATION_3 176\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 177 && BOOST_PP_ITERATION_FINISH_3 >= 177\n#        define BOOST_PP_ITERATION_3 177\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 178 && BOOST_PP_ITERATION_FINISH_3 >= 178\n#        define BOOST_PP_ITERATION_3 178\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 179 && BOOST_PP_ITERATION_FINISH_3 >= 179\n#        define BOOST_PP_ITERATION_3 179\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 180 && BOOST_PP_ITERATION_FINISH_3 >= 180\n#        define BOOST_PP_ITERATION_3 180\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 181 && BOOST_PP_ITERATION_FINISH_3 >= 181\n#        define BOOST_PP_ITERATION_3 181\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 182 && BOOST_PP_ITERATION_FINISH_3 >= 182\n#        define BOOST_PP_ITERATION_3 182\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 183 && BOOST_PP_ITERATION_FINISH_3 >= 183\n#        define BOOST_PP_ITERATION_3 183\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 184 && BOOST_PP_ITERATION_FINISH_3 >= 184\n#        define BOOST_PP_ITERATION_3 184\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 185 && BOOST_PP_ITERATION_FINISH_3 >= 185\n#        define BOOST_PP_ITERATION_3 185\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 186 && BOOST_PP_ITERATION_FINISH_3 >= 186\n#        define BOOST_PP_ITERATION_3 186\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 187 && BOOST_PP_ITERATION_FINISH_3 >= 187\n#        define BOOST_PP_ITERATION_3 187\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 188 && BOOST_PP_ITERATION_FINISH_3 >= 188\n#        define BOOST_PP_ITERATION_3 188\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 189 && BOOST_PP_ITERATION_FINISH_3 >= 189\n#        define BOOST_PP_ITERATION_3 189\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 190 && BOOST_PP_ITERATION_FINISH_3 >= 190\n#        define BOOST_PP_ITERATION_3 190\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 191 && BOOST_PP_ITERATION_FINISH_3 >= 191\n#        define BOOST_PP_ITERATION_3 191\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 192 && BOOST_PP_ITERATION_FINISH_3 >= 192\n#        define BOOST_PP_ITERATION_3 192\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 193 && BOOST_PP_ITERATION_FINISH_3 >= 193\n#        define BOOST_PP_ITERATION_3 193\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 194 && BOOST_PP_ITERATION_FINISH_3 >= 194\n#        define BOOST_PP_ITERATION_3 194\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 195 && BOOST_PP_ITERATION_FINISH_3 >= 195\n#        define BOOST_PP_ITERATION_3 195\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 196 && BOOST_PP_ITERATION_FINISH_3 >= 196\n#        define BOOST_PP_ITERATION_3 196\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 197 && BOOST_PP_ITERATION_FINISH_3 >= 197\n#        define BOOST_PP_ITERATION_3 197\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 198 && BOOST_PP_ITERATION_FINISH_3 >= 198\n#        define BOOST_PP_ITERATION_3 198\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 199 && BOOST_PP_ITERATION_FINISH_3 >= 199\n#        define BOOST_PP_ITERATION_3 199\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 200 && BOOST_PP_ITERATION_FINISH_3 >= 200\n#        define BOOST_PP_ITERATION_3 200\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 201 && BOOST_PP_ITERATION_FINISH_3 >= 201\n#        define BOOST_PP_ITERATION_3 201\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 202 && BOOST_PP_ITERATION_FINISH_3 >= 202\n#        define BOOST_PP_ITERATION_3 202\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 203 && BOOST_PP_ITERATION_FINISH_3 >= 203\n#        define BOOST_PP_ITERATION_3 203\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 204 && BOOST_PP_ITERATION_FINISH_3 >= 204\n#        define BOOST_PP_ITERATION_3 204\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 205 && BOOST_PP_ITERATION_FINISH_3 >= 205\n#        define BOOST_PP_ITERATION_3 205\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 206 && BOOST_PP_ITERATION_FINISH_3 >= 206\n#        define BOOST_PP_ITERATION_3 206\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 207 && BOOST_PP_ITERATION_FINISH_3 >= 207\n#        define BOOST_PP_ITERATION_3 207\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 208 && BOOST_PP_ITERATION_FINISH_3 >= 208\n#        define BOOST_PP_ITERATION_3 208\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 209 && BOOST_PP_ITERATION_FINISH_3 >= 209\n#        define BOOST_PP_ITERATION_3 209\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 210 && BOOST_PP_ITERATION_FINISH_3 >= 210\n#        define BOOST_PP_ITERATION_3 210\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 211 && BOOST_PP_ITERATION_FINISH_3 >= 211\n#        define BOOST_PP_ITERATION_3 211\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 212 && BOOST_PP_ITERATION_FINISH_3 >= 212\n#        define BOOST_PP_ITERATION_3 212\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 213 && BOOST_PP_ITERATION_FINISH_3 >= 213\n#        define BOOST_PP_ITERATION_3 213\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 214 && BOOST_PP_ITERATION_FINISH_3 >= 214\n#        define BOOST_PP_ITERATION_3 214\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 215 && BOOST_PP_ITERATION_FINISH_3 >= 215\n#        define BOOST_PP_ITERATION_3 215\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 216 && BOOST_PP_ITERATION_FINISH_3 >= 216\n#        define BOOST_PP_ITERATION_3 216\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 217 && BOOST_PP_ITERATION_FINISH_3 >= 217\n#        define BOOST_PP_ITERATION_3 217\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 218 && BOOST_PP_ITERATION_FINISH_3 >= 218\n#        define BOOST_PP_ITERATION_3 218\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 219 && BOOST_PP_ITERATION_FINISH_3 >= 219\n#        define BOOST_PP_ITERATION_3 219\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 220 && BOOST_PP_ITERATION_FINISH_3 >= 220\n#        define BOOST_PP_ITERATION_3 220\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 221 && BOOST_PP_ITERATION_FINISH_3 >= 221\n#        define BOOST_PP_ITERATION_3 221\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 222 && BOOST_PP_ITERATION_FINISH_3 >= 222\n#        define BOOST_PP_ITERATION_3 222\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 223 && BOOST_PP_ITERATION_FINISH_3 >= 223\n#        define BOOST_PP_ITERATION_3 223\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 224 && BOOST_PP_ITERATION_FINISH_3 >= 224\n#        define BOOST_PP_ITERATION_3 224\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 225 && BOOST_PP_ITERATION_FINISH_3 >= 225\n#        define BOOST_PP_ITERATION_3 225\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 226 && BOOST_PP_ITERATION_FINISH_3 >= 226\n#        define BOOST_PP_ITERATION_3 226\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 227 && BOOST_PP_ITERATION_FINISH_3 >= 227\n#        define BOOST_PP_ITERATION_3 227\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 228 && BOOST_PP_ITERATION_FINISH_3 >= 228\n#        define BOOST_PP_ITERATION_3 228\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 229 && BOOST_PP_ITERATION_FINISH_3 >= 229\n#        define BOOST_PP_ITERATION_3 229\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 230 && BOOST_PP_ITERATION_FINISH_3 >= 230\n#        define BOOST_PP_ITERATION_3 230\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 231 && BOOST_PP_ITERATION_FINISH_3 >= 231\n#        define BOOST_PP_ITERATION_3 231\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 232 && BOOST_PP_ITERATION_FINISH_3 >= 232\n#        define BOOST_PP_ITERATION_3 232\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 233 && BOOST_PP_ITERATION_FINISH_3 >= 233\n#        define BOOST_PP_ITERATION_3 233\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 234 && BOOST_PP_ITERATION_FINISH_3 >= 234\n#        define BOOST_PP_ITERATION_3 234\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 235 && BOOST_PP_ITERATION_FINISH_3 >= 235\n#        define BOOST_PP_ITERATION_3 235\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 236 && BOOST_PP_ITERATION_FINISH_3 >= 236\n#        define BOOST_PP_ITERATION_3 236\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 237 && BOOST_PP_ITERATION_FINISH_3 >= 237\n#        define BOOST_PP_ITERATION_3 237\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 238 && BOOST_PP_ITERATION_FINISH_3 >= 238\n#        define BOOST_PP_ITERATION_3 238\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 239 && BOOST_PP_ITERATION_FINISH_3 >= 239\n#        define BOOST_PP_ITERATION_3 239\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 240 && BOOST_PP_ITERATION_FINISH_3 >= 240\n#        define BOOST_PP_ITERATION_3 240\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 241 && BOOST_PP_ITERATION_FINISH_3 >= 241\n#        define BOOST_PP_ITERATION_3 241\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 242 && BOOST_PP_ITERATION_FINISH_3 >= 242\n#        define BOOST_PP_ITERATION_3 242\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 243 && BOOST_PP_ITERATION_FINISH_3 >= 243\n#        define BOOST_PP_ITERATION_3 243\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 244 && BOOST_PP_ITERATION_FINISH_3 >= 244\n#        define BOOST_PP_ITERATION_3 244\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 245 && BOOST_PP_ITERATION_FINISH_3 >= 245\n#        define BOOST_PP_ITERATION_3 245\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 246 && BOOST_PP_ITERATION_FINISH_3 >= 246\n#        define BOOST_PP_ITERATION_3 246\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 247 && BOOST_PP_ITERATION_FINISH_3 >= 247\n#        define BOOST_PP_ITERATION_3 247\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 248 && BOOST_PP_ITERATION_FINISH_3 >= 248\n#        define BOOST_PP_ITERATION_3 248\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 249 && BOOST_PP_ITERATION_FINISH_3 >= 249\n#        define BOOST_PP_ITERATION_3 249\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 250 && BOOST_PP_ITERATION_FINISH_3 >= 250\n#        define BOOST_PP_ITERATION_3 250\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 251 && BOOST_PP_ITERATION_FINISH_3 >= 251\n#        define BOOST_PP_ITERATION_3 251\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 252 && BOOST_PP_ITERATION_FINISH_3 >= 252\n#        define BOOST_PP_ITERATION_3 252\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 253 && BOOST_PP_ITERATION_FINISH_3 >= 253\n#        define BOOST_PP_ITERATION_3 253\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 254 && BOOST_PP_ITERATION_FINISH_3 >= 254\n#        define BOOST_PP_ITERATION_3 254\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 255 && BOOST_PP_ITERATION_FINISH_3 >= 255\n#        define BOOST_PP_ITERATION_3 255\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 256 && BOOST_PP_ITERATION_FINISH_3 >= 256\n#        define BOOST_PP_ITERATION_3 256\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n# endif\n#\n# undef BOOST_PP_ITERATION_DEPTH\n# define BOOST_PP_ITERATION_DEPTH() 2\n#\n# undef BOOST_PP_ITERATION_START_3\n# undef BOOST_PP_ITERATION_FINISH_3\n# undef BOOST_PP_FILENAME_3\n#\n# undef BOOST_PP_ITERATION_FLAGS_3\n# undef BOOST_PP_ITERATION_PARAMS_3\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/iteration/detail/iter/forward4.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# if defined(BOOST_PP_ITERATION_LIMITS)\n#    if !defined(BOOST_PP_FILENAME_4)\n#        error BOOST_PP_ERROR:  depth #4 filename is not defined\n#    endif\n#    define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_ITERATION_LIMITS)\n#    include <boost/preprocessor/iteration/detail/bounds/lower4.hpp>\n#    define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_ITERATION_LIMITS)\n#    include <boost/preprocessor/iteration/detail/bounds/upper4.hpp>\n#    define BOOST_PP_ITERATION_FLAGS_4() 0\n#    undef BOOST_PP_ITERATION_LIMITS\n# elif defined(BOOST_PP_ITERATION_PARAMS_4)\n#    define BOOST_PP_VALUE BOOST_PP_ARRAY_ELEM(0, BOOST_PP_ITERATION_PARAMS_4)\n#    include <boost/preprocessor/iteration/detail/bounds/lower4.hpp>\n#    define BOOST_PP_VALUE BOOST_PP_ARRAY_ELEM(1, BOOST_PP_ITERATION_PARAMS_4)\n#    include <boost/preprocessor/iteration/detail/bounds/upper4.hpp>\n#    define BOOST_PP_FILENAME_4 BOOST_PP_ARRAY_ELEM(2, BOOST_PP_ITERATION_PARAMS_4)\n#    if BOOST_PP_ARRAY_SIZE(BOOST_PP_ITERATION_PARAMS_4) >= 4\n#        define BOOST_PP_ITERATION_FLAGS_4() BOOST_PP_ARRAY_ELEM(3, BOOST_PP_ITERATION_PARAMS_4)\n#    else\n#        define BOOST_PP_ITERATION_FLAGS_4() 0\n#    endif\n# else\n#    error BOOST_PP_ERROR:  depth #4 iteration boundaries or filename not defined\n# endif\n#\n# undef BOOST_PP_ITERATION_DEPTH\n# define BOOST_PP_ITERATION_DEPTH() 4\n#\n# if (BOOST_PP_ITERATION_START_4) > (BOOST_PP_ITERATION_FINISH_4)\n#    include <boost/preprocessor/iteration/detail/iter/reverse4.hpp>\n# else\n#    if BOOST_PP_ITERATION_START_4 <= 0 && BOOST_PP_ITERATION_FINISH_4 >= 0\n#        define BOOST_PP_ITERATION_4 0\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 1 && BOOST_PP_ITERATION_FINISH_4 >= 1\n#        define BOOST_PP_ITERATION_4 1\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 2 && BOOST_PP_ITERATION_FINISH_4 >= 2\n#        define BOOST_PP_ITERATION_4 2\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 3 && BOOST_PP_ITERATION_FINISH_4 >= 3\n#        define BOOST_PP_ITERATION_4 3\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 4 && BOOST_PP_ITERATION_FINISH_4 >= 4\n#        define BOOST_PP_ITERATION_4 4\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 5 && BOOST_PP_ITERATION_FINISH_4 >= 5\n#        define BOOST_PP_ITERATION_4 5\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 6 && BOOST_PP_ITERATION_FINISH_4 >= 6\n#        define BOOST_PP_ITERATION_4 6\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 7 && BOOST_PP_ITERATION_FINISH_4 >= 7\n#        define BOOST_PP_ITERATION_4 7\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 8 && BOOST_PP_ITERATION_FINISH_4 >= 8\n#        define BOOST_PP_ITERATION_4 8\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 9 && BOOST_PP_ITERATION_FINISH_4 >= 9\n#        define BOOST_PP_ITERATION_4 9\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 10 && BOOST_PP_ITERATION_FINISH_4 >= 10\n#        define BOOST_PP_ITERATION_4 10\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 11 && BOOST_PP_ITERATION_FINISH_4 >= 11\n#        define BOOST_PP_ITERATION_4 11\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 12 && BOOST_PP_ITERATION_FINISH_4 >= 12\n#        define BOOST_PP_ITERATION_4 12\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 13 && BOOST_PP_ITERATION_FINISH_4 >= 13\n#        define BOOST_PP_ITERATION_4 13\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 14 && BOOST_PP_ITERATION_FINISH_4 >= 14\n#        define BOOST_PP_ITERATION_4 14\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 15 && BOOST_PP_ITERATION_FINISH_4 >= 15\n#        define BOOST_PP_ITERATION_4 15\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 16 && BOOST_PP_ITERATION_FINISH_4 >= 16\n#        define BOOST_PP_ITERATION_4 16\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 17 && BOOST_PP_ITERATION_FINISH_4 >= 17\n#        define BOOST_PP_ITERATION_4 17\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 18 && BOOST_PP_ITERATION_FINISH_4 >= 18\n#        define BOOST_PP_ITERATION_4 18\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 19 && BOOST_PP_ITERATION_FINISH_4 >= 19\n#        define BOOST_PP_ITERATION_4 19\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 20 && BOOST_PP_ITERATION_FINISH_4 >= 20\n#        define BOOST_PP_ITERATION_4 20\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 21 && BOOST_PP_ITERATION_FINISH_4 >= 21\n#        define BOOST_PP_ITERATION_4 21\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 22 && BOOST_PP_ITERATION_FINISH_4 >= 22\n#        define BOOST_PP_ITERATION_4 22\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 23 && BOOST_PP_ITERATION_FINISH_4 >= 23\n#        define BOOST_PP_ITERATION_4 23\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 24 && BOOST_PP_ITERATION_FINISH_4 >= 24\n#        define BOOST_PP_ITERATION_4 24\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 25 && BOOST_PP_ITERATION_FINISH_4 >= 25\n#        define BOOST_PP_ITERATION_4 25\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 26 && BOOST_PP_ITERATION_FINISH_4 >= 26\n#        define BOOST_PP_ITERATION_4 26\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 27 && BOOST_PP_ITERATION_FINISH_4 >= 27\n#        define BOOST_PP_ITERATION_4 27\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 28 && BOOST_PP_ITERATION_FINISH_4 >= 28\n#        define BOOST_PP_ITERATION_4 28\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 29 && BOOST_PP_ITERATION_FINISH_4 >= 29\n#        define BOOST_PP_ITERATION_4 29\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 30 && BOOST_PP_ITERATION_FINISH_4 >= 30\n#        define BOOST_PP_ITERATION_4 30\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 31 && BOOST_PP_ITERATION_FINISH_4 >= 31\n#        define BOOST_PP_ITERATION_4 31\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 32 && BOOST_PP_ITERATION_FINISH_4 >= 32\n#        define BOOST_PP_ITERATION_4 32\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 33 && BOOST_PP_ITERATION_FINISH_4 >= 33\n#        define BOOST_PP_ITERATION_4 33\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 34 && BOOST_PP_ITERATION_FINISH_4 >= 34\n#        define BOOST_PP_ITERATION_4 34\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 35 && BOOST_PP_ITERATION_FINISH_4 >= 35\n#        define BOOST_PP_ITERATION_4 35\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 36 && BOOST_PP_ITERATION_FINISH_4 >= 36\n#        define BOOST_PP_ITERATION_4 36\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 37 && BOOST_PP_ITERATION_FINISH_4 >= 37\n#        define BOOST_PP_ITERATION_4 37\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 38 && BOOST_PP_ITERATION_FINISH_4 >= 38\n#        define BOOST_PP_ITERATION_4 38\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 39 && BOOST_PP_ITERATION_FINISH_4 >= 39\n#        define BOOST_PP_ITERATION_4 39\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 40 && BOOST_PP_ITERATION_FINISH_4 >= 40\n#        define BOOST_PP_ITERATION_4 40\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 41 && BOOST_PP_ITERATION_FINISH_4 >= 41\n#        define BOOST_PP_ITERATION_4 41\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 42 && BOOST_PP_ITERATION_FINISH_4 >= 42\n#        define BOOST_PP_ITERATION_4 42\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 43 && BOOST_PP_ITERATION_FINISH_4 >= 43\n#        define BOOST_PP_ITERATION_4 43\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 44 && BOOST_PP_ITERATION_FINISH_4 >= 44\n#        define BOOST_PP_ITERATION_4 44\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 45 && BOOST_PP_ITERATION_FINISH_4 >= 45\n#        define BOOST_PP_ITERATION_4 45\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 46 && BOOST_PP_ITERATION_FINISH_4 >= 46\n#        define BOOST_PP_ITERATION_4 46\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 47 && BOOST_PP_ITERATION_FINISH_4 >= 47\n#        define BOOST_PP_ITERATION_4 47\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 48 && BOOST_PP_ITERATION_FINISH_4 >= 48\n#        define BOOST_PP_ITERATION_4 48\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 49 && BOOST_PP_ITERATION_FINISH_4 >= 49\n#        define BOOST_PP_ITERATION_4 49\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 50 && BOOST_PP_ITERATION_FINISH_4 >= 50\n#        define BOOST_PP_ITERATION_4 50\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 51 && BOOST_PP_ITERATION_FINISH_4 >= 51\n#        define BOOST_PP_ITERATION_4 51\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 52 && BOOST_PP_ITERATION_FINISH_4 >= 52\n#        define BOOST_PP_ITERATION_4 52\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 53 && BOOST_PP_ITERATION_FINISH_4 >= 53\n#        define BOOST_PP_ITERATION_4 53\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 54 && BOOST_PP_ITERATION_FINISH_4 >= 54\n#        define BOOST_PP_ITERATION_4 54\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 55 && BOOST_PP_ITERATION_FINISH_4 >= 55\n#        define BOOST_PP_ITERATION_4 55\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 56 && BOOST_PP_ITERATION_FINISH_4 >= 56\n#        define BOOST_PP_ITERATION_4 56\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 57 && BOOST_PP_ITERATION_FINISH_4 >= 57\n#        define BOOST_PP_ITERATION_4 57\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 58 && BOOST_PP_ITERATION_FINISH_4 >= 58\n#        define BOOST_PP_ITERATION_4 58\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 59 && BOOST_PP_ITERATION_FINISH_4 >= 59\n#        define BOOST_PP_ITERATION_4 59\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 60 && BOOST_PP_ITERATION_FINISH_4 >= 60\n#        define BOOST_PP_ITERATION_4 60\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 61 && BOOST_PP_ITERATION_FINISH_4 >= 61\n#        define BOOST_PP_ITERATION_4 61\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 62 && BOOST_PP_ITERATION_FINISH_4 >= 62\n#        define BOOST_PP_ITERATION_4 62\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 63 && BOOST_PP_ITERATION_FINISH_4 >= 63\n#        define BOOST_PP_ITERATION_4 63\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 64 && BOOST_PP_ITERATION_FINISH_4 >= 64\n#        define BOOST_PP_ITERATION_4 64\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 65 && BOOST_PP_ITERATION_FINISH_4 >= 65\n#        define BOOST_PP_ITERATION_4 65\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 66 && BOOST_PP_ITERATION_FINISH_4 >= 66\n#        define BOOST_PP_ITERATION_4 66\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 67 && BOOST_PP_ITERATION_FINISH_4 >= 67\n#        define BOOST_PP_ITERATION_4 67\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 68 && BOOST_PP_ITERATION_FINISH_4 >= 68\n#        define BOOST_PP_ITERATION_4 68\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 69 && BOOST_PP_ITERATION_FINISH_4 >= 69\n#        define BOOST_PP_ITERATION_4 69\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 70 && BOOST_PP_ITERATION_FINISH_4 >= 70\n#        define BOOST_PP_ITERATION_4 70\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 71 && BOOST_PP_ITERATION_FINISH_4 >= 71\n#        define BOOST_PP_ITERATION_4 71\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 72 && BOOST_PP_ITERATION_FINISH_4 >= 72\n#        define BOOST_PP_ITERATION_4 72\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 73 && BOOST_PP_ITERATION_FINISH_4 >= 73\n#        define BOOST_PP_ITERATION_4 73\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 74 && BOOST_PP_ITERATION_FINISH_4 >= 74\n#        define BOOST_PP_ITERATION_4 74\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 75 && BOOST_PP_ITERATION_FINISH_4 >= 75\n#        define BOOST_PP_ITERATION_4 75\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 76 && BOOST_PP_ITERATION_FINISH_4 >= 76\n#        define BOOST_PP_ITERATION_4 76\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 77 && BOOST_PP_ITERATION_FINISH_4 >= 77\n#        define BOOST_PP_ITERATION_4 77\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 78 && BOOST_PP_ITERATION_FINISH_4 >= 78\n#        define BOOST_PP_ITERATION_4 78\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 79 && BOOST_PP_ITERATION_FINISH_4 >= 79\n#        define BOOST_PP_ITERATION_4 79\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 80 && BOOST_PP_ITERATION_FINISH_4 >= 80\n#        define BOOST_PP_ITERATION_4 80\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 81 && BOOST_PP_ITERATION_FINISH_4 >= 81\n#        define BOOST_PP_ITERATION_4 81\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 82 && BOOST_PP_ITERATION_FINISH_4 >= 82\n#        define BOOST_PP_ITERATION_4 82\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 83 && BOOST_PP_ITERATION_FINISH_4 >= 83\n#        define BOOST_PP_ITERATION_4 83\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 84 && BOOST_PP_ITERATION_FINISH_4 >= 84\n#        define BOOST_PP_ITERATION_4 84\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 85 && BOOST_PP_ITERATION_FINISH_4 >= 85\n#        define BOOST_PP_ITERATION_4 85\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 86 && BOOST_PP_ITERATION_FINISH_4 >= 86\n#        define BOOST_PP_ITERATION_4 86\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 87 && BOOST_PP_ITERATION_FINISH_4 >= 87\n#        define BOOST_PP_ITERATION_4 87\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 88 && BOOST_PP_ITERATION_FINISH_4 >= 88\n#        define BOOST_PP_ITERATION_4 88\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 89 && BOOST_PP_ITERATION_FINISH_4 >= 89\n#        define BOOST_PP_ITERATION_4 89\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 90 && BOOST_PP_ITERATION_FINISH_4 >= 90\n#        define BOOST_PP_ITERATION_4 90\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 91 && BOOST_PP_ITERATION_FINISH_4 >= 91\n#        define BOOST_PP_ITERATION_4 91\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 92 && BOOST_PP_ITERATION_FINISH_4 >= 92\n#        define BOOST_PP_ITERATION_4 92\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 93 && BOOST_PP_ITERATION_FINISH_4 >= 93\n#        define BOOST_PP_ITERATION_4 93\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 94 && BOOST_PP_ITERATION_FINISH_4 >= 94\n#        define BOOST_PP_ITERATION_4 94\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 95 && BOOST_PP_ITERATION_FINISH_4 >= 95\n#        define BOOST_PP_ITERATION_4 95\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 96 && BOOST_PP_ITERATION_FINISH_4 >= 96\n#        define BOOST_PP_ITERATION_4 96\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 97 && BOOST_PP_ITERATION_FINISH_4 >= 97\n#        define BOOST_PP_ITERATION_4 97\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 98 && BOOST_PP_ITERATION_FINISH_4 >= 98\n#        define BOOST_PP_ITERATION_4 98\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 99 && BOOST_PP_ITERATION_FINISH_4 >= 99\n#        define BOOST_PP_ITERATION_4 99\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 100 && BOOST_PP_ITERATION_FINISH_4 >= 100\n#        define BOOST_PP_ITERATION_4 100\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 101 && BOOST_PP_ITERATION_FINISH_4 >= 101\n#        define BOOST_PP_ITERATION_4 101\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 102 && BOOST_PP_ITERATION_FINISH_4 >= 102\n#        define BOOST_PP_ITERATION_4 102\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 103 && BOOST_PP_ITERATION_FINISH_4 >= 103\n#        define BOOST_PP_ITERATION_4 103\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 104 && BOOST_PP_ITERATION_FINISH_4 >= 104\n#        define BOOST_PP_ITERATION_4 104\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 105 && BOOST_PP_ITERATION_FINISH_4 >= 105\n#        define BOOST_PP_ITERATION_4 105\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 106 && BOOST_PP_ITERATION_FINISH_4 >= 106\n#        define BOOST_PP_ITERATION_4 106\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 107 && BOOST_PP_ITERATION_FINISH_4 >= 107\n#        define BOOST_PP_ITERATION_4 107\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 108 && BOOST_PP_ITERATION_FINISH_4 >= 108\n#        define BOOST_PP_ITERATION_4 108\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 109 && BOOST_PP_ITERATION_FINISH_4 >= 109\n#        define BOOST_PP_ITERATION_4 109\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 110 && BOOST_PP_ITERATION_FINISH_4 >= 110\n#        define BOOST_PP_ITERATION_4 110\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 111 && BOOST_PP_ITERATION_FINISH_4 >= 111\n#        define BOOST_PP_ITERATION_4 111\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 112 && BOOST_PP_ITERATION_FINISH_4 >= 112\n#        define BOOST_PP_ITERATION_4 112\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 113 && BOOST_PP_ITERATION_FINISH_4 >= 113\n#        define BOOST_PP_ITERATION_4 113\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 114 && BOOST_PP_ITERATION_FINISH_4 >= 114\n#        define BOOST_PP_ITERATION_4 114\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 115 && BOOST_PP_ITERATION_FINISH_4 >= 115\n#        define BOOST_PP_ITERATION_4 115\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 116 && BOOST_PP_ITERATION_FINISH_4 >= 116\n#        define BOOST_PP_ITERATION_4 116\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 117 && BOOST_PP_ITERATION_FINISH_4 >= 117\n#        define BOOST_PP_ITERATION_4 117\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 118 && BOOST_PP_ITERATION_FINISH_4 >= 118\n#        define BOOST_PP_ITERATION_4 118\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 119 && BOOST_PP_ITERATION_FINISH_4 >= 119\n#        define BOOST_PP_ITERATION_4 119\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 120 && BOOST_PP_ITERATION_FINISH_4 >= 120\n#        define BOOST_PP_ITERATION_4 120\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 121 && BOOST_PP_ITERATION_FINISH_4 >= 121\n#        define BOOST_PP_ITERATION_4 121\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 122 && BOOST_PP_ITERATION_FINISH_4 >= 122\n#        define BOOST_PP_ITERATION_4 122\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 123 && BOOST_PP_ITERATION_FINISH_4 >= 123\n#        define BOOST_PP_ITERATION_4 123\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 124 && BOOST_PP_ITERATION_FINISH_4 >= 124\n#        define BOOST_PP_ITERATION_4 124\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 125 && BOOST_PP_ITERATION_FINISH_4 >= 125\n#        define BOOST_PP_ITERATION_4 125\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 126 && BOOST_PP_ITERATION_FINISH_4 >= 126\n#        define BOOST_PP_ITERATION_4 126\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 127 && BOOST_PP_ITERATION_FINISH_4 >= 127\n#        define BOOST_PP_ITERATION_4 127\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 128 && BOOST_PP_ITERATION_FINISH_4 >= 128\n#        define BOOST_PP_ITERATION_4 128\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 129 && BOOST_PP_ITERATION_FINISH_4 >= 129\n#        define BOOST_PP_ITERATION_4 129\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 130 && BOOST_PP_ITERATION_FINISH_4 >= 130\n#        define BOOST_PP_ITERATION_4 130\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 131 && BOOST_PP_ITERATION_FINISH_4 >= 131\n#        define BOOST_PP_ITERATION_4 131\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 132 && BOOST_PP_ITERATION_FINISH_4 >= 132\n#        define BOOST_PP_ITERATION_4 132\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 133 && BOOST_PP_ITERATION_FINISH_4 >= 133\n#        define BOOST_PP_ITERATION_4 133\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 134 && BOOST_PP_ITERATION_FINISH_4 >= 134\n#        define BOOST_PP_ITERATION_4 134\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 135 && BOOST_PP_ITERATION_FINISH_4 >= 135\n#        define BOOST_PP_ITERATION_4 135\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 136 && BOOST_PP_ITERATION_FINISH_4 >= 136\n#        define BOOST_PP_ITERATION_4 136\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 137 && BOOST_PP_ITERATION_FINISH_4 >= 137\n#        define BOOST_PP_ITERATION_4 137\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 138 && BOOST_PP_ITERATION_FINISH_4 >= 138\n#        define BOOST_PP_ITERATION_4 138\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 139 && BOOST_PP_ITERATION_FINISH_4 >= 139\n#        define BOOST_PP_ITERATION_4 139\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 140 && BOOST_PP_ITERATION_FINISH_4 >= 140\n#        define BOOST_PP_ITERATION_4 140\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 141 && BOOST_PP_ITERATION_FINISH_4 >= 141\n#        define BOOST_PP_ITERATION_4 141\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 142 && BOOST_PP_ITERATION_FINISH_4 >= 142\n#        define BOOST_PP_ITERATION_4 142\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 143 && BOOST_PP_ITERATION_FINISH_4 >= 143\n#        define BOOST_PP_ITERATION_4 143\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 144 && BOOST_PP_ITERATION_FINISH_4 >= 144\n#        define BOOST_PP_ITERATION_4 144\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 145 && BOOST_PP_ITERATION_FINISH_4 >= 145\n#        define BOOST_PP_ITERATION_4 145\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 146 && BOOST_PP_ITERATION_FINISH_4 >= 146\n#        define BOOST_PP_ITERATION_4 146\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 147 && BOOST_PP_ITERATION_FINISH_4 >= 147\n#        define BOOST_PP_ITERATION_4 147\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 148 && BOOST_PP_ITERATION_FINISH_4 >= 148\n#        define BOOST_PP_ITERATION_4 148\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 149 && BOOST_PP_ITERATION_FINISH_4 >= 149\n#        define BOOST_PP_ITERATION_4 149\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 150 && BOOST_PP_ITERATION_FINISH_4 >= 150\n#        define BOOST_PP_ITERATION_4 150\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 151 && BOOST_PP_ITERATION_FINISH_4 >= 151\n#        define BOOST_PP_ITERATION_4 151\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 152 && BOOST_PP_ITERATION_FINISH_4 >= 152\n#        define BOOST_PP_ITERATION_4 152\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 153 && BOOST_PP_ITERATION_FINISH_4 >= 153\n#        define BOOST_PP_ITERATION_4 153\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 154 && BOOST_PP_ITERATION_FINISH_4 >= 154\n#        define BOOST_PP_ITERATION_4 154\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 155 && BOOST_PP_ITERATION_FINISH_4 >= 155\n#        define BOOST_PP_ITERATION_4 155\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 156 && BOOST_PP_ITERATION_FINISH_4 >= 156\n#        define BOOST_PP_ITERATION_4 156\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 157 && BOOST_PP_ITERATION_FINISH_4 >= 157\n#        define BOOST_PP_ITERATION_4 157\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 158 && BOOST_PP_ITERATION_FINISH_4 >= 158\n#        define BOOST_PP_ITERATION_4 158\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 159 && BOOST_PP_ITERATION_FINISH_4 >= 159\n#        define BOOST_PP_ITERATION_4 159\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 160 && BOOST_PP_ITERATION_FINISH_4 >= 160\n#        define BOOST_PP_ITERATION_4 160\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 161 && BOOST_PP_ITERATION_FINISH_4 >= 161\n#        define BOOST_PP_ITERATION_4 161\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 162 && BOOST_PP_ITERATION_FINISH_4 >= 162\n#        define BOOST_PP_ITERATION_4 162\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 163 && BOOST_PP_ITERATION_FINISH_4 >= 163\n#        define BOOST_PP_ITERATION_4 163\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 164 && BOOST_PP_ITERATION_FINISH_4 >= 164\n#        define BOOST_PP_ITERATION_4 164\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 165 && BOOST_PP_ITERATION_FINISH_4 >= 165\n#        define BOOST_PP_ITERATION_4 165\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 166 && BOOST_PP_ITERATION_FINISH_4 >= 166\n#        define BOOST_PP_ITERATION_4 166\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 167 && BOOST_PP_ITERATION_FINISH_4 >= 167\n#        define BOOST_PP_ITERATION_4 167\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 168 && BOOST_PP_ITERATION_FINISH_4 >= 168\n#        define BOOST_PP_ITERATION_4 168\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 169 && BOOST_PP_ITERATION_FINISH_4 >= 169\n#        define BOOST_PP_ITERATION_4 169\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 170 && BOOST_PP_ITERATION_FINISH_4 >= 170\n#        define BOOST_PP_ITERATION_4 170\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 171 && BOOST_PP_ITERATION_FINISH_4 >= 171\n#        define BOOST_PP_ITERATION_4 171\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 172 && BOOST_PP_ITERATION_FINISH_4 >= 172\n#        define BOOST_PP_ITERATION_4 172\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 173 && BOOST_PP_ITERATION_FINISH_4 >= 173\n#        define BOOST_PP_ITERATION_4 173\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 174 && BOOST_PP_ITERATION_FINISH_4 >= 174\n#        define BOOST_PP_ITERATION_4 174\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 175 && BOOST_PP_ITERATION_FINISH_4 >= 175\n#        define BOOST_PP_ITERATION_4 175\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 176 && BOOST_PP_ITERATION_FINISH_4 >= 176\n#        define BOOST_PP_ITERATION_4 176\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 177 && BOOST_PP_ITERATION_FINISH_4 >= 177\n#        define BOOST_PP_ITERATION_4 177\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 178 && BOOST_PP_ITERATION_FINISH_4 >= 178\n#        define BOOST_PP_ITERATION_4 178\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 179 && BOOST_PP_ITERATION_FINISH_4 >= 179\n#        define BOOST_PP_ITERATION_4 179\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 180 && BOOST_PP_ITERATION_FINISH_4 >= 180\n#        define BOOST_PP_ITERATION_4 180\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 181 && BOOST_PP_ITERATION_FINISH_4 >= 181\n#        define BOOST_PP_ITERATION_4 181\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 182 && BOOST_PP_ITERATION_FINISH_4 >= 182\n#        define BOOST_PP_ITERATION_4 182\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 183 && BOOST_PP_ITERATION_FINISH_4 >= 183\n#        define BOOST_PP_ITERATION_4 183\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 184 && BOOST_PP_ITERATION_FINISH_4 >= 184\n#        define BOOST_PP_ITERATION_4 184\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 185 && BOOST_PP_ITERATION_FINISH_4 >= 185\n#        define BOOST_PP_ITERATION_4 185\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 186 && BOOST_PP_ITERATION_FINISH_4 >= 186\n#        define BOOST_PP_ITERATION_4 186\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 187 && BOOST_PP_ITERATION_FINISH_4 >= 187\n#        define BOOST_PP_ITERATION_4 187\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 188 && BOOST_PP_ITERATION_FINISH_4 >= 188\n#        define BOOST_PP_ITERATION_4 188\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 189 && BOOST_PP_ITERATION_FINISH_4 >= 189\n#        define BOOST_PP_ITERATION_4 189\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 190 && BOOST_PP_ITERATION_FINISH_4 >= 190\n#        define BOOST_PP_ITERATION_4 190\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 191 && BOOST_PP_ITERATION_FINISH_4 >= 191\n#        define BOOST_PP_ITERATION_4 191\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 192 && BOOST_PP_ITERATION_FINISH_4 >= 192\n#        define BOOST_PP_ITERATION_4 192\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 193 && BOOST_PP_ITERATION_FINISH_4 >= 193\n#        define BOOST_PP_ITERATION_4 193\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 194 && BOOST_PP_ITERATION_FINISH_4 >= 194\n#        define BOOST_PP_ITERATION_4 194\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 195 && BOOST_PP_ITERATION_FINISH_4 >= 195\n#        define BOOST_PP_ITERATION_4 195\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 196 && BOOST_PP_ITERATION_FINISH_4 >= 196\n#        define BOOST_PP_ITERATION_4 196\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 197 && BOOST_PP_ITERATION_FINISH_4 >= 197\n#        define BOOST_PP_ITERATION_4 197\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 198 && BOOST_PP_ITERATION_FINISH_4 >= 198\n#        define BOOST_PP_ITERATION_4 198\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 199 && BOOST_PP_ITERATION_FINISH_4 >= 199\n#        define BOOST_PP_ITERATION_4 199\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 200 && BOOST_PP_ITERATION_FINISH_4 >= 200\n#        define BOOST_PP_ITERATION_4 200\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 201 && BOOST_PP_ITERATION_FINISH_4 >= 201\n#        define BOOST_PP_ITERATION_4 201\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 202 && BOOST_PP_ITERATION_FINISH_4 >= 202\n#        define BOOST_PP_ITERATION_4 202\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 203 && BOOST_PP_ITERATION_FINISH_4 >= 203\n#        define BOOST_PP_ITERATION_4 203\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 204 && BOOST_PP_ITERATION_FINISH_4 >= 204\n#        define BOOST_PP_ITERATION_4 204\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 205 && BOOST_PP_ITERATION_FINISH_4 >= 205\n#        define BOOST_PP_ITERATION_4 205\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 206 && BOOST_PP_ITERATION_FINISH_4 >= 206\n#        define BOOST_PP_ITERATION_4 206\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 207 && BOOST_PP_ITERATION_FINISH_4 >= 207\n#        define BOOST_PP_ITERATION_4 207\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 208 && BOOST_PP_ITERATION_FINISH_4 >= 208\n#        define BOOST_PP_ITERATION_4 208\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 209 && BOOST_PP_ITERATION_FINISH_4 >= 209\n#        define BOOST_PP_ITERATION_4 209\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 210 && BOOST_PP_ITERATION_FINISH_4 >= 210\n#        define BOOST_PP_ITERATION_4 210\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 211 && BOOST_PP_ITERATION_FINISH_4 >= 211\n#        define BOOST_PP_ITERATION_4 211\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 212 && BOOST_PP_ITERATION_FINISH_4 >= 212\n#        define BOOST_PP_ITERATION_4 212\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 213 && BOOST_PP_ITERATION_FINISH_4 >= 213\n#        define BOOST_PP_ITERATION_4 213\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 214 && BOOST_PP_ITERATION_FINISH_4 >= 214\n#        define BOOST_PP_ITERATION_4 214\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 215 && BOOST_PP_ITERATION_FINISH_4 >= 215\n#        define BOOST_PP_ITERATION_4 215\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 216 && BOOST_PP_ITERATION_FINISH_4 >= 216\n#        define BOOST_PP_ITERATION_4 216\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 217 && BOOST_PP_ITERATION_FINISH_4 >= 217\n#        define BOOST_PP_ITERATION_4 217\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 218 && BOOST_PP_ITERATION_FINISH_4 >= 218\n#        define BOOST_PP_ITERATION_4 218\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 219 && BOOST_PP_ITERATION_FINISH_4 >= 219\n#        define BOOST_PP_ITERATION_4 219\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 220 && BOOST_PP_ITERATION_FINISH_4 >= 220\n#        define BOOST_PP_ITERATION_4 220\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 221 && BOOST_PP_ITERATION_FINISH_4 >= 221\n#        define BOOST_PP_ITERATION_4 221\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 222 && BOOST_PP_ITERATION_FINISH_4 >= 222\n#        define BOOST_PP_ITERATION_4 222\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 223 && BOOST_PP_ITERATION_FINISH_4 >= 223\n#        define BOOST_PP_ITERATION_4 223\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 224 && BOOST_PP_ITERATION_FINISH_4 >= 224\n#        define BOOST_PP_ITERATION_4 224\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 225 && BOOST_PP_ITERATION_FINISH_4 >= 225\n#        define BOOST_PP_ITERATION_4 225\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 226 && BOOST_PP_ITERATION_FINISH_4 >= 226\n#        define BOOST_PP_ITERATION_4 226\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 227 && BOOST_PP_ITERATION_FINISH_4 >= 227\n#        define BOOST_PP_ITERATION_4 227\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 228 && BOOST_PP_ITERATION_FINISH_4 >= 228\n#        define BOOST_PP_ITERATION_4 228\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 229 && BOOST_PP_ITERATION_FINISH_4 >= 229\n#        define BOOST_PP_ITERATION_4 229\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 230 && BOOST_PP_ITERATION_FINISH_4 >= 230\n#        define BOOST_PP_ITERATION_4 230\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 231 && BOOST_PP_ITERATION_FINISH_4 >= 231\n#        define BOOST_PP_ITERATION_4 231\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 232 && BOOST_PP_ITERATION_FINISH_4 >= 232\n#        define BOOST_PP_ITERATION_4 232\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 233 && BOOST_PP_ITERATION_FINISH_4 >= 233\n#        define BOOST_PP_ITERATION_4 233\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 234 && BOOST_PP_ITERATION_FINISH_4 >= 234\n#        define BOOST_PP_ITERATION_4 234\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 235 && BOOST_PP_ITERATION_FINISH_4 >= 235\n#        define BOOST_PP_ITERATION_4 235\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 236 && BOOST_PP_ITERATION_FINISH_4 >= 236\n#        define BOOST_PP_ITERATION_4 236\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 237 && BOOST_PP_ITERATION_FINISH_4 >= 237\n#        define BOOST_PP_ITERATION_4 237\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 238 && BOOST_PP_ITERATION_FINISH_4 >= 238\n#        define BOOST_PP_ITERATION_4 238\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 239 && BOOST_PP_ITERATION_FINISH_4 >= 239\n#        define BOOST_PP_ITERATION_4 239\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 240 && BOOST_PP_ITERATION_FINISH_4 >= 240\n#        define BOOST_PP_ITERATION_4 240\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 241 && BOOST_PP_ITERATION_FINISH_4 >= 241\n#        define BOOST_PP_ITERATION_4 241\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 242 && BOOST_PP_ITERATION_FINISH_4 >= 242\n#        define BOOST_PP_ITERATION_4 242\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 243 && BOOST_PP_ITERATION_FINISH_4 >= 243\n#        define BOOST_PP_ITERATION_4 243\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 244 && BOOST_PP_ITERATION_FINISH_4 >= 244\n#        define BOOST_PP_ITERATION_4 244\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 245 && BOOST_PP_ITERATION_FINISH_4 >= 245\n#        define BOOST_PP_ITERATION_4 245\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 246 && BOOST_PP_ITERATION_FINISH_4 >= 246\n#        define BOOST_PP_ITERATION_4 246\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 247 && BOOST_PP_ITERATION_FINISH_4 >= 247\n#        define BOOST_PP_ITERATION_4 247\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 248 && BOOST_PP_ITERATION_FINISH_4 >= 248\n#        define BOOST_PP_ITERATION_4 248\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 249 && BOOST_PP_ITERATION_FINISH_4 >= 249\n#        define BOOST_PP_ITERATION_4 249\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 250 && BOOST_PP_ITERATION_FINISH_4 >= 250\n#        define BOOST_PP_ITERATION_4 250\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 251 && BOOST_PP_ITERATION_FINISH_4 >= 251\n#        define BOOST_PP_ITERATION_4 251\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 252 && BOOST_PP_ITERATION_FINISH_4 >= 252\n#        define BOOST_PP_ITERATION_4 252\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 253 && BOOST_PP_ITERATION_FINISH_4 >= 253\n#        define BOOST_PP_ITERATION_4 253\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 254 && BOOST_PP_ITERATION_FINISH_4 >= 254\n#        define BOOST_PP_ITERATION_4 254\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 255 && BOOST_PP_ITERATION_FINISH_4 >= 255\n#        define BOOST_PP_ITERATION_4 255\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 256 && BOOST_PP_ITERATION_FINISH_4 >= 256\n#        define BOOST_PP_ITERATION_4 256\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n# endif\n#\n# undef BOOST_PP_ITERATION_DEPTH\n# define BOOST_PP_ITERATION_DEPTH() 3\n#\n# undef BOOST_PP_ITERATION_START_4\n# undef BOOST_PP_ITERATION_FINISH_4\n# undef BOOST_PP_FILENAME_4\n#\n# undef BOOST_PP_ITERATION_FLAGS_4\n# undef BOOST_PP_ITERATION_PARAMS_4\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/iteration/detail/iter/forward5.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# if defined(BOOST_PP_ITERATION_LIMITS)\n#    if !defined(BOOST_PP_FILENAME_5)\n#        error BOOST_PP_ERROR:  depth #5 filename is not defined\n#    endif\n#    define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_ITERATION_LIMITS)\n#    include <boost/preprocessor/iteration/detail/bounds/lower5.hpp>\n#    define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_ITERATION_LIMITS)\n#    include <boost/preprocessor/iteration/detail/bounds/upper5.hpp>\n#    define BOOST_PP_ITERATION_FLAGS_5() 0\n#    undef BOOST_PP_ITERATION_LIMITS\n# elif defined(BOOST_PP_ITERATION_PARAMS_5)\n#    define BOOST_PP_VALUE BOOST_PP_ARRAY_ELEM(0, BOOST_PP_ITERATION_PARAMS_5)\n#    include <boost/preprocessor/iteration/detail/bounds/lower5.hpp>\n#    define BOOST_PP_VALUE BOOST_PP_ARRAY_ELEM(1, BOOST_PP_ITERATION_PARAMS_5)\n#    include <boost/preprocessor/iteration/detail/bounds/upper5.hpp>\n#    define BOOST_PP_FILENAME_5 BOOST_PP_ARRAY_ELEM(2, BOOST_PP_ITERATION_PARAMS_5)\n#    if BOOST_PP_ARRAY_SIZE(BOOST_PP_ITERATION_PARAMS_5) >= 4\n#        define BOOST_PP_ITERATION_FLAGS_5() BOOST_PP_ARRAY_ELEM(3, BOOST_PP_ITERATION_PARAMS_5)\n#    else\n#        define BOOST_PP_ITERATION_FLAGS_5() 0\n#    endif\n# else\n#    error BOOST_PP_ERROR:  depth #5 iteration boundaries or filename not defined\n# endif\n#\n# undef BOOST_PP_ITERATION_DEPTH\n# define BOOST_PP_ITERATION_DEPTH() 5\n#\n# if (BOOST_PP_ITERATION_START_5) > (BOOST_PP_ITERATION_FINISH_5)\n#    include <boost/preprocessor/iteration/detail/iter/reverse5.hpp>\n# else\n#    if BOOST_PP_ITERATION_START_5 <= 0 && BOOST_PP_ITERATION_FINISH_5 >= 0\n#        define BOOST_PP_ITERATION_5 0\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 1 && BOOST_PP_ITERATION_FINISH_5 >= 1\n#        define BOOST_PP_ITERATION_5 1\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 2 && BOOST_PP_ITERATION_FINISH_5 >= 2\n#        define BOOST_PP_ITERATION_5 2\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 3 && BOOST_PP_ITERATION_FINISH_5 >= 3\n#        define BOOST_PP_ITERATION_5 3\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 4 && BOOST_PP_ITERATION_FINISH_5 >= 4\n#        define BOOST_PP_ITERATION_5 4\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 5 && BOOST_PP_ITERATION_FINISH_5 >= 5\n#        define BOOST_PP_ITERATION_5 5\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 6 && BOOST_PP_ITERATION_FINISH_5 >= 6\n#        define BOOST_PP_ITERATION_5 6\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 7 && BOOST_PP_ITERATION_FINISH_5 >= 7\n#        define BOOST_PP_ITERATION_5 7\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 8 && BOOST_PP_ITERATION_FINISH_5 >= 8\n#        define BOOST_PP_ITERATION_5 8\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 9 && BOOST_PP_ITERATION_FINISH_5 >= 9\n#        define BOOST_PP_ITERATION_5 9\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 10 && BOOST_PP_ITERATION_FINISH_5 >= 10\n#        define BOOST_PP_ITERATION_5 10\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 11 && BOOST_PP_ITERATION_FINISH_5 >= 11\n#        define BOOST_PP_ITERATION_5 11\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 12 && BOOST_PP_ITERATION_FINISH_5 >= 12\n#        define BOOST_PP_ITERATION_5 12\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 13 && BOOST_PP_ITERATION_FINISH_5 >= 13\n#        define BOOST_PP_ITERATION_5 13\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 14 && BOOST_PP_ITERATION_FINISH_5 >= 14\n#        define BOOST_PP_ITERATION_5 14\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 15 && BOOST_PP_ITERATION_FINISH_5 >= 15\n#        define BOOST_PP_ITERATION_5 15\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 16 && BOOST_PP_ITERATION_FINISH_5 >= 16\n#        define BOOST_PP_ITERATION_5 16\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 17 && BOOST_PP_ITERATION_FINISH_5 >= 17\n#        define BOOST_PP_ITERATION_5 17\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 18 && BOOST_PP_ITERATION_FINISH_5 >= 18\n#        define BOOST_PP_ITERATION_5 18\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 19 && BOOST_PP_ITERATION_FINISH_5 >= 19\n#        define BOOST_PP_ITERATION_5 19\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 20 && BOOST_PP_ITERATION_FINISH_5 >= 20\n#        define BOOST_PP_ITERATION_5 20\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 21 && BOOST_PP_ITERATION_FINISH_5 >= 21\n#        define BOOST_PP_ITERATION_5 21\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 22 && BOOST_PP_ITERATION_FINISH_5 >= 22\n#        define BOOST_PP_ITERATION_5 22\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 23 && BOOST_PP_ITERATION_FINISH_5 >= 23\n#        define BOOST_PP_ITERATION_5 23\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 24 && BOOST_PP_ITERATION_FINISH_5 >= 24\n#        define BOOST_PP_ITERATION_5 24\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 25 && BOOST_PP_ITERATION_FINISH_5 >= 25\n#        define BOOST_PP_ITERATION_5 25\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 26 && BOOST_PP_ITERATION_FINISH_5 >= 26\n#        define BOOST_PP_ITERATION_5 26\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 27 && BOOST_PP_ITERATION_FINISH_5 >= 27\n#        define BOOST_PP_ITERATION_5 27\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 28 && BOOST_PP_ITERATION_FINISH_5 >= 28\n#        define BOOST_PP_ITERATION_5 28\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 29 && BOOST_PP_ITERATION_FINISH_5 >= 29\n#        define BOOST_PP_ITERATION_5 29\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 30 && BOOST_PP_ITERATION_FINISH_5 >= 30\n#        define BOOST_PP_ITERATION_5 30\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 31 && BOOST_PP_ITERATION_FINISH_5 >= 31\n#        define BOOST_PP_ITERATION_5 31\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 32 && BOOST_PP_ITERATION_FINISH_5 >= 32\n#        define BOOST_PP_ITERATION_5 32\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 33 && BOOST_PP_ITERATION_FINISH_5 >= 33\n#        define BOOST_PP_ITERATION_5 33\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 34 && BOOST_PP_ITERATION_FINISH_5 >= 34\n#        define BOOST_PP_ITERATION_5 34\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 35 && BOOST_PP_ITERATION_FINISH_5 >= 35\n#        define BOOST_PP_ITERATION_5 35\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 36 && BOOST_PP_ITERATION_FINISH_5 >= 36\n#        define BOOST_PP_ITERATION_5 36\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 37 && BOOST_PP_ITERATION_FINISH_5 >= 37\n#        define BOOST_PP_ITERATION_5 37\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 38 && BOOST_PP_ITERATION_FINISH_5 >= 38\n#        define BOOST_PP_ITERATION_5 38\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 39 && BOOST_PP_ITERATION_FINISH_5 >= 39\n#        define BOOST_PP_ITERATION_5 39\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 40 && BOOST_PP_ITERATION_FINISH_5 >= 40\n#        define BOOST_PP_ITERATION_5 40\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 41 && BOOST_PP_ITERATION_FINISH_5 >= 41\n#        define BOOST_PP_ITERATION_5 41\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 42 && BOOST_PP_ITERATION_FINISH_5 >= 42\n#        define BOOST_PP_ITERATION_5 42\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 43 && BOOST_PP_ITERATION_FINISH_5 >= 43\n#        define BOOST_PP_ITERATION_5 43\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 44 && BOOST_PP_ITERATION_FINISH_5 >= 44\n#        define BOOST_PP_ITERATION_5 44\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 45 && BOOST_PP_ITERATION_FINISH_5 >= 45\n#        define BOOST_PP_ITERATION_5 45\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 46 && BOOST_PP_ITERATION_FINISH_5 >= 46\n#        define BOOST_PP_ITERATION_5 46\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 47 && BOOST_PP_ITERATION_FINISH_5 >= 47\n#        define BOOST_PP_ITERATION_5 47\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 48 && BOOST_PP_ITERATION_FINISH_5 >= 48\n#        define BOOST_PP_ITERATION_5 48\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 49 && BOOST_PP_ITERATION_FINISH_5 >= 49\n#        define BOOST_PP_ITERATION_5 49\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 50 && BOOST_PP_ITERATION_FINISH_5 >= 50\n#        define BOOST_PP_ITERATION_5 50\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 51 && BOOST_PP_ITERATION_FINISH_5 >= 51\n#        define BOOST_PP_ITERATION_5 51\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 52 && BOOST_PP_ITERATION_FINISH_5 >= 52\n#        define BOOST_PP_ITERATION_5 52\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 53 && BOOST_PP_ITERATION_FINISH_5 >= 53\n#        define BOOST_PP_ITERATION_5 53\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 54 && BOOST_PP_ITERATION_FINISH_5 >= 54\n#        define BOOST_PP_ITERATION_5 54\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 55 && BOOST_PP_ITERATION_FINISH_5 >= 55\n#        define BOOST_PP_ITERATION_5 55\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 56 && BOOST_PP_ITERATION_FINISH_5 >= 56\n#        define BOOST_PP_ITERATION_5 56\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 57 && BOOST_PP_ITERATION_FINISH_5 >= 57\n#        define BOOST_PP_ITERATION_5 57\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 58 && BOOST_PP_ITERATION_FINISH_5 >= 58\n#        define BOOST_PP_ITERATION_5 58\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 59 && BOOST_PP_ITERATION_FINISH_5 >= 59\n#        define BOOST_PP_ITERATION_5 59\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 60 && BOOST_PP_ITERATION_FINISH_5 >= 60\n#        define BOOST_PP_ITERATION_5 60\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 61 && BOOST_PP_ITERATION_FINISH_5 >= 61\n#        define BOOST_PP_ITERATION_5 61\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 62 && BOOST_PP_ITERATION_FINISH_5 >= 62\n#        define BOOST_PP_ITERATION_5 62\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 63 && BOOST_PP_ITERATION_FINISH_5 >= 63\n#        define BOOST_PP_ITERATION_5 63\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 64 && BOOST_PP_ITERATION_FINISH_5 >= 64\n#        define BOOST_PP_ITERATION_5 64\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 65 && BOOST_PP_ITERATION_FINISH_5 >= 65\n#        define BOOST_PP_ITERATION_5 65\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 66 && BOOST_PP_ITERATION_FINISH_5 >= 66\n#        define BOOST_PP_ITERATION_5 66\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 67 && BOOST_PP_ITERATION_FINISH_5 >= 67\n#        define BOOST_PP_ITERATION_5 67\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 68 && BOOST_PP_ITERATION_FINISH_5 >= 68\n#        define BOOST_PP_ITERATION_5 68\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 69 && BOOST_PP_ITERATION_FINISH_5 >= 69\n#        define BOOST_PP_ITERATION_5 69\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 70 && BOOST_PP_ITERATION_FINISH_5 >= 70\n#        define BOOST_PP_ITERATION_5 70\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 71 && BOOST_PP_ITERATION_FINISH_5 >= 71\n#        define BOOST_PP_ITERATION_5 71\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 72 && BOOST_PP_ITERATION_FINISH_5 >= 72\n#        define BOOST_PP_ITERATION_5 72\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 73 && BOOST_PP_ITERATION_FINISH_5 >= 73\n#        define BOOST_PP_ITERATION_5 73\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 74 && BOOST_PP_ITERATION_FINISH_5 >= 74\n#        define BOOST_PP_ITERATION_5 74\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 75 && BOOST_PP_ITERATION_FINISH_5 >= 75\n#        define BOOST_PP_ITERATION_5 75\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 76 && BOOST_PP_ITERATION_FINISH_5 >= 76\n#        define BOOST_PP_ITERATION_5 76\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 77 && BOOST_PP_ITERATION_FINISH_5 >= 77\n#        define BOOST_PP_ITERATION_5 77\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 78 && BOOST_PP_ITERATION_FINISH_5 >= 78\n#        define BOOST_PP_ITERATION_5 78\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 79 && BOOST_PP_ITERATION_FINISH_5 >= 79\n#        define BOOST_PP_ITERATION_5 79\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 80 && BOOST_PP_ITERATION_FINISH_5 >= 80\n#        define BOOST_PP_ITERATION_5 80\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 81 && BOOST_PP_ITERATION_FINISH_5 >= 81\n#        define BOOST_PP_ITERATION_5 81\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 82 && BOOST_PP_ITERATION_FINISH_5 >= 82\n#        define BOOST_PP_ITERATION_5 82\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 83 && BOOST_PP_ITERATION_FINISH_5 >= 83\n#        define BOOST_PP_ITERATION_5 83\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 84 && BOOST_PP_ITERATION_FINISH_5 >= 84\n#        define BOOST_PP_ITERATION_5 84\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 85 && BOOST_PP_ITERATION_FINISH_5 >= 85\n#        define BOOST_PP_ITERATION_5 85\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 86 && BOOST_PP_ITERATION_FINISH_5 >= 86\n#        define BOOST_PP_ITERATION_5 86\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 87 && BOOST_PP_ITERATION_FINISH_5 >= 87\n#        define BOOST_PP_ITERATION_5 87\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 88 && BOOST_PP_ITERATION_FINISH_5 >= 88\n#        define BOOST_PP_ITERATION_5 88\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 89 && BOOST_PP_ITERATION_FINISH_5 >= 89\n#        define BOOST_PP_ITERATION_5 89\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 90 && BOOST_PP_ITERATION_FINISH_5 >= 90\n#        define BOOST_PP_ITERATION_5 90\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 91 && BOOST_PP_ITERATION_FINISH_5 >= 91\n#        define BOOST_PP_ITERATION_5 91\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 92 && BOOST_PP_ITERATION_FINISH_5 >= 92\n#        define BOOST_PP_ITERATION_5 92\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 93 && BOOST_PP_ITERATION_FINISH_5 >= 93\n#        define BOOST_PP_ITERATION_5 93\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 94 && BOOST_PP_ITERATION_FINISH_5 >= 94\n#        define BOOST_PP_ITERATION_5 94\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 95 && BOOST_PP_ITERATION_FINISH_5 >= 95\n#        define BOOST_PP_ITERATION_5 95\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 96 && BOOST_PP_ITERATION_FINISH_5 >= 96\n#        define BOOST_PP_ITERATION_5 96\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 97 && BOOST_PP_ITERATION_FINISH_5 >= 97\n#        define BOOST_PP_ITERATION_5 97\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 98 && BOOST_PP_ITERATION_FINISH_5 >= 98\n#        define BOOST_PP_ITERATION_5 98\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 99 && BOOST_PP_ITERATION_FINISH_5 >= 99\n#        define BOOST_PP_ITERATION_5 99\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 100 && BOOST_PP_ITERATION_FINISH_5 >= 100\n#        define BOOST_PP_ITERATION_5 100\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 101 && BOOST_PP_ITERATION_FINISH_5 >= 101\n#        define BOOST_PP_ITERATION_5 101\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 102 && BOOST_PP_ITERATION_FINISH_5 >= 102\n#        define BOOST_PP_ITERATION_5 102\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 103 && BOOST_PP_ITERATION_FINISH_5 >= 103\n#        define BOOST_PP_ITERATION_5 103\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 104 && BOOST_PP_ITERATION_FINISH_5 >= 104\n#        define BOOST_PP_ITERATION_5 104\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 105 && BOOST_PP_ITERATION_FINISH_5 >= 105\n#        define BOOST_PP_ITERATION_5 105\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 106 && BOOST_PP_ITERATION_FINISH_5 >= 106\n#        define BOOST_PP_ITERATION_5 106\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 107 && BOOST_PP_ITERATION_FINISH_5 >= 107\n#        define BOOST_PP_ITERATION_5 107\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 108 && BOOST_PP_ITERATION_FINISH_5 >= 108\n#        define BOOST_PP_ITERATION_5 108\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 109 && BOOST_PP_ITERATION_FINISH_5 >= 109\n#        define BOOST_PP_ITERATION_5 109\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 110 && BOOST_PP_ITERATION_FINISH_5 >= 110\n#        define BOOST_PP_ITERATION_5 110\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 111 && BOOST_PP_ITERATION_FINISH_5 >= 111\n#        define BOOST_PP_ITERATION_5 111\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 112 && BOOST_PP_ITERATION_FINISH_5 >= 112\n#        define BOOST_PP_ITERATION_5 112\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 113 && BOOST_PP_ITERATION_FINISH_5 >= 113\n#        define BOOST_PP_ITERATION_5 113\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 114 && BOOST_PP_ITERATION_FINISH_5 >= 114\n#        define BOOST_PP_ITERATION_5 114\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 115 && BOOST_PP_ITERATION_FINISH_5 >= 115\n#        define BOOST_PP_ITERATION_5 115\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 116 && BOOST_PP_ITERATION_FINISH_5 >= 116\n#        define BOOST_PP_ITERATION_5 116\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 117 && BOOST_PP_ITERATION_FINISH_5 >= 117\n#        define BOOST_PP_ITERATION_5 117\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 118 && BOOST_PP_ITERATION_FINISH_5 >= 118\n#        define BOOST_PP_ITERATION_5 118\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 119 && BOOST_PP_ITERATION_FINISH_5 >= 119\n#        define BOOST_PP_ITERATION_5 119\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 120 && BOOST_PP_ITERATION_FINISH_5 >= 120\n#        define BOOST_PP_ITERATION_5 120\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 121 && BOOST_PP_ITERATION_FINISH_5 >= 121\n#        define BOOST_PP_ITERATION_5 121\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 122 && BOOST_PP_ITERATION_FINISH_5 >= 122\n#        define BOOST_PP_ITERATION_5 122\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 123 && BOOST_PP_ITERATION_FINISH_5 >= 123\n#        define BOOST_PP_ITERATION_5 123\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 124 && BOOST_PP_ITERATION_FINISH_5 >= 124\n#        define BOOST_PP_ITERATION_5 124\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 125 && BOOST_PP_ITERATION_FINISH_5 >= 125\n#        define BOOST_PP_ITERATION_5 125\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 126 && BOOST_PP_ITERATION_FINISH_5 >= 126\n#        define BOOST_PP_ITERATION_5 126\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 127 && BOOST_PP_ITERATION_FINISH_5 >= 127\n#        define BOOST_PP_ITERATION_5 127\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 128 && BOOST_PP_ITERATION_FINISH_5 >= 128\n#        define BOOST_PP_ITERATION_5 128\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 129 && BOOST_PP_ITERATION_FINISH_5 >= 129\n#        define BOOST_PP_ITERATION_5 129\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 130 && BOOST_PP_ITERATION_FINISH_5 >= 130\n#        define BOOST_PP_ITERATION_5 130\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 131 && BOOST_PP_ITERATION_FINISH_5 >= 131\n#        define BOOST_PP_ITERATION_5 131\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 132 && BOOST_PP_ITERATION_FINISH_5 >= 132\n#        define BOOST_PP_ITERATION_5 132\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 133 && BOOST_PP_ITERATION_FINISH_5 >= 133\n#        define BOOST_PP_ITERATION_5 133\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 134 && BOOST_PP_ITERATION_FINISH_5 >= 134\n#        define BOOST_PP_ITERATION_5 134\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 135 && BOOST_PP_ITERATION_FINISH_5 >= 135\n#        define BOOST_PP_ITERATION_5 135\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 136 && BOOST_PP_ITERATION_FINISH_5 >= 136\n#        define BOOST_PP_ITERATION_5 136\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 137 && BOOST_PP_ITERATION_FINISH_5 >= 137\n#        define BOOST_PP_ITERATION_5 137\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 138 && BOOST_PP_ITERATION_FINISH_5 >= 138\n#        define BOOST_PP_ITERATION_5 138\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 139 && BOOST_PP_ITERATION_FINISH_5 >= 139\n#        define BOOST_PP_ITERATION_5 139\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 140 && BOOST_PP_ITERATION_FINISH_5 >= 140\n#        define BOOST_PP_ITERATION_5 140\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 141 && BOOST_PP_ITERATION_FINISH_5 >= 141\n#        define BOOST_PP_ITERATION_5 141\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 142 && BOOST_PP_ITERATION_FINISH_5 >= 142\n#        define BOOST_PP_ITERATION_5 142\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 143 && BOOST_PP_ITERATION_FINISH_5 >= 143\n#        define BOOST_PP_ITERATION_5 143\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 144 && BOOST_PP_ITERATION_FINISH_5 >= 144\n#        define BOOST_PP_ITERATION_5 144\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 145 && BOOST_PP_ITERATION_FINISH_5 >= 145\n#        define BOOST_PP_ITERATION_5 145\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 146 && BOOST_PP_ITERATION_FINISH_5 >= 146\n#        define BOOST_PP_ITERATION_5 146\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 147 && BOOST_PP_ITERATION_FINISH_5 >= 147\n#        define BOOST_PP_ITERATION_5 147\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 148 && BOOST_PP_ITERATION_FINISH_5 >= 148\n#        define BOOST_PP_ITERATION_5 148\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 149 && BOOST_PP_ITERATION_FINISH_5 >= 149\n#        define BOOST_PP_ITERATION_5 149\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 150 && BOOST_PP_ITERATION_FINISH_5 >= 150\n#        define BOOST_PP_ITERATION_5 150\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 151 && BOOST_PP_ITERATION_FINISH_5 >= 151\n#        define BOOST_PP_ITERATION_5 151\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 152 && BOOST_PP_ITERATION_FINISH_5 >= 152\n#        define BOOST_PP_ITERATION_5 152\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 153 && BOOST_PP_ITERATION_FINISH_5 >= 153\n#        define BOOST_PP_ITERATION_5 153\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 154 && BOOST_PP_ITERATION_FINISH_5 >= 154\n#        define BOOST_PP_ITERATION_5 154\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 155 && BOOST_PP_ITERATION_FINISH_5 >= 155\n#        define BOOST_PP_ITERATION_5 155\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 156 && BOOST_PP_ITERATION_FINISH_5 >= 156\n#        define BOOST_PP_ITERATION_5 156\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 157 && BOOST_PP_ITERATION_FINISH_5 >= 157\n#        define BOOST_PP_ITERATION_5 157\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 158 && BOOST_PP_ITERATION_FINISH_5 >= 158\n#        define BOOST_PP_ITERATION_5 158\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 159 && BOOST_PP_ITERATION_FINISH_5 >= 159\n#        define BOOST_PP_ITERATION_5 159\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 160 && BOOST_PP_ITERATION_FINISH_5 >= 160\n#        define BOOST_PP_ITERATION_5 160\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 161 && BOOST_PP_ITERATION_FINISH_5 >= 161\n#        define BOOST_PP_ITERATION_5 161\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 162 && BOOST_PP_ITERATION_FINISH_5 >= 162\n#        define BOOST_PP_ITERATION_5 162\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 163 && BOOST_PP_ITERATION_FINISH_5 >= 163\n#        define BOOST_PP_ITERATION_5 163\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 164 && BOOST_PP_ITERATION_FINISH_5 >= 164\n#        define BOOST_PP_ITERATION_5 164\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 165 && BOOST_PP_ITERATION_FINISH_5 >= 165\n#        define BOOST_PP_ITERATION_5 165\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 166 && BOOST_PP_ITERATION_FINISH_5 >= 166\n#        define BOOST_PP_ITERATION_5 166\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 167 && BOOST_PP_ITERATION_FINISH_5 >= 167\n#        define BOOST_PP_ITERATION_5 167\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 168 && BOOST_PP_ITERATION_FINISH_5 >= 168\n#        define BOOST_PP_ITERATION_5 168\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 169 && BOOST_PP_ITERATION_FINISH_5 >= 169\n#        define BOOST_PP_ITERATION_5 169\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 170 && BOOST_PP_ITERATION_FINISH_5 >= 170\n#        define BOOST_PP_ITERATION_5 170\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 171 && BOOST_PP_ITERATION_FINISH_5 >= 171\n#        define BOOST_PP_ITERATION_5 171\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 172 && BOOST_PP_ITERATION_FINISH_5 >= 172\n#        define BOOST_PP_ITERATION_5 172\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 173 && BOOST_PP_ITERATION_FINISH_5 >= 173\n#        define BOOST_PP_ITERATION_5 173\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 174 && BOOST_PP_ITERATION_FINISH_5 >= 174\n#        define BOOST_PP_ITERATION_5 174\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 175 && BOOST_PP_ITERATION_FINISH_5 >= 175\n#        define BOOST_PP_ITERATION_5 175\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 176 && BOOST_PP_ITERATION_FINISH_5 >= 176\n#        define BOOST_PP_ITERATION_5 176\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 177 && BOOST_PP_ITERATION_FINISH_5 >= 177\n#        define BOOST_PP_ITERATION_5 177\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 178 && BOOST_PP_ITERATION_FINISH_5 >= 178\n#        define BOOST_PP_ITERATION_5 178\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 179 && BOOST_PP_ITERATION_FINISH_5 >= 179\n#        define BOOST_PP_ITERATION_5 179\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 180 && BOOST_PP_ITERATION_FINISH_5 >= 180\n#        define BOOST_PP_ITERATION_5 180\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 181 && BOOST_PP_ITERATION_FINISH_5 >= 181\n#        define BOOST_PP_ITERATION_5 181\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 182 && BOOST_PP_ITERATION_FINISH_5 >= 182\n#        define BOOST_PP_ITERATION_5 182\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 183 && BOOST_PP_ITERATION_FINISH_5 >= 183\n#        define BOOST_PP_ITERATION_5 183\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 184 && BOOST_PP_ITERATION_FINISH_5 >= 184\n#        define BOOST_PP_ITERATION_5 184\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 185 && BOOST_PP_ITERATION_FINISH_5 >= 185\n#        define BOOST_PP_ITERATION_5 185\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 186 && BOOST_PP_ITERATION_FINISH_5 >= 186\n#        define BOOST_PP_ITERATION_5 186\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 187 && BOOST_PP_ITERATION_FINISH_5 >= 187\n#        define BOOST_PP_ITERATION_5 187\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 188 && BOOST_PP_ITERATION_FINISH_5 >= 188\n#        define BOOST_PP_ITERATION_5 188\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 189 && BOOST_PP_ITERATION_FINISH_5 >= 189\n#        define BOOST_PP_ITERATION_5 189\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 190 && BOOST_PP_ITERATION_FINISH_5 >= 190\n#        define BOOST_PP_ITERATION_5 190\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 191 && BOOST_PP_ITERATION_FINISH_5 >= 191\n#        define BOOST_PP_ITERATION_5 191\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 192 && BOOST_PP_ITERATION_FINISH_5 >= 192\n#        define BOOST_PP_ITERATION_5 192\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 193 && BOOST_PP_ITERATION_FINISH_5 >= 193\n#        define BOOST_PP_ITERATION_5 193\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 194 && BOOST_PP_ITERATION_FINISH_5 >= 194\n#        define BOOST_PP_ITERATION_5 194\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 195 && BOOST_PP_ITERATION_FINISH_5 >= 195\n#        define BOOST_PP_ITERATION_5 195\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 196 && BOOST_PP_ITERATION_FINISH_5 >= 196\n#        define BOOST_PP_ITERATION_5 196\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 197 && BOOST_PP_ITERATION_FINISH_5 >= 197\n#        define BOOST_PP_ITERATION_5 197\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 198 && BOOST_PP_ITERATION_FINISH_5 >= 198\n#        define BOOST_PP_ITERATION_5 198\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 199 && BOOST_PP_ITERATION_FINISH_5 >= 199\n#        define BOOST_PP_ITERATION_5 199\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 200 && BOOST_PP_ITERATION_FINISH_5 >= 200\n#        define BOOST_PP_ITERATION_5 200\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 201 && BOOST_PP_ITERATION_FINISH_5 >= 201\n#        define BOOST_PP_ITERATION_5 201\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 202 && BOOST_PP_ITERATION_FINISH_5 >= 202\n#        define BOOST_PP_ITERATION_5 202\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 203 && BOOST_PP_ITERATION_FINISH_5 >= 203\n#        define BOOST_PP_ITERATION_5 203\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 204 && BOOST_PP_ITERATION_FINISH_5 >= 204\n#        define BOOST_PP_ITERATION_5 204\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 205 && BOOST_PP_ITERATION_FINISH_5 >= 205\n#        define BOOST_PP_ITERATION_5 205\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 206 && BOOST_PP_ITERATION_FINISH_5 >= 206\n#        define BOOST_PP_ITERATION_5 206\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 207 && BOOST_PP_ITERATION_FINISH_5 >= 207\n#        define BOOST_PP_ITERATION_5 207\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 208 && BOOST_PP_ITERATION_FINISH_5 >= 208\n#        define BOOST_PP_ITERATION_5 208\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 209 && BOOST_PP_ITERATION_FINISH_5 >= 209\n#        define BOOST_PP_ITERATION_5 209\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 210 && BOOST_PP_ITERATION_FINISH_5 >= 210\n#        define BOOST_PP_ITERATION_5 210\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 211 && BOOST_PP_ITERATION_FINISH_5 >= 211\n#        define BOOST_PP_ITERATION_5 211\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 212 && BOOST_PP_ITERATION_FINISH_5 >= 212\n#        define BOOST_PP_ITERATION_5 212\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 213 && BOOST_PP_ITERATION_FINISH_5 >= 213\n#        define BOOST_PP_ITERATION_5 213\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 214 && BOOST_PP_ITERATION_FINISH_5 >= 214\n#        define BOOST_PP_ITERATION_5 214\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 215 && BOOST_PP_ITERATION_FINISH_5 >= 215\n#        define BOOST_PP_ITERATION_5 215\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 216 && BOOST_PP_ITERATION_FINISH_5 >= 216\n#        define BOOST_PP_ITERATION_5 216\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 217 && BOOST_PP_ITERATION_FINISH_5 >= 217\n#        define BOOST_PP_ITERATION_5 217\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 218 && BOOST_PP_ITERATION_FINISH_5 >= 218\n#        define BOOST_PP_ITERATION_5 218\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 219 && BOOST_PP_ITERATION_FINISH_5 >= 219\n#        define BOOST_PP_ITERATION_5 219\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 220 && BOOST_PP_ITERATION_FINISH_5 >= 220\n#        define BOOST_PP_ITERATION_5 220\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 221 && BOOST_PP_ITERATION_FINISH_5 >= 221\n#        define BOOST_PP_ITERATION_5 221\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 222 && BOOST_PP_ITERATION_FINISH_5 >= 222\n#        define BOOST_PP_ITERATION_5 222\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 223 && BOOST_PP_ITERATION_FINISH_5 >= 223\n#        define BOOST_PP_ITERATION_5 223\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 224 && BOOST_PP_ITERATION_FINISH_5 >= 224\n#        define BOOST_PP_ITERATION_5 224\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 225 && BOOST_PP_ITERATION_FINISH_5 >= 225\n#        define BOOST_PP_ITERATION_5 225\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 226 && BOOST_PP_ITERATION_FINISH_5 >= 226\n#        define BOOST_PP_ITERATION_5 226\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 227 && BOOST_PP_ITERATION_FINISH_5 >= 227\n#        define BOOST_PP_ITERATION_5 227\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 228 && BOOST_PP_ITERATION_FINISH_5 >= 228\n#        define BOOST_PP_ITERATION_5 228\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 229 && BOOST_PP_ITERATION_FINISH_5 >= 229\n#        define BOOST_PP_ITERATION_5 229\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 230 && BOOST_PP_ITERATION_FINISH_5 >= 230\n#        define BOOST_PP_ITERATION_5 230\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 231 && BOOST_PP_ITERATION_FINISH_5 >= 231\n#        define BOOST_PP_ITERATION_5 231\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 232 && BOOST_PP_ITERATION_FINISH_5 >= 232\n#        define BOOST_PP_ITERATION_5 232\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 233 && BOOST_PP_ITERATION_FINISH_5 >= 233\n#        define BOOST_PP_ITERATION_5 233\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 234 && BOOST_PP_ITERATION_FINISH_5 >= 234\n#        define BOOST_PP_ITERATION_5 234\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 235 && BOOST_PP_ITERATION_FINISH_5 >= 235\n#        define BOOST_PP_ITERATION_5 235\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 236 && BOOST_PP_ITERATION_FINISH_5 >= 236\n#        define BOOST_PP_ITERATION_5 236\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 237 && BOOST_PP_ITERATION_FINISH_5 >= 237\n#        define BOOST_PP_ITERATION_5 237\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 238 && BOOST_PP_ITERATION_FINISH_5 >= 238\n#        define BOOST_PP_ITERATION_5 238\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 239 && BOOST_PP_ITERATION_FINISH_5 >= 239\n#        define BOOST_PP_ITERATION_5 239\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 240 && BOOST_PP_ITERATION_FINISH_5 >= 240\n#        define BOOST_PP_ITERATION_5 240\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 241 && BOOST_PP_ITERATION_FINISH_5 >= 241\n#        define BOOST_PP_ITERATION_5 241\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 242 && BOOST_PP_ITERATION_FINISH_5 >= 242\n#        define BOOST_PP_ITERATION_5 242\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 243 && BOOST_PP_ITERATION_FINISH_5 >= 243\n#        define BOOST_PP_ITERATION_5 243\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 244 && BOOST_PP_ITERATION_FINISH_5 >= 244\n#        define BOOST_PP_ITERATION_5 244\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 245 && BOOST_PP_ITERATION_FINISH_5 >= 245\n#        define BOOST_PP_ITERATION_5 245\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 246 && BOOST_PP_ITERATION_FINISH_5 >= 246\n#        define BOOST_PP_ITERATION_5 246\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 247 && BOOST_PP_ITERATION_FINISH_5 >= 247\n#        define BOOST_PP_ITERATION_5 247\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 248 && BOOST_PP_ITERATION_FINISH_5 >= 248\n#        define BOOST_PP_ITERATION_5 248\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 249 && BOOST_PP_ITERATION_FINISH_5 >= 249\n#        define BOOST_PP_ITERATION_5 249\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 250 && BOOST_PP_ITERATION_FINISH_5 >= 250\n#        define BOOST_PP_ITERATION_5 250\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 251 && BOOST_PP_ITERATION_FINISH_5 >= 251\n#        define BOOST_PP_ITERATION_5 251\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 252 && BOOST_PP_ITERATION_FINISH_5 >= 252\n#        define BOOST_PP_ITERATION_5 252\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 253 && BOOST_PP_ITERATION_FINISH_5 >= 253\n#        define BOOST_PP_ITERATION_5 253\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 254 && BOOST_PP_ITERATION_FINISH_5 >= 254\n#        define BOOST_PP_ITERATION_5 254\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 255 && BOOST_PP_ITERATION_FINISH_5 >= 255\n#        define BOOST_PP_ITERATION_5 255\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 256 && BOOST_PP_ITERATION_FINISH_5 >= 256\n#        define BOOST_PP_ITERATION_5 256\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n# endif\n#\n# undef BOOST_PP_ITERATION_DEPTH\n# define BOOST_PP_ITERATION_DEPTH() 4\n#\n# undef BOOST_PP_ITERATION_START_5\n# undef BOOST_PP_ITERATION_FINISH_5\n# undef BOOST_PP_FILENAME_5\n#\n# undef BOOST_PP_ITERATION_FLAGS_5\n# undef BOOST_PP_ITERATION_PARAMS_5\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/iteration/detail/iter/reverse1.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# if BOOST_PP_ITERATION_FINISH_1 <= 256 && BOOST_PP_ITERATION_START_1 >= 256\n#    define BOOST_PP_ITERATION_1 256\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 255 && BOOST_PP_ITERATION_START_1 >= 255\n#    define BOOST_PP_ITERATION_1 255\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 254 && BOOST_PP_ITERATION_START_1 >= 254\n#    define BOOST_PP_ITERATION_1 254\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 253 && BOOST_PP_ITERATION_START_1 >= 253\n#    define BOOST_PP_ITERATION_1 253\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 252 && BOOST_PP_ITERATION_START_1 >= 252\n#    define BOOST_PP_ITERATION_1 252\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 251 && BOOST_PP_ITERATION_START_1 >= 251\n#    define BOOST_PP_ITERATION_1 251\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 250 && BOOST_PP_ITERATION_START_1 >= 250\n#    define BOOST_PP_ITERATION_1 250\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 249 && BOOST_PP_ITERATION_START_1 >= 249\n#    define BOOST_PP_ITERATION_1 249\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 248 && BOOST_PP_ITERATION_START_1 >= 248\n#    define BOOST_PP_ITERATION_1 248\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 247 && BOOST_PP_ITERATION_START_1 >= 247\n#    define BOOST_PP_ITERATION_1 247\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 246 && BOOST_PP_ITERATION_START_1 >= 246\n#    define BOOST_PP_ITERATION_1 246\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 245 && BOOST_PP_ITERATION_START_1 >= 245\n#    define BOOST_PP_ITERATION_1 245\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 244 && BOOST_PP_ITERATION_START_1 >= 244\n#    define BOOST_PP_ITERATION_1 244\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 243 && BOOST_PP_ITERATION_START_1 >= 243\n#    define BOOST_PP_ITERATION_1 243\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 242 && BOOST_PP_ITERATION_START_1 >= 242\n#    define BOOST_PP_ITERATION_1 242\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 241 && BOOST_PP_ITERATION_START_1 >= 241\n#    define BOOST_PP_ITERATION_1 241\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 240 && BOOST_PP_ITERATION_START_1 >= 240\n#    define BOOST_PP_ITERATION_1 240\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 239 && BOOST_PP_ITERATION_START_1 >= 239\n#    define BOOST_PP_ITERATION_1 239\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 238 && BOOST_PP_ITERATION_START_1 >= 238\n#    define BOOST_PP_ITERATION_1 238\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 237 && BOOST_PP_ITERATION_START_1 >= 237\n#    define BOOST_PP_ITERATION_1 237\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 236 && BOOST_PP_ITERATION_START_1 >= 236\n#    define BOOST_PP_ITERATION_1 236\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 235 && BOOST_PP_ITERATION_START_1 >= 235\n#    define BOOST_PP_ITERATION_1 235\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 234 && BOOST_PP_ITERATION_START_1 >= 234\n#    define BOOST_PP_ITERATION_1 234\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 233 && BOOST_PP_ITERATION_START_1 >= 233\n#    define BOOST_PP_ITERATION_1 233\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 232 && BOOST_PP_ITERATION_START_1 >= 232\n#    define BOOST_PP_ITERATION_1 232\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 231 && BOOST_PP_ITERATION_START_1 >= 231\n#    define BOOST_PP_ITERATION_1 231\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 230 && BOOST_PP_ITERATION_START_1 >= 230\n#    define BOOST_PP_ITERATION_1 230\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 229 && BOOST_PP_ITERATION_START_1 >= 229\n#    define BOOST_PP_ITERATION_1 229\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 228 && BOOST_PP_ITERATION_START_1 >= 228\n#    define BOOST_PP_ITERATION_1 228\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 227 && BOOST_PP_ITERATION_START_1 >= 227\n#    define BOOST_PP_ITERATION_1 227\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 226 && BOOST_PP_ITERATION_START_1 >= 226\n#    define BOOST_PP_ITERATION_1 226\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 225 && BOOST_PP_ITERATION_START_1 >= 225\n#    define BOOST_PP_ITERATION_1 225\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 224 && BOOST_PP_ITERATION_START_1 >= 224\n#    define BOOST_PP_ITERATION_1 224\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 223 && BOOST_PP_ITERATION_START_1 >= 223\n#    define BOOST_PP_ITERATION_1 223\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 222 && BOOST_PP_ITERATION_START_1 >= 222\n#    define BOOST_PP_ITERATION_1 222\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 221 && BOOST_PP_ITERATION_START_1 >= 221\n#    define BOOST_PP_ITERATION_1 221\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 220 && BOOST_PP_ITERATION_START_1 >= 220\n#    define BOOST_PP_ITERATION_1 220\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 219 && BOOST_PP_ITERATION_START_1 >= 219\n#    define BOOST_PP_ITERATION_1 219\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 218 && BOOST_PP_ITERATION_START_1 >= 218\n#    define BOOST_PP_ITERATION_1 218\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 217 && BOOST_PP_ITERATION_START_1 >= 217\n#    define BOOST_PP_ITERATION_1 217\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 216 && BOOST_PP_ITERATION_START_1 >= 216\n#    define BOOST_PP_ITERATION_1 216\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 215 && BOOST_PP_ITERATION_START_1 >= 215\n#    define BOOST_PP_ITERATION_1 215\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 214 && BOOST_PP_ITERATION_START_1 >= 214\n#    define BOOST_PP_ITERATION_1 214\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 213 && BOOST_PP_ITERATION_START_1 >= 213\n#    define BOOST_PP_ITERATION_1 213\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 212 && BOOST_PP_ITERATION_START_1 >= 212\n#    define BOOST_PP_ITERATION_1 212\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 211 && BOOST_PP_ITERATION_START_1 >= 211\n#    define BOOST_PP_ITERATION_1 211\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 210 && BOOST_PP_ITERATION_START_1 >= 210\n#    define BOOST_PP_ITERATION_1 210\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 209 && BOOST_PP_ITERATION_START_1 >= 209\n#    define BOOST_PP_ITERATION_1 209\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 208 && BOOST_PP_ITERATION_START_1 >= 208\n#    define BOOST_PP_ITERATION_1 208\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 207 && BOOST_PP_ITERATION_START_1 >= 207\n#    define BOOST_PP_ITERATION_1 207\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 206 && BOOST_PP_ITERATION_START_1 >= 206\n#    define BOOST_PP_ITERATION_1 206\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 205 && BOOST_PP_ITERATION_START_1 >= 205\n#    define BOOST_PP_ITERATION_1 205\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 204 && BOOST_PP_ITERATION_START_1 >= 204\n#    define BOOST_PP_ITERATION_1 204\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 203 && BOOST_PP_ITERATION_START_1 >= 203\n#    define BOOST_PP_ITERATION_1 203\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 202 && BOOST_PP_ITERATION_START_1 >= 202\n#    define BOOST_PP_ITERATION_1 202\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 201 && BOOST_PP_ITERATION_START_1 >= 201\n#    define BOOST_PP_ITERATION_1 201\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 200 && BOOST_PP_ITERATION_START_1 >= 200\n#    define BOOST_PP_ITERATION_1 200\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 199 && BOOST_PP_ITERATION_START_1 >= 199\n#    define BOOST_PP_ITERATION_1 199\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 198 && BOOST_PP_ITERATION_START_1 >= 198\n#    define BOOST_PP_ITERATION_1 198\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 197 && BOOST_PP_ITERATION_START_1 >= 197\n#    define BOOST_PP_ITERATION_1 197\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 196 && BOOST_PP_ITERATION_START_1 >= 196\n#    define BOOST_PP_ITERATION_1 196\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 195 && BOOST_PP_ITERATION_START_1 >= 195\n#    define BOOST_PP_ITERATION_1 195\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 194 && BOOST_PP_ITERATION_START_1 >= 194\n#    define BOOST_PP_ITERATION_1 194\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 193 && BOOST_PP_ITERATION_START_1 >= 193\n#    define BOOST_PP_ITERATION_1 193\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 192 && BOOST_PP_ITERATION_START_1 >= 192\n#    define BOOST_PP_ITERATION_1 192\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 191 && BOOST_PP_ITERATION_START_1 >= 191\n#    define BOOST_PP_ITERATION_1 191\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 190 && BOOST_PP_ITERATION_START_1 >= 190\n#    define BOOST_PP_ITERATION_1 190\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 189 && BOOST_PP_ITERATION_START_1 >= 189\n#    define BOOST_PP_ITERATION_1 189\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 188 && BOOST_PP_ITERATION_START_1 >= 188\n#    define BOOST_PP_ITERATION_1 188\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 187 && BOOST_PP_ITERATION_START_1 >= 187\n#    define BOOST_PP_ITERATION_1 187\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 186 && BOOST_PP_ITERATION_START_1 >= 186\n#    define BOOST_PP_ITERATION_1 186\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 185 && BOOST_PP_ITERATION_START_1 >= 185\n#    define BOOST_PP_ITERATION_1 185\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 184 && BOOST_PP_ITERATION_START_1 >= 184\n#    define BOOST_PP_ITERATION_1 184\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 183 && BOOST_PP_ITERATION_START_1 >= 183\n#    define BOOST_PP_ITERATION_1 183\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 182 && BOOST_PP_ITERATION_START_1 >= 182\n#    define BOOST_PP_ITERATION_1 182\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 181 && BOOST_PP_ITERATION_START_1 >= 181\n#    define BOOST_PP_ITERATION_1 181\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 180 && BOOST_PP_ITERATION_START_1 >= 180\n#    define BOOST_PP_ITERATION_1 180\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 179 && BOOST_PP_ITERATION_START_1 >= 179\n#    define BOOST_PP_ITERATION_1 179\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 178 && BOOST_PP_ITERATION_START_1 >= 178\n#    define BOOST_PP_ITERATION_1 178\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 177 && BOOST_PP_ITERATION_START_1 >= 177\n#    define BOOST_PP_ITERATION_1 177\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 176 && BOOST_PP_ITERATION_START_1 >= 176\n#    define BOOST_PP_ITERATION_1 176\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 175 && BOOST_PP_ITERATION_START_1 >= 175\n#    define BOOST_PP_ITERATION_1 175\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 174 && BOOST_PP_ITERATION_START_1 >= 174\n#    define BOOST_PP_ITERATION_1 174\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 173 && BOOST_PP_ITERATION_START_1 >= 173\n#    define BOOST_PP_ITERATION_1 173\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 172 && BOOST_PP_ITERATION_START_1 >= 172\n#    define BOOST_PP_ITERATION_1 172\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 171 && BOOST_PP_ITERATION_START_1 >= 171\n#    define BOOST_PP_ITERATION_1 171\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 170 && BOOST_PP_ITERATION_START_1 >= 170\n#    define BOOST_PP_ITERATION_1 170\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 169 && BOOST_PP_ITERATION_START_1 >= 169\n#    define BOOST_PP_ITERATION_1 169\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 168 && BOOST_PP_ITERATION_START_1 >= 168\n#    define BOOST_PP_ITERATION_1 168\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 167 && BOOST_PP_ITERATION_START_1 >= 167\n#    define BOOST_PP_ITERATION_1 167\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 166 && BOOST_PP_ITERATION_START_1 >= 166\n#    define BOOST_PP_ITERATION_1 166\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 165 && BOOST_PP_ITERATION_START_1 >= 165\n#    define BOOST_PP_ITERATION_1 165\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 164 && BOOST_PP_ITERATION_START_1 >= 164\n#    define BOOST_PP_ITERATION_1 164\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 163 && BOOST_PP_ITERATION_START_1 >= 163\n#    define BOOST_PP_ITERATION_1 163\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 162 && BOOST_PP_ITERATION_START_1 >= 162\n#    define BOOST_PP_ITERATION_1 162\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 161 && BOOST_PP_ITERATION_START_1 >= 161\n#    define BOOST_PP_ITERATION_1 161\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 160 && BOOST_PP_ITERATION_START_1 >= 160\n#    define BOOST_PP_ITERATION_1 160\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 159 && BOOST_PP_ITERATION_START_1 >= 159\n#    define BOOST_PP_ITERATION_1 159\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 158 && BOOST_PP_ITERATION_START_1 >= 158\n#    define BOOST_PP_ITERATION_1 158\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 157 && BOOST_PP_ITERATION_START_1 >= 157\n#    define BOOST_PP_ITERATION_1 157\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 156 && BOOST_PP_ITERATION_START_1 >= 156\n#    define BOOST_PP_ITERATION_1 156\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 155 && BOOST_PP_ITERATION_START_1 >= 155\n#    define BOOST_PP_ITERATION_1 155\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 154 && BOOST_PP_ITERATION_START_1 >= 154\n#    define BOOST_PP_ITERATION_1 154\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 153 && BOOST_PP_ITERATION_START_1 >= 153\n#    define BOOST_PP_ITERATION_1 153\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 152 && BOOST_PP_ITERATION_START_1 >= 152\n#    define BOOST_PP_ITERATION_1 152\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 151 && BOOST_PP_ITERATION_START_1 >= 151\n#    define BOOST_PP_ITERATION_1 151\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 150 && BOOST_PP_ITERATION_START_1 >= 150\n#    define BOOST_PP_ITERATION_1 150\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 149 && BOOST_PP_ITERATION_START_1 >= 149\n#    define BOOST_PP_ITERATION_1 149\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 148 && BOOST_PP_ITERATION_START_1 >= 148\n#    define BOOST_PP_ITERATION_1 148\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 147 && BOOST_PP_ITERATION_START_1 >= 147\n#    define BOOST_PP_ITERATION_1 147\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 146 && BOOST_PP_ITERATION_START_1 >= 146\n#    define BOOST_PP_ITERATION_1 146\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 145 && BOOST_PP_ITERATION_START_1 >= 145\n#    define BOOST_PP_ITERATION_1 145\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 144 && BOOST_PP_ITERATION_START_1 >= 144\n#    define BOOST_PP_ITERATION_1 144\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 143 && BOOST_PP_ITERATION_START_1 >= 143\n#    define BOOST_PP_ITERATION_1 143\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 142 && BOOST_PP_ITERATION_START_1 >= 142\n#    define BOOST_PP_ITERATION_1 142\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 141 && BOOST_PP_ITERATION_START_1 >= 141\n#    define BOOST_PP_ITERATION_1 141\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 140 && BOOST_PP_ITERATION_START_1 >= 140\n#    define BOOST_PP_ITERATION_1 140\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 139 && BOOST_PP_ITERATION_START_1 >= 139\n#    define BOOST_PP_ITERATION_1 139\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 138 && BOOST_PP_ITERATION_START_1 >= 138\n#    define BOOST_PP_ITERATION_1 138\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 137 && BOOST_PP_ITERATION_START_1 >= 137\n#    define BOOST_PP_ITERATION_1 137\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 136 && BOOST_PP_ITERATION_START_1 >= 136\n#    define BOOST_PP_ITERATION_1 136\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 135 && BOOST_PP_ITERATION_START_1 >= 135\n#    define BOOST_PP_ITERATION_1 135\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 134 && BOOST_PP_ITERATION_START_1 >= 134\n#    define BOOST_PP_ITERATION_1 134\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 133 && BOOST_PP_ITERATION_START_1 >= 133\n#    define BOOST_PP_ITERATION_1 133\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 132 && BOOST_PP_ITERATION_START_1 >= 132\n#    define BOOST_PP_ITERATION_1 132\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 131 && BOOST_PP_ITERATION_START_1 >= 131\n#    define BOOST_PP_ITERATION_1 131\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 130 && BOOST_PP_ITERATION_START_1 >= 130\n#    define BOOST_PP_ITERATION_1 130\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 129 && BOOST_PP_ITERATION_START_1 >= 129\n#    define BOOST_PP_ITERATION_1 129\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 128 && BOOST_PP_ITERATION_START_1 >= 128\n#    define BOOST_PP_ITERATION_1 128\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 127 && BOOST_PP_ITERATION_START_1 >= 127\n#    define BOOST_PP_ITERATION_1 127\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 126 && BOOST_PP_ITERATION_START_1 >= 126\n#    define BOOST_PP_ITERATION_1 126\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 125 && BOOST_PP_ITERATION_START_1 >= 125\n#    define BOOST_PP_ITERATION_1 125\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 124 && BOOST_PP_ITERATION_START_1 >= 124\n#    define BOOST_PP_ITERATION_1 124\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 123 && BOOST_PP_ITERATION_START_1 >= 123\n#    define BOOST_PP_ITERATION_1 123\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 122 && BOOST_PP_ITERATION_START_1 >= 122\n#    define BOOST_PP_ITERATION_1 122\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 121 && BOOST_PP_ITERATION_START_1 >= 121\n#    define BOOST_PP_ITERATION_1 121\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 120 && BOOST_PP_ITERATION_START_1 >= 120\n#    define BOOST_PP_ITERATION_1 120\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 119 && BOOST_PP_ITERATION_START_1 >= 119\n#    define BOOST_PP_ITERATION_1 119\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 118 && BOOST_PP_ITERATION_START_1 >= 118\n#    define BOOST_PP_ITERATION_1 118\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 117 && BOOST_PP_ITERATION_START_1 >= 117\n#    define BOOST_PP_ITERATION_1 117\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 116 && BOOST_PP_ITERATION_START_1 >= 116\n#    define BOOST_PP_ITERATION_1 116\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 115 && BOOST_PP_ITERATION_START_1 >= 115\n#    define BOOST_PP_ITERATION_1 115\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 114 && BOOST_PP_ITERATION_START_1 >= 114\n#    define BOOST_PP_ITERATION_1 114\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 113 && BOOST_PP_ITERATION_START_1 >= 113\n#    define BOOST_PP_ITERATION_1 113\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 112 && BOOST_PP_ITERATION_START_1 >= 112\n#    define BOOST_PP_ITERATION_1 112\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 111 && BOOST_PP_ITERATION_START_1 >= 111\n#    define BOOST_PP_ITERATION_1 111\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 110 && BOOST_PP_ITERATION_START_1 >= 110\n#    define BOOST_PP_ITERATION_1 110\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 109 && BOOST_PP_ITERATION_START_1 >= 109\n#    define BOOST_PP_ITERATION_1 109\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 108 && BOOST_PP_ITERATION_START_1 >= 108\n#    define BOOST_PP_ITERATION_1 108\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 107 && BOOST_PP_ITERATION_START_1 >= 107\n#    define BOOST_PP_ITERATION_1 107\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 106 && BOOST_PP_ITERATION_START_1 >= 106\n#    define BOOST_PP_ITERATION_1 106\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 105 && BOOST_PP_ITERATION_START_1 >= 105\n#    define BOOST_PP_ITERATION_1 105\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 104 && BOOST_PP_ITERATION_START_1 >= 104\n#    define BOOST_PP_ITERATION_1 104\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 103 && BOOST_PP_ITERATION_START_1 >= 103\n#    define BOOST_PP_ITERATION_1 103\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 102 && BOOST_PP_ITERATION_START_1 >= 102\n#    define BOOST_PP_ITERATION_1 102\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 101 && BOOST_PP_ITERATION_START_1 >= 101\n#    define BOOST_PP_ITERATION_1 101\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 100 && BOOST_PP_ITERATION_START_1 >= 100\n#    define BOOST_PP_ITERATION_1 100\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 99 && BOOST_PP_ITERATION_START_1 >= 99\n#    define BOOST_PP_ITERATION_1 99\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 98 && BOOST_PP_ITERATION_START_1 >= 98\n#    define BOOST_PP_ITERATION_1 98\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 97 && BOOST_PP_ITERATION_START_1 >= 97\n#    define BOOST_PP_ITERATION_1 97\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 96 && BOOST_PP_ITERATION_START_1 >= 96\n#    define BOOST_PP_ITERATION_1 96\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 95 && BOOST_PP_ITERATION_START_1 >= 95\n#    define BOOST_PP_ITERATION_1 95\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 94 && BOOST_PP_ITERATION_START_1 >= 94\n#    define BOOST_PP_ITERATION_1 94\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 93 && BOOST_PP_ITERATION_START_1 >= 93\n#    define BOOST_PP_ITERATION_1 93\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 92 && BOOST_PP_ITERATION_START_1 >= 92\n#    define BOOST_PP_ITERATION_1 92\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 91 && BOOST_PP_ITERATION_START_1 >= 91\n#    define BOOST_PP_ITERATION_1 91\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 90 && BOOST_PP_ITERATION_START_1 >= 90\n#    define BOOST_PP_ITERATION_1 90\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 89 && BOOST_PP_ITERATION_START_1 >= 89\n#    define BOOST_PP_ITERATION_1 89\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 88 && BOOST_PP_ITERATION_START_1 >= 88\n#    define BOOST_PP_ITERATION_1 88\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 87 && BOOST_PP_ITERATION_START_1 >= 87\n#    define BOOST_PP_ITERATION_1 87\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 86 && BOOST_PP_ITERATION_START_1 >= 86\n#    define BOOST_PP_ITERATION_1 86\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 85 && BOOST_PP_ITERATION_START_1 >= 85\n#    define BOOST_PP_ITERATION_1 85\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 84 && BOOST_PP_ITERATION_START_1 >= 84\n#    define BOOST_PP_ITERATION_1 84\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 83 && BOOST_PP_ITERATION_START_1 >= 83\n#    define BOOST_PP_ITERATION_1 83\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 82 && BOOST_PP_ITERATION_START_1 >= 82\n#    define BOOST_PP_ITERATION_1 82\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 81 && BOOST_PP_ITERATION_START_1 >= 81\n#    define BOOST_PP_ITERATION_1 81\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 80 && BOOST_PP_ITERATION_START_1 >= 80\n#    define BOOST_PP_ITERATION_1 80\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 79 && BOOST_PP_ITERATION_START_1 >= 79\n#    define BOOST_PP_ITERATION_1 79\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 78 && BOOST_PP_ITERATION_START_1 >= 78\n#    define BOOST_PP_ITERATION_1 78\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 77 && BOOST_PP_ITERATION_START_1 >= 77\n#    define BOOST_PP_ITERATION_1 77\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 76 && BOOST_PP_ITERATION_START_1 >= 76\n#    define BOOST_PP_ITERATION_1 76\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 75 && BOOST_PP_ITERATION_START_1 >= 75\n#    define BOOST_PP_ITERATION_1 75\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 74 && BOOST_PP_ITERATION_START_1 >= 74\n#    define BOOST_PP_ITERATION_1 74\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 73 && BOOST_PP_ITERATION_START_1 >= 73\n#    define BOOST_PP_ITERATION_1 73\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 72 && BOOST_PP_ITERATION_START_1 >= 72\n#    define BOOST_PP_ITERATION_1 72\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 71 && BOOST_PP_ITERATION_START_1 >= 71\n#    define BOOST_PP_ITERATION_1 71\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 70 && BOOST_PP_ITERATION_START_1 >= 70\n#    define BOOST_PP_ITERATION_1 70\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 69 && BOOST_PP_ITERATION_START_1 >= 69\n#    define BOOST_PP_ITERATION_1 69\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 68 && BOOST_PP_ITERATION_START_1 >= 68\n#    define BOOST_PP_ITERATION_1 68\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 67 && BOOST_PP_ITERATION_START_1 >= 67\n#    define BOOST_PP_ITERATION_1 67\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 66 && BOOST_PP_ITERATION_START_1 >= 66\n#    define BOOST_PP_ITERATION_1 66\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 65 && BOOST_PP_ITERATION_START_1 >= 65\n#    define BOOST_PP_ITERATION_1 65\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 64 && BOOST_PP_ITERATION_START_1 >= 64\n#    define BOOST_PP_ITERATION_1 64\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 63 && BOOST_PP_ITERATION_START_1 >= 63\n#    define BOOST_PP_ITERATION_1 63\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 62 && BOOST_PP_ITERATION_START_1 >= 62\n#    define BOOST_PP_ITERATION_1 62\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 61 && BOOST_PP_ITERATION_START_1 >= 61\n#    define BOOST_PP_ITERATION_1 61\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 60 && BOOST_PP_ITERATION_START_1 >= 60\n#    define BOOST_PP_ITERATION_1 60\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 59 && BOOST_PP_ITERATION_START_1 >= 59\n#    define BOOST_PP_ITERATION_1 59\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 58 && BOOST_PP_ITERATION_START_1 >= 58\n#    define BOOST_PP_ITERATION_1 58\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 57 && BOOST_PP_ITERATION_START_1 >= 57\n#    define BOOST_PP_ITERATION_1 57\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 56 && BOOST_PP_ITERATION_START_1 >= 56\n#    define BOOST_PP_ITERATION_1 56\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 55 && BOOST_PP_ITERATION_START_1 >= 55\n#    define BOOST_PP_ITERATION_1 55\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 54 && BOOST_PP_ITERATION_START_1 >= 54\n#    define BOOST_PP_ITERATION_1 54\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 53 && BOOST_PP_ITERATION_START_1 >= 53\n#    define BOOST_PP_ITERATION_1 53\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 52 && BOOST_PP_ITERATION_START_1 >= 52\n#    define BOOST_PP_ITERATION_1 52\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 51 && BOOST_PP_ITERATION_START_1 >= 51\n#    define BOOST_PP_ITERATION_1 51\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 50 && BOOST_PP_ITERATION_START_1 >= 50\n#    define BOOST_PP_ITERATION_1 50\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 49 && BOOST_PP_ITERATION_START_1 >= 49\n#    define BOOST_PP_ITERATION_1 49\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 48 && BOOST_PP_ITERATION_START_1 >= 48\n#    define BOOST_PP_ITERATION_1 48\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 47 && BOOST_PP_ITERATION_START_1 >= 47\n#    define BOOST_PP_ITERATION_1 47\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 46 && BOOST_PP_ITERATION_START_1 >= 46\n#    define BOOST_PP_ITERATION_1 46\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 45 && BOOST_PP_ITERATION_START_1 >= 45\n#    define BOOST_PP_ITERATION_1 45\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 44 && BOOST_PP_ITERATION_START_1 >= 44\n#    define BOOST_PP_ITERATION_1 44\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 43 && BOOST_PP_ITERATION_START_1 >= 43\n#    define BOOST_PP_ITERATION_1 43\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 42 && BOOST_PP_ITERATION_START_1 >= 42\n#    define BOOST_PP_ITERATION_1 42\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 41 && BOOST_PP_ITERATION_START_1 >= 41\n#    define BOOST_PP_ITERATION_1 41\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 40 && BOOST_PP_ITERATION_START_1 >= 40\n#    define BOOST_PP_ITERATION_1 40\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 39 && BOOST_PP_ITERATION_START_1 >= 39\n#    define BOOST_PP_ITERATION_1 39\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 38 && BOOST_PP_ITERATION_START_1 >= 38\n#    define BOOST_PP_ITERATION_1 38\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 37 && BOOST_PP_ITERATION_START_1 >= 37\n#    define BOOST_PP_ITERATION_1 37\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 36 && BOOST_PP_ITERATION_START_1 >= 36\n#    define BOOST_PP_ITERATION_1 36\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 35 && BOOST_PP_ITERATION_START_1 >= 35\n#    define BOOST_PP_ITERATION_1 35\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 34 && BOOST_PP_ITERATION_START_1 >= 34\n#    define BOOST_PP_ITERATION_1 34\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 33 && BOOST_PP_ITERATION_START_1 >= 33\n#    define BOOST_PP_ITERATION_1 33\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 32 && BOOST_PP_ITERATION_START_1 >= 32\n#    define BOOST_PP_ITERATION_1 32\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 31 && BOOST_PP_ITERATION_START_1 >= 31\n#    define BOOST_PP_ITERATION_1 31\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 30 && BOOST_PP_ITERATION_START_1 >= 30\n#    define BOOST_PP_ITERATION_1 30\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 29 && BOOST_PP_ITERATION_START_1 >= 29\n#    define BOOST_PP_ITERATION_1 29\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 28 && BOOST_PP_ITERATION_START_1 >= 28\n#    define BOOST_PP_ITERATION_1 28\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 27 && BOOST_PP_ITERATION_START_1 >= 27\n#    define BOOST_PP_ITERATION_1 27\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 26 && BOOST_PP_ITERATION_START_1 >= 26\n#    define BOOST_PP_ITERATION_1 26\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 25 && BOOST_PP_ITERATION_START_1 >= 25\n#    define BOOST_PP_ITERATION_1 25\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 24 && BOOST_PP_ITERATION_START_1 >= 24\n#    define BOOST_PP_ITERATION_1 24\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 23 && BOOST_PP_ITERATION_START_1 >= 23\n#    define BOOST_PP_ITERATION_1 23\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 22 && BOOST_PP_ITERATION_START_1 >= 22\n#    define BOOST_PP_ITERATION_1 22\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 21 && BOOST_PP_ITERATION_START_1 >= 21\n#    define BOOST_PP_ITERATION_1 21\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 20 && BOOST_PP_ITERATION_START_1 >= 20\n#    define BOOST_PP_ITERATION_1 20\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 19 && BOOST_PP_ITERATION_START_1 >= 19\n#    define BOOST_PP_ITERATION_1 19\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 18 && BOOST_PP_ITERATION_START_1 >= 18\n#    define BOOST_PP_ITERATION_1 18\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 17 && BOOST_PP_ITERATION_START_1 >= 17\n#    define BOOST_PP_ITERATION_1 17\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 16 && BOOST_PP_ITERATION_START_1 >= 16\n#    define BOOST_PP_ITERATION_1 16\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 15 && BOOST_PP_ITERATION_START_1 >= 15\n#    define BOOST_PP_ITERATION_1 15\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 14 && BOOST_PP_ITERATION_START_1 >= 14\n#    define BOOST_PP_ITERATION_1 14\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 13 && BOOST_PP_ITERATION_START_1 >= 13\n#    define BOOST_PP_ITERATION_1 13\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 12 && BOOST_PP_ITERATION_START_1 >= 12\n#    define BOOST_PP_ITERATION_1 12\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 11 && BOOST_PP_ITERATION_START_1 >= 11\n#    define BOOST_PP_ITERATION_1 11\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 10 && BOOST_PP_ITERATION_START_1 >= 10\n#    define BOOST_PP_ITERATION_1 10\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 9 && BOOST_PP_ITERATION_START_1 >= 9\n#    define BOOST_PP_ITERATION_1 9\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 8 && BOOST_PP_ITERATION_START_1 >= 8\n#    define BOOST_PP_ITERATION_1 8\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 7 && BOOST_PP_ITERATION_START_1 >= 7\n#    define BOOST_PP_ITERATION_1 7\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 6 && BOOST_PP_ITERATION_START_1 >= 6\n#    define BOOST_PP_ITERATION_1 6\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 5 && BOOST_PP_ITERATION_START_1 >= 5\n#    define BOOST_PP_ITERATION_1 5\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 4 && BOOST_PP_ITERATION_START_1 >= 4\n#    define BOOST_PP_ITERATION_1 4\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 3 && BOOST_PP_ITERATION_START_1 >= 3\n#    define BOOST_PP_ITERATION_1 3\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 2 && BOOST_PP_ITERATION_START_1 >= 2\n#    define BOOST_PP_ITERATION_1 2\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 1 && BOOST_PP_ITERATION_START_1 >= 1\n#    define BOOST_PP_ITERATION_1 1\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 0 && BOOST_PP_ITERATION_START_1 >= 0\n#    define BOOST_PP_ITERATION_1 0\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/iteration/detail/iter/reverse2.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# if BOOST_PP_ITERATION_FINISH_2 <= 256 && BOOST_PP_ITERATION_START_2 >= 256\n#    define BOOST_PP_ITERATION_2 256\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 255 && BOOST_PP_ITERATION_START_2 >= 255\n#    define BOOST_PP_ITERATION_2 255\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 254 && BOOST_PP_ITERATION_START_2 >= 254\n#    define BOOST_PP_ITERATION_2 254\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 253 && BOOST_PP_ITERATION_START_2 >= 253\n#    define BOOST_PP_ITERATION_2 253\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 252 && BOOST_PP_ITERATION_START_2 >= 252\n#    define BOOST_PP_ITERATION_2 252\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 251 && BOOST_PP_ITERATION_START_2 >= 251\n#    define BOOST_PP_ITERATION_2 251\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 250 && BOOST_PP_ITERATION_START_2 >= 250\n#    define BOOST_PP_ITERATION_2 250\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 249 && BOOST_PP_ITERATION_START_2 >= 249\n#    define BOOST_PP_ITERATION_2 249\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 248 && BOOST_PP_ITERATION_START_2 >= 248\n#    define BOOST_PP_ITERATION_2 248\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 247 && BOOST_PP_ITERATION_START_2 >= 247\n#    define BOOST_PP_ITERATION_2 247\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 246 && BOOST_PP_ITERATION_START_2 >= 246\n#    define BOOST_PP_ITERATION_2 246\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 245 && BOOST_PP_ITERATION_START_2 >= 245\n#    define BOOST_PP_ITERATION_2 245\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 244 && BOOST_PP_ITERATION_START_2 >= 244\n#    define BOOST_PP_ITERATION_2 244\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 243 && BOOST_PP_ITERATION_START_2 >= 243\n#    define BOOST_PP_ITERATION_2 243\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 242 && BOOST_PP_ITERATION_START_2 >= 242\n#    define BOOST_PP_ITERATION_2 242\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 241 && BOOST_PP_ITERATION_START_2 >= 241\n#    define BOOST_PP_ITERATION_2 241\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 240 && BOOST_PP_ITERATION_START_2 >= 240\n#    define BOOST_PP_ITERATION_2 240\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 239 && BOOST_PP_ITERATION_START_2 >= 239\n#    define BOOST_PP_ITERATION_2 239\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 238 && BOOST_PP_ITERATION_START_2 >= 238\n#    define BOOST_PP_ITERATION_2 238\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 237 && BOOST_PP_ITERATION_START_2 >= 237\n#    define BOOST_PP_ITERATION_2 237\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 236 && BOOST_PP_ITERATION_START_2 >= 236\n#    define BOOST_PP_ITERATION_2 236\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 235 && BOOST_PP_ITERATION_START_2 >= 235\n#    define BOOST_PP_ITERATION_2 235\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 234 && BOOST_PP_ITERATION_START_2 >= 234\n#    define BOOST_PP_ITERATION_2 234\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 233 && BOOST_PP_ITERATION_START_2 >= 233\n#    define BOOST_PP_ITERATION_2 233\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 232 && BOOST_PP_ITERATION_START_2 >= 232\n#    define BOOST_PP_ITERATION_2 232\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 231 && BOOST_PP_ITERATION_START_2 >= 231\n#    define BOOST_PP_ITERATION_2 231\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 230 && BOOST_PP_ITERATION_START_2 >= 230\n#    define BOOST_PP_ITERATION_2 230\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 229 && BOOST_PP_ITERATION_START_2 >= 229\n#    define BOOST_PP_ITERATION_2 229\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 228 && BOOST_PP_ITERATION_START_2 >= 228\n#    define BOOST_PP_ITERATION_2 228\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 227 && BOOST_PP_ITERATION_START_2 >= 227\n#    define BOOST_PP_ITERATION_2 227\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 226 && BOOST_PP_ITERATION_START_2 >= 226\n#    define BOOST_PP_ITERATION_2 226\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 225 && BOOST_PP_ITERATION_START_2 >= 225\n#    define BOOST_PP_ITERATION_2 225\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 224 && BOOST_PP_ITERATION_START_2 >= 224\n#    define BOOST_PP_ITERATION_2 224\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 223 && BOOST_PP_ITERATION_START_2 >= 223\n#    define BOOST_PP_ITERATION_2 223\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 222 && BOOST_PP_ITERATION_START_2 >= 222\n#    define BOOST_PP_ITERATION_2 222\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 221 && BOOST_PP_ITERATION_START_2 >= 221\n#    define BOOST_PP_ITERATION_2 221\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 220 && BOOST_PP_ITERATION_START_2 >= 220\n#    define BOOST_PP_ITERATION_2 220\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 219 && BOOST_PP_ITERATION_START_2 >= 219\n#    define BOOST_PP_ITERATION_2 219\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 218 && BOOST_PP_ITERATION_START_2 >= 218\n#    define BOOST_PP_ITERATION_2 218\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 217 && BOOST_PP_ITERATION_START_2 >= 217\n#    define BOOST_PP_ITERATION_2 217\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 216 && BOOST_PP_ITERATION_START_2 >= 216\n#    define BOOST_PP_ITERATION_2 216\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 215 && BOOST_PP_ITERATION_START_2 >= 215\n#    define BOOST_PP_ITERATION_2 215\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 214 && BOOST_PP_ITERATION_START_2 >= 214\n#    define BOOST_PP_ITERATION_2 214\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 213 && BOOST_PP_ITERATION_START_2 >= 213\n#    define BOOST_PP_ITERATION_2 213\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 212 && BOOST_PP_ITERATION_START_2 >= 212\n#    define BOOST_PP_ITERATION_2 212\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 211 && BOOST_PP_ITERATION_START_2 >= 211\n#    define BOOST_PP_ITERATION_2 211\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 210 && BOOST_PP_ITERATION_START_2 >= 210\n#    define BOOST_PP_ITERATION_2 210\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 209 && BOOST_PP_ITERATION_START_2 >= 209\n#    define BOOST_PP_ITERATION_2 209\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 208 && BOOST_PP_ITERATION_START_2 >= 208\n#    define BOOST_PP_ITERATION_2 208\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 207 && BOOST_PP_ITERATION_START_2 >= 207\n#    define BOOST_PP_ITERATION_2 207\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 206 && BOOST_PP_ITERATION_START_2 >= 206\n#    define BOOST_PP_ITERATION_2 206\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 205 && BOOST_PP_ITERATION_START_2 >= 205\n#    define BOOST_PP_ITERATION_2 205\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 204 && BOOST_PP_ITERATION_START_2 >= 204\n#    define BOOST_PP_ITERATION_2 204\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 203 && BOOST_PP_ITERATION_START_2 >= 203\n#    define BOOST_PP_ITERATION_2 203\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 202 && BOOST_PP_ITERATION_START_2 >= 202\n#    define BOOST_PP_ITERATION_2 202\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 201 && BOOST_PP_ITERATION_START_2 >= 201\n#    define BOOST_PP_ITERATION_2 201\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 200 && BOOST_PP_ITERATION_START_2 >= 200\n#    define BOOST_PP_ITERATION_2 200\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 199 && BOOST_PP_ITERATION_START_2 >= 199\n#    define BOOST_PP_ITERATION_2 199\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 198 && BOOST_PP_ITERATION_START_2 >= 198\n#    define BOOST_PP_ITERATION_2 198\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 197 && BOOST_PP_ITERATION_START_2 >= 197\n#    define BOOST_PP_ITERATION_2 197\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 196 && BOOST_PP_ITERATION_START_2 >= 196\n#    define BOOST_PP_ITERATION_2 196\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 195 && BOOST_PP_ITERATION_START_2 >= 195\n#    define BOOST_PP_ITERATION_2 195\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 194 && BOOST_PP_ITERATION_START_2 >= 194\n#    define BOOST_PP_ITERATION_2 194\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 193 && BOOST_PP_ITERATION_START_2 >= 193\n#    define BOOST_PP_ITERATION_2 193\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 192 && BOOST_PP_ITERATION_START_2 >= 192\n#    define BOOST_PP_ITERATION_2 192\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 191 && BOOST_PP_ITERATION_START_2 >= 191\n#    define BOOST_PP_ITERATION_2 191\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 190 && BOOST_PP_ITERATION_START_2 >= 190\n#    define BOOST_PP_ITERATION_2 190\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 189 && BOOST_PP_ITERATION_START_2 >= 189\n#    define BOOST_PP_ITERATION_2 189\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 188 && BOOST_PP_ITERATION_START_2 >= 188\n#    define BOOST_PP_ITERATION_2 188\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 187 && BOOST_PP_ITERATION_START_2 >= 187\n#    define BOOST_PP_ITERATION_2 187\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 186 && BOOST_PP_ITERATION_START_2 >= 186\n#    define BOOST_PP_ITERATION_2 186\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 185 && BOOST_PP_ITERATION_START_2 >= 185\n#    define BOOST_PP_ITERATION_2 185\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 184 && BOOST_PP_ITERATION_START_2 >= 184\n#    define BOOST_PP_ITERATION_2 184\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 183 && BOOST_PP_ITERATION_START_2 >= 183\n#    define BOOST_PP_ITERATION_2 183\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 182 && BOOST_PP_ITERATION_START_2 >= 182\n#    define BOOST_PP_ITERATION_2 182\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 181 && BOOST_PP_ITERATION_START_2 >= 181\n#    define BOOST_PP_ITERATION_2 181\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 180 && BOOST_PP_ITERATION_START_2 >= 180\n#    define BOOST_PP_ITERATION_2 180\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 179 && BOOST_PP_ITERATION_START_2 >= 179\n#    define BOOST_PP_ITERATION_2 179\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 178 && BOOST_PP_ITERATION_START_2 >= 178\n#    define BOOST_PP_ITERATION_2 178\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 177 && BOOST_PP_ITERATION_START_2 >= 177\n#    define BOOST_PP_ITERATION_2 177\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 176 && BOOST_PP_ITERATION_START_2 >= 176\n#    define BOOST_PP_ITERATION_2 176\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 175 && BOOST_PP_ITERATION_START_2 >= 175\n#    define BOOST_PP_ITERATION_2 175\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 174 && BOOST_PP_ITERATION_START_2 >= 174\n#    define BOOST_PP_ITERATION_2 174\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 173 && BOOST_PP_ITERATION_START_2 >= 173\n#    define BOOST_PP_ITERATION_2 173\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 172 && BOOST_PP_ITERATION_START_2 >= 172\n#    define BOOST_PP_ITERATION_2 172\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 171 && BOOST_PP_ITERATION_START_2 >= 171\n#    define BOOST_PP_ITERATION_2 171\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 170 && BOOST_PP_ITERATION_START_2 >= 170\n#    define BOOST_PP_ITERATION_2 170\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 169 && BOOST_PP_ITERATION_START_2 >= 169\n#    define BOOST_PP_ITERATION_2 169\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 168 && BOOST_PP_ITERATION_START_2 >= 168\n#    define BOOST_PP_ITERATION_2 168\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 167 && BOOST_PP_ITERATION_START_2 >= 167\n#    define BOOST_PP_ITERATION_2 167\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 166 && BOOST_PP_ITERATION_START_2 >= 166\n#    define BOOST_PP_ITERATION_2 166\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 165 && BOOST_PP_ITERATION_START_2 >= 165\n#    define BOOST_PP_ITERATION_2 165\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 164 && BOOST_PP_ITERATION_START_2 >= 164\n#    define BOOST_PP_ITERATION_2 164\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 163 && BOOST_PP_ITERATION_START_2 >= 163\n#    define BOOST_PP_ITERATION_2 163\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 162 && BOOST_PP_ITERATION_START_2 >= 162\n#    define BOOST_PP_ITERATION_2 162\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 161 && BOOST_PP_ITERATION_START_2 >= 161\n#    define BOOST_PP_ITERATION_2 161\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 160 && BOOST_PP_ITERATION_START_2 >= 160\n#    define BOOST_PP_ITERATION_2 160\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 159 && BOOST_PP_ITERATION_START_2 >= 159\n#    define BOOST_PP_ITERATION_2 159\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 158 && BOOST_PP_ITERATION_START_2 >= 158\n#    define BOOST_PP_ITERATION_2 158\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 157 && BOOST_PP_ITERATION_START_2 >= 157\n#    define BOOST_PP_ITERATION_2 157\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 156 && BOOST_PP_ITERATION_START_2 >= 156\n#    define BOOST_PP_ITERATION_2 156\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 155 && BOOST_PP_ITERATION_START_2 >= 155\n#    define BOOST_PP_ITERATION_2 155\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 154 && BOOST_PP_ITERATION_START_2 >= 154\n#    define BOOST_PP_ITERATION_2 154\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 153 && BOOST_PP_ITERATION_START_2 >= 153\n#    define BOOST_PP_ITERATION_2 153\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 152 && BOOST_PP_ITERATION_START_2 >= 152\n#    define BOOST_PP_ITERATION_2 152\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 151 && BOOST_PP_ITERATION_START_2 >= 151\n#    define BOOST_PP_ITERATION_2 151\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 150 && BOOST_PP_ITERATION_START_2 >= 150\n#    define BOOST_PP_ITERATION_2 150\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 149 && BOOST_PP_ITERATION_START_2 >= 149\n#    define BOOST_PP_ITERATION_2 149\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 148 && BOOST_PP_ITERATION_START_2 >= 148\n#    define BOOST_PP_ITERATION_2 148\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 147 && BOOST_PP_ITERATION_START_2 >= 147\n#    define BOOST_PP_ITERATION_2 147\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 146 && BOOST_PP_ITERATION_START_2 >= 146\n#    define BOOST_PP_ITERATION_2 146\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 145 && BOOST_PP_ITERATION_START_2 >= 145\n#    define BOOST_PP_ITERATION_2 145\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 144 && BOOST_PP_ITERATION_START_2 >= 144\n#    define BOOST_PP_ITERATION_2 144\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 143 && BOOST_PP_ITERATION_START_2 >= 143\n#    define BOOST_PP_ITERATION_2 143\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 142 && BOOST_PP_ITERATION_START_2 >= 142\n#    define BOOST_PP_ITERATION_2 142\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 141 && BOOST_PP_ITERATION_START_2 >= 141\n#    define BOOST_PP_ITERATION_2 141\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 140 && BOOST_PP_ITERATION_START_2 >= 140\n#    define BOOST_PP_ITERATION_2 140\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 139 && BOOST_PP_ITERATION_START_2 >= 139\n#    define BOOST_PP_ITERATION_2 139\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 138 && BOOST_PP_ITERATION_START_2 >= 138\n#    define BOOST_PP_ITERATION_2 138\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 137 && BOOST_PP_ITERATION_START_2 >= 137\n#    define BOOST_PP_ITERATION_2 137\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 136 && BOOST_PP_ITERATION_START_2 >= 136\n#    define BOOST_PP_ITERATION_2 136\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 135 && BOOST_PP_ITERATION_START_2 >= 135\n#    define BOOST_PP_ITERATION_2 135\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 134 && BOOST_PP_ITERATION_START_2 >= 134\n#    define BOOST_PP_ITERATION_2 134\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 133 && BOOST_PP_ITERATION_START_2 >= 133\n#    define BOOST_PP_ITERATION_2 133\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 132 && BOOST_PP_ITERATION_START_2 >= 132\n#    define BOOST_PP_ITERATION_2 132\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 131 && BOOST_PP_ITERATION_START_2 >= 131\n#    define BOOST_PP_ITERATION_2 131\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 130 && BOOST_PP_ITERATION_START_2 >= 130\n#    define BOOST_PP_ITERATION_2 130\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 129 && BOOST_PP_ITERATION_START_2 >= 129\n#    define BOOST_PP_ITERATION_2 129\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 128 && BOOST_PP_ITERATION_START_2 >= 128\n#    define BOOST_PP_ITERATION_2 128\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 127 && BOOST_PP_ITERATION_START_2 >= 127\n#    define BOOST_PP_ITERATION_2 127\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 126 && BOOST_PP_ITERATION_START_2 >= 126\n#    define BOOST_PP_ITERATION_2 126\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 125 && BOOST_PP_ITERATION_START_2 >= 125\n#    define BOOST_PP_ITERATION_2 125\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 124 && BOOST_PP_ITERATION_START_2 >= 124\n#    define BOOST_PP_ITERATION_2 124\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 123 && BOOST_PP_ITERATION_START_2 >= 123\n#    define BOOST_PP_ITERATION_2 123\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 122 && BOOST_PP_ITERATION_START_2 >= 122\n#    define BOOST_PP_ITERATION_2 122\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 121 && BOOST_PP_ITERATION_START_2 >= 121\n#    define BOOST_PP_ITERATION_2 121\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 120 && BOOST_PP_ITERATION_START_2 >= 120\n#    define BOOST_PP_ITERATION_2 120\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 119 && BOOST_PP_ITERATION_START_2 >= 119\n#    define BOOST_PP_ITERATION_2 119\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 118 && BOOST_PP_ITERATION_START_2 >= 118\n#    define BOOST_PP_ITERATION_2 118\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 117 && BOOST_PP_ITERATION_START_2 >= 117\n#    define BOOST_PP_ITERATION_2 117\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 116 && BOOST_PP_ITERATION_START_2 >= 116\n#    define BOOST_PP_ITERATION_2 116\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 115 && BOOST_PP_ITERATION_START_2 >= 115\n#    define BOOST_PP_ITERATION_2 115\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 114 && BOOST_PP_ITERATION_START_2 >= 114\n#    define BOOST_PP_ITERATION_2 114\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 113 && BOOST_PP_ITERATION_START_2 >= 113\n#    define BOOST_PP_ITERATION_2 113\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 112 && BOOST_PP_ITERATION_START_2 >= 112\n#    define BOOST_PP_ITERATION_2 112\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 111 && BOOST_PP_ITERATION_START_2 >= 111\n#    define BOOST_PP_ITERATION_2 111\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 110 && BOOST_PP_ITERATION_START_2 >= 110\n#    define BOOST_PP_ITERATION_2 110\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 109 && BOOST_PP_ITERATION_START_2 >= 109\n#    define BOOST_PP_ITERATION_2 109\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 108 && BOOST_PP_ITERATION_START_2 >= 108\n#    define BOOST_PP_ITERATION_2 108\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 107 && BOOST_PP_ITERATION_START_2 >= 107\n#    define BOOST_PP_ITERATION_2 107\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 106 && BOOST_PP_ITERATION_START_2 >= 106\n#    define BOOST_PP_ITERATION_2 106\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 105 && BOOST_PP_ITERATION_START_2 >= 105\n#    define BOOST_PP_ITERATION_2 105\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 104 && BOOST_PP_ITERATION_START_2 >= 104\n#    define BOOST_PP_ITERATION_2 104\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 103 && BOOST_PP_ITERATION_START_2 >= 103\n#    define BOOST_PP_ITERATION_2 103\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 102 && BOOST_PP_ITERATION_START_2 >= 102\n#    define BOOST_PP_ITERATION_2 102\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 101 && BOOST_PP_ITERATION_START_2 >= 101\n#    define BOOST_PP_ITERATION_2 101\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 100 && BOOST_PP_ITERATION_START_2 >= 100\n#    define BOOST_PP_ITERATION_2 100\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 99 && BOOST_PP_ITERATION_START_2 >= 99\n#    define BOOST_PP_ITERATION_2 99\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 98 && BOOST_PP_ITERATION_START_2 >= 98\n#    define BOOST_PP_ITERATION_2 98\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 97 && BOOST_PP_ITERATION_START_2 >= 97\n#    define BOOST_PP_ITERATION_2 97\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 96 && BOOST_PP_ITERATION_START_2 >= 96\n#    define BOOST_PP_ITERATION_2 96\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 95 && BOOST_PP_ITERATION_START_2 >= 95\n#    define BOOST_PP_ITERATION_2 95\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 94 && BOOST_PP_ITERATION_START_2 >= 94\n#    define BOOST_PP_ITERATION_2 94\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 93 && BOOST_PP_ITERATION_START_2 >= 93\n#    define BOOST_PP_ITERATION_2 93\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 92 && BOOST_PP_ITERATION_START_2 >= 92\n#    define BOOST_PP_ITERATION_2 92\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 91 && BOOST_PP_ITERATION_START_2 >= 91\n#    define BOOST_PP_ITERATION_2 91\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 90 && BOOST_PP_ITERATION_START_2 >= 90\n#    define BOOST_PP_ITERATION_2 90\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 89 && BOOST_PP_ITERATION_START_2 >= 89\n#    define BOOST_PP_ITERATION_2 89\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 88 && BOOST_PP_ITERATION_START_2 >= 88\n#    define BOOST_PP_ITERATION_2 88\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 87 && BOOST_PP_ITERATION_START_2 >= 87\n#    define BOOST_PP_ITERATION_2 87\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 86 && BOOST_PP_ITERATION_START_2 >= 86\n#    define BOOST_PP_ITERATION_2 86\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 85 && BOOST_PP_ITERATION_START_2 >= 85\n#    define BOOST_PP_ITERATION_2 85\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 84 && BOOST_PP_ITERATION_START_2 >= 84\n#    define BOOST_PP_ITERATION_2 84\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 83 && BOOST_PP_ITERATION_START_2 >= 83\n#    define BOOST_PP_ITERATION_2 83\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 82 && BOOST_PP_ITERATION_START_2 >= 82\n#    define BOOST_PP_ITERATION_2 82\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 81 && BOOST_PP_ITERATION_START_2 >= 81\n#    define BOOST_PP_ITERATION_2 81\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 80 && BOOST_PP_ITERATION_START_2 >= 80\n#    define BOOST_PP_ITERATION_2 80\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 79 && BOOST_PP_ITERATION_START_2 >= 79\n#    define BOOST_PP_ITERATION_2 79\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 78 && BOOST_PP_ITERATION_START_2 >= 78\n#    define BOOST_PP_ITERATION_2 78\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 77 && BOOST_PP_ITERATION_START_2 >= 77\n#    define BOOST_PP_ITERATION_2 77\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 76 && BOOST_PP_ITERATION_START_2 >= 76\n#    define BOOST_PP_ITERATION_2 76\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 75 && BOOST_PP_ITERATION_START_2 >= 75\n#    define BOOST_PP_ITERATION_2 75\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 74 && BOOST_PP_ITERATION_START_2 >= 74\n#    define BOOST_PP_ITERATION_2 74\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 73 && BOOST_PP_ITERATION_START_2 >= 73\n#    define BOOST_PP_ITERATION_2 73\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 72 && BOOST_PP_ITERATION_START_2 >= 72\n#    define BOOST_PP_ITERATION_2 72\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 71 && BOOST_PP_ITERATION_START_2 >= 71\n#    define BOOST_PP_ITERATION_2 71\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 70 && BOOST_PP_ITERATION_START_2 >= 70\n#    define BOOST_PP_ITERATION_2 70\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 69 && BOOST_PP_ITERATION_START_2 >= 69\n#    define BOOST_PP_ITERATION_2 69\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 68 && BOOST_PP_ITERATION_START_2 >= 68\n#    define BOOST_PP_ITERATION_2 68\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 67 && BOOST_PP_ITERATION_START_2 >= 67\n#    define BOOST_PP_ITERATION_2 67\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 66 && BOOST_PP_ITERATION_START_2 >= 66\n#    define BOOST_PP_ITERATION_2 66\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 65 && BOOST_PP_ITERATION_START_2 >= 65\n#    define BOOST_PP_ITERATION_2 65\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 64 && BOOST_PP_ITERATION_START_2 >= 64\n#    define BOOST_PP_ITERATION_2 64\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 63 && BOOST_PP_ITERATION_START_2 >= 63\n#    define BOOST_PP_ITERATION_2 63\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 62 && BOOST_PP_ITERATION_START_2 >= 62\n#    define BOOST_PP_ITERATION_2 62\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 61 && BOOST_PP_ITERATION_START_2 >= 61\n#    define BOOST_PP_ITERATION_2 61\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 60 && BOOST_PP_ITERATION_START_2 >= 60\n#    define BOOST_PP_ITERATION_2 60\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 59 && BOOST_PP_ITERATION_START_2 >= 59\n#    define BOOST_PP_ITERATION_2 59\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 58 && BOOST_PP_ITERATION_START_2 >= 58\n#    define BOOST_PP_ITERATION_2 58\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 57 && BOOST_PP_ITERATION_START_2 >= 57\n#    define BOOST_PP_ITERATION_2 57\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 56 && BOOST_PP_ITERATION_START_2 >= 56\n#    define BOOST_PP_ITERATION_2 56\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 55 && BOOST_PP_ITERATION_START_2 >= 55\n#    define BOOST_PP_ITERATION_2 55\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 54 && BOOST_PP_ITERATION_START_2 >= 54\n#    define BOOST_PP_ITERATION_2 54\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 53 && BOOST_PP_ITERATION_START_2 >= 53\n#    define BOOST_PP_ITERATION_2 53\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 52 && BOOST_PP_ITERATION_START_2 >= 52\n#    define BOOST_PP_ITERATION_2 52\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 51 && BOOST_PP_ITERATION_START_2 >= 51\n#    define BOOST_PP_ITERATION_2 51\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 50 && BOOST_PP_ITERATION_START_2 >= 50\n#    define BOOST_PP_ITERATION_2 50\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 49 && BOOST_PP_ITERATION_START_2 >= 49\n#    define BOOST_PP_ITERATION_2 49\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 48 && BOOST_PP_ITERATION_START_2 >= 48\n#    define BOOST_PP_ITERATION_2 48\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 47 && BOOST_PP_ITERATION_START_2 >= 47\n#    define BOOST_PP_ITERATION_2 47\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 46 && BOOST_PP_ITERATION_START_2 >= 46\n#    define BOOST_PP_ITERATION_2 46\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 45 && BOOST_PP_ITERATION_START_2 >= 45\n#    define BOOST_PP_ITERATION_2 45\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 44 && BOOST_PP_ITERATION_START_2 >= 44\n#    define BOOST_PP_ITERATION_2 44\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 43 && BOOST_PP_ITERATION_START_2 >= 43\n#    define BOOST_PP_ITERATION_2 43\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 42 && BOOST_PP_ITERATION_START_2 >= 42\n#    define BOOST_PP_ITERATION_2 42\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 41 && BOOST_PP_ITERATION_START_2 >= 41\n#    define BOOST_PP_ITERATION_2 41\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 40 && BOOST_PP_ITERATION_START_2 >= 40\n#    define BOOST_PP_ITERATION_2 40\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 39 && BOOST_PP_ITERATION_START_2 >= 39\n#    define BOOST_PP_ITERATION_2 39\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 38 && BOOST_PP_ITERATION_START_2 >= 38\n#    define BOOST_PP_ITERATION_2 38\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 37 && BOOST_PP_ITERATION_START_2 >= 37\n#    define BOOST_PP_ITERATION_2 37\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 36 && BOOST_PP_ITERATION_START_2 >= 36\n#    define BOOST_PP_ITERATION_2 36\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 35 && BOOST_PP_ITERATION_START_2 >= 35\n#    define BOOST_PP_ITERATION_2 35\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 34 && BOOST_PP_ITERATION_START_2 >= 34\n#    define BOOST_PP_ITERATION_2 34\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 33 && BOOST_PP_ITERATION_START_2 >= 33\n#    define BOOST_PP_ITERATION_2 33\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 32 && BOOST_PP_ITERATION_START_2 >= 32\n#    define BOOST_PP_ITERATION_2 32\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 31 && BOOST_PP_ITERATION_START_2 >= 31\n#    define BOOST_PP_ITERATION_2 31\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 30 && BOOST_PP_ITERATION_START_2 >= 30\n#    define BOOST_PP_ITERATION_2 30\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 29 && BOOST_PP_ITERATION_START_2 >= 29\n#    define BOOST_PP_ITERATION_2 29\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 28 && BOOST_PP_ITERATION_START_2 >= 28\n#    define BOOST_PP_ITERATION_2 28\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 27 && BOOST_PP_ITERATION_START_2 >= 27\n#    define BOOST_PP_ITERATION_2 27\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 26 && BOOST_PP_ITERATION_START_2 >= 26\n#    define BOOST_PP_ITERATION_2 26\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 25 && BOOST_PP_ITERATION_START_2 >= 25\n#    define BOOST_PP_ITERATION_2 25\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 24 && BOOST_PP_ITERATION_START_2 >= 24\n#    define BOOST_PP_ITERATION_2 24\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 23 && BOOST_PP_ITERATION_START_2 >= 23\n#    define BOOST_PP_ITERATION_2 23\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 22 && BOOST_PP_ITERATION_START_2 >= 22\n#    define BOOST_PP_ITERATION_2 22\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 21 && BOOST_PP_ITERATION_START_2 >= 21\n#    define BOOST_PP_ITERATION_2 21\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 20 && BOOST_PP_ITERATION_START_2 >= 20\n#    define BOOST_PP_ITERATION_2 20\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 19 && BOOST_PP_ITERATION_START_2 >= 19\n#    define BOOST_PP_ITERATION_2 19\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 18 && BOOST_PP_ITERATION_START_2 >= 18\n#    define BOOST_PP_ITERATION_2 18\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 17 && BOOST_PP_ITERATION_START_2 >= 17\n#    define BOOST_PP_ITERATION_2 17\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 16 && BOOST_PP_ITERATION_START_2 >= 16\n#    define BOOST_PP_ITERATION_2 16\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 15 && BOOST_PP_ITERATION_START_2 >= 15\n#    define BOOST_PP_ITERATION_2 15\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 14 && BOOST_PP_ITERATION_START_2 >= 14\n#    define BOOST_PP_ITERATION_2 14\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 13 && BOOST_PP_ITERATION_START_2 >= 13\n#    define BOOST_PP_ITERATION_2 13\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 12 && BOOST_PP_ITERATION_START_2 >= 12\n#    define BOOST_PP_ITERATION_2 12\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 11 && BOOST_PP_ITERATION_START_2 >= 11\n#    define BOOST_PP_ITERATION_2 11\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 10 && BOOST_PP_ITERATION_START_2 >= 10\n#    define BOOST_PP_ITERATION_2 10\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 9 && BOOST_PP_ITERATION_START_2 >= 9\n#    define BOOST_PP_ITERATION_2 9\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 8 && BOOST_PP_ITERATION_START_2 >= 8\n#    define BOOST_PP_ITERATION_2 8\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 7 && BOOST_PP_ITERATION_START_2 >= 7\n#    define BOOST_PP_ITERATION_2 7\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 6 && BOOST_PP_ITERATION_START_2 >= 6\n#    define BOOST_PP_ITERATION_2 6\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 5 && BOOST_PP_ITERATION_START_2 >= 5\n#    define BOOST_PP_ITERATION_2 5\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 4 && BOOST_PP_ITERATION_START_2 >= 4\n#    define BOOST_PP_ITERATION_2 4\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 3 && BOOST_PP_ITERATION_START_2 >= 3\n#    define BOOST_PP_ITERATION_2 3\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 2 && BOOST_PP_ITERATION_START_2 >= 2\n#    define BOOST_PP_ITERATION_2 2\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 1 && BOOST_PP_ITERATION_START_2 >= 1\n#    define BOOST_PP_ITERATION_2 1\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 0 && BOOST_PP_ITERATION_START_2 >= 0\n#    define BOOST_PP_ITERATION_2 0\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/iteration/detail/iter/reverse3.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# if BOOST_PP_ITERATION_FINISH_3 <= 256 && BOOST_PP_ITERATION_START_3 >= 256\n#    define BOOST_PP_ITERATION_3 256\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 255 && BOOST_PP_ITERATION_START_3 >= 255\n#    define BOOST_PP_ITERATION_3 255\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 254 && BOOST_PP_ITERATION_START_3 >= 254\n#    define BOOST_PP_ITERATION_3 254\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 253 && BOOST_PP_ITERATION_START_3 >= 253\n#    define BOOST_PP_ITERATION_3 253\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 252 && BOOST_PP_ITERATION_START_3 >= 252\n#    define BOOST_PP_ITERATION_3 252\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 251 && BOOST_PP_ITERATION_START_3 >= 251\n#    define BOOST_PP_ITERATION_3 251\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 250 && BOOST_PP_ITERATION_START_3 >= 250\n#    define BOOST_PP_ITERATION_3 250\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 249 && BOOST_PP_ITERATION_START_3 >= 249\n#    define BOOST_PP_ITERATION_3 249\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 248 && BOOST_PP_ITERATION_START_3 >= 248\n#    define BOOST_PP_ITERATION_3 248\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 247 && BOOST_PP_ITERATION_START_3 >= 247\n#    define BOOST_PP_ITERATION_3 247\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 246 && BOOST_PP_ITERATION_START_3 >= 246\n#    define BOOST_PP_ITERATION_3 246\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 245 && BOOST_PP_ITERATION_START_3 >= 245\n#    define BOOST_PP_ITERATION_3 245\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 244 && BOOST_PP_ITERATION_START_3 >= 244\n#    define BOOST_PP_ITERATION_3 244\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 243 && BOOST_PP_ITERATION_START_3 >= 243\n#    define BOOST_PP_ITERATION_3 243\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 242 && BOOST_PP_ITERATION_START_3 >= 242\n#    define BOOST_PP_ITERATION_3 242\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 241 && BOOST_PP_ITERATION_START_3 >= 241\n#    define BOOST_PP_ITERATION_3 241\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 240 && BOOST_PP_ITERATION_START_3 >= 240\n#    define BOOST_PP_ITERATION_3 240\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 239 && BOOST_PP_ITERATION_START_3 >= 239\n#    define BOOST_PP_ITERATION_3 239\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 238 && BOOST_PP_ITERATION_START_3 >= 238\n#    define BOOST_PP_ITERATION_3 238\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 237 && BOOST_PP_ITERATION_START_3 >= 237\n#    define BOOST_PP_ITERATION_3 237\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 236 && BOOST_PP_ITERATION_START_3 >= 236\n#    define BOOST_PP_ITERATION_3 236\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 235 && BOOST_PP_ITERATION_START_3 >= 235\n#    define BOOST_PP_ITERATION_3 235\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 234 && BOOST_PP_ITERATION_START_3 >= 234\n#    define BOOST_PP_ITERATION_3 234\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 233 && BOOST_PP_ITERATION_START_3 >= 233\n#    define BOOST_PP_ITERATION_3 233\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 232 && BOOST_PP_ITERATION_START_3 >= 232\n#    define BOOST_PP_ITERATION_3 232\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 231 && BOOST_PP_ITERATION_START_3 >= 231\n#    define BOOST_PP_ITERATION_3 231\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 230 && BOOST_PP_ITERATION_START_3 >= 230\n#    define BOOST_PP_ITERATION_3 230\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 229 && BOOST_PP_ITERATION_START_3 >= 229\n#    define BOOST_PP_ITERATION_3 229\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 228 && BOOST_PP_ITERATION_START_3 >= 228\n#    define BOOST_PP_ITERATION_3 228\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 227 && BOOST_PP_ITERATION_START_3 >= 227\n#    define BOOST_PP_ITERATION_3 227\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 226 && BOOST_PP_ITERATION_START_3 >= 226\n#    define BOOST_PP_ITERATION_3 226\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 225 && BOOST_PP_ITERATION_START_3 >= 225\n#    define BOOST_PP_ITERATION_3 225\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 224 && BOOST_PP_ITERATION_START_3 >= 224\n#    define BOOST_PP_ITERATION_3 224\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 223 && BOOST_PP_ITERATION_START_3 >= 223\n#    define BOOST_PP_ITERATION_3 223\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 222 && BOOST_PP_ITERATION_START_3 >= 222\n#    define BOOST_PP_ITERATION_3 222\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 221 && BOOST_PP_ITERATION_START_3 >= 221\n#    define BOOST_PP_ITERATION_3 221\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 220 && BOOST_PP_ITERATION_START_3 >= 220\n#    define BOOST_PP_ITERATION_3 220\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 219 && BOOST_PP_ITERATION_START_3 >= 219\n#    define BOOST_PP_ITERATION_3 219\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 218 && BOOST_PP_ITERATION_START_3 >= 218\n#    define BOOST_PP_ITERATION_3 218\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 217 && BOOST_PP_ITERATION_START_3 >= 217\n#    define BOOST_PP_ITERATION_3 217\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 216 && BOOST_PP_ITERATION_START_3 >= 216\n#    define BOOST_PP_ITERATION_3 216\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 215 && BOOST_PP_ITERATION_START_3 >= 215\n#    define BOOST_PP_ITERATION_3 215\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 214 && BOOST_PP_ITERATION_START_3 >= 214\n#    define BOOST_PP_ITERATION_3 214\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 213 && BOOST_PP_ITERATION_START_3 >= 213\n#    define BOOST_PP_ITERATION_3 213\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 212 && BOOST_PP_ITERATION_START_3 >= 212\n#    define BOOST_PP_ITERATION_3 212\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 211 && BOOST_PP_ITERATION_START_3 >= 211\n#    define BOOST_PP_ITERATION_3 211\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 210 && BOOST_PP_ITERATION_START_3 >= 210\n#    define BOOST_PP_ITERATION_3 210\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 209 && BOOST_PP_ITERATION_START_3 >= 209\n#    define BOOST_PP_ITERATION_3 209\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 208 && BOOST_PP_ITERATION_START_3 >= 208\n#    define BOOST_PP_ITERATION_3 208\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 207 && BOOST_PP_ITERATION_START_3 >= 207\n#    define BOOST_PP_ITERATION_3 207\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 206 && BOOST_PP_ITERATION_START_3 >= 206\n#    define BOOST_PP_ITERATION_3 206\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 205 && BOOST_PP_ITERATION_START_3 >= 205\n#    define BOOST_PP_ITERATION_3 205\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 204 && BOOST_PP_ITERATION_START_3 >= 204\n#    define BOOST_PP_ITERATION_3 204\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 203 && BOOST_PP_ITERATION_START_3 >= 203\n#    define BOOST_PP_ITERATION_3 203\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 202 && BOOST_PP_ITERATION_START_3 >= 202\n#    define BOOST_PP_ITERATION_3 202\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 201 && BOOST_PP_ITERATION_START_3 >= 201\n#    define BOOST_PP_ITERATION_3 201\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 200 && BOOST_PP_ITERATION_START_3 >= 200\n#    define BOOST_PP_ITERATION_3 200\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 199 && BOOST_PP_ITERATION_START_3 >= 199\n#    define BOOST_PP_ITERATION_3 199\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 198 && BOOST_PP_ITERATION_START_3 >= 198\n#    define BOOST_PP_ITERATION_3 198\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 197 && BOOST_PP_ITERATION_START_3 >= 197\n#    define BOOST_PP_ITERATION_3 197\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 196 && BOOST_PP_ITERATION_START_3 >= 196\n#    define BOOST_PP_ITERATION_3 196\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 195 && BOOST_PP_ITERATION_START_3 >= 195\n#    define BOOST_PP_ITERATION_3 195\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 194 && BOOST_PP_ITERATION_START_3 >= 194\n#    define BOOST_PP_ITERATION_3 194\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 193 && BOOST_PP_ITERATION_START_3 >= 193\n#    define BOOST_PP_ITERATION_3 193\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 192 && BOOST_PP_ITERATION_START_3 >= 192\n#    define BOOST_PP_ITERATION_3 192\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 191 && BOOST_PP_ITERATION_START_3 >= 191\n#    define BOOST_PP_ITERATION_3 191\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 190 && BOOST_PP_ITERATION_START_3 >= 190\n#    define BOOST_PP_ITERATION_3 190\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 189 && BOOST_PP_ITERATION_START_3 >= 189\n#    define BOOST_PP_ITERATION_3 189\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 188 && BOOST_PP_ITERATION_START_3 >= 188\n#    define BOOST_PP_ITERATION_3 188\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 187 && BOOST_PP_ITERATION_START_3 >= 187\n#    define BOOST_PP_ITERATION_3 187\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 186 && BOOST_PP_ITERATION_START_3 >= 186\n#    define BOOST_PP_ITERATION_3 186\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 185 && BOOST_PP_ITERATION_START_3 >= 185\n#    define BOOST_PP_ITERATION_3 185\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 184 && BOOST_PP_ITERATION_START_3 >= 184\n#    define BOOST_PP_ITERATION_3 184\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 183 && BOOST_PP_ITERATION_START_3 >= 183\n#    define BOOST_PP_ITERATION_3 183\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 182 && BOOST_PP_ITERATION_START_3 >= 182\n#    define BOOST_PP_ITERATION_3 182\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 181 && BOOST_PP_ITERATION_START_3 >= 181\n#    define BOOST_PP_ITERATION_3 181\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 180 && BOOST_PP_ITERATION_START_3 >= 180\n#    define BOOST_PP_ITERATION_3 180\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 179 && BOOST_PP_ITERATION_START_3 >= 179\n#    define BOOST_PP_ITERATION_3 179\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 178 && BOOST_PP_ITERATION_START_3 >= 178\n#    define BOOST_PP_ITERATION_3 178\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 177 && BOOST_PP_ITERATION_START_3 >= 177\n#    define BOOST_PP_ITERATION_3 177\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 176 && BOOST_PP_ITERATION_START_3 >= 176\n#    define BOOST_PP_ITERATION_3 176\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 175 && BOOST_PP_ITERATION_START_3 >= 175\n#    define BOOST_PP_ITERATION_3 175\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 174 && BOOST_PP_ITERATION_START_3 >= 174\n#    define BOOST_PP_ITERATION_3 174\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 173 && BOOST_PP_ITERATION_START_3 >= 173\n#    define BOOST_PP_ITERATION_3 173\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 172 && BOOST_PP_ITERATION_START_3 >= 172\n#    define BOOST_PP_ITERATION_3 172\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 171 && BOOST_PP_ITERATION_START_3 >= 171\n#    define BOOST_PP_ITERATION_3 171\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 170 && BOOST_PP_ITERATION_START_3 >= 170\n#    define BOOST_PP_ITERATION_3 170\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 169 && BOOST_PP_ITERATION_START_3 >= 169\n#    define BOOST_PP_ITERATION_3 169\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 168 && BOOST_PP_ITERATION_START_3 >= 168\n#    define BOOST_PP_ITERATION_3 168\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 167 && BOOST_PP_ITERATION_START_3 >= 167\n#    define BOOST_PP_ITERATION_3 167\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 166 && BOOST_PP_ITERATION_START_3 >= 166\n#    define BOOST_PP_ITERATION_3 166\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 165 && BOOST_PP_ITERATION_START_3 >= 165\n#    define BOOST_PP_ITERATION_3 165\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 164 && BOOST_PP_ITERATION_START_3 >= 164\n#    define BOOST_PP_ITERATION_3 164\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 163 && BOOST_PP_ITERATION_START_3 >= 163\n#    define BOOST_PP_ITERATION_3 163\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 162 && BOOST_PP_ITERATION_START_3 >= 162\n#    define BOOST_PP_ITERATION_3 162\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 161 && BOOST_PP_ITERATION_START_3 >= 161\n#    define BOOST_PP_ITERATION_3 161\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 160 && BOOST_PP_ITERATION_START_3 >= 160\n#    define BOOST_PP_ITERATION_3 160\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 159 && BOOST_PP_ITERATION_START_3 >= 159\n#    define BOOST_PP_ITERATION_3 159\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 158 && BOOST_PP_ITERATION_START_3 >= 158\n#    define BOOST_PP_ITERATION_3 158\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 157 && BOOST_PP_ITERATION_START_3 >= 157\n#    define BOOST_PP_ITERATION_3 157\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 156 && BOOST_PP_ITERATION_START_3 >= 156\n#    define BOOST_PP_ITERATION_3 156\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 155 && BOOST_PP_ITERATION_START_3 >= 155\n#    define BOOST_PP_ITERATION_3 155\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 154 && BOOST_PP_ITERATION_START_3 >= 154\n#    define BOOST_PP_ITERATION_3 154\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 153 && BOOST_PP_ITERATION_START_3 >= 153\n#    define BOOST_PP_ITERATION_3 153\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 152 && BOOST_PP_ITERATION_START_3 >= 152\n#    define BOOST_PP_ITERATION_3 152\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 151 && BOOST_PP_ITERATION_START_3 >= 151\n#    define BOOST_PP_ITERATION_3 151\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 150 && BOOST_PP_ITERATION_START_3 >= 150\n#    define BOOST_PP_ITERATION_3 150\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 149 && BOOST_PP_ITERATION_START_3 >= 149\n#    define BOOST_PP_ITERATION_3 149\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 148 && BOOST_PP_ITERATION_START_3 >= 148\n#    define BOOST_PP_ITERATION_3 148\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 147 && BOOST_PP_ITERATION_START_3 >= 147\n#    define BOOST_PP_ITERATION_3 147\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 146 && BOOST_PP_ITERATION_START_3 >= 146\n#    define BOOST_PP_ITERATION_3 146\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 145 && BOOST_PP_ITERATION_START_3 >= 145\n#    define BOOST_PP_ITERATION_3 145\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 144 && BOOST_PP_ITERATION_START_3 >= 144\n#    define BOOST_PP_ITERATION_3 144\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 143 && BOOST_PP_ITERATION_START_3 >= 143\n#    define BOOST_PP_ITERATION_3 143\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 142 && BOOST_PP_ITERATION_START_3 >= 142\n#    define BOOST_PP_ITERATION_3 142\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 141 && BOOST_PP_ITERATION_START_3 >= 141\n#    define BOOST_PP_ITERATION_3 141\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 140 && BOOST_PP_ITERATION_START_3 >= 140\n#    define BOOST_PP_ITERATION_3 140\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 139 && BOOST_PP_ITERATION_START_3 >= 139\n#    define BOOST_PP_ITERATION_3 139\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 138 && BOOST_PP_ITERATION_START_3 >= 138\n#    define BOOST_PP_ITERATION_3 138\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 137 && BOOST_PP_ITERATION_START_3 >= 137\n#    define BOOST_PP_ITERATION_3 137\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 136 && BOOST_PP_ITERATION_START_3 >= 136\n#    define BOOST_PP_ITERATION_3 136\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 135 && BOOST_PP_ITERATION_START_3 >= 135\n#    define BOOST_PP_ITERATION_3 135\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 134 && BOOST_PP_ITERATION_START_3 >= 134\n#    define BOOST_PP_ITERATION_3 134\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 133 && BOOST_PP_ITERATION_START_3 >= 133\n#    define BOOST_PP_ITERATION_3 133\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 132 && BOOST_PP_ITERATION_START_3 >= 132\n#    define BOOST_PP_ITERATION_3 132\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 131 && BOOST_PP_ITERATION_START_3 >= 131\n#    define BOOST_PP_ITERATION_3 131\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 130 && BOOST_PP_ITERATION_START_3 >= 130\n#    define BOOST_PP_ITERATION_3 130\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 129 && BOOST_PP_ITERATION_START_3 >= 129\n#    define BOOST_PP_ITERATION_3 129\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 128 && BOOST_PP_ITERATION_START_3 >= 128\n#    define BOOST_PP_ITERATION_3 128\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 127 && BOOST_PP_ITERATION_START_3 >= 127\n#    define BOOST_PP_ITERATION_3 127\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 126 && BOOST_PP_ITERATION_START_3 >= 126\n#    define BOOST_PP_ITERATION_3 126\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 125 && BOOST_PP_ITERATION_START_3 >= 125\n#    define BOOST_PP_ITERATION_3 125\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 124 && BOOST_PP_ITERATION_START_3 >= 124\n#    define BOOST_PP_ITERATION_3 124\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 123 && BOOST_PP_ITERATION_START_3 >= 123\n#    define BOOST_PP_ITERATION_3 123\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 122 && BOOST_PP_ITERATION_START_3 >= 122\n#    define BOOST_PP_ITERATION_3 122\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 121 && BOOST_PP_ITERATION_START_3 >= 121\n#    define BOOST_PP_ITERATION_3 121\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 120 && BOOST_PP_ITERATION_START_3 >= 120\n#    define BOOST_PP_ITERATION_3 120\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 119 && BOOST_PP_ITERATION_START_3 >= 119\n#    define BOOST_PP_ITERATION_3 119\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 118 && BOOST_PP_ITERATION_START_3 >= 118\n#    define BOOST_PP_ITERATION_3 118\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 117 && BOOST_PP_ITERATION_START_3 >= 117\n#    define BOOST_PP_ITERATION_3 117\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 116 && BOOST_PP_ITERATION_START_3 >= 116\n#    define BOOST_PP_ITERATION_3 116\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 115 && BOOST_PP_ITERATION_START_3 >= 115\n#    define BOOST_PP_ITERATION_3 115\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 114 && BOOST_PP_ITERATION_START_3 >= 114\n#    define BOOST_PP_ITERATION_3 114\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 113 && BOOST_PP_ITERATION_START_3 >= 113\n#    define BOOST_PP_ITERATION_3 113\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 112 && BOOST_PP_ITERATION_START_3 >= 112\n#    define BOOST_PP_ITERATION_3 112\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 111 && BOOST_PP_ITERATION_START_3 >= 111\n#    define BOOST_PP_ITERATION_3 111\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 110 && BOOST_PP_ITERATION_START_3 >= 110\n#    define BOOST_PP_ITERATION_3 110\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 109 && BOOST_PP_ITERATION_START_3 >= 109\n#    define BOOST_PP_ITERATION_3 109\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 108 && BOOST_PP_ITERATION_START_3 >= 108\n#    define BOOST_PP_ITERATION_3 108\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 107 && BOOST_PP_ITERATION_START_3 >= 107\n#    define BOOST_PP_ITERATION_3 107\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 106 && BOOST_PP_ITERATION_START_3 >= 106\n#    define BOOST_PP_ITERATION_3 106\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 105 && BOOST_PP_ITERATION_START_3 >= 105\n#    define BOOST_PP_ITERATION_3 105\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 104 && BOOST_PP_ITERATION_START_3 >= 104\n#    define BOOST_PP_ITERATION_3 104\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 103 && BOOST_PP_ITERATION_START_3 >= 103\n#    define BOOST_PP_ITERATION_3 103\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 102 && BOOST_PP_ITERATION_START_3 >= 102\n#    define BOOST_PP_ITERATION_3 102\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 101 && BOOST_PP_ITERATION_START_3 >= 101\n#    define BOOST_PP_ITERATION_3 101\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 100 && BOOST_PP_ITERATION_START_3 >= 100\n#    define BOOST_PP_ITERATION_3 100\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 99 && BOOST_PP_ITERATION_START_3 >= 99\n#    define BOOST_PP_ITERATION_3 99\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 98 && BOOST_PP_ITERATION_START_3 >= 98\n#    define BOOST_PP_ITERATION_3 98\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 97 && BOOST_PP_ITERATION_START_3 >= 97\n#    define BOOST_PP_ITERATION_3 97\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 96 && BOOST_PP_ITERATION_START_3 >= 96\n#    define BOOST_PP_ITERATION_3 96\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 95 && BOOST_PP_ITERATION_START_3 >= 95\n#    define BOOST_PP_ITERATION_3 95\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 94 && BOOST_PP_ITERATION_START_3 >= 94\n#    define BOOST_PP_ITERATION_3 94\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 93 && BOOST_PP_ITERATION_START_3 >= 93\n#    define BOOST_PP_ITERATION_3 93\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 92 && BOOST_PP_ITERATION_START_3 >= 92\n#    define BOOST_PP_ITERATION_3 92\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 91 && BOOST_PP_ITERATION_START_3 >= 91\n#    define BOOST_PP_ITERATION_3 91\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 90 && BOOST_PP_ITERATION_START_3 >= 90\n#    define BOOST_PP_ITERATION_3 90\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 89 && BOOST_PP_ITERATION_START_3 >= 89\n#    define BOOST_PP_ITERATION_3 89\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 88 && BOOST_PP_ITERATION_START_3 >= 88\n#    define BOOST_PP_ITERATION_3 88\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 87 && BOOST_PP_ITERATION_START_3 >= 87\n#    define BOOST_PP_ITERATION_3 87\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 86 && BOOST_PP_ITERATION_START_3 >= 86\n#    define BOOST_PP_ITERATION_3 86\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 85 && BOOST_PP_ITERATION_START_3 >= 85\n#    define BOOST_PP_ITERATION_3 85\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 84 && BOOST_PP_ITERATION_START_3 >= 84\n#    define BOOST_PP_ITERATION_3 84\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 83 && BOOST_PP_ITERATION_START_3 >= 83\n#    define BOOST_PP_ITERATION_3 83\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 82 && BOOST_PP_ITERATION_START_3 >= 82\n#    define BOOST_PP_ITERATION_3 82\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 81 && BOOST_PP_ITERATION_START_3 >= 81\n#    define BOOST_PP_ITERATION_3 81\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 80 && BOOST_PP_ITERATION_START_3 >= 80\n#    define BOOST_PP_ITERATION_3 80\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 79 && BOOST_PP_ITERATION_START_3 >= 79\n#    define BOOST_PP_ITERATION_3 79\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 78 && BOOST_PP_ITERATION_START_3 >= 78\n#    define BOOST_PP_ITERATION_3 78\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 77 && BOOST_PP_ITERATION_START_3 >= 77\n#    define BOOST_PP_ITERATION_3 77\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 76 && BOOST_PP_ITERATION_START_3 >= 76\n#    define BOOST_PP_ITERATION_3 76\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 75 && BOOST_PP_ITERATION_START_3 >= 75\n#    define BOOST_PP_ITERATION_3 75\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 74 && BOOST_PP_ITERATION_START_3 >= 74\n#    define BOOST_PP_ITERATION_3 74\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 73 && BOOST_PP_ITERATION_START_3 >= 73\n#    define BOOST_PP_ITERATION_3 73\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 72 && BOOST_PP_ITERATION_START_3 >= 72\n#    define BOOST_PP_ITERATION_3 72\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 71 && BOOST_PP_ITERATION_START_3 >= 71\n#    define BOOST_PP_ITERATION_3 71\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 70 && BOOST_PP_ITERATION_START_3 >= 70\n#    define BOOST_PP_ITERATION_3 70\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 69 && BOOST_PP_ITERATION_START_3 >= 69\n#    define BOOST_PP_ITERATION_3 69\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 68 && BOOST_PP_ITERATION_START_3 >= 68\n#    define BOOST_PP_ITERATION_3 68\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 67 && BOOST_PP_ITERATION_START_3 >= 67\n#    define BOOST_PP_ITERATION_3 67\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 66 && BOOST_PP_ITERATION_START_3 >= 66\n#    define BOOST_PP_ITERATION_3 66\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 65 && BOOST_PP_ITERATION_START_3 >= 65\n#    define BOOST_PP_ITERATION_3 65\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 64 && BOOST_PP_ITERATION_START_3 >= 64\n#    define BOOST_PP_ITERATION_3 64\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 63 && BOOST_PP_ITERATION_START_3 >= 63\n#    define BOOST_PP_ITERATION_3 63\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 62 && BOOST_PP_ITERATION_START_3 >= 62\n#    define BOOST_PP_ITERATION_3 62\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 61 && BOOST_PP_ITERATION_START_3 >= 61\n#    define BOOST_PP_ITERATION_3 61\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 60 && BOOST_PP_ITERATION_START_3 >= 60\n#    define BOOST_PP_ITERATION_3 60\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 59 && BOOST_PP_ITERATION_START_3 >= 59\n#    define BOOST_PP_ITERATION_3 59\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 58 && BOOST_PP_ITERATION_START_3 >= 58\n#    define BOOST_PP_ITERATION_3 58\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 57 && BOOST_PP_ITERATION_START_3 >= 57\n#    define BOOST_PP_ITERATION_3 57\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 56 && BOOST_PP_ITERATION_START_3 >= 56\n#    define BOOST_PP_ITERATION_3 56\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 55 && BOOST_PP_ITERATION_START_3 >= 55\n#    define BOOST_PP_ITERATION_3 55\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 54 && BOOST_PP_ITERATION_START_3 >= 54\n#    define BOOST_PP_ITERATION_3 54\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 53 && BOOST_PP_ITERATION_START_3 >= 53\n#    define BOOST_PP_ITERATION_3 53\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 52 && BOOST_PP_ITERATION_START_3 >= 52\n#    define BOOST_PP_ITERATION_3 52\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 51 && BOOST_PP_ITERATION_START_3 >= 51\n#    define BOOST_PP_ITERATION_3 51\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 50 && BOOST_PP_ITERATION_START_3 >= 50\n#    define BOOST_PP_ITERATION_3 50\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 49 && BOOST_PP_ITERATION_START_3 >= 49\n#    define BOOST_PP_ITERATION_3 49\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 48 && BOOST_PP_ITERATION_START_3 >= 48\n#    define BOOST_PP_ITERATION_3 48\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 47 && BOOST_PP_ITERATION_START_3 >= 47\n#    define BOOST_PP_ITERATION_3 47\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 46 && BOOST_PP_ITERATION_START_3 >= 46\n#    define BOOST_PP_ITERATION_3 46\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 45 && BOOST_PP_ITERATION_START_3 >= 45\n#    define BOOST_PP_ITERATION_3 45\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 44 && BOOST_PP_ITERATION_START_3 >= 44\n#    define BOOST_PP_ITERATION_3 44\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 43 && BOOST_PP_ITERATION_START_3 >= 43\n#    define BOOST_PP_ITERATION_3 43\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 42 && BOOST_PP_ITERATION_START_3 >= 42\n#    define BOOST_PP_ITERATION_3 42\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 41 && BOOST_PP_ITERATION_START_3 >= 41\n#    define BOOST_PP_ITERATION_3 41\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 40 && BOOST_PP_ITERATION_START_3 >= 40\n#    define BOOST_PP_ITERATION_3 40\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 39 && BOOST_PP_ITERATION_START_3 >= 39\n#    define BOOST_PP_ITERATION_3 39\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 38 && BOOST_PP_ITERATION_START_3 >= 38\n#    define BOOST_PP_ITERATION_3 38\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 37 && BOOST_PP_ITERATION_START_3 >= 37\n#    define BOOST_PP_ITERATION_3 37\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 36 && BOOST_PP_ITERATION_START_3 >= 36\n#    define BOOST_PP_ITERATION_3 36\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 35 && BOOST_PP_ITERATION_START_3 >= 35\n#    define BOOST_PP_ITERATION_3 35\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 34 && BOOST_PP_ITERATION_START_3 >= 34\n#    define BOOST_PP_ITERATION_3 34\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 33 && BOOST_PP_ITERATION_START_3 >= 33\n#    define BOOST_PP_ITERATION_3 33\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 32 && BOOST_PP_ITERATION_START_3 >= 32\n#    define BOOST_PP_ITERATION_3 32\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 31 && BOOST_PP_ITERATION_START_3 >= 31\n#    define BOOST_PP_ITERATION_3 31\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 30 && BOOST_PP_ITERATION_START_3 >= 30\n#    define BOOST_PP_ITERATION_3 30\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 29 && BOOST_PP_ITERATION_START_3 >= 29\n#    define BOOST_PP_ITERATION_3 29\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 28 && BOOST_PP_ITERATION_START_3 >= 28\n#    define BOOST_PP_ITERATION_3 28\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 27 && BOOST_PP_ITERATION_START_3 >= 27\n#    define BOOST_PP_ITERATION_3 27\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 26 && BOOST_PP_ITERATION_START_3 >= 26\n#    define BOOST_PP_ITERATION_3 26\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 25 && BOOST_PP_ITERATION_START_3 >= 25\n#    define BOOST_PP_ITERATION_3 25\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 24 && BOOST_PP_ITERATION_START_3 >= 24\n#    define BOOST_PP_ITERATION_3 24\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 23 && BOOST_PP_ITERATION_START_3 >= 23\n#    define BOOST_PP_ITERATION_3 23\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 22 && BOOST_PP_ITERATION_START_3 >= 22\n#    define BOOST_PP_ITERATION_3 22\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 21 && BOOST_PP_ITERATION_START_3 >= 21\n#    define BOOST_PP_ITERATION_3 21\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 20 && BOOST_PP_ITERATION_START_3 >= 20\n#    define BOOST_PP_ITERATION_3 20\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 19 && BOOST_PP_ITERATION_START_3 >= 19\n#    define BOOST_PP_ITERATION_3 19\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 18 && BOOST_PP_ITERATION_START_3 >= 18\n#    define BOOST_PP_ITERATION_3 18\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 17 && BOOST_PP_ITERATION_START_3 >= 17\n#    define BOOST_PP_ITERATION_3 17\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 16 && BOOST_PP_ITERATION_START_3 >= 16\n#    define BOOST_PP_ITERATION_3 16\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 15 && BOOST_PP_ITERATION_START_3 >= 15\n#    define BOOST_PP_ITERATION_3 15\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 14 && BOOST_PP_ITERATION_START_3 >= 14\n#    define BOOST_PP_ITERATION_3 14\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 13 && BOOST_PP_ITERATION_START_3 >= 13\n#    define BOOST_PP_ITERATION_3 13\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 12 && BOOST_PP_ITERATION_START_3 >= 12\n#    define BOOST_PP_ITERATION_3 12\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 11 && BOOST_PP_ITERATION_START_3 >= 11\n#    define BOOST_PP_ITERATION_3 11\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 10 && BOOST_PP_ITERATION_START_3 >= 10\n#    define BOOST_PP_ITERATION_3 10\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 9 && BOOST_PP_ITERATION_START_3 >= 9\n#    define BOOST_PP_ITERATION_3 9\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 8 && BOOST_PP_ITERATION_START_3 >= 8\n#    define BOOST_PP_ITERATION_3 8\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 7 && BOOST_PP_ITERATION_START_3 >= 7\n#    define BOOST_PP_ITERATION_3 7\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 6 && BOOST_PP_ITERATION_START_3 >= 6\n#    define BOOST_PP_ITERATION_3 6\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 5 && BOOST_PP_ITERATION_START_3 >= 5\n#    define BOOST_PP_ITERATION_3 5\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 4 && BOOST_PP_ITERATION_START_3 >= 4\n#    define BOOST_PP_ITERATION_3 4\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 3 && BOOST_PP_ITERATION_START_3 >= 3\n#    define BOOST_PP_ITERATION_3 3\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 2 && BOOST_PP_ITERATION_START_3 >= 2\n#    define BOOST_PP_ITERATION_3 2\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 1 && BOOST_PP_ITERATION_START_3 >= 1\n#    define BOOST_PP_ITERATION_3 1\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 0 && BOOST_PP_ITERATION_START_3 >= 0\n#    define BOOST_PP_ITERATION_3 0\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/iteration/detail/iter/reverse4.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# if BOOST_PP_ITERATION_FINISH_4 <= 256 && BOOST_PP_ITERATION_START_4 >= 256\n#    define BOOST_PP_ITERATION_4 256\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 255 && BOOST_PP_ITERATION_START_4 >= 255\n#    define BOOST_PP_ITERATION_4 255\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 254 && BOOST_PP_ITERATION_START_4 >= 254\n#    define BOOST_PP_ITERATION_4 254\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 253 && BOOST_PP_ITERATION_START_4 >= 253\n#    define BOOST_PP_ITERATION_4 253\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 252 && BOOST_PP_ITERATION_START_4 >= 252\n#    define BOOST_PP_ITERATION_4 252\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 251 && BOOST_PP_ITERATION_START_4 >= 251\n#    define BOOST_PP_ITERATION_4 251\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 250 && BOOST_PP_ITERATION_START_4 >= 250\n#    define BOOST_PP_ITERATION_4 250\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 249 && BOOST_PP_ITERATION_START_4 >= 249\n#    define BOOST_PP_ITERATION_4 249\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 248 && BOOST_PP_ITERATION_START_4 >= 248\n#    define BOOST_PP_ITERATION_4 248\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 247 && BOOST_PP_ITERATION_START_4 >= 247\n#    define BOOST_PP_ITERATION_4 247\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 246 && BOOST_PP_ITERATION_START_4 >= 246\n#    define BOOST_PP_ITERATION_4 246\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 245 && BOOST_PP_ITERATION_START_4 >= 245\n#    define BOOST_PP_ITERATION_4 245\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 244 && BOOST_PP_ITERATION_START_4 >= 244\n#    define BOOST_PP_ITERATION_4 244\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 243 && BOOST_PP_ITERATION_START_4 >= 243\n#    define BOOST_PP_ITERATION_4 243\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 242 && BOOST_PP_ITERATION_START_4 >= 242\n#    define BOOST_PP_ITERATION_4 242\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 241 && BOOST_PP_ITERATION_START_4 >= 241\n#    define BOOST_PP_ITERATION_4 241\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 240 && BOOST_PP_ITERATION_START_4 >= 240\n#    define BOOST_PP_ITERATION_4 240\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 239 && BOOST_PP_ITERATION_START_4 >= 239\n#    define BOOST_PP_ITERATION_4 239\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 238 && BOOST_PP_ITERATION_START_4 >= 238\n#    define BOOST_PP_ITERATION_4 238\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 237 && BOOST_PP_ITERATION_START_4 >= 237\n#    define BOOST_PP_ITERATION_4 237\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 236 && BOOST_PP_ITERATION_START_4 >= 236\n#    define BOOST_PP_ITERATION_4 236\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 235 && BOOST_PP_ITERATION_START_4 >= 235\n#    define BOOST_PP_ITERATION_4 235\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 234 && BOOST_PP_ITERATION_START_4 >= 234\n#    define BOOST_PP_ITERATION_4 234\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 233 && BOOST_PP_ITERATION_START_4 >= 233\n#    define BOOST_PP_ITERATION_4 233\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 232 && BOOST_PP_ITERATION_START_4 >= 232\n#    define BOOST_PP_ITERATION_4 232\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 231 && BOOST_PP_ITERATION_START_4 >= 231\n#    define BOOST_PP_ITERATION_4 231\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 230 && BOOST_PP_ITERATION_START_4 >= 230\n#    define BOOST_PP_ITERATION_4 230\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 229 && BOOST_PP_ITERATION_START_4 >= 229\n#    define BOOST_PP_ITERATION_4 229\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 228 && BOOST_PP_ITERATION_START_4 >= 228\n#    define BOOST_PP_ITERATION_4 228\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 227 && BOOST_PP_ITERATION_START_4 >= 227\n#    define BOOST_PP_ITERATION_4 227\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 226 && BOOST_PP_ITERATION_START_4 >= 226\n#    define BOOST_PP_ITERATION_4 226\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 225 && BOOST_PP_ITERATION_START_4 >= 225\n#    define BOOST_PP_ITERATION_4 225\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 224 && BOOST_PP_ITERATION_START_4 >= 224\n#    define BOOST_PP_ITERATION_4 224\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 223 && BOOST_PP_ITERATION_START_4 >= 223\n#    define BOOST_PP_ITERATION_4 223\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 222 && BOOST_PP_ITERATION_START_4 >= 222\n#    define BOOST_PP_ITERATION_4 222\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 221 && BOOST_PP_ITERATION_START_4 >= 221\n#    define BOOST_PP_ITERATION_4 221\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 220 && BOOST_PP_ITERATION_START_4 >= 220\n#    define BOOST_PP_ITERATION_4 220\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 219 && BOOST_PP_ITERATION_START_4 >= 219\n#    define BOOST_PP_ITERATION_4 219\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 218 && BOOST_PP_ITERATION_START_4 >= 218\n#    define BOOST_PP_ITERATION_4 218\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 217 && BOOST_PP_ITERATION_START_4 >= 217\n#    define BOOST_PP_ITERATION_4 217\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 216 && BOOST_PP_ITERATION_START_4 >= 216\n#    define BOOST_PP_ITERATION_4 216\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 215 && BOOST_PP_ITERATION_START_4 >= 215\n#    define BOOST_PP_ITERATION_4 215\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 214 && BOOST_PP_ITERATION_START_4 >= 214\n#    define BOOST_PP_ITERATION_4 214\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 213 && BOOST_PP_ITERATION_START_4 >= 213\n#    define BOOST_PP_ITERATION_4 213\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 212 && BOOST_PP_ITERATION_START_4 >= 212\n#    define BOOST_PP_ITERATION_4 212\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 211 && BOOST_PP_ITERATION_START_4 >= 211\n#    define BOOST_PP_ITERATION_4 211\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 210 && BOOST_PP_ITERATION_START_4 >= 210\n#    define BOOST_PP_ITERATION_4 210\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 209 && BOOST_PP_ITERATION_START_4 >= 209\n#    define BOOST_PP_ITERATION_4 209\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 208 && BOOST_PP_ITERATION_START_4 >= 208\n#    define BOOST_PP_ITERATION_4 208\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 207 && BOOST_PP_ITERATION_START_4 >= 207\n#    define BOOST_PP_ITERATION_4 207\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 206 && BOOST_PP_ITERATION_START_4 >= 206\n#    define BOOST_PP_ITERATION_4 206\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 205 && BOOST_PP_ITERATION_START_4 >= 205\n#    define BOOST_PP_ITERATION_4 205\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 204 && BOOST_PP_ITERATION_START_4 >= 204\n#    define BOOST_PP_ITERATION_4 204\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 203 && BOOST_PP_ITERATION_START_4 >= 203\n#    define BOOST_PP_ITERATION_4 203\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 202 && BOOST_PP_ITERATION_START_4 >= 202\n#    define BOOST_PP_ITERATION_4 202\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 201 && BOOST_PP_ITERATION_START_4 >= 201\n#    define BOOST_PP_ITERATION_4 201\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 200 && BOOST_PP_ITERATION_START_4 >= 200\n#    define BOOST_PP_ITERATION_4 200\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 199 && BOOST_PP_ITERATION_START_4 >= 199\n#    define BOOST_PP_ITERATION_4 199\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 198 && BOOST_PP_ITERATION_START_4 >= 198\n#    define BOOST_PP_ITERATION_4 198\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 197 && BOOST_PP_ITERATION_START_4 >= 197\n#    define BOOST_PP_ITERATION_4 197\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 196 && BOOST_PP_ITERATION_START_4 >= 196\n#    define BOOST_PP_ITERATION_4 196\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 195 && BOOST_PP_ITERATION_START_4 >= 195\n#    define BOOST_PP_ITERATION_4 195\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 194 && BOOST_PP_ITERATION_START_4 >= 194\n#    define BOOST_PP_ITERATION_4 194\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 193 && BOOST_PP_ITERATION_START_4 >= 193\n#    define BOOST_PP_ITERATION_4 193\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 192 && BOOST_PP_ITERATION_START_4 >= 192\n#    define BOOST_PP_ITERATION_4 192\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 191 && BOOST_PP_ITERATION_START_4 >= 191\n#    define BOOST_PP_ITERATION_4 191\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 190 && BOOST_PP_ITERATION_START_4 >= 190\n#    define BOOST_PP_ITERATION_4 190\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 189 && BOOST_PP_ITERATION_START_4 >= 189\n#    define BOOST_PP_ITERATION_4 189\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 188 && BOOST_PP_ITERATION_START_4 >= 188\n#    define BOOST_PP_ITERATION_4 188\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 187 && BOOST_PP_ITERATION_START_4 >= 187\n#    define BOOST_PP_ITERATION_4 187\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 186 && BOOST_PP_ITERATION_START_4 >= 186\n#    define BOOST_PP_ITERATION_4 186\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 185 && BOOST_PP_ITERATION_START_4 >= 185\n#    define BOOST_PP_ITERATION_4 185\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 184 && BOOST_PP_ITERATION_START_4 >= 184\n#    define BOOST_PP_ITERATION_4 184\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 183 && BOOST_PP_ITERATION_START_4 >= 183\n#    define BOOST_PP_ITERATION_4 183\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 182 && BOOST_PP_ITERATION_START_4 >= 182\n#    define BOOST_PP_ITERATION_4 182\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 181 && BOOST_PP_ITERATION_START_4 >= 181\n#    define BOOST_PP_ITERATION_4 181\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 180 && BOOST_PP_ITERATION_START_4 >= 180\n#    define BOOST_PP_ITERATION_4 180\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 179 && BOOST_PP_ITERATION_START_4 >= 179\n#    define BOOST_PP_ITERATION_4 179\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 178 && BOOST_PP_ITERATION_START_4 >= 178\n#    define BOOST_PP_ITERATION_4 178\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 177 && BOOST_PP_ITERATION_START_4 >= 177\n#    define BOOST_PP_ITERATION_4 177\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 176 && BOOST_PP_ITERATION_START_4 >= 176\n#    define BOOST_PP_ITERATION_4 176\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 175 && BOOST_PP_ITERATION_START_4 >= 175\n#    define BOOST_PP_ITERATION_4 175\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 174 && BOOST_PP_ITERATION_START_4 >= 174\n#    define BOOST_PP_ITERATION_4 174\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 173 && BOOST_PP_ITERATION_START_4 >= 173\n#    define BOOST_PP_ITERATION_4 173\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 172 && BOOST_PP_ITERATION_START_4 >= 172\n#    define BOOST_PP_ITERATION_4 172\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 171 && BOOST_PP_ITERATION_START_4 >= 171\n#    define BOOST_PP_ITERATION_4 171\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 170 && BOOST_PP_ITERATION_START_4 >= 170\n#    define BOOST_PP_ITERATION_4 170\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 169 && BOOST_PP_ITERATION_START_4 >= 169\n#    define BOOST_PP_ITERATION_4 169\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 168 && BOOST_PP_ITERATION_START_4 >= 168\n#    define BOOST_PP_ITERATION_4 168\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 167 && BOOST_PP_ITERATION_START_4 >= 167\n#    define BOOST_PP_ITERATION_4 167\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 166 && BOOST_PP_ITERATION_START_4 >= 166\n#    define BOOST_PP_ITERATION_4 166\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 165 && BOOST_PP_ITERATION_START_4 >= 165\n#    define BOOST_PP_ITERATION_4 165\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 164 && BOOST_PP_ITERATION_START_4 >= 164\n#    define BOOST_PP_ITERATION_4 164\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 163 && BOOST_PP_ITERATION_START_4 >= 163\n#    define BOOST_PP_ITERATION_4 163\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 162 && BOOST_PP_ITERATION_START_4 >= 162\n#    define BOOST_PP_ITERATION_4 162\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 161 && BOOST_PP_ITERATION_START_4 >= 161\n#    define BOOST_PP_ITERATION_4 161\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 160 && BOOST_PP_ITERATION_START_4 >= 160\n#    define BOOST_PP_ITERATION_4 160\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 159 && BOOST_PP_ITERATION_START_4 >= 159\n#    define BOOST_PP_ITERATION_4 159\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 158 && BOOST_PP_ITERATION_START_4 >= 158\n#    define BOOST_PP_ITERATION_4 158\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 157 && BOOST_PP_ITERATION_START_4 >= 157\n#    define BOOST_PP_ITERATION_4 157\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 156 && BOOST_PP_ITERATION_START_4 >= 156\n#    define BOOST_PP_ITERATION_4 156\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 155 && BOOST_PP_ITERATION_START_4 >= 155\n#    define BOOST_PP_ITERATION_4 155\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 154 && BOOST_PP_ITERATION_START_4 >= 154\n#    define BOOST_PP_ITERATION_4 154\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 153 && BOOST_PP_ITERATION_START_4 >= 153\n#    define BOOST_PP_ITERATION_4 153\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 152 && BOOST_PP_ITERATION_START_4 >= 152\n#    define BOOST_PP_ITERATION_4 152\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 151 && BOOST_PP_ITERATION_START_4 >= 151\n#    define BOOST_PP_ITERATION_4 151\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 150 && BOOST_PP_ITERATION_START_4 >= 150\n#    define BOOST_PP_ITERATION_4 150\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 149 && BOOST_PP_ITERATION_START_4 >= 149\n#    define BOOST_PP_ITERATION_4 149\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 148 && BOOST_PP_ITERATION_START_4 >= 148\n#    define BOOST_PP_ITERATION_4 148\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 147 && BOOST_PP_ITERATION_START_4 >= 147\n#    define BOOST_PP_ITERATION_4 147\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 146 && BOOST_PP_ITERATION_START_4 >= 146\n#    define BOOST_PP_ITERATION_4 146\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 145 && BOOST_PP_ITERATION_START_4 >= 145\n#    define BOOST_PP_ITERATION_4 145\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 144 && BOOST_PP_ITERATION_START_4 >= 144\n#    define BOOST_PP_ITERATION_4 144\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 143 && BOOST_PP_ITERATION_START_4 >= 143\n#    define BOOST_PP_ITERATION_4 143\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 142 && BOOST_PP_ITERATION_START_4 >= 142\n#    define BOOST_PP_ITERATION_4 142\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 141 && BOOST_PP_ITERATION_START_4 >= 141\n#    define BOOST_PP_ITERATION_4 141\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 140 && BOOST_PP_ITERATION_START_4 >= 140\n#    define BOOST_PP_ITERATION_4 140\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 139 && BOOST_PP_ITERATION_START_4 >= 139\n#    define BOOST_PP_ITERATION_4 139\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 138 && BOOST_PP_ITERATION_START_4 >= 138\n#    define BOOST_PP_ITERATION_4 138\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 137 && BOOST_PP_ITERATION_START_4 >= 137\n#    define BOOST_PP_ITERATION_4 137\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 136 && BOOST_PP_ITERATION_START_4 >= 136\n#    define BOOST_PP_ITERATION_4 136\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 135 && BOOST_PP_ITERATION_START_4 >= 135\n#    define BOOST_PP_ITERATION_4 135\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 134 && BOOST_PP_ITERATION_START_4 >= 134\n#    define BOOST_PP_ITERATION_4 134\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 133 && BOOST_PP_ITERATION_START_4 >= 133\n#    define BOOST_PP_ITERATION_4 133\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 132 && BOOST_PP_ITERATION_START_4 >= 132\n#    define BOOST_PP_ITERATION_4 132\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 131 && BOOST_PP_ITERATION_START_4 >= 131\n#    define BOOST_PP_ITERATION_4 131\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 130 && BOOST_PP_ITERATION_START_4 >= 130\n#    define BOOST_PP_ITERATION_4 130\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 129 && BOOST_PP_ITERATION_START_4 >= 129\n#    define BOOST_PP_ITERATION_4 129\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 128 && BOOST_PP_ITERATION_START_4 >= 128\n#    define BOOST_PP_ITERATION_4 128\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 127 && BOOST_PP_ITERATION_START_4 >= 127\n#    define BOOST_PP_ITERATION_4 127\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 126 && BOOST_PP_ITERATION_START_4 >= 126\n#    define BOOST_PP_ITERATION_4 126\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 125 && BOOST_PP_ITERATION_START_4 >= 125\n#    define BOOST_PP_ITERATION_4 125\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 124 && BOOST_PP_ITERATION_START_4 >= 124\n#    define BOOST_PP_ITERATION_4 124\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 123 && BOOST_PP_ITERATION_START_4 >= 123\n#    define BOOST_PP_ITERATION_4 123\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 122 && BOOST_PP_ITERATION_START_4 >= 122\n#    define BOOST_PP_ITERATION_4 122\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 121 && BOOST_PP_ITERATION_START_4 >= 121\n#    define BOOST_PP_ITERATION_4 121\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 120 && BOOST_PP_ITERATION_START_4 >= 120\n#    define BOOST_PP_ITERATION_4 120\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 119 && BOOST_PP_ITERATION_START_4 >= 119\n#    define BOOST_PP_ITERATION_4 119\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 118 && BOOST_PP_ITERATION_START_4 >= 118\n#    define BOOST_PP_ITERATION_4 118\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 117 && BOOST_PP_ITERATION_START_4 >= 117\n#    define BOOST_PP_ITERATION_4 117\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 116 && BOOST_PP_ITERATION_START_4 >= 116\n#    define BOOST_PP_ITERATION_4 116\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 115 && BOOST_PP_ITERATION_START_4 >= 115\n#    define BOOST_PP_ITERATION_4 115\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 114 && BOOST_PP_ITERATION_START_4 >= 114\n#    define BOOST_PP_ITERATION_4 114\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 113 && BOOST_PP_ITERATION_START_4 >= 113\n#    define BOOST_PP_ITERATION_4 113\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 112 && BOOST_PP_ITERATION_START_4 >= 112\n#    define BOOST_PP_ITERATION_4 112\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 111 && BOOST_PP_ITERATION_START_4 >= 111\n#    define BOOST_PP_ITERATION_4 111\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 110 && BOOST_PP_ITERATION_START_4 >= 110\n#    define BOOST_PP_ITERATION_4 110\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 109 && BOOST_PP_ITERATION_START_4 >= 109\n#    define BOOST_PP_ITERATION_4 109\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 108 && BOOST_PP_ITERATION_START_4 >= 108\n#    define BOOST_PP_ITERATION_4 108\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 107 && BOOST_PP_ITERATION_START_4 >= 107\n#    define BOOST_PP_ITERATION_4 107\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 106 && BOOST_PP_ITERATION_START_4 >= 106\n#    define BOOST_PP_ITERATION_4 106\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 105 && BOOST_PP_ITERATION_START_4 >= 105\n#    define BOOST_PP_ITERATION_4 105\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 104 && BOOST_PP_ITERATION_START_4 >= 104\n#    define BOOST_PP_ITERATION_4 104\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 103 && BOOST_PP_ITERATION_START_4 >= 103\n#    define BOOST_PP_ITERATION_4 103\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 102 && BOOST_PP_ITERATION_START_4 >= 102\n#    define BOOST_PP_ITERATION_4 102\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 101 && BOOST_PP_ITERATION_START_4 >= 101\n#    define BOOST_PP_ITERATION_4 101\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 100 && BOOST_PP_ITERATION_START_4 >= 100\n#    define BOOST_PP_ITERATION_4 100\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 99 && BOOST_PP_ITERATION_START_4 >= 99\n#    define BOOST_PP_ITERATION_4 99\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 98 && BOOST_PP_ITERATION_START_4 >= 98\n#    define BOOST_PP_ITERATION_4 98\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 97 && BOOST_PP_ITERATION_START_4 >= 97\n#    define BOOST_PP_ITERATION_4 97\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 96 && BOOST_PP_ITERATION_START_4 >= 96\n#    define BOOST_PP_ITERATION_4 96\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 95 && BOOST_PP_ITERATION_START_4 >= 95\n#    define BOOST_PP_ITERATION_4 95\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 94 && BOOST_PP_ITERATION_START_4 >= 94\n#    define BOOST_PP_ITERATION_4 94\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 93 && BOOST_PP_ITERATION_START_4 >= 93\n#    define BOOST_PP_ITERATION_4 93\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 92 && BOOST_PP_ITERATION_START_4 >= 92\n#    define BOOST_PP_ITERATION_4 92\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 91 && BOOST_PP_ITERATION_START_4 >= 91\n#    define BOOST_PP_ITERATION_4 91\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 90 && BOOST_PP_ITERATION_START_4 >= 90\n#    define BOOST_PP_ITERATION_4 90\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 89 && BOOST_PP_ITERATION_START_4 >= 89\n#    define BOOST_PP_ITERATION_4 89\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 88 && BOOST_PP_ITERATION_START_4 >= 88\n#    define BOOST_PP_ITERATION_4 88\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 87 && BOOST_PP_ITERATION_START_4 >= 87\n#    define BOOST_PP_ITERATION_4 87\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 86 && BOOST_PP_ITERATION_START_4 >= 86\n#    define BOOST_PP_ITERATION_4 86\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 85 && BOOST_PP_ITERATION_START_4 >= 85\n#    define BOOST_PP_ITERATION_4 85\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 84 && BOOST_PP_ITERATION_START_4 >= 84\n#    define BOOST_PP_ITERATION_4 84\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 83 && BOOST_PP_ITERATION_START_4 >= 83\n#    define BOOST_PP_ITERATION_4 83\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 82 && BOOST_PP_ITERATION_START_4 >= 82\n#    define BOOST_PP_ITERATION_4 82\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 81 && BOOST_PP_ITERATION_START_4 >= 81\n#    define BOOST_PP_ITERATION_4 81\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 80 && BOOST_PP_ITERATION_START_4 >= 80\n#    define BOOST_PP_ITERATION_4 80\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 79 && BOOST_PP_ITERATION_START_4 >= 79\n#    define BOOST_PP_ITERATION_4 79\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 78 && BOOST_PP_ITERATION_START_4 >= 78\n#    define BOOST_PP_ITERATION_4 78\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 77 && BOOST_PP_ITERATION_START_4 >= 77\n#    define BOOST_PP_ITERATION_4 77\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 76 && BOOST_PP_ITERATION_START_4 >= 76\n#    define BOOST_PP_ITERATION_4 76\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 75 && BOOST_PP_ITERATION_START_4 >= 75\n#    define BOOST_PP_ITERATION_4 75\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 74 && BOOST_PP_ITERATION_START_4 >= 74\n#    define BOOST_PP_ITERATION_4 74\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 73 && BOOST_PP_ITERATION_START_4 >= 73\n#    define BOOST_PP_ITERATION_4 73\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 72 && BOOST_PP_ITERATION_START_4 >= 72\n#    define BOOST_PP_ITERATION_4 72\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 71 && BOOST_PP_ITERATION_START_4 >= 71\n#    define BOOST_PP_ITERATION_4 71\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 70 && BOOST_PP_ITERATION_START_4 >= 70\n#    define BOOST_PP_ITERATION_4 70\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 69 && BOOST_PP_ITERATION_START_4 >= 69\n#    define BOOST_PP_ITERATION_4 69\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 68 && BOOST_PP_ITERATION_START_4 >= 68\n#    define BOOST_PP_ITERATION_4 68\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 67 && BOOST_PP_ITERATION_START_4 >= 67\n#    define BOOST_PP_ITERATION_4 67\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 66 && BOOST_PP_ITERATION_START_4 >= 66\n#    define BOOST_PP_ITERATION_4 66\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 65 && BOOST_PP_ITERATION_START_4 >= 65\n#    define BOOST_PP_ITERATION_4 65\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 64 && BOOST_PP_ITERATION_START_4 >= 64\n#    define BOOST_PP_ITERATION_4 64\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 63 && BOOST_PP_ITERATION_START_4 >= 63\n#    define BOOST_PP_ITERATION_4 63\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 62 && BOOST_PP_ITERATION_START_4 >= 62\n#    define BOOST_PP_ITERATION_4 62\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 61 && BOOST_PP_ITERATION_START_4 >= 61\n#    define BOOST_PP_ITERATION_4 61\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 60 && BOOST_PP_ITERATION_START_4 >= 60\n#    define BOOST_PP_ITERATION_4 60\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 59 && BOOST_PP_ITERATION_START_4 >= 59\n#    define BOOST_PP_ITERATION_4 59\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 58 && BOOST_PP_ITERATION_START_4 >= 58\n#    define BOOST_PP_ITERATION_4 58\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 57 && BOOST_PP_ITERATION_START_4 >= 57\n#    define BOOST_PP_ITERATION_4 57\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 56 && BOOST_PP_ITERATION_START_4 >= 56\n#    define BOOST_PP_ITERATION_4 56\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 55 && BOOST_PP_ITERATION_START_4 >= 55\n#    define BOOST_PP_ITERATION_4 55\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 54 && BOOST_PP_ITERATION_START_4 >= 54\n#    define BOOST_PP_ITERATION_4 54\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 53 && BOOST_PP_ITERATION_START_4 >= 53\n#    define BOOST_PP_ITERATION_4 53\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 52 && BOOST_PP_ITERATION_START_4 >= 52\n#    define BOOST_PP_ITERATION_4 52\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 51 && BOOST_PP_ITERATION_START_4 >= 51\n#    define BOOST_PP_ITERATION_4 51\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 50 && BOOST_PP_ITERATION_START_4 >= 50\n#    define BOOST_PP_ITERATION_4 50\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 49 && BOOST_PP_ITERATION_START_4 >= 49\n#    define BOOST_PP_ITERATION_4 49\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 48 && BOOST_PP_ITERATION_START_4 >= 48\n#    define BOOST_PP_ITERATION_4 48\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 47 && BOOST_PP_ITERATION_START_4 >= 47\n#    define BOOST_PP_ITERATION_4 47\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 46 && BOOST_PP_ITERATION_START_4 >= 46\n#    define BOOST_PP_ITERATION_4 46\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 45 && BOOST_PP_ITERATION_START_4 >= 45\n#    define BOOST_PP_ITERATION_4 45\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 44 && BOOST_PP_ITERATION_START_4 >= 44\n#    define BOOST_PP_ITERATION_4 44\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 43 && BOOST_PP_ITERATION_START_4 >= 43\n#    define BOOST_PP_ITERATION_4 43\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 42 && BOOST_PP_ITERATION_START_4 >= 42\n#    define BOOST_PP_ITERATION_4 42\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 41 && BOOST_PP_ITERATION_START_4 >= 41\n#    define BOOST_PP_ITERATION_4 41\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 40 && BOOST_PP_ITERATION_START_4 >= 40\n#    define BOOST_PP_ITERATION_4 40\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 39 && BOOST_PP_ITERATION_START_4 >= 39\n#    define BOOST_PP_ITERATION_4 39\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 38 && BOOST_PP_ITERATION_START_4 >= 38\n#    define BOOST_PP_ITERATION_4 38\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 37 && BOOST_PP_ITERATION_START_4 >= 37\n#    define BOOST_PP_ITERATION_4 37\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 36 && BOOST_PP_ITERATION_START_4 >= 36\n#    define BOOST_PP_ITERATION_4 36\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 35 && BOOST_PP_ITERATION_START_4 >= 35\n#    define BOOST_PP_ITERATION_4 35\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 34 && BOOST_PP_ITERATION_START_4 >= 34\n#    define BOOST_PP_ITERATION_4 34\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 33 && BOOST_PP_ITERATION_START_4 >= 33\n#    define BOOST_PP_ITERATION_4 33\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 32 && BOOST_PP_ITERATION_START_4 >= 32\n#    define BOOST_PP_ITERATION_4 32\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 31 && BOOST_PP_ITERATION_START_4 >= 31\n#    define BOOST_PP_ITERATION_4 31\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 30 && BOOST_PP_ITERATION_START_4 >= 30\n#    define BOOST_PP_ITERATION_4 30\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 29 && BOOST_PP_ITERATION_START_4 >= 29\n#    define BOOST_PP_ITERATION_4 29\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 28 && BOOST_PP_ITERATION_START_4 >= 28\n#    define BOOST_PP_ITERATION_4 28\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 27 && BOOST_PP_ITERATION_START_4 >= 27\n#    define BOOST_PP_ITERATION_4 27\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 26 && BOOST_PP_ITERATION_START_4 >= 26\n#    define BOOST_PP_ITERATION_4 26\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 25 && BOOST_PP_ITERATION_START_4 >= 25\n#    define BOOST_PP_ITERATION_4 25\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 24 && BOOST_PP_ITERATION_START_4 >= 24\n#    define BOOST_PP_ITERATION_4 24\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 23 && BOOST_PP_ITERATION_START_4 >= 23\n#    define BOOST_PP_ITERATION_4 23\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 22 && BOOST_PP_ITERATION_START_4 >= 22\n#    define BOOST_PP_ITERATION_4 22\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 21 && BOOST_PP_ITERATION_START_4 >= 21\n#    define BOOST_PP_ITERATION_4 21\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 20 && BOOST_PP_ITERATION_START_4 >= 20\n#    define BOOST_PP_ITERATION_4 20\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 19 && BOOST_PP_ITERATION_START_4 >= 19\n#    define BOOST_PP_ITERATION_4 19\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 18 && BOOST_PP_ITERATION_START_4 >= 18\n#    define BOOST_PP_ITERATION_4 18\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 17 && BOOST_PP_ITERATION_START_4 >= 17\n#    define BOOST_PP_ITERATION_4 17\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 16 && BOOST_PP_ITERATION_START_4 >= 16\n#    define BOOST_PP_ITERATION_4 16\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 15 && BOOST_PP_ITERATION_START_4 >= 15\n#    define BOOST_PP_ITERATION_4 15\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 14 && BOOST_PP_ITERATION_START_4 >= 14\n#    define BOOST_PP_ITERATION_4 14\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 13 && BOOST_PP_ITERATION_START_4 >= 13\n#    define BOOST_PP_ITERATION_4 13\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 12 && BOOST_PP_ITERATION_START_4 >= 12\n#    define BOOST_PP_ITERATION_4 12\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 11 && BOOST_PP_ITERATION_START_4 >= 11\n#    define BOOST_PP_ITERATION_4 11\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 10 && BOOST_PP_ITERATION_START_4 >= 10\n#    define BOOST_PP_ITERATION_4 10\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 9 && BOOST_PP_ITERATION_START_4 >= 9\n#    define BOOST_PP_ITERATION_4 9\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 8 && BOOST_PP_ITERATION_START_4 >= 8\n#    define BOOST_PP_ITERATION_4 8\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 7 && BOOST_PP_ITERATION_START_4 >= 7\n#    define BOOST_PP_ITERATION_4 7\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 6 && BOOST_PP_ITERATION_START_4 >= 6\n#    define BOOST_PP_ITERATION_4 6\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 5 && BOOST_PP_ITERATION_START_4 >= 5\n#    define BOOST_PP_ITERATION_4 5\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 4 && BOOST_PP_ITERATION_START_4 >= 4\n#    define BOOST_PP_ITERATION_4 4\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 3 && BOOST_PP_ITERATION_START_4 >= 3\n#    define BOOST_PP_ITERATION_4 3\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 2 && BOOST_PP_ITERATION_START_4 >= 2\n#    define BOOST_PP_ITERATION_4 2\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 1 && BOOST_PP_ITERATION_START_4 >= 1\n#    define BOOST_PP_ITERATION_4 1\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 0 && BOOST_PP_ITERATION_START_4 >= 0\n#    define BOOST_PP_ITERATION_4 0\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/iteration/detail/iter/reverse5.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# if BOOST_PP_ITERATION_FINISH_5 <= 256 && BOOST_PP_ITERATION_START_5 >= 256\n#    define BOOST_PP_ITERATION_5 256\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 255 && BOOST_PP_ITERATION_START_5 >= 255\n#    define BOOST_PP_ITERATION_5 255\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 254 && BOOST_PP_ITERATION_START_5 >= 254\n#    define BOOST_PP_ITERATION_5 254\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 253 && BOOST_PP_ITERATION_START_5 >= 253\n#    define BOOST_PP_ITERATION_5 253\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 252 && BOOST_PP_ITERATION_START_5 >= 252\n#    define BOOST_PP_ITERATION_5 252\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 251 && BOOST_PP_ITERATION_START_5 >= 251\n#    define BOOST_PP_ITERATION_5 251\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 250 && BOOST_PP_ITERATION_START_5 >= 250\n#    define BOOST_PP_ITERATION_5 250\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 249 && BOOST_PP_ITERATION_START_5 >= 249\n#    define BOOST_PP_ITERATION_5 249\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 248 && BOOST_PP_ITERATION_START_5 >= 248\n#    define BOOST_PP_ITERATION_5 248\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 247 && BOOST_PP_ITERATION_START_5 >= 247\n#    define BOOST_PP_ITERATION_5 247\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 246 && BOOST_PP_ITERATION_START_5 >= 246\n#    define BOOST_PP_ITERATION_5 246\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 245 && BOOST_PP_ITERATION_START_5 >= 245\n#    define BOOST_PP_ITERATION_5 245\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 244 && BOOST_PP_ITERATION_START_5 >= 244\n#    define BOOST_PP_ITERATION_5 244\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 243 && BOOST_PP_ITERATION_START_5 >= 243\n#    define BOOST_PP_ITERATION_5 243\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 242 && BOOST_PP_ITERATION_START_5 >= 242\n#    define BOOST_PP_ITERATION_5 242\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 241 && BOOST_PP_ITERATION_START_5 >= 241\n#    define BOOST_PP_ITERATION_5 241\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 240 && BOOST_PP_ITERATION_START_5 >= 240\n#    define BOOST_PP_ITERATION_5 240\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 239 && BOOST_PP_ITERATION_START_5 >= 239\n#    define BOOST_PP_ITERATION_5 239\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 238 && BOOST_PP_ITERATION_START_5 >= 238\n#    define BOOST_PP_ITERATION_5 238\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 237 && BOOST_PP_ITERATION_START_5 >= 237\n#    define BOOST_PP_ITERATION_5 237\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 236 && BOOST_PP_ITERATION_START_5 >= 236\n#    define BOOST_PP_ITERATION_5 236\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 235 && BOOST_PP_ITERATION_START_5 >= 235\n#    define BOOST_PP_ITERATION_5 235\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 234 && BOOST_PP_ITERATION_START_5 >= 234\n#    define BOOST_PP_ITERATION_5 234\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 233 && BOOST_PP_ITERATION_START_5 >= 233\n#    define BOOST_PP_ITERATION_5 233\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 232 && BOOST_PP_ITERATION_START_5 >= 232\n#    define BOOST_PP_ITERATION_5 232\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 231 && BOOST_PP_ITERATION_START_5 >= 231\n#    define BOOST_PP_ITERATION_5 231\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 230 && BOOST_PP_ITERATION_START_5 >= 230\n#    define BOOST_PP_ITERATION_5 230\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 229 && BOOST_PP_ITERATION_START_5 >= 229\n#    define BOOST_PP_ITERATION_5 229\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 228 && BOOST_PP_ITERATION_START_5 >= 228\n#    define BOOST_PP_ITERATION_5 228\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 227 && BOOST_PP_ITERATION_START_5 >= 227\n#    define BOOST_PP_ITERATION_5 227\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 226 && BOOST_PP_ITERATION_START_5 >= 226\n#    define BOOST_PP_ITERATION_5 226\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 225 && BOOST_PP_ITERATION_START_5 >= 225\n#    define BOOST_PP_ITERATION_5 225\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 224 && BOOST_PP_ITERATION_START_5 >= 224\n#    define BOOST_PP_ITERATION_5 224\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 223 && BOOST_PP_ITERATION_START_5 >= 223\n#    define BOOST_PP_ITERATION_5 223\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 222 && BOOST_PP_ITERATION_START_5 >= 222\n#    define BOOST_PP_ITERATION_5 222\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 221 && BOOST_PP_ITERATION_START_5 >= 221\n#    define BOOST_PP_ITERATION_5 221\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 220 && BOOST_PP_ITERATION_START_5 >= 220\n#    define BOOST_PP_ITERATION_5 220\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 219 && BOOST_PP_ITERATION_START_5 >= 219\n#    define BOOST_PP_ITERATION_5 219\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 218 && BOOST_PP_ITERATION_START_5 >= 218\n#    define BOOST_PP_ITERATION_5 218\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 217 && BOOST_PP_ITERATION_START_5 >= 217\n#    define BOOST_PP_ITERATION_5 217\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 216 && BOOST_PP_ITERATION_START_5 >= 216\n#    define BOOST_PP_ITERATION_5 216\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 215 && BOOST_PP_ITERATION_START_5 >= 215\n#    define BOOST_PP_ITERATION_5 215\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 214 && BOOST_PP_ITERATION_START_5 >= 214\n#    define BOOST_PP_ITERATION_5 214\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 213 && BOOST_PP_ITERATION_START_5 >= 213\n#    define BOOST_PP_ITERATION_5 213\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 212 && BOOST_PP_ITERATION_START_5 >= 212\n#    define BOOST_PP_ITERATION_5 212\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 211 && BOOST_PP_ITERATION_START_5 >= 211\n#    define BOOST_PP_ITERATION_5 211\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 210 && BOOST_PP_ITERATION_START_5 >= 210\n#    define BOOST_PP_ITERATION_5 210\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 209 && BOOST_PP_ITERATION_START_5 >= 209\n#    define BOOST_PP_ITERATION_5 209\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 208 && BOOST_PP_ITERATION_START_5 >= 208\n#    define BOOST_PP_ITERATION_5 208\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 207 && BOOST_PP_ITERATION_START_5 >= 207\n#    define BOOST_PP_ITERATION_5 207\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 206 && BOOST_PP_ITERATION_START_5 >= 206\n#    define BOOST_PP_ITERATION_5 206\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 205 && BOOST_PP_ITERATION_START_5 >= 205\n#    define BOOST_PP_ITERATION_5 205\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 204 && BOOST_PP_ITERATION_START_5 >= 204\n#    define BOOST_PP_ITERATION_5 204\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 203 && BOOST_PP_ITERATION_START_5 >= 203\n#    define BOOST_PP_ITERATION_5 203\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 202 && BOOST_PP_ITERATION_START_5 >= 202\n#    define BOOST_PP_ITERATION_5 202\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 201 && BOOST_PP_ITERATION_START_5 >= 201\n#    define BOOST_PP_ITERATION_5 201\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 200 && BOOST_PP_ITERATION_START_5 >= 200\n#    define BOOST_PP_ITERATION_5 200\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 199 && BOOST_PP_ITERATION_START_5 >= 199\n#    define BOOST_PP_ITERATION_5 199\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 198 && BOOST_PP_ITERATION_START_5 >= 198\n#    define BOOST_PP_ITERATION_5 198\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 197 && BOOST_PP_ITERATION_START_5 >= 197\n#    define BOOST_PP_ITERATION_5 197\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 196 && BOOST_PP_ITERATION_START_5 >= 196\n#    define BOOST_PP_ITERATION_5 196\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 195 && BOOST_PP_ITERATION_START_5 >= 195\n#    define BOOST_PP_ITERATION_5 195\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 194 && BOOST_PP_ITERATION_START_5 >= 194\n#    define BOOST_PP_ITERATION_5 194\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 193 && BOOST_PP_ITERATION_START_5 >= 193\n#    define BOOST_PP_ITERATION_5 193\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 192 && BOOST_PP_ITERATION_START_5 >= 192\n#    define BOOST_PP_ITERATION_5 192\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 191 && BOOST_PP_ITERATION_START_5 >= 191\n#    define BOOST_PP_ITERATION_5 191\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 190 && BOOST_PP_ITERATION_START_5 >= 190\n#    define BOOST_PP_ITERATION_5 190\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 189 && BOOST_PP_ITERATION_START_5 >= 189\n#    define BOOST_PP_ITERATION_5 189\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 188 && BOOST_PP_ITERATION_START_5 >= 188\n#    define BOOST_PP_ITERATION_5 188\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 187 && BOOST_PP_ITERATION_START_5 >= 187\n#    define BOOST_PP_ITERATION_5 187\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 186 && BOOST_PP_ITERATION_START_5 >= 186\n#    define BOOST_PP_ITERATION_5 186\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 185 && BOOST_PP_ITERATION_START_5 >= 185\n#    define BOOST_PP_ITERATION_5 185\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 184 && BOOST_PP_ITERATION_START_5 >= 184\n#    define BOOST_PP_ITERATION_5 184\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 183 && BOOST_PP_ITERATION_START_5 >= 183\n#    define BOOST_PP_ITERATION_5 183\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 182 && BOOST_PP_ITERATION_START_5 >= 182\n#    define BOOST_PP_ITERATION_5 182\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 181 && BOOST_PP_ITERATION_START_5 >= 181\n#    define BOOST_PP_ITERATION_5 181\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 180 && BOOST_PP_ITERATION_START_5 >= 180\n#    define BOOST_PP_ITERATION_5 180\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 179 && BOOST_PP_ITERATION_START_5 >= 179\n#    define BOOST_PP_ITERATION_5 179\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 178 && BOOST_PP_ITERATION_START_5 >= 178\n#    define BOOST_PP_ITERATION_5 178\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 177 && BOOST_PP_ITERATION_START_5 >= 177\n#    define BOOST_PP_ITERATION_5 177\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 176 && BOOST_PP_ITERATION_START_5 >= 176\n#    define BOOST_PP_ITERATION_5 176\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 175 && BOOST_PP_ITERATION_START_5 >= 175\n#    define BOOST_PP_ITERATION_5 175\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 174 && BOOST_PP_ITERATION_START_5 >= 174\n#    define BOOST_PP_ITERATION_5 174\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 173 && BOOST_PP_ITERATION_START_5 >= 173\n#    define BOOST_PP_ITERATION_5 173\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 172 && BOOST_PP_ITERATION_START_5 >= 172\n#    define BOOST_PP_ITERATION_5 172\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 171 && BOOST_PP_ITERATION_START_5 >= 171\n#    define BOOST_PP_ITERATION_5 171\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 170 && BOOST_PP_ITERATION_START_5 >= 170\n#    define BOOST_PP_ITERATION_5 170\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 169 && BOOST_PP_ITERATION_START_5 >= 169\n#    define BOOST_PP_ITERATION_5 169\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 168 && BOOST_PP_ITERATION_START_5 >= 168\n#    define BOOST_PP_ITERATION_5 168\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 167 && BOOST_PP_ITERATION_START_5 >= 167\n#    define BOOST_PP_ITERATION_5 167\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 166 && BOOST_PP_ITERATION_START_5 >= 166\n#    define BOOST_PP_ITERATION_5 166\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 165 && BOOST_PP_ITERATION_START_5 >= 165\n#    define BOOST_PP_ITERATION_5 165\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 164 && BOOST_PP_ITERATION_START_5 >= 164\n#    define BOOST_PP_ITERATION_5 164\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 163 && BOOST_PP_ITERATION_START_5 >= 163\n#    define BOOST_PP_ITERATION_5 163\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 162 && BOOST_PP_ITERATION_START_5 >= 162\n#    define BOOST_PP_ITERATION_5 162\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 161 && BOOST_PP_ITERATION_START_5 >= 161\n#    define BOOST_PP_ITERATION_5 161\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 160 && BOOST_PP_ITERATION_START_5 >= 160\n#    define BOOST_PP_ITERATION_5 160\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 159 && BOOST_PP_ITERATION_START_5 >= 159\n#    define BOOST_PP_ITERATION_5 159\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 158 && BOOST_PP_ITERATION_START_5 >= 158\n#    define BOOST_PP_ITERATION_5 158\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 157 && BOOST_PP_ITERATION_START_5 >= 157\n#    define BOOST_PP_ITERATION_5 157\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 156 && BOOST_PP_ITERATION_START_5 >= 156\n#    define BOOST_PP_ITERATION_5 156\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 155 && BOOST_PP_ITERATION_START_5 >= 155\n#    define BOOST_PP_ITERATION_5 155\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 154 && BOOST_PP_ITERATION_START_5 >= 154\n#    define BOOST_PP_ITERATION_5 154\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 153 && BOOST_PP_ITERATION_START_5 >= 153\n#    define BOOST_PP_ITERATION_5 153\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 152 && BOOST_PP_ITERATION_START_5 >= 152\n#    define BOOST_PP_ITERATION_5 152\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 151 && BOOST_PP_ITERATION_START_5 >= 151\n#    define BOOST_PP_ITERATION_5 151\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 150 && BOOST_PP_ITERATION_START_5 >= 150\n#    define BOOST_PP_ITERATION_5 150\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 149 && BOOST_PP_ITERATION_START_5 >= 149\n#    define BOOST_PP_ITERATION_5 149\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 148 && BOOST_PP_ITERATION_START_5 >= 148\n#    define BOOST_PP_ITERATION_5 148\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 147 && BOOST_PP_ITERATION_START_5 >= 147\n#    define BOOST_PP_ITERATION_5 147\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 146 && BOOST_PP_ITERATION_START_5 >= 146\n#    define BOOST_PP_ITERATION_5 146\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 145 && BOOST_PP_ITERATION_START_5 >= 145\n#    define BOOST_PP_ITERATION_5 145\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 144 && BOOST_PP_ITERATION_START_5 >= 144\n#    define BOOST_PP_ITERATION_5 144\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 143 && BOOST_PP_ITERATION_START_5 >= 143\n#    define BOOST_PP_ITERATION_5 143\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 142 && BOOST_PP_ITERATION_START_5 >= 142\n#    define BOOST_PP_ITERATION_5 142\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 141 && BOOST_PP_ITERATION_START_5 >= 141\n#    define BOOST_PP_ITERATION_5 141\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 140 && BOOST_PP_ITERATION_START_5 >= 140\n#    define BOOST_PP_ITERATION_5 140\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 139 && BOOST_PP_ITERATION_START_5 >= 139\n#    define BOOST_PP_ITERATION_5 139\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 138 && BOOST_PP_ITERATION_START_5 >= 138\n#    define BOOST_PP_ITERATION_5 138\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 137 && BOOST_PP_ITERATION_START_5 >= 137\n#    define BOOST_PP_ITERATION_5 137\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 136 && BOOST_PP_ITERATION_START_5 >= 136\n#    define BOOST_PP_ITERATION_5 136\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 135 && BOOST_PP_ITERATION_START_5 >= 135\n#    define BOOST_PP_ITERATION_5 135\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 134 && BOOST_PP_ITERATION_START_5 >= 134\n#    define BOOST_PP_ITERATION_5 134\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 133 && BOOST_PP_ITERATION_START_5 >= 133\n#    define BOOST_PP_ITERATION_5 133\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 132 && BOOST_PP_ITERATION_START_5 >= 132\n#    define BOOST_PP_ITERATION_5 132\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 131 && BOOST_PP_ITERATION_START_5 >= 131\n#    define BOOST_PP_ITERATION_5 131\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 130 && BOOST_PP_ITERATION_START_5 >= 130\n#    define BOOST_PP_ITERATION_5 130\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 129 && BOOST_PP_ITERATION_START_5 >= 129\n#    define BOOST_PP_ITERATION_5 129\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 128 && BOOST_PP_ITERATION_START_5 >= 128\n#    define BOOST_PP_ITERATION_5 128\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 127 && BOOST_PP_ITERATION_START_5 >= 127\n#    define BOOST_PP_ITERATION_5 127\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 126 && BOOST_PP_ITERATION_START_5 >= 126\n#    define BOOST_PP_ITERATION_5 126\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 125 && BOOST_PP_ITERATION_START_5 >= 125\n#    define BOOST_PP_ITERATION_5 125\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 124 && BOOST_PP_ITERATION_START_5 >= 124\n#    define BOOST_PP_ITERATION_5 124\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 123 && BOOST_PP_ITERATION_START_5 >= 123\n#    define BOOST_PP_ITERATION_5 123\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 122 && BOOST_PP_ITERATION_START_5 >= 122\n#    define BOOST_PP_ITERATION_5 122\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 121 && BOOST_PP_ITERATION_START_5 >= 121\n#    define BOOST_PP_ITERATION_5 121\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 120 && BOOST_PP_ITERATION_START_5 >= 120\n#    define BOOST_PP_ITERATION_5 120\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 119 && BOOST_PP_ITERATION_START_5 >= 119\n#    define BOOST_PP_ITERATION_5 119\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 118 && BOOST_PP_ITERATION_START_5 >= 118\n#    define BOOST_PP_ITERATION_5 118\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 117 && BOOST_PP_ITERATION_START_5 >= 117\n#    define BOOST_PP_ITERATION_5 117\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 116 && BOOST_PP_ITERATION_START_5 >= 116\n#    define BOOST_PP_ITERATION_5 116\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 115 && BOOST_PP_ITERATION_START_5 >= 115\n#    define BOOST_PP_ITERATION_5 115\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 114 && BOOST_PP_ITERATION_START_5 >= 114\n#    define BOOST_PP_ITERATION_5 114\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 113 && BOOST_PP_ITERATION_START_5 >= 113\n#    define BOOST_PP_ITERATION_5 113\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 112 && BOOST_PP_ITERATION_START_5 >= 112\n#    define BOOST_PP_ITERATION_5 112\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 111 && BOOST_PP_ITERATION_START_5 >= 111\n#    define BOOST_PP_ITERATION_5 111\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 110 && BOOST_PP_ITERATION_START_5 >= 110\n#    define BOOST_PP_ITERATION_5 110\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 109 && BOOST_PP_ITERATION_START_5 >= 109\n#    define BOOST_PP_ITERATION_5 109\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 108 && BOOST_PP_ITERATION_START_5 >= 108\n#    define BOOST_PP_ITERATION_5 108\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 107 && BOOST_PP_ITERATION_START_5 >= 107\n#    define BOOST_PP_ITERATION_5 107\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 106 && BOOST_PP_ITERATION_START_5 >= 106\n#    define BOOST_PP_ITERATION_5 106\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 105 && BOOST_PP_ITERATION_START_5 >= 105\n#    define BOOST_PP_ITERATION_5 105\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 104 && BOOST_PP_ITERATION_START_5 >= 104\n#    define BOOST_PP_ITERATION_5 104\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 103 && BOOST_PP_ITERATION_START_5 >= 103\n#    define BOOST_PP_ITERATION_5 103\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 102 && BOOST_PP_ITERATION_START_5 >= 102\n#    define BOOST_PP_ITERATION_5 102\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 101 && BOOST_PP_ITERATION_START_5 >= 101\n#    define BOOST_PP_ITERATION_5 101\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 100 && BOOST_PP_ITERATION_START_5 >= 100\n#    define BOOST_PP_ITERATION_5 100\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 99 && BOOST_PP_ITERATION_START_5 >= 99\n#    define BOOST_PP_ITERATION_5 99\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 98 && BOOST_PP_ITERATION_START_5 >= 98\n#    define BOOST_PP_ITERATION_5 98\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 97 && BOOST_PP_ITERATION_START_5 >= 97\n#    define BOOST_PP_ITERATION_5 97\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 96 && BOOST_PP_ITERATION_START_5 >= 96\n#    define BOOST_PP_ITERATION_5 96\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 95 && BOOST_PP_ITERATION_START_5 >= 95\n#    define BOOST_PP_ITERATION_5 95\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 94 && BOOST_PP_ITERATION_START_5 >= 94\n#    define BOOST_PP_ITERATION_5 94\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 93 && BOOST_PP_ITERATION_START_5 >= 93\n#    define BOOST_PP_ITERATION_5 93\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 92 && BOOST_PP_ITERATION_START_5 >= 92\n#    define BOOST_PP_ITERATION_5 92\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 91 && BOOST_PP_ITERATION_START_5 >= 91\n#    define BOOST_PP_ITERATION_5 91\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 90 && BOOST_PP_ITERATION_START_5 >= 90\n#    define BOOST_PP_ITERATION_5 90\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 89 && BOOST_PP_ITERATION_START_5 >= 89\n#    define BOOST_PP_ITERATION_5 89\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 88 && BOOST_PP_ITERATION_START_5 >= 88\n#    define BOOST_PP_ITERATION_5 88\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 87 && BOOST_PP_ITERATION_START_5 >= 87\n#    define BOOST_PP_ITERATION_5 87\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 86 && BOOST_PP_ITERATION_START_5 >= 86\n#    define BOOST_PP_ITERATION_5 86\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 85 && BOOST_PP_ITERATION_START_5 >= 85\n#    define BOOST_PP_ITERATION_5 85\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 84 && BOOST_PP_ITERATION_START_5 >= 84\n#    define BOOST_PP_ITERATION_5 84\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 83 && BOOST_PP_ITERATION_START_5 >= 83\n#    define BOOST_PP_ITERATION_5 83\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 82 && BOOST_PP_ITERATION_START_5 >= 82\n#    define BOOST_PP_ITERATION_5 82\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 81 && BOOST_PP_ITERATION_START_5 >= 81\n#    define BOOST_PP_ITERATION_5 81\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 80 && BOOST_PP_ITERATION_START_5 >= 80\n#    define BOOST_PP_ITERATION_5 80\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 79 && BOOST_PP_ITERATION_START_5 >= 79\n#    define BOOST_PP_ITERATION_5 79\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 78 && BOOST_PP_ITERATION_START_5 >= 78\n#    define BOOST_PP_ITERATION_5 78\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 77 && BOOST_PP_ITERATION_START_5 >= 77\n#    define BOOST_PP_ITERATION_5 77\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 76 && BOOST_PP_ITERATION_START_5 >= 76\n#    define BOOST_PP_ITERATION_5 76\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 75 && BOOST_PP_ITERATION_START_5 >= 75\n#    define BOOST_PP_ITERATION_5 75\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 74 && BOOST_PP_ITERATION_START_5 >= 74\n#    define BOOST_PP_ITERATION_5 74\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 73 && BOOST_PP_ITERATION_START_5 >= 73\n#    define BOOST_PP_ITERATION_5 73\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 72 && BOOST_PP_ITERATION_START_5 >= 72\n#    define BOOST_PP_ITERATION_5 72\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 71 && BOOST_PP_ITERATION_START_5 >= 71\n#    define BOOST_PP_ITERATION_5 71\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 70 && BOOST_PP_ITERATION_START_5 >= 70\n#    define BOOST_PP_ITERATION_5 70\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 69 && BOOST_PP_ITERATION_START_5 >= 69\n#    define BOOST_PP_ITERATION_5 69\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 68 && BOOST_PP_ITERATION_START_5 >= 68\n#    define BOOST_PP_ITERATION_5 68\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 67 && BOOST_PP_ITERATION_START_5 >= 67\n#    define BOOST_PP_ITERATION_5 67\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 66 && BOOST_PP_ITERATION_START_5 >= 66\n#    define BOOST_PP_ITERATION_5 66\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 65 && BOOST_PP_ITERATION_START_5 >= 65\n#    define BOOST_PP_ITERATION_5 65\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 64 && BOOST_PP_ITERATION_START_5 >= 64\n#    define BOOST_PP_ITERATION_5 64\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 63 && BOOST_PP_ITERATION_START_5 >= 63\n#    define BOOST_PP_ITERATION_5 63\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 62 && BOOST_PP_ITERATION_START_5 >= 62\n#    define BOOST_PP_ITERATION_5 62\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 61 && BOOST_PP_ITERATION_START_5 >= 61\n#    define BOOST_PP_ITERATION_5 61\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 60 && BOOST_PP_ITERATION_START_5 >= 60\n#    define BOOST_PP_ITERATION_5 60\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 59 && BOOST_PP_ITERATION_START_5 >= 59\n#    define BOOST_PP_ITERATION_5 59\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 58 && BOOST_PP_ITERATION_START_5 >= 58\n#    define BOOST_PP_ITERATION_5 58\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 57 && BOOST_PP_ITERATION_START_5 >= 57\n#    define BOOST_PP_ITERATION_5 57\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 56 && BOOST_PP_ITERATION_START_5 >= 56\n#    define BOOST_PP_ITERATION_5 56\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 55 && BOOST_PP_ITERATION_START_5 >= 55\n#    define BOOST_PP_ITERATION_5 55\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 54 && BOOST_PP_ITERATION_START_5 >= 54\n#    define BOOST_PP_ITERATION_5 54\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 53 && BOOST_PP_ITERATION_START_5 >= 53\n#    define BOOST_PP_ITERATION_5 53\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 52 && BOOST_PP_ITERATION_START_5 >= 52\n#    define BOOST_PP_ITERATION_5 52\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 51 && BOOST_PP_ITERATION_START_5 >= 51\n#    define BOOST_PP_ITERATION_5 51\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 50 && BOOST_PP_ITERATION_START_5 >= 50\n#    define BOOST_PP_ITERATION_5 50\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 49 && BOOST_PP_ITERATION_START_5 >= 49\n#    define BOOST_PP_ITERATION_5 49\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 48 && BOOST_PP_ITERATION_START_5 >= 48\n#    define BOOST_PP_ITERATION_5 48\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 47 && BOOST_PP_ITERATION_START_5 >= 47\n#    define BOOST_PP_ITERATION_5 47\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 46 && BOOST_PP_ITERATION_START_5 >= 46\n#    define BOOST_PP_ITERATION_5 46\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 45 && BOOST_PP_ITERATION_START_5 >= 45\n#    define BOOST_PP_ITERATION_5 45\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 44 && BOOST_PP_ITERATION_START_5 >= 44\n#    define BOOST_PP_ITERATION_5 44\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 43 && BOOST_PP_ITERATION_START_5 >= 43\n#    define BOOST_PP_ITERATION_5 43\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 42 && BOOST_PP_ITERATION_START_5 >= 42\n#    define BOOST_PP_ITERATION_5 42\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 41 && BOOST_PP_ITERATION_START_5 >= 41\n#    define BOOST_PP_ITERATION_5 41\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 40 && BOOST_PP_ITERATION_START_5 >= 40\n#    define BOOST_PP_ITERATION_5 40\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 39 && BOOST_PP_ITERATION_START_5 >= 39\n#    define BOOST_PP_ITERATION_5 39\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 38 && BOOST_PP_ITERATION_START_5 >= 38\n#    define BOOST_PP_ITERATION_5 38\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 37 && BOOST_PP_ITERATION_START_5 >= 37\n#    define BOOST_PP_ITERATION_5 37\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 36 && BOOST_PP_ITERATION_START_5 >= 36\n#    define BOOST_PP_ITERATION_5 36\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 35 && BOOST_PP_ITERATION_START_5 >= 35\n#    define BOOST_PP_ITERATION_5 35\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 34 && BOOST_PP_ITERATION_START_5 >= 34\n#    define BOOST_PP_ITERATION_5 34\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 33 && BOOST_PP_ITERATION_START_5 >= 33\n#    define BOOST_PP_ITERATION_5 33\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 32 && BOOST_PP_ITERATION_START_5 >= 32\n#    define BOOST_PP_ITERATION_5 32\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 31 && BOOST_PP_ITERATION_START_5 >= 31\n#    define BOOST_PP_ITERATION_5 31\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 30 && BOOST_PP_ITERATION_START_5 >= 30\n#    define BOOST_PP_ITERATION_5 30\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 29 && BOOST_PP_ITERATION_START_5 >= 29\n#    define BOOST_PP_ITERATION_5 29\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 28 && BOOST_PP_ITERATION_START_5 >= 28\n#    define BOOST_PP_ITERATION_5 28\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 27 && BOOST_PP_ITERATION_START_5 >= 27\n#    define BOOST_PP_ITERATION_5 27\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 26 && BOOST_PP_ITERATION_START_5 >= 26\n#    define BOOST_PP_ITERATION_5 26\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 25 && BOOST_PP_ITERATION_START_5 >= 25\n#    define BOOST_PP_ITERATION_5 25\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 24 && BOOST_PP_ITERATION_START_5 >= 24\n#    define BOOST_PP_ITERATION_5 24\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 23 && BOOST_PP_ITERATION_START_5 >= 23\n#    define BOOST_PP_ITERATION_5 23\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 22 && BOOST_PP_ITERATION_START_5 >= 22\n#    define BOOST_PP_ITERATION_5 22\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 21 && BOOST_PP_ITERATION_START_5 >= 21\n#    define BOOST_PP_ITERATION_5 21\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 20 && BOOST_PP_ITERATION_START_5 >= 20\n#    define BOOST_PP_ITERATION_5 20\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 19 && BOOST_PP_ITERATION_START_5 >= 19\n#    define BOOST_PP_ITERATION_5 19\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 18 && BOOST_PP_ITERATION_START_5 >= 18\n#    define BOOST_PP_ITERATION_5 18\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 17 && BOOST_PP_ITERATION_START_5 >= 17\n#    define BOOST_PP_ITERATION_5 17\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 16 && BOOST_PP_ITERATION_START_5 >= 16\n#    define BOOST_PP_ITERATION_5 16\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 15 && BOOST_PP_ITERATION_START_5 >= 15\n#    define BOOST_PP_ITERATION_5 15\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 14 && BOOST_PP_ITERATION_START_5 >= 14\n#    define BOOST_PP_ITERATION_5 14\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 13 && BOOST_PP_ITERATION_START_5 >= 13\n#    define BOOST_PP_ITERATION_5 13\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 12 && BOOST_PP_ITERATION_START_5 >= 12\n#    define BOOST_PP_ITERATION_5 12\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 11 && BOOST_PP_ITERATION_START_5 >= 11\n#    define BOOST_PP_ITERATION_5 11\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 10 && BOOST_PP_ITERATION_START_5 >= 10\n#    define BOOST_PP_ITERATION_5 10\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 9 && BOOST_PP_ITERATION_START_5 >= 9\n#    define BOOST_PP_ITERATION_5 9\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 8 && BOOST_PP_ITERATION_START_5 >= 8\n#    define BOOST_PP_ITERATION_5 8\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 7 && BOOST_PP_ITERATION_START_5 >= 7\n#    define BOOST_PP_ITERATION_5 7\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 6 && BOOST_PP_ITERATION_START_5 >= 6\n#    define BOOST_PP_ITERATION_5 6\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 5 && BOOST_PP_ITERATION_START_5 >= 5\n#    define BOOST_PP_ITERATION_5 5\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 4 && BOOST_PP_ITERATION_START_5 >= 4\n#    define BOOST_PP_ITERATION_5 4\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 3 && BOOST_PP_ITERATION_START_5 >= 3\n#    define BOOST_PP_ITERATION_5 3\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 2 && BOOST_PP_ITERATION_START_5 >= 2\n#    define BOOST_PP_ITERATION_5 2\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 1 && BOOST_PP_ITERATION_START_5 >= 1\n#    define BOOST_PP_ITERATION_5 1\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 0 && BOOST_PP_ITERATION_START_5 >= 0\n#    define BOOST_PP_ITERATION_5 0\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/iteration/detail/local.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# if !defined(BOOST_PP_LOCAL_LIMITS)\n#    error BOOST_PP_ERROR:  local iteration boundaries are not defined\n# elif !defined(BOOST_PP_LOCAL_MACRO)\n#    error BOOST_PP_ERROR:  local iteration target macro is not defined\n# else\n#    if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#        define BOOST_PP_LOCAL_S BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_LOCAL_LIMITS)\n#        define BOOST_PP_LOCAL_F BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_LOCAL_LIMITS)\n#    else\n#        define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_LOCAL_LIMITS)\n#        include <boost/preprocessor/iteration/detail/start.hpp>\n#        define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_LOCAL_LIMITS)\n#        include <boost/preprocessor/iteration/detail/finish.hpp>\n#        define BOOST_PP_LOCAL_S BOOST_PP_LOCAL_SE()\n#        define BOOST_PP_LOCAL_F BOOST_PP_LOCAL_FE()\n#    endif\n# endif\n#\n# if (BOOST_PP_LOCAL_S) > (BOOST_PP_LOCAL_F)\n#    include <boost/preprocessor/iteration/detail/rlocal.hpp>\n# else\n#    if BOOST_PP_LOCAL_C(0)\n        BOOST_PP_LOCAL_MACRO(0)\n#    endif\n#    if BOOST_PP_LOCAL_C(1)\n        BOOST_PP_LOCAL_MACRO(1)\n#    endif\n#    if BOOST_PP_LOCAL_C(2)\n        BOOST_PP_LOCAL_MACRO(2)\n#    endif\n#    if BOOST_PP_LOCAL_C(3)\n        BOOST_PP_LOCAL_MACRO(3)\n#    endif\n#    if BOOST_PP_LOCAL_C(4)\n        BOOST_PP_LOCAL_MACRO(4)\n#    endif\n#    if BOOST_PP_LOCAL_C(5)\n        BOOST_PP_LOCAL_MACRO(5)\n#    endif\n#    if BOOST_PP_LOCAL_C(6)\n        BOOST_PP_LOCAL_MACRO(6)\n#    endif\n#    if BOOST_PP_LOCAL_C(7)\n        BOOST_PP_LOCAL_MACRO(7)\n#    endif\n#    if BOOST_PP_LOCAL_C(8)\n        BOOST_PP_LOCAL_MACRO(8)\n#    endif\n#    if BOOST_PP_LOCAL_C(9)\n        BOOST_PP_LOCAL_MACRO(9)\n#    endif\n#    if BOOST_PP_LOCAL_C(10)\n        BOOST_PP_LOCAL_MACRO(10)\n#    endif\n#    if BOOST_PP_LOCAL_C(11)\n        BOOST_PP_LOCAL_MACRO(11)\n#    endif\n#    if BOOST_PP_LOCAL_C(12)\n        BOOST_PP_LOCAL_MACRO(12)\n#    endif\n#    if BOOST_PP_LOCAL_C(13)\n        BOOST_PP_LOCAL_MACRO(13)\n#    endif\n#    if BOOST_PP_LOCAL_C(14)\n        BOOST_PP_LOCAL_MACRO(14)\n#    endif\n#    if BOOST_PP_LOCAL_C(15)\n        BOOST_PP_LOCAL_MACRO(15)\n#    endif\n#    if BOOST_PP_LOCAL_C(16)\n        BOOST_PP_LOCAL_MACRO(16)\n#    endif\n#    if BOOST_PP_LOCAL_C(17)\n        BOOST_PP_LOCAL_MACRO(17)\n#    endif\n#    if BOOST_PP_LOCAL_C(18)\n        BOOST_PP_LOCAL_MACRO(18)\n#    endif\n#    if BOOST_PP_LOCAL_C(19)\n        BOOST_PP_LOCAL_MACRO(19)\n#    endif\n#    if BOOST_PP_LOCAL_C(20)\n        BOOST_PP_LOCAL_MACRO(20)\n#    endif\n#    if BOOST_PP_LOCAL_C(21)\n        BOOST_PP_LOCAL_MACRO(21)\n#    endif\n#    if BOOST_PP_LOCAL_C(22)\n        BOOST_PP_LOCAL_MACRO(22)\n#    endif\n#    if BOOST_PP_LOCAL_C(23)\n        BOOST_PP_LOCAL_MACRO(23)\n#    endif\n#    if BOOST_PP_LOCAL_C(24)\n        BOOST_PP_LOCAL_MACRO(24)\n#    endif\n#    if BOOST_PP_LOCAL_C(25)\n        BOOST_PP_LOCAL_MACRO(25)\n#    endif\n#    if BOOST_PP_LOCAL_C(26)\n        BOOST_PP_LOCAL_MACRO(26)\n#    endif\n#    if BOOST_PP_LOCAL_C(27)\n        BOOST_PP_LOCAL_MACRO(27)\n#    endif\n#    if BOOST_PP_LOCAL_C(28)\n        BOOST_PP_LOCAL_MACRO(28)\n#    endif\n#    if BOOST_PP_LOCAL_C(29)\n        BOOST_PP_LOCAL_MACRO(29)\n#    endif\n#    if BOOST_PP_LOCAL_C(30)\n        BOOST_PP_LOCAL_MACRO(30)\n#    endif\n#    if BOOST_PP_LOCAL_C(31)\n        BOOST_PP_LOCAL_MACRO(31)\n#    endif\n#    if BOOST_PP_LOCAL_C(32)\n        BOOST_PP_LOCAL_MACRO(32)\n#    endif\n#    if BOOST_PP_LOCAL_C(33)\n        BOOST_PP_LOCAL_MACRO(33)\n#    endif\n#    if BOOST_PP_LOCAL_C(34)\n        BOOST_PP_LOCAL_MACRO(34)\n#    endif\n#    if BOOST_PP_LOCAL_C(35)\n        BOOST_PP_LOCAL_MACRO(35)\n#    endif\n#    if BOOST_PP_LOCAL_C(36)\n        BOOST_PP_LOCAL_MACRO(36)\n#    endif\n#    if BOOST_PP_LOCAL_C(37)\n        BOOST_PP_LOCAL_MACRO(37)\n#    endif\n#    if BOOST_PP_LOCAL_C(38)\n        BOOST_PP_LOCAL_MACRO(38)\n#    endif\n#    if BOOST_PP_LOCAL_C(39)\n        BOOST_PP_LOCAL_MACRO(39)\n#    endif\n#    if BOOST_PP_LOCAL_C(40)\n        BOOST_PP_LOCAL_MACRO(40)\n#    endif\n#    if BOOST_PP_LOCAL_C(41)\n        BOOST_PP_LOCAL_MACRO(41)\n#    endif\n#    if BOOST_PP_LOCAL_C(42)\n        BOOST_PP_LOCAL_MACRO(42)\n#    endif\n#    if BOOST_PP_LOCAL_C(43)\n        BOOST_PP_LOCAL_MACRO(43)\n#    endif\n#    if BOOST_PP_LOCAL_C(44)\n        BOOST_PP_LOCAL_MACRO(44)\n#    endif\n#    if BOOST_PP_LOCAL_C(45)\n        BOOST_PP_LOCAL_MACRO(45)\n#    endif\n#    if BOOST_PP_LOCAL_C(46)\n        BOOST_PP_LOCAL_MACRO(46)\n#    endif\n#    if BOOST_PP_LOCAL_C(47)\n        BOOST_PP_LOCAL_MACRO(47)\n#    endif\n#    if BOOST_PP_LOCAL_C(48)\n        BOOST_PP_LOCAL_MACRO(48)\n#    endif\n#    if BOOST_PP_LOCAL_C(49)\n        BOOST_PP_LOCAL_MACRO(49)\n#    endif\n#    if BOOST_PP_LOCAL_C(50)\n        BOOST_PP_LOCAL_MACRO(50)\n#    endif\n#    if BOOST_PP_LOCAL_C(51)\n        BOOST_PP_LOCAL_MACRO(51)\n#    endif\n#    if BOOST_PP_LOCAL_C(52)\n        BOOST_PP_LOCAL_MACRO(52)\n#    endif\n#    if BOOST_PP_LOCAL_C(53)\n        BOOST_PP_LOCAL_MACRO(53)\n#    endif\n#    if BOOST_PP_LOCAL_C(54)\n        BOOST_PP_LOCAL_MACRO(54)\n#    endif\n#    if BOOST_PP_LOCAL_C(55)\n        BOOST_PP_LOCAL_MACRO(55)\n#    endif\n#    if BOOST_PP_LOCAL_C(56)\n        BOOST_PP_LOCAL_MACRO(56)\n#    endif\n#    if BOOST_PP_LOCAL_C(57)\n        BOOST_PP_LOCAL_MACRO(57)\n#    endif\n#    if BOOST_PP_LOCAL_C(58)\n        BOOST_PP_LOCAL_MACRO(58)\n#    endif\n#    if BOOST_PP_LOCAL_C(59)\n        BOOST_PP_LOCAL_MACRO(59)\n#    endif\n#    if BOOST_PP_LOCAL_C(60)\n        BOOST_PP_LOCAL_MACRO(60)\n#    endif\n#    if BOOST_PP_LOCAL_C(61)\n        BOOST_PP_LOCAL_MACRO(61)\n#    endif\n#    if BOOST_PP_LOCAL_C(62)\n        BOOST_PP_LOCAL_MACRO(62)\n#    endif\n#    if BOOST_PP_LOCAL_C(63)\n        BOOST_PP_LOCAL_MACRO(63)\n#    endif\n#    if BOOST_PP_LOCAL_C(64)\n        BOOST_PP_LOCAL_MACRO(64)\n#    endif\n#    if BOOST_PP_LOCAL_C(65)\n        BOOST_PP_LOCAL_MACRO(65)\n#    endif\n#    if BOOST_PP_LOCAL_C(66)\n        BOOST_PP_LOCAL_MACRO(66)\n#    endif\n#    if BOOST_PP_LOCAL_C(67)\n        BOOST_PP_LOCAL_MACRO(67)\n#    endif\n#    if BOOST_PP_LOCAL_C(68)\n        BOOST_PP_LOCAL_MACRO(68)\n#    endif\n#    if BOOST_PP_LOCAL_C(69)\n        BOOST_PP_LOCAL_MACRO(69)\n#    endif\n#    if BOOST_PP_LOCAL_C(70)\n        BOOST_PP_LOCAL_MACRO(70)\n#    endif\n#    if BOOST_PP_LOCAL_C(71)\n        BOOST_PP_LOCAL_MACRO(71)\n#    endif\n#    if BOOST_PP_LOCAL_C(72)\n        BOOST_PP_LOCAL_MACRO(72)\n#    endif\n#    if BOOST_PP_LOCAL_C(73)\n        BOOST_PP_LOCAL_MACRO(73)\n#    endif\n#    if BOOST_PP_LOCAL_C(74)\n        BOOST_PP_LOCAL_MACRO(74)\n#    endif\n#    if BOOST_PP_LOCAL_C(75)\n        BOOST_PP_LOCAL_MACRO(75)\n#    endif\n#    if BOOST_PP_LOCAL_C(76)\n        BOOST_PP_LOCAL_MACRO(76)\n#    endif\n#    if BOOST_PP_LOCAL_C(77)\n        BOOST_PP_LOCAL_MACRO(77)\n#    endif\n#    if BOOST_PP_LOCAL_C(78)\n        BOOST_PP_LOCAL_MACRO(78)\n#    endif\n#    if BOOST_PP_LOCAL_C(79)\n        BOOST_PP_LOCAL_MACRO(79)\n#    endif\n#    if BOOST_PP_LOCAL_C(80)\n        BOOST_PP_LOCAL_MACRO(80)\n#    endif\n#    if BOOST_PP_LOCAL_C(81)\n        BOOST_PP_LOCAL_MACRO(81)\n#    endif\n#    if BOOST_PP_LOCAL_C(82)\n        BOOST_PP_LOCAL_MACRO(82)\n#    endif\n#    if BOOST_PP_LOCAL_C(83)\n        BOOST_PP_LOCAL_MACRO(83)\n#    endif\n#    if BOOST_PP_LOCAL_C(84)\n        BOOST_PP_LOCAL_MACRO(84)\n#    endif\n#    if BOOST_PP_LOCAL_C(85)\n        BOOST_PP_LOCAL_MACRO(85)\n#    endif\n#    if BOOST_PP_LOCAL_C(86)\n        BOOST_PP_LOCAL_MACRO(86)\n#    endif\n#    if BOOST_PP_LOCAL_C(87)\n        BOOST_PP_LOCAL_MACRO(87)\n#    endif\n#    if BOOST_PP_LOCAL_C(88)\n        BOOST_PP_LOCAL_MACRO(88)\n#    endif\n#    if BOOST_PP_LOCAL_C(89)\n        BOOST_PP_LOCAL_MACRO(89)\n#    endif\n#    if BOOST_PP_LOCAL_C(90)\n        BOOST_PP_LOCAL_MACRO(90)\n#    endif\n#    if BOOST_PP_LOCAL_C(91)\n        BOOST_PP_LOCAL_MACRO(91)\n#    endif\n#    if BOOST_PP_LOCAL_C(92)\n        BOOST_PP_LOCAL_MACRO(92)\n#    endif\n#    if BOOST_PP_LOCAL_C(93)\n        BOOST_PP_LOCAL_MACRO(93)\n#    endif\n#    if BOOST_PP_LOCAL_C(94)\n        BOOST_PP_LOCAL_MACRO(94)\n#    endif\n#    if BOOST_PP_LOCAL_C(95)\n        BOOST_PP_LOCAL_MACRO(95)\n#    endif\n#    if BOOST_PP_LOCAL_C(96)\n        BOOST_PP_LOCAL_MACRO(96)\n#    endif\n#    if BOOST_PP_LOCAL_C(97)\n        BOOST_PP_LOCAL_MACRO(97)\n#    endif\n#    if BOOST_PP_LOCAL_C(98)\n        BOOST_PP_LOCAL_MACRO(98)\n#    endif\n#    if BOOST_PP_LOCAL_C(99)\n        BOOST_PP_LOCAL_MACRO(99)\n#    endif\n#    if BOOST_PP_LOCAL_C(100)\n        BOOST_PP_LOCAL_MACRO(100)\n#    endif\n#    if BOOST_PP_LOCAL_C(101)\n        BOOST_PP_LOCAL_MACRO(101)\n#    endif\n#    if BOOST_PP_LOCAL_C(102)\n        BOOST_PP_LOCAL_MACRO(102)\n#    endif\n#    if BOOST_PP_LOCAL_C(103)\n        BOOST_PP_LOCAL_MACRO(103)\n#    endif\n#    if BOOST_PP_LOCAL_C(104)\n        BOOST_PP_LOCAL_MACRO(104)\n#    endif\n#    if BOOST_PP_LOCAL_C(105)\n        BOOST_PP_LOCAL_MACRO(105)\n#    endif\n#    if BOOST_PP_LOCAL_C(106)\n        BOOST_PP_LOCAL_MACRO(106)\n#    endif\n#    if BOOST_PP_LOCAL_C(107)\n        BOOST_PP_LOCAL_MACRO(107)\n#    endif\n#    if BOOST_PP_LOCAL_C(108)\n        BOOST_PP_LOCAL_MACRO(108)\n#    endif\n#    if BOOST_PP_LOCAL_C(109)\n        BOOST_PP_LOCAL_MACRO(109)\n#    endif\n#    if BOOST_PP_LOCAL_C(110)\n        BOOST_PP_LOCAL_MACRO(110)\n#    endif\n#    if BOOST_PP_LOCAL_C(111)\n        BOOST_PP_LOCAL_MACRO(111)\n#    endif\n#    if BOOST_PP_LOCAL_C(112)\n        BOOST_PP_LOCAL_MACRO(112)\n#    endif\n#    if BOOST_PP_LOCAL_C(113)\n        BOOST_PP_LOCAL_MACRO(113)\n#    endif\n#    if BOOST_PP_LOCAL_C(114)\n        BOOST_PP_LOCAL_MACRO(114)\n#    endif\n#    if BOOST_PP_LOCAL_C(115)\n        BOOST_PP_LOCAL_MACRO(115)\n#    endif\n#    if BOOST_PP_LOCAL_C(116)\n        BOOST_PP_LOCAL_MACRO(116)\n#    endif\n#    if BOOST_PP_LOCAL_C(117)\n        BOOST_PP_LOCAL_MACRO(117)\n#    endif\n#    if BOOST_PP_LOCAL_C(118)\n        BOOST_PP_LOCAL_MACRO(118)\n#    endif\n#    if BOOST_PP_LOCAL_C(119)\n        BOOST_PP_LOCAL_MACRO(119)\n#    endif\n#    if BOOST_PP_LOCAL_C(120)\n        BOOST_PP_LOCAL_MACRO(120)\n#    endif\n#    if BOOST_PP_LOCAL_C(121)\n        BOOST_PP_LOCAL_MACRO(121)\n#    endif\n#    if BOOST_PP_LOCAL_C(122)\n        BOOST_PP_LOCAL_MACRO(122)\n#    endif\n#    if BOOST_PP_LOCAL_C(123)\n        BOOST_PP_LOCAL_MACRO(123)\n#    endif\n#    if BOOST_PP_LOCAL_C(124)\n        BOOST_PP_LOCAL_MACRO(124)\n#    endif\n#    if BOOST_PP_LOCAL_C(125)\n        BOOST_PP_LOCAL_MACRO(125)\n#    endif\n#    if BOOST_PP_LOCAL_C(126)\n        BOOST_PP_LOCAL_MACRO(126)\n#    endif\n#    if BOOST_PP_LOCAL_C(127)\n        BOOST_PP_LOCAL_MACRO(127)\n#    endif\n#    if BOOST_PP_LOCAL_C(128)\n        BOOST_PP_LOCAL_MACRO(128)\n#    endif\n#    if BOOST_PP_LOCAL_C(129)\n        BOOST_PP_LOCAL_MACRO(129)\n#    endif\n#    if BOOST_PP_LOCAL_C(130)\n        BOOST_PP_LOCAL_MACRO(130)\n#    endif\n#    if BOOST_PP_LOCAL_C(131)\n        BOOST_PP_LOCAL_MACRO(131)\n#    endif\n#    if BOOST_PP_LOCAL_C(132)\n        BOOST_PP_LOCAL_MACRO(132)\n#    endif\n#    if BOOST_PP_LOCAL_C(133)\n        BOOST_PP_LOCAL_MACRO(133)\n#    endif\n#    if BOOST_PP_LOCAL_C(134)\n        BOOST_PP_LOCAL_MACRO(134)\n#    endif\n#    if BOOST_PP_LOCAL_C(135)\n        BOOST_PP_LOCAL_MACRO(135)\n#    endif\n#    if BOOST_PP_LOCAL_C(136)\n        BOOST_PP_LOCAL_MACRO(136)\n#    endif\n#    if BOOST_PP_LOCAL_C(137)\n        BOOST_PP_LOCAL_MACRO(137)\n#    endif\n#    if BOOST_PP_LOCAL_C(138)\n        BOOST_PP_LOCAL_MACRO(138)\n#    endif\n#    if BOOST_PP_LOCAL_C(139)\n        BOOST_PP_LOCAL_MACRO(139)\n#    endif\n#    if BOOST_PP_LOCAL_C(140)\n        BOOST_PP_LOCAL_MACRO(140)\n#    endif\n#    if BOOST_PP_LOCAL_C(141)\n        BOOST_PP_LOCAL_MACRO(141)\n#    endif\n#    if BOOST_PP_LOCAL_C(142)\n        BOOST_PP_LOCAL_MACRO(142)\n#    endif\n#    if BOOST_PP_LOCAL_C(143)\n        BOOST_PP_LOCAL_MACRO(143)\n#    endif\n#    if BOOST_PP_LOCAL_C(144)\n        BOOST_PP_LOCAL_MACRO(144)\n#    endif\n#    if BOOST_PP_LOCAL_C(145)\n        BOOST_PP_LOCAL_MACRO(145)\n#    endif\n#    if BOOST_PP_LOCAL_C(146)\n        BOOST_PP_LOCAL_MACRO(146)\n#    endif\n#    if BOOST_PP_LOCAL_C(147)\n        BOOST_PP_LOCAL_MACRO(147)\n#    endif\n#    if BOOST_PP_LOCAL_C(148)\n        BOOST_PP_LOCAL_MACRO(148)\n#    endif\n#    if BOOST_PP_LOCAL_C(149)\n        BOOST_PP_LOCAL_MACRO(149)\n#    endif\n#    if BOOST_PP_LOCAL_C(150)\n        BOOST_PP_LOCAL_MACRO(150)\n#    endif\n#    if BOOST_PP_LOCAL_C(151)\n        BOOST_PP_LOCAL_MACRO(151)\n#    endif\n#    if BOOST_PP_LOCAL_C(152)\n        BOOST_PP_LOCAL_MACRO(152)\n#    endif\n#    if BOOST_PP_LOCAL_C(153)\n        BOOST_PP_LOCAL_MACRO(153)\n#    endif\n#    if BOOST_PP_LOCAL_C(154)\n        BOOST_PP_LOCAL_MACRO(154)\n#    endif\n#    if BOOST_PP_LOCAL_C(155)\n        BOOST_PP_LOCAL_MACRO(155)\n#    endif\n#    if BOOST_PP_LOCAL_C(156)\n        BOOST_PP_LOCAL_MACRO(156)\n#    endif\n#    if BOOST_PP_LOCAL_C(157)\n        BOOST_PP_LOCAL_MACRO(157)\n#    endif\n#    if BOOST_PP_LOCAL_C(158)\n        BOOST_PP_LOCAL_MACRO(158)\n#    endif\n#    if BOOST_PP_LOCAL_C(159)\n        BOOST_PP_LOCAL_MACRO(159)\n#    endif\n#    if BOOST_PP_LOCAL_C(160)\n        BOOST_PP_LOCAL_MACRO(160)\n#    endif\n#    if BOOST_PP_LOCAL_C(161)\n        BOOST_PP_LOCAL_MACRO(161)\n#    endif\n#    if BOOST_PP_LOCAL_C(162)\n        BOOST_PP_LOCAL_MACRO(162)\n#    endif\n#    if BOOST_PP_LOCAL_C(163)\n        BOOST_PP_LOCAL_MACRO(163)\n#    endif\n#    if BOOST_PP_LOCAL_C(164)\n        BOOST_PP_LOCAL_MACRO(164)\n#    endif\n#    if BOOST_PP_LOCAL_C(165)\n        BOOST_PP_LOCAL_MACRO(165)\n#    endif\n#    if BOOST_PP_LOCAL_C(166)\n        BOOST_PP_LOCAL_MACRO(166)\n#    endif\n#    if BOOST_PP_LOCAL_C(167)\n        BOOST_PP_LOCAL_MACRO(167)\n#    endif\n#    if BOOST_PP_LOCAL_C(168)\n        BOOST_PP_LOCAL_MACRO(168)\n#    endif\n#    if BOOST_PP_LOCAL_C(169)\n        BOOST_PP_LOCAL_MACRO(169)\n#    endif\n#    if BOOST_PP_LOCAL_C(170)\n        BOOST_PP_LOCAL_MACRO(170)\n#    endif\n#    if BOOST_PP_LOCAL_C(171)\n        BOOST_PP_LOCAL_MACRO(171)\n#    endif\n#    if BOOST_PP_LOCAL_C(172)\n        BOOST_PP_LOCAL_MACRO(172)\n#    endif\n#    if BOOST_PP_LOCAL_C(173)\n        BOOST_PP_LOCAL_MACRO(173)\n#    endif\n#    if BOOST_PP_LOCAL_C(174)\n        BOOST_PP_LOCAL_MACRO(174)\n#    endif\n#    if BOOST_PP_LOCAL_C(175)\n        BOOST_PP_LOCAL_MACRO(175)\n#    endif\n#    if BOOST_PP_LOCAL_C(176)\n        BOOST_PP_LOCAL_MACRO(176)\n#    endif\n#    if BOOST_PP_LOCAL_C(177)\n        BOOST_PP_LOCAL_MACRO(177)\n#    endif\n#    if BOOST_PP_LOCAL_C(178)\n        BOOST_PP_LOCAL_MACRO(178)\n#    endif\n#    if BOOST_PP_LOCAL_C(179)\n        BOOST_PP_LOCAL_MACRO(179)\n#    endif\n#    if BOOST_PP_LOCAL_C(180)\n        BOOST_PP_LOCAL_MACRO(180)\n#    endif\n#    if BOOST_PP_LOCAL_C(181)\n        BOOST_PP_LOCAL_MACRO(181)\n#    endif\n#    if BOOST_PP_LOCAL_C(182)\n        BOOST_PP_LOCAL_MACRO(182)\n#    endif\n#    if BOOST_PP_LOCAL_C(183)\n        BOOST_PP_LOCAL_MACRO(183)\n#    endif\n#    if BOOST_PP_LOCAL_C(184)\n        BOOST_PP_LOCAL_MACRO(184)\n#    endif\n#    if BOOST_PP_LOCAL_C(185)\n        BOOST_PP_LOCAL_MACRO(185)\n#    endif\n#    if BOOST_PP_LOCAL_C(186)\n        BOOST_PP_LOCAL_MACRO(186)\n#    endif\n#    if BOOST_PP_LOCAL_C(187)\n        BOOST_PP_LOCAL_MACRO(187)\n#    endif\n#    if BOOST_PP_LOCAL_C(188)\n        BOOST_PP_LOCAL_MACRO(188)\n#    endif\n#    if BOOST_PP_LOCAL_C(189)\n        BOOST_PP_LOCAL_MACRO(189)\n#    endif\n#    if BOOST_PP_LOCAL_C(190)\n        BOOST_PP_LOCAL_MACRO(190)\n#    endif\n#    if BOOST_PP_LOCAL_C(191)\n        BOOST_PP_LOCAL_MACRO(191)\n#    endif\n#    if BOOST_PP_LOCAL_C(192)\n        BOOST_PP_LOCAL_MACRO(192)\n#    endif\n#    if BOOST_PP_LOCAL_C(193)\n        BOOST_PP_LOCAL_MACRO(193)\n#    endif\n#    if BOOST_PP_LOCAL_C(194)\n        BOOST_PP_LOCAL_MACRO(194)\n#    endif\n#    if BOOST_PP_LOCAL_C(195)\n        BOOST_PP_LOCAL_MACRO(195)\n#    endif\n#    if BOOST_PP_LOCAL_C(196)\n        BOOST_PP_LOCAL_MACRO(196)\n#    endif\n#    if BOOST_PP_LOCAL_C(197)\n        BOOST_PP_LOCAL_MACRO(197)\n#    endif\n#    if BOOST_PP_LOCAL_C(198)\n        BOOST_PP_LOCAL_MACRO(198)\n#    endif\n#    if BOOST_PP_LOCAL_C(199)\n        BOOST_PP_LOCAL_MACRO(199)\n#    endif\n#    if BOOST_PP_LOCAL_C(200)\n        BOOST_PP_LOCAL_MACRO(200)\n#    endif\n#    if BOOST_PP_LOCAL_C(201)\n        BOOST_PP_LOCAL_MACRO(201)\n#    endif\n#    if BOOST_PP_LOCAL_C(202)\n        BOOST_PP_LOCAL_MACRO(202)\n#    endif\n#    if BOOST_PP_LOCAL_C(203)\n        BOOST_PP_LOCAL_MACRO(203)\n#    endif\n#    if BOOST_PP_LOCAL_C(204)\n        BOOST_PP_LOCAL_MACRO(204)\n#    endif\n#    if BOOST_PP_LOCAL_C(205)\n        BOOST_PP_LOCAL_MACRO(205)\n#    endif\n#    if BOOST_PP_LOCAL_C(206)\n        BOOST_PP_LOCAL_MACRO(206)\n#    endif\n#    if BOOST_PP_LOCAL_C(207)\n        BOOST_PP_LOCAL_MACRO(207)\n#    endif\n#    if BOOST_PP_LOCAL_C(208)\n        BOOST_PP_LOCAL_MACRO(208)\n#    endif\n#    if BOOST_PP_LOCAL_C(209)\n        BOOST_PP_LOCAL_MACRO(209)\n#    endif\n#    if BOOST_PP_LOCAL_C(210)\n        BOOST_PP_LOCAL_MACRO(210)\n#    endif\n#    if BOOST_PP_LOCAL_C(211)\n        BOOST_PP_LOCAL_MACRO(211)\n#    endif\n#    if BOOST_PP_LOCAL_C(212)\n        BOOST_PP_LOCAL_MACRO(212)\n#    endif\n#    if BOOST_PP_LOCAL_C(213)\n        BOOST_PP_LOCAL_MACRO(213)\n#    endif\n#    if BOOST_PP_LOCAL_C(214)\n        BOOST_PP_LOCAL_MACRO(214)\n#    endif\n#    if BOOST_PP_LOCAL_C(215)\n        BOOST_PP_LOCAL_MACRO(215)\n#    endif\n#    if BOOST_PP_LOCAL_C(216)\n        BOOST_PP_LOCAL_MACRO(216)\n#    endif\n#    if BOOST_PP_LOCAL_C(217)\n        BOOST_PP_LOCAL_MACRO(217)\n#    endif\n#    if BOOST_PP_LOCAL_C(218)\n        BOOST_PP_LOCAL_MACRO(218)\n#    endif\n#    if BOOST_PP_LOCAL_C(219)\n        BOOST_PP_LOCAL_MACRO(219)\n#    endif\n#    if BOOST_PP_LOCAL_C(220)\n        BOOST_PP_LOCAL_MACRO(220)\n#    endif\n#    if BOOST_PP_LOCAL_C(221)\n        BOOST_PP_LOCAL_MACRO(221)\n#    endif\n#    if BOOST_PP_LOCAL_C(222)\n        BOOST_PP_LOCAL_MACRO(222)\n#    endif\n#    if BOOST_PP_LOCAL_C(223)\n        BOOST_PP_LOCAL_MACRO(223)\n#    endif\n#    if BOOST_PP_LOCAL_C(224)\n        BOOST_PP_LOCAL_MACRO(224)\n#    endif\n#    if BOOST_PP_LOCAL_C(225)\n        BOOST_PP_LOCAL_MACRO(225)\n#    endif\n#    if BOOST_PP_LOCAL_C(226)\n        BOOST_PP_LOCAL_MACRO(226)\n#    endif\n#    if BOOST_PP_LOCAL_C(227)\n        BOOST_PP_LOCAL_MACRO(227)\n#    endif\n#    if BOOST_PP_LOCAL_C(228)\n        BOOST_PP_LOCAL_MACRO(228)\n#    endif\n#    if BOOST_PP_LOCAL_C(229)\n        BOOST_PP_LOCAL_MACRO(229)\n#    endif\n#    if BOOST_PP_LOCAL_C(230)\n        BOOST_PP_LOCAL_MACRO(230)\n#    endif\n#    if BOOST_PP_LOCAL_C(231)\n        BOOST_PP_LOCAL_MACRO(231)\n#    endif\n#    if BOOST_PP_LOCAL_C(232)\n        BOOST_PP_LOCAL_MACRO(232)\n#    endif\n#    if BOOST_PP_LOCAL_C(233)\n        BOOST_PP_LOCAL_MACRO(233)\n#    endif\n#    if BOOST_PP_LOCAL_C(234)\n        BOOST_PP_LOCAL_MACRO(234)\n#    endif\n#    if BOOST_PP_LOCAL_C(235)\n        BOOST_PP_LOCAL_MACRO(235)\n#    endif\n#    if BOOST_PP_LOCAL_C(236)\n        BOOST_PP_LOCAL_MACRO(236)\n#    endif\n\n#    if BOOST_PP_LOCAL_C(237)\n        BOOST_PP_LOCAL_MACRO(237)\n#    endif\n#    if BOOST_PP_LOCAL_C(238)\n        BOOST_PP_LOCAL_MACRO(238)\n#    endif\n#    if BOOST_PP_LOCAL_C(239)\n        BOOST_PP_LOCAL_MACRO(239)\n#    endif\n#    if BOOST_PP_LOCAL_C(240)\n        BOOST_PP_LOCAL_MACRO(240)\n#    endif\n#    if BOOST_PP_LOCAL_C(241)\n        BOOST_PP_LOCAL_MACRO(241)\n#    endif\n#    if BOOST_PP_LOCAL_C(242)\n        BOOST_PP_LOCAL_MACRO(242)\n#    endif\n#    if BOOST_PP_LOCAL_C(243)\n        BOOST_PP_LOCAL_MACRO(243)\n#    endif\n#    if BOOST_PP_LOCAL_C(244)\n        BOOST_PP_LOCAL_MACRO(244)\n#    endif\n#    if BOOST_PP_LOCAL_C(245)\n        BOOST_PP_LOCAL_MACRO(245)\n#    endif\n#    if BOOST_PP_LOCAL_C(246)\n        BOOST_PP_LOCAL_MACRO(246)\n#    endif\n#    if BOOST_PP_LOCAL_C(247)\n        BOOST_PP_LOCAL_MACRO(247)\n#    endif\n#    if BOOST_PP_LOCAL_C(248)\n        BOOST_PP_LOCAL_MACRO(248)\n#    endif\n#    if BOOST_PP_LOCAL_C(249)\n        BOOST_PP_LOCAL_MACRO(249)\n#    endif\n#    if BOOST_PP_LOCAL_C(250)\n        BOOST_PP_LOCAL_MACRO(250)\n#    endif\n#    if BOOST_PP_LOCAL_C(251)\n        BOOST_PP_LOCAL_MACRO(251)\n#    endif\n#    if BOOST_PP_LOCAL_C(252)\n        BOOST_PP_LOCAL_MACRO(252)\n#    endif\n#    if BOOST_PP_LOCAL_C(253)\n        BOOST_PP_LOCAL_MACRO(253)\n#    endif\n#    if BOOST_PP_LOCAL_C(254)\n        BOOST_PP_LOCAL_MACRO(254)\n#    endif\n#    if BOOST_PP_LOCAL_C(255)\n        BOOST_PP_LOCAL_MACRO(255)\n#    endif\n#    if BOOST_PP_LOCAL_C(256)\n        BOOST_PP_LOCAL_MACRO(256)\n#    endif\n# endif\n#\n# undef BOOST_PP_LOCAL_LIMITS\n#\n# undef BOOST_PP_LOCAL_S\n# undef BOOST_PP_LOCAL_F\n#\n# undef BOOST_PP_LOCAL_MACRO\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/iteration/detail/rlocal.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# if BOOST_PP_LOCAL_R(256)\n    BOOST_PP_LOCAL_MACRO(256)\n# endif\n# if BOOST_PP_LOCAL_R(255)\n    BOOST_PP_LOCAL_MACRO(255)\n# endif\n# if BOOST_PP_LOCAL_R(254)\n    BOOST_PP_LOCAL_MACRO(254)\n# endif\n# if BOOST_PP_LOCAL_R(253)\n    BOOST_PP_LOCAL_MACRO(253)\n# endif\n# if BOOST_PP_LOCAL_R(252)\n    BOOST_PP_LOCAL_MACRO(252)\n# endif\n# if BOOST_PP_LOCAL_R(251)\n    BOOST_PP_LOCAL_MACRO(251)\n# endif\n# if BOOST_PP_LOCAL_R(250)\n    BOOST_PP_LOCAL_MACRO(250)\n# endif\n# if BOOST_PP_LOCAL_R(249)\n    BOOST_PP_LOCAL_MACRO(249)\n# endif\n# if BOOST_PP_LOCAL_R(248)\n    BOOST_PP_LOCAL_MACRO(248)\n# endif\n# if BOOST_PP_LOCAL_R(247)\n    BOOST_PP_LOCAL_MACRO(247)\n# endif\n# if BOOST_PP_LOCAL_R(246)\n    BOOST_PP_LOCAL_MACRO(246)\n# endif\n# if BOOST_PP_LOCAL_R(245)\n    BOOST_PP_LOCAL_MACRO(245)\n# endif\n# if BOOST_PP_LOCAL_R(244)\n    BOOST_PP_LOCAL_MACRO(244)\n# endif\n# if BOOST_PP_LOCAL_R(243)\n    BOOST_PP_LOCAL_MACRO(243)\n# endif\n# if BOOST_PP_LOCAL_R(242)\n    BOOST_PP_LOCAL_MACRO(242)\n# endif\n# if BOOST_PP_LOCAL_R(241)\n    BOOST_PP_LOCAL_MACRO(241)\n# endif\n# if BOOST_PP_LOCAL_R(240)\n    BOOST_PP_LOCAL_MACRO(240)\n# endif\n# if BOOST_PP_LOCAL_R(239)\n    BOOST_PP_LOCAL_MACRO(239)\n# endif\n# if BOOST_PP_LOCAL_R(238)\n    BOOST_PP_LOCAL_MACRO(238)\n# endif\n# if BOOST_PP_LOCAL_R(237)\n    BOOST_PP_LOCAL_MACRO(237)\n# endif\n# if BOOST_PP_LOCAL_R(236)\n    BOOST_PP_LOCAL_MACRO(236)\n# endif\n# if BOOST_PP_LOCAL_R(235)\n    BOOST_PP_LOCAL_MACRO(235)\n# endif\n# if BOOST_PP_LOCAL_R(234)\n    BOOST_PP_LOCAL_MACRO(234)\n# endif\n# if BOOST_PP_LOCAL_R(233)\n    BOOST_PP_LOCAL_MACRO(233)\n# endif\n# if BOOST_PP_LOCAL_R(232)\n    BOOST_PP_LOCAL_MACRO(232)\n# endif\n# if BOOST_PP_LOCAL_R(231)\n    BOOST_PP_LOCAL_MACRO(231)\n# endif\n# if BOOST_PP_LOCAL_R(230)\n    BOOST_PP_LOCAL_MACRO(230)\n# endif\n# if BOOST_PP_LOCAL_R(229)\n    BOOST_PP_LOCAL_MACRO(229)\n# endif\n# if BOOST_PP_LOCAL_R(228)\n    BOOST_PP_LOCAL_MACRO(228)\n# endif\n# if BOOST_PP_LOCAL_R(227)\n    BOOST_PP_LOCAL_MACRO(227)\n# endif\n# if BOOST_PP_LOCAL_R(226)\n    BOOST_PP_LOCAL_MACRO(226)\n# endif\n# if BOOST_PP_LOCAL_R(225)\n    BOOST_PP_LOCAL_MACRO(225)\n# endif\n# if BOOST_PP_LOCAL_R(224)\n    BOOST_PP_LOCAL_MACRO(224)\n# endif\n# if BOOST_PP_LOCAL_R(223)\n    BOOST_PP_LOCAL_MACRO(223)\n# endif\n# if BOOST_PP_LOCAL_R(222)\n    BOOST_PP_LOCAL_MACRO(222)\n# endif\n# if BOOST_PP_LOCAL_R(221)\n    BOOST_PP_LOCAL_MACRO(221)\n# endif\n# if BOOST_PP_LOCAL_R(220)\n    BOOST_PP_LOCAL_MACRO(220)\n# endif\n# if BOOST_PP_LOCAL_R(219)\n    BOOST_PP_LOCAL_MACRO(219)\n# endif\n# if BOOST_PP_LOCAL_R(218)\n    BOOST_PP_LOCAL_MACRO(218)\n# endif\n# if BOOST_PP_LOCAL_R(217)\n    BOOST_PP_LOCAL_MACRO(217)\n# endif\n# if BOOST_PP_LOCAL_R(216)\n    BOOST_PP_LOCAL_MACRO(216)\n# endif\n# if BOOST_PP_LOCAL_R(215)\n    BOOST_PP_LOCAL_MACRO(215)\n# endif\n# if BOOST_PP_LOCAL_R(214)\n    BOOST_PP_LOCAL_MACRO(214)\n# endif\n# if BOOST_PP_LOCAL_R(213)\n    BOOST_PP_LOCAL_MACRO(213)\n# endif\n# if BOOST_PP_LOCAL_R(212)\n    BOOST_PP_LOCAL_MACRO(212)\n# endif\n# if BOOST_PP_LOCAL_R(211)\n    BOOST_PP_LOCAL_MACRO(211)\n# endif\n# if BOOST_PP_LOCAL_R(210)\n    BOOST_PP_LOCAL_MACRO(210)\n# endif\n# if BOOST_PP_LOCAL_R(209)\n    BOOST_PP_LOCAL_MACRO(209)\n# endif\n# if BOOST_PP_LOCAL_R(208)\n    BOOST_PP_LOCAL_MACRO(208)\n# endif\n# if BOOST_PP_LOCAL_R(207)\n    BOOST_PP_LOCAL_MACRO(207)\n# endif\n# if BOOST_PP_LOCAL_R(206)\n    BOOST_PP_LOCAL_MACRO(206)\n# endif\n# if BOOST_PP_LOCAL_R(205)\n    BOOST_PP_LOCAL_MACRO(205)\n# endif\n# if BOOST_PP_LOCAL_R(204)\n    BOOST_PP_LOCAL_MACRO(204)\n# endif\n# if BOOST_PP_LOCAL_R(203)\n    BOOST_PP_LOCAL_MACRO(203)\n# endif\n# if BOOST_PP_LOCAL_R(202)\n    BOOST_PP_LOCAL_MACRO(202)\n# endif\n# if BOOST_PP_LOCAL_R(201)\n    BOOST_PP_LOCAL_MACRO(201)\n# endif\n# if BOOST_PP_LOCAL_R(200)\n    BOOST_PP_LOCAL_MACRO(200)\n# endif\n# if BOOST_PP_LOCAL_R(199)\n    BOOST_PP_LOCAL_MACRO(199)\n# endif\n# if BOOST_PP_LOCAL_R(198)\n    BOOST_PP_LOCAL_MACRO(198)\n# endif\n# if BOOST_PP_LOCAL_R(197)\n    BOOST_PP_LOCAL_MACRO(197)\n# endif\n# if BOOST_PP_LOCAL_R(196)\n    BOOST_PP_LOCAL_MACRO(196)\n# endif\n# if BOOST_PP_LOCAL_R(195)\n    BOOST_PP_LOCAL_MACRO(195)\n# endif\n# if BOOST_PP_LOCAL_R(194)\n    BOOST_PP_LOCAL_MACRO(194)\n# endif\n# if BOOST_PP_LOCAL_R(193)\n    BOOST_PP_LOCAL_MACRO(193)\n# endif\n# if BOOST_PP_LOCAL_R(192)\n    BOOST_PP_LOCAL_MACRO(192)\n# endif\n# if BOOST_PP_LOCAL_R(191)\n    BOOST_PP_LOCAL_MACRO(191)\n# endif\n# if BOOST_PP_LOCAL_R(190)\n    BOOST_PP_LOCAL_MACRO(190)\n# endif\n# if BOOST_PP_LOCAL_R(189)\n    BOOST_PP_LOCAL_MACRO(189)\n# endif\n# if BOOST_PP_LOCAL_R(188)\n    BOOST_PP_LOCAL_MACRO(188)\n# endif\n# if BOOST_PP_LOCAL_R(187)\n    BOOST_PP_LOCAL_MACRO(187)\n# endif\n# if BOOST_PP_LOCAL_R(186)\n    BOOST_PP_LOCAL_MACRO(186)\n# endif\n# if BOOST_PP_LOCAL_R(185)\n    BOOST_PP_LOCAL_MACRO(185)\n# endif\n# if BOOST_PP_LOCAL_R(184)\n    BOOST_PP_LOCAL_MACRO(184)\n# endif\n# if BOOST_PP_LOCAL_R(183)\n    BOOST_PP_LOCAL_MACRO(183)\n# endif\n# if BOOST_PP_LOCAL_R(182)\n    BOOST_PP_LOCAL_MACRO(182)\n# endif\n# if BOOST_PP_LOCAL_R(181)\n    BOOST_PP_LOCAL_MACRO(181)\n# endif\n# if BOOST_PP_LOCAL_R(180)\n    BOOST_PP_LOCAL_MACRO(180)\n# endif\n# if BOOST_PP_LOCAL_R(179)\n    BOOST_PP_LOCAL_MACRO(179)\n# endif\n# if BOOST_PP_LOCAL_R(178)\n    BOOST_PP_LOCAL_MACRO(178)\n# endif\n# if BOOST_PP_LOCAL_R(177)\n    BOOST_PP_LOCAL_MACRO(177)\n# endif\n# if BOOST_PP_LOCAL_R(176)\n    BOOST_PP_LOCAL_MACRO(176)\n# endif\n# if BOOST_PP_LOCAL_R(175)\n    BOOST_PP_LOCAL_MACRO(175)\n# endif\n# if BOOST_PP_LOCAL_R(174)\n    BOOST_PP_LOCAL_MACRO(174)\n# endif\n# if BOOST_PP_LOCAL_R(173)\n    BOOST_PP_LOCAL_MACRO(173)\n# endif\n# if BOOST_PP_LOCAL_R(172)\n    BOOST_PP_LOCAL_MACRO(172)\n# endif\n# if BOOST_PP_LOCAL_R(171)\n    BOOST_PP_LOCAL_MACRO(171)\n# endif\n# if BOOST_PP_LOCAL_R(170)\n    BOOST_PP_LOCAL_MACRO(170)\n# endif\n# if BOOST_PP_LOCAL_R(169)\n    BOOST_PP_LOCAL_MACRO(169)\n# endif\n# if BOOST_PP_LOCAL_R(168)\n    BOOST_PP_LOCAL_MACRO(168)\n# endif\n# if BOOST_PP_LOCAL_R(167)\n    BOOST_PP_LOCAL_MACRO(167)\n# endif\n# if BOOST_PP_LOCAL_R(166)\n    BOOST_PP_LOCAL_MACRO(166)\n# endif\n# if BOOST_PP_LOCAL_R(165)\n    BOOST_PP_LOCAL_MACRO(165)\n# endif\n# if BOOST_PP_LOCAL_R(164)\n    BOOST_PP_LOCAL_MACRO(164)\n# endif\n# if BOOST_PP_LOCAL_R(163)\n    BOOST_PP_LOCAL_MACRO(163)\n# endif\n# if BOOST_PP_LOCAL_R(162)\n    BOOST_PP_LOCAL_MACRO(162)\n# endif\n# if BOOST_PP_LOCAL_R(161)\n    BOOST_PP_LOCAL_MACRO(161)\n# endif\n# if BOOST_PP_LOCAL_R(160)\n    BOOST_PP_LOCAL_MACRO(160)\n# endif\n# if BOOST_PP_LOCAL_R(159)\n    BOOST_PP_LOCAL_MACRO(159)\n# endif\n# if BOOST_PP_LOCAL_R(158)\n    BOOST_PP_LOCAL_MACRO(158)\n# endif\n# if BOOST_PP_LOCAL_R(157)\n    BOOST_PP_LOCAL_MACRO(157)\n# endif\n# if BOOST_PP_LOCAL_R(156)\n    BOOST_PP_LOCAL_MACRO(156)\n# endif\n# if BOOST_PP_LOCAL_R(155)\n    BOOST_PP_LOCAL_MACRO(155)\n# endif\n# if BOOST_PP_LOCAL_R(154)\n    BOOST_PP_LOCAL_MACRO(154)\n# endif\n# if BOOST_PP_LOCAL_R(153)\n    BOOST_PP_LOCAL_MACRO(153)\n# endif\n# if BOOST_PP_LOCAL_R(152)\n    BOOST_PP_LOCAL_MACRO(152)\n# endif\n# if BOOST_PP_LOCAL_R(151)\n    BOOST_PP_LOCAL_MACRO(151)\n# endif\n# if BOOST_PP_LOCAL_R(150)\n    BOOST_PP_LOCAL_MACRO(150)\n# endif\n# if BOOST_PP_LOCAL_R(149)\n    BOOST_PP_LOCAL_MACRO(149)\n# endif\n# if BOOST_PP_LOCAL_R(148)\n    BOOST_PP_LOCAL_MACRO(148)\n# endif\n# if BOOST_PP_LOCAL_R(147)\n    BOOST_PP_LOCAL_MACRO(147)\n# endif\n# if BOOST_PP_LOCAL_R(146)\n    BOOST_PP_LOCAL_MACRO(146)\n# endif\n# if BOOST_PP_LOCAL_R(145)\n    BOOST_PP_LOCAL_MACRO(145)\n# endif\n# if BOOST_PP_LOCAL_R(144)\n    BOOST_PP_LOCAL_MACRO(144)\n# endif\n# if BOOST_PP_LOCAL_R(143)\n    BOOST_PP_LOCAL_MACRO(143)\n# endif\n# if BOOST_PP_LOCAL_R(142)\n    BOOST_PP_LOCAL_MACRO(142)\n# endif\n# if BOOST_PP_LOCAL_R(141)\n    BOOST_PP_LOCAL_MACRO(141)\n# endif\n# if BOOST_PP_LOCAL_R(140)\n    BOOST_PP_LOCAL_MACRO(140)\n# endif\n# if BOOST_PP_LOCAL_R(139)\n    BOOST_PP_LOCAL_MACRO(139)\n# endif\n# if BOOST_PP_LOCAL_R(138)\n    BOOST_PP_LOCAL_MACRO(138)\n# endif\n# if BOOST_PP_LOCAL_R(137)\n    BOOST_PP_LOCAL_MACRO(137)\n# endif\n# if BOOST_PP_LOCAL_R(136)\n    BOOST_PP_LOCAL_MACRO(136)\n# endif\n# if BOOST_PP_LOCAL_R(135)\n    BOOST_PP_LOCAL_MACRO(135)\n# endif\n# if BOOST_PP_LOCAL_R(134)\n    BOOST_PP_LOCAL_MACRO(134)\n# endif\n# if BOOST_PP_LOCAL_R(133)\n    BOOST_PP_LOCAL_MACRO(133)\n# endif\n# if BOOST_PP_LOCAL_R(132)\n    BOOST_PP_LOCAL_MACRO(132)\n# endif\n# if BOOST_PP_LOCAL_R(131)\n    BOOST_PP_LOCAL_MACRO(131)\n# endif\n# if BOOST_PP_LOCAL_R(130)\n    BOOST_PP_LOCAL_MACRO(130)\n# endif\n# if BOOST_PP_LOCAL_R(129)\n    BOOST_PP_LOCAL_MACRO(129)\n# endif\n# if BOOST_PP_LOCAL_R(128)\n    BOOST_PP_LOCAL_MACRO(128)\n# endif\n# if BOOST_PP_LOCAL_R(127)\n    BOOST_PP_LOCAL_MACRO(127)\n# endif\n# if BOOST_PP_LOCAL_R(126)\n    BOOST_PP_LOCAL_MACRO(126)\n# endif\n# if BOOST_PP_LOCAL_R(125)\n    BOOST_PP_LOCAL_MACRO(125)\n# endif\n# if BOOST_PP_LOCAL_R(124)\n    BOOST_PP_LOCAL_MACRO(124)\n# endif\n# if BOOST_PP_LOCAL_R(123)\n    BOOST_PP_LOCAL_MACRO(123)\n# endif\n# if BOOST_PP_LOCAL_R(122)\n    BOOST_PP_LOCAL_MACRO(122)\n# endif\n# if BOOST_PP_LOCAL_R(121)\n    BOOST_PP_LOCAL_MACRO(121)\n# endif\n# if BOOST_PP_LOCAL_R(120)\n    BOOST_PP_LOCAL_MACRO(120)\n# endif\n# if BOOST_PP_LOCAL_R(119)\n    BOOST_PP_LOCAL_MACRO(119)\n# endif\n# if BOOST_PP_LOCAL_R(118)\n    BOOST_PP_LOCAL_MACRO(118)\n# endif\n# if BOOST_PP_LOCAL_R(117)\n    BOOST_PP_LOCAL_MACRO(117)\n# endif\n# if BOOST_PP_LOCAL_R(116)\n    BOOST_PP_LOCAL_MACRO(116)\n# endif\n# if BOOST_PP_LOCAL_R(115)\n    BOOST_PP_LOCAL_MACRO(115)\n# endif\n# if BOOST_PP_LOCAL_R(114)\n    BOOST_PP_LOCAL_MACRO(114)\n# endif\n# if BOOST_PP_LOCAL_R(113)\n    BOOST_PP_LOCAL_MACRO(113)\n# endif\n# if BOOST_PP_LOCAL_R(112)\n    BOOST_PP_LOCAL_MACRO(112)\n# endif\n# if BOOST_PP_LOCAL_R(111)\n    BOOST_PP_LOCAL_MACRO(111)\n# endif\n# if BOOST_PP_LOCAL_R(110)\n    BOOST_PP_LOCAL_MACRO(110)\n# endif\n# if BOOST_PP_LOCAL_R(109)\n    BOOST_PP_LOCAL_MACRO(109)\n# endif\n# if BOOST_PP_LOCAL_R(108)\n    BOOST_PP_LOCAL_MACRO(108)\n# endif\n# if BOOST_PP_LOCAL_R(107)\n    BOOST_PP_LOCAL_MACRO(107)\n# endif\n# if BOOST_PP_LOCAL_R(106)\n    BOOST_PP_LOCAL_MACRO(106)\n# endif\n# if BOOST_PP_LOCAL_R(105)\n    BOOST_PP_LOCAL_MACRO(105)\n# endif\n# if BOOST_PP_LOCAL_R(104)\n    BOOST_PP_LOCAL_MACRO(104)\n# endif\n# if BOOST_PP_LOCAL_R(103)\n    BOOST_PP_LOCAL_MACRO(103)\n# endif\n# if BOOST_PP_LOCAL_R(102)\n    BOOST_PP_LOCAL_MACRO(102)\n# endif\n# if BOOST_PP_LOCAL_R(101)\n    BOOST_PP_LOCAL_MACRO(101)\n# endif\n# if BOOST_PP_LOCAL_R(100)\n    BOOST_PP_LOCAL_MACRO(100)\n# endif\n# if BOOST_PP_LOCAL_R(99)\n    BOOST_PP_LOCAL_MACRO(99)\n# endif\n# if BOOST_PP_LOCAL_R(98)\n    BOOST_PP_LOCAL_MACRO(98)\n# endif\n# if BOOST_PP_LOCAL_R(97)\n    BOOST_PP_LOCAL_MACRO(97)\n# endif\n# if BOOST_PP_LOCAL_R(96)\n    BOOST_PP_LOCAL_MACRO(96)\n# endif\n# if BOOST_PP_LOCAL_R(95)\n    BOOST_PP_LOCAL_MACRO(95)\n# endif\n# if BOOST_PP_LOCAL_R(94)\n    BOOST_PP_LOCAL_MACRO(94)\n# endif\n# if BOOST_PP_LOCAL_R(93)\n    BOOST_PP_LOCAL_MACRO(93)\n# endif\n# if BOOST_PP_LOCAL_R(92)\n    BOOST_PP_LOCAL_MACRO(92)\n# endif\n# if BOOST_PP_LOCAL_R(91)\n    BOOST_PP_LOCAL_MACRO(91)\n# endif\n# if BOOST_PP_LOCAL_R(90)\n    BOOST_PP_LOCAL_MACRO(90)\n# endif\n# if BOOST_PP_LOCAL_R(89)\n    BOOST_PP_LOCAL_MACRO(89)\n# endif\n# if BOOST_PP_LOCAL_R(88)\n    BOOST_PP_LOCAL_MACRO(88)\n# endif\n# if BOOST_PP_LOCAL_R(87)\n    BOOST_PP_LOCAL_MACRO(87)\n# endif\n# if BOOST_PP_LOCAL_R(86)\n    BOOST_PP_LOCAL_MACRO(86)\n# endif\n# if BOOST_PP_LOCAL_R(85)\n    BOOST_PP_LOCAL_MACRO(85)\n# endif\n# if BOOST_PP_LOCAL_R(84)\n    BOOST_PP_LOCAL_MACRO(84)\n# endif\n# if BOOST_PP_LOCAL_R(83)\n    BOOST_PP_LOCAL_MACRO(83)\n# endif\n# if BOOST_PP_LOCAL_R(82)\n    BOOST_PP_LOCAL_MACRO(82)\n# endif\n# if BOOST_PP_LOCAL_R(81)\n    BOOST_PP_LOCAL_MACRO(81)\n# endif\n# if BOOST_PP_LOCAL_R(80)\n    BOOST_PP_LOCAL_MACRO(80)\n# endif\n# if BOOST_PP_LOCAL_R(79)\n    BOOST_PP_LOCAL_MACRO(79)\n# endif\n# if BOOST_PP_LOCAL_R(78)\n    BOOST_PP_LOCAL_MACRO(78)\n# endif\n# if BOOST_PP_LOCAL_R(77)\n    BOOST_PP_LOCAL_MACRO(77)\n# endif\n# if BOOST_PP_LOCAL_R(76)\n    BOOST_PP_LOCAL_MACRO(76)\n# endif\n# if BOOST_PP_LOCAL_R(75)\n    BOOST_PP_LOCAL_MACRO(75)\n# endif\n# if BOOST_PP_LOCAL_R(74)\n    BOOST_PP_LOCAL_MACRO(74)\n# endif\n# if BOOST_PP_LOCAL_R(73)\n    BOOST_PP_LOCAL_MACRO(73)\n# endif\n# if BOOST_PP_LOCAL_R(72)\n    BOOST_PP_LOCAL_MACRO(72)\n# endif\n# if BOOST_PP_LOCAL_R(71)\n    BOOST_PP_LOCAL_MACRO(71)\n# endif\n# if BOOST_PP_LOCAL_R(70)\n    BOOST_PP_LOCAL_MACRO(70)\n# endif\n# if BOOST_PP_LOCAL_R(69)\n    BOOST_PP_LOCAL_MACRO(69)\n# endif\n# if BOOST_PP_LOCAL_R(68)\n    BOOST_PP_LOCAL_MACRO(68)\n# endif\n# if BOOST_PP_LOCAL_R(67)\n    BOOST_PP_LOCAL_MACRO(67)\n# endif\n# if BOOST_PP_LOCAL_R(66)\n    BOOST_PP_LOCAL_MACRO(66)\n# endif\n# if BOOST_PP_LOCAL_R(65)\n    BOOST_PP_LOCAL_MACRO(65)\n# endif\n# if BOOST_PP_LOCAL_R(64)\n    BOOST_PP_LOCAL_MACRO(64)\n# endif\n# if BOOST_PP_LOCAL_R(63)\n    BOOST_PP_LOCAL_MACRO(63)\n# endif\n# if BOOST_PP_LOCAL_R(62)\n    BOOST_PP_LOCAL_MACRO(62)\n# endif\n# if BOOST_PP_LOCAL_R(61)\n    BOOST_PP_LOCAL_MACRO(61)\n# endif\n# if BOOST_PP_LOCAL_R(60)\n    BOOST_PP_LOCAL_MACRO(60)\n# endif\n# if BOOST_PP_LOCAL_R(59)\n    BOOST_PP_LOCAL_MACRO(59)\n# endif\n# if BOOST_PP_LOCAL_R(58)\n    BOOST_PP_LOCAL_MACRO(58)\n# endif\n# if BOOST_PP_LOCAL_R(57)\n    BOOST_PP_LOCAL_MACRO(57)\n# endif\n# if BOOST_PP_LOCAL_R(56)\n    BOOST_PP_LOCAL_MACRO(56)\n# endif\n# if BOOST_PP_LOCAL_R(55)\n    BOOST_PP_LOCAL_MACRO(55)\n# endif\n# if BOOST_PP_LOCAL_R(54)\n    BOOST_PP_LOCAL_MACRO(54)\n# endif\n# if BOOST_PP_LOCAL_R(53)\n    BOOST_PP_LOCAL_MACRO(53)\n# endif\n# if BOOST_PP_LOCAL_R(52)\n    BOOST_PP_LOCAL_MACRO(52)\n# endif\n# if BOOST_PP_LOCAL_R(51)\n    BOOST_PP_LOCAL_MACRO(51)\n# endif\n# if BOOST_PP_LOCAL_R(50)\n    BOOST_PP_LOCAL_MACRO(50)\n# endif\n# if BOOST_PP_LOCAL_R(49)\n    BOOST_PP_LOCAL_MACRO(49)\n# endif\n# if BOOST_PP_LOCAL_R(48)\n    BOOST_PP_LOCAL_MACRO(48)\n# endif\n# if BOOST_PP_LOCAL_R(47)\n    BOOST_PP_LOCAL_MACRO(47)\n# endif\n# if BOOST_PP_LOCAL_R(46)\n    BOOST_PP_LOCAL_MACRO(46)\n# endif\n# if BOOST_PP_LOCAL_R(45)\n    BOOST_PP_LOCAL_MACRO(45)\n# endif\n# if BOOST_PP_LOCAL_R(44)\n    BOOST_PP_LOCAL_MACRO(44)\n# endif\n# if BOOST_PP_LOCAL_R(43)\n    BOOST_PP_LOCAL_MACRO(43)\n# endif\n# if BOOST_PP_LOCAL_R(42)\n    BOOST_PP_LOCAL_MACRO(42)\n# endif\n# if BOOST_PP_LOCAL_R(41)\n    BOOST_PP_LOCAL_MACRO(41)\n# endif\n# if BOOST_PP_LOCAL_R(40)\n    BOOST_PP_LOCAL_MACRO(40)\n# endif\n# if BOOST_PP_LOCAL_R(39)\n    BOOST_PP_LOCAL_MACRO(39)\n# endif\n# if BOOST_PP_LOCAL_R(38)\n    BOOST_PP_LOCAL_MACRO(38)\n# endif\n# if BOOST_PP_LOCAL_R(37)\n    BOOST_PP_LOCAL_MACRO(37)\n# endif\n# if BOOST_PP_LOCAL_R(36)\n    BOOST_PP_LOCAL_MACRO(36)\n# endif\n# if BOOST_PP_LOCAL_R(35)\n    BOOST_PP_LOCAL_MACRO(35)\n# endif\n# if BOOST_PP_LOCAL_R(34)\n    BOOST_PP_LOCAL_MACRO(34)\n# endif\n# if BOOST_PP_LOCAL_R(33)\n    BOOST_PP_LOCAL_MACRO(33)\n# endif\n# if BOOST_PP_LOCAL_R(32)\n    BOOST_PP_LOCAL_MACRO(32)\n# endif\n# if BOOST_PP_LOCAL_R(31)\n    BOOST_PP_LOCAL_MACRO(31)\n# endif\n# if BOOST_PP_LOCAL_R(30)\n    BOOST_PP_LOCAL_MACRO(30)\n# endif\n# if BOOST_PP_LOCAL_R(29)\n    BOOST_PP_LOCAL_MACRO(29)\n# endif\n# if BOOST_PP_LOCAL_R(28)\n    BOOST_PP_LOCAL_MACRO(28)\n# endif\n# if BOOST_PP_LOCAL_R(27)\n    BOOST_PP_LOCAL_MACRO(27)\n# endif\n# if BOOST_PP_LOCAL_R(26)\n    BOOST_PP_LOCAL_MACRO(26)\n# endif\n# if BOOST_PP_LOCAL_R(25)\n    BOOST_PP_LOCAL_MACRO(25)\n# endif\n# if BOOST_PP_LOCAL_R(24)\n    BOOST_PP_LOCAL_MACRO(24)\n# endif\n# if BOOST_PP_LOCAL_R(23)\n    BOOST_PP_LOCAL_MACRO(23)\n# endif\n# if BOOST_PP_LOCAL_R(22)\n    BOOST_PP_LOCAL_MACRO(22)\n# endif\n# if BOOST_PP_LOCAL_R(21)\n    BOOST_PP_LOCAL_MACRO(21)\n# endif\n# if BOOST_PP_LOCAL_R(20)\n    BOOST_PP_LOCAL_MACRO(20)\n# endif\n# if BOOST_PP_LOCAL_R(19)\n    BOOST_PP_LOCAL_MACRO(19)\n# endif\n# if BOOST_PP_LOCAL_R(18)\n    BOOST_PP_LOCAL_MACRO(18)\n# endif\n# if BOOST_PP_LOCAL_R(17)\n    BOOST_PP_LOCAL_MACRO(17)\n# endif\n# if BOOST_PP_LOCAL_R(16)\n    BOOST_PP_LOCAL_MACRO(16)\n# endif\n# if BOOST_PP_LOCAL_R(15)\n    BOOST_PP_LOCAL_MACRO(15)\n# endif\n# if BOOST_PP_LOCAL_R(14)\n    BOOST_PP_LOCAL_MACRO(14)\n# endif\n# if BOOST_PP_LOCAL_R(13)\n    BOOST_PP_LOCAL_MACRO(13)\n# endif\n# if BOOST_PP_LOCAL_R(12)\n    BOOST_PP_LOCAL_MACRO(12)\n# endif\n# if BOOST_PP_LOCAL_R(11)\n    BOOST_PP_LOCAL_MACRO(11)\n# endif\n# if BOOST_PP_LOCAL_R(10)\n    BOOST_PP_LOCAL_MACRO(10)\n# endif\n# if BOOST_PP_LOCAL_R(9)\n    BOOST_PP_LOCAL_MACRO(9)\n# endif\n# if BOOST_PP_LOCAL_R(8)\n    BOOST_PP_LOCAL_MACRO(8)\n# endif\n# if BOOST_PP_LOCAL_R(7)\n    BOOST_PP_LOCAL_MACRO(7)\n# endif\n# if BOOST_PP_LOCAL_R(6)\n    BOOST_PP_LOCAL_MACRO(6)\n# endif\n# if BOOST_PP_LOCAL_R(5)\n    BOOST_PP_LOCAL_MACRO(5)\n# endif\n# if BOOST_PP_LOCAL_R(4)\n    BOOST_PP_LOCAL_MACRO(4)\n# endif\n# if BOOST_PP_LOCAL_R(3)\n    BOOST_PP_LOCAL_MACRO(3)\n# endif\n# if BOOST_PP_LOCAL_R(2)\n    BOOST_PP_LOCAL_MACRO(2)\n# endif\n# if BOOST_PP_LOCAL_R(1)\n    BOOST_PP_LOCAL_MACRO(1)\n# endif\n# if BOOST_PP_LOCAL_R(0)\n    BOOST_PP_LOCAL_MACRO(0)\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/iteration/detail/self.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# if !defined(BOOST_PP_INDIRECT_SELF)\n#    error BOOST_PP_ERROR:  no indirect file to include\n# endif\n#\n# define BOOST_PP_IS_SELFISH 1\n#\n# include BOOST_PP_INDIRECT_SELF\n#\n# undef BOOST_PP_IS_SELFISH\n# undef BOOST_PP_INDIRECT_SELF\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/iteration/detail/start.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_LOCAL_SE\n#\n# undef BOOST_PP_LOCAL_SE_DIGIT_1\n# undef BOOST_PP_LOCAL_SE_DIGIT_2\n# undef BOOST_PP_LOCAL_SE_DIGIT_3\n# undef BOOST_PP_LOCAL_SE_DIGIT_4\n# undef BOOST_PP_LOCAL_SE_DIGIT_5\n# undef BOOST_PP_LOCAL_SE_DIGIT_6\n# undef BOOST_PP_LOCAL_SE_DIGIT_7\n# undef BOOST_PP_LOCAL_SE_DIGIT_8\n# undef BOOST_PP_LOCAL_SE_DIGIT_9\n# undef BOOST_PP_LOCAL_SE_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_LOCAL_SE_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_LOCAL_SE_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_LOCAL_SE_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_LOCAL_SE_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_LOCAL_SE_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_LOCAL_SE_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_LOCAL_SE_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_LOCAL_SE_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_LOCAL_SE_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_LOCAL_SE_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_LOCAL_SE_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_LOCAL_SE_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_LOCAL_SE_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_LOCAL_SE_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_LOCAL_SE_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_LOCAL_SE_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_LOCAL_SE_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_LOCAL_SE_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_LOCAL_SE_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_LOCAL_SE_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_LOCAL_SE_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_LOCAL_SE_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_LOCAL_SE_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_LOCAL_SE_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_LOCAL_SE_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_LOCAL_SE_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_LOCAL_SE_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_LOCAL_SE_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_LOCAL_SE_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_LOCAL_SE_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_LOCAL_SE_DIGIT_3\n#    define BOOST_PP_LOCAL_SE() BOOST_PP_SLOT_CC_3(BOOST_PP_LOCAL_SE_DIGIT_3, BOOST_PP_LOCAL_SE_DIGIT_2, BOOST_PP_LOCAL_SE_DIGIT_1)\n# elif BOOST_PP_LOCAL_SE_DIGIT_2\n#    define BOOST_PP_LOCAL_SE() BOOST_PP_SLOT_CC_2(BOOST_PP_LOCAL_SE_DIGIT_2, BOOST_PP_LOCAL_SE_DIGIT_1)\n# else\n#    define BOOST_PP_LOCAL_SE() BOOST_PP_LOCAL_SE_DIGIT_1\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/iteration/iterate.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ITERATION_ITERATE_HPP\n# define BOOST_PREPROCESSOR_ITERATION_ITERATE_HPP\n#\n# include <boost/preprocessor/arithmetic/dec.hpp>\n# include <boost/preprocessor/arithmetic/inc.hpp>\n# include <boost/preprocessor/array/elem.hpp>\n# include <boost/preprocessor/array/size.hpp>\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/slot/slot.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n#\n# /* BOOST_PP_ITERATION_DEPTH */\n#\n# define BOOST_PP_ITERATION_DEPTH() 0\n#\n# /* BOOST_PP_ITERATION */\n#\n# define BOOST_PP_ITERATION() BOOST_PP_CAT(BOOST_PP_ITERATION_, BOOST_PP_ITERATION_DEPTH())\n#\n# /* BOOST_PP_ITERATION_START && BOOST_PP_ITERATION_FINISH */\n#\n# define BOOST_PP_ITERATION_START() BOOST_PP_CAT(BOOST_PP_ITERATION_START_, BOOST_PP_ITERATION_DEPTH())\n# define BOOST_PP_ITERATION_FINISH() BOOST_PP_CAT(BOOST_PP_ITERATION_FINISH_, BOOST_PP_ITERATION_DEPTH())\n#\n# /* BOOST_PP_ITERATION_FLAGS */\n#\n# define BOOST_PP_ITERATION_FLAGS() (BOOST_PP_CAT(BOOST_PP_ITERATION_FLAGS_, BOOST_PP_ITERATION_DEPTH())())\n#\n# /* BOOST_PP_FRAME_ITERATION */\n#\n# define BOOST_PP_FRAME_ITERATION(i) BOOST_PP_CAT(BOOST_PP_ITERATION_, i)\n#\n# /* BOOST_PP_FRAME_START && BOOST_PP_FRAME_FINISH */\n#\n# define BOOST_PP_FRAME_START(i) BOOST_PP_CAT(BOOST_PP_ITERATION_START_, i)\n# define BOOST_PP_FRAME_FINISH(i) BOOST_PP_CAT(BOOST_PP_ITERATION_FINISH_, i)\n#\n# /* BOOST_PP_FRAME_FLAGS */\n#\n# define BOOST_PP_FRAME_FLAGS(i) (BOOST_PP_CAT(BOOST_PP_ITERATION_FLAGS_, i)())\n#\n# /* BOOST_PP_RELATIVE_ITERATION */\n#\n# define BOOST_PP_RELATIVE_ITERATION(i) BOOST_PP_CAT(BOOST_PP_RELATIVE_, i)(BOOST_PP_ITERATION_)\n#\n# define BOOST_PP_RELATIVE_0(m) BOOST_PP_CAT(m, BOOST_PP_ITERATION_DEPTH())\n# define BOOST_PP_RELATIVE_1(m) BOOST_PP_CAT(m, BOOST_PP_DEC(BOOST_PP_ITERATION_DEPTH()))\n# define BOOST_PP_RELATIVE_2(m) BOOST_PP_CAT(m, BOOST_PP_DEC(BOOST_PP_DEC(BOOST_PP_ITERATION_DEPTH())))\n# define BOOST_PP_RELATIVE_3(m) BOOST_PP_CAT(m, BOOST_PP_DEC(BOOST_PP_DEC(BOOST_PP_DEC(BOOST_PP_ITERATION_DEPTH()))))\n# define BOOST_PP_RELATIVE_4(m) BOOST_PP_CAT(m, BOOST_PP_DEC(BOOST_PP_DEC(BOOST_PP_DEC(BOOST_PP_DEC(BOOST_PP_ITERATION_DEPTH())))))\n#\n# /* BOOST_PP_RELATIVE_START && BOOST_PP_RELATIVE_FINISH */\n#\n# define BOOST_PP_RELATIVE_START(i) BOOST_PP_CAT(BOOST_PP_RELATIVE_, i)(BOOST_PP_ITERATION_START_)\n# define BOOST_PP_RELATIVE_FINISH(i) BOOST_PP_CAT(BOOST_PP_RELATIVE_, i)(BOOST_PP_ITERATION_FINISH_)\n#\n# /* BOOST_PP_RELATIVE_FLAGS */\n#\n# define BOOST_PP_RELATIVE_FLAGS(i) (BOOST_PP_CAT(BOOST_PP_RELATIVE_, i)(BOOST_PP_ITERATION_FLAGS_)())\n#\n# /* BOOST_PP_ITERATE */\n#\n# define BOOST_PP_ITERATE() BOOST_PP_CAT(BOOST_PP_ITERATE_, BOOST_PP_INC(BOOST_PP_ITERATION_DEPTH()))\n#\n# define BOOST_PP_ITERATE_1 <boost/preprocessor/iteration/detail/iter/forward1.hpp>\n# define BOOST_PP_ITERATE_2 <boost/preprocessor/iteration/detail/iter/forward2.hpp>\n# define BOOST_PP_ITERATE_3 <boost/preprocessor/iteration/detail/iter/forward3.hpp>\n# define BOOST_PP_ITERATE_4 <boost/preprocessor/iteration/detail/iter/forward4.hpp>\n# define BOOST_PP_ITERATE_5 <boost/preprocessor/iteration/detail/iter/forward5.hpp>\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/iteration/local.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ITERATION_LOCAL_HPP\n# define BOOST_PREPROCESSOR_ITERATION_LOCAL_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/slot/slot.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n#\n# /* BOOST_PP_LOCAL_ITERATE */\n#\n# define BOOST_PP_LOCAL_ITERATE() <boost/preprocessor/iteration/detail/local.hpp>\n#\n# define BOOST_PP_LOCAL_C(n) (BOOST_PP_LOCAL_S) <= n && (BOOST_PP_LOCAL_F) >= n\n# define BOOST_PP_LOCAL_R(n) (BOOST_PP_LOCAL_F) <= n && (BOOST_PP_LOCAL_S) >= n\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/iteration/self.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ITERATION_SELF_HPP\n# define BOOST_PREPROCESSOR_ITERATION_SELF_HPP\n#\n# /* BOOST_PP_INCLUDE_SELF */\n#\n# define BOOST_PP_INCLUDE_SELF() <boost/preprocessor/iteration/detail/self.hpp>\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/list/adt.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  *\n#  * See http://www.boost.org for most recent version.\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_ADT_HPP\n# define BOOST_PREPROCESSOR_LIST_ADT_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/detail/is_binary.hpp>\n# include <boost/preprocessor/logical/compl.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n#\n# /* BOOST_PP_LIST_CONS */\n#\n# define BOOST_PP_LIST_CONS(head, tail) (head, tail)\n#\n# /* BOOST_PP_LIST_NIL */\n#\n# define BOOST_PP_LIST_NIL BOOST_PP_NIL\n#\n# /* BOOST_PP_LIST_FIRST */\n#\n# define BOOST_PP_LIST_FIRST(list) BOOST_PP_LIST_FIRST_D(list)\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_LIST_FIRST_D(list) BOOST_PP_LIST_FIRST_I list\n# else\n#    define BOOST_PP_LIST_FIRST_D(list) BOOST_PP_LIST_FIRST_I ## list\n# endif\n#\n# define BOOST_PP_LIST_FIRST_I(head, tail) head\n#\n# /* BOOST_PP_LIST_REST */\n#\n# define BOOST_PP_LIST_REST(list) BOOST_PP_LIST_REST_D(list)\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_LIST_REST_D(list) BOOST_PP_LIST_REST_I list\n# else\n#    define BOOST_PP_LIST_REST_D(list) BOOST_PP_LIST_REST_I ## list\n# endif\n#\n# define BOOST_PP_LIST_REST_I(head, tail) tail\n#\n# /* BOOST_PP_LIST_IS_CONS */\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_BCC()\n#    define BOOST_PP_LIST_IS_CONS(list) BOOST_PP_LIST_IS_CONS_D(list)\n#    define BOOST_PP_LIST_IS_CONS_D(list) BOOST_PP_LIST_IS_CONS_ ## list\n#    define BOOST_PP_LIST_IS_CONS_(head, tail) 1\n#    define BOOST_PP_LIST_IS_CONS_BOOST_PP_NIL 0\n# else\n#    define BOOST_PP_LIST_IS_CONS(list) BOOST_PP_IS_BINARY(list)\n# endif\n#\n# /* BOOST_PP_LIST_IS_NIL */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_BCC()\n#    define BOOST_PP_LIST_IS_NIL(list) BOOST_PP_COMPL(BOOST_PP_IS_BINARY(list))\n# else\n#    define BOOST_PP_LIST_IS_NIL(list) BOOST_PP_COMPL(BOOST_PP_LIST_IS_CONS(list))\n# endif\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/list/detail/dmc/fold_left.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_DETAIL_FOLD_LEFT_HPP\n# define BOOST_PREPROCESSOR_LIST_DETAIL_FOLD_LEFT_HPP\n#\n# include <boost/preprocessor/control/expr_iif.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/list/adt.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n#\n# define BOOST_PP_LIST_FOLD_LEFT_1(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_2, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(2, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_2(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_3, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(3, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_3(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_4, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(4, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_4(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_5, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(5, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_5(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_6, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(6, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_6(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_7, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(7, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_7(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_8, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(8, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_8(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_9, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(9, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_9(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_10, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(10, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_10(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_11, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(11, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_11(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_12, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(12, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_12(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_13, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(13, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_13(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_14, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(14, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_14(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_15, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(15, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_15(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_16, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(16, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_16(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_17, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(17, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_17(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_18, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(18, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_18(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_19, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(19, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_19(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_20, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(20, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_20(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_21, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(21, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_21(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_22, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(22, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_22(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_23, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(23, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_23(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_24, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(24, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_24(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_25, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(25, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_25(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_26, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(26, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_26(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_27, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(27, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_27(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_28, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(28, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_28(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_29, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(29, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_29(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_30, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(30, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_30(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_31, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(31, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_31(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_32, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(32, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_32(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_33, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(33, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_33(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_34, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(34, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_34(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_35, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(35, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_35(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_36, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(36, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_36(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_37, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(37, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_37(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_38, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(38, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_38(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_39, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(39, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_39(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_40, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(40, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_40(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_41, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(41, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_41(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_42, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(42, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_42(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_43, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(43, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_43(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_44, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(44, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_44(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_45, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(45, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_45(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_46, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(46, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_46(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_47, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(47, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_47(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_48, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(48, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_48(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_49, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(49, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_49(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_50, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(50, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_50(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_51, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(51, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_51(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_52, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(52, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_52(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_53, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(53, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_53(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_54, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(54, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_54(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_55, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(55, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_55(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_56, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(56, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_56(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_57, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(57, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_57(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_58, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(58, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_58(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_59, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(59, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_59(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_60, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(60, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_60(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_61, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(61, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_61(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_62, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(62, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_62(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_63, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(63, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_63(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_64, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(64, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_64(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_65, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(65, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_65(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_66, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(66, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_66(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_67, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(67, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_67(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_68, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(68, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_68(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_69, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(69, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_69(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_70, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(70, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_70(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_71, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(71, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_71(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_72, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(72, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_72(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_73, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(73, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_73(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_74, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(74, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_74(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_75, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(75, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_75(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_76, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(76, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_76(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_77, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(77, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_77(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_78, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(78, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_78(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_79, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(79, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_79(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_80, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(80, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_80(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_81, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(81, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_81(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_82, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(82, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_82(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_83, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(83, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_83(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_84, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(84, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_84(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_85, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(85, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_85(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_86, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(86, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_86(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_87, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(87, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_87(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_88, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(88, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_88(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_89, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(89, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_89(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_90, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(90, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_90(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_91, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(91, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_91(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_92, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(92, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_92(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_93, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(93, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_93(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_94, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(94, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_94(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_95, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(95, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_95(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_96, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(96, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_96(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_97, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(97, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_97(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_98, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(98, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_98(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_99, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(99, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_99(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_100, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(100, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_100(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_101, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(101, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_101(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_102, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(102, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_102(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_103, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(103, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_103(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_104, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(104, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_104(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_105, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(105, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_105(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_106, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(106, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_106(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_107, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(107, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_107(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_108, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(108, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_108(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_109, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(109, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_109(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_110, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(110, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_110(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_111, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(111, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_111(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_112, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(112, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_112(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_113, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(113, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_113(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_114, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(114, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_114(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_115, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(115, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_115(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_116, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(116, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_116(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_117, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(117, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_117(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_118, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(118, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_118(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_119, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(119, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_119(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_120, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(120, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_120(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_121, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(121, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_121(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_122, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(122, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_122(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_123, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(123, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_123(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_124, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(124, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_124(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_125, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(125, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_125(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_126, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(126, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_126(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_127, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(127, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_127(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_128, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(128, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_128(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_129, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(129, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_129(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_130, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(130, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_130(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_131, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(131, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_131(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_132, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(132, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_132(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_133, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(133, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_133(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_134, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(134, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_134(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_135, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(135, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_135(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_136, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(136, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_136(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_137, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(137, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_137(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_138, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(138, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_138(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_139, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(139, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_139(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_140, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(140, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_140(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_141, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(141, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_141(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_142, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(142, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_142(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_143, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(143, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_143(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_144, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(144, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_144(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_145, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(145, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_145(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_146, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(146, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_146(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_147, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(147, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_147(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_148, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(148, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_148(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_149, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(149, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_149(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_150, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(150, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_150(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_151, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(151, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_151(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_152, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(152, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_152(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_153, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(153, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_153(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_154, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(154, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_154(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_155, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(155, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_155(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_156, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(156, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_156(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_157, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(157, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_157(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_158, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(158, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_158(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_159, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(159, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_159(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_160, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(160, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_160(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_161, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(161, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_161(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_162, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(162, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_162(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_163, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(163, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_163(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_164, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(164, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_164(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_165, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(165, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_165(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_166, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(166, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_166(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_167, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(167, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_167(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_168, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(168, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_168(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_169, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(169, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_169(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_170, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(170, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_170(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_171, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(171, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_171(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_172, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(172, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_172(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_173, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(173, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_173(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_174, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(174, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_174(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_175, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(175, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_175(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_176, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(176, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_176(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_177, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(177, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_177(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_178, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(178, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_178(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_179, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(179, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_179(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_180, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(180, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_180(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_181, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(181, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_181(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_182, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(182, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_182(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_183, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(183, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_183(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_184, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(184, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_184(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_185, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(185, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_185(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_186, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(186, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_186(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_187, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(187, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_187(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_188, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(188, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_188(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_189, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(189, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_189(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_190, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(190, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_190(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_191, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(191, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_191(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_192, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(192, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_192(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_193, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(193, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_193(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_194, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(194, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_194(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_195, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(195, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_195(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_196, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(196, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_196(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_197, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(197, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_197(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_198, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(198, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_198(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_199, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(199, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_199(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_200, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(200, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_200(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_201, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(201, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_201(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_202, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(202, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_202(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_203, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(203, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_203(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_204, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(204, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_204(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_205, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(205, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_205(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_206, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(206, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_206(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_207, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(207, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_207(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_208, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(208, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_208(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_209, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(209, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_209(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_210, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(210, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_210(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_211, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(211, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_211(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_212, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(212, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_212(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_213, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(213, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_213(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_214, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(214, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_214(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_215, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(215, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_215(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_216, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(216, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_216(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_217, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(217, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_217(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_218, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(218, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_218(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_219, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(219, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_219(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_220, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(220, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_220(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_221, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(221, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_221(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_222, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(222, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_222(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_223, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(223, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_223(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_224, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(224, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_224(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_225, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(225, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_225(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_226, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(226, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_226(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_227, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(227, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_227(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_228, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(228, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_228(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_229, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(229, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_229(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_230, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(230, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_230(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_231, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(231, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_231(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_232, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(232, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_232(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_233, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(233, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_233(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_234, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(234, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_234(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_235, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(235, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_235(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_236, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(236, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_236(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_237, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(237, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_237(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_238, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(238, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_238(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_239, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(239, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_239(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_240, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(240, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_240(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_241, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(241, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_241(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_242, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(242, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_242(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_243, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(243, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_243(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_244, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(244, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_244(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_245, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(245, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_245(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_246, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(246, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_246(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_247, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(247, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_247(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_248, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(248, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_248(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_249, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(249, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_249(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_250, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(250, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_250(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_251, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(251, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_251(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_252, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(252, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_252(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_253, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(253, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_253(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_254, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(254, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_254(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_255, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(255, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_255(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_256, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(256, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_256(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_257, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(257, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/list/detail/edg/fold_left.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_DETAIL_EDG_FOLD_LEFT_HPP\n# define BOOST_PREPROCESSOR_LIST_DETAIL_EDG_FOLD_LEFT_HPP\n#\n# include <boost/preprocessor/control/expr_iif.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/list/adt.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n#\n# define BOOST_PP_LIST_FOLD_LEFT_1(o, s, l) BOOST_PP_LIST_FOLD_LEFT_1_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_2(o, s, l) BOOST_PP_LIST_FOLD_LEFT_2_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_3(o, s, l) BOOST_PP_LIST_FOLD_LEFT_3_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_4(o, s, l) BOOST_PP_LIST_FOLD_LEFT_4_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_5(o, s, l) BOOST_PP_LIST_FOLD_LEFT_5_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_6(o, s, l) BOOST_PP_LIST_FOLD_LEFT_6_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_7(o, s, l) BOOST_PP_LIST_FOLD_LEFT_7_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_8(o, s, l) BOOST_PP_LIST_FOLD_LEFT_8_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_9(o, s, l) BOOST_PP_LIST_FOLD_LEFT_9_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_10(o, s, l) BOOST_PP_LIST_FOLD_LEFT_10_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_11(o, s, l) BOOST_PP_LIST_FOLD_LEFT_11_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_12(o, s, l) BOOST_PP_LIST_FOLD_LEFT_12_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_13(o, s, l) BOOST_PP_LIST_FOLD_LEFT_13_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_14(o, s, l) BOOST_PP_LIST_FOLD_LEFT_14_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_15(o, s, l) BOOST_PP_LIST_FOLD_LEFT_15_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_16(o, s, l) BOOST_PP_LIST_FOLD_LEFT_16_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_17(o, s, l) BOOST_PP_LIST_FOLD_LEFT_17_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_18(o, s, l) BOOST_PP_LIST_FOLD_LEFT_18_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_19(o, s, l) BOOST_PP_LIST_FOLD_LEFT_19_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_20(o, s, l) BOOST_PP_LIST_FOLD_LEFT_20_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_21(o, s, l) BOOST_PP_LIST_FOLD_LEFT_21_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_22(o, s, l) BOOST_PP_LIST_FOLD_LEFT_22_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_23(o, s, l) BOOST_PP_LIST_FOLD_LEFT_23_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_24(o, s, l) BOOST_PP_LIST_FOLD_LEFT_24_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_25(o, s, l) BOOST_PP_LIST_FOLD_LEFT_25_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_26(o, s, l) BOOST_PP_LIST_FOLD_LEFT_26_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_27(o, s, l) BOOST_PP_LIST_FOLD_LEFT_27_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_28(o, s, l) BOOST_PP_LIST_FOLD_LEFT_28_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_29(o, s, l) BOOST_PP_LIST_FOLD_LEFT_29_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_30(o, s, l) BOOST_PP_LIST_FOLD_LEFT_30_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_31(o, s, l) BOOST_PP_LIST_FOLD_LEFT_31_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_32(o, s, l) BOOST_PP_LIST_FOLD_LEFT_32_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_33(o, s, l) BOOST_PP_LIST_FOLD_LEFT_33_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_34(o, s, l) BOOST_PP_LIST_FOLD_LEFT_34_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_35(o, s, l) BOOST_PP_LIST_FOLD_LEFT_35_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_36(o, s, l) BOOST_PP_LIST_FOLD_LEFT_36_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_37(o, s, l) BOOST_PP_LIST_FOLD_LEFT_37_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_38(o, s, l) BOOST_PP_LIST_FOLD_LEFT_38_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_39(o, s, l) BOOST_PP_LIST_FOLD_LEFT_39_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_40(o, s, l) BOOST_PP_LIST_FOLD_LEFT_40_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_41(o, s, l) BOOST_PP_LIST_FOLD_LEFT_41_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_42(o, s, l) BOOST_PP_LIST_FOLD_LEFT_42_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_43(o, s, l) BOOST_PP_LIST_FOLD_LEFT_43_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_44(o, s, l) BOOST_PP_LIST_FOLD_LEFT_44_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_45(o, s, l) BOOST_PP_LIST_FOLD_LEFT_45_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_46(o, s, l) BOOST_PP_LIST_FOLD_LEFT_46_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_47(o, s, l) BOOST_PP_LIST_FOLD_LEFT_47_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_48(o, s, l) BOOST_PP_LIST_FOLD_LEFT_48_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_49(o, s, l) BOOST_PP_LIST_FOLD_LEFT_49_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_50(o, s, l) BOOST_PP_LIST_FOLD_LEFT_50_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_51(o, s, l) BOOST_PP_LIST_FOLD_LEFT_51_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_52(o, s, l) BOOST_PP_LIST_FOLD_LEFT_52_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_53(o, s, l) BOOST_PP_LIST_FOLD_LEFT_53_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_54(o, s, l) BOOST_PP_LIST_FOLD_LEFT_54_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_55(o, s, l) BOOST_PP_LIST_FOLD_LEFT_55_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_56(o, s, l) BOOST_PP_LIST_FOLD_LEFT_56_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_57(o, s, l) BOOST_PP_LIST_FOLD_LEFT_57_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_58(o, s, l) BOOST_PP_LIST_FOLD_LEFT_58_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_59(o, s, l) BOOST_PP_LIST_FOLD_LEFT_59_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_60(o, s, l) BOOST_PP_LIST_FOLD_LEFT_60_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_61(o, s, l) BOOST_PP_LIST_FOLD_LEFT_61_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_62(o, s, l) BOOST_PP_LIST_FOLD_LEFT_62_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_63(o, s, l) BOOST_PP_LIST_FOLD_LEFT_63_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_64(o, s, l) BOOST_PP_LIST_FOLD_LEFT_64_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_65(o, s, l) BOOST_PP_LIST_FOLD_LEFT_65_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_66(o, s, l) BOOST_PP_LIST_FOLD_LEFT_66_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_67(o, s, l) BOOST_PP_LIST_FOLD_LEFT_67_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_68(o, s, l) BOOST_PP_LIST_FOLD_LEFT_68_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_69(o, s, l) BOOST_PP_LIST_FOLD_LEFT_69_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_70(o, s, l) BOOST_PP_LIST_FOLD_LEFT_70_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_71(o, s, l) BOOST_PP_LIST_FOLD_LEFT_71_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_72(o, s, l) BOOST_PP_LIST_FOLD_LEFT_72_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_73(o, s, l) BOOST_PP_LIST_FOLD_LEFT_73_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_74(o, s, l) BOOST_PP_LIST_FOLD_LEFT_74_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_75(o, s, l) BOOST_PP_LIST_FOLD_LEFT_75_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_76(o, s, l) BOOST_PP_LIST_FOLD_LEFT_76_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_77(o, s, l) BOOST_PP_LIST_FOLD_LEFT_77_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_78(o, s, l) BOOST_PP_LIST_FOLD_LEFT_78_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_79(o, s, l) BOOST_PP_LIST_FOLD_LEFT_79_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_80(o, s, l) BOOST_PP_LIST_FOLD_LEFT_80_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_81(o, s, l) BOOST_PP_LIST_FOLD_LEFT_81_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_82(o, s, l) BOOST_PP_LIST_FOLD_LEFT_82_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_83(o, s, l) BOOST_PP_LIST_FOLD_LEFT_83_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_84(o, s, l) BOOST_PP_LIST_FOLD_LEFT_84_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_85(o, s, l) BOOST_PP_LIST_FOLD_LEFT_85_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_86(o, s, l) BOOST_PP_LIST_FOLD_LEFT_86_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_87(o, s, l) BOOST_PP_LIST_FOLD_LEFT_87_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_88(o, s, l) BOOST_PP_LIST_FOLD_LEFT_88_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_89(o, s, l) BOOST_PP_LIST_FOLD_LEFT_89_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_90(o, s, l) BOOST_PP_LIST_FOLD_LEFT_90_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_91(o, s, l) BOOST_PP_LIST_FOLD_LEFT_91_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_92(o, s, l) BOOST_PP_LIST_FOLD_LEFT_92_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_93(o, s, l) BOOST_PP_LIST_FOLD_LEFT_93_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_94(o, s, l) BOOST_PP_LIST_FOLD_LEFT_94_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_95(o, s, l) BOOST_PP_LIST_FOLD_LEFT_95_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_96(o, s, l) BOOST_PP_LIST_FOLD_LEFT_96_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_97(o, s, l) BOOST_PP_LIST_FOLD_LEFT_97_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_98(o, s, l) BOOST_PP_LIST_FOLD_LEFT_98_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_99(o, s, l) BOOST_PP_LIST_FOLD_LEFT_99_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_100(o, s, l) BOOST_PP_LIST_FOLD_LEFT_100_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_101(o, s, l) BOOST_PP_LIST_FOLD_LEFT_101_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_102(o, s, l) BOOST_PP_LIST_FOLD_LEFT_102_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_103(o, s, l) BOOST_PP_LIST_FOLD_LEFT_103_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_104(o, s, l) BOOST_PP_LIST_FOLD_LEFT_104_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_105(o, s, l) BOOST_PP_LIST_FOLD_LEFT_105_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_106(o, s, l) BOOST_PP_LIST_FOLD_LEFT_106_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_107(o, s, l) BOOST_PP_LIST_FOLD_LEFT_107_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_108(o, s, l) BOOST_PP_LIST_FOLD_LEFT_108_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_109(o, s, l) BOOST_PP_LIST_FOLD_LEFT_109_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_110(o, s, l) BOOST_PP_LIST_FOLD_LEFT_110_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_111(o, s, l) BOOST_PP_LIST_FOLD_LEFT_111_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_112(o, s, l) BOOST_PP_LIST_FOLD_LEFT_112_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_113(o, s, l) BOOST_PP_LIST_FOLD_LEFT_113_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_114(o, s, l) BOOST_PP_LIST_FOLD_LEFT_114_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_115(o, s, l) BOOST_PP_LIST_FOLD_LEFT_115_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_116(o, s, l) BOOST_PP_LIST_FOLD_LEFT_116_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_117(o, s, l) BOOST_PP_LIST_FOLD_LEFT_117_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_118(o, s, l) BOOST_PP_LIST_FOLD_LEFT_118_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_119(o, s, l) BOOST_PP_LIST_FOLD_LEFT_119_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_120(o, s, l) BOOST_PP_LIST_FOLD_LEFT_120_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_121(o, s, l) BOOST_PP_LIST_FOLD_LEFT_121_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_122(o, s, l) BOOST_PP_LIST_FOLD_LEFT_122_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_123(o, s, l) BOOST_PP_LIST_FOLD_LEFT_123_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_124(o, s, l) BOOST_PP_LIST_FOLD_LEFT_124_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_125(o, s, l) BOOST_PP_LIST_FOLD_LEFT_125_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_126(o, s, l) BOOST_PP_LIST_FOLD_LEFT_126_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_127(o, s, l) BOOST_PP_LIST_FOLD_LEFT_127_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_128(o, s, l) BOOST_PP_LIST_FOLD_LEFT_128_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_129(o, s, l) BOOST_PP_LIST_FOLD_LEFT_129_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_130(o, s, l) BOOST_PP_LIST_FOLD_LEFT_130_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_131(o, s, l) BOOST_PP_LIST_FOLD_LEFT_131_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_132(o, s, l) BOOST_PP_LIST_FOLD_LEFT_132_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_133(o, s, l) BOOST_PP_LIST_FOLD_LEFT_133_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_134(o, s, l) BOOST_PP_LIST_FOLD_LEFT_134_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_135(o, s, l) BOOST_PP_LIST_FOLD_LEFT_135_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_136(o, s, l) BOOST_PP_LIST_FOLD_LEFT_136_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_137(o, s, l) BOOST_PP_LIST_FOLD_LEFT_137_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_138(o, s, l) BOOST_PP_LIST_FOLD_LEFT_138_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_139(o, s, l) BOOST_PP_LIST_FOLD_LEFT_139_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_140(o, s, l) BOOST_PP_LIST_FOLD_LEFT_140_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_141(o, s, l) BOOST_PP_LIST_FOLD_LEFT_141_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_142(o, s, l) BOOST_PP_LIST_FOLD_LEFT_142_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_143(o, s, l) BOOST_PP_LIST_FOLD_LEFT_143_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_144(o, s, l) BOOST_PP_LIST_FOLD_LEFT_144_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_145(o, s, l) BOOST_PP_LIST_FOLD_LEFT_145_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_146(o, s, l) BOOST_PP_LIST_FOLD_LEFT_146_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_147(o, s, l) BOOST_PP_LIST_FOLD_LEFT_147_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_148(o, s, l) BOOST_PP_LIST_FOLD_LEFT_148_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_149(o, s, l) BOOST_PP_LIST_FOLD_LEFT_149_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_150(o, s, l) BOOST_PP_LIST_FOLD_LEFT_150_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_151(o, s, l) BOOST_PP_LIST_FOLD_LEFT_151_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_152(o, s, l) BOOST_PP_LIST_FOLD_LEFT_152_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_153(o, s, l) BOOST_PP_LIST_FOLD_LEFT_153_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_154(o, s, l) BOOST_PP_LIST_FOLD_LEFT_154_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_155(o, s, l) BOOST_PP_LIST_FOLD_LEFT_155_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_156(o, s, l) BOOST_PP_LIST_FOLD_LEFT_156_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_157(o, s, l) BOOST_PP_LIST_FOLD_LEFT_157_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_158(o, s, l) BOOST_PP_LIST_FOLD_LEFT_158_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_159(o, s, l) BOOST_PP_LIST_FOLD_LEFT_159_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_160(o, s, l) BOOST_PP_LIST_FOLD_LEFT_160_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_161(o, s, l) BOOST_PP_LIST_FOLD_LEFT_161_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_162(o, s, l) BOOST_PP_LIST_FOLD_LEFT_162_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_163(o, s, l) BOOST_PP_LIST_FOLD_LEFT_163_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_164(o, s, l) BOOST_PP_LIST_FOLD_LEFT_164_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_165(o, s, l) BOOST_PP_LIST_FOLD_LEFT_165_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_166(o, s, l) BOOST_PP_LIST_FOLD_LEFT_166_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_167(o, s, l) BOOST_PP_LIST_FOLD_LEFT_167_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_168(o, s, l) BOOST_PP_LIST_FOLD_LEFT_168_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_169(o, s, l) BOOST_PP_LIST_FOLD_LEFT_169_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_170(o, s, l) BOOST_PP_LIST_FOLD_LEFT_170_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_171(o, s, l) BOOST_PP_LIST_FOLD_LEFT_171_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_172(o, s, l) BOOST_PP_LIST_FOLD_LEFT_172_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_173(o, s, l) BOOST_PP_LIST_FOLD_LEFT_173_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_174(o, s, l) BOOST_PP_LIST_FOLD_LEFT_174_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_175(o, s, l) BOOST_PP_LIST_FOLD_LEFT_175_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_176(o, s, l) BOOST_PP_LIST_FOLD_LEFT_176_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_177(o, s, l) BOOST_PP_LIST_FOLD_LEFT_177_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_178(o, s, l) BOOST_PP_LIST_FOLD_LEFT_178_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_179(o, s, l) BOOST_PP_LIST_FOLD_LEFT_179_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_180(o, s, l) BOOST_PP_LIST_FOLD_LEFT_180_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_181(o, s, l) BOOST_PP_LIST_FOLD_LEFT_181_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_182(o, s, l) BOOST_PP_LIST_FOLD_LEFT_182_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_183(o, s, l) BOOST_PP_LIST_FOLD_LEFT_183_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_184(o, s, l) BOOST_PP_LIST_FOLD_LEFT_184_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_185(o, s, l) BOOST_PP_LIST_FOLD_LEFT_185_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_186(o, s, l) BOOST_PP_LIST_FOLD_LEFT_186_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_187(o, s, l) BOOST_PP_LIST_FOLD_LEFT_187_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_188(o, s, l) BOOST_PP_LIST_FOLD_LEFT_188_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_189(o, s, l) BOOST_PP_LIST_FOLD_LEFT_189_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_190(o, s, l) BOOST_PP_LIST_FOLD_LEFT_190_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_191(o, s, l) BOOST_PP_LIST_FOLD_LEFT_191_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_192(o, s, l) BOOST_PP_LIST_FOLD_LEFT_192_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_193(o, s, l) BOOST_PP_LIST_FOLD_LEFT_193_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_194(o, s, l) BOOST_PP_LIST_FOLD_LEFT_194_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_195(o, s, l) BOOST_PP_LIST_FOLD_LEFT_195_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_196(o, s, l) BOOST_PP_LIST_FOLD_LEFT_196_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_197(o, s, l) BOOST_PP_LIST_FOLD_LEFT_197_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_198(o, s, l) BOOST_PP_LIST_FOLD_LEFT_198_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_199(o, s, l) BOOST_PP_LIST_FOLD_LEFT_199_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_200(o, s, l) BOOST_PP_LIST_FOLD_LEFT_200_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_201(o, s, l) BOOST_PP_LIST_FOLD_LEFT_201_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_202(o, s, l) BOOST_PP_LIST_FOLD_LEFT_202_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_203(o, s, l) BOOST_PP_LIST_FOLD_LEFT_203_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_204(o, s, l) BOOST_PP_LIST_FOLD_LEFT_204_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_205(o, s, l) BOOST_PP_LIST_FOLD_LEFT_205_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_206(o, s, l) BOOST_PP_LIST_FOLD_LEFT_206_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_207(o, s, l) BOOST_PP_LIST_FOLD_LEFT_207_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_208(o, s, l) BOOST_PP_LIST_FOLD_LEFT_208_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_209(o, s, l) BOOST_PP_LIST_FOLD_LEFT_209_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_210(o, s, l) BOOST_PP_LIST_FOLD_LEFT_210_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_211(o, s, l) BOOST_PP_LIST_FOLD_LEFT_211_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_212(o, s, l) BOOST_PP_LIST_FOLD_LEFT_212_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_213(o, s, l) BOOST_PP_LIST_FOLD_LEFT_213_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_214(o, s, l) BOOST_PP_LIST_FOLD_LEFT_214_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_215(o, s, l) BOOST_PP_LIST_FOLD_LEFT_215_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_216(o, s, l) BOOST_PP_LIST_FOLD_LEFT_216_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_217(o, s, l) BOOST_PP_LIST_FOLD_LEFT_217_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_218(o, s, l) BOOST_PP_LIST_FOLD_LEFT_218_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_219(o, s, l) BOOST_PP_LIST_FOLD_LEFT_219_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_220(o, s, l) BOOST_PP_LIST_FOLD_LEFT_220_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_221(o, s, l) BOOST_PP_LIST_FOLD_LEFT_221_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_222(o, s, l) BOOST_PP_LIST_FOLD_LEFT_222_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_223(o, s, l) BOOST_PP_LIST_FOLD_LEFT_223_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_224(o, s, l) BOOST_PP_LIST_FOLD_LEFT_224_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_225(o, s, l) BOOST_PP_LIST_FOLD_LEFT_225_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_226(o, s, l) BOOST_PP_LIST_FOLD_LEFT_226_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_227(o, s, l) BOOST_PP_LIST_FOLD_LEFT_227_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_228(o, s, l) BOOST_PP_LIST_FOLD_LEFT_228_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_229(o, s, l) BOOST_PP_LIST_FOLD_LEFT_229_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_230(o, s, l) BOOST_PP_LIST_FOLD_LEFT_230_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_231(o, s, l) BOOST_PP_LIST_FOLD_LEFT_231_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_232(o, s, l) BOOST_PP_LIST_FOLD_LEFT_232_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_233(o, s, l) BOOST_PP_LIST_FOLD_LEFT_233_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_234(o, s, l) BOOST_PP_LIST_FOLD_LEFT_234_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_235(o, s, l) BOOST_PP_LIST_FOLD_LEFT_235_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_236(o, s, l) BOOST_PP_LIST_FOLD_LEFT_236_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_237(o, s, l) BOOST_PP_LIST_FOLD_LEFT_237_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_238(o, s, l) BOOST_PP_LIST_FOLD_LEFT_238_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_239(o, s, l) BOOST_PP_LIST_FOLD_LEFT_239_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_240(o, s, l) BOOST_PP_LIST_FOLD_LEFT_240_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_241(o, s, l) BOOST_PP_LIST_FOLD_LEFT_241_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_242(o, s, l) BOOST_PP_LIST_FOLD_LEFT_242_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_243(o, s, l) BOOST_PP_LIST_FOLD_LEFT_243_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_244(o, s, l) BOOST_PP_LIST_FOLD_LEFT_244_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_245(o, s, l) BOOST_PP_LIST_FOLD_LEFT_245_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_246(o, s, l) BOOST_PP_LIST_FOLD_LEFT_246_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_247(o, s, l) BOOST_PP_LIST_FOLD_LEFT_247_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_248(o, s, l) BOOST_PP_LIST_FOLD_LEFT_248_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_249(o, s, l) BOOST_PP_LIST_FOLD_LEFT_249_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_250(o, s, l) BOOST_PP_LIST_FOLD_LEFT_250_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_251(o, s, l) BOOST_PP_LIST_FOLD_LEFT_251_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_252(o, s, l) BOOST_PP_LIST_FOLD_LEFT_252_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_253(o, s, l) BOOST_PP_LIST_FOLD_LEFT_253_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_254(o, s, l) BOOST_PP_LIST_FOLD_LEFT_254_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_255(o, s, l) BOOST_PP_LIST_FOLD_LEFT_255_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_256(o, s, l) BOOST_PP_LIST_FOLD_LEFT_256_D(o, s, l)\n#\n# define BOOST_PP_LIST_FOLD_LEFT_1_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_2, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(2, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_2_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_3, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(3, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_3_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_4, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(4, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_4_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_5, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(5, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_5_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_6, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(6, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_6_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_7, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(7, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_7_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_8, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(8, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_8_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_9, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(9, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_9_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_10, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(10, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_10_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_11, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(11, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_11_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_12, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(12, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_12_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_13, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(13, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_13_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_14, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(14, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_14_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_15, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(15, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_15_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_16, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(16, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_16_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_17, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(17, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_17_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_18, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(18, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_18_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_19, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(19, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_19_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_20, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(20, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_20_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_21, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(21, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_21_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_22, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(22, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_22_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_23, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(23, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_23_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_24, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(24, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_24_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_25, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(25, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_25_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_26, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(26, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_26_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_27, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(27, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_27_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_28, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(28, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_28_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_29, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(29, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_29_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_30, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(30, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_30_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_31, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(31, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_31_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_32, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(32, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_32_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_33, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(33, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_33_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_34, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(34, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_34_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_35, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(35, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_35_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_36, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(36, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_36_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_37, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(37, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_37_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_38, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(38, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_38_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_39, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(39, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_39_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_40, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(40, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_40_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_41, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(41, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_41_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_42, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(42, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_42_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_43, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(43, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_43_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_44, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(44, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_44_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_45, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(45, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_45_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_46, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(46, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_46_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_47, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(47, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_47_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_48, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(48, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_48_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_49, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(49, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_49_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_50, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(50, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_50_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_51, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(51, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_51_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_52, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(52, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_52_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_53, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(53, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_53_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_54, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(54, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_54_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_55, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(55, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_55_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_56, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(56, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_56_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_57, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(57, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_57_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_58, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(58, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_58_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_59, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(59, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_59_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_60, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(60, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_60_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_61, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(61, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_61_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_62, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(62, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_62_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_63, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(63, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_63_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_64, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(64, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_64_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_65, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(65, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_65_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_66, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(66, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_66_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_67, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(67, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_67_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_68, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(68, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_68_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_69, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(69, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_69_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_70, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(70, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_70_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_71, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(71, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_71_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_72, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(72, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_72_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_73, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(73, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_73_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_74, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(74, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_74_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_75, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(75, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_75_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_76, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(76, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_76_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_77, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(77, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_77_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_78, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(78, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_78_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_79, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(79, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_79_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_80, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(80, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_80_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_81, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(81, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_81_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_82, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(82, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_82_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_83, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(83, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_83_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_84, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(84, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_84_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_85, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(85, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_85_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_86, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(86, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_86_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_87, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(87, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_87_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_88, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(88, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_88_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_89, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(89, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_89_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_90, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(90, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_90_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_91, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(91, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_91_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_92, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(92, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_92_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_93, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(93, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_93_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_94, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(94, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_94_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_95, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(95, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_95_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_96, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(96, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_96_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_97, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(97, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_97_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_98, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(98, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_98_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_99, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(99, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_99_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_100, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(100, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_100_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_101, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(101, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_101_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_102, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(102, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_102_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_103, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(103, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_103_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_104, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(104, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_104_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_105, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(105, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_105_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_106, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(106, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_106_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_107, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(107, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_107_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_108, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(108, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_108_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_109, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(109, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_109_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_110, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(110, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_110_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_111, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(111, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_111_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_112, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(112, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_112_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_113, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(113, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_113_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_114, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(114, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_114_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_115, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(115, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_115_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_116, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(116, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_116_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_117, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(117, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_117_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_118, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(118, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_118_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_119, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(119, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_119_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_120, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(120, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_120_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_121, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(121, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_121_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_122, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(122, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_122_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_123, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(123, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_123_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_124, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(124, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_124_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_125, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(125, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_125_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_126, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(126, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_126_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_127, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(127, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_127_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_128, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(128, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_128_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_129, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(129, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_129_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_130, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(130, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_130_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_131, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(131, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_131_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_132, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(132, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_132_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_133, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(133, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_133_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_134, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(134, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_134_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_135, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(135, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_135_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_136, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(136, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_136_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_137, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(137, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_137_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_138, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(138, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_138_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_139, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(139, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_139_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_140, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(140, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_140_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_141, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(141, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_141_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_142, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(142, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_142_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_143, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(143, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_143_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_144, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(144, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_144_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_145, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(145, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_145_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_146, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(146, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_146_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_147, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(147, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_147_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_148, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(148, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_148_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_149, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(149, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_149_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_150, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(150, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_150_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_151, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(151, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_151_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_152, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(152, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_152_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_153, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(153, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_153_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_154, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(154, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_154_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_155, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(155, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_155_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_156, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(156, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_156_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_157, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(157, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_157_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_158, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(158, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_158_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_159, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(159, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_159_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_160, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(160, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_160_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_161, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(161, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_161_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_162, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(162, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_162_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_163, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(163, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_163_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_164, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(164, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_164_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_165, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(165, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_165_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_166, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(166, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_166_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_167, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(167, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_167_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_168, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(168, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_168_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_169, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(169, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_169_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_170, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(170, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_170_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_171, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(171, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_171_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_172, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(172, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_172_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_173, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(173, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_173_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_174, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(174, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_174_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_175, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(175, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_175_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_176, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(176, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_176_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_177, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(177, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_177_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_178, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(178, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_178_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_179, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(179, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_179_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_180, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(180, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_180_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_181, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(181, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_181_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_182, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(182, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_182_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_183, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(183, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_183_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_184, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(184, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_184_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_185, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(185, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_185_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_186, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(186, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_186_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_187, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(187, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_187_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_188, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(188, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_188_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_189, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(189, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_189_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_190, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(190, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_190_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_191, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(191, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_191_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_192, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(192, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_192_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_193, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(193, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_193_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_194, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(194, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_194_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_195, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(195, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_195_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_196, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(196, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_196_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_197, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(197, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_197_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_198, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(198, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_198_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_199, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(199, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_199_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_200, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(200, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_200_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_201, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(201, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_201_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_202, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(202, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_202_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_203, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(203, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_203_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_204, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(204, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_204_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_205, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(205, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_205_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_206, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(206, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_206_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_207, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(207, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_207_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_208, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(208, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_208_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_209, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(209, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_209_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_210, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(210, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_210_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_211, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(211, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_211_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_212, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(212, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_212_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_213, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(213, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_213_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_214, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(214, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_214_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_215, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(215, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_215_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_216, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(216, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_216_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_217, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(217, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_217_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_218, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(218, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_218_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_219, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(219, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_219_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_220, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(220, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_220_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_221, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(221, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_221_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_222, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(222, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_222_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_223, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(223, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_223_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_224, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(224, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_224_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_225, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(225, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_225_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_226, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(226, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_226_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_227, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(227, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_227_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_228, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(228, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_228_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_229, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(229, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_229_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_230, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(230, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_230_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_231, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(231, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_231_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_232, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(232, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_232_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_233, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(233, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_233_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_234, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(234, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_234_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_235, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(235, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_235_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_236, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(236, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_236_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_237, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(237, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_237_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_238, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(238, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_238_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_239, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(239, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_239_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_240, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(240, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_240_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_241, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(241, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_241_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_242, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(242, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_242_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_243, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(243, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_243_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_244, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(244, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_244_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_245, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(245, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_245_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_246, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(246, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_246_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_247, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(247, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_247_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_248, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(248, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_248_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_249, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(249, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_249_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_250, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(250, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_250_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_251, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(251, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_251_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_252, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(252, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_252_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_253, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(253, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_253_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_254, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(254, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_254_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_255, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(255, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_255_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_256, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(256, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_256_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_257, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(257, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/list/detail/edg/fold_right.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_DETAIL_EDG_FOLD_RIGHT_HPP\n# define BOOST_PREPROCESSOR_LIST_DETAIL_EDG_FOLD_RIGHT_HPP\n#\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/list/adt.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n#\n# define BOOST_PP_LIST_FOLD_RIGHT_1(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_1_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_2(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_2_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_3(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_3_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_4(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_4_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_5(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_5_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_6(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_6_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_7(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_7_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_8(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_8_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_9(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_9_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_10(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_10_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_11(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_11_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_12(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_12_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_13(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_13_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_14(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_14_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_15(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_15_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_16(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_16_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_17(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_17_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_18(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_18_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_19(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_19_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_20(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_20_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_21(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_21_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_22(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_22_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_23(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_23_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_24(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_24_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_25(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_25_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_26(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_26_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_27(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_27_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_28(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_28_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_29(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_29_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_30(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_30_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_31(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_31_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_32(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_32_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_33(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_33_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_34(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_34_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_35(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_35_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_36(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_36_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_37(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_37_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_38(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_38_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_39(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_39_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_40(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_40_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_41(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_41_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_42(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_42_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_43(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_43_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_44(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_44_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_45(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_45_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_46(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_46_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_47(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_47_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_48(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_48_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_49(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_49_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_50(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_50_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_51(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_51_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_52(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_52_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_53(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_53_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_54(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_54_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_55(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_55_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_56(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_56_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_57(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_57_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_58(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_58_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_59(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_59_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_60(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_60_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_61(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_61_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_62(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_62_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_63(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_63_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_64(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_64_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_65(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_65_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_66(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_66_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_67(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_67_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_68(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_68_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_69(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_69_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_70(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_70_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_71(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_71_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_72(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_72_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_73(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_73_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_74(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_74_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_75(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_75_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_76(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_76_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_77(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_77_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_78(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_78_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_79(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_79_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_80(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_80_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_81(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_81_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_82(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_82_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_83(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_83_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_84(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_84_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_85(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_85_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_86(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_86_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_87(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_87_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_88(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_88_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_89(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_89_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_90(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_90_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_91(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_91_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_92(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_92_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_93(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_93_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_94(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_94_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_95(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_95_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_96(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_96_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_97(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_97_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_98(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_98_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_99(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_99_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_100(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_100_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_101(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_101_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_102(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_102_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_103(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_103_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_104(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_104_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_105(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_105_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_106(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_106_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_107(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_107_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_108(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_108_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_109(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_109_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_110(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_110_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_111(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_111_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_112(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_112_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_113(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_113_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_114(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_114_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_115(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_115_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_116(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_116_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_117(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_117_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_118(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_118_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_119(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_119_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_120(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_120_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_121(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_121_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_122(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_122_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_123(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_123_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_124(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_124_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_125(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_125_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_126(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_126_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_127(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_127_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_128(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_128_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_129(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_129_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_130(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_130_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_131(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_131_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_132(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_132_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_133(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_133_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_134(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_134_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_135(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_135_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_136(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_136_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_137(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_137_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_138(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_138_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_139(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_139_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_140(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_140_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_141(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_141_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_142(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_142_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_143(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_143_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_144(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_144_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_145(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_145_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_146(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_146_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_147(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_147_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_148(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_148_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_149(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_149_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_150(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_150_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_151(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_151_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_152(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_152_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_153(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_153_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_154(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_154_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_155(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_155_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_156(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_156_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_157(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_157_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_158(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_158_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_159(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_159_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_160(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_160_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_161(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_161_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_162(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_162_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_163(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_163_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_164(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_164_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_165(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_165_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_166(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_166_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_167(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_167_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_168(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_168_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_169(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_169_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_170(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_170_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_171(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_171_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_172(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_172_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_173(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_173_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_174(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_174_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_175(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_175_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_176(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_176_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_177(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_177_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_178(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_178_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_179(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_179_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_180(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_180_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_181(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_181_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_182(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_182_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_183(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_183_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_184(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_184_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_185(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_185_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_186(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_186_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_187(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_187_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_188(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_188_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_189(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_189_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_190(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_190_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_191(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_191_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_192(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_192_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_193(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_193_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_194(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_194_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_195(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_195_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_196(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_196_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_197(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_197_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_198(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_198_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_199(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_199_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_200(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_200_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_201(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_201_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_202(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_202_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_203(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_203_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_204(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_204_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_205(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_205_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_206(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_206_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_207(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_207_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_208(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_208_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_209(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_209_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_210(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_210_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_211(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_211_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_212(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_212_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_213(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_213_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_214(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_214_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_215(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_215_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_216(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_216_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_217(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_217_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_218(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_218_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_219(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_219_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_220(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_220_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_221(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_221_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_222(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_222_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_223(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_223_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_224(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_224_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_225(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_225_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_226(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_226_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_227(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_227_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_228(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_228_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_229(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_229_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_230(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_230_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_231(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_231_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_232(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_232_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_233(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_233_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_234(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_234_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_235(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_235_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_236(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_236_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_237(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_237_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_238(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_238_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_239(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_239_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_240(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_240_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_241(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_241_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_242(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_242_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_243(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_243_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_244(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_244_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_245(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_245_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_246(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_246_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_247(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_247_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_248(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_248_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_249(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_249_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_250(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_250_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_251(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_251_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_252(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_252_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_253(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_253_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_254(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_254_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_255(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_255_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_256(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_256_D(o, s, l)\n#\n# define BOOST_PP_LIST_FOLD_RIGHT_1_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(2, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_2, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_2_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(3, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_3, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_3_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(4, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_4, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_4_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(5, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_5, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_5_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(6, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_6, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_6_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(7, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_7, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_7_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(8, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_8, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_8_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(9, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_9, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_9_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(10, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_10, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_10_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(11, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_11, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_11_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(12, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_12, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_12_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(13, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_13, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_13_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(14, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_14, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_14_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(15, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_15, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_15_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(16, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_16, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_16_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(17, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_17, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_17_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(18, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_18, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_18_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(19, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_19, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_19_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(20, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_20, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_20_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(21, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_21, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_21_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(22, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_22, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_22_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(23, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_23, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_23_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(24, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_24, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_24_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(25, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_25, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_25_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(26, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_26, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_26_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(27, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_27, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_27_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(28, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_28, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_28_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(29, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_29, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_29_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(30, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_30, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_30_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(31, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_31, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_31_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(32, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_32, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_32_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(33, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_33, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_33_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(34, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_34, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_34_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(35, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_35, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_35_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(36, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_36, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_36_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(37, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_37, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_37_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(38, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_38, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_38_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(39, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_39, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_39_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(40, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_40, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_40_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(41, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_41, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_41_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(42, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_42, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_42_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(43, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_43, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_43_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(44, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_44, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_44_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(45, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_45, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_45_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(46, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_46, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_46_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(47, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_47, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_47_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(48, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_48, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_48_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(49, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_49, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_49_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(50, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_50, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_50_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(51, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_51, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_51_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(52, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_52, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_52_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(53, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_53, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_53_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(54, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_54, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_54_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(55, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_55, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_55_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(56, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_56, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_56_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(57, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_57, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_57_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(58, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_58, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_58_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(59, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_59, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_59_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(60, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_60, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_60_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(61, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_61, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_61_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(62, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_62, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_62_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(63, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_63, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_63_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(64, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_64, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_64_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(65, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_65, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_65_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(66, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_66, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_66_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(67, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_67, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_67_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(68, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_68, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_68_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(69, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_69, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_69_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(70, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_70, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_70_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(71, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_71, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_71_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(72, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_72, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_72_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(73, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_73, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_73_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(74, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_74, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_74_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(75, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_75, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_75_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(76, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_76, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_76_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(77, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_77, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_77_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(78, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_78, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_78_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(79, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_79, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_79_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(80, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_80, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_80_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(81, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_81, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_81_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(82, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_82, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_82_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(83, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_83, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_83_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(84, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_84, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_84_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(85, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_85, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_85_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(86, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_86, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_86_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(87, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_87, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_87_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(88, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_88, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_88_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(89, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_89, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_89_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(90, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_90, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_90_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(91, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_91, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_91_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(92, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_92, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_92_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(93, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_93, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_93_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(94, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_94, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_94_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(95, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_95, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_95_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(96, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_96, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_96_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(97, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_97, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_97_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(98, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_98, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_98_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(99, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_99, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_99_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(100, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_100, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_100_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(101, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_101, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_101_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(102, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_102, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_102_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(103, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_103, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_103_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(104, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_104, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_104_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(105, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_105, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_105_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(106, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_106, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_106_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(107, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_107, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_107_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(108, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_108, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_108_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(109, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_109, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_109_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(110, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_110, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_110_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(111, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_111, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_111_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(112, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_112, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_112_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(113, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_113, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_113_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(114, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_114, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_114_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(115, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_115, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_115_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(116, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_116, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_116_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(117, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_117, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_117_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(118, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_118, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_118_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(119, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_119, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_119_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(120, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_120, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_120_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(121, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_121, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_121_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(122, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_122, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_122_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(123, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_123, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_123_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(124, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_124, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_124_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(125, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_125, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_125_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(126, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_126, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_126_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(127, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_127, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_127_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(128, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_128, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_128_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(129, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_129, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_129_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(130, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_130, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_130_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(131, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_131, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_131_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(132, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_132, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_132_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(133, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_133, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_133_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(134, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_134, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_134_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(135, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_135, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_135_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(136, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_136, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_136_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(137, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_137, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_137_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(138, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_138, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_138_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(139, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_139, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_139_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(140, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_140, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_140_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(141, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_141, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_141_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(142, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_142, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_142_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(143, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_143, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_143_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(144, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_144, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_144_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(145, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_145, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_145_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(146, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_146, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_146_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(147, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_147, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_147_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(148, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_148, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_148_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(149, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_149, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_149_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(150, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_150, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_150_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(151, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_151, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_151_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(152, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_152, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_152_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(153, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_153, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_153_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(154, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_154, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_154_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(155, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_155, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_155_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(156, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_156, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_156_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(157, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_157, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_157_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(158, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_158, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_158_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(159, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_159, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_159_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(160, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_160, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_160_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(161, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_161, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_161_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(162, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_162, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_162_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(163, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_163, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_163_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(164, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_164, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_164_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(165, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_165, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_165_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(166, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_166, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_166_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(167, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_167, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_167_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(168, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_168, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_168_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(169, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_169, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_169_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(170, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_170, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_170_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(171, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_171, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_171_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(172, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_172, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_172_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(173, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_173, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_173_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(174, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_174, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_174_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(175, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_175, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_175_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(176, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_176, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_176_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(177, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_177, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_177_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(178, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_178, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_178_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(179, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_179, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_179_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(180, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_180, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_180_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(181, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_181, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_181_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(182, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_182, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_182_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(183, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_183, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_183_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(184, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_184, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_184_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(185, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_185, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_185_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(186, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_186, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_186_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(187, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_187, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_187_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(188, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_188, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_188_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(189, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_189, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_189_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(190, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_190, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_190_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(191, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_191, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_191_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(192, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_192, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_192_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(193, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_193, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_193_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(194, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_194, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_194_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(195, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_195, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_195_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(196, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_196, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_196_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(197, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_197, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_197_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(198, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_198, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_198_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(199, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_199, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_199_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(200, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_200, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_200_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(201, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_201, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_201_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(202, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_202, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_202_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(203, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_203, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_203_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(204, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_204, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_204_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(205, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_205, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_205_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(206, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_206, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_206_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(207, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_207, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_207_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(208, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_208, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_208_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(209, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_209, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_209_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(210, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_210, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_210_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(211, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_211, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_211_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(212, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_212, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_212_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(213, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_213, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_213_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(214, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_214, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_214_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(215, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_215, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_215_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(216, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_216, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_216_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(217, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_217, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_217_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(218, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_218, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_218_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(219, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_219, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_219_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(220, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_220, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_220_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(221, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_221, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_221_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(222, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_222, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_222_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(223, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_223, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_223_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(224, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_224, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_224_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(225, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_225, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_225_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(226, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_226, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_226_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(227, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_227, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_227_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(228, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_228, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_228_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(229, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_229, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_229_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(230, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_230, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_230_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(231, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_231, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_231_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(232, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_232, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_232_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(233, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_233, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_233_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(234, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_234, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_234_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(235, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_235, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_235_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(236, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_236, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_236_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(237, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_237, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_237_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(238, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_238, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_238_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(239, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_239, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_239_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(240, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_240, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_240_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(241, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_241, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_241_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(242, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_242, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_242_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(243, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_243, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_243_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(244, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_244, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_244_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(245, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_245, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_245_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(246, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_246, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_246_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(247, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_247, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_247_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(248, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_248, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_248_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(249, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_249, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_249_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(250, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_250, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_250_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(251, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_251, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_251_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(252, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_252, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_252_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(253, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_253, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_253_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(254, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_254, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_254_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(255, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_255, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_255_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(256, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_256, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_256_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(257, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_257, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n#\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_NIL 1\n#\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_1(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_2(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_3(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_4(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_5(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_6(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_7(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_8(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_9(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_10(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_11(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_12(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_13(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_14(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_15(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_16(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_17(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_18(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_19(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_20(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_21(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_22(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_23(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_24(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_25(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_26(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_27(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_28(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_29(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_30(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_31(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_32(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_33(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_34(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_35(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_36(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_37(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_38(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_39(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_40(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_41(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_42(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_43(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_44(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_45(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_46(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_47(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_48(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_49(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_50(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_51(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_52(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_53(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_54(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_55(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_56(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_57(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_58(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_59(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_60(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_61(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_62(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_63(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_64(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_65(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_66(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_67(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_68(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_69(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_70(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_71(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_72(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_73(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_74(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_75(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_76(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_77(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_78(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_79(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_80(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_81(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_82(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_83(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_84(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_85(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_86(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_87(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_88(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_89(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_90(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_91(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_92(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_93(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_94(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_95(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_96(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_97(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_98(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_99(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_100(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_101(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_102(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_103(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_104(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_105(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_106(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_107(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_108(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_109(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_110(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_111(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_112(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_113(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_114(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_115(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_116(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_117(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_118(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_119(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_120(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_121(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_122(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_123(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_124(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_125(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_126(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_127(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_128(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_129(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_130(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_131(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_132(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_133(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_134(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_135(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_136(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_137(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_138(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_139(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_140(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_141(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_142(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_143(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_144(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_145(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_146(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_147(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_148(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_149(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_150(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_151(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_152(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_153(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_154(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_155(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_156(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_157(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_158(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_159(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_160(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_161(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_162(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_163(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_164(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_165(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_166(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_167(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_168(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_169(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_170(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_171(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_172(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_173(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_174(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_175(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_176(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_177(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_178(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_179(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_180(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_181(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_182(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_183(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_184(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_185(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_186(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_187(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_188(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_189(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_190(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_191(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_192(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_193(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_194(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_195(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_196(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_197(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_198(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_199(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_200(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_201(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_202(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_203(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_204(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_205(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_206(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_207(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_208(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_209(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_210(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_211(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_212(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_213(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_214(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_215(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_216(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_217(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_218(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_219(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_220(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_221(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_222(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_223(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_224(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_225(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_226(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_227(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_228(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_229(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_230(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_231(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_232(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_233(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_234(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_235(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_236(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_237(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_238(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_239(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_240(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_241(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_242(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_243(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_244(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_245(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_246(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_247(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_248(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_249(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_250(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_251(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_252(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_253(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_254(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_255(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_256(o, s, l) 0\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/list/detail/fold_left.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_DETAIL_FOLD_LEFT_HPP\n# define BOOST_PREPROCESSOR_LIST_DETAIL_FOLD_LEFT_HPP\n#\n# include <boost/preprocessor/control/expr_iif.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/list/adt.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n#\n# define BOOST_PP_LIST_FOLD_LEFT_1(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_2, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(2, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_2(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_3, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(3, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_3(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_4, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(4, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_4(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_5, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(5, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_5(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_6, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(6, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_6(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_7, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(7, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_7(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_8, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(8, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_8(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_9, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(9, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_9(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_10, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(10, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_10(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_11, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(11, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_11(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_12, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(12, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_12(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_13, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(13, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_13(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_14, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(14, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_14(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_15, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(15, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_15(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_16, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(16, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_16(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_17, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(17, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_17(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_18, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(18, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_18(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_19, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(19, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_19(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_20, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(20, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_20(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_21, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(21, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_21(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_22, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(22, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_22(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_23, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(23, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_23(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_24, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(24, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_24(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_25, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(25, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_25(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_26, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(26, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_26(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_27, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(27, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_27(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_28, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(28, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_28(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_29, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(29, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_29(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_30, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(30, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_30(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_31, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(31, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_31(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_32, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(32, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_32(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_33, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(33, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_33(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_34, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(34, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_34(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_35, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(35, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_35(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_36, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(36, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_36(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_37, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(37, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_37(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_38, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(38, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_38(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_39, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(39, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_39(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_40, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(40, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_40(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_41, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(41, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_41(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_42, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(42, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_42(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_43, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(43, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_43(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_44, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(44, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_44(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_45, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(45, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_45(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_46, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(46, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_46(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_47, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(47, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_47(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_48, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(48, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_48(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_49, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(49, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_49(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_50, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(50, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_50(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_51, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(51, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_51(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_52, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(52, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_52(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_53, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(53, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_53(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_54, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(54, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_54(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_55, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(55, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_55(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_56, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(56, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_56(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_57, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(57, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_57(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_58, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(58, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_58(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_59, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(59, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_59(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_60, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(60, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_60(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_61, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(61, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_61(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_62, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(62, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_62(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_63, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(63, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_63(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_64, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(64, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_64(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_65, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(65, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_65(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_66, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(66, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_66(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_67, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(67, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_67(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_68, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(68, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_68(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_69, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(69, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_69(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_70, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(70, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_70(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_71, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(71, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_71(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_72, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(72, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_72(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_73, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(73, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_73(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_74, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(74, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_74(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_75, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(75, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_75(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_76, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(76, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_76(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_77, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(77, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_77(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_78, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(78, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_78(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_79, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(79, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_79(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_80, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(80, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_80(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_81, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(81, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_81(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_82, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(82, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_82(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_83, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(83, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_83(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_84, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(84, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_84(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_85, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(85, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_85(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_86, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(86, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_86(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_87, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(87, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_87(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_88, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(88, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_88(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_89, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(89, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_89(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_90, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(90, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_90(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_91, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(91, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_91(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_92, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(92, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_92(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_93, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(93, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_93(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_94, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(94, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_94(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_95, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(95, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_95(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_96, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(96, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_96(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_97, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(97, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_97(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_98, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(98, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_98(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_99, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(99, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_99(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_100, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(100, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_100(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_101, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(101, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_101(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_102, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(102, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_102(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_103, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(103, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_103(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_104, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(104, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_104(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_105, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(105, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_105(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_106, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(106, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_106(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_107, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(107, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_107(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_108, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(108, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_108(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_109, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(109, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_109(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_110, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(110, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_110(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_111, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(111, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_111(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_112, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(112, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_112(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_113, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(113, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_113(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_114, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(114, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_114(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_115, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(115, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_115(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_116, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(116, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_116(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_117, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(117, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_117(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_118, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(118, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_118(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_119, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(119, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_119(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_120, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(120, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_120(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_121, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(121, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_121(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_122, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(122, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_122(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_123, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(123, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_123(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_124, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(124, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_124(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_125, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(125, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_125(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_126, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(126, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_126(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_127, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(127, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_127(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_128, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(128, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_128(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_129, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(129, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_129(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_130, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(130, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_130(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_131, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(131, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_131(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_132, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(132, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_132(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_133, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(133, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_133(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_134, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(134, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_134(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_135, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(135, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_135(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_136, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(136, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_136(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_137, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(137, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_137(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_138, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(138, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_138(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_139, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(139, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_139(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_140, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(140, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_140(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_141, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(141, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_141(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_142, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(142, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_142(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_143, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(143, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_143(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_144, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(144, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_144(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_145, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(145, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_145(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_146, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(146, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_146(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_147, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(147, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_147(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_148, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(148, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_148(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_149, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(149, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_149(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_150, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(150, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_150(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_151, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(151, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_151(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_152, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(152, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_152(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_153, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(153, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_153(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_154, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(154, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_154(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_155, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(155, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_155(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_156, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(156, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_156(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_157, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(157, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_157(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_158, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(158, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_158(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_159, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(159, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_159(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_160, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(160, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_160(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_161, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(161, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_161(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_162, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(162, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_162(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_163, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(163, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_163(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_164, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(164, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_164(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_165, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(165, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_165(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_166, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(166, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_166(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_167, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(167, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_167(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_168, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(168, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_168(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_169, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(169, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_169(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_170, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(170, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_170(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_171, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(171, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_171(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_172, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(172, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_172(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_173, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(173, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_173(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_174, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(174, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_174(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_175, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(175, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_175(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_176, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(176, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_176(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_177, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(177, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_177(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_178, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(178, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_178(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_179, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(179, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_179(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_180, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(180, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_180(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_181, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(181, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_181(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_182, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(182, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_182(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_183, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(183, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_183(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_184, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(184, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_184(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_185, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(185, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_185(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_186, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(186, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_186(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_187, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(187, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_187(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_188, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(188, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_188(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_189, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(189, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_189(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_190, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(190, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_190(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_191, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(191, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_191(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_192, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(192, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_192(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_193, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(193, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_193(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_194, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(194, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_194(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_195, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(195, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_195(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_196, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(196, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_196(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_197, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(197, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_197(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_198, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(198, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_198(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_199, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(199, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_199(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_200, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(200, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_200(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_201, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(201, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_201(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_202, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(202, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_202(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_203, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(203, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_203(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_204, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(204, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_204(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_205, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(205, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_205(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_206, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(206, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_206(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_207, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(207, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_207(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_208, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(208, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_208(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_209, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(209, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_209(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_210, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(210, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_210(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_211, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(211, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_211(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_212, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(212, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_212(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_213, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(213, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_213(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_214, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(214, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_214(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_215, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(215, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_215(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_216, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(216, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_216(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_217, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(217, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_217(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_218, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(218, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_218(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_219, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(219, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_219(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_220, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(220, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_220(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_221, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(221, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_221(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_222, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(222, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_222(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_223, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(223, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_223(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_224, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(224, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_224(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_225, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(225, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_225(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_226, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(226, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_226(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_227, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(227, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_227(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_228, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(228, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_228(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_229, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(229, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_229(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_230, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(230, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_230(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_231, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(231, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_231(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_232, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(232, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_232(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_233, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(233, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_233(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_234, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(234, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_234(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_235, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(235, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_235(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_236, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(236, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_236(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_237, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(237, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_237(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_238, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(238, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_238(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_239, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(239, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_239(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_240, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(240, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_240(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_241, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(241, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_241(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_242, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(242, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_242(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_243, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(243, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_243(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_244, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(244, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_244(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_245, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(245, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_245(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_246, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(246, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_246(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_247, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(247, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_247(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_248, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(248, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_248(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_249, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(249, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_249(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_250, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(250, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_250(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_251, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(251, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_251(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_252, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(252, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_252(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_253, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(253, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_253(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_254, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(254, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_254(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_255, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(255, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_255(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_256, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(256, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_256(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_257, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(257, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/list/detail/fold_right.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_DETAIL_FOLD_RIGHT_HPP\n# define BOOST_PREPROCESSOR_LIST_DETAIL_FOLD_RIGHT_HPP\n#\n# include <boost/preprocessor/list/fold_left.hpp>\n# include <boost/preprocessor/list/reverse.hpp>\n#\n# define BOOST_PP_LIST_FOLD_RIGHT_1(o, s, l) BOOST_PP_LIST_FOLD_LEFT_1(o, s, BOOST_PP_LIST_REVERSE_D(1, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_2(o, s, l) BOOST_PP_LIST_FOLD_LEFT_2(o, s, BOOST_PP_LIST_REVERSE_D(2, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_3(o, s, l) BOOST_PP_LIST_FOLD_LEFT_3(o, s, BOOST_PP_LIST_REVERSE_D(3, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_4(o, s, l) BOOST_PP_LIST_FOLD_LEFT_4(o, s, BOOST_PP_LIST_REVERSE_D(4, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_5(o, s, l) BOOST_PP_LIST_FOLD_LEFT_5(o, s, BOOST_PP_LIST_REVERSE_D(5, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_6(o, s, l) BOOST_PP_LIST_FOLD_LEFT_6(o, s, BOOST_PP_LIST_REVERSE_D(6, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_7(o, s, l) BOOST_PP_LIST_FOLD_LEFT_7(o, s, BOOST_PP_LIST_REVERSE_D(7, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_8(o, s, l) BOOST_PP_LIST_FOLD_LEFT_8(o, s, BOOST_PP_LIST_REVERSE_D(8, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_9(o, s, l) BOOST_PP_LIST_FOLD_LEFT_9(o, s, BOOST_PP_LIST_REVERSE_D(9, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_10(o, s, l) BOOST_PP_LIST_FOLD_LEFT_10(o, s, BOOST_PP_LIST_REVERSE_D(10, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_11(o, s, l) BOOST_PP_LIST_FOLD_LEFT_11(o, s, BOOST_PP_LIST_REVERSE_D(11, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_12(o, s, l) BOOST_PP_LIST_FOLD_LEFT_12(o, s, BOOST_PP_LIST_REVERSE_D(12, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_13(o, s, l) BOOST_PP_LIST_FOLD_LEFT_13(o, s, BOOST_PP_LIST_REVERSE_D(13, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_14(o, s, l) BOOST_PP_LIST_FOLD_LEFT_14(o, s, BOOST_PP_LIST_REVERSE_D(14, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_15(o, s, l) BOOST_PP_LIST_FOLD_LEFT_15(o, s, BOOST_PP_LIST_REVERSE_D(15, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_16(o, s, l) BOOST_PP_LIST_FOLD_LEFT_16(o, s, BOOST_PP_LIST_REVERSE_D(16, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_17(o, s, l) BOOST_PP_LIST_FOLD_LEFT_17(o, s, BOOST_PP_LIST_REVERSE_D(17, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_18(o, s, l) BOOST_PP_LIST_FOLD_LEFT_18(o, s, BOOST_PP_LIST_REVERSE_D(18, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_19(o, s, l) BOOST_PP_LIST_FOLD_LEFT_19(o, s, BOOST_PP_LIST_REVERSE_D(19, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_20(o, s, l) BOOST_PP_LIST_FOLD_LEFT_20(o, s, BOOST_PP_LIST_REVERSE_D(20, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_21(o, s, l) BOOST_PP_LIST_FOLD_LEFT_21(o, s, BOOST_PP_LIST_REVERSE_D(21, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_22(o, s, l) BOOST_PP_LIST_FOLD_LEFT_22(o, s, BOOST_PP_LIST_REVERSE_D(22, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_23(o, s, l) BOOST_PP_LIST_FOLD_LEFT_23(o, s, BOOST_PP_LIST_REVERSE_D(23, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_24(o, s, l) BOOST_PP_LIST_FOLD_LEFT_24(o, s, BOOST_PP_LIST_REVERSE_D(24, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_25(o, s, l) BOOST_PP_LIST_FOLD_LEFT_25(o, s, BOOST_PP_LIST_REVERSE_D(25, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_26(o, s, l) BOOST_PP_LIST_FOLD_LEFT_26(o, s, BOOST_PP_LIST_REVERSE_D(26, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_27(o, s, l) BOOST_PP_LIST_FOLD_LEFT_27(o, s, BOOST_PP_LIST_REVERSE_D(27, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_28(o, s, l) BOOST_PP_LIST_FOLD_LEFT_28(o, s, BOOST_PP_LIST_REVERSE_D(28, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_29(o, s, l) BOOST_PP_LIST_FOLD_LEFT_29(o, s, BOOST_PP_LIST_REVERSE_D(29, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_30(o, s, l) BOOST_PP_LIST_FOLD_LEFT_30(o, s, BOOST_PP_LIST_REVERSE_D(30, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_31(o, s, l) BOOST_PP_LIST_FOLD_LEFT_31(o, s, BOOST_PP_LIST_REVERSE_D(31, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_32(o, s, l) BOOST_PP_LIST_FOLD_LEFT_32(o, s, BOOST_PP_LIST_REVERSE_D(32, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_33(o, s, l) BOOST_PP_LIST_FOLD_LEFT_33(o, s, BOOST_PP_LIST_REVERSE_D(33, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_34(o, s, l) BOOST_PP_LIST_FOLD_LEFT_34(o, s, BOOST_PP_LIST_REVERSE_D(34, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_35(o, s, l) BOOST_PP_LIST_FOLD_LEFT_35(o, s, BOOST_PP_LIST_REVERSE_D(35, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_36(o, s, l) BOOST_PP_LIST_FOLD_LEFT_36(o, s, BOOST_PP_LIST_REVERSE_D(36, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_37(o, s, l) BOOST_PP_LIST_FOLD_LEFT_37(o, s, BOOST_PP_LIST_REVERSE_D(37, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_38(o, s, l) BOOST_PP_LIST_FOLD_LEFT_38(o, s, BOOST_PP_LIST_REVERSE_D(38, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_39(o, s, l) BOOST_PP_LIST_FOLD_LEFT_39(o, s, BOOST_PP_LIST_REVERSE_D(39, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_40(o, s, l) BOOST_PP_LIST_FOLD_LEFT_40(o, s, BOOST_PP_LIST_REVERSE_D(40, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_41(o, s, l) BOOST_PP_LIST_FOLD_LEFT_41(o, s, BOOST_PP_LIST_REVERSE_D(41, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_42(o, s, l) BOOST_PP_LIST_FOLD_LEFT_42(o, s, BOOST_PP_LIST_REVERSE_D(42, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_43(o, s, l) BOOST_PP_LIST_FOLD_LEFT_43(o, s, BOOST_PP_LIST_REVERSE_D(43, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_44(o, s, l) BOOST_PP_LIST_FOLD_LEFT_44(o, s, BOOST_PP_LIST_REVERSE_D(44, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_45(o, s, l) BOOST_PP_LIST_FOLD_LEFT_45(o, s, BOOST_PP_LIST_REVERSE_D(45, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_46(o, s, l) BOOST_PP_LIST_FOLD_LEFT_46(o, s, BOOST_PP_LIST_REVERSE_D(46, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_47(o, s, l) BOOST_PP_LIST_FOLD_LEFT_47(o, s, BOOST_PP_LIST_REVERSE_D(47, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_48(o, s, l) BOOST_PP_LIST_FOLD_LEFT_48(o, s, BOOST_PP_LIST_REVERSE_D(48, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_49(o, s, l) BOOST_PP_LIST_FOLD_LEFT_49(o, s, BOOST_PP_LIST_REVERSE_D(49, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_50(o, s, l) BOOST_PP_LIST_FOLD_LEFT_50(o, s, BOOST_PP_LIST_REVERSE_D(50, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_51(o, s, l) BOOST_PP_LIST_FOLD_LEFT_51(o, s, BOOST_PP_LIST_REVERSE_D(51, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_52(o, s, l) BOOST_PP_LIST_FOLD_LEFT_52(o, s, BOOST_PP_LIST_REVERSE_D(52, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_53(o, s, l) BOOST_PP_LIST_FOLD_LEFT_53(o, s, BOOST_PP_LIST_REVERSE_D(53, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_54(o, s, l) BOOST_PP_LIST_FOLD_LEFT_54(o, s, BOOST_PP_LIST_REVERSE_D(54, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_55(o, s, l) BOOST_PP_LIST_FOLD_LEFT_55(o, s, BOOST_PP_LIST_REVERSE_D(55, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_56(o, s, l) BOOST_PP_LIST_FOLD_LEFT_56(o, s, BOOST_PP_LIST_REVERSE_D(56, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_57(o, s, l) BOOST_PP_LIST_FOLD_LEFT_57(o, s, BOOST_PP_LIST_REVERSE_D(57, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_58(o, s, l) BOOST_PP_LIST_FOLD_LEFT_58(o, s, BOOST_PP_LIST_REVERSE_D(58, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_59(o, s, l) BOOST_PP_LIST_FOLD_LEFT_59(o, s, BOOST_PP_LIST_REVERSE_D(59, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_60(o, s, l) BOOST_PP_LIST_FOLD_LEFT_60(o, s, BOOST_PP_LIST_REVERSE_D(60, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_61(o, s, l) BOOST_PP_LIST_FOLD_LEFT_61(o, s, BOOST_PP_LIST_REVERSE_D(61, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_62(o, s, l) BOOST_PP_LIST_FOLD_LEFT_62(o, s, BOOST_PP_LIST_REVERSE_D(62, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_63(o, s, l) BOOST_PP_LIST_FOLD_LEFT_63(o, s, BOOST_PP_LIST_REVERSE_D(63, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_64(o, s, l) BOOST_PP_LIST_FOLD_LEFT_64(o, s, BOOST_PP_LIST_REVERSE_D(64, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_65(o, s, l) BOOST_PP_LIST_FOLD_LEFT_65(o, s, BOOST_PP_LIST_REVERSE_D(65, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_66(o, s, l) BOOST_PP_LIST_FOLD_LEFT_66(o, s, BOOST_PP_LIST_REVERSE_D(66, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_67(o, s, l) BOOST_PP_LIST_FOLD_LEFT_67(o, s, BOOST_PP_LIST_REVERSE_D(67, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_68(o, s, l) BOOST_PP_LIST_FOLD_LEFT_68(o, s, BOOST_PP_LIST_REVERSE_D(68, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_69(o, s, l) BOOST_PP_LIST_FOLD_LEFT_69(o, s, BOOST_PP_LIST_REVERSE_D(69, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_70(o, s, l) BOOST_PP_LIST_FOLD_LEFT_70(o, s, BOOST_PP_LIST_REVERSE_D(70, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_71(o, s, l) BOOST_PP_LIST_FOLD_LEFT_71(o, s, BOOST_PP_LIST_REVERSE_D(71, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_72(o, s, l) BOOST_PP_LIST_FOLD_LEFT_72(o, s, BOOST_PP_LIST_REVERSE_D(72, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_73(o, s, l) BOOST_PP_LIST_FOLD_LEFT_73(o, s, BOOST_PP_LIST_REVERSE_D(73, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_74(o, s, l) BOOST_PP_LIST_FOLD_LEFT_74(o, s, BOOST_PP_LIST_REVERSE_D(74, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_75(o, s, l) BOOST_PP_LIST_FOLD_LEFT_75(o, s, BOOST_PP_LIST_REVERSE_D(75, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_76(o, s, l) BOOST_PP_LIST_FOLD_LEFT_76(o, s, BOOST_PP_LIST_REVERSE_D(76, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_77(o, s, l) BOOST_PP_LIST_FOLD_LEFT_77(o, s, BOOST_PP_LIST_REVERSE_D(77, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_78(o, s, l) BOOST_PP_LIST_FOLD_LEFT_78(o, s, BOOST_PP_LIST_REVERSE_D(78, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_79(o, s, l) BOOST_PP_LIST_FOLD_LEFT_79(o, s, BOOST_PP_LIST_REVERSE_D(79, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_80(o, s, l) BOOST_PP_LIST_FOLD_LEFT_80(o, s, BOOST_PP_LIST_REVERSE_D(80, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_81(o, s, l) BOOST_PP_LIST_FOLD_LEFT_81(o, s, BOOST_PP_LIST_REVERSE_D(81, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_82(o, s, l) BOOST_PP_LIST_FOLD_LEFT_82(o, s, BOOST_PP_LIST_REVERSE_D(82, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_83(o, s, l) BOOST_PP_LIST_FOLD_LEFT_83(o, s, BOOST_PP_LIST_REVERSE_D(83, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_84(o, s, l) BOOST_PP_LIST_FOLD_LEFT_84(o, s, BOOST_PP_LIST_REVERSE_D(84, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_85(o, s, l) BOOST_PP_LIST_FOLD_LEFT_85(o, s, BOOST_PP_LIST_REVERSE_D(85, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_86(o, s, l) BOOST_PP_LIST_FOLD_LEFT_86(o, s, BOOST_PP_LIST_REVERSE_D(86, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_87(o, s, l) BOOST_PP_LIST_FOLD_LEFT_87(o, s, BOOST_PP_LIST_REVERSE_D(87, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_88(o, s, l) BOOST_PP_LIST_FOLD_LEFT_88(o, s, BOOST_PP_LIST_REVERSE_D(88, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_89(o, s, l) BOOST_PP_LIST_FOLD_LEFT_89(o, s, BOOST_PP_LIST_REVERSE_D(89, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_90(o, s, l) BOOST_PP_LIST_FOLD_LEFT_90(o, s, BOOST_PP_LIST_REVERSE_D(90, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_91(o, s, l) BOOST_PP_LIST_FOLD_LEFT_91(o, s, BOOST_PP_LIST_REVERSE_D(91, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_92(o, s, l) BOOST_PP_LIST_FOLD_LEFT_92(o, s, BOOST_PP_LIST_REVERSE_D(92, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_93(o, s, l) BOOST_PP_LIST_FOLD_LEFT_93(o, s, BOOST_PP_LIST_REVERSE_D(93, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_94(o, s, l) BOOST_PP_LIST_FOLD_LEFT_94(o, s, BOOST_PP_LIST_REVERSE_D(94, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_95(o, s, l) BOOST_PP_LIST_FOLD_LEFT_95(o, s, BOOST_PP_LIST_REVERSE_D(95, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_96(o, s, l) BOOST_PP_LIST_FOLD_LEFT_96(o, s, BOOST_PP_LIST_REVERSE_D(96, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_97(o, s, l) BOOST_PP_LIST_FOLD_LEFT_97(o, s, BOOST_PP_LIST_REVERSE_D(97, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_98(o, s, l) BOOST_PP_LIST_FOLD_LEFT_98(o, s, BOOST_PP_LIST_REVERSE_D(98, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_99(o, s, l) BOOST_PP_LIST_FOLD_LEFT_99(o, s, BOOST_PP_LIST_REVERSE_D(99, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_100(o, s, l) BOOST_PP_LIST_FOLD_LEFT_100(o, s, BOOST_PP_LIST_REVERSE_D(100, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_101(o, s, l) BOOST_PP_LIST_FOLD_LEFT_101(o, s, BOOST_PP_LIST_REVERSE_D(101, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_102(o, s, l) BOOST_PP_LIST_FOLD_LEFT_102(o, s, BOOST_PP_LIST_REVERSE_D(102, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_103(o, s, l) BOOST_PP_LIST_FOLD_LEFT_103(o, s, BOOST_PP_LIST_REVERSE_D(103, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_104(o, s, l) BOOST_PP_LIST_FOLD_LEFT_104(o, s, BOOST_PP_LIST_REVERSE_D(104, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_105(o, s, l) BOOST_PP_LIST_FOLD_LEFT_105(o, s, BOOST_PP_LIST_REVERSE_D(105, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_106(o, s, l) BOOST_PP_LIST_FOLD_LEFT_106(o, s, BOOST_PP_LIST_REVERSE_D(106, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_107(o, s, l) BOOST_PP_LIST_FOLD_LEFT_107(o, s, BOOST_PP_LIST_REVERSE_D(107, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_108(o, s, l) BOOST_PP_LIST_FOLD_LEFT_108(o, s, BOOST_PP_LIST_REVERSE_D(108, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_109(o, s, l) BOOST_PP_LIST_FOLD_LEFT_109(o, s, BOOST_PP_LIST_REVERSE_D(109, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_110(o, s, l) BOOST_PP_LIST_FOLD_LEFT_110(o, s, BOOST_PP_LIST_REVERSE_D(110, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_111(o, s, l) BOOST_PP_LIST_FOLD_LEFT_111(o, s, BOOST_PP_LIST_REVERSE_D(111, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_112(o, s, l) BOOST_PP_LIST_FOLD_LEFT_112(o, s, BOOST_PP_LIST_REVERSE_D(112, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_113(o, s, l) BOOST_PP_LIST_FOLD_LEFT_113(o, s, BOOST_PP_LIST_REVERSE_D(113, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_114(o, s, l) BOOST_PP_LIST_FOLD_LEFT_114(o, s, BOOST_PP_LIST_REVERSE_D(114, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_115(o, s, l) BOOST_PP_LIST_FOLD_LEFT_115(o, s, BOOST_PP_LIST_REVERSE_D(115, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_116(o, s, l) BOOST_PP_LIST_FOLD_LEFT_116(o, s, BOOST_PP_LIST_REVERSE_D(116, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_117(o, s, l) BOOST_PP_LIST_FOLD_LEFT_117(o, s, BOOST_PP_LIST_REVERSE_D(117, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_118(o, s, l) BOOST_PP_LIST_FOLD_LEFT_118(o, s, BOOST_PP_LIST_REVERSE_D(118, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_119(o, s, l) BOOST_PP_LIST_FOLD_LEFT_119(o, s, BOOST_PP_LIST_REVERSE_D(119, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_120(o, s, l) BOOST_PP_LIST_FOLD_LEFT_120(o, s, BOOST_PP_LIST_REVERSE_D(120, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_121(o, s, l) BOOST_PP_LIST_FOLD_LEFT_121(o, s, BOOST_PP_LIST_REVERSE_D(121, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_122(o, s, l) BOOST_PP_LIST_FOLD_LEFT_122(o, s, BOOST_PP_LIST_REVERSE_D(122, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_123(o, s, l) BOOST_PP_LIST_FOLD_LEFT_123(o, s, BOOST_PP_LIST_REVERSE_D(123, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_124(o, s, l) BOOST_PP_LIST_FOLD_LEFT_124(o, s, BOOST_PP_LIST_REVERSE_D(124, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_125(o, s, l) BOOST_PP_LIST_FOLD_LEFT_125(o, s, BOOST_PP_LIST_REVERSE_D(125, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_126(o, s, l) BOOST_PP_LIST_FOLD_LEFT_126(o, s, BOOST_PP_LIST_REVERSE_D(126, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_127(o, s, l) BOOST_PP_LIST_FOLD_LEFT_127(o, s, BOOST_PP_LIST_REVERSE_D(127, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_128(o, s, l) BOOST_PP_LIST_FOLD_LEFT_128(o, s, BOOST_PP_LIST_REVERSE_D(128, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_129(o, s, l) BOOST_PP_LIST_FOLD_LEFT_129(o, s, BOOST_PP_LIST_REVERSE_D(129, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_130(o, s, l) BOOST_PP_LIST_FOLD_LEFT_130(o, s, BOOST_PP_LIST_REVERSE_D(130, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_131(o, s, l) BOOST_PP_LIST_FOLD_LEFT_131(o, s, BOOST_PP_LIST_REVERSE_D(131, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_132(o, s, l) BOOST_PP_LIST_FOLD_LEFT_132(o, s, BOOST_PP_LIST_REVERSE_D(132, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_133(o, s, l) BOOST_PP_LIST_FOLD_LEFT_133(o, s, BOOST_PP_LIST_REVERSE_D(133, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_134(o, s, l) BOOST_PP_LIST_FOLD_LEFT_134(o, s, BOOST_PP_LIST_REVERSE_D(134, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_135(o, s, l) BOOST_PP_LIST_FOLD_LEFT_135(o, s, BOOST_PP_LIST_REVERSE_D(135, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_136(o, s, l) BOOST_PP_LIST_FOLD_LEFT_136(o, s, BOOST_PP_LIST_REVERSE_D(136, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_137(o, s, l) BOOST_PP_LIST_FOLD_LEFT_137(o, s, BOOST_PP_LIST_REVERSE_D(137, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_138(o, s, l) BOOST_PP_LIST_FOLD_LEFT_138(o, s, BOOST_PP_LIST_REVERSE_D(138, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_139(o, s, l) BOOST_PP_LIST_FOLD_LEFT_139(o, s, BOOST_PP_LIST_REVERSE_D(139, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_140(o, s, l) BOOST_PP_LIST_FOLD_LEFT_140(o, s, BOOST_PP_LIST_REVERSE_D(140, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_141(o, s, l) BOOST_PP_LIST_FOLD_LEFT_141(o, s, BOOST_PP_LIST_REVERSE_D(141, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_142(o, s, l) BOOST_PP_LIST_FOLD_LEFT_142(o, s, BOOST_PP_LIST_REVERSE_D(142, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_143(o, s, l) BOOST_PP_LIST_FOLD_LEFT_143(o, s, BOOST_PP_LIST_REVERSE_D(143, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_144(o, s, l) BOOST_PP_LIST_FOLD_LEFT_144(o, s, BOOST_PP_LIST_REVERSE_D(144, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_145(o, s, l) BOOST_PP_LIST_FOLD_LEFT_145(o, s, BOOST_PP_LIST_REVERSE_D(145, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_146(o, s, l) BOOST_PP_LIST_FOLD_LEFT_146(o, s, BOOST_PP_LIST_REVERSE_D(146, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_147(o, s, l) BOOST_PP_LIST_FOLD_LEFT_147(o, s, BOOST_PP_LIST_REVERSE_D(147, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_148(o, s, l) BOOST_PP_LIST_FOLD_LEFT_148(o, s, BOOST_PP_LIST_REVERSE_D(148, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_149(o, s, l) BOOST_PP_LIST_FOLD_LEFT_149(o, s, BOOST_PP_LIST_REVERSE_D(149, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_150(o, s, l) BOOST_PP_LIST_FOLD_LEFT_150(o, s, BOOST_PP_LIST_REVERSE_D(150, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_151(o, s, l) BOOST_PP_LIST_FOLD_LEFT_151(o, s, BOOST_PP_LIST_REVERSE_D(151, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_152(o, s, l) BOOST_PP_LIST_FOLD_LEFT_152(o, s, BOOST_PP_LIST_REVERSE_D(152, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_153(o, s, l) BOOST_PP_LIST_FOLD_LEFT_153(o, s, BOOST_PP_LIST_REVERSE_D(153, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_154(o, s, l) BOOST_PP_LIST_FOLD_LEFT_154(o, s, BOOST_PP_LIST_REVERSE_D(154, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_155(o, s, l) BOOST_PP_LIST_FOLD_LEFT_155(o, s, BOOST_PP_LIST_REVERSE_D(155, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_156(o, s, l) BOOST_PP_LIST_FOLD_LEFT_156(o, s, BOOST_PP_LIST_REVERSE_D(156, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_157(o, s, l) BOOST_PP_LIST_FOLD_LEFT_157(o, s, BOOST_PP_LIST_REVERSE_D(157, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_158(o, s, l) BOOST_PP_LIST_FOLD_LEFT_158(o, s, BOOST_PP_LIST_REVERSE_D(158, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_159(o, s, l) BOOST_PP_LIST_FOLD_LEFT_159(o, s, BOOST_PP_LIST_REVERSE_D(159, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_160(o, s, l) BOOST_PP_LIST_FOLD_LEFT_160(o, s, BOOST_PP_LIST_REVERSE_D(160, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_161(o, s, l) BOOST_PP_LIST_FOLD_LEFT_161(o, s, BOOST_PP_LIST_REVERSE_D(161, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_162(o, s, l) BOOST_PP_LIST_FOLD_LEFT_162(o, s, BOOST_PP_LIST_REVERSE_D(162, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_163(o, s, l) BOOST_PP_LIST_FOLD_LEFT_163(o, s, BOOST_PP_LIST_REVERSE_D(163, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_164(o, s, l) BOOST_PP_LIST_FOLD_LEFT_164(o, s, BOOST_PP_LIST_REVERSE_D(164, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_165(o, s, l) BOOST_PP_LIST_FOLD_LEFT_165(o, s, BOOST_PP_LIST_REVERSE_D(165, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_166(o, s, l) BOOST_PP_LIST_FOLD_LEFT_166(o, s, BOOST_PP_LIST_REVERSE_D(166, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_167(o, s, l) BOOST_PP_LIST_FOLD_LEFT_167(o, s, BOOST_PP_LIST_REVERSE_D(167, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_168(o, s, l) BOOST_PP_LIST_FOLD_LEFT_168(o, s, BOOST_PP_LIST_REVERSE_D(168, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_169(o, s, l) BOOST_PP_LIST_FOLD_LEFT_169(o, s, BOOST_PP_LIST_REVERSE_D(169, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_170(o, s, l) BOOST_PP_LIST_FOLD_LEFT_170(o, s, BOOST_PP_LIST_REVERSE_D(170, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_171(o, s, l) BOOST_PP_LIST_FOLD_LEFT_171(o, s, BOOST_PP_LIST_REVERSE_D(171, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_172(o, s, l) BOOST_PP_LIST_FOLD_LEFT_172(o, s, BOOST_PP_LIST_REVERSE_D(172, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_173(o, s, l) BOOST_PP_LIST_FOLD_LEFT_173(o, s, BOOST_PP_LIST_REVERSE_D(173, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_174(o, s, l) BOOST_PP_LIST_FOLD_LEFT_174(o, s, BOOST_PP_LIST_REVERSE_D(174, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_175(o, s, l) BOOST_PP_LIST_FOLD_LEFT_175(o, s, BOOST_PP_LIST_REVERSE_D(175, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_176(o, s, l) BOOST_PP_LIST_FOLD_LEFT_176(o, s, BOOST_PP_LIST_REVERSE_D(176, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_177(o, s, l) BOOST_PP_LIST_FOLD_LEFT_177(o, s, BOOST_PP_LIST_REVERSE_D(177, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_178(o, s, l) BOOST_PP_LIST_FOLD_LEFT_178(o, s, BOOST_PP_LIST_REVERSE_D(178, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_179(o, s, l) BOOST_PP_LIST_FOLD_LEFT_179(o, s, BOOST_PP_LIST_REVERSE_D(179, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_180(o, s, l) BOOST_PP_LIST_FOLD_LEFT_180(o, s, BOOST_PP_LIST_REVERSE_D(180, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_181(o, s, l) BOOST_PP_LIST_FOLD_LEFT_181(o, s, BOOST_PP_LIST_REVERSE_D(181, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_182(o, s, l) BOOST_PP_LIST_FOLD_LEFT_182(o, s, BOOST_PP_LIST_REVERSE_D(182, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_183(o, s, l) BOOST_PP_LIST_FOLD_LEFT_183(o, s, BOOST_PP_LIST_REVERSE_D(183, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_184(o, s, l) BOOST_PP_LIST_FOLD_LEFT_184(o, s, BOOST_PP_LIST_REVERSE_D(184, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_185(o, s, l) BOOST_PP_LIST_FOLD_LEFT_185(o, s, BOOST_PP_LIST_REVERSE_D(185, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_186(o, s, l) BOOST_PP_LIST_FOLD_LEFT_186(o, s, BOOST_PP_LIST_REVERSE_D(186, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_187(o, s, l) BOOST_PP_LIST_FOLD_LEFT_187(o, s, BOOST_PP_LIST_REVERSE_D(187, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_188(o, s, l) BOOST_PP_LIST_FOLD_LEFT_188(o, s, BOOST_PP_LIST_REVERSE_D(188, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_189(o, s, l) BOOST_PP_LIST_FOLD_LEFT_189(o, s, BOOST_PP_LIST_REVERSE_D(189, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_190(o, s, l) BOOST_PP_LIST_FOLD_LEFT_190(o, s, BOOST_PP_LIST_REVERSE_D(190, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_191(o, s, l) BOOST_PP_LIST_FOLD_LEFT_191(o, s, BOOST_PP_LIST_REVERSE_D(191, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_192(o, s, l) BOOST_PP_LIST_FOLD_LEFT_192(o, s, BOOST_PP_LIST_REVERSE_D(192, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_193(o, s, l) BOOST_PP_LIST_FOLD_LEFT_193(o, s, BOOST_PP_LIST_REVERSE_D(193, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_194(o, s, l) BOOST_PP_LIST_FOLD_LEFT_194(o, s, BOOST_PP_LIST_REVERSE_D(194, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_195(o, s, l) BOOST_PP_LIST_FOLD_LEFT_195(o, s, BOOST_PP_LIST_REVERSE_D(195, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_196(o, s, l) BOOST_PP_LIST_FOLD_LEFT_196(o, s, BOOST_PP_LIST_REVERSE_D(196, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_197(o, s, l) BOOST_PP_LIST_FOLD_LEFT_197(o, s, BOOST_PP_LIST_REVERSE_D(197, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_198(o, s, l) BOOST_PP_LIST_FOLD_LEFT_198(o, s, BOOST_PP_LIST_REVERSE_D(198, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_199(o, s, l) BOOST_PP_LIST_FOLD_LEFT_199(o, s, BOOST_PP_LIST_REVERSE_D(199, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_200(o, s, l) BOOST_PP_LIST_FOLD_LEFT_200(o, s, BOOST_PP_LIST_REVERSE_D(200, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_201(o, s, l) BOOST_PP_LIST_FOLD_LEFT_201(o, s, BOOST_PP_LIST_REVERSE_D(201, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_202(o, s, l) BOOST_PP_LIST_FOLD_LEFT_202(o, s, BOOST_PP_LIST_REVERSE_D(202, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_203(o, s, l) BOOST_PP_LIST_FOLD_LEFT_203(o, s, BOOST_PP_LIST_REVERSE_D(203, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_204(o, s, l) BOOST_PP_LIST_FOLD_LEFT_204(o, s, BOOST_PP_LIST_REVERSE_D(204, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_205(o, s, l) BOOST_PP_LIST_FOLD_LEFT_205(o, s, BOOST_PP_LIST_REVERSE_D(205, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_206(o, s, l) BOOST_PP_LIST_FOLD_LEFT_206(o, s, BOOST_PP_LIST_REVERSE_D(206, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_207(o, s, l) BOOST_PP_LIST_FOLD_LEFT_207(o, s, BOOST_PP_LIST_REVERSE_D(207, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_208(o, s, l) BOOST_PP_LIST_FOLD_LEFT_208(o, s, BOOST_PP_LIST_REVERSE_D(208, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_209(o, s, l) BOOST_PP_LIST_FOLD_LEFT_209(o, s, BOOST_PP_LIST_REVERSE_D(209, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_210(o, s, l) BOOST_PP_LIST_FOLD_LEFT_210(o, s, BOOST_PP_LIST_REVERSE_D(210, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_211(o, s, l) BOOST_PP_LIST_FOLD_LEFT_211(o, s, BOOST_PP_LIST_REVERSE_D(211, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_212(o, s, l) BOOST_PP_LIST_FOLD_LEFT_212(o, s, BOOST_PP_LIST_REVERSE_D(212, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_213(o, s, l) BOOST_PP_LIST_FOLD_LEFT_213(o, s, BOOST_PP_LIST_REVERSE_D(213, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_214(o, s, l) BOOST_PP_LIST_FOLD_LEFT_214(o, s, BOOST_PP_LIST_REVERSE_D(214, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_215(o, s, l) BOOST_PP_LIST_FOLD_LEFT_215(o, s, BOOST_PP_LIST_REVERSE_D(215, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_216(o, s, l) BOOST_PP_LIST_FOLD_LEFT_216(o, s, BOOST_PP_LIST_REVERSE_D(216, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_217(o, s, l) BOOST_PP_LIST_FOLD_LEFT_217(o, s, BOOST_PP_LIST_REVERSE_D(217, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_218(o, s, l) BOOST_PP_LIST_FOLD_LEFT_218(o, s, BOOST_PP_LIST_REVERSE_D(218, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_219(o, s, l) BOOST_PP_LIST_FOLD_LEFT_219(o, s, BOOST_PP_LIST_REVERSE_D(219, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_220(o, s, l) BOOST_PP_LIST_FOLD_LEFT_220(o, s, BOOST_PP_LIST_REVERSE_D(220, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_221(o, s, l) BOOST_PP_LIST_FOLD_LEFT_221(o, s, BOOST_PP_LIST_REVERSE_D(221, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_222(o, s, l) BOOST_PP_LIST_FOLD_LEFT_222(o, s, BOOST_PP_LIST_REVERSE_D(222, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_223(o, s, l) BOOST_PP_LIST_FOLD_LEFT_223(o, s, BOOST_PP_LIST_REVERSE_D(223, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_224(o, s, l) BOOST_PP_LIST_FOLD_LEFT_224(o, s, BOOST_PP_LIST_REVERSE_D(224, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_225(o, s, l) BOOST_PP_LIST_FOLD_LEFT_225(o, s, BOOST_PP_LIST_REVERSE_D(225, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_226(o, s, l) BOOST_PP_LIST_FOLD_LEFT_226(o, s, BOOST_PP_LIST_REVERSE_D(226, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_227(o, s, l) BOOST_PP_LIST_FOLD_LEFT_227(o, s, BOOST_PP_LIST_REVERSE_D(227, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_228(o, s, l) BOOST_PP_LIST_FOLD_LEFT_228(o, s, BOOST_PP_LIST_REVERSE_D(228, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_229(o, s, l) BOOST_PP_LIST_FOLD_LEFT_229(o, s, BOOST_PP_LIST_REVERSE_D(229, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_230(o, s, l) BOOST_PP_LIST_FOLD_LEFT_230(o, s, BOOST_PP_LIST_REVERSE_D(230, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_231(o, s, l) BOOST_PP_LIST_FOLD_LEFT_231(o, s, BOOST_PP_LIST_REVERSE_D(231, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_232(o, s, l) BOOST_PP_LIST_FOLD_LEFT_232(o, s, BOOST_PP_LIST_REVERSE_D(232, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_233(o, s, l) BOOST_PP_LIST_FOLD_LEFT_233(o, s, BOOST_PP_LIST_REVERSE_D(233, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_234(o, s, l) BOOST_PP_LIST_FOLD_LEFT_234(o, s, BOOST_PP_LIST_REVERSE_D(234, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_235(o, s, l) BOOST_PP_LIST_FOLD_LEFT_235(o, s, BOOST_PP_LIST_REVERSE_D(235, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_236(o, s, l) BOOST_PP_LIST_FOLD_LEFT_236(o, s, BOOST_PP_LIST_REVERSE_D(236, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_237(o, s, l) BOOST_PP_LIST_FOLD_LEFT_237(o, s, BOOST_PP_LIST_REVERSE_D(237, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_238(o, s, l) BOOST_PP_LIST_FOLD_LEFT_238(o, s, BOOST_PP_LIST_REVERSE_D(238, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_239(o, s, l) BOOST_PP_LIST_FOLD_LEFT_239(o, s, BOOST_PP_LIST_REVERSE_D(239, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_240(o, s, l) BOOST_PP_LIST_FOLD_LEFT_240(o, s, BOOST_PP_LIST_REVERSE_D(240, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_241(o, s, l) BOOST_PP_LIST_FOLD_LEFT_241(o, s, BOOST_PP_LIST_REVERSE_D(241, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_242(o, s, l) BOOST_PP_LIST_FOLD_LEFT_242(o, s, BOOST_PP_LIST_REVERSE_D(242, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_243(o, s, l) BOOST_PP_LIST_FOLD_LEFT_243(o, s, BOOST_PP_LIST_REVERSE_D(243, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_244(o, s, l) BOOST_PP_LIST_FOLD_LEFT_244(o, s, BOOST_PP_LIST_REVERSE_D(244, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_245(o, s, l) BOOST_PP_LIST_FOLD_LEFT_245(o, s, BOOST_PP_LIST_REVERSE_D(245, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_246(o, s, l) BOOST_PP_LIST_FOLD_LEFT_246(o, s, BOOST_PP_LIST_REVERSE_D(246, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_247(o, s, l) BOOST_PP_LIST_FOLD_LEFT_247(o, s, BOOST_PP_LIST_REVERSE_D(247, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_248(o, s, l) BOOST_PP_LIST_FOLD_LEFT_248(o, s, BOOST_PP_LIST_REVERSE_D(248, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_249(o, s, l) BOOST_PP_LIST_FOLD_LEFT_249(o, s, BOOST_PP_LIST_REVERSE_D(249, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_250(o, s, l) BOOST_PP_LIST_FOLD_LEFT_250(o, s, BOOST_PP_LIST_REVERSE_D(250, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_251(o, s, l) BOOST_PP_LIST_FOLD_LEFT_251(o, s, BOOST_PP_LIST_REVERSE_D(251, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_252(o, s, l) BOOST_PP_LIST_FOLD_LEFT_252(o, s, BOOST_PP_LIST_REVERSE_D(252, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_253(o, s, l) BOOST_PP_LIST_FOLD_LEFT_253(o, s, BOOST_PP_LIST_REVERSE_D(253, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_254(o, s, l) BOOST_PP_LIST_FOLD_LEFT_254(o, s, BOOST_PP_LIST_REVERSE_D(254, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_255(o, s, l) BOOST_PP_LIST_FOLD_LEFT_255(o, s, BOOST_PP_LIST_REVERSE_D(255, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_256(o, s, l) BOOST_PP_LIST_FOLD_LEFT_256(o, s, BOOST_PP_LIST_REVERSE_D(256, l))\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/list/fold_left.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_FOLD_LEFT_HPP\n# define BOOST_PREPROCESSOR_LIST_FOLD_LEFT_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/control/while.hpp>\n# include <boost/preprocessor/debug/error.hpp>\n# include <boost/preprocessor/detail/auto_rec.hpp>\n#\n# /* BOOST_PP_LIST_FOLD_LEFT */\n#\n# if 0\n#    define BOOST_PP_LIST_FOLD_LEFT(op, state, list)\n# endif\n#\n# define BOOST_PP_LIST_FOLD_LEFT BOOST_PP_CAT(BOOST_PP_LIST_FOLD_LEFT_, BOOST_PP_AUTO_REC(BOOST_PP_WHILE_P, 256))\n#\n# define BOOST_PP_LIST_FOLD_LEFT_257(o, s, l) BOOST_PP_ERROR(0x0004)\n#\n# define BOOST_PP_LIST_FOLD_LEFT_D(d, o, s, l) BOOST_PP_LIST_FOLD_LEFT_ ## d(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_2ND BOOST_PP_LIST_FOLD_LEFT\n# define BOOST_PP_LIST_FOLD_LEFT_2ND_D BOOST_PP_LIST_FOLD_LEFT_D\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    include <boost/preprocessor/list/detail/edg/fold_left.hpp>\n# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()\n#    include <boost/preprocessor/list/detail/dmc/fold_left.hpp>\n# else\n#    include <boost/preprocessor/list/detail/fold_left.hpp>\n# endif\n#\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_NIL 1\n#\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_1(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_2(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_3(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_4(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_5(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_6(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_7(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_8(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_9(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_10(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_11(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_12(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_13(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_14(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_15(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_16(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_17(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_18(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_19(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_20(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_21(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_22(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_23(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_24(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_25(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_26(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_27(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_28(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_29(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_30(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_31(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_32(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_33(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_34(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_35(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_36(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_37(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_38(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_39(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_40(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_41(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_42(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_43(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_44(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_45(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_46(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_47(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_48(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_49(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_50(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_51(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_52(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_53(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_54(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_55(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_56(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_57(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_58(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_59(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_60(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_61(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_62(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_63(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_64(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_65(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_66(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_67(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_68(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_69(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_70(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_71(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_72(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_73(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_74(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_75(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_76(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_77(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_78(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_79(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_80(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_81(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_82(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_83(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_84(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_85(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_86(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_87(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_88(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_89(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_90(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_91(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_92(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_93(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_94(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_95(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_96(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_97(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_98(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_99(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_100(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_101(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_102(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_103(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_104(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_105(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_106(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_107(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_108(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_109(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_110(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_111(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_112(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_113(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_114(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_115(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_116(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_117(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_118(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_119(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_120(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_121(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_122(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_123(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_124(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_125(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_126(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_127(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_128(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_129(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_130(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_131(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_132(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_133(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_134(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_135(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_136(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_137(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_138(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_139(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_140(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_141(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_142(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_143(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_144(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_145(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_146(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_147(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_148(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_149(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_150(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_151(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_152(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_153(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_154(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_155(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_156(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_157(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_158(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_159(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_160(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_161(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_162(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_163(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_164(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_165(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_166(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_167(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_168(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_169(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_170(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_171(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_172(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_173(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_174(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_175(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_176(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_177(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_178(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_179(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_180(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_181(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_182(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_183(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_184(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_185(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_186(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_187(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_188(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_189(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_190(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_191(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_192(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_193(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_194(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_195(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_196(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_197(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_198(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_199(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_200(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_201(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_202(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_203(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_204(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_205(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_206(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_207(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_208(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_209(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_210(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_211(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_212(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_213(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_214(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_215(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_216(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_217(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_218(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_219(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_220(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_221(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_222(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_223(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_224(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_225(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_226(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_227(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_228(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_229(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_230(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_231(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_232(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_233(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_234(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_235(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_236(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_237(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_238(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_239(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_240(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_241(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_242(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_243(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_244(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_245(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_246(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_247(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_248(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_249(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_250(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_251(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_252(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_253(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_254(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_255(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_256(o, s, l) 0\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/list/fold_right.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_FOLD_RIGHT_HPP\n# define BOOST_PREPROCESSOR_LIST_FOLD_RIGHT_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/control/while.hpp>\n# include <boost/preprocessor/debug/error.hpp>\n# include <boost/preprocessor/detail/auto_rec.hpp>\n#\n# if 0\n#    define BOOST_PP_LIST_FOLD_RIGHT(op, state, list)\n# endif\n#\n# define BOOST_PP_LIST_FOLD_RIGHT BOOST_PP_CAT(BOOST_PP_LIST_FOLD_RIGHT_, BOOST_PP_AUTO_REC(BOOST_PP_WHILE_P, 256))\n#\n# define BOOST_PP_LIST_FOLD_RIGHT_257(o, s, l) BOOST_PP_ERROR(0x0004)\n#\n# define BOOST_PP_LIST_FOLD_RIGHT_D(d, o, s, l) BOOST_PP_LIST_FOLD_RIGHT_ ## d(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_2ND BOOST_PP_LIST_FOLD_RIGHT\n# define BOOST_PP_LIST_FOLD_RIGHT_2ND_D BOOST_PP_LIST_FOLD_RIGHT_D\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    include <boost/preprocessor/list/detail/edg/fold_right.hpp>\n# else\n#    include <boost/preprocessor/list/detail/fold_right.hpp>\n# endif\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/list/for_each_i.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_LIST_FOR_EACH_I_HPP\n# define BOOST_PREPROCESSOR_LIST_LIST_FOR_EACH_I_HPP\n#\n# include <boost/preprocessor/arithmetic/inc.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/list/adt.hpp>\n# include <boost/preprocessor/repetition/for.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n#\n# /* BOOST_PP_LIST_FOR_EACH_I */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG() && ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    define BOOST_PP_LIST_FOR_EACH_I(macro, data, list) BOOST_PP_FOR((macro, data, list, 0), BOOST_PP_LIST_FOR_EACH_I_P, BOOST_PP_LIST_FOR_EACH_I_O, BOOST_PP_LIST_FOR_EACH_I_M)\n# else\n#    define BOOST_PP_LIST_FOR_EACH_I(macro, data, list) BOOST_PP_LIST_FOR_EACH_I_I(macro, data, list)\n#    define BOOST_PP_LIST_FOR_EACH_I_I(macro, data, list) BOOST_PP_FOR((macro, data, list, 0), BOOST_PP_LIST_FOR_EACH_I_P, BOOST_PP_LIST_FOR_EACH_I_O, BOOST_PP_LIST_FOR_EACH_I_M)\n# endif\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()\n#    define BOOST_PP_LIST_FOR_EACH_I_P(r, x) BOOST_PP_LIST_FOR_EACH_I_P_D x\n#    define BOOST_PP_LIST_FOR_EACH_I_P_D(m, d, l, i) BOOST_PP_LIST_IS_CONS(l)\n# else\n#    define BOOST_PP_LIST_FOR_EACH_I_P(r, x) BOOST_PP_LIST_IS_CONS(BOOST_PP_TUPLE_ELEM(4, 2, x))\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_LIST_FOR_EACH_I_O(r, x) BOOST_PP_LIST_FOR_EACH_I_O_D x\n#    define BOOST_PP_LIST_FOR_EACH_I_O_D(m, d, l, i) (m, d, BOOST_PP_LIST_REST(l), BOOST_PP_INC(i))\n# else\n#    define BOOST_PP_LIST_FOR_EACH_I_O(r, x) (BOOST_PP_TUPLE_ELEM(4, 0, x), BOOST_PP_TUPLE_ELEM(4, 1, x), BOOST_PP_LIST_REST(BOOST_PP_TUPLE_ELEM(4, 2, x)), BOOST_PP_INC(BOOST_PP_TUPLE_ELEM(4, 3, x)))\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_FOR_EACH_I_M(r, x) BOOST_PP_LIST_FOR_EACH_I_M_D(r, BOOST_PP_TUPLE_ELEM(4, 0, x), BOOST_PP_TUPLE_ELEM(4, 1, x), BOOST_PP_TUPLE_ELEM(4, 2, x), BOOST_PP_TUPLE_ELEM(4, 3, x))\n# else\n#    define BOOST_PP_LIST_FOR_EACH_I_M(r, x) BOOST_PP_LIST_FOR_EACH_I_M_I(r, BOOST_PP_TUPLE_REM_4 x)\n#    define BOOST_PP_LIST_FOR_EACH_I_M_I(r, x_e) BOOST_PP_LIST_FOR_EACH_I_M_D(r, x_e)\n# endif\n#\n# define BOOST_PP_LIST_FOR_EACH_I_M_D(r, m, d, l, i) m(r, d, i, BOOST_PP_LIST_FIRST(l))\n#\n# /* BOOST_PP_LIST_FOR_EACH_I_R */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_FOR_EACH_I_R(r, macro, data, list) BOOST_PP_FOR_ ## r((macro, data, list, 0), BOOST_PP_LIST_FOR_EACH_I_P, BOOST_PP_LIST_FOR_EACH_I_O, BOOST_PP_LIST_FOR_EACH_I_M)\n# else\n#    define BOOST_PP_LIST_FOR_EACH_I_R(r, macro, data, list) BOOST_PP_LIST_FOR_EACH_I_R_I(r, macro, data, list)\n#    define BOOST_PP_LIST_FOR_EACH_I_R_I(r, macro, data, list) BOOST_PP_FOR_ ## r((macro, data, list, 0), BOOST_PP_LIST_FOR_EACH_I_P, BOOST_PP_LIST_FOR_EACH_I_O, BOOST_PP_LIST_FOR_EACH_I_M)\n# endif\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/list/reverse.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_REVERSE_HPP\n# define BOOST_PREPROCESSOR_LIST_REVERSE_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/list/fold_left.hpp>\n#\n# /* BOOST_PP_LIST_REVERSE */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_REVERSE(list) BOOST_PP_LIST_FOLD_LEFT(BOOST_PP_LIST_REVERSE_O, BOOST_PP_NIL, list)\n# else\n#    define BOOST_PP_LIST_REVERSE(list) BOOST_PP_LIST_REVERSE_I(list)\n#    define BOOST_PP_LIST_REVERSE_I(list) BOOST_PP_LIST_FOLD_LEFT(BOOST_PP_LIST_REVERSE_O, BOOST_PP_NIL, list)\n# endif\n#\n# define BOOST_PP_LIST_REVERSE_O(d, s, x) (x, s)\n#\n# /* BOOST_PP_LIST_REVERSE_D */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_REVERSE_D(d, list) BOOST_PP_LIST_FOLD_LEFT_ ## d(BOOST_PP_LIST_REVERSE_O, BOOST_PP_NIL, list)\n# else\n#    define BOOST_PP_LIST_REVERSE_D(d, list) BOOST_PP_LIST_REVERSE_D_I(d, list)\n#    define BOOST_PP_LIST_REVERSE_D_I(d, list) BOOST_PP_LIST_FOLD_LEFT_ ## d(BOOST_PP_LIST_REVERSE_O, BOOST_PP_NIL, list)\n# endif\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/logical/and.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LOGICAL_AND_HPP\n# define BOOST_PREPROCESSOR_LOGICAL_AND_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/logical/bool.hpp>\n# include <boost/preprocessor/logical/bitand.hpp>\n#\n# /* BOOST_PP_AND */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_AND(p, q) BOOST_PP_BITAND(BOOST_PP_BOOL(p), BOOST_PP_BOOL(q))\n# else\n#    define BOOST_PP_AND(p, q) BOOST_PP_AND_I(p, q)\n#    define BOOST_PP_AND_I(p, q) BOOST_PP_BITAND(BOOST_PP_BOOL(p), BOOST_PP_BOOL(q))\n# endif\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/logical/bitand.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LOGICAL_BITAND_HPP\n# define BOOST_PREPROCESSOR_LOGICAL_BITAND_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_BITAND */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_BITAND(x, y) BOOST_PP_BITAND_I(x, y)\n# else\n#    define BOOST_PP_BITAND(x, y) BOOST_PP_BITAND_OO((x, y))\n#    define BOOST_PP_BITAND_OO(par) BOOST_PP_BITAND_I ## par\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    define BOOST_PP_BITAND_I(x, y) BOOST_PP_BITAND_ ## x ## y\n# else\n#    define BOOST_PP_BITAND_I(x, y) BOOST_PP_BITAND_ID(BOOST_PP_BITAND_ ## x ## y)\n#    define BOOST_PP_BITAND_ID(res) res\n# endif\n#\n# define BOOST_PP_BITAND_00 0\n# define BOOST_PP_BITAND_01 0\n# define BOOST_PP_BITAND_10 0\n# define BOOST_PP_BITAND_11 1\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/logical/bool.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LOGICAL_BOOL_HPP\n# define BOOST_PREPROCESSOR_LOGICAL_BOOL_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_BOOL */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_BOOL(x) BOOST_PP_BOOL_I(x)\n# else\n#    define BOOST_PP_BOOL(x) BOOST_PP_BOOL_OO((x))\n#    define BOOST_PP_BOOL_OO(par) BOOST_PP_BOOL_I ## par\n# endif\n#\n# define BOOST_PP_BOOL_I(x) BOOST_PP_BOOL_ ## x\n#\n# define BOOST_PP_BOOL_0 0\n# define BOOST_PP_BOOL_1 1\n# define BOOST_PP_BOOL_2 1\n# define BOOST_PP_BOOL_3 1\n# define BOOST_PP_BOOL_4 1\n# define BOOST_PP_BOOL_5 1\n# define BOOST_PP_BOOL_6 1\n# define BOOST_PP_BOOL_7 1\n# define BOOST_PP_BOOL_8 1\n# define BOOST_PP_BOOL_9 1\n# define BOOST_PP_BOOL_10 1\n# define BOOST_PP_BOOL_11 1\n# define BOOST_PP_BOOL_12 1\n# define BOOST_PP_BOOL_13 1\n# define BOOST_PP_BOOL_14 1\n# define BOOST_PP_BOOL_15 1\n# define BOOST_PP_BOOL_16 1\n# define BOOST_PP_BOOL_17 1\n# define BOOST_PP_BOOL_18 1\n# define BOOST_PP_BOOL_19 1\n# define BOOST_PP_BOOL_20 1\n# define BOOST_PP_BOOL_21 1\n# define BOOST_PP_BOOL_22 1\n# define BOOST_PP_BOOL_23 1\n# define BOOST_PP_BOOL_24 1\n# define BOOST_PP_BOOL_25 1\n# define BOOST_PP_BOOL_26 1\n# define BOOST_PP_BOOL_27 1\n# define BOOST_PP_BOOL_28 1\n# define BOOST_PP_BOOL_29 1\n# define BOOST_PP_BOOL_30 1\n# define BOOST_PP_BOOL_31 1\n# define BOOST_PP_BOOL_32 1\n# define BOOST_PP_BOOL_33 1\n# define BOOST_PP_BOOL_34 1\n# define BOOST_PP_BOOL_35 1\n# define BOOST_PP_BOOL_36 1\n# define BOOST_PP_BOOL_37 1\n# define BOOST_PP_BOOL_38 1\n# define BOOST_PP_BOOL_39 1\n# define BOOST_PP_BOOL_40 1\n# define BOOST_PP_BOOL_41 1\n# define BOOST_PP_BOOL_42 1\n# define BOOST_PP_BOOL_43 1\n# define BOOST_PP_BOOL_44 1\n# define BOOST_PP_BOOL_45 1\n# define BOOST_PP_BOOL_46 1\n# define BOOST_PP_BOOL_47 1\n# define BOOST_PP_BOOL_48 1\n# define BOOST_PP_BOOL_49 1\n# define BOOST_PP_BOOL_50 1\n# define BOOST_PP_BOOL_51 1\n# define BOOST_PP_BOOL_52 1\n# define BOOST_PP_BOOL_53 1\n# define BOOST_PP_BOOL_54 1\n# define BOOST_PP_BOOL_55 1\n# define BOOST_PP_BOOL_56 1\n# define BOOST_PP_BOOL_57 1\n# define BOOST_PP_BOOL_58 1\n# define BOOST_PP_BOOL_59 1\n# define BOOST_PP_BOOL_60 1\n# define BOOST_PP_BOOL_61 1\n# define BOOST_PP_BOOL_62 1\n# define BOOST_PP_BOOL_63 1\n# define BOOST_PP_BOOL_64 1\n# define BOOST_PP_BOOL_65 1\n# define BOOST_PP_BOOL_66 1\n# define BOOST_PP_BOOL_67 1\n# define BOOST_PP_BOOL_68 1\n# define BOOST_PP_BOOL_69 1\n# define BOOST_PP_BOOL_70 1\n# define BOOST_PP_BOOL_71 1\n# define BOOST_PP_BOOL_72 1\n# define BOOST_PP_BOOL_73 1\n# define BOOST_PP_BOOL_74 1\n# define BOOST_PP_BOOL_75 1\n# define BOOST_PP_BOOL_76 1\n# define BOOST_PP_BOOL_77 1\n# define BOOST_PP_BOOL_78 1\n# define BOOST_PP_BOOL_79 1\n# define BOOST_PP_BOOL_80 1\n# define BOOST_PP_BOOL_81 1\n# define BOOST_PP_BOOL_82 1\n# define BOOST_PP_BOOL_83 1\n# define BOOST_PP_BOOL_84 1\n# define BOOST_PP_BOOL_85 1\n# define BOOST_PP_BOOL_86 1\n# define BOOST_PP_BOOL_87 1\n# define BOOST_PP_BOOL_88 1\n# define BOOST_PP_BOOL_89 1\n# define BOOST_PP_BOOL_90 1\n# define BOOST_PP_BOOL_91 1\n# define BOOST_PP_BOOL_92 1\n# define BOOST_PP_BOOL_93 1\n# define BOOST_PP_BOOL_94 1\n# define BOOST_PP_BOOL_95 1\n# define BOOST_PP_BOOL_96 1\n# define BOOST_PP_BOOL_97 1\n# define BOOST_PP_BOOL_98 1\n# define BOOST_PP_BOOL_99 1\n# define BOOST_PP_BOOL_100 1\n# define BOOST_PP_BOOL_101 1\n# define BOOST_PP_BOOL_102 1\n# define BOOST_PP_BOOL_103 1\n# define BOOST_PP_BOOL_104 1\n# define BOOST_PP_BOOL_105 1\n# define BOOST_PP_BOOL_106 1\n# define BOOST_PP_BOOL_107 1\n# define BOOST_PP_BOOL_108 1\n# define BOOST_PP_BOOL_109 1\n# define BOOST_PP_BOOL_110 1\n# define BOOST_PP_BOOL_111 1\n# define BOOST_PP_BOOL_112 1\n# define BOOST_PP_BOOL_113 1\n# define BOOST_PP_BOOL_114 1\n# define BOOST_PP_BOOL_115 1\n# define BOOST_PP_BOOL_116 1\n# define BOOST_PP_BOOL_117 1\n# define BOOST_PP_BOOL_118 1\n# define BOOST_PP_BOOL_119 1\n# define BOOST_PP_BOOL_120 1\n# define BOOST_PP_BOOL_121 1\n# define BOOST_PP_BOOL_122 1\n# define BOOST_PP_BOOL_123 1\n# define BOOST_PP_BOOL_124 1\n# define BOOST_PP_BOOL_125 1\n# define BOOST_PP_BOOL_126 1\n# define BOOST_PP_BOOL_127 1\n# define BOOST_PP_BOOL_128 1\n# define BOOST_PP_BOOL_129 1\n# define BOOST_PP_BOOL_130 1\n# define BOOST_PP_BOOL_131 1\n# define BOOST_PP_BOOL_132 1\n# define BOOST_PP_BOOL_133 1\n# define BOOST_PP_BOOL_134 1\n# define BOOST_PP_BOOL_135 1\n# define BOOST_PP_BOOL_136 1\n# define BOOST_PP_BOOL_137 1\n# define BOOST_PP_BOOL_138 1\n# define BOOST_PP_BOOL_139 1\n# define BOOST_PP_BOOL_140 1\n# define BOOST_PP_BOOL_141 1\n# define BOOST_PP_BOOL_142 1\n# define BOOST_PP_BOOL_143 1\n# define BOOST_PP_BOOL_144 1\n# define BOOST_PP_BOOL_145 1\n# define BOOST_PP_BOOL_146 1\n# define BOOST_PP_BOOL_147 1\n# define BOOST_PP_BOOL_148 1\n# define BOOST_PP_BOOL_149 1\n# define BOOST_PP_BOOL_150 1\n# define BOOST_PP_BOOL_151 1\n# define BOOST_PP_BOOL_152 1\n# define BOOST_PP_BOOL_153 1\n# define BOOST_PP_BOOL_154 1\n# define BOOST_PP_BOOL_155 1\n# define BOOST_PP_BOOL_156 1\n# define BOOST_PP_BOOL_157 1\n# define BOOST_PP_BOOL_158 1\n# define BOOST_PP_BOOL_159 1\n# define BOOST_PP_BOOL_160 1\n# define BOOST_PP_BOOL_161 1\n# define BOOST_PP_BOOL_162 1\n# define BOOST_PP_BOOL_163 1\n# define BOOST_PP_BOOL_164 1\n# define BOOST_PP_BOOL_165 1\n# define BOOST_PP_BOOL_166 1\n# define BOOST_PP_BOOL_167 1\n# define BOOST_PP_BOOL_168 1\n# define BOOST_PP_BOOL_169 1\n# define BOOST_PP_BOOL_170 1\n# define BOOST_PP_BOOL_171 1\n# define BOOST_PP_BOOL_172 1\n# define BOOST_PP_BOOL_173 1\n# define BOOST_PP_BOOL_174 1\n# define BOOST_PP_BOOL_175 1\n# define BOOST_PP_BOOL_176 1\n# define BOOST_PP_BOOL_177 1\n# define BOOST_PP_BOOL_178 1\n# define BOOST_PP_BOOL_179 1\n# define BOOST_PP_BOOL_180 1\n# define BOOST_PP_BOOL_181 1\n# define BOOST_PP_BOOL_182 1\n# define BOOST_PP_BOOL_183 1\n# define BOOST_PP_BOOL_184 1\n# define BOOST_PP_BOOL_185 1\n# define BOOST_PP_BOOL_186 1\n# define BOOST_PP_BOOL_187 1\n# define BOOST_PP_BOOL_188 1\n# define BOOST_PP_BOOL_189 1\n# define BOOST_PP_BOOL_190 1\n# define BOOST_PP_BOOL_191 1\n# define BOOST_PP_BOOL_192 1\n# define BOOST_PP_BOOL_193 1\n# define BOOST_PP_BOOL_194 1\n# define BOOST_PP_BOOL_195 1\n# define BOOST_PP_BOOL_196 1\n# define BOOST_PP_BOOL_197 1\n# define BOOST_PP_BOOL_198 1\n# define BOOST_PP_BOOL_199 1\n# define BOOST_PP_BOOL_200 1\n# define BOOST_PP_BOOL_201 1\n# define BOOST_PP_BOOL_202 1\n# define BOOST_PP_BOOL_203 1\n# define BOOST_PP_BOOL_204 1\n# define BOOST_PP_BOOL_205 1\n# define BOOST_PP_BOOL_206 1\n# define BOOST_PP_BOOL_207 1\n# define BOOST_PP_BOOL_208 1\n# define BOOST_PP_BOOL_209 1\n# define BOOST_PP_BOOL_210 1\n# define BOOST_PP_BOOL_211 1\n# define BOOST_PP_BOOL_212 1\n# define BOOST_PP_BOOL_213 1\n# define BOOST_PP_BOOL_214 1\n# define BOOST_PP_BOOL_215 1\n# define BOOST_PP_BOOL_216 1\n# define BOOST_PP_BOOL_217 1\n# define BOOST_PP_BOOL_218 1\n# define BOOST_PP_BOOL_219 1\n# define BOOST_PP_BOOL_220 1\n# define BOOST_PP_BOOL_221 1\n# define BOOST_PP_BOOL_222 1\n# define BOOST_PP_BOOL_223 1\n# define BOOST_PP_BOOL_224 1\n# define BOOST_PP_BOOL_225 1\n# define BOOST_PP_BOOL_226 1\n# define BOOST_PP_BOOL_227 1\n# define BOOST_PP_BOOL_228 1\n# define BOOST_PP_BOOL_229 1\n# define BOOST_PP_BOOL_230 1\n# define BOOST_PP_BOOL_231 1\n# define BOOST_PP_BOOL_232 1\n# define BOOST_PP_BOOL_233 1\n# define BOOST_PP_BOOL_234 1\n# define BOOST_PP_BOOL_235 1\n# define BOOST_PP_BOOL_236 1\n# define BOOST_PP_BOOL_237 1\n# define BOOST_PP_BOOL_238 1\n# define BOOST_PP_BOOL_239 1\n# define BOOST_PP_BOOL_240 1\n# define BOOST_PP_BOOL_241 1\n# define BOOST_PP_BOOL_242 1\n# define BOOST_PP_BOOL_243 1\n# define BOOST_PP_BOOL_244 1\n# define BOOST_PP_BOOL_245 1\n# define BOOST_PP_BOOL_246 1\n# define BOOST_PP_BOOL_247 1\n# define BOOST_PP_BOOL_248 1\n# define BOOST_PP_BOOL_249 1\n# define BOOST_PP_BOOL_250 1\n# define BOOST_PP_BOOL_251 1\n# define BOOST_PP_BOOL_252 1\n# define BOOST_PP_BOOL_253 1\n# define BOOST_PP_BOOL_254 1\n# define BOOST_PP_BOOL_255 1\n# define BOOST_PP_BOOL_256 1\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/logical/compl.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LOGICAL_COMPL_HPP\n# define BOOST_PREPROCESSOR_LOGICAL_COMPL_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_COMPL */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_COMPL(x) BOOST_PP_COMPL_I(x)\n# else\n#    define BOOST_PP_COMPL(x) BOOST_PP_COMPL_OO((x))\n#    define BOOST_PP_COMPL_OO(par) BOOST_PP_COMPL_I ## par\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    define BOOST_PP_COMPL_I(x) BOOST_PP_COMPL_ ## x\n# else\n#    define BOOST_PP_COMPL_I(x) BOOST_PP_COMPL_ID(BOOST_PP_COMPL_ ## x)\n#    define BOOST_PP_COMPL_ID(id) id\n# endif\n#\n# define BOOST_PP_COMPL_0 1\n# define BOOST_PP_COMPL_1 0\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/logical/not.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LOGICAL_NOT_HPP\n# define BOOST_PREPROCESSOR_LOGICAL_NOT_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/logical/bool.hpp>\n# include <boost/preprocessor/logical/compl.hpp>\n#\n# /* BOOST_PP_NOT */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_NOT(x) BOOST_PP_COMPL(BOOST_PP_BOOL(x))\n# else\n#    define BOOST_PP_NOT(x) BOOST_PP_NOT_I(x)\n#    define BOOST_PP_NOT_I(x) BOOST_PP_COMPL(BOOST_PP_BOOL(x))\n# endif\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/punctuation/comma.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_PUNCTUATION_COMMA_HPP\n# define BOOST_PREPROCESSOR_PUNCTUATION_COMMA_HPP\n#\n# /* BOOST_PP_COMMA */\n#\n# define BOOST_PP_COMMA() ,\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/punctuation/comma_if.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_PUNCTUATION_COMMA_IF_HPP\n# define BOOST_PREPROCESSOR_PUNCTUATION_COMMA_IF_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/if.hpp>\n# include <boost/preprocessor/facilities/empty.hpp>\n# include <boost/preprocessor/punctuation/comma.hpp>\n#\n# /* BOOST_PP_COMMA_IF */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_COMMA_IF(cond) BOOST_PP_IF(cond, BOOST_PP_COMMA, BOOST_PP_EMPTY)()\n# else\n#    define BOOST_PP_COMMA_IF(cond) BOOST_PP_COMMA_IF_I(cond)\n#    define BOOST_PP_COMMA_IF_I(cond) BOOST_PP_IF(cond, BOOST_PP_COMMA, BOOST_PP_EMPTY)()\n# endif\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/punctuation/detail/is_begin_parens.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2014.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n#ifndef BOOST_PREPROCESSOR_DETAIL_IS_BEGIN_PARENS_HPP\n#define BOOST_PREPROCESSOR_DETAIL_IS_BEGIN_PARENS_HPP\n\n#if BOOST_PP_VARIADICS_MSVC\n\n#include <boost/preprocessor/facilities/empty.hpp>\n\n#define BOOST_PP_DETAIL_VD_IBP_CAT(a, b) BOOST_PP_DETAIL_VD_IBP_CAT_I(a, b)\n#define BOOST_PP_DETAIL_VD_IBP_CAT_I(a, b) BOOST_PP_DETAIL_VD_IBP_CAT_II(a ## b)\n#define BOOST_PP_DETAIL_VD_IBP_CAT_II(res) res\n\n#define BOOST_PP_DETAIL_IBP_SPLIT(i, ...) \\\n    BOOST_PP_DETAIL_VD_IBP_CAT(BOOST_PP_DETAIL_IBP_PRIMITIVE_CAT(BOOST_PP_DETAIL_IBP_SPLIT_,i)(__VA_ARGS__),BOOST_PP_EMPTY()) \\\n/**/\n\n#define BOOST_PP_DETAIL_IBP_IS_VARIADIC_C(...) 1 1\n\n#else\n\n#define BOOST_PP_DETAIL_IBP_SPLIT(i, ...) \\\n    BOOST_PP_DETAIL_IBP_PRIMITIVE_CAT(BOOST_PP_DETAIL_IBP_SPLIT_,i)(__VA_ARGS__) \\\n/**/\n\n#define BOOST_PP_DETAIL_IBP_IS_VARIADIC_C(...) 1\n\n#endif /* BOOST_PP_VARIADICS_MSVC */\n\n#define BOOST_PP_DETAIL_IBP_SPLIT_0(a, ...) a\n#define BOOST_PP_DETAIL_IBP_SPLIT_1(a, ...) __VA_ARGS__\n\n#define BOOST_PP_DETAIL_IBP_CAT(a, ...) BOOST_PP_DETAIL_IBP_PRIMITIVE_CAT(a,__VA_ARGS__)\n#define BOOST_PP_DETAIL_IBP_PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__\n\n#define BOOST_PP_DETAIL_IBP_IS_VARIADIC_R_1 1,\n#define BOOST_PP_DETAIL_IBP_IS_VARIADIC_R_BOOST_PP_DETAIL_IBP_IS_VARIADIC_C 0,\n\n#endif /* BOOST_PREPROCESSOR_DETAIL_IS_BEGIN_PARENS_HPP */\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/punctuation/is_begin_parens.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2014.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_IS_BEGIN_PARENS_HPP\n# define BOOST_PREPROCESSOR_IS_BEGIN_PARENS_HPP\n\n# include <boost/preprocessor/config/config.hpp>\n\n#if BOOST_PP_VARIADICS\n\n#include <boost/preprocessor/punctuation/detail/is_begin_parens.hpp>\n\n#if BOOST_PP_VARIADICS_MSVC && _MSC_VER <= 1400\n\n#define BOOST_PP_IS_BEGIN_PARENS(param) \\\n    BOOST_PP_DETAIL_IBP_SPLIT \\\n      ( \\\n      0, \\\n      BOOST_PP_DETAIL_IBP_CAT \\\n        ( \\\n        BOOST_PP_DETAIL_IBP_IS_VARIADIC_R_, \\\n        BOOST_PP_DETAIL_IBP_IS_VARIADIC_C param \\\n        ) \\\n      ) \\\n/**/\n\n#else\n\n#define BOOST_PP_IS_BEGIN_PARENS(...) \\\n    BOOST_PP_DETAIL_IBP_SPLIT \\\n      ( \\\n      0, \\\n      BOOST_PP_DETAIL_IBP_CAT \\\n        ( \\\n        BOOST_PP_DETAIL_IBP_IS_VARIADIC_R_, \\\n        BOOST_PP_DETAIL_IBP_IS_VARIADIC_C __VA_ARGS__ \\\n        ) \\\n      ) \\\n/**/\n\n#endif /* BOOST_PP_VARIADICS_MSVC && _MSC_VER <= 1400 */\n#endif /* BOOST_PP_VARIADICS */\n#endif /* BOOST_PREPROCESSOR_IS_BEGIN_PARENS_HPP */\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/repeat.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPEAT_HPP\n# define BOOST_PREPROCESSOR_REPEAT_HPP\n#\n# include <boost/preprocessor/repetition/repeat.hpp>\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/repetition/deduce_r.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_DEDUCE_R_HPP\n# define BOOST_PREPROCESSOR_REPETITION_DEDUCE_R_HPP\n#\n# include <boost/preprocessor/detail/auto_rec.hpp>\n# include <boost/preprocessor/repetition/for.hpp>\n#\n# /* BOOST_PP_DEDUCE_R */\n#\n# define BOOST_PP_DEDUCE_R() BOOST_PP_AUTO_REC(BOOST_PP_FOR_P, 256)\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/repetition/detail/dmc/for.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_DETAIL_FOR_HPP\n# define BOOST_PREPROCESSOR_REPETITION_DETAIL_FOR_HPP\n#\n# include <boost/preprocessor/control/expr_iif.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/logical/bool.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n#\n# define BOOST_PP_FOR_1(s, p, o, m) BOOST_PP_FOR_1_C(BOOST_PP_BOOL(p##(2, s)), s, p, o, m)\n# define BOOST_PP_FOR_2(s, p, o, m) BOOST_PP_FOR_2_C(BOOST_PP_BOOL(p##(3, s)), s, p, o, m)\n# define BOOST_PP_FOR_3(s, p, o, m) BOOST_PP_FOR_3_C(BOOST_PP_BOOL(p##(4, s)), s, p, o, m)\n# define BOOST_PP_FOR_4(s, p, o, m) BOOST_PP_FOR_4_C(BOOST_PP_BOOL(p##(5, s)), s, p, o, m)\n# define BOOST_PP_FOR_5(s, p, o, m) BOOST_PP_FOR_5_C(BOOST_PP_BOOL(p##(6, s)), s, p, o, m)\n# define BOOST_PP_FOR_6(s, p, o, m) BOOST_PP_FOR_6_C(BOOST_PP_BOOL(p##(7, s)), s, p, o, m)\n# define BOOST_PP_FOR_7(s, p, o, m) BOOST_PP_FOR_7_C(BOOST_PP_BOOL(p##(8, s)), s, p, o, m)\n# define BOOST_PP_FOR_8(s, p, o, m) BOOST_PP_FOR_8_C(BOOST_PP_BOOL(p##(9, s)), s, p, o, m)\n# define BOOST_PP_FOR_9(s, p, o, m) BOOST_PP_FOR_9_C(BOOST_PP_BOOL(p##(10, s)), s, p, o, m)\n# define BOOST_PP_FOR_10(s, p, o, m) BOOST_PP_FOR_10_C(BOOST_PP_BOOL(p##(11, s)), s, p, o, m)\n# define BOOST_PP_FOR_11(s, p, o, m) BOOST_PP_FOR_11_C(BOOST_PP_BOOL(p##(12, s)), s, p, o, m)\n# define BOOST_PP_FOR_12(s, p, o, m) BOOST_PP_FOR_12_C(BOOST_PP_BOOL(p##(13, s)), s, p, o, m)\n# define BOOST_PP_FOR_13(s, p, o, m) BOOST_PP_FOR_13_C(BOOST_PP_BOOL(p##(14, s)), s, p, o, m)\n# define BOOST_PP_FOR_14(s, p, o, m) BOOST_PP_FOR_14_C(BOOST_PP_BOOL(p##(15, s)), s, p, o, m)\n# define BOOST_PP_FOR_15(s, p, o, m) BOOST_PP_FOR_15_C(BOOST_PP_BOOL(p##(16, s)), s, p, o, m)\n# define BOOST_PP_FOR_16(s, p, o, m) BOOST_PP_FOR_16_C(BOOST_PP_BOOL(p##(17, s)), s, p, o, m)\n# define BOOST_PP_FOR_17(s, p, o, m) BOOST_PP_FOR_17_C(BOOST_PP_BOOL(p##(18, s)), s, p, o, m)\n# define BOOST_PP_FOR_18(s, p, o, m) BOOST_PP_FOR_18_C(BOOST_PP_BOOL(p##(19, s)), s, p, o, m)\n# define BOOST_PP_FOR_19(s, p, o, m) BOOST_PP_FOR_19_C(BOOST_PP_BOOL(p##(20, s)), s, p, o, m)\n# define BOOST_PP_FOR_20(s, p, o, m) BOOST_PP_FOR_20_C(BOOST_PP_BOOL(p##(21, s)), s, p, o, m)\n# define BOOST_PP_FOR_21(s, p, o, m) BOOST_PP_FOR_21_C(BOOST_PP_BOOL(p##(22, s)), s, p, o, m)\n# define BOOST_PP_FOR_22(s, p, o, m) BOOST_PP_FOR_22_C(BOOST_PP_BOOL(p##(23, s)), s, p, o, m)\n# define BOOST_PP_FOR_23(s, p, o, m) BOOST_PP_FOR_23_C(BOOST_PP_BOOL(p##(24, s)), s, p, o, m)\n# define BOOST_PP_FOR_24(s, p, o, m) BOOST_PP_FOR_24_C(BOOST_PP_BOOL(p##(25, s)), s, p, o, m)\n# define BOOST_PP_FOR_25(s, p, o, m) BOOST_PP_FOR_25_C(BOOST_PP_BOOL(p##(26, s)), s, p, o, m)\n# define BOOST_PP_FOR_26(s, p, o, m) BOOST_PP_FOR_26_C(BOOST_PP_BOOL(p##(27, s)), s, p, o, m)\n# define BOOST_PP_FOR_27(s, p, o, m) BOOST_PP_FOR_27_C(BOOST_PP_BOOL(p##(28, s)), s, p, o, m)\n# define BOOST_PP_FOR_28(s, p, o, m) BOOST_PP_FOR_28_C(BOOST_PP_BOOL(p##(29, s)), s, p, o, m)\n# define BOOST_PP_FOR_29(s, p, o, m) BOOST_PP_FOR_29_C(BOOST_PP_BOOL(p##(30, s)), s, p, o, m)\n# define BOOST_PP_FOR_30(s, p, o, m) BOOST_PP_FOR_30_C(BOOST_PP_BOOL(p##(31, s)), s, p, o, m)\n# define BOOST_PP_FOR_31(s, p, o, m) BOOST_PP_FOR_31_C(BOOST_PP_BOOL(p##(32, s)), s, p, o, m)\n# define BOOST_PP_FOR_32(s, p, o, m) BOOST_PP_FOR_32_C(BOOST_PP_BOOL(p##(33, s)), s, p, o, m)\n# define BOOST_PP_FOR_33(s, p, o, m) BOOST_PP_FOR_33_C(BOOST_PP_BOOL(p##(34, s)), s, p, o, m)\n# define BOOST_PP_FOR_34(s, p, o, m) BOOST_PP_FOR_34_C(BOOST_PP_BOOL(p##(35, s)), s, p, o, m)\n# define BOOST_PP_FOR_35(s, p, o, m) BOOST_PP_FOR_35_C(BOOST_PP_BOOL(p##(36, s)), s, p, o, m)\n# define BOOST_PP_FOR_36(s, p, o, m) BOOST_PP_FOR_36_C(BOOST_PP_BOOL(p##(37, s)), s, p, o, m)\n# define BOOST_PP_FOR_37(s, p, o, m) BOOST_PP_FOR_37_C(BOOST_PP_BOOL(p##(38, s)), s, p, o, m)\n# define BOOST_PP_FOR_38(s, p, o, m) BOOST_PP_FOR_38_C(BOOST_PP_BOOL(p##(39, s)), s, p, o, m)\n# define BOOST_PP_FOR_39(s, p, o, m) BOOST_PP_FOR_39_C(BOOST_PP_BOOL(p##(40, s)), s, p, o, m)\n# define BOOST_PP_FOR_40(s, p, o, m) BOOST_PP_FOR_40_C(BOOST_PP_BOOL(p##(41, s)), s, p, o, m)\n# define BOOST_PP_FOR_41(s, p, o, m) BOOST_PP_FOR_41_C(BOOST_PP_BOOL(p##(42, s)), s, p, o, m)\n# define BOOST_PP_FOR_42(s, p, o, m) BOOST_PP_FOR_42_C(BOOST_PP_BOOL(p##(43, s)), s, p, o, m)\n# define BOOST_PP_FOR_43(s, p, o, m) BOOST_PP_FOR_43_C(BOOST_PP_BOOL(p##(44, s)), s, p, o, m)\n# define BOOST_PP_FOR_44(s, p, o, m) BOOST_PP_FOR_44_C(BOOST_PP_BOOL(p##(45, s)), s, p, o, m)\n# define BOOST_PP_FOR_45(s, p, o, m) BOOST_PP_FOR_45_C(BOOST_PP_BOOL(p##(46, s)), s, p, o, m)\n# define BOOST_PP_FOR_46(s, p, o, m) BOOST_PP_FOR_46_C(BOOST_PP_BOOL(p##(47, s)), s, p, o, m)\n# define BOOST_PP_FOR_47(s, p, o, m) BOOST_PP_FOR_47_C(BOOST_PP_BOOL(p##(48, s)), s, p, o, m)\n# define BOOST_PP_FOR_48(s, p, o, m) BOOST_PP_FOR_48_C(BOOST_PP_BOOL(p##(49, s)), s, p, o, m)\n# define BOOST_PP_FOR_49(s, p, o, m) BOOST_PP_FOR_49_C(BOOST_PP_BOOL(p##(50, s)), s, p, o, m)\n# define BOOST_PP_FOR_50(s, p, o, m) BOOST_PP_FOR_50_C(BOOST_PP_BOOL(p##(51, s)), s, p, o, m)\n# define BOOST_PP_FOR_51(s, p, o, m) BOOST_PP_FOR_51_C(BOOST_PP_BOOL(p##(52, s)), s, p, o, m)\n# define BOOST_PP_FOR_52(s, p, o, m) BOOST_PP_FOR_52_C(BOOST_PP_BOOL(p##(53, s)), s, p, o, m)\n# define BOOST_PP_FOR_53(s, p, o, m) BOOST_PP_FOR_53_C(BOOST_PP_BOOL(p##(54, s)), s, p, o, m)\n# define BOOST_PP_FOR_54(s, p, o, m) BOOST_PP_FOR_54_C(BOOST_PP_BOOL(p##(55, s)), s, p, o, m)\n# define BOOST_PP_FOR_55(s, p, o, m) BOOST_PP_FOR_55_C(BOOST_PP_BOOL(p##(56, s)), s, p, o, m)\n# define BOOST_PP_FOR_56(s, p, o, m) BOOST_PP_FOR_56_C(BOOST_PP_BOOL(p##(57, s)), s, p, o, m)\n# define BOOST_PP_FOR_57(s, p, o, m) BOOST_PP_FOR_57_C(BOOST_PP_BOOL(p##(58, s)), s, p, o, m)\n# define BOOST_PP_FOR_58(s, p, o, m) BOOST_PP_FOR_58_C(BOOST_PP_BOOL(p##(59, s)), s, p, o, m)\n# define BOOST_PP_FOR_59(s, p, o, m) BOOST_PP_FOR_59_C(BOOST_PP_BOOL(p##(60, s)), s, p, o, m)\n# define BOOST_PP_FOR_60(s, p, o, m) BOOST_PP_FOR_60_C(BOOST_PP_BOOL(p##(61, s)), s, p, o, m)\n# define BOOST_PP_FOR_61(s, p, o, m) BOOST_PP_FOR_61_C(BOOST_PP_BOOL(p##(62, s)), s, p, o, m)\n# define BOOST_PP_FOR_62(s, p, o, m) BOOST_PP_FOR_62_C(BOOST_PP_BOOL(p##(63, s)), s, p, o, m)\n# define BOOST_PP_FOR_63(s, p, o, m) BOOST_PP_FOR_63_C(BOOST_PP_BOOL(p##(64, s)), s, p, o, m)\n# define BOOST_PP_FOR_64(s, p, o, m) BOOST_PP_FOR_64_C(BOOST_PP_BOOL(p##(65, s)), s, p, o, m)\n# define BOOST_PP_FOR_65(s, p, o, m) BOOST_PP_FOR_65_C(BOOST_PP_BOOL(p##(66, s)), s, p, o, m)\n# define BOOST_PP_FOR_66(s, p, o, m) BOOST_PP_FOR_66_C(BOOST_PP_BOOL(p##(67, s)), s, p, o, m)\n# define BOOST_PP_FOR_67(s, p, o, m) BOOST_PP_FOR_67_C(BOOST_PP_BOOL(p##(68, s)), s, p, o, m)\n# define BOOST_PP_FOR_68(s, p, o, m) BOOST_PP_FOR_68_C(BOOST_PP_BOOL(p##(69, s)), s, p, o, m)\n# define BOOST_PP_FOR_69(s, p, o, m) BOOST_PP_FOR_69_C(BOOST_PP_BOOL(p##(70, s)), s, p, o, m)\n# define BOOST_PP_FOR_70(s, p, o, m) BOOST_PP_FOR_70_C(BOOST_PP_BOOL(p##(71, s)), s, p, o, m)\n# define BOOST_PP_FOR_71(s, p, o, m) BOOST_PP_FOR_71_C(BOOST_PP_BOOL(p##(72, s)), s, p, o, m)\n# define BOOST_PP_FOR_72(s, p, o, m) BOOST_PP_FOR_72_C(BOOST_PP_BOOL(p##(73, s)), s, p, o, m)\n# define BOOST_PP_FOR_73(s, p, o, m) BOOST_PP_FOR_73_C(BOOST_PP_BOOL(p##(74, s)), s, p, o, m)\n# define BOOST_PP_FOR_74(s, p, o, m) BOOST_PP_FOR_74_C(BOOST_PP_BOOL(p##(75, s)), s, p, o, m)\n# define BOOST_PP_FOR_75(s, p, o, m) BOOST_PP_FOR_75_C(BOOST_PP_BOOL(p##(76, s)), s, p, o, m)\n# define BOOST_PP_FOR_76(s, p, o, m) BOOST_PP_FOR_76_C(BOOST_PP_BOOL(p##(77, s)), s, p, o, m)\n# define BOOST_PP_FOR_77(s, p, o, m) BOOST_PP_FOR_77_C(BOOST_PP_BOOL(p##(78, s)), s, p, o, m)\n# define BOOST_PP_FOR_78(s, p, o, m) BOOST_PP_FOR_78_C(BOOST_PP_BOOL(p##(79, s)), s, p, o, m)\n# define BOOST_PP_FOR_79(s, p, o, m) BOOST_PP_FOR_79_C(BOOST_PP_BOOL(p##(80, s)), s, p, o, m)\n# define BOOST_PP_FOR_80(s, p, o, m) BOOST_PP_FOR_80_C(BOOST_PP_BOOL(p##(81, s)), s, p, o, m)\n# define BOOST_PP_FOR_81(s, p, o, m) BOOST_PP_FOR_81_C(BOOST_PP_BOOL(p##(82, s)), s, p, o, m)\n# define BOOST_PP_FOR_82(s, p, o, m) BOOST_PP_FOR_82_C(BOOST_PP_BOOL(p##(83, s)), s, p, o, m)\n# define BOOST_PP_FOR_83(s, p, o, m) BOOST_PP_FOR_83_C(BOOST_PP_BOOL(p##(84, s)), s, p, o, m)\n# define BOOST_PP_FOR_84(s, p, o, m) BOOST_PP_FOR_84_C(BOOST_PP_BOOL(p##(85, s)), s, p, o, m)\n# define BOOST_PP_FOR_85(s, p, o, m) BOOST_PP_FOR_85_C(BOOST_PP_BOOL(p##(86, s)), s, p, o, m)\n# define BOOST_PP_FOR_86(s, p, o, m) BOOST_PP_FOR_86_C(BOOST_PP_BOOL(p##(87, s)), s, p, o, m)\n# define BOOST_PP_FOR_87(s, p, o, m) BOOST_PP_FOR_87_C(BOOST_PP_BOOL(p##(88, s)), s, p, o, m)\n# define BOOST_PP_FOR_88(s, p, o, m) BOOST_PP_FOR_88_C(BOOST_PP_BOOL(p##(89, s)), s, p, o, m)\n# define BOOST_PP_FOR_89(s, p, o, m) BOOST_PP_FOR_89_C(BOOST_PP_BOOL(p##(90, s)), s, p, o, m)\n# define BOOST_PP_FOR_90(s, p, o, m) BOOST_PP_FOR_90_C(BOOST_PP_BOOL(p##(91, s)), s, p, o, m)\n# define BOOST_PP_FOR_91(s, p, o, m) BOOST_PP_FOR_91_C(BOOST_PP_BOOL(p##(92, s)), s, p, o, m)\n# define BOOST_PP_FOR_92(s, p, o, m) BOOST_PP_FOR_92_C(BOOST_PP_BOOL(p##(93, s)), s, p, o, m)\n# define BOOST_PP_FOR_93(s, p, o, m) BOOST_PP_FOR_93_C(BOOST_PP_BOOL(p##(94, s)), s, p, o, m)\n# define BOOST_PP_FOR_94(s, p, o, m) BOOST_PP_FOR_94_C(BOOST_PP_BOOL(p##(95, s)), s, p, o, m)\n# define BOOST_PP_FOR_95(s, p, o, m) BOOST_PP_FOR_95_C(BOOST_PP_BOOL(p##(96, s)), s, p, o, m)\n# define BOOST_PP_FOR_96(s, p, o, m) BOOST_PP_FOR_96_C(BOOST_PP_BOOL(p##(97, s)), s, p, o, m)\n# define BOOST_PP_FOR_97(s, p, o, m) BOOST_PP_FOR_97_C(BOOST_PP_BOOL(p##(98, s)), s, p, o, m)\n# define BOOST_PP_FOR_98(s, p, o, m) BOOST_PP_FOR_98_C(BOOST_PP_BOOL(p##(99, s)), s, p, o, m)\n# define BOOST_PP_FOR_99(s, p, o, m) BOOST_PP_FOR_99_C(BOOST_PP_BOOL(p##(100, s)), s, p, o, m)\n# define BOOST_PP_FOR_100(s, p, o, m) BOOST_PP_FOR_100_C(BOOST_PP_BOOL(p##(101, s)), s, p, o, m)\n# define BOOST_PP_FOR_101(s, p, o, m) BOOST_PP_FOR_101_C(BOOST_PP_BOOL(p##(102, s)), s, p, o, m)\n# define BOOST_PP_FOR_102(s, p, o, m) BOOST_PP_FOR_102_C(BOOST_PP_BOOL(p##(103, s)), s, p, o, m)\n# define BOOST_PP_FOR_103(s, p, o, m) BOOST_PP_FOR_103_C(BOOST_PP_BOOL(p##(104, s)), s, p, o, m)\n# define BOOST_PP_FOR_104(s, p, o, m) BOOST_PP_FOR_104_C(BOOST_PP_BOOL(p##(105, s)), s, p, o, m)\n# define BOOST_PP_FOR_105(s, p, o, m) BOOST_PP_FOR_105_C(BOOST_PP_BOOL(p##(106, s)), s, p, o, m)\n# define BOOST_PP_FOR_106(s, p, o, m) BOOST_PP_FOR_106_C(BOOST_PP_BOOL(p##(107, s)), s, p, o, m)\n# define BOOST_PP_FOR_107(s, p, o, m) BOOST_PP_FOR_107_C(BOOST_PP_BOOL(p##(108, s)), s, p, o, m)\n# define BOOST_PP_FOR_108(s, p, o, m) BOOST_PP_FOR_108_C(BOOST_PP_BOOL(p##(109, s)), s, p, o, m)\n# define BOOST_PP_FOR_109(s, p, o, m) BOOST_PP_FOR_109_C(BOOST_PP_BOOL(p##(110, s)), s, p, o, m)\n# define BOOST_PP_FOR_110(s, p, o, m) BOOST_PP_FOR_110_C(BOOST_PP_BOOL(p##(111, s)), s, p, o, m)\n# define BOOST_PP_FOR_111(s, p, o, m) BOOST_PP_FOR_111_C(BOOST_PP_BOOL(p##(112, s)), s, p, o, m)\n# define BOOST_PP_FOR_112(s, p, o, m) BOOST_PP_FOR_112_C(BOOST_PP_BOOL(p##(113, s)), s, p, o, m)\n# define BOOST_PP_FOR_113(s, p, o, m) BOOST_PP_FOR_113_C(BOOST_PP_BOOL(p##(114, s)), s, p, o, m)\n# define BOOST_PP_FOR_114(s, p, o, m) BOOST_PP_FOR_114_C(BOOST_PP_BOOL(p##(115, s)), s, p, o, m)\n# define BOOST_PP_FOR_115(s, p, o, m) BOOST_PP_FOR_115_C(BOOST_PP_BOOL(p##(116, s)), s, p, o, m)\n# define BOOST_PP_FOR_116(s, p, o, m) BOOST_PP_FOR_116_C(BOOST_PP_BOOL(p##(117, s)), s, p, o, m)\n# define BOOST_PP_FOR_117(s, p, o, m) BOOST_PP_FOR_117_C(BOOST_PP_BOOL(p##(118, s)), s, p, o, m)\n# define BOOST_PP_FOR_118(s, p, o, m) BOOST_PP_FOR_118_C(BOOST_PP_BOOL(p##(119, s)), s, p, o, m)\n# define BOOST_PP_FOR_119(s, p, o, m) BOOST_PP_FOR_119_C(BOOST_PP_BOOL(p##(120, s)), s, p, o, m)\n# define BOOST_PP_FOR_120(s, p, o, m) BOOST_PP_FOR_120_C(BOOST_PP_BOOL(p##(121, s)), s, p, o, m)\n# define BOOST_PP_FOR_121(s, p, o, m) BOOST_PP_FOR_121_C(BOOST_PP_BOOL(p##(122, s)), s, p, o, m)\n# define BOOST_PP_FOR_122(s, p, o, m) BOOST_PP_FOR_122_C(BOOST_PP_BOOL(p##(123, s)), s, p, o, m)\n# define BOOST_PP_FOR_123(s, p, o, m) BOOST_PP_FOR_123_C(BOOST_PP_BOOL(p##(124, s)), s, p, o, m)\n# define BOOST_PP_FOR_124(s, p, o, m) BOOST_PP_FOR_124_C(BOOST_PP_BOOL(p##(125, s)), s, p, o, m)\n# define BOOST_PP_FOR_125(s, p, o, m) BOOST_PP_FOR_125_C(BOOST_PP_BOOL(p##(126, s)), s, p, o, m)\n# define BOOST_PP_FOR_126(s, p, o, m) BOOST_PP_FOR_126_C(BOOST_PP_BOOL(p##(127, s)), s, p, o, m)\n# define BOOST_PP_FOR_127(s, p, o, m) BOOST_PP_FOR_127_C(BOOST_PP_BOOL(p##(128, s)), s, p, o, m)\n# define BOOST_PP_FOR_128(s, p, o, m) BOOST_PP_FOR_128_C(BOOST_PP_BOOL(p##(129, s)), s, p, o, m)\n# define BOOST_PP_FOR_129(s, p, o, m) BOOST_PP_FOR_129_C(BOOST_PP_BOOL(p##(130, s)), s, p, o, m)\n# define BOOST_PP_FOR_130(s, p, o, m) BOOST_PP_FOR_130_C(BOOST_PP_BOOL(p##(131, s)), s, p, o, m)\n# define BOOST_PP_FOR_131(s, p, o, m) BOOST_PP_FOR_131_C(BOOST_PP_BOOL(p##(132, s)), s, p, o, m)\n# define BOOST_PP_FOR_132(s, p, o, m) BOOST_PP_FOR_132_C(BOOST_PP_BOOL(p##(133, s)), s, p, o, m)\n# define BOOST_PP_FOR_133(s, p, o, m) BOOST_PP_FOR_133_C(BOOST_PP_BOOL(p##(134, s)), s, p, o, m)\n# define BOOST_PP_FOR_134(s, p, o, m) BOOST_PP_FOR_134_C(BOOST_PP_BOOL(p##(135, s)), s, p, o, m)\n# define BOOST_PP_FOR_135(s, p, o, m) BOOST_PP_FOR_135_C(BOOST_PP_BOOL(p##(136, s)), s, p, o, m)\n# define BOOST_PP_FOR_136(s, p, o, m) BOOST_PP_FOR_136_C(BOOST_PP_BOOL(p##(137, s)), s, p, o, m)\n# define BOOST_PP_FOR_137(s, p, o, m) BOOST_PP_FOR_137_C(BOOST_PP_BOOL(p##(138, s)), s, p, o, m)\n# define BOOST_PP_FOR_138(s, p, o, m) BOOST_PP_FOR_138_C(BOOST_PP_BOOL(p##(139, s)), s, p, o, m)\n# define BOOST_PP_FOR_139(s, p, o, m) BOOST_PP_FOR_139_C(BOOST_PP_BOOL(p##(140, s)), s, p, o, m)\n# define BOOST_PP_FOR_140(s, p, o, m) BOOST_PP_FOR_140_C(BOOST_PP_BOOL(p##(141, s)), s, p, o, m)\n# define BOOST_PP_FOR_141(s, p, o, m) BOOST_PP_FOR_141_C(BOOST_PP_BOOL(p##(142, s)), s, p, o, m)\n# define BOOST_PP_FOR_142(s, p, o, m) BOOST_PP_FOR_142_C(BOOST_PP_BOOL(p##(143, s)), s, p, o, m)\n# define BOOST_PP_FOR_143(s, p, o, m) BOOST_PP_FOR_143_C(BOOST_PP_BOOL(p##(144, s)), s, p, o, m)\n# define BOOST_PP_FOR_144(s, p, o, m) BOOST_PP_FOR_144_C(BOOST_PP_BOOL(p##(145, s)), s, p, o, m)\n# define BOOST_PP_FOR_145(s, p, o, m) BOOST_PP_FOR_145_C(BOOST_PP_BOOL(p##(146, s)), s, p, o, m)\n# define BOOST_PP_FOR_146(s, p, o, m) BOOST_PP_FOR_146_C(BOOST_PP_BOOL(p##(147, s)), s, p, o, m)\n# define BOOST_PP_FOR_147(s, p, o, m) BOOST_PP_FOR_147_C(BOOST_PP_BOOL(p##(148, s)), s, p, o, m)\n# define BOOST_PP_FOR_148(s, p, o, m) BOOST_PP_FOR_148_C(BOOST_PP_BOOL(p##(149, s)), s, p, o, m)\n# define BOOST_PP_FOR_149(s, p, o, m) BOOST_PP_FOR_149_C(BOOST_PP_BOOL(p##(150, s)), s, p, o, m)\n# define BOOST_PP_FOR_150(s, p, o, m) BOOST_PP_FOR_150_C(BOOST_PP_BOOL(p##(151, s)), s, p, o, m)\n# define BOOST_PP_FOR_151(s, p, o, m) BOOST_PP_FOR_151_C(BOOST_PP_BOOL(p##(152, s)), s, p, o, m)\n# define BOOST_PP_FOR_152(s, p, o, m) BOOST_PP_FOR_152_C(BOOST_PP_BOOL(p##(153, s)), s, p, o, m)\n# define BOOST_PP_FOR_153(s, p, o, m) BOOST_PP_FOR_153_C(BOOST_PP_BOOL(p##(154, s)), s, p, o, m)\n# define BOOST_PP_FOR_154(s, p, o, m) BOOST_PP_FOR_154_C(BOOST_PP_BOOL(p##(155, s)), s, p, o, m)\n# define BOOST_PP_FOR_155(s, p, o, m) BOOST_PP_FOR_155_C(BOOST_PP_BOOL(p##(156, s)), s, p, o, m)\n# define BOOST_PP_FOR_156(s, p, o, m) BOOST_PP_FOR_156_C(BOOST_PP_BOOL(p##(157, s)), s, p, o, m)\n# define BOOST_PP_FOR_157(s, p, o, m) BOOST_PP_FOR_157_C(BOOST_PP_BOOL(p##(158, s)), s, p, o, m)\n# define BOOST_PP_FOR_158(s, p, o, m) BOOST_PP_FOR_158_C(BOOST_PP_BOOL(p##(159, s)), s, p, o, m)\n# define BOOST_PP_FOR_159(s, p, o, m) BOOST_PP_FOR_159_C(BOOST_PP_BOOL(p##(160, s)), s, p, o, m)\n# define BOOST_PP_FOR_160(s, p, o, m) BOOST_PP_FOR_160_C(BOOST_PP_BOOL(p##(161, s)), s, p, o, m)\n# define BOOST_PP_FOR_161(s, p, o, m) BOOST_PP_FOR_161_C(BOOST_PP_BOOL(p##(162, s)), s, p, o, m)\n# define BOOST_PP_FOR_162(s, p, o, m) BOOST_PP_FOR_162_C(BOOST_PP_BOOL(p##(163, s)), s, p, o, m)\n# define BOOST_PP_FOR_163(s, p, o, m) BOOST_PP_FOR_163_C(BOOST_PP_BOOL(p##(164, s)), s, p, o, m)\n# define BOOST_PP_FOR_164(s, p, o, m) BOOST_PP_FOR_164_C(BOOST_PP_BOOL(p##(165, s)), s, p, o, m)\n# define BOOST_PP_FOR_165(s, p, o, m) BOOST_PP_FOR_165_C(BOOST_PP_BOOL(p##(166, s)), s, p, o, m)\n# define BOOST_PP_FOR_166(s, p, o, m) BOOST_PP_FOR_166_C(BOOST_PP_BOOL(p##(167, s)), s, p, o, m)\n# define BOOST_PP_FOR_167(s, p, o, m) BOOST_PP_FOR_167_C(BOOST_PP_BOOL(p##(168, s)), s, p, o, m)\n# define BOOST_PP_FOR_168(s, p, o, m) BOOST_PP_FOR_168_C(BOOST_PP_BOOL(p##(169, s)), s, p, o, m)\n# define BOOST_PP_FOR_169(s, p, o, m) BOOST_PP_FOR_169_C(BOOST_PP_BOOL(p##(170, s)), s, p, o, m)\n# define BOOST_PP_FOR_170(s, p, o, m) BOOST_PP_FOR_170_C(BOOST_PP_BOOL(p##(171, s)), s, p, o, m)\n# define BOOST_PP_FOR_171(s, p, o, m) BOOST_PP_FOR_171_C(BOOST_PP_BOOL(p##(172, s)), s, p, o, m)\n# define BOOST_PP_FOR_172(s, p, o, m) BOOST_PP_FOR_172_C(BOOST_PP_BOOL(p##(173, s)), s, p, o, m)\n# define BOOST_PP_FOR_173(s, p, o, m) BOOST_PP_FOR_173_C(BOOST_PP_BOOL(p##(174, s)), s, p, o, m)\n# define BOOST_PP_FOR_174(s, p, o, m) BOOST_PP_FOR_174_C(BOOST_PP_BOOL(p##(175, s)), s, p, o, m)\n# define BOOST_PP_FOR_175(s, p, o, m) BOOST_PP_FOR_175_C(BOOST_PP_BOOL(p##(176, s)), s, p, o, m)\n# define BOOST_PP_FOR_176(s, p, o, m) BOOST_PP_FOR_176_C(BOOST_PP_BOOL(p##(177, s)), s, p, o, m)\n# define BOOST_PP_FOR_177(s, p, o, m) BOOST_PP_FOR_177_C(BOOST_PP_BOOL(p##(178, s)), s, p, o, m)\n# define BOOST_PP_FOR_178(s, p, o, m) BOOST_PP_FOR_178_C(BOOST_PP_BOOL(p##(179, s)), s, p, o, m)\n# define BOOST_PP_FOR_179(s, p, o, m) BOOST_PP_FOR_179_C(BOOST_PP_BOOL(p##(180, s)), s, p, o, m)\n# define BOOST_PP_FOR_180(s, p, o, m) BOOST_PP_FOR_180_C(BOOST_PP_BOOL(p##(181, s)), s, p, o, m)\n# define BOOST_PP_FOR_181(s, p, o, m) BOOST_PP_FOR_181_C(BOOST_PP_BOOL(p##(182, s)), s, p, o, m)\n# define BOOST_PP_FOR_182(s, p, o, m) BOOST_PP_FOR_182_C(BOOST_PP_BOOL(p##(183, s)), s, p, o, m)\n# define BOOST_PP_FOR_183(s, p, o, m) BOOST_PP_FOR_183_C(BOOST_PP_BOOL(p##(184, s)), s, p, o, m)\n# define BOOST_PP_FOR_184(s, p, o, m) BOOST_PP_FOR_184_C(BOOST_PP_BOOL(p##(185, s)), s, p, o, m)\n# define BOOST_PP_FOR_185(s, p, o, m) BOOST_PP_FOR_185_C(BOOST_PP_BOOL(p##(186, s)), s, p, o, m)\n# define BOOST_PP_FOR_186(s, p, o, m) BOOST_PP_FOR_186_C(BOOST_PP_BOOL(p##(187, s)), s, p, o, m)\n# define BOOST_PP_FOR_187(s, p, o, m) BOOST_PP_FOR_187_C(BOOST_PP_BOOL(p##(188, s)), s, p, o, m)\n# define BOOST_PP_FOR_188(s, p, o, m) BOOST_PP_FOR_188_C(BOOST_PP_BOOL(p##(189, s)), s, p, o, m)\n# define BOOST_PP_FOR_189(s, p, o, m) BOOST_PP_FOR_189_C(BOOST_PP_BOOL(p##(190, s)), s, p, o, m)\n# define BOOST_PP_FOR_190(s, p, o, m) BOOST_PP_FOR_190_C(BOOST_PP_BOOL(p##(191, s)), s, p, o, m)\n# define BOOST_PP_FOR_191(s, p, o, m) BOOST_PP_FOR_191_C(BOOST_PP_BOOL(p##(192, s)), s, p, o, m)\n# define BOOST_PP_FOR_192(s, p, o, m) BOOST_PP_FOR_192_C(BOOST_PP_BOOL(p##(193, s)), s, p, o, m)\n# define BOOST_PP_FOR_193(s, p, o, m) BOOST_PP_FOR_193_C(BOOST_PP_BOOL(p##(194, s)), s, p, o, m)\n# define BOOST_PP_FOR_194(s, p, o, m) BOOST_PP_FOR_194_C(BOOST_PP_BOOL(p##(195, s)), s, p, o, m)\n# define BOOST_PP_FOR_195(s, p, o, m) BOOST_PP_FOR_195_C(BOOST_PP_BOOL(p##(196, s)), s, p, o, m)\n# define BOOST_PP_FOR_196(s, p, o, m) BOOST_PP_FOR_196_C(BOOST_PP_BOOL(p##(197, s)), s, p, o, m)\n# define BOOST_PP_FOR_197(s, p, o, m) BOOST_PP_FOR_197_C(BOOST_PP_BOOL(p##(198, s)), s, p, o, m)\n# define BOOST_PP_FOR_198(s, p, o, m) BOOST_PP_FOR_198_C(BOOST_PP_BOOL(p##(199, s)), s, p, o, m)\n# define BOOST_PP_FOR_199(s, p, o, m) BOOST_PP_FOR_199_C(BOOST_PP_BOOL(p##(200, s)), s, p, o, m)\n# define BOOST_PP_FOR_200(s, p, o, m) BOOST_PP_FOR_200_C(BOOST_PP_BOOL(p##(201, s)), s, p, o, m)\n# define BOOST_PP_FOR_201(s, p, o, m) BOOST_PP_FOR_201_C(BOOST_PP_BOOL(p##(202, s)), s, p, o, m)\n# define BOOST_PP_FOR_202(s, p, o, m) BOOST_PP_FOR_202_C(BOOST_PP_BOOL(p##(203, s)), s, p, o, m)\n# define BOOST_PP_FOR_203(s, p, o, m) BOOST_PP_FOR_203_C(BOOST_PP_BOOL(p##(204, s)), s, p, o, m)\n# define BOOST_PP_FOR_204(s, p, o, m) BOOST_PP_FOR_204_C(BOOST_PP_BOOL(p##(205, s)), s, p, o, m)\n# define BOOST_PP_FOR_205(s, p, o, m) BOOST_PP_FOR_205_C(BOOST_PP_BOOL(p##(206, s)), s, p, o, m)\n# define BOOST_PP_FOR_206(s, p, o, m) BOOST_PP_FOR_206_C(BOOST_PP_BOOL(p##(207, s)), s, p, o, m)\n# define BOOST_PP_FOR_207(s, p, o, m) BOOST_PP_FOR_207_C(BOOST_PP_BOOL(p##(208, s)), s, p, o, m)\n# define BOOST_PP_FOR_208(s, p, o, m) BOOST_PP_FOR_208_C(BOOST_PP_BOOL(p##(209, s)), s, p, o, m)\n# define BOOST_PP_FOR_209(s, p, o, m) BOOST_PP_FOR_209_C(BOOST_PP_BOOL(p##(210, s)), s, p, o, m)\n# define BOOST_PP_FOR_210(s, p, o, m) BOOST_PP_FOR_210_C(BOOST_PP_BOOL(p##(211, s)), s, p, o, m)\n# define BOOST_PP_FOR_211(s, p, o, m) BOOST_PP_FOR_211_C(BOOST_PP_BOOL(p##(212, s)), s, p, o, m)\n# define BOOST_PP_FOR_212(s, p, o, m) BOOST_PP_FOR_212_C(BOOST_PP_BOOL(p##(213, s)), s, p, o, m)\n# define BOOST_PP_FOR_213(s, p, o, m) BOOST_PP_FOR_213_C(BOOST_PP_BOOL(p##(214, s)), s, p, o, m)\n# define BOOST_PP_FOR_214(s, p, o, m) BOOST_PP_FOR_214_C(BOOST_PP_BOOL(p##(215, s)), s, p, o, m)\n# define BOOST_PP_FOR_215(s, p, o, m) BOOST_PP_FOR_215_C(BOOST_PP_BOOL(p##(216, s)), s, p, o, m)\n# define BOOST_PP_FOR_216(s, p, o, m) BOOST_PP_FOR_216_C(BOOST_PP_BOOL(p##(217, s)), s, p, o, m)\n# define BOOST_PP_FOR_217(s, p, o, m) BOOST_PP_FOR_217_C(BOOST_PP_BOOL(p##(218, s)), s, p, o, m)\n# define BOOST_PP_FOR_218(s, p, o, m) BOOST_PP_FOR_218_C(BOOST_PP_BOOL(p##(219, s)), s, p, o, m)\n# define BOOST_PP_FOR_219(s, p, o, m) BOOST_PP_FOR_219_C(BOOST_PP_BOOL(p##(220, s)), s, p, o, m)\n# define BOOST_PP_FOR_220(s, p, o, m) BOOST_PP_FOR_220_C(BOOST_PP_BOOL(p##(221, s)), s, p, o, m)\n# define BOOST_PP_FOR_221(s, p, o, m) BOOST_PP_FOR_221_C(BOOST_PP_BOOL(p##(222, s)), s, p, o, m)\n# define BOOST_PP_FOR_222(s, p, o, m) BOOST_PP_FOR_222_C(BOOST_PP_BOOL(p##(223, s)), s, p, o, m)\n# define BOOST_PP_FOR_223(s, p, o, m) BOOST_PP_FOR_223_C(BOOST_PP_BOOL(p##(224, s)), s, p, o, m)\n# define BOOST_PP_FOR_224(s, p, o, m) BOOST_PP_FOR_224_C(BOOST_PP_BOOL(p##(225, s)), s, p, o, m)\n# define BOOST_PP_FOR_225(s, p, o, m) BOOST_PP_FOR_225_C(BOOST_PP_BOOL(p##(226, s)), s, p, o, m)\n# define BOOST_PP_FOR_226(s, p, o, m) BOOST_PP_FOR_226_C(BOOST_PP_BOOL(p##(227, s)), s, p, o, m)\n# define BOOST_PP_FOR_227(s, p, o, m) BOOST_PP_FOR_227_C(BOOST_PP_BOOL(p##(228, s)), s, p, o, m)\n# define BOOST_PP_FOR_228(s, p, o, m) BOOST_PP_FOR_228_C(BOOST_PP_BOOL(p##(229, s)), s, p, o, m)\n# define BOOST_PP_FOR_229(s, p, o, m) BOOST_PP_FOR_229_C(BOOST_PP_BOOL(p##(230, s)), s, p, o, m)\n# define BOOST_PP_FOR_230(s, p, o, m) BOOST_PP_FOR_230_C(BOOST_PP_BOOL(p##(231, s)), s, p, o, m)\n# define BOOST_PP_FOR_231(s, p, o, m) BOOST_PP_FOR_231_C(BOOST_PP_BOOL(p##(232, s)), s, p, o, m)\n# define BOOST_PP_FOR_232(s, p, o, m) BOOST_PP_FOR_232_C(BOOST_PP_BOOL(p##(233, s)), s, p, o, m)\n# define BOOST_PP_FOR_233(s, p, o, m) BOOST_PP_FOR_233_C(BOOST_PP_BOOL(p##(234, s)), s, p, o, m)\n# define BOOST_PP_FOR_234(s, p, o, m) BOOST_PP_FOR_234_C(BOOST_PP_BOOL(p##(235, s)), s, p, o, m)\n# define BOOST_PP_FOR_235(s, p, o, m) BOOST_PP_FOR_235_C(BOOST_PP_BOOL(p##(236, s)), s, p, o, m)\n# define BOOST_PP_FOR_236(s, p, o, m) BOOST_PP_FOR_236_C(BOOST_PP_BOOL(p##(237, s)), s, p, o, m)\n# define BOOST_PP_FOR_237(s, p, o, m) BOOST_PP_FOR_237_C(BOOST_PP_BOOL(p##(238, s)), s, p, o, m)\n# define BOOST_PP_FOR_238(s, p, o, m) BOOST_PP_FOR_238_C(BOOST_PP_BOOL(p##(239, s)), s, p, o, m)\n# define BOOST_PP_FOR_239(s, p, o, m) BOOST_PP_FOR_239_C(BOOST_PP_BOOL(p##(240, s)), s, p, o, m)\n# define BOOST_PP_FOR_240(s, p, o, m) BOOST_PP_FOR_240_C(BOOST_PP_BOOL(p##(241, s)), s, p, o, m)\n# define BOOST_PP_FOR_241(s, p, o, m) BOOST_PP_FOR_241_C(BOOST_PP_BOOL(p##(242, s)), s, p, o, m)\n# define BOOST_PP_FOR_242(s, p, o, m) BOOST_PP_FOR_242_C(BOOST_PP_BOOL(p##(243, s)), s, p, o, m)\n# define BOOST_PP_FOR_243(s, p, o, m) BOOST_PP_FOR_243_C(BOOST_PP_BOOL(p##(244, s)), s, p, o, m)\n# define BOOST_PP_FOR_244(s, p, o, m) BOOST_PP_FOR_244_C(BOOST_PP_BOOL(p##(245, s)), s, p, o, m)\n# define BOOST_PP_FOR_245(s, p, o, m) BOOST_PP_FOR_245_C(BOOST_PP_BOOL(p##(246, s)), s, p, o, m)\n# define BOOST_PP_FOR_246(s, p, o, m) BOOST_PP_FOR_246_C(BOOST_PP_BOOL(p##(247, s)), s, p, o, m)\n# define BOOST_PP_FOR_247(s, p, o, m) BOOST_PP_FOR_247_C(BOOST_PP_BOOL(p##(248, s)), s, p, o, m)\n# define BOOST_PP_FOR_248(s, p, o, m) BOOST_PP_FOR_248_C(BOOST_PP_BOOL(p##(249, s)), s, p, o, m)\n# define BOOST_PP_FOR_249(s, p, o, m) BOOST_PP_FOR_249_C(BOOST_PP_BOOL(p##(250, s)), s, p, o, m)\n# define BOOST_PP_FOR_250(s, p, o, m) BOOST_PP_FOR_250_C(BOOST_PP_BOOL(p##(251, s)), s, p, o, m)\n# define BOOST_PP_FOR_251(s, p, o, m) BOOST_PP_FOR_251_C(BOOST_PP_BOOL(p##(252, s)), s, p, o, m)\n# define BOOST_PP_FOR_252(s, p, o, m) BOOST_PP_FOR_252_C(BOOST_PP_BOOL(p##(253, s)), s, p, o, m)\n# define BOOST_PP_FOR_253(s, p, o, m) BOOST_PP_FOR_253_C(BOOST_PP_BOOL(p##(254, s)), s, p, o, m)\n# define BOOST_PP_FOR_254(s, p, o, m) BOOST_PP_FOR_254_C(BOOST_PP_BOOL(p##(255, s)), s, p, o, m)\n# define BOOST_PP_FOR_255(s, p, o, m) BOOST_PP_FOR_255_C(BOOST_PP_BOOL(p##(256, s)), s, p, o, m)\n# define BOOST_PP_FOR_256(s, p, o, m) BOOST_PP_FOR_256_C(BOOST_PP_BOOL(p##(257, s)), s, p, o, m)\n#\n# define BOOST_PP_FOR_1_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(2, s) BOOST_PP_IIF(c, BOOST_PP_FOR_2, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(2, s), p, o, m)\n# define BOOST_PP_FOR_2_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(3, s) BOOST_PP_IIF(c, BOOST_PP_FOR_3, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(3, s), p, o, m)\n# define BOOST_PP_FOR_3_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(4, s) BOOST_PP_IIF(c, BOOST_PP_FOR_4, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(4, s), p, o, m)\n# define BOOST_PP_FOR_4_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(5, s) BOOST_PP_IIF(c, BOOST_PP_FOR_5, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(5, s), p, o, m)\n# define BOOST_PP_FOR_5_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(6, s) BOOST_PP_IIF(c, BOOST_PP_FOR_6, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(6, s), p, o, m)\n# define BOOST_PP_FOR_6_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(7, s) BOOST_PP_IIF(c, BOOST_PP_FOR_7, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(7, s), p, o, m)\n# define BOOST_PP_FOR_7_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(8, s) BOOST_PP_IIF(c, BOOST_PP_FOR_8, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(8, s), p, o, m)\n# define BOOST_PP_FOR_8_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(9, s) BOOST_PP_IIF(c, BOOST_PP_FOR_9, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(9, s), p, o, m)\n# define BOOST_PP_FOR_9_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(10, s) BOOST_PP_IIF(c, BOOST_PP_FOR_10, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(10, s), p, o, m)\n# define BOOST_PP_FOR_10_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(11, s) BOOST_PP_IIF(c, BOOST_PP_FOR_11, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(11, s), p, o, m)\n# define BOOST_PP_FOR_11_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(12, s) BOOST_PP_IIF(c, BOOST_PP_FOR_12, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(12, s), p, o, m)\n# define BOOST_PP_FOR_12_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(13, s) BOOST_PP_IIF(c, BOOST_PP_FOR_13, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(13, s), p, o, m)\n# define BOOST_PP_FOR_13_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(14, s) BOOST_PP_IIF(c, BOOST_PP_FOR_14, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(14, s), p, o, m)\n# define BOOST_PP_FOR_14_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(15, s) BOOST_PP_IIF(c, BOOST_PP_FOR_15, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(15, s), p, o, m)\n# define BOOST_PP_FOR_15_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(16, s) BOOST_PP_IIF(c, BOOST_PP_FOR_16, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(16, s), p, o, m)\n# define BOOST_PP_FOR_16_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(17, s) BOOST_PP_IIF(c, BOOST_PP_FOR_17, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(17, s), p, o, m)\n# define BOOST_PP_FOR_17_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(18, s) BOOST_PP_IIF(c, BOOST_PP_FOR_18, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(18, s), p, o, m)\n# define BOOST_PP_FOR_18_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(19, s) BOOST_PP_IIF(c, BOOST_PP_FOR_19, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(19, s), p, o, m)\n# define BOOST_PP_FOR_19_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(20, s) BOOST_PP_IIF(c, BOOST_PP_FOR_20, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(20, s), p, o, m)\n# define BOOST_PP_FOR_20_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(21, s) BOOST_PP_IIF(c, BOOST_PP_FOR_21, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(21, s), p, o, m)\n# define BOOST_PP_FOR_21_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(22, s) BOOST_PP_IIF(c, BOOST_PP_FOR_22, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(22, s), p, o, m)\n# define BOOST_PP_FOR_22_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(23, s) BOOST_PP_IIF(c, BOOST_PP_FOR_23, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(23, s), p, o, m)\n# define BOOST_PP_FOR_23_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(24, s) BOOST_PP_IIF(c, BOOST_PP_FOR_24, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(24, s), p, o, m)\n# define BOOST_PP_FOR_24_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(25, s) BOOST_PP_IIF(c, BOOST_PP_FOR_25, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(25, s), p, o, m)\n# define BOOST_PP_FOR_25_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(26, s) BOOST_PP_IIF(c, BOOST_PP_FOR_26, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(26, s), p, o, m)\n# define BOOST_PP_FOR_26_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(27, s) BOOST_PP_IIF(c, BOOST_PP_FOR_27, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(27, s), p, o, m)\n# define BOOST_PP_FOR_27_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(28, s) BOOST_PP_IIF(c, BOOST_PP_FOR_28, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(28, s), p, o, m)\n# define BOOST_PP_FOR_28_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(29, s) BOOST_PP_IIF(c, BOOST_PP_FOR_29, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(29, s), p, o, m)\n# define BOOST_PP_FOR_29_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(30, s) BOOST_PP_IIF(c, BOOST_PP_FOR_30, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(30, s), p, o, m)\n# define BOOST_PP_FOR_30_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(31, s) BOOST_PP_IIF(c, BOOST_PP_FOR_31, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(31, s), p, o, m)\n# define BOOST_PP_FOR_31_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(32, s) BOOST_PP_IIF(c, BOOST_PP_FOR_32, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(32, s), p, o, m)\n# define BOOST_PP_FOR_32_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(33, s) BOOST_PP_IIF(c, BOOST_PP_FOR_33, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(33, s), p, o, m)\n# define BOOST_PP_FOR_33_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(34, s) BOOST_PP_IIF(c, BOOST_PP_FOR_34, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(34, s), p, o, m)\n# define BOOST_PP_FOR_34_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(35, s) BOOST_PP_IIF(c, BOOST_PP_FOR_35, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(35, s), p, o, m)\n# define BOOST_PP_FOR_35_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(36, s) BOOST_PP_IIF(c, BOOST_PP_FOR_36, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(36, s), p, o, m)\n# define BOOST_PP_FOR_36_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(37, s) BOOST_PP_IIF(c, BOOST_PP_FOR_37, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(37, s), p, o, m)\n# define BOOST_PP_FOR_37_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(38, s) BOOST_PP_IIF(c, BOOST_PP_FOR_38, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(38, s), p, o, m)\n# define BOOST_PP_FOR_38_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(39, s) BOOST_PP_IIF(c, BOOST_PP_FOR_39, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(39, s), p, o, m)\n# define BOOST_PP_FOR_39_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(40, s) BOOST_PP_IIF(c, BOOST_PP_FOR_40, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(40, s), p, o, m)\n# define BOOST_PP_FOR_40_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(41, s) BOOST_PP_IIF(c, BOOST_PP_FOR_41, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(41, s), p, o, m)\n# define BOOST_PP_FOR_41_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(42, s) BOOST_PP_IIF(c, BOOST_PP_FOR_42, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(42, s), p, o, m)\n# define BOOST_PP_FOR_42_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(43, s) BOOST_PP_IIF(c, BOOST_PP_FOR_43, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(43, s), p, o, m)\n# define BOOST_PP_FOR_43_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(44, s) BOOST_PP_IIF(c, BOOST_PP_FOR_44, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(44, s), p, o, m)\n# define BOOST_PP_FOR_44_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(45, s) BOOST_PP_IIF(c, BOOST_PP_FOR_45, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(45, s), p, o, m)\n# define BOOST_PP_FOR_45_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(46, s) BOOST_PP_IIF(c, BOOST_PP_FOR_46, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(46, s), p, o, m)\n# define BOOST_PP_FOR_46_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(47, s) BOOST_PP_IIF(c, BOOST_PP_FOR_47, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(47, s), p, o, m)\n# define BOOST_PP_FOR_47_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(48, s) BOOST_PP_IIF(c, BOOST_PP_FOR_48, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(48, s), p, o, m)\n# define BOOST_PP_FOR_48_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(49, s) BOOST_PP_IIF(c, BOOST_PP_FOR_49, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(49, s), p, o, m)\n# define BOOST_PP_FOR_49_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(50, s) BOOST_PP_IIF(c, BOOST_PP_FOR_50, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(50, s), p, o, m)\n# define BOOST_PP_FOR_50_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(51, s) BOOST_PP_IIF(c, BOOST_PP_FOR_51, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(51, s), p, o, m)\n# define BOOST_PP_FOR_51_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(52, s) BOOST_PP_IIF(c, BOOST_PP_FOR_52, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(52, s), p, o, m)\n# define BOOST_PP_FOR_52_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(53, s) BOOST_PP_IIF(c, BOOST_PP_FOR_53, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(53, s), p, o, m)\n# define BOOST_PP_FOR_53_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(54, s) BOOST_PP_IIF(c, BOOST_PP_FOR_54, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(54, s), p, o, m)\n# define BOOST_PP_FOR_54_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(55, s) BOOST_PP_IIF(c, BOOST_PP_FOR_55, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(55, s), p, o, m)\n# define BOOST_PP_FOR_55_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(56, s) BOOST_PP_IIF(c, BOOST_PP_FOR_56, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(56, s), p, o, m)\n# define BOOST_PP_FOR_56_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(57, s) BOOST_PP_IIF(c, BOOST_PP_FOR_57, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(57, s), p, o, m)\n# define BOOST_PP_FOR_57_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(58, s) BOOST_PP_IIF(c, BOOST_PP_FOR_58, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(58, s), p, o, m)\n# define BOOST_PP_FOR_58_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(59, s) BOOST_PP_IIF(c, BOOST_PP_FOR_59, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(59, s), p, o, m)\n# define BOOST_PP_FOR_59_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(60, s) BOOST_PP_IIF(c, BOOST_PP_FOR_60, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(60, s), p, o, m)\n# define BOOST_PP_FOR_60_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(61, s) BOOST_PP_IIF(c, BOOST_PP_FOR_61, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(61, s), p, o, m)\n# define BOOST_PP_FOR_61_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(62, s) BOOST_PP_IIF(c, BOOST_PP_FOR_62, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(62, s), p, o, m)\n# define BOOST_PP_FOR_62_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(63, s) BOOST_PP_IIF(c, BOOST_PP_FOR_63, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(63, s), p, o, m)\n# define BOOST_PP_FOR_63_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(64, s) BOOST_PP_IIF(c, BOOST_PP_FOR_64, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(64, s), p, o, m)\n# define BOOST_PP_FOR_64_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(65, s) BOOST_PP_IIF(c, BOOST_PP_FOR_65, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(65, s), p, o, m)\n# define BOOST_PP_FOR_65_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(66, s) BOOST_PP_IIF(c, BOOST_PP_FOR_66, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(66, s), p, o, m)\n# define BOOST_PP_FOR_66_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(67, s) BOOST_PP_IIF(c, BOOST_PP_FOR_67, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(67, s), p, o, m)\n# define BOOST_PP_FOR_67_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(68, s) BOOST_PP_IIF(c, BOOST_PP_FOR_68, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(68, s), p, o, m)\n# define BOOST_PP_FOR_68_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(69, s) BOOST_PP_IIF(c, BOOST_PP_FOR_69, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(69, s), p, o, m)\n# define BOOST_PP_FOR_69_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(70, s) BOOST_PP_IIF(c, BOOST_PP_FOR_70, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(70, s), p, o, m)\n# define BOOST_PP_FOR_70_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(71, s) BOOST_PP_IIF(c, BOOST_PP_FOR_71, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(71, s), p, o, m)\n# define BOOST_PP_FOR_71_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(72, s) BOOST_PP_IIF(c, BOOST_PP_FOR_72, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(72, s), p, o, m)\n# define BOOST_PP_FOR_72_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(73, s) BOOST_PP_IIF(c, BOOST_PP_FOR_73, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(73, s), p, o, m)\n# define BOOST_PP_FOR_73_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(74, s) BOOST_PP_IIF(c, BOOST_PP_FOR_74, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(74, s), p, o, m)\n# define BOOST_PP_FOR_74_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(75, s) BOOST_PP_IIF(c, BOOST_PP_FOR_75, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(75, s), p, o, m)\n# define BOOST_PP_FOR_75_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(76, s) BOOST_PP_IIF(c, BOOST_PP_FOR_76, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(76, s), p, o, m)\n# define BOOST_PP_FOR_76_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(77, s) BOOST_PP_IIF(c, BOOST_PP_FOR_77, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(77, s), p, o, m)\n# define BOOST_PP_FOR_77_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(78, s) BOOST_PP_IIF(c, BOOST_PP_FOR_78, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(78, s), p, o, m)\n# define BOOST_PP_FOR_78_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(79, s) BOOST_PP_IIF(c, BOOST_PP_FOR_79, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(79, s), p, o, m)\n# define BOOST_PP_FOR_79_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(80, s) BOOST_PP_IIF(c, BOOST_PP_FOR_80, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(80, s), p, o, m)\n# define BOOST_PP_FOR_80_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(81, s) BOOST_PP_IIF(c, BOOST_PP_FOR_81, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(81, s), p, o, m)\n# define BOOST_PP_FOR_81_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(82, s) BOOST_PP_IIF(c, BOOST_PP_FOR_82, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(82, s), p, o, m)\n# define BOOST_PP_FOR_82_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(83, s) BOOST_PP_IIF(c, BOOST_PP_FOR_83, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(83, s), p, o, m)\n# define BOOST_PP_FOR_83_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(84, s) BOOST_PP_IIF(c, BOOST_PP_FOR_84, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(84, s), p, o, m)\n# define BOOST_PP_FOR_84_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(85, s) BOOST_PP_IIF(c, BOOST_PP_FOR_85, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(85, s), p, o, m)\n# define BOOST_PP_FOR_85_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(86, s) BOOST_PP_IIF(c, BOOST_PP_FOR_86, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(86, s), p, o, m)\n# define BOOST_PP_FOR_86_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(87, s) BOOST_PP_IIF(c, BOOST_PP_FOR_87, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(87, s), p, o, m)\n# define BOOST_PP_FOR_87_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(88, s) BOOST_PP_IIF(c, BOOST_PP_FOR_88, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(88, s), p, o, m)\n# define BOOST_PP_FOR_88_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(89, s) BOOST_PP_IIF(c, BOOST_PP_FOR_89, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(89, s), p, o, m)\n# define BOOST_PP_FOR_89_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(90, s) BOOST_PP_IIF(c, BOOST_PP_FOR_90, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(90, s), p, o, m)\n# define BOOST_PP_FOR_90_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(91, s) BOOST_PP_IIF(c, BOOST_PP_FOR_91, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(91, s), p, o, m)\n# define BOOST_PP_FOR_91_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(92, s) BOOST_PP_IIF(c, BOOST_PP_FOR_92, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(92, s), p, o, m)\n# define BOOST_PP_FOR_92_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(93, s) BOOST_PP_IIF(c, BOOST_PP_FOR_93, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(93, s), p, o, m)\n# define BOOST_PP_FOR_93_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(94, s) BOOST_PP_IIF(c, BOOST_PP_FOR_94, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(94, s), p, o, m)\n# define BOOST_PP_FOR_94_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(95, s) BOOST_PP_IIF(c, BOOST_PP_FOR_95, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(95, s), p, o, m)\n# define BOOST_PP_FOR_95_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(96, s) BOOST_PP_IIF(c, BOOST_PP_FOR_96, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(96, s), p, o, m)\n# define BOOST_PP_FOR_96_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(97, s) BOOST_PP_IIF(c, BOOST_PP_FOR_97, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(97, s), p, o, m)\n# define BOOST_PP_FOR_97_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(98, s) BOOST_PP_IIF(c, BOOST_PP_FOR_98, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(98, s), p, o, m)\n# define BOOST_PP_FOR_98_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(99, s) BOOST_PP_IIF(c, BOOST_PP_FOR_99, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(99, s), p, o, m)\n# define BOOST_PP_FOR_99_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(100, s) BOOST_PP_IIF(c, BOOST_PP_FOR_100, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(100, s), p, o, m)\n# define BOOST_PP_FOR_100_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(101, s) BOOST_PP_IIF(c, BOOST_PP_FOR_101, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(101, s), p, o, m)\n# define BOOST_PP_FOR_101_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(102, s) BOOST_PP_IIF(c, BOOST_PP_FOR_102, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(102, s), p, o, m)\n# define BOOST_PP_FOR_102_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(103, s) BOOST_PP_IIF(c, BOOST_PP_FOR_103, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(103, s), p, o, m)\n# define BOOST_PP_FOR_103_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(104, s) BOOST_PP_IIF(c, BOOST_PP_FOR_104, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(104, s), p, o, m)\n# define BOOST_PP_FOR_104_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(105, s) BOOST_PP_IIF(c, BOOST_PP_FOR_105, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(105, s), p, o, m)\n# define BOOST_PP_FOR_105_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(106, s) BOOST_PP_IIF(c, BOOST_PP_FOR_106, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(106, s), p, o, m)\n# define BOOST_PP_FOR_106_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(107, s) BOOST_PP_IIF(c, BOOST_PP_FOR_107, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(107, s), p, o, m)\n# define BOOST_PP_FOR_107_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(108, s) BOOST_PP_IIF(c, BOOST_PP_FOR_108, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(108, s), p, o, m)\n# define BOOST_PP_FOR_108_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(109, s) BOOST_PP_IIF(c, BOOST_PP_FOR_109, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(109, s), p, o, m)\n# define BOOST_PP_FOR_109_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(110, s) BOOST_PP_IIF(c, BOOST_PP_FOR_110, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(110, s), p, o, m)\n# define BOOST_PP_FOR_110_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(111, s) BOOST_PP_IIF(c, BOOST_PP_FOR_111, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(111, s), p, o, m)\n# define BOOST_PP_FOR_111_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(112, s) BOOST_PP_IIF(c, BOOST_PP_FOR_112, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(112, s), p, o, m)\n# define BOOST_PP_FOR_112_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(113, s) BOOST_PP_IIF(c, BOOST_PP_FOR_113, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(113, s), p, o, m)\n# define BOOST_PP_FOR_113_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(114, s) BOOST_PP_IIF(c, BOOST_PP_FOR_114, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(114, s), p, o, m)\n# define BOOST_PP_FOR_114_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(115, s) BOOST_PP_IIF(c, BOOST_PP_FOR_115, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(115, s), p, o, m)\n# define BOOST_PP_FOR_115_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(116, s) BOOST_PP_IIF(c, BOOST_PP_FOR_116, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(116, s), p, o, m)\n# define BOOST_PP_FOR_116_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(117, s) BOOST_PP_IIF(c, BOOST_PP_FOR_117, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(117, s), p, o, m)\n# define BOOST_PP_FOR_117_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(118, s) BOOST_PP_IIF(c, BOOST_PP_FOR_118, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(118, s), p, o, m)\n# define BOOST_PP_FOR_118_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(119, s) BOOST_PP_IIF(c, BOOST_PP_FOR_119, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(119, s), p, o, m)\n# define BOOST_PP_FOR_119_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(120, s) BOOST_PP_IIF(c, BOOST_PP_FOR_120, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(120, s), p, o, m)\n# define BOOST_PP_FOR_120_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(121, s) BOOST_PP_IIF(c, BOOST_PP_FOR_121, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(121, s), p, o, m)\n# define BOOST_PP_FOR_121_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(122, s) BOOST_PP_IIF(c, BOOST_PP_FOR_122, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(122, s), p, o, m)\n# define BOOST_PP_FOR_122_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(123, s) BOOST_PP_IIF(c, BOOST_PP_FOR_123, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(123, s), p, o, m)\n# define BOOST_PP_FOR_123_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(124, s) BOOST_PP_IIF(c, BOOST_PP_FOR_124, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(124, s), p, o, m)\n# define BOOST_PP_FOR_124_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(125, s) BOOST_PP_IIF(c, BOOST_PP_FOR_125, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(125, s), p, o, m)\n# define BOOST_PP_FOR_125_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(126, s) BOOST_PP_IIF(c, BOOST_PP_FOR_126, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(126, s), p, o, m)\n# define BOOST_PP_FOR_126_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(127, s) BOOST_PP_IIF(c, BOOST_PP_FOR_127, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(127, s), p, o, m)\n# define BOOST_PP_FOR_127_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(128, s) BOOST_PP_IIF(c, BOOST_PP_FOR_128, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(128, s), p, o, m)\n# define BOOST_PP_FOR_128_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(129, s) BOOST_PP_IIF(c, BOOST_PP_FOR_129, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(129, s), p, o, m)\n# define BOOST_PP_FOR_129_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(130, s) BOOST_PP_IIF(c, BOOST_PP_FOR_130, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(130, s), p, o, m)\n# define BOOST_PP_FOR_130_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(131, s) BOOST_PP_IIF(c, BOOST_PP_FOR_131, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(131, s), p, o, m)\n# define BOOST_PP_FOR_131_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(132, s) BOOST_PP_IIF(c, BOOST_PP_FOR_132, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(132, s), p, o, m)\n# define BOOST_PP_FOR_132_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(133, s) BOOST_PP_IIF(c, BOOST_PP_FOR_133, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(133, s), p, o, m)\n# define BOOST_PP_FOR_133_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(134, s) BOOST_PP_IIF(c, BOOST_PP_FOR_134, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(134, s), p, o, m)\n# define BOOST_PP_FOR_134_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(135, s) BOOST_PP_IIF(c, BOOST_PP_FOR_135, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(135, s), p, o, m)\n# define BOOST_PP_FOR_135_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(136, s) BOOST_PP_IIF(c, BOOST_PP_FOR_136, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(136, s), p, o, m)\n# define BOOST_PP_FOR_136_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(137, s) BOOST_PP_IIF(c, BOOST_PP_FOR_137, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(137, s), p, o, m)\n# define BOOST_PP_FOR_137_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(138, s) BOOST_PP_IIF(c, BOOST_PP_FOR_138, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(138, s), p, o, m)\n# define BOOST_PP_FOR_138_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(139, s) BOOST_PP_IIF(c, BOOST_PP_FOR_139, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(139, s), p, o, m)\n# define BOOST_PP_FOR_139_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(140, s) BOOST_PP_IIF(c, BOOST_PP_FOR_140, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(140, s), p, o, m)\n# define BOOST_PP_FOR_140_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(141, s) BOOST_PP_IIF(c, BOOST_PP_FOR_141, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(141, s), p, o, m)\n# define BOOST_PP_FOR_141_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(142, s) BOOST_PP_IIF(c, BOOST_PP_FOR_142, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(142, s), p, o, m)\n# define BOOST_PP_FOR_142_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(143, s) BOOST_PP_IIF(c, BOOST_PP_FOR_143, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(143, s), p, o, m)\n# define BOOST_PP_FOR_143_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(144, s) BOOST_PP_IIF(c, BOOST_PP_FOR_144, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(144, s), p, o, m)\n# define BOOST_PP_FOR_144_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(145, s) BOOST_PP_IIF(c, BOOST_PP_FOR_145, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(145, s), p, o, m)\n# define BOOST_PP_FOR_145_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(146, s) BOOST_PP_IIF(c, BOOST_PP_FOR_146, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(146, s), p, o, m)\n# define BOOST_PP_FOR_146_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(147, s) BOOST_PP_IIF(c, BOOST_PP_FOR_147, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(147, s), p, o, m)\n# define BOOST_PP_FOR_147_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(148, s) BOOST_PP_IIF(c, BOOST_PP_FOR_148, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(148, s), p, o, m)\n# define BOOST_PP_FOR_148_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(149, s) BOOST_PP_IIF(c, BOOST_PP_FOR_149, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(149, s), p, o, m)\n# define BOOST_PP_FOR_149_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(150, s) BOOST_PP_IIF(c, BOOST_PP_FOR_150, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(150, s), p, o, m)\n# define BOOST_PP_FOR_150_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(151, s) BOOST_PP_IIF(c, BOOST_PP_FOR_151, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(151, s), p, o, m)\n# define BOOST_PP_FOR_151_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(152, s) BOOST_PP_IIF(c, BOOST_PP_FOR_152, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(152, s), p, o, m)\n# define BOOST_PP_FOR_152_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(153, s) BOOST_PP_IIF(c, BOOST_PP_FOR_153, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(153, s), p, o, m)\n# define BOOST_PP_FOR_153_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(154, s) BOOST_PP_IIF(c, BOOST_PP_FOR_154, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(154, s), p, o, m)\n# define BOOST_PP_FOR_154_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(155, s) BOOST_PP_IIF(c, BOOST_PP_FOR_155, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(155, s), p, o, m)\n# define BOOST_PP_FOR_155_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(156, s) BOOST_PP_IIF(c, BOOST_PP_FOR_156, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(156, s), p, o, m)\n# define BOOST_PP_FOR_156_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(157, s) BOOST_PP_IIF(c, BOOST_PP_FOR_157, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(157, s), p, o, m)\n# define BOOST_PP_FOR_157_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(158, s) BOOST_PP_IIF(c, BOOST_PP_FOR_158, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(158, s), p, o, m)\n# define BOOST_PP_FOR_158_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(159, s) BOOST_PP_IIF(c, BOOST_PP_FOR_159, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(159, s), p, o, m)\n# define BOOST_PP_FOR_159_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(160, s) BOOST_PP_IIF(c, BOOST_PP_FOR_160, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(160, s), p, o, m)\n# define BOOST_PP_FOR_160_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(161, s) BOOST_PP_IIF(c, BOOST_PP_FOR_161, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(161, s), p, o, m)\n# define BOOST_PP_FOR_161_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(162, s) BOOST_PP_IIF(c, BOOST_PP_FOR_162, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(162, s), p, o, m)\n# define BOOST_PP_FOR_162_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(163, s) BOOST_PP_IIF(c, BOOST_PP_FOR_163, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(163, s), p, o, m)\n# define BOOST_PP_FOR_163_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(164, s) BOOST_PP_IIF(c, BOOST_PP_FOR_164, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(164, s), p, o, m)\n# define BOOST_PP_FOR_164_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(165, s) BOOST_PP_IIF(c, BOOST_PP_FOR_165, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(165, s), p, o, m)\n# define BOOST_PP_FOR_165_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(166, s) BOOST_PP_IIF(c, BOOST_PP_FOR_166, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(166, s), p, o, m)\n# define BOOST_PP_FOR_166_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(167, s) BOOST_PP_IIF(c, BOOST_PP_FOR_167, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(167, s), p, o, m)\n# define BOOST_PP_FOR_167_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(168, s) BOOST_PP_IIF(c, BOOST_PP_FOR_168, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(168, s), p, o, m)\n# define BOOST_PP_FOR_168_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(169, s) BOOST_PP_IIF(c, BOOST_PP_FOR_169, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(169, s), p, o, m)\n# define BOOST_PP_FOR_169_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(170, s) BOOST_PP_IIF(c, BOOST_PP_FOR_170, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(170, s), p, o, m)\n# define BOOST_PP_FOR_170_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(171, s) BOOST_PP_IIF(c, BOOST_PP_FOR_171, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(171, s), p, o, m)\n# define BOOST_PP_FOR_171_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(172, s) BOOST_PP_IIF(c, BOOST_PP_FOR_172, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(172, s), p, o, m)\n# define BOOST_PP_FOR_172_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(173, s) BOOST_PP_IIF(c, BOOST_PP_FOR_173, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(173, s), p, o, m)\n# define BOOST_PP_FOR_173_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(174, s) BOOST_PP_IIF(c, BOOST_PP_FOR_174, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(174, s), p, o, m)\n# define BOOST_PP_FOR_174_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(175, s) BOOST_PP_IIF(c, BOOST_PP_FOR_175, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(175, s), p, o, m)\n# define BOOST_PP_FOR_175_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(176, s) BOOST_PP_IIF(c, BOOST_PP_FOR_176, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(176, s), p, o, m)\n# define BOOST_PP_FOR_176_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(177, s) BOOST_PP_IIF(c, BOOST_PP_FOR_177, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(177, s), p, o, m)\n# define BOOST_PP_FOR_177_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(178, s) BOOST_PP_IIF(c, BOOST_PP_FOR_178, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(178, s), p, o, m)\n# define BOOST_PP_FOR_178_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(179, s) BOOST_PP_IIF(c, BOOST_PP_FOR_179, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(179, s), p, o, m)\n# define BOOST_PP_FOR_179_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(180, s) BOOST_PP_IIF(c, BOOST_PP_FOR_180, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(180, s), p, o, m)\n# define BOOST_PP_FOR_180_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(181, s) BOOST_PP_IIF(c, BOOST_PP_FOR_181, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(181, s), p, o, m)\n# define BOOST_PP_FOR_181_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(182, s) BOOST_PP_IIF(c, BOOST_PP_FOR_182, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(182, s), p, o, m)\n# define BOOST_PP_FOR_182_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(183, s) BOOST_PP_IIF(c, BOOST_PP_FOR_183, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(183, s), p, o, m)\n# define BOOST_PP_FOR_183_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(184, s) BOOST_PP_IIF(c, BOOST_PP_FOR_184, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(184, s), p, o, m)\n# define BOOST_PP_FOR_184_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(185, s) BOOST_PP_IIF(c, BOOST_PP_FOR_185, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(185, s), p, o, m)\n# define BOOST_PP_FOR_185_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(186, s) BOOST_PP_IIF(c, BOOST_PP_FOR_186, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(186, s), p, o, m)\n# define BOOST_PP_FOR_186_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(187, s) BOOST_PP_IIF(c, BOOST_PP_FOR_187, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(187, s), p, o, m)\n# define BOOST_PP_FOR_187_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(188, s) BOOST_PP_IIF(c, BOOST_PP_FOR_188, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(188, s), p, o, m)\n# define BOOST_PP_FOR_188_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(189, s) BOOST_PP_IIF(c, BOOST_PP_FOR_189, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(189, s), p, o, m)\n# define BOOST_PP_FOR_189_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(190, s) BOOST_PP_IIF(c, BOOST_PP_FOR_190, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(190, s), p, o, m)\n# define BOOST_PP_FOR_190_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(191, s) BOOST_PP_IIF(c, BOOST_PP_FOR_191, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(191, s), p, o, m)\n# define BOOST_PP_FOR_191_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(192, s) BOOST_PP_IIF(c, BOOST_PP_FOR_192, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(192, s), p, o, m)\n# define BOOST_PP_FOR_192_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(193, s) BOOST_PP_IIF(c, BOOST_PP_FOR_193, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(193, s), p, o, m)\n# define BOOST_PP_FOR_193_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(194, s) BOOST_PP_IIF(c, BOOST_PP_FOR_194, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(194, s), p, o, m)\n# define BOOST_PP_FOR_194_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(195, s) BOOST_PP_IIF(c, BOOST_PP_FOR_195, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(195, s), p, o, m)\n# define BOOST_PP_FOR_195_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(196, s) BOOST_PP_IIF(c, BOOST_PP_FOR_196, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(196, s), p, o, m)\n# define BOOST_PP_FOR_196_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(197, s) BOOST_PP_IIF(c, BOOST_PP_FOR_197, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(197, s), p, o, m)\n# define BOOST_PP_FOR_197_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(198, s) BOOST_PP_IIF(c, BOOST_PP_FOR_198, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(198, s), p, o, m)\n# define BOOST_PP_FOR_198_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(199, s) BOOST_PP_IIF(c, BOOST_PP_FOR_199, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(199, s), p, o, m)\n# define BOOST_PP_FOR_199_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(200, s) BOOST_PP_IIF(c, BOOST_PP_FOR_200, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(200, s), p, o, m)\n# define BOOST_PP_FOR_200_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(201, s) BOOST_PP_IIF(c, BOOST_PP_FOR_201, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(201, s), p, o, m)\n# define BOOST_PP_FOR_201_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(202, s) BOOST_PP_IIF(c, BOOST_PP_FOR_202, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(202, s), p, o, m)\n# define BOOST_PP_FOR_202_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(203, s) BOOST_PP_IIF(c, BOOST_PP_FOR_203, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(203, s), p, o, m)\n# define BOOST_PP_FOR_203_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(204, s) BOOST_PP_IIF(c, BOOST_PP_FOR_204, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(204, s), p, o, m)\n# define BOOST_PP_FOR_204_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(205, s) BOOST_PP_IIF(c, BOOST_PP_FOR_205, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(205, s), p, o, m)\n# define BOOST_PP_FOR_205_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(206, s) BOOST_PP_IIF(c, BOOST_PP_FOR_206, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(206, s), p, o, m)\n# define BOOST_PP_FOR_206_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(207, s) BOOST_PP_IIF(c, BOOST_PP_FOR_207, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(207, s), p, o, m)\n# define BOOST_PP_FOR_207_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(208, s) BOOST_PP_IIF(c, BOOST_PP_FOR_208, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(208, s), p, o, m)\n# define BOOST_PP_FOR_208_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(209, s) BOOST_PP_IIF(c, BOOST_PP_FOR_209, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(209, s), p, o, m)\n# define BOOST_PP_FOR_209_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(210, s) BOOST_PP_IIF(c, BOOST_PP_FOR_210, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(210, s), p, o, m)\n# define BOOST_PP_FOR_210_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(211, s) BOOST_PP_IIF(c, BOOST_PP_FOR_211, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(211, s), p, o, m)\n# define BOOST_PP_FOR_211_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(212, s) BOOST_PP_IIF(c, BOOST_PP_FOR_212, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(212, s), p, o, m)\n# define BOOST_PP_FOR_212_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(213, s) BOOST_PP_IIF(c, BOOST_PP_FOR_213, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(213, s), p, o, m)\n# define BOOST_PP_FOR_213_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(214, s) BOOST_PP_IIF(c, BOOST_PP_FOR_214, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(214, s), p, o, m)\n# define BOOST_PP_FOR_214_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(215, s) BOOST_PP_IIF(c, BOOST_PP_FOR_215, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(215, s), p, o, m)\n# define BOOST_PP_FOR_215_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(216, s) BOOST_PP_IIF(c, BOOST_PP_FOR_216, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(216, s), p, o, m)\n# define BOOST_PP_FOR_216_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(217, s) BOOST_PP_IIF(c, BOOST_PP_FOR_217, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(217, s), p, o, m)\n# define BOOST_PP_FOR_217_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(218, s) BOOST_PP_IIF(c, BOOST_PP_FOR_218, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(218, s), p, o, m)\n# define BOOST_PP_FOR_218_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(219, s) BOOST_PP_IIF(c, BOOST_PP_FOR_219, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(219, s), p, o, m)\n# define BOOST_PP_FOR_219_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(220, s) BOOST_PP_IIF(c, BOOST_PP_FOR_220, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(220, s), p, o, m)\n# define BOOST_PP_FOR_220_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(221, s) BOOST_PP_IIF(c, BOOST_PP_FOR_221, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(221, s), p, o, m)\n# define BOOST_PP_FOR_221_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(222, s) BOOST_PP_IIF(c, BOOST_PP_FOR_222, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(222, s), p, o, m)\n# define BOOST_PP_FOR_222_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(223, s) BOOST_PP_IIF(c, BOOST_PP_FOR_223, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(223, s), p, o, m)\n# define BOOST_PP_FOR_223_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(224, s) BOOST_PP_IIF(c, BOOST_PP_FOR_224, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(224, s), p, o, m)\n# define BOOST_PP_FOR_224_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(225, s) BOOST_PP_IIF(c, BOOST_PP_FOR_225, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(225, s), p, o, m)\n# define BOOST_PP_FOR_225_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(226, s) BOOST_PP_IIF(c, BOOST_PP_FOR_226, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(226, s), p, o, m)\n# define BOOST_PP_FOR_226_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(227, s) BOOST_PP_IIF(c, BOOST_PP_FOR_227, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(227, s), p, o, m)\n# define BOOST_PP_FOR_227_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(228, s) BOOST_PP_IIF(c, BOOST_PP_FOR_228, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(228, s), p, o, m)\n# define BOOST_PP_FOR_228_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(229, s) BOOST_PP_IIF(c, BOOST_PP_FOR_229, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(229, s), p, o, m)\n# define BOOST_PP_FOR_229_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(230, s) BOOST_PP_IIF(c, BOOST_PP_FOR_230, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(230, s), p, o, m)\n# define BOOST_PP_FOR_230_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(231, s) BOOST_PP_IIF(c, BOOST_PP_FOR_231, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(231, s), p, o, m)\n# define BOOST_PP_FOR_231_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(232, s) BOOST_PP_IIF(c, BOOST_PP_FOR_232, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(232, s), p, o, m)\n# define BOOST_PP_FOR_232_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(233, s) BOOST_PP_IIF(c, BOOST_PP_FOR_233, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(233, s), p, o, m)\n# define BOOST_PP_FOR_233_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(234, s) BOOST_PP_IIF(c, BOOST_PP_FOR_234, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(234, s), p, o, m)\n# define BOOST_PP_FOR_234_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(235, s) BOOST_PP_IIF(c, BOOST_PP_FOR_235, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(235, s), p, o, m)\n# define BOOST_PP_FOR_235_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(236, s) BOOST_PP_IIF(c, BOOST_PP_FOR_236, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(236, s), p, o, m)\n# define BOOST_PP_FOR_236_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(237, s) BOOST_PP_IIF(c, BOOST_PP_FOR_237, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(237, s), p, o, m)\n# define BOOST_PP_FOR_237_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(238, s) BOOST_PP_IIF(c, BOOST_PP_FOR_238, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(238, s), p, o, m)\n# define BOOST_PP_FOR_238_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(239, s) BOOST_PP_IIF(c, BOOST_PP_FOR_239, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(239, s), p, o, m)\n# define BOOST_PP_FOR_239_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(240, s) BOOST_PP_IIF(c, BOOST_PP_FOR_240, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(240, s), p, o, m)\n# define BOOST_PP_FOR_240_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(241, s) BOOST_PP_IIF(c, BOOST_PP_FOR_241, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(241, s), p, o, m)\n# define BOOST_PP_FOR_241_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(242, s) BOOST_PP_IIF(c, BOOST_PP_FOR_242, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(242, s), p, o, m)\n# define BOOST_PP_FOR_242_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(243, s) BOOST_PP_IIF(c, BOOST_PP_FOR_243, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(243, s), p, o, m)\n# define BOOST_PP_FOR_243_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(244, s) BOOST_PP_IIF(c, BOOST_PP_FOR_244, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(244, s), p, o, m)\n# define BOOST_PP_FOR_244_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(245, s) BOOST_PP_IIF(c, BOOST_PP_FOR_245, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(245, s), p, o, m)\n# define BOOST_PP_FOR_245_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(246, s) BOOST_PP_IIF(c, BOOST_PP_FOR_246, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(246, s), p, o, m)\n# define BOOST_PP_FOR_246_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(247, s) BOOST_PP_IIF(c, BOOST_PP_FOR_247, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(247, s), p, o, m)\n# define BOOST_PP_FOR_247_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(248, s) BOOST_PP_IIF(c, BOOST_PP_FOR_248, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(248, s), p, o, m)\n# define BOOST_PP_FOR_248_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(249, s) BOOST_PP_IIF(c, BOOST_PP_FOR_249, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(249, s), p, o, m)\n# define BOOST_PP_FOR_249_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(250, s) BOOST_PP_IIF(c, BOOST_PP_FOR_250, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(250, s), p, o, m)\n# define BOOST_PP_FOR_250_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(251, s) BOOST_PP_IIF(c, BOOST_PP_FOR_251, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(251, s), p, o, m)\n# define BOOST_PP_FOR_251_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(252, s) BOOST_PP_IIF(c, BOOST_PP_FOR_252, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(252, s), p, o, m)\n# define BOOST_PP_FOR_252_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(253, s) BOOST_PP_IIF(c, BOOST_PP_FOR_253, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(253, s), p, o, m)\n# define BOOST_PP_FOR_253_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(254, s) BOOST_PP_IIF(c, BOOST_PP_FOR_254, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(254, s), p, o, m)\n# define BOOST_PP_FOR_254_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(255, s) BOOST_PP_IIF(c, BOOST_PP_FOR_255, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(255, s), p, o, m)\n# define BOOST_PP_FOR_255_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(256, s) BOOST_PP_IIF(c, BOOST_PP_FOR_256, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(256, s), p, o, m)\n# define BOOST_PP_FOR_256_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(257, s) BOOST_PP_IIF(c, BOOST_PP_FOR_257, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(257, s), p, o, m)\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/repetition/detail/edg/for.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_DETAIL_EDG_FOR_HPP\n# define BOOST_PREPROCESSOR_REPETITION_DETAIL_EDG_FOR_HPP\n#\n# include <boost/preprocessor/control/if.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n#\n# define BOOST_PP_FOR_1(s, p, o, m) BOOST_PP_FOR_1_I(s, p, o, m)\n# define BOOST_PP_FOR_2(s, p, o, m) BOOST_PP_FOR_2_I(s, p, o, m)\n# define BOOST_PP_FOR_3(s, p, o, m) BOOST_PP_FOR_3_I(s, p, o, m)\n# define BOOST_PP_FOR_4(s, p, o, m) BOOST_PP_FOR_4_I(s, p, o, m)\n# define BOOST_PP_FOR_5(s, p, o, m) BOOST_PP_FOR_5_I(s, p, o, m)\n# define BOOST_PP_FOR_6(s, p, o, m) BOOST_PP_FOR_6_I(s, p, o, m)\n# define BOOST_PP_FOR_7(s, p, o, m) BOOST_PP_FOR_7_I(s, p, o, m)\n# define BOOST_PP_FOR_8(s, p, o, m) BOOST_PP_FOR_8_I(s, p, o, m)\n# define BOOST_PP_FOR_9(s, p, o, m) BOOST_PP_FOR_9_I(s, p, o, m)\n# define BOOST_PP_FOR_10(s, p, o, m) BOOST_PP_FOR_10_I(s, p, o, m)\n# define BOOST_PP_FOR_11(s, p, o, m) BOOST_PP_FOR_11_I(s, p, o, m)\n# define BOOST_PP_FOR_12(s, p, o, m) BOOST_PP_FOR_12_I(s, p, o, m)\n# define BOOST_PP_FOR_13(s, p, o, m) BOOST_PP_FOR_13_I(s, p, o, m)\n# define BOOST_PP_FOR_14(s, p, o, m) BOOST_PP_FOR_14_I(s, p, o, m)\n# define BOOST_PP_FOR_15(s, p, o, m) BOOST_PP_FOR_15_I(s, p, o, m)\n# define BOOST_PP_FOR_16(s, p, o, m) BOOST_PP_FOR_16_I(s, p, o, m)\n# define BOOST_PP_FOR_17(s, p, o, m) BOOST_PP_FOR_17_I(s, p, o, m)\n# define BOOST_PP_FOR_18(s, p, o, m) BOOST_PP_FOR_18_I(s, p, o, m)\n# define BOOST_PP_FOR_19(s, p, o, m) BOOST_PP_FOR_19_I(s, p, o, m)\n# define BOOST_PP_FOR_20(s, p, o, m) BOOST_PP_FOR_20_I(s, p, o, m)\n# define BOOST_PP_FOR_21(s, p, o, m) BOOST_PP_FOR_21_I(s, p, o, m)\n# define BOOST_PP_FOR_22(s, p, o, m) BOOST_PP_FOR_22_I(s, p, o, m)\n# define BOOST_PP_FOR_23(s, p, o, m) BOOST_PP_FOR_23_I(s, p, o, m)\n# define BOOST_PP_FOR_24(s, p, o, m) BOOST_PP_FOR_24_I(s, p, o, m)\n# define BOOST_PP_FOR_25(s, p, o, m) BOOST_PP_FOR_25_I(s, p, o, m)\n# define BOOST_PP_FOR_26(s, p, o, m) BOOST_PP_FOR_26_I(s, p, o, m)\n# define BOOST_PP_FOR_27(s, p, o, m) BOOST_PP_FOR_27_I(s, p, o, m)\n# define BOOST_PP_FOR_28(s, p, o, m) BOOST_PP_FOR_28_I(s, p, o, m)\n# define BOOST_PP_FOR_29(s, p, o, m) BOOST_PP_FOR_29_I(s, p, o, m)\n# define BOOST_PP_FOR_30(s, p, o, m) BOOST_PP_FOR_30_I(s, p, o, m)\n# define BOOST_PP_FOR_31(s, p, o, m) BOOST_PP_FOR_31_I(s, p, o, m)\n# define BOOST_PP_FOR_32(s, p, o, m) BOOST_PP_FOR_32_I(s, p, o, m)\n# define BOOST_PP_FOR_33(s, p, o, m) BOOST_PP_FOR_33_I(s, p, o, m)\n# define BOOST_PP_FOR_34(s, p, o, m) BOOST_PP_FOR_34_I(s, p, o, m)\n# define BOOST_PP_FOR_35(s, p, o, m) BOOST_PP_FOR_35_I(s, p, o, m)\n# define BOOST_PP_FOR_36(s, p, o, m) BOOST_PP_FOR_36_I(s, p, o, m)\n# define BOOST_PP_FOR_37(s, p, o, m) BOOST_PP_FOR_37_I(s, p, o, m)\n# define BOOST_PP_FOR_38(s, p, o, m) BOOST_PP_FOR_38_I(s, p, o, m)\n# define BOOST_PP_FOR_39(s, p, o, m) BOOST_PP_FOR_39_I(s, p, o, m)\n# define BOOST_PP_FOR_40(s, p, o, m) BOOST_PP_FOR_40_I(s, p, o, m)\n# define BOOST_PP_FOR_41(s, p, o, m) BOOST_PP_FOR_41_I(s, p, o, m)\n# define BOOST_PP_FOR_42(s, p, o, m) BOOST_PP_FOR_42_I(s, p, o, m)\n# define BOOST_PP_FOR_43(s, p, o, m) BOOST_PP_FOR_43_I(s, p, o, m)\n# define BOOST_PP_FOR_44(s, p, o, m) BOOST_PP_FOR_44_I(s, p, o, m)\n# define BOOST_PP_FOR_45(s, p, o, m) BOOST_PP_FOR_45_I(s, p, o, m)\n# define BOOST_PP_FOR_46(s, p, o, m) BOOST_PP_FOR_46_I(s, p, o, m)\n# define BOOST_PP_FOR_47(s, p, o, m) BOOST_PP_FOR_47_I(s, p, o, m)\n# define BOOST_PP_FOR_48(s, p, o, m) BOOST_PP_FOR_48_I(s, p, o, m)\n# define BOOST_PP_FOR_49(s, p, o, m) BOOST_PP_FOR_49_I(s, p, o, m)\n# define BOOST_PP_FOR_50(s, p, o, m) BOOST_PP_FOR_50_I(s, p, o, m)\n# define BOOST_PP_FOR_51(s, p, o, m) BOOST_PP_FOR_51_I(s, p, o, m)\n# define BOOST_PP_FOR_52(s, p, o, m) BOOST_PP_FOR_52_I(s, p, o, m)\n# define BOOST_PP_FOR_53(s, p, o, m) BOOST_PP_FOR_53_I(s, p, o, m)\n# define BOOST_PP_FOR_54(s, p, o, m) BOOST_PP_FOR_54_I(s, p, o, m)\n# define BOOST_PP_FOR_55(s, p, o, m) BOOST_PP_FOR_55_I(s, p, o, m)\n# define BOOST_PP_FOR_56(s, p, o, m) BOOST_PP_FOR_56_I(s, p, o, m)\n# define BOOST_PP_FOR_57(s, p, o, m) BOOST_PP_FOR_57_I(s, p, o, m)\n# define BOOST_PP_FOR_58(s, p, o, m) BOOST_PP_FOR_58_I(s, p, o, m)\n# define BOOST_PP_FOR_59(s, p, o, m) BOOST_PP_FOR_59_I(s, p, o, m)\n# define BOOST_PP_FOR_60(s, p, o, m) BOOST_PP_FOR_60_I(s, p, o, m)\n# define BOOST_PP_FOR_61(s, p, o, m) BOOST_PP_FOR_61_I(s, p, o, m)\n# define BOOST_PP_FOR_62(s, p, o, m) BOOST_PP_FOR_62_I(s, p, o, m)\n# define BOOST_PP_FOR_63(s, p, o, m) BOOST_PP_FOR_63_I(s, p, o, m)\n# define BOOST_PP_FOR_64(s, p, o, m) BOOST_PP_FOR_64_I(s, p, o, m)\n# define BOOST_PP_FOR_65(s, p, o, m) BOOST_PP_FOR_65_I(s, p, o, m)\n# define BOOST_PP_FOR_66(s, p, o, m) BOOST_PP_FOR_66_I(s, p, o, m)\n# define BOOST_PP_FOR_67(s, p, o, m) BOOST_PP_FOR_67_I(s, p, o, m)\n# define BOOST_PP_FOR_68(s, p, o, m) BOOST_PP_FOR_68_I(s, p, o, m)\n# define BOOST_PP_FOR_69(s, p, o, m) BOOST_PP_FOR_69_I(s, p, o, m)\n# define BOOST_PP_FOR_70(s, p, o, m) BOOST_PP_FOR_70_I(s, p, o, m)\n# define BOOST_PP_FOR_71(s, p, o, m) BOOST_PP_FOR_71_I(s, p, o, m)\n# define BOOST_PP_FOR_72(s, p, o, m) BOOST_PP_FOR_72_I(s, p, o, m)\n# define BOOST_PP_FOR_73(s, p, o, m) BOOST_PP_FOR_73_I(s, p, o, m)\n# define BOOST_PP_FOR_74(s, p, o, m) BOOST_PP_FOR_74_I(s, p, o, m)\n# define BOOST_PP_FOR_75(s, p, o, m) BOOST_PP_FOR_75_I(s, p, o, m)\n# define BOOST_PP_FOR_76(s, p, o, m) BOOST_PP_FOR_76_I(s, p, o, m)\n# define BOOST_PP_FOR_77(s, p, o, m) BOOST_PP_FOR_77_I(s, p, o, m)\n# define BOOST_PP_FOR_78(s, p, o, m) BOOST_PP_FOR_78_I(s, p, o, m)\n# define BOOST_PP_FOR_79(s, p, o, m) BOOST_PP_FOR_79_I(s, p, o, m)\n# define BOOST_PP_FOR_80(s, p, o, m) BOOST_PP_FOR_80_I(s, p, o, m)\n# define BOOST_PP_FOR_81(s, p, o, m) BOOST_PP_FOR_81_I(s, p, o, m)\n# define BOOST_PP_FOR_82(s, p, o, m) BOOST_PP_FOR_82_I(s, p, o, m)\n# define BOOST_PP_FOR_83(s, p, o, m) BOOST_PP_FOR_83_I(s, p, o, m)\n# define BOOST_PP_FOR_84(s, p, o, m) BOOST_PP_FOR_84_I(s, p, o, m)\n# define BOOST_PP_FOR_85(s, p, o, m) BOOST_PP_FOR_85_I(s, p, o, m)\n# define BOOST_PP_FOR_86(s, p, o, m) BOOST_PP_FOR_86_I(s, p, o, m)\n# define BOOST_PP_FOR_87(s, p, o, m) BOOST_PP_FOR_87_I(s, p, o, m)\n# define BOOST_PP_FOR_88(s, p, o, m) BOOST_PP_FOR_88_I(s, p, o, m)\n# define BOOST_PP_FOR_89(s, p, o, m) BOOST_PP_FOR_89_I(s, p, o, m)\n# define BOOST_PP_FOR_90(s, p, o, m) BOOST_PP_FOR_90_I(s, p, o, m)\n# define BOOST_PP_FOR_91(s, p, o, m) BOOST_PP_FOR_91_I(s, p, o, m)\n# define BOOST_PP_FOR_92(s, p, o, m) BOOST_PP_FOR_92_I(s, p, o, m)\n# define BOOST_PP_FOR_93(s, p, o, m) BOOST_PP_FOR_93_I(s, p, o, m)\n# define BOOST_PP_FOR_94(s, p, o, m) BOOST_PP_FOR_94_I(s, p, o, m)\n# define BOOST_PP_FOR_95(s, p, o, m) BOOST_PP_FOR_95_I(s, p, o, m)\n# define BOOST_PP_FOR_96(s, p, o, m) BOOST_PP_FOR_96_I(s, p, o, m)\n# define BOOST_PP_FOR_97(s, p, o, m) BOOST_PP_FOR_97_I(s, p, o, m)\n# define BOOST_PP_FOR_98(s, p, o, m) BOOST_PP_FOR_98_I(s, p, o, m)\n# define BOOST_PP_FOR_99(s, p, o, m) BOOST_PP_FOR_99_I(s, p, o, m)\n# define BOOST_PP_FOR_100(s, p, o, m) BOOST_PP_FOR_100_I(s, p, o, m)\n# define BOOST_PP_FOR_101(s, p, o, m) BOOST_PP_FOR_101_I(s, p, o, m)\n# define BOOST_PP_FOR_102(s, p, o, m) BOOST_PP_FOR_102_I(s, p, o, m)\n# define BOOST_PP_FOR_103(s, p, o, m) BOOST_PP_FOR_103_I(s, p, o, m)\n# define BOOST_PP_FOR_104(s, p, o, m) BOOST_PP_FOR_104_I(s, p, o, m)\n# define BOOST_PP_FOR_105(s, p, o, m) BOOST_PP_FOR_105_I(s, p, o, m)\n# define BOOST_PP_FOR_106(s, p, o, m) BOOST_PP_FOR_106_I(s, p, o, m)\n# define BOOST_PP_FOR_107(s, p, o, m) BOOST_PP_FOR_107_I(s, p, o, m)\n# define BOOST_PP_FOR_108(s, p, o, m) BOOST_PP_FOR_108_I(s, p, o, m)\n# define BOOST_PP_FOR_109(s, p, o, m) BOOST_PP_FOR_109_I(s, p, o, m)\n# define BOOST_PP_FOR_110(s, p, o, m) BOOST_PP_FOR_110_I(s, p, o, m)\n# define BOOST_PP_FOR_111(s, p, o, m) BOOST_PP_FOR_111_I(s, p, o, m)\n# define BOOST_PP_FOR_112(s, p, o, m) BOOST_PP_FOR_112_I(s, p, o, m)\n# define BOOST_PP_FOR_113(s, p, o, m) BOOST_PP_FOR_113_I(s, p, o, m)\n# define BOOST_PP_FOR_114(s, p, o, m) BOOST_PP_FOR_114_I(s, p, o, m)\n# define BOOST_PP_FOR_115(s, p, o, m) BOOST_PP_FOR_115_I(s, p, o, m)\n# define BOOST_PP_FOR_116(s, p, o, m) BOOST_PP_FOR_116_I(s, p, o, m)\n# define BOOST_PP_FOR_117(s, p, o, m) BOOST_PP_FOR_117_I(s, p, o, m)\n# define BOOST_PP_FOR_118(s, p, o, m) BOOST_PP_FOR_118_I(s, p, o, m)\n# define BOOST_PP_FOR_119(s, p, o, m) BOOST_PP_FOR_119_I(s, p, o, m)\n# define BOOST_PP_FOR_120(s, p, o, m) BOOST_PP_FOR_120_I(s, p, o, m)\n# define BOOST_PP_FOR_121(s, p, o, m) BOOST_PP_FOR_121_I(s, p, o, m)\n# define BOOST_PP_FOR_122(s, p, o, m) BOOST_PP_FOR_122_I(s, p, o, m)\n# define BOOST_PP_FOR_123(s, p, o, m) BOOST_PP_FOR_123_I(s, p, o, m)\n# define BOOST_PP_FOR_124(s, p, o, m) BOOST_PP_FOR_124_I(s, p, o, m)\n# define BOOST_PP_FOR_125(s, p, o, m) BOOST_PP_FOR_125_I(s, p, o, m)\n# define BOOST_PP_FOR_126(s, p, o, m) BOOST_PP_FOR_126_I(s, p, o, m)\n# define BOOST_PP_FOR_127(s, p, o, m) BOOST_PP_FOR_127_I(s, p, o, m)\n# define BOOST_PP_FOR_128(s, p, o, m) BOOST_PP_FOR_128_I(s, p, o, m)\n# define BOOST_PP_FOR_129(s, p, o, m) BOOST_PP_FOR_129_I(s, p, o, m)\n# define BOOST_PP_FOR_130(s, p, o, m) BOOST_PP_FOR_130_I(s, p, o, m)\n# define BOOST_PP_FOR_131(s, p, o, m) BOOST_PP_FOR_131_I(s, p, o, m)\n# define BOOST_PP_FOR_132(s, p, o, m) BOOST_PP_FOR_132_I(s, p, o, m)\n# define BOOST_PP_FOR_133(s, p, o, m) BOOST_PP_FOR_133_I(s, p, o, m)\n# define BOOST_PP_FOR_134(s, p, o, m) BOOST_PP_FOR_134_I(s, p, o, m)\n# define BOOST_PP_FOR_135(s, p, o, m) BOOST_PP_FOR_135_I(s, p, o, m)\n# define BOOST_PP_FOR_136(s, p, o, m) BOOST_PP_FOR_136_I(s, p, o, m)\n# define BOOST_PP_FOR_137(s, p, o, m) BOOST_PP_FOR_137_I(s, p, o, m)\n# define BOOST_PP_FOR_138(s, p, o, m) BOOST_PP_FOR_138_I(s, p, o, m)\n# define BOOST_PP_FOR_139(s, p, o, m) BOOST_PP_FOR_139_I(s, p, o, m)\n# define BOOST_PP_FOR_140(s, p, o, m) BOOST_PP_FOR_140_I(s, p, o, m)\n# define BOOST_PP_FOR_141(s, p, o, m) BOOST_PP_FOR_141_I(s, p, o, m)\n# define BOOST_PP_FOR_142(s, p, o, m) BOOST_PP_FOR_142_I(s, p, o, m)\n# define BOOST_PP_FOR_143(s, p, o, m) BOOST_PP_FOR_143_I(s, p, o, m)\n# define BOOST_PP_FOR_144(s, p, o, m) BOOST_PP_FOR_144_I(s, p, o, m)\n# define BOOST_PP_FOR_145(s, p, o, m) BOOST_PP_FOR_145_I(s, p, o, m)\n# define BOOST_PP_FOR_146(s, p, o, m) BOOST_PP_FOR_146_I(s, p, o, m)\n# define BOOST_PP_FOR_147(s, p, o, m) BOOST_PP_FOR_147_I(s, p, o, m)\n# define BOOST_PP_FOR_148(s, p, o, m) BOOST_PP_FOR_148_I(s, p, o, m)\n# define BOOST_PP_FOR_149(s, p, o, m) BOOST_PP_FOR_149_I(s, p, o, m)\n# define BOOST_PP_FOR_150(s, p, o, m) BOOST_PP_FOR_150_I(s, p, o, m)\n# define BOOST_PP_FOR_151(s, p, o, m) BOOST_PP_FOR_151_I(s, p, o, m)\n# define BOOST_PP_FOR_152(s, p, o, m) BOOST_PP_FOR_152_I(s, p, o, m)\n# define BOOST_PP_FOR_153(s, p, o, m) BOOST_PP_FOR_153_I(s, p, o, m)\n# define BOOST_PP_FOR_154(s, p, o, m) BOOST_PP_FOR_154_I(s, p, o, m)\n# define BOOST_PP_FOR_155(s, p, o, m) BOOST_PP_FOR_155_I(s, p, o, m)\n# define BOOST_PP_FOR_156(s, p, o, m) BOOST_PP_FOR_156_I(s, p, o, m)\n# define BOOST_PP_FOR_157(s, p, o, m) BOOST_PP_FOR_157_I(s, p, o, m)\n# define BOOST_PP_FOR_158(s, p, o, m) BOOST_PP_FOR_158_I(s, p, o, m)\n# define BOOST_PP_FOR_159(s, p, o, m) BOOST_PP_FOR_159_I(s, p, o, m)\n# define BOOST_PP_FOR_160(s, p, o, m) BOOST_PP_FOR_160_I(s, p, o, m)\n# define BOOST_PP_FOR_161(s, p, o, m) BOOST_PP_FOR_161_I(s, p, o, m)\n# define BOOST_PP_FOR_162(s, p, o, m) BOOST_PP_FOR_162_I(s, p, o, m)\n# define BOOST_PP_FOR_163(s, p, o, m) BOOST_PP_FOR_163_I(s, p, o, m)\n# define BOOST_PP_FOR_164(s, p, o, m) BOOST_PP_FOR_164_I(s, p, o, m)\n# define BOOST_PP_FOR_165(s, p, o, m) BOOST_PP_FOR_165_I(s, p, o, m)\n# define BOOST_PP_FOR_166(s, p, o, m) BOOST_PP_FOR_166_I(s, p, o, m)\n# define BOOST_PP_FOR_167(s, p, o, m) BOOST_PP_FOR_167_I(s, p, o, m)\n# define BOOST_PP_FOR_168(s, p, o, m) BOOST_PP_FOR_168_I(s, p, o, m)\n# define BOOST_PP_FOR_169(s, p, o, m) BOOST_PP_FOR_169_I(s, p, o, m)\n# define BOOST_PP_FOR_170(s, p, o, m) BOOST_PP_FOR_170_I(s, p, o, m)\n# define BOOST_PP_FOR_171(s, p, o, m) BOOST_PP_FOR_171_I(s, p, o, m)\n# define BOOST_PP_FOR_172(s, p, o, m) BOOST_PP_FOR_172_I(s, p, o, m)\n# define BOOST_PP_FOR_173(s, p, o, m) BOOST_PP_FOR_173_I(s, p, o, m)\n# define BOOST_PP_FOR_174(s, p, o, m) BOOST_PP_FOR_174_I(s, p, o, m)\n# define BOOST_PP_FOR_175(s, p, o, m) BOOST_PP_FOR_175_I(s, p, o, m)\n# define BOOST_PP_FOR_176(s, p, o, m) BOOST_PP_FOR_176_I(s, p, o, m)\n# define BOOST_PP_FOR_177(s, p, o, m) BOOST_PP_FOR_177_I(s, p, o, m)\n# define BOOST_PP_FOR_178(s, p, o, m) BOOST_PP_FOR_178_I(s, p, o, m)\n# define BOOST_PP_FOR_179(s, p, o, m) BOOST_PP_FOR_179_I(s, p, o, m)\n# define BOOST_PP_FOR_180(s, p, o, m) BOOST_PP_FOR_180_I(s, p, o, m)\n# define BOOST_PP_FOR_181(s, p, o, m) BOOST_PP_FOR_181_I(s, p, o, m)\n# define BOOST_PP_FOR_182(s, p, o, m) BOOST_PP_FOR_182_I(s, p, o, m)\n# define BOOST_PP_FOR_183(s, p, o, m) BOOST_PP_FOR_183_I(s, p, o, m)\n# define BOOST_PP_FOR_184(s, p, o, m) BOOST_PP_FOR_184_I(s, p, o, m)\n# define BOOST_PP_FOR_185(s, p, o, m) BOOST_PP_FOR_185_I(s, p, o, m)\n# define BOOST_PP_FOR_186(s, p, o, m) BOOST_PP_FOR_186_I(s, p, o, m)\n# define BOOST_PP_FOR_187(s, p, o, m) BOOST_PP_FOR_187_I(s, p, o, m)\n# define BOOST_PP_FOR_188(s, p, o, m) BOOST_PP_FOR_188_I(s, p, o, m)\n# define BOOST_PP_FOR_189(s, p, o, m) BOOST_PP_FOR_189_I(s, p, o, m)\n# define BOOST_PP_FOR_190(s, p, o, m) BOOST_PP_FOR_190_I(s, p, o, m)\n# define BOOST_PP_FOR_191(s, p, o, m) BOOST_PP_FOR_191_I(s, p, o, m)\n# define BOOST_PP_FOR_192(s, p, o, m) BOOST_PP_FOR_192_I(s, p, o, m)\n# define BOOST_PP_FOR_193(s, p, o, m) BOOST_PP_FOR_193_I(s, p, o, m)\n# define BOOST_PP_FOR_194(s, p, o, m) BOOST_PP_FOR_194_I(s, p, o, m)\n# define BOOST_PP_FOR_195(s, p, o, m) BOOST_PP_FOR_195_I(s, p, o, m)\n# define BOOST_PP_FOR_196(s, p, o, m) BOOST_PP_FOR_196_I(s, p, o, m)\n# define BOOST_PP_FOR_197(s, p, o, m) BOOST_PP_FOR_197_I(s, p, o, m)\n# define BOOST_PP_FOR_198(s, p, o, m) BOOST_PP_FOR_198_I(s, p, o, m)\n# define BOOST_PP_FOR_199(s, p, o, m) BOOST_PP_FOR_199_I(s, p, o, m)\n# define BOOST_PP_FOR_200(s, p, o, m) BOOST_PP_FOR_200_I(s, p, o, m)\n# define BOOST_PP_FOR_201(s, p, o, m) BOOST_PP_FOR_201_I(s, p, o, m)\n# define BOOST_PP_FOR_202(s, p, o, m) BOOST_PP_FOR_202_I(s, p, o, m)\n# define BOOST_PP_FOR_203(s, p, o, m) BOOST_PP_FOR_203_I(s, p, o, m)\n# define BOOST_PP_FOR_204(s, p, o, m) BOOST_PP_FOR_204_I(s, p, o, m)\n# define BOOST_PP_FOR_205(s, p, o, m) BOOST_PP_FOR_205_I(s, p, o, m)\n# define BOOST_PP_FOR_206(s, p, o, m) BOOST_PP_FOR_206_I(s, p, o, m)\n# define BOOST_PP_FOR_207(s, p, o, m) BOOST_PP_FOR_207_I(s, p, o, m)\n# define BOOST_PP_FOR_208(s, p, o, m) BOOST_PP_FOR_208_I(s, p, o, m)\n# define BOOST_PP_FOR_209(s, p, o, m) BOOST_PP_FOR_209_I(s, p, o, m)\n# define BOOST_PP_FOR_210(s, p, o, m) BOOST_PP_FOR_210_I(s, p, o, m)\n# define BOOST_PP_FOR_211(s, p, o, m) BOOST_PP_FOR_211_I(s, p, o, m)\n# define BOOST_PP_FOR_212(s, p, o, m) BOOST_PP_FOR_212_I(s, p, o, m)\n# define BOOST_PP_FOR_213(s, p, o, m) BOOST_PP_FOR_213_I(s, p, o, m)\n# define BOOST_PP_FOR_214(s, p, o, m) BOOST_PP_FOR_214_I(s, p, o, m)\n# define BOOST_PP_FOR_215(s, p, o, m) BOOST_PP_FOR_215_I(s, p, o, m)\n# define BOOST_PP_FOR_216(s, p, o, m) BOOST_PP_FOR_216_I(s, p, o, m)\n# define BOOST_PP_FOR_217(s, p, o, m) BOOST_PP_FOR_217_I(s, p, o, m)\n# define BOOST_PP_FOR_218(s, p, o, m) BOOST_PP_FOR_218_I(s, p, o, m)\n# define BOOST_PP_FOR_219(s, p, o, m) BOOST_PP_FOR_219_I(s, p, o, m)\n# define BOOST_PP_FOR_220(s, p, o, m) BOOST_PP_FOR_220_I(s, p, o, m)\n# define BOOST_PP_FOR_221(s, p, o, m) BOOST_PP_FOR_221_I(s, p, o, m)\n# define BOOST_PP_FOR_222(s, p, o, m) BOOST_PP_FOR_222_I(s, p, o, m)\n# define BOOST_PP_FOR_223(s, p, o, m) BOOST_PP_FOR_223_I(s, p, o, m)\n# define BOOST_PP_FOR_224(s, p, o, m) BOOST_PP_FOR_224_I(s, p, o, m)\n# define BOOST_PP_FOR_225(s, p, o, m) BOOST_PP_FOR_225_I(s, p, o, m)\n# define BOOST_PP_FOR_226(s, p, o, m) BOOST_PP_FOR_226_I(s, p, o, m)\n# define BOOST_PP_FOR_227(s, p, o, m) BOOST_PP_FOR_227_I(s, p, o, m)\n# define BOOST_PP_FOR_228(s, p, o, m) BOOST_PP_FOR_228_I(s, p, o, m)\n# define BOOST_PP_FOR_229(s, p, o, m) BOOST_PP_FOR_229_I(s, p, o, m)\n# define BOOST_PP_FOR_230(s, p, o, m) BOOST_PP_FOR_230_I(s, p, o, m)\n# define BOOST_PP_FOR_231(s, p, o, m) BOOST_PP_FOR_231_I(s, p, o, m)\n# define BOOST_PP_FOR_232(s, p, o, m) BOOST_PP_FOR_232_I(s, p, o, m)\n# define BOOST_PP_FOR_233(s, p, o, m) BOOST_PP_FOR_233_I(s, p, o, m)\n# define BOOST_PP_FOR_234(s, p, o, m) BOOST_PP_FOR_234_I(s, p, o, m)\n# define BOOST_PP_FOR_235(s, p, o, m) BOOST_PP_FOR_235_I(s, p, o, m)\n# define BOOST_PP_FOR_236(s, p, o, m) BOOST_PP_FOR_236_I(s, p, o, m)\n# define BOOST_PP_FOR_237(s, p, o, m) BOOST_PP_FOR_237_I(s, p, o, m)\n# define BOOST_PP_FOR_238(s, p, o, m) BOOST_PP_FOR_238_I(s, p, o, m)\n# define BOOST_PP_FOR_239(s, p, o, m) BOOST_PP_FOR_239_I(s, p, o, m)\n# define BOOST_PP_FOR_240(s, p, o, m) BOOST_PP_FOR_240_I(s, p, o, m)\n# define BOOST_PP_FOR_241(s, p, o, m) BOOST_PP_FOR_241_I(s, p, o, m)\n# define BOOST_PP_FOR_242(s, p, o, m) BOOST_PP_FOR_242_I(s, p, o, m)\n# define BOOST_PP_FOR_243(s, p, o, m) BOOST_PP_FOR_243_I(s, p, o, m)\n# define BOOST_PP_FOR_244(s, p, o, m) BOOST_PP_FOR_244_I(s, p, o, m)\n# define BOOST_PP_FOR_245(s, p, o, m) BOOST_PP_FOR_245_I(s, p, o, m)\n# define BOOST_PP_FOR_246(s, p, o, m) BOOST_PP_FOR_246_I(s, p, o, m)\n# define BOOST_PP_FOR_247(s, p, o, m) BOOST_PP_FOR_247_I(s, p, o, m)\n# define BOOST_PP_FOR_248(s, p, o, m) BOOST_PP_FOR_248_I(s, p, o, m)\n# define BOOST_PP_FOR_249(s, p, o, m) BOOST_PP_FOR_249_I(s, p, o, m)\n# define BOOST_PP_FOR_250(s, p, o, m) BOOST_PP_FOR_250_I(s, p, o, m)\n# define BOOST_PP_FOR_251(s, p, o, m) BOOST_PP_FOR_251_I(s, p, o, m)\n# define BOOST_PP_FOR_252(s, p, o, m) BOOST_PP_FOR_252_I(s, p, o, m)\n# define BOOST_PP_FOR_253(s, p, o, m) BOOST_PP_FOR_253_I(s, p, o, m)\n# define BOOST_PP_FOR_254(s, p, o, m) BOOST_PP_FOR_254_I(s, p, o, m)\n# define BOOST_PP_FOR_255(s, p, o, m) BOOST_PP_FOR_255_I(s, p, o, m)\n# define BOOST_PP_FOR_256(s, p, o, m) BOOST_PP_FOR_256_I(s, p, o, m)\n#\n# define BOOST_PP_FOR_1_I(s, p, o, m) BOOST_PP_IF(p(2, s), m, BOOST_PP_TUPLE_EAT_2)(2, s) BOOST_PP_IF(p(2, s), BOOST_PP_FOR_2, BOOST_PP_TUPLE_EAT_4)(o(2, s), p, o, m)\n# define BOOST_PP_FOR_2_I(s, p, o, m) BOOST_PP_IF(p(3, s), m, BOOST_PP_TUPLE_EAT_2)(3, s) BOOST_PP_IF(p(3, s), BOOST_PP_FOR_3, BOOST_PP_TUPLE_EAT_4)(o(3, s), p, o, m)\n# define BOOST_PP_FOR_3_I(s, p, o, m) BOOST_PP_IF(p(4, s), m, BOOST_PP_TUPLE_EAT_2)(4, s) BOOST_PP_IF(p(4, s), BOOST_PP_FOR_4, BOOST_PP_TUPLE_EAT_4)(o(4, s), p, o, m)\n# define BOOST_PP_FOR_4_I(s, p, o, m) BOOST_PP_IF(p(5, s), m, BOOST_PP_TUPLE_EAT_2)(5, s) BOOST_PP_IF(p(5, s), BOOST_PP_FOR_5, BOOST_PP_TUPLE_EAT_4)(o(5, s), p, o, m)\n# define BOOST_PP_FOR_5_I(s, p, o, m) BOOST_PP_IF(p(6, s), m, BOOST_PP_TUPLE_EAT_2)(6, s) BOOST_PP_IF(p(6, s), BOOST_PP_FOR_6, BOOST_PP_TUPLE_EAT_4)(o(6, s), p, o, m)\n# define BOOST_PP_FOR_6_I(s, p, o, m) BOOST_PP_IF(p(7, s), m, BOOST_PP_TUPLE_EAT_2)(7, s) BOOST_PP_IF(p(7, s), BOOST_PP_FOR_7, BOOST_PP_TUPLE_EAT_4)(o(7, s), p, o, m)\n# define BOOST_PP_FOR_7_I(s, p, o, m) BOOST_PP_IF(p(8, s), m, BOOST_PP_TUPLE_EAT_2)(8, s) BOOST_PP_IF(p(8, s), BOOST_PP_FOR_8, BOOST_PP_TUPLE_EAT_4)(o(8, s), p, o, m)\n# define BOOST_PP_FOR_8_I(s, p, o, m) BOOST_PP_IF(p(9, s), m, BOOST_PP_TUPLE_EAT_2)(9, s) BOOST_PP_IF(p(9, s), BOOST_PP_FOR_9, BOOST_PP_TUPLE_EAT_4)(o(9, s), p, o, m)\n# define BOOST_PP_FOR_9_I(s, p, o, m) BOOST_PP_IF(p(10, s), m, BOOST_PP_TUPLE_EAT_2)(10, s) BOOST_PP_IF(p(10, s), BOOST_PP_FOR_10, BOOST_PP_TUPLE_EAT_4)(o(10, s), p, o, m)\n# define BOOST_PP_FOR_10_I(s, p, o, m) BOOST_PP_IF(p(11, s), m, BOOST_PP_TUPLE_EAT_2)(11, s) BOOST_PP_IF(p(11, s), BOOST_PP_FOR_11, BOOST_PP_TUPLE_EAT_4)(o(11, s), p, o, m)\n# define BOOST_PP_FOR_11_I(s, p, o, m) BOOST_PP_IF(p(12, s), m, BOOST_PP_TUPLE_EAT_2)(12, s) BOOST_PP_IF(p(12, s), BOOST_PP_FOR_12, BOOST_PP_TUPLE_EAT_4)(o(12, s), p, o, m)\n# define BOOST_PP_FOR_12_I(s, p, o, m) BOOST_PP_IF(p(13, s), m, BOOST_PP_TUPLE_EAT_2)(13, s) BOOST_PP_IF(p(13, s), BOOST_PP_FOR_13, BOOST_PP_TUPLE_EAT_4)(o(13, s), p, o, m)\n# define BOOST_PP_FOR_13_I(s, p, o, m) BOOST_PP_IF(p(14, s), m, BOOST_PP_TUPLE_EAT_2)(14, s) BOOST_PP_IF(p(14, s), BOOST_PP_FOR_14, BOOST_PP_TUPLE_EAT_4)(o(14, s), p, o, m)\n# define BOOST_PP_FOR_14_I(s, p, o, m) BOOST_PP_IF(p(15, s), m, BOOST_PP_TUPLE_EAT_2)(15, s) BOOST_PP_IF(p(15, s), BOOST_PP_FOR_15, BOOST_PP_TUPLE_EAT_4)(o(15, s), p, o, m)\n# define BOOST_PP_FOR_15_I(s, p, o, m) BOOST_PP_IF(p(16, s), m, BOOST_PP_TUPLE_EAT_2)(16, s) BOOST_PP_IF(p(16, s), BOOST_PP_FOR_16, BOOST_PP_TUPLE_EAT_4)(o(16, s), p, o, m)\n# define BOOST_PP_FOR_16_I(s, p, o, m) BOOST_PP_IF(p(17, s), m, BOOST_PP_TUPLE_EAT_2)(17, s) BOOST_PP_IF(p(17, s), BOOST_PP_FOR_17, BOOST_PP_TUPLE_EAT_4)(o(17, s), p, o, m)\n# define BOOST_PP_FOR_17_I(s, p, o, m) BOOST_PP_IF(p(18, s), m, BOOST_PP_TUPLE_EAT_2)(18, s) BOOST_PP_IF(p(18, s), BOOST_PP_FOR_18, BOOST_PP_TUPLE_EAT_4)(o(18, s), p, o, m)\n# define BOOST_PP_FOR_18_I(s, p, o, m) BOOST_PP_IF(p(19, s), m, BOOST_PP_TUPLE_EAT_2)(19, s) BOOST_PP_IF(p(19, s), BOOST_PP_FOR_19, BOOST_PP_TUPLE_EAT_4)(o(19, s), p, o, m)\n# define BOOST_PP_FOR_19_I(s, p, o, m) BOOST_PP_IF(p(20, s), m, BOOST_PP_TUPLE_EAT_2)(20, s) BOOST_PP_IF(p(20, s), BOOST_PP_FOR_20, BOOST_PP_TUPLE_EAT_4)(o(20, s), p, o, m)\n# define BOOST_PP_FOR_20_I(s, p, o, m) BOOST_PP_IF(p(21, s), m, BOOST_PP_TUPLE_EAT_2)(21, s) BOOST_PP_IF(p(21, s), BOOST_PP_FOR_21, BOOST_PP_TUPLE_EAT_4)(o(21, s), p, o, m)\n# define BOOST_PP_FOR_21_I(s, p, o, m) BOOST_PP_IF(p(22, s), m, BOOST_PP_TUPLE_EAT_2)(22, s) BOOST_PP_IF(p(22, s), BOOST_PP_FOR_22, BOOST_PP_TUPLE_EAT_4)(o(22, s), p, o, m)\n# define BOOST_PP_FOR_22_I(s, p, o, m) BOOST_PP_IF(p(23, s), m, BOOST_PP_TUPLE_EAT_2)(23, s) BOOST_PP_IF(p(23, s), BOOST_PP_FOR_23, BOOST_PP_TUPLE_EAT_4)(o(23, s), p, o, m)\n# define BOOST_PP_FOR_23_I(s, p, o, m) BOOST_PP_IF(p(24, s), m, BOOST_PP_TUPLE_EAT_2)(24, s) BOOST_PP_IF(p(24, s), BOOST_PP_FOR_24, BOOST_PP_TUPLE_EAT_4)(o(24, s), p, o, m)\n# define BOOST_PP_FOR_24_I(s, p, o, m) BOOST_PP_IF(p(25, s), m, BOOST_PP_TUPLE_EAT_2)(25, s) BOOST_PP_IF(p(25, s), BOOST_PP_FOR_25, BOOST_PP_TUPLE_EAT_4)(o(25, s), p, o, m)\n# define BOOST_PP_FOR_25_I(s, p, o, m) BOOST_PP_IF(p(26, s), m, BOOST_PP_TUPLE_EAT_2)(26, s) BOOST_PP_IF(p(26, s), BOOST_PP_FOR_26, BOOST_PP_TUPLE_EAT_4)(o(26, s), p, o, m)\n# define BOOST_PP_FOR_26_I(s, p, o, m) BOOST_PP_IF(p(27, s), m, BOOST_PP_TUPLE_EAT_2)(27, s) BOOST_PP_IF(p(27, s), BOOST_PP_FOR_27, BOOST_PP_TUPLE_EAT_4)(o(27, s), p, o, m)\n# define BOOST_PP_FOR_27_I(s, p, o, m) BOOST_PP_IF(p(28, s), m, BOOST_PP_TUPLE_EAT_2)(28, s) BOOST_PP_IF(p(28, s), BOOST_PP_FOR_28, BOOST_PP_TUPLE_EAT_4)(o(28, s), p, o, m)\n# define BOOST_PP_FOR_28_I(s, p, o, m) BOOST_PP_IF(p(29, s), m, BOOST_PP_TUPLE_EAT_2)(29, s) BOOST_PP_IF(p(29, s), BOOST_PP_FOR_29, BOOST_PP_TUPLE_EAT_4)(o(29, s), p, o, m)\n# define BOOST_PP_FOR_29_I(s, p, o, m) BOOST_PP_IF(p(30, s), m, BOOST_PP_TUPLE_EAT_2)(30, s) BOOST_PP_IF(p(30, s), BOOST_PP_FOR_30, BOOST_PP_TUPLE_EAT_4)(o(30, s), p, o, m)\n# define BOOST_PP_FOR_30_I(s, p, o, m) BOOST_PP_IF(p(31, s), m, BOOST_PP_TUPLE_EAT_2)(31, s) BOOST_PP_IF(p(31, s), BOOST_PP_FOR_31, BOOST_PP_TUPLE_EAT_4)(o(31, s), p, o, m)\n# define BOOST_PP_FOR_31_I(s, p, o, m) BOOST_PP_IF(p(32, s), m, BOOST_PP_TUPLE_EAT_2)(32, s) BOOST_PP_IF(p(32, s), BOOST_PP_FOR_32, BOOST_PP_TUPLE_EAT_4)(o(32, s), p, o, m)\n# define BOOST_PP_FOR_32_I(s, p, o, m) BOOST_PP_IF(p(33, s), m, BOOST_PP_TUPLE_EAT_2)(33, s) BOOST_PP_IF(p(33, s), BOOST_PP_FOR_33, BOOST_PP_TUPLE_EAT_4)(o(33, s), p, o, m)\n# define BOOST_PP_FOR_33_I(s, p, o, m) BOOST_PP_IF(p(34, s), m, BOOST_PP_TUPLE_EAT_2)(34, s) BOOST_PP_IF(p(34, s), BOOST_PP_FOR_34, BOOST_PP_TUPLE_EAT_4)(o(34, s), p, o, m)\n# define BOOST_PP_FOR_34_I(s, p, o, m) BOOST_PP_IF(p(35, s), m, BOOST_PP_TUPLE_EAT_2)(35, s) BOOST_PP_IF(p(35, s), BOOST_PP_FOR_35, BOOST_PP_TUPLE_EAT_4)(o(35, s), p, o, m)\n# define BOOST_PP_FOR_35_I(s, p, o, m) BOOST_PP_IF(p(36, s), m, BOOST_PP_TUPLE_EAT_2)(36, s) BOOST_PP_IF(p(36, s), BOOST_PP_FOR_36, BOOST_PP_TUPLE_EAT_4)(o(36, s), p, o, m)\n# define BOOST_PP_FOR_36_I(s, p, o, m) BOOST_PP_IF(p(37, s), m, BOOST_PP_TUPLE_EAT_2)(37, s) BOOST_PP_IF(p(37, s), BOOST_PP_FOR_37, BOOST_PP_TUPLE_EAT_4)(o(37, s), p, o, m)\n# define BOOST_PP_FOR_37_I(s, p, o, m) BOOST_PP_IF(p(38, s), m, BOOST_PP_TUPLE_EAT_2)(38, s) BOOST_PP_IF(p(38, s), BOOST_PP_FOR_38, BOOST_PP_TUPLE_EAT_4)(o(38, s), p, o, m)\n# define BOOST_PP_FOR_38_I(s, p, o, m) BOOST_PP_IF(p(39, s), m, BOOST_PP_TUPLE_EAT_2)(39, s) BOOST_PP_IF(p(39, s), BOOST_PP_FOR_39, BOOST_PP_TUPLE_EAT_4)(o(39, s), p, o, m)\n# define BOOST_PP_FOR_39_I(s, p, o, m) BOOST_PP_IF(p(40, s), m, BOOST_PP_TUPLE_EAT_2)(40, s) BOOST_PP_IF(p(40, s), BOOST_PP_FOR_40, BOOST_PP_TUPLE_EAT_4)(o(40, s), p, o, m)\n# define BOOST_PP_FOR_40_I(s, p, o, m) BOOST_PP_IF(p(41, s), m, BOOST_PP_TUPLE_EAT_2)(41, s) BOOST_PP_IF(p(41, s), BOOST_PP_FOR_41, BOOST_PP_TUPLE_EAT_4)(o(41, s), p, o, m)\n# define BOOST_PP_FOR_41_I(s, p, o, m) BOOST_PP_IF(p(42, s), m, BOOST_PP_TUPLE_EAT_2)(42, s) BOOST_PP_IF(p(42, s), BOOST_PP_FOR_42, BOOST_PP_TUPLE_EAT_4)(o(42, s), p, o, m)\n# define BOOST_PP_FOR_42_I(s, p, o, m) BOOST_PP_IF(p(43, s), m, BOOST_PP_TUPLE_EAT_2)(43, s) BOOST_PP_IF(p(43, s), BOOST_PP_FOR_43, BOOST_PP_TUPLE_EAT_4)(o(43, s), p, o, m)\n# define BOOST_PP_FOR_43_I(s, p, o, m) BOOST_PP_IF(p(44, s), m, BOOST_PP_TUPLE_EAT_2)(44, s) BOOST_PP_IF(p(44, s), BOOST_PP_FOR_44, BOOST_PP_TUPLE_EAT_4)(o(44, s), p, o, m)\n# define BOOST_PP_FOR_44_I(s, p, o, m) BOOST_PP_IF(p(45, s), m, BOOST_PP_TUPLE_EAT_2)(45, s) BOOST_PP_IF(p(45, s), BOOST_PP_FOR_45, BOOST_PP_TUPLE_EAT_4)(o(45, s), p, o, m)\n# define BOOST_PP_FOR_45_I(s, p, o, m) BOOST_PP_IF(p(46, s), m, BOOST_PP_TUPLE_EAT_2)(46, s) BOOST_PP_IF(p(46, s), BOOST_PP_FOR_46, BOOST_PP_TUPLE_EAT_4)(o(46, s), p, o, m)\n# define BOOST_PP_FOR_46_I(s, p, o, m) BOOST_PP_IF(p(47, s), m, BOOST_PP_TUPLE_EAT_2)(47, s) BOOST_PP_IF(p(47, s), BOOST_PP_FOR_47, BOOST_PP_TUPLE_EAT_4)(o(47, s), p, o, m)\n# define BOOST_PP_FOR_47_I(s, p, o, m) BOOST_PP_IF(p(48, s), m, BOOST_PP_TUPLE_EAT_2)(48, s) BOOST_PP_IF(p(48, s), BOOST_PP_FOR_48, BOOST_PP_TUPLE_EAT_4)(o(48, s), p, o, m)\n# define BOOST_PP_FOR_48_I(s, p, o, m) BOOST_PP_IF(p(49, s), m, BOOST_PP_TUPLE_EAT_2)(49, s) BOOST_PP_IF(p(49, s), BOOST_PP_FOR_49, BOOST_PP_TUPLE_EAT_4)(o(49, s), p, o, m)\n# define BOOST_PP_FOR_49_I(s, p, o, m) BOOST_PP_IF(p(50, s), m, BOOST_PP_TUPLE_EAT_2)(50, s) BOOST_PP_IF(p(50, s), BOOST_PP_FOR_50, BOOST_PP_TUPLE_EAT_4)(o(50, s), p, o, m)\n# define BOOST_PP_FOR_50_I(s, p, o, m) BOOST_PP_IF(p(51, s), m, BOOST_PP_TUPLE_EAT_2)(51, s) BOOST_PP_IF(p(51, s), BOOST_PP_FOR_51, BOOST_PP_TUPLE_EAT_4)(o(51, s), p, o, m)\n# define BOOST_PP_FOR_51_I(s, p, o, m) BOOST_PP_IF(p(52, s), m, BOOST_PP_TUPLE_EAT_2)(52, s) BOOST_PP_IF(p(52, s), BOOST_PP_FOR_52, BOOST_PP_TUPLE_EAT_4)(o(52, s), p, o, m)\n# define BOOST_PP_FOR_52_I(s, p, o, m) BOOST_PP_IF(p(53, s), m, BOOST_PP_TUPLE_EAT_2)(53, s) BOOST_PP_IF(p(53, s), BOOST_PP_FOR_53, BOOST_PP_TUPLE_EAT_4)(o(53, s), p, o, m)\n# define BOOST_PP_FOR_53_I(s, p, o, m) BOOST_PP_IF(p(54, s), m, BOOST_PP_TUPLE_EAT_2)(54, s) BOOST_PP_IF(p(54, s), BOOST_PP_FOR_54, BOOST_PP_TUPLE_EAT_4)(o(54, s), p, o, m)\n# define BOOST_PP_FOR_54_I(s, p, o, m) BOOST_PP_IF(p(55, s), m, BOOST_PP_TUPLE_EAT_2)(55, s) BOOST_PP_IF(p(55, s), BOOST_PP_FOR_55, BOOST_PP_TUPLE_EAT_4)(o(55, s), p, o, m)\n# define BOOST_PP_FOR_55_I(s, p, o, m) BOOST_PP_IF(p(56, s), m, BOOST_PP_TUPLE_EAT_2)(56, s) BOOST_PP_IF(p(56, s), BOOST_PP_FOR_56, BOOST_PP_TUPLE_EAT_4)(o(56, s), p, o, m)\n# define BOOST_PP_FOR_56_I(s, p, o, m) BOOST_PP_IF(p(57, s), m, BOOST_PP_TUPLE_EAT_2)(57, s) BOOST_PP_IF(p(57, s), BOOST_PP_FOR_57, BOOST_PP_TUPLE_EAT_4)(o(57, s), p, o, m)\n# define BOOST_PP_FOR_57_I(s, p, o, m) BOOST_PP_IF(p(58, s), m, BOOST_PP_TUPLE_EAT_2)(58, s) BOOST_PP_IF(p(58, s), BOOST_PP_FOR_58, BOOST_PP_TUPLE_EAT_4)(o(58, s), p, o, m)\n# define BOOST_PP_FOR_58_I(s, p, o, m) BOOST_PP_IF(p(59, s), m, BOOST_PP_TUPLE_EAT_2)(59, s) BOOST_PP_IF(p(59, s), BOOST_PP_FOR_59, BOOST_PP_TUPLE_EAT_4)(o(59, s), p, o, m)\n# define BOOST_PP_FOR_59_I(s, p, o, m) BOOST_PP_IF(p(60, s), m, BOOST_PP_TUPLE_EAT_2)(60, s) BOOST_PP_IF(p(60, s), BOOST_PP_FOR_60, BOOST_PP_TUPLE_EAT_4)(o(60, s), p, o, m)\n# define BOOST_PP_FOR_60_I(s, p, o, m) BOOST_PP_IF(p(61, s), m, BOOST_PP_TUPLE_EAT_2)(61, s) BOOST_PP_IF(p(61, s), BOOST_PP_FOR_61, BOOST_PP_TUPLE_EAT_4)(o(61, s), p, o, m)\n# define BOOST_PP_FOR_61_I(s, p, o, m) BOOST_PP_IF(p(62, s), m, BOOST_PP_TUPLE_EAT_2)(62, s) BOOST_PP_IF(p(62, s), BOOST_PP_FOR_62, BOOST_PP_TUPLE_EAT_4)(o(62, s), p, o, m)\n# define BOOST_PP_FOR_62_I(s, p, o, m) BOOST_PP_IF(p(63, s), m, BOOST_PP_TUPLE_EAT_2)(63, s) BOOST_PP_IF(p(63, s), BOOST_PP_FOR_63, BOOST_PP_TUPLE_EAT_4)(o(63, s), p, o, m)\n# define BOOST_PP_FOR_63_I(s, p, o, m) BOOST_PP_IF(p(64, s), m, BOOST_PP_TUPLE_EAT_2)(64, s) BOOST_PP_IF(p(64, s), BOOST_PP_FOR_64, BOOST_PP_TUPLE_EAT_4)(o(64, s), p, o, m)\n# define BOOST_PP_FOR_64_I(s, p, o, m) BOOST_PP_IF(p(65, s), m, BOOST_PP_TUPLE_EAT_2)(65, s) BOOST_PP_IF(p(65, s), BOOST_PP_FOR_65, BOOST_PP_TUPLE_EAT_4)(o(65, s), p, o, m)\n# define BOOST_PP_FOR_65_I(s, p, o, m) BOOST_PP_IF(p(66, s), m, BOOST_PP_TUPLE_EAT_2)(66, s) BOOST_PP_IF(p(66, s), BOOST_PP_FOR_66, BOOST_PP_TUPLE_EAT_4)(o(66, s), p, o, m)\n# define BOOST_PP_FOR_66_I(s, p, o, m) BOOST_PP_IF(p(67, s), m, BOOST_PP_TUPLE_EAT_2)(67, s) BOOST_PP_IF(p(67, s), BOOST_PP_FOR_67, BOOST_PP_TUPLE_EAT_4)(o(67, s), p, o, m)\n# define BOOST_PP_FOR_67_I(s, p, o, m) BOOST_PP_IF(p(68, s), m, BOOST_PP_TUPLE_EAT_2)(68, s) BOOST_PP_IF(p(68, s), BOOST_PP_FOR_68, BOOST_PP_TUPLE_EAT_4)(o(68, s), p, o, m)\n# define BOOST_PP_FOR_68_I(s, p, o, m) BOOST_PP_IF(p(69, s), m, BOOST_PP_TUPLE_EAT_2)(69, s) BOOST_PP_IF(p(69, s), BOOST_PP_FOR_69, BOOST_PP_TUPLE_EAT_4)(o(69, s), p, o, m)\n# define BOOST_PP_FOR_69_I(s, p, o, m) BOOST_PP_IF(p(70, s), m, BOOST_PP_TUPLE_EAT_2)(70, s) BOOST_PP_IF(p(70, s), BOOST_PP_FOR_70, BOOST_PP_TUPLE_EAT_4)(o(70, s), p, o, m)\n# define BOOST_PP_FOR_70_I(s, p, o, m) BOOST_PP_IF(p(71, s), m, BOOST_PP_TUPLE_EAT_2)(71, s) BOOST_PP_IF(p(71, s), BOOST_PP_FOR_71, BOOST_PP_TUPLE_EAT_4)(o(71, s), p, o, m)\n# define BOOST_PP_FOR_71_I(s, p, o, m) BOOST_PP_IF(p(72, s), m, BOOST_PP_TUPLE_EAT_2)(72, s) BOOST_PP_IF(p(72, s), BOOST_PP_FOR_72, BOOST_PP_TUPLE_EAT_4)(o(72, s), p, o, m)\n# define BOOST_PP_FOR_72_I(s, p, o, m) BOOST_PP_IF(p(73, s), m, BOOST_PP_TUPLE_EAT_2)(73, s) BOOST_PP_IF(p(73, s), BOOST_PP_FOR_73, BOOST_PP_TUPLE_EAT_4)(o(73, s), p, o, m)\n# define BOOST_PP_FOR_73_I(s, p, o, m) BOOST_PP_IF(p(74, s), m, BOOST_PP_TUPLE_EAT_2)(74, s) BOOST_PP_IF(p(74, s), BOOST_PP_FOR_74, BOOST_PP_TUPLE_EAT_4)(o(74, s), p, o, m)\n# define BOOST_PP_FOR_74_I(s, p, o, m) BOOST_PP_IF(p(75, s), m, BOOST_PP_TUPLE_EAT_2)(75, s) BOOST_PP_IF(p(75, s), BOOST_PP_FOR_75, BOOST_PP_TUPLE_EAT_4)(o(75, s), p, o, m)\n# define BOOST_PP_FOR_75_I(s, p, o, m) BOOST_PP_IF(p(76, s), m, BOOST_PP_TUPLE_EAT_2)(76, s) BOOST_PP_IF(p(76, s), BOOST_PP_FOR_76, BOOST_PP_TUPLE_EAT_4)(o(76, s), p, o, m)\n# define BOOST_PP_FOR_76_I(s, p, o, m) BOOST_PP_IF(p(77, s), m, BOOST_PP_TUPLE_EAT_2)(77, s) BOOST_PP_IF(p(77, s), BOOST_PP_FOR_77, BOOST_PP_TUPLE_EAT_4)(o(77, s), p, o, m)\n# define BOOST_PP_FOR_77_I(s, p, o, m) BOOST_PP_IF(p(78, s), m, BOOST_PP_TUPLE_EAT_2)(78, s) BOOST_PP_IF(p(78, s), BOOST_PP_FOR_78, BOOST_PP_TUPLE_EAT_4)(o(78, s), p, o, m)\n# define BOOST_PP_FOR_78_I(s, p, o, m) BOOST_PP_IF(p(79, s), m, BOOST_PP_TUPLE_EAT_2)(79, s) BOOST_PP_IF(p(79, s), BOOST_PP_FOR_79, BOOST_PP_TUPLE_EAT_4)(o(79, s), p, o, m)\n# define BOOST_PP_FOR_79_I(s, p, o, m) BOOST_PP_IF(p(80, s), m, BOOST_PP_TUPLE_EAT_2)(80, s) BOOST_PP_IF(p(80, s), BOOST_PP_FOR_80, BOOST_PP_TUPLE_EAT_4)(o(80, s), p, o, m)\n# define BOOST_PP_FOR_80_I(s, p, o, m) BOOST_PP_IF(p(81, s), m, BOOST_PP_TUPLE_EAT_2)(81, s) BOOST_PP_IF(p(81, s), BOOST_PP_FOR_81, BOOST_PP_TUPLE_EAT_4)(o(81, s), p, o, m)\n# define BOOST_PP_FOR_81_I(s, p, o, m) BOOST_PP_IF(p(82, s), m, BOOST_PP_TUPLE_EAT_2)(82, s) BOOST_PP_IF(p(82, s), BOOST_PP_FOR_82, BOOST_PP_TUPLE_EAT_4)(o(82, s), p, o, m)\n# define BOOST_PP_FOR_82_I(s, p, o, m) BOOST_PP_IF(p(83, s), m, BOOST_PP_TUPLE_EAT_2)(83, s) BOOST_PP_IF(p(83, s), BOOST_PP_FOR_83, BOOST_PP_TUPLE_EAT_4)(o(83, s), p, o, m)\n# define BOOST_PP_FOR_83_I(s, p, o, m) BOOST_PP_IF(p(84, s), m, BOOST_PP_TUPLE_EAT_2)(84, s) BOOST_PP_IF(p(84, s), BOOST_PP_FOR_84, BOOST_PP_TUPLE_EAT_4)(o(84, s), p, o, m)\n# define BOOST_PP_FOR_84_I(s, p, o, m) BOOST_PP_IF(p(85, s), m, BOOST_PP_TUPLE_EAT_2)(85, s) BOOST_PP_IF(p(85, s), BOOST_PP_FOR_85, BOOST_PP_TUPLE_EAT_4)(o(85, s), p, o, m)\n# define BOOST_PP_FOR_85_I(s, p, o, m) BOOST_PP_IF(p(86, s), m, BOOST_PP_TUPLE_EAT_2)(86, s) BOOST_PP_IF(p(86, s), BOOST_PP_FOR_86, BOOST_PP_TUPLE_EAT_4)(o(86, s), p, o, m)\n# define BOOST_PP_FOR_86_I(s, p, o, m) BOOST_PP_IF(p(87, s), m, BOOST_PP_TUPLE_EAT_2)(87, s) BOOST_PP_IF(p(87, s), BOOST_PP_FOR_87, BOOST_PP_TUPLE_EAT_4)(o(87, s), p, o, m)\n# define BOOST_PP_FOR_87_I(s, p, o, m) BOOST_PP_IF(p(88, s), m, BOOST_PP_TUPLE_EAT_2)(88, s) BOOST_PP_IF(p(88, s), BOOST_PP_FOR_88, BOOST_PP_TUPLE_EAT_4)(o(88, s), p, o, m)\n# define BOOST_PP_FOR_88_I(s, p, o, m) BOOST_PP_IF(p(89, s), m, BOOST_PP_TUPLE_EAT_2)(89, s) BOOST_PP_IF(p(89, s), BOOST_PP_FOR_89, BOOST_PP_TUPLE_EAT_4)(o(89, s), p, o, m)\n# define BOOST_PP_FOR_89_I(s, p, o, m) BOOST_PP_IF(p(90, s), m, BOOST_PP_TUPLE_EAT_2)(90, s) BOOST_PP_IF(p(90, s), BOOST_PP_FOR_90, BOOST_PP_TUPLE_EAT_4)(o(90, s), p, o, m)\n# define BOOST_PP_FOR_90_I(s, p, o, m) BOOST_PP_IF(p(91, s), m, BOOST_PP_TUPLE_EAT_2)(91, s) BOOST_PP_IF(p(91, s), BOOST_PP_FOR_91, BOOST_PP_TUPLE_EAT_4)(o(91, s), p, o, m)\n# define BOOST_PP_FOR_91_I(s, p, o, m) BOOST_PP_IF(p(92, s), m, BOOST_PP_TUPLE_EAT_2)(92, s) BOOST_PP_IF(p(92, s), BOOST_PP_FOR_92, BOOST_PP_TUPLE_EAT_4)(o(92, s), p, o, m)\n# define BOOST_PP_FOR_92_I(s, p, o, m) BOOST_PP_IF(p(93, s), m, BOOST_PP_TUPLE_EAT_2)(93, s) BOOST_PP_IF(p(93, s), BOOST_PP_FOR_93, BOOST_PP_TUPLE_EAT_4)(o(93, s), p, o, m)\n# define BOOST_PP_FOR_93_I(s, p, o, m) BOOST_PP_IF(p(94, s), m, BOOST_PP_TUPLE_EAT_2)(94, s) BOOST_PP_IF(p(94, s), BOOST_PP_FOR_94, BOOST_PP_TUPLE_EAT_4)(o(94, s), p, o, m)\n# define BOOST_PP_FOR_94_I(s, p, o, m) BOOST_PP_IF(p(95, s), m, BOOST_PP_TUPLE_EAT_2)(95, s) BOOST_PP_IF(p(95, s), BOOST_PP_FOR_95, BOOST_PP_TUPLE_EAT_4)(o(95, s), p, o, m)\n# define BOOST_PP_FOR_95_I(s, p, o, m) BOOST_PP_IF(p(96, s), m, BOOST_PP_TUPLE_EAT_2)(96, s) BOOST_PP_IF(p(96, s), BOOST_PP_FOR_96, BOOST_PP_TUPLE_EAT_4)(o(96, s), p, o, m)\n# define BOOST_PP_FOR_96_I(s, p, o, m) BOOST_PP_IF(p(97, s), m, BOOST_PP_TUPLE_EAT_2)(97, s) BOOST_PP_IF(p(97, s), BOOST_PP_FOR_97, BOOST_PP_TUPLE_EAT_4)(o(97, s), p, o, m)\n# define BOOST_PP_FOR_97_I(s, p, o, m) BOOST_PP_IF(p(98, s), m, BOOST_PP_TUPLE_EAT_2)(98, s) BOOST_PP_IF(p(98, s), BOOST_PP_FOR_98, BOOST_PP_TUPLE_EAT_4)(o(98, s), p, o, m)\n# define BOOST_PP_FOR_98_I(s, p, o, m) BOOST_PP_IF(p(99, s), m, BOOST_PP_TUPLE_EAT_2)(99, s) BOOST_PP_IF(p(99, s), BOOST_PP_FOR_99, BOOST_PP_TUPLE_EAT_4)(o(99, s), p, o, m)\n# define BOOST_PP_FOR_99_I(s, p, o, m) BOOST_PP_IF(p(100, s), m, BOOST_PP_TUPLE_EAT_2)(100, s) BOOST_PP_IF(p(100, s), BOOST_PP_FOR_100, BOOST_PP_TUPLE_EAT_4)(o(100, s), p, o, m)\n# define BOOST_PP_FOR_100_I(s, p, o, m) BOOST_PP_IF(p(101, s), m, BOOST_PP_TUPLE_EAT_2)(101, s) BOOST_PP_IF(p(101, s), BOOST_PP_FOR_101, BOOST_PP_TUPLE_EAT_4)(o(101, s), p, o, m)\n# define BOOST_PP_FOR_101_I(s, p, o, m) BOOST_PP_IF(p(102, s), m, BOOST_PP_TUPLE_EAT_2)(102, s) BOOST_PP_IF(p(102, s), BOOST_PP_FOR_102, BOOST_PP_TUPLE_EAT_4)(o(102, s), p, o, m)\n# define BOOST_PP_FOR_102_I(s, p, o, m) BOOST_PP_IF(p(103, s), m, BOOST_PP_TUPLE_EAT_2)(103, s) BOOST_PP_IF(p(103, s), BOOST_PP_FOR_103, BOOST_PP_TUPLE_EAT_4)(o(103, s), p, o, m)\n# define BOOST_PP_FOR_103_I(s, p, o, m) BOOST_PP_IF(p(104, s), m, BOOST_PP_TUPLE_EAT_2)(104, s) BOOST_PP_IF(p(104, s), BOOST_PP_FOR_104, BOOST_PP_TUPLE_EAT_4)(o(104, s), p, o, m)\n# define BOOST_PP_FOR_104_I(s, p, o, m) BOOST_PP_IF(p(105, s), m, BOOST_PP_TUPLE_EAT_2)(105, s) BOOST_PP_IF(p(105, s), BOOST_PP_FOR_105, BOOST_PP_TUPLE_EAT_4)(o(105, s), p, o, m)\n# define BOOST_PP_FOR_105_I(s, p, o, m) BOOST_PP_IF(p(106, s), m, BOOST_PP_TUPLE_EAT_2)(106, s) BOOST_PP_IF(p(106, s), BOOST_PP_FOR_106, BOOST_PP_TUPLE_EAT_4)(o(106, s), p, o, m)\n# define BOOST_PP_FOR_106_I(s, p, o, m) BOOST_PP_IF(p(107, s), m, BOOST_PP_TUPLE_EAT_2)(107, s) BOOST_PP_IF(p(107, s), BOOST_PP_FOR_107, BOOST_PP_TUPLE_EAT_4)(o(107, s), p, o, m)\n# define BOOST_PP_FOR_107_I(s, p, o, m) BOOST_PP_IF(p(108, s), m, BOOST_PP_TUPLE_EAT_2)(108, s) BOOST_PP_IF(p(108, s), BOOST_PP_FOR_108, BOOST_PP_TUPLE_EAT_4)(o(108, s), p, o, m)\n# define BOOST_PP_FOR_108_I(s, p, o, m) BOOST_PP_IF(p(109, s), m, BOOST_PP_TUPLE_EAT_2)(109, s) BOOST_PP_IF(p(109, s), BOOST_PP_FOR_109, BOOST_PP_TUPLE_EAT_4)(o(109, s), p, o, m)\n# define BOOST_PP_FOR_109_I(s, p, o, m) BOOST_PP_IF(p(110, s), m, BOOST_PP_TUPLE_EAT_2)(110, s) BOOST_PP_IF(p(110, s), BOOST_PP_FOR_110, BOOST_PP_TUPLE_EAT_4)(o(110, s), p, o, m)\n# define BOOST_PP_FOR_110_I(s, p, o, m) BOOST_PP_IF(p(111, s), m, BOOST_PP_TUPLE_EAT_2)(111, s) BOOST_PP_IF(p(111, s), BOOST_PP_FOR_111, BOOST_PP_TUPLE_EAT_4)(o(111, s), p, o, m)\n# define BOOST_PP_FOR_111_I(s, p, o, m) BOOST_PP_IF(p(112, s), m, BOOST_PP_TUPLE_EAT_2)(112, s) BOOST_PP_IF(p(112, s), BOOST_PP_FOR_112, BOOST_PP_TUPLE_EAT_4)(o(112, s), p, o, m)\n# define BOOST_PP_FOR_112_I(s, p, o, m) BOOST_PP_IF(p(113, s), m, BOOST_PP_TUPLE_EAT_2)(113, s) BOOST_PP_IF(p(113, s), BOOST_PP_FOR_113, BOOST_PP_TUPLE_EAT_4)(o(113, s), p, o, m)\n# define BOOST_PP_FOR_113_I(s, p, o, m) BOOST_PP_IF(p(114, s), m, BOOST_PP_TUPLE_EAT_2)(114, s) BOOST_PP_IF(p(114, s), BOOST_PP_FOR_114, BOOST_PP_TUPLE_EAT_4)(o(114, s), p, o, m)\n# define BOOST_PP_FOR_114_I(s, p, o, m) BOOST_PP_IF(p(115, s), m, BOOST_PP_TUPLE_EAT_2)(115, s) BOOST_PP_IF(p(115, s), BOOST_PP_FOR_115, BOOST_PP_TUPLE_EAT_4)(o(115, s), p, o, m)\n# define BOOST_PP_FOR_115_I(s, p, o, m) BOOST_PP_IF(p(116, s), m, BOOST_PP_TUPLE_EAT_2)(116, s) BOOST_PP_IF(p(116, s), BOOST_PP_FOR_116, BOOST_PP_TUPLE_EAT_4)(o(116, s), p, o, m)\n# define BOOST_PP_FOR_116_I(s, p, o, m) BOOST_PP_IF(p(117, s), m, BOOST_PP_TUPLE_EAT_2)(117, s) BOOST_PP_IF(p(117, s), BOOST_PP_FOR_117, BOOST_PP_TUPLE_EAT_4)(o(117, s), p, o, m)\n# define BOOST_PP_FOR_117_I(s, p, o, m) BOOST_PP_IF(p(118, s), m, BOOST_PP_TUPLE_EAT_2)(118, s) BOOST_PP_IF(p(118, s), BOOST_PP_FOR_118, BOOST_PP_TUPLE_EAT_4)(o(118, s), p, o, m)\n# define BOOST_PP_FOR_118_I(s, p, o, m) BOOST_PP_IF(p(119, s), m, BOOST_PP_TUPLE_EAT_2)(119, s) BOOST_PP_IF(p(119, s), BOOST_PP_FOR_119, BOOST_PP_TUPLE_EAT_4)(o(119, s), p, o, m)\n# define BOOST_PP_FOR_119_I(s, p, o, m) BOOST_PP_IF(p(120, s), m, BOOST_PP_TUPLE_EAT_2)(120, s) BOOST_PP_IF(p(120, s), BOOST_PP_FOR_120, BOOST_PP_TUPLE_EAT_4)(o(120, s), p, o, m)\n# define BOOST_PP_FOR_120_I(s, p, o, m) BOOST_PP_IF(p(121, s), m, BOOST_PP_TUPLE_EAT_2)(121, s) BOOST_PP_IF(p(121, s), BOOST_PP_FOR_121, BOOST_PP_TUPLE_EAT_4)(o(121, s), p, o, m)\n# define BOOST_PP_FOR_121_I(s, p, o, m) BOOST_PP_IF(p(122, s), m, BOOST_PP_TUPLE_EAT_2)(122, s) BOOST_PP_IF(p(122, s), BOOST_PP_FOR_122, BOOST_PP_TUPLE_EAT_4)(o(122, s), p, o, m)\n# define BOOST_PP_FOR_122_I(s, p, o, m) BOOST_PP_IF(p(123, s), m, BOOST_PP_TUPLE_EAT_2)(123, s) BOOST_PP_IF(p(123, s), BOOST_PP_FOR_123, BOOST_PP_TUPLE_EAT_4)(o(123, s), p, o, m)\n# define BOOST_PP_FOR_123_I(s, p, o, m) BOOST_PP_IF(p(124, s), m, BOOST_PP_TUPLE_EAT_2)(124, s) BOOST_PP_IF(p(124, s), BOOST_PP_FOR_124, BOOST_PP_TUPLE_EAT_4)(o(124, s), p, o, m)\n# define BOOST_PP_FOR_124_I(s, p, o, m) BOOST_PP_IF(p(125, s), m, BOOST_PP_TUPLE_EAT_2)(125, s) BOOST_PP_IF(p(125, s), BOOST_PP_FOR_125, BOOST_PP_TUPLE_EAT_4)(o(125, s), p, o, m)\n# define BOOST_PP_FOR_125_I(s, p, o, m) BOOST_PP_IF(p(126, s), m, BOOST_PP_TUPLE_EAT_2)(126, s) BOOST_PP_IF(p(126, s), BOOST_PP_FOR_126, BOOST_PP_TUPLE_EAT_4)(o(126, s), p, o, m)\n# define BOOST_PP_FOR_126_I(s, p, o, m) BOOST_PP_IF(p(127, s), m, BOOST_PP_TUPLE_EAT_2)(127, s) BOOST_PP_IF(p(127, s), BOOST_PP_FOR_127, BOOST_PP_TUPLE_EAT_4)(o(127, s), p, o, m)\n# define BOOST_PP_FOR_127_I(s, p, o, m) BOOST_PP_IF(p(128, s), m, BOOST_PP_TUPLE_EAT_2)(128, s) BOOST_PP_IF(p(128, s), BOOST_PP_FOR_128, BOOST_PP_TUPLE_EAT_4)(o(128, s), p, o, m)\n# define BOOST_PP_FOR_128_I(s, p, o, m) BOOST_PP_IF(p(129, s), m, BOOST_PP_TUPLE_EAT_2)(129, s) BOOST_PP_IF(p(129, s), BOOST_PP_FOR_129, BOOST_PP_TUPLE_EAT_4)(o(129, s), p, o, m)\n# define BOOST_PP_FOR_129_I(s, p, o, m) BOOST_PP_IF(p(130, s), m, BOOST_PP_TUPLE_EAT_2)(130, s) BOOST_PP_IF(p(130, s), BOOST_PP_FOR_130, BOOST_PP_TUPLE_EAT_4)(o(130, s), p, o, m)\n# define BOOST_PP_FOR_130_I(s, p, o, m) BOOST_PP_IF(p(131, s), m, BOOST_PP_TUPLE_EAT_2)(131, s) BOOST_PP_IF(p(131, s), BOOST_PP_FOR_131, BOOST_PP_TUPLE_EAT_4)(o(131, s), p, o, m)\n# define BOOST_PP_FOR_131_I(s, p, o, m) BOOST_PP_IF(p(132, s), m, BOOST_PP_TUPLE_EAT_2)(132, s) BOOST_PP_IF(p(132, s), BOOST_PP_FOR_132, BOOST_PP_TUPLE_EAT_4)(o(132, s), p, o, m)\n# define BOOST_PP_FOR_132_I(s, p, o, m) BOOST_PP_IF(p(133, s), m, BOOST_PP_TUPLE_EAT_2)(133, s) BOOST_PP_IF(p(133, s), BOOST_PP_FOR_133, BOOST_PP_TUPLE_EAT_4)(o(133, s), p, o, m)\n# define BOOST_PP_FOR_133_I(s, p, o, m) BOOST_PP_IF(p(134, s), m, BOOST_PP_TUPLE_EAT_2)(134, s) BOOST_PP_IF(p(134, s), BOOST_PP_FOR_134, BOOST_PP_TUPLE_EAT_4)(o(134, s), p, o, m)\n# define BOOST_PP_FOR_134_I(s, p, o, m) BOOST_PP_IF(p(135, s), m, BOOST_PP_TUPLE_EAT_2)(135, s) BOOST_PP_IF(p(135, s), BOOST_PP_FOR_135, BOOST_PP_TUPLE_EAT_4)(o(135, s), p, o, m)\n# define BOOST_PP_FOR_135_I(s, p, o, m) BOOST_PP_IF(p(136, s), m, BOOST_PP_TUPLE_EAT_2)(136, s) BOOST_PP_IF(p(136, s), BOOST_PP_FOR_136, BOOST_PP_TUPLE_EAT_4)(o(136, s), p, o, m)\n# define BOOST_PP_FOR_136_I(s, p, o, m) BOOST_PP_IF(p(137, s), m, BOOST_PP_TUPLE_EAT_2)(137, s) BOOST_PP_IF(p(137, s), BOOST_PP_FOR_137, BOOST_PP_TUPLE_EAT_4)(o(137, s), p, o, m)\n# define BOOST_PP_FOR_137_I(s, p, o, m) BOOST_PP_IF(p(138, s), m, BOOST_PP_TUPLE_EAT_2)(138, s) BOOST_PP_IF(p(138, s), BOOST_PP_FOR_138, BOOST_PP_TUPLE_EAT_4)(o(138, s), p, o, m)\n# define BOOST_PP_FOR_138_I(s, p, o, m) BOOST_PP_IF(p(139, s), m, BOOST_PP_TUPLE_EAT_2)(139, s) BOOST_PP_IF(p(139, s), BOOST_PP_FOR_139, BOOST_PP_TUPLE_EAT_4)(o(139, s), p, o, m)\n# define BOOST_PP_FOR_139_I(s, p, o, m) BOOST_PP_IF(p(140, s), m, BOOST_PP_TUPLE_EAT_2)(140, s) BOOST_PP_IF(p(140, s), BOOST_PP_FOR_140, BOOST_PP_TUPLE_EAT_4)(o(140, s), p, o, m)\n# define BOOST_PP_FOR_140_I(s, p, o, m) BOOST_PP_IF(p(141, s), m, BOOST_PP_TUPLE_EAT_2)(141, s) BOOST_PP_IF(p(141, s), BOOST_PP_FOR_141, BOOST_PP_TUPLE_EAT_4)(o(141, s), p, o, m)\n# define BOOST_PP_FOR_141_I(s, p, o, m) BOOST_PP_IF(p(142, s), m, BOOST_PP_TUPLE_EAT_2)(142, s) BOOST_PP_IF(p(142, s), BOOST_PP_FOR_142, BOOST_PP_TUPLE_EAT_4)(o(142, s), p, o, m)\n# define BOOST_PP_FOR_142_I(s, p, o, m) BOOST_PP_IF(p(143, s), m, BOOST_PP_TUPLE_EAT_2)(143, s) BOOST_PP_IF(p(143, s), BOOST_PP_FOR_143, BOOST_PP_TUPLE_EAT_4)(o(143, s), p, o, m)\n# define BOOST_PP_FOR_143_I(s, p, o, m) BOOST_PP_IF(p(144, s), m, BOOST_PP_TUPLE_EAT_2)(144, s) BOOST_PP_IF(p(144, s), BOOST_PP_FOR_144, BOOST_PP_TUPLE_EAT_4)(o(144, s), p, o, m)\n# define BOOST_PP_FOR_144_I(s, p, o, m) BOOST_PP_IF(p(145, s), m, BOOST_PP_TUPLE_EAT_2)(145, s) BOOST_PP_IF(p(145, s), BOOST_PP_FOR_145, BOOST_PP_TUPLE_EAT_4)(o(145, s), p, o, m)\n# define BOOST_PP_FOR_145_I(s, p, o, m) BOOST_PP_IF(p(146, s), m, BOOST_PP_TUPLE_EAT_2)(146, s) BOOST_PP_IF(p(146, s), BOOST_PP_FOR_146, BOOST_PP_TUPLE_EAT_4)(o(146, s), p, o, m)\n# define BOOST_PP_FOR_146_I(s, p, o, m) BOOST_PP_IF(p(147, s), m, BOOST_PP_TUPLE_EAT_2)(147, s) BOOST_PP_IF(p(147, s), BOOST_PP_FOR_147, BOOST_PP_TUPLE_EAT_4)(o(147, s), p, o, m)\n# define BOOST_PP_FOR_147_I(s, p, o, m) BOOST_PP_IF(p(148, s), m, BOOST_PP_TUPLE_EAT_2)(148, s) BOOST_PP_IF(p(148, s), BOOST_PP_FOR_148, BOOST_PP_TUPLE_EAT_4)(o(148, s), p, o, m)\n# define BOOST_PP_FOR_148_I(s, p, o, m) BOOST_PP_IF(p(149, s), m, BOOST_PP_TUPLE_EAT_2)(149, s) BOOST_PP_IF(p(149, s), BOOST_PP_FOR_149, BOOST_PP_TUPLE_EAT_4)(o(149, s), p, o, m)\n# define BOOST_PP_FOR_149_I(s, p, o, m) BOOST_PP_IF(p(150, s), m, BOOST_PP_TUPLE_EAT_2)(150, s) BOOST_PP_IF(p(150, s), BOOST_PP_FOR_150, BOOST_PP_TUPLE_EAT_4)(o(150, s), p, o, m)\n# define BOOST_PP_FOR_150_I(s, p, o, m) BOOST_PP_IF(p(151, s), m, BOOST_PP_TUPLE_EAT_2)(151, s) BOOST_PP_IF(p(151, s), BOOST_PP_FOR_151, BOOST_PP_TUPLE_EAT_4)(o(151, s), p, o, m)\n# define BOOST_PP_FOR_151_I(s, p, o, m) BOOST_PP_IF(p(152, s), m, BOOST_PP_TUPLE_EAT_2)(152, s) BOOST_PP_IF(p(152, s), BOOST_PP_FOR_152, BOOST_PP_TUPLE_EAT_4)(o(152, s), p, o, m)\n# define BOOST_PP_FOR_152_I(s, p, o, m) BOOST_PP_IF(p(153, s), m, BOOST_PP_TUPLE_EAT_2)(153, s) BOOST_PP_IF(p(153, s), BOOST_PP_FOR_153, BOOST_PP_TUPLE_EAT_4)(o(153, s), p, o, m)\n# define BOOST_PP_FOR_153_I(s, p, o, m) BOOST_PP_IF(p(154, s), m, BOOST_PP_TUPLE_EAT_2)(154, s) BOOST_PP_IF(p(154, s), BOOST_PP_FOR_154, BOOST_PP_TUPLE_EAT_4)(o(154, s), p, o, m)\n# define BOOST_PP_FOR_154_I(s, p, o, m) BOOST_PP_IF(p(155, s), m, BOOST_PP_TUPLE_EAT_2)(155, s) BOOST_PP_IF(p(155, s), BOOST_PP_FOR_155, BOOST_PP_TUPLE_EAT_4)(o(155, s), p, o, m)\n# define BOOST_PP_FOR_155_I(s, p, o, m) BOOST_PP_IF(p(156, s), m, BOOST_PP_TUPLE_EAT_2)(156, s) BOOST_PP_IF(p(156, s), BOOST_PP_FOR_156, BOOST_PP_TUPLE_EAT_4)(o(156, s), p, o, m)\n# define BOOST_PP_FOR_156_I(s, p, o, m) BOOST_PP_IF(p(157, s), m, BOOST_PP_TUPLE_EAT_2)(157, s) BOOST_PP_IF(p(157, s), BOOST_PP_FOR_157, BOOST_PP_TUPLE_EAT_4)(o(157, s), p, o, m)\n# define BOOST_PP_FOR_157_I(s, p, o, m) BOOST_PP_IF(p(158, s), m, BOOST_PP_TUPLE_EAT_2)(158, s) BOOST_PP_IF(p(158, s), BOOST_PP_FOR_158, BOOST_PP_TUPLE_EAT_4)(o(158, s), p, o, m)\n# define BOOST_PP_FOR_158_I(s, p, o, m) BOOST_PP_IF(p(159, s), m, BOOST_PP_TUPLE_EAT_2)(159, s) BOOST_PP_IF(p(159, s), BOOST_PP_FOR_159, BOOST_PP_TUPLE_EAT_4)(o(159, s), p, o, m)\n# define BOOST_PP_FOR_159_I(s, p, o, m) BOOST_PP_IF(p(160, s), m, BOOST_PP_TUPLE_EAT_2)(160, s) BOOST_PP_IF(p(160, s), BOOST_PP_FOR_160, BOOST_PP_TUPLE_EAT_4)(o(160, s), p, o, m)\n# define BOOST_PP_FOR_160_I(s, p, o, m) BOOST_PP_IF(p(161, s), m, BOOST_PP_TUPLE_EAT_2)(161, s) BOOST_PP_IF(p(161, s), BOOST_PP_FOR_161, BOOST_PP_TUPLE_EAT_4)(o(161, s), p, o, m)\n# define BOOST_PP_FOR_161_I(s, p, o, m) BOOST_PP_IF(p(162, s), m, BOOST_PP_TUPLE_EAT_2)(162, s) BOOST_PP_IF(p(162, s), BOOST_PP_FOR_162, BOOST_PP_TUPLE_EAT_4)(o(162, s), p, o, m)\n# define BOOST_PP_FOR_162_I(s, p, o, m) BOOST_PP_IF(p(163, s), m, BOOST_PP_TUPLE_EAT_2)(163, s) BOOST_PP_IF(p(163, s), BOOST_PP_FOR_163, BOOST_PP_TUPLE_EAT_4)(o(163, s), p, o, m)\n# define BOOST_PP_FOR_163_I(s, p, o, m) BOOST_PP_IF(p(164, s), m, BOOST_PP_TUPLE_EAT_2)(164, s) BOOST_PP_IF(p(164, s), BOOST_PP_FOR_164, BOOST_PP_TUPLE_EAT_4)(o(164, s), p, o, m)\n# define BOOST_PP_FOR_164_I(s, p, o, m) BOOST_PP_IF(p(165, s), m, BOOST_PP_TUPLE_EAT_2)(165, s) BOOST_PP_IF(p(165, s), BOOST_PP_FOR_165, BOOST_PP_TUPLE_EAT_4)(o(165, s), p, o, m)\n# define BOOST_PP_FOR_165_I(s, p, o, m) BOOST_PP_IF(p(166, s), m, BOOST_PP_TUPLE_EAT_2)(166, s) BOOST_PP_IF(p(166, s), BOOST_PP_FOR_166, BOOST_PP_TUPLE_EAT_4)(o(166, s), p, o, m)\n# define BOOST_PP_FOR_166_I(s, p, o, m) BOOST_PP_IF(p(167, s), m, BOOST_PP_TUPLE_EAT_2)(167, s) BOOST_PP_IF(p(167, s), BOOST_PP_FOR_167, BOOST_PP_TUPLE_EAT_4)(o(167, s), p, o, m)\n# define BOOST_PP_FOR_167_I(s, p, o, m) BOOST_PP_IF(p(168, s), m, BOOST_PP_TUPLE_EAT_2)(168, s) BOOST_PP_IF(p(168, s), BOOST_PP_FOR_168, BOOST_PP_TUPLE_EAT_4)(o(168, s), p, o, m)\n# define BOOST_PP_FOR_168_I(s, p, o, m) BOOST_PP_IF(p(169, s), m, BOOST_PP_TUPLE_EAT_2)(169, s) BOOST_PP_IF(p(169, s), BOOST_PP_FOR_169, BOOST_PP_TUPLE_EAT_4)(o(169, s), p, o, m)\n# define BOOST_PP_FOR_169_I(s, p, o, m) BOOST_PP_IF(p(170, s), m, BOOST_PP_TUPLE_EAT_2)(170, s) BOOST_PP_IF(p(170, s), BOOST_PP_FOR_170, BOOST_PP_TUPLE_EAT_4)(o(170, s), p, o, m)\n# define BOOST_PP_FOR_170_I(s, p, o, m) BOOST_PP_IF(p(171, s), m, BOOST_PP_TUPLE_EAT_2)(171, s) BOOST_PP_IF(p(171, s), BOOST_PP_FOR_171, BOOST_PP_TUPLE_EAT_4)(o(171, s), p, o, m)\n# define BOOST_PP_FOR_171_I(s, p, o, m) BOOST_PP_IF(p(172, s), m, BOOST_PP_TUPLE_EAT_2)(172, s) BOOST_PP_IF(p(172, s), BOOST_PP_FOR_172, BOOST_PP_TUPLE_EAT_4)(o(172, s), p, o, m)\n# define BOOST_PP_FOR_172_I(s, p, o, m) BOOST_PP_IF(p(173, s), m, BOOST_PP_TUPLE_EAT_2)(173, s) BOOST_PP_IF(p(173, s), BOOST_PP_FOR_173, BOOST_PP_TUPLE_EAT_4)(o(173, s), p, o, m)\n# define BOOST_PP_FOR_173_I(s, p, o, m) BOOST_PP_IF(p(174, s), m, BOOST_PP_TUPLE_EAT_2)(174, s) BOOST_PP_IF(p(174, s), BOOST_PP_FOR_174, BOOST_PP_TUPLE_EAT_4)(o(174, s), p, o, m)\n# define BOOST_PP_FOR_174_I(s, p, o, m) BOOST_PP_IF(p(175, s), m, BOOST_PP_TUPLE_EAT_2)(175, s) BOOST_PP_IF(p(175, s), BOOST_PP_FOR_175, BOOST_PP_TUPLE_EAT_4)(o(175, s), p, o, m)\n# define BOOST_PP_FOR_175_I(s, p, o, m) BOOST_PP_IF(p(176, s), m, BOOST_PP_TUPLE_EAT_2)(176, s) BOOST_PP_IF(p(176, s), BOOST_PP_FOR_176, BOOST_PP_TUPLE_EAT_4)(o(176, s), p, o, m)\n# define BOOST_PP_FOR_176_I(s, p, o, m) BOOST_PP_IF(p(177, s), m, BOOST_PP_TUPLE_EAT_2)(177, s) BOOST_PP_IF(p(177, s), BOOST_PP_FOR_177, BOOST_PP_TUPLE_EAT_4)(o(177, s), p, o, m)\n# define BOOST_PP_FOR_177_I(s, p, o, m) BOOST_PP_IF(p(178, s), m, BOOST_PP_TUPLE_EAT_2)(178, s) BOOST_PP_IF(p(178, s), BOOST_PP_FOR_178, BOOST_PP_TUPLE_EAT_4)(o(178, s), p, o, m)\n# define BOOST_PP_FOR_178_I(s, p, o, m) BOOST_PP_IF(p(179, s), m, BOOST_PP_TUPLE_EAT_2)(179, s) BOOST_PP_IF(p(179, s), BOOST_PP_FOR_179, BOOST_PP_TUPLE_EAT_4)(o(179, s), p, o, m)\n# define BOOST_PP_FOR_179_I(s, p, o, m) BOOST_PP_IF(p(180, s), m, BOOST_PP_TUPLE_EAT_2)(180, s) BOOST_PP_IF(p(180, s), BOOST_PP_FOR_180, BOOST_PP_TUPLE_EAT_4)(o(180, s), p, o, m)\n# define BOOST_PP_FOR_180_I(s, p, o, m) BOOST_PP_IF(p(181, s), m, BOOST_PP_TUPLE_EAT_2)(181, s) BOOST_PP_IF(p(181, s), BOOST_PP_FOR_181, BOOST_PP_TUPLE_EAT_4)(o(181, s), p, o, m)\n# define BOOST_PP_FOR_181_I(s, p, o, m) BOOST_PP_IF(p(182, s), m, BOOST_PP_TUPLE_EAT_2)(182, s) BOOST_PP_IF(p(182, s), BOOST_PP_FOR_182, BOOST_PP_TUPLE_EAT_4)(o(182, s), p, o, m)\n# define BOOST_PP_FOR_182_I(s, p, o, m) BOOST_PP_IF(p(183, s), m, BOOST_PP_TUPLE_EAT_2)(183, s) BOOST_PP_IF(p(183, s), BOOST_PP_FOR_183, BOOST_PP_TUPLE_EAT_4)(o(183, s), p, o, m)\n# define BOOST_PP_FOR_183_I(s, p, o, m) BOOST_PP_IF(p(184, s), m, BOOST_PP_TUPLE_EAT_2)(184, s) BOOST_PP_IF(p(184, s), BOOST_PP_FOR_184, BOOST_PP_TUPLE_EAT_4)(o(184, s), p, o, m)\n# define BOOST_PP_FOR_184_I(s, p, o, m) BOOST_PP_IF(p(185, s), m, BOOST_PP_TUPLE_EAT_2)(185, s) BOOST_PP_IF(p(185, s), BOOST_PP_FOR_185, BOOST_PP_TUPLE_EAT_4)(o(185, s), p, o, m)\n# define BOOST_PP_FOR_185_I(s, p, o, m) BOOST_PP_IF(p(186, s), m, BOOST_PP_TUPLE_EAT_2)(186, s) BOOST_PP_IF(p(186, s), BOOST_PP_FOR_186, BOOST_PP_TUPLE_EAT_4)(o(186, s), p, o, m)\n# define BOOST_PP_FOR_186_I(s, p, o, m) BOOST_PP_IF(p(187, s), m, BOOST_PP_TUPLE_EAT_2)(187, s) BOOST_PP_IF(p(187, s), BOOST_PP_FOR_187, BOOST_PP_TUPLE_EAT_4)(o(187, s), p, o, m)\n# define BOOST_PP_FOR_187_I(s, p, o, m) BOOST_PP_IF(p(188, s), m, BOOST_PP_TUPLE_EAT_2)(188, s) BOOST_PP_IF(p(188, s), BOOST_PP_FOR_188, BOOST_PP_TUPLE_EAT_4)(o(188, s), p, o, m)\n# define BOOST_PP_FOR_188_I(s, p, o, m) BOOST_PP_IF(p(189, s), m, BOOST_PP_TUPLE_EAT_2)(189, s) BOOST_PP_IF(p(189, s), BOOST_PP_FOR_189, BOOST_PP_TUPLE_EAT_4)(o(189, s), p, o, m)\n# define BOOST_PP_FOR_189_I(s, p, o, m) BOOST_PP_IF(p(190, s), m, BOOST_PP_TUPLE_EAT_2)(190, s) BOOST_PP_IF(p(190, s), BOOST_PP_FOR_190, BOOST_PP_TUPLE_EAT_4)(o(190, s), p, o, m)\n# define BOOST_PP_FOR_190_I(s, p, o, m) BOOST_PP_IF(p(191, s), m, BOOST_PP_TUPLE_EAT_2)(191, s) BOOST_PP_IF(p(191, s), BOOST_PP_FOR_191, BOOST_PP_TUPLE_EAT_4)(o(191, s), p, o, m)\n# define BOOST_PP_FOR_191_I(s, p, o, m) BOOST_PP_IF(p(192, s), m, BOOST_PP_TUPLE_EAT_2)(192, s) BOOST_PP_IF(p(192, s), BOOST_PP_FOR_192, BOOST_PP_TUPLE_EAT_4)(o(192, s), p, o, m)\n# define BOOST_PP_FOR_192_I(s, p, o, m) BOOST_PP_IF(p(193, s), m, BOOST_PP_TUPLE_EAT_2)(193, s) BOOST_PP_IF(p(193, s), BOOST_PP_FOR_193, BOOST_PP_TUPLE_EAT_4)(o(193, s), p, o, m)\n# define BOOST_PP_FOR_193_I(s, p, o, m) BOOST_PP_IF(p(194, s), m, BOOST_PP_TUPLE_EAT_2)(194, s) BOOST_PP_IF(p(194, s), BOOST_PP_FOR_194, BOOST_PP_TUPLE_EAT_4)(o(194, s), p, o, m)\n# define BOOST_PP_FOR_194_I(s, p, o, m) BOOST_PP_IF(p(195, s), m, BOOST_PP_TUPLE_EAT_2)(195, s) BOOST_PP_IF(p(195, s), BOOST_PP_FOR_195, BOOST_PP_TUPLE_EAT_4)(o(195, s), p, o, m)\n# define BOOST_PP_FOR_195_I(s, p, o, m) BOOST_PP_IF(p(196, s), m, BOOST_PP_TUPLE_EAT_2)(196, s) BOOST_PP_IF(p(196, s), BOOST_PP_FOR_196, BOOST_PP_TUPLE_EAT_4)(o(196, s), p, o, m)\n# define BOOST_PP_FOR_196_I(s, p, o, m) BOOST_PP_IF(p(197, s), m, BOOST_PP_TUPLE_EAT_2)(197, s) BOOST_PP_IF(p(197, s), BOOST_PP_FOR_197, BOOST_PP_TUPLE_EAT_4)(o(197, s), p, o, m)\n# define BOOST_PP_FOR_197_I(s, p, o, m) BOOST_PP_IF(p(198, s), m, BOOST_PP_TUPLE_EAT_2)(198, s) BOOST_PP_IF(p(198, s), BOOST_PP_FOR_198, BOOST_PP_TUPLE_EAT_4)(o(198, s), p, o, m)\n# define BOOST_PP_FOR_198_I(s, p, o, m) BOOST_PP_IF(p(199, s), m, BOOST_PP_TUPLE_EAT_2)(199, s) BOOST_PP_IF(p(199, s), BOOST_PP_FOR_199, BOOST_PP_TUPLE_EAT_4)(o(199, s), p, o, m)\n# define BOOST_PP_FOR_199_I(s, p, o, m) BOOST_PP_IF(p(200, s), m, BOOST_PP_TUPLE_EAT_2)(200, s) BOOST_PP_IF(p(200, s), BOOST_PP_FOR_200, BOOST_PP_TUPLE_EAT_4)(o(200, s), p, o, m)\n# define BOOST_PP_FOR_200_I(s, p, o, m) BOOST_PP_IF(p(201, s), m, BOOST_PP_TUPLE_EAT_2)(201, s) BOOST_PP_IF(p(201, s), BOOST_PP_FOR_201, BOOST_PP_TUPLE_EAT_4)(o(201, s), p, o, m)\n# define BOOST_PP_FOR_201_I(s, p, o, m) BOOST_PP_IF(p(202, s), m, BOOST_PP_TUPLE_EAT_2)(202, s) BOOST_PP_IF(p(202, s), BOOST_PP_FOR_202, BOOST_PP_TUPLE_EAT_4)(o(202, s), p, o, m)\n# define BOOST_PP_FOR_202_I(s, p, o, m) BOOST_PP_IF(p(203, s), m, BOOST_PP_TUPLE_EAT_2)(203, s) BOOST_PP_IF(p(203, s), BOOST_PP_FOR_203, BOOST_PP_TUPLE_EAT_4)(o(203, s), p, o, m)\n# define BOOST_PP_FOR_203_I(s, p, o, m) BOOST_PP_IF(p(204, s), m, BOOST_PP_TUPLE_EAT_2)(204, s) BOOST_PP_IF(p(204, s), BOOST_PP_FOR_204, BOOST_PP_TUPLE_EAT_4)(o(204, s), p, o, m)\n# define BOOST_PP_FOR_204_I(s, p, o, m) BOOST_PP_IF(p(205, s), m, BOOST_PP_TUPLE_EAT_2)(205, s) BOOST_PP_IF(p(205, s), BOOST_PP_FOR_205, BOOST_PP_TUPLE_EAT_4)(o(205, s), p, o, m)\n# define BOOST_PP_FOR_205_I(s, p, o, m) BOOST_PP_IF(p(206, s), m, BOOST_PP_TUPLE_EAT_2)(206, s) BOOST_PP_IF(p(206, s), BOOST_PP_FOR_206, BOOST_PP_TUPLE_EAT_4)(o(206, s), p, o, m)\n# define BOOST_PP_FOR_206_I(s, p, o, m) BOOST_PP_IF(p(207, s), m, BOOST_PP_TUPLE_EAT_2)(207, s) BOOST_PP_IF(p(207, s), BOOST_PP_FOR_207, BOOST_PP_TUPLE_EAT_4)(o(207, s), p, o, m)\n# define BOOST_PP_FOR_207_I(s, p, o, m) BOOST_PP_IF(p(208, s), m, BOOST_PP_TUPLE_EAT_2)(208, s) BOOST_PP_IF(p(208, s), BOOST_PP_FOR_208, BOOST_PP_TUPLE_EAT_4)(o(208, s), p, o, m)\n# define BOOST_PP_FOR_208_I(s, p, o, m) BOOST_PP_IF(p(209, s), m, BOOST_PP_TUPLE_EAT_2)(209, s) BOOST_PP_IF(p(209, s), BOOST_PP_FOR_209, BOOST_PP_TUPLE_EAT_4)(o(209, s), p, o, m)\n# define BOOST_PP_FOR_209_I(s, p, o, m) BOOST_PP_IF(p(210, s), m, BOOST_PP_TUPLE_EAT_2)(210, s) BOOST_PP_IF(p(210, s), BOOST_PP_FOR_210, BOOST_PP_TUPLE_EAT_4)(o(210, s), p, o, m)\n# define BOOST_PP_FOR_210_I(s, p, o, m) BOOST_PP_IF(p(211, s), m, BOOST_PP_TUPLE_EAT_2)(211, s) BOOST_PP_IF(p(211, s), BOOST_PP_FOR_211, BOOST_PP_TUPLE_EAT_4)(o(211, s), p, o, m)\n# define BOOST_PP_FOR_211_I(s, p, o, m) BOOST_PP_IF(p(212, s), m, BOOST_PP_TUPLE_EAT_2)(212, s) BOOST_PP_IF(p(212, s), BOOST_PP_FOR_212, BOOST_PP_TUPLE_EAT_4)(o(212, s), p, o, m)\n# define BOOST_PP_FOR_212_I(s, p, o, m) BOOST_PP_IF(p(213, s), m, BOOST_PP_TUPLE_EAT_2)(213, s) BOOST_PP_IF(p(213, s), BOOST_PP_FOR_213, BOOST_PP_TUPLE_EAT_4)(o(213, s), p, o, m)\n# define BOOST_PP_FOR_213_I(s, p, o, m) BOOST_PP_IF(p(214, s), m, BOOST_PP_TUPLE_EAT_2)(214, s) BOOST_PP_IF(p(214, s), BOOST_PP_FOR_214, BOOST_PP_TUPLE_EAT_4)(o(214, s), p, o, m)\n# define BOOST_PP_FOR_214_I(s, p, o, m) BOOST_PP_IF(p(215, s), m, BOOST_PP_TUPLE_EAT_2)(215, s) BOOST_PP_IF(p(215, s), BOOST_PP_FOR_215, BOOST_PP_TUPLE_EAT_4)(o(215, s), p, o, m)\n# define BOOST_PP_FOR_215_I(s, p, o, m) BOOST_PP_IF(p(216, s), m, BOOST_PP_TUPLE_EAT_2)(216, s) BOOST_PP_IF(p(216, s), BOOST_PP_FOR_216, BOOST_PP_TUPLE_EAT_4)(o(216, s), p, o, m)\n# define BOOST_PP_FOR_216_I(s, p, o, m) BOOST_PP_IF(p(217, s), m, BOOST_PP_TUPLE_EAT_2)(217, s) BOOST_PP_IF(p(217, s), BOOST_PP_FOR_217, BOOST_PP_TUPLE_EAT_4)(o(217, s), p, o, m)\n# define BOOST_PP_FOR_217_I(s, p, o, m) BOOST_PP_IF(p(218, s), m, BOOST_PP_TUPLE_EAT_2)(218, s) BOOST_PP_IF(p(218, s), BOOST_PP_FOR_218, BOOST_PP_TUPLE_EAT_4)(o(218, s), p, o, m)\n# define BOOST_PP_FOR_218_I(s, p, o, m) BOOST_PP_IF(p(219, s), m, BOOST_PP_TUPLE_EAT_2)(219, s) BOOST_PP_IF(p(219, s), BOOST_PP_FOR_219, BOOST_PP_TUPLE_EAT_4)(o(219, s), p, o, m)\n# define BOOST_PP_FOR_219_I(s, p, o, m) BOOST_PP_IF(p(220, s), m, BOOST_PP_TUPLE_EAT_2)(220, s) BOOST_PP_IF(p(220, s), BOOST_PP_FOR_220, BOOST_PP_TUPLE_EAT_4)(o(220, s), p, o, m)\n# define BOOST_PP_FOR_220_I(s, p, o, m) BOOST_PP_IF(p(221, s), m, BOOST_PP_TUPLE_EAT_2)(221, s) BOOST_PP_IF(p(221, s), BOOST_PP_FOR_221, BOOST_PP_TUPLE_EAT_4)(o(221, s), p, o, m)\n# define BOOST_PP_FOR_221_I(s, p, o, m) BOOST_PP_IF(p(222, s), m, BOOST_PP_TUPLE_EAT_2)(222, s) BOOST_PP_IF(p(222, s), BOOST_PP_FOR_222, BOOST_PP_TUPLE_EAT_4)(o(222, s), p, o, m)\n# define BOOST_PP_FOR_222_I(s, p, o, m) BOOST_PP_IF(p(223, s), m, BOOST_PP_TUPLE_EAT_2)(223, s) BOOST_PP_IF(p(223, s), BOOST_PP_FOR_223, BOOST_PP_TUPLE_EAT_4)(o(223, s), p, o, m)\n# define BOOST_PP_FOR_223_I(s, p, o, m) BOOST_PP_IF(p(224, s), m, BOOST_PP_TUPLE_EAT_2)(224, s) BOOST_PP_IF(p(224, s), BOOST_PP_FOR_224, BOOST_PP_TUPLE_EAT_4)(o(224, s), p, o, m)\n# define BOOST_PP_FOR_224_I(s, p, o, m) BOOST_PP_IF(p(225, s), m, BOOST_PP_TUPLE_EAT_2)(225, s) BOOST_PP_IF(p(225, s), BOOST_PP_FOR_225, BOOST_PP_TUPLE_EAT_4)(o(225, s), p, o, m)\n# define BOOST_PP_FOR_225_I(s, p, o, m) BOOST_PP_IF(p(226, s), m, BOOST_PP_TUPLE_EAT_2)(226, s) BOOST_PP_IF(p(226, s), BOOST_PP_FOR_226, BOOST_PP_TUPLE_EAT_4)(o(226, s), p, o, m)\n# define BOOST_PP_FOR_226_I(s, p, o, m) BOOST_PP_IF(p(227, s), m, BOOST_PP_TUPLE_EAT_2)(227, s) BOOST_PP_IF(p(227, s), BOOST_PP_FOR_227, BOOST_PP_TUPLE_EAT_4)(o(227, s), p, o, m)\n# define BOOST_PP_FOR_227_I(s, p, o, m) BOOST_PP_IF(p(228, s), m, BOOST_PP_TUPLE_EAT_2)(228, s) BOOST_PP_IF(p(228, s), BOOST_PP_FOR_228, BOOST_PP_TUPLE_EAT_4)(o(228, s), p, o, m)\n# define BOOST_PP_FOR_228_I(s, p, o, m) BOOST_PP_IF(p(229, s), m, BOOST_PP_TUPLE_EAT_2)(229, s) BOOST_PP_IF(p(229, s), BOOST_PP_FOR_229, BOOST_PP_TUPLE_EAT_4)(o(229, s), p, o, m)\n# define BOOST_PP_FOR_229_I(s, p, o, m) BOOST_PP_IF(p(230, s), m, BOOST_PP_TUPLE_EAT_2)(230, s) BOOST_PP_IF(p(230, s), BOOST_PP_FOR_230, BOOST_PP_TUPLE_EAT_4)(o(230, s), p, o, m)\n# define BOOST_PP_FOR_230_I(s, p, o, m) BOOST_PP_IF(p(231, s), m, BOOST_PP_TUPLE_EAT_2)(231, s) BOOST_PP_IF(p(231, s), BOOST_PP_FOR_231, BOOST_PP_TUPLE_EAT_4)(o(231, s), p, o, m)\n# define BOOST_PP_FOR_231_I(s, p, o, m) BOOST_PP_IF(p(232, s), m, BOOST_PP_TUPLE_EAT_2)(232, s) BOOST_PP_IF(p(232, s), BOOST_PP_FOR_232, BOOST_PP_TUPLE_EAT_4)(o(232, s), p, o, m)\n# define BOOST_PP_FOR_232_I(s, p, o, m) BOOST_PP_IF(p(233, s), m, BOOST_PP_TUPLE_EAT_2)(233, s) BOOST_PP_IF(p(233, s), BOOST_PP_FOR_233, BOOST_PP_TUPLE_EAT_4)(o(233, s), p, o, m)\n# define BOOST_PP_FOR_233_I(s, p, o, m) BOOST_PP_IF(p(234, s), m, BOOST_PP_TUPLE_EAT_2)(234, s) BOOST_PP_IF(p(234, s), BOOST_PP_FOR_234, BOOST_PP_TUPLE_EAT_4)(o(234, s), p, o, m)\n# define BOOST_PP_FOR_234_I(s, p, o, m) BOOST_PP_IF(p(235, s), m, BOOST_PP_TUPLE_EAT_2)(235, s) BOOST_PP_IF(p(235, s), BOOST_PP_FOR_235, BOOST_PP_TUPLE_EAT_4)(o(235, s), p, o, m)\n# define BOOST_PP_FOR_235_I(s, p, o, m) BOOST_PP_IF(p(236, s), m, BOOST_PP_TUPLE_EAT_2)(236, s) BOOST_PP_IF(p(236, s), BOOST_PP_FOR_236, BOOST_PP_TUPLE_EAT_4)(o(236, s), p, o, m)\n# define BOOST_PP_FOR_236_I(s, p, o, m) BOOST_PP_IF(p(237, s), m, BOOST_PP_TUPLE_EAT_2)(237, s) BOOST_PP_IF(p(237, s), BOOST_PP_FOR_237, BOOST_PP_TUPLE_EAT_4)(o(237, s), p, o, m)\n# define BOOST_PP_FOR_237_I(s, p, o, m) BOOST_PP_IF(p(238, s), m, BOOST_PP_TUPLE_EAT_2)(238, s) BOOST_PP_IF(p(238, s), BOOST_PP_FOR_238, BOOST_PP_TUPLE_EAT_4)(o(238, s), p, o, m)\n# define BOOST_PP_FOR_238_I(s, p, o, m) BOOST_PP_IF(p(239, s), m, BOOST_PP_TUPLE_EAT_2)(239, s) BOOST_PP_IF(p(239, s), BOOST_PP_FOR_239, BOOST_PP_TUPLE_EAT_4)(o(239, s), p, o, m)\n# define BOOST_PP_FOR_239_I(s, p, o, m) BOOST_PP_IF(p(240, s), m, BOOST_PP_TUPLE_EAT_2)(240, s) BOOST_PP_IF(p(240, s), BOOST_PP_FOR_240, BOOST_PP_TUPLE_EAT_4)(o(240, s), p, o, m)\n# define BOOST_PP_FOR_240_I(s, p, o, m) BOOST_PP_IF(p(241, s), m, BOOST_PP_TUPLE_EAT_2)(241, s) BOOST_PP_IF(p(241, s), BOOST_PP_FOR_241, BOOST_PP_TUPLE_EAT_4)(o(241, s), p, o, m)\n# define BOOST_PP_FOR_241_I(s, p, o, m) BOOST_PP_IF(p(242, s), m, BOOST_PP_TUPLE_EAT_2)(242, s) BOOST_PP_IF(p(242, s), BOOST_PP_FOR_242, BOOST_PP_TUPLE_EAT_4)(o(242, s), p, o, m)\n# define BOOST_PP_FOR_242_I(s, p, o, m) BOOST_PP_IF(p(243, s), m, BOOST_PP_TUPLE_EAT_2)(243, s) BOOST_PP_IF(p(243, s), BOOST_PP_FOR_243, BOOST_PP_TUPLE_EAT_4)(o(243, s), p, o, m)\n# define BOOST_PP_FOR_243_I(s, p, o, m) BOOST_PP_IF(p(244, s), m, BOOST_PP_TUPLE_EAT_2)(244, s) BOOST_PP_IF(p(244, s), BOOST_PP_FOR_244, BOOST_PP_TUPLE_EAT_4)(o(244, s), p, o, m)\n# define BOOST_PP_FOR_244_I(s, p, o, m) BOOST_PP_IF(p(245, s), m, BOOST_PP_TUPLE_EAT_2)(245, s) BOOST_PP_IF(p(245, s), BOOST_PP_FOR_245, BOOST_PP_TUPLE_EAT_4)(o(245, s), p, o, m)\n# define BOOST_PP_FOR_245_I(s, p, o, m) BOOST_PP_IF(p(246, s), m, BOOST_PP_TUPLE_EAT_2)(246, s) BOOST_PP_IF(p(246, s), BOOST_PP_FOR_246, BOOST_PP_TUPLE_EAT_4)(o(246, s), p, o, m)\n# define BOOST_PP_FOR_246_I(s, p, o, m) BOOST_PP_IF(p(247, s), m, BOOST_PP_TUPLE_EAT_2)(247, s) BOOST_PP_IF(p(247, s), BOOST_PP_FOR_247, BOOST_PP_TUPLE_EAT_4)(o(247, s), p, o, m)\n# define BOOST_PP_FOR_247_I(s, p, o, m) BOOST_PP_IF(p(248, s), m, BOOST_PP_TUPLE_EAT_2)(248, s) BOOST_PP_IF(p(248, s), BOOST_PP_FOR_248, BOOST_PP_TUPLE_EAT_4)(o(248, s), p, o, m)\n# define BOOST_PP_FOR_248_I(s, p, o, m) BOOST_PP_IF(p(249, s), m, BOOST_PP_TUPLE_EAT_2)(249, s) BOOST_PP_IF(p(249, s), BOOST_PP_FOR_249, BOOST_PP_TUPLE_EAT_4)(o(249, s), p, o, m)\n# define BOOST_PP_FOR_249_I(s, p, o, m) BOOST_PP_IF(p(250, s), m, BOOST_PP_TUPLE_EAT_2)(250, s) BOOST_PP_IF(p(250, s), BOOST_PP_FOR_250, BOOST_PP_TUPLE_EAT_4)(o(250, s), p, o, m)\n# define BOOST_PP_FOR_250_I(s, p, o, m) BOOST_PP_IF(p(251, s), m, BOOST_PP_TUPLE_EAT_2)(251, s) BOOST_PP_IF(p(251, s), BOOST_PP_FOR_251, BOOST_PP_TUPLE_EAT_4)(o(251, s), p, o, m)\n# define BOOST_PP_FOR_251_I(s, p, o, m) BOOST_PP_IF(p(252, s), m, BOOST_PP_TUPLE_EAT_2)(252, s) BOOST_PP_IF(p(252, s), BOOST_PP_FOR_252, BOOST_PP_TUPLE_EAT_4)(o(252, s), p, o, m)\n# define BOOST_PP_FOR_252_I(s, p, o, m) BOOST_PP_IF(p(253, s), m, BOOST_PP_TUPLE_EAT_2)(253, s) BOOST_PP_IF(p(253, s), BOOST_PP_FOR_253, BOOST_PP_TUPLE_EAT_4)(o(253, s), p, o, m)\n# define BOOST_PP_FOR_253_I(s, p, o, m) BOOST_PP_IF(p(254, s), m, BOOST_PP_TUPLE_EAT_2)(254, s) BOOST_PP_IF(p(254, s), BOOST_PP_FOR_254, BOOST_PP_TUPLE_EAT_4)(o(254, s), p, o, m)\n# define BOOST_PP_FOR_254_I(s, p, o, m) BOOST_PP_IF(p(255, s), m, BOOST_PP_TUPLE_EAT_2)(255, s) BOOST_PP_IF(p(255, s), BOOST_PP_FOR_255, BOOST_PP_TUPLE_EAT_4)(o(255, s), p, o, m)\n# define BOOST_PP_FOR_255_I(s, p, o, m) BOOST_PP_IF(p(256, s), m, BOOST_PP_TUPLE_EAT_2)(256, s) BOOST_PP_IF(p(256, s), BOOST_PP_FOR_256, BOOST_PP_TUPLE_EAT_4)(o(256, s), p, o, m)\n# define BOOST_PP_FOR_256_I(s, p, o, m) BOOST_PP_IF(p(257, s), m, BOOST_PP_TUPLE_EAT_2)(257, s) BOOST_PP_IF(p(257, s), BOOST_PP_FOR_257, BOOST_PP_TUPLE_EAT_4)(o(257, s), p, o, m)\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/repetition/detail/for.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_DETAIL_FOR_HPP\n# define BOOST_PREPROCESSOR_REPETITION_DETAIL_FOR_HPP\n#\n# include <boost/preprocessor/control/expr_iif.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/logical/bool.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n#\n# define BOOST_PP_FOR_1(s, p, o, m) BOOST_PP_FOR_1_C(BOOST_PP_BOOL(p(2, s)), s, p, o, m)\n# define BOOST_PP_FOR_2(s, p, o, m) BOOST_PP_FOR_2_C(BOOST_PP_BOOL(p(3, s)), s, p, o, m)\n# define BOOST_PP_FOR_3(s, p, o, m) BOOST_PP_FOR_3_C(BOOST_PP_BOOL(p(4, s)), s, p, o, m)\n# define BOOST_PP_FOR_4(s, p, o, m) BOOST_PP_FOR_4_C(BOOST_PP_BOOL(p(5, s)), s, p, o, m)\n# define BOOST_PP_FOR_5(s, p, o, m) BOOST_PP_FOR_5_C(BOOST_PP_BOOL(p(6, s)), s, p, o, m)\n# define BOOST_PP_FOR_6(s, p, o, m) BOOST_PP_FOR_6_C(BOOST_PP_BOOL(p(7, s)), s, p, o, m)\n# define BOOST_PP_FOR_7(s, p, o, m) BOOST_PP_FOR_7_C(BOOST_PP_BOOL(p(8, s)), s, p, o, m)\n# define BOOST_PP_FOR_8(s, p, o, m) BOOST_PP_FOR_8_C(BOOST_PP_BOOL(p(9, s)), s, p, o, m)\n# define BOOST_PP_FOR_9(s, p, o, m) BOOST_PP_FOR_9_C(BOOST_PP_BOOL(p(10, s)), s, p, o, m)\n# define BOOST_PP_FOR_10(s, p, o, m) BOOST_PP_FOR_10_C(BOOST_PP_BOOL(p(11, s)), s, p, o, m)\n# define BOOST_PP_FOR_11(s, p, o, m) BOOST_PP_FOR_11_C(BOOST_PP_BOOL(p(12, s)), s, p, o, m)\n# define BOOST_PP_FOR_12(s, p, o, m) BOOST_PP_FOR_12_C(BOOST_PP_BOOL(p(13, s)), s, p, o, m)\n# define BOOST_PP_FOR_13(s, p, o, m) BOOST_PP_FOR_13_C(BOOST_PP_BOOL(p(14, s)), s, p, o, m)\n# define BOOST_PP_FOR_14(s, p, o, m) BOOST_PP_FOR_14_C(BOOST_PP_BOOL(p(15, s)), s, p, o, m)\n# define BOOST_PP_FOR_15(s, p, o, m) BOOST_PP_FOR_15_C(BOOST_PP_BOOL(p(16, s)), s, p, o, m)\n# define BOOST_PP_FOR_16(s, p, o, m) BOOST_PP_FOR_16_C(BOOST_PP_BOOL(p(17, s)), s, p, o, m)\n# define BOOST_PP_FOR_17(s, p, o, m) BOOST_PP_FOR_17_C(BOOST_PP_BOOL(p(18, s)), s, p, o, m)\n# define BOOST_PP_FOR_18(s, p, o, m) BOOST_PP_FOR_18_C(BOOST_PP_BOOL(p(19, s)), s, p, o, m)\n# define BOOST_PP_FOR_19(s, p, o, m) BOOST_PP_FOR_19_C(BOOST_PP_BOOL(p(20, s)), s, p, o, m)\n# define BOOST_PP_FOR_20(s, p, o, m) BOOST_PP_FOR_20_C(BOOST_PP_BOOL(p(21, s)), s, p, o, m)\n# define BOOST_PP_FOR_21(s, p, o, m) BOOST_PP_FOR_21_C(BOOST_PP_BOOL(p(22, s)), s, p, o, m)\n# define BOOST_PP_FOR_22(s, p, o, m) BOOST_PP_FOR_22_C(BOOST_PP_BOOL(p(23, s)), s, p, o, m)\n# define BOOST_PP_FOR_23(s, p, o, m) BOOST_PP_FOR_23_C(BOOST_PP_BOOL(p(24, s)), s, p, o, m)\n# define BOOST_PP_FOR_24(s, p, o, m) BOOST_PP_FOR_24_C(BOOST_PP_BOOL(p(25, s)), s, p, o, m)\n# define BOOST_PP_FOR_25(s, p, o, m) BOOST_PP_FOR_25_C(BOOST_PP_BOOL(p(26, s)), s, p, o, m)\n# define BOOST_PP_FOR_26(s, p, o, m) BOOST_PP_FOR_26_C(BOOST_PP_BOOL(p(27, s)), s, p, o, m)\n# define BOOST_PP_FOR_27(s, p, o, m) BOOST_PP_FOR_27_C(BOOST_PP_BOOL(p(28, s)), s, p, o, m)\n# define BOOST_PP_FOR_28(s, p, o, m) BOOST_PP_FOR_28_C(BOOST_PP_BOOL(p(29, s)), s, p, o, m)\n# define BOOST_PP_FOR_29(s, p, o, m) BOOST_PP_FOR_29_C(BOOST_PP_BOOL(p(30, s)), s, p, o, m)\n# define BOOST_PP_FOR_30(s, p, o, m) BOOST_PP_FOR_30_C(BOOST_PP_BOOL(p(31, s)), s, p, o, m)\n# define BOOST_PP_FOR_31(s, p, o, m) BOOST_PP_FOR_31_C(BOOST_PP_BOOL(p(32, s)), s, p, o, m)\n# define BOOST_PP_FOR_32(s, p, o, m) BOOST_PP_FOR_32_C(BOOST_PP_BOOL(p(33, s)), s, p, o, m)\n# define BOOST_PP_FOR_33(s, p, o, m) BOOST_PP_FOR_33_C(BOOST_PP_BOOL(p(34, s)), s, p, o, m)\n# define BOOST_PP_FOR_34(s, p, o, m) BOOST_PP_FOR_34_C(BOOST_PP_BOOL(p(35, s)), s, p, o, m)\n# define BOOST_PP_FOR_35(s, p, o, m) BOOST_PP_FOR_35_C(BOOST_PP_BOOL(p(36, s)), s, p, o, m)\n# define BOOST_PP_FOR_36(s, p, o, m) BOOST_PP_FOR_36_C(BOOST_PP_BOOL(p(37, s)), s, p, o, m)\n# define BOOST_PP_FOR_37(s, p, o, m) BOOST_PP_FOR_37_C(BOOST_PP_BOOL(p(38, s)), s, p, o, m)\n# define BOOST_PP_FOR_38(s, p, o, m) BOOST_PP_FOR_38_C(BOOST_PP_BOOL(p(39, s)), s, p, o, m)\n# define BOOST_PP_FOR_39(s, p, o, m) BOOST_PP_FOR_39_C(BOOST_PP_BOOL(p(40, s)), s, p, o, m)\n# define BOOST_PP_FOR_40(s, p, o, m) BOOST_PP_FOR_40_C(BOOST_PP_BOOL(p(41, s)), s, p, o, m)\n# define BOOST_PP_FOR_41(s, p, o, m) BOOST_PP_FOR_41_C(BOOST_PP_BOOL(p(42, s)), s, p, o, m)\n# define BOOST_PP_FOR_42(s, p, o, m) BOOST_PP_FOR_42_C(BOOST_PP_BOOL(p(43, s)), s, p, o, m)\n# define BOOST_PP_FOR_43(s, p, o, m) BOOST_PP_FOR_43_C(BOOST_PP_BOOL(p(44, s)), s, p, o, m)\n# define BOOST_PP_FOR_44(s, p, o, m) BOOST_PP_FOR_44_C(BOOST_PP_BOOL(p(45, s)), s, p, o, m)\n# define BOOST_PP_FOR_45(s, p, o, m) BOOST_PP_FOR_45_C(BOOST_PP_BOOL(p(46, s)), s, p, o, m)\n# define BOOST_PP_FOR_46(s, p, o, m) BOOST_PP_FOR_46_C(BOOST_PP_BOOL(p(47, s)), s, p, o, m)\n# define BOOST_PP_FOR_47(s, p, o, m) BOOST_PP_FOR_47_C(BOOST_PP_BOOL(p(48, s)), s, p, o, m)\n# define BOOST_PP_FOR_48(s, p, o, m) BOOST_PP_FOR_48_C(BOOST_PP_BOOL(p(49, s)), s, p, o, m)\n# define BOOST_PP_FOR_49(s, p, o, m) BOOST_PP_FOR_49_C(BOOST_PP_BOOL(p(50, s)), s, p, o, m)\n# define BOOST_PP_FOR_50(s, p, o, m) BOOST_PP_FOR_50_C(BOOST_PP_BOOL(p(51, s)), s, p, o, m)\n# define BOOST_PP_FOR_51(s, p, o, m) BOOST_PP_FOR_51_C(BOOST_PP_BOOL(p(52, s)), s, p, o, m)\n# define BOOST_PP_FOR_52(s, p, o, m) BOOST_PP_FOR_52_C(BOOST_PP_BOOL(p(53, s)), s, p, o, m)\n# define BOOST_PP_FOR_53(s, p, o, m) BOOST_PP_FOR_53_C(BOOST_PP_BOOL(p(54, s)), s, p, o, m)\n# define BOOST_PP_FOR_54(s, p, o, m) BOOST_PP_FOR_54_C(BOOST_PP_BOOL(p(55, s)), s, p, o, m)\n# define BOOST_PP_FOR_55(s, p, o, m) BOOST_PP_FOR_55_C(BOOST_PP_BOOL(p(56, s)), s, p, o, m)\n# define BOOST_PP_FOR_56(s, p, o, m) BOOST_PP_FOR_56_C(BOOST_PP_BOOL(p(57, s)), s, p, o, m)\n# define BOOST_PP_FOR_57(s, p, o, m) BOOST_PP_FOR_57_C(BOOST_PP_BOOL(p(58, s)), s, p, o, m)\n# define BOOST_PP_FOR_58(s, p, o, m) BOOST_PP_FOR_58_C(BOOST_PP_BOOL(p(59, s)), s, p, o, m)\n# define BOOST_PP_FOR_59(s, p, o, m) BOOST_PP_FOR_59_C(BOOST_PP_BOOL(p(60, s)), s, p, o, m)\n# define BOOST_PP_FOR_60(s, p, o, m) BOOST_PP_FOR_60_C(BOOST_PP_BOOL(p(61, s)), s, p, o, m)\n# define BOOST_PP_FOR_61(s, p, o, m) BOOST_PP_FOR_61_C(BOOST_PP_BOOL(p(62, s)), s, p, o, m)\n# define BOOST_PP_FOR_62(s, p, o, m) BOOST_PP_FOR_62_C(BOOST_PP_BOOL(p(63, s)), s, p, o, m)\n# define BOOST_PP_FOR_63(s, p, o, m) BOOST_PP_FOR_63_C(BOOST_PP_BOOL(p(64, s)), s, p, o, m)\n# define BOOST_PP_FOR_64(s, p, o, m) BOOST_PP_FOR_64_C(BOOST_PP_BOOL(p(65, s)), s, p, o, m)\n# define BOOST_PP_FOR_65(s, p, o, m) BOOST_PP_FOR_65_C(BOOST_PP_BOOL(p(66, s)), s, p, o, m)\n# define BOOST_PP_FOR_66(s, p, o, m) BOOST_PP_FOR_66_C(BOOST_PP_BOOL(p(67, s)), s, p, o, m)\n# define BOOST_PP_FOR_67(s, p, o, m) BOOST_PP_FOR_67_C(BOOST_PP_BOOL(p(68, s)), s, p, o, m)\n# define BOOST_PP_FOR_68(s, p, o, m) BOOST_PP_FOR_68_C(BOOST_PP_BOOL(p(69, s)), s, p, o, m)\n# define BOOST_PP_FOR_69(s, p, o, m) BOOST_PP_FOR_69_C(BOOST_PP_BOOL(p(70, s)), s, p, o, m)\n# define BOOST_PP_FOR_70(s, p, o, m) BOOST_PP_FOR_70_C(BOOST_PP_BOOL(p(71, s)), s, p, o, m)\n# define BOOST_PP_FOR_71(s, p, o, m) BOOST_PP_FOR_71_C(BOOST_PP_BOOL(p(72, s)), s, p, o, m)\n# define BOOST_PP_FOR_72(s, p, o, m) BOOST_PP_FOR_72_C(BOOST_PP_BOOL(p(73, s)), s, p, o, m)\n# define BOOST_PP_FOR_73(s, p, o, m) BOOST_PP_FOR_73_C(BOOST_PP_BOOL(p(74, s)), s, p, o, m)\n# define BOOST_PP_FOR_74(s, p, o, m) BOOST_PP_FOR_74_C(BOOST_PP_BOOL(p(75, s)), s, p, o, m)\n# define BOOST_PP_FOR_75(s, p, o, m) BOOST_PP_FOR_75_C(BOOST_PP_BOOL(p(76, s)), s, p, o, m)\n# define BOOST_PP_FOR_76(s, p, o, m) BOOST_PP_FOR_76_C(BOOST_PP_BOOL(p(77, s)), s, p, o, m)\n# define BOOST_PP_FOR_77(s, p, o, m) BOOST_PP_FOR_77_C(BOOST_PP_BOOL(p(78, s)), s, p, o, m)\n# define BOOST_PP_FOR_78(s, p, o, m) BOOST_PP_FOR_78_C(BOOST_PP_BOOL(p(79, s)), s, p, o, m)\n# define BOOST_PP_FOR_79(s, p, o, m) BOOST_PP_FOR_79_C(BOOST_PP_BOOL(p(80, s)), s, p, o, m)\n# define BOOST_PP_FOR_80(s, p, o, m) BOOST_PP_FOR_80_C(BOOST_PP_BOOL(p(81, s)), s, p, o, m)\n# define BOOST_PP_FOR_81(s, p, o, m) BOOST_PP_FOR_81_C(BOOST_PP_BOOL(p(82, s)), s, p, o, m)\n# define BOOST_PP_FOR_82(s, p, o, m) BOOST_PP_FOR_82_C(BOOST_PP_BOOL(p(83, s)), s, p, o, m)\n# define BOOST_PP_FOR_83(s, p, o, m) BOOST_PP_FOR_83_C(BOOST_PP_BOOL(p(84, s)), s, p, o, m)\n# define BOOST_PP_FOR_84(s, p, o, m) BOOST_PP_FOR_84_C(BOOST_PP_BOOL(p(85, s)), s, p, o, m)\n# define BOOST_PP_FOR_85(s, p, o, m) BOOST_PP_FOR_85_C(BOOST_PP_BOOL(p(86, s)), s, p, o, m)\n# define BOOST_PP_FOR_86(s, p, o, m) BOOST_PP_FOR_86_C(BOOST_PP_BOOL(p(87, s)), s, p, o, m)\n# define BOOST_PP_FOR_87(s, p, o, m) BOOST_PP_FOR_87_C(BOOST_PP_BOOL(p(88, s)), s, p, o, m)\n# define BOOST_PP_FOR_88(s, p, o, m) BOOST_PP_FOR_88_C(BOOST_PP_BOOL(p(89, s)), s, p, o, m)\n# define BOOST_PP_FOR_89(s, p, o, m) BOOST_PP_FOR_89_C(BOOST_PP_BOOL(p(90, s)), s, p, o, m)\n# define BOOST_PP_FOR_90(s, p, o, m) BOOST_PP_FOR_90_C(BOOST_PP_BOOL(p(91, s)), s, p, o, m)\n# define BOOST_PP_FOR_91(s, p, o, m) BOOST_PP_FOR_91_C(BOOST_PP_BOOL(p(92, s)), s, p, o, m)\n# define BOOST_PP_FOR_92(s, p, o, m) BOOST_PP_FOR_92_C(BOOST_PP_BOOL(p(93, s)), s, p, o, m)\n# define BOOST_PP_FOR_93(s, p, o, m) BOOST_PP_FOR_93_C(BOOST_PP_BOOL(p(94, s)), s, p, o, m)\n# define BOOST_PP_FOR_94(s, p, o, m) BOOST_PP_FOR_94_C(BOOST_PP_BOOL(p(95, s)), s, p, o, m)\n# define BOOST_PP_FOR_95(s, p, o, m) BOOST_PP_FOR_95_C(BOOST_PP_BOOL(p(96, s)), s, p, o, m)\n# define BOOST_PP_FOR_96(s, p, o, m) BOOST_PP_FOR_96_C(BOOST_PP_BOOL(p(97, s)), s, p, o, m)\n# define BOOST_PP_FOR_97(s, p, o, m) BOOST_PP_FOR_97_C(BOOST_PP_BOOL(p(98, s)), s, p, o, m)\n# define BOOST_PP_FOR_98(s, p, o, m) BOOST_PP_FOR_98_C(BOOST_PP_BOOL(p(99, s)), s, p, o, m)\n# define BOOST_PP_FOR_99(s, p, o, m) BOOST_PP_FOR_99_C(BOOST_PP_BOOL(p(100, s)), s, p, o, m)\n# define BOOST_PP_FOR_100(s, p, o, m) BOOST_PP_FOR_100_C(BOOST_PP_BOOL(p(101, s)), s, p, o, m)\n# define BOOST_PP_FOR_101(s, p, o, m) BOOST_PP_FOR_101_C(BOOST_PP_BOOL(p(102, s)), s, p, o, m)\n# define BOOST_PP_FOR_102(s, p, o, m) BOOST_PP_FOR_102_C(BOOST_PP_BOOL(p(103, s)), s, p, o, m)\n# define BOOST_PP_FOR_103(s, p, o, m) BOOST_PP_FOR_103_C(BOOST_PP_BOOL(p(104, s)), s, p, o, m)\n# define BOOST_PP_FOR_104(s, p, o, m) BOOST_PP_FOR_104_C(BOOST_PP_BOOL(p(105, s)), s, p, o, m)\n# define BOOST_PP_FOR_105(s, p, o, m) BOOST_PP_FOR_105_C(BOOST_PP_BOOL(p(106, s)), s, p, o, m)\n# define BOOST_PP_FOR_106(s, p, o, m) BOOST_PP_FOR_106_C(BOOST_PP_BOOL(p(107, s)), s, p, o, m)\n# define BOOST_PP_FOR_107(s, p, o, m) BOOST_PP_FOR_107_C(BOOST_PP_BOOL(p(108, s)), s, p, o, m)\n# define BOOST_PP_FOR_108(s, p, o, m) BOOST_PP_FOR_108_C(BOOST_PP_BOOL(p(109, s)), s, p, o, m)\n# define BOOST_PP_FOR_109(s, p, o, m) BOOST_PP_FOR_109_C(BOOST_PP_BOOL(p(110, s)), s, p, o, m)\n# define BOOST_PP_FOR_110(s, p, o, m) BOOST_PP_FOR_110_C(BOOST_PP_BOOL(p(111, s)), s, p, o, m)\n# define BOOST_PP_FOR_111(s, p, o, m) BOOST_PP_FOR_111_C(BOOST_PP_BOOL(p(112, s)), s, p, o, m)\n# define BOOST_PP_FOR_112(s, p, o, m) BOOST_PP_FOR_112_C(BOOST_PP_BOOL(p(113, s)), s, p, o, m)\n# define BOOST_PP_FOR_113(s, p, o, m) BOOST_PP_FOR_113_C(BOOST_PP_BOOL(p(114, s)), s, p, o, m)\n# define BOOST_PP_FOR_114(s, p, o, m) BOOST_PP_FOR_114_C(BOOST_PP_BOOL(p(115, s)), s, p, o, m)\n# define BOOST_PP_FOR_115(s, p, o, m) BOOST_PP_FOR_115_C(BOOST_PP_BOOL(p(116, s)), s, p, o, m)\n# define BOOST_PP_FOR_116(s, p, o, m) BOOST_PP_FOR_116_C(BOOST_PP_BOOL(p(117, s)), s, p, o, m)\n# define BOOST_PP_FOR_117(s, p, o, m) BOOST_PP_FOR_117_C(BOOST_PP_BOOL(p(118, s)), s, p, o, m)\n# define BOOST_PP_FOR_118(s, p, o, m) BOOST_PP_FOR_118_C(BOOST_PP_BOOL(p(119, s)), s, p, o, m)\n# define BOOST_PP_FOR_119(s, p, o, m) BOOST_PP_FOR_119_C(BOOST_PP_BOOL(p(120, s)), s, p, o, m)\n# define BOOST_PP_FOR_120(s, p, o, m) BOOST_PP_FOR_120_C(BOOST_PP_BOOL(p(121, s)), s, p, o, m)\n# define BOOST_PP_FOR_121(s, p, o, m) BOOST_PP_FOR_121_C(BOOST_PP_BOOL(p(122, s)), s, p, o, m)\n# define BOOST_PP_FOR_122(s, p, o, m) BOOST_PP_FOR_122_C(BOOST_PP_BOOL(p(123, s)), s, p, o, m)\n# define BOOST_PP_FOR_123(s, p, o, m) BOOST_PP_FOR_123_C(BOOST_PP_BOOL(p(124, s)), s, p, o, m)\n# define BOOST_PP_FOR_124(s, p, o, m) BOOST_PP_FOR_124_C(BOOST_PP_BOOL(p(125, s)), s, p, o, m)\n# define BOOST_PP_FOR_125(s, p, o, m) BOOST_PP_FOR_125_C(BOOST_PP_BOOL(p(126, s)), s, p, o, m)\n# define BOOST_PP_FOR_126(s, p, o, m) BOOST_PP_FOR_126_C(BOOST_PP_BOOL(p(127, s)), s, p, o, m)\n# define BOOST_PP_FOR_127(s, p, o, m) BOOST_PP_FOR_127_C(BOOST_PP_BOOL(p(128, s)), s, p, o, m)\n# define BOOST_PP_FOR_128(s, p, o, m) BOOST_PP_FOR_128_C(BOOST_PP_BOOL(p(129, s)), s, p, o, m)\n# define BOOST_PP_FOR_129(s, p, o, m) BOOST_PP_FOR_129_C(BOOST_PP_BOOL(p(130, s)), s, p, o, m)\n# define BOOST_PP_FOR_130(s, p, o, m) BOOST_PP_FOR_130_C(BOOST_PP_BOOL(p(131, s)), s, p, o, m)\n# define BOOST_PP_FOR_131(s, p, o, m) BOOST_PP_FOR_131_C(BOOST_PP_BOOL(p(132, s)), s, p, o, m)\n# define BOOST_PP_FOR_132(s, p, o, m) BOOST_PP_FOR_132_C(BOOST_PP_BOOL(p(133, s)), s, p, o, m)\n# define BOOST_PP_FOR_133(s, p, o, m) BOOST_PP_FOR_133_C(BOOST_PP_BOOL(p(134, s)), s, p, o, m)\n# define BOOST_PP_FOR_134(s, p, o, m) BOOST_PP_FOR_134_C(BOOST_PP_BOOL(p(135, s)), s, p, o, m)\n# define BOOST_PP_FOR_135(s, p, o, m) BOOST_PP_FOR_135_C(BOOST_PP_BOOL(p(136, s)), s, p, o, m)\n# define BOOST_PP_FOR_136(s, p, o, m) BOOST_PP_FOR_136_C(BOOST_PP_BOOL(p(137, s)), s, p, o, m)\n# define BOOST_PP_FOR_137(s, p, o, m) BOOST_PP_FOR_137_C(BOOST_PP_BOOL(p(138, s)), s, p, o, m)\n# define BOOST_PP_FOR_138(s, p, o, m) BOOST_PP_FOR_138_C(BOOST_PP_BOOL(p(139, s)), s, p, o, m)\n# define BOOST_PP_FOR_139(s, p, o, m) BOOST_PP_FOR_139_C(BOOST_PP_BOOL(p(140, s)), s, p, o, m)\n# define BOOST_PP_FOR_140(s, p, o, m) BOOST_PP_FOR_140_C(BOOST_PP_BOOL(p(141, s)), s, p, o, m)\n# define BOOST_PP_FOR_141(s, p, o, m) BOOST_PP_FOR_141_C(BOOST_PP_BOOL(p(142, s)), s, p, o, m)\n# define BOOST_PP_FOR_142(s, p, o, m) BOOST_PP_FOR_142_C(BOOST_PP_BOOL(p(143, s)), s, p, o, m)\n# define BOOST_PP_FOR_143(s, p, o, m) BOOST_PP_FOR_143_C(BOOST_PP_BOOL(p(144, s)), s, p, o, m)\n# define BOOST_PP_FOR_144(s, p, o, m) BOOST_PP_FOR_144_C(BOOST_PP_BOOL(p(145, s)), s, p, o, m)\n# define BOOST_PP_FOR_145(s, p, o, m) BOOST_PP_FOR_145_C(BOOST_PP_BOOL(p(146, s)), s, p, o, m)\n# define BOOST_PP_FOR_146(s, p, o, m) BOOST_PP_FOR_146_C(BOOST_PP_BOOL(p(147, s)), s, p, o, m)\n# define BOOST_PP_FOR_147(s, p, o, m) BOOST_PP_FOR_147_C(BOOST_PP_BOOL(p(148, s)), s, p, o, m)\n# define BOOST_PP_FOR_148(s, p, o, m) BOOST_PP_FOR_148_C(BOOST_PP_BOOL(p(149, s)), s, p, o, m)\n# define BOOST_PP_FOR_149(s, p, o, m) BOOST_PP_FOR_149_C(BOOST_PP_BOOL(p(150, s)), s, p, o, m)\n# define BOOST_PP_FOR_150(s, p, o, m) BOOST_PP_FOR_150_C(BOOST_PP_BOOL(p(151, s)), s, p, o, m)\n# define BOOST_PP_FOR_151(s, p, o, m) BOOST_PP_FOR_151_C(BOOST_PP_BOOL(p(152, s)), s, p, o, m)\n# define BOOST_PP_FOR_152(s, p, o, m) BOOST_PP_FOR_152_C(BOOST_PP_BOOL(p(153, s)), s, p, o, m)\n# define BOOST_PP_FOR_153(s, p, o, m) BOOST_PP_FOR_153_C(BOOST_PP_BOOL(p(154, s)), s, p, o, m)\n# define BOOST_PP_FOR_154(s, p, o, m) BOOST_PP_FOR_154_C(BOOST_PP_BOOL(p(155, s)), s, p, o, m)\n# define BOOST_PP_FOR_155(s, p, o, m) BOOST_PP_FOR_155_C(BOOST_PP_BOOL(p(156, s)), s, p, o, m)\n# define BOOST_PP_FOR_156(s, p, o, m) BOOST_PP_FOR_156_C(BOOST_PP_BOOL(p(157, s)), s, p, o, m)\n# define BOOST_PP_FOR_157(s, p, o, m) BOOST_PP_FOR_157_C(BOOST_PP_BOOL(p(158, s)), s, p, o, m)\n# define BOOST_PP_FOR_158(s, p, o, m) BOOST_PP_FOR_158_C(BOOST_PP_BOOL(p(159, s)), s, p, o, m)\n# define BOOST_PP_FOR_159(s, p, o, m) BOOST_PP_FOR_159_C(BOOST_PP_BOOL(p(160, s)), s, p, o, m)\n# define BOOST_PP_FOR_160(s, p, o, m) BOOST_PP_FOR_160_C(BOOST_PP_BOOL(p(161, s)), s, p, o, m)\n# define BOOST_PP_FOR_161(s, p, o, m) BOOST_PP_FOR_161_C(BOOST_PP_BOOL(p(162, s)), s, p, o, m)\n# define BOOST_PP_FOR_162(s, p, o, m) BOOST_PP_FOR_162_C(BOOST_PP_BOOL(p(163, s)), s, p, o, m)\n# define BOOST_PP_FOR_163(s, p, o, m) BOOST_PP_FOR_163_C(BOOST_PP_BOOL(p(164, s)), s, p, o, m)\n# define BOOST_PP_FOR_164(s, p, o, m) BOOST_PP_FOR_164_C(BOOST_PP_BOOL(p(165, s)), s, p, o, m)\n# define BOOST_PP_FOR_165(s, p, o, m) BOOST_PP_FOR_165_C(BOOST_PP_BOOL(p(166, s)), s, p, o, m)\n# define BOOST_PP_FOR_166(s, p, o, m) BOOST_PP_FOR_166_C(BOOST_PP_BOOL(p(167, s)), s, p, o, m)\n# define BOOST_PP_FOR_167(s, p, o, m) BOOST_PP_FOR_167_C(BOOST_PP_BOOL(p(168, s)), s, p, o, m)\n# define BOOST_PP_FOR_168(s, p, o, m) BOOST_PP_FOR_168_C(BOOST_PP_BOOL(p(169, s)), s, p, o, m)\n# define BOOST_PP_FOR_169(s, p, o, m) BOOST_PP_FOR_169_C(BOOST_PP_BOOL(p(170, s)), s, p, o, m)\n# define BOOST_PP_FOR_170(s, p, o, m) BOOST_PP_FOR_170_C(BOOST_PP_BOOL(p(171, s)), s, p, o, m)\n# define BOOST_PP_FOR_171(s, p, o, m) BOOST_PP_FOR_171_C(BOOST_PP_BOOL(p(172, s)), s, p, o, m)\n# define BOOST_PP_FOR_172(s, p, o, m) BOOST_PP_FOR_172_C(BOOST_PP_BOOL(p(173, s)), s, p, o, m)\n# define BOOST_PP_FOR_173(s, p, o, m) BOOST_PP_FOR_173_C(BOOST_PP_BOOL(p(174, s)), s, p, o, m)\n# define BOOST_PP_FOR_174(s, p, o, m) BOOST_PP_FOR_174_C(BOOST_PP_BOOL(p(175, s)), s, p, o, m)\n# define BOOST_PP_FOR_175(s, p, o, m) BOOST_PP_FOR_175_C(BOOST_PP_BOOL(p(176, s)), s, p, o, m)\n# define BOOST_PP_FOR_176(s, p, o, m) BOOST_PP_FOR_176_C(BOOST_PP_BOOL(p(177, s)), s, p, o, m)\n# define BOOST_PP_FOR_177(s, p, o, m) BOOST_PP_FOR_177_C(BOOST_PP_BOOL(p(178, s)), s, p, o, m)\n# define BOOST_PP_FOR_178(s, p, o, m) BOOST_PP_FOR_178_C(BOOST_PP_BOOL(p(179, s)), s, p, o, m)\n# define BOOST_PP_FOR_179(s, p, o, m) BOOST_PP_FOR_179_C(BOOST_PP_BOOL(p(180, s)), s, p, o, m)\n# define BOOST_PP_FOR_180(s, p, o, m) BOOST_PP_FOR_180_C(BOOST_PP_BOOL(p(181, s)), s, p, o, m)\n# define BOOST_PP_FOR_181(s, p, o, m) BOOST_PP_FOR_181_C(BOOST_PP_BOOL(p(182, s)), s, p, o, m)\n# define BOOST_PP_FOR_182(s, p, o, m) BOOST_PP_FOR_182_C(BOOST_PP_BOOL(p(183, s)), s, p, o, m)\n# define BOOST_PP_FOR_183(s, p, o, m) BOOST_PP_FOR_183_C(BOOST_PP_BOOL(p(184, s)), s, p, o, m)\n# define BOOST_PP_FOR_184(s, p, o, m) BOOST_PP_FOR_184_C(BOOST_PP_BOOL(p(185, s)), s, p, o, m)\n# define BOOST_PP_FOR_185(s, p, o, m) BOOST_PP_FOR_185_C(BOOST_PP_BOOL(p(186, s)), s, p, o, m)\n# define BOOST_PP_FOR_186(s, p, o, m) BOOST_PP_FOR_186_C(BOOST_PP_BOOL(p(187, s)), s, p, o, m)\n# define BOOST_PP_FOR_187(s, p, o, m) BOOST_PP_FOR_187_C(BOOST_PP_BOOL(p(188, s)), s, p, o, m)\n# define BOOST_PP_FOR_188(s, p, o, m) BOOST_PP_FOR_188_C(BOOST_PP_BOOL(p(189, s)), s, p, o, m)\n# define BOOST_PP_FOR_189(s, p, o, m) BOOST_PP_FOR_189_C(BOOST_PP_BOOL(p(190, s)), s, p, o, m)\n# define BOOST_PP_FOR_190(s, p, o, m) BOOST_PP_FOR_190_C(BOOST_PP_BOOL(p(191, s)), s, p, o, m)\n# define BOOST_PP_FOR_191(s, p, o, m) BOOST_PP_FOR_191_C(BOOST_PP_BOOL(p(192, s)), s, p, o, m)\n# define BOOST_PP_FOR_192(s, p, o, m) BOOST_PP_FOR_192_C(BOOST_PP_BOOL(p(193, s)), s, p, o, m)\n# define BOOST_PP_FOR_193(s, p, o, m) BOOST_PP_FOR_193_C(BOOST_PP_BOOL(p(194, s)), s, p, o, m)\n# define BOOST_PP_FOR_194(s, p, o, m) BOOST_PP_FOR_194_C(BOOST_PP_BOOL(p(195, s)), s, p, o, m)\n# define BOOST_PP_FOR_195(s, p, o, m) BOOST_PP_FOR_195_C(BOOST_PP_BOOL(p(196, s)), s, p, o, m)\n# define BOOST_PP_FOR_196(s, p, o, m) BOOST_PP_FOR_196_C(BOOST_PP_BOOL(p(197, s)), s, p, o, m)\n# define BOOST_PP_FOR_197(s, p, o, m) BOOST_PP_FOR_197_C(BOOST_PP_BOOL(p(198, s)), s, p, o, m)\n# define BOOST_PP_FOR_198(s, p, o, m) BOOST_PP_FOR_198_C(BOOST_PP_BOOL(p(199, s)), s, p, o, m)\n# define BOOST_PP_FOR_199(s, p, o, m) BOOST_PP_FOR_199_C(BOOST_PP_BOOL(p(200, s)), s, p, o, m)\n# define BOOST_PP_FOR_200(s, p, o, m) BOOST_PP_FOR_200_C(BOOST_PP_BOOL(p(201, s)), s, p, o, m)\n# define BOOST_PP_FOR_201(s, p, o, m) BOOST_PP_FOR_201_C(BOOST_PP_BOOL(p(202, s)), s, p, o, m)\n# define BOOST_PP_FOR_202(s, p, o, m) BOOST_PP_FOR_202_C(BOOST_PP_BOOL(p(203, s)), s, p, o, m)\n# define BOOST_PP_FOR_203(s, p, o, m) BOOST_PP_FOR_203_C(BOOST_PP_BOOL(p(204, s)), s, p, o, m)\n# define BOOST_PP_FOR_204(s, p, o, m) BOOST_PP_FOR_204_C(BOOST_PP_BOOL(p(205, s)), s, p, o, m)\n# define BOOST_PP_FOR_205(s, p, o, m) BOOST_PP_FOR_205_C(BOOST_PP_BOOL(p(206, s)), s, p, o, m)\n# define BOOST_PP_FOR_206(s, p, o, m) BOOST_PP_FOR_206_C(BOOST_PP_BOOL(p(207, s)), s, p, o, m)\n# define BOOST_PP_FOR_207(s, p, o, m) BOOST_PP_FOR_207_C(BOOST_PP_BOOL(p(208, s)), s, p, o, m)\n# define BOOST_PP_FOR_208(s, p, o, m) BOOST_PP_FOR_208_C(BOOST_PP_BOOL(p(209, s)), s, p, o, m)\n# define BOOST_PP_FOR_209(s, p, o, m) BOOST_PP_FOR_209_C(BOOST_PP_BOOL(p(210, s)), s, p, o, m)\n# define BOOST_PP_FOR_210(s, p, o, m) BOOST_PP_FOR_210_C(BOOST_PP_BOOL(p(211, s)), s, p, o, m)\n# define BOOST_PP_FOR_211(s, p, o, m) BOOST_PP_FOR_211_C(BOOST_PP_BOOL(p(212, s)), s, p, o, m)\n# define BOOST_PP_FOR_212(s, p, o, m) BOOST_PP_FOR_212_C(BOOST_PP_BOOL(p(213, s)), s, p, o, m)\n# define BOOST_PP_FOR_213(s, p, o, m) BOOST_PP_FOR_213_C(BOOST_PP_BOOL(p(214, s)), s, p, o, m)\n# define BOOST_PP_FOR_214(s, p, o, m) BOOST_PP_FOR_214_C(BOOST_PP_BOOL(p(215, s)), s, p, o, m)\n# define BOOST_PP_FOR_215(s, p, o, m) BOOST_PP_FOR_215_C(BOOST_PP_BOOL(p(216, s)), s, p, o, m)\n# define BOOST_PP_FOR_216(s, p, o, m) BOOST_PP_FOR_216_C(BOOST_PP_BOOL(p(217, s)), s, p, o, m)\n# define BOOST_PP_FOR_217(s, p, o, m) BOOST_PP_FOR_217_C(BOOST_PP_BOOL(p(218, s)), s, p, o, m)\n# define BOOST_PP_FOR_218(s, p, o, m) BOOST_PP_FOR_218_C(BOOST_PP_BOOL(p(219, s)), s, p, o, m)\n# define BOOST_PP_FOR_219(s, p, o, m) BOOST_PP_FOR_219_C(BOOST_PP_BOOL(p(220, s)), s, p, o, m)\n# define BOOST_PP_FOR_220(s, p, o, m) BOOST_PP_FOR_220_C(BOOST_PP_BOOL(p(221, s)), s, p, o, m)\n# define BOOST_PP_FOR_221(s, p, o, m) BOOST_PP_FOR_221_C(BOOST_PP_BOOL(p(222, s)), s, p, o, m)\n# define BOOST_PP_FOR_222(s, p, o, m) BOOST_PP_FOR_222_C(BOOST_PP_BOOL(p(223, s)), s, p, o, m)\n# define BOOST_PP_FOR_223(s, p, o, m) BOOST_PP_FOR_223_C(BOOST_PP_BOOL(p(224, s)), s, p, o, m)\n# define BOOST_PP_FOR_224(s, p, o, m) BOOST_PP_FOR_224_C(BOOST_PP_BOOL(p(225, s)), s, p, o, m)\n# define BOOST_PP_FOR_225(s, p, o, m) BOOST_PP_FOR_225_C(BOOST_PP_BOOL(p(226, s)), s, p, o, m)\n# define BOOST_PP_FOR_226(s, p, o, m) BOOST_PP_FOR_226_C(BOOST_PP_BOOL(p(227, s)), s, p, o, m)\n# define BOOST_PP_FOR_227(s, p, o, m) BOOST_PP_FOR_227_C(BOOST_PP_BOOL(p(228, s)), s, p, o, m)\n# define BOOST_PP_FOR_228(s, p, o, m) BOOST_PP_FOR_228_C(BOOST_PP_BOOL(p(229, s)), s, p, o, m)\n# define BOOST_PP_FOR_229(s, p, o, m) BOOST_PP_FOR_229_C(BOOST_PP_BOOL(p(230, s)), s, p, o, m)\n# define BOOST_PP_FOR_230(s, p, o, m) BOOST_PP_FOR_230_C(BOOST_PP_BOOL(p(231, s)), s, p, o, m)\n# define BOOST_PP_FOR_231(s, p, o, m) BOOST_PP_FOR_231_C(BOOST_PP_BOOL(p(232, s)), s, p, o, m)\n# define BOOST_PP_FOR_232(s, p, o, m) BOOST_PP_FOR_232_C(BOOST_PP_BOOL(p(233, s)), s, p, o, m)\n# define BOOST_PP_FOR_233(s, p, o, m) BOOST_PP_FOR_233_C(BOOST_PP_BOOL(p(234, s)), s, p, o, m)\n# define BOOST_PP_FOR_234(s, p, o, m) BOOST_PP_FOR_234_C(BOOST_PP_BOOL(p(235, s)), s, p, o, m)\n# define BOOST_PP_FOR_235(s, p, o, m) BOOST_PP_FOR_235_C(BOOST_PP_BOOL(p(236, s)), s, p, o, m)\n# define BOOST_PP_FOR_236(s, p, o, m) BOOST_PP_FOR_236_C(BOOST_PP_BOOL(p(237, s)), s, p, o, m)\n# define BOOST_PP_FOR_237(s, p, o, m) BOOST_PP_FOR_237_C(BOOST_PP_BOOL(p(238, s)), s, p, o, m)\n# define BOOST_PP_FOR_238(s, p, o, m) BOOST_PP_FOR_238_C(BOOST_PP_BOOL(p(239, s)), s, p, o, m)\n# define BOOST_PP_FOR_239(s, p, o, m) BOOST_PP_FOR_239_C(BOOST_PP_BOOL(p(240, s)), s, p, o, m)\n# define BOOST_PP_FOR_240(s, p, o, m) BOOST_PP_FOR_240_C(BOOST_PP_BOOL(p(241, s)), s, p, o, m)\n# define BOOST_PP_FOR_241(s, p, o, m) BOOST_PP_FOR_241_C(BOOST_PP_BOOL(p(242, s)), s, p, o, m)\n# define BOOST_PP_FOR_242(s, p, o, m) BOOST_PP_FOR_242_C(BOOST_PP_BOOL(p(243, s)), s, p, o, m)\n# define BOOST_PP_FOR_243(s, p, o, m) BOOST_PP_FOR_243_C(BOOST_PP_BOOL(p(244, s)), s, p, o, m)\n# define BOOST_PP_FOR_244(s, p, o, m) BOOST_PP_FOR_244_C(BOOST_PP_BOOL(p(245, s)), s, p, o, m)\n# define BOOST_PP_FOR_245(s, p, o, m) BOOST_PP_FOR_245_C(BOOST_PP_BOOL(p(246, s)), s, p, o, m)\n# define BOOST_PP_FOR_246(s, p, o, m) BOOST_PP_FOR_246_C(BOOST_PP_BOOL(p(247, s)), s, p, o, m)\n# define BOOST_PP_FOR_247(s, p, o, m) BOOST_PP_FOR_247_C(BOOST_PP_BOOL(p(248, s)), s, p, o, m)\n# define BOOST_PP_FOR_248(s, p, o, m) BOOST_PP_FOR_248_C(BOOST_PP_BOOL(p(249, s)), s, p, o, m)\n# define BOOST_PP_FOR_249(s, p, o, m) BOOST_PP_FOR_249_C(BOOST_PP_BOOL(p(250, s)), s, p, o, m)\n# define BOOST_PP_FOR_250(s, p, o, m) BOOST_PP_FOR_250_C(BOOST_PP_BOOL(p(251, s)), s, p, o, m)\n# define BOOST_PP_FOR_251(s, p, o, m) BOOST_PP_FOR_251_C(BOOST_PP_BOOL(p(252, s)), s, p, o, m)\n# define BOOST_PP_FOR_252(s, p, o, m) BOOST_PP_FOR_252_C(BOOST_PP_BOOL(p(253, s)), s, p, o, m)\n# define BOOST_PP_FOR_253(s, p, o, m) BOOST_PP_FOR_253_C(BOOST_PP_BOOL(p(254, s)), s, p, o, m)\n# define BOOST_PP_FOR_254(s, p, o, m) BOOST_PP_FOR_254_C(BOOST_PP_BOOL(p(255, s)), s, p, o, m)\n# define BOOST_PP_FOR_255(s, p, o, m) BOOST_PP_FOR_255_C(BOOST_PP_BOOL(p(256, s)), s, p, o, m)\n# define BOOST_PP_FOR_256(s, p, o, m) BOOST_PP_FOR_256_C(BOOST_PP_BOOL(p(257, s)), s, p, o, m)\n#\n# define BOOST_PP_FOR_1_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(2, s) BOOST_PP_IIF(c, BOOST_PP_FOR_2, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(2, s), p, o, m)\n# define BOOST_PP_FOR_2_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(3, s) BOOST_PP_IIF(c, BOOST_PP_FOR_3, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(3, s), p, o, m)\n# define BOOST_PP_FOR_3_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(4, s) BOOST_PP_IIF(c, BOOST_PP_FOR_4, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(4, s), p, o, m)\n# define BOOST_PP_FOR_4_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(5, s) BOOST_PP_IIF(c, BOOST_PP_FOR_5, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(5, s), p, o, m)\n# define BOOST_PP_FOR_5_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(6, s) BOOST_PP_IIF(c, BOOST_PP_FOR_6, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(6, s), p, o, m)\n# define BOOST_PP_FOR_6_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(7, s) BOOST_PP_IIF(c, BOOST_PP_FOR_7, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(7, s), p, o, m)\n# define BOOST_PP_FOR_7_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(8, s) BOOST_PP_IIF(c, BOOST_PP_FOR_8, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(8, s), p, o, m)\n# define BOOST_PP_FOR_8_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(9, s) BOOST_PP_IIF(c, BOOST_PP_FOR_9, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(9, s), p, o, m)\n# define BOOST_PP_FOR_9_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(10, s) BOOST_PP_IIF(c, BOOST_PP_FOR_10, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(10, s), p, o, m)\n# define BOOST_PP_FOR_10_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(11, s) BOOST_PP_IIF(c, BOOST_PP_FOR_11, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(11, s), p, o, m)\n# define BOOST_PP_FOR_11_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(12, s) BOOST_PP_IIF(c, BOOST_PP_FOR_12, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(12, s), p, o, m)\n# define BOOST_PP_FOR_12_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(13, s) BOOST_PP_IIF(c, BOOST_PP_FOR_13, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(13, s), p, o, m)\n# define BOOST_PP_FOR_13_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(14, s) BOOST_PP_IIF(c, BOOST_PP_FOR_14, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(14, s), p, o, m)\n# define BOOST_PP_FOR_14_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(15, s) BOOST_PP_IIF(c, BOOST_PP_FOR_15, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(15, s), p, o, m)\n# define BOOST_PP_FOR_15_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(16, s) BOOST_PP_IIF(c, BOOST_PP_FOR_16, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(16, s), p, o, m)\n# define BOOST_PP_FOR_16_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(17, s) BOOST_PP_IIF(c, BOOST_PP_FOR_17, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(17, s), p, o, m)\n# define BOOST_PP_FOR_17_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(18, s) BOOST_PP_IIF(c, BOOST_PP_FOR_18, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(18, s), p, o, m)\n# define BOOST_PP_FOR_18_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(19, s) BOOST_PP_IIF(c, BOOST_PP_FOR_19, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(19, s), p, o, m)\n# define BOOST_PP_FOR_19_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(20, s) BOOST_PP_IIF(c, BOOST_PP_FOR_20, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(20, s), p, o, m)\n# define BOOST_PP_FOR_20_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(21, s) BOOST_PP_IIF(c, BOOST_PP_FOR_21, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(21, s), p, o, m)\n# define BOOST_PP_FOR_21_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(22, s) BOOST_PP_IIF(c, BOOST_PP_FOR_22, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(22, s), p, o, m)\n# define BOOST_PP_FOR_22_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(23, s) BOOST_PP_IIF(c, BOOST_PP_FOR_23, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(23, s), p, o, m)\n# define BOOST_PP_FOR_23_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(24, s) BOOST_PP_IIF(c, BOOST_PP_FOR_24, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(24, s), p, o, m)\n# define BOOST_PP_FOR_24_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(25, s) BOOST_PP_IIF(c, BOOST_PP_FOR_25, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(25, s), p, o, m)\n# define BOOST_PP_FOR_25_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(26, s) BOOST_PP_IIF(c, BOOST_PP_FOR_26, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(26, s), p, o, m)\n# define BOOST_PP_FOR_26_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(27, s) BOOST_PP_IIF(c, BOOST_PP_FOR_27, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(27, s), p, o, m)\n# define BOOST_PP_FOR_27_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(28, s) BOOST_PP_IIF(c, BOOST_PP_FOR_28, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(28, s), p, o, m)\n# define BOOST_PP_FOR_28_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(29, s) BOOST_PP_IIF(c, BOOST_PP_FOR_29, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(29, s), p, o, m)\n# define BOOST_PP_FOR_29_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(30, s) BOOST_PP_IIF(c, BOOST_PP_FOR_30, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(30, s), p, o, m)\n# define BOOST_PP_FOR_30_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(31, s) BOOST_PP_IIF(c, BOOST_PP_FOR_31, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(31, s), p, o, m)\n# define BOOST_PP_FOR_31_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(32, s) BOOST_PP_IIF(c, BOOST_PP_FOR_32, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(32, s), p, o, m)\n# define BOOST_PP_FOR_32_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(33, s) BOOST_PP_IIF(c, BOOST_PP_FOR_33, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(33, s), p, o, m)\n# define BOOST_PP_FOR_33_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(34, s) BOOST_PP_IIF(c, BOOST_PP_FOR_34, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(34, s), p, o, m)\n# define BOOST_PP_FOR_34_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(35, s) BOOST_PP_IIF(c, BOOST_PP_FOR_35, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(35, s), p, o, m)\n# define BOOST_PP_FOR_35_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(36, s) BOOST_PP_IIF(c, BOOST_PP_FOR_36, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(36, s), p, o, m)\n# define BOOST_PP_FOR_36_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(37, s) BOOST_PP_IIF(c, BOOST_PP_FOR_37, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(37, s), p, o, m)\n# define BOOST_PP_FOR_37_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(38, s) BOOST_PP_IIF(c, BOOST_PP_FOR_38, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(38, s), p, o, m)\n# define BOOST_PP_FOR_38_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(39, s) BOOST_PP_IIF(c, BOOST_PP_FOR_39, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(39, s), p, o, m)\n# define BOOST_PP_FOR_39_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(40, s) BOOST_PP_IIF(c, BOOST_PP_FOR_40, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(40, s), p, o, m)\n# define BOOST_PP_FOR_40_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(41, s) BOOST_PP_IIF(c, BOOST_PP_FOR_41, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(41, s), p, o, m)\n# define BOOST_PP_FOR_41_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(42, s) BOOST_PP_IIF(c, BOOST_PP_FOR_42, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(42, s), p, o, m)\n# define BOOST_PP_FOR_42_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(43, s) BOOST_PP_IIF(c, BOOST_PP_FOR_43, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(43, s), p, o, m)\n# define BOOST_PP_FOR_43_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(44, s) BOOST_PP_IIF(c, BOOST_PP_FOR_44, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(44, s), p, o, m)\n# define BOOST_PP_FOR_44_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(45, s) BOOST_PP_IIF(c, BOOST_PP_FOR_45, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(45, s), p, o, m)\n# define BOOST_PP_FOR_45_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(46, s) BOOST_PP_IIF(c, BOOST_PP_FOR_46, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(46, s), p, o, m)\n# define BOOST_PP_FOR_46_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(47, s) BOOST_PP_IIF(c, BOOST_PP_FOR_47, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(47, s), p, o, m)\n# define BOOST_PP_FOR_47_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(48, s) BOOST_PP_IIF(c, BOOST_PP_FOR_48, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(48, s), p, o, m)\n# define BOOST_PP_FOR_48_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(49, s) BOOST_PP_IIF(c, BOOST_PP_FOR_49, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(49, s), p, o, m)\n# define BOOST_PP_FOR_49_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(50, s) BOOST_PP_IIF(c, BOOST_PP_FOR_50, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(50, s), p, o, m)\n# define BOOST_PP_FOR_50_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(51, s) BOOST_PP_IIF(c, BOOST_PP_FOR_51, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(51, s), p, o, m)\n# define BOOST_PP_FOR_51_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(52, s) BOOST_PP_IIF(c, BOOST_PP_FOR_52, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(52, s), p, o, m)\n# define BOOST_PP_FOR_52_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(53, s) BOOST_PP_IIF(c, BOOST_PP_FOR_53, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(53, s), p, o, m)\n# define BOOST_PP_FOR_53_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(54, s) BOOST_PP_IIF(c, BOOST_PP_FOR_54, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(54, s), p, o, m)\n# define BOOST_PP_FOR_54_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(55, s) BOOST_PP_IIF(c, BOOST_PP_FOR_55, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(55, s), p, o, m)\n# define BOOST_PP_FOR_55_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(56, s) BOOST_PP_IIF(c, BOOST_PP_FOR_56, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(56, s), p, o, m)\n# define BOOST_PP_FOR_56_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(57, s) BOOST_PP_IIF(c, BOOST_PP_FOR_57, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(57, s), p, o, m)\n# define BOOST_PP_FOR_57_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(58, s) BOOST_PP_IIF(c, BOOST_PP_FOR_58, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(58, s), p, o, m)\n# define BOOST_PP_FOR_58_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(59, s) BOOST_PP_IIF(c, BOOST_PP_FOR_59, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(59, s), p, o, m)\n# define BOOST_PP_FOR_59_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(60, s) BOOST_PP_IIF(c, BOOST_PP_FOR_60, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(60, s), p, o, m)\n# define BOOST_PP_FOR_60_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(61, s) BOOST_PP_IIF(c, BOOST_PP_FOR_61, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(61, s), p, o, m)\n# define BOOST_PP_FOR_61_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(62, s) BOOST_PP_IIF(c, BOOST_PP_FOR_62, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(62, s), p, o, m)\n# define BOOST_PP_FOR_62_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(63, s) BOOST_PP_IIF(c, BOOST_PP_FOR_63, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(63, s), p, o, m)\n# define BOOST_PP_FOR_63_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(64, s) BOOST_PP_IIF(c, BOOST_PP_FOR_64, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(64, s), p, o, m)\n# define BOOST_PP_FOR_64_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(65, s) BOOST_PP_IIF(c, BOOST_PP_FOR_65, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(65, s), p, o, m)\n# define BOOST_PP_FOR_65_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(66, s) BOOST_PP_IIF(c, BOOST_PP_FOR_66, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(66, s), p, o, m)\n# define BOOST_PP_FOR_66_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(67, s) BOOST_PP_IIF(c, BOOST_PP_FOR_67, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(67, s), p, o, m)\n# define BOOST_PP_FOR_67_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(68, s) BOOST_PP_IIF(c, BOOST_PP_FOR_68, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(68, s), p, o, m)\n# define BOOST_PP_FOR_68_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(69, s) BOOST_PP_IIF(c, BOOST_PP_FOR_69, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(69, s), p, o, m)\n# define BOOST_PP_FOR_69_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(70, s) BOOST_PP_IIF(c, BOOST_PP_FOR_70, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(70, s), p, o, m)\n# define BOOST_PP_FOR_70_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(71, s) BOOST_PP_IIF(c, BOOST_PP_FOR_71, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(71, s), p, o, m)\n# define BOOST_PP_FOR_71_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(72, s) BOOST_PP_IIF(c, BOOST_PP_FOR_72, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(72, s), p, o, m)\n# define BOOST_PP_FOR_72_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(73, s) BOOST_PP_IIF(c, BOOST_PP_FOR_73, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(73, s), p, o, m)\n# define BOOST_PP_FOR_73_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(74, s) BOOST_PP_IIF(c, BOOST_PP_FOR_74, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(74, s), p, o, m)\n# define BOOST_PP_FOR_74_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(75, s) BOOST_PP_IIF(c, BOOST_PP_FOR_75, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(75, s), p, o, m)\n# define BOOST_PP_FOR_75_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(76, s) BOOST_PP_IIF(c, BOOST_PP_FOR_76, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(76, s), p, o, m)\n# define BOOST_PP_FOR_76_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(77, s) BOOST_PP_IIF(c, BOOST_PP_FOR_77, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(77, s), p, o, m)\n# define BOOST_PP_FOR_77_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(78, s) BOOST_PP_IIF(c, BOOST_PP_FOR_78, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(78, s), p, o, m)\n# define BOOST_PP_FOR_78_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(79, s) BOOST_PP_IIF(c, BOOST_PP_FOR_79, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(79, s), p, o, m)\n# define BOOST_PP_FOR_79_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(80, s) BOOST_PP_IIF(c, BOOST_PP_FOR_80, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(80, s), p, o, m)\n# define BOOST_PP_FOR_80_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(81, s) BOOST_PP_IIF(c, BOOST_PP_FOR_81, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(81, s), p, o, m)\n# define BOOST_PP_FOR_81_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(82, s) BOOST_PP_IIF(c, BOOST_PP_FOR_82, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(82, s), p, o, m)\n# define BOOST_PP_FOR_82_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(83, s) BOOST_PP_IIF(c, BOOST_PP_FOR_83, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(83, s), p, o, m)\n# define BOOST_PP_FOR_83_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(84, s) BOOST_PP_IIF(c, BOOST_PP_FOR_84, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(84, s), p, o, m)\n# define BOOST_PP_FOR_84_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(85, s) BOOST_PP_IIF(c, BOOST_PP_FOR_85, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(85, s), p, o, m)\n# define BOOST_PP_FOR_85_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(86, s) BOOST_PP_IIF(c, BOOST_PP_FOR_86, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(86, s), p, o, m)\n# define BOOST_PP_FOR_86_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(87, s) BOOST_PP_IIF(c, BOOST_PP_FOR_87, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(87, s), p, o, m)\n# define BOOST_PP_FOR_87_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(88, s) BOOST_PP_IIF(c, BOOST_PP_FOR_88, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(88, s), p, o, m)\n# define BOOST_PP_FOR_88_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(89, s) BOOST_PP_IIF(c, BOOST_PP_FOR_89, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(89, s), p, o, m)\n# define BOOST_PP_FOR_89_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(90, s) BOOST_PP_IIF(c, BOOST_PP_FOR_90, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(90, s), p, o, m)\n# define BOOST_PP_FOR_90_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(91, s) BOOST_PP_IIF(c, BOOST_PP_FOR_91, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(91, s), p, o, m)\n# define BOOST_PP_FOR_91_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(92, s) BOOST_PP_IIF(c, BOOST_PP_FOR_92, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(92, s), p, o, m)\n# define BOOST_PP_FOR_92_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(93, s) BOOST_PP_IIF(c, BOOST_PP_FOR_93, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(93, s), p, o, m)\n# define BOOST_PP_FOR_93_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(94, s) BOOST_PP_IIF(c, BOOST_PP_FOR_94, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(94, s), p, o, m)\n# define BOOST_PP_FOR_94_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(95, s) BOOST_PP_IIF(c, BOOST_PP_FOR_95, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(95, s), p, o, m)\n# define BOOST_PP_FOR_95_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(96, s) BOOST_PP_IIF(c, BOOST_PP_FOR_96, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(96, s), p, o, m)\n# define BOOST_PP_FOR_96_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(97, s) BOOST_PP_IIF(c, BOOST_PP_FOR_97, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(97, s), p, o, m)\n# define BOOST_PP_FOR_97_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(98, s) BOOST_PP_IIF(c, BOOST_PP_FOR_98, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(98, s), p, o, m)\n# define BOOST_PP_FOR_98_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(99, s) BOOST_PP_IIF(c, BOOST_PP_FOR_99, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(99, s), p, o, m)\n# define BOOST_PP_FOR_99_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(100, s) BOOST_PP_IIF(c, BOOST_PP_FOR_100, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(100, s), p, o, m)\n# define BOOST_PP_FOR_100_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(101, s) BOOST_PP_IIF(c, BOOST_PP_FOR_101, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(101, s), p, o, m)\n# define BOOST_PP_FOR_101_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(102, s) BOOST_PP_IIF(c, BOOST_PP_FOR_102, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(102, s), p, o, m)\n# define BOOST_PP_FOR_102_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(103, s) BOOST_PP_IIF(c, BOOST_PP_FOR_103, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(103, s), p, o, m)\n# define BOOST_PP_FOR_103_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(104, s) BOOST_PP_IIF(c, BOOST_PP_FOR_104, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(104, s), p, o, m)\n# define BOOST_PP_FOR_104_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(105, s) BOOST_PP_IIF(c, BOOST_PP_FOR_105, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(105, s), p, o, m)\n# define BOOST_PP_FOR_105_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(106, s) BOOST_PP_IIF(c, BOOST_PP_FOR_106, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(106, s), p, o, m)\n# define BOOST_PP_FOR_106_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(107, s) BOOST_PP_IIF(c, BOOST_PP_FOR_107, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(107, s), p, o, m)\n# define BOOST_PP_FOR_107_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(108, s) BOOST_PP_IIF(c, BOOST_PP_FOR_108, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(108, s), p, o, m)\n# define BOOST_PP_FOR_108_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(109, s) BOOST_PP_IIF(c, BOOST_PP_FOR_109, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(109, s), p, o, m)\n# define BOOST_PP_FOR_109_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(110, s) BOOST_PP_IIF(c, BOOST_PP_FOR_110, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(110, s), p, o, m)\n# define BOOST_PP_FOR_110_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(111, s) BOOST_PP_IIF(c, BOOST_PP_FOR_111, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(111, s), p, o, m)\n# define BOOST_PP_FOR_111_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(112, s) BOOST_PP_IIF(c, BOOST_PP_FOR_112, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(112, s), p, o, m)\n# define BOOST_PP_FOR_112_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(113, s) BOOST_PP_IIF(c, BOOST_PP_FOR_113, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(113, s), p, o, m)\n# define BOOST_PP_FOR_113_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(114, s) BOOST_PP_IIF(c, BOOST_PP_FOR_114, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(114, s), p, o, m)\n# define BOOST_PP_FOR_114_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(115, s) BOOST_PP_IIF(c, BOOST_PP_FOR_115, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(115, s), p, o, m)\n# define BOOST_PP_FOR_115_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(116, s) BOOST_PP_IIF(c, BOOST_PP_FOR_116, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(116, s), p, o, m)\n# define BOOST_PP_FOR_116_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(117, s) BOOST_PP_IIF(c, BOOST_PP_FOR_117, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(117, s), p, o, m)\n# define BOOST_PP_FOR_117_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(118, s) BOOST_PP_IIF(c, BOOST_PP_FOR_118, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(118, s), p, o, m)\n# define BOOST_PP_FOR_118_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(119, s) BOOST_PP_IIF(c, BOOST_PP_FOR_119, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(119, s), p, o, m)\n# define BOOST_PP_FOR_119_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(120, s) BOOST_PP_IIF(c, BOOST_PP_FOR_120, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(120, s), p, o, m)\n# define BOOST_PP_FOR_120_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(121, s) BOOST_PP_IIF(c, BOOST_PP_FOR_121, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(121, s), p, o, m)\n# define BOOST_PP_FOR_121_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(122, s) BOOST_PP_IIF(c, BOOST_PP_FOR_122, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(122, s), p, o, m)\n# define BOOST_PP_FOR_122_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(123, s) BOOST_PP_IIF(c, BOOST_PP_FOR_123, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(123, s), p, o, m)\n# define BOOST_PP_FOR_123_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(124, s) BOOST_PP_IIF(c, BOOST_PP_FOR_124, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(124, s), p, o, m)\n# define BOOST_PP_FOR_124_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(125, s) BOOST_PP_IIF(c, BOOST_PP_FOR_125, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(125, s), p, o, m)\n# define BOOST_PP_FOR_125_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(126, s) BOOST_PP_IIF(c, BOOST_PP_FOR_126, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(126, s), p, o, m)\n# define BOOST_PP_FOR_126_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(127, s) BOOST_PP_IIF(c, BOOST_PP_FOR_127, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(127, s), p, o, m)\n# define BOOST_PP_FOR_127_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(128, s) BOOST_PP_IIF(c, BOOST_PP_FOR_128, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(128, s), p, o, m)\n# define BOOST_PP_FOR_128_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(129, s) BOOST_PP_IIF(c, BOOST_PP_FOR_129, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(129, s), p, o, m)\n# define BOOST_PP_FOR_129_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(130, s) BOOST_PP_IIF(c, BOOST_PP_FOR_130, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(130, s), p, o, m)\n# define BOOST_PP_FOR_130_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(131, s) BOOST_PP_IIF(c, BOOST_PP_FOR_131, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(131, s), p, o, m)\n# define BOOST_PP_FOR_131_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(132, s) BOOST_PP_IIF(c, BOOST_PP_FOR_132, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(132, s), p, o, m)\n# define BOOST_PP_FOR_132_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(133, s) BOOST_PP_IIF(c, BOOST_PP_FOR_133, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(133, s), p, o, m)\n# define BOOST_PP_FOR_133_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(134, s) BOOST_PP_IIF(c, BOOST_PP_FOR_134, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(134, s), p, o, m)\n# define BOOST_PP_FOR_134_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(135, s) BOOST_PP_IIF(c, BOOST_PP_FOR_135, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(135, s), p, o, m)\n# define BOOST_PP_FOR_135_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(136, s) BOOST_PP_IIF(c, BOOST_PP_FOR_136, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(136, s), p, o, m)\n# define BOOST_PP_FOR_136_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(137, s) BOOST_PP_IIF(c, BOOST_PP_FOR_137, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(137, s), p, o, m)\n# define BOOST_PP_FOR_137_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(138, s) BOOST_PP_IIF(c, BOOST_PP_FOR_138, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(138, s), p, o, m)\n# define BOOST_PP_FOR_138_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(139, s) BOOST_PP_IIF(c, BOOST_PP_FOR_139, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(139, s), p, o, m)\n# define BOOST_PP_FOR_139_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(140, s) BOOST_PP_IIF(c, BOOST_PP_FOR_140, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(140, s), p, o, m)\n# define BOOST_PP_FOR_140_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(141, s) BOOST_PP_IIF(c, BOOST_PP_FOR_141, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(141, s), p, o, m)\n# define BOOST_PP_FOR_141_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(142, s) BOOST_PP_IIF(c, BOOST_PP_FOR_142, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(142, s), p, o, m)\n# define BOOST_PP_FOR_142_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(143, s) BOOST_PP_IIF(c, BOOST_PP_FOR_143, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(143, s), p, o, m)\n# define BOOST_PP_FOR_143_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(144, s) BOOST_PP_IIF(c, BOOST_PP_FOR_144, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(144, s), p, o, m)\n# define BOOST_PP_FOR_144_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(145, s) BOOST_PP_IIF(c, BOOST_PP_FOR_145, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(145, s), p, o, m)\n# define BOOST_PP_FOR_145_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(146, s) BOOST_PP_IIF(c, BOOST_PP_FOR_146, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(146, s), p, o, m)\n# define BOOST_PP_FOR_146_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(147, s) BOOST_PP_IIF(c, BOOST_PP_FOR_147, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(147, s), p, o, m)\n# define BOOST_PP_FOR_147_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(148, s) BOOST_PP_IIF(c, BOOST_PP_FOR_148, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(148, s), p, o, m)\n# define BOOST_PP_FOR_148_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(149, s) BOOST_PP_IIF(c, BOOST_PP_FOR_149, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(149, s), p, o, m)\n# define BOOST_PP_FOR_149_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(150, s) BOOST_PP_IIF(c, BOOST_PP_FOR_150, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(150, s), p, o, m)\n# define BOOST_PP_FOR_150_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(151, s) BOOST_PP_IIF(c, BOOST_PP_FOR_151, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(151, s), p, o, m)\n# define BOOST_PP_FOR_151_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(152, s) BOOST_PP_IIF(c, BOOST_PP_FOR_152, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(152, s), p, o, m)\n# define BOOST_PP_FOR_152_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(153, s) BOOST_PP_IIF(c, BOOST_PP_FOR_153, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(153, s), p, o, m)\n# define BOOST_PP_FOR_153_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(154, s) BOOST_PP_IIF(c, BOOST_PP_FOR_154, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(154, s), p, o, m)\n# define BOOST_PP_FOR_154_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(155, s) BOOST_PP_IIF(c, BOOST_PP_FOR_155, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(155, s), p, o, m)\n# define BOOST_PP_FOR_155_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(156, s) BOOST_PP_IIF(c, BOOST_PP_FOR_156, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(156, s), p, o, m)\n# define BOOST_PP_FOR_156_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(157, s) BOOST_PP_IIF(c, BOOST_PP_FOR_157, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(157, s), p, o, m)\n# define BOOST_PP_FOR_157_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(158, s) BOOST_PP_IIF(c, BOOST_PP_FOR_158, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(158, s), p, o, m)\n# define BOOST_PP_FOR_158_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(159, s) BOOST_PP_IIF(c, BOOST_PP_FOR_159, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(159, s), p, o, m)\n# define BOOST_PP_FOR_159_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(160, s) BOOST_PP_IIF(c, BOOST_PP_FOR_160, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(160, s), p, o, m)\n# define BOOST_PP_FOR_160_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(161, s) BOOST_PP_IIF(c, BOOST_PP_FOR_161, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(161, s), p, o, m)\n# define BOOST_PP_FOR_161_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(162, s) BOOST_PP_IIF(c, BOOST_PP_FOR_162, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(162, s), p, o, m)\n# define BOOST_PP_FOR_162_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(163, s) BOOST_PP_IIF(c, BOOST_PP_FOR_163, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(163, s), p, o, m)\n# define BOOST_PP_FOR_163_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(164, s) BOOST_PP_IIF(c, BOOST_PP_FOR_164, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(164, s), p, o, m)\n# define BOOST_PP_FOR_164_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(165, s) BOOST_PP_IIF(c, BOOST_PP_FOR_165, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(165, s), p, o, m)\n# define BOOST_PP_FOR_165_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(166, s) BOOST_PP_IIF(c, BOOST_PP_FOR_166, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(166, s), p, o, m)\n# define BOOST_PP_FOR_166_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(167, s) BOOST_PP_IIF(c, BOOST_PP_FOR_167, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(167, s), p, o, m)\n# define BOOST_PP_FOR_167_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(168, s) BOOST_PP_IIF(c, BOOST_PP_FOR_168, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(168, s), p, o, m)\n# define BOOST_PP_FOR_168_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(169, s) BOOST_PP_IIF(c, BOOST_PP_FOR_169, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(169, s), p, o, m)\n# define BOOST_PP_FOR_169_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(170, s) BOOST_PP_IIF(c, BOOST_PP_FOR_170, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(170, s), p, o, m)\n# define BOOST_PP_FOR_170_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(171, s) BOOST_PP_IIF(c, BOOST_PP_FOR_171, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(171, s), p, o, m)\n# define BOOST_PP_FOR_171_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(172, s) BOOST_PP_IIF(c, BOOST_PP_FOR_172, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(172, s), p, o, m)\n# define BOOST_PP_FOR_172_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(173, s) BOOST_PP_IIF(c, BOOST_PP_FOR_173, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(173, s), p, o, m)\n# define BOOST_PP_FOR_173_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(174, s) BOOST_PP_IIF(c, BOOST_PP_FOR_174, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(174, s), p, o, m)\n# define BOOST_PP_FOR_174_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(175, s) BOOST_PP_IIF(c, BOOST_PP_FOR_175, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(175, s), p, o, m)\n# define BOOST_PP_FOR_175_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(176, s) BOOST_PP_IIF(c, BOOST_PP_FOR_176, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(176, s), p, o, m)\n# define BOOST_PP_FOR_176_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(177, s) BOOST_PP_IIF(c, BOOST_PP_FOR_177, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(177, s), p, o, m)\n# define BOOST_PP_FOR_177_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(178, s) BOOST_PP_IIF(c, BOOST_PP_FOR_178, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(178, s), p, o, m)\n# define BOOST_PP_FOR_178_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(179, s) BOOST_PP_IIF(c, BOOST_PP_FOR_179, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(179, s), p, o, m)\n# define BOOST_PP_FOR_179_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(180, s) BOOST_PP_IIF(c, BOOST_PP_FOR_180, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(180, s), p, o, m)\n# define BOOST_PP_FOR_180_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(181, s) BOOST_PP_IIF(c, BOOST_PP_FOR_181, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(181, s), p, o, m)\n# define BOOST_PP_FOR_181_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(182, s) BOOST_PP_IIF(c, BOOST_PP_FOR_182, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(182, s), p, o, m)\n# define BOOST_PP_FOR_182_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(183, s) BOOST_PP_IIF(c, BOOST_PP_FOR_183, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(183, s), p, o, m)\n# define BOOST_PP_FOR_183_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(184, s) BOOST_PP_IIF(c, BOOST_PP_FOR_184, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(184, s), p, o, m)\n# define BOOST_PP_FOR_184_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(185, s) BOOST_PP_IIF(c, BOOST_PP_FOR_185, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(185, s), p, o, m)\n# define BOOST_PP_FOR_185_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(186, s) BOOST_PP_IIF(c, BOOST_PP_FOR_186, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(186, s), p, o, m)\n# define BOOST_PP_FOR_186_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(187, s) BOOST_PP_IIF(c, BOOST_PP_FOR_187, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(187, s), p, o, m)\n# define BOOST_PP_FOR_187_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(188, s) BOOST_PP_IIF(c, BOOST_PP_FOR_188, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(188, s), p, o, m)\n# define BOOST_PP_FOR_188_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(189, s) BOOST_PP_IIF(c, BOOST_PP_FOR_189, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(189, s), p, o, m)\n# define BOOST_PP_FOR_189_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(190, s) BOOST_PP_IIF(c, BOOST_PP_FOR_190, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(190, s), p, o, m)\n# define BOOST_PP_FOR_190_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(191, s) BOOST_PP_IIF(c, BOOST_PP_FOR_191, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(191, s), p, o, m)\n# define BOOST_PP_FOR_191_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(192, s) BOOST_PP_IIF(c, BOOST_PP_FOR_192, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(192, s), p, o, m)\n# define BOOST_PP_FOR_192_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(193, s) BOOST_PP_IIF(c, BOOST_PP_FOR_193, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(193, s), p, o, m)\n# define BOOST_PP_FOR_193_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(194, s) BOOST_PP_IIF(c, BOOST_PP_FOR_194, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(194, s), p, o, m)\n# define BOOST_PP_FOR_194_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(195, s) BOOST_PP_IIF(c, BOOST_PP_FOR_195, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(195, s), p, o, m)\n# define BOOST_PP_FOR_195_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(196, s) BOOST_PP_IIF(c, BOOST_PP_FOR_196, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(196, s), p, o, m)\n# define BOOST_PP_FOR_196_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(197, s) BOOST_PP_IIF(c, BOOST_PP_FOR_197, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(197, s), p, o, m)\n# define BOOST_PP_FOR_197_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(198, s) BOOST_PP_IIF(c, BOOST_PP_FOR_198, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(198, s), p, o, m)\n# define BOOST_PP_FOR_198_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(199, s) BOOST_PP_IIF(c, BOOST_PP_FOR_199, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(199, s), p, o, m)\n# define BOOST_PP_FOR_199_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(200, s) BOOST_PP_IIF(c, BOOST_PP_FOR_200, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(200, s), p, o, m)\n# define BOOST_PP_FOR_200_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(201, s) BOOST_PP_IIF(c, BOOST_PP_FOR_201, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(201, s), p, o, m)\n# define BOOST_PP_FOR_201_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(202, s) BOOST_PP_IIF(c, BOOST_PP_FOR_202, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(202, s), p, o, m)\n# define BOOST_PP_FOR_202_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(203, s) BOOST_PP_IIF(c, BOOST_PP_FOR_203, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(203, s), p, o, m)\n# define BOOST_PP_FOR_203_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(204, s) BOOST_PP_IIF(c, BOOST_PP_FOR_204, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(204, s), p, o, m)\n# define BOOST_PP_FOR_204_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(205, s) BOOST_PP_IIF(c, BOOST_PP_FOR_205, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(205, s), p, o, m)\n# define BOOST_PP_FOR_205_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(206, s) BOOST_PP_IIF(c, BOOST_PP_FOR_206, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(206, s), p, o, m)\n# define BOOST_PP_FOR_206_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(207, s) BOOST_PP_IIF(c, BOOST_PP_FOR_207, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(207, s), p, o, m)\n# define BOOST_PP_FOR_207_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(208, s) BOOST_PP_IIF(c, BOOST_PP_FOR_208, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(208, s), p, o, m)\n# define BOOST_PP_FOR_208_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(209, s) BOOST_PP_IIF(c, BOOST_PP_FOR_209, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(209, s), p, o, m)\n# define BOOST_PP_FOR_209_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(210, s) BOOST_PP_IIF(c, BOOST_PP_FOR_210, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(210, s), p, o, m)\n# define BOOST_PP_FOR_210_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(211, s) BOOST_PP_IIF(c, BOOST_PP_FOR_211, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(211, s), p, o, m)\n# define BOOST_PP_FOR_211_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(212, s) BOOST_PP_IIF(c, BOOST_PP_FOR_212, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(212, s), p, o, m)\n# define BOOST_PP_FOR_212_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(213, s) BOOST_PP_IIF(c, BOOST_PP_FOR_213, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(213, s), p, o, m)\n# define BOOST_PP_FOR_213_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(214, s) BOOST_PP_IIF(c, BOOST_PP_FOR_214, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(214, s), p, o, m)\n# define BOOST_PP_FOR_214_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(215, s) BOOST_PP_IIF(c, BOOST_PP_FOR_215, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(215, s), p, o, m)\n# define BOOST_PP_FOR_215_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(216, s) BOOST_PP_IIF(c, BOOST_PP_FOR_216, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(216, s), p, o, m)\n# define BOOST_PP_FOR_216_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(217, s) BOOST_PP_IIF(c, BOOST_PP_FOR_217, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(217, s), p, o, m)\n# define BOOST_PP_FOR_217_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(218, s) BOOST_PP_IIF(c, BOOST_PP_FOR_218, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(218, s), p, o, m)\n# define BOOST_PP_FOR_218_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(219, s) BOOST_PP_IIF(c, BOOST_PP_FOR_219, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(219, s), p, o, m)\n# define BOOST_PP_FOR_219_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(220, s) BOOST_PP_IIF(c, BOOST_PP_FOR_220, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(220, s), p, o, m)\n# define BOOST_PP_FOR_220_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(221, s) BOOST_PP_IIF(c, BOOST_PP_FOR_221, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(221, s), p, o, m)\n# define BOOST_PP_FOR_221_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(222, s) BOOST_PP_IIF(c, BOOST_PP_FOR_222, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(222, s), p, o, m)\n# define BOOST_PP_FOR_222_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(223, s) BOOST_PP_IIF(c, BOOST_PP_FOR_223, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(223, s), p, o, m)\n# define BOOST_PP_FOR_223_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(224, s) BOOST_PP_IIF(c, BOOST_PP_FOR_224, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(224, s), p, o, m)\n# define BOOST_PP_FOR_224_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(225, s) BOOST_PP_IIF(c, BOOST_PP_FOR_225, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(225, s), p, o, m)\n# define BOOST_PP_FOR_225_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(226, s) BOOST_PP_IIF(c, BOOST_PP_FOR_226, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(226, s), p, o, m)\n# define BOOST_PP_FOR_226_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(227, s) BOOST_PP_IIF(c, BOOST_PP_FOR_227, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(227, s), p, o, m)\n# define BOOST_PP_FOR_227_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(228, s) BOOST_PP_IIF(c, BOOST_PP_FOR_228, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(228, s), p, o, m)\n# define BOOST_PP_FOR_228_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(229, s) BOOST_PP_IIF(c, BOOST_PP_FOR_229, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(229, s), p, o, m)\n# define BOOST_PP_FOR_229_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(230, s) BOOST_PP_IIF(c, BOOST_PP_FOR_230, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(230, s), p, o, m)\n# define BOOST_PP_FOR_230_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(231, s) BOOST_PP_IIF(c, BOOST_PP_FOR_231, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(231, s), p, o, m)\n# define BOOST_PP_FOR_231_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(232, s) BOOST_PP_IIF(c, BOOST_PP_FOR_232, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(232, s), p, o, m)\n# define BOOST_PP_FOR_232_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(233, s) BOOST_PP_IIF(c, BOOST_PP_FOR_233, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(233, s), p, o, m)\n# define BOOST_PP_FOR_233_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(234, s) BOOST_PP_IIF(c, BOOST_PP_FOR_234, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(234, s), p, o, m)\n# define BOOST_PP_FOR_234_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(235, s) BOOST_PP_IIF(c, BOOST_PP_FOR_235, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(235, s), p, o, m)\n# define BOOST_PP_FOR_235_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(236, s) BOOST_PP_IIF(c, BOOST_PP_FOR_236, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(236, s), p, o, m)\n# define BOOST_PP_FOR_236_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(237, s) BOOST_PP_IIF(c, BOOST_PP_FOR_237, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(237, s), p, o, m)\n# define BOOST_PP_FOR_237_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(238, s) BOOST_PP_IIF(c, BOOST_PP_FOR_238, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(238, s), p, o, m)\n# define BOOST_PP_FOR_238_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(239, s) BOOST_PP_IIF(c, BOOST_PP_FOR_239, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(239, s), p, o, m)\n# define BOOST_PP_FOR_239_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(240, s) BOOST_PP_IIF(c, BOOST_PP_FOR_240, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(240, s), p, o, m)\n# define BOOST_PP_FOR_240_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(241, s) BOOST_PP_IIF(c, BOOST_PP_FOR_241, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(241, s), p, o, m)\n# define BOOST_PP_FOR_241_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(242, s) BOOST_PP_IIF(c, BOOST_PP_FOR_242, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(242, s), p, o, m)\n# define BOOST_PP_FOR_242_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(243, s) BOOST_PP_IIF(c, BOOST_PP_FOR_243, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(243, s), p, o, m)\n# define BOOST_PP_FOR_243_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(244, s) BOOST_PP_IIF(c, BOOST_PP_FOR_244, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(244, s), p, o, m)\n# define BOOST_PP_FOR_244_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(245, s) BOOST_PP_IIF(c, BOOST_PP_FOR_245, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(245, s), p, o, m)\n# define BOOST_PP_FOR_245_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(246, s) BOOST_PP_IIF(c, BOOST_PP_FOR_246, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(246, s), p, o, m)\n# define BOOST_PP_FOR_246_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(247, s) BOOST_PP_IIF(c, BOOST_PP_FOR_247, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(247, s), p, o, m)\n# define BOOST_PP_FOR_247_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(248, s) BOOST_PP_IIF(c, BOOST_PP_FOR_248, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(248, s), p, o, m)\n# define BOOST_PP_FOR_248_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(249, s) BOOST_PP_IIF(c, BOOST_PP_FOR_249, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(249, s), p, o, m)\n# define BOOST_PP_FOR_249_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(250, s) BOOST_PP_IIF(c, BOOST_PP_FOR_250, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(250, s), p, o, m)\n# define BOOST_PP_FOR_250_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(251, s) BOOST_PP_IIF(c, BOOST_PP_FOR_251, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(251, s), p, o, m)\n# define BOOST_PP_FOR_251_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(252, s) BOOST_PP_IIF(c, BOOST_PP_FOR_252, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(252, s), p, o, m)\n# define BOOST_PP_FOR_252_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(253, s) BOOST_PP_IIF(c, BOOST_PP_FOR_253, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(253, s), p, o, m)\n# define BOOST_PP_FOR_253_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(254, s) BOOST_PP_IIF(c, BOOST_PP_FOR_254, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(254, s), p, o, m)\n# define BOOST_PP_FOR_254_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(255, s) BOOST_PP_IIF(c, BOOST_PP_FOR_255, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(255, s), p, o, m)\n# define BOOST_PP_FOR_255_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(256, s) BOOST_PP_IIF(c, BOOST_PP_FOR_256, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(256, s), p, o, m)\n# define BOOST_PP_FOR_256_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(257, s) BOOST_PP_IIF(c, BOOST_PP_FOR_257, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(257, s), p, o, m)\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/repetition/detail/msvc/for.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_DETAIL_MSVC_FOR_HPP\n# define BOOST_PREPROCESSOR_REPETITION_DETAIL_MSVC_FOR_HPP\n#\n# include <boost/preprocessor/control/if.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n#\n# define BOOST_PP_FOR_1(s, p, o, m) BOOST_PP_IF(p(2, s), m, BOOST_PP_TUPLE_EAT_2)(2, s) BOOST_PP_IF(p(2, s), BOOST_PP_FOR_2, BOOST_PP_TUPLE_EAT_4)(o(2, s), p, o, m)\n# define BOOST_PP_FOR_2(s, p, o, m) BOOST_PP_IF(p(3, s), m, BOOST_PP_TUPLE_EAT_2)(3, s) BOOST_PP_IF(p(3, s), BOOST_PP_FOR_3, BOOST_PP_TUPLE_EAT_4)(o(3, s), p, o, m)\n# define BOOST_PP_FOR_3(s, p, o, m) BOOST_PP_IF(p(4, s), m, BOOST_PP_TUPLE_EAT_2)(4, s) BOOST_PP_IF(p(4, s), BOOST_PP_FOR_4, BOOST_PP_TUPLE_EAT_4)(o(4, s), p, o, m)\n# define BOOST_PP_FOR_4(s, p, o, m) BOOST_PP_IF(p(5, s), m, BOOST_PP_TUPLE_EAT_2)(5, s) BOOST_PP_IF(p(5, s), BOOST_PP_FOR_5, BOOST_PP_TUPLE_EAT_4)(o(5, s), p, o, m)\n# define BOOST_PP_FOR_5(s, p, o, m) BOOST_PP_IF(p(6, s), m, BOOST_PP_TUPLE_EAT_2)(6, s) BOOST_PP_IF(p(6, s), BOOST_PP_FOR_6, BOOST_PP_TUPLE_EAT_4)(o(6, s), p, o, m)\n# define BOOST_PP_FOR_6(s, p, o, m) BOOST_PP_IF(p(7, s), m, BOOST_PP_TUPLE_EAT_2)(7, s) BOOST_PP_IF(p(7, s), BOOST_PP_FOR_7, BOOST_PP_TUPLE_EAT_4)(o(7, s), p, o, m)\n# define BOOST_PP_FOR_7(s, p, o, m) BOOST_PP_IF(p(8, s), m, BOOST_PP_TUPLE_EAT_2)(8, s) BOOST_PP_IF(p(8, s), BOOST_PP_FOR_8, BOOST_PP_TUPLE_EAT_4)(o(8, s), p, o, m)\n# define BOOST_PP_FOR_8(s, p, o, m) BOOST_PP_IF(p(9, s), m, BOOST_PP_TUPLE_EAT_2)(9, s) BOOST_PP_IF(p(9, s), BOOST_PP_FOR_9, BOOST_PP_TUPLE_EAT_4)(o(9, s), p, o, m)\n# define BOOST_PP_FOR_9(s, p, o, m) BOOST_PP_IF(p(10, s), m, BOOST_PP_TUPLE_EAT_2)(10, s) BOOST_PP_IF(p(10, s), BOOST_PP_FOR_10, BOOST_PP_TUPLE_EAT_4)(o(10, s), p, o, m)\n# define BOOST_PP_FOR_10(s, p, o, m) BOOST_PP_IF(p(11, s), m, BOOST_PP_TUPLE_EAT_2)(11, s) BOOST_PP_IF(p(11, s), BOOST_PP_FOR_11, BOOST_PP_TUPLE_EAT_4)(o(11, s), p, o, m)\n# define BOOST_PP_FOR_11(s, p, o, m) BOOST_PP_IF(p(12, s), m, BOOST_PP_TUPLE_EAT_2)(12, s) BOOST_PP_IF(p(12, s), BOOST_PP_FOR_12, BOOST_PP_TUPLE_EAT_4)(o(12, s), p, o, m)\n# define BOOST_PP_FOR_12(s, p, o, m) BOOST_PP_IF(p(13, s), m, BOOST_PP_TUPLE_EAT_2)(13, s) BOOST_PP_IF(p(13, s), BOOST_PP_FOR_13, BOOST_PP_TUPLE_EAT_4)(o(13, s), p, o, m)\n# define BOOST_PP_FOR_13(s, p, o, m) BOOST_PP_IF(p(14, s), m, BOOST_PP_TUPLE_EAT_2)(14, s) BOOST_PP_IF(p(14, s), BOOST_PP_FOR_14, BOOST_PP_TUPLE_EAT_4)(o(14, s), p, o, m)\n# define BOOST_PP_FOR_14(s, p, o, m) BOOST_PP_IF(p(15, s), m, BOOST_PP_TUPLE_EAT_2)(15, s) BOOST_PP_IF(p(15, s), BOOST_PP_FOR_15, BOOST_PP_TUPLE_EAT_4)(o(15, s), p, o, m)\n# define BOOST_PP_FOR_15(s, p, o, m) BOOST_PP_IF(p(16, s), m, BOOST_PP_TUPLE_EAT_2)(16, s) BOOST_PP_IF(p(16, s), BOOST_PP_FOR_16, BOOST_PP_TUPLE_EAT_4)(o(16, s), p, o, m)\n# define BOOST_PP_FOR_16(s, p, o, m) BOOST_PP_IF(p(17, s), m, BOOST_PP_TUPLE_EAT_2)(17, s) BOOST_PP_IF(p(17, s), BOOST_PP_FOR_17, BOOST_PP_TUPLE_EAT_4)(o(17, s), p, o, m)\n# define BOOST_PP_FOR_17(s, p, o, m) BOOST_PP_IF(p(18, s), m, BOOST_PP_TUPLE_EAT_2)(18, s) BOOST_PP_IF(p(18, s), BOOST_PP_FOR_18, BOOST_PP_TUPLE_EAT_4)(o(18, s), p, o, m)\n# define BOOST_PP_FOR_18(s, p, o, m) BOOST_PP_IF(p(19, s), m, BOOST_PP_TUPLE_EAT_2)(19, s) BOOST_PP_IF(p(19, s), BOOST_PP_FOR_19, BOOST_PP_TUPLE_EAT_4)(o(19, s), p, o, m)\n# define BOOST_PP_FOR_19(s, p, o, m) BOOST_PP_IF(p(20, s), m, BOOST_PP_TUPLE_EAT_2)(20, s) BOOST_PP_IF(p(20, s), BOOST_PP_FOR_20, BOOST_PP_TUPLE_EAT_4)(o(20, s), p, o, m)\n# define BOOST_PP_FOR_20(s, p, o, m) BOOST_PP_IF(p(21, s), m, BOOST_PP_TUPLE_EAT_2)(21, s) BOOST_PP_IF(p(21, s), BOOST_PP_FOR_21, BOOST_PP_TUPLE_EAT_4)(o(21, s), p, o, m)\n# define BOOST_PP_FOR_21(s, p, o, m) BOOST_PP_IF(p(22, s), m, BOOST_PP_TUPLE_EAT_2)(22, s) BOOST_PP_IF(p(22, s), BOOST_PP_FOR_22, BOOST_PP_TUPLE_EAT_4)(o(22, s), p, o, m)\n# define BOOST_PP_FOR_22(s, p, o, m) BOOST_PP_IF(p(23, s), m, BOOST_PP_TUPLE_EAT_2)(23, s) BOOST_PP_IF(p(23, s), BOOST_PP_FOR_23, BOOST_PP_TUPLE_EAT_4)(o(23, s), p, o, m)\n# define BOOST_PP_FOR_23(s, p, o, m) BOOST_PP_IF(p(24, s), m, BOOST_PP_TUPLE_EAT_2)(24, s) BOOST_PP_IF(p(24, s), BOOST_PP_FOR_24, BOOST_PP_TUPLE_EAT_4)(o(24, s), p, o, m)\n# define BOOST_PP_FOR_24(s, p, o, m) BOOST_PP_IF(p(25, s), m, BOOST_PP_TUPLE_EAT_2)(25, s) BOOST_PP_IF(p(25, s), BOOST_PP_FOR_25, BOOST_PP_TUPLE_EAT_4)(o(25, s), p, o, m)\n# define BOOST_PP_FOR_25(s, p, o, m) BOOST_PP_IF(p(26, s), m, BOOST_PP_TUPLE_EAT_2)(26, s) BOOST_PP_IF(p(26, s), BOOST_PP_FOR_26, BOOST_PP_TUPLE_EAT_4)(o(26, s), p, o, m)\n# define BOOST_PP_FOR_26(s, p, o, m) BOOST_PP_IF(p(27, s), m, BOOST_PP_TUPLE_EAT_2)(27, s) BOOST_PP_IF(p(27, s), BOOST_PP_FOR_27, BOOST_PP_TUPLE_EAT_4)(o(27, s), p, o, m)\n# define BOOST_PP_FOR_27(s, p, o, m) BOOST_PP_IF(p(28, s), m, BOOST_PP_TUPLE_EAT_2)(28, s) BOOST_PP_IF(p(28, s), BOOST_PP_FOR_28, BOOST_PP_TUPLE_EAT_4)(o(28, s), p, o, m)\n# define BOOST_PP_FOR_28(s, p, o, m) BOOST_PP_IF(p(29, s), m, BOOST_PP_TUPLE_EAT_2)(29, s) BOOST_PP_IF(p(29, s), BOOST_PP_FOR_29, BOOST_PP_TUPLE_EAT_4)(o(29, s), p, o, m)\n# define BOOST_PP_FOR_29(s, p, o, m) BOOST_PP_IF(p(30, s), m, BOOST_PP_TUPLE_EAT_2)(30, s) BOOST_PP_IF(p(30, s), BOOST_PP_FOR_30, BOOST_PP_TUPLE_EAT_4)(o(30, s), p, o, m)\n# define BOOST_PP_FOR_30(s, p, o, m) BOOST_PP_IF(p(31, s), m, BOOST_PP_TUPLE_EAT_2)(31, s) BOOST_PP_IF(p(31, s), BOOST_PP_FOR_31, BOOST_PP_TUPLE_EAT_4)(o(31, s), p, o, m)\n# define BOOST_PP_FOR_31(s, p, o, m) BOOST_PP_IF(p(32, s), m, BOOST_PP_TUPLE_EAT_2)(32, s) BOOST_PP_IF(p(32, s), BOOST_PP_FOR_32, BOOST_PP_TUPLE_EAT_4)(o(32, s), p, o, m)\n# define BOOST_PP_FOR_32(s, p, o, m) BOOST_PP_IF(p(33, s), m, BOOST_PP_TUPLE_EAT_2)(33, s) BOOST_PP_IF(p(33, s), BOOST_PP_FOR_33, BOOST_PP_TUPLE_EAT_4)(o(33, s), p, o, m)\n# define BOOST_PP_FOR_33(s, p, o, m) BOOST_PP_IF(p(34, s), m, BOOST_PP_TUPLE_EAT_2)(34, s) BOOST_PP_IF(p(34, s), BOOST_PP_FOR_34, BOOST_PP_TUPLE_EAT_4)(o(34, s), p, o, m)\n# define BOOST_PP_FOR_34(s, p, o, m) BOOST_PP_IF(p(35, s), m, BOOST_PP_TUPLE_EAT_2)(35, s) BOOST_PP_IF(p(35, s), BOOST_PP_FOR_35, BOOST_PP_TUPLE_EAT_4)(o(35, s), p, o, m)\n# define BOOST_PP_FOR_35(s, p, o, m) BOOST_PP_IF(p(36, s), m, BOOST_PP_TUPLE_EAT_2)(36, s) BOOST_PP_IF(p(36, s), BOOST_PP_FOR_36, BOOST_PP_TUPLE_EAT_4)(o(36, s), p, o, m)\n# define BOOST_PP_FOR_36(s, p, o, m) BOOST_PP_IF(p(37, s), m, BOOST_PP_TUPLE_EAT_2)(37, s) BOOST_PP_IF(p(37, s), BOOST_PP_FOR_37, BOOST_PP_TUPLE_EAT_4)(o(37, s), p, o, m)\n# define BOOST_PP_FOR_37(s, p, o, m) BOOST_PP_IF(p(38, s), m, BOOST_PP_TUPLE_EAT_2)(38, s) BOOST_PP_IF(p(38, s), BOOST_PP_FOR_38, BOOST_PP_TUPLE_EAT_4)(o(38, s), p, o, m)\n# define BOOST_PP_FOR_38(s, p, o, m) BOOST_PP_IF(p(39, s), m, BOOST_PP_TUPLE_EAT_2)(39, s) BOOST_PP_IF(p(39, s), BOOST_PP_FOR_39, BOOST_PP_TUPLE_EAT_4)(o(39, s), p, o, m)\n# define BOOST_PP_FOR_39(s, p, o, m) BOOST_PP_IF(p(40, s), m, BOOST_PP_TUPLE_EAT_2)(40, s) BOOST_PP_IF(p(40, s), BOOST_PP_FOR_40, BOOST_PP_TUPLE_EAT_4)(o(40, s), p, o, m)\n# define BOOST_PP_FOR_40(s, p, o, m) BOOST_PP_IF(p(41, s), m, BOOST_PP_TUPLE_EAT_2)(41, s) BOOST_PP_IF(p(41, s), BOOST_PP_FOR_41, BOOST_PP_TUPLE_EAT_4)(o(41, s), p, o, m)\n# define BOOST_PP_FOR_41(s, p, o, m) BOOST_PP_IF(p(42, s), m, BOOST_PP_TUPLE_EAT_2)(42, s) BOOST_PP_IF(p(42, s), BOOST_PP_FOR_42, BOOST_PP_TUPLE_EAT_4)(o(42, s), p, o, m)\n# define BOOST_PP_FOR_42(s, p, o, m) BOOST_PP_IF(p(43, s), m, BOOST_PP_TUPLE_EAT_2)(43, s) BOOST_PP_IF(p(43, s), BOOST_PP_FOR_43, BOOST_PP_TUPLE_EAT_4)(o(43, s), p, o, m)\n# define BOOST_PP_FOR_43(s, p, o, m) BOOST_PP_IF(p(44, s), m, BOOST_PP_TUPLE_EAT_2)(44, s) BOOST_PP_IF(p(44, s), BOOST_PP_FOR_44, BOOST_PP_TUPLE_EAT_4)(o(44, s), p, o, m)\n# define BOOST_PP_FOR_44(s, p, o, m) BOOST_PP_IF(p(45, s), m, BOOST_PP_TUPLE_EAT_2)(45, s) BOOST_PP_IF(p(45, s), BOOST_PP_FOR_45, BOOST_PP_TUPLE_EAT_4)(o(45, s), p, o, m)\n# define BOOST_PP_FOR_45(s, p, o, m) BOOST_PP_IF(p(46, s), m, BOOST_PP_TUPLE_EAT_2)(46, s) BOOST_PP_IF(p(46, s), BOOST_PP_FOR_46, BOOST_PP_TUPLE_EAT_4)(o(46, s), p, o, m)\n# define BOOST_PP_FOR_46(s, p, o, m) BOOST_PP_IF(p(47, s), m, BOOST_PP_TUPLE_EAT_2)(47, s) BOOST_PP_IF(p(47, s), BOOST_PP_FOR_47, BOOST_PP_TUPLE_EAT_4)(o(47, s), p, o, m)\n# define BOOST_PP_FOR_47(s, p, o, m) BOOST_PP_IF(p(48, s), m, BOOST_PP_TUPLE_EAT_2)(48, s) BOOST_PP_IF(p(48, s), BOOST_PP_FOR_48, BOOST_PP_TUPLE_EAT_4)(o(48, s), p, o, m)\n# define BOOST_PP_FOR_48(s, p, o, m) BOOST_PP_IF(p(49, s), m, BOOST_PP_TUPLE_EAT_2)(49, s) BOOST_PP_IF(p(49, s), BOOST_PP_FOR_49, BOOST_PP_TUPLE_EAT_4)(o(49, s), p, o, m)\n# define BOOST_PP_FOR_49(s, p, o, m) BOOST_PP_IF(p(50, s), m, BOOST_PP_TUPLE_EAT_2)(50, s) BOOST_PP_IF(p(50, s), BOOST_PP_FOR_50, BOOST_PP_TUPLE_EAT_4)(o(50, s), p, o, m)\n# define BOOST_PP_FOR_50(s, p, o, m) BOOST_PP_IF(p(51, s), m, BOOST_PP_TUPLE_EAT_2)(51, s) BOOST_PP_IF(p(51, s), BOOST_PP_FOR_51, BOOST_PP_TUPLE_EAT_4)(o(51, s), p, o, m)\n# define BOOST_PP_FOR_51(s, p, o, m) BOOST_PP_IF(p(52, s), m, BOOST_PP_TUPLE_EAT_2)(52, s) BOOST_PP_IF(p(52, s), BOOST_PP_FOR_52, BOOST_PP_TUPLE_EAT_4)(o(52, s), p, o, m)\n# define BOOST_PP_FOR_52(s, p, o, m) BOOST_PP_IF(p(53, s), m, BOOST_PP_TUPLE_EAT_2)(53, s) BOOST_PP_IF(p(53, s), BOOST_PP_FOR_53, BOOST_PP_TUPLE_EAT_4)(o(53, s), p, o, m)\n# define BOOST_PP_FOR_53(s, p, o, m) BOOST_PP_IF(p(54, s), m, BOOST_PP_TUPLE_EAT_2)(54, s) BOOST_PP_IF(p(54, s), BOOST_PP_FOR_54, BOOST_PP_TUPLE_EAT_4)(o(54, s), p, o, m)\n# define BOOST_PP_FOR_54(s, p, o, m) BOOST_PP_IF(p(55, s), m, BOOST_PP_TUPLE_EAT_2)(55, s) BOOST_PP_IF(p(55, s), BOOST_PP_FOR_55, BOOST_PP_TUPLE_EAT_4)(o(55, s), p, o, m)\n# define BOOST_PP_FOR_55(s, p, o, m) BOOST_PP_IF(p(56, s), m, BOOST_PP_TUPLE_EAT_2)(56, s) BOOST_PP_IF(p(56, s), BOOST_PP_FOR_56, BOOST_PP_TUPLE_EAT_4)(o(56, s), p, o, m)\n# define BOOST_PP_FOR_56(s, p, o, m) BOOST_PP_IF(p(57, s), m, BOOST_PP_TUPLE_EAT_2)(57, s) BOOST_PP_IF(p(57, s), BOOST_PP_FOR_57, BOOST_PP_TUPLE_EAT_4)(o(57, s), p, o, m)\n# define BOOST_PP_FOR_57(s, p, o, m) BOOST_PP_IF(p(58, s), m, BOOST_PP_TUPLE_EAT_2)(58, s) BOOST_PP_IF(p(58, s), BOOST_PP_FOR_58, BOOST_PP_TUPLE_EAT_4)(o(58, s), p, o, m)\n# define BOOST_PP_FOR_58(s, p, o, m) BOOST_PP_IF(p(59, s), m, BOOST_PP_TUPLE_EAT_2)(59, s) BOOST_PP_IF(p(59, s), BOOST_PP_FOR_59, BOOST_PP_TUPLE_EAT_4)(o(59, s), p, o, m)\n# define BOOST_PP_FOR_59(s, p, o, m) BOOST_PP_IF(p(60, s), m, BOOST_PP_TUPLE_EAT_2)(60, s) BOOST_PP_IF(p(60, s), BOOST_PP_FOR_60, BOOST_PP_TUPLE_EAT_4)(o(60, s), p, o, m)\n# define BOOST_PP_FOR_60(s, p, o, m) BOOST_PP_IF(p(61, s), m, BOOST_PP_TUPLE_EAT_2)(61, s) BOOST_PP_IF(p(61, s), BOOST_PP_FOR_61, BOOST_PP_TUPLE_EAT_4)(o(61, s), p, o, m)\n# define BOOST_PP_FOR_61(s, p, o, m) BOOST_PP_IF(p(62, s), m, BOOST_PP_TUPLE_EAT_2)(62, s) BOOST_PP_IF(p(62, s), BOOST_PP_FOR_62, BOOST_PP_TUPLE_EAT_4)(o(62, s), p, o, m)\n# define BOOST_PP_FOR_62(s, p, o, m) BOOST_PP_IF(p(63, s), m, BOOST_PP_TUPLE_EAT_2)(63, s) BOOST_PP_IF(p(63, s), BOOST_PP_FOR_63, BOOST_PP_TUPLE_EAT_4)(o(63, s), p, o, m)\n# define BOOST_PP_FOR_63(s, p, o, m) BOOST_PP_IF(p(64, s), m, BOOST_PP_TUPLE_EAT_2)(64, s) BOOST_PP_IF(p(64, s), BOOST_PP_FOR_64, BOOST_PP_TUPLE_EAT_4)(o(64, s), p, o, m)\n# define BOOST_PP_FOR_64(s, p, o, m) BOOST_PP_IF(p(65, s), m, BOOST_PP_TUPLE_EAT_2)(65, s) BOOST_PP_IF(p(65, s), BOOST_PP_FOR_65, BOOST_PP_TUPLE_EAT_4)(o(65, s), p, o, m)\n# define BOOST_PP_FOR_65(s, p, o, m) BOOST_PP_IF(p(66, s), m, BOOST_PP_TUPLE_EAT_2)(66, s) BOOST_PP_IF(p(66, s), BOOST_PP_FOR_66, BOOST_PP_TUPLE_EAT_4)(o(66, s), p, o, m)\n# define BOOST_PP_FOR_66(s, p, o, m) BOOST_PP_IF(p(67, s), m, BOOST_PP_TUPLE_EAT_2)(67, s) BOOST_PP_IF(p(67, s), BOOST_PP_FOR_67, BOOST_PP_TUPLE_EAT_4)(o(67, s), p, o, m)\n# define BOOST_PP_FOR_67(s, p, o, m) BOOST_PP_IF(p(68, s), m, BOOST_PP_TUPLE_EAT_2)(68, s) BOOST_PP_IF(p(68, s), BOOST_PP_FOR_68, BOOST_PP_TUPLE_EAT_4)(o(68, s), p, o, m)\n# define BOOST_PP_FOR_68(s, p, o, m) BOOST_PP_IF(p(69, s), m, BOOST_PP_TUPLE_EAT_2)(69, s) BOOST_PP_IF(p(69, s), BOOST_PP_FOR_69, BOOST_PP_TUPLE_EAT_4)(o(69, s), p, o, m)\n# define BOOST_PP_FOR_69(s, p, o, m) BOOST_PP_IF(p(70, s), m, BOOST_PP_TUPLE_EAT_2)(70, s) BOOST_PP_IF(p(70, s), BOOST_PP_FOR_70, BOOST_PP_TUPLE_EAT_4)(o(70, s), p, o, m)\n# define BOOST_PP_FOR_70(s, p, o, m) BOOST_PP_IF(p(71, s), m, BOOST_PP_TUPLE_EAT_2)(71, s) BOOST_PP_IF(p(71, s), BOOST_PP_FOR_71, BOOST_PP_TUPLE_EAT_4)(o(71, s), p, o, m)\n# define BOOST_PP_FOR_71(s, p, o, m) BOOST_PP_IF(p(72, s), m, BOOST_PP_TUPLE_EAT_2)(72, s) BOOST_PP_IF(p(72, s), BOOST_PP_FOR_72, BOOST_PP_TUPLE_EAT_4)(o(72, s), p, o, m)\n# define BOOST_PP_FOR_72(s, p, o, m) BOOST_PP_IF(p(73, s), m, BOOST_PP_TUPLE_EAT_2)(73, s) BOOST_PP_IF(p(73, s), BOOST_PP_FOR_73, BOOST_PP_TUPLE_EAT_4)(o(73, s), p, o, m)\n# define BOOST_PP_FOR_73(s, p, o, m) BOOST_PP_IF(p(74, s), m, BOOST_PP_TUPLE_EAT_2)(74, s) BOOST_PP_IF(p(74, s), BOOST_PP_FOR_74, BOOST_PP_TUPLE_EAT_4)(o(74, s), p, o, m)\n# define BOOST_PP_FOR_74(s, p, o, m) BOOST_PP_IF(p(75, s), m, BOOST_PP_TUPLE_EAT_2)(75, s) BOOST_PP_IF(p(75, s), BOOST_PP_FOR_75, BOOST_PP_TUPLE_EAT_4)(o(75, s), p, o, m)\n# define BOOST_PP_FOR_75(s, p, o, m) BOOST_PP_IF(p(76, s), m, BOOST_PP_TUPLE_EAT_2)(76, s) BOOST_PP_IF(p(76, s), BOOST_PP_FOR_76, BOOST_PP_TUPLE_EAT_4)(o(76, s), p, o, m)\n# define BOOST_PP_FOR_76(s, p, o, m) BOOST_PP_IF(p(77, s), m, BOOST_PP_TUPLE_EAT_2)(77, s) BOOST_PP_IF(p(77, s), BOOST_PP_FOR_77, BOOST_PP_TUPLE_EAT_4)(o(77, s), p, o, m)\n# define BOOST_PP_FOR_77(s, p, o, m) BOOST_PP_IF(p(78, s), m, BOOST_PP_TUPLE_EAT_2)(78, s) BOOST_PP_IF(p(78, s), BOOST_PP_FOR_78, BOOST_PP_TUPLE_EAT_4)(o(78, s), p, o, m)\n# define BOOST_PP_FOR_78(s, p, o, m) BOOST_PP_IF(p(79, s), m, BOOST_PP_TUPLE_EAT_2)(79, s) BOOST_PP_IF(p(79, s), BOOST_PP_FOR_79, BOOST_PP_TUPLE_EAT_4)(o(79, s), p, o, m)\n# define BOOST_PP_FOR_79(s, p, o, m) BOOST_PP_IF(p(80, s), m, BOOST_PP_TUPLE_EAT_2)(80, s) BOOST_PP_IF(p(80, s), BOOST_PP_FOR_80, BOOST_PP_TUPLE_EAT_4)(o(80, s), p, o, m)\n# define BOOST_PP_FOR_80(s, p, o, m) BOOST_PP_IF(p(81, s), m, BOOST_PP_TUPLE_EAT_2)(81, s) BOOST_PP_IF(p(81, s), BOOST_PP_FOR_81, BOOST_PP_TUPLE_EAT_4)(o(81, s), p, o, m)\n# define BOOST_PP_FOR_81(s, p, o, m) BOOST_PP_IF(p(82, s), m, BOOST_PP_TUPLE_EAT_2)(82, s) BOOST_PP_IF(p(82, s), BOOST_PP_FOR_82, BOOST_PP_TUPLE_EAT_4)(o(82, s), p, o, m)\n# define BOOST_PP_FOR_82(s, p, o, m) BOOST_PP_IF(p(83, s), m, BOOST_PP_TUPLE_EAT_2)(83, s) BOOST_PP_IF(p(83, s), BOOST_PP_FOR_83, BOOST_PP_TUPLE_EAT_4)(o(83, s), p, o, m)\n# define BOOST_PP_FOR_83(s, p, o, m) BOOST_PP_IF(p(84, s), m, BOOST_PP_TUPLE_EAT_2)(84, s) BOOST_PP_IF(p(84, s), BOOST_PP_FOR_84, BOOST_PP_TUPLE_EAT_4)(o(84, s), p, o, m)\n# define BOOST_PP_FOR_84(s, p, o, m) BOOST_PP_IF(p(85, s), m, BOOST_PP_TUPLE_EAT_2)(85, s) BOOST_PP_IF(p(85, s), BOOST_PP_FOR_85, BOOST_PP_TUPLE_EAT_4)(o(85, s), p, o, m)\n# define BOOST_PP_FOR_85(s, p, o, m) BOOST_PP_IF(p(86, s), m, BOOST_PP_TUPLE_EAT_2)(86, s) BOOST_PP_IF(p(86, s), BOOST_PP_FOR_86, BOOST_PP_TUPLE_EAT_4)(o(86, s), p, o, m)\n# define BOOST_PP_FOR_86(s, p, o, m) BOOST_PP_IF(p(87, s), m, BOOST_PP_TUPLE_EAT_2)(87, s) BOOST_PP_IF(p(87, s), BOOST_PP_FOR_87, BOOST_PP_TUPLE_EAT_4)(o(87, s), p, o, m)\n# define BOOST_PP_FOR_87(s, p, o, m) BOOST_PP_IF(p(88, s), m, BOOST_PP_TUPLE_EAT_2)(88, s) BOOST_PP_IF(p(88, s), BOOST_PP_FOR_88, BOOST_PP_TUPLE_EAT_4)(o(88, s), p, o, m)\n# define BOOST_PP_FOR_88(s, p, o, m) BOOST_PP_IF(p(89, s), m, BOOST_PP_TUPLE_EAT_2)(89, s) BOOST_PP_IF(p(89, s), BOOST_PP_FOR_89, BOOST_PP_TUPLE_EAT_4)(o(89, s), p, o, m)\n# define BOOST_PP_FOR_89(s, p, o, m) BOOST_PP_IF(p(90, s), m, BOOST_PP_TUPLE_EAT_2)(90, s) BOOST_PP_IF(p(90, s), BOOST_PP_FOR_90, BOOST_PP_TUPLE_EAT_4)(o(90, s), p, o, m)\n# define BOOST_PP_FOR_90(s, p, o, m) BOOST_PP_IF(p(91, s), m, BOOST_PP_TUPLE_EAT_2)(91, s) BOOST_PP_IF(p(91, s), BOOST_PP_FOR_91, BOOST_PP_TUPLE_EAT_4)(o(91, s), p, o, m)\n# define BOOST_PP_FOR_91(s, p, o, m) BOOST_PP_IF(p(92, s), m, BOOST_PP_TUPLE_EAT_2)(92, s) BOOST_PP_IF(p(92, s), BOOST_PP_FOR_92, BOOST_PP_TUPLE_EAT_4)(o(92, s), p, o, m)\n# define BOOST_PP_FOR_92(s, p, o, m) BOOST_PP_IF(p(93, s), m, BOOST_PP_TUPLE_EAT_2)(93, s) BOOST_PP_IF(p(93, s), BOOST_PP_FOR_93, BOOST_PP_TUPLE_EAT_4)(o(93, s), p, o, m)\n# define BOOST_PP_FOR_93(s, p, o, m) BOOST_PP_IF(p(94, s), m, BOOST_PP_TUPLE_EAT_2)(94, s) BOOST_PP_IF(p(94, s), BOOST_PP_FOR_94, BOOST_PP_TUPLE_EAT_4)(o(94, s), p, o, m)\n# define BOOST_PP_FOR_94(s, p, o, m) BOOST_PP_IF(p(95, s), m, BOOST_PP_TUPLE_EAT_2)(95, s) BOOST_PP_IF(p(95, s), BOOST_PP_FOR_95, BOOST_PP_TUPLE_EAT_4)(o(95, s), p, o, m)\n# define BOOST_PP_FOR_95(s, p, o, m) BOOST_PP_IF(p(96, s), m, BOOST_PP_TUPLE_EAT_2)(96, s) BOOST_PP_IF(p(96, s), BOOST_PP_FOR_96, BOOST_PP_TUPLE_EAT_4)(o(96, s), p, o, m)\n# define BOOST_PP_FOR_96(s, p, o, m) BOOST_PP_IF(p(97, s), m, BOOST_PP_TUPLE_EAT_2)(97, s) BOOST_PP_IF(p(97, s), BOOST_PP_FOR_97, BOOST_PP_TUPLE_EAT_4)(o(97, s), p, o, m)\n# define BOOST_PP_FOR_97(s, p, o, m) BOOST_PP_IF(p(98, s), m, BOOST_PP_TUPLE_EAT_2)(98, s) BOOST_PP_IF(p(98, s), BOOST_PP_FOR_98, BOOST_PP_TUPLE_EAT_4)(o(98, s), p, o, m)\n# define BOOST_PP_FOR_98(s, p, o, m) BOOST_PP_IF(p(99, s), m, BOOST_PP_TUPLE_EAT_2)(99, s) BOOST_PP_IF(p(99, s), BOOST_PP_FOR_99, BOOST_PP_TUPLE_EAT_4)(o(99, s), p, o, m)\n# define BOOST_PP_FOR_99(s, p, o, m) BOOST_PP_IF(p(100, s), m, BOOST_PP_TUPLE_EAT_2)(100, s) BOOST_PP_IF(p(100, s), BOOST_PP_FOR_100, BOOST_PP_TUPLE_EAT_4)(o(100, s), p, o, m)\n# define BOOST_PP_FOR_100(s, p, o, m) BOOST_PP_IF(p(101, s), m, BOOST_PP_TUPLE_EAT_2)(101, s) BOOST_PP_IF(p(101, s), BOOST_PP_FOR_101, BOOST_PP_TUPLE_EAT_4)(o(101, s), p, o, m)\n# define BOOST_PP_FOR_101(s, p, o, m) BOOST_PP_IF(p(102, s), m, BOOST_PP_TUPLE_EAT_2)(102, s) BOOST_PP_IF(p(102, s), BOOST_PP_FOR_102, BOOST_PP_TUPLE_EAT_4)(o(102, s), p, o, m)\n# define BOOST_PP_FOR_102(s, p, o, m) BOOST_PP_IF(p(103, s), m, BOOST_PP_TUPLE_EAT_2)(103, s) BOOST_PP_IF(p(103, s), BOOST_PP_FOR_103, BOOST_PP_TUPLE_EAT_4)(o(103, s), p, o, m)\n# define BOOST_PP_FOR_103(s, p, o, m) BOOST_PP_IF(p(104, s), m, BOOST_PP_TUPLE_EAT_2)(104, s) BOOST_PP_IF(p(104, s), BOOST_PP_FOR_104, BOOST_PP_TUPLE_EAT_4)(o(104, s), p, o, m)\n# define BOOST_PP_FOR_104(s, p, o, m) BOOST_PP_IF(p(105, s), m, BOOST_PP_TUPLE_EAT_2)(105, s) BOOST_PP_IF(p(105, s), BOOST_PP_FOR_105, BOOST_PP_TUPLE_EAT_4)(o(105, s), p, o, m)\n# define BOOST_PP_FOR_105(s, p, o, m) BOOST_PP_IF(p(106, s), m, BOOST_PP_TUPLE_EAT_2)(106, s) BOOST_PP_IF(p(106, s), BOOST_PP_FOR_106, BOOST_PP_TUPLE_EAT_4)(o(106, s), p, o, m)\n# define BOOST_PP_FOR_106(s, p, o, m) BOOST_PP_IF(p(107, s), m, BOOST_PP_TUPLE_EAT_2)(107, s) BOOST_PP_IF(p(107, s), BOOST_PP_FOR_107, BOOST_PP_TUPLE_EAT_4)(o(107, s), p, o, m)\n# define BOOST_PP_FOR_107(s, p, o, m) BOOST_PP_IF(p(108, s), m, BOOST_PP_TUPLE_EAT_2)(108, s) BOOST_PP_IF(p(108, s), BOOST_PP_FOR_108, BOOST_PP_TUPLE_EAT_4)(o(108, s), p, o, m)\n# define BOOST_PP_FOR_108(s, p, o, m) BOOST_PP_IF(p(109, s), m, BOOST_PP_TUPLE_EAT_2)(109, s) BOOST_PP_IF(p(109, s), BOOST_PP_FOR_109, BOOST_PP_TUPLE_EAT_4)(o(109, s), p, o, m)\n# define BOOST_PP_FOR_109(s, p, o, m) BOOST_PP_IF(p(110, s), m, BOOST_PP_TUPLE_EAT_2)(110, s) BOOST_PP_IF(p(110, s), BOOST_PP_FOR_110, BOOST_PP_TUPLE_EAT_4)(o(110, s), p, o, m)\n# define BOOST_PP_FOR_110(s, p, o, m) BOOST_PP_IF(p(111, s), m, BOOST_PP_TUPLE_EAT_2)(111, s) BOOST_PP_IF(p(111, s), BOOST_PP_FOR_111, BOOST_PP_TUPLE_EAT_4)(o(111, s), p, o, m)\n# define BOOST_PP_FOR_111(s, p, o, m) BOOST_PP_IF(p(112, s), m, BOOST_PP_TUPLE_EAT_2)(112, s) BOOST_PP_IF(p(112, s), BOOST_PP_FOR_112, BOOST_PP_TUPLE_EAT_4)(o(112, s), p, o, m)\n# define BOOST_PP_FOR_112(s, p, o, m) BOOST_PP_IF(p(113, s), m, BOOST_PP_TUPLE_EAT_2)(113, s) BOOST_PP_IF(p(113, s), BOOST_PP_FOR_113, BOOST_PP_TUPLE_EAT_4)(o(113, s), p, o, m)\n# define BOOST_PP_FOR_113(s, p, o, m) BOOST_PP_IF(p(114, s), m, BOOST_PP_TUPLE_EAT_2)(114, s) BOOST_PP_IF(p(114, s), BOOST_PP_FOR_114, BOOST_PP_TUPLE_EAT_4)(o(114, s), p, o, m)\n# define BOOST_PP_FOR_114(s, p, o, m) BOOST_PP_IF(p(115, s), m, BOOST_PP_TUPLE_EAT_2)(115, s) BOOST_PP_IF(p(115, s), BOOST_PP_FOR_115, BOOST_PP_TUPLE_EAT_4)(o(115, s), p, o, m)\n# define BOOST_PP_FOR_115(s, p, o, m) BOOST_PP_IF(p(116, s), m, BOOST_PP_TUPLE_EAT_2)(116, s) BOOST_PP_IF(p(116, s), BOOST_PP_FOR_116, BOOST_PP_TUPLE_EAT_4)(o(116, s), p, o, m)\n# define BOOST_PP_FOR_116(s, p, o, m) BOOST_PP_IF(p(117, s), m, BOOST_PP_TUPLE_EAT_2)(117, s) BOOST_PP_IF(p(117, s), BOOST_PP_FOR_117, BOOST_PP_TUPLE_EAT_4)(o(117, s), p, o, m)\n# define BOOST_PP_FOR_117(s, p, o, m) BOOST_PP_IF(p(118, s), m, BOOST_PP_TUPLE_EAT_2)(118, s) BOOST_PP_IF(p(118, s), BOOST_PP_FOR_118, BOOST_PP_TUPLE_EAT_4)(o(118, s), p, o, m)\n# define BOOST_PP_FOR_118(s, p, o, m) BOOST_PP_IF(p(119, s), m, BOOST_PP_TUPLE_EAT_2)(119, s) BOOST_PP_IF(p(119, s), BOOST_PP_FOR_119, BOOST_PP_TUPLE_EAT_4)(o(119, s), p, o, m)\n# define BOOST_PP_FOR_119(s, p, o, m) BOOST_PP_IF(p(120, s), m, BOOST_PP_TUPLE_EAT_2)(120, s) BOOST_PP_IF(p(120, s), BOOST_PP_FOR_120, BOOST_PP_TUPLE_EAT_4)(o(120, s), p, o, m)\n# define BOOST_PP_FOR_120(s, p, o, m) BOOST_PP_IF(p(121, s), m, BOOST_PP_TUPLE_EAT_2)(121, s) BOOST_PP_IF(p(121, s), BOOST_PP_FOR_121, BOOST_PP_TUPLE_EAT_4)(o(121, s), p, o, m)\n# define BOOST_PP_FOR_121(s, p, o, m) BOOST_PP_IF(p(122, s), m, BOOST_PP_TUPLE_EAT_2)(122, s) BOOST_PP_IF(p(122, s), BOOST_PP_FOR_122, BOOST_PP_TUPLE_EAT_4)(o(122, s), p, o, m)\n# define BOOST_PP_FOR_122(s, p, o, m) BOOST_PP_IF(p(123, s), m, BOOST_PP_TUPLE_EAT_2)(123, s) BOOST_PP_IF(p(123, s), BOOST_PP_FOR_123, BOOST_PP_TUPLE_EAT_4)(o(123, s), p, o, m)\n# define BOOST_PP_FOR_123(s, p, o, m) BOOST_PP_IF(p(124, s), m, BOOST_PP_TUPLE_EAT_2)(124, s) BOOST_PP_IF(p(124, s), BOOST_PP_FOR_124, BOOST_PP_TUPLE_EAT_4)(o(124, s), p, o, m)\n# define BOOST_PP_FOR_124(s, p, o, m) BOOST_PP_IF(p(125, s), m, BOOST_PP_TUPLE_EAT_2)(125, s) BOOST_PP_IF(p(125, s), BOOST_PP_FOR_125, BOOST_PP_TUPLE_EAT_4)(o(125, s), p, o, m)\n# define BOOST_PP_FOR_125(s, p, o, m) BOOST_PP_IF(p(126, s), m, BOOST_PP_TUPLE_EAT_2)(126, s) BOOST_PP_IF(p(126, s), BOOST_PP_FOR_126, BOOST_PP_TUPLE_EAT_4)(o(126, s), p, o, m)\n# define BOOST_PP_FOR_126(s, p, o, m) BOOST_PP_IF(p(127, s), m, BOOST_PP_TUPLE_EAT_2)(127, s) BOOST_PP_IF(p(127, s), BOOST_PP_FOR_127, BOOST_PP_TUPLE_EAT_4)(o(127, s), p, o, m)\n# define BOOST_PP_FOR_127(s, p, o, m) BOOST_PP_IF(p(128, s), m, BOOST_PP_TUPLE_EAT_2)(128, s) BOOST_PP_IF(p(128, s), BOOST_PP_FOR_128, BOOST_PP_TUPLE_EAT_4)(o(128, s), p, o, m)\n# define BOOST_PP_FOR_128(s, p, o, m) BOOST_PP_IF(p(129, s), m, BOOST_PP_TUPLE_EAT_2)(129, s) BOOST_PP_IF(p(129, s), BOOST_PP_FOR_129, BOOST_PP_TUPLE_EAT_4)(o(129, s), p, o, m)\n# define BOOST_PP_FOR_129(s, p, o, m) BOOST_PP_IF(p(130, s), m, BOOST_PP_TUPLE_EAT_2)(130, s) BOOST_PP_IF(p(130, s), BOOST_PP_FOR_130, BOOST_PP_TUPLE_EAT_4)(o(130, s), p, o, m)\n# define BOOST_PP_FOR_130(s, p, o, m) BOOST_PP_IF(p(131, s), m, BOOST_PP_TUPLE_EAT_2)(131, s) BOOST_PP_IF(p(131, s), BOOST_PP_FOR_131, BOOST_PP_TUPLE_EAT_4)(o(131, s), p, o, m)\n# define BOOST_PP_FOR_131(s, p, o, m) BOOST_PP_IF(p(132, s), m, BOOST_PP_TUPLE_EAT_2)(132, s) BOOST_PP_IF(p(132, s), BOOST_PP_FOR_132, BOOST_PP_TUPLE_EAT_4)(o(132, s), p, o, m)\n# define BOOST_PP_FOR_132(s, p, o, m) BOOST_PP_IF(p(133, s), m, BOOST_PP_TUPLE_EAT_2)(133, s) BOOST_PP_IF(p(133, s), BOOST_PP_FOR_133, BOOST_PP_TUPLE_EAT_4)(o(133, s), p, o, m)\n# define BOOST_PP_FOR_133(s, p, o, m) BOOST_PP_IF(p(134, s), m, BOOST_PP_TUPLE_EAT_2)(134, s) BOOST_PP_IF(p(134, s), BOOST_PP_FOR_134, BOOST_PP_TUPLE_EAT_4)(o(134, s), p, o, m)\n# define BOOST_PP_FOR_134(s, p, o, m) BOOST_PP_IF(p(135, s), m, BOOST_PP_TUPLE_EAT_2)(135, s) BOOST_PP_IF(p(135, s), BOOST_PP_FOR_135, BOOST_PP_TUPLE_EAT_4)(o(135, s), p, o, m)\n# define BOOST_PP_FOR_135(s, p, o, m) BOOST_PP_IF(p(136, s), m, BOOST_PP_TUPLE_EAT_2)(136, s) BOOST_PP_IF(p(136, s), BOOST_PP_FOR_136, BOOST_PP_TUPLE_EAT_4)(o(136, s), p, o, m)\n# define BOOST_PP_FOR_136(s, p, o, m) BOOST_PP_IF(p(137, s), m, BOOST_PP_TUPLE_EAT_2)(137, s) BOOST_PP_IF(p(137, s), BOOST_PP_FOR_137, BOOST_PP_TUPLE_EAT_4)(o(137, s), p, o, m)\n# define BOOST_PP_FOR_137(s, p, o, m) BOOST_PP_IF(p(138, s), m, BOOST_PP_TUPLE_EAT_2)(138, s) BOOST_PP_IF(p(138, s), BOOST_PP_FOR_138, BOOST_PP_TUPLE_EAT_4)(o(138, s), p, o, m)\n# define BOOST_PP_FOR_138(s, p, o, m) BOOST_PP_IF(p(139, s), m, BOOST_PP_TUPLE_EAT_2)(139, s) BOOST_PP_IF(p(139, s), BOOST_PP_FOR_139, BOOST_PP_TUPLE_EAT_4)(o(139, s), p, o, m)\n# define BOOST_PP_FOR_139(s, p, o, m) BOOST_PP_IF(p(140, s), m, BOOST_PP_TUPLE_EAT_2)(140, s) BOOST_PP_IF(p(140, s), BOOST_PP_FOR_140, BOOST_PP_TUPLE_EAT_4)(o(140, s), p, o, m)\n# define BOOST_PP_FOR_140(s, p, o, m) BOOST_PP_IF(p(141, s), m, BOOST_PP_TUPLE_EAT_2)(141, s) BOOST_PP_IF(p(141, s), BOOST_PP_FOR_141, BOOST_PP_TUPLE_EAT_4)(o(141, s), p, o, m)\n# define BOOST_PP_FOR_141(s, p, o, m) BOOST_PP_IF(p(142, s), m, BOOST_PP_TUPLE_EAT_2)(142, s) BOOST_PP_IF(p(142, s), BOOST_PP_FOR_142, BOOST_PP_TUPLE_EAT_4)(o(142, s), p, o, m)\n# define BOOST_PP_FOR_142(s, p, o, m) BOOST_PP_IF(p(143, s), m, BOOST_PP_TUPLE_EAT_2)(143, s) BOOST_PP_IF(p(143, s), BOOST_PP_FOR_143, BOOST_PP_TUPLE_EAT_4)(o(143, s), p, o, m)\n# define BOOST_PP_FOR_143(s, p, o, m) BOOST_PP_IF(p(144, s), m, BOOST_PP_TUPLE_EAT_2)(144, s) BOOST_PP_IF(p(144, s), BOOST_PP_FOR_144, BOOST_PP_TUPLE_EAT_4)(o(144, s), p, o, m)\n# define BOOST_PP_FOR_144(s, p, o, m) BOOST_PP_IF(p(145, s), m, BOOST_PP_TUPLE_EAT_2)(145, s) BOOST_PP_IF(p(145, s), BOOST_PP_FOR_145, BOOST_PP_TUPLE_EAT_4)(o(145, s), p, o, m)\n# define BOOST_PP_FOR_145(s, p, o, m) BOOST_PP_IF(p(146, s), m, BOOST_PP_TUPLE_EAT_2)(146, s) BOOST_PP_IF(p(146, s), BOOST_PP_FOR_146, BOOST_PP_TUPLE_EAT_4)(o(146, s), p, o, m)\n# define BOOST_PP_FOR_146(s, p, o, m) BOOST_PP_IF(p(147, s), m, BOOST_PP_TUPLE_EAT_2)(147, s) BOOST_PP_IF(p(147, s), BOOST_PP_FOR_147, BOOST_PP_TUPLE_EAT_4)(o(147, s), p, o, m)\n# define BOOST_PP_FOR_147(s, p, o, m) BOOST_PP_IF(p(148, s), m, BOOST_PP_TUPLE_EAT_2)(148, s) BOOST_PP_IF(p(148, s), BOOST_PP_FOR_148, BOOST_PP_TUPLE_EAT_4)(o(148, s), p, o, m)\n# define BOOST_PP_FOR_148(s, p, o, m) BOOST_PP_IF(p(149, s), m, BOOST_PP_TUPLE_EAT_2)(149, s) BOOST_PP_IF(p(149, s), BOOST_PP_FOR_149, BOOST_PP_TUPLE_EAT_4)(o(149, s), p, o, m)\n# define BOOST_PP_FOR_149(s, p, o, m) BOOST_PP_IF(p(150, s), m, BOOST_PP_TUPLE_EAT_2)(150, s) BOOST_PP_IF(p(150, s), BOOST_PP_FOR_150, BOOST_PP_TUPLE_EAT_4)(o(150, s), p, o, m)\n# define BOOST_PP_FOR_150(s, p, o, m) BOOST_PP_IF(p(151, s), m, BOOST_PP_TUPLE_EAT_2)(151, s) BOOST_PP_IF(p(151, s), BOOST_PP_FOR_151, BOOST_PP_TUPLE_EAT_4)(o(151, s), p, o, m)\n# define BOOST_PP_FOR_151(s, p, o, m) BOOST_PP_IF(p(152, s), m, BOOST_PP_TUPLE_EAT_2)(152, s) BOOST_PP_IF(p(152, s), BOOST_PP_FOR_152, BOOST_PP_TUPLE_EAT_4)(o(152, s), p, o, m)\n# define BOOST_PP_FOR_152(s, p, o, m) BOOST_PP_IF(p(153, s), m, BOOST_PP_TUPLE_EAT_2)(153, s) BOOST_PP_IF(p(153, s), BOOST_PP_FOR_153, BOOST_PP_TUPLE_EAT_4)(o(153, s), p, o, m)\n# define BOOST_PP_FOR_153(s, p, o, m) BOOST_PP_IF(p(154, s), m, BOOST_PP_TUPLE_EAT_2)(154, s) BOOST_PP_IF(p(154, s), BOOST_PP_FOR_154, BOOST_PP_TUPLE_EAT_4)(o(154, s), p, o, m)\n# define BOOST_PP_FOR_154(s, p, o, m) BOOST_PP_IF(p(155, s), m, BOOST_PP_TUPLE_EAT_2)(155, s) BOOST_PP_IF(p(155, s), BOOST_PP_FOR_155, BOOST_PP_TUPLE_EAT_4)(o(155, s), p, o, m)\n# define BOOST_PP_FOR_155(s, p, o, m) BOOST_PP_IF(p(156, s), m, BOOST_PP_TUPLE_EAT_2)(156, s) BOOST_PP_IF(p(156, s), BOOST_PP_FOR_156, BOOST_PP_TUPLE_EAT_4)(o(156, s), p, o, m)\n# define BOOST_PP_FOR_156(s, p, o, m) BOOST_PP_IF(p(157, s), m, BOOST_PP_TUPLE_EAT_2)(157, s) BOOST_PP_IF(p(157, s), BOOST_PP_FOR_157, BOOST_PP_TUPLE_EAT_4)(o(157, s), p, o, m)\n# define BOOST_PP_FOR_157(s, p, o, m) BOOST_PP_IF(p(158, s), m, BOOST_PP_TUPLE_EAT_2)(158, s) BOOST_PP_IF(p(158, s), BOOST_PP_FOR_158, BOOST_PP_TUPLE_EAT_4)(o(158, s), p, o, m)\n# define BOOST_PP_FOR_158(s, p, o, m) BOOST_PP_IF(p(159, s), m, BOOST_PP_TUPLE_EAT_2)(159, s) BOOST_PP_IF(p(159, s), BOOST_PP_FOR_159, BOOST_PP_TUPLE_EAT_4)(o(159, s), p, o, m)\n# define BOOST_PP_FOR_159(s, p, o, m) BOOST_PP_IF(p(160, s), m, BOOST_PP_TUPLE_EAT_2)(160, s) BOOST_PP_IF(p(160, s), BOOST_PP_FOR_160, BOOST_PP_TUPLE_EAT_4)(o(160, s), p, o, m)\n# define BOOST_PP_FOR_160(s, p, o, m) BOOST_PP_IF(p(161, s), m, BOOST_PP_TUPLE_EAT_2)(161, s) BOOST_PP_IF(p(161, s), BOOST_PP_FOR_161, BOOST_PP_TUPLE_EAT_4)(o(161, s), p, o, m)\n# define BOOST_PP_FOR_161(s, p, o, m) BOOST_PP_IF(p(162, s), m, BOOST_PP_TUPLE_EAT_2)(162, s) BOOST_PP_IF(p(162, s), BOOST_PP_FOR_162, BOOST_PP_TUPLE_EAT_4)(o(162, s), p, o, m)\n# define BOOST_PP_FOR_162(s, p, o, m) BOOST_PP_IF(p(163, s), m, BOOST_PP_TUPLE_EAT_2)(163, s) BOOST_PP_IF(p(163, s), BOOST_PP_FOR_163, BOOST_PP_TUPLE_EAT_4)(o(163, s), p, o, m)\n# define BOOST_PP_FOR_163(s, p, o, m) BOOST_PP_IF(p(164, s), m, BOOST_PP_TUPLE_EAT_2)(164, s) BOOST_PP_IF(p(164, s), BOOST_PP_FOR_164, BOOST_PP_TUPLE_EAT_4)(o(164, s), p, o, m)\n# define BOOST_PP_FOR_164(s, p, o, m) BOOST_PP_IF(p(165, s), m, BOOST_PP_TUPLE_EAT_2)(165, s) BOOST_PP_IF(p(165, s), BOOST_PP_FOR_165, BOOST_PP_TUPLE_EAT_4)(o(165, s), p, o, m)\n# define BOOST_PP_FOR_165(s, p, o, m) BOOST_PP_IF(p(166, s), m, BOOST_PP_TUPLE_EAT_2)(166, s) BOOST_PP_IF(p(166, s), BOOST_PP_FOR_166, BOOST_PP_TUPLE_EAT_4)(o(166, s), p, o, m)\n# define BOOST_PP_FOR_166(s, p, o, m) BOOST_PP_IF(p(167, s), m, BOOST_PP_TUPLE_EAT_2)(167, s) BOOST_PP_IF(p(167, s), BOOST_PP_FOR_167, BOOST_PP_TUPLE_EAT_4)(o(167, s), p, o, m)\n# define BOOST_PP_FOR_167(s, p, o, m) BOOST_PP_IF(p(168, s), m, BOOST_PP_TUPLE_EAT_2)(168, s) BOOST_PP_IF(p(168, s), BOOST_PP_FOR_168, BOOST_PP_TUPLE_EAT_4)(o(168, s), p, o, m)\n# define BOOST_PP_FOR_168(s, p, o, m) BOOST_PP_IF(p(169, s), m, BOOST_PP_TUPLE_EAT_2)(169, s) BOOST_PP_IF(p(169, s), BOOST_PP_FOR_169, BOOST_PP_TUPLE_EAT_4)(o(169, s), p, o, m)\n# define BOOST_PP_FOR_169(s, p, o, m) BOOST_PP_IF(p(170, s), m, BOOST_PP_TUPLE_EAT_2)(170, s) BOOST_PP_IF(p(170, s), BOOST_PP_FOR_170, BOOST_PP_TUPLE_EAT_4)(o(170, s), p, o, m)\n# define BOOST_PP_FOR_170(s, p, o, m) BOOST_PP_IF(p(171, s), m, BOOST_PP_TUPLE_EAT_2)(171, s) BOOST_PP_IF(p(171, s), BOOST_PP_FOR_171, BOOST_PP_TUPLE_EAT_4)(o(171, s), p, o, m)\n# define BOOST_PP_FOR_171(s, p, o, m) BOOST_PP_IF(p(172, s), m, BOOST_PP_TUPLE_EAT_2)(172, s) BOOST_PP_IF(p(172, s), BOOST_PP_FOR_172, BOOST_PP_TUPLE_EAT_4)(o(172, s), p, o, m)\n# define BOOST_PP_FOR_172(s, p, o, m) BOOST_PP_IF(p(173, s), m, BOOST_PP_TUPLE_EAT_2)(173, s) BOOST_PP_IF(p(173, s), BOOST_PP_FOR_173, BOOST_PP_TUPLE_EAT_4)(o(173, s), p, o, m)\n# define BOOST_PP_FOR_173(s, p, o, m) BOOST_PP_IF(p(174, s), m, BOOST_PP_TUPLE_EAT_2)(174, s) BOOST_PP_IF(p(174, s), BOOST_PP_FOR_174, BOOST_PP_TUPLE_EAT_4)(o(174, s), p, o, m)\n# define BOOST_PP_FOR_174(s, p, o, m) BOOST_PP_IF(p(175, s), m, BOOST_PP_TUPLE_EAT_2)(175, s) BOOST_PP_IF(p(175, s), BOOST_PP_FOR_175, BOOST_PP_TUPLE_EAT_4)(o(175, s), p, o, m)\n# define BOOST_PP_FOR_175(s, p, o, m) BOOST_PP_IF(p(176, s), m, BOOST_PP_TUPLE_EAT_2)(176, s) BOOST_PP_IF(p(176, s), BOOST_PP_FOR_176, BOOST_PP_TUPLE_EAT_4)(o(176, s), p, o, m)\n# define BOOST_PP_FOR_176(s, p, o, m) BOOST_PP_IF(p(177, s), m, BOOST_PP_TUPLE_EAT_2)(177, s) BOOST_PP_IF(p(177, s), BOOST_PP_FOR_177, BOOST_PP_TUPLE_EAT_4)(o(177, s), p, o, m)\n# define BOOST_PP_FOR_177(s, p, o, m) BOOST_PP_IF(p(178, s), m, BOOST_PP_TUPLE_EAT_2)(178, s) BOOST_PP_IF(p(178, s), BOOST_PP_FOR_178, BOOST_PP_TUPLE_EAT_4)(o(178, s), p, o, m)\n# define BOOST_PP_FOR_178(s, p, o, m) BOOST_PP_IF(p(179, s), m, BOOST_PP_TUPLE_EAT_2)(179, s) BOOST_PP_IF(p(179, s), BOOST_PP_FOR_179, BOOST_PP_TUPLE_EAT_4)(o(179, s), p, o, m)\n# define BOOST_PP_FOR_179(s, p, o, m) BOOST_PP_IF(p(180, s), m, BOOST_PP_TUPLE_EAT_2)(180, s) BOOST_PP_IF(p(180, s), BOOST_PP_FOR_180, BOOST_PP_TUPLE_EAT_4)(o(180, s), p, o, m)\n# define BOOST_PP_FOR_180(s, p, o, m) BOOST_PP_IF(p(181, s), m, BOOST_PP_TUPLE_EAT_2)(181, s) BOOST_PP_IF(p(181, s), BOOST_PP_FOR_181, BOOST_PP_TUPLE_EAT_4)(o(181, s), p, o, m)\n# define BOOST_PP_FOR_181(s, p, o, m) BOOST_PP_IF(p(182, s), m, BOOST_PP_TUPLE_EAT_2)(182, s) BOOST_PP_IF(p(182, s), BOOST_PP_FOR_182, BOOST_PP_TUPLE_EAT_4)(o(182, s), p, o, m)\n# define BOOST_PP_FOR_182(s, p, o, m) BOOST_PP_IF(p(183, s), m, BOOST_PP_TUPLE_EAT_2)(183, s) BOOST_PP_IF(p(183, s), BOOST_PP_FOR_183, BOOST_PP_TUPLE_EAT_4)(o(183, s), p, o, m)\n# define BOOST_PP_FOR_183(s, p, o, m) BOOST_PP_IF(p(184, s), m, BOOST_PP_TUPLE_EAT_2)(184, s) BOOST_PP_IF(p(184, s), BOOST_PP_FOR_184, BOOST_PP_TUPLE_EAT_4)(o(184, s), p, o, m)\n# define BOOST_PP_FOR_184(s, p, o, m) BOOST_PP_IF(p(185, s), m, BOOST_PP_TUPLE_EAT_2)(185, s) BOOST_PP_IF(p(185, s), BOOST_PP_FOR_185, BOOST_PP_TUPLE_EAT_4)(o(185, s), p, o, m)\n# define BOOST_PP_FOR_185(s, p, o, m) BOOST_PP_IF(p(186, s), m, BOOST_PP_TUPLE_EAT_2)(186, s) BOOST_PP_IF(p(186, s), BOOST_PP_FOR_186, BOOST_PP_TUPLE_EAT_4)(o(186, s), p, o, m)\n# define BOOST_PP_FOR_186(s, p, o, m) BOOST_PP_IF(p(187, s), m, BOOST_PP_TUPLE_EAT_2)(187, s) BOOST_PP_IF(p(187, s), BOOST_PP_FOR_187, BOOST_PP_TUPLE_EAT_4)(o(187, s), p, o, m)\n# define BOOST_PP_FOR_187(s, p, o, m) BOOST_PP_IF(p(188, s), m, BOOST_PP_TUPLE_EAT_2)(188, s) BOOST_PP_IF(p(188, s), BOOST_PP_FOR_188, BOOST_PP_TUPLE_EAT_4)(o(188, s), p, o, m)\n# define BOOST_PP_FOR_188(s, p, o, m) BOOST_PP_IF(p(189, s), m, BOOST_PP_TUPLE_EAT_2)(189, s) BOOST_PP_IF(p(189, s), BOOST_PP_FOR_189, BOOST_PP_TUPLE_EAT_4)(o(189, s), p, o, m)\n# define BOOST_PP_FOR_189(s, p, o, m) BOOST_PP_IF(p(190, s), m, BOOST_PP_TUPLE_EAT_2)(190, s) BOOST_PP_IF(p(190, s), BOOST_PP_FOR_190, BOOST_PP_TUPLE_EAT_4)(o(190, s), p, o, m)\n# define BOOST_PP_FOR_190(s, p, o, m) BOOST_PP_IF(p(191, s), m, BOOST_PP_TUPLE_EAT_2)(191, s) BOOST_PP_IF(p(191, s), BOOST_PP_FOR_191, BOOST_PP_TUPLE_EAT_4)(o(191, s), p, o, m)\n# define BOOST_PP_FOR_191(s, p, o, m) BOOST_PP_IF(p(192, s), m, BOOST_PP_TUPLE_EAT_2)(192, s) BOOST_PP_IF(p(192, s), BOOST_PP_FOR_192, BOOST_PP_TUPLE_EAT_4)(o(192, s), p, o, m)\n# define BOOST_PP_FOR_192(s, p, o, m) BOOST_PP_IF(p(193, s), m, BOOST_PP_TUPLE_EAT_2)(193, s) BOOST_PP_IF(p(193, s), BOOST_PP_FOR_193, BOOST_PP_TUPLE_EAT_4)(o(193, s), p, o, m)\n# define BOOST_PP_FOR_193(s, p, o, m) BOOST_PP_IF(p(194, s), m, BOOST_PP_TUPLE_EAT_2)(194, s) BOOST_PP_IF(p(194, s), BOOST_PP_FOR_194, BOOST_PP_TUPLE_EAT_4)(o(194, s), p, o, m)\n# define BOOST_PP_FOR_194(s, p, o, m) BOOST_PP_IF(p(195, s), m, BOOST_PP_TUPLE_EAT_2)(195, s) BOOST_PP_IF(p(195, s), BOOST_PP_FOR_195, BOOST_PP_TUPLE_EAT_4)(o(195, s), p, o, m)\n# define BOOST_PP_FOR_195(s, p, o, m) BOOST_PP_IF(p(196, s), m, BOOST_PP_TUPLE_EAT_2)(196, s) BOOST_PP_IF(p(196, s), BOOST_PP_FOR_196, BOOST_PP_TUPLE_EAT_4)(o(196, s), p, o, m)\n# define BOOST_PP_FOR_196(s, p, o, m) BOOST_PP_IF(p(197, s), m, BOOST_PP_TUPLE_EAT_2)(197, s) BOOST_PP_IF(p(197, s), BOOST_PP_FOR_197, BOOST_PP_TUPLE_EAT_4)(o(197, s), p, o, m)\n# define BOOST_PP_FOR_197(s, p, o, m) BOOST_PP_IF(p(198, s), m, BOOST_PP_TUPLE_EAT_2)(198, s) BOOST_PP_IF(p(198, s), BOOST_PP_FOR_198, BOOST_PP_TUPLE_EAT_4)(o(198, s), p, o, m)\n# define BOOST_PP_FOR_198(s, p, o, m) BOOST_PP_IF(p(199, s), m, BOOST_PP_TUPLE_EAT_2)(199, s) BOOST_PP_IF(p(199, s), BOOST_PP_FOR_199, BOOST_PP_TUPLE_EAT_4)(o(199, s), p, o, m)\n# define BOOST_PP_FOR_199(s, p, o, m) BOOST_PP_IF(p(200, s), m, BOOST_PP_TUPLE_EAT_2)(200, s) BOOST_PP_IF(p(200, s), BOOST_PP_FOR_200, BOOST_PP_TUPLE_EAT_4)(o(200, s), p, o, m)\n# define BOOST_PP_FOR_200(s, p, o, m) BOOST_PP_IF(p(201, s), m, BOOST_PP_TUPLE_EAT_2)(201, s) BOOST_PP_IF(p(201, s), BOOST_PP_FOR_201, BOOST_PP_TUPLE_EAT_4)(o(201, s), p, o, m)\n# define BOOST_PP_FOR_201(s, p, o, m) BOOST_PP_IF(p(202, s), m, BOOST_PP_TUPLE_EAT_2)(202, s) BOOST_PP_IF(p(202, s), BOOST_PP_FOR_202, BOOST_PP_TUPLE_EAT_4)(o(202, s), p, o, m)\n# define BOOST_PP_FOR_202(s, p, o, m) BOOST_PP_IF(p(203, s), m, BOOST_PP_TUPLE_EAT_2)(203, s) BOOST_PP_IF(p(203, s), BOOST_PP_FOR_203, BOOST_PP_TUPLE_EAT_4)(o(203, s), p, o, m)\n# define BOOST_PP_FOR_203(s, p, o, m) BOOST_PP_IF(p(204, s), m, BOOST_PP_TUPLE_EAT_2)(204, s) BOOST_PP_IF(p(204, s), BOOST_PP_FOR_204, BOOST_PP_TUPLE_EAT_4)(o(204, s), p, o, m)\n# define BOOST_PP_FOR_204(s, p, o, m) BOOST_PP_IF(p(205, s), m, BOOST_PP_TUPLE_EAT_2)(205, s) BOOST_PP_IF(p(205, s), BOOST_PP_FOR_205, BOOST_PP_TUPLE_EAT_4)(o(205, s), p, o, m)\n# define BOOST_PP_FOR_205(s, p, o, m) BOOST_PP_IF(p(206, s), m, BOOST_PP_TUPLE_EAT_2)(206, s) BOOST_PP_IF(p(206, s), BOOST_PP_FOR_206, BOOST_PP_TUPLE_EAT_4)(o(206, s), p, o, m)\n# define BOOST_PP_FOR_206(s, p, o, m) BOOST_PP_IF(p(207, s), m, BOOST_PP_TUPLE_EAT_2)(207, s) BOOST_PP_IF(p(207, s), BOOST_PP_FOR_207, BOOST_PP_TUPLE_EAT_4)(o(207, s), p, o, m)\n# define BOOST_PP_FOR_207(s, p, o, m) BOOST_PP_IF(p(208, s), m, BOOST_PP_TUPLE_EAT_2)(208, s) BOOST_PP_IF(p(208, s), BOOST_PP_FOR_208, BOOST_PP_TUPLE_EAT_4)(o(208, s), p, o, m)\n# define BOOST_PP_FOR_208(s, p, o, m) BOOST_PP_IF(p(209, s), m, BOOST_PP_TUPLE_EAT_2)(209, s) BOOST_PP_IF(p(209, s), BOOST_PP_FOR_209, BOOST_PP_TUPLE_EAT_4)(o(209, s), p, o, m)\n# define BOOST_PP_FOR_209(s, p, o, m) BOOST_PP_IF(p(210, s), m, BOOST_PP_TUPLE_EAT_2)(210, s) BOOST_PP_IF(p(210, s), BOOST_PP_FOR_210, BOOST_PP_TUPLE_EAT_4)(o(210, s), p, o, m)\n# define BOOST_PP_FOR_210(s, p, o, m) BOOST_PP_IF(p(211, s), m, BOOST_PP_TUPLE_EAT_2)(211, s) BOOST_PP_IF(p(211, s), BOOST_PP_FOR_211, BOOST_PP_TUPLE_EAT_4)(o(211, s), p, o, m)\n# define BOOST_PP_FOR_211(s, p, o, m) BOOST_PP_IF(p(212, s), m, BOOST_PP_TUPLE_EAT_2)(212, s) BOOST_PP_IF(p(212, s), BOOST_PP_FOR_212, BOOST_PP_TUPLE_EAT_4)(o(212, s), p, o, m)\n# define BOOST_PP_FOR_212(s, p, o, m) BOOST_PP_IF(p(213, s), m, BOOST_PP_TUPLE_EAT_2)(213, s) BOOST_PP_IF(p(213, s), BOOST_PP_FOR_213, BOOST_PP_TUPLE_EAT_4)(o(213, s), p, o, m)\n# define BOOST_PP_FOR_213(s, p, o, m) BOOST_PP_IF(p(214, s), m, BOOST_PP_TUPLE_EAT_2)(214, s) BOOST_PP_IF(p(214, s), BOOST_PP_FOR_214, BOOST_PP_TUPLE_EAT_4)(o(214, s), p, o, m)\n# define BOOST_PP_FOR_214(s, p, o, m) BOOST_PP_IF(p(215, s), m, BOOST_PP_TUPLE_EAT_2)(215, s) BOOST_PP_IF(p(215, s), BOOST_PP_FOR_215, BOOST_PP_TUPLE_EAT_4)(o(215, s), p, o, m)\n# define BOOST_PP_FOR_215(s, p, o, m) BOOST_PP_IF(p(216, s), m, BOOST_PP_TUPLE_EAT_2)(216, s) BOOST_PP_IF(p(216, s), BOOST_PP_FOR_216, BOOST_PP_TUPLE_EAT_4)(o(216, s), p, o, m)\n# define BOOST_PP_FOR_216(s, p, o, m) BOOST_PP_IF(p(217, s), m, BOOST_PP_TUPLE_EAT_2)(217, s) BOOST_PP_IF(p(217, s), BOOST_PP_FOR_217, BOOST_PP_TUPLE_EAT_4)(o(217, s), p, o, m)\n# define BOOST_PP_FOR_217(s, p, o, m) BOOST_PP_IF(p(218, s), m, BOOST_PP_TUPLE_EAT_2)(218, s) BOOST_PP_IF(p(218, s), BOOST_PP_FOR_218, BOOST_PP_TUPLE_EAT_4)(o(218, s), p, o, m)\n# define BOOST_PP_FOR_218(s, p, o, m) BOOST_PP_IF(p(219, s), m, BOOST_PP_TUPLE_EAT_2)(219, s) BOOST_PP_IF(p(219, s), BOOST_PP_FOR_219, BOOST_PP_TUPLE_EAT_4)(o(219, s), p, o, m)\n# define BOOST_PP_FOR_219(s, p, o, m) BOOST_PP_IF(p(220, s), m, BOOST_PP_TUPLE_EAT_2)(220, s) BOOST_PP_IF(p(220, s), BOOST_PP_FOR_220, BOOST_PP_TUPLE_EAT_4)(o(220, s), p, o, m)\n# define BOOST_PP_FOR_220(s, p, o, m) BOOST_PP_IF(p(221, s), m, BOOST_PP_TUPLE_EAT_2)(221, s) BOOST_PP_IF(p(221, s), BOOST_PP_FOR_221, BOOST_PP_TUPLE_EAT_4)(o(221, s), p, o, m)\n# define BOOST_PP_FOR_221(s, p, o, m) BOOST_PP_IF(p(222, s), m, BOOST_PP_TUPLE_EAT_2)(222, s) BOOST_PP_IF(p(222, s), BOOST_PP_FOR_222, BOOST_PP_TUPLE_EAT_4)(o(222, s), p, o, m)\n# define BOOST_PP_FOR_222(s, p, o, m) BOOST_PP_IF(p(223, s), m, BOOST_PP_TUPLE_EAT_2)(223, s) BOOST_PP_IF(p(223, s), BOOST_PP_FOR_223, BOOST_PP_TUPLE_EAT_4)(o(223, s), p, o, m)\n# define BOOST_PP_FOR_223(s, p, o, m) BOOST_PP_IF(p(224, s), m, BOOST_PP_TUPLE_EAT_2)(224, s) BOOST_PP_IF(p(224, s), BOOST_PP_FOR_224, BOOST_PP_TUPLE_EAT_4)(o(224, s), p, o, m)\n# define BOOST_PP_FOR_224(s, p, o, m) BOOST_PP_IF(p(225, s), m, BOOST_PP_TUPLE_EAT_2)(225, s) BOOST_PP_IF(p(225, s), BOOST_PP_FOR_225, BOOST_PP_TUPLE_EAT_4)(o(225, s), p, o, m)\n# define BOOST_PP_FOR_225(s, p, o, m) BOOST_PP_IF(p(226, s), m, BOOST_PP_TUPLE_EAT_2)(226, s) BOOST_PP_IF(p(226, s), BOOST_PP_FOR_226, BOOST_PP_TUPLE_EAT_4)(o(226, s), p, o, m)\n# define BOOST_PP_FOR_226(s, p, o, m) BOOST_PP_IF(p(227, s), m, BOOST_PP_TUPLE_EAT_2)(227, s) BOOST_PP_IF(p(227, s), BOOST_PP_FOR_227, BOOST_PP_TUPLE_EAT_4)(o(227, s), p, o, m)\n# define BOOST_PP_FOR_227(s, p, o, m) BOOST_PP_IF(p(228, s), m, BOOST_PP_TUPLE_EAT_2)(228, s) BOOST_PP_IF(p(228, s), BOOST_PP_FOR_228, BOOST_PP_TUPLE_EAT_4)(o(228, s), p, o, m)\n# define BOOST_PP_FOR_228(s, p, o, m) BOOST_PP_IF(p(229, s), m, BOOST_PP_TUPLE_EAT_2)(229, s) BOOST_PP_IF(p(229, s), BOOST_PP_FOR_229, BOOST_PP_TUPLE_EAT_4)(o(229, s), p, o, m)\n# define BOOST_PP_FOR_229(s, p, o, m) BOOST_PP_IF(p(230, s), m, BOOST_PP_TUPLE_EAT_2)(230, s) BOOST_PP_IF(p(230, s), BOOST_PP_FOR_230, BOOST_PP_TUPLE_EAT_4)(o(230, s), p, o, m)\n# define BOOST_PP_FOR_230(s, p, o, m) BOOST_PP_IF(p(231, s), m, BOOST_PP_TUPLE_EAT_2)(231, s) BOOST_PP_IF(p(231, s), BOOST_PP_FOR_231, BOOST_PP_TUPLE_EAT_4)(o(231, s), p, o, m)\n# define BOOST_PP_FOR_231(s, p, o, m) BOOST_PP_IF(p(232, s), m, BOOST_PP_TUPLE_EAT_2)(232, s) BOOST_PP_IF(p(232, s), BOOST_PP_FOR_232, BOOST_PP_TUPLE_EAT_4)(o(232, s), p, o, m)\n# define BOOST_PP_FOR_232(s, p, o, m) BOOST_PP_IF(p(233, s), m, BOOST_PP_TUPLE_EAT_2)(233, s) BOOST_PP_IF(p(233, s), BOOST_PP_FOR_233, BOOST_PP_TUPLE_EAT_4)(o(233, s), p, o, m)\n# define BOOST_PP_FOR_233(s, p, o, m) BOOST_PP_IF(p(234, s), m, BOOST_PP_TUPLE_EAT_2)(234, s) BOOST_PP_IF(p(234, s), BOOST_PP_FOR_234, BOOST_PP_TUPLE_EAT_4)(o(234, s), p, o, m)\n# define BOOST_PP_FOR_234(s, p, o, m) BOOST_PP_IF(p(235, s), m, BOOST_PP_TUPLE_EAT_2)(235, s) BOOST_PP_IF(p(235, s), BOOST_PP_FOR_235, BOOST_PP_TUPLE_EAT_4)(o(235, s), p, o, m)\n# define BOOST_PP_FOR_235(s, p, o, m) BOOST_PP_IF(p(236, s), m, BOOST_PP_TUPLE_EAT_2)(236, s) BOOST_PP_IF(p(236, s), BOOST_PP_FOR_236, BOOST_PP_TUPLE_EAT_4)(o(236, s), p, o, m)\n# define BOOST_PP_FOR_236(s, p, o, m) BOOST_PP_IF(p(237, s), m, BOOST_PP_TUPLE_EAT_2)(237, s) BOOST_PP_IF(p(237, s), BOOST_PP_FOR_237, BOOST_PP_TUPLE_EAT_4)(o(237, s), p, o, m)\n# define BOOST_PP_FOR_237(s, p, o, m) BOOST_PP_IF(p(238, s), m, BOOST_PP_TUPLE_EAT_2)(238, s) BOOST_PP_IF(p(238, s), BOOST_PP_FOR_238, BOOST_PP_TUPLE_EAT_4)(o(238, s), p, o, m)\n# define BOOST_PP_FOR_238(s, p, o, m) BOOST_PP_IF(p(239, s), m, BOOST_PP_TUPLE_EAT_2)(239, s) BOOST_PP_IF(p(239, s), BOOST_PP_FOR_239, BOOST_PP_TUPLE_EAT_4)(o(239, s), p, o, m)\n# define BOOST_PP_FOR_239(s, p, o, m) BOOST_PP_IF(p(240, s), m, BOOST_PP_TUPLE_EAT_2)(240, s) BOOST_PP_IF(p(240, s), BOOST_PP_FOR_240, BOOST_PP_TUPLE_EAT_4)(o(240, s), p, o, m)\n# define BOOST_PP_FOR_240(s, p, o, m) BOOST_PP_IF(p(241, s), m, BOOST_PP_TUPLE_EAT_2)(241, s) BOOST_PP_IF(p(241, s), BOOST_PP_FOR_241, BOOST_PP_TUPLE_EAT_4)(o(241, s), p, o, m)\n# define BOOST_PP_FOR_241(s, p, o, m) BOOST_PP_IF(p(242, s), m, BOOST_PP_TUPLE_EAT_2)(242, s) BOOST_PP_IF(p(242, s), BOOST_PP_FOR_242, BOOST_PP_TUPLE_EAT_4)(o(242, s), p, o, m)\n# define BOOST_PP_FOR_242(s, p, o, m) BOOST_PP_IF(p(243, s), m, BOOST_PP_TUPLE_EAT_2)(243, s) BOOST_PP_IF(p(243, s), BOOST_PP_FOR_243, BOOST_PP_TUPLE_EAT_4)(o(243, s), p, o, m)\n# define BOOST_PP_FOR_243(s, p, o, m) BOOST_PP_IF(p(244, s), m, BOOST_PP_TUPLE_EAT_2)(244, s) BOOST_PP_IF(p(244, s), BOOST_PP_FOR_244, BOOST_PP_TUPLE_EAT_4)(o(244, s), p, o, m)\n# define BOOST_PP_FOR_244(s, p, o, m) BOOST_PP_IF(p(245, s), m, BOOST_PP_TUPLE_EAT_2)(245, s) BOOST_PP_IF(p(245, s), BOOST_PP_FOR_245, BOOST_PP_TUPLE_EAT_4)(o(245, s), p, o, m)\n# define BOOST_PP_FOR_245(s, p, o, m) BOOST_PP_IF(p(246, s), m, BOOST_PP_TUPLE_EAT_2)(246, s) BOOST_PP_IF(p(246, s), BOOST_PP_FOR_246, BOOST_PP_TUPLE_EAT_4)(o(246, s), p, o, m)\n# define BOOST_PP_FOR_246(s, p, o, m) BOOST_PP_IF(p(247, s), m, BOOST_PP_TUPLE_EAT_2)(247, s) BOOST_PP_IF(p(247, s), BOOST_PP_FOR_247, BOOST_PP_TUPLE_EAT_4)(o(247, s), p, o, m)\n# define BOOST_PP_FOR_247(s, p, o, m) BOOST_PP_IF(p(248, s), m, BOOST_PP_TUPLE_EAT_2)(248, s) BOOST_PP_IF(p(248, s), BOOST_PP_FOR_248, BOOST_PP_TUPLE_EAT_4)(o(248, s), p, o, m)\n# define BOOST_PP_FOR_248(s, p, o, m) BOOST_PP_IF(p(249, s), m, BOOST_PP_TUPLE_EAT_2)(249, s) BOOST_PP_IF(p(249, s), BOOST_PP_FOR_249, BOOST_PP_TUPLE_EAT_4)(o(249, s), p, o, m)\n# define BOOST_PP_FOR_249(s, p, o, m) BOOST_PP_IF(p(250, s), m, BOOST_PP_TUPLE_EAT_2)(250, s) BOOST_PP_IF(p(250, s), BOOST_PP_FOR_250, BOOST_PP_TUPLE_EAT_4)(o(250, s), p, o, m)\n# define BOOST_PP_FOR_250(s, p, o, m) BOOST_PP_IF(p(251, s), m, BOOST_PP_TUPLE_EAT_2)(251, s) BOOST_PP_IF(p(251, s), BOOST_PP_FOR_251, BOOST_PP_TUPLE_EAT_4)(o(251, s), p, o, m)\n# define BOOST_PP_FOR_251(s, p, o, m) BOOST_PP_IF(p(252, s), m, BOOST_PP_TUPLE_EAT_2)(252, s) BOOST_PP_IF(p(252, s), BOOST_PP_FOR_252, BOOST_PP_TUPLE_EAT_4)(o(252, s), p, o, m)\n# define BOOST_PP_FOR_252(s, p, o, m) BOOST_PP_IF(p(253, s), m, BOOST_PP_TUPLE_EAT_2)(253, s) BOOST_PP_IF(p(253, s), BOOST_PP_FOR_253, BOOST_PP_TUPLE_EAT_4)(o(253, s), p, o, m)\n# define BOOST_PP_FOR_253(s, p, o, m) BOOST_PP_IF(p(254, s), m, BOOST_PP_TUPLE_EAT_2)(254, s) BOOST_PP_IF(p(254, s), BOOST_PP_FOR_254, BOOST_PP_TUPLE_EAT_4)(o(254, s), p, o, m)\n# define BOOST_PP_FOR_254(s, p, o, m) BOOST_PP_IF(p(255, s), m, BOOST_PP_TUPLE_EAT_2)(255, s) BOOST_PP_IF(p(255, s), BOOST_PP_FOR_255, BOOST_PP_TUPLE_EAT_4)(o(255, s), p, o, m)\n# define BOOST_PP_FOR_255(s, p, o, m) BOOST_PP_IF(p(256, s), m, BOOST_PP_TUPLE_EAT_2)(256, s) BOOST_PP_IF(p(256, s), BOOST_PP_FOR_256, BOOST_PP_TUPLE_EAT_4)(o(256, s), p, o, m)\n# define BOOST_PP_FOR_256(s, p, o, m) BOOST_PP_IF(p(257, s), m, BOOST_PP_TUPLE_EAT_2)(257, s) BOOST_PP_IF(p(257, s), BOOST_PP_FOR_257, BOOST_PP_TUPLE_EAT_4)(o(257, s), p, o, m)\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/repetition/enum.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_ENUM_HPP\n# define BOOST_PREPROCESSOR_REPETITION_ENUM_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/debug/error.hpp>\n# include <boost/preprocessor/detail/auto_rec.hpp>\n# include <boost/preprocessor/punctuation/comma_if.hpp>\n# include <boost/preprocessor/repetition/repeat.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n#\n# /* BOOST_PP_ENUM */\n#\n# if 0\n#    define BOOST_PP_ENUM(count, macro, data)\n# endif\n#\n# define BOOST_PP_ENUM BOOST_PP_CAT(BOOST_PP_ENUM_, BOOST_PP_AUTO_REC(BOOST_PP_REPEAT_P, 4))\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ENUM_1(c, m, d) BOOST_PP_REPEAT_1(c, BOOST_PP_ENUM_M_1, (m, d))\n#    define BOOST_PP_ENUM_2(c, m, d) BOOST_PP_REPEAT_2(c, BOOST_PP_ENUM_M_2, (m, d))\n#    define BOOST_PP_ENUM_3(c, m, d) BOOST_PP_REPEAT_3(c, BOOST_PP_ENUM_M_3, (m, d))\n# else\n#    define BOOST_PP_ENUM_1(c, m, d) BOOST_PP_ENUM_1_I(c, m, d)\n#    define BOOST_PP_ENUM_2(c, m, d) BOOST_PP_ENUM_2_I(c, m, d)\n#    define BOOST_PP_ENUM_3(c, m, d) BOOST_PP_ENUM_3_I(c, m, d)\n#    define BOOST_PP_ENUM_1_I(c, m, d) BOOST_PP_REPEAT_1(c, BOOST_PP_ENUM_M_1, (m, d))\n#    define BOOST_PP_ENUM_2_I(c, m, d) BOOST_PP_REPEAT_2(c, BOOST_PP_ENUM_M_2, (m, d))\n#    define BOOST_PP_ENUM_3_I(c, m, d) BOOST_PP_REPEAT_3(c, BOOST_PP_ENUM_M_3, (m, d))\n# endif\n#\n# define BOOST_PP_ENUM_4(c, m, d) BOOST_PP_ERROR(0x0003)\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()\n#    define BOOST_PP_ENUM_M_1(z, n, md) BOOST_PP_ENUM_M_1_IM(z, n, BOOST_PP_TUPLE_REM_2 md)\n#    define BOOST_PP_ENUM_M_2(z, n, md) BOOST_PP_ENUM_M_2_IM(z, n, BOOST_PP_TUPLE_REM_2 md)\n#    define BOOST_PP_ENUM_M_3(z, n, md) BOOST_PP_ENUM_M_3_IM(z, n, BOOST_PP_TUPLE_REM_2 md)\n#    define BOOST_PP_ENUM_M_1_IM(z, n, im) BOOST_PP_ENUM_M_1_I(z, n, im)\n#    define BOOST_PP_ENUM_M_2_IM(z, n, im) BOOST_PP_ENUM_M_2_I(z, n, im)\n#    define BOOST_PP_ENUM_M_3_IM(z, n, im) BOOST_PP_ENUM_M_3_I(z, n, im)\n# else\n#    define BOOST_PP_ENUM_M_1(z, n, md) BOOST_PP_ENUM_M_1_I(z, n, BOOST_PP_TUPLE_ELEM(2, 0, md), BOOST_PP_TUPLE_ELEM(2, 1, md))\n#    define BOOST_PP_ENUM_M_2(z, n, md) BOOST_PP_ENUM_M_2_I(z, n, BOOST_PP_TUPLE_ELEM(2, 0, md), BOOST_PP_TUPLE_ELEM(2, 1, md))\n#    define BOOST_PP_ENUM_M_3(z, n, md) BOOST_PP_ENUM_M_3_I(z, n, BOOST_PP_TUPLE_ELEM(2, 0, md), BOOST_PP_TUPLE_ELEM(2, 1, md))\n# endif\n#\n# define BOOST_PP_ENUM_M_1_I(z, n, m, d) BOOST_PP_COMMA_IF(n) m(z, n, d)\n# define BOOST_PP_ENUM_M_2_I(z, n, m, d) BOOST_PP_COMMA_IF(n) m(z, n, d)\n# define BOOST_PP_ENUM_M_3_I(z, n, m, d) BOOST_PP_COMMA_IF(n) m(z, n, d)\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/repetition/enum_binary_params.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_ENUM_BINARY_PARAMS_HPP\n# define BOOST_PREPROCESSOR_REPETITION_ENUM_BINARY_PARAMS_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/punctuation/comma_if.hpp>\n# include <boost/preprocessor/repetition/repeat.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n#\n# /* BOOST_PP_ENUM_BINARY_PARAMS */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ENUM_BINARY_PARAMS(count, p1, p2) BOOST_PP_REPEAT(count, BOOST_PP_ENUM_BINARY_PARAMS_M, (p1, p2))\n# else\n#    define BOOST_PP_ENUM_BINARY_PARAMS(count, p1, p2) BOOST_PP_ENUM_BINARY_PARAMS_I(count, p1, p2)\n#    define BOOST_PP_ENUM_BINARY_PARAMS_I(count, p1, p2) BOOST_PP_REPEAT(count, BOOST_PP_ENUM_BINARY_PARAMS_M, (p1, p2))\n# endif\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()\n#    define BOOST_PP_ENUM_BINARY_PARAMS_M(z, n, pp) BOOST_PP_ENUM_BINARY_PARAMS_M_IM(z, n, BOOST_PP_TUPLE_REM_2 pp)\n#    define BOOST_PP_ENUM_BINARY_PARAMS_M_IM(z, n, im) BOOST_PP_ENUM_BINARY_PARAMS_M_I(z, n, im)\n# else\n#    define BOOST_PP_ENUM_BINARY_PARAMS_M(z, n, pp) BOOST_PP_ENUM_BINARY_PARAMS_M_I(z, n, BOOST_PP_TUPLE_ELEM(2, 0, pp), BOOST_PP_TUPLE_ELEM(2, 1, pp))\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    define BOOST_PP_ENUM_BINARY_PARAMS_M_I(z, n, p1, p2) BOOST_PP_ENUM_BINARY_PARAMS_M_II(z, n, p1, p2)\n#    define BOOST_PP_ENUM_BINARY_PARAMS_M_II(z, n, p1, p2) BOOST_PP_COMMA_IF(n) p1 ## n p2 ## n\n# else\n#    define BOOST_PP_ENUM_BINARY_PARAMS_M_I(z, n, p1, p2) BOOST_PP_COMMA_IF(n) BOOST_PP_CAT(p1, n) BOOST_PP_CAT(p2, n)\n# endif\n#\n# /* BOOST_PP_ENUM_BINARY_PARAMS_Z */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ENUM_BINARY_PARAMS_Z(z, count, p1, p2) BOOST_PP_REPEAT_ ## z(count, BOOST_PP_ENUM_BINARY_PARAMS_M, (p1, p2))\n# else\n#    define BOOST_PP_ENUM_BINARY_PARAMS_Z(z, count, p1, p2) BOOST_PP_ENUM_BINARY_PARAMS_Z_I(z, count, p1, p2)\n#    define BOOST_PP_ENUM_BINARY_PARAMS_Z_I(z, count, p1, p2) BOOST_PP_REPEAT_ ## z(count, BOOST_PP_ENUM_BINARY_PARAMS_M, (p1, p2))\n# endif\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/repetition/enum_params.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_ENUM_PARAMS_HPP\n# define BOOST_PREPROCESSOR_REPETITION_ENUM_PARAMS_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/punctuation/comma_if.hpp>\n# include <boost/preprocessor/repetition/repeat.hpp>\n#\n# /* BOOST_PP_ENUM_PARAMS */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ENUM_PARAMS(count, param) BOOST_PP_REPEAT(count, BOOST_PP_ENUM_PARAMS_M, param)\n# else\n#    define BOOST_PP_ENUM_PARAMS(count, param) BOOST_PP_ENUM_PARAMS_I(count, param)\n#    define BOOST_PP_ENUM_PARAMS_I(count, param) BOOST_PP_REPEAT(count, BOOST_PP_ENUM_PARAMS_M, param)\n# endif\n#\n# define BOOST_PP_ENUM_PARAMS_M(z, n, param) BOOST_PP_COMMA_IF(n) param ## n\n#\n# /* BOOST_PP_ENUM_PARAMS_Z */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ENUM_PARAMS_Z(z, count, param) BOOST_PP_REPEAT_ ## z(count, BOOST_PP_ENUM_PARAMS_M, param)\n# else\n#    define BOOST_PP_ENUM_PARAMS_Z(z, count, param) BOOST_PP_ENUM_PARAMS_Z_I(z, count, param)\n#    define BOOST_PP_ENUM_PARAMS_Z_I(z, count, param) BOOST_PP_REPEAT_ ## z(count, BOOST_PP_ENUM_PARAMS_M, param)\n# endif\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/repetition/enum_params_with_a_default.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_ENUM_PARAMS_WITH_A_DEFAULT_HPP\n# define BOOST_PREPROCESSOR_REPETITION_ENUM_PARAMS_WITH_A_DEFAULT_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/facilities/intercept.hpp>\n# include <boost/preprocessor/repetition/enum_binary_params.hpp>\n#\n# /* BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT */\n#\n# define BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(count, param, def) BOOST_PP_ENUM_BINARY_PARAMS(count, param, = def BOOST_PP_INTERCEPT)\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/repetition/enum_shifted.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_ENUM_SHIFTED_HPP\n# define BOOST_PREPROCESSOR_REPETITION_ENUM_SHIFTED_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/arithmetic/dec.hpp>\n# include <boost/preprocessor/arithmetic/inc.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/debug/error.hpp>\n# include <boost/preprocessor/detail/auto_rec.hpp>\n# include <boost/preprocessor/punctuation/comma_if.hpp>\n# include <boost/preprocessor/repetition/repeat.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n#\n# /* BOOST_PP_ENUM_SHIFTED */\n#\n# if 0\n#    define BOOST_PP_ENUM_SHIFTED(count, macro, data)\n# endif\n#\n# define BOOST_PP_ENUM_SHIFTED BOOST_PP_CAT(BOOST_PP_ENUM_SHIFTED_, BOOST_PP_AUTO_REC(BOOST_PP_REPEAT_P, 4))\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ENUM_SHIFTED_1(c, m, d) BOOST_PP_REPEAT_1(BOOST_PP_DEC(c), BOOST_PP_ENUM_SHIFTED_M_1, (m, d))\n#    define BOOST_PP_ENUM_SHIFTED_2(c, m, d) BOOST_PP_REPEAT_2(BOOST_PP_DEC(c), BOOST_PP_ENUM_SHIFTED_M_2, (m, d))\n#    define BOOST_PP_ENUM_SHIFTED_3(c, m, d) BOOST_PP_REPEAT_3(BOOST_PP_DEC(c), BOOST_PP_ENUM_SHIFTED_M_3, (m, d))\n# else\n#    define BOOST_PP_ENUM_SHIFTED_1(c, m, d) BOOST_PP_ENUM_SHIFTED_1_I(c, m, d)\n#    define BOOST_PP_ENUM_SHIFTED_2(c, m, d) BOOST_PP_ENUM_SHIFTED_1_2(c, m, d)\n#    define BOOST_PP_ENUM_SHIFTED_3(c, m, d) BOOST_PP_ENUM_SHIFTED_1_3(c, m, d)\n#    define BOOST_PP_ENUM_SHIFTED_1_I(c, m, d) BOOST_PP_REPEAT_1(BOOST_PP_DEC(c), BOOST_PP_ENUM_SHIFTED_M_1, (m, d))\n#    define BOOST_PP_ENUM_SHIFTED_2_I(c, m, d) BOOST_PP_REPEAT_2(BOOST_PP_DEC(c), BOOST_PP_ENUM_SHIFTED_M_2, (m, d))\n#    define BOOST_PP_ENUM_SHIFTED_3_I(c, m, d) BOOST_PP_REPEAT_3(BOOST_PP_DEC(c), BOOST_PP_ENUM_SHIFTED_M_3, (m, d))\n# endif\n#\n# define BOOST_PP_ENUM_SHIFTED_4(c, m, d) BOOST_PP_ERROR(0x0003)\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()\n#    define BOOST_PP_ENUM_SHIFTED_M_1(z, n, md) BOOST_PP_ENUM_SHIFTED_M_1_IM(z, n, BOOST_PP_TUPLE_REM_2 md)\n#    define BOOST_PP_ENUM_SHIFTED_M_2(z, n, md) BOOST_PP_ENUM_SHIFTED_M_2_IM(z, n, BOOST_PP_TUPLE_REM_2 md)\n#    define BOOST_PP_ENUM_SHIFTED_M_3(z, n, md) BOOST_PP_ENUM_SHIFTED_M_3_IM(z, n, BOOST_PP_TUPLE_REM_2 md)\n#    define BOOST_PP_ENUM_SHIFTED_M_1_IM(z, n, im) BOOST_PP_ENUM_SHIFTED_M_1_I(z, n, im)\n#    define BOOST_PP_ENUM_SHIFTED_M_2_IM(z, n, im) BOOST_PP_ENUM_SHIFTED_M_2_I(z, n, im)\n#    define BOOST_PP_ENUM_SHIFTED_M_3_IM(z, n, im) BOOST_PP_ENUM_SHIFTED_M_3_I(z, n, im)\n# else\n#    define BOOST_PP_ENUM_SHIFTED_M_1(z, n, md) BOOST_PP_ENUM_SHIFTED_M_1_I(z, n, BOOST_PP_TUPLE_ELEM(2, 0, md), BOOST_PP_TUPLE_ELEM(2, 1, md))\n#    define BOOST_PP_ENUM_SHIFTED_M_2(z, n, md) BOOST_PP_ENUM_SHIFTED_M_2_I(z, n, BOOST_PP_TUPLE_ELEM(2, 0, md), BOOST_PP_TUPLE_ELEM(2, 1, md))\n#    define BOOST_PP_ENUM_SHIFTED_M_3(z, n, md) BOOST_PP_ENUM_SHIFTED_M_3_I(z, n, BOOST_PP_TUPLE_ELEM(2, 0, md), BOOST_PP_TUPLE_ELEM(2, 1, md))\n# endif\n#\n# define BOOST_PP_ENUM_SHIFTED_M_1_I(z, n, m, d) BOOST_PP_COMMA_IF(n) m(z, BOOST_PP_INC(n), d)\n# define BOOST_PP_ENUM_SHIFTED_M_2_I(z, n, m, d) BOOST_PP_COMMA_IF(n) m(z, BOOST_PP_INC(n), d)\n# define BOOST_PP_ENUM_SHIFTED_M_3_I(z, n, m, d) BOOST_PP_COMMA_IF(n) m(z, BOOST_PP_INC(n), d)\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/repetition/enum_shifted_params.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_ENUM_SHIFTED_PARAMS_HPP\n# define BOOST_PREPROCESSOR_REPETITION_ENUM_SHIFTED_PARAMS_HPP\n#\n# include <boost/preprocessor/arithmetic/dec.hpp>\n# include <boost/preprocessor/arithmetic/inc.hpp>\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/punctuation/comma_if.hpp>\n# include <boost/preprocessor/repetition/repeat.hpp>\n#\n# /* BOOST_PP_ENUM_SHIFTED_PARAMS */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ENUM_SHIFTED_PARAMS(count, param) BOOST_PP_REPEAT(BOOST_PP_DEC(count), BOOST_PP_ENUM_SHIFTED_PARAMS_M, param)\n# else\n#    define BOOST_PP_ENUM_SHIFTED_PARAMS(count, param) BOOST_PP_ENUM_SHIFTED_PARAMS_I(count, param)\n#    define BOOST_PP_ENUM_SHIFTED_PARAMS_I(count, param) BOOST_PP_REPEAT(BOOST_PP_DEC(count), BOOST_PP_ENUM_SHIFTED_PARAMS_M, param)\n# endif\n#\n# define BOOST_PP_ENUM_SHIFTED_PARAMS_M(z, n, param) BOOST_PP_COMMA_IF(n) BOOST_PP_CAT(param, BOOST_PP_INC(n))\n#\n# /* BOOST_PP_ENUM_SHIFTED_PARAMS_Z */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ENUM_SHIFTED_PARAMS_Z(z, count, param) BOOST_PP_REPEAT_ ## z(BOOST_PP_DEC(count), BOOST_PP_ENUM_SHIFTED_PARAMS_M, param)\n# else\n#    define BOOST_PP_ENUM_SHIFTED_PARAMS_Z(z, count, param) BOOST_PP_ENUM_SHIFTED_PARAMS_Z_I(z, count, param)\n#    define BOOST_PP_ENUM_SHIFTED_PARAMS_Z_I(z, count, param) BOOST_PP_REPEAT_ ## z(BOOST_PP_DEC(count), BOOST_PP_ENUM_SHIFTED_PARAMS_M, param)\n# endif\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/repetition/enum_trailing.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_ENUM_TRAILING_HPP\n# define BOOST_PREPROCESSOR_REPETITION_ENUM_TRAILING_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/debug/error.hpp>\n# include <boost/preprocessor/detail/auto_rec.hpp>\n# include <boost/preprocessor/repetition/repeat.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n#\n# /* BOOST_PP_ENUM_TRAILING */\n#\n# if 0\n#    define BOOST_PP_ENUM_TRAILING(count, macro, data)\n# endif\n#\n# define BOOST_PP_ENUM_TRAILING BOOST_PP_CAT(BOOST_PP_ENUM_TRAILING_, BOOST_PP_AUTO_REC(BOOST_PP_REPEAT_P, 4))\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ENUM_TRAILING_1(c, m, d) BOOST_PP_REPEAT_1(c, BOOST_PP_ENUM_TRAILING_M_1, (m, d))\n#    define BOOST_PP_ENUM_TRAILING_2(c, m, d) BOOST_PP_REPEAT_2(c, BOOST_PP_ENUM_TRAILING_M_2, (m, d))\n#    define BOOST_PP_ENUM_TRAILING_3(c, m, d) BOOST_PP_REPEAT_3(c, BOOST_PP_ENUM_TRAILING_M_3, (m, d))\n# else\n#    define BOOST_PP_ENUM_TRAILING_1(c, m, d) BOOST_PP_ENUM_TRAILING_1_I(c, m, d)\n#    define BOOST_PP_ENUM_TRAILING_2(c, m, d) BOOST_PP_ENUM_TRAILING_2_I(c, m, d)\n#    define BOOST_PP_ENUM_TRAILING_3(c, m, d) BOOST_PP_ENUM_TRAILING_3_I(c, m, d)\n#    define BOOST_PP_ENUM_TRAILING_1_I(c, m, d) BOOST_PP_REPEAT_1(c, BOOST_PP_ENUM_TRAILING_M_1, (m, d))\n#    define BOOST_PP_ENUM_TRAILING_2_I(c, m, d) BOOST_PP_REPEAT_2(c, BOOST_PP_ENUM_TRAILING_M_2, (m, d))\n#    define BOOST_PP_ENUM_TRAILING_3_I(c, m, d) BOOST_PP_REPEAT_3(c, BOOST_PP_ENUM_TRAILING_M_3, (m, d))\n# endif\n#\n# define BOOST_PP_ENUM_TRAILING_4(c, m, d) BOOST_PP_ERROR(0x0003)\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()\n#    define BOOST_PP_ENUM_TRAILING_M_1(z, n, md) BOOST_PP_ENUM_TRAILING_M_1_IM(z, n, BOOST_PP_TUPLE_REM_2 md)\n#    define BOOST_PP_ENUM_TRAILING_M_2(z, n, md) BOOST_PP_ENUM_TRAILING_M_2_IM(z, n, BOOST_PP_TUPLE_REM_2 md)\n#    define BOOST_PP_ENUM_TRAILING_M_3(z, n, md) BOOST_PP_ENUM_TRAILING_M_3_IM(z, n, BOOST_PP_TUPLE_REM_2 md)\n#    define BOOST_PP_ENUM_TRAILING_M_1_IM(z, n, im) BOOST_PP_ENUM_TRAILING_M_1_I(z, n, im)\n#    define BOOST_PP_ENUM_TRAILING_M_2_IM(z, n, im) BOOST_PP_ENUM_TRAILING_M_2_I(z, n, im)\n#    define BOOST_PP_ENUM_TRAILING_M_3_IM(z, n, im) BOOST_PP_ENUM_TRAILING_M_3_I(z, n, im)\n# else\n#    define BOOST_PP_ENUM_TRAILING_M_1(z, n, md) BOOST_PP_ENUM_TRAILING_M_1_I(z, n, BOOST_PP_TUPLE_ELEM(2, 0, md), BOOST_PP_TUPLE_ELEM(2, 1, md))\n#    define BOOST_PP_ENUM_TRAILING_M_2(z, n, md) BOOST_PP_ENUM_TRAILING_M_2_I(z, n, BOOST_PP_TUPLE_ELEM(2, 0, md), BOOST_PP_TUPLE_ELEM(2, 1, md))\n#    define BOOST_PP_ENUM_TRAILING_M_3(z, n, md) BOOST_PP_ENUM_TRAILING_M_3_I(z, n, BOOST_PP_TUPLE_ELEM(2, 0, md), BOOST_PP_TUPLE_ELEM(2, 1, md))\n# endif\n#\n# define BOOST_PP_ENUM_TRAILING_M_1_I(z, n, m, d) , m(z, n, d)\n# define BOOST_PP_ENUM_TRAILING_M_2_I(z, n, m, d) , m(z, n, d)\n# define BOOST_PP_ENUM_TRAILING_M_3_I(z, n, m, d) , m(z, n, d)\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/repetition/enum_trailing_params.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_ENUM_TRAILING_PARAMS_HPP\n# define BOOST_PREPROCESSOR_REPETITION_ENUM_TRAILING_PARAMS_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/repetition/repeat.hpp>\n#\n# /* BOOST_PP_ENUM_TRAILING_PARAMS */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ENUM_TRAILING_PARAMS(count, param) BOOST_PP_REPEAT(count, BOOST_PP_ENUM_TRAILING_PARAMS_M, param)\n# else\n#    define BOOST_PP_ENUM_TRAILING_PARAMS(count, param) BOOST_PP_ENUM_TRAILING_PARAMS_I(count, param)\n#    define BOOST_PP_ENUM_TRAILING_PARAMS_I(count, param) BOOST_PP_REPEAT(count, BOOST_PP_ENUM_TRAILING_PARAMS_M, param)\n# endif\n#\n# define BOOST_PP_ENUM_TRAILING_PARAMS_M(z, n, param) , param ## n\n#\n# /* BOOST_PP_ENUM_TRAILING_PARAMS_Z */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ENUM_TRAILING_PARAMS_Z(z, count, param) BOOST_PP_REPEAT_ ## z(count, BOOST_PP_ENUM_TRAILING_PARAMS_M, param)\n# else\n#    define BOOST_PP_ENUM_TRAILING_PARAMS_Z(z, count, param) BOOST_PP_ENUM_TRAILING_PARAMS_Z_I(z, count, param)\n#    define BOOST_PP_ENUM_TRAILING_PARAMS_Z_I(z, count, param) BOOST_PP_REPEAT_ ## z(count, BOOST_PP_ENUM_TRAILING_PARAMS_M, param)\n# endif\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/repetition/for.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_FOR_HPP\n# define BOOST_PREPROCESSOR_REPETITION_FOR_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/debug/error.hpp>\n# include <boost/preprocessor/facilities/empty.hpp>\n# include <boost/preprocessor/logical/bool.hpp>\n# include <boost/preprocessor/detail/auto_rec.hpp>\n#\n# /* BOOST_PP_FOR */\n#\n# if 0\n#    define BOOST_PP_FOR(state, pred, op, macro)\n# endif\n#\n# define BOOST_PP_FOR BOOST_PP_CAT(BOOST_PP_FOR_, BOOST_PP_AUTO_REC(BOOST_PP_FOR_P, 256))\n#\n# define BOOST_PP_FOR_P(n) BOOST_PP_CAT(BOOST_PP_FOR_CHECK_, BOOST_PP_FOR_ ## n(1, BOOST_PP_FOR_SR_P, BOOST_PP_FOR_SR_O, BOOST_PP_FOR_SR_M))\n#\n# define BOOST_PP_FOR_SR_P(r, s) s\n# define BOOST_PP_FOR_SR_O(r, s) 0\n# define BOOST_PP_FOR_SR_M(r, s) BOOST_PP_NIL\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    include <boost/preprocessor/repetition/detail/edg/for.hpp>\n# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    include <boost/preprocessor/repetition/detail/msvc/for.hpp>\n# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()\n#    include <boost/preprocessor/repetition/detail/dmc/for.hpp>\n# else\n#    include <boost/preprocessor/repetition/detail/for.hpp>\n# endif\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()\n# define BOOST_PP_FOR_257_PR(s, p) BOOST_PP_BOOL(p##(257, s))\n# else\n# define BOOST_PP_FOR_257_PR(s, p) BOOST_PP_BOOL(p(257, s))\n# endif\n\n# define BOOST_PP_FOR_257_ERROR() BOOST_PP_ERROR(0x0002)\n# define BOOST_PP_FOR_257(s, p, o, m) \\\n\tBOOST_PP_IIF \\\n\t\t( \\\n\t\tBOOST_PP_FOR_257_PR(s,p), \\\n\t\tBOOST_PP_FOR_257_ERROR, \\\n\t\tBOOST_PP_EMPTY \\\n\t\t) \\\n\t() \\\n/**/\n// # define BOOST_PP_FOR_257(s, p, o, m) BOOST_PP_ERROR(0x0002)\n#\n# define BOOST_PP_FOR_CHECK_BOOST_PP_NIL 1\n#\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_1(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_2(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_3(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_4(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_5(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_6(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_7(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_8(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_9(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_10(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_11(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_12(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_13(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_14(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_15(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_16(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_17(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_18(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_19(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_20(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_21(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_22(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_23(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_24(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_25(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_26(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_27(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_28(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_29(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_30(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_31(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_32(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_33(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_34(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_35(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_36(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_37(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_38(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_39(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_40(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_41(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_42(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_43(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_44(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_45(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_46(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_47(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_48(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_49(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_50(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_51(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_52(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_53(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_54(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_55(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_56(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_57(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_58(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_59(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_60(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_61(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_62(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_63(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_64(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_65(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_66(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_67(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_68(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_69(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_70(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_71(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_72(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_73(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_74(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_75(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_76(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_77(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_78(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_79(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_80(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_81(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_82(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_83(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_84(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_85(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_86(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_87(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_88(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_89(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_90(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_91(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_92(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_93(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_94(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_95(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_96(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_97(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_98(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_99(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_100(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_101(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_102(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_103(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_104(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_105(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_106(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_107(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_108(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_109(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_110(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_111(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_112(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_113(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_114(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_115(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_116(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_117(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_118(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_119(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_120(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_121(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_122(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_123(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_124(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_125(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_126(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_127(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_128(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_129(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_130(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_131(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_132(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_133(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_134(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_135(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_136(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_137(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_138(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_139(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_140(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_141(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_142(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_143(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_144(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_145(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_146(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_147(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_148(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_149(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_150(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_151(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_152(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_153(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_154(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_155(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_156(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_157(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_158(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_159(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_160(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_161(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_162(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_163(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_164(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_165(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_166(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_167(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_168(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_169(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_170(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_171(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_172(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_173(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_174(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_175(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_176(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_177(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_178(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_179(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_180(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_181(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_182(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_183(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_184(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_185(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_186(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_187(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_188(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_189(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_190(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_191(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_192(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_193(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_194(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_195(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_196(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_197(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_198(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_199(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_200(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_201(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_202(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_203(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_204(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_205(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_206(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_207(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_208(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_209(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_210(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_211(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_212(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_213(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_214(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_215(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_216(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_217(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_218(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_219(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_220(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_221(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_222(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_223(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_224(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_225(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_226(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_227(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_228(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_229(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_230(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_231(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_232(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_233(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_234(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_235(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_236(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_237(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_238(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_239(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_240(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_241(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_242(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_243(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_244(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_245(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_246(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_247(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_248(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_249(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_250(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_251(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_252(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_253(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_254(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_255(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_256(s, p, o, m) 0\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/repetition/repeat.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_REPEAT_HPP\n# define BOOST_PREPROCESSOR_REPETITION_REPEAT_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/debug/error.hpp>\n# include <boost/preprocessor/detail/auto_rec.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n#\n# /* BOOST_PP_REPEAT */\n#\n# if 0\n#    define BOOST_PP_REPEAT(count, macro, data)\n# endif\n#\n# define BOOST_PP_REPEAT BOOST_PP_CAT(BOOST_PP_REPEAT_, BOOST_PP_AUTO_REC(BOOST_PP_REPEAT_P, 4))\n#\n# define BOOST_PP_REPEAT_P(n) BOOST_PP_CAT(BOOST_PP_REPEAT_CHECK_, BOOST_PP_REPEAT_ ## n(1, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3, BOOST_PP_NIL))\n#\n# define BOOST_PP_REPEAT_CHECK_BOOST_PP_NIL 1\n# define BOOST_PP_REPEAT_CHECK_BOOST_PP_REPEAT_1(c, m, d) 0\n# define BOOST_PP_REPEAT_CHECK_BOOST_PP_REPEAT_2(c, m, d) 0\n# define BOOST_PP_REPEAT_CHECK_BOOST_PP_REPEAT_3(c, m, d) 0\n#\n# define BOOST_PP_REPEAT_1(c, m, d) BOOST_PP_REPEAT_1_I(c, m, d)\n# define BOOST_PP_REPEAT_2(c, m, d) BOOST_PP_REPEAT_2_I(c, m, d)\n# define BOOST_PP_REPEAT_3(c, m, d) BOOST_PP_REPEAT_3_I(c, m, d)\n# define BOOST_PP_REPEAT_4(c, m, d) BOOST_PP_ERROR(0x0003)\n#\n# define BOOST_PP_REPEAT_1_I(c, m, d) BOOST_PP_REPEAT_1_ ## c(m, d)\n# define BOOST_PP_REPEAT_2_I(c, m, d) BOOST_PP_REPEAT_2_ ## c(m, d)\n# define BOOST_PP_REPEAT_3_I(c, m, d) BOOST_PP_REPEAT_3_ ## c(m, d)\n#\n# define BOOST_PP_REPEAT_1ST BOOST_PP_REPEAT_1\n# define BOOST_PP_REPEAT_2ND BOOST_PP_REPEAT_2\n# define BOOST_PP_REPEAT_3RD BOOST_PP_REPEAT_3\n#\n# define BOOST_PP_REPEAT_1_0(m, d)\n# define BOOST_PP_REPEAT_1_1(m, d) m(2, 0, d)\n# define BOOST_PP_REPEAT_1_2(m, d) BOOST_PP_REPEAT_1_1(m, d) m(2, 1, d)\n# define BOOST_PP_REPEAT_1_3(m, d) BOOST_PP_REPEAT_1_2(m, d) m(2, 2, d)\n# define BOOST_PP_REPEAT_1_4(m, d) BOOST_PP_REPEAT_1_3(m, d) m(2, 3, d)\n# define BOOST_PP_REPEAT_1_5(m, d) BOOST_PP_REPEAT_1_4(m, d) m(2, 4, d)\n# define BOOST_PP_REPEAT_1_6(m, d) BOOST_PP_REPEAT_1_5(m, d) m(2, 5, d)\n# define BOOST_PP_REPEAT_1_7(m, d) BOOST_PP_REPEAT_1_6(m, d) m(2, 6, d)\n# define BOOST_PP_REPEAT_1_8(m, d) BOOST_PP_REPEAT_1_7(m, d) m(2, 7, d)\n# define BOOST_PP_REPEAT_1_9(m, d) BOOST_PP_REPEAT_1_8(m, d) m(2, 8, d)\n# define BOOST_PP_REPEAT_1_10(m, d) BOOST_PP_REPEAT_1_9(m, d) m(2, 9, d)\n# define BOOST_PP_REPEAT_1_11(m, d) BOOST_PP_REPEAT_1_10(m, d) m(2, 10, d)\n# define BOOST_PP_REPEAT_1_12(m, d) BOOST_PP_REPEAT_1_11(m, d) m(2, 11, d)\n# define BOOST_PP_REPEAT_1_13(m, d) BOOST_PP_REPEAT_1_12(m, d) m(2, 12, d)\n# define BOOST_PP_REPEAT_1_14(m, d) BOOST_PP_REPEAT_1_13(m, d) m(2, 13, d)\n# define BOOST_PP_REPEAT_1_15(m, d) BOOST_PP_REPEAT_1_14(m, d) m(2, 14, d)\n# define BOOST_PP_REPEAT_1_16(m, d) BOOST_PP_REPEAT_1_15(m, d) m(2, 15, d)\n# define BOOST_PP_REPEAT_1_17(m, d) BOOST_PP_REPEAT_1_16(m, d) m(2, 16, d)\n# define BOOST_PP_REPEAT_1_18(m, d) BOOST_PP_REPEAT_1_17(m, d) m(2, 17, d)\n# define BOOST_PP_REPEAT_1_19(m, d) BOOST_PP_REPEAT_1_18(m, d) m(2, 18, d)\n# define BOOST_PP_REPEAT_1_20(m, d) BOOST_PP_REPEAT_1_19(m, d) m(2, 19, d)\n# define BOOST_PP_REPEAT_1_21(m, d) BOOST_PP_REPEAT_1_20(m, d) m(2, 20, d)\n# define BOOST_PP_REPEAT_1_22(m, d) BOOST_PP_REPEAT_1_21(m, d) m(2, 21, d)\n# define BOOST_PP_REPEAT_1_23(m, d) BOOST_PP_REPEAT_1_22(m, d) m(2, 22, d)\n# define BOOST_PP_REPEAT_1_24(m, d) BOOST_PP_REPEAT_1_23(m, d) m(2, 23, d)\n# define BOOST_PP_REPEAT_1_25(m, d) BOOST_PP_REPEAT_1_24(m, d) m(2, 24, d)\n# define BOOST_PP_REPEAT_1_26(m, d) BOOST_PP_REPEAT_1_25(m, d) m(2, 25, d)\n# define BOOST_PP_REPEAT_1_27(m, d) BOOST_PP_REPEAT_1_26(m, d) m(2, 26, d)\n# define BOOST_PP_REPEAT_1_28(m, d) BOOST_PP_REPEAT_1_27(m, d) m(2, 27, d)\n# define BOOST_PP_REPEAT_1_29(m, d) BOOST_PP_REPEAT_1_28(m, d) m(2, 28, d)\n# define BOOST_PP_REPEAT_1_30(m, d) BOOST_PP_REPEAT_1_29(m, d) m(2, 29, d)\n# define BOOST_PP_REPEAT_1_31(m, d) BOOST_PP_REPEAT_1_30(m, d) m(2, 30, d)\n# define BOOST_PP_REPEAT_1_32(m, d) BOOST_PP_REPEAT_1_31(m, d) m(2, 31, d)\n# define BOOST_PP_REPEAT_1_33(m, d) BOOST_PP_REPEAT_1_32(m, d) m(2, 32, d)\n# define BOOST_PP_REPEAT_1_34(m, d) BOOST_PP_REPEAT_1_33(m, d) m(2, 33, d)\n# define BOOST_PP_REPEAT_1_35(m, d) BOOST_PP_REPEAT_1_34(m, d) m(2, 34, d)\n# define BOOST_PP_REPEAT_1_36(m, d) BOOST_PP_REPEAT_1_35(m, d) m(2, 35, d)\n# define BOOST_PP_REPEAT_1_37(m, d) BOOST_PP_REPEAT_1_36(m, d) m(2, 36, d)\n# define BOOST_PP_REPEAT_1_38(m, d) BOOST_PP_REPEAT_1_37(m, d) m(2, 37, d)\n# define BOOST_PP_REPEAT_1_39(m, d) BOOST_PP_REPEAT_1_38(m, d) m(2, 38, d)\n# define BOOST_PP_REPEAT_1_40(m, d) BOOST_PP_REPEAT_1_39(m, d) m(2, 39, d)\n# define BOOST_PP_REPEAT_1_41(m, d) BOOST_PP_REPEAT_1_40(m, d) m(2, 40, d)\n# define BOOST_PP_REPEAT_1_42(m, d) BOOST_PP_REPEAT_1_41(m, d) m(2, 41, d)\n# define BOOST_PP_REPEAT_1_43(m, d) BOOST_PP_REPEAT_1_42(m, d) m(2, 42, d)\n# define BOOST_PP_REPEAT_1_44(m, d) BOOST_PP_REPEAT_1_43(m, d) m(2, 43, d)\n# define BOOST_PP_REPEAT_1_45(m, d) BOOST_PP_REPEAT_1_44(m, d) m(2, 44, d)\n# define BOOST_PP_REPEAT_1_46(m, d) BOOST_PP_REPEAT_1_45(m, d) m(2, 45, d)\n# define BOOST_PP_REPEAT_1_47(m, d) BOOST_PP_REPEAT_1_46(m, d) m(2, 46, d)\n# define BOOST_PP_REPEAT_1_48(m, d) BOOST_PP_REPEAT_1_47(m, d) m(2, 47, d)\n# define BOOST_PP_REPEAT_1_49(m, d) BOOST_PP_REPEAT_1_48(m, d) m(2, 48, d)\n# define BOOST_PP_REPEAT_1_50(m, d) BOOST_PP_REPEAT_1_49(m, d) m(2, 49, d)\n# define BOOST_PP_REPEAT_1_51(m, d) BOOST_PP_REPEAT_1_50(m, d) m(2, 50, d)\n# define BOOST_PP_REPEAT_1_52(m, d) BOOST_PP_REPEAT_1_51(m, d) m(2, 51, d)\n# define BOOST_PP_REPEAT_1_53(m, d) BOOST_PP_REPEAT_1_52(m, d) m(2, 52, d)\n# define BOOST_PP_REPEAT_1_54(m, d) BOOST_PP_REPEAT_1_53(m, d) m(2, 53, d)\n# define BOOST_PP_REPEAT_1_55(m, d) BOOST_PP_REPEAT_1_54(m, d) m(2, 54, d)\n# define BOOST_PP_REPEAT_1_56(m, d) BOOST_PP_REPEAT_1_55(m, d) m(2, 55, d)\n# define BOOST_PP_REPEAT_1_57(m, d) BOOST_PP_REPEAT_1_56(m, d) m(2, 56, d)\n# define BOOST_PP_REPEAT_1_58(m, d) BOOST_PP_REPEAT_1_57(m, d) m(2, 57, d)\n# define BOOST_PP_REPEAT_1_59(m, d) BOOST_PP_REPEAT_1_58(m, d) m(2, 58, d)\n# define BOOST_PP_REPEAT_1_60(m, d) BOOST_PP_REPEAT_1_59(m, d) m(2, 59, d)\n# define BOOST_PP_REPEAT_1_61(m, d) BOOST_PP_REPEAT_1_60(m, d) m(2, 60, d)\n# define BOOST_PP_REPEAT_1_62(m, d) BOOST_PP_REPEAT_1_61(m, d) m(2, 61, d)\n# define BOOST_PP_REPEAT_1_63(m, d) BOOST_PP_REPEAT_1_62(m, d) m(2, 62, d)\n# define BOOST_PP_REPEAT_1_64(m, d) BOOST_PP_REPEAT_1_63(m, d) m(2, 63, d)\n# define BOOST_PP_REPEAT_1_65(m, d) BOOST_PP_REPEAT_1_64(m, d) m(2, 64, d)\n# define BOOST_PP_REPEAT_1_66(m, d) BOOST_PP_REPEAT_1_65(m, d) m(2, 65, d)\n# define BOOST_PP_REPEAT_1_67(m, d) BOOST_PP_REPEAT_1_66(m, d) m(2, 66, d)\n# define BOOST_PP_REPEAT_1_68(m, d) BOOST_PP_REPEAT_1_67(m, d) m(2, 67, d)\n# define BOOST_PP_REPEAT_1_69(m, d) BOOST_PP_REPEAT_1_68(m, d) m(2, 68, d)\n# define BOOST_PP_REPEAT_1_70(m, d) BOOST_PP_REPEAT_1_69(m, d) m(2, 69, d)\n# define BOOST_PP_REPEAT_1_71(m, d) BOOST_PP_REPEAT_1_70(m, d) m(2, 70, d)\n# define BOOST_PP_REPEAT_1_72(m, d) BOOST_PP_REPEAT_1_71(m, d) m(2, 71, d)\n# define BOOST_PP_REPEAT_1_73(m, d) BOOST_PP_REPEAT_1_72(m, d) m(2, 72, d)\n# define BOOST_PP_REPEAT_1_74(m, d) BOOST_PP_REPEAT_1_73(m, d) m(2, 73, d)\n# define BOOST_PP_REPEAT_1_75(m, d) BOOST_PP_REPEAT_1_74(m, d) m(2, 74, d)\n# define BOOST_PP_REPEAT_1_76(m, d) BOOST_PP_REPEAT_1_75(m, d) m(2, 75, d)\n# define BOOST_PP_REPEAT_1_77(m, d) BOOST_PP_REPEAT_1_76(m, d) m(2, 76, d)\n# define BOOST_PP_REPEAT_1_78(m, d) BOOST_PP_REPEAT_1_77(m, d) m(2, 77, d)\n# define BOOST_PP_REPEAT_1_79(m, d) BOOST_PP_REPEAT_1_78(m, d) m(2, 78, d)\n# define BOOST_PP_REPEAT_1_80(m, d) BOOST_PP_REPEAT_1_79(m, d) m(2, 79, d)\n# define BOOST_PP_REPEAT_1_81(m, d) BOOST_PP_REPEAT_1_80(m, d) m(2, 80, d)\n# define BOOST_PP_REPEAT_1_82(m, d) BOOST_PP_REPEAT_1_81(m, d) m(2, 81, d)\n# define BOOST_PP_REPEAT_1_83(m, d) BOOST_PP_REPEAT_1_82(m, d) m(2, 82, d)\n# define BOOST_PP_REPEAT_1_84(m, d) BOOST_PP_REPEAT_1_83(m, d) m(2, 83, d)\n# define BOOST_PP_REPEAT_1_85(m, d) BOOST_PP_REPEAT_1_84(m, d) m(2, 84, d)\n# define BOOST_PP_REPEAT_1_86(m, d) BOOST_PP_REPEAT_1_85(m, d) m(2, 85, d)\n# define BOOST_PP_REPEAT_1_87(m, d) BOOST_PP_REPEAT_1_86(m, d) m(2, 86, d)\n# define BOOST_PP_REPEAT_1_88(m, d) BOOST_PP_REPEAT_1_87(m, d) m(2, 87, d)\n# define BOOST_PP_REPEAT_1_89(m, d) BOOST_PP_REPEAT_1_88(m, d) m(2, 88, d)\n# define BOOST_PP_REPEAT_1_90(m, d) BOOST_PP_REPEAT_1_89(m, d) m(2, 89, d)\n# define BOOST_PP_REPEAT_1_91(m, d) BOOST_PP_REPEAT_1_90(m, d) m(2, 90, d)\n# define BOOST_PP_REPEAT_1_92(m, d) BOOST_PP_REPEAT_1_91(m, d) m(2, 91, d)\n# define BOOST_PP_REPEAT_1_93(m, d) BOOST_PP_REPEAT_1_92(m, d) m(2, 92, d)\n# define BOOST_PP_REPEAT_1_94(m, d) BOOST_PP_REPEAT_1_93(m, d) m(2, 93, d)\n# define BOOST_PP_REPEAT_1_95(m, d) BOOST_PP_REPEAT_1_94(m, d) m(2, 94, d)\n# define BOOST_PP_REPEAT_1_96(m, d) BOOST_PP_REPEAT_1_95(m, d) m(2, 95, d)\n# define BOOST_PP_REPEAT_1_97(m, d) BOOST_PP_REPEAT_1_96(m, d) m(2, 96, d)\n# define BOOST_PP_REPEAT_1_98(m, d) BOOST_PP_REPEAT_1_97(m, d) m(2, 97, d)\n# define BOOST_PP_REPEAT_1_99(m, d) BOOST_PP_REPEAT_1_98(m, d) m(2, 98, d)\n# define BOOST_PP_REPEAT_1_100(m, d) BOOST_PP_REPEAT_1_99(m, d) m(2, 99, d)\n# define BOOST_PP_REPEAT_1_101(m, d) BOOST_PP_REPEAT_1_100(m, d) m(2, 100, d)\n# define BOOST_PP_REPEAT_1_102(m, d) BOOST_PP_REPEAT_1_101(m, d) m(2, 101, d)\n# define BOOST_PP_REPEAT_1_103(m, d) BOOST_PP_REPEAT_1_102(m, d) m(2, 102, d)\n# define BOOST_PP_REPEAT_1_104(m, d) BOOST_PP_REPEAT_1_103(m, d) m(2, 103, d)\n# define BOOST_PP_REPEAT_1_105(m, d) BOOST_PP_REPEAT_1_104(m, d) m(2, 104, d)\n# define BOOST_PP_REPEAT_1_106(m, d) BOOST_PP_REPEAT_1_105(m, d) m(2, 105, d)\n# define BOOST_PP_REPEAT_1_107(m, d) BOOST_PP_REPEAT_1_106(m, d) m(2, 106, d)\n# define BOOST_PP_REPEAT_1_108(m, d) BOOST_PP_REPEAT_1_107(m, d) m(2, 107, d)\n# define BOOST_PP_REPEAT_1_109(m, d) BOOST_PP_REPEAT_1_108(m, d) m(2, 108, d)\n# define BOOST_PP_REPEAT_1_110(m, d) BOOST_PP_REPEAT_1_109(m, d) m(2, 109, d)\n# define BOOST_PP_REPEAT_1_111(m, d) BOOST_PP_REPEAT_1_110(m, d) m(2, 110, d)\n# define BOOST_PP_REPEAT_1_112(m, d) BOOST_PP_REPEAT_1_111(m, d) m(2, 111, d)\n# define BOOST_PP_REPEAT_1_113(m, d) BOOST_PP_REPEAT_1_112(m, d) m(2, 112, d)\n# define BOOST_PP_REPEAT_1_114(m, d) BOOST_PP_REPEAT_1_113(m, d) m(2, 113, d)\n# define BOOST_PP_REPEAT_1_115(m, d) BOOST_PP_REPEAT_1_114(m, d) m(2, 114, d)\n# define BOOST_PP_REPEAT_1_116(m, d) BOOST_PP_REPEAT_1_115(m, d) m(2, 115, d)\n# define BOOST_PP_REPEAT_1_117(m, d) BOOST_PP_REPEAT_1_116(m, d) m(2, 116, d)\n# define BOOST_PP_REPEAT_1_118(m, d) BOOST_PP_REPEAT_1_117(m, d) m(2, 117, d)\n# define BOOST_PP_REPEAT_1_119(m, d) BOOST_PP_REPEAT_1_118(m, d) m(2, 118, d)\n# define BOOST_PP_REPEAT_1_120(m, d) BOOST_PP_REPEAT_1_119(m, d) m(2, 119, d)\n# define BOOST_PP_REPEAT_1_121(m, d) BOOST_PP_REPEAT_1_120(m, d) m(2, 120, d)\n# define BOOST_PP_REPEAT_1_122(m, d) BOOST_PP_REPEAT_1_121(m, d) m(2, 121, d)\n# define BOOST_PP_REPEAT_1_123(m, d) BOOST_PP_REPEAT_1_122(m, d) m(2, 122, d)\n# define BOOST_PP_REPEAT_1_124(m, d) BOOST_PP_REPEAT_1_123(m, d) m(2, 123, d)\n# define BOOST_PP_REPEAT_1_125(m, d) BOOST_PP_REPEAT_1_124(m, d) m(2, 124, d)\n# define BOOST_PP_REPEAT_1_126(m, d) BOOST_PP_REPEAT_1_125(m, d) m(2, 125, d)\n# define BOOST_PP_REPEAT_1_127(m, d) BOOST_PP_REPEAT_1_126(m, d) m(2, 126, d)\n# define BOOST_PP_REPEAT_1_128(m, d) BOOST_PP_REPEAT_1_127(m, d) m(2, 127, d)\n# define BOOST_PP_REPEAT_1_129(m, d) BOOST_PP_REPEAT_1_128(m, d) m(2, 128, d)\n# define BOOST_PP_REPEAT_1_130(m, d) BOOST_PP_REPEAT_1_129(m, d) m(2, 129, d)\n# define BOOST_PP_REPEAT_1_131(m, d) BOOST_PP_REPEAT_1_130(m, d) m(2, 130, d)\n# define BOOST_PP_REPEAT_1_132(m, d) BOOST_PP_REPEAT_1_131(m, d) m(2, 131, d)\n# define BOOST_PP_REPEAT_1_133(m, d) BOOST_PP_REPEAT_1_132(m, d) m(2, 132, d)\n# define BOOST_PP_REPEAT_1_134(m, d) BOOST_PP_REPEAT_1_133(m, d) m(2, 133, d)\n# define BOOST_PP_REPEAT_1_135(m, d) BOOST_PP_REPEAT_1_134(m, d) m(2, 134, d)\n# define BOOST_PP_REPEAT_1_136(m, d) BOOST_PP_REPEAT_1_135(m, d) m(2, 135, d)\n# define BOOST_PP_REPEAT_1_137(m, d) BOOST_PP_REPEAT_1_136(m, d) m(2, 136, d)\n# define BOOST_PP_REPEAT_1_138(m, d) BOOST_PP_REPEAT_1_137(m, d) m(2, 137, d)\n# define BOOST_PP_REPEAT_1_139(m, d) BOOST_PP_REPEAT_1_138(m, d) m(2, 138, d)\n# define BOOST_PP_REPEAT_1_140(m, d) BOOST_PP_REPEAT_1_139(m, d) m(2, 139, d)\n# define BOOST_PP_REPEAT_1_141(m, d) BOOST_PP_REPEAT_1_140(m, d) m(2, 140, d)\n# define BOOST_PP_REPEAT_1_142(m, d) BOOST_PP_REPEAT_1_141(m, d) m(2, 141, d)\n# define BOOST_PP_REPEAT_1_143(m, d) BOOST_PP_REPEAT_1_142(m, d) m(2, 142, d)\n# define BOOST_PP_REPEAT_1_144(m, d) BOOST_PP_REPEAT_1_143(m, d) m(2, 143, d)\n# define BOOST_PP_REPEAT_1_145(m, d) BOOST_PP_REPEAT_1_144(m, d) m(2, 144, d)\n# define BOOST_PP_REPEAT_1_146(m, d) BOOST_PP_REPEAT_1_145(m, d) m(2, 145, d)\n# define BOOST_PP_REPEAT_1_147(m, d) BOOST_PP_REPEAT_1_146(m, d) m(2, 146, d)\n# define BOOST_PP_REPEAT_1_148(m, d) BOOST_PP_REPEAT_1_147(m, d) m(2, 147, d)\n# define BOOST_PP_REPEAT_1_149(m, d) BOOST_PP_REPEAT_1_148(m, d) m(2, 148, d)\n# define BOOST_PP_REPEAT_1_150(m, d) BOOST_PP_REPEAT_1_149(m, d) m(2, 149, d)\n# define BOOST_PP_REPEAT_1_151(m, d) BOOST_PP_REPEAT_1_150(m, d) m(2, 150, d)\n# define BOOST_PP_REPEAT_1_152(m, d) BOOST_PP_REPEAT_1_151(m, d) m(2, 151, d)\n# define BOOST_PP_REPEAT_1_153(m, d) BOOST_PP_REPEAT_1_152(m, d) m(2, 152, d)\n# define BOOST_PP_REPEAT_1_154(m, d) BOOST_PP_REPEAT_1_153(m, d) m(2, 153, d)\n# define BOOST_PP_REPEAT_1_155(m, d) BOOST_PP_REPEAT_1_154(m, d) m(2, 154, d)\n# define BOOST_PP_REPEAT_1_156(m, d) BOOST_PP_REPEAT_1_155(m, d) m(2, 155, d)\n# define BOOST_PP_REPEAT_1_157(m, d) BOOST_PP_REPEAT_1_156(m, d) m(2, 156, d)\n# define BOOST_PP_REPEAT_1_158(m, d) BOOST_PP_REPEAT_1_157(m, d) m(2, 157, d)\n# define BOOST_PP_REPEAT_1_159(m, d) BOOST_PP_REPEAT_1_158(m, d) m(2, 158, d)\n# define BOOST_PP_REPEAT_1_160(m, d) BOOST_PP_REPEAT_1_159(m, d) m(2, 159, d)\n# define BOOST_PP_REPEAT_1_161(m, d) BOOST_PP_REPEAT_1_160(m, d) m(2, 160, d)\n# define BOOST_PP_REPEAT_1_162(m, d) BOOST_PP_REPEAT_1_161(m, d) m(2, 161, d)\n# define BOOST_PP_REPEAT_1_163(m, d) BOOST_PP_REPEAT_1_162(m, d) m(2, 162, d)\n# define BOOST_PP_REPEAT_1_164(m, d) BOOST_PP_REPEAT_1_163(m, d) m(2, 163, d)\n# define BOOST_PP_REPEAT_1_165(m, d) BOOST_PP_REPEAT_1_164(m, d) m(2, 164, d)\n# define BOOST_PP_REPEAT_1_166(m, d) BOOST_PP_REPEAT_1_165(m, d) m(2, 165, d)\n# define BOOST_PP_REPEAT_1_167(m, d) BOOST_PP_REPEAT_1_166(m, d) m(2, 166, d)\n# define BOOST_PP_REPEAT_1_168(m, d) BOOST_PP_REPEAT_1_167(m, d) m(2, 167, d)\n# define BOOST_PP_REPEAT_1_169(m, d) BOOST_PP_REPEAT_1_168(m, d) m(2, 168, d)\n# define BOOST_PP_REPEAT_1_170(m, d) BOOST_PP_REPEAT_1_169(m, d) m(2, 169, d)\n# define BOOST_PP_REPEAT_1_171(m, d) BOOST_PP_REPEAT_1_170(m, d) m(2, 170, d)\n# define BOOST_PP_REPEAT_1_172(m, d) BOOST_PP_REPEAT_1_171(m, d) m(2, 171, d)\n# define BOOST_PP_REPEAT_1_173(m, d) BOOST_PP_REPEAT_1_172(m, d) m(2, 172, d)\n# define BOOST_PP_REPEAT_1_174(m, d) BOOST_PP_REPEAT_1_173(m, d) m(2, 173, d)\n# define BOOST_PP_REPEAT_1_175(m, d) BOOST_PP_REPEAT_1_174(m, d) m(2, 174, d)\n# define BOOST_PP_REPEAT_1_176(m, d) BOOST_PP_REPEAT_1_175(m, d) m(2, 175, d)\n# define BOOST_PP_REPEAT_1_177(m, d) BOOST_PP_REPEAT_1_176(m, d) m(2, 176, d)\n# define BOOST_PP_REPEAT_1_178(m, d) BOOST_PP_REPEAT_1_177(m, d) m(2, 177, d)\n# define BOOST_PP_REPEAT_1_179(m, d) BOOST_PP_REPEAT_1_178(m, d) m(2, 178, d)\n# define BOOST_PP_REPEAT_1_180(m, d) BOOST_PP_REPEAT_1_179(m, d) m(2, 179, d)\n# define BOOST_PP_REPEAT_1_181(m, d) BOOST_PP_REPEAT_1_180(m, d) m(2, 180, d)\n# define BOOST_PP_REPEAT_1_182(m, d) BOOST_PP_REPEAT_1_181(m, d) m(2, 181, d)\n# define BOOST_PP_REPEAT_1_183(m, d) BOOST_PP_REPEAT_1_182(m, d) m(2, 182, d)\n# define BOOST_PP_REPEAT_1_184(m, d) BOOST_PP_REPEAT_1_183(m, d) m(2, 183, d)\n# define BOOST_PP_REPEAT_1_185(m, d) BOOST_PP_REPEAT_1_184(m, d) m(2, 184, d)\n# define BOOST_PP_REPEAT_1_186(m, d) BOOST_PP_REPEAT_1_185(m, d) m(2, 185, d)\n# define BOOST_PP_REPEAT_1_187(m, d) BOOST_PP_REPEAT_1_186(m, d) m(2, 186, d)\n# define BOOST_PP_REPEAT_1_188(m, d) BOOST_PP_REPEAT_1_187(m, d) m(2, 187, d)\n# define BOOST_PP_REPEAT_1_189(m, d) BOOST_PP_REPEAT_1_188(m, d) m(2, 188, d)\n# define BOOST_PP_REPEAT_1_190(m, d) BOOST_PP_REPEAT_1_189(m, d) m(2, 189, d)\n# define BOOST_PP_REPEAT_1_191(m, d) BOOST_PP_REPEAT_1_190(m, d) m(2, 190, d)\n# define BOOST_PP_REPEAT_1_192(m, d) BOOST_PP_REPEAT_1_191(m, d) m(2, 191, d)\n# define BOOST_PP_REPEAT_1_193(m, d) BOOST_PP_REPEAT_1_192(m, d) m(2, 192, d)\n# define BOOST_PP_REPEAT_1_194(m, d) BOOST_PP_REPEAT_1_193(m, d) m(2, 193, d)\n# define BOOST_PP_REPEAT_1_195(m, d) BOOST_PP_REPEAT_1_194(m, d) m(2, 194, d)\n# define BOOST_PP_REPEAT_1_196(m, d) BOOST_PP_REPEAT_1_195(m, d) m(2, 195, d)\n# define BOOST_PP_REPEAT_1_197(m, d) BOOST_PP_REPEAT_1_196(m, d) m(2, 196, d)\n# define BOOST_PP_REPEAT_1_198(m, d) BOOST_PP_REPEAT_1_197(m, d) m(2, 197, d)\n# define BOOST_PP_REPEAT_1_199(m, d) BOOST_PP_REPEAT_1_198(m, d) m(2, 198, d)\n# define BOOST_PP_REPEAT_1_200(m, d) BOOST_PP_REPEAT_1_199(m, d) m(2, 199, d)\n# define BOOST_PP_REPEAT_1_201(m, d) BOOST_PP_REPEAT_1_200(m, d) m(2, 200, d)\n# define BOOST_PP_REPEAT_1_202(m, d) BOOST_PP_REPEAT_1_201(m, d) m(2, 201, d)\n# define BOOST_PP_REPEAT_1_203(m, d) BOOST_PP_REPEAT_1_202(m, d) m(2, 202, d)\n# define BOOST_PP_REPEAT_1_204(m, d) BOOST_PP_REPEAT_1_203(m, d) m(2, 203, d)\n# define BOOST_PP_REPEAT_1_205(m, d) BOOST_PP_REPEAT_1_204(m, d) m(2, 204, d)\n# define BOOST_PP_REPEAT_1_206(m, d) BOOST_PP_REPEAT_1_205(m, d) m(2, 205, d)\n# define BOOST_PP_REPEAT_1_207(m, d) BOOST_PP_REPEAT_1_206(m, d) m(2, 206, d)\n# define BOOST_PP_REPEAT_1_208(m, d) BOOST_PP_REPEAT_1_207(m, d) m(2, 207, d)\n# define BOOST_PP_REPEAT_1_209(m, d) BOOST_PP_REPEAT_1_208(m, d) m(2, 208, d)\n# define BOOST_PP_REPEAT_1_210(m, d) BOOST_PP_REPEAT_1_209(m, d) m(2, 209, d)\n# define BOOST_PP_REPEAT_1_211(m, d) BOOST_PP_REPEAT_1_210(m, d) m(2, 210, d)\n# define BOOST_PP_REPEAT_1_212(m, d) BOOST_PP_REPEAT_1_211(m, d) m(2, 211, d)\n# define BOOST_PP_REPEAT_1_213(m, d) BOOST_PP_REPEAT_1_212(m, d) m(2, 212, d)\n# define BOOST_PP_REPEAT_1_214(m, d) BOOST_PP_REPEAT_1_213(m, d) m(2, 213, d)\n# define BOOST_PP_REPEAT_1_215(m, d) BOOST_PP_REPEAT_1_214(m, d) m(2, 214, d)\n# define BOOST_PP_REPEAT_1_216(m, d) BOOST_PP_REPEAT_1_215(m, d) m(2, 215, d)\n# define BOOST_PP_REPEAT_1_217(m, d) BOOST_PP_REPEAT_1_216(m, d) m(2, 216, d)\n# define BOOST_PP_REPEAT_1_218(m, d) BOOST_PP_REPEAT_1_217(m, d) m(2, 217, d)\n# define BOOST_PP_REPEAT_1_219(m, d) BOOST_PP_REPEAT_1_218(m, d) m(2, 218, d)\n# define BOOST_PP_REPEAT_1_220(m, d) BOOST_PP_REPEAT_1_219(m, d) m(2, 219, d)\n# define BOOST_PP_REPEAT_1_221(m, d) BOOST_PP_REPEAT_1_220(m, d) m(2, 220, d)\n# define BOOST_PP_REPEAT_1_222(m, d) BOOST_PP_REPEAT_1_221(m, d) m(2, 221, d)\n# define BOOST_PP_REPEAT_1_223(m, d) BOOST_PP_REPEAT_1_222(m, d) m(2, 222, d)\n# define BOOST_PP_REPEAT_1_224(m, d) BOOST_PP_REPEAT_1_223(m, d) m(2, 223, d)\n# define BOOST_PP_REPEAT_1_225(m, d) BOOST_PP_REPEAT_1_224(m, d) m(2, 224, d)\n# define BOOST_PP_REPEAT_1_226(m, d) BOOST_PP_REPEAT_1_225(m, d) m(2, 225, d)\n# define BOOST_PP_REPEAT_1_227(m, d) BOOST_PP_REPEAT_1_226(m, d) m(2, 226, d)\n# define BOOST_PP_REPEAT_1_228(m, d) BOOST_PP_REPEAT_1_227(m, d) m(2, 227, d)\n# define BOOST_PP_REPEAT_1_229(m, d) BOOST_PP_REPEAT_1_228(m, d) m(2, 228, d)\n# define BOOST_PP_REPEAT_1_230(m, d) BOOST_PP_REPEAT_1_229(m, d) m(2, 229, d)\n# define BOOST_PP_REPEAT_1_231(m, d) BOOST_PP_REPEAT_1_230(m, d) m(2, 230, d)\n# define BOOST_PP_REPEAT_1_232(m, d) BOOST_PP_REPEAT_1_231(m, d) m(2, 231, d)\n# define BOOST_PP_REPEAT_1_233(m, d) BOOST_PP_REPEAT_1_232(m, d) m(2, 232, d)\n# define BOOST_PP_REPEAT_1_234(m, d) BOOST_PP_REPEAT_1_233(m, d) m(2, 233, d)\n# define BOOST_PP_REPEAT_1_235(m, d) BOOST_PP_REPEAT_1_234(m, d) m(2, 234, d)\n# define BOOST_PP_REPEAT_1_236(m, d) BOOST_PP_REPEAT_1_235(m, d) m(2, 235, d)\n# define BOOST_PP_REPEAT_1_237(m, d) BOOST_PP_REPEAT_1_236(m, d) m(2, 236, d)\n# define BOOST_PP_REPEAT_1_238(m, d) BOOST_PP_REPEAT_1_237(m, d) m(2, 237, d)\n# define BOOST_PP_REPEAT_1_239(m, d) BOOST_PP_REPEAT_1_238(m, d) m(2, 238, d)\n# define BOOST_PP_REPEAT_1_240(m, d) BOOST_PP_REPEAT_1_239(m, d) m(2, 239, d)\n# define BOOST_PP_REPEAT_1_241(m, d) BOOST_PP_REPEAT_1_240(m, d) m(2, 240, d)\n# define BOOST_PP_REPEAT_1_242(m, d) BOOST_PP_REPEAT_1_241(m, d) m(2, 241, d)\n# define BOOST_PP_REPEAT_1_243(m, d) BOOST_PP_REPEAT_1_242(m, d) m(2, 242, d)\n# define BOOST_PP_REPEAT_1_244(m, d) BOOST_PP_REPEAT_1_243(m, d) m(2, 243, d)\n# define BOOST_PP_REPEAT_1_245(m, d) BOOST_PP_REPEAT_1_244(m, d) m(2, 244, d)\n# define BOOST_PP_REPEAT_1_246(m, d) BOOST_PP_REPEAT_1_245(m, d) m(2, 245, d)\n# define BOOST_PP_REPEAT_1_247(m, d) BOOST_PP_REPEAT_1_246(m, d) m(2, 246, d)\n# define BOOST_PP_REPEAT_1_248(m, d) BOOST_PP_REPEAT_1_247(m, d) m(2, 247, d)\n# define BOOST_PP_REPEAT_1_249(m, d) BOOST_PP_REPEAT_1_248(m, d) m(2, 248, d)\n# define BOOST_PP_REPEAT_1_250(m, d) BOOST_PP_REPEAT_1_249(m, d) m(2, 249, d)\n# define BOOST_PP_REPEAT_1_251(m, d) BOOST_PP_REPEAT_1_250(m, d) m(2, 250, d)\n# define BOOST_PP_REPEAT_1_252(m, d) BOOST_PP_REPEAT_1_251(m, d) m(2, 251, d)\n# define BOOST_PP_REPEAT_1_253(m, d) BOOST_PP_REPEAT_1_252(m, d) m(2, 252, d)\n# define BOOST_PP_REPEAT_1_254(m, d) BOOST_PP_REPEAT_1_253(m, d) m(2, 253, d)\n# define BOOST_PP_REPEAT_1_255(m, d) BOOST_PP_REPEAT_1_254(m, d) m(2, 254, d)\n# define BOOST_PP_REPEAT_1_256(m, d) BOOST_PP_REPEAT_1_255(m, d) m(2, 255, d)\n#\n# define BOOST_PP_REPEAT_2_0(m, d)\n# define BOOST_PP_REPEAT_2_1(m, d) m(3, 0, d)\n# define BOOST_PP_REPEAT_2_2(m, d) BOOST_PP_REPEAT_2_1(m, d) m(3, 1, d)\n# define BOOST_PP_REPEAT_2_3(m, d) BOOST_PP_REPEAT_2_2(m, d) m(3, 2, d)\n# define BOOST_PP_REPEAT_2_4(m, d) BOOST_PP_REPEAT_2_3(m, d) m(3, 3, d)\n# define BOOST_PP_REPEAT_2_5(m, d) BOOST_PP_REPEAT_2_4(m, d) m(3, 4, d)\n# define BOOST_PP_REPEAT_2_6(m, d) BOOST_PP_REPEAT_2_5(m, d) m(3, 5, d)\n# define BOOST_PP_REPEAT_2_7(m, d) BOOST_PP_REPEAT_2_6(m, d) m(3, 6, d)\n# define BOOST_PP_REPEAT_2_8(m, d) BOOST_PP_REPEAT_2_7(m, d) m(3, 7, d)\n# define BOOST_PP_REPEAT_2_9(m, d) BOOST_PP_REPEAT_2_8(m, d) m(3, 8, d)\n# define BOOST_PP_REPEAT_2_10(m, d) BOOST_PP_REPEAT_2_9(m, d) m(3, 9, d)\n# define BOOST_PP_REPEAT_2_11(m, d) BOOST_PP_REPEAT_2_10(m, d) m(3, 10, d)\n# define BOOST_PP_REPEAT_2_12(m, d) BOOST_PP_REPEAT_2_11(m, d) m(3, 11, d)\n# define BOOST_PP_REPEAT_2_13(m, d) BOOST_PP_REPEAT_2_12(m, d) m(3, 12, d)\n# define BOOST_PP_REPEAT_2_14(m, d) BOOST_PP_REPEAT_2_13(m, d) m(3, 13, d)\n# define BOOST_PP_REPEAT_2_15(m, d) BOOST_PP_REPEAT_2_14(m, d) m(3, 14, d)\n# define BOOST_PP_REPEAT_2_16(m, d) BOOST_PP_REPEAT_2_15(m, d) m(3, 15, d)\n# define BOOST_PP_REPEAT_2_17(m, d) BOOST_PP_REPEAT_2_16(m, d) m(3, 16, d)\n# define BOOST_PP_REPEAT_2_18(m, d) BOOST_PP_REPEAT_2_17(m, d) m(3, 17, d)\n# define BOOST_PP_REPEAT_2_19(m, d) BOOST_PP_REPEAT_2_18(m, d) m(3, 18, d)\n# define BOOST_PP_REPEAT_2_20(m, d) BOOST_PP_REPEAT_2_19(m, d) m(3, 19, d)\n# define BOOST_PP_REPEAT_2_21(m, d) BOOST_PP_REPEAT_2_20(m, d) m(3, 20, d)\n# define BOOST_PP_REPEAT_2_22(m, d) BOOST_PP_REPEAT_2_21(m, d) m(3, 21, d)\n# define BOOST_PP_REPEAT_2_23(m, d) BOOST_PP_REPEAT_2_22(m, d) m(3, 22, d)\n# define BOOST_PP_REPEAT_2_24(m, d) BOOST_PP_REPEAT_2_23(m, d) m(3, 23, d)\n# define BOOST_PP_REPEAT_2_25(m, d) BOOST_PP_REPEAT_2_24(m, d) m(3, 24, d)\n# define BOOST_PP_REPEAT_2_26(m, d) BOOST_PP_REPEAT_2_25(m, d) m(3, 25, d)\n# define BOOST_PP_REPEAT_2_27(m, d) BOOST_PP_REPEAT_2_26(m, d) m(3, 26, d)\n# define BOOST_PP_REPEAT_2_28(m, d) BOOST_PP_REPEAT_2_27(m, d) m(3, 27, d)\n# define BOOST_PP_REPEAT_2_29(m, d) BOOST_PP_REPEAT_2_28(m, d) m(3, 28, d)\n# define BOOST_PP_REPEAT_2_30(m, d) BOOST_PP_REPEAT_2_29(m, d) m(3, 29, d)\n# define BOOST_PP_REPEAT_2_31(m, d) BOOST_PP_REPEAT_2_30(m, d) m(3, 30, d)\n# define BOOST_PP_REPEAT_2_32(m, d) BOOST_PP_REPEAT_2_31(m, d) m(3, 31, d)\n# define BOOST_PP_REPEAT_2_33(m, d) BOOST_PP_REPEAT_2_32(m, d) m(3, 32, d)\n# define BOOST_PP_REPEAT_2_34(m, d) BOOST_PP_REPEAT_2_33(m, d) m(3, 33, d)\n# define BOOST_PP_REPEAT_2_35(m, d) BOOST_PP_REPEAT_2_34(m, d) m(3, 34, d)\n# define BOOST_PP_REPEAT_2_36(m, d) BOOST_PP_REPEAT_2_35(m, d) m(3, 35, d)\n# define BOOST_PP_REPEAT_2_37(m, d) BOOST_PP_REPEAT_2_36(m, d) m(3, 36, d)\n# define BOOST_PP_REPEAT_2_38(m, d) BOOST_PP_REPEAT_2_37(m, d) m(3, 37, d)\n# define BOOST_PP_REPEAT_2_39(m, d) BOOST_PP_REPEAT_2_38(m, d) m(3, 38, d)\n# define BOOST_PP_REPEAT_2_40(m, d) BOOST_PP_REPEAT_2_39(m, d) m(3, 39, d)\n# define BOOST_PP_REPEAT_2_41(m, d) BOOST_PP_REPEAT_2_40(m, d) m(3, 40, d)\n# define BOOST_PP_REPEAT_2_42(m, d) BOOST_PP_REPEAT_2_41(m, d) m(3, 41, d)\n# define BOOST_PP_REPEAT_2_43(m, d) BOOST_PP_REPEAT_2_42(m, d) m(3, 42, d)\n# define BOOST_PP_REPEAT_2_44(m, d) BOOST_PP_REPEAT_2_43(m, d) m(3, 43, d)\n# define BOOST_PP_REPEAT_2_45(m, d) BOOST_PP_REPEAT_2_44(m, d) m(3, 44, d)\n# define BOOST_PP_REPEAT_2_46(m, d) BOOST_PP_REPEAT_2_45(m, d) m(3, 45, d)\n# define BOOST_PP_REPEAT_2_47(m, d) BOOST_PP_REPEAT_2_46(m, d) m(3, 46, d)\n# define BOOST_PP_REPEAT_2_48(m, d) BOOST_PP_REPEAT_2_47(m, d) m(3, 47, d)\n# define BOOST_PP_REPEAT_2_49(m, d) BOOST_PP_REPEAT_2_48(m, d) m(3, 48, d)\n# define BOOST_PP_REPEAT_2_50(m, d) BOOST_PP_REPEAT_2_49(m, d) m(3, 49, d)\n# define BOOST_PP_REPEAT_2_51(m, d) BOOST_PP_REPEAT_2_50(m, d) m(3, 50, d)\n# define BOOST_PP_REPEAT_2_52(m, d) BOOST_PP_REPEAT_2_51(m, d) m(3, 51, d)\n# define BOOST_PP_REPEAT_2_53(m, d) BOOST_PP_REPEAT_2_52(m, d) m(3, 52, d)\n# define BOOST_PP_REPEAT_2_54(m, d) BOOST_PP_REPEAT_2_53(m, d) m(3, 53, d)\n# define BOOST_PP_REPEAT_2_55(m, d) BOOST_PP_REPEAT_2_54(m, d) m(3, 54, d)\n# define BOOST_PP_REPEAT_2_56(m, d) BOOST_PP_REPEAT_2_55(m, d) m(3, 55, d)\n# define BOOST_PP_REPEAT_2_57(m, d) BOOST_PP_REPEAT_2_56(m, d) m(3, 56, d)\n# define BOOST_PP_REPEAT_2_58(m, d) BOOST_PP_REPEAT_2_57(m, d) m(3, 57, d)\n# define BOOST_PP_REPEAT_2_59(m, d) BOOST_PP_REPEAT_2_58(m, d) m(3, 58, d)\n# define BOOST_PP_REPEAT_2_60(m, d) BOOST_PP_REPEAT_2_59(m, d) m(3, 59, d)\n# define BOOST_PP_REPEAT_2_61(m, d) BOOST_PP_REPEAT_2_60(m, d) m(3, 60, d)\n# define BOOST_PP_REPEAT_2_62(m, d) BOOST_PP_REPEAT_2_61(m, d) m(3, 61, d)\n# define BOOST_PP_REPEAT_2_63(m, d) BOOST_PP_REPEAT_2_62(m, d) m(3, 62, d)\n# define BOOST_PP_REPEAT_2_64(m, d) BOOST_PP_REPEAT_2_63(m, d) m(3, 63, d)\n# define BOOST_PP_REPEAT_2_65(m, d) BOOST_PP_REPEAT_2_64(m, d) m(3, 64, d)\n# define BOOST_PP_REPEAT_2_66(m, d) BOOST_PP_REPEAT_2_65(m, d) m(3, 65, d)\n# define BOOST_PP_REPEAT_2_67(m, d) BOOST_PP_REPEAT_2_66(m, d) m(3, 66, d)\n# define BOOST_PP_REPEAT_2_68(m, d) BOOST_PP_REPEAT_2_67(m, d) m(3, 67, d)\n# define BOOST_PP_REPEAT_2_69(m, d) BOOST_PP_REPEAT_2_68(m, d) m(3, 68, d)\n# define BOOST_PP_REPEAT_2_70(m, d) BOOST_PP_REPEAT_2_69(m, d) m(3, 69, d)\n# define BOOST_PP_REPEAT_2_71(m, d) BOOST_PP_REPEAT_2_70(m, d) m(3, 70, d)\n# define BOOST_PP_REPEAT_2_72(m, d) BOOST_PP_REPEAT_2_71(m, d) m(3, 71, d)\n# define BOOST_PP_REPEAT_2_73(m, d) BOOST_PP_REPEAT_2_72(m, d) m(3, 72, d)\n# define BOOST_PP_REPEAT_2_74(m, d) BOOST_PP_REPEAT_2_73(m, d) m(3, 73, d)\n# define BOOST_PP_REPEAT_2_75(m, d) BOOST_PP_REPEAT_2_74(m, d) m(3, 74, d)\n# define BOOST_PP_REPEAT_2_76(m, d) BOOST_PP_REPEAT_2_75(m, d) m(3, 75, d)\n# define BOOST_PP_REPEAT_2_77(m, d) BOOST_PP_REPEAT_2_76(m, d) m(3, 76, d)\n# define BOOST_PP_REPEAT_2_78(m, d) BOOST_PP_REPEAT_2_77(m, d) m(3, 77, d)\n# define BOOST_PP_REPEAT_2_79(m, d) BOOST_PP_REPEAT_2_78(m, d) m(3, 78, d)\n# define BOOST_PP_REPEAT_2_80(m, d) BOOST_PP_REPEAT_2_79(m, d) m(3, 79, d)\n# define BOOST_PP_REPEAT_2_81(m, d) BOOST_PP_REPEAT_2_80(m, d) m(3, 80, d)\n# define BOOST_PP_REPEAT_2_82(m, d) BOOST_PP_REPEAT_2_81(m, d) m(3, 81, d)\n# define BOOST_PP_REPEAT_2_83(m, d) BOOST_PP_REPEAT_2_82(m, d) m(3, 82, d)\n# define BOOST_PP_REPEAT_2_84(m, d) BOOST_PP_REPEAT_2_83(m, d) m(3, 83, d)\n# define BOOST_PP_REPEAT_2_85(m, d) BOOST_PP_REPEAT_2_84(m, d) m(3, 84, d)\n# define BOOST_PP_REPEAT_2_86(m, d) BOOST_PP_REPEAT_2_85(m, d) m(3, 85, d)\n# define BOOST_PP_REPEAT_2_87(m, d) BOOST_PP_REPEAT_2_86(m, d) m(3, 86, d)\n# define BOOST_PP_REPEAT_2_88(m, d) BOOST_PP_REPEAT_2_87(m, d) m(3, 87, d)\n# define BOOST_PP_REPEAT_2_89(m, d) BOOST_PP_REPEAT_2_88(m, d) m(3, 88, d)\n# define BOOST_PP_REPEAT_2_90(m, d) BOOST_PP_REPEAT_2_89(m, d) m(3, 89, d)\n# define BOOST_PP_REPEAT_2_91(m, d) BOOST_PP_REPEAT_2_90(m, d) m(3, 90, d)\n# define BOOST_PP_REPEAT_2_92(m, d) BOOST_PP_REPEAT_2_91(m, d) m(3, 91, d)\n# define BOOST_PP_REPEAT_2_93(m, d) BOOST_PP_REPEAT_2_92(m, d) m(3, 92, d)\n# define BOOST_PP_REPEAT_2_94(m, d) BOOST_PP_REPEAT_2_93(m, d) m(3, 93, d)\n# define BOOST_PP_REPEAT_2_95(m, d) BOOST_PP_REPEAT_2_94(m, d) m(3, 94, d)\n# define BOOST_PP_REPEAT_2_96(m, d) BOOST_PP_REPEAT_2_95(m, d) m(3, 95, d)\n# define BOOST_PP_REPEAT_2_97(m, d) BOOST_PP_REPEAT_2_96(m, d) m(3, 96, d)\n# define BOOST_PP_REPEAT_2_98(m, d) BOOST_PP_REPEAT_2_97(m, d) m(3, 97, d)\n# define BOOST_PP_REPEAT_2_99(m, d) BOOST_PP_REPEAT_2_98(m, d) m(3, 98, d)\n# define BOOST_PP_REPEAT_2_100(m, d) BOOST_PP_REPEAT_2_99(m, d) m(3, 99, d)\n# define BOOST_PP_REPEAT_2_101(m, d) BOOST_PP_REPEAT_2_100(m, d) m(3, 100, d)\n# define BOOST_PP_REPEAT_2_102(m, d) BOOST_PP_REPEAT_2_101(m, d) m(3, 101, d)\n# define BOOST_PP_REPEAT_2_103(m, d) BOOST_PP_REPEAT_2_102(m, d) m(3, 102, d)\n# define BOOST_PP_REPEAT_2_104(m, d) BOOST_PP_REPEAT_2_103(m, d) m(3, 103, d)\n# define BOOST_PP_REPEAT_2_105(m, d) BOOST_PP_REPEAT_2_104(m, d) m(3, 104, d)\n# define BOOST_PP_REPEAT_2_106(m, d) BOOST_PP_REPEAT_2_105(m, d) m(3, 105, d)\n# define BOOST_PP_REPEAT_2_107(m, d) BOOST_PP_REPEAT_2_106(m, d) m(3, 106, d)\n# define BOOST_PP_REPEAT_2_108(m, d) BOOST_PP_REPEAT_2_107(m, d) m(3, 107, d)\n# define BOOST_PP_REPEAT_2_109(m, d) BOOST_PP_REPEAT_2_108(m, d) m(3, 108, d)\n# define BOOST_PP_REPEAT_2_110(m, d) BOOST_PP_REPEAT_2_109(m, d) m(3, 109, d)\n# define BOOST_PP_REPEAT_2_111(m, d) BOOST_PP_REPEAT_2_110(m, d) m(3, 110, d)\n# define BOOST_PP_REPEAT_2_112(m, d) BOOST_PP_REPEAT_2_111(m, d) m(3, 111, d)\n# define BOOST_PP_REPEAT_2_113(m, d) BOOST_PP_REPEAT_2_112(m, d) m(3, 112, d)\n# define BOOST_PP_REPEAT_2_114(m, d) BOOST_PP_REPEAT_2_113(m, d) m(3, 113, d)\n# define BOOST_PP_REPEAT_2_115(m, d) BOOST_PP_REPEAT_2_114(m, d) m(3, 114, d)\n# define BOOST_PP_REPEAT_2_116(m, d) BOOST_PP_REPEAT_2_115(m, d) m(3, 115, d)\n# define BOOST_PP_REPEAT_2_117(m, d) BOOST_PP_REPEAT_2_116(m, d) m(3, 116, d)\n# define BOOST_PP_REPEAT_2_118(m, d) BOOST_PP_REPEAT_2_117(m, d) m(3, 117, d)\n# define BOOST_PP_REPEAT_2_119(m, d) BOOST_PP_REPEAT_2_118(m, d) m(3, 118, d)\n# define BOOST_PP_REPEAT_2_120(m, d) BOOST_PP_REPEAT_2_119(m, d) m(3, 119, d)\n# define BOOST_PP_REPEAT_2_121(m, d) BOOST_PP_REPEAT_2_120(m, d) m(3, 120, d)\n# define BOOST_PP_REPEAT_2_122(m, d) BOOST_PP_REPEAT_2_121(m, d) m(3, 121, d)\n# define BOOST_PP_REPEAT_2_123(m, d) BOOST_PP_REPEAT_2_122(m, d) m(3, 122, d)\n# define BOOST_PP_REPEAT_2_124(m, d) BOOST_PP_REPEAT_2_123(m, d) m(3, 123, d)\n# define BOOST_PP_REPEAT_2_125(m, d) BOOST_PP_REPEAT_2_124(m, d) m(3, 124, d)\n# define BOOST_PP_REPEAT_2_126(m, d) BOOST_PP_REPEAT_2_125(m, d) m(3, 125, d)\n# define BOOST_PP_REPEAT_2_127(m, d) BOOST_PP_REPEAT_2_126(m, d) m(3, 126, d)\n# define BOOST_PP_REPEAT_2_128(m, d) BOOST_PP_REPEAT_2_127(m, d) m(3, 127, d)\n# define BOOST_PP_REPEAT_2_129(m, d) BOOST_PP_REPEAT_2_128(m, d) m(3, 128, d)\n# define BOOST_PP_REPEAT_2_130(m, d) BOOST_PP_REPEAT_2_129(m, d) m(3, 129, d)\n# define BOOST_PP_REPEAT_2_131(m, d) BOOST_PP_REPEAT_2_130(m, d) m(3, 130, d)\n# define BOOST_PP_REPEAT_2_132(m, d) BOOST_PP_REPEAT_2_131(m, d) m(3, 131, d)\n# define BOOST_PP_REPEAT_2_133(m, d) BOOST_PP_REPEAT_2_132(m, d) m(3, 132, d)\n# define BOOST_PP_REPEAT_2_134(m, d) BOOST_PP_REPEAT_2_133(m, d) m(3, 133, d)\n# define BOOST_PP_REPEAT_2_135(m, d) BOOST_PP_REPEAT_2_134(m, d) m(3, 134, d)\n# define BOOST_PP_REPEAT_2_136(m, d) BOOST_PP_REPEAT_2_135(m, d) m(3, 135, d)\n# define BOOST_PP_REPEAT_2_137(m, d) BOOST_PP_REPEAT_2_136(m, d) m(3, 136, d)\n# define BOOST_PP_REPEAT_2_138(m, d) BOOST_PP_REPEAT_2_137(m, d) m(3, 137, d)\n# define BOOST_PP_REPEAT_2_139(m, d) BOOST_PP_REPEAT_2_138(m, d) m(3, 138, d)\n# define BOOST_PP_REPEAT_2_140(m, d) BOOST_PP_REPEAT_2_139(m, d) m(3, 139, d)\n# define BOOST_PP_REPEAT_2_141(m, d) BOOST_PP_REPEAT_2_140(m, d) m(3, 140, d)\n# define BOOST_PP_REPEAT_2_142(m, d) BOOST_PP_REPEAT_2_141(m, d) m(3, 141, d)\n# define BOOST_PP_REPEAT_2_143(m, d) BOOST_PP_REPEAT_2_142(m, d) m(3, 142, d)\n# define BOOST_PP_REPEAT_2_144(m, d) BOOST_PP_REPEAT_2_143(m, d) m(3, 143, d)\n# define BOOST_PP_REPEAT_2_145(m, d) BOOST_PP_REPEAT_2_144(m, d) m(3, 144, d)\n# define BOOST_PP_REPEAT_2_146(m, d) BOOST_PP_REPEAT_2_145(m, d) m(3, 145, d)\n# define BOOST_PP_REPEAT_2_147(m, d) BOOST_PP_REPEAT_2_146(m, d) m(3, 146, d)\n# define BOOST_PP_REPEAT_2_148(m, d) BOOST_PP_REPEAT_2_147(m, d) m(3, 147, d)\n# define BOOST_PP_REPEAT_2_149(m, d) BOOST_PP_REPEAT_2_148(m, d) m(3, 148, d)\n# define BOOST_PP_REPEAT_2_150(m, d) BOOST_PP_REPEAT_2_149(m, d) m(3, 149, d)\n# define BOOST_PP_REPEAT_2_151(m, d) BOOST_PP_REPEAT_2_150(m, d) m(3, 150, d)\n# define BOOST_PP_REPEAT_2_152(m, d) BOOST_PP_REPEAT_2_151(m, d) m(3, 151, d)\n# define BOOST_PP_REPEAT_2_153(m, d) BOOST_PP_REPEAT_2_152(m, d) m(3, 152, d)\n# define BOOST_PP_REPEAT_2_154(m, d) BOOST_PP_REPEAT_2_153(m, d) m(3, 153, d)\n# define BOOST_PP_REPEAT_2_155(m, d) BOOST_PP_REPEAT_2_154(m, d) m(3, 154, d)\n# define BOOST_PP_REPEAT_2_156(m, d) BOOST_PP_REPEAT_2_155(m, d) m(3, 155, d)\n# define BOOST_PP_REPEAT_2_157(m, d) BOOST_PP_REPEAT_2_156(m, d) m(3, 156, d)\n# define BOOST_PP_REPEAT_2_158(m, d) BOOST_PP_REPEAT_2_157(m, d) m(3, 157, d)\n# define BOOST_PP_REPEAT_2_159(m, d) BOOST_PP_REPEAT_2_158(m, d) m(3, 158, d)\n# define BOOST_PP_REPEAT_2_160(m, d) BOOST_PP_REPEAT_2_159(m, d) m(3, 159, d)\n# define BOOST_PP_REPEAT_2_161(m, d) BOOST_PP_REPEAT_2_160(m, d) m(3, 160, d)\n# define BOOST_PP_REPEAT_2_162(m, d) BOOST_PP_REPEAT_2_161(m, d) m(3, 161, d)\n# define BOOST_PP_REPEAT_2_163(m, d) BOOST_PP_REPEAT_2_162(m, d) m(3, 162, d)\n# define BOOST_PP_REPEAT_2_164(m, d) BOOST_PP_REPEAT_2_163(m, d) m(3, 163, d)\n# define BOOST_PP_REPEAT_2_165(m, d) BOOST_PP_REPEAT_2_164(m, d) m(3, 164, d)\n# define BOOST_PP_REPEAT_2_166(m, d) BOOST_PP_REPEAT_2_165(m, d) m(3, 165, d)\n# define BOOST_PP_REPEAT_2_167(m, d) BOOST_PP_REPEAT_2_166(m, d) m(3, 166, d)\n# define BOOST_PP_REPEAT_2_168(m, d) BOOST_PP_REPEAT_2_167(m, d) m(3, 167, d)\n# define BOOST_PP_REPEAT_2_169(m, d) BOOST_PP_REPEAT_2_168(m, d) m(3, 168, d)\n# define BOOST_PP_REPEAT_2_170(m, d) BOOST_PP_REPEAT_2_169(m, d) m(3, 169, d)\n# define BOOST_PP_REPEAT_2_171(m, d) BOOST_PP_REPEAT_2_170(m, d) m(3, 170, d)\n# define BOOST_PP_REPEAT_2_172(m, d) BOOST_PP_REPEAT_2_171(m, d) m(3, 171, d)\n# define BOOST_PP_REPEAT_2_173(m, d) BOOST_PP_REPEAT_2_172(m, d) m(3, 172, d)\n# define BOOST_PP_REPEAT_2_174(m, d) BOOST_PP_REPEAT_2_173(m, d) m(3, 173, d)\n# define BOOST_PP_REPEAT_2_175(m, d) BOOST_PP_REPEAT_2_174(m, d) m(3, 174, d)\n# define BOOST_PP_REPEAT_2_176(m, d) BOOST_PP_REPEAT_2_175(m, d) m(3, 175, d)\n# define BOOST_PP_REPEAT_2_177(m, d) BOOST_PP_REPEAT_2_176(m, d) m(3, 176, d)\n# define BOOST_PP_REPEAT_2_178(m, d) BOOST_PP_REPEAT_2_177(m, d) m(3, 177, d)\n# define BOOST_PP_REPEAT_2_179(m, d) BOOST_PP_REPEAT_2_178(m, d) m(3, 178, d)\n# define BOOST_PP_REPEAT_2_180(m, d) BOOST_PP_REPEAT_2_179(m, d) m(3, 179, d)\n# define BOOST_PP_REPEAT_2_181(m, d) BOOST_PP_REPEAT_2_180(m, d) m(3, 180, d)\n# define BOOST_PP_REPEAT_2_182(m, d) BOOST_PP_REPEAT_2_181(m, d) m(3, 181, d)\n# define BOOST_PP_REPEAT_2_183(m, d) BOOST_PP_REPEAT_2_182(m, d) m(3, 182, d)\n# define BOOST_PP_REPEAT_2_184(m, d) BOOST_PP_REPEAT_2_183(m, d) m(3, 183, d)\n# define BOOST_PP_REPEAT_2_185(m, d) BOOST_PP_REPEAT_2_184(m, d) m(3, 184, d)\n# define BOOST_PP_REPEAT_2_186(m, d) BOOST_PP_REPEAT_2_185(m, d) m(3, 185, d)\n# define BOOST_PP_REPEAT_2_187(m, d) BOOST_PP_REPEAT_2_186(m, d) m(3, 186, d)\n# define BOOST_PP_REPEAT_2_188(m, d) BOOST_PP_REPEAT_2_187(m, d) m(3, 187, d)\n# define BOOST_PP_REPEAT_2_189(m, d) BOOST_PP_REPEAT_2_188(m, d) m(3, 188, d)\n# define BOOST_PP_REPEAT_2_190(m, d) BOOST_PP_REPEAT_2_189(m, d) m(3, 189, d)\n# define BOOST_PP_REPEAT_2_191(m, d) BOOST_PP_REPEAT_2_190(m, d) m(3, 190, d)\n# define BOOST_PP_REPEAT_2_192(m, d) BOOST_PP_REPEAT_2_191(m, d) m(3, 191, d)\n# define BOOST_PP_REPEAT_2_193(m, d) BOOST_PP_REPEAT_2_192(m, d) m(3, 192, d)\n# define BOOST_PP_REPEAT_2_194(m, d) BOOST_PP_REPEAT_2_193(m, d) m(3, 193, d)\n# define BOOST_PP_REPEAT_2_195(m, d) BOOST_PP_REPEAT_2_194(m, d) m(3, 194, d)\n# define BOOST_PP_REPEAT_2_196(m, d) BOOST_PP_REPEAT_2_195(m, d) m(3, 195, d)\n# define BOOST_PP_REPEAT_2_197(m, d) BOOST_PP_REPEAT_2_196(m, d) m(3, 196, d)\n# define BOOST_PP_REPEAT_2_198(m, d) BOOST_PP_REPEAT_2_197(m, d) m(3, 197, d)\n# define BOOST_PP_REPEAT_2_199(m, d) BOOST_PP_REPEAT_2_198(m, d) m(3, 198, d)\n# define BOOST_PP_REPEAT_2_200(m, d) BOOST_PP_REPEAT_2_199(m, d) m(3, 199, d)\n# define BOOST_PP_REPEAT_2_201(m, d) BOOST_PP_REPEAT_2_200(m, d) m(3, 200, d)\n# define BOOST_PP_REPEAT_2_202(m, d) BOOST_PP_REPEAT_2_201(m, d) m(3, 201, d)\n# define BOOST_PP_REPEAT_2_203(m, d) BOOST_PP_REPEAT_2_202(m, d) m(3, 202, d)\n# define BOOST_PP_REPEAT_2_204(m, d) BOOST_PP_REPEAT_2_203(m, d) m(3, 203, d)\n# define BOOST_PP_REPEAT_2_205(m, d) BOOST_PP_REPEAT_2_204(m, d) m(3, 204, d)\n# define BOOST_PP_REPEAT_2_206(m, d) BOOST_PP_REPEAT_2_205(m, d) m(3, 205, d)\n# define BOOST_PP_REPEAT_2_207(m, d) BOOST_PP_REPEAT_2_206(m, d) m(3, 206, d)\n# define BOOST_PP_REPEAT_2_208(m, d) BOOST_PP_REPEAT_2_207(m, d) m(3, 207, d)\n# define BOOST_PP_REPEAT_2_209(m, d) BOOST_PP_REPEAT_2_208(m, d) m(3, 208, d)\n# define BOOST_PP_REPEAT_2_210(m, d) BOOST_PP_REPEAT_2_209(m, d) m(3, 209, d)\n# define BOOST_PP_REPEAT_2_211(m, d) BOOST_PP_REPEAT_2_210(m, d) m(3, 210, d)\n# define BOOST_PP_REPEAT_2_212(m, d) BOOST_PP_REPEAT_2_211(m, d) m(3, 211, d)\n# define BOOST_PP_REPEAT_2_213(m, d) BOOST_PP_REPEAT_2_212(m, d) m(3, 212, d)\n# define BOOST_PP_REPEAT_2_214(m, d) BOOST_PP_REPEAT_2_213(m, d) m(3, 213, d)\n# define BOOST_PP_REPEAT_2_215(m, d) BOOST_PP_REPEAT_2_214(m, d) m(3, 214, d)\n# define BOOST_PP_REPEAT_2_216(m, d) BOOST_PP_REPEAT_2_215(m, d) m(3, 215, d)\n# define BOOST_PP_REPEAT_2_217(m, d) BOOST_PP_REPEAT_2_216(m, d) m(3, 216, d)\n# define BOOST_PP_REPEAT_2_218(m, d) BOOST_PP_REPEAT_2_217(m, d) m(3, 217, d)\n# define BOOST_PP_REPEAT_2_219(m, d) BOOST_PP_REPEAT_2_218(m, d) m(3, 218, d)\n# define BOOST_PP_REPEAT_2_220(m, d) BOOST_PP_REPEAT_2_219(m, d) m(3, 219, d)\n# define BOOST_PP_REPEAT_2_221(m, d) BOOST_PP_REPEAT_2_220(m, d) m(3, 220, d)\n# define BOOST_PP_REPEAT_2_222(m, d) BOOST_PP_REPEAT_2_221(m, d) m(3, 221, d)\n# define BOOST_PP_REPEAT_2_223(m, d) BOOST_PP_REPEAT_2_222(m, d) m(3, 222, d)\n# define BOOST_PP_REPEAT_2_224(m, d) BOOST_PP_REPEAT_2_223(m, d) m(3, 223, d)\n# define BOOST_PP_REPEAT_2_225(m, d) BOOST_PP_REPEAT_2_224(m, d) m(3, 224, d)\n# define BOOST_PP_REPEAT_2_226(m, d) BOOST_PP_REPEAT_2_225(m, d) m(3, 225, d)\n# define BOOST_PP_REPEAT_2_227(m, d) BOOST_PP_REPEAT_2_226(m, d) m(3, 226, d)\n# define BOOST_PP_REPEAT_2_228(m, d) BOOST_PP_REPEAT_2_227(m, d) m(3, 227, d)\n# define BOOST_PP_REPEAT_2_229(m, d) BOOST_PP_REPEAT_2_228(m, d) m(3, 228, d)\n# define BOOST_PP_REPEAT_2_230(m, d) BOOST_PP_REPEAT_2_229(m, d) m(3, 229, d)\n# define BOOST_PP_REPEAT_2_231(m, d) BOOST_PP_REPEAT_2_230(m, d) m(3, 230, d)\n# define BOOST_PP_REPEAT_2_232(m, d) BOOST_PP_REPEAT_2_231(m, d) m(3, 231, d)\n# define BOOST_PP_REPEAT_2_233(m, d) BOOST_PP_REPEAT_2_232(m, d) m(3, 232, d)\n# define BOOST_PP_REPEAT_2_234(m, d) BOOST_PP_REPEAT_2_233(m, d) m(3, 233, d)\n# define BOOST_PP_REPEAT_2_235(m, d) BOOST_PP_REPEAT_2_234(m, d) m(3, 234, d)\n# define BOOST_PP_REPEAT_2_236(m, d) BOOST_PP_REPEAT_2_235(m, d) m(3, 235, d)\n# define BOOST_PP_REPEAT_2_237(m, d) BOOST_PP_REPEAT_2_236(m, d) m(3, 236, d)\n# define BOOST_PP_REPEAT_2_238(m, d) BOOST_PP_REPEAT_2_237(m, d) m(3, 237, d)\n# define BOOST_PP_REPEAT_2_239(m, d) BOOST_PP_REPEAT_2_238(m, d) m(3, 238, d)\n# define BOOST_PP_REPEAT_2_240(m, d) BOOST_PP_REPEAT_2_239(m, d) m(3, 239, d)\n# define BOOST_PP_REPEAT_2_241(m, d) BOOST_PP_REPEAT_2_240(m, d) m(3, 240, d)\n# define BOOST_PP_REPEAT_2_242(m, d) BOOST_PP_REPEAT_2_241(m, d) m(3, 241, d)\n# define BOOST_PP_REPEAT_2_243(m, d) BOOST_PP_REPEAT_2_242(m, d) m(3, 242, d)\n# define BOOST_PP_REPEAT_2_244(m, d) BOOST_PP_REPEAT_2_243(m, d) m(3, 243, d)\n# define BOOST_PP_REPEAT_2_245(m, d) BOOST_PP_REPEAT_2_244(m, d) m(3, 244, d)\n# define BOOST_PP_REPEAT_2_246(m, d) BOOST_PP_REPEAT_2_245(m, d) m(3, 245, d)\n# define BOOST_PP_REPEAT_2_247(m, d) BOOST_PP_REPEAT_2_246(m, d) m(3, 246, d)\n# define BOOST_PP_REPEAT_2_248(m, d) BOOST_PP_REPEAT_2_247(m, d) m(3, 247, d)\n# define BOOST_PP_REPEAT_2_249(m, d) BOOST_PP_REPEAT_2_248(m, d) m(3, 248, d)\n# define BOOST_PP_REPEAT_2_250(m, d) BOOST_PP_REPEAT_2_249(m, d) m(3, 249, d)\n# define BOOST_PP_REPEAT_2_251(m, d) BOOST_PP_REPEAT_2_250(m, d) m(3, 250, d)\n# define BOOST_PP_REPEAT_2_252(m, d) BOOST_PP_REPEAT_2_251(m, d) m(3, 251, d)\n# define BOOST_PP_REPEAT_2_253(m, d) BOOST_PP_REPEAT_2_252(m, d) m(3, 252, d)\n# define BOOST_PP_REPEAT_2_254(m, d) BOOST_PP_REPEAT_2_253(m, d) m(3, 253, d)\n# define BOOST_PP_REPEAT_2_255(m, d) BOOST_PP_REPEAT_2_254(m, d) m(3, 254, d)\n# define BOOST_PP_REPEAT_2_256(m, d) BOOST_PP_REPEAT_2_255(m, d) m(3, 255, d)\n#\n# define BOOST_PP_REPEAT_3_0(m, d)\n# define BOOST_PP_REPEAT_3_1(m, d) m(4, 0, d)\n# define BOOST_PP_REPEAT_3_2(m, d) BOOST_PP_REPEAT_3_1(m, d) m(4, 1, d)\n# define BOOST_PP_REPEAT_3_3(m, d) BOOST_PP_REPEAT_3_2(m, d) m(4, 2, d)\n# define BOOST_PP_REPEAT_3_4(m, d) BOOST_PP_REPEAT_3_3(m, d) m(4, 3, d)\n# define BOOST_PP_REPEAT_3_5(m, d) BOOST_PP_REPEAT_3_4(m, d) m(4, 4, d)\n# define BOOST_PP_REPEAT_3_6(m, d) BOOST_PP_REPEAT_3_5(m, d) m(4, 5, d)\n# define BOOST_PP_REPEAT_3_7(m, d) BOOST_PP_REPEAT_3_6(m, d) m(4, 6, d)\n# define BOOST_PP_REPEAT_3_8(m, d) BOOST_PP_REPEAT_3_7(m, d) m(4, 7, d)\n# define BOOST_PP_REPEAT_3_9(m, d) BOOST_PP_REPEAT_3_8(m, d) m(4, 8, d)\n# define BOOST_PP_REPEAT_3_10(m, d) BOOST_PP_REPEAT_3_9(m, d) m(4, 9, d)\n# define BOOST_PP_REPEAT_3_11(m, d) BOOST_PP_REPEAT_3_10(m, d) m(4, 10, d)\n# define BOOST_PP_REPEAT_3_12(m, d) BOOST_PP_REPEAT_3_11(m, d) m(4, 11, d)\n# define BOOST_PP_REPEAT_3_13(m, d) BOOST_PP_REPEAT_3_12(m, d) m(4, 12, d)\n# define BOOST_PP_REPEAT_3_14(m, d) BOOST_PP_REPEAT_3_13(m, d) m(4, 13, d)\n# define BOOST_PP_REPEAT_3_15(m, d) BOOST_PP_REPEAT_3_14(m, d) m(4, 14, d)\n# define BOOST_PP_REPEAT_3_16(m, d) BOOST_PP_REPEAT_3_15(m, d) m(4, 15, d)\n# define BOOST_PP_REPEAT_3_17(m, d) BOOST_PP_REPEAT_3_16(m, d) m(4, 16, d)\n# define BOOST_PP_REPEAT_3_18(m, d) BOOST_PP_REPEAT_3_17(m, d) m(4, 17, d)\n# define BOOST_PP_REPEAT_3_19(m, d) BOOST_PP_REPEAT_3_18(m, d) m(4, 18, d)\n# define BOOST_PP_REPEAT_3_20(m, d) BOOST_PP_REPEAT_3_19(m, d) m(4, 19, d)\n# define BOOST_PP_REPEAT_3_21(m, d) BOOST_PP_REPEAT_3_20(m, d) m(4, 20, d)\n# define BOOST_PP_REPEAT_3_22(m, d) BOOST_PP_REPEAT_3_21(m, d) m(4, 21, d)\n# define BOOST_PP_REPEAT_3_23(m, d) BOOST_PP_REPEAT_3_22(m, d) m(4, 22, d)\n# define BOOST_PP_REPEAT_3_24(m, d) BOOST_PP_REPEAT_3_23(m, d) m(4, 23, d)\n# define BOOST_PP_REPEAT_3_25(m, d) BOOST_PP_REPEAT_3_24(m, d) m(4, 24, d)\n# define BOOST_PP_REPEAT_3_26(m, d) BOOST_PP_REPEAT_3_25(m, d) m(4, 25, d)\n# define BOOST_PP_REPEAT_3_27(m, d) BOOST_PP_REPEAT_3_26(m, d) m(4, 26, d)\n# define BOOST_PP_REPEAT_3_28(m, d) BOOST_PP_REPEAT_3_27(m, d) m(4, 27, d)\n# define BOOST_PP_REPEAT_3_29(m, d) BOOST_PP_REPEAT_3_28(m, d) m(4, 28, d)\n# define BOOST_PP_REPEAT_3_30(m, d) BOOST_PP_REPEAT_3_29(m, d) m(4, 29, d)\n# define BOOST_PP_REPEAT_3_31(m, d) BOOST_PP_REPEAT_3_30(m, d) m(4, 30, d)\n# define BOOST_PP_REPEAT_3_32(m, d) BOOST_PP_REPEAT_3_31(m, d) m(4, 31, d)\n# define BOOST_PP_REPEAT_3_33(m, d) BOOST_PP_REPEAT_3_32(m, d) m(4, 32, d)\n# define BOOST_PP_REPEAT_3_34(m, d) BOOST_PP_REPEAT_3_33(m, d) m(4, 33, d)\n# define BOOST_PP_REPEAT_3_35(m, d) BOOST_PP_REPEAT_3_34(m, d) m(4, 34, d)\n# define BOOST_PP_REPEAT_3_36(m, d) BOOST_PP_REPEAT_3_35(m, d) m(4, 35, d)\n# define BOOST_PP_REPEAT_3_37(m, d) BOOST_PP_REPEAT_3_36(m, d) m(4, 36, d)\n# define BOOST_PP_REPEAT_3_38(m, d) BOOST_PP_REPEAT_3_37(m, d) m(4, 37, d)\n# define BOOST_PP_REPEAT_3_39(m, d) BOOST_PP_REPEAT_3_38(m, d) m(4, 38, d)\n# define BOOST_PP_REPEAT_3_40(m, d) BOOST_PP_REPEAT_3_39(m, d) m(4, 39, d)\n# define BOOST_PP_REPEAT_3_41(m, d) BOOST_PP_REPEAT_3_40(m, d) m(4, 40, d)\n# define BOOST_PP_REPEAT_3_42(m, d) BOOST_PP_REPEAT_3_41(m, d) m(4, 41, d)\n# define BOOST_PP_REPEAT_3_43(m, d) BOOST_PP_REPEAT_3_42(m, d) m(4, 42, d)\n# define BOOST_PP_REPEAT_3_44(m, d) BOOST_PP_REPEAT_3_43(m, d) m(4, 43, d)\n# define BOOST_PP_REPEAT_3_45(m, d) BOOST_PP_REPEAT_3_44(m, d) m(4, 44, d)\n# define BOOST_PP_REPEAT_3_46(m, d) BOOST_PP_REPEAT_3_45(m, d) m(4, 45, d)\n# define BOOST_PP_REPEAT_3_47(m, d) BOOST_PP_REPEAT_3_46(m, d) m(4, 46, d)\n# define BOOST_PP_REPEAT_3_48(m, d) BOOST_PP_REPEAT_3_47(m, d) m(4, 47, d)\n# define BOOST_PP_REPEAT_3_49(m, d) BOOST_PP_REPEAT_3_48(m, d) m(4, 48, d)\n# define BOOST_PP_REPEAT_3_50(m, d) BOOST_PP_REPEAT_3_49(m, d) m(4, 49, d)\n# define BOOST_PP_REPEAT_3_51(m, d) BOOST_PP_REPEAT_3_50(m, d) m(4, 50, d)\n# define BOOST_PP_REPEAT_3_52(m, d) BOOST_PP_REPEAT_3_51(m, d) m(4, 51, d)\n# define BOOST_PP_REPEAT_3_53(m, d) BOOST_PP_REPEAT_3_52(m, d) m(4, 52, d)\n# define BOOST_PP_REPEAT_3_54(m, d) BOOST_PP_REPEAT_3_53(m, d) m(4, 53, d)\n# define BOOST_PP_REPEAT_3_55(m, d) BOOST_PP_REPEAT_3_54(m, d) m(4, 54, d)\n# define BOOST_PP_REPEAT_3_56(m, d) BOOST_PP_REPEAT_3_55(m, d) m(4, 55, d)\n# define BOOST_PP_REPEAT_3_57(m, d) BOOST_PP_REPEAT_3_56(m, d) m(4, 56, d)\n# define BOOST_PP_REPEAT_3_58(m, d) BOOST_PP_REPEAT_3_57(m, d) m(4, 57, d)\n# define BOOST_PP_REPEAT_3_59(m, d) BOOST_PP_REPEAT_3_58(m, d) m(4, 58, d)\n# define BOOST_PP_REPEAT_3_60(m, d) BOOST_PP_REPEAT_3_59(m, d) m(4, 59, d)\n# define BOOST_PP_REPEAT_3_61(m, d) BOOST_PP_REPEAT_3_60(m, d) m(4, 60, d)\n# define BOOST_PP_REPEAT_3_62(m, d) BOOST_PP_REPEAT_3_61(m, d) m(4, 61, d)\n# define BOOST_PP_REPEAT_3_63(m, d) BOOST_PP_REPEAT_3_62(m, d) m(4, 62, d)\n# define BOOST_PP_REPEAT_3_64(m, d) BOOST_PP_REPEAT_3_63(m, d) m(4, 63, d)\n# define BOOST_PP_REPEAT_3_65(m, d) BOOST_PP_REPEAT_3_64(m, d) m(4, 64, d)\n# define BOOST_PP_REPEAT_3_66(m, d) BOOST_PP_REPEAT_3_65(m, d) m(4, 65, d)\n# define BOOST_PP_REPEAT_3_67(m, d) BOOST_PP_REPEAT_3_66(m, d) m(4, 66, d)\n# define BOOST_PP_REPEAT_3_68(m, d) BOOST_PP_REPEAT_3_67(m, d) m(4, 67, d)\n# define BOOST_PP_REPEAT_3_69(m, d) BOOST_PP_REPEAT_3_68(m, d) m(4, 68, d)\n# define BOOST_PP_REPEAT_3_70(m, d) BOOST_PP_REPEAT_3_69(m, d) m(4, 69, d)\n# define BOOST_PP_REPEAT_3_71(m, d) BOOST_PP_REPEAT_3_70(m, d) m(4, 70, d)\n# define BOOST_PP_REPEAT_3_72(m, d) BOOST_PP_REPEAT_3_71(m, d) m(4, 71, d)\n# define BOOST_PP_REPEAT_3_73(m, d) BOOST_PP_REPEAT_3_72(m, d) m(4, 72, d)\n# define BOOST_PP_REPEAT_3_74(m, d) BOOST_PP_REPEAT_3_73(m, d) m(4, 73, d)\n# define BOOST_PP_REPEAT_3_75(m, d) BOOST_PP_REPEAT_3_74(m, d) m(4, 74, d)\n# define BOOST_PP_REPEAT_3_76(m, d) BOOST_PP_REPEAT_3_75(m, d) m(4, 75, d)\n# define BOOST_PP_REPEAT_3_77(m, d) BOOST_PP_REPEAT_3_76(m, d) m(4, 76, d)\n# define BOOST_PP_REPEAT_3_78(m, d) BOOST_PP_REPEAT_3_77(m, d) m(4, 77, d)\n# define BOOST_PP_REPEAT_3_79(m, d) BOOST_PP_REPEAT_3_78(m, d) m(4, 78, d)\n# define BOOST_PP_REPEAT_3_80(m, d) BOOST_PP_REPEAT_3_79(m, d) m(4, 79, d)\n# define BOOST_PP_REPEAT_3_81(m, d) BOOST_PP_REPEAT_3_80(m, d) m(4, 80, d)\n# define BOOST_PP_REPEAT_3_82(m, d) BOOST_PP_REPEAT_3_81(m, d) m(4, 81, d)\n# define BOOST_PP_REPEAT_3_83(m, d) BOOST_PP_REPEAT_3_82(m, d) m(4, 82, d)\n# define BOOST_PP_REPEAT_3_84(m, d) BOOST_PP_REPEAT_3_83(m, d) m(4, 83, d)\n# define BOOST_PP_REPEAT_3_85(m, d) BOOST_PP_REPEAT_3_84(m, d) m(4, 84, d)\n# define BOOST_PP_REPEAT_3_86(m, d) BOOST_PP_REPEAT_3_85(m, d) m(4, 85, d)\n# define BOOST_PP_REPEAT_3_87(m, d) BOOST_PP_REPEAT_3_86(m, d) m(4, 86, d)\n# define BOOST_PP_REPEAT_3_88(m, d) BOOST_PP_REPEAT_3_87(m, d) m(4, 87, d)\n# define BOOST_PP_REPEAT_3_89(m, d) BOOST_PP_REPEAT_3_88(m, d) m(4, 88, d)\n# define BOOST_PP_REPEAT_3_90(m, d) BOOST_PP_REPEAT_3_89(m, d) m(4, 89, d)\n# define BOOST_PP_REPEAT_3_91(m, d) BOOST_PP_REPEAT_3_90(m, d) m(4, 90, d)\n# define BOOST_PP_REPEAT_3_92(m, d) BOOST_PP_REPEAT_3_91(m, d) m(4, 91, d)\n# define BOOST_PP_REPEAT_3_93(m, d) BOOST_PP_REPEAT_3_92(m, d) m(4, 92, d)\n# define BOOST_PP_REPEAT_3_94(m, d) BOOST_PP_REPEAT_3_93(m, d) m(4, 93, d)\n# define BOOST_PP_REPEAT_3_95(m, d) BOOST_PP_REPEAT_3_94(m, d) m(4, 94, d)\n# define BOOST_PP_REPEAT_3_96(m, d) BOOST_PP_REPEAT_3_95(m, d) m(4, 95, d)\n# define BOOST_PP_REPEAT_3_97(m, d) BOOST_PP_REPEAT_3_96(m, d) m(4, 96, d)\n# define BOOST_PP_REPEAT_3_98(m, d) BOOST_PP_REPEAT_3_97(m, d) m(4, 97, d)\n# define BOOST_PP_REPEAT_3_99(m, d) BOOST_PP_REPEAT_3_98(m, d) m(4, 98, d)\n# define BOOST_PP_REPEAT_3_100(m, d) BOOST_PP_REPEAT_3_99(m, d) m(4, 99, d)\n# define BOOST_PP_REPEAT_3_101(m, d) BOOST_PP_REPEAT_3_100(m, d) m(4, 100, d)\n# define BOOST_PP_REPEAT_3_102(m, d) BOOST_PP_REPEAT_3_101(m, d) m(4, 101, d)\n# define BOOST_PP_REPEAT_3_103(m, d) BOOST_PP_REPEAT_3_102(m, d) m(4, 102, d)\n# define BOOST_PP_REPEAT_3_104(m, d) BOOST_PP_REPEAT_3_103(m, d) m(4, 103, d)\n# define BOOST_PP_REPEAT_3_105(m, d) BOOST_PP_REPEAT_3_104(m, d) m(4, 104, d)\n# define BOOST_PP_REPEAT_3_106(m, d) BOOST_PP_REPEAT_3_105(m, d) m(4, 105, d)\n# define BOOST_PP_REPEAT_3_107(m, d) BOOST_PP_REPEAT_3_106(m, d) m(4, 106, d)\n# define BOOST_PP_REPEAT_3_108(m, d) BOOST_PP_REPEAT_3_107(m, d) m(4, 107, d)\n# define BOOST_PP_REPEAT_3_109(m, d) BOOST_PP_REPEAT_3_108(m, d) m(4, 108, d)\n# define BOOST_PP_REPEAT_3_110(m, d) BOOST_PP_REPEAT_3_109(m, d) m(4, 109, d)\n# define BOOST_PP_REPEAT_3_111(m, d) BOOST_PP_REPEAT_3_110(m, d) m(4, 110, d)\n# define BOOST_PP_REPEAT_3_112(m, d) BOOST_PP_REPEAT_3_111(m, d) m(4, 111, d)\n# define BOOST_PP_REPEAT_3_113(m, d) BOOST_PP_REPEAT_3_112(m, d) m(4, 112, d)\n# define BOOST_PP_REPEAT_3_114(m, d) BOOST_PP_REPEAT_3_113(m, d) m(4, 113, d)\n# define BOOST_PP_REPEAT_3_115(m, d) BOOST_PP_REPEAT_3_114(m, d) m(4, 114, d)\n# define BOOST_PP_REPEAT_3_116(m, d) BOOST_PP_REPEAT_3_115(m, d) m(4, 115, d)\n# define BOOST_PP_REPEAT_3_117(m, d) BOOST_PP_REPEAT_3_116(m, d) m(4, 116, d)\n# define BOOST_PP_REPEAT_3_118(m, d) BOOST_PP_REPEAT_3_117(m, d) m(4, 117, d)\n# define BOOST_PP_REPEAT_3_119(m, d) BOOST_PP_REPEAT_3_118(m, d) m(4, 118, d)\n# define BOOST_PP_REPEAT_3_120(m, d) BOOST_PP_REPEAT_3_119(m, d) m(4, 119, d)\n# define BOOST_PP_REPEAT_3_121(m, d) BOOST_PP_REPEAT_3_120(m, d) m(4, 120, d)\n# define BOOST_PP_REPEAT_3_122(m, d) BOOST_PP_REPEAT_3_121(m, d) m(4, 121, d)\n# define BOOST_PP_REPEAT_3_123(m, d) BOOST_PP_REPEAT_3_122(m, d) m(4, 122, d)\n# define BOOST_PP_REPEAT_3_124(m, d) BOOST_PP_REPEAT_3_123(m, d) m(4, 123, d)\n# define BOOST_PP_REPEAT_3_125(m, d) BOOST_PP_REPEAT_3_124(m, d) m(4, 124, d)\n# define BOOST_PP_REPEAT_3_126(m, d) BOOST_PP_REPEAT_3_125(m, d) m(4, 125, d)\n# define BOOST_PP_REPEAT_3_127(m, d) BOOST_PP_REPEAT_3_126(m, d) m(4, 126, d)\n# define BOOST_PP_REPEAT_3_128(m, d) BOOST_PP_REPEAT_3_127(m, d) m(4, 127, d)\n# define BOOST_PP_REPEAT_3_129(m, d) BOOST_PP_REPEAT_3_128(m, d) m(4, 128, d)\n# define BOOST_PP_REPEAT_3_130(m, d) BOOST_PP_REPEAT_3_129(m, d) m(4, 129, d)\n# define BOOST_PP_REPEAT_3_131(m, d) BOOST_PP_REPEAT_3_130(m, d) m(4, 130, d)\n# define BOOST_PP_REPEAT_3_132(m, d) BOOST_PP_REPEAT_3_131(m, d) m(4, 131, d)\n# define BOOST_PP_REPEAT_3_133(m, d) BOOST_PP_REPEAT_3_132(m, d) m(4, 132, d)\n# define BOOST_PP_REPEAT_3_134(m, d) BOOST_PP_REPEAT_3_133(m, d) m(4, 133, d)\n# define BOOST_PP_REPEAT_3_135(m, d) BOOST_PP_REPEAT_3_134(m, d) m(4, 134, d)\n# define BOOST_PP_REPEAT_3_136(m, d) BOOST_PP_REPEAT_3_135(m, d) m(4, 135, d)\n# define BOOST_PP_REPEAT_3_137(m, d) BOOST_PP_REPEAT_3_136(m, d) m(4, 136, d)\n# define BOOST_PP_REPEAT_3_138(m, d) BOOST_PP_REPEAT_3_137(m, d) m(4, 137, d)\n# define BOOST_PP_REPEAT_3_139(m, d) BOOST_PP_REPEAT_3_138(m, d) m(4, 138, d)\n# define BOOST_PP_REPEAT_3_140(m, d) BOOST_PP_REPEAT_3_139(m, d) m(4, 139, d)\n# define BOOST_PP_REPEAT_3_141(m, d) BOOST_PP_REPEAT_3_140(m, d) m(4, 140, d)\n# define BOOST_PP_REPEAT_3_142(m, d) BOOST_PP_REPEAT_3_141(m, d) m(4, 141, d)\n# define BOOST_PP_REPEAT_3_143(m, d) BOOST_PP_REPEAT_3_142(m, d) m(4, 142, d)\n# define BOOST_PP_REPEAT_3_144(m, d) BOOST_PP_REPEAT_3_143(m, d) m(4, 143, d)\n# define BOOST_PP_REPEAT_3_145(m, d) BOOST_PP_REPEAT_3_144(m, d) m(4, 144, d)\n# define BOOST_PP_REPEAT_3_146(m, d) BOOST_PP_REPEAT_3_145(m, d) m(4, 145, d)\n# define BOOST_PP_REPEAT_3_147(m, d) BOOST_PP_REPEAT_3_146(m, d) m(4, 146, d)\n# define BOOST_PP_REPEAT_3_148(m, d) BOOST_PP_REPEAT_3_147(m, d) m(4, 147, d)\n# define BOOST_PP_REPEAT_3_149(m, d) BOOST_PP_REPEAT_3_148(m, d) m(4, 148, d)\n# define BOOST_PP_REPEAT_3_150(m, d) BOOST_PP_REPEAT_3_149(m, d) m(4, 149, d)\n# define BOOST_PP_REPEAT_3_151(m, d) BOOST_PP_REPEAT_3_150(m, d) m(4, 150, d)\n# define BOOST_PP_REPEAT_3_152(m, d) BOOST_PP_REPEAT_3_151(m, d) m(4, 151, d)\n# define BOOST_PP_REPEAT_3_153(m, d) BOOST_PP_REPEAT_3_152(m, d) m(4, 152, d)\n# define BOOST_PP_REPEAT_3_154(m, d) BOOST_PP_REPEAT_3_153(m, d) m(4, 153, d)\n# define BOOST_PP_REPEAT_3_155(m, d) BOOST_PP_REPEAT_3_154(m, d) m(4, 154, d)\n# define BOOST_PP_REPEAT_3_156(m, d) BOOST_PP_REPEAT_3_155(m, d) m(4, 155, d)\n# define BOOST_PP_REPEAT_3_157(m, d) BOOST_PP_REPEAT_3_156(m, d) m(4, 156, d)\n# define BOOST_PP_REPEAT_3_158(m, d) BOOST_PP_REPEAT_3_157(m, d) m(4, 157, d)\n# define BOOST_PP_REPEAT_3_159(m, d) BOOST_PP_REPEAT_3_158(m, d) m(4, 158, d)\n# define BOOST_PP_REPEAT_3_160(m, d) BOOST_PP_REPEAT_3_159(m, d) m(4, 159, d)\n# define BOOST_PP_REPEAT_3_161(m, d) BOOST_PP_REPEAT_3_160(m, d) m(4, 160, d)\n# define BOOST_PP_REPEAT_3_162(m, d) BOOST_PP_REPEAT_3_161(m, d) m(4, 161, d)\n# define BOOST_PP_REPEAT_3_163(m, d) BOOST_PP_REPEAT_3_162(m, d) m(4, 162, d)\n# define BOOST_PP_REPEAT_3_164(m, d) BOOST_PP_REPEAT_3_163(m, d) m(4, 163, d)\n# define BOOST_PP_REPEAT_3_165(m, d) BOOST_PP_REPEAT_3_164(m, d) m(4, 164, d)\n# define BOOST_PP_REPEAT_3_166(m, d) BOOST_PP_REPEAT_3_165(m, d) m(4, 165, d)\n# define BOOST_PP_REPEAT_3_167(m, d) BOOST_PP_REPEAT_3_166(m, d) m(4, 166, d)\n# define BOOST_PP_REPEAT_3_168(m, d) BOOST_PP_REPEAT_3_167(m, d) m(4, 167, d)\n# define BOOST_PP_REPEAT_3_169(m, d) BOOST_PP_REPEAT_3_168(m, d) m(4, 168, d)\n# define BOOST_PP_REPEAT_3_170(m, d) BOOST_PP_REPEAT_3_169(m, d) m(4, 169, d)\n# define BOOST_PP_REPEAT_3_171(m, d) BOOST_PP_REPEAT_3_170(m, d) m(4, 170, d)\n# define BOOST_PP_REPEAT_3_172(m, d) BOOST_PP_REPEAT_3_171(m, d) m(4, 171, d)\n# define BOOST_PP_REPEAT_3_173(m, d) BOOST_PP_REPEAT_3_172(m, d) m(4, 172, d)\n# define BOOST_PP_REPEAT_3_174(m, d) BOOST_PP_REPEAT_3_173(m, d) m(4, 173, d)\n# define BOOST_PP_REPEAT_3_175(m, d) BOOST_PP_REPEAT_3_174(m, d) m(4, 174, d)\n# define BOOST_PP_REPEAT_3_176(m, d) BOOST_PP_REPEAT_3_175(m, d) m(4, 175, d)\n# define BOOST_PP_REPEAT_3_177(m, d) BOOST_PP_REPEAT_3_176(m, d) m(4, 176, d)\n# define BOOST_PP_REPEAT_3_178(m, d) BOOST_PP_REPEAT_3_177(m, d) m(4, 177, d)\n# define BOOST_PP_REPEAT_3_179(m, d) BOOST_PP_REPEAT_3_178(m, d) m(4, 178, d)\n# define BOOST_PP_REPEAT_3_180(m, d) BOOST_PP_REPEAT_3_179(m, d) m(4, 179, d)\n# define BOOST_PP_REPEAT_3_181(m, d) BOOST_PP_REPEAT_3_180(m, d) m(4, 180, d)\n# define BOOST_PP_REPEAT_3_182(m, d) BOOST_PP_REPEAT_3_181(m, d) m(4, 181, d)\n# define BOOST_PP_REPEAT_3_183(m, d) BOOST_PP_REPEAT_3_182(m, d) m(4, 182, d)\n# define BOOST_PP_REPEAT_3_184(m, d) BOOST_PP_REPEAT_3_183(m, d) m(4, 183, d)\n# define BOOST_PP_REPEAT_3_185(m, d) BOOST_PP_REPEAT_3_184(m, d) m(4, 184, d)\n# define BOOST_PP_REPEAT_3_186(m, d) BOOST_PP_REPEAT_3_185(m, d) m(4, 185, d)\n# define BOOST_PP_REPEAT_3_187(m, d) BOOST_PP_REPEAT_3_186(m, d) m(4, 186, d)\n# define BOOST_PP_REPEAT_3_188(m, d) BOOST_PP_REPEAT_3_187(m, d) m(4, 187, d)\n# define BOOST_PP_REPEAT_3_189(m, d) BOOST_PP_REPEAT_3_188(m, d) m(4, 188, d)\n# define BOOST_PP_REPEAT_3_190(m, d) BOOST_PP_REPEAT_3_189(m, d) m(4, 189, d)\n# define BOOST_PP_REPEAT_3_191(m, d) BOOST_PP_REPEAT_3_190(m, d) m(4, 190, d)\n# define BOOST_PP_REPEAT_3_192(m, d) BOOST_PP_REPEAT_3_191(m, d) m(4, 191, d)\n# define BOOST_PP_REPEAT_3_193(m, d) BOOST_PP_REPEAT_3_192(m, d) m(4, 192, d)\n# define BOOST_PP_REPEAT_3_194(m, d) BOOST_PP_REPEAT_3_193(m, d) m(4, 193, d)\n# define BOOST_PP_REPEAT_3_195(m, d) BOOST_PP_REPEAT_3_194(m, d) m(4, 194, d)\n# define BOOST_PP_REPEAT_3_196(m, d) BOOST_PP_REPEAT_3_195(m, d) m(4, 195, d)\n# define BOOST_PP_REPEAT_3_197(m, d) BOOST_PP_REPEAT_3_196(m, d) m(4, 196, d)\n# define BOOST_PP_REPEAT_3_198(m, d) BOOST_PP_REPEAT_3_197(m, d) m(4, 197, d)\n# define BOOST_PP_REPEAT_3_199(m, d) BOOST_PP_REPEAT_3_198(m, d) m(4, 198, d)\n# define BOOST_PP_REPEAT_3_200(m, d) BOOST_PP_REPEAT_3_199(m, d) m(4, 199, d)\n# define BOOST_PP_REPEAT_3_201(m, d) BOOST_PP_REPEAT_3_200(m, d) m(4, 200, d)\n# define BOOST_PP_REPEAT_3_202(m, d) BOOST_PP_REPEAT_3_201(m, d) m(4, 201, d)\n# define BOOST_PP_REPEAT_3_203(m, d) BOOST_PP_REPEAT_3_202(m, d) m(4, 202, d)\n# define BOOST_PP_REPEAT_3_204(m, d) BOOST_PP_REPEAT_3_203(m, d) m(4, 203, d)\n# define BOOST_PP_REPEAT_3_205(m, d) BOOST_PP_REPEAT_3_204(m, d) m(4, 204, d)\n# define BOOST_PP_REPEAT_3_206(m, d) BOOST_PP_REPEAT_3_205(m, d) m(4, 205, d)\n# define BOOST_PP_REPEAT_3_207(m, d) BOOST_PP_REPEAT_3_206(m, d) m(4, 206, d)\n# define BOOST_PP_REPEAT_3_208(m, d) BOOST_PP_REPEAT_3_207(m, d) m(4, 207, d)\n# define BOOST_PP_REPEAT_3_209(m, d) BOOST_PP_REPEAT_3_208(m, d) m(4, 208, d)\n# define BOOST_PP_REPEAT_3_210(m, d) BOOST_PP_REPEAT_3_209(m, d) m(4, 209, d)\n# define BOOST_PP_REPEAT_3_211(m, d) BOOST_PP_REPEAT_3_210(m, d) m(4, 210, d)\n# define BOOST_PP_REPEAT_3_212(m, d) BOOST_PP_REPEAT_3_211(m, d) m(4, 211, d)\n# define BOOST_PP_REPEAT_3_213(m, d) BOOST_PP_REPEAT_3_212(m, d) m(4, 212, d)\n# define BOOST_PP_REPEAT_3_214(m, d) BOOST_PP_REPEAT_3_213(m, d) m(4, 213, d)\n# define BOOST_PP_REPEAT_3_215(m, d) BOOST_PP_REPEAT_3_214(m, d) m(4, 214, d)\n# define BOOST_PP_REPEAT_3_216(m, d) BOOST_PP_REPEAT_3_215(m, d) m(4, 215, d)\n# define BOOST_PP_REPEAT_3_217(m, d) BOOST_PP_REPEAT_3_216(m, d) m(4, 216, d)\n# define BOOST_PP_REPEAT_3_218(m, d) BOOST_PP_REPEAT_3_217(m, d) m(4, 217, d)\n# define BOOST_PP_REPEAT_3_219(m, d) BOOST_PP_REPEAT_3_218(m, d) m(4, 218, d)\n# define BOOST_PP_REPEAT_3_220(m, d) BOOST_PP_REPEAT_3_219(m, d) m(4, 219, d)\n# define BOOST_PP_REPEAT_3_221(m, d) BOOST_PP_REPEAT_3_220(m, d) m(4, 220, d)\n# define BOOST_PP_REPEAT_3_222(m, d) BOOST_PP_REPEAT_3_221(m, d) m(4, 221, d)\n# define BOOST_PP_REPEAT_3_223(m, d) BOOST_PP_REPEAT_3_222(m, d) m(4, 222, d)\n# define BOOST_PP_REPEAT_3_224(m, d) BOOST_PP_REPEAT_3_223(m, d) m(4, 223, d)\n# define BOOST_PP_REPEAT_3_225(m, d) BOOST_PP_REPEAT_3_224(m, d) m(4, 224, d)\n# define BOOST_PP_REPEAT_3_226(m, d) BOOST_PP_REPEAT_3_225(m, d) m(4, 225, d)\n# define BOOST_PP_REPEAT_3_227(m, d) BOOST_PP_REPEAT_3_226(m, d) m(4, 226, d)\n# define BOOST_PP_REPEAT_3_228(m, d) BOOST_PP_REPEAT_3_227(m, d) m(4, 227, d)\n# define BOOST_PP_REPEAT_3_229(m, d) BOOST_PP_REPEAT_3_228(m, d) m(4, 228, d)\n# define BOOST_PP_REPEAT_3_230(m, d) BOOST_PP_REPEAT_3_229(m, d) m(4, 229, d)\n# define BOOST_PP_REPEAT_3_231(m, d) BOOST_PP_REPEAT_3_230(m, d) m(4, 230, d)\n# define BOOST_PP_REPEAT_3_232(m, d) BOOST_PP_REPEAT_3_231(m, d) m(4, 231, d)\n# define BOOST_PP_REPEAT_3_233(m, d) BOOST_PP_REPEAT_3_232(m, d) m(4, 232, d)\n# define BOOST_PP_REPEAT_3_234(m, d) BOOST_PP_REPEAT_3_233(m, d) m(4, 233, d)\n# define BOOST_PP_REPEAT_3_235(m, d) BOOST_PP_REPEAT_3_234(m, d) m(4, 234, d)\n# define BOOST_PP_REPEAT_3_236(m, d) BOOST_PP_REPEAT_3_235(m, d) m(4, 235, d)\n# define BOOST_PP_REPEAT_3_237(m, d) BOOST_PP_REPEAT_3_236(m, d) m(4, 236, d)\n# define BOOST_PP_REPEAT_3_238(m, d) BOOST_PP_REPEAT_3_237(m, d) m(4, 237, d)\n# define BOOST_PP_REPEAT_3_239(m, d) BOOST_PP_REPEAT_3_238(m, d) m(4, 238, d)\n# define BOOST_PP_REPEAT_3_240(m, d) BOOST_PP_REPEAT_3_239(m, d) m(4, 239, d)\n# define BOOST_PP_REPEAT_3_241(m, d) BOOST_PP_REPEAT_3_240(m, d) m(4, 240, d)\n# define BOOST_PP_REPEAT_3_242(m, d) BOOST_PP_REPEAT_3_241(m, d) m(4, 241, d)\n# define BOOST_PP_REPEAT_3_243(m, d) BOOST_PP_REPEAT_3_242(m, d) m(4, 242, d)\n# define BOOST_PP_REPEAT_3_244(m, d) BOOST_PP_REPEAT_3_243(m, d) m(4, 243, d)\n# define BOOST_PP_REPEAT_3_245(m, d) BOOST_PP_REPEAT_3_244(m, d) m(4, 244, d)\n# define BOOST_PP_REPEAT_3_246(m, d) BOOST_PP_REPEAT_3_245(m, d) m(4, 245, d)\n# define BOOST_PP_REPEAT_3_247(m, d) BOOST_PP_REPEAT_3_246(m, d) m(4, 246, d)\n# define BOOST_PP_REPEAT_3_248(m, d) BOOST_PP_REPEAT_3_247(m, d) m(4, 247, d)\n# define BOOST_PP_REPEAT_3_249(m, d) BOOST_PP_REPEAT_3_248(m, d) m(4, 248, d)\n# define BOOST_PP_REPEAT_3_250(m, d) BOOST_PP_REPEAT_3_249(m, d) m(4, 249, d)\n# define BOOST_PP_REPEAT_3_251(m, d) BOOST_PP_REPEAT_3_250(m, d) m(4, 250, d)\n# define BOOST_PP_REPEAT_3_252(m, d) BOOST_PP_REPEAT_3_251(m, d) m(4, 251, d)\n# define BOOST_PP_REPEAT_3_253(m, d) BOOST_PP_REPEAT_3_252(m, d) m(4, 252, d)\n# define BOOST_PP_REPEAT_3_254(m, d) BOOST_PP_REPEAT_3_253(m, d) m(4, 253, d)\n# define BOOST_PP_REPEAT_3_255(m, d) BOOST_PP_REPEAT_3_254(m, d) m(4, 254, d)\n# define BOOST_PP_REPEAT_3_256(m, d) BOOST_PP_REPEAT_3_255(m, d) m(4, 255, d)\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/repetition/repeat_from_to.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_REPEAT_FROM_TO_HPP\n# define BOOST_PREPROCESSOR_REPETITION_REPEAT_FROM_TO_HPP\n#\n# include <boost/preprocessor/arithmetic/add.hpp>\n# include <boost/preprocessor/arithmetic/sub.hpp>\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/while.hpp>\n# include <boost/preprocessor/debug/error.hpp>\n# include <boost/preprocessor/detail/auto_rec.hpp>\n# include <boost/preprocessor/repetition/repeat.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n#\n# /* BOOST_PP_REPEAT_FROM_TO */\n#\n# if 0\n#    define BOOST_PP_REPEAT_FROM_TO(first, last, macro, data)\n# endif\n#\n# define BOOST_PP_REPEAT_FROM_TO BOOST_PP_CAT(BOOST_PP_REPEAT_FROM_TO_, BOOST_PP_AUTO_REC(BOOST_PP_REPEAT_P, 4))\n#\n# define BOOST_PP_REPEAT_FROM_TO_1(f, l, m, dt) BOOST_PP_REPEAT_FROM_TO_D_1(BOOST_PP_AUTO_REC(BOOST_PP_WHILE_P, 256), f, l, m, dt)\n# define BOOST_PP_REPEAT_FROM_TO_2(f, l, m, dt) BOOST_PP_REPEAT_FROM_TO_D_2(BOOST_PP_AUTO_REC(BOOST_PP_WHILE_P, 256), f, l, m, dt)\n# define BOOST_PP_REPEAT_FROM_TO_3(f, l, m, dt) BOOST_PP_REPEAT_FROM_TO_D_3(BOOST_PP_AUTO_REC(BOOST_PP_WHILE_P, 256), f, l, m, dt)\n# define BOOST_PP_REPEAT_FROM_TO_4(f, l, m, dt) BOOST_PP_ERROR(0x0003)\n#\n# define BOOST_PP_REPEAT_FROM_TO_1ST BOOST_PP_REPEAT_FROM_TO_1\n# define BOOST_PP_REPEAT_FROM_TO_2ND BOOST_PP_REPEAT_FROM_TO_2\n# define BOOST_PP_REPEAT_FROM_TO_3RD BOOST_PP_REPEAT_FROM_TO_3\n#\n# /* BOOST_PP_REPEAT_FROM_TO_D */\n#\n# if 0\n#    define BOOST_PP_REPEAT_FROM_TO_D(d, first, last, macro, data)\n# endif\n#\n# define BOOST_PP_REPEAT_FROM_TO_D BOOST_PP_CAT(BOOST_PP_REPEAT_FROM_TO_D_, BOOST_PP_AUTO_REC(BOOST_PP_REPEAT_P, 4))\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_REPEAT_FROM_TO_D_1(d, f, l, m, dt) BOOST_PP_REPEAT_1(BOOST_PP_SUB_D(d, l, f), BOOST_PP_REPEAT_FROM_TO_M_1, (d, f, m, dt))\n#    define BOOST_PP_REPEAT_FROM_TO_D_2(d, f, l, m, dt) BOOST_PP_REPEAT_2(BOOST_PP_SUB_D(d, l, f), BOOST_PP_REPEAT_FROM_TO_M_2, (d, f, m, dt))\n#    define BOOST_PP_REPEAT_FROM_TO_D_3(d, f, l, m, dt) BOOST_PP_REPEAT_3(BOOST_PP_SUB_D(d, l, f), BOOST_PP_REPEAT_FROM_TO_M_3, (d, f, m, dt))\n# else\n#    define BOOST_PP_REPEAT_FROM_TO_D_1(d, f, l, m, dt) BOOST_PP_REPEAT_FROM_TO_D_1_I(d, f, l, m, dt)\n#    define BOOST_PP_REPEAT_FROM_TO_D_2(d, f, l, m, dt) BOOST_PP_REPEAT_FROM_TO_D_2_I(d, f, l, m, dt)\n#    define BOOST_PP_REPEAT_FROM_TO_D_3(d, f, l, m, dt) BOOST_PP_REPEAT_FROM_TO_D_3_I(d, f, l, m, dt)\n#    define BOOST_PP_REPEAT_FROM_TO_D_1_I(d, f, l, m, dt) BOOST_PP_REPEAT_1(BOOST_PP_SUB_D(d, l, f), BOOST_PP_REPEAT_FROM_TO_M_1, (d, f, m, dt))\n#    define BOOST_PP_REPEAT_FROM_TO_D_2_I(d, f, l, m, dt) BOOST_PP_REPEAT_2(BOOST_PP_SUB_D(d, l, f), BOOST_PP_REPEAT_FROM_TO_M_2, (d, f, m, dt))\n#    define BOOST_PP_REPEAT_FROM_TO_D_3_I(d, f, l, m, dt) BOOST_PP_REPEAT_3(BOOST_PP_SUB_D(d, l, f), BOOST_PP_REPEAT_FROM_TO_M_3, (d, f, m, dt))\n# endif\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()\n#    define BOOST_PP_REPEAT_FROM_TO_M_1(z, n, dfmd) BOOST_PP_REPEAT_FROM_TO_M_1_IM(z, n, BOOST_PP_TUPLE_REM_4 dfmd)\n#    define BOOST_PP_REPEAT_FROM_TO_M_2(z, n, dfmd) BOOST_PP_REPEAT_FROM_TO_M_2_IM(z, n, BOOST_PP_TUPLE_REM_4 dfmd)\n#    define BOOST_PP_REPEAT_FROM_TO_M_3(z, n, dfmd) BOOST_PP_REPEAT_FROM_TO_M_3_IM(z, n, BOOST_PP_TUPLE_REM_4 dfmd)\n#    define BOOST_PP_REPEAT_FROM_TO_M_1_IM(z, n, im) BOOST_PP_REPEAT_FROM_TO_M_1_I(z, n, im)\n#    define BOOST_PP_REPEAT_FROM_TO_M_2_IM(z, n, im) BOOST_PP_REPEAT_FROM_TO_M_2_I(z, n, im)\n#    define BOOST_PP_REPEAT_FROM_TO_M_3_IM(z, n, im) BOOST_PP_REPEAT_FROM_TO_M_3_I(z, n, im)\n# else\n#    define BOOST_PP_REPEAT_FROM_TO_M_1(z, n, dfmd) BOOST_PP_REPEAT_FROM_TO_M_1_I(z, n, BOOST_PP_TUPLE_ELEM(4, 0, dfmd), BOOST_PP_TUPLE_ELEM(4, 1, dfmd), BOOST_PP_TUPLE_ELEM(4, 2, dfmd), BOOST_PP_TUPLE_ELEM(4, 3, dfmd))\n#    define BOOST_PP_REPEAT_FROM_TO_M_2(z, n, dfmd) BOOST_PP_REPEAT_FROM_TO_M_2_I(z, n, BOOST_PP_TUPLE_ELEM(4, 0, dfmd), BOOST_PP_TUPLE_ELEM(4, 1, dfmd), BOOST_PP_TUPLE_ELEM(4, 2, dfmd), BOOST_PP_TUPLE_ELEM(4, 3, dfmd))\n#    define BOOST_PP_REPEAT_FROM_TO_M_3(z, n, dfmd) BOOST_PP_REPEAT_FROM_TO_M_3_I(z, n, BOOST_PP_TUPLE_ELEM(4, 0, dfmd), BOOST_PP_TUPLE_ELEM(4, 1, dfmd), BOOST_PP_TUPLE_ELEM(4, 2, dfmd), BOOST_PP_TUPLE_ELEM(4, 3, dfmd))\n# endif\n#\n# define BOOST_PP_REPEAT_FROM_TO_M_1_I(z, n, d, f, m, dt) BOOST_PP_REPEAT_FROM_TO_M_1_II(z, BOOST_PP_ADD_D(d, n, f), m, dt)\n# define BOOST_PP_REPEAT_FROM_TO_M_2_I(z, n, d, f, m, dt) BOOST_PP_REPEAT_FROM_TO_M_2_II(z, BOOST_PP_ADD_D(d, n, f), m, dt)\n# define BOOST_PP_REPEAT_FROM_TO_M_3_I(z, n, d, f, m, dt) BOOST_PP_REPEAT_FROM_TO_M_3_II(z, BOOST_PP_ADD_D(d, n, f), m, dt)\n#\n# define BOOST_PP_REPEAT_FROM_TO_M_1_II(z, n, m, dt) m(z, n, dt)\n# define BOOST_PP_REPEAT_FROM_TO_M_2_II(z, n, m, dt) m(z, n, dt)\n# define BOOST_PP_REPEAT_FROM_TO_M_3_II(z, n, m, dt) m(z, n, dt)\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/selection/max.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SELECTION_MAX_HPP\n# define BOOST_PREPROCESSOR_SELECTION_MAX_HPP\n#\n# include <boost/preprocessor/comparison/less_equal.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n#\n# /* BOOST_PP_MAX */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_MAX(x, y) BOOST_PP_IIF(BOOST_PP_LESS_EQUAL(x, y), y, x)\n# else\n#    define BOOST_PP_MAX(x, y) BOOST_PP_MAX_I(x, y)\n#    define BOOST_PP_MAX_I(x, y) BOOST_PP_IIF(BOOST_PP_LESS_EQUAL(x, y), y, x)\n# endif\n#\n# /* BOOST_PP_MAX_D */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_MAX_D(d, x, y) BOOST_PP_IIF(BOOST_PP_LESS_EQUAL_D(d, x, y), y, x)\n# else\n#    define BOOST_PP_MAX_D(d, x, y) BOOST_PP_MAX_D_I(d, x, y)\n#    define BOOST_PP_MAX_D_I(d, x, y) BOOST_PP_IIF(BOOST_PP_LESS_EQUAL_D(d, x, y), y, x)\n# endif\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/seq/detail/is_empty.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2015.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_DETAIL_IS_EMPTY_HPP\n# define BOOST_PREPROCESSOR_SEQ_DETAIL_IS_EMPTY_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/arithmetic/dec.hpp>\n# include <boost/preprocessor/logical/bool.hpp>\n# include <boost/preprocessor/logical/compl.hpp>\n# include <boost/preprocessor/seq/size.hpp>\n#\n/* An empty seq is one that is just BOOST_PP_SEQ_NIL */\n#\n# define BOOST_PP_SEQ_DETAIL_IS_EMPTY(seq) \\\n\tBOOST_PP_COMPL \\\n\t\t( \\\n\t\tBOOST_PP_SEQ_DETAIL_IS_NOT_EMPTY(seq) \\\n\t\t) \\\n/**/\n#\n# define BOOST_PP_SEQ_DETAIL_IS_EMPTY_SIZE(size) \\\n\tBOOST_PP_COMPL \\\n\t\t( \\\n\t\tBOOST_PP_SEQ_DETAIL_IS_NOT_EMPTY_SIZE(size) \\\n\t\t) \\\n/**/\n#\n# define BOOST_PP_SEQ_DETAIL_IS_NOT_EMPTY(seq) \\\n\tBOOST_PP_SEQ_DETAIL_IS_NOT_EMPTY_SIZE(BOOST_PP_SEQ_DETAIL_EMPTY_SIZE(seq)) \\\n/**/\n#\n# define BOOST_PP_SEQ_DETAIL_IS_NOT_EMPTY_SIZE(size) \\\n\tBOOST_PP_BOOL(size) \\\n/**/\n#\n# define BOOST_PP_SEQ_DETAIL_EMPTY_SIZE(seq) \\\n\tBOOST_PP_DEC(BOOST_PP_SEQ_SIZE(seq (nil))) \\\n/**/\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/seq/detail/split.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_DETAIL_SPLIT_HPP\n# define BOOST_PREPROCESSOR_SEQ_DETAIL_SPLIT_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_SEQ_SPLIT */\n#\n# define BOOST_PP_SEQ_SPLIT(n, seq) BOOST_PP_SEQ_SPLIT_D(n, seq)\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_SEQ_SPLIT_D(n, seq) (BOOST_PP_SEQ_SPLIT_ ## n seq)\n# else\n#    define BOOST_PP_SEQ_SPLIT_D(n, seq) (BOOST_PP_SEQ_SPLIT_ ## n ## seq)\n# endif\n#\n# define BOOST_PP_SEQ_SPLIT_1(x) (x),\n# define BOOST_PP_SEQ_SPLIT_2(x) (x) BOOST_PP_SEQ_SPLIT_1\n# define BOOST_PP_SEQ_SPLIT_3(x) (x) BOOST_PP_SEQ_SPLIT_2\n# define BOOST_PP_SEQ_SPLIT_4(x) (x) BOOST_PP_SEQ_SPLIT_3\n# define BOOST_PP_SEQ_SPLIT_5(x) (x) BOOST_PP_SEQ_SPLIT_4\n# define BOOST_PP_SEQ_SPLIT_6(x) (x) BOOST_PP_SEQ_SPLIT_5\n# define BOOST_PP_SEQ_SPLIT_7(x) (x) BOOST_PP_SEQ_SPLIT_6\n# define BOOST_PP_SEQ_SPLIT_8(x) (x) BOOST_PP_SEQ_SPLIT_7\n# define BOOST_PP_SEQ_SPLIT_9(x) (x) BOOST_PP_SEQ_SPLIT_8\n# define BOOST_PP_SEQ_SPLIT_10(x) (x) BOOST_PP_SEQ_SPLIT_9\n# define BOOST_PP_SEQ_SPLIT_11(x) (x) BOOST_PP_SEQ_SPLIT_10\n# define BOOST_PP_SEQ_SPLIT_12(x) (x) BOOST_PP_SEQ_SPLIT_11\n# define BOOST_PP_SEQ_SPLIT_13(x) (x) BOOST_PP_SEQ_SPLIT_12\n# define BOOST_PP_SEQ_SPLIT_14(x) (x) BOOST_PP_SEQ_SPLIT_13\n# define BOOST_PP_SEQ_SPLIT_15(x) (x) BOOST_PP_SEQ_SPLIT_14\n# define BOOST_PP_SEQ_SPLIT_16(x) (x) BOOST_PP_SEQ_SPLIT_15\n# define BOOST_PP_SEQ_SPLIT_17(x) (x) BOOST_PP_SEQ_SPLIT_16\n# define BOOST_PP_SEQ_SPLIT_18(x) (x) BOOST_PP_SEQ_SPLIT_17\n# define BOOST_PP_SEQ_SPLIT_19(x) (x) BOOST_PP_SEQ_SPLIT_18\n# define BOOST_PP_SEQ_SPLIT_20(x) (x) BOOST_PP_SEQ_SPLIT_19\n# define BOOST_PP_SEQ_SPLIT_21(x) (x) BOOST_PP_SEQ_SPLIT_20\n# define BOOST_PP_SEQ_SPLIT_22(x) (x) BOOST_PP_SEQ_SPLIT_21\n# define BOOST_PP_SEQ_SPLIT_23(x) (x) BOOST_PP_SEQ_SPLIT_22\n# define BOOST_PP_SEQ_SPLIT_24(x) (x) BOOST_PP_SEQ_SPLIT_23\n# define BOOST_PP_SEQ_SPLIT_25(x) (x) BOOST_PP_SEQ_SPLIT_24\n# define BOOST_PP_SEQ_SPLIT_26(x) (x) BOOST_PP_SEQ_SPLIT_25\n# define BOOST_PP_SEQ_SPLIT_27(x) (x) BOOST_PP_SEQ_SPLIT_26\n# define BOOST_PP_SEQ_SPLIT_28(x) (x) BOOST_PP_SEQ_SPLIT_27\n# define BOOST_PP_SEQ_SPLIT_29(x) (x) BOOST_PP_SEQ_SPLIT_28\n# define BOOST_PP_SEQ_SPLIT_30(x) (x) BOOST_PP_SEQ_SPLIT_29\n# define BOOST_PP_SEQ_SPLIT_31(x) (x) BOOST_PP_SEQ_SPLIT_30\n# define BOOST_PP_SEQ_SPLIT_32(x) (x) BOOST_PP_SEQ_SPLIT_31\n# define BOOST_PP_SEQ_SPLIT_33(x) (x) BOOST_PP_SEQ_SPLIT_32\n# define BOOST_PP_SEQ_SPLIT_34(x) (x) BOOST_PP_SEQ_SPLIT_33\n# define BOOST_PP_SEQ_SPLIT_35(x) (x) BOOST_PP_SEQ_SPLIT_34\n# define BOOST_PP_SEQ_SPLIT_36(x) (x) BOOST_PP_SEQ_SPLIT_35\n# define BOOST_PP_SEQ_SPLIT_37(x) (x) BOOST_PP_SEQ_SPLIT_36\n# define BOOST_PP_SEQ_SPLIT_38(x) (x) BOOST_PP_SEQ_SPLIT_37\n# define BOOST_PP_SEQ_SPLIT_39(x) (x) BOOST_PP_SEQ_SPLIT_38\n# define BOOST_PP_SEQ_SPLIT_40(x) (x) BOOST_PP_SEQ_SPLIT_39\n# define BOOST_PP_SEQ_SPLIT_41(x) (x) BOOST_PP_SEQ_SPLIT_40\n# define BOOST_PP_SEQ_SPLIT_42(x) (x) BOOST_PP_SEQ_SPLIT_41\n# define BOOST_PP_SEQ_SPLIT_43(x) (x) BOOST_PP_SEQ_SPLIT_42\n# define BOOST_PP_SEQ_SPLIT_44(x) (x) BOOST_PP_SEQ_SPLIT_43\n# define BOOST_PP_SEQ_SPLIT_45(x) (x) BOOST_PP_SEQ_SPLIT_44\n# define BOOST_PP_SEQ_SPLIT_46(x) (x) BOOST_PP_SEQ_SPLIT_45\n# define BOOST_PP_SEQ_SPLIT_47(x) (x) BOOST_PP_SEQ_SPLIT_46\n# define BOOST_PP_SEQ_SPLIT_48(x) (x) BOOST_PP_SEQ_SPLIT_47\n# define BOOST_PP_SEQ_SPLIT_49(x) (x) BOOST_PP_SEQ_SPLIT_48\n# define BOOST_PP_SEQ_SPLIT_50(x) (x) BOOST_PP_SEQ_SPLIT_49\n# define BOOST_PP_SEQ_SPLIT_51(x) (x) BOOST_PP_SEQ_SPLIT_50\n# define BOOST_PP_SEQ_SPLIT_52(x) (x) BOOST_PP_SEQ_SPLIT_51\n# define BOOST_PP_SEQ_SPLIT_53(x) (x) BOOST_PP_SEQ_SPLIT_52\n# define BOOST_PP_SEQ_SPLIT_54(x) (x) BOOST_PP_SEQ_SPLIT_53\n# define BOOST_PP_SEQ_SPLIT_55(x) (x) BOOST_PP_SEQ_SPLIT_54\n# define BOOST_PP_SEQ_SPLIT_56(x) (x) BOOST_PP_SEQ_SPLIT_55\n# define BOOST_PP_SEQ_SPLIT_57(x) (x) BOOST_PP_SEQ_SPLIT_56\n# define BOOST_PP_SEQ_SPLIT_58(x) (x) BOOST_PP_SEQ_SPLIT_57\n# define BOOST_PP_SEQ_SPLIT_59(x) (x) BOOST_PP_SEQ_SPLIT_58\n# define BOOST_PP_SEQ_SPLIT_60(x) (x) BOOST_PP_SEQ_SPLIT_59\n# define BOOST_PP_SEQ_SPLIT_61(x) (x) BOOST_PP_SEQ_SPLIT_60\n# define BOOST_PP_SEQ_SPLIT_62(x) (x) BOOST_PP_SEQ_SPLIT_61\n# define BOOST_PP_SEQ_SPLIT_63(x) (x) BOOST_PP_SEQ_SPLIT_62\n# define BOOST_PP_SEQ_SPLIT_64(x) (x) BOOST_PP_SEQ_SPLIT_63\n# define BOOST_PP_SEQ_SPLIT_65(x) (x) BOOST_PP_SEQ_SPLIT_64\n# define BOOST_PP_SEQ_SPLIT_66(x) (x) BOOST_PP_SEQ_SPLIT_65\n# define BOOST_PP_SEQ_SPLIT_67(x) (x) BOOST_PP_SEQ_SPLIT_66\n# define BOOST_PP_SEQ_SPLIT_68(x) (x) BOOST_PP_SEQ_SPLIT_67\n# define BOOST_PP_SEQ_SPLIT_69(x) (x) BOOST_PP_SEQ_SPLIT_68\n# define BOOST_PP_SEQ_SPLIT_70(x) (x) BOOST_PP_SEQ_SPLIT_69\n# define BOOST_PP_SEQ_SPLIT_71(x) (x) BOOST_PP_SEQ_SPLIT_70\n# define BOOST_PP_SEQ_SPLIT_72(x) (x) BOOST_PP_SEQ_SPLIT_71\n# define BOOST_PP_SEQ_SPLIT_73(x) (x) BOOST_PP_SEQ_SPLIT_72\n# define BOOST_PP_SEQ_SPLIT_74(x) (x) BOOST_PP_SEQ_SPLIT_73\n# define BOOST_PP_SEQ_SPLIT_75(x) (x) BOOST_PP_SEQ_SPLIT_74\n# define BOOST_PP_SEQ_SPLIT_76(x) (x) BOOST_PP_SEQ_SPLIT_75\n# define BOOST_PP_SEQ_SPLIT_77(x) (x) BOOST_PP_SEQ_SPLIT_76\n# define BOOST_PP_SEQ_SPLIT_78(x) (x) BOOST_PP_SEQ_SPLIT_77\n# define BOOST_PP_SEQ_SPLIT_79(x) (x) BOOST_PP_SEQ_SPLIT_78\n# define BOOST_PP_SEQ_SPLIT_80(x) (x) BOOST_PP_SEQ_SPLIT_79\n# define BOOST_PP_SEQ_SPLIT_81(x) (x) BOOST_PP_SEQ_SPLIT_80\n# define BOOST_PP_SEQ_SPLIT_82(x) (x) BOOST_PP_SEQ_SPLIT_81\n# define BOOST_PP_SEQ_SPLIT_83(x) (x) BOOST_PP_SEQ_SPLIT_82\n# define BOOST_PP_SEQ_SPLIT_84(x) (x) BOOST_PP_SEQ_SPLIT_83\n# define BOOST_PP_SEQ_SPLIT_85(x) (x) BOOST_PP_SEQ_SPLIT_84\n# define BOOST_PP_SEQ_SPLIT_86(x) (x) BOOST_PP_SEQ_SPLIT_85\n# define BOOST_PP_SEQ_SPLIT_87(x) (x) BOOST_PP_SEQ_SPLIT_86\n# define BOOST_PP_SEQ_SPLIT_88(x) (x) BOOST_PP_SEQ_SPLIT_87\n# define BOOST_PP_SEQ_SPLIT_89(x) (x) BOOST_PP_SEQ_SPLIT_88\n# define BOOST_PP_SEQ_SPLIT_90(x) (x) BOOST_PP_SEQ_SPLIT_89\n# define BOOST_PP_SEQ_SPLIT_91(x) (x) BOOST_PP_SEQ_SPLIT_90\n# define BOOST_PP_SEQ_SPLIT_92(x) (x) BOOST_PP_SEQ_SPLIT_91\n# define BOOST_PP_SEQ_SPLIT_93(x) (x) BOOST_PP_SEQ_SPLIT_92\n# define BOOST_PP_SEQ_SPLIT_94(x) (x) BOOST_PP_SEQ_SPLIT_93\n# define BOOST_PP_SEQ_SPLIT_95(x) (x) BOOST_PP_SEQ_SPLIT_94\n# define BOOST_PP_SEQ_SPLIT_96(x) (x) BOOST_PP_SEQ_SPLIT_95\n# define BOOST_PP_SEQ_SPLIT_97(x) (x) BOOST_PP_SEQ_SPLIT_96\n# define BOOST_PP_SEQ_SPLIT_98(x) (x) BOOST_PP_SEQ_SPLIT_97\n# define BOOST_PP_SEQ_SPLIT_99(x) (x) BOOST_PP_SEQ_SPLIT_98\n# define BOOST_PP_SEQ_SPLIT_100(x) (x) BOOST_PP_SEQ_SPLIT_99\n# define BOOST_PP_SEQ_SPLIT_101(x) (x) BOOST_PP_SEQ_SPLIT_100\n# define BOOST_PP_SEQ_SPLIT_102(x) (x) BOOST_PP_SEQ_SPLIT_101\n# define BOOST_PP_SEQ_SPLIT_103(x) (x) BOOST_PP_SEQ_SPLIT_102\n# define BOOST_PP_SEQ_SPLIT_104(x) (x) BOOST_PP_SEQ_SPLIT_103\n# define BOOST_PP_SEQ_SPLIT_105(x) (x) BOOST_PP_SEQ_SPLIT_104\n# define BOOST_PP_SEQ_SPLIT_106(x) (x) BOOST_PP_SEQ_SPLIT_105\n# define BOOST_PP_SEQ_SPLIT_107(x) (x) BOOST_PP_SEQ_SPLIT_106\n# define BOOST_PP_SEQ_SPLIT_108(x) (x) BOOST_PP_SEQ_SPLIT_107\n# define BOOST_PP_SEQ_SPLIT_109(x) (x) BOOST_PP_SEQ_SPLIT_108\n# define BOOST_PP_SEQ_SPLIT_110(x) (x) BOOST_PP_SEQ_SPLIT_109\n# define BOOST_PP_SEQ_SPLIT_111(x) (x) BOOST_PP_SEQ_SPLIT_110\n# define BOOST_PP_SEQ_SPLIT_112(x) (x) BOOST_PP_SEQ_SPLIT_111\n# define BOOST_PP_SEQ_SPLIT_113(x) (x) BOOST_PP_SEQ_SPLIT_112\n# define BOOST_PP_SEQ_SPLIT_114(x) (x) BOOST_PP_SEQ_SPLIT_113\n# define BOOST_PP_SEQ_SPLIT_115(x) (x) BOOST_PP_SEQ_SPLIT_114\n# define BOOST_PP_SEQ_SPLIT_116(x) (x) BOOST_PP_SEQ_SPLIT_115\n# define BOOST_PP_SEQ_SPLIT_117(x) (x) BOOST_PP_SEQ_SPLIT_116\n# define BOOST_PP_SEQ_SPLIT_118(x) (x) BOOST_PP_SEQ_SPLIT_117\n# define BOOST_PP_SEQ_SPLIT_119(x) (x) BOOST_PP_SEQ_SPLIT_118\n# define BOOST_PP_SEQ_SPLIT_120(x) (x) BOOST_PP_SEQ_SPLIT_119\n# define BOOST_PP_SEQ_SPLIT_121(x) (x) BOOST_PP_SEQ_SPLIT_120\n# define BOOST_PP_SEQ_SPLIT_122(x) (x) BOOST_PP_SEQ_SPLIT_121\n# define BOOST_PP_SEQ_SPLIT_123(x) (x) BOOST_PP_SEQ_SPLIT_122\n# define BOOST_PP_SEQ_SPLIT_124(x) (x) BOOST_PP_SEQ_SPLIT_123\n# define BOOST_PP_SEQ_SPLIT_125(x) (x) BOOST_PP_SEQ_SPLIT_124\n# define BOOST_PP_SEQ_SPLIT_126(x) (x) BOOST_PP_SEQ_SPLIT_125\n# define BOOST_PP_SEQ_SPLIT_127(x) (x) BOOST_PP_SEQ_SPLIT_126\n# define BOOST_PP_SEQ_SPLIT_128(x) (x) BOOST_PP_SEQ_SPLIT_127\n# define BOOST_PP_SEQ_SPLIT_129(x) (x) BOOST_PP_SEQ_SPLIT_128\n# define BOOST_PP_SEQ_SPLIT_130(x) (x) BOOST_PP_SEQ_SPLIT_129\n# define BOOST_PP_SEQ_SPLIT_131(x) (x) BOOST_PP_SEQ_SPLIT_130\n# define BOOST_PP_SEQ_SPLIT_132(x) (x) BOOST_PP_SEQ_SPLIT_131\n# define BOOST_PP_SEQ_SPLIT_133(x) (x) BOOST_PP_SEQ_SPLIT_132\n# define BOOST_PP_SEQ_SPLIT_134(x) (x) BOOST_PP_SEQ_SPLIT_133\n# define BOOST_PP_SEQ_SPLIT_135(x) (x) BOOST_PP_SEQ_SPLIT_134\n# define BOOST_PP_SEQ_SPLIT_136(x) (x) BOOST_PP_SEQ_SPLIT_135\n# define BOOST_PP_SEQ_SPLIT_137(x) (x) BOOST_PP_SEQ_SPLIT_136\n# define BOOST_PP_SEQ_SPLIT_138(x) (x) BOOST_PP_SEQ_SPLIT_137\n# define BOOST_PP_SEQ_SPLIT_139(x) (x) BOOST_PP_SEQ_SPLIT_138\n# define BOOST_PP_SEQ_SPLIT_140(x) (x) BOOST_PP_SEQ_SPLIT_139\n# define BOOST_PP_SEQ_SPLIT_141(x) (x) BOOST_PP_SEQ_SPLIT_140\n# define BOOST_PP_SEQ_SPLIT_142(x) (x) BOOST_PP_SEQ_SPLIT_141\n# define BOOST_PP_SEQ_SPLIT_143(x) (x) BOOST_PP_SEQ_SPLIT_142\n# define BOOST_PP_SEQ_SPLIT_144(x) (x) BOOST_PP_SEQ_SPLIT_143\n# define BOOST_PP_SEQ_SPLIT_145(x) (x) BOOST_PP_SEQ_SPLIT_144\n# define BOOST_PP_SEQ_SPLIT_146(x) (x) BOOST_PP_SEQ_SPLIT_145\n# define BOOST_PP_SEQ_SPLIT_147(x) (x) BOOST_PP_SEQ_SPLIT_146\n# define BOOST_PP_SEQ_SPLIT_148(x) (x) BOOST_PP_SEQ_SPLIT_147\n# define BOOST_PP_SEQ_SPLIT_149(x) (x) BOOST_PP_SEQ_SPLIT_148\n# define BOOST_PP_SEQ_SPLIT_150(x) (x) BOOST_PP_SEQ_SPLIT_149\n# define BOOST_PP_SEQ_SPLIT_151(x) (x) BOOST_PP_SEQ_SPLIT_150\n# define BOOST_PP_SEQ_SPLIT_152(x) (x) BOOST_PP_SEQ_SPLIT_151\n# define BOOST_PP_SEQ_SPLIT_153(x) (x) BOOST_PP_SEQ_SPLIT_152\n# define BOOST_PP_SEQ_SPLIT_154(x) (x) BOOST_PP_SEQ_SPLIT_153\n# define BOOST_PP_SEQ_SPLIT_155(x) (x) BOOST_PP_SEQ_SPLIT_154\n# define BOOST_PP_SEQ_SPLIT_156(x) (x) BOOST_PP_SEQ_SPLIT_155\n# define BOOST_PP_SEQ_SPLIT_157(x) (x) BOOST_PP_SEQ_SPLIT_156\n# define BOOST_PP_SEQ_SPLIT_158(x) (x) BOOST_PP_SEQ_SPLIT_157\n# define BOOST_PP_SEQ_SPLIT_159(x) (x) BOOST_PP_SEQ_SPLIT_158\n# define BOOST_PP_SEQ_SPLIT_160(x) (x) BOOST_PP_SEQ_SPLIT_159\n# define BOOST_PP_SEQ_SPLIT_161(x) (x) BOOST_PP_SEQ_SPLIT_160\n# define BOOST_PP_SEQ_SPLIT_162(x) (x) BOOST_PP_SEQ_SPLIT_161\n# define BOOST_PP_SEQ_SPLIT_163(x) (x) BOOST_PP_SEQ_SPLIT_162\n# define BOOST_PP_SEQ_SPLIT_164(x) (x) BOOST_PP_SEQ_SPLIT_163\n# define BOOST_PP_SEQ_SPLIT_165(x) (x) BOOST_PP_SEQ_SPLIT_164\n# define BOOST_PP_SEQ_SPLIT_166(x) (x) BOOST_PP_SEQ_SPLIT_165\n# define BOOST_PP_SEQ_SPLIT_167(x) (x) BOOST_PP_SEQ_SPLIT_166\n# define BOOST_PP_SEQ_SPLIT_168(x) (x) BOOST_PP_SEQ_SPLIT_167\n# define BOOST_PP_SEQ_SPLIT_169(x) (x) BOOST_PP_SEQ_SPLIT_168\n# define BOOST_PP_SEQ_SPLIT_170(x) (x) BOOST_PP_SEQ_SPLIT_169\n# define BOOST_PP_SEQ_SPLIT_171(x) (x) BOOST_PP_SEQ_SPLIT_170\n# define BOOST_PP_SEQ_SPLIT_172(x) (x) BOOST_PP_SEQ_SPLIT_171\n# define BOOST_PP_SEQ_SPLIT_173(x) (x) BOOST_PP_SEQ_SPLIT_172\n# define BOOST_PP_SEQ_SPLIT_174(x) (x) BOOST_PP_SEQ_SPLIT_173\n# define BOOST_PP_SEQ_SPLIT_175(x) (x) BOOST_PP_SEQ_SPLIT_174\n# define BOOST_PP_SEQ_SPLIT_176(x) (x) BOOST_PP_SEQ_SPLIT_175\n# define BOOST_PP_SEQ_SPLIT_177(x) (x) BOOST_PP_SEQ_SPLIT_176\n# define BOOST_PP_SEQ_SPLIT_178(x) (x) BOOST_PP_SEQ_SPLIT_177\n# define BOOST_PP_SEQ_SPLIT_179(x) (x) BOOST_PP_SEQ_SPLIT_178\n# define BOOST_PP_SEQ_SPLIT_180(x) (x) BOOST_PP_SEQ_SPLIT_179\n# define BOOST_PP_SEQ_SPLIT_181(x) (x) BOOST_PP_SEQ_SPLIT_180\n# define BOOST_PP_SEQ_SPLIT_182(x) (x) BOOST_PP_SEQ_SPLIT_181\n# define BOOST_PP_SEQ_SPLIT_183(x) (x) BOOST_PP_SEQ_SPLIT_182\n# define BOOST_PP_SEQ_SPLIT_184(x) (x) BOOST_PP_SEQ_SPLIT_183\n# define BOOST_PP_SEQ_SPLIT_185(x) (x) BOOST_PP_SEQ_SPLIT_184\n# define BOOST_PP_SEQ_SPLIT_186(x) (x) BOOST_PP_SEQ_SPLIT_185\n# define BOOST_PP_SEQ_SPLIT_187(x) (x) BOOST_PP_SEQ_SPLIT_186\n# define BOOST_PP_SEQ_SPLIT_188(x) (x) BOOST_PP_SEQ_SPLIT_187\n# define BOOST_PP_SEQ_SPLIT_189(x) (x) BOOST_PP_SEQ_SPLIT_188\n# define BOOST_PP_SEQ_SPLIT_190(x) (x) BOOST_PP_SEQ_SPLIT_189\n# define BOOST_PP_SEQ_SPLIT_191(x) (x) BOOST_PP_SEQ_SPLIT_190\n# define BOOST_PP_SEQ_SPLIT_192(x) (x) BOOST_PP_SEQ_SPLIT_191\n# define BOOST_PP_SEQ_SPLIT_193(x) (x) BOOST_PP_SEQ_SPLIT_192\n# define BOOST_PP_SEQ_SPLIT_194(x) (x) BOOST_PP_SEQ_SPLIT_193\n# define BOOST_PP_SEQ_SPLIT_195(x) (x) BOOST_PP_SEQ_SPLIT_194\n# define BOOST_PP_SEQ_SPLIT_196(x) (x) BOOST_PP_SEQ_SPLIT_195\n# define BOOST_PP_SEQ_SPLIT_197(x) (x) BOOST_PP_SEQ_SPLIT_196\n# define BOOST_PP_SEQ_SPLIT_198(x) (x) BOOST_PP_SEQ_SPLIT_197\n# define BOOST_PP_SEQ_SPLIT_199(x) (x) BOOST_PP_SEQ_SPLIT_198\n# define BOOST_PP_SEQ_SPLIT_200(x) (x) BOOST_PP_SEQ_SPLIT_199\n# define BOOST_PP_SEQ_SPLIT_201(x) (x) BOOST_PP_SEQ_SPLIT_200\n# define BOOST_PP_SEQ_SPLIT_202(x) (x) BOOST_PP_SEQ_SPLIT_201\n# define BOOST_PP_SEQ_SPLIT_203(x) (x) BOOST_PP_SEQ_SPLIT_202\n# define BOOST_PP_SEQ_SPLIT_204(x) (x) BOOST_PP_SEQ_SPLIT_203\n# define BOOST_PP_SEQ_SPLIT_205(x) (x) BOOST_PP_SEQ_SPLIT_204\n# define BOOST_PP_SEQ_SPLIT_206(x) (x) BOOST_PP_SEQ_SPLIT_205\n# define BOOST_PP_SEQ_SPLIT_207(x) (x) BOOST_PP_SEQ_SPLIT_206\n# define BOOST_PP_SEQ_SPLIT_208(x) (x) BOOST_PP_SEQ_SPLIT_207\n# define BOOST_PP_SEQ_SPLIT_209(x) (x) BOOST_PP_SEQ_SPLIT_208\n# define BOOST_PP_SEQ_SPLIT_210(x) (x) BOOST_PP_SEQ_SPLIT_209\n# define BOOST_PP_SEQ_SPLIT_211(x) (x) BOOST_PP_SEQ_SPLIT_210\n# define BOOST_PP_SEQ_SPLIT_212(x) (x) BOOST_PP_SEQ_SPLIT_211\n# define BOOST_PP_SEQ_SPLIT_213(x) (x) BOOST_PP_SEQ_SPLIT_212\n# define BOOST_PP_SEQ_SPLIT_214(x) (x) BOOST_PP_SEQ_SPLIT_213\n# define BOOST_PP_SEQ_SPLIT_215(x) (x) BOOST_PP_SEQ_SPLIT_214\n# define BOOST_PP_SEQ_SPLIT_216(x) (x) BOOST_PP_SEQ_SPLIT_215\n# define BOOST_PP_SEQ_SPLIT_217(x) (x) BOOST_PP_SEQ_SPLIT_216\n# define BOOST_PP_SEQ_SPLIT_218(x) (x) BOOST_PP_SEQ_SPLIT_217\n# define BOOST_PP_SEQ_SPLIT_219(x) (x) BOOST_PP_SEQ_SPLIT_218\n# define BOOST_PP_SEQ_SPLIT_220(x) (x) BOOST_PP_SEQ_SPLIT_219\n# define BOOST_PP_SEQ_SPLIT_221(x) (x) BOOST_PP_SEQ_SPLIT_220\n# define BOOST_PP_SEQ_SPLIT_222(x) (x) BOOST_PP_SEQ_SPLIT_221\n# define BOOST_PP_SEQ_SPLIT_223(x) (x) BOOST_PP_SEQ_SPLIT_222\n# define BOOST_PP_SEQ_SPLIT_224(x) (x) BOOST_PP_SEQ_SPLIT_223\n# define BOOST_PP_SEQ_SPLIT_225(x) (x) BOOST_PP_SEQ_SPLIT_224\n# define BOOST_PP_SEQ_SPLIT_226(x) (x) BOOST_PP_SEQ_SPLIT_225\n# define BOOST_PP_SEQ_SPLIT_227(x) (x) BOOST_PP_SEQ_SPLIT_226\n# define BOOST_PP_SEQ_SPLIT_228(x) (x) BOOST_PP_SEQ_SPLIT_227\n# define BOOST_PP_SEQ_SPLIT_229(x) (x) BOOST_PP_SEQ_SPLIT_228\n# define BOOST_PP_SEQ_SPLIT_230(x) (x) BOOST_PP_SEQ_SPLIT_229\n# define BOOST_PP_SEQ_SPLIT_231(x) (x) BOOST_PP_SEQ_SPLIT_230\n# define BOOST_PP_SEQ_SPLIT_232(x) (x) BOOST_PP_SEQ_SPLIT_231\n# define BOOST_PP_SEQ_SPLIT_233(x) (x) BOOST_PP_SEQ_SPLIT_232\n# define BOOST_PP_SEQ_SPLIT_234(x) (x) BOOST_PP_SEQ_SPLIT_233\n# define BOOST_PP_SEQ_SPLIT_235(x) (x) BOOST_PP_SEQ_SPLIT_234\n# define BOOST_PP_SEQ_SPLIT_236(x) (x) BOOST_PP_SEQ_SPLIT_235\n# define BOOST_PP_SEQ_SPLIT_237(x) (x) BOOST_PP_SEQ_SPLIT_236\n# define BOOST_PP_SEQ_SPLIT_238(x) (x) BOOST_PP_SEQ_SPLIT_237\n# define BOOST_PP_SEQ_SPLIT_239(x) (x) BOOST_PP_SEQ_SPLIT_238\n# define BOOST_PP_SEQ_SPLIT_240(x) (x) BOOST_PP_SEQ_SPLIT_239\n# define BOOST_PP_SEQ_SPLIT_241(x) (x) BOOST_PP_SEQ_SPLIT_240\n# define BOOST_PP_SEQ_SPLIT_242(x) (x) BOOST_PP_SEQ_SPLIT_241\n# define BOOST_PP_SEQ_SPLIT_243(x) (x) BOOST_PP_SEQ_SPLIT_242\n# define BOOST_PP_SEQ_SPLIT_244(x) (x) BOOST_PP_SEQ_SPLIT_243\n# define BOOST_PP_SEQ_SPLIT_245(x) (x) BOOST_PP_SEQ_SPLIT_244\n# define BOOST_PP_SEQ_SPLIT_246(x) (x) BOOST_PP_SEQ_SPLIT_245\n# define BOOST_PP_SEQ_SPLIT_247(x) (x) BOOST_PP_SEQ_SPLIT_246\n# define BOOST_PP_SEQ_SPLIT_248(x) (x) BOOST_PP_SEQ_SPLIT_247\n# define BOOST_PP_SEQ_SPLIT_249(x) (x) BOOST_PP_SEQ_SPLIT_248\n# define BOOST_PP_SEQ_SPLIT_250(x) (x) BOOST_PP_SEQ_SPLIT_249\n# define BOOST_PP_SEQ_SPLIT_251(x) (x) BOOST_PP_SEQ_SPLIT_250\n# define BOOST_PP_SEQ_SPLIT_252(x) (x) BOOST_PP_SEQ_SPLIT_251\n# define BOOST_PP_SEQ_SPLIT_253(x) (x) BOOST_PP_SEQ_SPLIT_252\n# define BOOST_PP_SEQ_SPLIT_254(x) (x) BOOST_PP_SEQ_SPLIT_253\n# define BOOST_PP_SEQ_SPLIT_255(x) (x) BOOST_PP_SEQ_SPLIT_254\n# define BOOST_PP_SEQ_SPLIT_256(x) (x) BOOST_PP_SEQ_SPLIT_255\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/seq/elem.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_ELEM_HPP\n# define BOOST_PREPROCESSOR_SEQ_ELEM_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/facilities/empty.hpp>\n#\n# /* BOOST_PP_SEQ_ELEM */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_SEQ_ELEM(i, seq) BOOST_PP_SEQ_ELEM_I(i, seq)\n# else\n#    define BOOST_PP_SEQ_ELEM(i, seq) BOOST_PP_SEQ_ELEM_I((i, seq))\n# endif\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    define BOOST_PP_SEQ_ELEM_I(i, seq) BOOST_PP_SEQ_ELEM_II((BOOST_PP_SEQ_ELEM_ ## i seq))\n#    define BOOST_PP_SEQ_ELEM_II(res) BOOST_PP_SEQ_ELEM_IV(BOOST_PP_SEQ_ELEM_III res)\n#    define BOOST_PP_SEQ_ELEM_III(x, _) x BOOST_PP_EMPTY()\n#    define BOOST_PP_SEQ_ELEM_IV(x) x\n# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_SEQ_ELEM_I(par) BOOST_PP_SEQ_ELEM_II ## par\n#    define BOOST_PP_SEQ_ELEM_II(i, seq) BOOST_PP_SEQ_ELEM_III(BOOST_PP_SEQ_ELEM_ ## i ## seq)\n#    define BOOST_PP_SEQ_ELEM_III(im) BOOST_PP_SEQ_ELEM_IV(im)\n#    define BOOST_PP_SEQ_ELEM_IV(x, _) x\n# else\n#    if defined(__IBMC__) || defined(__IBMCPP__)\n#        define BOOST_PP_SEQ_ELEM_I(i, seq) BOOST_PP_SEQ_ELEM_II(BOOST_PP_CAT(BOOST_PP_SEQ_ELEM_ ## i, seq))\n#    else\n#        define BOOST_PP_SEQ_ELEM_I(i, seq) BOOST_PP_SEQ_ELEM_II(BOOST_PP_SEQ_ELEM_ ## i seq)\n#    endif\n#    define BOOST_PP_SEQ_ELEM_II(im) BOOST_PP_SEQ_ELEM_III(im)\n#    define BOOST_PP_SEQ_ELEM_III(x, _) x\n# endif\n#\n# define BOOST_PP_SEQ_ELEM_0(x) x, BOOST_PP_NIL\n# define BOOST_PP_SEQ_ELEM_1(_) BOOST_PP_SEQ_ELEM_0\n# define BOOST_PP_SEQ_ELEM_2(_) BOOST_PP_SEQ_ELEM_1\n# define BOOST_PP_SEQ_ELEM_3(_) BOOST_PP_SEQ_ELEM_2\n# define BOOST_PP_SEQ_ELEM_4(_) BOOST_PP_SEQ_ELEM_3\n# define BOOST_PP_SEQ_ELEM_5(_) BOOST_PP_SEQ_ELEM_4\n# define BOOST_PP_SEQ_ELEM_6(_) BOOST_PP_SEQ_ELEM_5\n# define BOOST_PP_SEQ_ELEM_7(_) BOOST_PP_SEQ_ELEM_6\n# define BOOST_PP_SEQ_ELEM_8(_) BOOST_PP_SEQ_ELEM_7\n# define BOOST_PP_SEQ_ELEM_9(_) BOOST_PP_SEQ_ELEM_8\n# define BOOST_PP_SEQ_ELEM_10(_) BOOST_PP_SEQ_ELEM_9\n# define BOOST_PP_SEQ_ELEM_11(_) BOOST_PP_SEQ_ELEM_10\n# define BOOST_PP_SEQ_ELEM_12(_) BOOST_PP_SEQ_ELEM_11\n# define BOOST_PP_SEQ_ELEM_13(_) BOOST_PP_SEQ_ELEM_12\n# define BOOST_PP_SEQ_ELEM_14(_) BOOST_PP_SEQ_ELEM_13\n# define BOOST_PP_SEQ_ELEM_15(_) BOOST_PP_SEQ_ELEM_14\n# define BOOST_PP_SEQ_ELEM_16(_) BOOST_PP_SEQ_ELEM_15\n# define BOOST_PP_SEQ_ELEM_17(_) BOOST_PP_SEQ_ELEM_16\n# define BOOST_PP_SEQ_ELEM_18(_) BOOST_PP_SEQ_ELEM_17\n# define BOOST_PP_SEQ_ELEM_19(_) BOOST_PP_SEQ_ELEM_18\n# define BOOST_PP_SEQ_ELEM_20(_) BOOST_PP_SEQ_ELEM_19\n# define BOOST_PP_SEQ_ELEM_21(_) BOOST_PP_SEQ_ELEM_20\n# define BOOST_PP_SEQ_ELEM_22(_) BOOST_PP_SEQ_ELEM_21\n# define BOOST_PP_SEQ_ELEM_23(_) BOOST_PP_SEQ_ELEM_22\n# define BOOST_PP_SEQ_ELEM_24(_) BOOST_PP_SEQ_ELEM_23\n# define BOOST_PP_SEQ_ELEM_25(_) BOOST_PP_SEQ_ELEM_24\n# define BOOST_PP_SEQ_ELEM_26(_) BOOST_PP_SEQ_ELEM_25\n# define BOOST_PP_SEQ_ELEM_27(_) BOOST_PP_SEQ_ELEM_26\n# define BOOST_PP_SEQ_ELEM_28(_) BOOST_PP_SEQ_ELEM_27\n# define BOOST_PP_SEQ_ELEM_29(_) BOOST_PP_SEQ_ELEM_28\n# define BOOST_PP_SEQ_ELEM_30(_) BOOST_PP_SEQ_ELEM_29\n# define BOOST_PP_SEQ_ELEM_31(_) BOOST_PP_SEQ_ELEM_30\n# define BOOST_PP_SEQ_ELEM_32(_) BOOST_PP_SEQ_ELEM_31\n# define BOOST_PP_SEQ_ELEM_33(_) BOOST_PP_SEQ_ELEM_32\n# define BOOST_PP_SEQ_ELEM_34(_) BOOST_PP_SEQ_ELEM_33\n# define BOOST_PP_SEQ_ELEM_35(_) BOOST_PP_SEQ_ELEM_34\n# define BOOST_PP_SEQ_ELEM_36(_) BOOST_PP_SEQ_ELEM_35\n# define BOOST_PP_SEQ_ELEM_37(_) BOOST_PP_SEQ_ELEM_36\n# define BOOST_PP_SEQ_ELEM_38(_) BOOST_PP_SEQ_ELEM_37\n# define BOOST_PP_SEQ_ELEM_39(_) BOOST_PP_SEQ_ELEM_38\n# define BOOST_PP_SEQ_ELEM_40(_) BOOST_PP_SEQ_ELEM_39\n# define BOOST_PP_SEQ_ELEM_41(_) BOOST_PP_SEQ_ELEM_40\n# define BOOST_PP_SEQ_ELEM_42(_) BOOST_PP_SEQ_ELEM_41\n# define BOOST_PP_SEQ_ELEM_43(_) BOOST_PP_SEQ_ELEM_42\n# define BOOST_PP_SEQ_ELEM_44(_) BOOST_PP_SEQ_ELEM_43\n# define BOOST_PP_SEQ_ELEM_45(_) BOOST_PP_SEQ_ELEM_44\n# define BOOST_PP_SEQ_ELEM_46(_) BOOST_PP_SEQ_ELEM_45\n# define BOOST_PP_SEQ_ELEM_47(_) BOOST_PP_SEQ_ELEM_46\n# define BOOST_PP_SEQ_ELEM_48(_) BOOST_PP_SEQ_ELEM_47\n# define BOOST_PP_SEQ_ELEM_49(_) BOOST_PP_SEQ_ELEM_48\n# define BOOST_PP_SEQ_ELEM_50(_) BOOST_PP_SEQ_ELEM_49\n# define BOOST_PP_SEQ_ELEM_51(_) BOOST_PP_SEQ_ELEM_50\n# define BOOST_PP_SEQ_ELEM_52(_) BOOST_PP_SEQ_ELEM_51\n# define BOOST_PP_SEQ_ELEM_53(_) BOOST_PP_SEQ_ELEM_52\n# define BOOST_PP_SEQ_ELEM_54(_) BOOST_PP_SEQ_ELEM_53\n# define BOOST_PP_SEQ_ELEM_55(_) BOOST_PP_SEQ_ELEM_54\n# define BOOST_PP_SEQ_ELEM_56(_) BOOST_PP_SEQ_ELEM_55\n# define BOOST_PP_SEQ_ELEM_57(_) BOOST_PP_SEQ_ELEM_56\n# define BOOST_PP_SEQ_ELEM_58(_) BOOST_PP_SEQ_ELEM_57\n# define BOOST_PP_SEQ_ELEM_59(_) BOOST_PP_SEQ_ELEM_58\n# define BOOST_PP_SEQ_ELEM_60(_) BOOST_PP_SEQ_ELEM_59\n# define BOOST_PP_SEQ_ELEM_61(_) BOOST_PP_SEQ_ELEM_60\n# define BOOST_PP_SEQ_ELEM_62(_) BOOST_PP_SEQ_ELEM_61\n# define BOOST_PP_SEQ_ELEM_63(_) BOOST_PP_SEQ_ELEM_62\n# define BOOST_PP_SEQ_ELEM_64(_) BOOST_PP_SEQ_ELEM_63\n# define BOOST_PP_SEQ_ELEM_65(_) BOOST_PP_SEQ_ELEM_64\n# define BOOST_PP_SEQ_ELEM_66(_) BOOST_PP_SEQ_ELEM_65\n# define BOOST_PP_SEQ_ELEM_67(_) BOOST_PP_SEQ_ELEM_66\n# define BOOST_PP_SEQ_ELEM_68(_) BOOST_PP_SEQ_ELEM_67\n# define BOOST_PP_SEQ_ELEM_69(_) BOOST_PP_SEQ_ELEM_68\n# define BOOST_PP_SEQ_ELEM_70(_) BOOST_PP_SEQ_ELEM_69\n# define BOOST_PP_SEQ_ELEM_71(_) BOOST_PP_SEQ_ELEM_70\n# define BOOST_PP_SEQ_ELEM_72(_) BOOST_PP_SEQ_ELEM_71\n# define BOOST_PP_SEQ_ELEM_73(_) BOOST_PP_SEQ_ELEM_72\n# define BOOST_PP_SEQ_ELEM_74(_) BOOST_PP_SEQ_ELEM_73\n# define BOOST_PP_SEQ_ELEM_75(_) BOOST_PP_SEQ_ELEM_74\n# define BOOST_PP_SEQ_ELEM_76(_) BOOST_PP_SEQ_ELEM_75\n# define BOOST_PP_SEQ_ELEM_77(_) BOOST_PP_SEQ_ELEM_76\n# define BOOST_PP_SEQ_ELEM_78(_) BOOST_PP_SEQ_ELEM_77\n# define BOOST_PP_SEQ_ELEM_79(_) BOOST_PP_SEQ_ELEM_78\n# define BOOST_PP_SEQ_ELEM_80(_) BOOST_PP_SEQ_ELEM_79\n# define BOOST_PP_SEQ_ELEM_81(_) BOOST_PP_SEQ_ELEM_80\n# define BOOST_PP_SEQ_ELEM_82(_) BOOST_PP_SEQ_ELEM_81\n# define BOOST_PP_SEQ_ELEM_83(_) BOOST_PP_SEQ_ELEM_82\n# define BOOST_PP_SEQ_ELEM_84(_) BOOST_PP_SEQ_ELEM_83\n# define BOOST_PP_SEQ_ELEM_85(_) BOOST_PP_SEQ_ELEM_84\n# define BOOST_PP_SEQ_ELEM_86(_) BOOST_PP_SEQ_ELEM_85\n# define BOOST_PP_SEQ_ELEM_87(_) BOOST_PP_SEQ_ELEM_86\n# define BOOST_PP_SEQ_ELEM_88(_) BOOST_PP_SEQ_ELEM_87\n# define BOOST_PP_SEQ_ELEM_89(_) BOOST_PP_SEQ_ELEM_88\n# define BOOST_PP_SEQ_ELEM_90(_) BOOST_PP_SEQ_ELEM_89\n# define BOOST_PP_SEQ_ELEM_91(_) BOOST_PP_SEQ_ELEM_90\n# define BOOST_PP_SEQ_ELEM_92(_) BOOST_PP_SEQ_ELEM_91\n# define BOOST_PP_SEQ_ELEM_93(_) BOOST_PP_SEQ_ELEM_92\n# define BOOST_PP_SEQ_ELEM_94(_) BOOST_PP_SEQ_ELEM_93\n# define BOOST_PP_SEQ_ELEM_95(_) BOOST_PP_SEQ_ELEM_94\n# define BOOST_PP_SEQ_ELEM_96(_) BOOST_PP_SEQ_ELEM_95\n# define BOOST_PP_SEQ_ELEM_97(_) BOOST_PP_SEQ_ELEM_96\n# define BOOST_PP_SEQ_ELEM_98(_) BOOST_PP_SEQ_ELEM_97\n# define BOOST_PP_SEQ_ELEM_99(_) BOOST_PP_SEQ_ELEM_98\n# define BOOST_PP_SEQ_ELEM_100(_) BOOST_PP_SEQ_ELEM_99\n# define BOOST_PP_SEQ_ELEM_101(_) BOOST_PP_SEQ_ELEM_100\n# define BOOST_PP_SEQ_ELEM_102(_) BOOST_PP_SEQ_ELEM_101\n# define BOOST_PP_SEQ_ELEM_103(_) BOOST_PP_SEQ_ELEM_102\n# define BOOST_PP_SEQ_ELEM_104(_) BOOST_PP_SEQ_ELEM_103\n# define BOOST_PP_SEQ_ELEM_105(_) BOOST_PP_SEQ_ELEM_104\n# define BOOST_PP_SEQ_ELEM_106(_) BOOST_PP_SEQ_ELEM_105\n# define BOOST_PP_SEQ_ELEM_107(_) BOOST_PP_SEQ_ELEM_106\n# define BOOST_PP_SEQ_ELEM_108(_) BOOST_PP_SEQ_ELEM_107\n# define BOOST_PP_SEQ_ELEM_109(_) BOOST_PP_SEQ_ELEM_108\n# define BOOST_PP_SEQ_ELEM_110(_) BOOST_PP_SEQ_ELEM_109\n# define BOOST_PP_SEQ_ELEM_111(_) BOOST_PP_SEQ_ELEM_110\n# define BOOST_PP_SEQ_ELEM_112(_) BOOST_PP_SEQ_ELEM_111\n# define BOOST_PP_SEQ_ELEM_113(_) BOOST_PP_SEQ_ELEM_112\n# define BOOST_PP_SEQ_ELEM_114(_) BOOST_PP_SEQ_ELEM_113\n# define BOOST_PP_SEQ_ELEM_115(_) BOOST_PP_SEQ_ELEM_114\n# define BOOST_PP_SEQ_ELEM_116(_) BOOST_PP_SEQ_ELEM_115\n# define BOOST_PP_SEQ_ELEM_117(_) BOOST_PP_SEQ_ELEM_116\n# define BOOST_PP_SEQ_ELEM_118(_) BOOST_PP_SEQ_ELEM_117\n# define BOOST_PP_SEQ_ELEM_119(_) BOOST_PP_SEQ_ELEM_118\n# define BOOST_PP_SEQ_ELEM_120(_) BOOST_PP_SEQ_ELEM_119\n# define BOOST_PP_SEQ_ELEM_121(_) BOOST_PP_SEQ_ELEM_120\n# define BOOST_PP_SEQ_ELEM_122(_) BOOST_PP_SEQ_ELEM_121\n# define BOOST_PP_SEQ_ELEM_123(_) BOOST_PP_SEQ_ELEM_122\n# define BOOST_PP_SEQ_ELEM_124(_) BOOST_PP_SEQ_ELEM_123\n# define BOOST_PP_SEQ_ELEM_125(_) BOOST_PP_SEQ_ELEM_124\n# define BOOST_PP_SEQ_ELEM_126(_) BOOST_PP_SEQ_ELEM_125\n# define BOOST_PP_SEQ_ELEM_127(_) BOOST_PP_SEQ_ELEM_126\n# define BOOST_PP_SEQ_ELEM_128(_) BOOST_PP_SEQ_ELEM_127\n# define BOOST_PP_SEQ_ELEM_129(_) BOOST_PP_SEQ_ELEM_128\n# define BOOST_PP_SEQ_ELEM_130(_) BOOST_PP_SEQ_ELEM_129\n# define BOOST_PP_SEQ_ELEM_131(_) BOOST_PP_SEQ_ELEM_130\n# define BOOST_PP_SEQ_ELEM_132(_) BOOST_PP_SEQ_ELEM_131\n# define BOOST_PP_SEQ_ELEM_133(_) BOOST_PP_SEQ_ELEM_132\n# define BOOST_PP_SEQ_ELEM_134(_) BOOST_PP_SEQ_ELEM_133\n# define BOOST_PP_SEQ_ELEM_135(_) BOOST_PP_SEQ_ELEM_134\n# define BOOST_PP_SEQ_ELEM_136(_) BOOST_PP_SEQ_ELEM_135\n# define BOOST_PP_SEQ_ELEM_137(_) BOOST_PP_SEQ_ELEM_136\n# define BOOST_PP_SEQ_ELEM_138(_) BOOST_PP_SEQ_ELEM_137\n# define BOOST_PP_SEQ_ELEM_139(_) BOOST_PP_SEQ_ELEM_138\n# define BOOST_PP_SEQ_ELEM_140(_) BOOST_PP_SEQ_ELEM_139\n# define BOOST_PP_SEQ_ELEM_141(_) BOOST_PP_SEQ_ELEM_140\n# define BOOST_PP_SEQ_ELEM_142(_) BOOST_PP_SEQ_ELEM_141\n# define BOOST_PP_SEQ_ELEM_143(_) BOOST_PP_SEQ_ELEM_142\n# define BOOST_PP_SEQ_ELEM_144(_) BOOST_PP_SEQ_ELEM_143\n# define BOOST_PP_SEQ_ELEM_145(_) BOOST_PP_SEQ_ELEM_144\n# define BOOST_PP_SEQ_ELEM_146(_) BOOST_PP_SEQ_ELEM_145\n# define BOOST_PP_SEQ_ELEM_147(_) BOOST_PP_SEQ_ELEM_146\n# define BOOST_PP_SEQ_ELEM_148(_) BOOST_PP_SEQ_ELEM_147\n# define BOOST_PP_SEQ_ELEM_149(_) BOOST_PP_SEQ_ELEM_148\n# define BOOST_PP_SEQ_ELEM_150(_) BOOST_PP_SEQ_ELEM_149\n# define BOOST_PP_SEQ_ELEM_151(_) BOOST_PP_SEQ_ELEM_150\n# define BOOST_PP_SEQ_ELEM_152(_) BOOST_PP_SEQ_ELEM_151\n# define BOOST_PP_SEQ_ELEM_153(_) BOOST_PP_SEQ_ELEM_152\n# define BOOST_PP_SEQ_ELEM_154(_) BOOST_PP_SEQ_ELEM_153\n# define BOOST_PP_SEQ_ELEM_155(_) BOOST_PP_SEQ_ELEM_154\n# define BOOST_PP_SEQ_ELEM_156(_) BOOST_PP_SEQ_ELEM_155\n# define BOOST_PP_SEQ_ELEM_157(_) BOOST_PP_SEQ_ELEM_156\n# define BOOST_PP_SEQ_ELEM_158(_) BOOST_PP_SEQ_ELEM_157\n# define BOOST_PP_SEQ_ELEM_159(_) BOOST_PP_SEQ_ELEM_158\n# define BOOST_PP_SEQ_ELEM_160(_) BOOST_PP_SEQ_ELEM_159\n# define BOOST_PP_SEQ_ELEM_161(_) BOOST_PP_SEQ_ELEM_160\n# define BOOST_PP_SEQ_ELEM_162(_) BOOST_PP_SEQ_ELEM_161\n# define BOOST_PP_SEQ_ELEM_163(_) BOOST_PP_SEQ_ELEM_162\n# define BOOST_PP_SEQ_ELEM_164(_) BOOST_PP_SEQ_ELEM_163\n# define BOOST_PP_SEQ_ELEM_165(_) BOOST_PP_SEQ_ELEM_164\n# define BOOST_PP_SEQ_ELEM_166(_) BOOST_PP_SEQ_ELEM_165\n# define BOOST_PP_SEQ_ELEM_167(_) BOOST_PP_SEQ_ELEM_166\n# define BOOST_PP_SEQ_ELEM_168(_) BOOST_PP_SEQ_ELEM_167\n# define BOOST_PP_SEQ_ELEM_169(_) BOOST_PP_SEQ_ELEM_168\n# define BOOST_PP_SEQ_ELEM_170(_) BOOST_PP_SEQ_ELEM_169\n# define BOOST_PP_SEQ_ELEM_171(_) BOOST_PP_SEQ_ELEM_170\n# define BOOST_PP_SEQ_ELEM_172(_) BOOST_PP_SEQ_ELEM_171\n# define BOOST_PP_SEQ_ELEM_173(_) BOOST_PP_SEQ_ELEM_172\n# define BOOST_PP_SEQ_ELEM_174(_) BOOST_PP_SEQ_ELEM_173\n# define BOOST_PP_SEQ_ELEM_175(_) BOOST_PP_SEQ_ELEM_174\n# define BOOST_PP_SEQ_ELEM_176(_) BOOST_PP_SEQ_ELEM_175\n# define BOOST_PP_SEQ_ELEM_177(_) BOOST_PP_SEQ_ELEM_176\n# define BOOST_PP_SEQ_ELEM_178(_) BOOST_PP_SEQ_ELEM_177\n# define BOOST_PP_SEQ_ELEM_179(_) BOOST_PP_SEQ_ELEM_178\n# define BOOST_PP_SEQ_ELEM_180(_) BOOST_PP_SEQ_ELEM_179\n# define BOOST_PP_SEQ_ELEM_181(_) BOOST_PP_SEQ_ELEM_180\n# define BOOST_PP_SEQ_ELEM_182(_) BOOST_PP_SEQ_ELEM_181\n# define BOOST_PP_SEQ_ELEM_183(_) BOOST_PP_SEQ_ELEM_182\n# define BOOST_PP_SEQ_ELEM_184(_) BOOST_PP_SEQ_ELEM_183\n# define BOOST_PP_SEQ_ELEM_185(_) BOOST_PP_SEQ_ELEM_184\n# define BOOST_PP_SEQ_ELEM_186(_) BOOST_PP_SEQ_ELEM_185\n# define BOOST_PP_SEQ_ELEM_187(_) BOOST_PP_SEQ_ELEM_186\n# define BOOST_PP_SEQ_ELEM_188(_) BOOST_PP_SEQ_ELEM_187\n# define BOOST_PP_SEQ_ELEM_189(_) BOOST_PP_SEQ_ELEM_188\n# define BOOST_PP_SEQ_ELEM_190(_) BOOST_PP_SEQ_ELEM_189\n# define BOOST_PP_SEQ_ELEM_191(_) BOOST_PP_SEQ_ELEM_190\n# define BOOST_PP_SEQ_ELEM_192(_) BOOST_PP_SEQ_ELEM_191\n# define BOOST_PP_SEQ_ELEM_193(_) BOOST_PP_SEQ_ELEM_192\n# define BOOST_PP_SEQ_ELEM_194(_) BOOST_PP_SEQ_ELEM_193\n# define BOOST_PP_SEQ_ELEM_195(_) BOOST_PP_SEQ_ELEM_194\n# define BOOST_PP_SEQ_ELEM_196(_) BOOST_PP_SEQ_ELEM_195\n# define BOOST_PP_SEQ_ELEM_197(_) BOOST_PP_SEQ_ELEM_196\n# define BOOST_PP_SEQ_ELEM_198(_) BOOST_PP_SEQ_ELEM_197\n# define BOOST_PP_SEQ_ELEM_199(_) BOOST_PP_SEQ_ELEM_198\n# define BOOST_PP_SEQ_ELEM_200(_) BOOST_PP_SEQ_ELEM_199\n# define BOOST_PP_SEQ_ELEM_201(_) BOOST_PP_SEQ_ELEM_200\n# define BOOST_PP_SEQ_ELEM_202(_) BOOST_PP_SEQ_ELEM_201\n# define BOOST_PP_SEQ_ELEM_203(_) BOOST_PP_SEQ_ELEM_202\n# define BOOST_PP_SEQ_ELEM_204(_) BOOST_PP_SEQ_ELEM_203\n# define BOOST_PP_SEQ_ELEM_205(_) BOOST_PP_SEQ_ELEM_204\n# define BOOST_PP_SEQ_ELEM_206(_) BOOST_PP_SEQ_ELEM_205\n# define BOOST_PP_SEQ_ELEM_207(_) BOOST_PP_SEQ_ELEM_206\n# define BOOST_PP_SEQ_ELEM_208(_) BOOST_PP_SEQ_ELEM_207\n# define BOOST_PP_SEQ_ELEM_209(_) BOOST_PP_SEQ_ELEM_208\n# define BOOST_PP_SEQ_ELEM_210(_) BOOST_PP_SEQ_ELEM_209\n# define BOOST_PP_SEQ_ELEM_211(_) BOOST_PP_SEQ_ELEM_210\n# define BOOST_PP_SEQ_ELEM_212(_) BOOST_PP_SEQ_ELEM_211\n# define BOOST_PP_SEQ_ELEM_213(_) BOOST_PP_SEQ_ELEM_212\n# define BOOST_PP_SEQ_ELEM_214(_) BOOST_PP_SEQ_ELEM_213\n# define BOOST_PP_SEQ_ELEM_215(_) BOOST_PP_SEQ_ELEM_214\n# define BOOST_PP_SEQ_ELEM_216(_) BOOST_PP_SEQ_ELEM_215\n# define BOOST_PP_SEQ_ELEM_217(_) BOOST_PP_SEQ_ELEM_216\n# define BOOST_PP_SEQ_ELEM_218(_) BOOST_PP_SEQ_ELEM_217\n# define BOOST_PP_SEQ_ELEM_219(_) BOOST_PP_SEQ_ELEM_218\n# define BOOST_PP_SEQ_ELEM_220(_) BOOST_PP_SEQ_ELEM_219\n# define BOOST_PP_SEQ_ELEM_221(_) BOOST_PP_SEQ_ELEM_220\n# define BOOST_PP_SEQ_ELEM_222(_) BOOST_PP_SEQ_ELEM_221\n# define BOOST_PP_SEQ_ELEM_223(_) BOOST_PP_SEQ_ELEM_222\n# define BOOST_PP_SEQ_ELEM_224(_) BOOST_PP_SEQ_ELEM_223\n# define BOOST_PP_SEQ_ELEM_225(_) BOOST_PP_SEQ_ELEM_224\n# define BOOST_PP_SEQ_ELEM_226(_) BOOST_PP_SEQ_ELEM_225\n# define BOOST_PP_SEQ_ELEM_227(_) BOOST_PP_SEQ_ELEM_226\n# define BOOST_PP_SEQ_ELEM_228(_) BOOST_PP_SEQ_ELEM_227\n# define BOOST_PP_SEQ_ELEM_229(_) BOOST_PP_SEQ_ELEM_228\n# define BOOST_PP_SEQ_ELEM_230(_) BOOST_PP_SEQ_ELEM_229\n# define BOOST_PP_SEQ_ELEM_231(_) BOOST_PP_SEQ_ELEM_230\n# define BOOST_PP_SEQ_ELEM_232(_) BOOST_PP_SEQ_ELEM_231\n# define BOOST_PP_SEQ_ELEM_233(_) BOOST_PP_SEQ_ELEM_232\n# define BOOST_PP_SEQ_ELEM_234(_) BOOST_PP_SEQ_ELEM_233\n# define BOOST_PP_SEQ_ELEM_235(_) BOOST_PP_SEQ_ELEM_234\n# define BOOST_PP_SEQ_ELEM_236(_) BOOST_PP_SEQ_ELEM_235\n# define BOOST_PP_SEQ_ELEM_237(_) BOOST_PP_SEQ_ELEM_236\n# define BOOST_PP_SEQ_ELEM_238(_) BOOST_PP_SEQ_ELEM_237\n# define BOOST_PP_SEQ_ELEM_239(_) BOOST_PP_SEQ_ELEM_238\n# define BOOST_PP_SEQ_ELEM_240(_) BOOST_PP_SEQ_ELEM_239\n# define BOOST_PP_SEQ_ELEM_241(_) BOOST_PP_SEQ_ELEM_240\n# define BOOST_PP_SEQ_ELEM_242(_) BOOST_PP_SEQ_ELEM_241\n# define BOOST_PP_SEQ_ELEM_243(_) BOOST_PP_SEQ_ELEM_242\n# define BOOST_PP_SEQ_ELEM_244(_) BOOST_PP_SEQ_ELEM_243\n# define BOOST_PP_SEQ_ELEM_245(_) BOOST_PP_SEQ_ELEM_244\n# define BOOST_PP_SEQ_ELEM_246(_) BOOST_PP_SEQ_ELEM_245\n# define BOOST_PP_SEQ_ELEM_247(_) BOOST_PP_SEQ_ELEM_246\n# define BOOST_PP_SEQ_ELEM_248(_) BOOST_PP_SEQ_ELEM_247\n# define BOOST_PP_SEQ_ELEM_249(_) BOOST_PP_SEQ_ELEM_248\n# define BOOST_PP_SEQ_ELEM_250(_) BOOST_PP_SEQ_ELEM_249\n# define BOOST_PP_SEQ_ELEM_251(_) BOOST_PP_SEQ_ELEM_250\n# define BOOST_PP_SEQ_ELEM_252(_) BOOST_PP_SEQ_ELEM_251\n# define BOOST_PP_SEQ_ELEM_253(_) BOOST_PP_SEQ_ELEM_252\n# define BOOST_PP_SEQ_ELEM_254(_) BOOST_PP_SEQ_ELEM_253\n# define BOOST_PP_SEQ_ELEM_255(_) BOOST_PP_SEQ_ELEM_254\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/seq/enum.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_ENUM_HPP\n# define BOOST_PREPROCESSOR_SEQ_ENUM_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/seq/size.hpp>\n#\n# /* BOOST_PP_SEQ_ENUM */\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_ENUM(seq) BOOST_PP_SEQ_ENUM_I(seq)\n#    define BOOST_PP_SEQ_ENUM_I(seq) BOOST_PP_CAT(BOOST_PP_SEQ_ENUM_, BOOST_PP_SEQ_SIZE(seq)) seq\n# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_SEQ_ENUM(seq) BOOST_PP_SEQ_ENUM_I(BOOST_PP_SEQ_SIZE(seq), seq)\n#    define BOOST_PP_SEQ_ENUM_I(size, seq) BOOST_PP_CAT(BOOST_PP_SEQ_ENUM_, size) seq\n# else\n#    define BOOST_PP_SEQ_ENUM(seq) BOOST_PP_CAT(BOOST_PP_SEQ_ENUM_, BOOST_PP_SEQ_SIZE(seq)) seq\n# endif\n#\n# define BOOST_PP_SEQ_ENUM_1(x) x\n# define BOOST_PP_SEQ_ENUM_2(x) x, BOOST_PP_SEQ_ENUM_1\n# define BOOST_PP_SEQ_ENUM_3(x) x, BOOST_PP_SEQ_ENUM_2\n# define BOOST_PP_SEQ_ENUM_4(x) x, BOOST_PP_SEQ_ENUM_3\n# define BOOST_PP_SEQ_ENUM_5(x) x, BOOST_PP_SEQ_ENUM_4\n# define BOOST_PP_SEQ_ENUM_6(x) x, BOOST_PP_SEQ_ENUM_5\n# define BOOST_PP_SEQ_ENUM_7(x) x, BOOST_PP_SEQ_ENUM_6\n# define BOOST_PP_SEQ_ENUM_8(x) x, BOOST_PP_SEQ_ENUM_7\n# define BOOST_PP_SEQ_ENUM_9(x) x, BOOST_PP_SEQ_ENUM_8\n# define BOOST_PP_SEQ_ENUM_10(x) x, BOOST_PP_SEQ_ENUM_9\n# define BOOST_PP_SEQ_ENUM_11(x) x, BOOST_PP_SEQ_ENUM_10\n# define BOOST_PP_SEQ_ENUM_12(x) x, BOOST_PP_SEQ_ENUM_11\n# define BOOST_PP_SEQ_ENUM_13(x) x, BOOST_PP_SEQ_ENUM_12\n# define BOOST_PP_SEQ_ENUM_14(x) x, BOOST_PP_SEQ_ENUM_13\n# define BOOST_PP_SEQ_ENUM_15(x) x, BOOST_PP_SEQ_ENUM_14\n# define BOOST_PP_SEQ_ENUM_16(x) x, BOOST_PP_SEQ_ENUM_15\n# define BOOST_PP_SEQ_ENUM_17(x) x, BOOST_PP_SEQ_ENUM_16\n# define BOOST_PP_SEQ_ENUM_18(x) x, BOOST_PP_SEQ_ENUM_17\n# define BOOST_PP_SEQ_ENUM_19(x) x, BOOST_PP_SEQ_ENUM_18\n# define BOOST_PP_SEQ_ENUM_20(x) x, BOOST_PP_SEQ_ENUM_19\n# define BOOST_PP_SEQ_ENUM_21(x) x, BOOST_PP_SEQ_ENUM_20\n# define BOOST_PP_SEQ_ENUM_22(x) x, BOOST_PP_SEQ_ENUM_21\n# define BOOST_PP_SEQ_ENUM_23(x) x, BOOST_PP_SEQ_ENUM_22\n# define BOOST_PP_SEQ_ENUM_24(x) x, BOOST_PP_SEQ_ENUM_23\n# define BOOST_PP_SEQ_ENUM_25(x) x, BOOST_PP_SEQ_ENUM_24\n# define BOOST_PP_SEQ_ENUM_26(x) x, BOOST_PP_SEQ_ENUM_25\n# define BOOST_PP_SEQ_ENUM_27(x) x, BOOST_PP_SEQ_ENUM_26\n# define BOOST_PP_SEQ_ENUM_28(x) x, BOOST_PP_SEQ_ENUM_27\n# define BOOST_PP_SEQ_ENUM_29(x) x, BOOST_PP_SEQ_ENUM_28\n# define BOOST_PP_SEQ_ENUM_30(x) x, BOOST_PP_SEQ_ENUM_29\n# define BOOST_PP_SEQ_ENUM_31(x) x, BOOST_PP_SEQ_ENUM_30\n# define BOOST_PP_SEQ_ENUM_32(x) x, BOOST_PP_SEQ_ENUM_31\n# define BOOST_PP_SEQ_ENUM_33(x) x, BOOST_PP_SEQ_ENUM_32\n# define BOOST_PP_SEQ_ENUM_34(x) x, BOOST_PP_SEQ_ENUM_33\n# define BOOST_PP_SEQ_ENUM_35(x) x, BOOST_PP_SEQ_ENUM_34\n# define BOOST_PP_SEQ_ENUM_36(x) x, BOOST_PP_SEQ_ENUM_35\n# define BOOST_PP_SEQ_ENUM_37(x) x, BOOST_PP_SEQ_ENUM_36\n# define BOOST_PP_SEQ_ENUM_38(x) x, BOOST_PP_SEQ_ENUM_37\n# define BOOST_PP_SEQ_ENUM_39(x) x, BOOST_PP_SEQ_ENUM_38\n# define BOOST_PP_SEQ_ENUM_40(x) x, BOOST_PP_SEQ_ENUM_39\n# define BOOST_PP_SEQ_ENUM_41(x) x, BOOST_PP_SEQ_ENUM_40\n# define BOOST_PP_SEQ_ENUM_42(x) x, BOOST_PP_SEQ_ENUM_41\n# define BOOST_PP_SEQ_ENUM_43(x) x, BOOST_PP_SEQ_ENUM_42\n# define BOOST_PP_SEQ_ENUM_44(x) x, BOOST_PP_SEQ_ENUM_43\n# define BOOST_PP_SEQ_ENUM_45(x) x, BOOST_PP_SEQ_ENUM_44\n# define BOOST_PP_SEQ_ENUM_46(x) x, BOOST_PP_SEQ_ENUM_45\n# define BOOST_PP_SEQ_ENUM_47(x) x, BOOST_PP_SEQ_ENUM_46\n# define BOOST_PP_SEQ_ENUM_48(x) x, BOOST_PP_SEQ_ENUM_47\n# define BOOST_PP_SEQ_ENUM_49(x) x, BOOST_PP_SEQ_ENUM_48\n# define BOOST_PP_SEQ_ENUM_50(x) x, BOOST_PP_SEQ_ENUM_49\n# define BOOST_PP_SEQ_ENUM_51(x) x, BOOST_PP_SEQ_ENUM_50\n# define BOOST_PP_SEQ_ENUM_52(x) x, BOOST_PP_SEQ_ENUM_51\n# define BOOST_PP_SEQ_ENUM_53(x) x, BOOST_PP_SEQ_ENUM_52\n# define BOOST_PP_SEQ_ENUM_54(x) x, BOOST_PP_SEQ_ENUM_53\n# define BOOST_PP_SEQ_ENUM_55(x) x, BOOST_PP_SEQ_ENUM_54\n# define BOOST_PP_SEQ_ENUM_56(x) x, BOOST_PP_SEQ_ENUM_55\n# define BOOST_PP_SEQ_ENUM_57(x) x, BOOST_PP_SEQ_ENUM_56\n# define BOOST_PP_SEQ_ENUM_58(x) x, BOOST_PP_SEQ_ENUM_57\n# define BOOST_PP_SEQ_ENUM_59(x) x, BOOST_PP_SEQ_ENUM_58\n# define BOOST_PP_SEQ_ENUM_60(x) x, BOOST_PP_SEQ_ENUM_59\n# define BOOST_PP_SEQ_ENUM_61(x) x, BOOST_PP_SEQ_ENUM_60\n# define BOOST_PP_SEQ_ENUM_62(x) x, BOOST_PP_SEQ_ENUM_61\n# define BOOST_PP_SEQ_ENUM_63(x) x, BOOST_PP_SEQ_ENUM_62\n# define BOOST_PP_SEQ_ENUM_64(x) x, BOOST_PP_SEQ_ENUM_63\n# define BOOST_PP_SEQ_ENUM_65(x) x, BOOST_PP_SEQ_ENUM_64\n# define BOOST_PP_SEQ_ENUM_66(x) x, BOOST_PP_SEQ_ENUM_65\n# define BOOST_PP_SEQ_ENUM_67(x) x, BOOST_PP_SEQ_ENUM_66\n# define BOOST_PP_SEQ_ENUM_68(x) x, BOOST_PP_SEQ_ENUM_67\n# define BOOST_PP_SEQ_ENUM_69(x) x, BOOST_PP_SEQ_ENUM_68\n# define BOOST_PP_SEQ_ENUM_70(x) x, BOOST_PP_SEQ_ENUM_69\n# define BOOST_PP_SEQ_ENUM_71(x) x, BOOST_PP_SEQ_ENUM_70\n# define BOOST_PP_SEQ_ENUM_72(x) x, BOOST_PP_SEQ_ENUM_71\n# define BOOST_PP_SEQ_ENUM_73(x) x, BOOST_PP_SEQ_ENUM_72\n# define BOOST_PP_SEQ_ENUM_74(x) x, BOOST_PP_SEQ_ENUM_73\n# define BOOST_PP_SEQ_ENUM_75(x) x, BOOST_PP_SEQ_ENUM_74\n# define BOOST_PP_SEQ_ENUM_76(x) x, BOOST_PP_SEQ_ENUM_75\n# define BOOST_PP_SEQ_ENUM_77(x) x, BOOST_PP_SEQ_ENUM_76\n# define BOOST_PP_SEQ_ENUM_78(x) x, BOOST_PP_SEQ_ENUM_77\n# define BOOST_PP_SEQ_ENUM_79(x) x, BOOST_PP_SEQ_ENUM_78\n# define BOOST_PP_SEQ_ENUM_80(x) x, BOOST_PP_SEQ_ENUM_79\n# define BOOST_PP_SEQ_ENUM_81(x) x, BOOST_PP_SEQ_ENUM_80\n# define BOOST_PP_SEQ_ENUM_82(x) x, BOOST_PP_SEQ_ENUM_81\n# define BOOST_PP_SEQ_ENUM_83(x) x, BOOST_PP_SEQ_ENUM_82\n# define BOOST_PP_SEQ_ENUM_84(x) x, BOOST_PP_SEQ_ENUM_83\n# define BOOST_PP_SEQ_ENUM_85(x) x, BOOST_PP_SEQ_ENUM_84\n# define BOOST_PP_SEQ_ENUM_86(x) x, BOOST_PP_SEQ_ENUM_85\n# define BOOST_PP_SEQ_ENUM_87(x) x, BOOST_PP_SEQ_ENUM_86\n# define BOOST_PP_SEQ_ENUM_88(x) x, BOOST_PP_SEQ_ENUM_87\n# define BOOST_PP_SEQ_ENUM_89(x) x, BOOST_PP_SEQ_ENUM_88\n# define BOOST_PP_SEQ_ENUM_90(x) x, BOOST_PP_SEQ_ENUM_89\n# define BOOST_PP_SEQ_ENUM_91(x) x, BOOST_PP_SEQ_ENUM_90\n# define BOOST_PP_SEQ_ENUM_92(x) x, BOOST_PP_SEQ_ENUM_91\n# define BOOST_PP_SEQ_ENUM_93(x) x, BOOST_PP_SEQ_ENUM_92\n# define BOOST_PP_SEQ_ENUM_94(x) x, BOOST_PP_SEQ_ENUM_93\n# define BOOST_PP_SEQ_ENUM_95(x) x, BOOST_PP_SEQ_ENUM_94\n# define BOOST_PP_SEQ_ENUM_96(x) x, BOOST_PP_SEQ_ENUM_95\n# define BOOST_PP_SEQ_ENUM_97(x) x, BOOST_PP_SEQ_ENUM_96\n# define BOOST_PP_SEQ_ENUM_98(x) x, BOOST_PP_SEQ_ENUM_97\n# define BOOST_PP_SEQ_ENUM_99(x) x, BOOST_PP_SEQ_ENUM_98\n# define BOOST_PP_SEQ_ENUM_100(x) x, BOOST_PP_SEQ_ENUM_99\n# define BOOST_PP_SEQ_ENUM_101(x) x, BOOST_PP_SEQ_ENUM_100\n# define BOOST_PP_SEQ_ENUM_102(x) x, BOOST_PP_SEQ_ENUM_101\n# define BOOST_PP_SEQ_ENUM_103(x) x, BOOST_PP_SEQ_ENUM_102\n# define BOOST_PP_SEQ_ENUM_104(x) x, BOOST_PP_SEQ_ENUM_103\n# define BOOST_PP_SEQ_ENUM_105(x) x, BOOST_PP_SEQ_ENUM_104\n# define BOOST_PP_SEQ_ENUM_106(x) x, BOOST_PP_SEQ_ENUM_105\n# define BOOST_PP_SEQ_ENUM_107(x) x, BOOST_PP_SEQ_ENUM_106\n# define BOOST_PP_SEQ_ENUM_108(x) x, BOOST_PP_SEQ_ENUM_107\n# define BOOST_PP_SEQ_ENUM_109(x) x, BOOST_PP_SEQ_ENUM_108\n# define BOOST_PP_SEQ_ENUM_110(x) x, BOOST_PP_SEQ_ENUM_109\n# define BOOST_PP_SEQ_ENUM_111(x) x, BOOST_PP_SEQ_ENUM_110\n# define BOOST_PP_SEQ_ENUM_112(x) x, BOOST_PP_SEQ_ENUM_111\n# define BOOST_PP_SEQ_ENUM_113(x) x, BOOST_PP_SEQ_ENUM_112\n# define BOOST_PP_SEQ_ENUM_114(x) x, BOOST_PP_SEQ_ENUM_113\n# define BOOST_PP_SEQ_ENUM_115(x) x, BOOST_PP_SEQ_ENUM_114\n# define BOOST_PP_SEQ_ENUM_116(x) x, BOOST_PP_SEQ_ENUM_115\n# define BOOST_PP_SEQ_ENUM_117(x) x, BOOST_PP_SEQ_ENUM_116\n# define BOOST_PP_SEQ_ENUM_118(x) x, BOOST_PP_SEQ_ENUM_117\n# define BOOST_PP_SEQ_ENUM_119(x) x, BOOST_PP_SEQ_ENUM_118\n# define BOOST_PP_SEQ_ENUM_120(x) x, BOOST_PP_SEQ_ENUM_119\n# define BOOST_PP_SEQ_ENUM_121(x) x, BOOST_PP_SEQ_ENUM_120\n# define BOOST_PP_SEQ_ENUM_122(x) x, BOOST_PP_SEQ_ENUM_121\n# define BOOST_PP_SEQ_ENUM_123(x) x, BOOST_PP_SEQ_ENUM_122\n# define BOOST_PP_SEQ_ENUM_124(x) x, BOOST_PP_SEQ_ENUM_123\n# define BOOST_PP_SEQ_ENUM_125(x) x, BOOST_PP_SEQ_ENUM_124\n# define BOOST_PP_SEQ_ENUM_126(x) x, BOOST_PP_SEQ_ENUM_125\n# define BOOST_PP_SEQ_ENUM_127(x) x, BOOST_PP_SEQ_ENUM_126\n# define BOOST_PP_SEQ_ENUM_128(x) x, BOOST_PP_SEQ_ENUM_127\n# define BOOST_PP_SEQ_ENUM_129(x) x, BOOST_PP_SEQ_ENUM_128\n# define BOOST_PP_SEQ_ENUM_130(x) x, BOOST_PP_SEQ_ENUM_129\n# define BOOST_PP_SEQ_ENUM_131(x) x, BOOST_PP_SEQ_ENUM_130\n# define BOOST_PP_SEQ_ENUM_132(x) x, BOOST_PP_SEQ_ENUM_131\n# define BOOST_PP_SEQ_ENUM_133(x) x, BOOST_PP_SEQ_ENUM_132\n# define BOOST_PP_SEQ_ENUM_134(x) x, BOOST_PP_SEQ_ENUM_133\n# define BOOST_PP_SEQ_ENUM_135(x) x, BOOST_PP_SEQ_ENUM_134\n# define BOOST_PP_SEQ_ENUM_136(x) x, BOOST_PP_SEQ_ENUM_135\n# define BOOST_PP_SEQ_ENUM_137(x) x, BOOST_PP_SEQ_ENUM_136\n# define BOOST_PP_SEQ_ENUM_138(x) x, BOOST_PP_SEQ_ENUM_137\n# define BOOST_PP_SEQ_ENUM_139(x) x, BOOST_PP_SEQ_ENUM_138\n# define BOOST_PP_SEQ_ENUM_140(x) x, BOOST_PP_SEQ_ENUM_139\n# define BOOST_PP_SEQ_ENUM_141(x) x, BOOST_PP_SEQ_ENUM_140\n# define BOOST_PP_SEQ_ENUM_142(x) x, BOOST_PP_SEQ_ENUM_141\n# define BOOST_PP_SEQ_ENUM_143(x) x, BOOST_PP_SEQ_ENUM_142\n# define BOOST_PP_SEQ_ENUM_144(x) x, BOOST_PP_SEQ_ENUM_143\n# define BOOST_PP_SEQ_ENUM_145(x) x, BOOST_PP_SEQ_ENUM_144\n# define BOOST_PP_SEQ_ENUM_146(x) x, BOOST_PP_SEQ_ENUM_145\n# define BOOST_PP_SEQ_ENUM_147(x) x, BOOST_PP_SEQ_ENUM_146\n# define BOOST_PP_SEQ_ENUM_148(x) x, BOOST_PP_SEQ_ENUM_147\n# define BOOST_PP_SEQ_ENUM_149(x) x, BOOST_PP_SEQ_ENUM_148\n# define BOOST_PP_SEQ_ENUM_150(x) x, BOOST_PP_SEQ_ENUM_149\n# define BOOST_PP_SEQ_ENUM_151(x) x, BOOST_PP_SEQ_ENUM_150\n# define BOOST_PP_SEQ_ENUM_152(x) x, BOOST_PP_SEQ_ENUM_151\n# define BOOST_PP_SEQ_ENUM_153(x) x, BOOST_PP_SEQ_ENUM_152\n# define BOOST_PP_SEQ_ENUM_154(x) x, BOOST_PP_SEQ_ENUM_153\n# define BOOST_PP_SEQ_ENUM_155(x) x, BOOST_PP_SEQ_ENUM_154\n# define BOOST_PP_SEQ_ENUM_156(x) x, BOOST_PP_SEQ_ENUM_155\n# define BOOST_PP_SEQ_ENUM_157(x) x, BOOST_PP_SEQ_ENUM_156\n# define BOOST_PP_SEQ_ENUM_158(x) x, BOOST_PP_SEQ_ENUM_157\n# define BOOST_PP_SEQ_ENUM_159(x) x, BOOST_PP_SEQ_ENUM_158\n# define BOOST_PP_SEQ_ENUM_160(x) x, BOOST_PP_SEQ_ENUM_159\n# define BOOST_PP_SEQ_ENUM_161(x) x, BOOST_PP_SEQ_ENUM_160\n# define BOOST_PP_SEQ_ENUM_162(x) x, BOOST_PP_SEQ_ENUM_161\n# define BOOST_PP_SEQ_ENUM_163(x) x, BOOST_PP_SEQ_ENUM_162\n# define BOOST_PP_SEQ_ENUM_164(x) x, BOOST_PP_SEQ_ENUM_163\n# define BOOST_PP_SEQ_ENUM_165(x) x, BOOST_PP_SEQ_ENUM_164\n# define BOOST_PP_SEQ_ENUM_166(x) x, BOOST_PP_SEQ_ENUM_165\n# define BOOST_PP_SEQ_ENUM_167(x) x, BOOST_PP_SEQ_ENUM_166\n# define BOOST_PP_SEQ_ENUM_168(x) x, BOOST_PP_SEQ_ENUM_167\n# define BOOST_PP_SEQ_ENUM_169(x) x, BOOST_PP_SEQ_ENUM_168\n# define BOOST_PP_SEQ_ENUM_170(x) x, BOOST_PP_SEQ_ENUM_169\n# define BOOST_PP_SEQ_ENUM_171(x) x, BOOST_PP_SEQ_ENUM_170\n# define BOOST_PP_SEQ_ENUM_172(x) x, BOOST_PP_SEQ_ENUM_171\n# define BOOST_PP_SEQ_ENUM_173(x) x, BOOST_PP_SEQ_ENUM_172\n# define BOOST_PP_SEQ_ENUM_174(x) x, BOOST_PP_SEQ_ENUM_173\n# define BOOST_PP_SEQ_ENUM_175(x) x, BOOST_PP_SEQ_ENUM_174\n# define BOOST_PP_SEQ_ENUM_176(x) x, BOOST_PP_SEQ_ENUM_175\n# define BOOST_PP_SEQ_ENUM_177(x) x, BOOST_PP_SEQ_ENUM_176\n# define BOOST_PP_SEQ_ENUM_178(x) x, BOOST_PP_SEQ_ENUM_177\n# define BOOST_PP_SEQ_ENUM_179(x) x, BOOST_PP_SEQ_ENUM_178\n# define BOOST_PP_SEQ_ENUM_180(x) x, BOOST_PP_SEQ_ENUM_179\n# define BOOST_PP_SEQ_ENUM_181(x) x, BOOST_PP_SEQ_ENUM_180\n# define BOOST_PP_SEQ_ENUM_182(x) x, BOOST_PP_SEQ_ENUM_181\n# define BOOST_PP_SEQ_ENUM_183(x) x, BOOST_PP_SEQ_ENUM_182\n# define BOOST_PP_SEQ_ENUM_184(x) x, BOOST_PP_SEQ_ENUM_183\n# define BOOST_PP_SEQ_ENUM_185(x) x, BOOST_PP_SEQ_ENUM_184\n# define BOOST_PP_SEQ_ENUM_186(x) x, BOOST_PP_SEQ_ENUM_185\n# define BOOST_PP_SEQ_ENUM_187(x) x, BOOST_PP_SEQ_ENUM_186\n# define BOOST_PP_SEQ_ENUM_188(x) x, BOOST_PP_SEQ_ENUM_187\n# define BOOST_PP_SEQ_ENUM_189(x) x, BOOST_PP_SEQ_ENUM_188\n# define BOOST_PP_SEQ_ENUM_190(x) x, BOOST_PP_SEQ_ENUM_189\n# define BOOST_PP_SEQ_ENUM_191(x) x, BOOST_PP_SEQ_ENUM_190\n# define BOOST_PP_SEQ_ENUM_192(x) x, BOOST_PP_SEQ_ENUM_191\n# define BOOST_PP_SEQ_ENUM_193(x) x, BOOST_PP_SEQ_ENUM_192\n# define BOOST_PP_SEQ_ENUM_194(x) x, BOOST_PP_SEQ_ENUM_193\n# define BOOST_PP_SEQ_ENUM_195(x) x, BOOST_PP_SEQ_ENUM_194\n# define BOOST_PP_SEQ_ENUM_196(x) x, BOOST_PP_SEQ_ENUM_195\n# define BOOST_PP_SEQ_ENUM_197(x) x, BOOST_PP_SEQ_ENUM_196\n# define BOOST_PP_SEQ_ENUM_198(x) x, BOOST_PP_SEQ_ENUM_197\n# define BOOST_PP_SEQ_ENUM_199(x) x, BOOST_PP_SEQ_ENUM_198\n# define BOOST_PP_SEQ_ENUM_200(x) x, BOOST_PP_SEQ_ENUM_199\n# define BOOST_PP_SEQ_ENUM_201(x) x, BOOST_PP_SEQ_ENUM_200\n# define BOOST_PP_SEQ_ENUM_202(x) x, BOOST_PP_SEQ_ENUM_201\n# define BOOST_PP_SEQ_ENUM_203(x) x, BOOST_PP_SEQ_ENUM_202\n# define BOOST_PP_SEQ_ENUM_204(x) x, BOOST_PP_SEQ_ENUM_203\n# define BOOST_PP_SEQ_ENUM_205(x) x, BOOST_PP_SEQ_ENUM_204\n# define BOOST_PP_SEQ_ENUM_206(x) x, BOOST_PP_SEQ_ENUM_205\n# define BOOST_PP_SEQ_ENUM_207(x) x, BOOST_PP_SEQ_ENUM_206\n# define BOOST_PP_SEQ_ENUM_208(x) x, BOOST_PP_SEQ_ENUM_207\n# define BOOST_PP_SEQ_ENUM_209(x) x, BOOST_PP_SEQ_ENUM_208\n# define BOOST_PP_SEQ_ENUM_210(x) x, BOOST_PP_SEQ_ENUM_209\n# define BOOST_PP_SEQ_ENUM_211(x) x, BOOST_PP_SEQ_ENUM_210\n# define BOOST_PP_SEQ_ENUM_212(x) x, BOOST_PP_SEQ_ENUM_211\n# define BOOST_PP_SEQ_ENUM_213(x) x, BOOST_PP_SEQ_ENUM_212\n# define BOOST_PP_SEQ_ENUM_214(x) x, BOOST_PP_SEQ_ENUM_213\n# define BOOST_PP_SEQ_ENUM_215(x) x, BOOST_PP_SEQ_ENUM_214\n# define BOOST_PP_SEQ_ENUM_216(x) x, BOOST_PP_SEQ_ENUM_215\n# define BOOST_PP_SEQ_ENUM_217(x) x, BOOST_PP_SEQ_ENUM_216\n# define BOOST_PP_SEQ_ENUM_218(x) x, BOOST_PP_SEQ_ENUM_217\n# define BOOST_PP_SEQ_ENUM_219(x) x, BOOST_PP_SEQ_ENUM_218\n# define BOOST_PP_SEQ_ENUM_220(x) x, BOOST_PP_SEQ_ENUM_219\n# define BOOST_PP_SEQ_ENUM_221(x) x, BOOST_PP_SEQ_ENUM_220\n# define BOOST_PP_SEQ_ENUM_222(x) x, BOOST_PP_SEQ_ENUM_221\n# define BOOST_PP_SEQ_ENUM_223(x) x, BOOST_PP_SEQ_ENUM_222\n# define BOOST_PP_SEQ_ENUM_224(x) x, BOOST_PP_SEQ_ENUM_223\n# define BOOST_PP_SEQ_ENUM_225(x) x, BOOST_PP_SEQ_ENUM_224\n# define BOOST_PP_SEQ_ENUM_226(x) x, BOOST_PP_SEQ_ENUM_225\n# define BOOST_PP_SEQ_ENUM_227(x) x, BOOST_PP_SEQ_ENUM_226\n# define BOOST_PP_SEQ_ENUM_228(x) x, BOOST_PP_SEQ_ENUM_227\n# define BOOST_PP_SEQ_ENUM_229(x) x, BOOST_PP_SEQ_ENUM_228\n# define BOOST_PP_SEQ_ENUM_230(x) x, BOOST_PP_SEQ_ENUM_229\n# define BOOST_PP_SEQ_ENUM_231(x) x, BOOST_PP_SEQ_ENUM_230\n# define BOOST_PP_SEQ_ENUM_232(x) x, BOOST_PP_SEQ_ENUM_231\n# define BOOST_PP_SEQ_ENUM_233(x) x, BOOST_PP_SEQ_ENUM_232\n# define BOOST_PP_SEQ_ENUM_234(x) x, BOOST_PP_SEQ_ENUM_233\n# define BOOST_PP_SEQ_ENUM_235(x) x, BOOST_PP_SEQ_ENUM_234\n# define BOOST_PP_SEQ_ENUM_236(x) x, BOOST_PP_SEQ_ENUM_235\n# define BOOST_PP_SEQ_ENUM_237(x) x, BOOST_PP_SEQ_ENUM_236\n# define BOOST_PP_SEQ_ENUM_238(x) x, BOOST_PP_SEQ_ENUM_237\n# define BOOST_PP_SEQ_ENUM_239(x) x, BOOST_PP_SEQ_ENUM_238\n# define BOOST_PP_SEQ_ENUM_240(x) x, BOOST_PP_SEQ_ENUM_239\n# define BOOST_PP_SEQ_ENUM_241(x) x, BOOST_PP_SEQ_ENUM_240\n# define BOOST_PP_SEQ_ENUM_242(x) x, BOOST_PP_SEQ_ENUM_241\n# define BOOST_PP_SEQ_ENUM_243(x) x, BOOST_PP_SEQ_ENUM_242\n# define BOOST_PP_SEQ_ENUM_244(x) x, BOOST_PP_SEQ_ENUM_243\n# define BOOST_PP_SEQ_ENUM_245(x) x, BOOST_PP_SEQ_ENUM_244\n# define BOOST_PP_SEQ_ENUM_246(x) x, BOOST_PP_SEQ_ENUM_245\n# define BOOST_PP_SEQ_ENUM_247(x) x, BOOST_PP_SEQ_ENUM_246\n# define BOOST_PP_SEQ_ENUM_248(x) x, BOOST_PP_SEQ_ENUM_247\n# define BOOST_PP_SEQ_ENUM_249(x) x, BOOST_PP_SEQ_ENUM_248\n# define BOOST_PP_SEQ_ENUM_250(x) x, BOOST_PP_SEQ_ENUM_249\n# define BOOST_PP_SEQ_ENUM_251(x) x, BOOST_PP_SEQ_ENUM_250\n# define BOOST_PP_SEQ_ENUM_252(x) x, BOOST_PP_SEQ_ENUM_251\n# define BOOST_PP_SEQ_ENUM_253(x) x, BOOST_PP_SEQ_ENUM_252\n# define BOOST_PP_SEQ_ENUM_254(x) x, BOOST_PP_SEQ_ENUM_253\n# define BOOST_PP_SEQ_ENUM_255(x) x, BOOST_PP_SEQ_ENUM_254\n# define BOOST_PP_SEQ_ENUM_256(x) x, BOOST_PP_SEQ_ENUM_255\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/seq/first_n.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_FIRST_N_HPP\n# define BOOST_PREPROCESSOR_SEQ_FIRST_N_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/if.hpp>\n# include <boost/preprocessor/seq/detail/split.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n#\n# /* BOOST_PP_SEQ_FIRST_N */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_FIRST_N(n, seq) BOOST_PP_IF(n, BOOST_PP_TUPLE_ELEM, BOOST_PP_TUPLE_EAT_3)(2, 0, BOOST_PP_SEQ_SPLIT(n, seq (nil)))\n# else\n#    define BOOST_PP_SEQ_FIRST_N(n, seq) BOOST_PP_SEQ_FIRST_N_I(n, seq)\n#    define BOOST_PP_SEQ_FIRST_N_I(n, seq) BOOST_PP_IF(n, BOOST_PP_TUPLE_ELEM, BOOST_PP_TUPLE_EAT_3)(2, 0, BOOST_PP_SEQ_SPLIT(n, seq (nil)))\n# endif\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/seq/fold_left.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_FOLD_LEFT_HPP\n# define BOOST_PREPROCESSOR_SEQ_FOLD_LEFT_HPP\n#\n# include <boost/preprocessor/arithmetic/dec.hpp>\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/control/if.hpp>\n# include <boost/preprocessor/debug/error.hpp>\n# include <boost/preprocessor/detail/auto_rec.hpp>\n# include <boost/preprocessor/seq/seq.hpp>\n# include <boost/preprocessor/seq/size.hpp>\n#\n# /* BOOST_PP_SEQ_FOLD_LEFT */\n#\n# if 0\n#    define BOOST_PP_SEQ_FOLD_LEFT(op, state, seq) ...\n# endif\n#\n# define BOOST_PP_SEQ_FOLD_LEFT BOOST_PP_CAT(BOOST_PP_SEQ_FOLD_LEFT_, BOOST_PP_AUTO_REC(BOOST_PP_SEQ_FOLD_LEFT_P, 256))\n# define BOOST_PP_SEQ_FOLD_LEFT_P(n) BOOST_PP_CAT(BOOST_PP_SEQ_FOLD_LEFT_CHECK_, BOOST_PP_SEQ_FOLD_LEFT_I_ ## n(BOOST_PP_SEQ_FOLD_LEFT_O, BOOST_PP_NIL, (nil), 1))\n# define BOOST_PP_SEQ_FOLD_LEFT_O(s, st, _) st\n#\n# define BOOST_PP_SEQ_FOLD_LEFT_257(op, st, ss) BOOST_PP_ERROR(0x0005)\n# define BOOST_PP_SEQ_FOLD_LEFT_I_257(op, st, ss, sz) BOOST_PP_ERROR(0x0005)\n#\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_NIL 1\n#\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_1(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_2(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_3(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_4(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_5(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_6(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_7(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_8(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_9(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_10(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_11(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_12(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_13(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_14(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_15(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_16(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_17(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_18(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_19(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_20(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_21(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_22(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_23(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_24(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_25(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_26(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_27(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_28(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_29(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_30(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_31(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_32(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_33(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_34(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_35(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_36(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_37(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_38(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_39(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_40(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_41(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_42(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_43(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_44(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_45(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_46(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_47(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_48(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_49(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_50(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_51(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_52(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_53(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_54(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_55(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_56(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_57(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_58(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_59(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_60(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_61(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_62(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_63(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_64(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_65(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_66(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_67(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_68(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_69(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_70(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_71(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_72(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_73(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_74(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_75(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_76(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_77(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_78(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_79(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_80(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_81(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_82(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_83(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_84(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_85(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_86(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_87(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_88(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_89(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_90(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_91(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_92(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_93(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_94(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_95(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_96(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_97(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_98(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_99(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_100(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_101(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_102(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_103(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_104(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_105(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_106(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_107(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_108(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_109(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_110(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_111(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_112(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_113(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_114(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_115(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_116(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_117(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_118(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_119(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_120(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_121(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_122(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_123(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_124(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_125(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_126(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_127(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_128(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_129(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_130(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_131(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_132(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_133(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_134(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_135(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_136(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_137(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_138(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_139(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_140(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_141(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_142(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_143(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_144(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_145(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_146(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_147(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_148(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_149(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_150(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_151(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_152(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_153(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_154(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_155(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_156(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_157(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_158(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_159(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_160(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_161(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_162(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_163(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_164(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_165(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_166(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_167(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_168(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_169(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_170(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_171(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_172(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_173(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_174(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_175(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_176(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_177(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_178(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_179(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_180(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_181(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_182(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_183(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_184(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_185(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_186(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_187(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_188(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_189(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_190(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_191(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_192(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_193(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_194(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_195(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_196(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_197(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_198(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_199(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_200(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_201(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_202(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_203(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_204(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_205(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_206(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_207(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_208(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_209(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_210(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_211(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_212(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_213(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_214(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_215(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_216(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_217(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_218(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_219(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_220(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_221(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_222(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_223(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_224(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_225(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_226(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_227(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_228(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_229(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_230(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_231(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_232(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_233(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_234(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_235(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_236(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_237(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_238(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_239(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_240(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_241(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_242(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_243(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_244(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_245(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_246(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_247(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_248(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_249(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_250(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_251(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_252(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_253(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_254(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_255(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_256(op, st, ss, sz) 0\n#\n# define BOOST_PP_SEQ_FOLD_LEFT_F(op, st, ss, sz) st\n#\n# define BOOST_PP_SEQ_FOLD_LEFT_1(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_1(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_2(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_2(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_3(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_3(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_4(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_4(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_5(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_5(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_6(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_6(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_7(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_7(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_8(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_8(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_9(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_9(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_10(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_10(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_11(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_11(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_12(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_12(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_13(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_13(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_14(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_14(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_15(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_15(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_16(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_16(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_17(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_17(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_18(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_18(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_19(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_19(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_20(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_20(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_21(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_21(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_22(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_22(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_23(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_23(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_24(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_24(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_25(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_25(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_26(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_26(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_27(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_27(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_28(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_28(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_29(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_29(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_30(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_30(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_31(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_31(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_32(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_32(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_33(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_33(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_34(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_34(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_35(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_35(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_36(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_36(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_37(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_37(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_38(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_38(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_39(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_39(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_40(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_40(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_41(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_41(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_42(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_42(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_43(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_43(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_44(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_44(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_45(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_45(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_46(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_46(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_47(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_47(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_48(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_48(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_49(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_49(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_50(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_50(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_51(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_51(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_52(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_52(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_53(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_53(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_54(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_54(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_55(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_55(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_56(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_56(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_57(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_57(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_58(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_58(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_59(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_59(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_60(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_60(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_61(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_61(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_62(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_62(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_63(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_63(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_64(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_64(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_65(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_65(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_66(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_66(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_67(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_67(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_68(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_68(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_69(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_69(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_70(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_70(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_71(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_71(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_72(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_72(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_73(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_73(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_74(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_74(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_75(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_75(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_76(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_76(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_77(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_77(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_78(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_78(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_79(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_79(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_80(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_80(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_81(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_81(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_82(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_82(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_83(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_83(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_84(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_84(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_85(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_85(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_86(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_86(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_87(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_87(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_88(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_88(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_89(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_89(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_90(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_90(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_91(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_91(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_92(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_92(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_93(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_93(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_94(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_94(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_95(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_95(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_96(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_96(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_97(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_97(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_98(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_98(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_99(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_99(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_100(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_100(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_101(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_101(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_102(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_102(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_103(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_103(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_104(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_104(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_105(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_105(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_106(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_106(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_107(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_107(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_108(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_108(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_109(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_109(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_110(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_110(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_111(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_111(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_112(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_112(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_113(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_113(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_114(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_114(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_115(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_115(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_116(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_116(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_117(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_117(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_118(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_118(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_119(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_119(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_120(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_120(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_121(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_121(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_122(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_122(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_123(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_123(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_124(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_124(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_125(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_125(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_126(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_126(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_127(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_127(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_128(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_128(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_129(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_129(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_130(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_130(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_131(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_131(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_132(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_132(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_133(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_133(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_134(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_134(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_135(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_135(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_136(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_136(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_137(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_137(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_138(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_138(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_139(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_139(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_140(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_140(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_141(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_141(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_142(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_142(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_143(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_143(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_144(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_144(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_145(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_145(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_146(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_146(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_147(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_147(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_148(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_148(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_149(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_149(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_150(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_150(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_151(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_151(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_152(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_152(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_153(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_153(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_154(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_154(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_155(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_155(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_156(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_156(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_157(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_157(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_158(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_158(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_159(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_159(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_160(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_160(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_161(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_161(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_162(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_162(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_163(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_163(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_164(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_164(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_165(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_165(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_166(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_166(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_167(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_167(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_168(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_168(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_169(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_169(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_170(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_170(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_171(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_171(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_172(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_172(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_173(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_173(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_174(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_174(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_175(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_175(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_176(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_176(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_177(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_177(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_178(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_178(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_179(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_179(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_180(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_180(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_181(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_181(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_182(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_182(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_183(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_183(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_184(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_184(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_185(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_185(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_186(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_186(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_187(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_187(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_188(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_188(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_189(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_189(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_190(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_190(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_191(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_191(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_192(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_192(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_193(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_193(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_194(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_194(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_195(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_195(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_196(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_196(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_197(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_197(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_198(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_198(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_199(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_199(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_200(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_200(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_201(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_201(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_202(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_202(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_203(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_203(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_204(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_204(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_205(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_205(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_206(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_206(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_207(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_207(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_208(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_208(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_209(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_209(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_210(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_210(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_211(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_211(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_212(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_212(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_213(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_213(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_214(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_214(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_215(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_215(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_216(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_216(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_217(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_217(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_218(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_218(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_219(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_219(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_220(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_220(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_221(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_221(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_222(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_222(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_223(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_223(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_224(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_224(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_225(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_225(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_226(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_226(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_227(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_227(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_228(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_228(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_229(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_229(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_230(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_230(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_231(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_231(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_232(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_232(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_233(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_233(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_234(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_234(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_235(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_235(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_236(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_236(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_237(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_237(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_238(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_238(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_239(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_239(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_240(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_240(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_241(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_241(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_242(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_242(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_243(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_243(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_244(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_244(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_245(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_245(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_246(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_246(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_247(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_247(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_248(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_248(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_249(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_249(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_250(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_250(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_251(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_251(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_252(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_252(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_253(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_253(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_254(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_254(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_255(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_255(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_256(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_256(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_1(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_2, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(2, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_2(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_3, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(3, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_3(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_4, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(4, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_4(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_5, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(5, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_5(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_6, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(6, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_6(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_7, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(7, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_7(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_8, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(8, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_8(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_9, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(9, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_9(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_10, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(10, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_10(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_11, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(11, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_11(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_12, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(12, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_12(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_13, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(13, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_13(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_14, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(14, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_14(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_15, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(15, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_15(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_16, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(16, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_16(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_17, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(17, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_17(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_18, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(18, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_18(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_19, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(19, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_19(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_20, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(20, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_20(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_21, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(21, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_21(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_22, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(22, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_22(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_23, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(23, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_23(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_24, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(24, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_24(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_25, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(25, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_25(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_26, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(26, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_26(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_27, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(27, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_27(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_28, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(28, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_28(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_29, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(29, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_29(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_30, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(30, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_30(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_31, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(31, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_31(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_32, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(32, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_32(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_33, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(33, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_33(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_34, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(34, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_34(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_35, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(35, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_35(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_36, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(36, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_36(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_37, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(37, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_37(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_38, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(38, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_38(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_39, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(39, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_39(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_40, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(40, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_40(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_41, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(41, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_41(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_42, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(42, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_42(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_43, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(43, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_43(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_44, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(44, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_44(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_45, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(45, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_45(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_46, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(46, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_46(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_47, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(47, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_47(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_48, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(48, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_48(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_49, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(49, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_49(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_50, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(50, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_50(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_51, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(51, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_51(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_52, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(52, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_52(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_53, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(53, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_53(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_54, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(54, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_54(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_55, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(55, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_55(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_56, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(56, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_56(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_57, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(57, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_57(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_58, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(58, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_58(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_59, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(59, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_59(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_60, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(60, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_60(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_61, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(61, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_61(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_62, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(62, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_62(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_63, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(63, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_63(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_64, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(64, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_64(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_65, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(65, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_65(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_66, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(66, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_66(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_67, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(67, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_67(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_68, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(68, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_68(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_69, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(69, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_69(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_70, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(70, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_70(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_71, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(71, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_71(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_72, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(72, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_72(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_73, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(73, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_73(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_74, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(74, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_74(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_75, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(75, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_75(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_76, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(76, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_76(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_77, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(77, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_77(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_78, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(78, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_78(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_79, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(79, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_79(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_80, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(80, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_80(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_81, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(81, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_81(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_82, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(82, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_82(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_83, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(83, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_83(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_84, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(84, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_84(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_85, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(85, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_85(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_86, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(86, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_86(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_87, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(87, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_87(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_88, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(88, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_88(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_89, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(89, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_89(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_90, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(90, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_90(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_91, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(91, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_91(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_92, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(92, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_92(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_93, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(93, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_93(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_94, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(94, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_94(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_95, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(95, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_95(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_96, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(96, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_96(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_97, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(97, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_97(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_98, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(98, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_98(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_99, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(99, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_99(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_100, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(100, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_100(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_101, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(101, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_101(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_102, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(102, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_102(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_103, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(103, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_103(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_104, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(104, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_104(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_105, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(105, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_105(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_106, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(106, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_106(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_107, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(107, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_107(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_108, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(108, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_108(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_109, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(109, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_109(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_110, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(110, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_110(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_111, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(111, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_111(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_112, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(112, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_112(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_113, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(113, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_113(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_114, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(114, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_114(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_115, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(115, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_115(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_116, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(116, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_116(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_117, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(117, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_117(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_118, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(118, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_118(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_119, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(119, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_119(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_120, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(120, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_120(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_121, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(121, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_121(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_122, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(122, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_122(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_123, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(123, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_123(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_124, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(124, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_124(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_125, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(125, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_125(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_126, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(126, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_126(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_127, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(127, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_127(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_128, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(128, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_128(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_129, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(129, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_129(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_130, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(130, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_130(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_131, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(131, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_131(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_132, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(132, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_132(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_133, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(133, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_133(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_134, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(134, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_134(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_135, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(135, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_135(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_136, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(136, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_136(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_137, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(137, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_137(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_138, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(138, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_138(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_139, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(139, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_139(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_140, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(140, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_140(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_141, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(141, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_141(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_142, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(142, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_142(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_143, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(143, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_143(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_144, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(144, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_144(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_145, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(145, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_145(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_146, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(146, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_146(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_147, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(147, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_147(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_148, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(148, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_148(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_149, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(149, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_149(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_150, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(150, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_150(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_151, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(151, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_151(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_152, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(152, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_152(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_153, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(153, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_153(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_154, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(154, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_154(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_155, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(155, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_155(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_156, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(156, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_156(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_157, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(157, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_157(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_158, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(158, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_158(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_159, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(159, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_159(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_160, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(160, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_160(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_161, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(161, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_161(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_162, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(162, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_162(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_163, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(163, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_163(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_164, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(164, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_164(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_165, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(165, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_165(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_166, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(166, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_166(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_167, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(167, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_167(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_168, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(168, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_168(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_169, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(169, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_169(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_170, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(170, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_170(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_171, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(171, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_171(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_172, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(172, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_172(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_173, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(173, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_173(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_174, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(174, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_174(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_175, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(175, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_175(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_176, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(176, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_176(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_177, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(177, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_177(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_178, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(178, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_178(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_179, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(179, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_179(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_180, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(180, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_180(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_181, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(181, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_181(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_182, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(182, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_182(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_183, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(183, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_183(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_184, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(184, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_184(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_185, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(185, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_185(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_186, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(186, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_186(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_187, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(187, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_187(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_188, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(188, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_188(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_189, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(189, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_189(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_190, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(190, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_190(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_191, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(191, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_191(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_192, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(192, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_192(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_193, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(193, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_193(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_194, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(194, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_194(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_195, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(195, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_195(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_196, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(196, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_196(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_197, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(197, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_197(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_198, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(198, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_198(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_199, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(199, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_199(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_200, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(200, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_200(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_201, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(201, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_201(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_202, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(202, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_202(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_203, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(203, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_203(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_204, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(204, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_204(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_205, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(205, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_205(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_206, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(206, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_206(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_207, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(207, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_207(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_208, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(208, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_208(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_209, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(209, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_209(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_210, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(210, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_210(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_211, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(211, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_211(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_212, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(212, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_212(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_213, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(213, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_213(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_214, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(214, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_214(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_215, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(215, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_215(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_216, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(216, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_216(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_217, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(217, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_217(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_218, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(218, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_218(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_219, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(219, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_219(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_220, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(220, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_220(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_221, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(221, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_221(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_222, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(222, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_222(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_223, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(223, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_223(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_224, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(224, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_224(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_225, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(225, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_225(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_226, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(226, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_226(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_227, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(227, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_227(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_228, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(228, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_228(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_229, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(229, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_229(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_230, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(230, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_230(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_231, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(231, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_231(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_232, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(232, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_232(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_233, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(233, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_233(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_234, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(234, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_234(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_235, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(235, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_235(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_236, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(236, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_236(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_237, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(237, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_237(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_238, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(238, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_238(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_239, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(239, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_239(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_240, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(240, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_240(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_241, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(241, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_241(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_242, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(242, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_242(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_243, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(243, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_243(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_244, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(244, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_244(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_245, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(245, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_245(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_246, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(246, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_246(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_247, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(247, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_247(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_248, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(248, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_248(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_249, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(249, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_249(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_250, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(250, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_250(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_251, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(251, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_251(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_252, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(252, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_252(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_253, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(253, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_253(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_254, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(254, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_254(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_255, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(255, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_255(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_256, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(256, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_256(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_257, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(257, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n# else\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_1(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_2, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(2, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_2(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_3, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(3, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_3(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_4, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(4, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_4(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_5, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(5, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_5(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_6, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(6, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_6(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_7, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(7, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_7(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_8, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(8, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_8(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_9, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(9, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_9(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_10, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(10, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_10(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_11, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(11, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_11(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_12, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(12, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_12(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_13, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(13, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_13(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_14, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(14, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_14(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_15, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(15, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_15(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_16, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(16, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_16(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_17, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(17, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_17(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_18, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(18, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_18(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_19, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(19, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_19(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_20, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(20, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_20(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_21, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(21, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_21(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_22, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(22, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_22(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_23, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(23, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_23(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_24, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(24, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_24(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_25, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(25, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_25(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_26, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(26, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_26(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_27, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(27, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_27(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_28, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(28, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_28(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_29, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(29, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_29(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_30, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(30, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_30(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_31, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(31, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_31(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_32, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(32, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_32(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_33, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(33, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_33(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_34, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(34, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_34(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_35, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(35, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_35(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_36, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(36, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_36(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_37, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(37, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_37(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_38, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(38, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_38(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_39, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(39, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_39(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_40, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(40, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_40(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_41, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(41, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_41(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_42, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(42, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_42(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_43, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(43, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_43(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_44, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(44, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_44(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_45, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(45, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_45(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_46, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(46, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_46(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_47, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(47, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_47(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_48, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(48, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_48(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_49, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(49, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_49(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_50, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(50, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_50(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_51, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(51, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_51(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_52, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(52, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_52(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_53, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(53, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_53(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_54, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(54, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_54(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_55, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(55, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_55(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_56, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(56, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_56(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_57, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(57, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_57(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_58, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(58, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_58(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_59, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(59, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_59(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_60, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(60, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_60(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_61, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(61, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_61(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_62, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(62, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_62(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_63, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(63, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_63(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_64, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(64, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_64(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_65, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(65, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_65(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_66, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(66, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_66(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_67, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(67, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_67(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_68, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(68, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_68(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_69, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(69, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_69(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_70, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(70, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_70(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_71, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(71, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_71(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_72, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(72, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_72(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_73, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(73, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_73(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_74, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(74, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_74(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_75, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(75, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_75(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_76, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(76, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_76(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_77, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(77, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_77(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_78, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(78, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_78(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_79, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(79, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_79(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_80, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(80, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_80(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_81, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(81, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_81(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_82, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(82, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_82(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_83, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(83, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_83(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_84, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(84, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_84(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_85, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(85, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_85(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_86, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(86, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_86(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_87, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(87, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_87(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_88, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(88, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_88(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_89, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(89, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_89(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_90, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(90, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_90(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_91, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(91, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_91(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_92, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(92, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_92(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_93, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(93, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_93(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_94, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(94, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_94(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_95, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(95, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_95(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_96, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(96, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_96(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_97, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(97, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_97(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_98, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(98, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_98(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_99, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(99, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_99(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_100, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(100, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_100(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_101, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(101, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_101(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_102, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(102, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_102(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_103, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(103, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_103(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_104, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(104, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_104(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_105, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(105, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_105(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_106, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(106, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_106(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_107, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(107, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_107(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_108, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(108, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_108(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_109, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(109, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_109(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_110, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(110, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_110(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_111, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(111, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_111(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_112, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(112, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_112(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_113, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(113, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_113(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_114, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(114, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_114(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_115, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(115, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_115(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_116, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(116, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_116(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_117, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(117, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_117(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_118, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(118, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_118(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_119, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(119, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_119(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_120, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(120, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_120(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_121, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(121, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_121(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_122, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(122, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_122(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_123, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(123, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_123(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_124, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(124, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_124(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_125, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(125, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_125(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_126, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(126, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_126(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_127, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(127, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_127(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_128, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(128, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_128(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_129, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(129, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_129(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_130, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(130, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_130(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_131, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(131, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_131(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_132, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(132, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_132(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_133, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(133, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_133(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_134, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(134, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_134(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_135, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(135, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_135(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_136, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(136, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_136(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_137, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(137, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_137(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_138, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(138, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_138(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_139, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(139, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_139(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_140, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(140, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_140(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_141, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(141, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_141(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_142, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(142, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_142(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_143, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(143, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_143(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_144, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(144, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_144(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_145, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(145, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_145(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_146, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(146, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_146(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_147, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(147, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_147(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_148, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(148, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_148(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_149, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(149, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_149(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_150, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(150, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_150(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_151, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(151, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_151(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_152, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(152, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_152(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_153, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(153, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_153(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_154, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(154, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_154(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_155, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(155, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_155(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_156, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(156, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_156(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_157, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(157, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_157(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_158, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(158, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_158(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_159, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(159, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_159(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_160, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(160, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_160(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_161, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(161, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_161(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_162, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(162, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_162(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_163, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(163, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_163(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_164, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(164, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_164(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_165, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(165, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_165(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_166, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(166, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_166(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_167, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(167, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_167(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_168, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(168, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_168(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_169, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(169, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_169(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_170, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(170, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_170(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_171, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(171, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_171(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_172, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(172, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_172(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_173, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(173, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_173(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_174, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(174, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_174(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_175, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(175, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_175(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_176, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(176, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_176(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_177, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(177, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_177(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_178, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(178, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_178(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_179, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(179, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_179(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_180, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(180, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_180(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_181, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(181, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_181(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_182, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(182, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_182(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_183, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(183, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_183(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_184, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(184, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_184(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_185, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(185, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_185(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_186, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(186, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_186(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_187, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(187, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_187(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_188, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(188, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_188(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_189, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(189, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_189(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_190, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(190, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_190(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_191, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(191, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_191(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_192, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(192, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_192(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_193, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(193, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_193(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_194, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(194, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_194(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_195, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(195, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_195(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_196, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(196, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_196(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_197, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(197, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_197(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_198, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(198, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_198(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_199, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(199, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_199(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_200, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(200, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_200(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_201, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(201, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_201(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_202, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(202, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_202(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_203, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(203, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_203(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_204, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(204, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_204(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_205, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(205, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_205(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_206, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(206, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_206(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_207, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(207, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_207(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_208, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(208, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_208(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_209, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(209, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_209(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_210, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(210, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_210(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_211, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(211, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_211(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_212, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(212, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_212(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_213, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(213, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_213(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_214, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(214, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_214(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_215, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(215, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_215(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_216, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(216, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_216(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_217, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(217, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_217(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_218, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(218, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_218(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_219, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(219, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_219(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_220, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(220, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_220(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_221, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(221, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_221(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_222, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(222, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_222(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_223, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(223, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_223(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_224, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(224, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_224(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_225, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(225, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_225(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_226, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(226, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_226(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_227, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(227, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_227(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_228, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(228, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_228(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_229, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(229, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_229(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_230, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(230, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_230(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_231, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(231, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_231(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_232, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(232, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_232(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_233, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(233, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_233(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_234, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(234, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_234(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_235, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(235, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_235(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_236, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(236, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_236(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_237, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(237, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_237(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_238, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(238, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_238(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_239, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(239, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_239(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_240, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(240, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_240(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_241, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(241, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_241(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_242, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(242, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_242(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_243, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(243, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_243(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_244, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(244, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_244(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_245, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(245, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_245(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_246, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(246, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_246(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_247, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(247, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_247(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_248, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(248, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_248(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_249, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(249, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_249(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_250, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(250, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_250(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_251, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(251, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_251(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_252, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(252, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_252(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_253, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(253, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_253(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_254, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(254, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_254(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_255, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(255, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_255(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_256, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(256, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_256(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_257, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(257, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n# endif\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/seq/for_each.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_FOR_EACH_HPP\n# define BOOST_PREPROCESSOR_SEQ_FOR_EACH_HPP\n#\n# include <boost/preprocessor/arithmetic/dec.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/if.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/repetition/for.hpp>\n# include <boost/preprocessor/seq/seq.hpp>\n# include <boost/preprocessor/seq/size.hpp>\n# include <boost/preprocessor/seq/detail/is_empty.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n#\n# /* BOOST_PP_SEQ_FOR_EACH */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_FOR_EACH(macro, data, seq) BOOST_PP_SEQ_FOR_EACH_DETAIL_CHECK(macro, data, seq)\n# else\n#    define BOOST_PP_SEQ_FOR_EACH(macro, data, seq) BOOST_PP_SEQ_FOR_EACH_D(macro, data, seq)\n#    define BOOST_PP_SEQ_FOR_EACH_D(macro, data, seq) BOOST_PP_SEQ_FOR_EACH_DETAIL_CHECK(macro, data, seq)\n# endif\n#\n#    define BOOST_PP_SEQ_FOR_EACH_DETAIL_CHECK_EXEC(macro, data, seq) BOOST_PP_FOR((macro, data, seq, BOOST_PP_SEQ_SIZE(seq)), BOOST_PP_SEQ_FOR_EACH_P, BOOST_PP_SEQ_FOR_EACH_O, BOOST_PP_SEQ_FOR_EACH_M)\n#    define BOOST_PP_SEQ_FOR_EACH_DETAIL_CHECK_EMPTY(macro, data, seq)\n#\n#    define BOOST_PP_SEQ_FOR_EACH_DETAIL_CHECK(macro, data, seq) \\\n\t\tBOOST_PP_IIF \\\n\t\t\t( \\\n\t\t\tBOOST_PP_SEQ_DETAIL_IS_NOT_EMPTY(seq), \\\n\t\t\tBOOST_PP_SEQ_FOR_EACH_DETAIL_CHECK_EXEC, \\\n\t\t\tBOOST_PP_SEQ_FOR_EACH_DETAIL_CHECK_EMPTY \\\n\t\t\t) \\\n\t\t(macro, data, seq) \\\n/**/\n#\n# define BOOST_PP_SEQ_FOR_EACH_P(r, x) BOOST_PP_TUPLE_ELEM(4, 3, x)\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()\n#    define BOOST_PP_SEQ_FOR_EACH_O(r, x) BOOST_PP_SEQ_FOR_EACH_O_I x\n# else\n#    define BOOST_PP_SEQ_FOR_EACH_O(r, x) BOOST_PP_SEQ_FOR_EACH_O_I(BOOST_PP_TUPLE_ELEM(4, 0, x), BOOST_PP_TUPLE_ELEM(4, 1, x), BOOST_PP_TUPLE_ELEM(4, 2, x), BOOST_PP_TUPLE_ELEM(4, 3, x))\n# endif\n#\n# define BOOST_PP_SEQ_FOR_EACH_O_I(macro, data, seq, sz) \\\n\tBOOST_PP_SEQ_FOR_EACH_O_I_DEC(macro, data, seq, BOOST_PP_DEC(sz)) \\\n/**/\n# define BOOST_PP_SEQ_FOR_EACH_O_I_DEC(macro, data, seq, sz) \\\n\t( \\\n\tmacro, \\\n\tdata, \\\n\tBOOST_PP_IF \\\n\t\t( \\\n\t\tsz, \\\n\t\tBOOST_PP_SEQ_FOR_EACH_O_I_TAIL, \\\n\t\tBOOST_PP_SEQ_FOR_EACH_O_I_NIL \\\n\t\t) \\\n\t(seq), \\\n\tsz \\\n\t) \\\n/**/\n# define BOOST_PP_SEQ_FOR_EACH_O_I_TAIL(seq) BOOST_PP_SEQ_TAIL(seq)\n# define BOOST_PP_SEQ_FOR_EACH_O_I_NIL(seq) BOOST_PP_NIL\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()\n#    define BOOST_PP_SEQ_FOR_EACH_M(r, x) BOOST_PP_SEQ_FOR_EACH_M_IM(r, BOOST_PP_TUPLE_REM_4 x)\n#    define BOOST_PP_SEQ_FOR_EACH_M_IM(r, im) BOOST_PP_SEQ_FOR_EACH_M_I(r, im)\n# else\n#    define BOOST_PP_SEQ_FOR_EACH_M(r, x) BOOST_PP_SEQ_FOR_EACH_M_I(r, BOOST_PP_TUPLE_ELEM(4, 0, x), BOOST_PP_TUPLE_ELEM(4, 1, x), BOOST_PP_TUPLE_ELEM(4, 2, x), BOOST_PP_TUPLE_ELEM(4, 3, x))\n# endif\n#\n# define BOOST_PP_SEQ_FOR_EACH_M_I(r, macro, data, seq, sz) macro(r, data, BOOST_PP_SEQ_HEAD(seq))\n#\n# /* BOOST_PP_SEQ_FOR_EACH_R */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_FOR_EACH_R(r, macro, data, seq) BOOST_PP_SEQ_FOR_EACH_DETAIL_CHECK_R(r, macro, data, seq)\n# else\n#    define BOOST_PP_SEQ_FOR_EACH_R(r, macro, data, seq) BOOST_PP_SEQ_FOR_EACH_R_I(r, macro, data, seq)\n#    define BOOST_PP_SEQ_FOR_EACH_R_I(r, macro, data, seq) BOOST_PP_SEQ_FOR_EACH_DETAIL_CHECK_R(r, macro, data, seq)\n# endif\n#\n#    define BOOST_PP_SEQ_FOR_EACH_DETAIL_CHECK_EXEC_R(r, macro, data, seq) BOOST_PP_FOR_ ## r((macro, data, seq, BOOST_PP_SEQ_SIZE(seq)), BOOST_PP_SEQ_FOR_EACH_P, BOOST_PP_SEQ_FOR_EACH_O, BOOST_PP_SEQ_FOR_EACH_M)\n#    define BOOST_PP_SEQ_FOR_EACH_DETAIL_CHECK_EMPTY_R(r, macro, data, seq)\n#\n#    define BOOST_PP_SEQ_FOR_EACH_DETAIL_CHECK_R(r, macro, data, seq) \\\n\t\tBOOST_PP_IIF \\\n\t\t\t( \\\n\t\t\tBOOST_PP_SEQ_DETAIL_IS_NOT_EMPTY(seq), \\\n\t\t\tBOOST_PP_SEQ_FOR_EACH_DETAIL_CHECK_EXEC_R, \\\n\t\t\tBOOST_PP_SEQ_FOR_EACH_DETAIL_CHECK_EMPTY_R \\\n\t\t\t) \\\n\t\t(r, macro, data, seq) \\\n/**/\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/seq/for_each_i.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_FOR_EACH_I_HPP\n# define BOOST_PREPROCESSOR_SEQ_FOR_EACH_I_HPP\n#\n# include <boost/preprocessor/arithmetic/dec.hpp>\n# include <boost/preprocessor/arithmetic/inc.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/if.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/repetition/for.hpp>\n# include <boost/preprocessor/seq/seq.hpp>\n# include <boost/preprocessor/seq/size.hpp>\n# include <boost/preprocessor/seq/detail/is_empty.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n#\n# /* BOOST_PP_SEQ_FOR_EACH_I */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_FOR_EACH_I(macro, data, seq) BOOST_PP_SEQ_FOR_EACH_I_DETAIL_CHECK(macro, data, seq)\n# else\n#    define BOOST_PP_SEQ_FOR_EACH_I(macro, data, seq) BOOST_PP_SEQ_FOR_EACH_I_I(macro, data, seq)\n#    define BOOST_PP_SEQ_FOR_EACH_I_I(macro, data, seq) BOOST_PP_SEQ_FOR_EACH_I_DETAIL_CHECK(macro, data, seq)\n# endif\n#\n#    define BOOST_PP_SEQ_FOR_EACH_I_DETAIL_CHECK_EXEC(macro, data, seq) BOOST_PP_FOR((macro, data, seq, 0, BOOST_PP_SEQ_SIZE(seq)), BOOST_PP_SEQ_FOR_EACH_I_P, BOOST_PP_SEQ_FOR_EACH_I_O, BOOST_PP_SEQ_FOR_EACH_I_M)\n#    define BOOST_PP_SEQ_FOR_EACH_I_DETAIL_CHECK_EMPTY(macro, data, seq)\n#\n#    define BOOST_PP_SEQ_FOR_EACH_I_DETAIL_CHECK(macro, data, seq) \\\n\t\tBOOST_PP_IIF \\\n\t\t\t( \\\n\t\t\tBOOST_PP_SEQ_DETAIL_IS_NOT_EMPTY(seq), \\\n\t\t\tBOOST_PP_SEQ_FOR_EACH_I_DETAIL_CHECK_EXEC, \\\n\t\t\tBOOST_PP_SEQ_FOR_EACH_I_DETAIL_CHECK_EMPTY \\\n\t\t\t) \\\n\t\t(macro, data, seq) \\\n/**/\n#\n# define BOOST_PP_SEQ_FOR_EACH_I_P(r, x) BOOST_PP_TUPLE_ELEM(5, 4, x)\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()\n#    define BOOST_PP_SEQ_FOR_EACH_I_O(r, x) BOOST_PP_SEQ_FOR_EACH_I_O_I x\n# else\n#    define BOOST_PP_SEQ_FOR_EACH_I_O(r, x) BOOST_PP_SEQ_FOR_EACH_I_O_I(BOOST_PP_TUPLE_ELEM(5, 0, x), BOOST_PP_TUPLE_ELEM(5, 1, x), BOOST_PP_TUPLE_ELEM(5, 2, x), BOOST_PP_TUPLE_ELEM(5, 3, x), BOOST_PP_TUPLE_ELEM(5, 4, x))\n# endif\n#\n# define BOOST_PP_SEQ_FOR_EACH_I_O_I(macro, data, seq, i, sz) \\\n\tBOOST_PP_SEQ_FOR_EACH_I_O_I_DEC(macro, data, seq, i, BOOST_PP_DEC(sz)) \\\n/**/\n# define BOOST_PP_SEQ_FOR_EACH_I_O_I_DEC(macro, data, seq, i, sz) \\\n\t( \\\n\tmacro, \\\n\tdata, \\\n\tBOOST_PP_IF \\\n\t\t( \\\n\t\tsz, \\\n\t\tBOOST_PP_SEQ_FOR_EACH_I_O_I_TAIL, \\\n\t\tBOOST_PP_SEQ_FOR_EACH_I_O_I_NIL \\\n\t\t) \\\n\t(seq), \\\n\tBOOST_PP_INC(i), \\\n\tsz \\\n\t) \\\n/**/\n# define BOOST_PP_SEQ_FOR_EACH_I_O_I_TAIL(seq) BOOST_PP_SEQ_TAIL(seq)\n# define BOOST_PP_SEQ_FOR_EACH_I_O_I_NIL(seq) BOOST_PP_NIL\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()\n#    define BOOST_PP_SEQ_FOR_EACH_I_M(r, x) BOOST_PP_SEQ_FOR_EACH_I_M_IM(r, BOOST_PP_TUPLE_REM_5 x)\n#    define BOOST_PP_SEQ_FOR_EACH_I_M_IM(r, im) BOOST_PP_SEQ_FOR_EACH_I_M_I(r, im)\n# else\n#    define BOOST_PP_SEQ_FOR_EACH_I_M(r, x) BOOST_PP_SEQ_FOR_EACH_I_M_I(r, BOOST_PP_TUPLE_ELEM(5, 0, x), BOOST_PP_TUPLE_ELEM(5, 1, x), BOOST_PP_TUPLE_ELEM(5, 2, x), BOOST_PP_TUPLE_ELEM(5, 3, x), BOOST_PP_TUPLE_ELEM(5, 4, x))\n# endif\n#\n# define BOOST_PP_SEQ_FOR_EACH_I_M_I(r, macro, data, seq, i, sz) macro(r, data, i, BOOST_PP_SEQ_HEAD(seq))\n#\n# /* BOOST_PP_SEQ_FOR_EACH_I_R */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_FOR_EACH_I_R(r, macro, data, seq) BOOST_PP_SEQ_FOR_EACH_I_R_DETAIL_CHECK(r, macro, data, seq)\n# else\n#    define BOOST_PP_SEQ_FOR_EACH_I_R(r, macro, data, seq) BOOST_PP_SEQ_FOR_EACH_I_R_I(r, macro, data, seq)\n#    define BOOST_PP_SEQ_FOR_EACH_I_R_I(r, macro, data, seq) BOOST_PP_SEQ_FOR_EACH_I_R_DETAIL_CHECK(r, macro, data, seq)\n# endif\n#\n#    define BOOST_PP_SEQ_FOR_EACH_I_R_DETAIL_CHECK_EXEC(r, macro, data, seq) BOOST_PP_FOR_ ## r((macro, data, seq, 0, BOOST_PP_SEQ_SIZE(seq)), BOOST_PP_SEQ_FOR_EACH_I_P, BOOST_PP_SEQ_FOR_EACH_I_O, BOOST_PP_SEQ_FOR_EACH_I_M)\n#    define BOOST_PP_SEQ_FOR_EACH_I_R_DETAIL_CHECK_EMPTY(r, macro, data, seq)\n#\n#    define BOOST_PP_SEQ_FOR_EACH_I_R_DETAIL_CHECK(r, macro, data, seq) \\\n\t\tBOOST_PP_IIF \\\n\t\t\t( \\\n\t\t\tBOOST_PP_SEQ_DETAIL_IS_NOT_EMPTY(seq), \\\n\t\t\tBOOST_PP_SEQ_FOR_EACH_I_R_DETAIL_CHECK_EXEC, \\\n\t\t\tBOOST_PP_SEQ_FOR_EACH_I_R_DETAIL_CHECK_EMPTY \\\n\t\t\t) \\\n\t\t(r, macro, data, seq) \\\n/**/\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/seq/for_each_product.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_FOR_EACH_PRODUCT_HPP\n# define BOOST_PREPROCESSOR_SEQ_FOR_EACH_PRODUCT_HPP\n#\n# include <boost/preprocessor/arithmetic/dec.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/if.hpp>\n# include <boost/preprocessor/repetition/for.hpp>\n# include <boost/preprocessor/seq/seq.hpp>\n# include <boost/preprocessor/seq/size.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n#\n# /* BOOST_PP_SEQ_FOR_EACH_PRODUCT */\n#\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT(macro, sets) BOOST_PP_SEQ_FOR_EACH_PRODUCT_E(BOOST_PP_FOR, macro, sets)\n#\n# /* BOOST_PP_SEQ_FOR_EACH_PRODUCT_R */\n#\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_R(r, macro, sets) BOOST_PP_SEQ_FOR_EACH_PRODUCT_E(BOOST_PP_FOR_ ## r, macro, sets)\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_E(impl, macro, sets) impl((BOOST_PP_SEQ_HEAD(sets)(nil), BOOST_PP_SEQ_TAIL(sets)(nil), (nil), macro), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_0)\n# else\n#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_E(impl, macro, sets) BOOST_PP_SEQ_FOR_EACH_PRODUCT_E_I(impl, macro, sets)\n#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_E_I(impl, macro, sets) impl((BOOST_PP_SEQ_HEAD(sets)(nil), BOOST_PP_SEQ_TAIL(sets)(nil), (nil), macro), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_0)\n# endif\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()\n#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_P(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_P_I data\n#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_P_I(cset, rset, res, macro) BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(cset))\n# else\n#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_P(r, data) BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(BOOST_PP_TUPLE_ELEM(4, 0, data)))\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_O(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_O_I data\n#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_O_I(cset, rset, res, macro) (BOOST_PP_SEQ_TAIL(cset), rset, res, macro)\n# else\n#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_O(r, data) (BOOST_PP_SEQ_TAIL(BOOST_PP_TUPLE_ELEM(4, 0, data)), BOOST_PP_TUPLE_ELEM(4, 1, data), BOOST_PP_TUPLE_ELEM(4, 2, data), BOOST_PP_TUPLE_ELEM(4, 3, data))\n# endif\n#\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, i) BOOST_PP_IF(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(BOOST_PP_TUPLE_ELEM(4, 1, data))), BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_ ## i, BOOST_PP_SEQ_FOR_EACH_PRODUCT_I)\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_I(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_I_I(r, BOOST_PP_TUPLE_ELEM(4, 0, data), BOOST_PP_TUPLE_ELEM(4, 1, data), BOOST_PP_TUPLE_ELEM(4, 2, data), BOOST_PP_TUPLE_ELEM(4, 3, data))\n# else\n#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_I(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_I_IM(r, BOOST_PP_TUPLE_REM_4 data)\n#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_I_IM(r, im) BOOST_PP_SEQ_FOR_EACH_PRODUCT_I_I(r, im)\n# endif\n#\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_I_I(r, cset, rset, res, macro) macro(r, BOOST_PP_SEQ_TAIL(res (BOOST_PP_SEQ_HEAD(cset))))\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_H_I data\n# else\n#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_H_I(BOOST_PP_TUPLE_ELEM(4, 0, data), BOOST_PP_TUPLE_ELEM(4, 1, data), BOOST_PP_TUPLE_ELEM(4, 2, data), BOOST_PP_TUPLE_ELEM(4, 3, data))\n# endif\n#\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_H_I(cset, rset, res, macro) (BOOST_PP_SEQ_HEAD(rset)(nil), BOOST_PP_SEQ_TAIL(rset), res (BOOST_PP_SEQ_HEAD(cset)), macro)\n#\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_0(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 0)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_1(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 1)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_2(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 2)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_3(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 3)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_4(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 4)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_5(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 5)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_6(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 6)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_7(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 7)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_8(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 8)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_9(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 9)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_10(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 10)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_11(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 11)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_12(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 12)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_13(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 13)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_14(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 14)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_15(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 15)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_16(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 16)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_17(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 17)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_18(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 18)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_19(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 19)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_20(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 20)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_21(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 21)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_22(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 22)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_23(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 23)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_24(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 24)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_25(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 25)(r, data)\n#\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_0(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_1)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_1(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_2)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_2(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_3)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_3(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_4)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_4(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_5)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_5(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_6)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_6(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_7)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_7(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_8)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_8(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_9)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_9(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_10)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_10(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_11)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_11(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_12)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_12(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_13)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_13(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_14)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_14(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_15)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_15(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_16)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_16(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_17)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_17(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_18)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_18(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_19)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_19(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_20)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_20(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_21)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_21(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_22)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_22(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_23)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_23(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_24)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_24(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_25)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_25(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_26)\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/seq/push_back.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_PUSH_BACK_HPP\n# define BOOST_PREPROCESSOR_SEQ_PUSH_BACK_HPP\n#\n# /* BOOST_PP_SEQ_PUSH_BACK */\n#\n# define BOOST_PP_SEQ_PUSH_BACK(seq, elem) seq(elem)\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/seq/rest_n.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_REST_N_HPP\n# define BOOST_PREPROCESSOR_SEQ_REST_N_HPP\n#\n# include <boost/preprocessor/arithmetic/inc.hpp>\n# include <boost/preprocessor/comparison/not_equal.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/expr_iif.hpp>\n# include <boost/preprocessor/facilities/identity.hpp>\n# include <boost/preprocessor/logical/bitand.hpp>\n# include <boost/preprocessor/seq/detail/is_empty.hpp>\n# include <boost/preprocessor/seq/detail/split.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n#\n# /* BOOST_PP_SEQ_REST_N */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_REST_N(n, seq) BOOST_PP_SEQ_REST_N_DETAIL_EXEC(n, seq, BOOST_PP_SEQ_DETAIL_EMPTY_SIZE(seq))\n# else\n#    define BOOST_PP_SEQ_REST_N(n, seq) BOOST_PP_SEQ_REST_N_I(n, seq)\n#    define BOOST_PP_SEQ_REST_N_I(n, seq) BOOST_PP_SEQ_REST_N_DETAIL_EXEC(n, seq, BOOST_PP_SEQ_DETAIL_EMPTY_SIZE(seq))\n# endif\n#\n#    define BOOST_PP_SEQ_REST_N_DETAIL_EXEC(n, seq, size) \\\n\t\tBOOST_PP_EXPR_IIF \\\n\t\t\t( \\\n\t\t\tBOOST_PP_BITAND \\\n\t\t\t\t( \\\n\t\t\t\tBOOST_PP_SEQ_DETAIL_IS_NOT_EMPTY_SIZE(size), \\\n\t\t\t\tBOOST_PP_NOT_EQUAL(n,size) \\\n\t\t\t\t), \\\n\t\t\tBOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_SEQ_SPLIT(BOOST_PP_INC(n), BOOST_PP_IDENTITY( (nil) seq )))() \\\n\t\t\t) \\\n/**/\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/seq/seq.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_SEQ_HPP\n# define BOOST_PREPROCESSOR_SEQ_SEQ_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/seq/elem.hpp>\n#\n# /* BOOST_PP_SEQ_HEAD */\n#\n# define BOOST_PP_SEQ_HEAD(seq) BOOST_PP_SEQ_ELEM(0, seq)\n#\n# /* BOOST_PP_SEQ_TAIL */\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_SEQ_TAIL(seq) BOOST_PP_SEQ_TAIL_1((seq))\n#    define BOOST_PP_SEQ_TAIL_1(par) BOOST_PP_SEQ_TAIL_2 ## par\n#    define BOOST_PP_SEQ_TAIL_2(seq) BOOST_PP_SEQ_TAIL_I ## seq\n# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    define BOOST_PP_SEQ_TAIL(seq) BOOST_PP_SEQ_TAIL_ID(BOOST_PP_SEQ_TAIL_I seq)\n#    define BOOST_PP_SEQ_TAIL_ID(id) id\n# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_TAIL(seq) BOOST_PP_SEQ_TAIL_D(seq)\n#    define BOOST_PP_SEQ_TAIL_D(seq) BOOST_PP_SEQ_TAIL_I seq\n# else\n#    define BOOST_PP_SEQ_TAIL(seq) BOOST_PP_SEQ_TAIL_I seq\n# endif\n#\n# define BOOST_PP_SEQ_TAIL_I(x)\n#\n# /* BOOST_PP_SEQ_NIL */\n#\n# define BOOST_PP_SEQ_NIL(x) (x)\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/seq/size.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_SIZE_HPP\n# define BOOST_PREPROCESSOR_SEQ_SIZE_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_SEQ_SIZE(seq) BOOST_PP_SEQ_SIZE_I((seq))\n#    define BOOST_PP_SEQ_SIZE_I(par) BOOST_PP_SEQ_SIZE_II ## par\n#    define BOOST_PP_SEQ_SIZE_II(seq) BOOST_PP_CAT(BOOST_PP_SEQ_SIZE_, BOOST_PP_SEQ_SIZE_0 ## seq)\n# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG() || BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    define BOOST_PP_SEQ_SIZE(seq) BOOST_PP_SEQ_SIZE_I(seq)\n#    define BOOST_PP_SEQ_SIZE_I(seq) BOOST_PP_CAT(BOOST_PP_SEQ_SIZE_, BOOST_PP_SEQ_SIZE_0 seq)\n# elif defined(__IBMC__) || defined(__IBMCPP__)\n#    define BOOST_PP_SEQ_SIZE(seq) BOOST_PP_CAT(BOOST_PP_SEQ_SIZE_, BOOST_PP_CAT(BOOST_PP_SEQ_SIZE_0, seq))\n# else\n#    define BOOST_PP_SEQ_SIZE(seq) BOOST_PP_CAT(BOOST_PP_SEQ_SIZE_, BOOST_PP_SEQ_SIZE_0 seq)\n# endif\n#\n# define BOOST_PP_SEQ_SIZE_0(_) BOOST_PP_SEQ_SIZE_1\n# define BOOST_PP_SEQ_SIZE_1(_) BOOST_PP_SEQ_SIZE_2\n# define BOOST_PP_SEQ_SIZE_2(_) BOOST_PP_SEQ_SIZE_3\n# define BOOST_PP_SEQ_SIZE_3(_) BOOST_PP_SEQ_SIZE_4\n# define BOOST_PP_SEQ_SIZE_4(_) BOOST_PP_SEQ_SIZE_5\n# define BOOST_PP_SEQ_SIZE_5(_) BOOST_PP_SEQ_SIZE_6\n# define BOOST_PP_SEQ_SIZE_6(_) BOOST_PP_SEQ_SIZE_7\n# define BOOST_PP_SEQ_SIZE_7(_) BOOST_PP_SEQ_SIZE_8\n# define BOOST_PP_SEQ_SIZE_8(_) BOOST_PP_SEQ_SIZE_9\n# define BOOST_PP_SEQ_SIZE_9(_) BOOST_PP_SEQ_SIZE_10\n# define BOOST_PP_SEQ_SIZE_10(_) BOOST_PP_SEQ_SIZE_11\n# define BOOST_PP_SEQ_SIZE_11(_) BOOST_PP_SEQ_SIZE_12\n# define BOOST_PP_SEQ_SIZE_12(_) BOOST_PP_SEQ_SIZE_13\n# define BOOST_PP_SEQ_SIZE_13(_) BOOST_PP_SEQ_SIZE_14\n# define BOOST_PP_SEQ_SIZE_14(_) BOOST_PP_SEQ_SIZE_15\n# define BOOST_PP_SEQ_SIZE_15(_) BOOST_PP_SEQ_SIZE_16\n# define BOOST_PP_SEQ_SIZE_16(_) BOOST_PP_SEQ_SIZE_17\n# define BOOST_PP_SEQ_SIZE_17(_) BOOST_PP_SEQ_SIZE_18\n# define BOOST_PP_SEQ_SIZE_18(_) BOOST_PP_SEQ_SIZE_19\n# define BOOST_PP_SEQ_SIZE_19(_) BOOST_PP_SEQ_SIZE_20\n# define BOOST_PP_SEQ_SIZE_20(_) BOOST_PP_SEQ_SIZE_21\n# define BOOST_PP_SEQ_SIZE_21(_) BOOST_PP_SEQ_SIZE_22\n# define BOOST_PP_SEQ_SIZE_22(_) BOOST_PP_SEQ_SIZE_23\n# define BOOST_PP_SEQ_SIZE_23(_) BOOST_PP_SEQ_SIZE_24\n# define BOOST_PP_SEQ_SIZE_24(_) BOOST_PP_SEQ_SIZE_25\n# define BOOST_PP_SEQ_SIZE_25(_) BOOST_PP_SEQ_SIZE_26\n# define BOOST_PP_SEQ_SIZE_26(_) BOOST_PP_SEQ_SIZE_27\n# define BOOST_PP_SEQ_SIZE_27(_) BOOST_PP_SEQ_SIZE_28\n# define BOOST_PP_SEQ_SIZE_28(_) BOOST_PP_SEQ_SIZE_29\n# define BOOST_PP_SEQ_SIZE_29(_) BOOST_PP_SEQ_SIZE_30\n# define BOOST_PP_SEQ_SIZE_30(_) BOOST_PP_SEQ_SIZE_31\n# define BOOST_PP_SEQ_SIZE_31(_) BOOST_PP_SEQ_SIZE_32\n# define BOOST_PP_SEQ_SIZE_32(_) BOOST_PP_SEQ_SIZE_33\n# define BOOST_PP_SEQ_SIZE_33(_) BOOST_PP_SEQ_SIZE_34\n# define BOOST_PP_SEQ_SIZE_34(_) BOOST_PP_SEQ_SIZE_35\n# define BOOST_PP_SEQ_SIZE_35(_) BOOST_PP_SEQ_SIZE_36\n# define BOOST_PP_SEQ_SIZE_36(_) BOOST_PP_SEQ_SIZE_37\n# define BOOST_PP_SEQ_SIZE_37(_) BOOST_PP_SEQ_SIZE_38\n# define BOOST_PP_SEQ_SIZE_38(_) BOOST_PP_SEQ_SIZE_39\n# define BOOST_PP_SEQ_SIZE_39(_) BOOST_PP_SEQ_SIZE_40\n# define BOOST_PP_SEQ_SIZE_40(_) BOOST_PP_SEQ_SIZE_41\n# define BOOST_PP_SEQ_SIZE_41(_) BOOST_PP_SEQ_SIZE_42\n# define BOOST_PP_SEQ_SIZE_42(_) BOOST_PP_SEQ_SIZE_43\n# define BOOST_PP_SEQ_SIZE_43(_) BOOST_PP_SEQ_SIZE_44\n# define BOOST_PP_SEQ_SIZE_44(_) BOOST_PP_SEQ_SIZE_45\n# define BOOST_PP_SEQ_SIZE_45(_) BOOST_PP_SEQ_SIZE_46\n# define BOOST_PP_SEQ_SIZE_46(_) BOOST_PP_SEQ_SIZE_47\n# define BOOST_PP_SEQ_SIZE_47(_) BOOST_PP_SEQ_SIZE_48\n# define BOOST_PP_SEQ_SIZE_48(_) BOOST_PP_SEQ_SIZE_49\n# define BOOST_PP_SEQ_SIZE_49(_) BOOST_PP_SEQ_SIZE_50\n# define BOOST_PP_SEQ_SIZE_50(_) BOOST_PP_SEQ_SIZE_51\n# define BOOST_PP_SEQ_SIZE_51(_) BOOST_PP_SEQ_SIZE_52\n# define BOOST_PP_SEQ_SIZE_52(_) BOOST_PP_SEQ_SIZE_53\n# define BOOST_PP_SEQ_SIZE_53(_) BOOST_PP_SEQ_SIZE_54\n# define BOOST_PP_SEQ_SIZE_54(_) BOOST_PP_SEQ_SIZE_55\n# define BOOST_PP_SEQ_SIZE_55(_) BOOST_PP_SEQ_SIZE_56\n# define BOOST_PP_SEQ_SIZE_56(_) BOOST_PP_SEQ_SIZE_57\n# define BOOST_PP_SEQ_SIZE_57(_) BOOST_PP_SEQ_SIZE_58\n# define BOOST_PP_SEQ_SIZE_58(_) BOOST_PP_SEQ_SIZE_59\n# define BOOST_PP_SEQ_SIZE_59(_) BOOST_PP_SEQ_SIZE_60\n# define BOOST_PP_SEQ_SIZE_60(_) BOOST_PP_SEQ_SIZE_61\n# define BOOST_PP_SEQ_SIZE_61(_) BOOST_PP_SEQ_SIZE_62\n# define BOOST_PP_SEQ_SIZE_62(_) BOOST_PP_SEQ_SIZE_63\n# define BOOST_PP_SEQ_SIZE_63(_) BOOST_PP_SEQ_SIZE_64\n# define BOOST_PP_SEQ_SIZE_64(_) BOOST_PP_SEQ_SIZE_65\n# define BOOST_PP_SEQ_SIZE_65(_) BOOST_PP_SEQ_SIZE_66\n# define BOOST_PP_SEQ_SIZE_66(_) BOOST_PP_SEQ_SIZE_67\n# define BOOST_PP_SEQ_SIZE_67(_) BOOST_PP_SEQ_SIZE_68\n# define BOOST_PP_SEQ_SIZE_68(_) BOOST_PP_SEQ_SIZE_69\n# define BOOST_PP_SEQ_SIZE_69(_) BOOST_PP_SEQ_SIZE_70\n# define BOOST_PP_SEQ_SIZE_70(_) BOOST_PP_SEQ_SIZE_71\n# define BOOST_PP_SEQ_SIZE_71(_) BOOST_PP_SEQ_SIZE_72\n# define BOOST_PP_SEQ_SIZE_72(_) BOOST_PP_SEQ_SIZE_73\n# define BOOST_PP_SEQ_SIZE_73(_) BOOST_PP_SEQ_SIZE_74\n# define BOOST_PP_SEQ_SIZE_74(_) BOOST_PP_SEQ_SIZE_75\n# define BOOST_PP_SEQ_SIZE_75(_) BOOST_PP_SEQ_SIZE_76\n# define BOOST_PP_SEQ_SIZE_76(_) BOOST_PP_SEQ_SIZE_77\n# define BOOST_PP_SEQ_SIZE_77(_) BOOST_PP_SEQ_SIZE_78\n# define BOOST_PP_SEQ_SIZE_78(_) BOOST_PP_SEQ_SIZE_79\n# define BOOST_PP_SEQ_SIZE_79(_) BOOST_PP_SEQ_SIZE_80\n# define BOOST_PP_SEQ_SIZE_80(_) BOOST_PP_SEQ_SIZE_81\n# define BOOST_PP_SEQ_SIZE_81(_) BOOST_PP_SEQ_SIZE_82\n# define BOOST_PP_SEQ_SIZE_82(_) BOOST_PP_SEQ_SIZE_83\n# define BOOST_PP_SEQ_SIZE_83(_) BOOST_PP_SEQ_SIZE_84\n# define BOOST_PP_SEQ_SIZE_84(_) BOOST_PP_SEQ_SIZE_85\n# define BOOST_PP_SEQ_SIZE_85(_) BOOST_PP_SEQ_SIZE_86\n# define BOOST_PP_SEQ_SIZE_86(_) BOOST_PP_SEQ_SIZE_87\n# define BOOST_PP_SEQ_SIZE_87(_) BOOST_PP_SEQ_SIZE_88\n# define BOOST_PP_SEQ_SIZE_88(_) BOOST_PP_SEQ_SIZE_89\n# define BOOST_PP_SEQ_SIZE_89(_) BOOST_PP_SEQ_SIZE_90\n# define BOOST_PP_SEQ_SIZE_90(_) BOOST_PP_SEQ_SIZE_91\n# define BOOST_PP_SEQ_SIZE_91(_) BOOST_PP_SEQ_SIZE_92\n# define BOOST_PP_SEQ_SIZE_92(_) BOOST_PP_SEQ_SIZE_93\n# define BOOST_PP_SEQ_SIZE_93(_) BOOST_PP_SEQ_SIZE_94\n# define BOOST_PP_SEQ_SIZE_94(_) BOOST_PP_SEQ_SIZE_95\n# define BOOST_PP_SEQ_SIZE_95(_) BOOST_PP_SEQ_SIZE_96\n# define BOOST_PP_SEQ_SIZE_96(_) BOOST_PP_SEQ_SIZE_97\n# define BOOST_PP_SEQ_SIZE_97(_) BOOST_PP_SEQ_SIZE_98\n# define BOOST_PP_SEQ_SIZE_98(_) BOOST_PP_SEQ_SIZE_99\n# define BOOST_PP_SEQ_SIZE_99(_) BOOST_PP_SEQ_SIZE_100\n# define BOOST_PP_SEQ_SIZE_100(_) BOOST_PP_SEQ_SIZE_101\n# define BOOST_PP_SEQ_SIZE_101(_) BOOST_PP_SEQ_SIZE_102\n# define BOOST_PP_SEQ_SIZE_102(_) BOOST_PP_SEQ_SIZE_103\n# define BOOST_PP_SEQ_SIZE_103(_) BOOST_PP_SEQ_SIZE_104\n# define BOOST_PP_SEQ_SIZE_104(_) BOOST_PP_SEQ_SIZE_105\n# define BOOST_PP_SEQ_SIZE_105(_) BOOST_PP_SEQ_SIZE_106\n# define BOOST_PP_SEQ_SIZE_106(_) BOOST_PP_SEQ_SIZE_107\n# define BOOST_PP_SEQ_SIZE_107(_) BOOST_PP_SEQ_SIZE_108\n# define BOOST_PP_SEQ_SIZE_108(_) BOOST_PP_SEQ_SIZE_109\n# define BOOST_PP_SEQ_SIZE_109(_) BOOST_PP_SEQ_SIZE_110\n# define BOOST_PP_SEQ_SIZE_110(_) BOOST_PP_SEQ_SIZE_111\n# define BOOST_PP_SEQ_SIZE_111(_) BOOST_PP_SEQ_SIZE_112\n# define BOOST_PP_SEQ_SIZE_112(_) BOOST_PP_SEQ_SIZE_113\n# define BOOST_PP_SEQ_SIZE_113(_) BOOST_PP_SEQ_SIZE_114\n# define BOOST_PP_SEQ_SIZE_114(_) BOOST_PP_SEQ_SIZE_115\n# define BOOST_PP_SEQ_SIZE_115(_) BOOST_PP_SEQ_SIZE_116\n# define BOOST_PP_SEQ_SIZE_116(_) BOOST_PP_SEQ_SIZE_117\n# define BOOST_PP_SEQ_SIZE_117(_) BOOST_PP_SEQ_SIZE_118\n# define BOOST_PP_SEQ_SIZE_118(_) BOOST_PP_SEQ_SIZE_119\n# define BOOST_PP_SEQ_SIZE_119(_) BOOST_PP_SEQ_SIZE_120\n# define BOOST_PP_SEQ_SIZE_120(_) BOOST_PP_SEQ_SIZE_121\n# define BOOST_PP_SEQ_SIZE_121(_) BOOST_PP_SEQ_SIZE_122\n# define BOOST_PP_SEQ_SIZE_122(_) BOOST_PP_SEQ_SIZE_123\n# define BOOST_PP_SEQ_SIZE_123(_) BOOST_PP_SEQ_SIZE_124\n# define BOOST_PP_SEQ_SIZE_124(_) BOOST_PP_SEQ_SIZE_125\n# define BOOST_PP_SEQ_SIZE_125(_) BOOST_PP_SEQ_SIZE_126\n# define BOOST_PP_SEQ_SIZE_126(_) BOOST_PP_SEQ_SIZE_127\n# define BOOST_PP_SEQ_SIZE_127(_) BOOST_PP_SEQ_SIZE_128\n# define BOOST_PP_SEQ_SIZE_128(_) BOOST_PP_SEQ_SIZE_129\n# define BOOST_PP_SEQ_SIZE_129(_) BOOST_PP_SEQ_SIZE_130\n# define BOOST_PP_SEQ_SIZE_130(_) BOOST_PP_SEQ_SIZE_131\n# define BOOST_PP_SEQ_SIZE_131(_) BOOST_PP_SEQ_SIZE_132\n# define BOOST_PP_SEQ_SIZE_132(_) BOOST_PP_SEQ_SIZE_133\n# define BOOST_PP_SEQ_SIZE_133(_) BOOST_PP_SEQ_SIZE_134\n# define BOOST_PP_SEQ_SIZE_134(_) BOOST_PP_SEQ_SIZE_135\n# define BOOST_PP_SEQ_SIZE_135(_) BOOST_PP_SEQ_SIZE_136\n# define BOOST_PP_SEQ_SIZE_136(_) BOOST_PP_SEQ_SIZE_137\n# define BOOST_PP_SEQ_SIZE_137(_) BOOST_PP_SEQ_SIZE_138\n# define BOOST_PP_SEQ_SIZE_138(_) BOOST_PP_SEQ_SIZE_139\n# define BOOST_PP_SEQ_SIZE_139(_) BOOST_PP_SEQ_SIZE_140\n# define BOOST_PP_SEQ_SIZE_140(_) BOOST_PP_SEQ_SIZE_141\n# define BOOST_PP_SEQ_SIZE_141(_) BOOST_PP_SEQ_SIZE_142\n# define BOOST_PP_SEQ_SIZE_142(_) BOOST_PP_SEQ_SIZE_143\n# define BOOST_PP_SEQ_SIZE_143(_) BOOST_PP_SEQ_SIZE_144\n# define BOOST_PP_SEQ_SIZE_144(_) BOOST_PP_SEQ_SIZE_145\n# define BOOST_PP_SEQ_SIZE_145(_) BOOST_PP_SEQ_SIZE_146\n# define BOOST_PP_SEQ_SIZE_146(_) BOOST_PP_SEQ_SIZE_147\n# define BOOST_PP_SEQ_SIZE_147(_) BOOST_PP_SEQ_SIZE_148\n# define BOOST_PP_SEQ_SIZE_148(_) BOOST_PP_SEQ_SIZE_149\n# define BOOST_PP_SEQ_SIZE_149(_) BOOST_PP_SEQ_SIZE_150\n# define BOOST_PP_SEQ_SIZE_150(_) BOOST_PP_SEQ_SIZE_151\n# define BOOST_PP_SEQ_SIZE_151(_) BOOST_PP_SEQ_SIZE_152\n# define BOOST_PP_SEQ_SIZE_152(_) BOOST_PP_SEQ_SIZE_153\n# define BOOST_PP_SEQ_SIZE_153(_) BOOST_PP_SEQ_SIZE_154\n# define BOOST_PP_SEQ_SIZE_154(_) BOOST_PP_SEQ_SIZE_155\n# define BOOST_PP_SEQ_SIZE_155(_) BOOST_PP_SEQ_SIZE_156\n# define BOOST_PP_SEQ_SIZE_156(_) BOOST_PP_SEQ_SIZE_157\n# define BOOST_PP_SEQ_SIZE_157(_) BOOST_PP_SEQ_SIZE_158\n# define BOOST_PP_SEQ_SIZE_158(_) BOOST_PP_SEQ_SIZE_159\n# define BOOST_PP_SEQ_SIZE_159(_) BOOST_PP_SEQ_SIZE_160\n# define BOOST_PP_SEQ_SIZE_160(_) BOOST_PP_SEQ_SIZE_161\n# define BOOST_PP_SEQ_SIZE_161(_) BOOST_PP_SEQ_SIZE_162\n# define BOOST_PP_SEQ_SIZE_162(_) BOOST_PP_SEQ_SIZE_163\n# define BOOST_PP_SEQ_SIZE_163(_) BOOST_PP_SEQ_SIZE_164\n# define BOOST_PP_SEQ_SIZE_164(_) BOOST_PP_SEQ_SIZE_165\n# define BOOST_PP_SEQ_SIZE_165(_) BOOST_PP_SEQ_SIZE_166\n# define BOOST_PP_SEQ_SIZE_166(_) BOOST_PP_SEQ_SIZE_167\n# define BOOST_PP_SEQ_SIZE_167(_) BOOST_PP_SEQ_SIZE_168\n# define BOOST_PP_SEQ_SIZE_168(_) BOOST_PP_SEQ_SIZE_169\n# define BOOST_PP_SEQ_SIZE_169(_) BOOST_PP_SEQ_SIZE_170\n# define BOOST_PP_SEQ_SIZE_170(_) BOOST_PP_SEQ_SIZE_171\n# define BOOST_PP_SEQ_SIZE_171(_) BOOST_PP_SEQ_SIZE_172\n# define BOOST_PP_SEQ_SIZE_172(_) BOOST_PP_SEQ_SIZE_173\n# define BOOST_PP_SEQ_SIZE_173(_) BOOST_PP_SEQ_SIZE_174\n# define BOOST_PP_SEQ_SIZE_174(_) BOOST_PP_SEQ_SIZE_175\n# define BOOST_PP_SEQ_SIZE_175(_) BOOST_PP_SEQ_SIZE_176\n# define BOOST_PP_SEQ_SIZE_176(_) BOOST_PP_SEQ_SIZE_177\n# define BOOST_PP_SEQ_SIZE_177(_) BOOST_PP_SEQ_SIZE_178\n# define BOOST_PP_SEQ_SIZE_178(_) BOOST_PP_SEQ_SIZE_179\n# define BOOST_PP_SEQ_SIZE_179(_) BOOST_PP_SEQ_SIZE_180\n# define BOOST_PP_SEQ_SIZE_180(_) BOOST_PP_SEQ_SIZE_181\n# define BOOST_PP_SEQ_SIZE_181(_) BOOST_PP_SEQ_SIZE_182\n# define BOOST_PP_SEQ_SIZE_182(_) BOOST_PP_SEQ_SIZE_183\n# define BOOST_PP_SEQ_SIZE_183(_) BOOST_PP_SEQ_SIZE_184\n# define BOOST_PP_SEQ_SIZE_184(_) BOOST_PP_SEQ_SIZE_185\n# define BOOST_PP_SEQ_SIZE_185(_) BOOST_PP_SEQ_SIZE_186\n# define BOOST_PP_SEQ_SIZE_186(_) BOOST_PP_SEQ_SIZE_187\n# define BOOST_PP_SEQ_SIZE_187(_) BOOST_PP_SEQ_SIZE_188\n# define BOOST_PP_SEQ_SIZE_188(_) BOOST_PP_SEQ_SIZE_189\n# define BOOST_PP_SEQ_SIZE_189(_) BOOST_PP_SEQ_SIZE_190\n# define BOOST_PP_SEQ_SIZE_190(_) BOOST_PP_SEQ_SIZE_191\n# define BOOST_PP_SEQ_SIZE_191(_) BOOST_PP_SEQ_SIZE_192\n# define BOOST_PP_SEQ_SIZE_192(_) BOOST_PP_SEQ_SIZE_193\n# define BOOST_PP_SEQ_SIZE_193(_) BOOST_PP_SEQ_SIZE_194\n# define BOOST_PP_SEQ_SIZE_194(_) BOOST_PP_SEQ_SIZE_195\n# define BOOST_PP_SEQ_SIZE_195(_) BOOST_PP_SEQ_SIZE_196\n# define BOOST_PP_SEQ_SIZE_196(_) BOOST_PP_SEQ_SIZE_197\n# define BOOST_PP_SEQ_SIZE_197(_) BOOST_PP_SEQ_SIZE_198\n# define BOOST_PP_SEQ_SIZE_198(_) BOOST_PP_SEQ_SIZE_199\n# define BOOST_PP_SEQ_SIZE_199(_) BOOST_PP_SEQ_SIZE_200\n# define BOOST_PP_SEQ_SIZE_200(_) BOOST_PP_SEQ_SIZE_201\n# define BOOST_PP_SEQ_SIZE_201(_) BOOST_PP_SEQ_SIZE_202\n# define BOOST_PP_SEQ_SIZE_202(_) BOOST_PP_SEQ_SIZE_203\n# define BOOST_PP_SEQ_SIZE_203(_) BOOST_PP_SEQ_SIZE_204\n# define BOOST_PP_SEQ_SIZE_204(_) BOOST_PP_SEQ_SIZE_205\n# define BOOST_PP_SEQ_SIZE_205(_) BOOST_PP_SEQ_SIZE_206\n# define BOOST_PP_SEQ_SIZE_206(_) BOOST_PP_SEQ_SIZE_207\n# define BOOST_PP_SEQ_SIZE_207(_) BOOST_PP_SEQ_SIZE_208\n# define BOOST_PP_SEQ_SIZE_208(_) BOOST_PP_SEQ_SIZE_209\n# define BOOST_PP_SEQ_SIZE_209(_) BOOST_PP_SEQ_SIZE_210\n# define BOOST_PP_SEQ_SIZE_210(_) BOOST_PP_SEQ_SIZE_211\n# define BOOST_PP_SEQ_SIZE_211(_) BOOST_PP_SEQ_SIZE_212\n# define BOOST_PP_SEQ_SIZE_212(_) BOOST_PP_SEQ_SIZE_213\n# define BOOST_PP_SEQ_SIZE_213(_) BOOST_PP_SEQ_SIZE_214\n# define BOOST_PP_SEQ_SIZE_214(_) BOOST_PP_SEQ_SIZE_215\n# define BOOST_PP_SEQ_SIZE_215(_) BOOST_PP_SEQ_SIZE_216\n# define BOOST_PP_SEQ_SIZE_216(_) BOOST_PP_SEQ_SIZE_217\n# define BOOST_PP_SEQ_SIZE_217(_) BOOST_PP_SEQ_SIZE_218\n# define BOOST_PP_SEQ_SIZE_218(_) BOOST_PP_SEQ_SIZE_219\n# define BOOST_PP_SEQ_SIZE_219(_) BOOST_PP_SEQ_SIZE_220\n# define BOOST_PP_SEQ_SIZE_220(_) BOOST_PP_SEQ_SIZE_221\n# define BOOST_PP_SEQ_SIZE_221(_) BOOST_PP_SEQ_SIZE_222\n# define BOOST_PP_SEQ_SIZE_222(_) BOOST_PP_SEQ_SIZE_223\n# define BOOST_PP_SEQ_SIZE_223(_) BOOST_PP_SEQ_SIZE_224\n# define BOOST_PP_SEQ_SIZE_224(_) BOOST_PP_SEQ_SIZE_225\n# define BOOST_PP_SEQ_SIZE_225(_) BOOST_PP_SEQ_SIZE_226\n# define BOOST_PP_SEQ_SIZE_226(_) BOOST_PP_SEQ_SIZE_227\n# define BOOST_PP_SEQ_SIZE_227(_) BOOST_PP_SEQ_SIZE_228\n# define BOOST_PP_SEQ_SIZE_228(_) BOOST_PP_SEQ_SIZE_229\n# define BOOST_PP_SEQ_SIZE_229(_) BOOST_PP_SEQ_SIZE_230\n# define BOOST_PP_SEQ_SIZE_230(_) BOOST_PP_SEQ_SIZE_231\n# define BOOST_PP_SEQ_SIZE_231(_) BOOST_PP_SEQ_SIZE_232\n# define BOOST_PP_SEQ_SIZE_232(_) BOOST_PP_SEQ_SIZE_233\n# define BOOST_PP_SEQ_SIZE_233(_) BOOST_PP_SEQ_SIZE_234\n# define BOOST_PP_SEQ_SIZE_234(_) BOOST_PP_SEQ_SIZE_235\n# define BOOST_PP_SEQ_SIZE_235(_) BOOST_PP_SEQ_SIZE_236\n# define BOOST_PP_SEQ_SIZE_236(_) BOOST_PP_SEQ_SIZE_237\n# define BOOST_PP_SEQ_SIZE_237(_) BOOST_PP_SEQ_SIZE_238\n# define BOOST_PP_SEQ_SIZE_238(_) BOOST_PP_SEQ_SIZE_239\n# define BOOST_PP_SEQ_SIZE_239(_) BOOST_PP_SEQ_SIZE_240\n# define BOOST_PP_SEQ_SIZE_240(_) BOOST_PP_SEQ_SIZE_241\n# define BOOST_PP_SEQ_SIZE_241(_) BOOST_PP_SEQ_SIZE_242\n# define BOOST_PP_SEQ_SIZE_242(_) BOOST_PP_SEQ_SIZE_243\n# define BOOST_PP_SEQ_SIZE_243(_) BOOST_PP_SEQ_SIZE_244\n# define BOOST_PP_SEQ_SIZE_244(_) BOOST_PP_SEQ_SIZE_245\n# define BOOST_PP_SEQ_SIZE_245(_) BOOST_PP_SEQ_SIZE_246\n# define BOOST_PP_SEQ_SIZE_246(_) BOOST_PP_SEQ_SIZE_247\n# define BOOST_PP_SEQ_SIZE_247(_) BOOST_PP_SEQ_SIZE_248\n# define BOOST_PP_SEQ_SIZE_248(_) BOOST_PP_SEQ_SIZE_249\n# define BOOST_PP_SEQ_SIZE_249(_) BOOST_PP_SEQ_SIZE_250\n# define BOOST_PP_SEQ_SIZE_250(_) BOOST_PP_SEQ_SIZE_251\n# define BOOST_PP_SEQ_SIZE_251(_) BOOST_PP_SEQ_SIZE_252\n# define BOOST_PP_SEQ_SIZE_252(_) BOOST_PP_SEQ_SIZE_253\n# define BOOST_PP_SEQ_SIZE_253(_) BOOST_PP_SEQ_SIZE_254\n# define BOOST_PP_SEQ_SIZE_254(_) BOOST_PP_SEQ_SIZE_255\n# define BOOST_PP_SEQ_SIZE_255(_) BOOST_PP_SEQ_SIZE_256\n# define BOOST_PP_SEQ_SIZE_256(_) BOOST_PP_SEQ_SIZE_257\n#\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_0 0\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_1 1\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_2 2\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_3 3\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_4 4\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_5 5\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_6 6\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_7 7\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_8 8\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_9 9\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_10 10\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_11 11\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_12 12\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_13 13\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_14 14\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_15 15\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_16 16\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_17 17\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_18 18\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_19 19\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_20 20\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_21 21\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_22 22\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_23 23\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_24 24\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_25 25\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_26 26\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_27 27\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_28 28\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_29 29\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_30 30\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_31 31\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_32 32\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_33 33\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_34 34\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_35 35\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_36 36\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_37 37\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_38 38\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_39 39\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_40 40\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_41 41\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_42 42\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_43 43\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_44 44\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_45 45\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_46 46\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_47 47\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_48 48\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_49 49\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_50 50\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_51 51\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_52 52\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_53 53\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_54 54\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_55 55\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_56 56\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_57 57\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_58 58\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_59 59\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_60 60\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_61 61\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_62 62\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_63 63\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_64 64\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_65 65\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_66 66\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_67 67\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_68 68\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_69 69\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_70 70\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_71 71\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_72 72\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_73 73\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_74 74\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_75 75\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_76 76\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_77 77\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_78 78\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_79 79\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_80 80\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_81 81\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_82 82\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_83 83\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_84 84\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_85 85\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_86 86\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_87 87\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_88 88\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_89 89\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_90 90\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_91 91\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_92 92\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_93 93\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_94 94\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_95 95\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_96 96\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_97 97\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_98 98\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_99 99\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_100 100\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_101 101\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_102 102\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_103 103\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_104 104\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_105 105\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_106 106\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_107 107\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_108 108\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_109 109\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_110 110\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_111 111\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_112 112\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_113 113\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_114 114\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_115 115\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_116 116\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_117 117\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_118 118\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_119 119\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_120 120\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_121 121\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_122 122\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_123 123\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_124 124\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_125 125\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_126 126\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_127 127\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_128 128\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_129 129\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_130 130\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_131 131\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_132 132\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_133 133\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_134 134\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_135 135\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_136 136\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_137 137\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_138 138\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_139 139\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_140 140\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_141 141\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_142 142\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_143 143\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_144 144\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_145 145\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_146 146\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_147 147\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_148 148\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_149 149\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_150 150\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_151 151\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_152 152\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_153 153\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_154 154\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_155 155\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_156 156\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_157 157\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_158 158\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_159 159\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_160 160\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_161 161\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_162 162\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_163 163\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_164 164\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_165 165\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_166 166\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_167 167\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_168 168\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_169 169\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_170 170\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_171 171\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_172 172\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_173 173\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_174 174\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_175 175\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_176 176\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_177 177\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_178 178\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_179 179\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_180 180\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_181 181\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_182 182\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_183 183\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_184 184\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_185 185\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_186 186\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_187 187\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_188 188\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_189 189\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_190 190\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_191 191\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_192 192\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_193 193\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_194 194\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_195 195\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_196 196\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_197 197\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_198 198\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_199 199\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_200 200\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_201 201\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_202 202\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_203 203\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_204 204\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_205 205\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_206 206\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_207 207\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_208 208\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_209 209\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_210 210\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_211 211\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_212 212\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_213 213\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_214 214\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_215 215\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_216 216\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_217 217\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_218 218\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_219 219\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_220 220\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_221 221\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_222 222\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_223 223\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_224 224\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_225 225\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_226 226\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_227 227\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_228 228\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_229 229\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_230 230\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_231 231\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_232 232\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_233 233\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_234 234\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_235 235\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_236 236\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_237 237\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_238 238\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_239 239\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_240 240\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_241 241\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_242 242\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_243 243\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_244 244\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_245 245\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_246 246\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_247 247\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_248 248\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_249 249\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_250 250\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_251 251\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_252 252\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_253 253\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_254 254\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_255 255\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_256 256\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_257 257\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/seq/subseq.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_SUBSEQ_HPP\n# define BOOST_PREPROCESSOR_SEQ_SUBSEQ_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/seq/first_n.hpp>\n# include <boost/preprocessor/seq/rest_n.hpp>\n#\n# /* BOOST_PP_SEQ_SUBSEQ */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_SUBSEQ(seq, i, len) BOOST_PP_SEQ_FIRST_N(len, BOOST_PP_SEQ_REST_N(i, seq))\n# else\n#    define BOOST_PP_SEQ_SUBSEQ(seq, i, len) BOOST_PP_SEQ_SUBSEQ_I(seq, i, len)\n#    define BOOST_PP_SEQ_SUBSEQ_I(seq, i, len) BOOST_PP_SEQ_FIRST_N(len, BOOST_PP_SEQ_REST_N(i, seq))\n# endif\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/slot/detail/counter.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2005.                                  *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# define BOOST_PP_VALUE BOOST_PP_COUNTER + 1\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_COUNTER\n#\n# undef BOOST_PP_COUNTER_DIGIT_1\n# undef BOOST_PP_COUNTER_DIGIT_2\n# undef BOOST_PP_COUNTER_DIGIT_3\n# undef BOOST_PP_COUNTER_DIGIT_4\n# undef BOOST_PP_COUNTER_DIGIT_5\n# undef BOOST_PP_COUNTER_DIGIT_6\n# undef BOOST_PP_COUNTER_DIGIT_7\n# undef BOOST_PP_COUNTER_DIGIT_8\n# undef BOOST_PP_COUNTER_DIGIT_9\n# undef BOOST_PP_COUNTER_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_10 == 0\n#    define BOOST_PP_COUNTER_DIGIT_10 0\n# elif BOOST_PP_SLOT_TEMP_10 == 1\n#    define BOOST_PP_COUNTER_DIGIT_10 1\n# elif BOOST_PP_SLOT_TEMP_10 == 2\n#    define BOOST_PP_COUNTER_DIGIT_10 2\n# elif BOOST_PP_SLOT_TEMP_10 == 3\n#    define BOOST_PP_COUNTER_DIGIT_10 3\n# elif BOOST_PP_SLOT_TEMP_10 == 4\n#    define BOOST_PP_COUNTER_DIGIT_10 4\n# elif BOOST_PP_SLOT_TEMP_10 == 5\n#    define BOOST_PP_COUNTER_DIGIT_10 5\n# elif BOOST_PP_SLOT_TEMP_10 == 6\n#    define BOOST_PP_COUNTER_DIGIT_10 6\n# elif BOOST_PP_SLOT_TEMP_10 == 7\n#    define BOOST_PP_COUNTER_DIGIT_10 7\n# elif BOOST_PP_SLOT_TEMP_10 == 8\n#    define BOOST_PP_COUNTER_DIGIT_10 8\n# elif BOOST_PP_SLOT_TEMP_10 == 9\n#    define BOOST_PP_COUNTER_DIGIT_10 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_9 == 0\n#    define BOOST_PP_COUNTER_DIGIT_9 0\n# elif BOOST_PP_SLOT_TEMP_9 == 1\n#    define BOOST_PP_COUNTER_DIGIT_9 1\n# elif BOOST_PP_SLOT_TEMP_9 == 2\n#    define BOOST_PP_COUNTER_DIGIT_9 2\n# elif BOOST_PP_SLOT_TEMP_9 == 3\n#    define BOOST_PP_COUNTER_DIGIT_9 3\n# elif BOOST_PP_SLOT_TEMP_9 == 4\n#    define BOOST_PP_COUNTER_DIGIT_9 4\n# elif BOOST_PP_SLOT_TEMP_9 == 5\n#    define BOOST_PP_COUNTER_DIGIT_9 5\n# elif BOOST_PP_SLOT_TEMP_9 == 6\n#    define BOOST_PP_COUNTER_DIGIT_9 6\n# elif BOOST_PP_SLOT_TEMP_9 == 7\n#    define BOOST_PP_COUNTER_DIGIT_9 7\n# elif BOOST_PP_SLOT_TEMP_9 == 8\n#    define BOOST_PP_COUNTER_DIGIT_9 8\n# elif BOOST_PP_SLOT_TEMP_9 == 9\n#    define BOOST_PP_COUNTER_DIGIT_9 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_8 == 0\n#    define BOOST_PP_COUNTER_DIGIT_8 0\n# elif BOOST_PP_SLOT_TEMP_8 == 1\n#    define BOOST_PP_COUNTER_DIGIT_8 1\n# elif BOOST_PP_SLOT_TEMP_8 == 2\n#    define BOOST_PP_COUNTER_DIGIT_8 2\n# elif BOOST_PP_SLOT_TEMP_8 == 3\n#    define BOOST_PP_COUNTER_DIGIT_8 3\n# elif BOOST_PP_SLOT_TEMP_8 == 4\n#    define BOOST_PP_COUNTER_DIGIT_8 4\n# elif BOOST_PP_SLOT_TEMP_8 == 5\n#    define BOOST_PP_COUNTER_DIGIT_8 5\n# elif BOOST_PP_SLOT_TEMP_8 == 6\n#    define BOOST_PP_COUNTER_DIGIT_8 6\n# elif BOOST_PP_SLOT_TEMP_8 == 7\n#    define BOOST_PP_COUNTER_DIGIT_8 7\n# elif BOOST_PP_SLOT_TEMP_8 == 8\n#    define BOOST_PP_COUNTER_DIGIT_8 8\n# elif BOOST_PP_SLOT_TEMP_8 == 9\n#    define BOOST_PP_COUNTER_DIGIT_8 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_7 == 0\n#    define BOOST_PP_COUNTER_DIGIT_7 0\n# elif BOOST_PP_SLOT_TEMP_7 == 1\n#    define BOOST_PP_COUNTER_DIGIT_7 1\n# elif BOOST_PP_SLOT_TEMP_7 == 2\n#    define BOOST_PP_COUNTER_DIGIT_7 2\n# elif BOOST_PP_SLOT_TEMP_7 == 3\n#    define BOOST_PP_COUNTER_DIGIT_7 3\n# elif BOOST_PP_SLOT_TEMP_7 == 4\n#    define BOOST_PP_COUNTER_DIGIT_7 4\n# elif BOOST_PP_SLOT_TEMP_7 == 5\n#    define BOOST_PP_COUNTER_DIGIT_7 5\n# elif BOOST_PP_SLOT_TEMP_7 == 6\n#    define BOOST_PP_COUNTER_DIGIT_7 6\n# elif BOOST_PP_SLOT_TEMP_7 == 7\n#    define BOOST_PP_COUNTER_DIGIT_7 7\n# elif BOOST_PP_SLOT_TEMP_7 == 8\n#    define BOOST_PP_COUNTER_DIGIT_7 8\n# elif BOOST_PP_SLOT_TEMP_7 == 9\n#    define BOOST_PP_COUNTER_DIGIT_7 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_6 == 0\n#    define BOOST_PP_COUNTER_DIGIT_6 0\n# elif BOOST_PP_SLOT_TEMP_6 == 1\n#    define BOOST_PP_COUNTER_DIGIT_6 1\n# elif BOOST_PP_SLOT_TEMP_6 == 2\n#    define BOOST_PP_COUNTER_DIGIT_6 2\n# elif BOOST_PP_SLOT_TEMP_6 == 3\n#    define BOOST_PP_COUNTER_DIGIT_6 3\n# elif BOOST_PP_SLOT_TEMP_6 == 4\n#    define BOOST_PP_COUNTER_DIGIT_6 4\n# elif BOOST_PP_SLOT_TEMP_6 == 5\n#    define BOOST_PP_COUNTER_DIGIT_6 5\n# elif BOOST_PP_SLOT_TEMP_6 == 6\n#    define BOOST_PP_COUNTER_DIGIT_6 6\n# elif BOOST_PP_SLOT_TEMP_6 == 7\n#    define BOOST_PP_COUNTER_DIGIT_6 7\n# elif BOOST_PP_SLOT_TEMP_6 == 8\n#    define BOOST_PP_COUNTER_DIGIT_6 8\n# elif BOOST_PP_SLOT_TEMP_6 == 9\n#    define BOOST_PP_COUNTER_DIGIT_6 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_5 == 0\n#    define BOOST_PP_COUNTER_DIGIT_5 0\n# elif BOOST_PP_SLOT_TEMP_5 == 1\n#    define BOOST_PP_COUNTER_DIGIT_5 1\n# elif BOOST_PP_SLOT_TEMP_5 == 2\n#    define BOOST_PP_COUNTER_DIGIT_5 2\n# elif BOOST_PP_SLOT_TEMP_5 == 3\n#    define BOOST_PP_COUNTER_DIGIT_5 3\n# elif BOOST_PP_SLOT_TEMP_5 == 4\n#    define BOOST_PP_COUNTER_DIGIT_5 4\n# elif BOOST_PP_SLOT_TEMP_5 == 5\n#    define BOOST_PP_COUNTER_DIGIT_5 5\n# elif BOOST_PP_SLOT_TEMP_5 == 6\n#    define BOOST_PP_COUNTER_DIGIT_5 6\n# elif BOOST_PP_SLOT_TEMP_5 == 7\n#    define BOOST_PP_COUNTER_DIGIT_5 7\n# elif BOOST_PP_SLOT_TEMP_5 == 8\n#    define BOOST_PP_COUNTER_DIGIT_5 8\n# elif BOOST_PP_SLOT_TEMP_5 == 9\n#    define BOOST_PP_COUNTER_DIGIT_5 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_4 == 0\n#    define BOOST_PP_COUNTER_DIGIT_4 0\n# elif BOOST_PP_SLOT_TEMP_4 == 1\n#    define BOOST_PP_COUNTER_DIGIT_4 1\n# elif BOOST_PP_SLOT_TEMP_4 == 2\n#    define BOOST_PP_COUNTER_DIGIT_4 2\n# elif BOOST_PP_SLOT_TEMP_4 == 3\n#    define BOOST_PP_COUNTER_DIGIT_4 3\n# elif BOOST_PP_SLOT_TEMP_4 == 4\n#    define BOOST_PP_COUNTER_DIGIT_4 4\n# elif BOOST_PP_SLOT_TEMP_4 == 5\n#    define BOOST_PP_COUNTER_DIGIT_4 5\n# elif BOOST_PP_SLOT_TEMP_4 == 6\n#    define BOOST_PP_COUNTER_DIGIT_4 6\n# elif BOOST_PP_SLOT_TEMP_4 == 7\n#    define BOOST_PP_COUNTER_DIGIT_4 7\n# elif BOOST_PP_SLOT_TEMP_4 == 8\n#    define BOOST_PP_COUNTER_DIGIT_4 8\n# elif BOOST_PP_SLOT_TEMP_4 == 9\n#    define BOOST_PP_COUNTER_DIGIT_4 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_COUNTER_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_COUNTER_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_COUNTER_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_COUNTER_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_COUNTER_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_COUNTER_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_COUNTER_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_COUNTER_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_COUNTER_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_COUNTER_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_COUNTER_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_COUNTER_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_COUNTER_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_COUNTER_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_COUNTER_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_COUNTER_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_COUNTER_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_COUNTER_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_COUNTER_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_COUNTER_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_COUNTER_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_COUNTER_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_COUNTER_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_COUNTER_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_COUNTER_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_COUNTER_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_COUNTER_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_COUNTER_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_COUNTER_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_COUNTER_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_COUNTER_DIGIT_10\n#    define BOOST_PP_COUNTER BOOST_PP_SLOT_CC_10(BOOST_PP_COUNTER_DIGIT_10, BOOST_PP_COUNTER_DIGIT_9, BOOST_PP_COUNTER_DIGIT_8, BOOST_PP_COUNTER_DIGIT_7, BOOST_PP_COUNTER_DIGIT_6, BOOST_PP_COUNTER_DIGIT_5, BOOST_PP_COUNTER_DIGIT_4, BOOST_PP_COUNTER_DIGIT_3, BOOST_PP_COUNTER_DIGIT_2, BOOST_PP_COUNTER_DIGIT_1)\n# elif BOOST_PP_COUNTER_DIGIT_9\n#    define BOOST_PP_COUNTER BOOST_PP_SLOT_CC_9(BOOST_PP_COUNTER_DIGIT_9, BOOST_PP_COUNTER_DIGIT_8, BOOST_PP_COUNTER_DIGIT_7, BOOST_PP_COUNTER_DIGIT_6, BOOST_PP_COUNTER_DIGIT_5, BOOST_PP_COUNTER_DIGIT_4, BOOST_PP_COUNTER_DIGIT_3, BOOST_PP_COUNTER_DIGIT_2, BOOST_PP_COUNTER_DIGIT_1)\n# elif BOOST_PP_COUNTER_DIGIT_8\n#    define BOOST_PP_COUNTER BOOST_PP_SLOT_CC_8(BOOST_PP_COUNTER_DIGIT_8, BOOST_PP_COUNTER_DIGIT_7, BOOST_PP_COUNTER_DIGIT_6, BOOST_PP_COUNTER_DIGIT_5, BOOST_PP_COUNTER_DIGIT_4, BOOST_PP_COUNTER_DIGIT_3, BOOST_PP_COUNTER_DIGIT_2, BOOST_PP_COUNTER_DIGIT_1)\n# elif BOOST_PP_COUNTER_DIGIT_7\n#    define BOOST_PP_COUNTER BOOST_PP_SLOT_CC_7(BOOST_PP_COUNTER_DIGIT_7, BOOST_PP_COUNTER_DIGIT_6, BOOST_PP_COUNTER_DIGIT_5, BOOST_PP_COUNTER_DIGIT_4, BOOST_PP_COUNTER_DIGIT_3, BOOST_PP_COUNTER_DIGIT_2, BOOST_PP_COUNTER_DIGIT_1)\n# elif BOOST_PP_COUNTER_DIGIT_6\n#    define BOOST_PP_COUNTER BOOST_PP_SLOT_CC_6(BOOST_PP_COUNTER_DIGIT_6, BOOST_PP_COUNTER_DIGIT_5, BOOST_PP_COUNTER_DIGIT_4, BOOST_PP_COUNTER_DIGIT_3, BOOST_PP_COUNTER_DIGIT_2, BOOST_PP_COUNTER_DIGIT_1)\n# elif BOOST_PP_COUNTER_DIGIT_5\n#    define BOOST_PP_COUNTER BOOST_PP_SLOT_CC_5(BOOST_PP_COUNTER_DIGIT_5, BOOST_PP_COUNTER_DIGIT_4, BOOST_PP_COUNTER_DIGIT_3, BOOST_PP_COUNTER_DIGIT_2, BOOST_PP_COUNTER_DIGIT_1)\n# elif BOOST_PP_COUNTER_DIGIT_4\n#    define BOOST_PP_COUNTER BOOST_PP_SLOT_CC_4(BOOST_PP_COUNTER_DIGIT_4, BOOST_PP_COUNTER_DIGIT_3, BOOST_PP_COUNTER_DIGIT_2, BOOST_PP_COUNTER_DIGIT_1)\n# elif BOOST_PP_COUNTER_DIGIT_3\n#    define BOOST_PP_COUNTER BOOST_PP_SLOT_CC_3(BOOST_PP_COUNTER_DIGIT_3, BOOST_PP_COUNTER_DIGIT_2, BOOST_PP_COUNTER_DIGIT_1)\n# elif BOOST_PP_COUNTER_DIGIT_2\n#    define BOOST_PP_COUNTER BOOST_PP_SLOT_CC_2(BOOST_PP_COUNTER_DIGIT_2, BOOST_PP_COUNTER_DIGIT_1)\n# else\n#    define BOOST_PP_COUNTER BOOST_PP_COUNTER_DIGIT_1\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/slot/detail/def.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SLOT_DETAIL_DEF_HPP\n# define BOOST_PREPROCESSOR_SLOT_DETAIL_DEF_HPP\n#\n# /* BOOST_PP_SLOT_OFFSET_x */\n#\n# define BOOST_PP_SLOT_OFFSET_10(x) (x) % 1000000000UL\n# define BOOST_PP_SLOT_OFFSET_9(x) BOOST_PP_SLOT_OFFSET_10(x) % 100000000UL\n# define BOOST_PP_SLOT_OFFSET_8(x) BOOST_PP_SLOT_OFFSET_9(x) % 10000000UL\n# define BOOST_PP_SLOT_OFFSET_7(x) BOOST_PP_SLOT_OFFSET_8(x) % 1000000UL\n# define BOOST_PP_SLOT_OFFSET_6(x) BOOST_PP_SLOT_OFFSET_7(x) % 100000UL\n# define BOOST_PP_SLOT_OFFSET_5(x) BOOST_PP_SLOT_OFFSET_6(x) % 10000UL\n# define BOOST_PP_SLOT_OFFSET_4(x) BOOST_PP_SLOT_OFFSET_5(x) % 1000UL\n# define BOOST_PP_SLOT_OFFSET_3(x) BOOST_PP_SLOT_OFFSET_4(x) % 100UL\n# define BOOST_PP_SLOT_OFFSET_2(x) BOOST_PP_SLOT_OFFSET_3(x) % 10UL\n#\n# /* BOOST_PP_SLOT_CC_x */\n#\n# define BOOST_PP_SLOT_CC_2(a, b) BOOST_PP_SLOT_CC_2_D(a, b)\n# define BOOST_PP_SLOT_CC_3(a, b, c) BOOST_PP_SLOT_CC_3_D(a, b, c)\n# define BOOST_PP_SLOT_CC_4(a, b, c, d) BOOST_PP_SLOT_CC_4_D(a, b, c, d)\n# define BOOST_PP_SLOT_CC_5(a, b, c, d, e) BOOST_PP_SLOT_CC_5_D(a, b, c, d, e)\n# define BOOST_PP_SLOT_CC_6(a, b, c, d, e, f) BOOST_PP_SLOT_CC_6_D(a, b, c, d, e, f)\n# define BOOST_PP_SLOT_CC_7(a, b, c, d, e, f, g) BOOST_PP_SLOT_CC_7_D(a, b, c, d, e, f, g)\n# define BOOST_PP_SLOT_CC_8(a, b, c, d, e, f, g, h) BOOST_PP_SLOT_CC_8_D(a, b, c, d, e, f, g, h)\n# define BOOST_PP_SLOT_CC_9(a, b, c, d, e, f, g, h, i) BOOST_PP_SLOT_CC_9_D(a, b, c, d, e, f, g, h, i)\n# define BOOST_PP_SLOT_CC_10(a, b, c, d, e, f, g, h, i, j) BOOST_PP_SLOT_CC_10_D(a, b, c, d, e, f, g, h, i, j)\n#\n# define BOOST_PP_SLOT_CC_2_D(a, b) a ## b\n# define BOOST_PP_SLOT_CC_3_D(a, b, c) a ## b ## c\n# define BOOST_PP_SLOT_CC_4_D(a, b, c, d) a ## b ## c ## d\n# define BOOST_PP_SLOT_CC_5_D(a, b, c, d, e) a ## b ## c ## d ## e\n# define BOOST_PP_SLOT_CC_6_D(a, b, c, d, e, f) a ## b ## c ## d ## e ## f\n# define BOOST_PP_SLOT_CC_7_D(a, b, c, d, e, f, g) a ## b ## c ## d ## e ## f ## g\n# define BOOST_PP_SLOT_CC_8_D(a, b, c, d, e, f, g, h) a ## b ## c ## d ## e ## f ## g ## h\n# define BOOST_PP_SLOT_CC_9_D(a, b, c, d, e, f, g, h, i) a ## b ## c ## d ## e ## f ## g ## h ## i\n# define BOOST_PP_SLOT_CC_10_D(a, b, c, d, e, f, g, h, i, j) a ## b ## c ## d ## e ## f ## g ## h ## i ## j\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/slot/detail/shared.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PP_VALUE\n#    error BOOST_PP_ERROR:  BOOST_PP_VALUE is not defined\n# endif\n#\n# undef BOOST_PP_SLOT_TEMP_1\n# undef BOOST_PP_SLOT_TEMP_2\n# undef BOOST_PP_SLOT_TEMP_3\n# undef BOOST_PP_SLOT_TEMP_4\n# undef BOOST_PP_SLOT_TEMP_5\n# undef BOOST_PP_SLOT_TEMP_6\n# undef BOOST_PP_SLOT_TEMP_7\n# undef BOOST_PP_SLOT_TEMP_8\n# undef BOOST_PP_SLOT_TEMP_9\n# undef BOOST_PP_SLOT_TEMP_10\n#\n# if (BOOST_PP_VALUE) / 1000000000UL == 0\n#    define BOOST_PP_SLOT_TEMP_10 0\n# elif (BOOST_PP_VALUE) / 1000000000UL == 1\n#    define BOOST_PP_SLOT_TEMP_10 1\n# elif (BOOST_PP_VALUE) / 1000000000UL == 2\n#    define BOOST_PP_SLOT_TEMP_10 2\n# elif (BOOST_PP_VALUE) / 1000000000UL == 3\n#    define BOOST_PP_SLOT_TEMP_10 3\n# elif (BOOST_PP_VALUE) / 1000000000UL == 4\n#    define BOOST_PP_SLOT_TEMP_10 4\n# elif (BOOST_PP_VALUE) / 1000000000UL == 5\n#    define BOOST_PP_SLOT_TEMP_10 5\n# elif (BOOST_PP_VALUE) / 1000000000UL == 6\n#    define BOOST_PP_SLOT_TEMP_10 6\n# elif (BOOST_PP_VALUE) / 1000000000UL == 7\n#    define BOOST_PP_SLOT_TEMP_10 7\n# elif (BOOST_PP_VALUE) / 1000000000UL == 8\n#    define BOOST_PP_SLOT_TEMP_10 8\n# elif (BOOST_PP_VALUE) / 1000000000UL == 9\n#    define BOOST_PP_SLOT_TEMP_10 9\n# endif\n#\n# if BOOST_PP_SLOT_OFFSET_10(BOOST_PP_VALUE) / 100000000UL == 0\n#    define BOOST_PP_SLOT_TEMP_9 0\n# elif BOOST_PP_SLOT_OFFSET_10(BOOST_PP_VALUE) / 100000000UL == 1\n#    define BOOST_PP_SLOT_TEMP_9 1\n# elif BOOST_PP_SLOT_OFFSET_10(BOOST_PP_VALUE) / 100000000UL == 2\n#    define BOOST_PP_SLOT_TEMP_9 2\n# elif BOOST_PP_SLOT_OFFSET_10(BOOST_PP_VALUE) / 100000000UL == 3\n#    define BOOST_PP_SLOT_TEMP_9 3\n# elif BOOST_PP_SLOT_OFFSET_10(BOOST_PP_VALUE) / 100000000UL == 4\n#    define BOOST_PP_SLOT_TEMP_9 4\n# elif BOOST_PP_SLOT_OFFSET_10(BOOST_PP_VALUE) / 100000000UL == 5\n#    define BOOST_PP_SLOT_TEMP_9 5\n# elif BOOST_PP_SLOT_OFFSET_10(BOOST_PP_VALUE) / 100000000UL == 6\n#    define BOOST_PP_SLOT_TEMP_9 6\n# elif BOOST_PP_SLOT_OFFSET_10(BOOST_PP_VALUE) / 100000000UL == 7\n#    define BOOST_PP_SLOT_TEMP_9 7\n# elif BOOST_PP_SLOT_OFFSET_10(BOOST_PP_VALUE) / 100000000UL == 8\n#    define BOOST_PP_SLOT_TEMP_9 8\n# elif BOOST_PP_SLOT_OFFSET_10(BOOST_PP_VALUE) / 100000000UL == 9\n#    define BOOST_PP_SLOT_TEMP_9 9\n# endif\n#\n# if BOOST_PP_SLOT_OFFSET_9(BOOST_PP_VALUE) / 10000000UL == 0\n#    define BOOST_PP_SLOT_TEMP_8 0\n# elif BOOST_PP_SLOT_OFFSET_9(BOOST_PP_VALUE) / 10000000UL == 1\n#    define BOOST_PP_SLOT_TEMP_8 1\n# elif BOOST_PP_SLOT_OFFSET_9(BOOST_PP_VALUE) / 10000000UL == 2\n#    define BOOST_PP_SLOT_TEMP_8 2\n# elif BOOST_PP_SLOT_OFFSET_9(BOOST_PP_VALUE) / 10000000UL == 3\n#    define BOOST_PP_SLOT_TEMP_8 3\n# elif BOOST_PP_SLOT_OFFSET_9(BOOST_PP_VALUE) / 10000000UL == 4\n#    define BOOST_PP_SLOT_TEMP_8 4\n# elif BOOST_PP_SLOT_OFFSET_9(BOOST_PP_VALUE) / 10000000UL == 5\n#    define BOOST_PP_SLOT_TEMP_8 5\n# elif BOOST_PP_SLOT_OFFSET_9(BOOST_PP_VALUE) / 10000000UL == 6\n#    define BOOST_PP_SLOT_TEMP_8 6\n# elif BOOST_PP_SLOT_OFFSET_9(BOOST_PP_VALUE) / 10000000UL == 7\n#    define BOOST_PP_SLOT_TEMP_8 7\n# elif BOOST_PP_SLOT_OFFSET_9(BOOST_PP_VALUE) / 10000000UL == 8\n#    define BOOST_PP_SLOT_TEMP_8 8\n# elif BOOST_PP_SLOT_OFFSET_9(BOOST_PP_VALUE) / 10000000UL == 9\n#    define BOOST_PP_SLOT_TEMP_8 9\n# endif\n#\n# if BOOST_PP_SLOT_OFFSET_8(BOOST_PP_VALUE) / 1000000UL == 0\n#    define BOOST_PP_SLOT_TEMP_7 0\n# elif BOOST_PP_SLOT_OFFSET_8(BOOST_PP_VALUE) / 1000000UL == 1\n#    define BOOST_PP_SLOT_TEMP_7 1\n# elif BOOST_PP_SLOT_OFFSET_8(BOOST_PP_VALUE) / 1000000UL == 2\n#    define BOOST_PP_SLOT_TEMP_7 2\n# elif BOOST_PP_SLOT_OFFSET_8(BOOST_PP_VALUE) / 1000000UL == 3\n#    define BOOST_PP_SLOT_TEMP_7 3\n# elif BOOST_PP_SLOT_OFFSET_8(BOOST_PP_VALUE) / 1000000UL == 4\n#    define BOOST_PP_SLOT_TEMP_7 4\n# elif BOOST_PP_SLOT_OFFSET_8(BOOST_PP_VALUE) / 1000000UL == 5\n#    define BOOST_PP_SLOT_TEMP_7 5\n# elif BOOST_PP_SLOT_OFFSET_8(BOOST_PP_VALUE) / 1000000UL == 6\n#    define BOOST_PP_SLOT_TEMP_7 6\n# elif BOOST_PP_SLOT_OFFSET_8(BOOST_PP_VALUE) / 1000000UL == 7\n#    define BOOST_PP_SLOT_TEMP_7 7\n# elif BOOST_PP_SLOT_OFFSET_8(BOOST_PP_VALUE) / 1000000UL == 8\n#    define BOOST_PP_SLOT_TEMP_7 8\n# elif BOOST_PP_SLOT_OFFSET_8(BOOST_PP_VALUE) / 1000000UL == 9\n#    define BOOST_PP_SLOT_TEMP_7 9\n# endif\n#\n# if BOOST_PP_SLOT_OFFSET_7(BOOST_PP_VALUE) / 100000UL == 0\n#    define BOOST_PP_SLOT_TEMP_6 0\n# elif BOOST_PP_SLOT_OFFSET_7(BOOST_PP_VALUE) / 100000UL == 1\n#    define BOOST_PP_SLOT_TEMP_6 1\n# elif BOOST_PP_SLOT_OFFSET_7(BOOST_PP_VALUE) / 100000UL == 2\n#    define BOOST_PP_SLOT_TEMP_6 2\n# elif BOOST_PP_SLOT_OFFSET_7(BOOST_PP_VALUE) / 100000UL == 3\n#    define BOOST_PP_SLOT_TEMP_6 3\n# elif BOOST_PP_SLOT_OFFSET_7(BOOST_PP_VALUE) / 100000UL == 4\n#    define BOOST_PP_SLOT_TEMP_6 4\n# elif BOOST_PP_SLOT_OFFSET_7(BOOST_PP_VALUE) / 100000UL == 5\n#    define BOOST_PP_SLOT_TEMP_6 5\n# elif BOOST_PP_SLOT_OFFSET_7(BOOST_PP_VALUE) / 100000UL == 6\n#    define BOOST_PP_SLOT_TEMP_6 6\n# elif BOOST_PP_SLOT_OFFSET_7(BOOST_PP_VALUE) / 100000UL == 7\n#    define BOOST_PP_SLOT_TEMP_6 7\n# elif BOOST_PP_SLOT_OFFSET_7(BOOST_PP_VALUE) / 100000UL == 8\n#    define BOOST_PP_SLOT_TEMP_6 8\n# elif BOOST_PP_SLOT_OFFSET_7(BOOST_PP_VALUE) / 100000UL == 9\n#    define BOOST_PP_SLOT_TEMP_6 9\n# endif\n#\n# if BOOST_PP_SLOT_OFFSET_6(BOOST_PP_VALUE) / 10000UL == 0\n#    define BOOST_PP_SLOT_TEMP_5 0\n# elif BOOST_PP_SLOT_OFFSET_6(BOOST_PP_VALUE) / 10000UL == 1\n#    define BOOST_PP_SLOT_TEMP_5 1\n# elif BOOST_PP_SLOT_OFFSET_6(BOOST_PP_VALUE) / 10000UL == 2\n#    define BOOST_PP_SLOT_TEMP_5 2\n# elif BOOST_PP_SLOT_OFFSET_6(BOOST_PP_VALUE) / 10000UL == 3\n#    define BOOST_PP_SLOT_TEMP_5 3\n# elif BOOST_PP_SLOT_OFFSET_6(BOOST_PP_VALUE) / 10000UL == 4\n#    define BOOST_PP_SLOT_TEMP_5 4\n# elif BOOST_PP_SLOT_OFFSET_6(BOOST_PP_VALUE) / 10000UL == 5\n#    define BOOST_PP_SLOT_TEMP_5 5\n# elif BOOST_PP_SLOT_OFFSET_6(BOOST_PP_VALUE) / 10000UL == 6\n#    define BOOST_PP_SLOT_TEMP_5 6\n# elif BOOST_PP_SLOT_OFFSET_6(BOOST_PP_VALUE) / 10000UL == 7\n#    define BOOST_PP_SLOT_TEMP_5 7\n# elif BOOST_PP_SLOT_OFFSET_6(BOOST_PP_VALUE) / 10000UL == 8\n#    define BOOST_PP_SLOT_TEMP_5 8\n# elif BOOST_PP_SLOT_OFFSET_6(BOOST_PP_VALUE) / 10000UL == 9\n#    define BOOST_PP_SLOT_TEMP_5 9\n# endif\n#\n# if BOOST_PP_SLOT_OFFSET_5(BOOST_PP_VALUE) / 1000UL == 0\n#    define BOOST_PP_SLOT_TEMP_4 0\n# elif BOOST_PP_SLOT_OFFSET_5(BOOST_PP_VALUE) / 1000UL == 1\n#    define BOOST_PP_SLOT_TEMP_4 1\n# elif BOOST_PP_SLOT_OFFSET_5(BOOST_PP_VALUE) / 1000UL == 2\n#    define BOOST_PP_SLOT_TEMP_4 2\n# elif BOOST_PP_SLOT_OFFSET_5(BOOST_PP_VALUE) / 1000UL == 3\n#    define BOOST_PP_SLOT_TEMP_4 3\n# elif BOOST_PP_SLOT_OFFSET_5(BOOST_PP_VALUE) / 1000UL == 4\n#    define BOOST_PP_SLOT_TEMP_4 4\n# elif BOOST_PP_SLOT_OFFSET_5(BOOST_PP_VALUE) / 1000UL == 5\n#    define BOOST_PP_SLOT_TEMP_4 5\n# elif BOOST_PP_SLOT_OFFSET_5(BOOST_PP_VALUE) / 1000UL == 6\n#    define BOOST_PP_SLOT_TEMP_4 6\n# elif BOOST_PP_SLOT_OFFSET_5(BOOST_PP_VALUE) / 1000UL == 7\n#    define BOOST_PP_SLOT_TEMP_4 7\n# elif BOOST_PP_SLOT_OFFSET_5(BOOST_PP_VALUE) / 1000UL == 8\n#    define BOOST_PP_SLOT_TEMP_4 8\n# elif BOOST_PP_SLOT_OFFSET_5(BOOST_PP_VALUE) / 1000UL == 9\n#    define BOOST_PP_SLOT_TEMP_4 9\n# endif\n#\n# if BOOST_PP_SLOT_OFFSET_4(BOOST_PP_VALUE) / 100UL == 0\n#    define BOOST_PP_SLOT_TEMP_3 0\n# elif BOOST_PP_SLOT_OFFSET_4(BOOST_PP_VALUE) / 100UL == 1\n#    define BOOST_PP_SLOT_TEMP_3 1\n# elif BOOST_PP_SLOT_OFFSET_4(BOOST_PP_VALUE) / 100UL == 2\n#    define BOOST_PP_SLOT_TEMP_3 2\n# elif BOOST_PP_SLOT_OFFSET_4(BOOST_PP_VALUE) / 100UL == 3\n#    define BOOST_PP_SLOT_TEMP_3 3\n# elif BOOST_PP_SLOT_OFFSET_4(BOOST_PP_VALUE) / 100UL == 4\n#    define BOOST_PP_SLOT_TEMP_3 4\n# elif BOOST_PP_SLOT_OFFSET_4(BOOST_PP_VALUE) / 100UL == 5\n#    define BOOST_PP_SLOT_TEMP_3 5\n# elif BOOST_PP_SLOT_OFFSET_4(BOOST_PP_VALUE) / 100UL == 6\n#    define BOOST_PP_SLOT_TEMP_3 6\n# elif BOOST_PP_SLOT_OFFSET_4(BOOST_PP_VALUE) / 100UL == 7\n#    define BOOST_PP_SLOT_TEMP_3 7\n# elif BOOST_PP_SLOT_OFFSET_4(BOOST_PP_VALUE) / 100UL == 8\n#    define BOOST_PP_SLOT_TEMP_3 8\n# elif BOOST_PP_SLOT_OFFSET_4(BOOST_PP_VALUE) / 100UL == 9\n#    define BOOST_PP_SLOT_TEMP_3 9\n# endif\n#\n# if BOOST_PP_SLOT_OFFSET_3(BOOST_PP_VALUE) / 10UL == 0\n#    define BOOST_PP_SLOT_TEMP_2 0\n# elif BOOST_PP_SLOT_OFFSET_3(BOOST_PP_VALUE) / 10UL == 1\n#    define BOOST_PP_SLOT_TEMP_2 1\n# elif BOOST_PP_SLOT_OFFSET_3(BOOST_PP_VALUE) / 10UL == 2\n#    define BOOST_PP_SLOT_TEMP_2 2\n# elif BOOST_PP_SLOT_OFFSET_3(BOOST_PP_VALUE) / 10UL == 3\n#    define BOOST_PP_SLOT_TEMP_2 3\n# elif BOOST_PP_SLOT_OFFSET_3(BOOST_PP_VALUE) / 10UL == 4\n#    define BOOST_PP_SLOT_TEMP_2 4\n# elif BOOST_PP_SLOT_OFFSET_3(BOOST_PP_VALUE) / 10UL == 5\n#    define BOOST_PP_SLOT_TEMP_2 5\n# elif BOOST_PP_SLOT_OFFSET_3(BOOST_PP_VALUE) / 10UL == 6\n#    define BOOST_PP_SLOT_TEMP_2 6\n# elif BOOST_PP_SLOT_OFFSET_3(BOOST_PP_VALUE) / 10UL == 7\n#    define BOOST_PP_SLOT_TEMP_2 7\n# elif BOOST_PP_SLOT_OFFSET_3(BOOST_PP_VALUE) / 10UL == 8\n#    define BOOST_PP_SLOT_TEMP_2 8\n# elif BOOST_PP_SLOT_OFFSET_3(BOOST_PP_VALUE) / 10UL == 9\n#    define BOOST_PP_SLOT_TEMP_2 9\n# endif\n#\n# if BOOST_PP_SLOT_OFFSET_2(BOOST_PP_VALUE) == 0\n#    define BOOST_PP_SLOT_TEMP_1 0\n# elif BOOST_PP_SLOT_OFFSET_2(BOOST_PP_VALUE) == 1\n#    define BOOST_PP_SLOT_TEMP_1 1\n# elif BOOST_PP_SLOT_OFFSET_2(BOOST_PP_VALUE) == 2\n#    define BOOST_PP_SLOT_TEMP_1 2\n# elif BOOST_PP_SLOT_OFFSET_2(BOOST_PP_VALUE) == 3\n#    define BOOST_PP_SLOT_TEMP_1 3\n# elif BOOST_PP_SLOT_OFFSET_2(BOOST_PP_VALUE) == 4\n#    define BOOST_PP_SLOT_TEMP_1 4\n# elif BOOST_PP_SLOT_OFFSET_2(BOOST_PP_VALUE) == 5\n#    define BOOST_PP_SLOT_TEMP_1 5\n# elif BOOST_PP_SLOT_OFFSET_2(BOOST_PP_VALUE) == 6\n#    define BOOST_PP_SLOT_TEMP_1 6\n# elif BOOST_PP_SLOT_OFFSET_2(BOOST_PP_VALUE) == 7\n#    define BOOST_PP_SLOT_TEMP_1 7\n# elif BOOST_PP_SLOT_OFFSET_2(BOOST_PP_VALUE) == 8\n#    define BOOST_PP_SLOT_TEMP_1 8\n# elif BOOST_PP_SLOT_OFFSET_2(BOOST_PP_VALUE) == 9\n#    define BOOST_PP_SLOT_TEMP_1 9\n# endif\n#\n# undef BOOST_PP_VALUE\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/slot/detail/slot1.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_SLOT_1\n#\n# undef BOOST_PP_SLOT_1_DIGIT_1\n# undef BOOST_PP_SLOT_1_DIGIT_2\n# undef BOOST_PP_SLOT_1_DIGIT_3\n# undef BOOST_PP_SLOT_1_DIGIT_4\n# undef BOOST_PP_SLOT_1_DIGIT_5\n# undef BOOST_PP_SLOT_1_DIGIT_6\n# undef BOOST_PP_SLOT_1_DIGIT_7\n# undef BOOST_PP_SLOT_1_DIGIT_8\n# undef BOOST_PP_SLOT_1_DIGIT_9\n# undef BOOST_PP_SLOT_1_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_10 == 0\n#    define BOOST_PP_SLOT_1_DIGIT_10 0\n# elif BOOST_PP_SLOT_TEMP_10 == 1\n#    define BOOST_PP_SLOT_1_DIGIT_10 1\n# elif BOOST_PP_SLOT_TEMP_10 == 2\n#    define BOOST_PP_SLOT_1_DIGIT_10 2\n# elif BOOST_PP_SLOT_TEMP_10 == 3\n#    define BOOST_PP_SLOT_1_DIGIT_10 3\n# elif BOOST_PP_SLOT_TEMP_10 == 4\n#    define BOOST_PP_SLOT_1_DIGIT_10 4\n# elif BOOST_PP_SLOT_TEMP_10 == 5\n#    define BOOST_PP_SLOT_1_DIGIT_10 5\n# elif BOOST_PP_SLOT_TEMP_10 == 6\n#    define BOOST_PP_SLOT_1_DIGIT_10 6\n# elif BOOST_PP_SLOT_TEMP_10 == 7\n#    define BOOST_PP_SLOT_1_DIGIT_10 7\n# elif BOOST_PP_SLOT_TEMP_10 == 8\n#    define BOOST_PP_SLOT_1_DIGIT_10 8\n# elif BOOST_PP_SLOT_TEMP_10 == 9\n#    define BOOST_PP_SLOT_1_DIGIT_10 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_9 == 0\n#    define BOOST_PP_SLOT_1_DIGIT_9 0\n# elif BOOST_PP_SLOT_TEMP_9 == 1\n#    define BOOST_PP_SLOT_1_DIGIT_9 1\n# elif BOOST_PP_SLOT_TEMP_9 == 2\n#    define BOOST_PP_SLOT_1_DIGIT_9 2\n# elif BOOST_PP_SLOT_TEMP_9 == 3\n#    define BOOST_PP_SLOT_1_DIGIT_9 3\n# elif BOOST_PP_SLOT_TEMP_9 == 4\n#    define BOOST_PP_SLOT_1_DIGIT_9 4\n# elif BOOST_PP_SLOT_TEMP_9 == 5\n#    define BOOST_PP_SLOT_1_DIGIT_9 5\n# elif BOOST_PP_SLOT_TEMP_9 == 6\n#    define BOOST_PP_SLOT_1_DIGIT_9 6\n# elif BOOST_PP_SLOT_TEMP_9 == 7\n#    define BOOST_PP_SLOT_1_DIGIT_9 7\n# elif BOOST_PP_SLOT_TEMP_9 == 8\n#    define BOOST_PP_SLOT_1_DIGIT_9 8\n# elif BOOST_PP_SLOT_TEMP_9 == 9\n#    define BOOST_PP_SLOT_1_DIGIT_9 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_8 == 0\n#    define BOOST_PP_SLOT_1_DIGIT_8 0\n# elif BOOST_PP_SLOT_TEMP_8 == 1\n#    define BOOST_PP_SLOT_1_DIGIT_8 1\n# elif BOOST_PP_SLOT_TEMP_8 == 2\n#    define BOOST_PP_SLOT_1_DIGIT_8 2\n# elif BOOST_PP_SLOT_TEMP_8 == 3\n#    define BOOST_PP_SLOT_1_DIGIT_8 3\n# elif BOOST_PP_SLOT_TEMP_8 == 4\n#    define BOOST_PP_SLOT_1_DIGIT_8 4\n# elif BOOST_PP_SLOT_TEMP_8 == 5\n#    define BOOST_PP_SLOT_1_DIGIT_8 5\n# elif BOOST_PP_SLOT_TEMP_8 == 6\n#    define BOOST_PP_SLOT_1_DIGIT_8 6\n# elif BOOST_PP_SLOT_TEMP_8 == 7\n#    define BOOST_PP_SLOT_1_DIGIT_8 7\n# elif BOOST_PP_SLOT_TEMP_8 == 8\n#    define BOOST_PP_SLOT_1_DIGIT_8 8\n# elif BOOST_PP_SLOT_TEMP_8 == 9\n#    define BOOST_PP_SLOT_1_DIGIT_8 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_7 == 0\n#    define BOOST_PP_SLOT_1_DIGIT_7 0\n# elif BOOST_PP_SLOT_TEMP_7 == 1\n#    define BOOST_PP_SLOT_1_DIGIT_7 1\n# elif BOOST_PP_SLOT_TEMP_7 == 2\n#    define BOOST_PP_SLOT_1_DIGIT_7 2\n# elif BOOST_PP_SLOT_TEMP_7 == 3\n#    define BOOST_PP_SLOT_1_DIGIT_7 3\n# elif BOOST_PP_SLOT_TEMP_7 == 4\n#    define BOOST_PP_SLOT_1_DIGIT_7 4\n# elif BOOST_PP_SLOT_TEMP_7 == 5\n#    define BOOST_PP_SLOT_1_DIGIT_7 5\n# elif BOOST_PP_SLOT_TEMP_7 == 6\n#    define BOOST_PP_SLOT_1_DIGIT_7 6\n# elif BOOST_PP_SLOT_TEMP_7 == 7\n#    define BOOST_PP_SLOT_1_DIGIT_7 7\n# elif BOOST_PP_SLOT_TEMP_7 == 8\n#    define BOOST_PP_SLOT_1_DIGIT_7 8\n# elif BOOST_PP_SLOT_TEMP_7 == 9\n#    define BOOST_PP_SLOT_1_DIGIT_7 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_6 == 0\n#    define BOOST_PP_SLOT_1_DIGIT_6 0\n# elif BOOST_PP_SLOT_TEMP_6 == 1\n#    define BOOST_PP_SLOT_1_DIGIT_6 1\n# elif BOOST_PP_SLOT_TEMP_6 == 2\n#    define BOOST_PP_SLOT_1_DIGIT_6 2\n# elif BOOST_PP_SLOT_TEMP_6 == 3\n#    define BOOST_PP_SLOT_1_DIGIT_6 3\n# elif BOOST_PP_SLOT_TEMP_6 == 4\n#    define BOOST_PP_SLOT_1_DIGIT_6 4\n# elif BOOST_PP_SLOT_TEMP_6 == 5\n#    define BOOST_PP_SLOT_1_DIGIT_6 5\n# elif BOOST_PP_SLOT_TEMP_6 == 6\n#    define BOOST_PP_SLOT_1_DIGIT_6 6\n# elif BOOST_PP_SLOT_TEMP_6 == 7\n#    define BOOST_PP_SLOT_1_DIGIT_6 7\n# elif BOOST_PP_SLOT_TEMP_6 == 8\n#    define BOOST_PP_SLOT_1_DIGIT_6 8\n# elif BOOST_PP_SLOT_TEMP_6 == 9\n#    define BOOST_PP_SLOT_1_DIGIT_6 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_5 == 0\n#    define BOOST_PP_SLOT_1_DIGIT_5 0\n# elif BOOST_PP_SLOT_TEMP_5 == 1\n#    define BOOST_PP_SLOT_1_DIGIT_5 1\n# elif BOOST_PP_SLOT_TEMP_5 == 2\n#    define BOOST_PP_SLOT_1_DIGIT_5 2\n# elif BOOST_PP_SLOT_TEMP_5 == 3\n#    define BOOST_PP_SLOT_1_DIGIT_5 3\n# elif BOOST_PP_SLOT_TEMP_5 == 4\n#    define BOOST_PP_SLOT_1_DIGIT_5 4\n# elif BOOST_PP_SLOT_TEMP_5 == 5\n#    define BOOST_PP_SLOT_1_DIGIT_5 5\n# elif BOOST_PP_SLOT_TEMP_5 == 6\n#    define BOOST_PP_SLOT_1_DIGIT_5 6\n# elif BOOST_PP_SLOT_TEMP_5 == 7\n#    define BOOST_PP_SLOT_1_DIGIT_5 7\n# elif BOOST_PP_SLOT_TEMP_5 == 8\n#    define BOOST_PP_SLOT_1_DIGIT_5 8\n# elif BOOST_PP_SLOT_TEMP_5 == 9\n#    define BOOST_PP_SLOT_1_DIGIT_5 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_4 == 0\n#    define BOOST_PP_SLOT_1_DIGIT_4 0\n# elif BOOST_PP_SLOT_TEMP_4 == 1\n#    define BOOST_PP_SLOT_1_DIGIT_4 1\n# elif BOOST_PP_SLOT_TEMP_4 == 2\n#    define BOOST_PP_SLOT_1_DIGIT_4 2\n# elif BOOST_PP_SLOT_TEMP_4 == 3\n#    define BOOST_PP_SLOT_1_DIGIT_4 3\n# elif BOOST_PP_SLOT_TEMP_4 == 4\n#    define BOOST_PP_SLOT_1_DIGIT_4 4\n# elif BOOST_PP_SLOT_TEMP_4 == 5\n#    define BOOST_PP_SLOT_1_DIGIT_4 5\n# elif BOOST_PP_SLOT_TEMP_4 == 6\n#    define BOOST_PP_SLOT_1_DIGIT_4 6\n# elif BOOST_PP_SLOT_TEMP_4 == 7\n#    define BOOST_PP_SLOT_1_DIGIT_4 7\n# elif BOOST_PP_SLOT_TEMP_4 == 8\n#    define BOOST_PP_SLOT_1_DIGIT_4 8\n# elif BOOST_PP_SLOT_TEMP_4 == 9\n#    define BOOST_PP_SLOT_1_DIGIT_4 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_SLOT_1_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_SLOT_1_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_SLOT_1_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_SLOT_1_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_SLOT_1_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_SLOT_1_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_SLOT_1_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_SLOT_1_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_SLOT_1_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_SLOT_1_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_SLOT_1_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_SLOT_1_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_SLOT_1_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_SLOT_1_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_SLOT_1_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_SLOT_1_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_SLOT_1_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_SLOT_1_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_SLOT_1_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_SLOT_1_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_SLOT_1_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_SLOT_1_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_SLOT_1_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_SLOT_1_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_SLOT_1_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_SLOT_1_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_SLOT_1_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_SLOT_1_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_SLOT_1_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_SLOT_1_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_SLOT_1_DIGIT_10\n#    define BOOST_PP_SLOT_1() BOOST_PP_SLOT_CC_10(BOOST_PP_SLOT_1_DIGIT_10, BOOST_PP_SLOT_1_DIGIT_9, BOOST_PP_SLOT_1_DIGIT_8, BOOST_PP_SLOT_1_DIGIT_7, BOOST_PP_SLOT_1_DIGIT_6, BOOST_PP_SLOT_1_DIGIT_5, BOOST_PP_SLOT_1_DIGIT_4, BOOST_PP_SLOT_1_DIGIT_3, BOOST_PP_SLOT_1_DIGIT_2, BOOST_PP_SLOT_1_DIGIT_1)\n# elif BOOST_PP_SLOT_1_DIGIT_9\n#    define BOOST_PP_SLOT_1() BOOST_PP_SLOT_CC_9(BOOST_PP_SLOT_1_DIGIT_9, BOOST_PP_SLOT_1_DIGIT_8, BOOST_PP_SLOT_1_DIGIT_7, BOOST_PP_SLOT_1_DIGIT_6, BOOST_PP_SLOT_1_DIGIT_5, BOOST_PP_SLOT_1_DIGIT_4, BOOST_PP_SLOT_1_DIGIT_3, BOOST_PP_SLOT_1_DIGIT_2, BOOST_PP_SLOT_1_DIGIT_1)\n# elif BOOST_PP_SLOT_1_DIGIT_8\n#    define BOOST_PP_SLOT_1() BOOST_PP_SLOT_CC_8(BOOST_PP_SLOT_1_DIGIT_8, BOOST_PP_SLOT_1_DIGIT_7, BOOST_PP_SLOT_1_DIGIT_6, BOOST_PP_SLOT_1_DIGIT_5, BOOST_PP_SLOT_1_DIGIT_4, BOOST_PP_SLOT_1_DIGIT_3, BOOST_PP_SLOT_1_DIGIT_2, BOOST_PP_SLOT_1_DIGIT_1)\n# elif BOOST_PP_SLOT_1_DIGIT_7\n#    define BOOST_PP_SLOT_1() BOOST_PP_SLOT_CC_7(BOOST_PP_SLOT_1_DIGIT_7, BOOST_PP_SLOT_1_DIGIT_6, BOOST_PP_SLOT_1_DIGIT_5, BOOST_PP_SLOT_1_DIGIT_4, BOOST_PP_SLOT_1_DIGIT_3, BOOST_PP_SLOT_1_DIGIT_2, BOOST_PP_SLOT_1_DIGIT_1)\n# elif BOOST_PP_SLOT_1_DIGIT_6\n#    define BOOST_PP_SLOT_1() BOOST_PP_SLOT_CC_6(BOOST_PP_SLOT_1_DIGIT_6, BOOST_PP_SLOT_1_DIGIT_5, BOOST_PP_SLOT_1_DIGIT_4, BOOST_PP_SLOT_1_DIGIT_3, BOOST_PP_SLOT_1_DIGIT_2, BOOST_PP_SLOT_1_DIGIT_1)\n# elif BOOST_PP_SLOT_1_DIGIT_5\n#    define BOOST_PP_SLOT_1() BOOST_PP_SLOT_CC_5(BOOST_PP_SLOT_1_DIGIT_5, BOOST_PP_SLOT_1_DIGIT_4, BOOST_PP_SLOT_1_DIGIT_3, BOOST_PP_SLOT_1_DIGIT_2, BOOST_PP_SLOT_1_DIGIT_1)\n# elif BOOST_PP_SLOT_1_DIGIT_4\n#    define BOOST_PP_SLOT_1() BOOST_PP_SLOT_CC_4(BOOST_PP_SLOT_1_DIGIT_4, BOOST_PP_SLOT_1_DIGIT_3, BOOST_PP_SLOT_1_DIGIT_2, BOOST_PP_SLOT_1_DIGIT_1)\n# elif BOOST_PP_SLOT_1_DIGIT_3\n#    define BOOST_PP_SLOT_1() BOOST_PP_SLOT_CC_3(BOOST_PP_SLOT_1_DIGIT_3, BOOST_PP_SLOT_1_DIGIT_2, BOOST_PP_SLOT_1_DIGIT_1)\n# elif BOOST_PP_SLOT_1_DIGIT_2\n#    define BOOST_PP_SLOT_1() BOOST_PP_SLOT_CC_2(BOOST_PP_SLOT_1_DIGIT_2, BOOST_PP_SLOT_1_DIGIT_1)\n# else\n#    define BOOST_PP_SLOT_1() BOOST_PP_SLOT_1_DIGIT_1\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/slot/detail/slot2.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_SLOT_2\n#\n# undef BOOST_PP_SLOT_2_DIGIT_1\n# undef BOOST_PP_SLOT_2_DIGIT_2\n# undef BOOST_PP_SLOT_2_DIGIT_3\n# undef BOOST_PP_SLOT_2_DIGIT_4\n# undef BOOST_PP_SLOT_2_DIGIT_5\n# undef BOOST_PP_SLOT_2_DIGIT_6\n# undef BOOST_PP_SLOT_2_DIGIT_7\n# undef BOOST_PP_SLOT_2_DIGIT_8\n# undef BOOST_PP_SLOT_2_DIGIT_9\n# undef BOOST_PP_SLOT_2_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_10 == 0\n#    define BOOST_PP_SLOT_2_DIGIT_10 0\n# elif BOOST_PP_SLOT_TEMP_10 == 1\n#    define BOOST_PP_SLOT_2_DIGIT_10 1\n# elif BOOST_PP_SLOT_TEMP_10 == 2\n#    define BOOST_PP_SLOT_2_DIGIT_10 2\n# elif BOOST_PP_SLOT_TEMP_10 == 3\n#    define BOOST_PP_SLOT_2_DIGIT_10 3\n# elif BOOST_PP_SLOT_TEMP_10 == 4\n#    define BOOST_PP_SLOT_2_DIGIT_10 4\n# elif BOOST_PP_SLOT_TEMP_10 == 5\n#    define BOOST_PP_SLOT_2_DIGIT_10 5\n# elif BOOST_PP_SLOT_TEMP_10 == 6\n#    define BOOST_PP_SLOT_2_DIGIT_10 6\n# elif BOOST_PP_SLOT_TEMP_10 == 7\n#    define BOOST_PP_SLOT_2_DIGIT_10 7\n# elif BOOST_PP_SLOT_TEMP_10 == 8\n#    define BOOST_PP_SLOT_2_DIGIT_10 8\n# elif BOOST_PP_SLOT_TEMP_10 == 9\n#    define BOOST_PP_SLOT_2_DIGIT_10 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_9 == 0\n#    define BOOST_PP_SLOT_2_DIGIT_9 0\n# elif BOOST_PP_SLOT_TEMP_9 == 1\n#    define BOOST_PP_SLOT_2_DIGIT_9 1\n# elif BOOST_PP_SLOT_TEMP_9 == 2\n#    define BOOST_PP_SLOT_2_DIGIT_9 2\n# elif BOOST_PP_SLOT_TEMP_9 == 3\n#    define BOOST_PP_SLOT_2_DIGIT_9 3\n# elif BOOST_PP_SLOT_TEMP_9 == 4\n#    define BOOST_PP_SLOT_2_DIGIT_9 4\n# elif BOOST_PP_SLOT_TEMP_9 == 5\n#    define BOOST_PP_SLOT_2_DIGIT_9 5\n# elif BOOST_PP_SLOT_TEMP_9 == 6\n#    define BOOST_PP_SLOT_2_DIGIT_9 6\n# elif BOOST_PP_SLOT_TEMP_9 == 7\n#    define BOOST_PP_SLOT_2_DIGIT_9 7\n# elif BOOST_PP_SLOT_TEMP_9 == 8\n#    define BOOST_PP_SLOT_2_DIGIT_9 8\n# elif BOOST_PP_SLOT_TEMP_9 == 9\n#    define BOOST_PP_SLOT_2_DIGIT_9 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_8 == 0\n#    define BOOST_PP_SLOT_2_DIGIT_8 0\n# elif BOOST_PP_SLOT_TEMP_8 == 1\n#    define BOOST_PP_SLOT_2_DIGIT_8 1\n# elif BOOST_PP_SLOT_TEMP_8 == 2\n#    define BOOST_PP_SLOT_2_DIGIT_8 2\n# elif BOOST_PP_SLOT_TEMP_8 == 3\n#    define BOOST_PP_SLOT_2_DIGIT_8 3\n# elif BOOST_PP_SLOT_TEMP_8 == 4\n#    define BOOST_PP_SLOT_2_DIGIT_8 4\n# elif BOOST_PP_SLOT_TEMP_8 == 5\n#    define BOOST_PP_SLOT_2_DIGIT_8 5\n# elif BOOST_PP_SLOT_TEMP_8 == 6\n#    define BOOST_PP_SLOT_2_DIGIT_8 6\n# elif BOOST_PP_SLOT_TEMP_8 == 7\n#    define BOOST_PP_SLOT_2_DIGIT_8 7\n# elif BOOST_PP_SLOT_TEMP_8 == 8\n#    define BOOST_PP_SLOT_2_DIGIT_8 8\n# elif BOOST_PP_SLOT_TEMP_8 == 9\n#    define BOOST_PP_SLOT_2_DIGIT_8 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_7 == 0\n#    define BOOST_PP_SLOT_2_DIGIT_7 0\n# elif BOOST_PP_SLOT_TEMP_7 == 1\n#    define BOOST_PP_SLOT_2_DIGIT_7 1\n# elif BOOST_PP_SLOT_TEMP_7 == 2\n#    define BOOST_PP_SLOT_2_DIGIT_7 2\n# elif BOOST_PP_SLOT_TEMP_7 == 3\n#    define BOOST_PP_SLOT_2_DIGIT_7 3\n# elif BOOST_PP_SLOT_TEMP_7 == 4\n#    define BOOST_PP_SLOT_2_DIGIT_7 4\n# elif BOOST_PP_SLOT_TEMP_7 == 5\n#    define BOOST_PP_SLOT_2_DIGIT_7 5\n# elif BOOST_PP_SLOT_TEMP_7 == 6\n#    define BOOST_PP_SLOT_2_DIGIT_7 6\n# elif BOOST_PP_SLOT_TEMP_7 == 7\n#    define BOOST_PP_SLOT_2_DIGIT_7 7\n# elif BOOST_PP_SLOT_TEMP_7 == 8\n#    define BOOST_PP_SLOT_2_DIGIT_7 8\n# elif BOOST_PP_SLOT_TEMP_7 == 9\n#    define BOOST_PP_SLOT_2_DIGIT_7 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_6 == 0\n#    define BOOST_PP_SLOT_2_DIGIT_6 0\n# elif BOOST_PP_SLOT_TEMP_6 == 1\n#    define BOOST_PP_SLOT_2_DIGIT_6 1\n# elif BOOST_PP_SLOT_TEMP_6 == 2\n#    define BOOST_PP_SLOT_2_DIGIT_6 2\n# elif BOOST_PP_SLOT_TEMP_6 == 3\n#    define BOOST_PP_SLOT_2_DIGIT_6 3\n# elif BOOST_PP_SLOT_TEMP_6 == 4\n#    define BOOST_PP_SLOT_2_DIGIT_6 4\n# elif BOOST_PP_SLOT_TEMP_6 == 5\n#    define BOOST_PP_SLOT_2_DIGIT_6 5\n# elif BOOST_PP_SLOT_TEMP_6 == 6\n#    define BOOST_PP_SLOT_2_DIGIT_6 6\n# elif BOOST_PP_SLOT_TEMP_6 == 7\n#    define BOOST_PP_SLOT_2_DIGIT_6 7\n# elif BOOST_PP_SLOT_TEMP_6 == 8\n#    define BOOST_PP_SLOT_2_DIGIT_6 8\n# elif BOOST_PP_SLOT_TEMP_6 == 9\n#    define BOOST_PP_SLOT_2_DIGIT_6 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_5 == 0\n#    define BOOST_PP_SLOT_2_DIGIT_5 0\n# elif BOOST_PP_SLOT_TEMP_5 == 1\n#    define BOOST_PP_SLOT_2_DIGIT_5 1\n# elif BOOST_PP_SLOT_TEMP_5 == 2\n#    define BOOST_PP_SLOT_2_DIGIT_5 2\n# elif BOOST_PP_SLOT_TEMP_5 == 3\n#    define BOOST_PP_SLOT_2_DIGIT_5 3\n# elif BOOST_PP_SLOT_TEMP_5 == 4\n#    define BOOST_PP_SLOT_2_DIGIT_5 4\n# elif BOOST_PP_SLOT_TEMP_5 == 5\n#    define BOOST_PP_SLOT_2_DIGIT_5 5\n# elif BOOST_PP_SLOT_TEMP_5 == 6\n#    define BOOST_PP_SLOT_2_DIGIT_5 6\n# elif BOOST_PP_SLOT_TEMP_5 == 7\n#    define BOOST_PP_SLOT_2_DIGIT_5 7\n# elif BOOST_PP_SLOT_TEMP_5 == 8\n#    define BOOST_PP_SLOT_2_DIGIT_5 8\n# elif BOOST_PP_SLOT_TEMP_5 == 9\n#    define BOOST_PP_SLOT_2_DIGIT_5 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_4 == 0\n#    define BOOST_PP_SLOT_2_DIGIT_4 0\n# elif BOOST_PP_SLOT_TEMP_4 == 1\n#    define BOOST_PP_SLOT_2_DIGIT_4 1\n# elif BOOST_PP_SLOT_TEMP_4 == 2\n#    define BOOST_PP_SLOT_2_DIGIT_4 2\n# elif BOOST_PP_SLOT_TEMP_4 == 3\n#    define BOOST_PP_SLOT_2_DIGIT_4 3\n# elif BOOST_PP_SLOT_TEMP_4 == 4\n#    define BOOST_PP_SLOT_2_DIGIT_4 4\n# elif BOOST_PP_SLOT_TEMP_4 == 5\n#    define BOOST_PP_SLOT_2_DIGIT_4 5\n# elif BOOST_PP_SLOT_TEMP_4 == 6\n#    define BOOST_PP_SLOT_2_DIGIT_4 6\n# elif BOOST_PP_SLOT_TEMP_4 == 7\n#    define BOOST_PP_SLOT_2_DIGIT_4 7\n# elif BOOST_PP_SLOT_TEMP_4 == 8\n#    define BOOST_PP_SLOT_2_DIGIT_4 8\n# elif BOOST_PP_SLOT_TEMP_4 == 9\n#    define BOOST_PP_SLOT_2_DIGIT_4 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_SLOT_2_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_SLOT_2_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_SLOT_2_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_SLOT_2_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_SLOT_2_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_SLOT_2_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_SLOT_2_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_SLOT_2_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_SLOT_2_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_SLOT_2_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_SLOT_2_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_SLOT_2_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_SLOT_2_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_SLOT_2_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_SLOT_2_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_SLOT_2_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_SLOT_2_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_SLOT_2_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_SLOT_2_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_SLOT_2_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_SLOT_2_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_SLOT_2_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_SLOT_2_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_SLOT_2_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_SLOT_2_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_SLOT_2_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_SLOT_2_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_SLOT_2_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_SLOT_2_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_SLOT_2_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_SLOT_2_DIGIT_10\n#    define BOOST_PP_SLOT_2() BOOST_PP_SLOT_CC_10(BOOST_PP_SLOT_2_DIGIT_10, BOOST_PP_SLOT_2_DIGIT_9, BOOST_PP_SLOT_2_DIGIT_8, BOOST_PP_SLOT_2_DIGIT_7, BOOST_PP_SLOT_2_DIGIT_6, BOOST_PP_SLOT_2_DIGIT_5, BOOST_PP_SLOT_2_DIGIT_4, BOOST_PP_SLOT_2_DIGIT_3, BOOST_PP_SLOT_2_DIGIT_2, BOOST_PP_SLOT_2_DIGIT_1)\n# elif BOOST_PP_SLOT_2_DIGIT_9\n#    define BOOST_PP_SLOT_2() BOOST_PP_SLOT_CC_9(BOOST_PP_SLOT_2_DIGIT_9, BOOST_PP_SLOT_2_DIGIT_8, BOOST_PP_SLOT_2_DIGIT_7, BOOST_PP_SLOT_2_DIGIT_6, BOOST_PP_SLOT_2_DIGIT_5, BOOST_PP_SLOT_2_DIGIT_4, BOOST_PP_SLOT_2_DIGIT_3, BOOST_PP_SLOT_2_DIGIT_2, BOOST_PP_SLOT_2_DIGIT_1)\n# elif BOOST_PP_SLOT_2_DIGIT_8\n#    define BOOST_PP_SLOT_2() BOOST_PP_SLOT_CC_8(BOOST_PP_SLOT_2_DIGIT_8, BOOST_PP_SLOT_2_DIGIT_7, BOOST_PP_SLOT_2_DIGIT_6, BOOST_PP_SLOT_2_DIGIT_5, BOOST_PP_SLOT_2_DIGIT_4, BOOST_PP_SLOT_2_DIGIT_3, BOOST_PP_SLOT_2_DIGIT_2, BOOST_PP_SLOT_2_DIGIT_1)\n# elif BOOST_PP_SLOT_2_DIGIT_7\n#    define BOOST_PP_SLOT_2() BOOST_PP_SLOT_CC_7(BOOST_PP_SLOT_2_DIGIT_7, BOOST_PP_SLOT_2_DIGIT_6, BOOST_PP_SLOT_2_DIGIT_5, BOOST_PP_SLOT_2_DIGIT_4, BOOST_PP_SLOT_2_DIGIT_3, BOOST_PP_SLOT_2_DIGIT_2, BOOST_PP_SLOT_2_DIGIT_1)\n# elif BOOST_PP_SLOT_2_DIGIT_6\n#    define BOOST_PP_SLOT_2() BOOST_PP_SLOT_CC_6(BOOST_PP_SLOT_2_DIGIT_6, BOOST_PP_SLOT_2_DIGIT_5, BOOST_PP_SLOT_2_DIGIT_4, BOOST_PP_SLOT_2_DIGIT_3, BOOST_PP_SLOT_2_DIGIT_2, BOOST_PP_SLOT_2_DIGIT_1)\n# elif BOOST_PP_SLOT_2_DIGIT_5\n#    define BOOST_PP_SLOT_2() BOOST_PP_SLOT_CC_5(BOOST_PP_SLOT_2_DIGIT_5, BOOST_PP_SLOT_2_DIGIT_4, BOOST_PP_SLOT_2_DIGIT_3, BOOST_PP_SLOT_2_DIGIT_2, BOOST_PP_SLOT_2_DIGIT_1)\n# elif BOOST_PP_SLOT_2_DIGIT_4\n#    define BOOST_PP_SLOT_2() BOOST_PP_SLOT_CC_4(BOOST_PP_SLOT_2_DIGIT_4, BOOST_PP_SLOT_2_DIGIT_3, BOOST_PP_SLOT_2_DIGIT_2, BOOST_PP_SLOT_2_DIGIT_1)\n# elif BOOST_PP_SLOT_2_DIGIT_3\n#    define BOOST_PP_SLOT_2() BOOST_PP_SLOT_CC_3(BOOST_PP_SLOT_2_DIGIT_3, BOOST_PP_SLOT_2_DIGIT_2, BOOST_PP_SLOT_2_DIGIT_1)\n# elif BOOST_PP_SLOT_2_DIGIT_2\n#    define BOOST_PP_SLOT_2() BOOST_PP_SLOT_CC_2(BOOST_PP_SLOT_2_DIGIT_2, BOOST_PP_SLOT_2_DIGIT_1)\n# else\n#    define BOOST_PP_SLOT_2() BOOST_PP_SLOT_2_DIGIT_1\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/slot/detail/slot3.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_SLOT_3\n#\n# undef BOOST_PP_SLOT_3_DIGIT_1\n# undef BOOST_PP_SLOT_3_DIGIT_2\n# undef BOOST_PP_SLOT_3_DIGIT_3\n# undef BOOST_PP_SLOT_3_DIGIT_4\n# undef BOOST_PP_SLOT_3_DIGIT_5\n# undef BOOST_PP_SLOT_3_DIGIT_6\n# undef BOOST_PP_SLOT_3_DIGIT_7\n# undef BOOST_PP_SLOT_3_DIGIT_8\n# undef BOOST_PP_SLOT_3_DIGIT_9\n# undef BOOST_PP_SLOT_3_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_10 == 0\n#    define BOOST_PP_SLOT_3_DIGIT_10 0\n# elif BOOST_PP_SLOT_TEMP_10 == 1\n#    define BOOST_PP_SLOT_3_DIGIT_10 1\n# elif BOOST_PP_SLOT_TEMP_10 == 2\n#    define BOOST_PP_SLOT_3_DIGIT_10 2\n# elif BOOST_PP_SLOT_TEMP_10 == 3\n#    define BOOST_PP_SLOT_3_DIGIT_10 3\n# elif BOOST_PP_SLOT_TEMP_10 == 4\n#    define BOOST_PP_SLOT_3_DIGIT_10 4\n# elif BOOST_PP_SLOT_TEMP_10 == 5\n#    define BOOST_PP_SLOT_3_DIGIT_10 5\n# elif BOOST_PP_SLOT_TEMP_10 == 6\n#    define BOOST_PP_SLOT_3_DIGIT_10 6\n# elif BOOST_PP_SLOT_TEMP_10 == 7\n#    define BOOST_PP_SLOT_3_DIGIT_10 7\n# elif BOOST_PP_SLOT_TEMP_10 == 8\n#    define BOOST_PP_SLOT_3_DIGIT_10 8\n# elif BOOST_PP_SLOT_TEMP_10 == 9\n#    define BOOST_PP_SLOT_3_DIGIT_10 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_9 == 0\n#    define BOOST_PP_SLOT_3_DIGIT_9 0\n# elif BOOST_PP_SLOT_TEMP_9 == 1\n#    define BOOST_PP_SLOT_3_DIGIT_9 1\n# elif BOOST_PP_SLOT_TEMP_9 == 2\n#    define BOOST_PP_SLOT_3_DIGIT_9 2\n# elif BOOST_PP_SLOT_TEMP_9 == 3\n#    define BOOST_PP_SLOT_3_DIGIT_9 3\n# elif BOOST_PP_SLOT_TEMP_9 == 4\n#    define BOOST_PP_SLOT_3_DIGIT_9 4\n# elif BOOST_PP_SLOT_TEMP_9 == 5\n#    define BOOST_PP_SLOT_3_DIGIT_9 5\n# elif BOOST_PP_SLOT_TEMP_9 == 6\n#    define BOOST_PP_SLOT_3_DIGIT_9 6\n# elif BOOST_PP_SLOT_TEMP_9 == 7\n#    define BOOST_PP_SLOT_3_DIGIT_9 7\n# elif BOOST_PP_SLOT_TEMP_9 == 8\n#    define BOOST_PP_SLOT_3_DIGIT_9 8\n# elif BOOST_PP_SLOT_TEMP_9 == 9\n#    define BOOST_PP_SLOT_3_DIGIT_9 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_8 == 0\n#    define BOOST_PP_SLOT_3_DIGIT_8 0\n# elif BOOST_PP_SLOT_TEMP_8 == 1\n#    define BOOST_PP_SLOT_3_DIGIT_8 1\n# elif BOOST_PP_SLOT_TEMP_8 == 2\n#    define BOOST_PP_SLOT_3_DIGIT_8 2\n# elif BOOST_PP_SLOT_TEMP_8 == 3\n#    define BOOST_PP_SLOT_3_DIGIT_8 3\n# elif BOOST_PP_SLOT_TEMP_8 == 4\n#    define BOOST_PP_SLOT_3_DIGIT_8 4\n# elif BOOST_PP_SLOT_TEMP_8 == 5\n#    define BOOST_PP_SLOT_3_DIGIT_8 5\n# elif BOOST_PP_SLOT_TEMP_8 == 6\n#    define BOOST_PP_SLOT_3_DIGIT_8 6\n# elif BOOST_PP_SLOT_TEMP_8 == 7\n#    define BOOST_PP_SLOT_3_DIGIT_8 7\n# elif BOOST_PP_SLOT_TEMP_8 == 8\n#    define BOOST_PP_SLOT_3_DIGIT_8 8\n# elif BOOST_PP_SLOT_TEMP_8 == 9\n#    define BOOST_PP_SLOT_3_DIGIT_8 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_7 == 0\n#    define BOOST_PP_SLOT_3_DIGIT_7 0\n# elif BOOST_PP_SLOT_TEMP_7 == 1\n#    define BOOST_PP_SLOT_3_DIGIT_7 1\n# elif BOOST_PP_SLOT_TEMP_7 == 2\n#    define BOOST_PP_SLOT_3_DIGIT_7 2\n# elif BOOST_PP_SLOT_TEMP_7 == 3\n#    define BOOST_PP_SLOT_3_DIGIT_7 3\n# elif BOOST_PP_SLOT_TEMP_7 == 4\n#    define BOOST_PP_SLOT_3_DIGIT_7 4\n# elif BOOST_PP_SLOT_TEMP_7 == 5\n#    define BOOST_PP_SLOT_3_DIGIT_7 5\n# elif BOOST_PP_SLOT_TEMP_7 == 6\n#    define BOOST_PP_SLOT_3_DIGIT_7 6\n# elif BOOST_PP_SLOT_TEMP_7 == 7\n#    define BOOST_PP_SLOT_3_DIGIT_7 7\n# elif BOOST_PP_SLOT_TEMP_7 == 8\n#    define BOOST_PP_SLOT_3_DIGIT_7 8\n# elif BOOST_PP_SLOT_TEMP_7 == 9\n#    define BOOST_PP_SLOT_3_DIGIT_7 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_6 == 0\n#    define BOOST_PP_SLOT_3_DIGIT_6 0\n# elif BOOST_PP_SLOT_TEMP_6 == 1\n#    define BOOST_PP_SLOT_3_DIGIT_6 1\n# elif BOOST_PP_SLOT_TEMP_6 == 2\n#    define BOOST_PP_SLOT_3_DIGIT_6 2\n# elif BOOST_PP_SLOT_TEMP_6 == 3\n#    define BOOST_PP_SLOT_3_DIGIT_6 3\n# elif BOOST_PP_SLOT_TEMP_6 == 4\n#    define BOOST_PP_SLOT_3_DIGIT_6 4\n# elif BOOST_PP_SLOT_TEMP_6 == 5\n#    define BOOST_PP_SLOT_3_DIGIT_6 5\n# elif BOOST_PP_SLOT_TEMP_6 == 6\n#    define BOOST_PP_SLOT_3_DIGIT_6 6\n# elif BOOST_PP_SLOT_TEMP_6 == 7\n#    define BOOST_PP_SLOT_3_DIGIT_6 7\n# elif BOOST_PP_SLOT_TEMP_6 == 8\n#    define BOOST_PP_SLOT_3_DIGIT_6 8\n# elif BOOST_PP_SLOT_TEMP_6 == 9\n#    define BOOST_PP_SLOT_3_DIGIT_6 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_5 == 0\n#    define BOOST_PP_SLOT_3_DIGIT_5 0\n# elif BOOST_PP_SLOT_TEMP_5 == 1\n#    define BOOST_PP_SLOT_3_DIGIT_5 1\n# elif BOOST_PP_SLOT_TEMP_5 == 2\n#    define BOOST_PP_SLOT_3_DIGIT_5 2\n# elif BOOST_PP_SLOT_TEMP_5 == 3\n#    define BOOST_PP_SLOT_3_DIGIT_5 3\n# elif BOOST_PP_SLOT_TEMP_5 == 4\n#    define BOOST_PP_SLOT_3_DIGIT_5 4\n# elif BOOST_PP_SLOT_TEMP_5 == 5\n#    define BOOST_PP_SLOT_3_DIGIT_5 5\n# elif BOOST_PP_SLOT_TEMP_5 == 6\n#    define BOOST_PP_SLOT_3_DIGIT_5 6\n# elif BOOST_PP_SLOT_TEMP_5 == 7\n#    define BOOST_PP_SLOT_3_DIGIT_5 7\n# elif BOOST_PP_SLOT_TEMP_5 == 8\n#    define BOOST_PP_SLOT_3_DIGIT_5 8\n# elif BOOST_PP_SLOT_TEMP_5 == 9\n#    define BOOST_PP_SLOT_3_DIGIT_5 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_4 == 0\n#    define BOOST_PP_SLOT_3_DIGIT_4 0\n# elif BOOST_PP_SLOT_TEMP_4 == 1\n#    define BOOST_PP_SLOT_3_DIGIT_4 1\n# elif BOOST_PP_SLOT_TEMP_4 == 2\n#    define BOOST_PP_SLOT_3_DIGIT_4 2\n# elif BOOST_PP_SLOT_TEMP_4 == 3\n#    define BOOST_PP_SLOT_3_DIGIT_4 3\n# elif BOOST_PP_SLOT_TEMP_4 == 4\n#    define BOOST_PP_SLOT_3_DIGIT_4 4\n# elif BOOST_PP_SLOT_TEMP_4 == 5\n#    define BOOST_PP_SLOT_3_DIGIT_4 5\n# elif BOOST_PP_SLOT_TEMP_4 == 6\n#    define BOOST_PP_SLOT_3_DIGIT_4 6\n# elif BOOST_PP_SLOT_TEMP_4 == 7\n#    define BOOST_PP_SLOT_3_DIGIT_4 7\n# elif BOOST_PP_SLOT_TEMP_4 == 8\n#    define BOOST_PP_SLOT_3_DIGIT_4 8\n# elif BOOST_PP_SLOT_TEMP_4 == 9\n#    define BOOST_PP_SLOT_3_DIGIT_4 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_SLOT_3_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_SLOT_3_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_SLOT_3_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_SLOT_3_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_SLOT_3_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_SLOT_3_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_SLOT_3_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_SLOT_3_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_SLOT_3_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_SLOT_3_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_SLOT_3_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_SLOT_3_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_SLOT_3_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_SLOT_3_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_SLOT_3_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_SLOT_3_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_SLOT_3_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_SLOT_3_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_SLOT_3_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_SLOT_3_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_SLOT_3_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_SLOT_3_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_SLOT_3_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_SLOT_3_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_SLOT_3_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_SLOT_3_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_SLOT_3_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_SLOT_3_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_SLOT_3_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_SLOT_3_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_SLOT_3_DIGIT_10\n#    define BOOST_PP_SLOT_3() BOOST_PP_SLOT_CC_10(BOOST_PP_SLOT_3_DIGIT_10, BOOST_PP_SLOT_3_DIGIT_9, BOOST_PP_SLOT_3_DIGIT_8, BOOST_PP_SLOT_3_DIGIT_7, BOOST_PP_SLOT_3_DIGIT_6, BOOST_PP_SLOT_3_DIGIT_5, BOOST_PP_SLOT_3_DIGIT_4, BOOST_PP_SLOT_3_DIGIT_3, BOOST_PP_SLOT_3_DIGIT_2, BOOST_PP_SLOT_3_DIGIT_1)\n# elif BOOST_PP_SLOT_3_DIGIT_9\n#    define BOOST_PP_SLOT_3() BOOST_PP_SLOT_CC_9(BOOST_PP_SLOT_3_DIGIT_9, BOOST_PP_SLOT_3_DIGIT_8, BOOST_PP_SLOT_3_DIGIT_7, BOOST_PP_SLOT_3_DIGIT_6, BOOST_PP_SLOT_3_DIGIT_5, BOOST_PP_SLOT_3_DIGIT_4, BOOST_PP_SLOT_3_DIGIT_3, BOOST_PP_SLOT_3_DIGIT_2, BOOST_PP_SLOT_3_DIGIT_1)\n# elif BOOST_PP_SLOT_3_DIGIT_8\n#    define BOOST_PP_SLOT_3() BOOST_PP_SLOT_CC_8(BOOST_PP_SLOT_3_DIGIT_8, BOOST_PP_SLOT_3_DIGIT_7, BOOST_PP_SLOT_3_DIGIT_6, BOOST_PP_SLOT_3_DIGIT_5, BOOST_PP_SLOT_3_DIGIT_4, BOOST_PP_SLOT_3_DIGIT_3, BOOST_PP_SLOT_3_DIGIT_2, BOOST_PP_SLOT_3_DIGIT_1)\n# elif BOOST_PP_SLOT_3_DIGIT_7\n#    define BOOST_PP_SLOT_3() BOOST_PP_SLOT_CC_7(BOOST_PP_SLOT_3_DIGIT_7, BOOST_PP_SLOT_3_DIGIT_6, BOOST_PP_SLOT_3_DIGIT_5, BOOST_PP_SLOT_3_DIGIT_4, BOOST_PP_SLOT_3_DIGIT_3, BOOST_PP_SLOT_3_DIGIT_2, BOOST_PP_SLOT_3_DIGIT_1)\n# elif BOOST_PP_SLOT_3_DIGIT_6\n#    define BOOST_PP_SLOT_3() BOOST_PP_SLOT_CC_6(BOOST_PP_SLOT_3_DIGIT_6, BOOST_PP_SLOT_3_DIGIT_5, BOOST_PP_SLOT_3_DIGIT_4, BOOST_PP_SLOT_3_DIGIT_3, BOOST_PP_SLOT_3_DIGIT_2, BOOST_PP_SLOT_3_DIGIT_1)\n# elif BOOST_PP_SLOT_3_DIGIT_5\n#    define BOOST_PP_SLOT_3() BOOST_PP_SLOT_CC_5(BOOST_PP_SLOT_3_DIGIT_5, BOOST_PP_SLOT_3_DIGIT_4, BOOST_PP_SLOT_3_DIGIT_3, BOOST_PP_SLOT_3_DIGIT_2, BOOST_PP_SLOT_3_DIGIT_1)\n# elif BOOST_PP_SLOT_3_DIGIT_4\n#    define BOOST_PP_SLOT_3() BOOST_PP_SLOT_CC_4(BOOST_PP_SLOT_3_DIGIT_4, BOOST_PP_SLOT_3_DIGIT_3, BOOST_PP_SLOT_3_DIGIT_2, BOOST_PP_SLOT_3_DIGIT_1)\n# elif BOOST_PP_SLOT_3_DIGIT_3\n#    define BOOST_PP_SLOT_3() BOOST_PP_SLOT_CC_3(BOOST_PP_SLOT_3_DIGIT_3, BOOST_PP_SLOT_3_DIGIT_2, BOOST_PP_SLOT_3_DIGIT_1)\n# elif BOOST_PP_SLOT_3_DIGIT_2\n#    define BOOST_PP_SLOT_3() BOOST_PP_SLOT_CC_2(BOOST_PP_SLOT_3_DIGIT_2, BOOST_PP_SLOT_3_DIGIT_1)\n# else\n#    define BOOST_PP_SLOT_3() BOOST_PP_SLOT_3_DIGIT_1\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/slot/detail/slot4.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_SLOT_4\n#\n# undef BOOST_PP_SLOT_4_DIGIT_1\n# undef BOOST_PP_SLOT_4_DIGIT_2\n# undef BOOST_PP_SLOT_4_DIGIT_3\n# undef BOOST_PP_SLOT_4_DIGIT_4\n# undef BOOST_PP_SLOT_4_DIGIT_5\n# undef BOOST_PP_SLOT_4_DIGIT_6\n# undef BOOST_PP_SLOT_4_DIGIT_7\n# undef BOOST_PP_SLOT_4_DIGIT_8\n# undef BOOST_PP_SLOT_4_DIGIT_9\n# undef BOOST_PP_SLOT_4_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_10 == 0\n#    define BOOST_PP_SLOT_4_DIGIT_10 0\n# elif BOOST_PP_SLOT_TEMP_10 == 1\n#    define BOOST_PP_SLOT_4_DIGIT_10 1\n# elif BOOST_PP_SLOT_TEMP_10 == 2\n#    define BOOST_PP_SLOT_4_DIGIT_10 2\n# elif BOOST_PP_SLOT_TEMP_10 == 3\n#    define BOOST_PP_SLOT_4_DIGIT_10 3\n# elif BOOST_PP_SLOT_TEMP_10 == 4\n#    define BOOST_PP_SLOT_4_DIGIT_10 4\n# elif BOOST_PP_SLOT_TEMP_10 == 5\n#    define BOOST_PP_SLOT_4_DIGIT_10 5\n# elif BOOST_PP_SLOT_TEMP_10 == 6\n#    define BOOST_PP_SLOT_4_DIGIT_10 6\n# elif BOOST_PP_SLOT_TEMP_10 == 7\n#    define BOOST_PP_SLOT_4_DIGIT_10 7\n# elif BOOST_PP_SLOT_TEMP_10 == 8\n#    define BOOST_PP_SLOT_4_DIGIT_10 8\n# elif BOOST_PP_SLOT_TEMP_10 == 9\n#    define BOOST_PP_SLOT_4_DIGIT_10 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_9 == 0\n#    define BOOST_PP_SLOT_4_DIGIT_9 0\n# elif BOOST_PP_SLOT_TEMP_9 == 1\n#    define BOOST_PP_SLOT_4_DIGIT_9 1\n# elif BOOST_PP_SLOT_TEMP_9 == 2\n#    define BOOST_PP_SLOT_4_DIGIT_9 2\n# elif BOOST_PP_SLOT_TEMP_9 == 3\n#    define BOOST_PP_SLOT_4_DIGIT_9 3\n# elif BOOST_PP_SLOT_TEMP_9 == 4\n#    define BOOST_PP_SLOT_4_DIGIT_9 4\n# elif BOOST_PP_SLOT_TEMP_9 == 5\n#    define BOOST_PP_SLOT_4_DIGIT_9 5\n# elif BOOST_PP_SLOT_TEMP_9 == 6\n#    define BOOST_PP_SLOT_4_DIGIT_9 6\n# elif BOOST_PP_SLOT_TEMP_9 == 7\n#    define BOOST_PP_SLOT_4_DIGIT_9 7\n# elif BOOST_PP_SLOT_TEMP_9 == 8\n#    define BOOST_PP_SLOT_4_DIGIT_9 8\n# elif BOOST_PP_SLOT_TEMP_9 == 9\n#    define BOOST_PP_SLOT_4_DIGIT_9 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_8 == 0\n#    define BOOST_PP_SLOT_4_DIGIT_8 0\n# elif BOOST_PP_SLOT_TEMP_8 == 1\n#    define BOOST_PP_SLOT_4_DIGIT_8 1\n# elif BOOST_PP_SLOT_TEMP_8 == 2\n#    define BOOST_PP_SLOT_4_DIGIT_8 2\n# elif BOOST_PP_SLOT_TEMP_8 == 3\n#    define BOOST_PP_SLOT_4_DIGIT_8 3\n# elif BOOST_PP_SLOT_TEMP_8 == 4\n#    define BOOST_PP_SLOT_4_DIGIT_8 4\n# elif BOOST_PP_SLOT_TEMP_8 == 5\n#    define BOOST_PP_SLOT_4_DIGIT_8 5\n# elif BOOST_PP_SLOT_TEMP_8 == 6\n#    define BOOST_PP_SLOT_4_DIGIT_8 6\n# elif BOOST_PP_SLOT_TEMP_8 == 7\n#    define BOOST_PP_SLOT_4_DIGIT_8 7\n# elif BOOST_PP_SLOT_TEMP_8 == 8\n#    define BOOST_PP_SLOT_4_DIGIT_8 8\n# elif BOOST_PP_SLOT_TEMP_8 == 9\n#    define BOOST_PP_SLOT_4_DIGIT_8 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_7 == 0\n#    define BOOST_PP_SLOT_4_DIGIT_7 0\n# elif BOOST_PP_SLOT_TEMP_7 == 1\n#    define BOOST_PP_SLOT_4_DIGIT_7 1\n# elif BOOST_PP_SLOT_TEMP_7 == 2\n#    define BOOST_PP_SLOT_4_DIGIT_7 2\n# elif BOOST_PP_SLOT_TEMP_7 == 3\n#    define BOOST_PP_SLOT_4_DIGIT_7 3\n# elif BOOST_PP_SLOT_TEMP_7 == 4\n#    define BOOST_PP_SLOT_4_DIGIT_7 4\n# elif BOOST_PP_SLOT_TEMP_7 == 5\n#    define BOOST_PP_SLOT_4_DIGIT_7 5\n# elif BOOST_PP_SLOT_TEMP_7 == 6\n#    define BOOST_PP_SLOT_4_DIGIT_7 6\n# elif BOOST_PP_SLOT_TEMP_7 == 7\n#    define BOOST_PP_SLOT_4_DIGIT_7 7\n# elif BOOST_PP_SLOT_TEMP_7 == 8\n#    define BOOST_PP_SLOT_4_DIGIT_7 8\n# elif BOOST_PP_SLOT_TEMP_7 == 9\n#    define BOOST_PP_SLOT_4_DIGIT_7 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_6 == 0\n#    define BOOST_PP_SLOT_4_DIGIT_6 0\n# elif BOOST_PP_SLOT_TEMP_6 == 1\n#    define BOOST_PP_SLOT_4_DIGIT_6 1\n# elif BOOST_PP_SLOT_TEMP_6 == 2\n#    define BOOST_PP_SLOT_4_DIGIT_6 2\n# elif BOOST_PP_SLOT_TEMP_6 == 3\n#    define BOOST_PP_SLOT_4_DIGIT_6 3\n# elif BOOST_PP_SLOT_TEMP_6 == 4\n#    define BOOST_PP_SLOT_4_DIGIT_6 4\n# elif BOOST_PP_SLOT_TEMP_6 == 5\n#    define BOOST_PP_SLOT_4_DIGIT_6 5\n# elif BOOST_PP_SLOT_TEMP_6 == 6\n#    define BOOST_PP_SLOT_4_DIGIT_6 6\n# elif BOOST_PP_SLOT_TEMP_6 == 7\n#    define BOOST_PP_SLOT_4_DIGIT_6 7\n# elif BOOST_PP_SLOT_TEMP_6 == 8\n#    define BOOST_PP_SLOT_4_DIGIT_6 8\n# elif BOOST_PP_SLOT_TEMP_6 == 9\n#    define BOOST_PP_SLOT_4_DIGIT_6 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_5 == 0\n#    define BOOST_PP_SLOT_4_DIGIT_5 0\n# elif BOOST_PP_SLOT_TEMP_5 == 1\n#    define BOOST_PP_SLOT_4_DIGIT_5 1\n# elif BOOST_PP_SLOT_TEMP_5 == 2\n#    define BOOST_PP_SLOT_4_DIGIT_5 2\n# elif BOOST_PP_SLOT_TEMP_5 == 3\n#    define BOOST_PP_SLOT_4_DIGIT_5 3\n# elif BOOST_PP_SLOT_TEMP_5 == 4\n#    define BOOST_PP_SLOT_4_DIGIT_5 4\n# elif BOOST_PP_SLOT_TEMP_5 == 5\n#    define BOOST_PP_SLOT_4_DIGIT_5 5\n# elif BOOST_PP_SLOT_TEMP_5 == 6\n#    define BOOST_PP_SLOT_4_DIGIT_5 6\n# elif BOOST_PP_SLOT_TEMP_5 == 7\n#    define BOOST_PP_SLOT_4_DIGIT_5 7\n# elif BOOST_PP_SLOT_TEMP_5 == 8\n#    define BOOST_PP_SLOT_4_DIGIT_5 8\n# elif BOOST_PP_SLOT_TEMP_5 == 9\n#    define BOOST_PP_SLOT_4_DIGIT_5 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_4 == 0\n#    define BOOST_PP_SLOT_4_DIGIT_4 0\n# elif BOOST_PP_SLOT_TEMP_4 == 1\n#    define BOOST_PP_SLOT_4_DIGIT_4 1\n# elif BOOST_PP_SLOT_TEMP_4 == 2\n#    define BOOST_PP_SLOT_4_DIGIT_4 2\n# elif BOOST_PP_SLOT_TEMP_4 == 3\n#    define BOOST_PP_SLOT_4_DIGIT_4 3\n# elif BOOST_PP_SLOT_TEMP_4 == 4\n#    define BOOST_PP_SLOT_4_DIGIT_4 4\n# elif BOOST_PP_SLOT_TEMP_4 == 5\n#    define BOOST_PP_SLOT_4_DIGIT_4 5\n# elif BOOST_PP_SLOT_TEMP_4 == 6\n#    define BOOST_PP_SLOT_4_DIGIT_4 6\n# elif BOOST_PP_SLOT_TEMP_4 == 7\n#    define BOOST_PP_SLOT_4_DIGIT_4 7\n# elif BOOST_PP_SLOT_TEMP_4 == 8\n#    define BOOST_PP_SLOT_4_DIGIT_4 8\n# elif BOOST_PP_SLOT_TEMP_4 == 9\n#    define BOOST_PP_SLOT_4_DIGIT_4 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_SLOT_4_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_SLOT_4_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_SLOT_4_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_SLOT_4_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_SLOT_4_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_SLOT_4_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_SLOT_4_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_SLOT_4_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_SLOT_4_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_SLOT_4_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_SLOT_4_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_SLOT_4_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_SLOT_4_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_SLOT_4_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_SLOT_4_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_SLOT_4_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_SLOT_4_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_SLOT_4_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_SLOT_4_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_SLOT_4_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_SLOT_4_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_SLOT_4_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_SLOT_4_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_SLOT_4_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_SLOT_4_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_SLOT_4_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_SLOT_4_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_SLOT_4_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_SLOT_4_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_SLOT_4_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_SLOT_4_DIGIT_10\n#    define BOOST_PP_SLOT_4() BOOST_PP_SLOT_CC_10(BOOST_PP_SLOT_4_DIGIT_10, BOOST_PP_SLOT_4_DIGIT_9, BOOST_PP_SLOT_4_DIGIT_8, BOOST_PP_SLOT_4_DIGIT_7, BOOST_PP_SLOT_4_DIGIT_6, BOOST_PP_SLOT_4_DIGIT_5, BOOST_PP_SLOT_4_DIGIT_4, BOOST_PP_SLOT_4_DIGIT_3, BOOST_PP_SLOT_4_DIGIT_2, BOOST_PP_SLOT_4_DIGIT_1)\n# elif BOOST_PP_SLOT_4_DIGIT_9\n#    define BOOST_PP_SLOT_4() BOOST_PP_SLOT_CC_9(BOOST_PP_SLOT_4_DIGIT_9, BOOST_PP_SLOT_4_DIGIT_8, BOOST_PP_SLOT_4_DIGIT_7, BOOST_PP_SLOT_4_DIGIT_6, BOOST_PP_SLOT_4_DIGIT_5, BOOST_PP_SLOT_4_DIGIT_4, BOOST_PP_SLOT_4_DIGIT_3, BOOST_PP_SLOT_4_DIGIT_2, BOOST_PP_SLOT_4_DIGIT_1)\n# elif BOOST_PP_SLOT_4_DIGIT_8\n#    define BOOST_PP_SLOT_4() BOOST_PP_SLOT_CC_8(BOOST_PP_SLOT_4_DIGIT_8, BOOST_PP_SLOT_4_DIGIT_7, BOOST_PP_SLOT_4_DIGIT_6, BOOST_PP_SLOT_4_DIGIT_5, BOOST_PP_SLOT_4_DIGIT_4, BOOST_PP_SLOT_4_DIGIT_3, BOOST_PP_SLOT_4_DIGIT_2, BOOST_PP_SLOT_4_DIGIT_1)\n# elif BOOST_PP_SLOT_4_DIGIT_7\n#    define BOOST_PP_SLOT_4() BOOST_PP_SLOT_CC_7(BOOST_PP_SLOT_4_DIGIT_7, BOOST_PP_SLOT_4_DIGIT_6, BOOST_PP_SLOT_4_DIGIT_5, BOOST_PP_SLOT_4_DIGIT_4, BOOST_PP_SLOT_4_DIGIT_3, BOOST_PP_SLOT_4_DIGIT_2, BOOST_PP_SLOT_4_DIGIT_1)\n# elif BOOST_PP_SLOT_4_DIGIT_6\n#    define BOOST_PP_SLOT_4() BOOST_PP_SLOT_CC_6(BOOST_PP_SLOT_4_DIGIT_6, BOOST_PP_SLOT_4_DIGIT_5, BOOST_PP_SLOT_4_DIGIT_4, BOOST_PP_SLOT_4_DIGIT_3, BOOST_PP_SLOT_4_DIGIT_2, BOOST_PP_SLOT_4_DIGIT_1)\n# elif BOOST_PP_SLOT_4_DIGIT_5\n#    define BOOST_PP_SLOT_4() BOOST_PP_SLOT_CC_5(BOOST_PP_SLOT_4_DIGIT_5, BOOST_PP_SLOT_4_DIGIT_4, BOOST_PP_SLOT_4_DIGIT_3, BOOST_PP_SLOT_4_DIGIT_2, BOOST_PP_SLOT_4_DIGIT_1)\n# elif BOOST_PP_SLOT_4_DIGIT_4\n#    define BOOST_PP_SLOT_4() BOOST_PP_SLOT_CC_4(BOOST_PP_SLOT_4_DIGIT_4, BOOST_PP_SLOT_4_DIGIT_3, BOOST_PP_SLOT_4_DIGIT_2, BOOST_PP_SLOT_4_DIGIT_1)\n# elif BOOST_PP_SLOT_4_DIGIT_3\n#    define BOOST_PP_SLOT_4() BOOST_PP_SLOT_CC_3(BOOST_PP_SLOT_4_DIGIT_3, BOOST_PP_SLOT_4_DIGIT_2, BOOST_PP_SLOT_4_DIGIT_1)\n# elif BOOST_PP_SLOT_4_DIGIT_2\n#    define BOOST_PP_SLOT_4() BOOST_PP_SLOT_CC_2(BOOST_PP_SLOT_4_DIGIT_2, BOOST_PP_SLOT_4_DIGIT_1)\n# else\n#    define BOOST_PP_SLOT_4() BOOST_PP_SLOT_4_DIGIT_1\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/slot/detail/slot5.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_SLOT_5\n#\n# undef BOOST_PP_SLOT_5_DIGIT_1\n# undef BOOST_PP_SLOT_5_DIGIT_2\n# undef BOOST_PP_SLOT_5_DIGIT_3\n# undef BOOST_PP_SLOT_5_DIGIT_4\n# undef BOOST_PP_SLOT_5_DIGIT_5\n# undef BOOST_PP_SLOT_5_DIGIT_6\n# undef BOOST_PP_SLOT_5_DIGIT_7\n# undef BOOST_PP_SLOT_5_DIGIT_8\n# undef BOOST_PP_SLOT_5_DIGIT_9\n# undef BOOST_PP_SLOT_5_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_10 == 0\n#    define BOOST_PP_SLOT_5_DIGIT_10 0\n# elif BOOST_PP_SLOT_TEMP_10 == 1\n#    define BOOST_PP_SLOT_5_DIGIT_10 1\n# elif BOOST_PP_SLOT_TEMP_10 == 2\n#    define BOOST_PP_SLOT_5_DIGIT_10 2\n# elif BOOST_PP_SLOT_TEMP_10 == 3\n#    define BOOST_PP_SLOT_5_DIGIT_10 3\n# elif BOOST_PP_SLOT_TEMP_10 == 4\n#    define BOOST_PP_SLOT_5_DIGIT_10 4\n# elif BOOST_PP_SLOT_TEMP_10 == 5\n#    define BOOST_PP_SLOT_5_DIGIT_10 5\n# elif BOOST_PP_SLOT_TEMP_10 == 6\n#    define BOOST_PP_SLOT_5_DIGIT_10 6\n# elif BOOST_PP_SLOT_TEMP_10 == 7\n#    define BOOST_PP_SLOT_5_DIGIT_10 7\n# elif BOOST_PP_SLOT_TEMP_10 == 8\n#    define BOOST_PP_SLOT_5_DIGIT_10 8\n# elif BOOST_PP_SLOT_TEMP_10 == 9\n#    define BOOST_PP_SLOT_5_DIGIT_10 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_9 == 0\n#    define BOOST_PP_SLOT_5_DIGIT_9 0\n# elif BOOST_PP_SLOT_TEMP_9 == 1\n#    define BOOST_PP_SLOT_5_DIGIT_9 1\n# elif BOOST_PP_SLOT_TEMP_9 == 2\n#    define BOOST_PP_SLOT_5_DIGIT_9 2\n# elif BOOST_PP_SLOT_TEMP_9 == 3\n#    define BOOST_PP_SLOT_5_DIGIT_9 3\n# elif BOOST_PP_SLOT_TEMP_9 == 4\n#    define BOOST_PP_SLOT_5_DIGIT_9 4\n# elif BOOST_PP_SLOT_TEMP_9 == 5\n#    define BOOST_PP_SLOT_5_DIGIT_9 5\n# elif BOOST_PP_SLOT_TEMP_9 == 6\n#    define BOOST_PP_SLOT_5_DIGIT_9 6\n# elif BOOST_PP_SLOT_TEMP_9 == 7\n#    define BOOST_PP_SLOT_5_DIGIT_9 7\n# elif BOOST_PP_SLOT_TEMP_9 == 8\n#    define BOOST_PP_SLOT_5_DIGIT_9 8\n# elif BOOST_PP_SLOT_TEMP_9 == 9\n#    define BOOST_PP_SLOT_5_DIGIT_9 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_8 == 0\n#    define BOOST_PP_SLOT_5_DIGIT_8 0\n# elif BOOST_PP_SLOT_TEMP_8 == 1\n#    define BOOST_PP_SLOT_5_DIGIT_8 1\n# elif BOOST_PP_SLOT_TEMP_8 == 2\n#    define BOOST_PP_SLOT_5_DIGIT_8 2\n# elif BOOST_PP_SLOT_TEMP_8 == 3\n#    define BOOST_PP_SLOT_5_DIGIT_8 3\n# elif BOOST_PP_SLOT_TEMP_8 == 4\n#    define BOOST_PP_SLOT_5_DIGIT_8 4\n# elif BOOST_PP_SLOT_TEMP_8 == 5\n#    define BOOST_PP_SLOT_5_DIGIT_8 5\n# elif BOOST_PP_SLOT_TEMP_8 == 6\n#    define BOOST_PP_SLOT_5_DIGIT_8 6\n# elif BOOST_PP_SLOT_TEMP_8 == 7\n#    define BOOST_PP_SLOT_5_DIGIT_8 7\n# elif BOOST_PP_SLOT_TEMP_8 == 8\n#    define BOOST_PP_SLOT_5_DIGIT_8 8\n# elif BOOST_PP_SLOT_TEMP_8 == 9\n#    define BOOST_PP_SLOT_5_DIGIT_8 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_7 == 0\n#    define BOOST_PP_SLOT_5_DIGIT_7 0\n# elif BOOST_PP_SLOT_TEMP_7 == 1\n#    define BOOST_PP_SLOT_5_DIGIT_7 1\n# elif BOOST_PP_SLOT_TEMP_7 == 2\n#    define BOOST_PP_SLOT_5_DIGIT_7 2\n# elif BOOST_PP_SLOT_TEMP_7 == 3\n#    define BOOST_PP_SLOT_5_DIGIT_7 3\n# elif BOOST_PP_SLOT_TEMP_7 == 4\n#    define BOOST_PP_SLOT_5_DIGIT_7 4\n# elif BOOST_PP_SLOT_TEMP_7 == 5\n#    define BOOST_PP_SLOT_5_DIGIT_7 5\n# elif BOOST_PP_SLOT_TEMP_7 == 6\n#    define BOOST_PP_SLOT_5_DIGIT_7 6\n# elif BOOST_PP_SLOT_TEMP_7 == 7\n#    define BOOST_PP_SLOT_5_DIGIT_7 7\n# elif BOOST_PP_SLOT_TEMP_7 == 8\n#    define BOOST_PP_SLOT_5_DIGIT_7 8\n# elif BOOST_PP_SLOT_TEMP_7 == 9\n#    define BOOST_PP_SLOT_5_DIGIT_7 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_6 == 0\n#    define BOOST_PP_SLOT_5_DIGIT_6 0\n# elif BOOST_PP_SLOT_TEMP_6 == 1\n#    define BOOST_PP_SLOT_5_DIGIT_6 1\n# elif BOOST_PP_SLOT_TEMP_6 == 2\n#    define BOOST_PP_SLOT_5_DIGIT_6 2\n# elif BOOST_PP_SLOT_TEMP_6 == 3\n#    define BOOST_PP_SLOT_5_DIGIT_6 3\n# elif BOOST_PP_SLOT_TEMP_6 == 4\n#    define BOOST_PP_SLOT_5_DIGIT_6 4\n# elif BOOST_PP_SLOT_TEMP_6 == 5\n#    define BOOST_PP_SLOT_5_DIGIT_6 5\n# elif BOOST_PP_SLOT_TEMP_6 == 6\n#    define BOOST_PP_SLOT_5_DIGIT_6 6\n# elif BOOST_PP_SLOT_TEMP_6 == 7\n#    define BOOST_PP_SLOT_5_DIGIT_6 7\n# elif BOOST_PP_SLOT_TEMP_6 == 8\n#    define BOOST_PP_SLOT_5_DIGIT_6 8\n# elif BOOST_PP_SLOT_TEMP_6 == 9\n#    define BOOST_PP_SLOT_5_DIGIT_6 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_5 == 0\n#    define BOOST_PP_SLOT_5_DIGIT_5 0\n# elif BOOST_PP_SLOT_TEMP_5 == 1\n#    define BOOST_PP_SLOT_5_DIGIT_5 1\n# elif BOOST_PP_SLOT_TEMP_5 == 2\n#    define BOOST_PP_SLOT_5_DIGIT_5 2\n# elif BOOST_PP_SLOT_TEMP_5 == 3\n#    define BOOST_PP_SLOT_5_DIGIT_5 3\n# elif BOOST_PP_SLOT_TEMP_5 == 4\n#    define BOOST_PP_SLOT_5_DIGIT_5 4\n# elif BOOST_PP_SLOT_TEMP_5 == 5\n#    define BOOST_PP_SLOT_5_DIGIT_5 5\n# elif BOOST_PP_SLOT_TEMP_5 == 6\n#    define BOOST_PP_SLOT_5_DIGIT_5 6\n# elif BOOST_PP_SLOT_TEMP_5 == 7\n#    define BOOST_PP_SLOT_5_DIGIT_5 7\n# elif BOOST_PP_SLOT_TEMP_5 == 8\n#    define BOOST_PP_SLOT_5_DIGIT_5 8\n# elif BOOST_PP_SLOT_TEMP_5 == 9\n#    define BOOST_PP_SLOT_5_DIGIT_5 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_4 == 0\n#    define BOOST_PP_SLOT_5_DIGIT_4 0\n# elif BOOST_PP_SLOT_TEMP_4 == 1\n#    define BOOST_PP_SLOT_5_DIGIT_4 1\n# elif BOOST_PP_SLOT_TEMP_4 == 2\n#    define BOOST_PP_SLOT_5_DIGIT_4 2\n# elif BOOST_PP_SLOT_TEMP_4 == 3\n#    define BOOST_PP_SLOT_5_DIGIT_4 3\n# elif BOOST_PP_SLOT_TEMP_4 == 4\n#    define BOOST_PP_SLOT_5_DIGIT_4 4\n# elif BOOST_PP_SLOT_TEMP_4 == 5\n#    define BOOST_PP_SLOT_5_DIGIT_4 5\n# elif BOOST_PP_SLOT_TEMP_4 == 6\n#    define BOOST_PP_SLOT_5_DIGIT_4 6\n# elif BOOST_PP_SLOT_TEMP_4 == 7\n#    define BOOST_PP_SLOT_5_DIGIT_4 7\n# elif BOOST_PP_SLOT_TEMP_4 == 8\n#    define BOOST_PP_SLOT_5_DIGIT_4 8\n# elif BOOST_PP_SLOT_TEMP_4 == 9\n#    define BOOST_PP_SLOT_5_DIGIT_4 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_SLOT_5_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_SLOT_5_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_SLOT_5_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_SLOT_5_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_SLOT_5_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_SLOT_5_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_SLOT_5_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_SLOT_5_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_SLOT_5_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_SLOT_5_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_SLOT_5_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_SLOT_5_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_SLOT_5_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_SLOT_5_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_SLOT_5_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_SLOT_5_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_SLOT_5_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_SLOT_5_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_SLOT_5_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_SLOT_5_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_SLOT_5_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_SLOT_5_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_SLOT_5_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_SLOT_5_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_SLOT_5_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_SLOT_5_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_SLOT_5_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_SLOT_5_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_SLOT_5_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_SLOT_5_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_SLOT_5_DIGIT_10\n#    define BOOST_PP_SLOT_5() BOOST_PP_SLOT_CC_10(BOOST_PP_SLOT_5_DIGIT_10, BOOST_PP_SLOT_5_DIGIT_9, BOOST_PP_SLOT_5_DIGIT_8, BOOST_PP_SLOT_5_DIGIT_7, BOOST_PP_SLOT_5_DIGIT_6, BOOST_PP_SLOT_5_DIGIT_5, BOOST_PP_SLOT_5_DIGIT_4, BOOST_PP_SLOT_5_DIGIT_3, BOOST_PP_SLOT_5_DIGIT_2, BOOST_PP_SLOT_5_DIGIT_1)\n# elif BOOST_PP_SLOT_5_DIGIT_9\n#    define BOOST_PP_SLOT_5() BOOST_PP_SLOT_CC_9(BOOST_PP_SLOT_5_DIGIT_9, BOOST_PP_SLOT_5_DIGIT_8, BOOST_PP_SLOT_5_DIGIT_7, BOOST_PP_SLOT_5_DIGIT_6, BOOST_PP_SLOT_5_DIGIT_5, BOOST_PP_SLOT_5_DIGIT_4, BOOST_PP_SLOT_5_DIGIT_3, BOOST_PP_SLOT_5_DIGIT_2, BOOST_PP_SLOT_5_DIGIT_1)\n# elif BOOST_PP_SLOT_5_DIGIT_8\n#    define BOOST_PP_SLOT_5() BOOST_PP_SLOT_CC_8(BOOST_PP_SLOT_5_DIGIT_8, BOOST_PP_SLOT_5_DIGIT_7, BOOST_PP_SLOT_5_DIGIT_6, BOOST_PP_SLOT_5_DIGIT_5, BOOST_PP_SLOT_5_DIGIT_4, BOOST_PP_SLOT_5_DIGIT_3, BOOST_PP_SLOT_5_DIGIT_2, BOOST_PP_SLOT_5_DIGIT_1)\n# elif BOOST_PP_SLOT_5_DIGIT_7\n#    define BOOST_PP_SLOT_5() BOOST_PP_SLOT_CC_7(BOOST_PP_SLOT_5_DIGIT_7, BOOST_PP_SLOT_5_DIGIT_6, BOOST_PP_SLOT_5_DIGIT_5, BOOST_PP_SLOT_5_DIGIT_4, BOOST_PP_SLOT_5_DIGIT_3, BOOST_PP_SLOT_5_DIGIT_2, BOOST_PP_SLOT_5_DIGIT_1)\n# elif BOOST_PP_SLOT_5_DIGIT_6\n#    define BOOST_PP_SLOT_5() BOOST_PP_SLOT_CC_6(BOOST_PP_SLOT_5_DIGIT_6, BOOST_PP_SLOT_5_DIGIT_5, BOOST_PP_SLOT_5_DIGIT_4, BOOST_PP_SLOT_5_DIGIT_3, BOOST_PP_SLOT_5_DIGIT_2, BOOST_PP_SLOT_5_DIGIT_1)\n# elif BOOST_PP_SLOT_5_DIGIT_5\n#    define BOOST_PP_SLOT_5() BOOST_PP_SLOT_CC_5(BOOST_PP_SLOT_5_DIGIT_5, BOOST_PP_SLOT_5_DIGIT_4, BOOST_PP_SLOT_5_DIGIT_3, BOOST_PP_SLOT_5_DIGIT_2, BOOST_PP_SLOT_5_DIGIT_1)\n# elif BOOST_PP_SLOT_5_DIGIT_4\n#    define BOOST_PP_SLOT_5() BOOST_PP_SLOT_CC_4(BOOST_PP_SLOT_5_DIGIT_4, BOOST_PP_SLOT_5_DIGIT_3, BOOST_PP_SLOT_5_DIGIT_2, BOOST_PP_SLOT_5_DIGIT_1)\n# elif BOOST_PP_SLOT_5_DIGIT_3\n#    define BOOST_PP_SLOT_5() BOOST_PP_SLOT_CC_3(BOOST_PP_SLOT_5_DIGIT_3, BOOST_PP_SLOT_5_DIGIT_2, BOOST_PP_SLOT_5_DIGIT_1)\n# elif BOOST_PP_SLOT_5_DIGIT_2\n#    define BOOST_PP_SLOT_5() BOOST_PP_SLOT_CC_2(BOOST_PP_SLOT_5_DIGIT_2, BOOST_PP_SLOT_5_DIGIT_1)\n# else\n#    define BOOST_PP_SLOT_5() BOOST_PP_SLOT_5_DIGIT_1\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/slot/slot.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SLOT_SLOT_HPP\n# define BOOST_PREPROCESSOR_SLOT_SLOT_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/slot/detail/def.hpp>\n#\n# /* BOOST_PP_ASSIGN_SLOT */\n#\n# define BOOST_PP_ASSIGN_SLOT(i) BOOST_PP_CAT(BOOST_PP_ASSIGN_SLOT_, i)\n#\n# define BOOST_PP_ASSIGN_SLOT_1 <boost/preprocessor/slot/detail/slot1.hpp>\n# define BOOST_PP_ASSIGN_SLOT_2 <boost/preprocessor/slot/detail/slot2.hpp>\n# define BOOST_PP_ASSIGN_SLOT_3 <boost/preprocessor/slot/detail/slot3.hpp>\n# define BOOST_PP_ASSIGN_SLOT_4 <boost/preprocessor/slot/detail/slot4.hpp>\n# define BOOST_PP_ASSIGN_SLOT_5 <boost/preprocessor/slot/detail/slot5.hpp>\n#\n# /* BOOST_PP_SLOT */\n#\n# define BOOST_PP_SLOT(i) BOOST_PP_CAT(BOOST_PP_SLOT_, i)()\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/stringize.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_STRINGIZE_HPP\n# define BOOST_PREPROCESSOR_STRINGIZE_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_STRINGIZE */\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    define BOOST_PP_STRINGIZE(text) BOOST_PP_STRINGIZE_A((text))\n#    define BOOST_PP_STRINGIZE_A(arg) BOOST_PP_STRINGIZE_I arg\n# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_STRINGIZE(text) BOOST_PP_STRINGIZE_OO((text))\n#    define BOOST_PP_STRINGIZE_OO(par) BOOST_PP_STRINGIZE_I ## par\n# else\n#    define BOOST_PP_STRINGIZE(text) BOOST_PP_STRINGIZE_I(text)\n# endif\n#\n# define BOOST_PP_STRINGIZE_I(text) #text\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/tuple/detail/is_single_return.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2014.                                    *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_TUPLE_DETAIL_IS_SINGLE_RETURN_HPP\n# define BOOST_PREPROCESSOR_TUPLE_DETAIL_IS_SINGLE_RETURN_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_TUPLE_IS_SINGLE_RETURN */\n#\n# if BOOST_PP_VARIADICS && BOOST_PP_VARIADICS_MSVC\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/facilities/is_1.hpp>\n# include <boost/preprocessor/tuple/size.hpp>\n# define BOOST_PP_TUPLE_IS_SINGLE_RETURN(sr,nsr,tuple)\t\\\n\tBOOST_PP_IIF(BOOST_PP_IS_1(BOOST_PP_TUPLE_SIZE(tuple)),sr,nsr) \\\n\t/**/\n# endif /* BOOST_PP_VARIADICS && BOOST_PP_VARIADICS_MSVC */\n#\n# endif /* BOOST_PREPROCESSOR_TUPLE_DETAIL_IS_SINGLE_RETURN_HPP */\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/tuple/eat.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002-2011) */\n# /* Revised by Edward Diener (2011,2015) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_TUPLE_EAT_HPP\n# define BOOST_PREPROCESSOR_TUPLE_EAT_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_EAT */\n#\n# if BOOST_PP_VARIADICS\n#    define BOOST_PP_EAT(...)\n# else\n#    define BOOST_PP_EAT(x)\n# endif\n#\n# /* BOOST_PP_TUPLE_EAT */\n#\n# if BOOST_PP_VARIADICS\n#    define BOOST_PP_TUPLE_EAT(size) BOOST_PP_EAT\n# else\n#    if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#        define BOOST_PP_TUPLE_EAT(size) BOOST_PP_TUPLE_EAT_I(size)\n#    else\n#        define BOOST_PP_TUPLE_EAT(size) BOOST_PP_TUPLE_EAT_OO((size))\n#        define BOOST_PP_TUPLE_EAT_OO(par) BOOST_PP_TUPLE_EAT_I ## par\n#    endif\n#    define BOOST_PP_TUPLE_EAT_I(size) BOOST_PP_TUPLE_EAT_ ## size\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#     define BOOST_PP_TUPLE_EAT_N(size) BOOST_PP_TUPLE_EAT_N_I(size)\n# else\n#     define BOOST_PP_TUPLE_EAT_N(size) BOOST_PP_TUPLE_EAT_N_OO((size))\n#     define BOOST_PP_TUPLE_EAT_N_OO(par) BOOST_PP_TUPLE_EAT_N_I ## par\n# endif\n# define BOOST_PP_TUPLE_EAT_N_I(size) BOOST_PP_TUPLE_EAT_ ## size\n#\n# define BOOST_PP_TUPLE_EAT_1(e0)\n# define BOOST_PP_TUPLE_EAT_2(e0, e1)\n# define BOOST_PP_TUPLE_EAT_3(e0, e1, e2)\n# define BOOST_PP_TUPLE_EAT_4(e0, e1, e2, e3)\n# define BOOST_PP_TUPLE_EAT_5(e0, e1, e2, e3, e4)\n# define BOOST_PP_TUPLE_EAT_6(e0, e1, e2, e3, e4, e5)\n# define BOOST_PP_TUPLE_EAT_7(e0, e1, e2, e3, e4, e5, e6)\n# define BOOST_PP_TUPLE_EAT_8(e0, e1, e2, e3, e4, e5, e6, e7)\n# define BOOST_PP_TUPLE_EAT_9(e0, e1, e2, e3, e4, e5, e6, e7, e8)\n# define BOOST_PP_TUPLE_EAT_10(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9)\n# define BOOST_PP_TUPLE_EAT_11(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10)\n# define BOOST_PP_TUPLE_EAT_12(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11)\n# define BOOST_PP_TUPLE_EAT_13(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12)\n# define BOOST_PP_TUPLE_EAT_14(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13)\n# define BOOST_PP_TUPLE_EAT_15(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14)\n# define BOOST_PP_TUPLE_EAT_16(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15)\n# define BOOST_PP_TUPLE_EAT_17(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16)\n# define BOOST_PP_TUPLE_EAT_18(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17)\n# define BOOST_PP_TUPLE_EAT_19(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18)\n# define BOOST_PP_TUPLE_EAT_20(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19)\n# define BOOST_PP_TUPLE_EAT_21(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20)\n# define BOOST_PP_TUPLE_EAT_22(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21)\n# define BOOST_PP_TUPLE_EAT_23(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22)\n# define BOOST_PP_TUPLE_EAT_24(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23)\n# define BOOST_PP_TUPLE_EAT_25(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24)\n# define BOOST_PP_TUPLE_EAT_26(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25)\n# define BOOST_PP_TUPLE_EAT_27(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26)\n# define BOOST_PP_TUPLE_EAT_28(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27)\n# define BOOST_PP_TUPLE_EAT_29(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28)\n# define BOOST_PP_TUPLE_EAT_30(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29)\n# define BOOST_PP_TUPLE_EAT_31(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30)\n# define BOOST_PP_TUPLE_EAT_32(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31)\n# define BOOST_PP_TUPLE_EAT_33(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32)\n# define BOOST_PP_TUPLE_EAT_34(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33)\n# define BOOST_PP_TUPLE_EAT_35(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34)\n# define BOOST_PP_TUPLE_EAT_36(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35)\n# define BOOST_PP_TUPLE_EAT_37(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36)\n# define BOOST_PP_TUPLE_EAT_38(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37)\n# define BOOST_PP_TUPLE_EAT_39(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38)\n# define BOOST_PP_TUPLE_EAT_40(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39)\n# define BOOST_PP_TUPLE_EAT_41(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40)\n# define BOOST_PP_TUPLE_EAT_42(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41)\n# define BOOST_PP_TUPLE_EAT_43(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42)\n# define BOOST_PP_TUPLE_EAT_44(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43)\n# define BOOST_PP_TUPLE_EAT_45(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44)\n# define BOOST_PP_TUPLE_EAT_46(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45)\n# define BOOST_PP_TUPLE_EAT_47(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46)\n# define BOOST_PP_TUPLE_EAT_48(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47)\n# define BOOST_PP_TUPLE_EAT_49(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48)\n# define BOOST_PP_TUPLE_EAT_50(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49)\n# define BOOST_PP_TUPLE_EAT_51(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50)\n# define BOOST_PP_TUPLE_EAT_52(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51)\n# define BOOST_PP_TUPLE_EAT_53(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52)\n# define BOOST_PP_TUPLE_EAT_54(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53)\n# define BOOST_PP_TUPLE_EAT_55(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54)\n# define BOOST_PP_TUPLE_EAT_56(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55)\n# define BOOST_PP_TUPLE_EAT_57(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56)\n# define BOOST_PP_TUPLE_EAT_58(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57)\n# define BOOST_PP_TUPLE_EAT_59(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58)\n# define BOOST_PP_TUPLE_EAT_60(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59)\n# define BOOST_PP_TUPLE_EAT_61(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60)\n# define BOOST_PP_TUPLE_EAT_62(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61)\n# define BOOST_PP_TUPLE_EAT_63(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62)\n# define BOOST_PP_TUPLE_EAT_64(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63)\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/tuple/elem.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002-2011) */\n# /* Revised by Edward Diener (2011,2014) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_TUPLE_ELEM_HPP\n# define BOOST_PREPROCESSOR_TUPLE_ELEM_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/facilities/expand.hpp>\n# include <boost/preprocessor/facilities/overload.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n# include <boost/preprocessor/variadic/elem.hpp>\n# include <boost/preprocessor/tuple/detail/is_single_return.hpp>\n#\n# if BOOST_PP_VARIADICS\n#    if BOOST_PP_VARIADICS_MSVC\n#        define BOOST_PP_TUPLE_ELEM(...) BOOST_PP_TUPLE_ELEM_I(BOOST_PP_OVERLOAD(BOOST_PP_TUPLE_ELEM_O_, __VA_ARGS__), (__VA_ARGS__))\n#        define BOOST_PP_TUPLE_ELEM_I(m, args) BOOST_PP_TUPLE_ELEM_II(m, args)\n#        define BOOST_PP_TUPLE_ELEM_II(m, args) BOOST_PP_CAT(m ## args,)\n/*\n  Use BOOST_PP_REM_CAT if it is a single element tuple ( which might be empty )\n  else use BOOST_PP_REM. This fixes a VC++ problem with an empty tuple and BOOST_PP_TUPLE_ELEM\n  functionality. See tuple_elem_bug_test.cxx.\n*/\n#    \t define BOOST_PP_TUPLE_ELEM_O_2(n, tuple) \\\n\t\t\tBOOST_PP_VARIADIC_ELEM(n, BOOST_PP_EXPAND(BOOST_PP_TUPLE_IS_SINGLE_RETURN(BOOST_PP_REM_CAT,BOOST_PP_REM,tuple) tuple)) \\\n\t\t\t/**/\n#    else\n#        define BOOST_PP_TUPLE_ELEM(...) BOOST_PP_OVERLOAD(BOOST_PP_TUPLE_ELEM_O_, __VA_ARGS__)(__VA_ARGS__)\n#    \t define BOOST_PP_TUPLE_ELEM_O_2(n, tuple) BOOST_PP_VARIADIC_ELEM(n, BOOST_PP_REM tuple)\n#    endif\n#    define BOOST_PP_TUPLE_ELEM_O_3(size, n, tuple) BOOST_PP_TUPLE_ELEM_O_2(n, tuple)\n# else\n#    if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#        define BOOST_PP_TUPLE_ELEM(size, n, tuple) BOOST_PP_TUPLE_ELEM_I(BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM_, n), BOOST_PP_CAT(BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM_E_, size), tuple))\n#        define BOOST_PP_TUPLE_ELEM_I(m, args) BOOST_PP_TUPLE_ELEM_II(m, args)\n#        define BOOST_PP_TUPLE_ELEM_II(m, args) BOOST_PP_CAT(m ## args,)\n#    elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#        define BOOST_PP_TUPLE_ELEM(size, n, tuple) BOOST_PP_TUPLE_ELEM_I_OO((size, n, tuple))\n#        define BOOST_PP_TUPLE_ELEM_I_OO(par) BOOST_PP_TUPLE_ELEM_I ## par\n#        define BOOST_PP_TUPLE_ELEM_I(size, n, tuple) BOOST_PP_TUPLE_ELEM_II((n, BOOST_PP_TUPLE_ELEM_E_ ## size ## tuple))\n#        define BOOST_PP_TUPLE_ELEM_II(par) BOOST_PP_TUPLE_ELEM_III_OO(par)\n#        define BOOST_PP_TUPLE_ELEM_III_OO(par) BOOST_PP_TUPLE_ELEM_III ## par\n#        define BOOST_PP_TUPLE_ELEM_III(n, etuple) BOOST_PP_TUPLE_ELEM_ ## n ## etuple\n#    else\n#        define BOOST_PP_TUPLE_ELEM(size, n, tuple) BOOST_PP_TUPLE_ELEM_I(BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM_, n) BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM_E_, size) tuple)\n#        define BOOST_PP_TUPLE_ELEM_I(x) x\n#    endif\n#    define BOOST_PP_TUPLE_ELEM_E_1(e0) (e0, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_2(e0, e1) (e0, e1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_3(e0, e1, e2) (e0, e1, e2, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_4(e0, e1, e2, e3) (e0, e1, e2, e3, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_5(e0, e1, e2, e3, e4) (e0, e1, e2, e3, e4, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_6(e0, e1, e2, e3, e4, e5) (e0, e1, e2, e3, e4, e5, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_7(e0, e1, e2, e3, e4, e5, e6) (e0, e1, e2, e3, e4, e5, e6, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_8(e0, e1, e2, e3, e4, e5, e6, e7) (e0, e1, e2, e3, e4, e5, e6, e7, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_9(e0, e1, e2, e3, e4, e5, e6, e7, e8) (e0, e1, e2, e3, e4, e5, e6, e7, e8, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_10(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_11(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_12(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_13(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_14(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_15(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_16(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_17(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_18(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_19(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_20(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_21(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_22(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_23(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_24(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_25(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_26(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_27(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_28(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_29(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_30(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_31(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_32(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_33(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_34(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_35(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_36(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_37(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_38(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_39(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_40(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_41(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_42(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_43(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_44(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_45(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_46(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_47(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_48(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_49(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_50(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_51(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_52(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_53(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_54(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_55(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_56(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_57(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_58(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_59(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_60(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_61(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_62(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_63(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_64\n#    define BOOST_PP_TUPLE_ELEM_0(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e0\n#    define BOOST_PP_TUPLE_ELEM_1(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e1\n#    define BOOST_PP_TUPLE_ELEM_2(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e2\n#    define BOOST_PP_TUPLE_ELEM_3(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e3\n#    define BOOST_PP_TUPLE_ELEM_4(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e4\n#    define BOOST_PP_TUPLE_ELEM_5(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e5\n#    define BOOST_PP_TUPLE_ELEM_6(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e6\n#    define BOOST_PP_TUPLE_ELEM_7(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e7\n#    define BOOST_PP_TUPLE_ELEM_8(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e8\n#    define BOOST_PP_TUPLE_ELEM_9(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e9\n#    define BOOST_PP_TUPLE_ELEM_10(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e10\n#    define BOOST_PP_TUPLE_ELEM_11(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e11\n#    define BOOST_PP_TUPLE_ELEM_12(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e12\n#    define BOOST_PP_TUPLE_ELEM_13(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e13\n#    define BOOST_PP_TUPLE_ELEM_14(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e14\n#    define BOOST_PP_TUPLE_ELEM_15(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e15\n#    define BOOST_PP_TUPLE_ELEM_16(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e16\n#    define BOOST_PP_TUPLE_ELEM_17(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e17\n#    define BOOST_PP_TUPLE_ELEM_18(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e18\n#    define BOOST_PP_TUPLE_ELEM_19(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e19\n#    define BOOST_PP_TUPLE_ELEM_20(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e20\n#    define BOOST_PP_TUPLE_ELEM_21(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e21\n#    define BOOST_PP_TUPLE_ELEM_22(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e22\n#    define BOOST_PP_TUPLE_ELEM_23(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e23\n#    define BOOST_PP_TUPLE_ELEM_24(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e24\n#    define BOOST_PP_TUPLE_ELEM_25(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e25\n#    define BOOST_PP_TUPLE_ELEM_26(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e26\n#    define BOOST_PP_TUPLE_ELEM_27(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e27\n#    define BOOST_PP_TUPLE_ELEM_28(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e28\n#    define BOOST_PP_TUPLE_ELEM_29(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e29\n#    define BOOST_PP_TUPLE_ELEM_30(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e30\n#    define BOOST_PP_TUPLE_ELEM_31(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e31\n#    define BOOST_PP_TUPLE_ELEM_32(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e32\n#    define BOOST_PP_TUPLE_ELEM_33(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e33\n#    define BOOST_PP_TUPLE_ELEM_34(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e34\n#    define BOOST_PP_TUPLE_ELEM_35(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e35\n#    define BOOST_PP_TUPLE_ELEM_36(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e36\n#    define BOOST_PP_TUPLE_ELEM_37(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e37\n#    define BOOST_PP_TUPLE_ELEM_38(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e38\n#    define BOOST_PP_TUPLE_ELEM_39(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e39\n#    define BOOST_PP_TUPLE_ELEM_40(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e40\n#    define BOOST_PP_TUPLE_ELEM_41(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e41\n#    define BOOST_PP_TUPLE_ELEM_42(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e42\n#    define BOOST_PP_TUPLE_ELEM_43(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e43\n#    define BOOST_PP_TUPLE_ELEM_44(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e44\n#    define BOOST_PP_TUPLE_ELEM_45(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e45\n#    define BOOST_PP_TUPLE_ELEM_46(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e46\n#    define BOOST_PP_TUPLE_ELEM_47(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e47\n#    define BOOST_PP_TUPLE_ELEM_48(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e48\n#    define BOOST_PP_TUPLE_ELEM_49(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e49\n#    define BOOST_PP_TUPLE_ELEM_50(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e50\n#    define BOOST_PP_TUPLE_ELEM_51(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e51\n#    define BOOST_PP_TUPLE_ELEM_52(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e52\n#    define BOOST_PP_TUPLE_ELEM_53(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e53\n#    define BOOST_PP_TUPLE_ELEM_54(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e54\n#    define BOOST_PP_TUPLE_ELEM_55(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e55\n#    define BOOST_PP_TUPLE_ELEM_56(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e56\n#    define BOOST_PP_TUPLE_ELEM_57(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e57\n#    define BOOST_PP_TUPLE_ELEM_58(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e58\n#    define BOOST_PP_TUPLE_ELEM_59(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e59\n#    define BOOST_PP_TUPLE_ELEM_60(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e60\n#    define BOOST_PP_TUPLE_ELEM_61(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e61\n#    define BOOST_PP_TUPLE_ELEM_62(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e62\n#    define BOOST_PP_TUPLE_ELEM_63(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e63\n# endif\n#\n# /* directly used elsewhere in Boost... */\n#\n# define BOOST_PP_TUPLE_ELEM_1_0(a) a\n#\n# define BOOST_PP_TUPLE_ELEM_2_0(a, b) a\n# define BOOST_PP_TUPLE_ELEM_2_1(a, b) b\n#\n# define BOOST_PP_TUPLE_ELEM_3_0(a, b, c) a\n# define BOOST_PP_TUPLE_ELEM_3_1(a, b, c) b\n# define BOOST_PP_TUPLE_ELEM_3_2(a, b, c) c\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/tuple/rem.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002-2011.                             *\n#  *     (C) Copyright Edward Diener 2011,2013.                               *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_TUPLE_REM_HPP\n# define BOOST_PREPROCESSOR_TUPLE_REM_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/facilities/expand.hpp>\n# include <boost/preprocessor/facilities/overload.hpp>\n# include <boost/preprocessor/tuple/detail/is_single_return.hpp>\n#\n# /* BOOST_PP_REM */\n#\n# if BOOST_PP_VARIADICS\n# \t if BOOST_PP_VARIADICS_MSVC\n\t\t/* To be used internally when __VA_ARGS__ could be empty ( or is a single element ) */\n#    \tdefine BOOST_PP_REM_CAT(...) BOOST_PP_CAT(__VA_ARGS__,)\n# \t endif\n#    define BOOST_PP_REM(...) __VA_ARGS__\n# else\n#    define BOOST_PP_REM(x) x\n# endif\n#\n# /* BOOST_PP_TUPLE_REM */\n#\n/*\n  VC++8.0 cannot handle the variadic version of BOOST_PP_TUPLE_REM(size)\n*/\n# if BOOST_PP_VARIADICS && !(BOOST_PP_VARIADICS_MSVC && _MSC_VER <= 1400)\n# \t if BOOST_PP_VARIADICS_MSVC\n\t\t/* To be used internally when the size could be 0 ( or 1 ) */\n#    \tdefine BOOST_PP_TUPLE_REM_CAT(size) BOOST_PP_REM_CAT\n# \t endif\n#    define BOOST_PP_TUPLE_REM(size) BOOST_PP_REM\n# else\n#    if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#        define BOOST_PP_TUPLE_REM(size) BOOST_PP_TUPLE_REM_I(size)\n#    else\n#        define BOOST_PP_TUPLE_REM(size) BOOST_PP_TUPLE_REM_OO((size))\n#        define BOOST_PP_TUPLE_REM_OO(par) BOOST_PP_TUPLE_REM_I ## par\n#    endif\n#    define BOOST_PP_TUPLE_REM_I(size) BOOST_PP_TUPLE_REM_ ## size\n# endif\n# define BOOST_PP_TUPLE_REM_0()\n# define BOOST_PP_TUPLE_REM_1(e0) e0\n# define BOOST_PP_TUPLE_REM_2(e0, e1) e0, e1\n# define BOOST_PP_TUPLE_REM_3(e0, e1, e2) e0, e1, e2\n# define BOOST_PP_TUPLE_REM_4(e0, e1, e2, e3) e0, e1, e2, e3\n# define BOOST_PP_TUPLE_REM_5(e0, e1, e2, e3, e4) e0, e1, e2, e3, e4\n# define BOOST_PP_TUPLE_REM_6(e0, e1, e2, e3, e4, e5) e0, e1, e2, e3, e4, e5\n# define BOOST_PP_TUPLE_REM_7(e0, e1, e2, e3, e4, e5, e6) e0, e1, e2, e3, e4, e5, e6\n# define BOOST_PP_TUPLE_REM_8(e0, e1, e2, e3, e4, e5, e6, e7) e0, e1, e2, e3, e4, e5, e6, e7\n# define BOOST_PP_TUPLE_REM_9(e0, e1, e2, e3, e4, e5, e6, e7, e8) e0, e1, e2, e3, e4, e5, e6, e7, e8\n# define BOOST_PP_TUPLE_REM_10(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9\n# define BOOST_PP_TUPLE_REM_11(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10\n# define BOOST_PP_TUPLE_REM_12(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11\n# define BOOST_PP_TUPLE_REM_13(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12\n# define BOOST_PP_TUPLE_REM_14(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13\n# define BOOST_PP_TUPLE_REM_15(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14\n# define BOOST_PP_TUPLE_REM_16(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15\n# define BOOST_PP_TUPLE_REM_17(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16\n# define BOOST_PP_TUPLE_REM_18(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17\n# define BOOST_PP_TUPLE_REM_19(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18\n# define BOOST_PP_TUPLE_REM_20(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19\n# define BOOST_PP_TUPLE_REM_21(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20\n# define BOOST_PP_TUPLE_REM_22(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21\n# define BOOST_PP_TUPLE_REM_23(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22\n# define BOOST_PP_TUPLE_REM_24(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23\n# define BOOST_PP_TUPLE_REM_25(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24\n# define BOOST_PP_TUPLE_REM_26(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25\n# define BOOST_PP_TUPLE_REM_27(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26\n# define BOOST_PP_TUPLE_REM_28(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27\n# define BOOST_PP_TUPLE_REM_29(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28\n# define BOOST_PP_TUPLE_REM_30(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29\n# define BOOST_PP_TUPLE_REM_31(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30\n# define BOOST_PP_TUPLE_REM_32(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31\n# define BOOST_PP_TUPLE_REM_33(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32\n# define BOOST_PP_TUPLE_REM_34(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33\n# define BOOST_PP_TUPLE_REM_35(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34\n# define BOOST_PP_TUPLE_REM_36(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35\n# define BOOST_PP_TUPLE_REM_37(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36\n# define BOOST_PP_TUPLE_REM_38(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37\n# define BOOST_PP_TUPLE_REM_39(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38\n# define BOOST_PP_TUPLE_REM_40(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39\n# define BOOST_PP_TUPLE_REM_41(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40\n# define BOOST_PP_TUPLE_REM_42(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41\n# define BOOST_PP_TUPLE_REM_43(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42\n# define BOOST_PP_TUPLE_REM_44(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43\n# define BOOST_PP_TUPLE_REM_45(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44\n# define BOOST_PP_TUPLE_REM_46(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45\n# define BOOST_PP_TUPLE_REM_47(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46\n# define BOOST_PP_TUPLE_REM_48(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47\n# define BOOST_PP_TUPLE_REM_49(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48\n# define BOOST_PP_TUPLE_REM_50(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49\n# define BOOST_PP_TUPLE_REM_51(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50\n# define BOOST_PP_TUPLE_REM_52(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51\n# define BOOST_PP_TUPLE_REM_53(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52\n# define BOOST_PP_TUPLE_REM_54(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53\n# define BOOST_PP_TUPLE_REM_55(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54\n# define BOOST_PP_TUPLE_REM_56(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55\n# define BOOST_PP_TUPLE_REM_57(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56\n# define BOOST_PP_TUPLE_REM_58(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57\n# define BOOST_PP_TUPLE_REM_59(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58\n# define BOOST_PP_TUPLE_REM_60(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59\n# define BOOST_PP_TUPLE_REM_61(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60\n# define BOOST_PP_TUPLE_REM_62(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61\n# define BOOST_PP_TUPLE_REM_63(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62\n# define BOOST_PP_TUPLE_REM_64(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63\n#\n# /* BOOST_PP_TUPLE_REM_CTOR */\n#\n# if BOOST_PP_VARIADICS\n#    if BOOST_PP_VARIADICS_MSVC\n#        define BOOST_PP_TUPLE_REM_CTOR(...) BOOST_PP_TUPLE_REM_CTOR_I(BOOST_PP_OVERLOAD(BOOST_PP_TUPLE_REM_CTOR_O_, __VA_ARGS__), (__VA_ARGS__))\n#        define BOOST_PP_TUPLE_REM_CTOR_I(m, args) BOOST_PP_TUPLE_REM_CTOR_II(m, args)\n#        define BOOST_PP_TUPLE_REM_CTOR_II(m, args) BOOST_PP_CAT(m ## args,)\n#    \t define BOOST_PP_TUPLE_REM_CTOR_O_1(tuple) BOOST_PP_EXPAND(BOOST_PP_TUPLE_IS_SINGLE_RETURN(BOOST_PP_REM_CAT,BOOST_PP_REM,tuple) tuple)\n#    else\n#        define BOOST_PP_TUPLE_REM_CTOR(...) BOOST_PP_OVERLOAD(BOOST_PP_TUPLE_REM_CTOR_O_, __VA_ARGS__)(__VA_ARGS__)\n#    \t define BOOST_PP_TUPLE_REM_CTOR_O_1(tuple) BOOST_PP_REM tuple\n#    endif\n#    define BOOST_PP_TUPLE_REM_CTOR_O_2(size, tuple) BOOST_PP_TUPLE_REM_CTOR_O_1(tuple)\n# else\n#    if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#        define BOOST_PP_TUPLE_REM_CTOR(size, tuple) BOOST_PP_TUPLE_REM_CTOR_I(BOOST_PP_TUPLE_REM(size), tuple)\n#    else\n#        define BOOST_PP_TUPLE_REM_CTOR(size, tuple) BOOST_PP_TUPLE_REM_CTOR_D(size, tuple)\n#        define BOOST_PP_TUPLE_REM_CTOR_D(size, tuple) BOOST_PP_TUPLE_REM_CTOR_I(BOOST_PP_TUPLE_REM(size), tuple)\n#    endif\n#    if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#        define BOOST_PP_TUPLE_REM_CTOR_I(ext, tuple) ext tuple\n#    else\n#        define BOOST_PP_TUPLE_REM_CTOR_I(ext, tuple) BOOST_PP_TUPLE_REM_CTOR_OO((ext, tuple))\n#        define BOOST_PP_TUPLE_REM_CTOR_OO(par) BOOST_PP_TUPLE_REM_CTOR_II ## par\n#        define BOOST_PP_TUPLE_REM_CTOR_II(ext, tuple) ext ## tuple\n#    endif\n# endif\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/tuple/size.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2011.                                    *\n#  *     (C) Copyright Paul Mensonides 2011.                                  *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_TUPLE_SIZE_HPP\n# define BOOST_PREPROCESSOR_TUPLE_SIZE_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/variadic/size.hpp>\n#\n# if BOOST_PP_VARIADICS\n#    if BOOST_PP_VARIADICS_MSVC\n#        define BOOST_PP_TUPLE_SIZE(tuple) BOOST_PP_CAT(BOOST_PP_VARIADIC_SIZE tuple,)\n#    else\n#        define BOOST_PP_TUPLE_SIZE(tuple) BOOST_PP_VARIADIC_SIZE tuple\n#    endif\n# endif\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/tuple/to_list.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002-2011) */\n# /* Revised by Edward Diener (2011) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_TUPLE_TO_LIST_HPP\n# define BOOST_PREPROCESSOR_TUPLE_TO_LIST_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/facilities/overload.hpp>\n# include <boost/preprocessor/tuple/size.hpp>\n# include <boost/preprocessor/variadic/size.hpp>\n#\n# /* BOOST_PP_TUPLE_TO_LIST */\n#\n# if BOOST_PP_VARIADICS\n#    if BOOST_PP_VARIADICS_MSVC\n#        define BOOST_PP_TUPLE_TO_LIST(...) BOOST_PP_TUPLE_TO_LIST_I(BOOST_PP_OVERLOAD(BOOST_PP_TUPLE_TO_LIST_O_, __VA_ARGS__), (__VA_ARGS__))\n#        define BOOST_PP_TUPLE_TO_LIST_I(m, args) BOOST_PP_TUPLE_TO_LIST_II(m, args)\n#        define BOOST_PP_TUPLE_TO_LIST_II(m, args) BOOST_PP_CAT(m ## args,)\n#    \t define BOOST_PP_TUPLE_TO_LIST_O_1(tuple) BOOST_PP_CAT(BOOST_PP_TUPLE_TO_LIST_, BOOST_PP_TUPLE_SIZE(tuple)) tuple\n#    else\n#        define BOOST_PP_TUPLE_TO_LIST(...) BOOST_PP_OVERLOAD(BOOST_PP_TUPLE_TO_LIST_O_, __VA_ARGS__)(__VA_ARGS__)\n#    \t define BOOST_PP_TUPLE_TO_LIST_O_1(tuple) BOOST_PP_CAT(BOOST_PP_TUPLE_TO_LIST_, BOOST_PP_VARIADIC_SIZE tuple) tuple\n#    endif\n#    define BOOST_PP_TUPLE_TO_LIST_O_2(size, tuple) BOOST_PP_TUPLE_TO_LIST_O_1(tuple)\n# else\n#    if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#        define BOOST_PP_TUPLE_TO_LIST(size, tuple) BOOST_PP_TUPLE_TO_LIST_I(size, tuple)\n#        if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#            define BOOST_PP_TUPLE_TO_LIST_I(s, t) BOOST_PP_TUPLE_TO_LIST_ ## s t\n#        else\n#            define BOOST_PP_TUPLE_TO_LIST_I(s, t) BOOST_PP_TUPLE_TO_LIST_II(BOOST_PP_TUPLE_TO_LIST_ ## s t)\n#            define BOOST_PP_TUPLE_TO_LIST_II(res) res\n#        endif\n#    else\n#        define BOOST_PP_TUPLE_TO_LIST(size, tuple) BOOST_PP_TUPLE_TO_LIST_OO((size, tuple))\n#        define BOOST_PP_TUPLE_TO_LIST_OO(par) BOOST_PP_TUPLE_TO_LIST_I ## par\n#        define BOOST_PP_TUPLE_TO_LIST_I(s, t) BOOST_PP_TUPLE_TO_LIST_ ## s ## t\n#    endif\n# endif\n#\n# define BOOST_PP_TUPLE_TO_LIST_1(e0) (e0, BOOST_PP_NIL)\n# define BOOST_PP_TUPLE_TO_LIST_2(e0, e1) (e0, (e1, BOOST_PP_NIL))\n# define BOOST_PP_TUPLE_TO_LIST_3(e0, e1, e2) (e0, (e1, (e2, BOOST_PP_NIL)))\n# define BOOST_PP_TUPLE_TO_LIST_4(e0, e1, e2, e3) (e0, (e1, (e2, (e3, BOOST_PP_NIL))))\n# define BOOST_PP_TUPLE_TO_LIST_5(e0, e1, e2, e3, e4) (e0, (e1, (e2, (e3, (e4, BOOST_PP_NIL)))))\n# define BOOST_PP_TUPLE_TO_LIST_6(e0, e1, e2, e3, e4, e5) (e0, (e1, (e2, (e3, (e4, (e5, BOOST_PP_NIL))))))\n# define BOOST_PP_TUPLE_TO_LIST_7(e0, e1, e2, e3, e4, e5, e6) (e0, (e1, (e2, (e3, (e4, (e5, (e6, BOOST_PP_NIL)))))))\n# define BOOST_PP_TUPLE_TO_LIST_8(e0, e1, e2, e3, e4, e5, e6, e7) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, BOOST_PP_NIL))))))))\n# define BOOST_PP_TUPLE_TO_LIST_9(e0, e1, e2, e3, e4, e5, e6, e7, e8) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, BOOST_PP_NIL)))))))))\n# define BOOST_PP_TUPLE_TO_LIST_10(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, BOOST_PP_NIL))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_11(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, BOOST_PP_NIL)))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_12(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, BOOST_PP_NIL))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_13(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, BOOST_PP_NIL)))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_14(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, BOOST_PP_NIL))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_15(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, BOOST_PP_NIL)))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_16(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, BOOST_PP_NIL))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_17(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, BOOST_PP_NIL)))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_18(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, BOOST_PP_NIL))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_19(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, BOOST_PP_NIL)))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_20(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, BOOST_PP_NIL))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_21(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, BOOST_PP_NIL)))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_22(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, BOOST_PP_NIL))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_23(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, BOOST_PP_NIL)))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_24(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, BOOST_PP_NIL))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_25(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, BOOST_PP_NIL)))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_26(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, BOOST_PP_NIL))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_27(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, BOOST_PP_NIL)))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_28(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, BOOST_PP_NIL))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_29(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, BOOST_PP_NIL)))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_30(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, BOOST_PP_NIL))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_31(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, BOOST_PP_NIL)))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_32(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, BOOST_PP_NIL))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_33(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, BOOST_PP_NIL)))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_34(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, BOOST_PP_NIL))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_35(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, BOOST_PP_NIL)))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_36(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, BOOST_PP_NIL))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_37(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, BOOST_PP_NIL)))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_38(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, BOOST_PP_NIL))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_39(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, BOOST_PP_NIL)))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_40(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, BOOST_PP_NIL))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_41(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, BOOST_PP_NIL)))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_42(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, BOOST_PP_NIL))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_43(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, BOOST_PP_NIL)))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_44(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, BOOST_PP_NIL))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_45(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, BOOST_PP_NIL)))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_46(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, BOOST_PP_NIL))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_47(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, BOOST_PP_NIL)))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_48(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, (e47, BOOST_PP_NIL))))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_49(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, (e47, (e48, BOOST_PP_NIL)))))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_50(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, (e47, (e48, (e49, BOOST_PP_NIL))))))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_51(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, (e47, (e48, (e49, (e50, BOOST_PP_NIL)))))))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_52(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, (e47, (e48, (e49, (e50, (e51, BOOST_PP_NIL))))))))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_53(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, (e47, (e48, (e49, (e50, (e51, (e52, BOOST_PP_NIL)))))))))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_54(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, (e47, (e48, (e49, (e50, (e51, (e52, (e53, BOOST_PP_NIL))))))))))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_55(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, (e47, (e48, (e49, (e50, (e51, (e52, (e53, (e54, BOOST_PP_NIL)))))))))))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_56(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, (e47, (e48, (e49, (e50, (e51, (e52, (e53, (e54, (e55, BOOST_PP_NIL))))))))))))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_57(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, (e47, (e48, (e49, (e50, (e51, (e52, (e53, (e54, (e55, (e56, BOOST_PP_NIL)))))))))))))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_58(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, (e47, (e48, (e49, (e50, (e51, (e52, (e53, (e54, (e55, (e56, (e57, BOOST_PP_NIL))))))))))))))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_59(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, (e47, (e48, (e49, (e50, (e51, (e52, (e53, (e54, (e55, (e56, (e57, (e58, BOOST_PP_NIL)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_60(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, (e47, (e48, (e49, (e50, (e51, (e52, (e53, (e54, (e55, (e56, (e57, (e58, (e59, BOOST_PP_NIL))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_61(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, (e47, (e48, (e49, (e50, (e51, (e52, (e53, (e54, (e55, (e56, (e57, (e58, (e59, (e60, BOOST_PP_NIL)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_62(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, (e47, (e48, (e49, (e50, (e51, (e52, (e53, (e54, (e55, (e56, (e57, (e58, (e59, (e60, (e61, BOOST_PP_NIL))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_63(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, (e47, (e48, (e49, (e50, (e51, (e52, (e53, (e54, (e55, (e56, (e57, (e58, (e59, (e60, (e61, (e62, BOOST_PP_NIL)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_64(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, (e47, (e48, (e49, (e50, (e51, (e52, (e53, (e54, (e55, (e56, (e57, (e58, (e59, (e60, (e61, (e62, (e63, BOOST_PP_NIL))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/variadic/elem.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2011.                                    *\n#  *     (C) Copyright Paul Mensonides 2011.                                  *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_VARIADIC_ELEM_HPP\n# define BOOST_PREPROCESSOR_VARIADIC_ELEM_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_VARIADIC_ELEM */\n#\n# if BOOST_PP_VARIADICS\n#    if BOOST_PP_VARIADICS_MSVC\n#        define BOOST_PP_VARIADIC_ELEM(n, ...) BOOST_PP_VARIADIC_ELEM_I(n,__VA_ARGS__)\n#        define BOOST_PP_VARIADIC_ELEM_I(n, ...) BOOST_PP_CAT(BOOST_PP_CAT(BOOST_PP_VARIADIC_ELEM_, n)(__VA_ARGS__,),)\n#    else\n#        define BOOST_PP_VARIADIC_ELEM(n, ...) BOOST_PP_CAT(BOOST_PP_VARIADIC_ELEM_, n)(__VA_ARGS__,)\n#    endif\n#    define BOOST_PP_VARIADIC_ELEM_0(e0, ...) e0\n#    define BOOST_PP_VARIADIC_ELEM_1(e0, e1, ...) e1\n#    define BOOST_PP_VARIADIC_ELEM_2(e0, e1, e2, ...) e2\n#    define BOOST_PP_VARIADIC_ELEM_3(e0, e1, e2, e3, ...) e3\n#    define BOOST_PP_VARIADIC_ELEM_4(e0, e1, e2, e3, e4, ...) e4\n#    define BOOST_PP_VARIADIC_ELEM_5(e0, e1, e2, e3, e4, e5, ...) e5\n#    define BOOST_PP_VARIADIC_ELEM_6(e0, e1, e2, e3, e4, e5, e6, ...) e6\n#    define BOOST_PP_VARIADIC_ELEM_7(e0, e1, e2, e3, e4, e5, e6, e7, ...) e7\n#    define BOOST_PP_VARIADIC_ELEM_8(e0, e1, e2, e3, e4, e5, e6, e7, e8, ...) e8\n#    define BOOST_PP_VARIADIC_ELEM_9(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, ...) e9\n#    define BOOST_PP_VARIADIC_ELEM_10(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, ...) e10\n#    define BOOST_PP_VARIADIC_ELEM_11(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, ...) e11\n#    define BOOST_PP_VARIADIC_ELEM_12(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, ...) e12\n#    define BOOST_PP_VARIADIC_ELEM_13(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, ...) e13\n#    define BOOST_PP_VARIADIC_ELEM_14(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, ...) e14\n#    define BOOST_PP_VARIADIC_ELEM_15(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, ...) e15\n#    define BOOST_PP_VARIADIC_ELEM_16(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, ...) e16\n#    define BOOST_PP_VARIADIC_ELEM_17(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, ...) e17\n#    define BOOST_PP_VARIADIC_ELEM_18(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, ...) e18\n#    define BOOST_PP_VARIADIC_ELEM_19(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, ...) e19\n#    define BOOST_PP_VARIADIC_ELEM_20(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, ...) e20\n#    define BOOST_PP_VARIADIC_ELEM_21(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, ...) e21\n#    define BOOST_PP_VARIADIC_ELEM_22(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, ...) e22\n#    define BOOST_PP_VARIADIC_ELEM_23(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, ...) e23\n#    define BOOST_PP_VARIADIC_ELEM_24(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, ...) e24\n#    define BOOST_PP_VARIADIC_ELEM_25(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, ...) e25\n#    define BOOST_PP_VARIADIC_ELEM_26(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, ...) e26\n#    define BOOST_PP_VARIADIC_ELEM_27(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, ...) e27\n#    define BOOST_PP_VARIADIC_ELEM_28(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, ...) e28\n#    define BOOST_PP_VARIADIC_ELEM_29(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, ...) e29\n#    define BOOST_PP_VARIADIC_ELEM_30(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, ...) e30\n#    define BOOST_PP_VARIADIC_ELEM_31(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, ...) e31\n#    define BOOST_PP_VARIADIC_ELEM_32(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, ...) e32\n#    define BOOST_PP_VARIADIC_ELEM_33(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, ...) e33\n#    define BOOST_PP_VARIADIC_ELEM_34(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, ...) e34\n#    define BOOST_PP_VARIADIC_ELEM_35(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, ...) e35\n#    define BOOST_PP_VARIADIC_ELEM_36(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, ...) e36\n#    define BOOST_PP_VARIADIC_ELEM_37(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, ...) e37\n#    define BOOST_PP_VARIADIC_ELEM_38(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, ...) e38\n#    define BOOST_PP_VARIADIC_ELEM_39(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, ...) e39\n#    define BOOST_PP_VARIADIC_ELEM_40(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, ...) e40\n#    define BOOST_PP_VARIADIC_ELEM_41(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, ...) e41\n#    define BOOST_PP_VARIADIC_ELEM_42(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, ...) e42\n#    define BOOST_PP_VARIADIC_ELEM_43(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, ...) e43\n#    define BOOST_PP_VARIADIC_ELEM_44(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, ...) e44\n#    define BOOST_PP_VARIADIC_ELEM_45(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, ...) e45\n#    define BOOST_PP_VARIADIC_ELEM_46(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, ...) e46\n#    define BOOST_PP_VARIADIC_ELEM_47(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, ...) e47\n#    define BOOST_PP_VARIADIC_ELEM_48(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, ...) e48\n#    define BOOST_PP_VARIADIC_ELEM_49(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, ...) e49\n#    define BOOST_PP_VARIADIC_ELEM_50(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, ...) e50\n#    define BOOST_PP_VARIADIC_ELEM_51(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, ...) e51\n#    define BOOST_PP_VARIADIC_ELEM_52(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, ...) e52\n#    define BOOST_PP_VARIADIC_ELEM_53(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, ...) e53\n#    define BOOST_PP_VARIADIC_ELEM_54(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, ...) e54\n#    define BOOST_PP_VARIADIC_ELEM_55(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, ...) e55\n#    define BOOST_PP_VARIADIC_ELEM_56(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, ...) e56\n#    define BOOST_PP_VARIADIC_ELEM_57(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, ...) e57\n#    define BOOST_PP_VARIADIC_ELEM_58(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, ...) e58\n#    define BOOST_PP_VARIADIC_ELEM_59(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, ...) e59\n#    define BOOST_PP_VARIADIC_ELEM_60(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, ...) e60\n#    define BOOST_PP_VARIADIC_ELEM_61(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, ...) e61\n#    define BOOST_PP_VARIADIC_ELEM_62(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, ...) e62\n#    define BOOST_PP_VARIADIC_ELEM_63(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63, ...) e63\n# endif\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/preprocessor/variadic/size.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2011.                                    *\n#  *     (C) Copyright Paul Mensonides 2011.                                  *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_VARIADIC_SIZE_HPP\n# define BOOST_PREPROCESSOR_VARIADIC_SIZE_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_VARIADIC_SIZE */\n#\n# if BOOST_PP_VARIADICS\n#    if BOOST_PP_VARIADICS_MSVC\n#        define BOOST_PP_VARIADIC_SIZE(...) BOOST_PP_CAT(BOOST_PP_VARIADIC_SIZE_I(__VA_ARGS__, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1,),)\n#    else\n#        define BOOST_PP_VARIADIC_SIZE(...) BOOST_PP_VARIADIC_SIZE_I(__VA_ARGS__, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1,)\n#    endif\n#    define BOOST_PP_VARIADIC_SIZE_I(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63, size, ...) size\n# endif\n#\n# endif\n"
  },
  {
    "path": "benchmarks/boost/static_assert.hpp",
    "content": "//  (C) Copyright John Maddock 2000.\n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org/libs/static_assert for documentation.\n\n/*\n Revision history:\n   02 August 2000\n      Initial version.\n*/\n\n#ifndef BOOST_STATIC_ASSERT_HPP\n#define BOOST_STATIC_ASSERT_HPP\n\n#include <boost/config.hpp>\n#include <boost/detail/workaround.hpp>\n\n#if defined(__GNUC__) && !defined(__GXX_EXPERIMENTAL_CXX0X__)\n//\n// This is horrible, but it seems to be the only we can shut up the\n// \"anonymous variadic macros were introduced in C99 [-Wvariadic-macros]\"\n// warning that get spewed out otherwise in non-C++11 mode.\n//\n#pragma GCC system_header\n#endif\n\n#ifndef BOOST_NO_CXX11_STATIC_ASSERT\n#  ifndef BOOST_NO_CXX11_VARIADIC_MACROS\n#     define BOOST_STATIC_ASSERT_MSG( ... ) static_assert(__VA_ARGS__)\n#  else\n#     define BOOST_STATIC_ASSERT_MSG( B, Msg ) static_assert( B, Msg )\n#  endif\n#else\n#     define BOOST_STATIC_ASSERT_MSG( B, Msg ) BOOST_STATIC_ASSERT( B )\n#endif\n\n#ifdef __BORLANDC__\n//\n// workaround for buggy integral-constant expression support:\n#define BOOST_BUGGY_INTEGRAL_CONSTANT_EXPRESSIONS\n#endif\n\n#if defined(__GNUC__) && (__GNUC__ == 3) && ((__GNUC_MINOR__ == 3) || (__GNUC_MINOR__ == 4))\n// gcc 3.3 and 3.4 don't produce good error messages with the default version:\n#  define BOOST_SA_GCC_WORKAROUND\n#endif\n\n//\n// If the compiler issues warnings about old C style casts,\n// then enable this:\n//\n#if defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4)))\n#  ifndef BOOST_NO_CXX11_VARIADIC_MACROS\n#     define BOOST_STATIC_ASSERT_BOOL_CAST( ... ) ((__VA_ARGS__) == 0 ? false : true)\n#  else\n#     define BOOST_STATIC_ASSERT_BOOL_CAST( x ) ((x) == 0 ? false : true)\n#  endif\n#else\n#  ifndef BOOST_NO_CXX11_VARIADIC_MACROS\n#     define BOOST_STATIC_ASSERT_BOOL_CAST( ... ) (bool)(__VA_ARGS__)\n#  else\n#     define BOOST_STATIC_ASSERT_BOOL_CAST(x) (bool)(x)\n#  endif\n#endif\n\n#ifndef BOOST_NO_CXX11_STATIC_ASSERT\n#  ifndef BOOST_NO_CXX11_VARIADIC_MACROS\n#     define BOOST_STATIC_ASSERT( ... ) static_assert(__VA_ARGS__, #__VA_ARGS__)\n#  else\n#     define BOOST_STATIC_ASSERT( B ) static_assert(B, #B)\n#  endif\n#else\n\nnamespace boost{\n\n// HP aCC cannot deal with missing names for template value parameters\ntemplate <bool x> struct STATIC_ASSERTION_FAILURE;\n\ntemplate <> struct STATIC_ASSERTION_FAILURE<true> { enum { value = 1 }; };\n\n// HP aCC cannot deal with missing names for template value parameters\ntemplate<int x> struct static_assert_test{};\n\n}\n\n//\n// Implicit instantiation requires that all member declarations be\n// instantiated, but that the definitions are *not* instantiated.\n//\n// It's not particularly clear how this applies to enum's or typedefs;\n// both are described as declarations [7.1.3] and [7.2] in the standard,\n// however some compilers use \"delayed evaluation\" of one or more of\n// these when implicitly instantiating templates.  We use typedef declarations\n// by default, but try defining BOOST_USE_ENUM_STATIC_ASSERT if the enum\n// version gets better results from your compiler...\n//\n// Implementation:\n// Both of these versions rely on sizeof(incomplete_type) generating an error\n// message containing the name of the incomplete type.  We use\n// \"STATIC_ASSERTION_FAILURE\" as the type name here to generate\n// an eye catching error message.  The result of the sizeof expression is either\n// used as an enum initialiser, or as a template argument depending which version\n// is in use...\n// Note that the argument to the assert is explicitly cast to bool using old-\n// style casts: too many compilers currently have problems with static_cast\n// when used inside integral constant expressions.\n//\n#if !defined(BOOST_BUGGY_INTEGRAL_CONSTANT_EXPRESSIONS)\n\n#if defined(BOOST_MSVC) && defined(BOOST_NO_CXX11_VARIADIC_MACROS)\n#define BOOST_STATIC_ASSERT( B ) \\\n   typedef ::boost::static_assert_test<\\\n      sizeof(::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST ( B ) >)>\\\n         BOOST_JOIN(boost_static_assert_typedef_, __COUNTER__)\n#elif defined(BOOST_MSVC)\n#define BOOST_STATIC_ASSERT(...) \\\n   typedef ::boost::static_assert_test<\\\n      sizeof(::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST (__VA_ARGS__) >)>\\\n         BOOST_JOIN(boost_static_assert_typedef_, __COUNTER__)\n#elif (defined(BOOST_INTEL_CXX_VERSION) || defined(BOOST_SA_GCC_WORKAROUND))  && defined(BOOST_NO_CXX11_VARIADIC_MACROS)\n// agurt 15/sep/02: a special care is needed to force Intel C++ issue an error \n// instead of warning in case of failure\n# define BOOST_STATIC_ASSERT( B ) \\\n    typedef char BOOST_JOIN(boost_static_assert_typedef_, __LINE__) \\\n        [ ::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST( B ) >::value ]\n#elif (defined(BOOST_INTEL_CXX_VERSION) || defined(BOOST_SA_GCC_WORKAROUND))  && !defined(BOOST_NO_CXX11_VARIADIC_MACROS)\n// agurt 15/sep/02: a special care is needed to force Intel C++ issue an error \n// instead of warning in case of failure\n# define BOOST_STATIC_ASSERT(...) \\\n    typedef char BOOST_JOIN(boost_static_assert_typedef_, __LINE__) \\\n        [ ::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST( __VA_ARGS__ ) >::value ]\n#elif defined(__sgi)\n// special version for SGI MIPSpro compiler\n#define BOOST_STATIC_ASSERT( B ) \\\n   BOOST_STATIC_CONSTANT(bool, \\\n     BOOST_JOIN(boost_static_assert_test_, __LINE__) = ( B )); \\\n   typedef ::boost::static_assert_test<\\\n     sizeof(::boost::STATIC_ASSERTION_FAILURE< \\\n       BOOST_JOIN(boost_static_assert_test_, __LINE__) >)>\\\n         BOOST_JOIN(boost_static_assert_typedef_, __LINE__)\n#elif BOOST_WORKAROUND(__MWERKS__, <= 0x3003)\n// special version for CodeWarrior <= 8.x\n#define BOOST_STATIC_ASSERT( B ) \\\n   BOOST_STATIC_CONSTANT(int, \\\n     BOOST_JOIN(boost_static_assert_test_, __LINE__) = \\\n       sizeof(::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST( B ) >) )\n#else\n// generic version\n#  ifndef BOOST_NO_CXX11_VARIADIC_MACROS\n#     define BOOST_STATIC_ASSERT( ... ) \\\n         typedef ::boost::static_assert_test<\\\n            sizeof(::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST( __VA_ARGS__ ) >)>\\\n               BOOST_JOIN(boost_static_assert_typedef_, __LINE__) BOOST_ATTRIBUTE_UNUSED\n#  else\n#     define BOOST_STATIC_ASSERT( B ) \\\n         typedef ::boost::static_assert_test<\\\n            sizeof(::boost::STATIC_ASSERTION_FAILURE< BOOST_STATIC_ASSERT_BOOL_CAST( B ) >)>\\\n               BOOST_JOIN(boost_static_assert_typedef_, __LINE__) BOOST_ATTRIBUTE_UNUSED\n#  endif\n#endif\n\n#else\n// alternative enum based implementation:\n#  ifndef BOOST_NO_CXX11_VARIADIC_MACROS\n#    define BOOST_STATIC_ASSERT( ... ) \\\n         enum { BOOST_JOIN(boost_static_assert_enum_, __LINE__) \\\n            = sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( __VA_ARGS__ ) >) }\n#  else\n#    define BOOST_STATIC_ASSERT(B) \\\n         enum { BOOST_JOIN(boost_static_assert_enum_, __LINE__) \\\n            = sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( B ) >) }\n#  endif\n#endif\n#endif // defined(BOOST_NO_CXX11_STATIC_ASSERT)\n\n#endif // BOOST_STATIC_ASSERT_HPP\n\n\n"
  },
  {
    "path": "benchmarks/boost/swap.hpp",
    "content": "/*\n * Copyright (c) 2014 Glen Fernandes\n *\n * Distributed under the Boost Software License, Version 1.0. (See\n * accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n */\n\n#ifndef BOOST_SWAP_HPP\n#define BOOST_SWAP_HPP\n\n// The header file at this path is deprecated;\n// use boost/core/swap.hpp instead.\n\n#include <boost/core/swap.hpp>\n\n#endif\n"
  },
  {
    "path": "benchmarks/boost/throw_exception.hpp",
    "content": "#ifndef UUID_AA15E74A856F11E08B8D93F24824019B\n#define UUID_AA15E74A856F11E08B8D93F24824019B\n#if (__GNUC__*100+__GNUC_MINOR__>301) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)\n#pragma GCC system_header\n#endif\n#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)\n#pragma warning(push,1)\n#endif\n\n// MS compatible compilers support #pragma once\n\n#if defined(_MSC_VER) && (_MSC_VER >= 1020)\n# pragma once\n#endif\n\n//\n//  boost/throw_exception.hpp\n//\n//  Copyright (c) 2002 Peter Dimov and Multi Media Ltd.\n//  Copyright (c) 2008-2009 Emil Dotchevski and Reverge Studios, Inc.\n//\n//  Distributed under the Boost Software License, Version 1.0. (See\n//  accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//\n//  http://www.boost.org/libs/utility/throw_exception.html\n//\n\n#include <boost/detail/workaround.hpp>\n#include <boost/config.hpp>\n#include <exception>\n\n#if !defined( BOOST_EXCEPTION_DISABLE ) && defined( __BORLANDC__ ) && BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT(0x593) )\n# define BOOST_EXCEPTION_DISABLE\n#endif\n\n#if !defined( BOOST_EXCEPTION_DISABLE ) && defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, < 1310 )\n# define BOOST_EXCEPTION_DISABLE\n#endif\n\n#if !defined( BOOST_EXCEPTION_DISABLE )\n# include <boost/exception/exception.hpp>\n#if !defined(BOOST_THROW_EXCEPTION_CURRENT_FUNCTION)\n# include <boost/current_function.hpp>\n# define BOOST_THROW_EXCEPTION_CURRENT_FUNCTION BOOST_CURRENT_FUNCTION\n#endif\n# define BOOST_THROW_EXCEPTION(x) ::boost::exception_detail::throw_exception_(x,BOOST_THROW_EXCEPTION_CURRENT_FUNCTION,__FILE__,__LINE__)\n#else\n# define BOOST_THROW_EXCEPTION(x) ::boost::throw_exception(x)\n#endif\n\nnamespace boost\n{\n#ifdef BOOST_NO_EXCEPTIONS\n\nvoid throw_exception( std::exception const & e ); // user defined\n\n#else\n\ninline void throw_exception_assert_compatibility( std::exception const & ) { }\n\ntemplate<class E> BOOST_NORETURN inline void throw_exception( E const & e )\n{\n    //All boost exceptions are required to derive from std::exception,\n    //to ensure compatibility with BOOST_NO_EXCEPTIONS.\n    throw_exception_assert_compatibility(e);\n\n#ifndef BOOST_EXCEPTION_DISABLE\n    throw enable_current_exception(enable_error_info(e));\n#else\n    throw e;\n#endif\n}\n\n#endif\n\n#if !defined( BOOST_EXCEPTION_DISABLE )\n    namespace\n    exception_detail\n    {\n        template <class E>\n        BOOST_NORETURN\n        void\n        throw_exception_( E const & x, char const * current_function, char const * file, int line )\n        {\n            boost::throw_exception(\n                set_info(\n                    set_info(\n                        set_info(\n                            enable_error_info(x),\n                            throw_function(current_function)),\n                        throw_file(file)),\n                    throw_line(line)));\n        }\n    }\n#endif\n} // namespace boost\n\n#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS)\n#pragma warning(pop)\n#endif\n#endif\n"
  },
  {
    "path": "benchmarks/boost/type_traits/add_const.hpp",
    "content": "\n//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard\n//  Hinnant & John Maddock 2000.\n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n#ifndef BOOST_TT_ADD_CONST_HPP_INCLUDED\n#define BOOST_TT_ADD_CONST_HPP_INCLUDED\n\n#include <boost/type_traits/detail/config.hpp>\n\nnamespace boost {\n\n// * convert a type T to const type - add_const<T>\n// this is not required since the result is always\n// the same as \"T const\", but it does suppress warnings\n// from some compilers:\n\n#if defined(BOOST_MSVC)\n// This bogus warning will appear when add_const is applied to a\n// const volatile reference because we can't detect const volatile\n// references with MSVC6.\n#   pragma warning(push)\n#   pragma warning(disable:4181) // warning C4181: qualifier applied to reference type ignored\n#endif \n\n   template <class T> struct add_const\n   {\n      typedef T const type;\n   };\n\n#if defined(BOOST_MSVC)\n#   pragma warning(pop)\n#endif \n\n   template <class T> struct add_const<T&>\n   {\n      typedef T& type;\n   };\n\n} // namespace boost\n\n#endif // BOOST_TT_ADD_CONST_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/type_traits/add_lvalue_reference.hpp",
    "content": "//  Copyright 2010 John Maddock\n\n//  Distributed under the Boost Software License, Version 1.0.\n//  See http://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_TYPE_TRAITS_EXT_ADD_LVALUE_REFERENCE__HPP\n#define BOOST_TYPE_TRAITS_EXT_ADD_LVALUE_REFERENCE__HPP\n\n#include <boost/type_traits/add_reference.hpp>\n\nnamespace boost{\n\ntemplate <class T> struct add_lvalue_reference\n{\n   typedef typename boost::add_reference<T>::type type; \n};\n\n#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES\ntemplate <class T> struct add_lvalue_reference<T&&>\n{\n   typedef T& type;\n};\n#endif\n\n}\n\n#endif  // BOOST_TYPE_TRAITS_EXT_ADD_LVALUE_REFERENCE__HPP\n"
  },
  {
    "path": "benchmarks/boost/type_traits/add_reference.hpp",
    "content": "\n//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.\n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n#ifndef BOOST_TT_ADD_REFERENCE_HPP_INCLUDED\n#define BOOST_TT_ADD_REFERENCE_HPP_INCLUDED\n\n#include <boost/detail/workaround.hpp>\n#include <boost/config.hpp>\n\nnamespace boost {\n\nnamespace detail {\n\n//\n// We can't filter out rvalue_references at the same level as\n// references or we get ambiguities from msvc:\n//\n\ntemplate <typename T>\nstruct add_reference_impl\n{\n    typedef T& type;\n};\n\n#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES\ntemplate <typename T>\nstruct add_reference_impl<T&&>\n{\n    typedef T&& type;\n};\n#endif\n\n} // namespace detail\n\ntemplate <class T> struct add_reference\n{\n   typedef typename boost::detail::add_reference_impl<T>::type type;\n};\ntemplate <class T> struct add_reference<T&>\n{\n   typedef T& type;\n};\n\n// these full specialisations are always required:\ntemplate <> struct add_reference<void> { typedef void type; };\n#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS\ntemplate <> struct add_reference<const void> { typedef void type; };\ntemplate <> struct add_reference<const volatile void> { typedef void type; };\ntemplate <> struct add_reference<volatile void> { typedef void type; };\n#endif\n\n} // namespace boost\n\n#endif // BOOST_TT_ADD_REFERENCE_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/type_traits/add_rvalue_reference.hpp",
    "content": "//  add_rvalue_reference.hpp  ---------------------------------------------------------//\n\n//  Copyright 2010 Vicente J. Botet Escriba\n\n//  Distributed under the Boost Software License, Version 1.0.\n//  See http://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_TYPE_TRAITS_EXT_ADD_RVALUE_REFERENCE__HPP\n#define BOOST_TYPE_TRAITS_EXT_ADD_RVALUE_REFERENCE__HPP\n\n#include <boost/config.hpp>\n\n//----------------------------------------------------------------------------//\n\n#include <boost/type_traits/is_void.hpp>\n#include <boost/type_traits/is_reference.hpp>\n\n//----------------------------------------------------------------------------//\n//                                                                            //\n//                           C++03 implementation of                          //\n//             20.9.7.2 Reference modifications [meta.trans.ref]              //\n//                          Written by Vicente J. Botet Escriba               //\n//                                                                            //\n// If T names an object or function type then the member typedef type\n// shall name T&&; otherwise, type shall name T. [ Note: This rule reflects\n// the semantics of reference collapsing. For example, when a type T names\n// a type T1&, the type add_rvalue_reference<T>::type is not an rvalue\n// reference. -end note ]\n//----------------------------------------------------------------------------//\n\nnamespace boost {\n\nnamespace type_traits_detail {\n\n    template <typename T, bool b>\n    struct add_rvalue_reference_helper\n    { typedef T   type; };\n\n#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)\n    template <typename T>\n    struct add_rvalue_reference_helper<T, true>\n    {\n        typedef T&&   type;\n    };\n#endif\n\n    template <typename T>\n    struct add_rvalue_reference_imp\n    {\n       typedef typename boost::type_traits_detail::add_rvalue_reference_helper\n                  <T, (is_void<T>::value == false && is_reference<T>::value == false) >::type type;\n    };\n\n}\n\ntemplate <class T> struct add_rvalue_reference\n{\n   typedef typename boost::type_traits_detail::add_rvalue_reference_imp<T>::type type;\n};\n\n}  // namespace boost\n\n#endif  // BOOST_TYPE_TRAITS_EXT_ADD_RVALUE_REFERENCE__HPP\n\n"
  },
  {
    "path": "benchmarks/boost/type_traits/add_volatile.hpp",
    "content": "\n//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard\n//  Hinnant & John Maddock 2000.\n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n#ifndef BOOST_TT_ADD_VOLATILE_HPP_INCLUDED\n#define BOOST_TT_ADD_VOLATILE_HPP_INCLUDED\n\n#include <boost/config.hpp>\n\nnamespace boost {\n\n// * convert a type T to volatile type - add_volatile<T>\n// this is not required since the result is always\n// the same as \"T volatile\", but it does suppress warnings\n// from some compilers:\n\n#if defined(BOOST_MSVC)\n// This bogus warning will appear when add_volatile is applied to a\n// const volatile reference because we can't detect const volatile\n// references with MSVC6.\n#   pragma warning(push)\n#   pragma warning(disable:4181) // warning C4181: qualifier applied to reference type ignored\n#endif \n\ntemplate <class T> struct add_volatile{ typedef T volatile type; };\n\n#if defined(BOOST_MSVC)\n#   pragma warning(pop)\n#endif \n\ntemplate <class T> struct add_volatile<T&>{ typedef T& type; };\n\n} // namespace boost\n\n#endif // BOOST_TT_ADD_VOLATILE_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/type_traits/conditional.hpp",
    "content": "//  (C) Copyright John Maddock 2010.  \n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n\n#ifndef BOOST_TT_CONDITIONAL_HPP_INCLUDED\n#define BOOST_TT_CONDITIONAL_HPP_INCLUDED\n\nnamespace boost {\n\ntemplate <bool b, class T, class U> struct conditional { typedef T type; };\ntemplate <class T, class U> struct conditional<false, T, U> { typedef U type; };\n\n} // namespace boost\n\n\n#endif // BOOST_TT_CONDITIONAL_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/type_traits/declval.hpp",
    "content": "//  declval.hpp  -------------------------------------------------------------//\n\n//  Copyright 2010 Vicente J. Botet Escriba\n\n//  Distributed under the Boost Software License, Version 1.0.\n//  See http://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_TYPE_TRAITS_DECLVAL_HPP_INCLUDED\n#define BOOST_TYPE_TRAITS_DECLVAL_HPP_INCLUDED\n\n#include <boost/config.hpp>\n\n//----------------------------------------------------------------------------//\n\n#include <boost/type_traits/add_rvalue_reference.hpp>\n\n//----------------------------------------------------------------------------//\n//                                                                            //\n//                           C++03 implementation of                          //\n//                   20.2.4 Function template declval [declval]               //\n//                          Written by Vicente J. Botet Escriba               //\n//                                                                            //\n// 1 The library provides the function template declval to simplify the\n// definition of expressions which occur as unevaluated operands.\n// 2 Remarks: If this function is used, the program is ill-formed.\n// 3 Remarks: The template parameter T of declval may be an incomplete type.\n// [ Example:\n//\n// template <class To, class From>\n// decltype(static_cast<To>(declval<From>())) convert(From&&);\n//\n// declares a function template convert which only participates in overloading\n// if the type From can be explicitly converted to type To. For another example\n// see class template common_type (20.9.7.6). -end example ]\n//----------------------------------------------------------------------------//\n\nnamespace boost {\n\n    template <typename T>\n    typename add_rvalue_reference<T>::type declval() BOOST_NOEXCEPT; // as unevaluated operand\n\n}  // namespace boost\n\n#endif  // BOOST_TYPE_TRAITS_DECLVAL_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/type_traits/detail/config.hpp",
    "content": "\n//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.\n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n#ifndef BOOST_TT_CONFIG_HPP_INCLUDED\n#define BOOST_TT_CONFIG_HPP_INCLUDED\n\n#ifndef BOOST_CONFIG_HPP\n#include <boost/config.hpp>\n#endif\n#include <boost/version.hpp>\n#include <boost/detail/workaround.hpp>\n\n//\n// whenever we have a conversion function with ellipses\n// it needs to be declared __cdecl to suppress compiler\n// warnings from MS and Borland compilers (this *must*\n// appear before we include is_same.hpp below):\n#if defined(BOOST_MSVC) || (defined(__BORLANDC__) && !defined(BOOST_DISABLE_WIN32))\n#   define BOOST_TT_DECL __cdecl\n#else\n#   define BOOST_TT_DECL /**/\n#endif\n\n# if (BOOST_WORKAROUND(__MWERKS__, < 0x3000)                         \\\n    || BOOST_WORKAROUND(__IBMCPP__, < 600 )                         \\\n    || BOOST_WORKAROUND(__BORLANDC__, < 0x5A0)                      \\\n    || defined(__ghs)                                               \\\n    || BOOST_WORKAROUND(__HP_aCC, < 60700)           \\\n    || BOOST_WORKAROUND(MPW_CPLUS, BOOST_TESTED_AT(0x890))          \\\n    || BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x580)))       \\\n    && defined(BOOST_NO_IS_ABSTRACT)\n\n#   define BOOST_TT_NO_CONFORMING_IS_CLASS_IMPLEMENTATION 1\n\n#endif\n\n#ifndef BOOST_TT_NO_CONFORMING_IS_CLASS_IMPLEMENTATION\n# define BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION 1\n#endif\n\n//\n// define BOOST_TT_TEST_MS_FUNC_SIGS\n// when we want to test __stdcall etc function types with is_function etc\n// (Note, does not work with Borland, even though it does support __stdcall etc):\n//\n#if defined(_MSC_EXTENSIONS) && !defined(__BORLANDC__)\n#  define BOOST_TT_TEST_MS_FUNC_SIGS\n#endif\n\n//\n// define BOOST_TT_NO_CV_FUNC_TEST\n// if tests for cv-qualified member functions don't \n// work in is_member_function_pointer\n//\n#if BOOST_WORKAROUND(__MWERKS__, < 0x3000) || BOOST_WORKAROUND(__IBMCPP__, <= 600)\n#  define BOOST_TT_NO_CV_FUNC_TEST\n#endif\n\n//\n// Macros that have been deprecated, defined here for backwards compatibility:\n//\n#define BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION(x)\n#define BOOST_TT_BROKEN_COMPILER_SPEC(x)\n\n#endif // BOOST_TT_CONFIG_HPP_INCLUDED\n\n\n"
  },
  {
    "path": "benchmarks/boost/type_traits/detail/is_function_ptr_helper.hpp",
    "content": "\n//  Copyright 2000 John Maddock (john@johnmaddock.co.uk)\n//  Copyright 2002 Aleksey Gurtovoy (agurtovoy@meta-comm.com)\n//\n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n#if !defined(BOOST_PP_IS_ITERATING)\n\n///// header body\n\n#ifndef BOOST_TT_DETAIL_IS_FUNCTION_PTR_HELPER_HPP_INCLUDED\n#define BOOST_TT_DETAIL_IS_FUNCTION_PTR_HELPER_HPP_INCLUDED\n\n#if defined(BOOST_TT_PREPROCESSING_MODE)\n//\n// Hide these #include from dependency analysers as\n// these are required in maintenance mode only:\n//\n#define PP1 <boost/preprocessor/iterate.hpp>\n#include PP1\n#undef PP1\n#define PP1 <boost/preprocessor/enum_params.hpp>\n#include PP1\n#undef PP1\n#define PP1 <boost/preprocessor/comma_if.hpp>\n#include PP1\n#undef PP1\n#endif\n\nnamespace boost {\nnamespace type_traits {\n\ntemplate <class R>\nstruct is_function_ptr_helper\n{\n    BOOST_STATIC_CONSTANT(bool, value = false);\n};\n\n#if !defined(BOOST_TT_PREPROCESSING_MODE)\n// preprocessor-generated part, don't edit by hand!\n\ntemplate <class R >\nstruct is_function_ptr_helper<R (*)()> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R >\nstruct is_function_ptr_helper<R (*)( ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0>\nstruct is_function_ptr_helper<R (*)( T0)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0>\nstruct is_function_ptr_helper<R (*)( T0 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1>\nstruct is_function_ptr_helper<R (*)( T0 , T1)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1>\nstruct is_function_ptr_helper<R (*)( T0 , T1 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24)> { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>\nstruct is_function_ptr_helper<R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };\n#else\n\n#undef BOOST_STATIC_CONSTANT\n#define BOOST_PP_ITERATION_PARAMS_1 \\\n    (3, (0, 25, \"boost/type_traits/detail/is_function_ptr_helper.hpp\"))\n#include BOOST_PP_ITERATE()\n\n#endif // BOOST_TT_PREPROCESSING_MODE\n\n} // namespace type_traits\n} // namespace boost\n\n#endif // BOOST_TT_DETAIL_IS_FUNCTION_PTR_HELPER_HPP_INCLUDED\n\n///// iteration\n\n#else\n#define BOOST_PP_COUNTER BOOST_PP_FRAME_ITERATION(1)\n\ntemplate <class R BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T)>\nstruct is_function_ptr_helper<R (*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T))> { BOOST_STATIC_CONSTANT(bool, value = true); };\n@#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING\ntemplate <class R BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T)>\nstruct is_function_ptr_helper<R (*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...)> { BOOST_STATIC_CONSTANT(bool, value = true); };\n@#endif\n#undef BOOST_PP_COUNTER\n#endif // BOOST_PP_IS_ITERATING\n"
  },
  {
    "path": "benchmarks/boost/type_traits/detail/is_function_ptr_tester.hpp",
    "content": "\n//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, \n//  Aleksey Gurtovoy, Howard Hinnant & John Maddock 2000.  \n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n#if !defined(BOOST_PP_IS_ITERATING)\n\n///// header body\n\n#ifndef BOOST_TT_DETAIL_IS_FUNCTION_PTR_TESTER_HPP_INCLUDED\n#define BOOST_TT_DETAIL_IS_FUNCTION_PTR_TESTER_HPP_INCLUDED\n\n#include <boost/type_traits/detail/yes_no_type.hpp>\n\n#if defined(BOOST_TT_PREPROCESSING_MODE)\n//\n// Hide include dependencies from analysers since they're\n// only require in maintenance mode:\n//\n#define PP1 <boost/preprocessor/iterate.hpp>\n#define PP2 <boost/preprocessor/enum_params.hpp>\n#define PP3 <boost/preprocessor/comma_if.hpp>\n#include PP1\n#include PP2\n#include PP3\n#undef PP1\n#undef PP2\n#undef PP3\n#endif\n\nnamespace boost {\nnamespace type_traits {\n\n// Note it is acceptable to use ellipsis here, since the argument will\n// always be a pointer type of some sort (JM 2005/06/04):\nno_type BOOST_TT_DECL is_function_ptr_tester(...);\n\n#if !defined(BOOST_TT_PREPROCESSING_MODE)\n// pre-processed code, don't edit, try GNU cpp with \n// cpp -I../../../ -DBOOST_TT_PREPROCESSING_MODE -x c++ -P filename\n\ntemplate <class R >\nyes_type is_function_ptr_tester(R (*)());\ntemplate <class R >\nyes_type is_function_ptr_tester(R (*)( ...));\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R >\nyes_type is_function_ptr_tester(R (__stdcall*)());\n#ifndef _MANAGED\ntemplate <class R >\nyes_type is_function_ptr_tester(R (__fastcall*)());\n#endif\ntemplate <class R >\nyes_type is_function_ptr_tester(R (__cdecl*)());\n#endif\ntemplate <class R , class T0 >\nyes_type is_function_ptr_tester(R (*)( T0));\ntemplate <class R , class T0 >\nyes_type is_function_ptr_tester(R (*)( T0 ...));\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R , class T0 >\nyes_type is_function_ptr_tester(R (__stdcall*)( T0));\n#ifndef _MANAGED\ntemplate <class R , class T0 >\nyes_type is_function_ptr_tester(R (__fastcall*)( T0));\n#endif\ntemplate <class R , class T0 >\nyes_type is_function_ptr_tester(R (__cdecl*)( T0));\n#endif\ntemplate <class R , class T0 , class T1 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1));\ntemplate <class R , class T0 , class T1 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 ...));\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R , class T0 , class T1 >\nyes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1));\n#ifndef _MANAGED\ntemplate <class R , class T0 , class T1 >\nyes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1));\n#endif\ntemplate <class R , class T0 , class T1 >\nyes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2));\ntemplate <class R , class T0 , class T1 , class T2 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 ...));\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R , class T0 , class T1 , class T2 >\nyes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2));\n#ifndef _MANAGED\ntemplate <class R , class T0 , class T1 , class T2 >\nyes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 >\nyes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3));\ntemplate <class R , class T0 , class T1 , class T2 , class T3 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 ...));\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R , class T0 , class T1 , class T2 , class T3 >\nyes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3));\n#ifndef _MANAGED\ntemplate <class R , class T0 , class T1 , class T2 , class T3 >\nyes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 >\nyes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4));\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 ...));\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 >\nyes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4));\n#ifndef _MANAGED\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 >\nyes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 >\nyes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5));\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 ...));\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >\nyes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5));\n#ifndef _MANAGED\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >\nyes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >\nyes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6));\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...));\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >\nyes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6));\n#ifndef _MANAGED\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >\nyes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >\nyes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7));\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...));\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >\nyes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7));\n#ifndef _MANAGED\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >\nyes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >\nyes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8));\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...));\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >\nyes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8));\n#ifndef _MANAGED\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >\nyes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >\nyes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9));\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...));\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >\nyes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9));\n#ifndef _MANAGED\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >\nyes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >\nyes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10));\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...));\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >\nyes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10));\n#ifndef _MANAGED\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >\nyes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >\nyes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11));\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...));\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >\nyes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11));\n#ifndef _MANAGED\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >\nyes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >\nyes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12));\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...));\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >\nyes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12));\n#ifndef _MANAGED\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >\nyes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >\nyes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13));\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...));\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >\nyes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13));\n#ifndef _MANAGED\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >\nyes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >\nyes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14));\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...));\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >\nyes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14));\n#ifndef _MANAGED\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >\nyes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >\nyes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15));\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...));\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >\nyes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15));\n#ifndef _MANAGED\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >\nyes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >\nyes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16));\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...));\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >\nyes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16));\n#ifndef _MANAGED\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >\nyes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >\nyes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17));\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...));\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >\nyes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17));\n#ifndef _MANAGED\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >\nyes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >\nyes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18));\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...));\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >\nyes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18));\n#ifndef _MANAGED\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >\nyes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >\nyes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19));\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...));\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >\nyes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19));\n#ifndef _MANAGED\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >\nyes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >\nyes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20));\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...));\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >\nyes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20));\n#ifndef _MANAGED\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >\nyes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >\nyes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21));\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...));\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >\nyes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21));\n#ifndef _MANAGED\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >\nyes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >\nyes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22));\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...));\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >\nyes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22));\n#ifndef _MANAGED\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >\nyes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >\nyes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23));\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...));\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >\nyes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23));\n#ifndef _MANAGED\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >\nyes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >\nyes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24));\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >\nyes_type is_function_ptr_tester(R (*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...));\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >\nyes_type is_function_ptr_tester(R (__stdcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24));\n#ifndef _MANAGED\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >\nyes_type is_function_ptr_tester(R (__fastcall*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24));\n#endif\ntemplate <class R , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >\nyes_type is_function_ptr_tester(R (__cdecl*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24));\n#endif\n#else\n\n#define BOOST_PP_ITERATION_PARAMS_1 \\\n    (3, (0, 25, \"boost/type_traits/detail/is_function_ptr_tester.hpp\"))\n#include BOOST_PP_ITERATE()\n\n#endif // BOOST_TT_PREPROCESSING_MODE\n\n} // namespace type_traits\n} // namespace boost\n\n#endif // BOOST_TT_DETAIL_IS_FUNCTION_PTR_TESTER_HPP_INCLUDED\n\n///// iteration\n\n#else\n#define BOOST_PP_COUNTER BOOST_PP_FRAME_ITERATION(1)\n#undef __stdcall\n#undef __fastcall\n#undef __cdecl\n\ntemplate <class R BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >\nyes_type is_function_ptr_tester(R (*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)));\n@#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING\ntemplate <class R BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >\nyes_type is_function_ptr_tester(R (*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...));\n@#endif\n@#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >\nyes_type is_function_ptr_tester(R (__stdcall*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)));\n@#ifndef _MANAGED\ntemplate <class R BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >\nyes_type is_function_ptr_tester(R (__fastcall*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)));\n@#endif\ntemplate <class R BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >\nyes_type is_function_ptr_tester(R (__cdecl*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)));\n@#endif\n\n#undef BOOST_PP_COUNTER\n#endif // BOOST_PP_IS_ITERATING\n"
  },
  {
    "path": "benchmarks/boost/type_traits/detail/is_mem_fun_pointer_impl.hpp",
    "content": "\n//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, \n//  Aleksey Gurtovoy, Howard Hinnant & John Maddock 2000.  \n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n#if !defined(BOOST_PP_IS_ITERATING)\n\n///// header body\n\n#ifndef BOOST_TT_DETAIL_IS_MEM_FUN_POINTER_IMPL_HPP_INCLUDED\n#define BOOST_TT_DETAIL_IS_MEM_FUN_POINTER_IMPL_HPP_INCLUDED\n\n#include <boost/config.hpp>\n\n#if defined(BOOST_TT_PREPROCESSING_MODE)\n//\n// Maintenance mode, hide include dependencies\n// from trackers:\n//\n#define PPI <boost/preprocessor/iterate.hpp>\n#include PPI\n#undef PPI\n#define PPI <boost/preprocessor/enum_params.hpp>\n#include PPI\n#undef PPI\n#define PPI <boost/preprocessor/comma_if.hpp>\n#include PPI\n#undef PPI\n#endif\n\nnamespace boost {\nnamespace type_traits {\n\ntemplate <typename T>\nstruct is_mem_fun_pointer_impl\n{\n    BOOST_STATIC_CONSTANT(bool, value = false);\n};\n\n#if !defined(BOOST_TT_PREPROCESSING_MODE)\n// pre-processed code, don't edit, try GNU cpp with \n// cpp -I../../../ -DBOOST_TT_PREPROCESSING_MODE -x c++ -P filename\n\ntemplate <class R, class T >\nstruct is_mem_fun_pointer_impl<R (T::*)() > { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R, class T >\nstruct is_mem_fun_pointer_impl<R (T::*)( ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\n#if !defined(BOOST_TT_NO_CV_FUNC_TEST)\ntemplate <class R, class T >\nstruct is_mem_fun_pointer_impl<R (T::*)() const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T >\nstruct is_mem_fun_pointer_impl<R (T::*)() volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T >\nstruct is_mem_fun_pointer_impl<R (T::*)() const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T >\nstruct is_mem_fun_pointer_impl<R (T::*)( ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T >\nstruct is_mem_fun_pointer_impl<R (T::*)( ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T >\nstruct is_mem_fun_pointer_impl<R (T::*)( ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n#endif\ntemplate <class R, class T , class T0>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0) > { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R, class T , class T0>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\n#if !defined(BOOST_TT_NO_CV_FUNC_TEST)\ntemplate <class R, class T , class T0>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n#endif\ntemplate <class R, class T , class T0 , class T1>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1) > { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R, class T , class T0 , class T1>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\n#if !defined(BOOST_TT_NO_CV_FUNC_TEST)\ntemplate <class R, class T , class T0 , class T1>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2) > { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R, class T , class T0 , class T1 , class T2>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\n#if !defined(BOOST_TT_NO_CV_FUNC_TEST)\ntemplate <class R, class T , class T0 , class T1 , class T2>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3) > { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\n#if !defined(BOOST_TT_NO_CV_FUNC_TEST)\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4) > { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\n#if !defined(BOOST_TT_NO_CV_FUNC_TEST)\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5) > { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\n#if !defined(BOOST_TT_NO_CV_FUNC_TEST)\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) > { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\n#if !defined(BOOST_TT_NO_CV_FUNC_TEST)\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) > { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\n#if !defined(BOOST_TT_NO_CV_FUNC_TEST)\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) > { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\n#if !defined(BOOST_TT_NO_CV_FUNC_TEST)\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) > { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\n#if !defined(BOOST_TT_NO_CV_FUNC_TEST)\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) > { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\n#if !defined(BOOST_TT_NO_CV_FUNC_TEST)\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) > { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\n#if !defined(BOOST_TT_NO_CV_FUNC_TEST)\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) > { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\n#if !defined(BOOST_TT_NO_CV_FUNC_TEST)\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) > { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\n#if !defined(BOOST_TT_NO_CV_FUNC_TEST)\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) > { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\n#if !defined(BOOST_TT_NO_CV_FUNC_TEST)\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) > { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\n#if !defined(BOOST_TT_NO_CV_FUNC_TEST)\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) > { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\n#if !defined(BOOST_TT_NO_CV_FUNC_TEST)\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) > { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\n#if !defined(BOOST_TT_NO_CV_FUNC_TEST)\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) > { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\n#if !defined(BOOST_TT_NO_CV_FUNC_TEST)\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) > { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\n#if !defined(BOOST_TT_NO_CV_FUNC_TEST)\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) > { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\n#if !defined(BOOST_TT_NO_CV_FUNC_TEST)\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) > { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\n#if !defined(BOOST_TT_NO_CV_FUNC_TEST)\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) > { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\n#if !defined(BOOST_TT_NO_CV_FUNC_TEST)\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) > { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\n#if !defined(BOOST_TT_NO_CV_FUNC_TEST)\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) > { BOOST_STATIC_CONSTANT(bool, value = true); };\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\n#if !defined(BOOST_TT_NO_CV_FUNC_TEST)\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>\nstruct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n#endif\n\n#else\n\n#undef BOOST_STATIC_CONSTANT\n#define BOOST_PP_ITERATION_PARAMS_1 \\\n    (3, (0, 25, \"boost/type_traits/detail/is_mem_fun_pointer_impl.hpp\"))\n#include BOOST_PP_ITERATE()\n\n#endif // BOOST_TT_PREPROCESSING_MODE\n\n} // namespace type_traits\n} // namespace boost\n\n#endif // BOOST_TT_DETAIL_IS_MEM_FUN_POINTER_IMPL_HPP_INCLUDED\n\n///// iteration\n\n#else\n#define BOOST_PP_COUNTER BOOST_PP_FRAME_ITERATION(1)\n\ntemplate <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T)>\nstruct is_mem_fun_pointer_impl<R (T::*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) > { BOOST_STATIC_CONSTANT(bool, value = true); };\n@#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING\ntemplate <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T)>\nstruct is_mem_fun_pointer_impl<R (T::*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...) > { BOOST_STATIC_CONSTANT(bool, value = true); };\n@#endif\n\n@#if !defined(BOOST_TT_NO_CV_FUNC_TEST)\ntemplate <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T)>\nstruct is_mem_fun_pointer_impl<R (T::*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T)>\nstruct is_mem_fun_pointer_impl<R (T::*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T)>\nstruct is_mem_fun_pointer_impl<R (T::*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\n@#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING\ntemplate <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T)>\nstruct is_mem_fun_pointer_impl<R (T::*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...) const > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T)>\nstruct is_mem_fun_pointer_impl<R (T::*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...) volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n\ntemplate <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T)>\nstruct is_mem_fun_pointer_impl<R (T::*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...) const volatile > { BOOST_STATIC_CONSTANT(bool, value = true); };\n@#endif\n@#endif\n\n#undef BOOST_PP_COUNTER\n#endif // BOOST_PP_IS_ITERATING\n\n"
  },
  {
    "path": "benchmarks/boost/type_traits/detail/is_mem_fun_pointer_tester.hpp",
    "content": "\n//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, \n//  Aleksey Gurtovoy, Howard Hinnant & John Maddock 2000.  \n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n#if !defined(BOOST_PP_IS_ITERATING)\n\n///// header body\n\n#ifndef BOOST_TT_DETAIL_IS_MEM_FUN_POINTER_TESTER_HPP_INCLUDED\n#define BOOST_TT_DETAIL_IS_MEM_FUN_POINTER_TESTER_HPP_INCLUDED\n\n#include <boost/type_traits/detail/yes_no_type.hpp>\n#include <boost/type_traits/detail/config.hpp>\n\n#if defined(BOOST_TT_PREPROCESSING_MODE)\n//\n// Maintentance mode, hide include dependencies\n// from dependency trackers:\n//\n#define PPI <boost/preprocessor/iterate.hpp>\n#include PPI\n#undef PPI\n#define PPI <boost/preprocessor/enum_params.hpp>\n#include PPI\n#undef PPI\n#define <boost/preprocessor/comma_if.hpp>\n#include PPI\n#undef\n#endif\n\nnamespace boost {\nnamespace type_traits {\n\nno_type BOOST_TT_DECL is_mem_fun_pointer_tester(...);\n\n#if !defined(BOOST_TT_PREPROCESSING_MODE)\n// pre-processed code, don't edit, try GNU cpp with \n// cpp -I../../../ -DBOOST_TT_PREPROCESSING_MODE -x c++ -P filename\n\ntemplate <class R, class T >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)());\n\ntemplate <class R, class T >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)() const);\n\ntemplate <class R, class T >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)() volatile);\n\ntemplate <class R, class T >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)() const volatile);\n\ntemplate <class R, class T >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( ...));\n\ntemplate <class R, class T >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( ...) const);\n\ntemplate <class R, class T >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( ...) volatile);\n\ntemplate <class R, class T >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( ...) const volatile);\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R, class T >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)());\n\ntemplate <class R, class T >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)() const);\n\ntemplate <class R, class T >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)() volatile);\n\ntemplate <class R, class T >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)() const volatile);\n\n#ifndef _MANAGED\ntemplate <class R, class T >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)());\n\ntemplate <class R, class T >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)() const);\n\ntemplate <class R, class T >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)() volatile);\n\ntemplate <class R, class T >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)() const volatile);\n\n#endif\n\ntemplate <class R, class T >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)());\n\ntemplate <class R, class T >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)() const);\n\ntemplate <class R, class T >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)() volatile);\n\ntemplate <class R, class T >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)() const volatile);\n\n#endif\ntemplate <class R, class T , class T0 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0));\n\ntemplate <class R, class T , class T0 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0) const);\n\ntemplate <class R, class T , class T0 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0) volatile);\n\ntemplate <class R, class T , class T0 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0) const volatile);\n\ntemplate <class R, class T , class T0 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 ...));\n\ntemplate <class R, class T , class T0 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 ...) const);\n\ntemplate <class R, class T , class T0 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 ...) volatile);\n\ntemplate <class R, class T , class T0 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 ...) const volatile);\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R, class T , class T0 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0));\n\ntemplate <class R, class T , class T0 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0) const);\n\ntemplate <class R, class T , class T0 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0) volatile);\n\ntemplate <class R, class T , class T0 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0) const volatile);\n\n#ifndef _MANAGED\ntemplate <class R, class T , class T0 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0));\n\ntemplate <class R, class T , class T0 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0) const);\n\ntemplate <class R, class T , class T0 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0) volatile);\n\ntemplate <class R, class T , class T0 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0) const volatile);\n\n#endif\n\ntemplate <class R, class T , class T0 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0));\n\ntemplate <class R, class T , class T0 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0) const);\n\ntemplate <class R, class T , class T0 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0) volatile);\n\ntemplate <class R, class T , class T0 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0) const volatile);\n\n#endif\ntemplate <class R, class T , class T0 , class T1 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1));\n\ntemplate <class R, class T , class T0 , class T1 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1) const);\n\ntemplate <class R, class T , class T0 , class T1 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1) volatile);\n\ntemplate <class R, class T , class T0 , class T1 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1) const volatile);\n\ntemplate <class R, class T , class T0 , class T1 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 ...));\n\ntemplate <class R, class T , class T0 , class T1 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 ...) const);\n\ntemplate <class R, class T , class T0 , class T1 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 ...) volatile);\n\ntemplate <class R, class T , class T0 , class T1 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 ...) const volatile);\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R, class T , class T0 , class T1 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1));\n\ntemplate <class R, class T , class T0 , class T1 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1) const);\n\ntemplate <class R, class T , class T0 , class T1 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1) volatile);\n\ntemplate <class R, class T , class T0 , class T1 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1) const volatile);\n\n#ifndef _MANAGED\ntemplate <class R, class T , class T0 , class T1 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1));\n\ntemplate <class R, class T , class T0 , class T1 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1) const);\n\ntemplate <class R, class T , class T0 , class T1 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1) volatile);\n\ntemplate <class R, class T , class T0 , class T1 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1) const volatile);\n\n#endif\n\ntemplate <class R, class T , class T0 , class T1 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1));\n\ntemplate <class R, class T , class T0 , class T1 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1) const);\n\ntemplate <class R, class T , class T0 , class T1 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1) volatile);\n\ntemplate <class R, class T , class T0 , class T1 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1) const volatile);\n\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2) const volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 ...));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 ...) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 ...) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 ...) const volatile);\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R, class T , class T0 , class T1 , class T2 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2) const volatile);\n\n#ifndef _MANAGED\ntemplate <class R, class T , class T0 , class T1 , class T2 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2) const volatile);\n\n#endif\n\ntemplate <class R, class T , class T0 , class T1 , class T2 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2) const volatile);\n\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3) const volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 ...));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 ...) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 ...) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 ...) const volatile);\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3) const volatile);\n\n#ifndef _MANAGED\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3) const volatile);\n\n#endif\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3) const volatile);\n\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4) const volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 ...) const volatile);\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4) const volatile);\n\n#ifndef _MANAGED\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4) const volatile);\n\n#endif\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4) const volatile);\n\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) const volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 ...) const volatile);\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) const volatile);\n\n#ifndef _MANAGED\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) const volatile);\n\n#endif\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5) const volatile);\n\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 ...) const volatile);\n\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const volatile);\n\n#ifndef _MANAGED\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const volatile);\n\n#endif\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const volatile);\n\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 ...) const volatile);\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const volatile);\n\n#ifndef _MANAGED\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const volatile);\n\n#endif\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const volatile);\n\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 ...) const volatile);\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const volatile);\n\n#ifndef _MANAGED\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const volatile);\n\n#endif\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const volatile);\n\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 ...) const volatile);\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const volatile);\n\n#ifndef _MANAGED\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const volatile);\n\n#endif\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const volatile);\n\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 ...) const volatile);\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const volatile);\n\n#ifndef _MANAGED\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const volatile);\n\n#endif\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const volatile);\n\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 ...) const volatile);\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const volatile);\n\n#ifndef _MANAGED\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const volatile);\n\n#endif\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const volatile);\n\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 ...) const volatile);\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const volatile);\n\n#ifndef _MANAGED\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const volatile);\n\n#endif\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const volatile);\n\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 ...) const volatile);\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const volatile);\n\n#ifndef _MANAGED\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const volatile);\n\n#endif\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const volatile);\n\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 ...) const volatile);\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const volatile);\n\n#ifndef _MANAGED\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const volatile);\n\n#endif\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const volatile);\n\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 ...) const volatile);\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const volatile);\n\n#ifndef _MANAGED\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const volatile);\n\n#endif\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const volatile);\n\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 ...) const volatile);\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const volatile);\n\n#ifndef _MANAGED\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const volatile);\n\n#endif\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const volatile);\n\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 ...) const volatile);\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const volatile);\n\n#ifndef _MANAGED\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const volatile);\n\n#endif\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const volatile);\n\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 ...) const volatile);\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const volatile);\n\n#ifndef _MANAGED\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const volatile);\n\n#endif\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const volatile);\n\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 ...) const volatile);\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const volatile);\n\n#ifndef _MANAGED\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const volatile);\n\n#endif\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const volatile);\n\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 ...) const volatile);\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const volatile);\n\n#ifndef _MANAGED\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const volatile);\n\n#endif\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const volatile);\n\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 ...) const volatile);\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const volatile);\n\n#ifndef _MANAGED\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const volatile);\n\n#endif\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const volatile);\n\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 ...) const volatile);\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const volatile);\n\n#ifndef _MANAGED\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const volatile);\n\n#endif\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const volatile);\n\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 ...) const volatile);\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const volatile);\n\n#ifndef _MANAGED\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const volatile);\n\n#endif\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const volatile);\n\n#endif\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 ...) const volatile);\n#ifdef BOOST_TT_TEST_MS_FUNC_SIGS\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const volatile);\n\n#ifndef _MANAGED\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const volatile);\n\n#endif\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24));\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) volatile);\n\ntemplate <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24 >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const volatile);\n\n#endif\n\n#else\n\n#define BOOST_PP_ITERATION_PARAMS_1 \\\n    (3, (0, 25, \"boost/type_traits/detail/is_mem_fun_pointer_tester.hpp\"))\n#include BOOST_PP_ITERATE()\n\n#endif // BOOST_TT_PREPROCESSING_MODE\n\n} // namespace type_traits\n} // namespace boost\n\n#endif // BOOST_TT_DETAIL_IS_MEM_FUN_POINTER_TESTER_HPP_INCLUDED\n\n///// iteration\n\n#else\n#define BOOST_PP_COUNTER BOOST_PP_FRAME_ITERATION(1)\n#undef __stdcall\n#undef __fastcall\n#undef __cdecl\n\ntemplate <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)));\n\ntemplate <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) const);\n\ntemplate <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) volatile);\n\ntemplate <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) const volatile);\n\n@#ifndef BOOST_TT_NO_ELLIPSIS_IN_FUNC_TESTING\ntemplate <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...));\n\ntemplate <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...) const);\n\ntemplate <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...) volatile);\n\ntemplate <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >\nyes_type is_mem_fun_pointer_tester(R (T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T) ...) const volatile);\n@#endif\n@#ifdef BOOST_TT_TEST_MS_FUNC_SIGS // Other calling conventions used by MS compatible compilers:\ntemplate <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)));\n\ntemplate <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) const);\n\ntemplate <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) volatile);\n\ntemplate <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >\nyes_type is_mem_fun_pointer_tester(R (__stdcall T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) const volatile);\n\n@#ifndef _MANAGED\ntemplate <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)));\n\ntemplate <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) const);\n\ntemplate <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) volatile);\n\ntemplate <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >\nyes_type is_mem_fun_pointer_tester(R (__fastcall T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) const volatile);\n\n@#endif\n\ntemplate <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)));\n\ntemplate <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) const);\n\ntemplate <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) volatile);\n\ntemplate <class R, class T BOOST_PP_COMMA_IF(BOOST_PP_COUNTER) BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,class T) >\nyes_type is_mem_fun_pointer_tester(R (__cdecl T::*const volatile*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_COUNTER,T)) const volatile);\n\n@#endif\n\n#undef BOOST_PP_COUNTER\n#endif // BOOST_PP_IS_ITERATING\n"
  },
  {
    "path": "benchmarks/boost/type_traits/detail/yes_no_type.hpp",
    "content": "\n//  (C) Copyright John Maddock and Steve Cleary 2000.\n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n//\n//  macros and helpers for working with integral-constant-expressions.\n\n#ifndef BOOST_TT_DETAIL_YES_NO_TYPE_HPP_INCLUDED\n#define BOOST_TT_DETAIL_YES_NO_TYPE_HPP_INCLUDED\n\nnamespace boost {\nnamespace type_traits {\n\ntypedef char yes_type;\nstruct no_type\n{\n   char padding[8];\n};\n\n} // namespace type_traits\n} // namespace boost\n\n#endif // BOOST_TT_DETAIL_YES_NO_TYPE_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/type_traits/has_trivial_assign.hpp",
    "content": "\n//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.\n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n#ifndef BOOST_TT_HAS_TRIVIAL_ASSIGN_HPP_INCLUDED\n#define BOOST_TT_HAS_TRIVIAL_ASSIGN_HPP_INCLUDED\n\n#include <boost/type_traits/detail/config.hpp>\n#include <boost/type_traits/intrinsics.hpp>\n#include <boost/type_traits/integral_constant.hpp>\n\n#if !defined(BOOST_HAS_TRIVIAL_ASSIGN) || defined(BOOST_MSVC) || defined(__GNUC__) || defined(BOOST_INTEL) || defined(__SUNPRO_CC) || defined(__clang)\n#include <boost/type_traits/is_pod.hpp>\n#include <boost/type_traits/is_const.hpp>\n#include <boost/type_traits/is_volatile.hpp>\n#include <boost/type_traits/is_assignable.hpp>\n#endif\n\nnamespace boost {\n\n   template <typename T>\n   struct has_trivial_assign : public integral_constant < bool,\n#ifdef BOOST_HAS_TRIVIAL_ASSIGN\n      BOOST_HAS_TRIVIAL_ASSIGN(T)\n#else\n      ::boost::is_pod<T>::value && !::boost::is_const<T>::value && !::boost::is_volatile<T>::value\n#endif\n   > {};\n\n   template<> struct has_trivial_assign<void> : public false_type{};\n#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS\n   template<> struct has_trivial_assign<void const> : public false_type{};\n   template<> struct has_trivial_assign<void const volatile> : public false_type{};\n   template<> struct has_trivial_assign<void volatile> : public false_type{};\n#endif\n   template <class T> struct has_trivial_assign<T volatile> : public false_type{};\n   template <class T> struct has_trivial_assign<T&> : public false_type{};\n#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)\n   template <class T> struct has_trivial_assign<T&&> : public false_type{};\n#endif\n   // Arrays are not explictly assignable:\n   template <typename T, std::size_t N> struct has_trivial_assign<T[N]> : public false_type{};\n   template <typename T> struct has_trivial_assign<T[]> : public false_type{};\n\n} // namespace boost\n\n#endif // BOOST_TT_HAS_TRIVIAL_ASSIGN_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/type_traits/has_trivial_destructor.hpp",
    "content": "\n//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.\n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n#ifndef BOOST_TT_HAS_TRIVIAL_DESTRUCTOR_HPP_INCLUDED\n#define BOOST_TT_HAS_TRIVIAL_DESTRUCTOR_HPP_INCLUDED\n\n#include <boost/type_traits/intrinsics.hpp>\n#include <boost/type_traits/integral_constant.hpp>\n\n#ifdef BOOST_HAS_TRIVIAL_DESTRUCTOR\n\n#if defined(BOOST_INTEL) || defined(BOOST_MSVC)\n#include <boost/type_traits/is_pod.hpp>\n#endif\n#ifdef BOOST_HAS_SGI_TYPE_TRAITS\n#include <boost/type_traits/is_same.hpp>\n#endif\n\n#if defined(__GNUC__) || defined(__clang) || defined(__SUNPRO_CC)\n#include <boost/type_traits/is_destructible.hpp>\n#endif\n\nnamespace boost {\n\ntemplate <typename T> struct has_trivial_destructor : public integral_constant<bool, BOOST_HAS_TRIVIAL_DESTRUCTOR(T)>{};\n#else\n#include <boost/type_traits/is_pod.hpp>\n\nnamespace boost{\n\ntemplate <typename T> struct has_trivial_destructor : public integral_constant<bool, ::boost::is_pod<T>::value>{};\n#endif\n\ntemplate <> struct has_trivial_destructor<void> : public false_type{};\n#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS\ntemplate <> struct has_trivial_destructor<void const> : public false_type{};\ntemplate <> struct has_trivial_destructor<void const volatile> : public false_type{};\ntemplate <> struct has_trivial_destructor<void volatile> : public false_type{};\n#endif\n\n} // namespace boost\n\n#endif // BOOST_TT_HAS_TRIVIAL_DESTRUCTOR_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/type_traits/integral_constant.hpp",
    "content": "//  (C) Copyright John Maddock 2015. \n//  Use, modification and distribution are subject to the \n//  Boost Software License, Version 1.0. (See accompanying file \n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n#ifndef BOOST_TYPE_TRAITS_INTEGRAL_CONSTANT_HPP\n#define BOOST_TYPE_TRAITS_INTEGRAL_CONSTANT_HPP\n\n#include <boost/config.hpp>\n#include <boost/detail/workaround.hpp>\n\n#if (BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1400)) \\\n   || BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) \\\n   || BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840)) \\\n   || BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3202)) \\\n   || BOOST_WORKAROUND(BOOST_INTEL_CXX_VERSION, BOOST_TESTED_AT(810)) )\n\n\nnamespace boost{\n   namespace mpl\n   {\n      template <bool B> struct bool_;\n      template <class I, I val> struct integral_c;\n      struct integral_c_tag;\n   }\n}\n\n#else\n\nnamespace mpl_{\n\n   template <bool B> struct bool_;\n   template <class I, I val> struct integral_c;\n   struct integral_c_tag;\n}\n\nnamespace boost\n{\n   namespace mpl\n   {\n      using ::mpl_::bool_;\n      using ::mpl_::integral_c;\n      using ::mpl_::integral_c_tag;\n   }\n}\n\n#endif\n\nnamespace boost{\n\n   template <class T, T val>\n   struct integral_constant\n   {\n      typedef mpl::integral_c_tag tag;\n      typedef T value_type;\n      typedef integral_constant<T, val> type;\n      static const T value = val;\n      //\n      // This helper function is just to disable type-punning \n      // warnings from GCC:\n      //\n      template <class U>\n      static U& dereference(U* p) { return *p; }\n\n      operator const mpl::integral_c<T, val>& ()const\n      {\n         static const char data[sizeof(long)] = { 0 };\n         return dereference(reinterpret_cast<const mpl::integral_c<T, val>*>(&data));\n      }\n      BOOST_CONSTEXPR operator T()const { return val; }\n   };\n\n   template <class T, T val>\n   T const integral_constant<T, val>::value;\n      \n   template <bool val>\n   struct integral_constant<bool, val>\n   {\n      typedef mpl::integral_c_tag tag;\n      typedef bool value_type;\n      typedef integral_constant<bool, val> type;\n      static const bool value = val;\n      //\n      // This helper function is just to disable type-punning \n      // warnings from GCC:\n      //\n      template <class T>\n      static T& dereference(T* p) { return *p; }\n\n      operator const mpl::bool_<val>& ()const\n      {\n         static const char data = 0;\n         return dereference(reinterpret_cast<const mpl::bool_<val>*>(&data));\n      }\n      BOOST_CONSTEXPR operator bool()const { return val; }\n   };\n\n   template <bool val>\n   bool const integral_constant<bool, val>::value;\n\n   typedef integral_constant<bool, true> true_type;\n   typedef integral_constant<bool, false> false_type;\n\n}\n\n#endif\n"
  },
  {
    "path": "benchmarks/boost/type_traits/intrinsics.hpp",
    "content": "//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.\n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n#ifndef BOOST_TT_INTRINSICS_HPP_INCLUDED\n#define BOOST_TT_INTRINSICS_HPP_INCLUDED\n\n#ifndef BOOST_TT_DISABLE_INTRINSICS\n\n#include <boost/config.hpp>\n\n#ifndef BOOST_TT_CONFIG_HPP_INCLUDED\n#include <boost/type_traits/detail/config.hpp>\n#endif\n\n//\n// Helper macros for builtin compiler support.\n// If your compiler has builtin support for any of the following\n// traits concepts, then redefine the appropriate macros to pick\n// up on the compiler support:\n//\n// (these should largely ignore cv-qualifiers)\n// BOOST_IS_UNION(T) should evaluate to true if T is a union type\n// BOOST_IS_POD(T) should evaluate to true if T is a POD type\n// BOOST_IS_EMPTY(T) should evaluate to true if T is an empty class type (and not a union)\n// BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) should evaluate to true if \"T x;\" has no effect\n// BOOST_HAS_TRIVIAL_COPY(T) should evaluate to true if T(t) <==> memcpy\n// BOOST_HAS_TRIVIAL_MOVE_CONSTRUCTOR(T) should evaluate to true if T(boost::move(t)) <==> memcpy\n// BOOST_HAS_TRIVIAL_ASSIGN(T) should evaluate to true if t = u <==> memcpy\n// BOOST_HAS_TRIVIAL_MOVE_ASSIGN(T) should evaluate to true if t = boost::move(u) <==> memcpy\n// BOOST_HAS_TRIVIAL_DESTRUCTOR(T) should evaluate to true if ~T() has no effect\n// BOOST_HAS_NOTHROW_CONSTRUCTOR(T) should evaluate to true if \"T x;\" can not throw\n// BOOST_HAS_NOTHROW_COPY(T) should evaluate to true if T(t) can not throw\n// BOOST_HAS_NOTHROW_ASSIGN(T) should evaluate to true if t = u can not throw\n// BOOST_HAS_VIRTUAL_DESTRUCTOR(T) should evaluate to true T has a virtual destructor\n// BOOST_IS_NOTHROW_MOVE_CONSTRUCT(T) should evaluate to true if T has a non-throwing move constructor.\n// BOOST_IS_NOTHROW_MOVE_ASSIGN(T) should evaluate to true if T has a non-throwing move assignment operator.\n//\n// The following can also be defined: when detected our implementation is greatly simplified.\n//\n// BOOST_IS_ABSTRACT(T) true if T is an abstract type\n// BOOST_IS_BASE_OF(T,U) true if T is a base class of U\n// BOOST_IS_CLASS(T) true if T is a class type (and not a union)\n// BOOST_IS_CONVERTIBLE(T,U) true if T is convertible to U\n// BOOST_IS_ENUM(T) true is T is an enum\n// BOOST_IS_POLYMORPHIC(T) true if T is a polymorphic type\n// BOOST_ALIGNMENT_OF(T) should evaluate to the alignment requirements of type T.\n//\n// define BOOST_TT_DISABLE_INTRINSICS to prevent any intrinsics being used (mostly used when testing)\n//\n\n#ifdef BOOST_HAS_SGI_TYPE_TRAITS\n    // Hook into SGI's __type_traits class, this will pick up user supplied\n    // specializations as well as SGI - compiler supplied specializations.\n#   include <boost/type_traits/is_same.hpp>\n#   ifdef __NetBSD__\n      // There are two different versions of type_traits.h on NetBSD on Spark\n      // use an implicit include via algorithm instead, to make sure we get\n      // the same version as the std lib:\n#     include <algorithm>\n#   else\n#    include <type_traits.h>\n#   endif\n#   define BOOST_IS_POD(T) ::boost::is_same< typename ::__type_traits<T>::is_POD_type, ::__true_type>::value\n#   define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) ::boost::is_same< typename ::__type_traits<T>::has_trivial_default_constructor, ::__true_type>::value\n#   define BOOST_HAS_TRIVIAL_COPY(T) ::boost::is_same< typename ::__type_traits<T>::has_trivial_copy_constructor, ::__true_type>::value\n#   define BOOST_HAS_TRIVIAL_ASSIGN(T) ::boost::is_same< typename ::__type_traits<T>::has_trivial_assignment_operator, ::__true_type>::value\n#   define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) ::boost::is_same< typename ::__type_traits<T>::has_trivial_destructor, ::__true_type>::value\n\n#   ifdef __sgi\n#      define BOOST_HAS_TYPE_TRAITS_INTRINSICS\n#   endif\n#endif\n\n#if defined(__MSL_CPP__) && (__MSL_CPP__ >= 0x8000)\n    // Metrowerks compiler is acquiring intrinsic type traits support\n    // post version 8.  We hook into the published interface to pick up\n    // user defined specializations as well as compiler intrinsics as \n    // and when they become available:\n#   include <msl_utility>\n#   define BOOST_IS_UNION(T) BOOST_STD_EXTENSION_NAMESPACE::is_union<T>::value\n#   define BOOST_IS_POD(T) BOOST_STD_EXTENSION_NAMESPACE::is_POD<T>::value\n#   define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) BOOST_STD_EXTENSION_NAMESPACE::has_trivial_default_ctor<T>::value\n#   define BOOST_HAS_TRIVIAL_COPY(T) BOOST_STD_EXTENSION_NAMESPACE::has_trivial_copy_ctor<T>::value\n#   define BOOST_HAS_TRIVIAL_ASSIGN(T) BOOST_STD_EXTENSION_NAMESPACE::has_trivial_assignment<T>::value\n#   define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) BOOST_STD_EXTENSION_NAMESPACE::has_trivial_dtor<T>::value\n#   define BOOST_HAS_TYPE_TRAITS_INTRINSICS\n#endif\n\n#if (defined(BOOST_MSVC) && defined(BOOST_MSVC_FULL_VER) && (BOOST_MSVC_FULL_VER >=140050215))\\\n         || (defined(BOOST_INTEL) && defined(_MSC_VER) && (_MSC_VER >= 1500))\n//\n// Note that even though these intrinsics rely on other type traits classes\n// we do not #include those here as it produces cyclic dependencies and\n// can cause the intrinsics to not even be used at all!\n//\n#   define BOOST_IS_UNION(T) __is_union(T)\n#   define BOOST_IS_POD(T) (__is_pod(T) && __has_trivial_constructor(T))\n#   define BOOST_IS_EMPTY(T) __is_empty(T)\n#   define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) __has_trivial_constructor(T)\n#   define BOOST_HAS_TRIVIAL_ASSIGN(T) (__has_trivial_assign(T) || ( ::boost::is_pod<T>::value && ! ::boost::is_const<T>::value && !::boost::is_volatile<T>::value))\n#   define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) (__has_trivial_destructor(T) || ::boost::is_pod<T>::value)\n#   define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) (__has_nothrow_constructor(T) || ::boost::has_trivial_constructor<T>::value)\n#if !defined(BOOST_INTEL)\n#   define BOOST_HAS_NOTHROW_COPY(T) ((__has_nothrow_copy(T) || ::boost::has_trivial_copy<T>::value) && !is_array<T>::value)\n#   define BOOST_HAS_TRIVIAL_COPY(T) (__has_trivial_copy(T) || ::boost::is_pod<T>::value)\n#elif (_MSC_VER >= 1900)\n#   define BOOST_HAS_NOTHROW_COPY(T) ((__is_nothrow_constructible(T, typename add_lvalue_reference<typename add_const<T>::type>::type)) && !is_array<T>::value)\n#   define BOOST_HAS_TRIVIAL_COPY(T) (__is_trivially_constructible(T, typename add_lvalue_reference<typename add_const<T>::type>::type))\n#endif\n#   define BOOST_HAS_NOTHROW_ASSIGN(T) (__has_nothrow_assign(T) || ::boost::has_trivial_assign<T>::value)\n#   define BOOST_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)\n\n#   define BOOST_IS_ABSTRACT(T) __is_abstract(T)\n#   define BOOST_IS_BASE_OF(T,U) (__is_base_of(T,U) && !is_same<T,U>::value)\n#   define BOOST_IS_CLASS(T) __is_class(T)\n#   define BOOST_IS_CONVERTIBLE(T,U) ((__is_convertible_to(T,U) || (is_same<T,U>::value && !is_function<U>::value)) && !__is_abstract(U))\n#   define BOOST_IS_ENUM(T) __is_enum(T)\n//  This one fails if the default alignment has been changed with /Zp:\n//  #   define BOOST_ALIGNMENT_OF(T) __alignof(T)\n\n#   if defined(_MSC_VER) && (_MSC_VER >= 1700)\n#       define BOOST_HAS_TRIVIAL_MOVE_CONSTRUCTOR(T) ((__has_trivial_move_constructor(T) || boost::is_pod<T>::value) && ! ::boost::is_volatile<T>::value && ! ::boost::is_reference<T>::value)\n#       define BOOST_HAS_TRIVIAL_MOVE_ASSIGN(T) ((__has_trivial_move_assign(T) || boost::is_pod<T>::value) && ! ::boost::is_const<T>::value && !::boost::is_volatile<T>::value && ! ::boost::is_reference<T>::value)\n#   endif\n#ifndef BOOST_NO_CXX11_FINAL\n//  This one doesn't quite always do the right thing on older VC++ versions\n//  we really need it when the final keyword is supporyted though:\n#   define BOOST_IS_POLYMORPHIC(T) __is_polymorphic(T)\n#endif\n#if _MSC_FULL_VER >= 180020827\n#   define BOOST_IS_NOTHROW_MOVE_ASSIGN(T) (__is_nothrow_assignable(T&, T&&))\n#   define BOOST_IS_NOTHROW_MOVE_CONSTRUCT(T) (__is_nothrow_constructible(T, T&&))\n#endif\n#   define BOOST_HAS_TYPE_TRAITS_INTRINSICS\n#endif\n\n#if defined(__DMC__) && (__DMC__ >= 0x848)\n// For Digital Mars C++, www.digitalmars.com\n#   define BOOST_IS_UNION(T) (__typeinfo(T) & 0x400)\n#   define BOOST_IS_POD(T) (__typeinfo(T) & 0x800)\n#   define BOOST_IS_EMPTY(T) (__typeinfo(T) & 0x1000)\n#   define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) (__typeinfo(T) & 0x10)\n#   define BOOST_HAS_TRIVIAL_COPY(T) (__typeinfo(T) & 0x20)\n#   define BOOST_HAS_TRIVIAL_ASSIGN(T) (__typeinfo(T) & 0x40)\n#   define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) (__typeinfo(T) & 0x8)\n#   define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) (__typeinfo(T) & 0x80)\n#   define BOOST_HAS_NOTHROW_COPY(T) (__typeinfo(T) & 0x100)\n#   define BOOST_HAS_NOTHROW_ASSIGN(T) (__typeinfo(T) & 0x200)\n#   define BOOST_HAS_VIRTUAL_DESTRUCTOR(T) (__typeinfo(T) & 0x4)\n#   define BOOST_HAS_TYPE_TRAITS_INTRINSICS\n#endif\n\n#if defined(BOOST_CLANG) && defined(__has_feature) && !defined(__CUDACC__)\n//\n// Note that these intrinsics are disabled for the CUDA meta-compiler as it appears\n// to not support them, even though the underlying clang compiler does so.\n// This is a rubbish fix as it basically stops type traits from working correctly, \n// but maybe the best we can do for now.  See https://svn.boost.org/trac/boost/ticket/10694\n//\n//\n// Note that even though these intrinsics rely on other type traits classes\n// we do not #include those here as it produces cyclic dependencies and\n// can cause the intrinsics to not even be used at all!\n//\n#   include <cstddef>\n\n#   if __has_feature(is_union)\n#     define BOOST_IS_UNION(T) __is_union(T)\n#   endif\n#   if (!defined(__GLIBCXX__) || (__GLIBCXX__ >= 20080306 && __GLIBCXX__ != 20080519)) && __has_feature(is_pod)\n#     define BOOST_IS_POD(T) __is_pod(T)\n#   endif\n#   if (!defined(__GLIBCXX__) || (__GLIBCXX__ >= 20080306 && __GLIBCXX__ != 20080519)) && __has_feature(is_empty)\n#     define BOOST_IS_EMPTY(T) __is_empty(T)\n#   endif\n#   if __has_feature(has_trivial_constructor)\n#     define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) __has_trivial_constructor(T)\n#   endif\n#   if __has_feature(has_trivial_copy)\n#     define BOOST_HAS_TRIVIAL_COPY(T) (__has_trivial_copy(T) && !is_reference<T>::value)\n#   endif\n#   if __has_feature(has_trivial_assign)\n#     define BOOST_HAS_TRIVIAL_ASSIGN(T) (__has_trivial_assign(T) && !is_volatile<T>::value && is_assignable<T&, const T&>::value)\n#   endif\n#   if __has_feature(has_trivial_destructor)\n#     define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) (__has_trivial_destructor(T)  && is_destructible<T>::value)\n#   endif\n#   if __has_feature(has_nothrow_constructor)\n#     define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) (__has_nothrow_constructor(T) && is_default_constructible<T>::value)\n#   endif\n#   if __has_feature(has_nothrow_copy)\n#     define BOOST_HAS_NOTHROW_COPY(T) (__has_nothrow_copy(T) && !is_volatile<T>::value && !is_reference<T>::value && is_copy_constructible<T>::value)\n#   endif\n#   if __has_feature(has_nothrow_assign)\n#     define BOOST_HAS_NOTHROW_ASSIGN(T) (__has_nothrow_assign(T) && !is_volatile<T>::value && is_assignable<T&, const T&>::value)\n#   endif\n#   if __has_feature(has_virtual_destructor)\n#     define BOOST_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)\n#   endif\n#   if __has_feature(is_abstract)\n#     define BOOST_IS_ABSTRACT(T) __is_abstract(T)\n#   endif\n#   if __has_feature(is_base_of)\n#     define BOOST_IS_BASE_OF(T,U) (__is_base_of(T,U) && !is_same<T,U>::value)\n#   endif\n#   if __has_feature(is_class)\n#     define BOOST_IS_CLASS(T) __is_class(T)\n#   endif\n#   if __has_feature(is_convertible_to)\n#     define BOOST_IS_CONVERTIBLE(T,U) __is_convertible_to(T,U)\n#   endif\n#   if __has_feature(is_enum)\n#     define BOOST_IS_ENUM(T) __is_enum(T)\n#   endif\n#   if __has_feature(is_polymorphic)\n#     define BOOST_IS_POLYMORPHIC(T) __is_polymorphic(T)\n#   endif\n#   if __has_feature(has_trivial_move_constructor)\n#     define BOOST_HAS_TRIVIAL_MOVE_CONSTRUCTOR(T) (__has_trivial_move_constructor(T)  && is_constructible<T, T&&>::value && !::boost::is_volatile<T>::value)\n#   endif\n#   if __has_feature(has_trivial_move_assign)\n#     define BOOST_HAS_TRIVIAL_MOVE_ASSIGN(T) (__has_trivial_move_assign(T) && is_assignable<T&, T&&>::value && !::boost::is_volatile<T>::value)\n#   endif\n#   if (!defined(unix) && !defined(__unix__)) || defined(__LP64__) || !defined(__GNUC__)\n// GCC sometimes lies about alignment requirements\n// of type double on 32-bit unix platforms, use the\n// old implementation instead in that case:\n#     define BOOST_ALIGNMENT_OF(T) __alignof(T)\n#   endif\n#   if __has_feature(is_final)\n#     define BOOST_IS_FINAL(T) __is_final(T)\n#   endif\n\n#   define BOOST_HAS_TYPE_TRAITS_INTRINSICS\n#endif\n\n#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3) && !defined(__GCCXML__))) && !defined(BOOST_CLANG)\n//\n// Note that even though these intrinsics rely on other type traits classes\n// we do not #include those here as it produces cyclic dependencies and\n// can cause the intrinsics to not even be used at all!\n//\n\n#ifdef BOOST_INTEL\n#  define BOOST_INTEL_TT_OPTS || is_pod<T>::value\n#else\n#  define BOOST_INTEL_TT_OPTS\n#endif\n\n#   define BOOST_IS_UNION(T) __is_union(T)\n#   define BOOST_IS_POD(T) __is_pod(T)\n#   define BOOST_IS_EMPTY(T) __is_empty(T)\n#   define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) ((__has_trivial_constructor(T) BOOST_INTEL_TT_OPTS) && ! ::boost::is_volatile<T>::value)\n#   define BOOST_HAS_TRIVIAL_COPY(T) ((__has_trivial_copy(T) BOOST_INTEL_TT_OPTS) && !is_reference<T>::value)\n#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409\n#   define BOOST_HAS_TRIVIAL_ASSIGN(T) ((__has_trivial_assign(T) BOOST_INTEL_TT_OPTS) && ! ::boost::is_volatile<T>::value && ! ::boost::is_const<T>::value && is_assignable<T&, const T&>::value)\n#   define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) (__has_trivial_destructor(T) BOOST_INTEL_TT_OPTS && is_destructible<T>::value)\n#   define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) (__has_nothrow_constructor(T) && is_default_constructible<T>::value BOOST_INTEL_TT_OPTS)\n#   define BOOST_HAS_NOTHROW_COPY(T) ((__has_nothrow_copy(T) BOOST_INTEL_TT_OPTS) && !is_volatile<T>::value && !is_reference<T>::value && is_copy_constructible<T>::value)\n#   define BOOST_HAS_NOTHROW_ASSIGN(T) ((__has_nothrow_assign(T) BOOST_INTEL_TT_OPTS) && !is_volatile<T>::value && !is_const<T>::value && is_assignable<T&, const T&>::value)\n#else\n#   define BOOST_HAS_TRIVIAL_ASSIGN(T) ((__has_trivial_assign(T) BOOST_INTEL_TT_OPTS) && ! ::boost::is_volatile<T>::value && ! ::boost::is_const<T>::value)\n#   define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) (__has_trivial_destructor(T) BOOST_INTEL_TT_OPTS)\n#   define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) (__has_nothrow_constructor(T) BOOST_INTEL_TT_OPTS)\n#   define BOOST_HAS_NOTHROW_COPY(T) ((__has_nothrow_copy(T) BOOST_INTEL_TT_OPTS) && !is_volatile<T>::value && !is_reference<T>::value && !is_array<T>::value)\n#   define BOOST_HAS_NOTHROW_ASSIGN(T) ((__has_nothrow_assign(T) BOOST_INTEL_TT_OPTS) && !is_volatile<T>::value && !is_const<T>::value && !is_array<T>::value)\n#endif\n#   define BOOST_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)\n\n#   define BOOST_IS_ABSTRACT(T) __is_abstract(T)\n#   define BOOST_IS_BASE_OF(T,U) (__is_base_of(T,U) && !is_same<T,U>::value)\n#   define BOOST_IS_CLASS(T) __is_class(T)\n#   define BOOST_IS_ENUM(T) __is_enum(T)\n#   define BOOST_IS_POLYMORPHIC(T) __is_polymorphic(T)\n#   if (!defined(unix) && !defined(__unix__)) || defined(__LP64__)\n      // GCC sometimes lies about alignment requirements\n      // of type double on 32-bit unix platforms, use the\n      // old implementation instead in that case:\n#     define BOOST_ALIGNMENT_OF(T) __alignof__(T)\n#   endif\n#   if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7))\n#     define BOOST_IS_FINAL(T) __is_final(T)\n#   endif\n\n#   if (__GNUC__ >= 5) && (__cplusplus >= 201103)\n#     define BOOST_HAS_TRIVIAL_MOVE_ASSIGN(T) (__is_trivially_assignable(T&, T&&) && is_assignable<T&, T&&>::value && !::boost::is_volatile<T>::value)\n#     define BOOST_HAS_TRIVIAL_MOVE_CONSTRUCTOR(T) (__is_trivially_constructible(T, T&&) && is_constructible<T, T&&>::value && !::boost::is_volatile<T>::value)\n#   endif\n\n#   define BOOST_HAS_TYPE_TRAITS_INTRINSICS\n#endif\n\n#if defined(__SUNPRO_CC) && (__SUNPRO_CC >= 0x5130)\n#   define BOOST_IS_UNION(T) __oracle_is_union(T)\n#   define BOOST_IS_POD(T) (__oracle_is_pod(T) && !is_function<T>::value)\n#   define BOOST_IS_EMPTY(T) __oracle_is_empty(T)\n#   define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) (__oracle_has_trivial_constructor(T) && ! ::boost::is_volatile<T>::value)\n#   define BOOST_HAS_TRIVIAL_COPY(T) (__oracle_has_trivial_copy(T) && !is_reference<T>::value)\n#   define BOOST_HAS_TRIVIAL_ASSIGN(T) ((__oracle_has_trivial_assign(T) || __oracle_is_trivial(T)) && ! ::boost::is_volatile<T>::value && ! ::boost::is_const<T>::value && is_assignable<T&, const T&>::value)\n#   define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) (__oracle_has_trivial_destructor(T) && is_destructible<T>::value)\n#   define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) ((__oracle_has_nothrow_constructor(T) || __oracle_has_trivial_constructor(T) || __oracle_is_trivial(T)) && is_default_constructible<T>::value)\n//  __oracle_has_nothrow_copy appears to behave the same as __oracle_has_nothrow_assign, disabled for now:\n//#   define BOOST_HAS_NOTHROW_COPY(T) ((__oracle_has_nothrow_copy(T) || __oracle_has_trivial_copy(T) || __oracle_is_trivial(T)) && !is_volatile<T>::value && !is_reference<T>::value && is_copy_constructible<T>::value)\n#   define BOOST_HAS_NOTHROW_ASSIGN(T) ((__oracle_has_nothrow_assign(T) || __oracle_has_trivial_assign(T) || __oracle_is_trivial(T)) && !is_volatile<T>::value && !is_const<T>::value && is_assignable<T&, const T&>::value)\n#   define BOOST_HAS_VIRTUAL_DESTRUCTOR(T) __oracle_has_virtual_destructor(T)\n\n#   define BOOST_IS_ABSTRACT(T) __oracle_is_abstract(T)\n//#   define BOOST_IS_BASE_OF(T,U) (__is_base_of(T,U) && !is_same<T,U>::value)\n#   define BOOST_IS_CLASS(T) __oracle_is_class(T)\n#   define BOOST_IS_ENUM(T) __oracle_is_enum(T)\n#   define BOOST_IS_POLYMORPHIC(T) __oracle_is_polymorphic(T)\n#   define BOOST_ALIGNMENT_OF(T) __alignof__(T)\n#   define BOOST_IS_FINAL(T) __oracle_is_final(T)\n\n#   define BOOST_HAS_TYPE_TRAITS_INTRINSICS\n#endif\n\n#if defined(__ghs__) && (__GHS_VERSION_NUMBER >= 600)\n#   include <boost/type_traits/is_same.hpp>\n#   include <boost/type_traits/is_reference.hpp>\n#   include <boost/type_traits/is_volatile.hpp>\n\n#   define BOOST_IS_UNION(T) __is_union(T)\n#   define BOOST_IS_POD(T) __is_pod(T)\n#   define BOOST_IS_EMPTY(T) __is_empty(T)\n#   define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) __has_trivial_constructor(T)\n#   define BOOST_HAS_TRIVIAL_COPY(T) (__has_trivial_copy(T) && !is_reference<T>::value)\n#   define BOOST_HAS_TRIVIAL_ASSIGN(T) (__has_trivial_assign(T) && !is_volatile<T>::value)\n#   define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) __has_trivial_destructor(T)\n#   define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) __has_nothrow_constructor(T)\n#   define BOOST_HAS_NOTHROW_COPY(T) (__has_nothrow_copy(T) && !is_volatile<T>::value && !is_reference<T>::value)\n#   define BOOST_HAS_NOTHROW_ASSIGN(T) (__has_nothrow_assign(T) && !is_volatile<T>::value)\n#   define BOOST_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)\n\n#   define BOOST_IS_ABSTRACT(T) __is_abstract(T)\n#   define BOOST_IS_BASE_OF(T,U) (__is_base_of(T,U) && !is_same<T,U>::value)\n#   define BOOST_IS_CLASS(T) __is_class(T)\n#   define BOOST_IS_ENUM(T) __is_enum(T)\n#   define BOOST_IS_POLYMORPHIC(T) __is_polymorphic(T)\n#   define BOOST_ALIGNMENT_OF(T) __alignof__(T)\n#   define BOOST_HAS_TYPE_TRAITS_INTRINSICS\n#endif\n\n# if defined(__CODEGEARC__)\n#   include <boost/type_traits/is_same.hpp>\n#   include <boost/type_traits/is_reference.hpp>\n#   include <boost/type_traits/is_volatile.hpp>\n#   include <boost/type_traits/is_void.hpp>\n\n#   define BOOST_IS_UNION(T) __is_union(T)\n#   define BOOST_IS_POD(T) __is_pod(T)\n#   define BOOST_IS_EMPTY(T) __is_empty(T)\n#   define BOOST_HAS_TRIVIAL_CONSTRUCTOR(T) (__has_trivial_default_constructor(T))\n#   define BOOST_HAS_TRIVIAL_COPY(T) (__has_trivial_copy_constructor(T) && !is_reference<T>::value)\n#   define BOOST_HAS_TRIVIAL_ASSIGN(T) (__has_trivial_assign(T) && !is_volatile<T>::value)\n#   define BOOST_HAS_TRIVIAL_DESTRUCTOR(T) (__has_trivial_destructor(T))\n#   define BOOST_HAS_NOTHROW_CONSTRUCTOR(T) (__has_nothrow_default_constructor(T))\n#   define BOOST_HAS_NOTHROW_COPY(T) (__has_nothrow_copy_constructor(T) && !is_volatile<T>::value && !is_reference<T>::value)\n#   define BOOST_HAS_NOTHROW_ASSIGN(T) (__has_nothrow_assign(T) && !is_volatile<T>::value)\n#   define BOOST_HAS_VIRTUAL_DESTRUCTOR(T) __has_virtual_destructor(T)\n\n#   define BOOST_IS_ABSTRACT(T) __is_abstract(T)\n#   define BOOST_IS_BASE_OF(T,U) (__is_base_of(T,U) && !is_void<T>::value && !is_void<U>::value)\n#   define BOOST_IS_CLASS(T) __is_class(T)\n#   define BOOST_IS_CONVERTIBLE(T,U) (__is_convertible(T,U) || is_void<U>::value)\n#   define BOOST_IS_ENUM(T) __is_enum(T)\n#   define BOOST_IS_POLYMORPHIC(T) __is_polymorphic(T)\n#   define BOOST_ALIGNMENT_OF(T) alignof(T)\n\n#   define BOOST_HAS_TYPE_TRAITS_INTRINSICS\n#endif\n\n#endif // BOOST_TT_DISABLE_INTRINSICS\n\n#endif // BOOST_TT_INTRINSICS_HPP_INCLUDED\n\n"
  },
  {
    "path": "benchmarks/boost/type_traits/is_abstract.hpp",
    "content": "#ifndef BOOST_TT_IS_ABSTRACT_CLASS_HPP\n#define BOOST_TT_IS_ABSTRACT_CLASS_HPP\n\n#if defined(_MSC_VER)\n# pragma once\n#endif\n\n/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8\n// is_abstract_class.hpp:\n//\n//  (C) Copyright 2002 Rani Sharoni (rani_sharoni@hotmail.com) and Robert Ramey\n//  Use, modification and distribution is subject to the Boost Software\n//  License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n//  \n//  See http://www.boost.org for updates, documentation, and revision history.\n//\n\n// Compile type discovery whether given type is abstract class or not.\n//\n//   Requires DR 337 to be supported by compiler\n//   (http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#337).\n//\n//\n// Believed (Jan 2004) to work on:\n//  - GCC 3.4\n//  - VC++ 7.1\n//  - compilers with new EDG frontend (Intel C++ 7, Comeau 4.3.2)\n//\n// Doesn't work on:\n//  - VC++6, VC++7.0 and less\n//  - GCC 3.3.X and less\n//  - Borland C++ 6 and less\n//      \n//\n// History:\n//  - Originally written by Rani Sharoni, see\n//    http://groups.google.com/groups?selm=df893da6.0207110613.75b2fe90%40posting.google.com\n//    At this time supported by EDG (Intel C++ 7, Comeau 4.3.2) and VC7.1.\n//  - Adapted and added into Boost.Serialization library by Robert Ramey \n//    (starting with submission #10).\n//  - Jan 2004: GCC 3.4 fixed to support DR337 (Giovanni Bajo).\n//  - Jan 2004: modified to be part of Boost.TypeTraits (Pavel Vozenilek).\n//  - Nov 2004: Christoph Ludwig found that the implementation did not work with\n//              template types and gcc-3.4 or VC7.1, fix due to Christoph Ludwig\n//              and John Maddock.\n//  - Dec 2004: Added new config macro BOOST_NO_IS_ABSTRACT which causes the template\n//              to degrade gracefully, rather than trash the compiler (John Maddock).\n//\n\n#include <boost/type_traits/intrinsics.hpp>\n#include <boost/type_traits/integral_constant.hpp>\n#ifndef BOOST_IS_ABSTRACT\n#include <boost/static_assert.hpp>\n#include <boost/type_traits/detail/yes_no_type.hpp>\n#include <boost/type_traits/is_class.hpp>\n#ifdef BOOST_NO_IS_ABSTRACT\n#include <boost/type_traits/is_polymorphic.hpp>\n#endif\n#endif\n\nnamespace boost {\n\nnamespace detail{\n\n#ifdef BOOST_IS_ABSTRACT\ntemplate <class T>\nstruct is_abstract_imp\n{\n   BOOST_STATIC_CONSTANT(bool, value = BOOST_IS_ABSTRACT(T));\n};\n#elif !defined(BOOST_NO_IS_ABSTRACT)\ntemplate<class T>\nstruct is_abstract_imp2\n{\n   // Deduction fails if T is void, function type, \n   // reference type (14.8.2/2)or an abstract class type \n   // according to review status issue #337\n   //\n   template<class U>\n   static type_traits::no_type check_sig(U (*)[1]);\n   template<class U>\n   static type_traits::yes_type check_sig(...);\n   //\n   // T must be a complete type, further if T is a template then\n   // it must be instantiated in order for us to get the right answer:\n   //\n   BOOST_STATIC_ASSERT(sizeof(T) != 0);\n\n   // GCC2 won't even parse this template if we embed the computation\n   // of s1 in the computation of value.\n#ifdef __GNUC__\n   BOOST_STATIC_CONSTANT(std::size_t, s1 = sizeof(is_abstract_imp2<T>::template check_sig<T>(0)));\n#else\n#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)\n#pragma warning(push)\n#pragma warning(disable:6334)\n#endif\n   BOOST_STATIC_CONSTANT(std::size_t, s1 = sizeof(check_sig<T>(0)));\n#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)\n#pragma warning(pop)\n#endif\n#endif\n    \n   BOOST_STATIC_CONSTANT(bool, value = \n      (s1 == sizeof(type_traits::yes_type)));\n};\n\ntemplate <bool v>\nstruct is_abstract_select\n{\n   template <class T>\n   struct rebind\n   {\n      typedef is_abstract_imp2<T> type;\n   };\n};\ntemplate <>\nstruct is_abstract_select<false>\n{\n   template <class T>\n   struct rebind\n   {\n      typedef false_type type;\n   };\n};\n\ntemplate <class T>\nstruct is_abstract_imp\n{\n   typedef is_abstract_select< ::boost::is_class<T>::value> selector;\n   typedef typename selector::template rebind<T> binder;\n   typedef typename binder::type type;\n\n   BOOST_STATIC_CONSTANT(bool, value = type::value);\n};\n\n#endif\n}\n\n#ifndef BOOST_NO_IS_ABSTRACT\ntemplate <class T> struct is_abstract : public integral_constant<bool, ::boost::detail::is_abstract_imp<T>::value> {};\n#else\ntemplate <class T> struct is_abstract : public integral_constant<bool, ::boost::detail::is_polymorphic_imp<T>::value> {};\n#endif\n\n} // namespace boost\n\n#endif //BOOST_TT_IS_ABSTRACT_CLASS_HPP\n"
  },
  {
    "path": "benchmarks/boost/type_traits/is_arithmetic.hpp",
    "content": "\n//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.\n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n#ifndef BOOST_TT_IS_ARITHMETIC_HPP_INCLUDED\n#define BOOST_TT_IS_ARITHMETIC_HPP_INCLUDED\n\n#include <boost/type_traits/is_integral.hpp>\n#include <boost/type_traits/is_floating_point.hpp>\n\nnamespace boost {\n\ntemplate <class T>\nstruct is_arithmetic : public integral_constant<bool, is_integral<T>::value || is_floating_point<T>::value> {};\n\n} // namespace boost\n\n#endif // BOOST_TT_IS_ARITHMETIC_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/type_traits/is_array.hpp",
    "content": "\n//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard\n//  Hinnant & John Maddock 2000.  \n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n\n// Some fixes for is_array are based on a newsgroup posting by Jonathan Lundquist.\n\n\n#ifndef BOOST_TT_IS_ARRAY_HPP_INCLUDED\n#define BOOST_TT_IS_ARRAY_HPP_INCLUDED\n\n#include <boost/type_traits/integral_constant.hpp>\n#include <cstddef>\n\nnamespace boost {\n\n#if defined( __CODEGEARC__ )\n   template <class T> struct is_array : public integral_constant<bool, __is_array(T)> {};\n#else\n   template <class T> struct is_array : public false_type {};\n#if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS)\n   template <class T, std::size_t N> struct is_array<T[N]> : public true_type {};\n   template <class T, std::size_t N> struct is_array<T const[N]> : public true_type{};\n   template <class T, std::size_t N> struct is_array<T volatile[N]> : public true_type{};\n   template <class T, std::size_t N> struct is_array<T const volatile[N]> : public true_type{};\n#if !BOOST_WORKAROUND(__BORLANDC__, < 0x600) && !defined(__IBMCPP__) &&  !BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840))\n   template <class T> struct is_array<T[]> : public true_type{};\n   template <class T> struct is_array<T const[]> : public true_type{};\n   template <class T> struct is_array<T const volatile[]> : public true_type{};\n   template <class T> struct is_array<T volatile[]> : public true_type{};\n#endif\n#endif\n\n#endif\n\n} // namespace boost\n\n#endif // BOOST_TT_IS_ARRAY_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/type_traits/is_assignable.hpp",
    "content": "\n//  (C) Copyright John Maddock 2015.\n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n#ifndef BOOST_TT_IS_ASSIGNABLE_HPP_INCLUDED\n#define BOOST_TT_IS_ASSIGNABLE_HPP_INCLUDED\n\n#include <boost/type_traits/integral_constant.hpp>\n#include <boost/detail/workaround.hpp>\n\nnamespace boost{\n\n   template <class T, class U = T> struct is_assignable;\n\n}\n\n#if !defined(BOOST_NO_CXX11_DECLTYPE) && !BOOST_WORKAROUND(BOOST_MSVC, < 1800)\n\n#include <boost/type_traits/detail/yes_no_type.hpp>\n#include <boost/type_traits/declval.hpp>\n\nnamespace boost{\n\n   namespace detail{\n\n      struct is_assignable_imp\n      {\n         template<typename T, typename U, typename = decltype(boost::declval<T>() = boost::declval<U>())>\n         static boost::type_traits::yes_type test(int);\n\n         template<typename, typename>\n         static boost::type_traits::no_type test(...);\n      };\n\n   }\n\n   template <class T, class U> struct is_assignable : public integral_constant<bool, sizeof(detail::is_assignable_imp::test<T, U>(0)) == sizeof(boost::type_traits::yes_type)>{};\n   template <class T, std::size_t N, class U> struct is_assignable<T[N], U> : public is_assignable<T, U>{};\n   template <class T, std::size_t N, class U> struct is_assignable<T(&)[N], U> : public is_assignable<T&, U>{};\n   template <class T, class U> struct is_assignable<T[], U> : public is_assignable<T, U>{};\n   template <class T, class U> struct is_assignable<T(&)[], U> : public is_assignable<T&, U>{};\n   template <class U> struct is_assignable<void, U> : public integral_constant<bool, false>{};\n   template <class U> struct is_assignable<void const, U> : public integral_constant<bool, false>{};\n   template <class U> struct is_assignable<void volatile, U> : public integral_constant<bool, false>{};\n   template <class U> struct is_assignable<void const volatile, U> : public integral_constant<bool, false>{};\n\n#else\n\n#include <boost/type_traits/has_trivial_assign.hpp>\n#include <boost/type_traits/remove_reference.hpp>\n\nnamespace boost{\n\n   // We don't know how to implement this:\n   template <class T, class U> struct is_assignable : public integral_constant<bool, false>{};\n   template <class T, class U> struct is_assignable<T&, U> : public integral_constant<bool, is_pod<T>::value && is_pod<typename remove_reference<U>::type>::value>{};\n   template <class T, class U> struct is_assignable<const T&, U> : public integral_constant<bool, false>{};\n   template <class U> struct is_assignable<void, U> : public integral_constant<bool, false>{};\n   template <class U> struct is_assignable<void const, U> : public integral_constant<bool, false>{};\n   template <class U> struct is_assignable<void volatile, U> : public integral_constant<bool, false>{};\n   template <class U> struct is_assignable<void const volatile, U> : public integral_constant<bool, false>{};\n   /*\n   template <> struct is_assignable<void, void> : public integral_constant<bool, false>{};\n   template <> struct is_assignable<void const, void const> : public integral_constant<bool, false>{};\n   template <> struct is_assignable<void volatile, void volatile> : public integral_constant<bool, false>{};\n   template <> struct is_assignable<void const volatile, void const volatile> : public integral_constant<bool, false>{};\n   */\n#endif\n\n} // namespace boost\n\n#endif // BOOST_TT_IS_ASSIGNABLE_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/type_traits/is_base_and_derived.hpp",
    "content": "\n//  (C) Copyright Rani Sharoni 2003.\n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n \n#ifndef BOOST_TT_IS_BASE_AND_DERIVED_HPP_INCLUDED\n#define BOOST_TT_IS_BASE_AND_DERIVED_HPP_INCLUDED\n\n#include <boost/type_traits/intrinsics.hpp>\n#include <boost/type_traits/integral_constant.hpp>\n#ifndef BOOST_IS_BASE_OF\n#include <boost/type_traits/is_class.hpp>\n#include <boost/type_traits/is_same.hpp>\n#include <boost/type_traits/is_convertible.hpp>\n#include <boost/config.hpp>\n#include <boost/static_assert.hpp>\n#endif\n#include <boost/type_traits/remove_cv.hpp>\n#include <boost/type_traits/is_same.hpp>\n\nnamespace boost {\n\nnamespace detail {\n\n#ifndef BOOST_IS_BASE_OF\n#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x581)) \\\n && !BOOST_WORKAROUND(__SUNPRO_CC , <= 0x540) \\\n && !BOOST_WORKAROUND(__EDG_VERSION__, <= 243) \\\n && !BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840))\n\n                             // The EDG version number is a lower estimate.\n                             // It is not currently known which EDG version\n                             // exactly fixes the problem.\n\n/*************************************************************************\n\nThis version detects ambiguous base classes and private base classes\ncorrectly, and was devised by Rani Sharoni.\n\nExplanation by Terje Slettebo and Rani Sharoni.\n\nLet's take the multiple base class below as an example, and the following\nwill also show why there's not a problem with private or ambiguous base\nclass:\n\nstruct B {};\nstruct B1 : B {};\nstruct B2 : B {};\nstruct D : private B1, private B2 {};\n\nis_base_and_derived<B, D>::value;\n\nFirst, some terminology:\n\nSC  - Standard conversion\nUDC - User-defined conversion\n\nA user-defined conversion sequence consists of an SC, followed by an UDC,\nfollowed by another SC. Either SC may be the identity conversion.\n\nWhen passing the default-constructed Host object to the overloaded check_sig()\nfunctions (initialization 8.5/14/4/3), we have several viable implicit\nconversion sequences:\n\nFor \"static no_type check_sig(B const volatile *, int)\" we have the conversion\nsequences:\n\nC -> C const (SC - Qualification Adjustment) -> B const volatile* (UDC)\nC -> D const volatile* (UDC) -> B1 const volatile* / B2 const volatile* ->\n     B const volatile* (SC - Conversion)\n\nFor \"static yes_type check_sig(D const volatile *, T)\" we have the conversion\nsequence:\n\nC -> D const volatile* (UDC)\n\nAccording to 13.3.3.1/4, in context of user-defined conversion only the\nstandard conversion sequence is considered when selecting the best viable\nfunction, so it only considers up to the user-defined conversion. For the\nfirst function this means choosing between C -> C const and C -> C, and it\nchooses the latter, because it's a proper subset (13.3.3.2/3/2) of the\nformer. Therefore, we have:\n\nC -> D const volatile* (UDC) -> B1 const volatile* / B2 const volatile* ->\n     B const volatile* (SC - Conversion)\nC -> D const volatile* (UDC)\n\nHere, the principle of the \"shortest subsequence\" applies again, and it\nchooses C -> D const volatile*. This shows that it doesn't even need to\nconsider the multiple paths to B, or accessibility, as that possibility is\neliminated before it could possibly cause ambiguity or access violation.\n\nIf D is not derived from B, it has to choose between C -> C const -> B const\nvolatile* for the first function, and C -> D const volatile* for the second\nfunction, which are just as good (both requires a UDC, 13.3.3.2), had it not\nbeen for the fact that \"static no_type check_sig(B const volatile *, int)\" is\nnot templated, which makes C -> C const -> B const volatile* the best choice\n(13.3.3/1/4), resulting in \"no\".\n\nAlso, if Host::operator B const volatile* hadn't been const, the two\nconversion sequences for \"static no_type check_sig(B const volatile *, int)\", in\nthe case where D is derived from B, would have been ambiguous.\n\nSee also\nhttp://groups.google.com/groups?selm=df893da6.0301280859.522081f7%40posting.\ngoogle.com and links therein.\n\n*************************************************************************/\n\ntemplate <typename B, typename D>\nstruct bd_helper\n{\n   //\n   // This VC7.1 specific workaround stops the compiler from generating\n   // an internal compiler error when compiling with /vmg (thanks to\n   // Aleksey Gurtovoy for figuring out the workaround).\n   //\n#if !BOOST_WORKAROUND(BOOST_MSVC, == 1310)\n    template <typename T>\n    static type_traits::yes_type check_sig(D const volatile *, T);\n    static type_traits::no_type  check_sig(B const volatile *, int);\n#else\n    static type_traits::yes_type check_sig(D const volatile *, long);\n    static type_traits::no_type  check_sig(B const volatile * const&, int);\n#endif\n};\n\ntemplate<typename B, typename D>\nstruct is_base_and_derived_impl2\n{\n#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)\n#pragma warning(push)\n#pragma warning(disable:6334)\n#endif\n    //\n    // May silently do the wrong thing with incomplete types\n    // unless we trap them here:\n    //\n    BOOST_STATIC_ASSERT(sizeof(B) != 0);\n    BOOST_STATIC_ASSERT(sizeof(D) != 0);\n\n    struct Host\n    {\n#if !BOOST_WORKAROUND(BOOST_MSVC, == 1310)\n        operator B const volatile *() const;\n#else\n        operator B const volatile * const&() const;\n#endif\n        operator D const volatile *();\n    };\n\n    BOOST_STATIC_CONSTANT(bool, value =\n        sizeof(bd_helper<B,D>::check_sig(Host(), 0)) == sizeof(type_traits::yes_type));\n#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)\n#pragma warning(pop)\n#endif\n};\n\n#else\n\n//\n// broken version:\n//\ntemplate<typename B, typename D>\nstruct is_base_and_derived_impl2\n{\n    BOOST_STATIC_CONSTANT(bool, value =\n        (::boost::is_convertible<D*,B*>::value));\n};\n\n#define BOOST_BROKEN_IS_BASE_AND_DERIVED\n\n#endif\n\ntemplate <typename B, typename D>\nstruct is_base_and_derived_impl3\n{\n    BOOST_STATIC_CONSTANT(bool, value = false);\n};\n\ntemplate <bool ic1, bool ic2, bool iss>\nstruct is_base_and_derived_select\n{\n   template <class T, class U>\n   struct rebind\n   {\n      typedef is_base_and_derived_impl3<T,U> type;\n   };\n};\n\ntemplate <>\nstruct is_base_and_derived_select<true,true,false>\n{\n   template <class T, class U>\n   struct rebind\n   {\n      typedef is_base_and_derived_impl2<T,U> type;\n   };\n};\n\ntemplate <typename B, typename D>\nstruct is_base_and_derived_impl\n{\n    typedef typename remove_cv<B>::type ncvB;\n    typedef typename remove_cv<D>::type ncvD;\n\n    typedef is_base_and_derived_select<\n       ::boost::is_class<B>::value,\n       ::boost::is_class<D>::value,\n       ::boost::is_same<ncvB,ncvD>::value> selector;\n    typedef typename selector::template rebind<ncvB,ncvD> binder;\n    typedef typename binder::type bound_type;\n\n    BOOST_STATIC_CONSTANT(bool, value = bound_type::value);\n};\n#else\ntemplate <typename B, typename D>\nstruct is_base_and_derived_impl\n{\n    typedef typename remove_cv<B>::type ncvB;\n    typedef typename remove_cv<D>::type ncvD;\n\n    BOOST_STATIC_CONSTANT(bool, value = (BOOST_IS_BASE_OF(B,D) && ! ::boost::is_same<ncvB,ncvD>::value));\n};\n#endif\n} // namespace detail\n\ntemplate <class Base, class Derived> struct is_base_and_derived\n   : public integral_constant<bool, (::boost::detail::is_base_and_derived_impl<Base, Derived>::value)> {};\n\ntemplate <class Base, class Derived> struct is_base_and_derived<Base&, Derived> : public false_type{};\ntemplate <class Base, class Derived> struct is_base_and_derived<Base, Derived&> : public false_type{};\ntemplate <class Base, class Derived> struct is_base_and_derived<Base&, Derived&> : public false_type{};\n\n#if BOOST_WORKAROUND(__CODEGEARC__, BOOST_TESTED_AT(0x610))\ntemplate <class Base> struct is_base_and_derived<Base, Base> : public true_type{};\n#endif\n\n} // namespace boost\n\n#endif // BOOST_TT_IS_BASE_AND_DERIVED_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/type_traits/is_class.hpp",
    "content": "//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard\n//  Hinnant & John Maddock 2000-2003.\n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n\n#ifndef BOOST_TT_IS_CLASS_HPP_INCLUDED\n#define BOOST_TT_IS_CLASS_HPP_INCLUDED\n\n#include <boost/type_traits/detail/config.hpp>\n#include <boost/type_traits/intrinsics.hpp>\n#include <boost/type_traits/integral_constant.hpp>\n#ifndef BOOST_IS_CLASS\n#   include <boost/type_traits/is_union.hpp>\n\n#ifdef BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION\n#   include <boost/type_traits/detail/yes_no_type.hpp>\n#else\n#   include <boost/type_traits/is_scalar.hpp>\n#   include <boost/type_traits/is_array.hpp>\n#   include <boost/type_traits/is_reference.hpp>\n#   include <boost/type_traits/is_void.hpp>\n#   include <boost/type_traits/is_function.hpp>\n#endif\n\n#endif // BOOST_IS_CLASS\n\nnamespace boost {\n\nnamespace detail {\n\n#ifndef BOOST_IS_CLASS\n#ifdef BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION\n\n// This is actually the conforming implementation which works with\n// abstract classes.  However, enough compilers have trouble with\n// it that most will use the one in\n// boost/type_traits/object_traits.hpp. This implementation\n// actually works with VC7.0, but other interactions seem to fail\n// when we use it.\n\n// is_class<> metafunction due to Paul Mensonides\n// (leavings@attbi.com). For more details:\n// http://groups.google.com/groups?hl=en&selm=000001c1cc83%24e154d5e0%247772e50c%40c161550a&rnum=1\n#if defined(__GNUC__)  && !defined(__EDG_VERSION__)\n\ntemplate <class U> ::boost::type_traits::yes_type is_class_tester(void(U::*)(void));\ntemplate <class U> ::boost::type_traits::no_type is_class_tester(...);\n\ntemplate <typename T>\nstruct is_class_impl\n{\n\n    BOOST_STATIC_CONSTANT(bool, value =\n            sizeof(is_class_tester<T>(0)) == sizeof(::boost::type_traits::yes_type)\n            && ! ::boost::is_union<T>::value\n        );\n};\n\n#else\n\ntemplate <typename T>\nstruct is_class_impl\n{\n    template <class U> static ::boost::type_traits::yes_type is_class_tester(void(U::*)(void));\n    template <class U> static ::boost::type_traits::no_type is_class_tester(...);\n\n    BOOST_STATIC_CONSTANT(bool, value =\n            sizeof(is_class_tester<T>(0)) == sizeof(::boost::type_traits::yes_type)\n            && ! ::boost::is_union<T>::value\n        );\n};\n\n#endif\n\n#else\n\ntemplate <typename T>\nstruct is_class_impl\n{\n    BOOST_STATIC_CONSTANT(bool, value =\n        ! ::boost::is_union<T>::value >::value\n        && ! ::boost::is_scalar<T>::value\n        && ! ::boost::is_array<T>::value\n        && ! ::boost::is_reference<T>::value\n        && ! ::boost::is_void<T>::value\n        && ! ::boost::is_function<T>::value\n        );\n};\n\n# endif // BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION\n# else // BOOST_IS_CLASS\ntemplate <typename T>\nstruct is_class_impl\n{\n    BOOST_STATIC_CONSTANT(bool, value = BOOST_IS_CLASS(T));\n};\n# endif // BOOST_IS_CLASS\n\n} // namespace detail\n\ntemplate <class T> struct is_class : public integral_constant<bool, ::boost::detail::is_class_impl<T>::value> {};\n# ifdef __EDG_VERSION__\ntemplate <class T> struct is_class<const T> : public is_class<T>{};\ntemplate <class T> struct is_class<const volatile T> : public is_class<T>{};\ntemplate <class T> struct is_class<volatile T> : public is_class<T>{};\n# endif\n    \n} // namespace boost\n\n#endif // BOOST_TT_IS_CLASS_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/type_traits/is_const.hpp",
    "content": "\n//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, \n//      Howard Hinnant and John Maddock 2000. \n//  (C) Copyright Mat Marcus, Jesse Jones and Adobe Systems Inc 2001\n\n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n//    Fixed is_pointer, is_reference, is_const, is_volatile, is_same, \n//    is_member_pointer based on the Simulated Partial Specialization work \n//    of Mat Marcus and Jesse Jones. See  http://opensource.adobe.com or \n//    http://groups.yahoo.com/group/boost/message/5441 \n//    Some workarounds in here use ideas suggested from \"Generic<Programming>: \n//    Mappings between Types and Values\" \n//    by Andrei Alexandrescu (see http://www.cuj.com/experts/1810/alexandr.html).\n\n\n#ifndef BOOST_TT_IS_CONST_HPP_INCLUDED\n#define BOOST_TT_IS_CONST_HPP_INCLUDED\n\n#include <boost/type_traits/integral_constant.hpp>\n\nnamespace boost {\n\n#if defined( __CODEGEARC__ )\n\n   template <class T>\n   struct is_const : public integral_constant<bool, __is_const(T)> {};\n\n#else\n\n   template <class T>\n   struct is_const : public false_type {};\n   template <class T> struct is_const<T const> : public true_type{};\n   template <class T, size_t N> struct is_const<T const[N]> : public true_type{};\n   template <class T> struct is_const<T const[]> : public true_type{};\n\n#endif\n\n} // namespace boost\n\n#endif // BOOST_TT_IS_CONST_HPP_INCLUDED\n\n"
  },
  {
    "path": "benchmarks/boost/type_traits/is_convertible.hpp",
    "content": "\n// Copyright 2000 John Maddock (john@johnmaddock.co.uk)\n// Copyright 2000 Jeremy Siek (jsiek@lsc.nd.edu)\n// Copyright 1999, 2000 Jaakko Jarvi (jaakko.jarvi@cs.utu.fi)\n//\n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n#ifndef BOOST_TT_IS_CONVERTIBLE_HPP_INCLUDED\n#define BOOST_TT_IS_CONVERTIBLE_HPP_INCLUDED\n\n#include <boost/type_traits/intrinsics.hpp>\n#include <boost/type_traits/integral_constant.hpp>\n#ifndef BOOST_IS_CONVERTIBLE\n#include <boost/type_traits/detail/yes_no_type.hpp>\n#include <boost/type_traits/detail/config.hpp>\n#include <boost/type_traits/is_array.hpp>\n#include <boost/type_traits/is_arithmetic.hpp>\n#include <boost/type_traits/is_void.hpp>\n#if !defined(BOOST_NO_IS_ABSTRACT)\n#include <boost/type_traits/is_abstract.hpp>\n#endif\n#include <boost/type_traits/add_lvalue_reference.hpp>\n#include <boost/type_traits/add_rvalue_reference.hpp>\n#include <boost/type_traits/is_function.hpp>\n\n#if defined(__MWERKS__)\n#include <boost/type_traits/remove_reference.hpp>\n#endif\n#if !defined(BOOST_NO_SFINAE_EXPR) && !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)\n#  include <boost/type_traits/declval.hpp>\n#endif\n#elif defined(BOOST_MSVC) || defined(BOOST_INTEL)\n#include <boost/type_traits/is_function.hpp>\n#include <boost/type_traits/is_same.hpp>\n#endif // BOOST_IS_CONVERTIBLE\n\nnamespace boost {\n\n#ifndef BOOST_IS_CONVERTIBLE\n\n// is one type convertible to another?\n//\n// there are multiple versions of the is_convertible\n// template, almost every compiler seems to require its\n// own version.\n//\n// Thanks to Andrei Alexandrescu for the original version of the\n// conversion detection technique!\n//\n\nnamespace detail {\n\n#if !defined(BOOST_NO_SFINAE_EXPR) && !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !(defined(BOOST_GCC) && (BOOST_GCC < 40700))\n\n   // This is a C++11 conforming version, place this first and use it wherever possible:\n\n#  define BOOST_TT_CXX11_IS_CONVERTIBLE\n\n   template <class A, class B, class C>\n   struct or_helper\n   {\n      static const bool value = (A::value || B::value || C::value);\n   };\n\n   template<typename From, typename To, bool b = or_helper<boost::is_void<From>, boost::is_function<To>, boost::is_array<To> >::value>\n   struct is_convertible_basic_impl\n   {\n      // Nothing converts to function or array, but void converts to void:\n      static const bool value = is_void<To>::value; \n   };\n\n   template<typename From, typename To>\n   class is_convertible_basic_impl<From, To, false>\n   {\n      typedef char one;\n      typedef int  two;\n\n      template<typename To1>\n      static void test_aux(To1);\n\n      template<typename From1, typename To1>\n      static decltype(test_aux<To1>(boost::declval<From1>()), one()) test(int);\n\n      template<typename, typename>\n      static two test(...);\n\n   public:\n      static const bool value = sizeof(test<From, To>(0)) == 1;\n   };\n\n#elif defined(__BORLANDC__) && (__BORLANDC__ < 0x560)\n//\n// special version for Borland compilers\n// this version breaks when used for some\n// UDT conversions:\n//\ntemplate <typename From, typename To>\nstruct is_convertible_impl\n{\n#pragma option push -w-8074\n    // This workaround for Borland breaks the EDG C++ frontend,\n    // so we only use it for Borland.\n    template <typename T> struct checker\n    {\n        static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(...);\n        static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(T);\n    };\n\n    static typename add_lvalue_reference<From>::type  _m_from;\n    static bool const value = sizeof( checker<To>::_m_check(_m_from) )\n        == sizeof(::boost::type_traits::yes_type);\n#pragma option pop\n};\n\n#elif defined(__GNUC__) || defined(__BORLANDC__) && (__BORLANDC__ < 0x600)\n// special version for gcc compiler + recent Borland versions\n// note that this does not pass UDT's through (...)\n\nstruct any_conversion\n{\n    template <typename T> any_conversion(const volatile T&);\n    template <typename T> any_conversion(const T&);\n    template <typename T> any_conversion(volatile T&);\n    template <typename T> any_conversion(T&);\n};\n\ntemplate <typename T> struct checker\n{\n    static boost::type_traits::no_type _m_check(any_conversion ...);\n    static boost::type_traits::yes_type _m_check(T, int);\n};\n\ntemplate <typename From, typename To>\nstruct is_convertible_basic_impl\n{\n    typedef typename add_lvalue_reference<From>::type lvalue_type;\n    typedef typename add_rvalue_reference<From>::type rvalue_type;\n    static lvalue_type _m_from;\n#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 6)))\n    static bool const value =\n        sizeof( boost::detail::checker<To>::_m_check(static_cast<rvalue_type>(_m_from), 0) )\n        == sizeof(::boost::type_traits::yes_type);\n#else\n    static bool const value =\n        sizeof( boost::detail::checker<To>::_m_check(_m_from, 0) )\n        == sizeof(::boost::type_traits::yes_type);\n#endif\n};\n\n#elif (defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 245) && !defined(__ICL)) \\\n      || defined(__IBMCPP__) || defined(__HP_aCC)\n//\n// This is *almost* an ideal world implementation as it doesn't rely\n// on undefined behaviour by passing UDT's through (...).\n// Unfortunately it doesn't quite pass all the tests for most compilers (sigh...)\n// Enable this for your compiler if is_convertible_test.cpp will compile it...\n//\n// Note we do not enable this for VC7.1, because even though it passes all the\n// type_traits tests it is known to cause problems when instantiation occurs\n// deep within the instantiation tree :-(\n//\nstruct any_conversion\n{\n    template <typename T> any_conversion(const volatile T&);\n    template <typename T> any_conversion(const T&);\n    template <typename T> any_conversion(volatile T&);\n    // we need this constructor to catch references to functions\n    // (which can not be cv-qualified):\n    template <typename T> any_conversion(T&);\n};\n\ntemplate <typename From, typename To>\nstruct is_convertible_basic_impl\n{\n    static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(any_conversion ...);\n    static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(To, int);\n    typedef typename add_lvalue_reference<From>::type lvalue_type;\n    typedef typename add_rvalue_reference<From>::type rvalue_type; \n    static lvalue_type _m_from;\n\n#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES\n    BOOST_STATIC_CONSTANT(bool, value =\n        sizeof( _m_check(static_cast<rvalue_type>(_m_from), 0) ) == sizeof(::boost::type_traits::yes_type)\n        );\n#else\n    BOOST_STATIC_CONSTANT(bool, value =\n        sizeof( _m_check(_m_from, 0) ) == sizeof(::boost::type_traits::yes_type)\n        );\n#endif\n};\n\n#elif defined(__DMC__)\n\nstruct any_conversion\n{\n    template <typename T> any_conversion(const volatile T&);\n    template <typename T> any_conversion(const T&);\n    template <typename T> any_conversion(volatile T&);\n    // we need this constructor to catch references to functions\n    // (which can not be cv-qualified):\n    template <typename T> any_conversion(T&);\n};\n\ntemplate <typename From, typename To>\nstruct is_convertible_basic_impl\n{\n    // Using '...' doesn't always work on Digital Mars. This version seems to.\n    template <class T>\n    static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(any_conversion,  float, T);\n    static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(To, int, int);\n    typedef typename add_lvalue_reference<From>::type lvalue_type;\n    typedef typename add_rvalue_reference<From>::type rvalue_type;\n    static lvalue_type _m_from;\n\n    // Static constants sometime cause the conversion of _m_from to To to be\n    // called. This doesn't happen with an enum.\n#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES\n    enum { value =\n        sizeof( _m_check(static_cast<rvalue_type>(_m_from), 0, 0) ) == sizeof(::boost::type_traits::yes_type)\n        };\n#else\n    enum { value =\n        sizeof( _m_check(_m_from, 0, 0) ) == sizeof(::boost::type_traits::yes_type)\n        };\n#endif\n};\n\n#elif defined(__MWERKS__)\n// \n// CW works with the technique implemented above for EDG, except when From\n// is a function type (or a reference to such a type), in which case\n// any_conversion won't be accepted as a valid conversion. We detect this\n// exceptional situation and channel it through an alternative algorithm.\n//\n\ntemplate <typename From, typename To,bool FromIsFunctionRef>\nstruct is_convertible_basic_impl_aux;\n\nstruct any_conversion\n{\n    template <typename T> any_conversion(const volatile T&);\n    template <typename T> any_conversion(const T&);\n    template <typename T> any_conversion(volatile T&);\n    template <typename T> any_conversion(T&);\n};\n\ntemplate <typename From, typename To>\nstruct is_convertible_basic_impl_aux<From,To,false /*FromIsFunctionRef*/>\n{\n    static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(any_conversion ...);\n    static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(To, int);\n    typedef typename add_lvalue_reference<From>::type lvalue_type;\n    typedef typename add_rvalue_reference<From>::type rvalue_type; \n    static lvalue_type _m_from;\n\n#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES\n    BOOST_STATIC_CONSTANT(bool, value =\n        sizeof( _m_check(static_cast<rvalue_type>(_m_from), 0) ) == sizeof(::boost::type_traits::yes_type)\n        );\n#else\n    BOOST_STATIC_CONSTANT(bool, value =\n        sizeof( _m_check(_m_from, 0) ) == sizeof(::boost::type_traits::yes_type)\n        );\n#endif\n};\n\ntemplate <typename From, typename To>\nstruct is_convertible_basic_impl_aux<From,To,true /*FromIsFunctionRef*/>\n{\n    static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(...);\n    static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(To);\n    typedef typename add_lvalue_reference<From>::type lvalue_type;\n    typedef typename add_rvalue_reference<From>::type rvalue_type;\n    static lvalue_type _m_from;\n#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES\n    BOOST_STATIC_CONSTANT(bool, value =\n        sizeof( _m_check(static_cast<rvalue_type>(_m_from)) ) == sizeof(::boost::type_traits::yes_type)\n        );\n#else\n    BOOST_STATIC_CONSTANT(bool, value =\n        sizeof( _m_check(_m_from) ) == sizeof(::boost::type_traits::yes_type)\n        );\n#endif\n};\n\ntemplate <typename From, typename To>\nstruct is_convertible_basic_impl:\n  is_convertible_basic_impl_aux<\n    From,To,\n    ::boost::is_function<typename ::boost::remove_reference<From>::type>::value\n  >\n{};\n\n#else\n//\n// This version seems to work pretty well for a wide spectrum of compilers,\n// however it does rely on undefined behaviour by passing UDT's through (...).\n//\n\n//Workaround for old compilers like MSVC 7.1 to avoid\n//forming a reference to an array of unknown bound\ntemplate <typename From>\nstruct is_convertible_basic_impl_add_lvalue_reference\n   : add_lvalue_reference<From>\n{};\n\ntemplate <typename From>\nstruct is_convertible_basic_impl_add_lvalue_reference<From[]>\n{\n    typedef From type [];\n};\n\ntemplate <typename From, typename To>\nstruct is_convertible_basic_impl\n{\n    static ::boost::type_traits::no_type BOOST_TT_DECL _m_check(...);\n    static ::boost::type_traits::yes_type BOOST_TT_DECL _m_check(To);\n    typedef typename is_convertible_basic_impl_add_lvalue_reference<From>::type lvalue_type;\n    static lvalue_type _m_from;\n#ifdef BOOST_MSVC\n#pragma warning(push)\n#pragma warning(disable:4244)\n#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)\n#pragma warning(disable:6334)\n#endif\n#endif\n#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES\n    typedef typename add_rvalue_reference<From>::type rvalue_type; \n    BOOST_STATIC_CONSTANT(bool, value =\n        sizeof( _m_check(static_cast<rvalue_type>(_m_from)) ) == sizeof(::boost::type_traits::yes_type)\n        );\n#else\n    BOOST_STATIC_CONSTANT(bool, value =\n        sizeof( _m_check(_m_from) ) == sizeof(::boost::type_traits::yes_type)\n        );\n#endif\n#ifdef BOOST_MSVC\n#pragma warning(pop)\n#endif\n};\n\n#endif // is_convertible_impl\n\n#if defined(__DMC__)\n// As before, a static constant sometimes causes errors on Digital Mars.\ntemplate <typename From, typename To>\nstruct is_convertible_impl\n{\n    enum { \n       value = ( ::boost::detail::is_convertible_basic_impl<From,To>::value && ! ::boost::is_array<To>::value && ! ::boost::is_function<To>::value) \n    };\n};\n#elif !defined(__BORLANDC__) || __BORLANDC__ > 0x551\ntemplate <typename From, typename To>\nstruct is_convertible_impl\n{\n   BOOST_STATIC_CONSTANT(bool, value = ( ::boost::detail::is_convertible_basic_impl<From, To>::value && !::boost::is_array<To>::value && !::boost::is_function<To>::value));\n};\n#endif\n\ntemplate <bool trivial1, bool trivial2, bool abstract_target>\nstruct is_convertible_impl_select\n{\n   template <class From, class To>\n   struct rebind\n   {\n      typedef is_convertible_impl<From, To> type;\n   };\n};\n\ntemplate <>\nstruct is_convertible_impl_select<true, true, false>\n{\n   template <class From, class To>\n   struct rebind\n   {\n      typedef true_type type;\n   };\n};\n\ntemplate <>\nstruct is_convertible_impl_select<false, false, true>\n{\n   template <class From, class To>\n   struct rebind\n   {\n      typedef false_type type;\n   };\n};\n\ntemplate <>\nstruct is_convertible_impl_select<true, false, true>\n{\n   template <class From, class To>\n   struct rebind\n   {\n      typedef false_type type;\n   };\n};\n\ntemplate <typename From, typename To>\nstruct is_convertible_impl_dispatch_base\n{\n#if !BOOST_WORKAROUND(__HP_aCC, < 60700)\n   typedef is_convertible_impl_select< \n      ::boost::is_arithmetic<From>::value, \n      ::boost::is_arithmetic<To>::value,\n#if !defined(BOOST_NO_IS_ABSTRACT) && !defined(BOOST_TT_CXX11_IS_CONVERTIBLE)\n      // We need to filter out abstract types, only if we don't have a strictly conforming C++11 version:\n      ::boost::is_abstract<To>::value\n#else\n      false\n#endif\n   > selector;\n#else\n   typedef is_convertible_impl_select<false, false, false> selector;\n#endif\n   typedef typename selector::template rebind<From, To> isc_binder;\n   typedef typename isc_binder::type type;\n};\n\ntemplate <typename From, typename To>\nstruct is_convertible_impl_dispatch \n   : public is_convertible_impl_dispatch_base<From, To>::type\n{};\n\n//\n// Now add the full and partial specialisations\n// for void types, these are common to all the\n// implementation above:\n//\n#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS\n\ntemplate <> struct is_convertible_impl_dispatch<void, void> : public true_type{};\ntemplate <> struct is_convertible_impl_dispatch<void, void const> : public true_type{};\ntemplate <> struct is_convertible_impl_dispatch<void, void const volatile> : public true_type{};\ntemplate <> struct is_convertible_impl_dispatch<void, void volatile> : public true_type{};\n\ntemplate <> struct is_convertible_impl_dispatch<void const, void> : public true_type{};\ntemplate <> struct is_convertible_impl_dispatch<void const, void const> : public true_type{};\ntemplate <> struct is_convertible_impl_dispatch<void const, void const volatile> : public true_type{};\ntemplate <> struct is_convertible_impl_dispatch<void const, void volatile> : public true_type{};\n\ntemplate <> struct is_convertible_impl_dispatch<void const volatile, void> : public true_type{};\ntemplate <> struct is_convertible_impl_dispatch<void const volatile, void const> : public true_type{};\ntemplate <> struct is_convertible_impl_dispatch<void const volatile, void const volatile> : public true_type{};\ntemplate <> struct is_convertible_impl_dispatch<void const volatile, void volatile> : public true_type{};\n\ntemplate <> struct is_convertible_impl_dispatch<void volatile, void> : public true_type{};\ntemplate <> struct is_convertible_impl_dispatch<void volatile, void const> : public true_type{};\ntemplate <> struct is_convertible_impl_dispatch<void volatile, void const volatile> : public true_type{};\ntemplate <> struct is_convertible_impl_dispatch<void volatile, void volatile> : public true_type{};\n\n#else\ntemplate <> struct is_convertible_impl_dispatch<void, void> : public true_type{};\n#endif // BOOST_NO_CV_VOID_SPECIALIZATIONS\n\ntemplate <class To> struct is_convertible_impl_dispatch<void, To> : public false_type{};\ntemplate <class From> struct is_convertible_impl_dispatch<From, void> : public false_type{};\n\n#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS\ntemplate <class To> struct is_convertible_impl_dispatch<void const, To> : public false_type{};\ntemplate <class From> struct is_convertible_impl_dispatch<From, void const> : public false_type{};\ntemplate <class To> struct is_convertible_impl_dispatch<void const volatile, To> : public false_type{};\ntemplate <class From> struct is_convertible_impl_dispatch<From, void const volatile> : public false_type{};\ntemplate <class To> struct is_convertible_impl_dispatch<void volatile, To> : public false_type{};\ntemplate <class From> struct is_convertible_impl_dispatch<From, void volatile> : public false_type{};\n#endif\n\n} // namespace detail\n\ntemplate <class From, class To> \nstruct is_convertible : public integral_constant<bool, ::boost::detail::is_convertible_impl_dispatch<From, To>::value> {};\n\n#else\n\ntemplate <class From, class To>\nstruct is_convertible : public integral_constant<bool, BOOST_IS_CONVERTIBLE(From, To)> {};\n\n#endif\n\n} // namespace boost\n\n#endif // BOOST_TT_IS_CONVERTIBLE_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/type_traits/is_destructible.hpp",
    "content": "\n//  (C) Copyright John Maddock 2015.\n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n#ifndef BOOST_TT_IS_DESTRUCTIBLE_HPP_INCLUDED\n#define BOOST_TT_IS_DESTRUCTIBLE_HPP_INCLUDED\n\n#include <boost/type_traits/integral_constant.hpp>\n#include <boost/detail/workaround.hpp>\n\n#if !defined(BOOST_NO_CXX11_DECLTYPE) && !BOOST_WORKAROUND(BOOST_MSVC, < 1800)\n\n#include <boost/type_traits/detail/yes_no_type.hpp>\n#include <boost/type_traits/declval.hpp>\n\nnamespace boost{\n\n   namespace detail{\n\n      struct is_destructible_imp\n      {\n         template<typename T, typename = decltype(boost::declval<T&>().~T())>\n         static boost::type_traits::yes_type test(int);\n         template<typename>\n         static boost::type_traits::no_type test(...);\n      };\n\n   }\n\n   template <class T> struct is_destructible : public integral_constant<bool, sizeof(detail::is_destructible_imp::test<T>(0)) == sizeof(boost::type_traits::yes_type)>{};\n\n#else\n\n#include <boost/type_traits/is_pod.hpp>\n#include <boost/type_traits/is_class.hpp>\n\nnamespace boost{\n\n   // We don't know how to implement this:\n   template <class T> struct is_destructible : public integral_constant<bool, is_pod<T>::value || is_class<T>::value>{};\n#endif\n\n   template <> struct is_destructible<void> : public false_type{};\n   template <> struct is_destructible<void const> : public false_type{};\n   template <> struct is_destructible<void volatile> : public false_type{};\n   template <> struct is_destructible<void const volatile> : public false_type{};\n   template <class T> struct is_destructible<T&> : public is_destructible<T>{};\n#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES\n   template <class T> struct is_destructible<T&&> : public is_destructible<T>{};\n#endif\n   template <class T, std::size_t N> struct is_destructible<T[N]> : public is_destructible<T>{};\n   template <class T> struct is_destructible<T[]> : public is_destructible<T>{};\n\n} // namespace boost\n\n#endif // BOOST_TT_IS_DESTRUCTIBLE_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/type_traits/is_enum.hpp",
    "content": "\n//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard\n//  Hinnant & John Maddock 2000.  \n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n\n#ifndef BOOST_TT_IS_ENUM_HPP_INCLUDED\n#define BOOST_TT_IS_ENUM_HPP_INCLUDED\n\n#include <boost/type_traits/intrinsics.hpp>\n#include <boost/type_traits/integral_constant.hpp>\n#ifndef BOOST_IS_ENUM\n#include <boost/type_traits/add_reference.hpp>\n#include <boost/type_traits/is_arithmetic.hpp>\n#include <boost/type_traits/is_reference.hpp>\n#include <boost/type_traits/is_convertible.hpp>\n#include <boost/type_traits/is_array.hpp>\n#ifdef __GNUC__\n#include <boost/type_traits/is_function.hpp>\n#endif\n#include <boost/type_traits/detail/config.hpp>\n#if defined(BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION) \n#  include <boost/type_traits/is_class.hpp>\n#  include <boost/type_traits/is_union.hpp>\n#endif\n#endif\n\nnamespace boost {\n\n#ifndef BOOST_IS_ENUM\n#if !(defined(__BORLANDC__) && (__BORLANDC__ <= 0x551))\n\nnamespace detail {\n\n#if defined(BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION) \n\ntemplate <typename T>\nstruct is_class_or_union\n{\n   BOOST_STATIC_CONSTANT(bool, value = ::boost::is_class<T>::value || ::boost::is_union<T>::value);\n};\n\n#else\n\ntemplate <typename T>\nstruct is_class_or_union\n{\n# if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x581))// we simply can't detect it this way.\n    BOOST_STATIC_CONSTANT(bool, value = false);\n# else\n    template <class U> static ::boost::type_traits::yes_type is_class_or_union_tester(void(U::*)(void));\n\n#  if BOOST_WORKAROUND(__MWERKS__, <= 0x3000) // no SFINAE\n    static ::boost::type_traits::no_type is_class_or_union_tester(...);\n    BOOST_STATIC_CONSTANT(\n        bool, value = sizeof(is_class_or_union_tester(0)) == sizeof(::boost::type_traits::yes_type));\n#  else\n    template <class U>\n    static ::boost::type_traits::no_type is_class_or_union_tester(...);\n    BOOST_STATIC_CONSTANT(\n        bool, value = sizeof(is_class_or_union_tester<T>(0)) == sizeof(::boost::type_traits::yes_type));\n#  endif\n# endif\n};\n#endif\n\nstruct int_convertible\n{\n    int_convertible(int);\n};\n\n// Don't evaluate convertibility to int_convertible unless the type\n// is non-arithmetic. This suppresses warnings with GCC.\ntemplate <bool is_typename_arithmetic_or_reference = true>\nstruct is_enum_helper\n{\n    template <typename T> struct type\n    {\n        BOOST_STATIC_CONSTANT(bool, value = false);\n    };\n};\n\ntemplate <>\nstruct is_enum_helper<false>\n{\n    template <typename T> struct type\n    {\n       static const bool value = ::boost::is_convertible<typename boost::add_reference<T>::type, ::boost::detail::int_convertible>::value;\n    };\n};\n\ntemplate <typename T> struct is_enum_impl\n{\n   //typedef ::boost::add_reference<T> ar_t;\n   //typedef typename ar_t::type r_type;\n\n#if defined(__GNUC__)\n\n#ifdef BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION\n    \n   // We MUST check for is_class_or_union on conforming compilers in\n   // order to correctly deduce that noncopyable types are not enums\n   // (dwa 2002/04/15)...\n   BOOST_STATIC_CONSTANT(bool, selector =\n           ::boost::is_arithmetic<T>::value\n         || ::boost::is_reference<T>::value\n         || ::boost::is_function<T>::value\n         || is_class_or_union<T>::value\n         || is_array<T>::value);\n#else\n   // ...however, not checking is_class_or_union on non-conforming\n   // compilers prevents a dependency recursion.\n   BOOST_STATIC_CONSTANT(bool, selector =\n           ::boost::is_arithmetic<T>::value\n         || ::boost::is_reference<T>::value\n         || ::boost::is_function<T>::value\n         || is_array<T>::value);\n#endif // BOOST_TT_HAS_CONFORMING_IS_CLASS_IMPLEMENTATION\n\n#else // !defined(__GNUC__):\n    \n   BOOST_STATIC_CONSTANT(bool, selector =\n           ::boost::is_arithmetic<T>::value\n         || ::boost::is_reference<T>::value\n         || is_class_or_union<T>::value\n         || is_array<T>::value);\n    \n#endif\n\n#if BOOST_WORKAROUND(__BORLANDC__, < 0x600)\n    typedef ::boost::detail::is_enum_helper<\n          ::boost::detail::is_enum_impl<T>::selector\n        > se_t;\n#else\n    typedef ::boost::detail::is_enum_helper<selector> se_t;\n#endif\n\n    typedef typename se_t::template type<T> helper;\n    BOOST_STATIC_CONSTANT(bool, value = helper::value);\n};\n\n} // namespace detail\n\ntemplate <class T> struct is_enum : public integral_constant<bool, ::boost::detail::is_enum_impl<T>::value> {};\n\n#else // __BORLANDC__\n//\n// buggy is_convertible prevents working\n// implementation of is_enum:\ntemplate <class T> struct is_enum : public integral_constant<bool, false> {};\n\n#endif\n\n#else // BOOST_IS_ENUM\n\ntemplate <class T> struct is_enum : public integral_constant<bool, BOOST_IS_ENUM(T)> {};\n\n#endif\n\n} // namespace boost\n\n#endif // BOOST_TT_IS_ENUM_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/type_traits/is_floating_point.hpp",
    "content": "//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000-2005.\n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n#ifndef BOOST_TYPE_TRAITS_IS_FLOATING_HPP_INCLUDED\n#define BOOST_TYPE_TRAITS_IS_FLOATING_HPP_INCLUDED\n\n#include <boost/type_traits/integral_constant.hpp>\n\nnamespace boost {\n\n//* is a type T a floating-point type described in the standard (3.9.1p8)\n   template <class T> struct is_floating_point : public false_type{};\n   template <class T> struct is_floating_point<const T> : public is_floating_point<T>{};\n   template <class T> struct is_floating_point<volatile const T> : public is_floating_point<T>{};\n   template <class T> struct is_floating_point<volatile T> : public is_floating_point<T>{};\n   template<> struct is_floating_point<float> : public true_type{};\n   template<> struct is_floating_point<double> : public true_type{};\n   template<> struct is_floating_point<long double> : public true_type{};\n   \n#if defined(BOOST_HAS_FLOAT128)\n   template<> struct is_floating_point<__float128> : public true_type{};\n#endif\n\n} // namespace boost\n\n#endif // BOOST_TYPE_TRAITS_IS_FLOAT_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/type_traits/is_function.hpp",
    "content": "\n//  Copyright 2000 John Maddock (john@johnmaddock.co.uk)\n//  Copyright 2002 Aleksey Gurtovoy (agurtovoy@meta-comm.com)\n//\n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n#ifndef BOOST_TT_IS_FUNCTION_HPP_INCLUDED\n#define BOOST_TT_IS_FUNCTION_HPP_INCLUDED\n\n#include <boost/type_traits/is_reference.hpp>\n#include <boost/type_traits/detail/config.hpp>\n\n#if !defined(BOOST_TT_TEST_MS_FUNC_SIGS)\n#   include <boost/type_traits/detail/is_function_ptr_helper.hpp>\n#else\n#   include <boost/type_traits/detail/is_function_ptr_tester.hpp>\n#   include <boost/type_traits/detail/yes_no_type.hpp>\n#endif\n\n// is a type a function?\n// Please note that this implementation is unnecessarily complex:\n// we could just use !is_convertible<T*, const volatile void*>::value,\n// except that some compilers erroneously allow conversions from\n// function pointers to void*.\n\nnamespace boost {\n\n#if !defined( __CODEGEARC__ )\n\nnamespace detail {\n\n#if !defined(BOOST_TT_TEST_MS_FUNC_SIGS)\ntemplate<bool is_ref = true>\nstruct is_function_chooser\n{\n   template< typename T > struct result_\n      : public false_type {};\n};\n\ntemplate <>\nstruct is_function_chooser<false>\n{\n    template< typename T > struct result_\n        : public ::boost::type_traits::is_function_ptr_helper<T*> {};\n};\n\ntemplate <typename T>\nstruct is_function_impl\n    : public is_function_chooser< ::boost::is_reference<T>::value >\n        ::BOOST_NESTED_TEMPLATE result_<T>\n{\n};\n\n#else\n\ntemplate <typename T>\nstruct is_function_impl\n{\n#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)\n#pragma warning(push)\n#pragma warning(disable:6334)\n#endif\n    static T* t;\n    BOOST_STATIC_CONSTANT(\n        bool, value = sizeof(::boost::type_traits::is_function_ptr_tester(t))\n        == sizeof(::boost::type_traits::yes_type)\n        );\n#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)\n#pragma warning(pop)\n#endif\n};\n\ntemplate <typename T>\nstruct is_function_impl<T&> : public false_type\n{};\n#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES\ntemplate <typename T>\nstruct is_function_impl<T&&> : public false_type\n{};\n#endif\n\n#endif\n\n} // namespace detail\n\n#endif // !defined( __CODEGEARC__ )\n\n#if defined( __CODEGEARC__ )\ntemplate <class T> struct is_function : integral_constant<bool, __is_function(T)> {};\n#else\ntemplate <class T> struct is_function : integral_constant<bool, ::boost::detail::is_function_impl<T>::value> {};\n#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES\ntemplate <class T> struct is_function<T&&> : public false_type {};\n#endif\n#endif\n} // namespace boost\n\n#endif // BOOST_TT_IS_FUNCTION_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/type_traits/is_integral.hpp",
    "content": "\n//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.\n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n#ifndef BOOST_TT_IS_INTEGRAL_HPP_INCLUDED\n#define BOOST_TT_IS_INTEGRAL_HPP_INCLUDED\n\n#include <boost/config.hpp>\n#include <boost/type_traits/integral_constant.hpp>\n\nnamespace boost {\n\n#if defined( __CODEGEARC__ )\n   template <class T>\n   struct is_integral : public integral_constant<bool, __is_integral(T)> {};\n#else\n\ntemplate <class T> struct is_integral : public false_type {};\ntemplate <class T> struct is_integral<const T> : public is_integral<T> {};\ntemplate <class T> struct is_integral<volatile const T> : public is_integral<T>{};\ntemplate <class T> struct is_integral<volatile T> : public is_integral<T>{};\n\n//* is a type T an [cv-qualified-] integral type described in the standard (3.9.1p3)\n// as an extension we include long long, as this is likely to be added to the\n// standard at a later date\ntemplate<> struct is_integral<unsigned char> : public true_type {};\ntemplate<> struct is_integral<unsigned short> : public true_type{};\ntemplate<> struct is_integral<unsigned int> : public true_type{};\ntemplate<> struct is_integral<unsigned long> : public true_type{};\n\ntemplate<> struct is_integral<signed char> : public true_type{};\ntemplate<> struct is_integral<short> : public true_type{};\ntemplate<> struct is_integral<int> : public true_type{};\ntemplate<> struct is_integral<long> : public true_type{};\n\ntemplate<> struct is_integral<char> : public true_type{};\ntemplate<> struct is_integral<bool> : public true_type{};\n\n#ifndef BOOST_NO_INTRINSIC_WCHAR_T\n// If the following line fails to compile and you're using the Intel\n// compiler, see http://lists.boost.org/MailArchives/boost-users/msg06567.php,\n// and define BOOST_NO_INTRINSIC_WCHAR_T on the command line.\ntemplate<> struct is_integral<wchar_t> : public true_type{};\n#endif\n\n// Same set of integral types as in boost/type_traits/integral_promotion.hpp.\n// Please, keep in sync. -- Alexander Nasonov\n#if (defined(BOOST_INTEL_CXX_VERSION) && defined(_MSC_VER) && (BOOST_INTEL_CXX_VERSION <= 600)) \\\n    || (defined(__BORLANDC__) && (__BORLANDC__ == 0x600) && (_MSC_VER < 1300))\ntemplate<> struct is_integral<unsigned __int8> : public true_type{};\ntemplate<> struct is_integral<unsigned __int16> : public true_type{};\ntemplate<> struct is_integral<unsigned __int32> : public true_type{};\ntemplate<> struct is_integral<__int8> : public true_type{};\ntemplate<> struct is_integral<__int16> : public true_type{};\ntemplate<> struct is_integral<__int32> : public true_type{};\n#ifdef __BORLANDC__\ntemplate<> struct is_integral<unsigned __int64> : public true_type{};\ntemplate<> struct is_integral<__int64> : public true_type{};\n#endif\n#endif\n\n# if defined(BOOST_HAS_LONG_LONG)\ntemplate<> struct is_integral< ::boost::ulong_long_type> : public true_type{};\ntemplate<> struct is_integral< ::boost::long_long_type> : public true_type{};\n#elif defined(BOOST_HAS_MS_INT64)\ntemplate<> struct is_integral<unsigned __int64> : public true_type{};\ntemplate<> struct is_integral<__int64> : public true_type{};\n#endif\n        \n#ifdef BOOST_HAS_INT128\ntemplate<> struct is_integral<boost::int128_type> : public true_type{};\ntemplate<> struct is_integral<boost::uint128_type> : public true_type{};\n#endif\n#ifndef BOOST_NO_CXX11_CHAR16_T\ntemplate<> struct is_integral<char16_t> : public true_type{};\n#endif\n#ifndef BOOST_NO_CXX11_CHAR32_T\ntemplate<> struct is_integral<char32_t> : public true_type{};\n#endif\n\n#endif  // non-CodeGear implementation\n\n} // namespace boost\n\n#endif // BOOST_TT_IS_INTEGRAL_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/type_traits/is_lvalue_reference.hpp",
    "content": "\n//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, \n//      Howard Hinnant and John Maddock 2000. \n//  (C) Copyright Mat Marcus, Jesse Jones and Adobe Systems Inc 2001\n\n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n//    Fixed is_pointer, is_lvalue_reference, is_const, is_volatile, is_same, \n//    is_member_pointer based on the Simulated Partial Specialization work \n//    of Mat Marcus and Jesse Jones. See  http://opensource.adobe.com or \n//    http://groups.yahoo.com/group/boost/message/5441 \n//    Some workarounds in here use ideas suggested from \"Generic<Programming>: \n//    Mappings between Types and Values\" \n//    by Andrei Alexandrescu (see http://www.cuj.com/experts/1810/alexandr.html).\n\n\n#ifndef BOOST_TT_IS_LVALUE_REFERENCE_HPP_INCLUDED\n#define BOOST_TT_IS_LVALUE_REFERENCE_HPP_INCLUDED\n\n#include <boost/type_traits/integral_constant.hpp>\n\nnamespace boost {\n\n#if defined( __CODEGEARC__ )\n   template <class T> struct is_lvalue_reference : public integral_constant<bool, __is_reference(T)>{};\n#else\n\n   template <class T> struct is_lvalue_reference : public false_type{};\n   template <class T> struct is_lvalue_reference<T&> : public true_type{};\n\n#if  defined(BOOST_ILLEGAL_CV_REFERENCES)\n// these are illegal specialisations; cv-qualifies applied to\n// references have no effect according to [8.3.2p1],\n// C++ Builder requires them though as it treats cv-qualified\n// references as distinct types...\n   template <class T> struct is_lvalue_reference<T&const> : public true_type{};\n   template <class T> struct is_lvalue_reference<T&volatile> : public true_type{};\n   template <class T> struct is_lvalue_reference<T&const volatile> : public true_type{};\n#endif\n\n#endif\n\n} // namespace boost\n\n#endif // BOOST_TT_IS_REFERENCE_HPP_INCLUDED\n\n"
  },
  {
    "path": "benchmarks/boost/type_traits/is_member_function_pointer.hpp",
    "content": "\n//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard\n//  Hinnant & John Maddock 2000.  \n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n\n#ifndef BOOST_TT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED\n#define BOOST_TT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED\n\n#include <boost/type_traits/detail/config.hpp>\n#include <boost/detail/workaround.hpp>\n\n#if !BOOST_WORKAROUND(__BORLANDC__, < 0x600) && !defined(BOOST_TT_TEST_MS_FUNC_SIGS)\n   //\n   // Note: we use the \"workaround\" version for MSVC because it works for \n   // __stdcall etc function types, where as the partial specialisation\n   // version does not do so.\n   //\n#   include <boost/type_traits/detail/is_mem_fun_pointer_impl.hpp>\n#   include <boost/type_traits/remove_cv.hpp>\n#   include <boost/type_traits/integral_constant.hpp>\n#else\n#   include <boost/type_traits/is_reference.hpp>\n#   include <boost/type_traits/is_array.hpp>\n#   include <boost/type_traits/detail/yes_no_type.hpp>\n#   include <boost/type_traits/detail/is_mem_fun_pointer_tester.hpp>\n#endif\n\nnamespace boost {\n\n#if defined( __CODEGEARC__ )\ntemplate <class T> struct is_member_function_pointer : public integral_constant<bool, __is_member_function_pointer( T )> {};\n#elif !BOOST_WORKAROUND(__BORLANDC__, < 0x600) && !defined(BOOST_TT_TEST_MS_FUNC_SIGS)\n\ntemplate <class T> struct is_member_function_pointer \n   : public ::boost::integral_constant<bool, ::boost::type_traits::is_mem_fun_pointer_impl<typename remove_cv<T>::type>::value>{};\n\n#else\n\nnamespace detail {\n\n#ifndef __BORLANDC__\n\ntemplate <bool>\nstruct is_mem_fun_pointer_select\n{\n   template <class T> struct result_ : public false_type{};\n};\n\ntemplate <>\nstruct is_mem_fun_pointer_select<false>\n{\n    template <typename T> struct result_\n    {\n#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)\n#pragma warning(push)\n#pragma warning(disable:6334)\n#endif\n        static T* make_t;\n        typedef result_<T> self_type;\n\n        BOOST_STATIC_CONSTANT(\n            bool, value = (\n                1 == sizeof(::boost::type_traits::is_mem_fun_pointer_tester(self_type::make_t))\n            ));\n#if BOOST_WORKAROUND(BOOST_MSVC_FULL_VER, >= 140050000)\n#pragma warning(pop)\n#endif\n    };\n};\n\ntemplate <typename T>\nstruct is_member_function_pointer_impl\n    : public is_mem_fun_pointer_select< \n      ::boost::is_reference<T>::value || ::boost::is_array<T>::value>::template result_<T>{};\n\ntemplate <typename T>\nstruct is_member_function_pointer_impl<T&> : public false_type{};\n\n#else // Borland C++\n\ntemplate <typename T>\nstruct is_member_function_pointer_impl\n{\n   static T* m_t;\n   BOOST_STATIC_CONSTANT(\n              bool, value =\n               (1 == sizeof(type_traits::is_mem_fun_pointer_tester(m_t))) );\n};\n\ntemplate <typename T>\nstruct is_member_function_pointer_impl<T&>\n{\n   BOOST_STATIC_CONSTANT(bool, value = false);\n};\n\n#endif\n\ntemplate<> struct is_member_function_pointer_impl<void> : public false_type{};\n#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS\ntemplate<> struct is_member_function_pointer_impl<void const> : public false_type{};\ntemplate<> struct is_member_function_pointer_impl<void const volatile> : public false_type{};\ntemplate<> struct is_member_function_pointer_impl<void volatile> : public false_type{};\n#endif\n\n} // namespace detail\n\ntemplate <class T>\nstruct is_member_function_pointer\n   : public integral_constant<bool, ::boost::detail::is_member_function_pointer_impl<T>::value>{};\n\n#endif\n\n} // namespace boost\n\n#endif // BOOST_TT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/type_traits/is_member_pointer.hpp",
    "content": "\n//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, \n//      Howard Hinnant and John Maddock 2000. \n//  (C) Copyright Mat Marcus, Jesse Jones and Adobe Systems Inc 2001\n\n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n//    Fixed is_pointer, is_reference, is_const, is_volatile, is_same, \n//    is_member_pointer based on the Simulated Partial Specialization work \n//    of Mat Marcus and Jesse Jones. See  http://opensource.adobe.com or \n//    http://groups.yahoo.com/group/boost/message/5441 \n//    Some workarounds in here use ideas suggested from \"Generic<Programming>: \n//    Mappings between Types and Values\" \n//    by Andrei Alexandrescu (see http://www.cuj.com/experts/1810/alexandr.html).\n\n\n#ifndef BOOST_TT_IS_MEMBER_POINTER_HPP_INCLUDED\n#define BOOST_TT_IS_MEMBER_POINTER_HPP_INCLUDED\n\n#include <boost/detail/workaround.hpp>\n#include <boost/type_traits/is_member_function_pointer.hpp>\n\nnamespace boost {\n\n#if defined( __CODEGEARC__ )\ntemplate <class T> struct is_member_pointer : public integral_constant<bool, __is_member_pointer(T)>{};\n#else\ntemplate <class T> struct is_member_pointer : public integral_constant<bool, ::boost::is_member_function_pointer<T>::value>{};\ntemplate <class T, class U> struct is_member_pointer<U T::* > : public true_type{};\n\n#if !BOOST_WORKAROUND(__MWERKS__,<=0x3003) && !BOOST_WORKAROUND(__IBMCPP__, <=600)\ntemplate <class T, class U> struct is_member_pointer<U T::*const> : public true_type{};\ntemplate <class T, class U> struct is_member_pointer<U T::*const volatile> : public true_type{};\ntemplate <class T, class U> struct is_member_pointer<U T::*volatile> : public true_type{};\n#endif\n\n#endif\n\n} // namespace boost\n\n#endif // BOOST_TT_IS_MEMBER_POINTER_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/type_traits/is_pod.hpp",
    "content": "\n//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.\n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n#ifndef BOOST_TT_IS_POD_HPP_INCLUDED\n#define BOOST_TT_IS_POD_HPP_INCLUDED\n\n#include <boost/type_traits/detail/config.hpp>\n#include <boost/type_traits/is_void.hpp>\n#include <boost/type_traits/is_scalar.hpp>\n#include <boost/type_traits/intrinsics.hpp>\n\n#ifdef __SUNPRO_CC\n#include <boost/type_traits/is_function.hpp>\n#endif\n\n#include <cstddef>\n\n#ifndef BOOST_IS_POD\n#define BOOST_INTERNAL_IS_POD(T) false\n#else\n#define BOOST_INTERNAL_IS_POD(T) BOOST_IS_POD(T)\n#endif\n\nnamespace boost {\n\n// forward declaration, needed by 'is_pod_array_helper' template below\ntemplate< typename T > struct is_POD;\n\ntemplate <typename T> struct is_pod\n: public integral_constant<bool, ::boost::is_scalar<T>::value || ::boost::is_void<T>::value || BOOST_INTERNAL_IS_POD(T)>\n{};\n\n#if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS)\ntemplate <typename T, std::size_t sz> struct is_pod<T[sz]> : public is_pod<T>{};\n#endif\n\n\n// the following help compilers without partial specialization support:\ntemplate<> struct is_pod<void> : public true_type{};\n\n#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS\ntemplate<> struct is_pod<void const> : public true_type{};\ntemplate<> struct is_pod<void const volatile> : public true_type{};\ntemplate<> struct is_pod<void volatile> : public true_type{};\n#endif\n\ntemplate<class T> struct is_POD : public is_pod<T>{};\n\n} // namespace boost\n\n#undef BOOST_INTERNAL_IS_POD\n\n#endif // BOOST_TT_IS_POD_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/type_traits/is_pointer.hpp",
    "content": "\n//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, \n//      Howard Hinnant and John Maddock 2000. \n//  (C) Copyright Mat Marcus, Jesse Jones and Adobe Systems Inc 2001\n\n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n//    Fixed is_pointer, is_reference, is_const, is_volatile, is_same, \n//    is_member_pointer based on the Simulated Partial Specialization work \n//    of Mat Marcus and Jesse Jones. See  http://opensource.adobe.com or \n//    http://groups.yahoo.com/group/boost/message/5441 \n//    Some workarounds in here use ideas suggested from \"Generic<Programming>: \n//    Mappings between Types and Values\" \n//    by Andrei Alexandrescu (see http://www.cuj.com/experts/1810/alexandr.html).\n\n\n#ifndef BOOST_TT_IS_POINTER_HPP_INCLUDED\n#define BOOST_TT_IS_POINTER_HPP_INCLUDED\n\n#include <boost/type_traits/integral_constant.hpp>\n\nnamespace boost {\n\n#if defined( __CODEGEARC__ )\ntemplate <class T> struct is_pointer : public integral_constant<bool, __is_pointer(T)>{};\n#else\ntemplate <class T> struct is_pointer : public false_type{};\ntemplate <class T> struct is_pointer<T*> : public true_type{};\ntemplate <class T> struct is_pointer<T*const> : public true_type{};\ntemplate <class T> struct is_pointer<T*const volatile> : public true_type{};\ntemplate <class T> struct is_pointer<T*volatile> : public true_type{};\n\n#ifdef BOOST_MSVC\ntemplate <class T> struct is_pointer<T const> : public is_pointer<T>{};\ntemplate <class T> struct is_pointer<T const volatile> : public is_pointer<T>{};\ntemplate <class T> struct is_pointer<T volatile> : public is_pointer<T>{};\n#endif\n\n#endif\n\n} // namespace boost\n\n#endif // BOOST_TT_IS_POINTER_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/type_traits/is_polymorphic.hpp",
    "content": "//  (C) Copyright John Maddock 2000. \n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n#ifndef BOOST_TT_IS_POLYMORPHIC_HPP\n#define BOOST_TT_IS_POLYMORPHIC_HPP\n\n#include <boost/type_traits/intrinsics.hpp>\n#include <boost/type_traits/integral_constant.hpp>\n#ifndef BOOST_IS_POLYMORPHIC\n#include <boost/type_traits/is_class.hpp>\n#endif\n#include <boost/detail/workaround.hpp>\n\n#if defined(BOOST_MSVC) && (BOOST_MSVC >= 1700)\n#pragma warning(push)\n#pragma warning(disable:4250)\n#endif\n\nnamespace boost{\n\n#ifndef BOOST_IS_POLYMORPHIC\n\nnamespace detail{\n\ntemplate <class T>\nstruct is_polymorphic_imp1\n{\n# if BOOST_WORKAROUND(__MWERKS__, <= 0x2407) // CWPro7 should return false always.\n    typedef char d1, (&d2)[2];\n# else \n   struct d1 : public T\n   {\n      d1();\n#  if !defined(__GNUC__) // this raises warnings with some classes, and buys nothing with GCC\n      ~d1()throw();\n#  endif \n      char padding[256];\n   private:\n      // keep some picky compilers happy:\n      d1(const d1&);\n      d1& operator=(const d1&);\n   };\n   struct d2 : public T\n   {\n      d2();\n      virtual ~d2()throw();\n#  if !defined(BOOST_MSVC) && !defined(__ICL)\n      // for some reason this messes up VC++ when T has virtual bases,\n      // probably likewise for compilers that use the same ABI:\n      struct unique{};\n      virtual void unique_name_to_boost5487629(unique*);\n#  endif\n      char padding[256];\n   private:\n      // keep some picky compilers happy:\n      d2(const d2&);\n      d2& operator=(const d2&);\n   };\n# endif \n   BOOST_STATIC_CONSTANT(bool, value = (sizeof(d2) == sizeof(d1)));\n};\n\ntemplate <class T> struct is_polymorphic_imp1<T const> : public is_polymorphic_imp1<T>{};\ntemplate <class T> struct is_polymorphic_imp1<T const volatile> : public is_polymorphic_imp1<T>{};\ntemplate <class T> struct is_polymorphic_imp1<T volatile> : public is_polymorphic_imp1<T>{};\n\ntemplate <class T>\nstruct is_polymorphic_imp2\n{\n   BOOST_STATIC_CONSTANT(bool, value = false);\n};\n\ntemplate <bool is_class>\nstruct is_polymorphic_selector\n{\n   template <class T>\n   struct rebind\n   {\n      typedef is_polymorphic_imp2<T> type;\n   };\n};\n\ntemplate <>\nstruct is_polymorphic_selector<true>\n{\n   template <class T>\n   struct rebind\n   {\n      typedef is_polymorphic_imp1<T> type;\n   };\n};\n\ntemplate <class T>\nstruct is_polymorphic_imp\n{\n   typedef is_polymorphic_selector< ::boost::is_class<T>::value> selector;\n   typedef typename selector::template rebind<T> binder;\n   typedef typename binder::type imp_type;\n   BOOST_STATIC_CONSTANT(bool, value = imp_type::value);\n};\n\n} // namespace detail\n\ntemplate <class T> struct is_polymorphic : public integral_constant<bool, ::boost::detail::is_polymorphic_imp<T>::value> {};\n\n#else // BOOST_IS_POLYMORPHIC\n\ntemplate <class T> struct is_polymorphic : public integral_constant<bool, BOOST_IS_POLYMORPHIC(T)> {};\n\n#endif\n\n} // namespace boost\n\n#if defined(BOOST_MSVC) && (BOOST_MSVC >= 1700)\n#pragma warning(pop)\n#endif\n\n#endif\n"
  },
  {
    "path": "benchmarks/boost/type_traits/is_reference.hpp",
    "content": "\n//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, \n//      Howard Hinnant and John Maddock 2000, 2010. \n//  (C) Copyright Mat Marcus, Jesse Jones and Adobe Systems Inc 2001\n\n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n#ifndef BOOST_TT_IS_REFERENCE_HPP_INCLUDED\n#define BOOST_TT_IS_REFERENCE_HPP_INCLUDED\n\n#include <boost/type_traits/is_lvalue_reference.hpp>\n#include <boost/type_traits/is_rvalue_reference.hpp>\n\nnamespace boost {\n\ntemplate <class T> struct is_reference \n   : public \n   integral_constant<\n      bool, \n      ::boost::is_lvalue_reference<T>::value || ::boost::is_rvalue_reference<T>::value>\n{};\n\n} // namespace boost\n\n#endif // BOOST_TT_IS_REFERENCE_HPP_INCLUDED\n\n"
  },
  {
    "path": "benchmarks/boost/type_traits/is_rvalue_reference.hpp",
    "content": "\n//  (C) John Maddock 2010. \n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n#ifndef BOOST_TT_IS_RVALUE_REFERENCE_HPP_INCLUDED\n#define BOOST_TT_IS_RVALUE_REFERENCE_HPP_INCLUDED\n\n#include <boost/config.hpp>\n#include <boost/type_traits/integral_constant.hpp>\n\nnamespace boost {\n\ntemplate <class T> struct is_rvalue_reference : public false_type {};\n#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES\ntemplate <class T> struct is_rvalue_reference<T&&> : public true_type {};\n#endif\n\n} // namespace boost\n\n#endif // BOOST_TT_IS_REFERENCE_HPP_INCLUDED\n\n"
  },
  {
    "path": "benchmarks/boost/type_traits/is_same.hpp",
    "content": "\n//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, \n//      Howard Hinnant and John Maddock 2000. \n//  (C) Copyright Mat Marcus, Jesse Jones and Adobe Systems Inc 2001\n\n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n//    Fixed is_pointer, is_reference, is_const, is_volatile, is_same, \n//    is_member_pointer based on the Simulated Partial Specialization work \n//    of Mat Marcus and Jesse Jones. See  http://opensource.adobe.com or \n//    http://groups.yahoo.com/group/boost/message/5441 \n//    Some workarounds in here use ideas suggested from \"Generic<Programming>: \n//    Mappings between Types and Values\" \n//    by Andrei Alexandrescu (see http://www.cuj.com/experts/1810/alexandr.html).\n\n\n#ifndef BOOST_TT_IS_SAME_HPP_INCLUDED\n#define BOOST_TT_IS_SAME_HPP_INCLUDED\n\n#include <boost/type_traits/integral_constant.hpp>\n\nnamespace boost {\n\n\n   template <class T, class U> struct is_same : public false_type {};\n   template <class T> struct is_same<T,T> : public true_type {};\n#if BOOST_WORKAROUND(__BORLANDC__, < 0x600)\n// without this, Borland's compiler gives the wrong answer for\n// references to arrays:\n   template <class T> struct is_same<T&, T&> : public true_type{};\n#endif\n\n\n} // namespace boost\n\n#endif  // BOOST_TT_IS_SAME_HPP_INCLUDED\n\n"
  },
  {
    "path": "benchmarks/boost/type_traits/is_scalar.hpp",
    "content": "\n//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.\n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n#ifndef BOOST_TT_IS_SCALAR_HPP_INCLUDED\n#define BOOST_TT_IS_SCALAR_HPP_INCLUDED\n\n#include <boost/type_traits/is_arithmetic.hpp>\n#include <boost/type_traits/is_enum.hpp>\n#include <boost/type_traits/is_pointer.hpp>\n#include <boost/type_traits/is_member_pointer.hpp>\n#include <boost/config.hpp>\n\nnamespace boost {\n\ntemplate <typename T>\nstruct is_scalar\n   : public integral_constant<bool, ::boost::is_arithmetic<T>::value || ::boost::is_enum<T>::value || ::boost::is_pointer<T>::value || ::boost::is_member_pointer<T>::value>\n{};\n\n} // namespace boost\n\n#endif // BOOST_TT_IS_SCALAR_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/type_traits/is_signed.hpp",
    "content": "\n//  (C) Copyright John Maddock 2005.  \n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n\n#ifndef BOOST_TT_IS_SIGNED_HPP_INCLUDED\n#define BOOST_TT_IS_SIGNED_HPP_INCLUDED\n\n#include <boost/type_traits/is_integral.hpp>\n#include <boost/type_traits/remove_cv.hpp>\n#include <boost/type_traits/is_enum.hpp>\n#include <climits>\n\nnamespace boost {\n\n#if !defined( __CODEGEARC__ )\n\n#if !(defined(BOOST_MSVC) && BOOST_MSVC <= 1310) && \\\n    !(defined(__EDG_VERSION__) && __EDG_VERSION__ <= 238) &&\\\n    !defined(BOOST_NO_INCLASS_MEMBER_INITIALIZATION)\n\nnamespace detail{\n\ntemplate <class T>\nstruct is_signed_values\n{\n   //\n   // Note that we cannot use BOOST_STATIC_CONSTANT here, using enum's\n   // rather than \"real\" static constants simply doesn't work or give\n   // the correct answer.\n   //\n   typedef typename remove_cv<T>::type no_cv_t;\n   static const no_cv_t minus_one = (static_cast<no_cv_t>(-1));\n   static const no_cv_t zero = (static_cast<no_cv_t>(0));\n};\n\ntemplate <class T>\nstruct is_signed_helper\n{\n   typedef typename remove_cv<T>::type no_cv_t;\n   BOOST_STATIC_CONSTANT(bool, value = (!(::boost::detail::is_signed_values<T>::minus_one  > boost::detail::is_signed_values<T>::zero)));\n};\n\ntemplate <bool integral_type>\nstruct is_signed_select_helper\n{\n   template <class T>\n   struct rebind\n   {\n      typedef is_signed_helper<T> type;\n   };\n};\n\ntemplate <>\nstruct is_signed_select_helper<false>\n{\n   template <class T>\n   struct rebind\n   {\n      typedef false_type type;\n   };\n};\n\ntemplate <class T>\nstruct is_signed_impl\n{\n   typedef ::boost::detail::is_signed_select_helper< ::boost::is_integral<T>::value || ::boost::is_enum<T>::value> selector;\n   typedef typename selector::template rebind<T> binder;\n   typedef typename binder::type type;\n   BOOST_STATIC_CONSTANT(bool, value = type::value);\n};\n\n}\n\ntemplate <class T> struct is_signed : public integral_constant<bool, boost::detail::is_signed_impl<T>::value> {};\n\n#else\n\ntemplate <class T> struct is_signed : public false_type{};\n\n#endif\n\n#else //defined( __CODEGEARC__ )\n   template <class T> struct is_signed : public integral_constant<bool, __is_signed(T)>{};\n#endif\n\ntemplate <> struct is_signed<signed char> : public true_type{};\ntemplate <> struct is_signed<const signed char> : public true_type{};\ntemplate <> struct is_signed<volatile signed char> : public true_type{};\ntemplate <> struct is_signed<const volatile signed char> : public true_type{};\ntemplate <> struct is_signed<short> : public true_type{};\ntemplate <> struct is_signed<const short> : public true_type{};\ntemplate <> struct is_signed<volatile short> : public true_type{};\ntemplate <> struct is_signed<const volatile short> : public true_type{};\ntemplate <> struct is_signed<int> : public true_type{};\ntemplate <> struct is_signed<const int> : public true_type{};\ntemplate <> struct is_signed<volatile int> : public true_type{};\ntemplate <> struct is_signed<const volatile int> : public true_type{};\ntemplate <> struct is_signed<long> : public true_type{};\ntemplate <> struct is_signed<const long> : public true_type{};\ntemplate <> struct is_signed<volatile long> : public true_type{};\ntemplate <> struct is_signed<const volatile long> : public true_type{};\n\ntemplate <> struct is_signed<unsigned char> : public false_type{};\ntemplate <> struct is_signed<const unsigned char> : public false_type{};\ntemplate <> struct is_signed<volatile unsigned char> : public false_type{};\ntemplate <> struct is_signed<const volatile unsigned char> : public false_type{};\ntemplate <> struct is_signed<unsigned short> : public false_type{};\ntemplate <> struct is_signed<const unsigned short> : public false_type{};\ntemplate <> struct is_signed<volatile unsigned short> : public false_type{};\ntemplate <> struct is_signed<const volatile unsigned short> : public false_type{};\ntemplate <> struct is_signed<unsigned int> : public false_type{};\ntemplate <> struct is_signed<const unsigned int> : public false_type{};\ntemplate <> struct is_signed<volatile unsigned int> : public false_type{};\ntemplate <> struct is_signed<const volatile unsigned int> : public false_type{};\ntemplate <> struct is_signed<unsigned long> : public false_type{};\ntemplate <> struct is_signed<const unsigned long> : public false_type{};\ntemplate <> struct is_signed<volatile unsigned long> : public false_type{};\ntemplate <> struct is_signed<const volatile unsigned long> : public false_type{};\n#ifdef BOOST_HAS_LONG_LONG\ntemplate <> struct is_signed< ::boost::long_long_type> : public true_type{};\ntemplate <> struct is_signed<const ::boost::long_long_type> : public true_type{};\ntemplate <> struct is_signed<volatile ::boost::long_long_type> : public true_type{};\ntemplate <> struct is_signed<const volatile ::boost::long_long_type> : public true_type{};\n\ntemplate <> struct is_signed< ::boost::ulong_long_type> : public false_type{};\ntemplate <> struct is_signed<const ::boost::ulong_long_type> : public false_type{};\ntemplate <> struct is_signed<volatile ::boost::ulong_long_type> : public false_type{};\ntemplate <> struct is_signed<const volatile ::boost::ulong_long_type> : public false_type{};\n#endif\n#if defined(CHAR_MIN) \n#if CHAR_MIN != 0\ntemplate <> struct is_signed<char> : public true_type{};\ntemplate <> struct is_signed<const char> : public true_type{};\ntemplate <> struct is_signed<volatile char> : public true_type{};\ntemplate <> struct is_signed<const volatile char> : public true_type{};\n#else\ntemplate <> struct is_signed<char> : public false_type{};\ntemplate <> struct is_signed<const char> : public false_type{};\ntemplate <> struct is_signed<volatile char> : public false_type{};\ntemplate <> struct is_signed<const volatile char> : public false_type{};\n#endif\n#endif\n#if defined(WCHAR_MIN) && !defined(BOOST_NO_INTRINSIC_WCHAR_T)\n#if WCHAR_MIN != 0\ntemplate <> struct is_signed<wchar_t> : public true_type{};\ntemplate <> struct is_signed<const wchar_t> : public true_type{};\ntemplate <> struct is_signed<volatile wchar_t> : public true_type{};\ntemplate <> struct is_signed<const volatile wchar_t> : public true_type{};\n#else\ntemplate <> struct is_signed<wchar_t> : public false_type{};\ntemplate <> struct is_signed<const wchar_t> : public false_type{};\ntemplate <> struct is_signed<volatile wchar_t> : public false_type{};\ntemplate <> struct is_signed<const volatile wchar_t> : public false_type{};\n#endif\n#endif\n} // namespace boost\n\n#endif // BOOST_TT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/type_traits/is_union.hpp",
    "content": "\n//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard\n//  Hinnant & John Maddock 2000.  \n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n\n#ifndef BOOST_TT_IS_UNION_HPP_INCLUDED\n#define BOOST_TT_IS_UNION_HPP_INCLUDED\n\n#include <boost/type_traits/intrinsics.hpp>\n#include <boost/type_traits/integral_constant.hpp>\n\nnamespace boost {\n\n#ifdef BOOST_IS_UNION\ntemplate <class T> struct is_union : public integral_constant<bool, BOOST_IS_UNION(T)> {};\n#else\ntemplate <class T> struct is_union : public integral_constant<bool, false> {};\n#endif\n\ntemplate <class T> struct is_union<T const> : public is_union<T>{};\ntemplate <class T> struct is_union<T volatile const> : public is_union<T>{};\ntemplate <class T> struct is_union<T volatile> : public is_union<T>{};\n\n} // namespace boost\n\n#endif // BOOST_TT_IS_UNION_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/type_traits/is_unsigned.hpp",
    "content": "\n//  (C) Copyright John Maddock 2005.  \n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n\n#ifndef BOOST_TT_IS_UNSIGNED_HPP_INCLUDED\n#define BOOST_TT_IS_UNSIGNED_HPP_INCLUDED\n\n#include <boost/type_traits/is_integral.hpp>\n#include <boost/type_traits/is_enum.hpp>\n#include <boost/type_traits/remove_cv.hpp>\n\n#include <climits>\n\nnamespace boost {\n\n#if !defined( __CODEGEARC__ )\n\n#if !(defined(BOOST_MSVC) && BOOST_MSVC <= 1310) &&\\\n    !(defined(__EDG_VERSION__) && __EDG_VERSION__ <= 238) &&\\\n    !defined(BOOST_NO_INCLASS_MEMBER_INITIALIZATION)\n\nnamespace detail{\n\ntemplate <class T>\nstruct is_unsigned_values\n{\n   //\n   // Note that we cannot use BOOST_STATIC_CONSTANT here, using enum's\n   // rather than \"real\" static constants simply doesn't work or give\n   // the correct answer.\n   //\n   typedef typename remove_cv<T>::type no_cv_t;\n   static const no_cv_t minus_one = (static_cast<no_cv_t>(-1));\n   static const no_cv_t zero = (static_cast<no_cv_t>(0));\n};\n\ntemplate <class T>\nstruct is_ununsigned_helper\n{\n   BOOST_STATIC_CONSTANT(bool, value = (::boost::detail::is_unsigned_values<T>::minus_one > ::boost::detail::is_unsigned_values<T>::zero));\n};\n\ntemplate <bool integral_type>\nstruct is_unsigned_select_helper\n{\n   template <class T>\n   struct rebind\n   {\n      typedef is_ununsigned_helper<T> type;\n   };\n};\n\ntemplate <>\nstruct is_unsigned_select_helper<false>\n{\n   template <class T>\n   struct rebind\n   {\n      typedef false_type type;\n   };\n};\n\ntemplate <class T>\nstruct is_unsigned\n{\n   typedef ::boost::detail::is_unsigned_select_helper< ::boost::is_integral<T>::value || ::boost::is_enum<T>::value > selector;\n   typedef typename selector::template rebind<T> binder;\n   typedef typename binder::type type;\n   BOOST_STATIC_CONSTANT(bool, value = type::value);\n};\n\n} // namespace detail\n\ntemplate <class T> struct is_unsigned : public integral_constant<bool, boost::detail::is_unsigned<T>::value> {};\n\n#else\n\ntemplate <class T> struct is_unsigned : public false_type{};\n\n#endif\n\n#else // defined( __CODEGEARC__ )\ntemplate <class T> struct is_unsigned : public integral_constant<bool, __is_unsigned(T)> {};\n#endif\n\ntemplate <> struct is_unsigned<unsigned char> : public true_type{};\ntemplate <> struct is_unsigned<const unsigned char> : public true_type{};\ntemplate <> struct is_unsigned<volatile unsigned char> : public true_type{};\ntemplate <> struct is_unsigned<const volatile unsigned char> : public true_type{};\ntemplate <> struct is_unsigned<unsigned short> : public true_type{};\ntemplate <> struct is_unsigned<const unsigned short> : public true_type{};\ntemplate <> struct is_unsigned<volatile unsigned short> : public true_type{};\ntemplate <> struct is_unsigned<const volatile unsigned short> : public true_type{};\ntemplate <> struct is_unsigned<unsigned int> : public true_type{};\ntemplate <> struct is_unsigned<const unsigned int> : public true_type{};\ntemplate <> struct is_unsigned<volatile unsigned int> : public true_type{};\ntemplate <> struct is_unsigned<const volatile unsigned int> : public true_type{};\ntemplate <> struct is_unsigned<unsigned long> : public true_type{};\ntemplate <> struct is_unsigned<const unsigned long> : public true_type{};\ntemplate <> struct is_unsigned<volatile unsigned long> : public true_type{};\ntemplate <> struct is_unsigned<const volatile unsigned long> : public true_type{};\n\ntemplate <> struct is_unsigned<signed char> : public false_type{};\ntemplate <> struct is_unsigned<const signed char> : public false_type{};\ntemplate <> struct is_unsigned<volatile signed char> : public false_type{};\ntemplate <> struct is_unsigned<const volatile signed char> : public false_type{};\ntemplate <> struct is_unsigned< short> : public false_type{};\ntemplate <> struct is_unsigned<const  short> : public false_type{};\ntemplate <> struct is_unsigned<volatile  short> : public false_type{};\ntemplate <> struct is_unsigned<const volatile  short> : public false_type{};\ntemplate <> struct is_unsigned< int> : public false_type{};\ntemplate <> struct is_unsigned<const  int> : public false_type{};\ntemplate <> struct is_unsigned<volatile  int> : public false_type{};\ntemplate <> struct is_unsigned<const volatile  int> : public false_type{};\ntemplate <> struct is_unsigned< long> : public false_type{};\ntemplate <> struct is_unsigned<const  long> : public false_type{};\ntemplate <> struct is_unsigned<volatile  long> : public false_type{};\ntemplate <> struct is_unsigned<const volatile  long> : public false_type{};\n#ifdef BOOST_HAS_LONG_LONG\ntemplate <> struct is_unsigned< ::boost::ulong_long_type> : public true_type{};\ntemplate <> struct is_unsigned<const ::boost::ulong_long_type> : public true_type{};\ntemplate <> struct is_unsigned<volatile ::boost::ulong_long_type> : public true_type{};\ntemplate <> struct is_unsigned<const volatile ::boost::ulong_long_type> : public true_type{};\n\ntemplate <> struct is_unsigned< ::boost::long_long_type> : public false_type{};\ntemplate <> struct is_unsigned<const ::boost::long_long_type> : public false_type{};\ntemplate <> struct is_unsigned<volatile ::boost::long_long_type> : public false_type{};\ntemplate <> struct is_unsigned<const volatile ::boost::long_long_type> : public false_type{};\n#endif\n#if defined(CHAR_MIN) \n#if CHAR_MIN == 0\ntemplate <> struct is_unsigned<char> : public true_type{};\ntemplate <> struct is_unsigned<const char> : public true_type{};\ntemplate <> struct is_unsigned<volatile char> : public true_type{};\ntemplate <> struct is_unsigned<const volatile char> : public true_type{};\n#else\ntemplate <> struct is_unsigned<char> : public false_type{};\ntemplate <> struct is_unsigned<const char> : public false_type{};\ntemplate <> struct is_unsigned<volatile char> : public false_type{};\ntemplate <> struct is_unsigned<const volatile char> : public false_type{};\n#endif\n#endif\n#if !defined(BOOST_NO_INTRINSIC_WCHAR_T) && defined(WCHAR_MIN)\n#if WCHAR_MIN == 0\ntemplate <> struct is_unsigned<wchar_t> : public true_type{};\ntemplate <> struct is_unsigned<const wchar_t> : public true_type{};\ntemplate <> struct is_unsigned<volatile wchar_t> : public true_type{};\ntemplate <> struct is_unsigned<const volatile wchar_t> : public true_type{};\n#else\ntemplate <> struct is_unsigned<wchar_t> : public false_type{};\ntemplate <> struct is_unsigned<const wchar_t> : public false_type{};\ntemplate <> struct is_unsigned<volatile wchar_t> : public false_type{};\ntemplate <> struct is_unsigned<const volatile wchar_t> : public false_type{};\n#endif\n#endif\n} // namespace boost\n\n#endif // BOOST_TT_IS_MEMBER_FUNCTION_POINTER_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/type_traits/is_void.hpp",
    "content": "\n//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.\n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n#ifndef BOOST_TT_IS_VOID_HPP_INCLUDED\n#define BOOST_TT_IS_VOID_HPP_INCLUDED\n\n#include <boost/type_traits/integral_constant.hpp>\n\nnamespace boost {\n\ntemplate <class T>\nstruct is_void : public false_type {};\n\ntemplate<> struct is_void<void> : public true_type {};\ntemplate<> struct is_void<const void> : public true_type{};\ntemplate<> struct is_void<const volatile void> : public true_type{};\ntemplate<> struct is_void<volatile void> : public true_type{};\n\n} // namespace boost\n\n#endif // BOOST_TT_IS_VOID_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/type_traits/is_volatile.hpp",
    "content": "\n//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, \n//      Howard Hinnant and John Maddock 2000. \n//  (C) Copyright Mat Marcus, Jesse Jones and Adobe Systems Inc 2001\n\n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n//    Fixed is_pointer, is_reference, is_const, is_volatile, is_same, \n//    is_member_pointer based on the Simulated Partial Specialization work \n//    of Mat Marcus and Jesse Jones. See  http://opensource.adobe.com or \n//    http://groups.yahoo.com/group/boost/message/5441 \n//    Some workarounds in here use ideas suggested from \"Generic<Programming>: \n//    Mappings between Types and Values\" \n//    by Andrei Alexandrescu (see http://www.cuj.com/experts/1810/alexandr.html).\n\n\n#ifndef BOOST_TT_IS_VOLATILE_HPP_INCLUDED\n#define BOOST_TT_IS_VOLATILE_HPP_INCLUDED\n\n#include <boost/type_traits/integral_constant.hpp>\n\nnamespace boost {\n\n#if defined( __CODEGEARC__ )\n\n   template <class T>\n   struct is_volatile : public integral_constant<bool, __is_volatile(T)> {};\n\n#else\n\n   template <class T>\n   struct is_volatile : public false_type {};\n   template <class T> struct is_volatile<T volatile> : public true_type{};\n   template <class T, size_t N> struct is_volatile<T volatile[N]> : public true_type{};\n   template <class T> struct is_volatile<T volatile[]> : public true_type{};\n\n#endif\n\n} // namespace boost\n\n#endif // BOOST_TT_IS_VOLATILE_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/type_traits/make_signed.hpp",
    "content": "\n//  (C) Copyright John Maddock 2007.\n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n#ifndef BOOST_TT_MAKE_SIGNED_HPP_INCLUDED\n#define BOOST_TT_MAKE_SIGNED_HPP_INCLUDED\n\n#include <boost/type_traits/conditional.hpp>\n#include <boost/type_traits/is_integral.hpp>\n#include <boost/type_traits/is_signed.hpp>\n#include <boost/type_traits/is_unsigned.hpp>\n#include <boost/type_traits/is_enum.hpp>\n#include <boost/type_traits/is_same.hpp>\n#include <boost/type_traits/remove_cv.hpp>\n#include <boost/type_traits/is_const.hpp>\n#include <boost/type_traits/is_volatile.hpp>\n#include <boost/type_traits/add_const.hpp>\n#include <boost/type_traits/add_volatile.hpp>\n#include <boost/static_assert.hpp>\n\nnamespace boost {\n\ntemplate <class T>\nstruct make_signed\n{\nprivate:\n   BOOST_STATIC_ASSERT_MSG(( ::boost::is_integral<T>::value || ::boost::is_enum<T>::value), \"The template argument to make_signed must be an integer or enum type.\");\n   BOOST_STATIC_ASSERT_MSG(!(::boost::is_same<typename remove_cv<T>::type, bool>::value), \"The template argument to make_signed must not be the type bool.\");\n\n   typedef typename remove_cv<T>::type t_no_cv;\n   typedef typename conditional<\n      (::boost::is_signed<T>::value\n      && ::boost::is_integral<T>::value\n      && ! ::boost::is_same<t_no_cv, char>::value\n      && ! ::boost::is_same<t_no_cv, wchar_t>::value\n      && ! ::boost::is_same<t_no_cv, bool>::value),\n      T,\n      typename conditional<\n         (::boost::is_integral<T>::value\n         && ! ::boost::is_same<t_no_cv, char>::value\n         && ! ::boost::is_same<t_no_cv, wchar_t>::value\n         && ! ::boost::is_same<t_no_cv, bool>::value),\n         typename conditional<\n            is_same<t_no_cv, unsigned char>::value,\n            signed char,\n            typename conditional<\n               is_same<t_no_cv, unsigned short>::value,\n               signed short,\n               typename conditional<\n                  is_same<t_no_cv, unsigned int>::value,\n                  int,\n                  typename conditional<\n                     is_same<t_no_cv, unsigned long>::value,\n                     long,\n#if defined(BOOST_HAS_LONG_LONG)\n#ifdef BOOST_HAS_INT128\n                     typename conditional<\n                        sizeof(t_no_cv) == sizeof(boost::long_long_type), \n                        boost::long_long_type, \n                        boost::int128_type\n                     >::type\n#else\n                     boost::long_long_type\n#endif\n#elif defined(BOOST_HAS_MS_INT64)\n                     __int64\n#else\n                     long\n#endif\n                  >::type\n               >::type\n            >::type\n         >::type,\n         // Not a regular integer type:\n         typename conditional<\n            sizeof(t_no_cv) == sizeof(unsigned char),\n            signed char,\n            typename conditional<\n               sizeof(t_no_cv) == sizeof(unsigned short),\n               signed short,\n               typename conditional<\n                  sizeof(t_no_cv) == sizeof(unsigned int),\n                  int,\n                  typename conditional<\n                     sizeof(t_no_cv) == sizeof(unsigned long),\n                     long,\n#if defined(BOOST_HAS_LONG_LONG)\n#ifdef BOOST_HAS_INT128\n                     typename conditional<\n                        sizeof(t_no_cv) == sizeof(boost::long_long_type), \n                        boost::long_long_type, \n                        boost::int128_type\n                     >::type\n#else\n                     boost::long_long_type\n#endif\n#elif defined(BOOST_HAS_MS_INT64)\n                     __int64\n#else\n                     long\n#endif\n                  >::type\n               >::type\n            >::type\n         >::type\n      >::type\n   >::type base_integer_type;\n   \n   // Add back any const qualifier:\n   typedef typename conditional<\n      is_const<T>::value,\n      typename add_const<base_integer_type>::type,\n      base_integer_type\n   >::type const_base_integer_type;\npublic:\n   // Add back any volatile qualifier:\n   typedef typename conditional<\n      is_volatile<T>::value,\n      typename add_volatile<const_base_integer_type>::type,\n      const_base_integer_type\n   >::type type;\n};\n\n} // namespace boost\n\n#endif // BOOST_TT_ADD_REFERENCE_HPP_INCLUDED\n\n"
  },
  {
    "path": "benchmarks/boost/type_traits/remove_const.hpp",
    "content": "\n//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard\n//  Hinnant & John Maddock 2000.  \n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n\n#ifndef BOOST_TT_REMOVE_CONST_HPP_INCLUDED\n#define BOOST_TT_REMOVE_CONST_HPP_INCLUDED\n\n#include <boost/config.hpp>\n#include <cstddef>\n#include <boost/detail/workaround.hpp>\n\nnamespace boost {\n\n   //  convert a type T to a non-cv-qualified type - remove_const<T>\n   template <class T> struct remove_const{ typedef T type; };\n   template <class T> struct remove_const<T const>{ typedef T type; };\n\n#if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS)\n   template <class T, std::size_t N> struct remove_const<T const[N]>{ typedef T type[N]; };\n#if !BOOST_WORKAROUND(__BORLANDC__, < 0x600) && !defined(__IBMCPP__) &&  !BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840))\n   template <class T> struct remove_const<T const[]>{ typedef T type[]; };\n#endif\n#endif\n\n} // namespace boost\n\n#endif // BOOST_TT_REMOVE_CONST_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/type_traits/remove_cv.hpp",
    "content": "\n//  (C) Copyright Dave Abrahams, Steve Cleary, Beman Dawes, Howard\n//  Hinnant & John Maddock 2000.  \n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n\n#ifndef BOOST_TT_REMOVE_CV_HPP_INCLUDED\n#define BOOST_TT_REMOVE_CV_HPP_INCLUDED\n\n#include <boost/config.hpp>\n#include <boost/detail/workaround.hpp>\n#include <cstddef>\n\nnamespace boost {\n\n   //  convert a type T to a non-cv-qualified type - remove_cv<T>\ntemplate <class T> struct remove_cv{ typedef T type; };\ntemplate <class T> struct remove_cv<T const>{ typedef T type;  };\ntemplate <class T> struct remove_cv<T volatile>{ typedef T type; };\ntemplate <class T> struct remove_cv<T const volatile>{ typedef T type; };\n\n#if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS)\ntemplate <class T, std::size_t N> struct remove_cv<T const[N]>{ typedef T type[N]; };\ntemplate <class T, std::size_t N> struct remove_cv<T const volatile[N]>{ typedef T type[N]; };\ntemplate <class T, std::size_t N> struct remove_cv<T volatile[N]>{ typedef T type[N]; };\n#if !BOOST_WORKAROUND(__BORLANDC__, < 0x600) && !defined(__IBMCPP__) &&  !BOOST_WORKAROUND(__DMC__, BOOST_TESTED_AT(0x840))\ntemplate <class T> struct remove_cv<T const[]>{ typedef T type[]; };\ntemplate <class T> struct remove_cv<T const volatile[]>{ typedef T type[]; };\ntemplate <class T> struct remove_cv<T volatile[]>{ typedef T type[]; };\n#endif\n#endif\n\n\n} // namespace boost\n\n#endif // BOOST_TT_REMOVE_CV_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/type_traits/remove_reference.hpp",
    "content": "\n//  (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.\n//  Use, modification and distribution are subject to the Boost Software License,\n//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt).\n//\n//  See http://www.boost.org/libs/type_traits for most recent version including documentation.\n\n#ifndef BOOST_TT_REMOVE_REFERENCE_HPP_INCLUDED\n#define BOOST_TT_REMOVE_REFERENCE_HPP_INCLUDED\n\n#include <boost/config.hpp>\n#include <boost/detail/workaround.hpp>\n\nnamespace boost {\n\n\nnamespace detail{\n//\n// We can't filter out rvalue_references at the same level as\n// references or we get ambiguities from msvc:\n//\ntemplate <class T>\nstruct remove_rvalue_ref\n{\n   typedef T type;\n};\n#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES\ntemplate <class T>\nstruct remove_rvalue_ref<T&&>\n{\n   typedef T type;\n};\n#endif\n\n} // namespace detail\n\ntemplate <class T> struct remove_reference{ typedef typename boost::detail::remove_rvalue_ref<T>::type type; };\ntemplate <class T> struct remove_reference<T&>{ typedef T type; };\n\n#if defined(BOOST_ILLEGAL_CV_REFERENCES)\n// these are illegal specialisations; cv-qualifies applied to\n// references have no effect according to [8.3.2p1],\n// C++ Builder requires them though as it treats cv-qualified\n// references as distinct types...\ntemplate <class T> struct remove_reference<T&const>{ typedef T type; };\ntemplate <class T> struct remove_reference<T&volatile>{ typedef T type; };\ntemplate <class T> struct remove_reference<T&const volatile>{ typedef T type; };\n#endif\n\n\n} // namespace boost\n\n#endif // BOOST_TT_REMOVE_REFERENCE_HPP_INCLUDED\n"
  },
  {
    "path": "benchmarks/boost/utility/declval.hpp",
    "content": "//  declval.hpp  -------------------------------------------------------------//\n\n//  Copyright 2010 Vicente J. Botet Escriba\n\n//  Distributed under the Boost Software License, Version 1.0.\n//  See http://www.boost.org/LICENSE_1_0.txt\n\n#ifndef BOOST_UTILITY_DECLVAL_HPP\n#define BOOST_UTILITY_DECLVAL_HPP\n\n#include <boost/type_traits/declval.hpp>\n\n#endif  // BOOST_UTILITY_DECLVAL_HPP\n"
  },
  {
    "path": "benchmarks/boost/utility/detail/result_of_iterate.hpp",
    "content": "// Boost result_of library\n\n//  Copyright Douglas Gregor 2004. Use, modification and\n//  distribution is subject to the Boost Software License, Version\n//  1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n\n//  Copyright Daniel Walker, Eric Niebler, Michel Morin 2008-2012.\n//  Use, modification and distribution is subject to the Boost Software\n//  License, Version 1.0. (See accompanying file LICENSE_1_0.txt or\n//  copy at http://www.boost.org/LICENSE_1_0.txt)\n\n// For more information, see http://www.boost.org/libs/utility\n#if !defined(BOOST_PP_IS_ITERATING)\n# error Boost result_of - do not include this file!\n#endif\n\n// CWPro8 requires an argument in a function type specialization\n#if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3002)) && BOOST_PP_ITERATION() == 0\n# define BOOST_RESULT_OF_ARGS void\n#else\n# define BOOST_RESULT_OF_ARGS BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)\n#endif\n\n#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))\ntemplate<typename F BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(),typename T)>\nstruct tr1_result_of<F(BOOST_RESULT_OF_ARGS)>\n    : mpl::if_<\n          mpl::or_< is_pointer<F>, is_member_function_pointer<F> >\n        , boost::detail::tr1_result_of_impl<\n            typename remove_cv<F>::type,\n            typename remove_cv<F>::type(BOOST_RESULT_OF_ARGS),\n            (boost::detail::has_result_type<F>::value)>\n        , boost::detail::tr1_result_of_impl<\n            F,\n            F(BOOST_RESULT_OF_ARGS),\n            (boost::detail::has_result_type<F>::value)> >::type { };\n#endif\n\n#ifdef BOOST_RESULT_OF_USE_DECLTYPE\ntemplate<typename F BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(),typename T)>\nstruct result_of<F(BOOST_RESULT_OF_ARGS)>\n    : detail::cpp0x_result_of<F(BOOST_RESULT_OF_ARGS)> { };\n#endif // BOOST_RESULT_OF_USE_DECLTYPE\n\n#ifdef BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK\ntemplate<typename F BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(),typename T)>\nstruct result_of<F(BOOST_RESULT_OF_ARGS)>\n    : mpl::if_<mpl::or_<detail::has_result_type<F>, detail::has_result<F> >,\n               tr1_result_of<F(BOOST_RESULT_OF_ARGS)>,\n               detail::cpp0x_result_of<F(BOOST_RESULT_OF_ARGS)> >::type { };\n#endif // BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK\n\n#if defined(BOOST_RESULT_OF_USE_DECLTYPE) || defined(BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK)\n\nnamespace detail {\n\ntemplate<typename F BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(),typename T)>\nstruct cpp0x_result_of<F(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T))>\n    : mpl::if_<\n          is_member_function_pointer<F>\n        , detail::tr1_result_of_impl<\n            typename remove_cv<F>::type,\n            typename remove_cv<F>::type(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)), false\n          >\n        , detail::cpp0x_result_of_impl<\n              F(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T))\n          >\n      >::type\n{};\n\n#ifdef BOOST_NO_SFINAE_EXPR\n\ntemplate<typename F>\nstruct BOOST_PP_CAT(result_of_callable_fun_2_, BOOST_PP_ITERATION());\n\ntemplate<typename R BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(), typename T)>\nstruct BOOST_PP_CAT(result_of_callable_fun_2_, BOOST_PP_ITERATION())<R(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), T))> {\n    R operator()(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), T)) const;\n    typedef result_of_private_type const &(*pfn_t)(...);\n    operator pfn_t() const volatile;\n};\n\ntemplate<typename F>\nstruct BOOST_PP_CAT(result_of_callable_fun_, BOOST_PP_ITERATION());\n\ntemplate<typename F>\nstruct BOOST_PP_CAT(result_of_callable_fun_, BOOST_PP_ITERATION())<F *>\n  : BOOST_PP_CAT(result_of_callable_fun_2_, BOOST_PP_ITERATION())<F>\n{};\n\ntemplate<typename F>\nstruct BOOST_PP_CAT(result_of_callable_fun_, BOOST_PP_ITERATION())<F &>\n  : BOOST_PP_CAT(result_of_callable_fun_2_, BOOST_PP_ITERATION())<F>\n{};\n\ntemplate<typename F>\nstruct BOOST_PP_CAT(result_of_select_call_wrapper_type_, BOOST_PP_ITERATION())\n  : mpl::eval_if<\n        is_class<typename remove_reference<F>::type>,\n        result_of_wrap_callable_class<F>,\n        mpl::identity<BOOST_PP_CAT(result_of_callable_fun_, BOOST_PP_ITERATION())<typename remove_cv<F>::type> >\n    >\n{};\n\ntemplate<typename F BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(), typename T)>\nstruct BOOST_PP_CAT(result_of_is_callable_, BOOST_PP_ITERATION()) {\n    typedef typename BOOST_PP_CAT(result_of_select_call_wrapper_type_, BOOST_PP_ITERATION())<F>::type wrapper_t;\n    static const bool value = (\n        sizeof(result_of_no_type) == sizeof(detail::result_of_is_private_type(\n            (boost::declval<wrapper_t>()(BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PP_ITERATION(), boost::declval<T, >() BOOST_PP_INTERCEPT)), result_of_weird_type())\n        ))\n    );\n    typedef mpl::bool_<value> type;\n};\n\ntemplate<typename F BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(),typename T)>\nstruct cpp0x_result_of_impl<F(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)), true>\n    : lazy_enable_if<\n          BOOST_PP_CAT(result_of_is_callable_, BOOST_PP_ITERATION())<F BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(), T)>\n        , cpp0x_result_of_impl<F(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)), false>\n      >\n{};\n\ntemplate<typename F BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(),typename T)>\nstruct cpp0x_result_of_impl<F(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)), false>\n{\n  typedef decltype(\n    boost::declval<F>()(\n      BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PP_ITERATION(), boost::declval<T, >() BOOST_PP_INTERCEPT)\n    )\n  ) type;\n};\n\n#else // BOOST_NO_SFINAE_EXPR\n\ntemplate<typename F BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(),typename T)>\nstruct cpp0x_result_of_impl<F(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)),\n                            typename result_of_always_void<decltype(\n                                boost::declval<F>()(\n                                    BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PP_ITERATION(), boost::declval<T, >() BOOST_PP_INTERCEPT)\n                                )\n                            )>::type> {\n  typedef decltype(\n    boost::declval<F>()(\n      BOOST_PP_ENUM_BINARY_PARAMS(BOOST_PP_ITERATION(), boost::declval<T, >() BOOST_PP_INTERCEPT)\n    )\n  ) type;\n};\n\n#endif // BOOST_NO_SFINAE_EXPR\n\n} // namespace detail\n\n#else // defined(BOOST_RESULT_OF_USE_DECLTYPE) || defined(BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK)\n\n#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))\ntemplate<typename F BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(),typename T)>\nstruct result_of<F(BOOST_RESULT_OF_ARGS)>\n    : tr1_result_of<F(BOOST_RESULT_OF_ARGS)> { };\n#endif\n\n#endif // defined(BOOST_RESULT_OF_USE_DECLTYPE)\n\n#undef BOOST_RESULT_OF_ARGS\n\n#if BOOST_PP_ITERATION() >= 1\n\nnamespace detail {\n\ntemplate<typename R,  typename FArgs BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(),typename T)>\nstruct tr1_result_of_impl<R (*)(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)), FArgs, false>\n{\n  typedef R type;\n};\n\ntemplate<typename R,  typename FArgs BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(),typename T)>\nstruct tr1_result_of_impl<R (&)(BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(),T)), FArgs, false>\n{\n  typedef R type;\n};\n\n#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))\ntemplate<typename R, typename FArgs BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(),typename T)>\nstruct tr1_result_of_impl<R (T0::*)\n                     (BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T)),\n                 FArgs, false>\n{\n  typedef R type;\n};\n\ntemplate<typename R, typename FArgs BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(),typename T)>\nstruct tr1_result_of_impl<R (T0::*)\n                     (BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T))\n                     const,\n                 FArgs, false>\n{\n  typedef R type;\n};\n\ntemplate<typename R, typename FArgs BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(),typename T)>\nstruct tr1_result_of_impl<R (T0::*)\n                     (BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T))\n                     volatile,\n                 FArgs, false>\n{\n  typedef R type;\n};\n\ntemplate<typename R, typename FArgs BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(),typename T)>\nstruct tr1_result_of_impl<R (T0::*)\n                     (BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ITERATION(),T))\n                     const volatile,\n                 FArgs, false>\n{\n  typedef R type;\n};\n#endif\n\n}\n#endif\n"
  },
  {
    "path": "benchmarks/boost/utility/enable_if.hpp",
    "content": "/*\n * Copyright (c) 2014 Glen Fernandes\n *\n * Distributed under the Boost Software License, Version 1.0. (See\n * accompanying file LICENSE_1_0.txt or copy at\n * http://www.boost.org/LICENSE_1_0.txt)\n */\n\n#ifndef BOOST_UTILITY_ENABLE_IF_HPP\n#define BOOST_UTILITY_ENABLE_IF_HPP\n\n// The header file at this path is deprecated;\n// use boost/core/enable_if.hpp instead.\n\n#include <boost/core/enable_if.hpp>\n\n#endif\n"
  },
  {
    "path": "benchmarks/boost/utility/result_of.hpp",
    "content": "// Boost result_of library\n\n//  Copyright Douglas Gregor 2004. Use, modification and\n//  distribution is subject to the Boost Software License, Version\n//  1.0. (See accompanying file LICENSE_1_0.txt or copy at\n//  http://www.boost.org/LICENSE_1_0.txt)\n\n// For more information, see http://www.boost.org/libs/utility\n#ifndef BOOST_RESULT_OF_HPP\n#define BOOST_RESULT_OF_HPP\n\n#include <boost/config.hpp>\n#include <boost/preprocessor/cat.hpp>\n#include <boost/preprocessor/iteration/iterate.hpp>\n#include <boost/preprocessor/repetition/enum_params.hpp>\n#include <boost/preprocessor/repetition/enum_trailing_params.hpp>\n#include <boost/preprocessor/repetition/enum_binary_params.hpp>\n#include <boost/preprocessor/repetition/enum_shifted_params.hpp>\n#include <boost/preprocessor/facilities/intercept.hpp>\n#include <boost/detail/workaround.hpp>\n#include <boost/mpl/has_xxx.hpp>\n#include <boost/mpl/if.hpp>\n#include <boost/mpl/eval_if.hpp>\n#include <boost/mpl/bool.hpp>\n#include <boost/mpl/identity.hpp>\n#include <boost/mpl/or.hpp>\n#include <boost/type_traits/is_class.hpp>\n#include <boost/type_traits/is_pointer.hpp>\n#include <boost/type_traits/is_member_function_pointer.hpp>\n#include <boost/type_traits/remove_cv.hpp>\n#include <boost/type_traits/remove_reference.hpp>\n#include <boost/utility/declval.hpp>\n#include <boost/utility/enable_if.hpp>\n\n#ifndef BOOST_RESULT_OF_NUM_ARGS\n#  define BOOST_RESULT_OF_NUM_ARGS 16\n#endif\n\n// Use the decltype-based version of result_of by default if the compiler\n// supports N3276 <http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2011/n3276.pdf>.\n// The user can force the choice by defining BOOST_RESULT_OF_USE_DECLTYPE,\n// BOOST_RESULT_OF_USE_TR1, or BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK but not more than one!\n#if (defined(BOOST_RESULT_OF_USE_DECLTYPE) && defined(BOOST_RESULT_OF_USE_TR1)) || \\\n    (defined(BOOST_RESULT_OF_USE_DECLTYPE) && defined(BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK)) || \\\n    (defined(BOOST_RESULT_OF_USE_TR1) && defined(BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK))\n#  error More than one of BOOST_RESULT_OF_USE_DECLTYPE, BOOST_RESULT_OF_USE_TR1 and \\\n  BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK cannot be defined at the same time.\n#endif\n\n#if defined(BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK) && defined(BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE)\n#  error Cannot fallback to decltype if BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE is not defined.\n#endif\n\n#ifndef BOOST_RESULT_OF_USE_TR1\n#  ifndef BOOST_RESULT_OF_USE_DECLTYPE\n#    ifndef BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK\n#      ifndef BOOST_NO_CXX11_DECLTYPE_N3276 // this implies !defined(BOOST_NO_CXX11_DECLTYPE)\n#        define BOOST_RESULT_OF_USE_DECLTYPE\n#      else\n#        define BOOST_RESULT_OF_USE_TR1\n#      endif\n#    endif\n#  endif\n#endif\n\nnamespace boost {\n\ntemplate<typename F> struct result_of;\ntemplate<typename F> struct tr1_result_of; // a TR1-style implementation of result_of\n\n#if !defined(BOOST_NO_SFINAE)\nnamespace detail {\n\nBOOST_MPL_HAS_XXX_TRAIT_DEF(result_type)\n\n// Work around a nvcc bug by only defining has_result when it's needed.\n#ifdef BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK\nBOOST_MPL_HAS_XXX_TEMPLATE_DEF(result)\n#endif\n\ntemplate<typename F, typename FArgs, bool HasResultType> struct tr1_result_of_impl;\n\ntemplate<typename F> struct cpp0x_result_of;\n\n#ifdef BOOST_NO_SFINAE_EXPR\n\n// There doesn't seem to be any other way to turn this off such that the presence of\n// the user-defined operator,() below doesn't cause spurious warning all over the place,\n// so unconditionally turn it off.\n#if BOOST_MSVC\n#  pragma warning(disable: 4913) // user defined binary operator ',' exists but no overload could convert all operands, default built-in binary operator ',' used\n#endif\n\nstruct result_of_private_type {};\n\nstruct result_of_weird_type {\n  friend result_of_private_type operator,(result_of_private_type, result_of_weird_type);\n};\n\ntypedef char result_of_yes_type;      // sizeof(result_of_yes_type) == 1\ntypedef char (&result_of_no_type)[2]; // sizeof(result_of_no_type)  == 2\n\ntemplate<typename T>\nresult_of_no_type result_of_is_private_type(T const &);\nresult_of_yes_type result_of_is_private_type(result_of_private_type);\n\ntemplate<typename C>\nstruct result_of_callable_class : C {\n    result_of_callable_class();\n    typedef result_of_private_type const &(*pfn_t)(...);\n    operator pfn_t() const volatile;\n};\n\ntemplate<typename C>\nstruct result_of_wrap_callable_class {\n  typedef result_of_callable_class<C> type;\n};\n\ntemplate<typename C>\nstruct result_of_wrap_callable_class<C const> {\n  typedef result_of_callable_class<C> const type;\n};\n\ntemplate<typename C>\nstruct result_of_wrap_callable_class<C volatile> {\n  typedef result_of_callable_class<C> volatile type;\n};\n\ntemplate<typename C>\nstruct result_of_wrap_callable_class<C const volatile> {\n  typedef result_of_callable_class<C> const volatile type;\n};\n\ntemplate<typename C>\nstruct result_of_wrap_callable_class<C &> {\n  typedef typename result_of_wrap_callable_class<C>::type &type;\n};\n\ntemplate<typename F, bool TestCallability = true> struct cpp0x_result_of_impl;\n\n#else // BOOST_NO_SFINAE_EXPR\n\ntemplate<typename T>\nstruct result_of_always_void\n{\n  typedef void type;\n};\n\ntemplate<typename F, typename Enable = void> struct cpp0x_result_of_impl {};\n\n#endif // BOOST_NO_SFINAE_EXPR\n\ntemplate<typename F>\nstruct result_of_void_impl\n{\n  typedef void type;\n};\n\ntemplate<typename R>\nstruct result_of_void_impl<R (*)(void)>\n{\n  typedef R type;\n};\n\ntemplate<typename R>\nstruct result_of_void_impl<R (&)(void)>\n{\n  typedef R type;\n};\n\n// Determine the return type of a function pointer or pointer to member.\ntemplate<typename F, typename FArgs>\nstruct result_of_pointer\n  : tr1_result_of_impl<typename remove_cv<F>::type, FArgs, false> { };\n\ntemplate<typename F, typename FArgs>\nstruct tr1_result_of_impl<F, FArgs, true>\n{\n  typedef typename F::result_type type;\n};\n\ntemplate<typename FArgs>\nstruct is_function_with_no_args : mpl::false_ {};\n\ntemplate<typename F>\nstruct is_function_with_no_args<F(void)> : mpl::true_ {};\n\ntemplate<typename F, typename FArgs>\nstruct result_of_nested_result : F::template result<FArgs>\n{};\n\ntemplate<typename F, typename FArgs>\nstruct tr1_result_of_impl<F, FArgs, false>\n  : mpl::if_<is_function_with_no_args<FArgs>,\n             result_of_void_impl<F>,\n             result_of_nested_result<F, FArgs> >::type\n{};\n\n} // end namespace detail\n\n#define BOOST_PP_ITERATION_PARAMS_1 (3,(0,BOOST_RESULT_OF_NUM_ARGS,<boost/utility/detail/result_of_iterate.hpp>))\n#include BOOST_PP_ITERATE()\n\n#else\n#  define BOOST_NO_RESULT_OF 1\n#endif\n\n}\n\n#endif // BOOST_RESULT_OF_HPP\n"
  },
  {
    "path": "benchmarks/boost/version.hpp",
    "content": "//  Boost version.hpp configuration header file  ------------------------------//\n\n//  (C) Copyright John maddock 1999. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n//  See http://www.boost.org/libs/config for documentation\n\n#ifndef BOOST_VERSION_HPP\n#define BOOST_VERSION_HPP\n\n//\n//  Caution: this is the only Boost header that is guaranteed\n//  to change with every Boost release. Including this header\n//  will cause a recompile every time a new Boost version is\n//  used.\n//\n//  BOOST_VERSION % 100 is the patch level\n//  BOOST_VERSION / 100 % 1000 is the minor version\n//  BOOST_VERSION / 100000 is the major version\n\n#define BOOST_VERSION 106000\n\n//\n//  BOOST_LIB_VERSION must be defined to be the same as BOOST_VERSION\n//  but as a *string* in the form \"x_y[_z]\" where x is the major version\n//  number, y is the minor version number, and z is the patch level if not 0.\n//  This is used by <config/auto_link.hpp> to select which library version to link to.\n\n#define BOOST_LIB_VERSION \"1_60\"\n\n#endif\n"
  },
  {
    "path": "benchmarks/boostqueue.h",
    "content": "#pragma once\n\n#include <utility>\n\n#include \"boost/lockfree/queue.hpp\"\n#include \"wrappers.h\"\n\ntemplate<typename T>\nstruct BoostQueueWrapper\n{\n\tpublic:\n\ttypedef DummyToken producer_token_t;\n\ttypedef DummyToken consumer_token_t;\n\t\npublic:\n  BoostQueueWrapper() : q(/* starting capacity */ 16384) { }\n\n\ttemplate<typename U>\n\tinline bool enqueue(U&& item)\n\t{\n\t\treturn q.push(std::forward<U>(item));\n\t}\n\t\n\tinline bool try_dequeue(T& item)\n\t{\n\t\treturn q.pop(item);\n\t}\n\t\n\t// Dummy token methods (not used)\n\tbool enqueue(producer_token_t const&, T const&) { return false; }\n\tbool try_enqueue(producer_token_t, T const&) { return false; }\n\tbool try_dequeue(consumer_token_t, T& item) { return false; }\n\ttemplate<typename It> bool enqueue_bulk(It, size_t) { return false; }\n\ttemplate<typename It> bool enqueue_bulk(producer_token_t const&, It, size_t) { return false; }\n\ttemplate<typename It> size_t try_dequeue_bulk(It, size_t) { return 0; }\n\ttemplate<typename It> size_t try_dequeue_bulk(consumer_token_t, It, size_t) { return 0; }\n\t\nprivate:\n\tboost::lockfree::queue<T> q;\n};\n"
  },
  {
    "path": "benchmarks/contrib/benchmarks.aws-32.log",
    "content": "# Run on a 32-core cc2.8xlarge AWS instance\n--- New run (Sat Nov  8 19:43:51 2014) ---\nRunning 64-bit benchmarks on a        Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz\n    (precise mode)\nNote that these are synthetic benchmarks. Take them with a grain of salt.\n\nLegend:\n    'Avg':     Average time taken per operation, normalized to be per thread\n    'Range':   The minimum and maximum times taken per operation (per thread)\n    'Ops/s':   Overall operations per second\n    'Ops/s/t': Operations per second per thread (inverse of 'Avg')\n    Operations include those that fail (e.g. because the queue is empty).\n    Each logical enqueue/dequeue counts as an individual operation when in bulk.\n\nbalanced:\n  (Measures the average operation speed with multiple symmetrical threads\n  under reasonable load -- small random intervals between accesses)\n  > moodycamel::ConcurrentQueue\n      Without tokens\n         2   threads:  Avg: 0.9490us  Range: [0.9444us, 0.9512us]  Ops/s:   2.11M  Ops/s/t:   1.05M\n         3   threads:  Avg: 1.6217us  Range: [1.6120us, 1.6288us]  Ops/s:   1.85M  Ops/s/t: 616.63k\n         4   threads:  Avg: 2.5471us  Range: [2.5150us, 2.5578us]  Ops/s:   1.57M  Ops/s/t: 392.60k\n         8   threads:  Avg: 8.7667us  Range: [8.7260us, 8.8109us]  Ops/s: 912.54k  Ops/s/t: 114.07k\n         12  threads:  Avg: 0.0194ms  Range: [0.0186ms, 0.0196ms]  Ops/s: 618.06k  Ops/s/t:  51.51k\n         16  threads:  Avg: 0.0347ms  Range: [0.0343ms, 0.0348ms]  Ops/s: 461.73k  Ops/s/t:  28.86k\n         32  threads:  Avg: 0.1103ms  Range: [0.1095ms, 0.1110ms]  Ops/s: 290.14k  Ops/s/t:   9.07k\n         Operations per second per thread (weighted average): 190.15k\n\n      With tokens\n         2   threads:  Avg: 0.6626us  Range: [0.6322us, 0.6736us]  Ops/s:   3.02M  Ops/s/t:   1.51M\n         3   threads:  Avg: 1.1325us  Range: [1.1000us, 1.1511us]  Ops/s:   2.65M  Ops/s/t: 882.97k\n         4   threads:  Avg: 1.8496us  Range: [1.8032us, 1.8770us]  Ops/s:   2.16M  Ops/s/t: 540.65k\n         8   threads:  Avg: 6.9275us  Range: [6.8699us, 6.9555us]  Ops/s:   1.15M  Ops/s/t: 144.35k\n         12  threads:  Avg: 0.0152ms  Range: [0.0150ms, 0.0153ms]  Ops/s: 791.01k  Ops/s/t:  65.92k\n         16  threads:  Avg: 0.0252ms  Range: [0.0248ms, 0.0254ms]  Ops/s: 634.43k  Ops/s/t:  39.65k\n         32  threads:  Avg: 0.0634ms  Range: [0.0629ms, 0.0638ms]  Ops/s: 504.94k  Ops/s/t:  15.78k\n         Operations per second per thread (weighted average): 266.86k\n\n  > boost::lockfree::queue\n     2   threads:  Avg: 1.0256us  Range: [0.6384us, 1.0845us]  Ops/s:   1.95M  Ops/s/t: 975.07k\n     3   threads:  Avg: 1.8734us  Range: [1.8230us, 1.8918us]  Ops/s:   1.60M  Ops/s/t: 533.80k\n     4   threads:  Avg: 2.6625us  Range: [2.4000us, 2.8020us]  Ops/s:   1.50M  Ops/s/t: 375.59k\n     8   threads:  Avg: 0.0138ms  Range: [0.0130ms, 0.0144ms]  Ops/s: 577.73k  Ops/s/t:  72.22k\n     12  threads:  Avg: 0.0471ms  Range: [0.0434ms, 0.0487ms]  Ops/s: 254.73k  Ops/s/t:  21.23k\n     16  threads:  Avg: 0.1145ms  Range: [0.1138ms, 0.1154ms]  Ops/s: 139.74k  Ops/s/t:   8.73k\n     32  threads:  Avg: 0.4516ms  Range: [0.4458ms, 0.4532ms]  Ops/s:  70.85k  Ops/s/t:   2.21k\n     Operations per second per thread (weighted average): 160.22k\n\n  > tbb::concurrent_queue\n     2   threads:  Avg: 1.0053us  Range: [0.9950us, 1.0112us]  Ops/s:   1.99M  Ops/s/t: 994.72k\n     3   threads:  Avg: 1.5741us  Range: [1.5690us, 1.5797us]  Ops/s:   1.91M  Ops/s/t: 635.27k\n     4   threads:  Avg: 2.4572us  Range: [2.4326us, 2.4669us]  Ops/s:   1.63M  Ops/s/t: 406.96k\n     8   threads:  Avg: 7.5870us  Range: [7.0968us, 7.6851us]  Ops/s:   1.05M  Ops/s/t: 131.80k\n     12  threads:  Avg: 0.0156ms  Range: [0.0155ms, 0.0158ms]  Ops/s: 767.09k  Ops/s/t:  63.92k\n     16  threads:  Avg: 0.0265ms  Range: [0.0262ms, 0.0266ms]  Ops/s: 604.29k  Ops/s/t:  37.77k\n     32  threads:  Avg: 0.0928ms  Range: [0.0879ms, 0.0957ms]  Ops/s: 344.98k  Ops/s/t:  10.78k\n     Operations per second per thread (weighted average): 195.65k\n\n  > SimpleLockFreeQueue\n     2   threads:  Avg: 1.1227us  Range: [1.0641us, 1.1357us]  Ops/s:   1.78M  Ops/s/t: 890.75k\n     3   threads:  Avg: 1.6745us  Range: [1.4539us, 1.9843us]  Ops/s:   1.79M  Ops/s/t: 597.20k\n     4   threads:  Avg: 3.5253us  Range: [3.5045us, 3.5347us]  Ops/s:   1.13M  Ops/s/t: 283.66k\n     8   threads:  Avg: 0.0196ms  Range: [0.0182ms, 0.0200ms]  Ops/s: 408.60k  Ops/s/t:  51.08k\n     12  threads:  Avg: 0.0687ms  Range: [0.0680ms, 0.0691ms]  Ops/s: 174.55k  Ops/s/t:  14.55k\n     16  threads:  Avg: 0.1619ms  Range: [0.1597ms, 0.1634ms]  Ops/s:  98.85k  Ops/s/t:   6.18k\n     32  threads:  Avg: 0.6604ms  Range: [0.5891ms, 0.6739ms]  Ops/s:  48.46k  Ops/s/t:   1.51k\n     Operations per second per thread (weighted average): 146.45k\n\n  > LockBasedQueue\n     2   threads:  Avg: 1.6278us  Range: [0.7309us, 1.7716us]  Ops/s:   1.23M  Ops/s/t: 614.31k\n     3   threads:  Avg: 3.8231us  Range: [3.7828us, 3.8525us]  Ops/s: 784.71k  Ops/s/t: 261.57k\n     4   threads:  Avg: 8.2348us  Range: [6.7550us, 8.7739us]  Ops/s: 485.75k  Ops/s/t: 121.44k\n     8   threads:  Avg: 0.0468ms  Range: [0.0459ms, 0.0474ms]  Ops/s: 170.89k  Ops/s/t:  21.36k\n     12  threads:  Avg: 0.1094ms  Range: [0.1087ms, 0.1099ms]  Ops/s: 109.74k  Ops/s/t:   9.14k\n     16  threads:  Avg: 0.1959ms  Range: [0.1928ms, 0.1980ms]  Ops/s:  81.69k  Ops/s/t:   5.11k\n     32  threads:  Avg: 0.9527ms  Range: [0.9363ms, 0.9593ms]  Ops/s:  33.59k  Ops/s/t:   1.05k\n     Operations per second per thread (weighted average):  79.79k\n\n  > std::queue\n     (skipping, benchmark not supported...)\n\nonly enqueue:\n  (Measures the average operation speed when all threads are producers)\n  > moodycamel::ConcurrentQueue\n      Without tokens\n         1    thread:  Avg: 0.0141us  Range: [0.0141us, 0.0141us]  Ops/s:  70.69M  Ops/s/t:  70.69M\n         2   threads:  Avg: 0.0249us  Range: [0.0249us, 0.0250us]  Ops/s:  80.19M  Ops/s/t:  40.10M\n         4   threads:  Avg: 0.0499us  Range: [0.0498us, 0.0499us]  Ops/s:  80.20M  Ops/s/t:  20.05M\n         8   threads:  Avg: 0.1010us  Range: [0.1007us, 0.1011us]  Ops/s:  79.21M  Ops/s/t:   9.90M\n         12  threads:  Avg: 0.1543us  Range: [0.1536us, 0.1548us]  Ops/s:  77.78M  Ops/s/t:   6.48M\n         16  threads:  Avg: 0.2154us  Range: [0.2142us, 0.2161us]  Ops/s:  74.28M  Ops/s/t:   4.64M\n         32  threads:  Avg: 0.6913us  Range: [0.6885us, 0.6931us]  Ops/s:  46.29M  Ops/s/t:   1.45M\n         48  threads:  Avg: 1.0539us  Range: [1.0423us, 1.0712us]  Ops/s:  45.55M  Ops/s/t: 948.90k\n         Operations per second per thread (weighted average):  11.32M\n\n      With tokens\n         1    thread:  Avg: 9.0936ns  Range: [9.0686ns, 9.1014ns]  Ops/s: 109.97M  Ops/s/t: 109.97M\n         2   threads:  Avg: 0.0208us  Range: [0.0207us, 0.0208us]  Ops/s:  96.32M  Ops/s/t:  48.16M\n         4   threads:  Avg: 0.0417us  Range: [0.0415us, 0.0417us]  Ops/s:  96.04M  Ops/s/t:  24.01M\n         8   threads:  Avg: 0.0843us  Range: [0.0841us, 0.0845us]  Ops/s:  94.85M  Ops/s/t:  11.86M\n         12  threads:  Avg: 0.1313us  Range: [0.1308us, 0.1316us]  Ops/s:  91.38M  Ops/s/t:   7.62M\n         16  threads:  Avg: 0.1812us  Range: [0.1799us, 0.1820us]  Ops/s:  88.28M  Ops/s/t:   5.52M\n         32  threads:  Avg: 0.5041us  Range: [0.5035us, 0.5046us]  Ops/s:  63.48M  Ops/s/t:   1.98M\n         48  threads:  Avg: 0.7848us  Range: [0.7781us, 0.7938us]  Ops/s:  61.16M  Ops/s/t:   1.27M\n         Operations per second per thread (weighted average):  14.89M\n\n  > boost::lockfree::queue\n     1    thread:  Avg: 0.0533us  Range: [0.0533us, 0.0533us]  Ops/s:  18.76M  Ops/s/t:  18.76M\n     2   threads:  Avg: 1.3973us  Range: [1.3962us, 1.3985us]  Ops/s:   1.43M  Ops/s/t: 715.65k\n     4   threads:  Avg: 7.1735us  Range: [4.8830us, 7.7483us]  Ops/s: 557.61k  Ops/s/t: 139.40k\n     8   threads:  Avg: 0.0413ms  Range: [0.0391ms, 0.0419ms]  Ops/s: 193.47k  Ops/s/t:  24.18k\n     12  threads:  Avg: 0.1030ms  Range: [0.0992ms, 0.1066ms]  Ops/s: 116.47k  Ops/s/t:   9.71k\n     16  threads:  Avg: 0.1928ms  Range: [0.1892ms, 0.1949ms]  Ops/s:  82.97k  Ops/s/t:   5.19k\n     32  threads:  Avg: 0.7135ms  Range: [0.7109ms, 0.7147ms]  Ops/s:  44.85k  Ops/s/t:   1.40k\n     48  threads:  Avg: 1.7082ms  Range: [1.7023ms, 1.7125ms]  Ops/s:  28.10k  Ops/s/t:  585.42\n     Operations per second per thread (weighted average):   1.00M\n\n  > tbb::concurrent_queue\n     1    thread:  Avg: 0.0301us  Range: [0.0301us, 0.0301us]  Ops/s:  33.21M  Ops/s/t:  33.21M\n     2   threads:  Avg: 0.5175us  Range: [0.5168us, 0.5178us]  Ops/s:   3.86M  Ops/s/t:   1.93M\n     4   threads:  Avg: 1.9453us  Range: [1.9412us, 1.9502us]  Ops/s:   2.06M  Ops/s/t: 514.07k\n     8   threads:  Avg: 0.0107ms  Range: [0.0106ms, 0.0107ms]  Ops/s: 748.95k  Ops/s/t:  93.62k\n     12  threads:  Avg: 0.0256ms  Range: [0.0233ms, 0.0261ms]  Ops/s: 468.77k  Ops/s/t:  39.06k\n     16  threads:  Avg: 0.0450ms  Range: [0.0447ms, 0.0451ms]  Ops/s: 355.86k  Ops/s/t:  22.24k\n     32  threads:  Avg: 0.2274ms  Range: [0.2266ms, 0.2281ms]  Ops/s: 140.70k  Ops/s/t:   4.40k\n     48  threads:  Avg: 0.7102ms  Range: [0.7052ms, 0.7157ms]  Ops/s:  67.58k  Ops/s/t:   1.41k\n     Operations per second per thread (weighted average):   1.84M\n\n  > SimpleLockFreeQueue\n     1    thread:  Avg: 0.0496us  Range: [0.0496us, 0.0496us]  Ops/s:  20.18M  Ops/s/t:  20.18M\n     2   threads:  Avg: 1.0667us  Range: [1.0643us, 1.0678us]  Ops/s:   1.87M  Ops/s/t: 937.43k\n     4   threads:  Avg: 4.5046us  Range: [3.9727us, 4.6711us]  Ops/s: 887.98k  Ops/s/t: 222.00k\n     8   threads:  Avg: 0.0156ms  Range: [0.0146ms, 0.0166ms]  Ops/s: 513.34k  Ops/s/t:  64.17k\n     12  threads:  Avg: 0.0378ms  Range: [0.0367ms, 0.0385ms]  Ops/s: 317.46k  Ops/s/t:  26.45k\n     16  threads:  Avg: 0.0684ms  Range: [0.0671ms, 0.0691ms]  Ops/s: 233.94k  Ops/s/t:  14.62k\n     32  threads:  Avg: 0.1494ms  Range: [0.1483ms, 0.1498ms]  Ops/s: 214.18k  Ops/s/t:   6.69k\n     48  threads:  Avg: 0.3392ms  Range: [0.3367ms, 0.3400ms]  Ops/s: 141.51k  Ops/s/t:   2.95k\n     Operations per second per thread (weighted average):   1.14M\n\n  > LockBasedQueue\n     1    thread:  Avg: 0.0546us  Range: [0.0546us, 0.0546us]  Ops/s:  18.30M  Ops/s/t:  18.30M\n     2   threads:  Avg: 0.4666us  Range: [0.4610us, 0.4700us]  Ops/s:   4.29M  Ops/s/t:   2.14M\n     4   threads:  Avg: 5.9669us  Range: [5.0405us, 6.2625us]  Ops/s: 670.37k  Ops/s/t: 167.59k\n     8   threads:  Avg: 0.0217ms  Range: [0.0186ms, 0.0223ms]  Ops/s: 368.76k  Ops/s/t:  46.09k\n     12  threads:  Avg: 0.0395ms  Range: [0.0227ms, 0.0467ms]  Ops/s: 304.07k  Ops/s/t:  25.34k\n     16  threads:  Avg: 0.0775ms  Range: [0.0753ms, 0.0790ms]  Ops/s: 206.41k  Ops/s/t:  12.90k\n     32  threads:  Avg: 0.2710ms  Range: [0.2028ms, 0.2853ms]  Ops/s: 118.07k  Ops/s/t:   3.69k\n     48  threads:  Avg: 0.5390ms  Range: [0.5018ms, 0.5553ms]  Ops/s:  89.05k  Ops/s/t:   1.86k\n     Operations per second per thread (weighted average):   1.13M\n\n  > std::queue\n     1    thread:  Avg: 5.0901ns  Range: [5.0309ns, 5.0997ns]  Ops/s: 196.46M  Ops/s/t: 196.46M\n     Operations per second per thread (weighted average): 196.46M\n\nonly enqueue (pre-allocated):\n  (Measures the average operation speed when all threads are producers,\n  and the queue has been stretched out first)\n  > moodycamel::ConcurrentQueue\n      Without tokens\n         1    thread:  Avg: 0.0126us  Range: [0.0126us, 0.0126us]  Ops/s:  79.19M  Ops/s/t:  79.19M\n         2   threads:  Avg: 0.0337us  Range: [0.0337us, 0.0337us]  Ops/s:  59.37M  Ops/s/t:  29.69M\n         4   threads:  Avg: 0.1239us  Range: [0.1214us, 0.1253us]  Ops/s:  32.28M  Ops/s/t:   8.07M\n         8   threads:  Avg: 0.5276us  Range: [0.5163us, 0.5358us]  Ops/s:  15.16M  Ops/s/t:   1.90M\n         32  threads:  Avg: 0.0168ms  Range: [0.0165ms, 0.0169ms]  Ops/s:   1.91M  Ops/s/t:  59.62k\n         Operations per second per thread (weighted average):  11.09M\n\n      With tokens\n         1    thread:  Avg: 7.5041ns  Range: [7.4886ns, 7.5103ns]  Ops/s: 133.26M  Ops/s/t: 133.26M\n         2   threads:  Avg: 0.0168us  Range: [0.0167us, 0.0168us]  Ops/s: 119.21M  Ops/s/t:  59.60M\n         4   threads:  Avg: 0.0331us  Range: [0.0330us, 0.0331us]  Ops/s: 120.88M  Ops/s/t:  30.22M\n         8   threads:  Avg: 0.0661us  Range: [0.0655us, 0.0665us]  Ops/s: 121.05M  Ops/s/t:  15.13M\n         32  threads:  Avg: 0.3257us  Range: [0.3239us, 0.3267us]  Ops/s:  98.25M  Ops/s/t:   3.07M\n         Operations per second per thread (weighted average):  26.22M\n\n  > boost::lockfree::queue\n     1    thread:  Avg: 0.0358us  Range: [0.0357us, 0.0358us]  Ops/s:  27.96M  Ops/s/t:  27.96M\n     2   threads:  Avg: 0.2404us  Range: [0.2268us, 0.2599us]  Ops/s:   8.32M  Ops/s/t:   4.16M\n     4   threads:  Avg: 7.3158us  Range: [6.9033us, 8.1491us]  Ops/s: 546.76k  Ops/s/t: 136.69k\n     8   threads:  Avg: 0.0487ms  Range: [0.0465ms, 0.0492ms]  Ops/s: 164.38k  Ops/s/t:  20.55k\n     32  threads:  Avg: 0.5564ms  Range: [0.5395ms, 0.5664ms]  Ops/s:  57.51k  Ops/s/t:   1.80k\n     Operations per second per thread (weighted average):   2.65M\n\n  > tbb::concurrent_queue\n     1    thread:  Avg: 0.0301us  Range: [0.0301us, 0.0301us]  Ops/s:  33.25M  Ops/s/t:  33.25M\n     2   threads:  Avg: 0.5946us  Range: [0.5919us, 0.5973us]  Ops/s:   3.36M  Ops/s/t:   1.68M\n     4   threads:  Avg: 1.9060us  Range: [1.9048us, 1.9069us]  Ops/s:   2.10M  Ops/s/t: 524.66k\n     8   threads:  Avg: 0.0105ms  Range: [0.0105ms, 0.0105ms]  Ops/s: 761.71k  Ops/s/t:  95.21k\n     32  threads:  Avg: 0.2255ms  Range: [0.2248ms, 0.2259ms]  Ops/s: 141.91k  Ops/s/t:   4.43k\n     Operations per second per thread (weighted average):   2.87M\n\n  > SimpleLockFreeQueue\n     1    thread:  Avg: 0.0460us  Range: [0.0460us, 0.0460us]  Ops/s:  21.73M  Ops/s/t:  21.73M\n     2   threads:  Avg: 1.2065us  Range: [1.2053us, 1.2073us]  Ops/s:   1.66M  Ops/s/t: 828.82k\n     4   threads:  Avg: 4.9670us  Range: [4.3212us, 5.1403us]  Ops/s: 805.32k  Ops/s/t: 201.33k\n     8   threads:  Avg: 0.0192ms  Range: [0.0188ms, 0.0194ms]  Ops/s: 417.06k  Ops/s/t:  52.13k\n     32  threads:  Avg: 0.2600ms  Range: [0.2589ms, 0.2607ms]  Ops/s: 123.06k  Ops/s/t:   3.85k\n     Operations per second per thread (weighted average):   1.82M\n\n  > LockBasedQueue\n     1    thread:  Avg: 0.0553us  Range: [0.0552us, 0.0553us]  Ops/s:  18.09M  Ops/s/t:  18.09M\n     2   threads:  Avg: 0.4806us  Range: [0.4753us, 0.4859us]  Ops/s:   4.16M  Ops/s/t:   2.08M\n     4   threads:  Avg: 4.9843us  Range: [4.7319us, 5.1623us]  Ops/s: 802.51k  Ops/s/t: 200.63k\n     8   threads:  Avg: 0.0218ms  Range: [0.0202ms, 0.0223ms]  Ops/s: 366.19k  Ops/s/t:  45.77k\n     32  threads:  Avg: 0.2786ms  Range: [0.2736ms, 0.2813ms]  Ops/s: 114.85k  Ops/s/t:   3.59k\n     Operations per second per thread (weighted average):   1.67M\n\n  > std::queue\n     1    thread:  Avg: 5.1703ns  Range: [5.1616ns, 5.1739ns]  Ops/s: 193.41M  Ops/s/t: 193.41M\n     Operations per second per thread (weighted average): 193.41M\n\nonly enqueue bulk:\n  (Measures the average speed of enqueueing an item in bulk when all threads are producers)\n  > moodycamel::ConcurrentQueue\n      Without tokens\n         1    thread:  Avg: 4.3278ns  Range: [4.3220ns, 4.3302ns]  Ops/s: 231.07M  Ops/s/t: 231.07M\n         2   threads:  Avg: 8.6521ns  Range: [8.6212ns, 8.6733ns]  Ops/s: 231.16M  Ops/s/t: 115.58M\n         4   threads:  Avg: 0.0175us  Range: [0.0174us, 0.0175us]  Ops/s: 228.85M  Ops/s/t:  57.21M\n         8   threads:  Avg: 0.0340us  Range: [0.0338us, 0.0341us]  Ops/s: 235.47M  Ops/s/t:  29.43M\n         12  threads:  Avg: 0.0595us  Range: [0.0593us, 0.0597us]  Ops/s: 201.65M  Ops/s/t:  16.80M\n         16  threads:  Avg: 0.1129us  Range: [0.1018us, 0.1191us]  Ops/s: 141.69M  Ops/s/t:   8.86M\n         32  threads:  Avg: 0.3418us  Range: [0.3295us, 0.3519us]  Ops/s:  93.62M  Ops/s/t:   2.93M\n         48  threads:  Avg: 0.5520us  Range: [0.5256us, 0.5639us]  Ops/s:  86.96M  Ops/s/t:   1.81M\n         Operations per second per thread (weighted average):  32.34M\n\n      With tokens\n         1    thread:  Avg: 4.0631ns  Range: [4.0621ns, 4.0644ns]  Ops/s: 246.12M  Ops/s/t: 246.12M\n         2   threads:  Avg: 8.6975ns  Range: [8.6641ns, 8.7179ns]  Ops/s: 229.95M  Ops/s/t: 114.98M\n         4   threads:  Avg: 0.0182us  Range: [0.0181us, 0.0182us]  Ops/s: 220.30M  Ops/s/t:  55.08M\n         8   threads:  Avg: 0.0392us  Range: [0.0390us, 0.0393us]  Ops/s: 203.85M  Ops/s/t:  25.48M\n         12  threads:  Avg: 0.0685us  Range: [0.0682us, 0.0687us]  Ops/s: 175.15M  Ops/s/t:  14.60M\n         16  threads:  Avg: 0.1134us  Range: [0.1122us, 0.1142us]  Ops/s: 141.05M  Ops/s/t:   8.82M\n         32  threads:  Avg: 0.3856us  Range: [0.3822us, 0.3872us]  Ops/s:  82.99M  Ops/s/t:   2.59M\n         48  threads:  Avg: 0.5514us  Range: [0.5408us, 0.5617us]  Ops/s:  87.05M  Ops/s/t:   1.81M\n         Operations per second per thread (weighted average):  32.54M\n\n  > boost::lockfree::queue\n     (skipping, benchmark not supported...)\n\n  > tbb::concurrent_queue\n     (skipping, benchmark not supported...)\n\n  > SimpleLockFreeQueue\n     (skipping, benchmark not supported...)\n\n  > LockBasedQueue\n     (skipping, benchmark not supported...)\n\n  > std::queue\n     (skipping, benchmark not supported...)\n\nonly enqueue bulk (pre-allocated):\n  (Measures the average speed of enqueueing an item in bulk when all threads are producers,\n  and the queue has been stretched out first)\n  > moodycamel::ConcurrentQueue\n      Without tokens\n         1    thread:  Avg: 4.3689ns  Range: [4.3676ns, 4.3710ns]  Ops/s: 228.89M  Ops/s/t: 228.89M\n         2   threads:  Avg: 8.9038ns  Range: [8.8807ns, 8.9141ns]  Ops/s: 224.62M  Ops/s/t: 112.31M\n         4   threads:  Avg: 0.0188us  Range: [0.0188us, 0.0189us]  Ops/s: 212.28M  Ops/s/t:  53.07M\n         8   threads:  Avg: 0.0411us  Range: [0.0410us, 0.0413us]  Ops/s: 194.54M  Ops/s/t:  24.32M\n         32  threads:  Avg: 0.4054us  Range: [0.3987us, 0.4083us]  Ops/s:  78.93M  Ops/s/t:   2.47M\n         Operations per second per thread (weighted average):  44.70M\n\n      With tokens\n         1    thread:  Avg: 4.0712ns  Range: [4.0682ns, 4.0741ns]  Ops/s: 245.63M  Ops/s/t: 245.63M\n         2   threads:  Avg: 8.9105ns  Range: [8.8472ns, 8.9616ns]  Ops/s: 224.46M  Ops/s/t: 112.23M\n         4   threads:  Avg: 0.0185us  Range: [0.0184us, 0.0185us]  Ops/s: 216.46M  Ops/s/t:  54.12M\n         8   threads:  Avg: 0.0397us  Range: [0.0396us, 0.0399us]  Ops/s: 201.28M  Ops/s/t:  25.16M\n         32  threads:  Avg: 0.3868us  Range: [0.3856us, 0.3875us]  Ops/s:  82.73M  Ops/s/t:   2.59M\n         Operations per second per thread (weighted average):  46.39M\n\n  > boost::lockfree::queue\n     (skipping, benchmark not supported...)\n\n  > tbb::concurrent_queue\n     (skipping, benchmark not supported...)\n\n  > SimpleLockFreeQueue\n     (skipping, benchmark not supported...)\n\n  > LockBasedQueue\n     (skipping, benchmark not supported...)\n\n  > std::queue\n     (skipping, benchmark not supported...)\n\nonly dequeue:\n  (Measures the average operation speed when all threads are consumers)\n  > moodycamel::ConcurrentQueue\n      Without tokens\n         1    thread:  Avg: 0.0357us  Range: [0.0357us, 0.0357us]  Ops/s:  27.99M  Ops/s/t:  27.99M\n         2   threads:  Avg: 0.7098us  Range: [0.7086us, 0.7108us]  Ops/s:   2.82M  Ops/s/t:   1.41M\n         4   threads:  Avg: 2.6890us  Range: [2.6831us, 2.6970us]  Ops/s:   1.49M  Ops/s/t: 371.89k\n         8   threads:  Avg: 8.9909us  Range: [8.5916us, 9.1297us]  Ops/s: 889.79k  Ops/s/t: 111.22k\n         12  threads:  Avg: 0.0187ms  Range: [0.0185ms, 0.0188ms]  Ops/s: 642.71k  Ops/s/t:  53.56k\n         16  threads:  Avg: 0.0317ms  Range: [0.0310ms, 0.0321ms]  Ops/s: 504.92k  Ops/s/t:  31.56k\n         32  threads:  Avg: 0.0862ms  Range: [0.0855ms, 0.0865ms]  Ops/s: 371.38k  Ops/s/t:  11.61k\n         48  threads:  Avg: 0.2111ms  Range: [0.2092ms, 0.2126ms]  Ops/s: 227.42k  Ops/s/t:   4.74k\n         Operations per second per thread (weighted average): 984.16k\n\n      With tokens\n         1    thread:  Avg: 0.0312us  Range: [0.0312us, 0.0312us]  Ops/s:  32.04M  Ops/s/t:  32.04M\n         2   threads:  Avg: 0.0692us  Range: [0.0691us, 0.0693us]  Ops/s:  28.89M  Ops/s/t:  14.45M\n         4   threads:  Avg: 0.1392us  Range: [0.1389us, 0.1394us]  Ops/s:  28.74M  Ops/s/t:   7.18M\n         8   threads:  Avg: 0.2820us  Range: [0.2804us, 0.2831us]  Ops/s:  28.36M  Ops/s/t:   3.55M\n         12  threads:  Avg: 0.4334us  Range: [0.4315us, 0.4349us]  Ops/s:  27.69M  Ops/s/t:   2.31M\n         16  threads:  Avg: 0.5946us  Range: [0.5828us, 0.6055us]  Ops/s:  26.91M  Ops/s/t:   1.68M\n         32  threads:  Avg: 8.8624us  Range: [7.6002us, 9.7372us]  Ops/s:   3.61M  Ops/s/t: 112.84k\n         48  threads:  Avg: 0.0125ms  Range: [0.0115ms, 0.0136ms]  Ops/s:   3.83M  Ops/s/t:  79.79k\n         Operations per second per thread (weighted average):   3.48M\n\n  > boost::lockfree::queue\n     1    thread:  Avg: 0.0293us  Range: [0.0293us, 0.0293us]  Ops/s:  34.15M  Ops/s/t:  34.15M\n     2   threads:  Avg: 1.2354us  Range: [1.2319us, 1.2374us]  Ops/s:   1.62M  Ops/s/t: 809.45k\n     4   threads:  Avg: 4.7702us  Range: [3.9572us, 4.8897us]  Ops/s: 838.53k  Ops/s/t: 209.63k\n     8   threads:  Avg: 0.0188ms  Range: [0.0185ms, 0.0189ms]  Ops/s: 426.57k  Ops/s/t:  53.32k\n     12  threads:  Avg: 0.0436ms  Range: [0.0429ms, 0.0439ms]  Ops/s: 275.09k  Ops/s/t:  22.92k\n     16  threads:  Avg: 0.0829ms  Range: [0.0807ms, 0.0835ms]  Ops/s: 192.92k  Ops/s/t:  12.06k\n     32  threads:  Avg: 0.3059ms  Range: [0.3049ms, 0.3070ms]  Ops/s: 104.60k  Ops/s/t:   3.27k\n     48  threads:  Avg: 0.7265ms  Range: [0.7189ms, 0.7301ms]  Ops/s:  66.07k  Ops/s/t:   1.38k\n     Operations per second per thread (weighted average):   1.10M\n\n  > tbb::concurrent_queue\n     1    thread:  Avg: 0.0197us  Range: [0.0197us, 0.0197us]  Ops/s:  50.68M  Ops/s/t:  50.68M\n     2   threads:  Avg: 0.3747us  Range: [0.2215us, 0.3976us]  Ops/s:   5.34M  Ops/s/t:   2.67M\n     4   threads:  Avg: 2.1049us  Range: [1.4759us, 2.1970us]  Ops/s:   1.90M  Ops/s/t: 475.08k\n     8   threads:  Avg: 0.0109ms  Range: [0.0107ms, 0.0111ms]  Ops/s: 731.00k  Ops/s/t:  91.38k\n     12  threads:  Avg: 0.0255ms  Range: [0.0254ms, 0.0255ms]  Ops/s: 471.40k  Ops/s/t:  39.28k\n     16  threads:  Avg: 0.0431ms  Range: [0.0386ms, 0.0456ms]  Ops/s: 371.22k  Ops/s/t:  23.20k\n     32  threads:  Avg: 0.1530ms  Range: [0.1520ms, 0.1536ms]  Ops/s: 209.18k  Ops/s/t:   6.54k\n     48  threads:  Avg: 0.6456ms  Range: [0.6427ms, 0.6491ms]  Ops/s:  74.35k  Ops/s/t:   1.55k\n     Operations per second per thread (weighted average):   1.82M\n\n  > SimpleLockFreeQueue\n     1    thread:  Avg: 0.0244us  Range: [0.0244us, 0.0245us]  Ops/s:  40.92M  Ops/s/t:  40.92M\n     2   threads:  Avg: 1.5279us  Range: [1.5107us, 1.5381us]  Ops/s:   1.31M  Ops/s/t: 654.49k\n     4   threads:  Avg: 9.8623us  Range: [9.7481us, 9.8987us]  Ops/s: 405.59k  Ops/s/t: 101.40k\n     8   threads:  Avg: 0.0504ms  Range: [0.0470ms, 0.0522ms]  Ops/s: 158.77k  Ops/s/t:  19.85k\n     12  threads:  Avg: 0.1378ms  Range: [0.1328ms, 0.1407ms]  Ops/s:  87.11k  Ops/s/t:   7.26k\n     16  threads:  Avg: 0.2761ms  Range: [0.2702ms, 0.2790ms]  Ops/s:  57.96k  Ops/s/t:   3.62k\n     32  threads:  Avg: 0.9643ms  Range: [0.9583ms, 0.9689ms]  Ops/s:  33.18k  Ops/s/t:   1.04k\n     48  threads:  Avg: 2.1728ms  Range: [2.1511ms, 2.1824ms]  Ops/s:  22.09k  Ops/s/t:  460.24\n     Operations per second per thread (weighted average):   1.28M\n\n  > LockBasedQueue\n     1    thread:  Avg: 0.0457us  Range: [0.0457us, 0.0457us]  Ops/s:  21.87M  Ops/s/t:  21.87M\n     2   threads:  Avg: 0.3881us  Range: [0.3595us, 0.4002us]  Ops/s:   5.15M  Ops/s/t:   2.58M\n     4   threads:  Avg: 8.5581us  Range: [8.3268us, 8.6466us]  Ops/s: 467.39k  Ops/s/t: 116.85k\n     8   threads:  Avg: 0.0367ms  Range: [0.0346ms, 0.0372ms]  Ops/s: 218.20k  Ops/s/t:  27.27k\n     12  threads:  Avg: 0.0824ms  Range: [0.0806ms, 0.0830ms]  Ops/s: 145.71k  Ops/s/t:  12.14k\n     16  threads:  Avg: 0.1363ms  Range: [0.1032ms, 0.1443ms]  Ops/s: 117.36k  Ops/s/t:   7.34k\n     32  threads:  Avg: 0.4370ms  Range: [0.4082ms, 0.4561ms]  Ops/s:  73.23k  Ops/s/t:   2.29k\n     48  threads:  Avg: 0.7839ms  Range: [0.7233ms, 0.8163ms]  Ops/s:  61.23k  Ops/s/t:   1.28k\n     Operations per second per thread (weighted average): 837.50k\n\n  > std::queue\n     1    thread:  Avg: 3.2964ns  Range: [3.2952ns, 3.2980ns]  Ops/s: 303.36M  Ops/s/t: 303.36M\n     1    thread:  Avg: 3.2976ns  Range: [3.2950ns, 3.2985ns]  Ops/s: 303.25M  Ops/s/t: 303.25M\n     Operations per second per thread (weighted average): 303.31M\n\nonly dequeue bulk:\n  (Measures the average speed of dequeueing an item in bulk when all threads are consumers)\n  > moodycamel::ConcurrentQueue\n      Without tokens\n         1    thread:  Avg: 1.3818ns  Range: [1.3812ns, 1.3828ns]  Ops/s: 723.68M  Ops/s/t: 723.68M\n         2   threads:  Avg: 8.9961ns  Range: [8.9915ns, 8.9977ns]  Ops/s: 222.32M  Ops/s/t: 111.16M\n         4   threads:  Avg: 0.0390us  Range: [0.0389us, 0.0391us]  Ops/s: 102.59M  Ops/s/t:  25.65M\n         8   threads:  Avg: 0.1611us  Range: [0.1607us, 0.1614us]  Ops/s:  49.65M  Ops/s/t:   6.21M\n         12  threads:  Avg: 0.3702us  Range: [0.3327us, 0.3803us]  Ops/s:  32.42M  Ops/s/t:   2.70M\n         16  threads:  Avg: 0.6996us  Range: [0.6953us, 0.7054us]  Ops/s:  22.87M  Ops/s/t:   1.43M\n         32  threads:  Avg: 2.3975us  Range: [2.3849us, 2.4046us]  Ops/s:  13.35M  Ops/s/t: 417.11k\n         48  threads:  Avg: 5.1981us  Range: [5.1573us, 5.2400us]  Ops/s:   9.23M  Ops/s/t: 192.38k\n         Operations per second per thread (weighted average):  30.54M\n\n      With tokens\n         1    thread:  Avg: 1.2074ns  Range: [1.2052ns, 1.2110ns]  Ops/s: 828.20M  Ops/s/t: 828.20M\n         2   threads:  Avg: 2.8806ns  Range: [2.8747ns, 2.8845ns]  Ops/s: 694.30M  Ops/s/t: 347.15M\n         4   threads:  Avg: 5.7023ns  Range: [5.6673ns, 5.7191ns]  Ops/s: 701.47M  Ops/s/t: 175.37M\n         8   threads:  Avg: 0.0126us  Range: [0.0126us, 0.0127us]  Ops/s: 634.07M  Ops/s/t:  79.26M\n         12  threads:  Avg: 0.0213us  Range: [0.0213us, 0.0213us]  Ops/s: 563.18M  Ops/s/t:  46.93M\n         16  threads:  Avg: 0.0323us  Range: [0.0323us, 0.0324us]  Ops/s: 494.72M  Ops/s/t:  30.92M\n         32  threads:  Avg: 0.1146us  Range: [0.1121us, 0.1151us]  Ops/s: 279.12M  Ops/s/t:   8.72M\n         48  threads:  Avg: 0.1535us  Range: [0.1530us, 0.1538us]  Ops/s: 312.73M  Ops/s/t:   6.52M\n         Operations per second per thread (weighted average):  86.51M\n\n  > boost::lockfree::queue\n     (skipping, benchmark not supported...)\n\n  > tbb::concurrent_queue\n     (skipping, benchmark not supported...)\n\n  > SimpleLockFreeQueue\n     (skipping, benchmark not supported...)\n\n  > LockBasedQueue\n     (skipping, benchmark not supported...)\n\n  > std::queue\n     (skipping, benchmark not supported...)\n\nmostly enqueue:\n  (Measures the average operation speed when most threads are enqueueing)\n  > moodycamel::ConcurrentQueue\n      Without tokens\n         2   threads:  Avg: 0.1469us  Range: [0.0750us, 0.1572us]  Ops/s:  13.61M  Ops/s/t:   6.81M\n         4   threads:  Avg: 0.1857us  Range: [0.1846us, 0.1868us]  Ops/s:  21.54M  Ops/s/t:   5.38M\n         8   threads:  Avg: 0.8476us  Range: [0.8309us, 0.8565us]  Ops/s:   9.44M  Ops/s/t:   1.18M\n         32  threads:  Avg: 9.9740us  Range: [9.8477us, 0.0101ms]  Ops/s:   3.21M  Ops/s/t: 100.26k\n         Operations per second per thread (weighted average):   2.04M\n\n      With tokens\n         2   threads:  Avg: 0.0950us  Range: [0.0891us, 0.0964us]  Ops/s:  21.04M  Ops/s/t:  10.52M\n         4   threads:  Avg: 0.0852us  Range: [0.0852us, 0.0853us]  Ops/s:  46.94M  Ops/s/t:  11.74M\n         8   threads:  Avg: 0.2579us  Range: [0.1719us, 0.4591us]  Ops/s:  31.02M  Ops/s/t:   3.88M\n         32  threads:  Avg: 3.4474us  Range: [1.9589us, 4.7942us]  Ops/s:   9.28M  Ops/s/t: 290.07k\n         Operations per second per thread (weighted average):   4.28M\n\n  > boost::lockfree::queue\n     2   threads:  Avg: 0.1359us  Range: [0.1334us, 0.1373us]  Ops/s:  14.71M  Ops/s/t:   7.36M\n     4   threads:  Avg: 4.1708us  Range: [3.5076us, 4.3484us]  Ops/s: 959.05k  Ops/s/t: 239.76k\n     8   threads:  Avg: 0.0262ms  Range: [0.0259ms, 0.0264ms]  Ops/s: 305.26k  Ops/s/t:  38.16k\n     32  threads:  Avg: 0.4770ms  Range: [0.4692ms, 0.4830ms]  Ops/s:  67.08k  Ops/s/t:   2.10k\n     Operations per second per thread (weighted average): 924.62k\n\n  > tbb::concurrent_queue\n     2   threads:  Avg: 0.1219us  Range: [0.1113us, 0.1395us]  Ops/s:  16.41M  Ops/s/t:   8.20M\n     4   threads:  Avg: 1.5456us  Range: [1.5278us, 1.5544us]  Ops/s:   2.59M  Ops/s/t: 647.00k\n     8   threads:  Avg: 7.6602us  Range: [7.3877us, 7.8992us]  Ops/s:   1.04M  Ops/s/t: 130.54k\n     32  threads:  Avg: 0.1652ms  Range: [0.1648ms, 0.1655ms]  Ops/s: 193.70k  Ops/s/t:   6.05k\n     Operations per second per thread (weighted average):   1.12M\n\n  > SimpleLockFreeQueue\n     2   threads:  Avg: 0.9759us  Range: [0.9742us, 0.9783us]  Ops/s:   2.05M  Ops/s/t:   1.02M\n     4   threads:  Avg: 4.5384us  Range: [3.3258us, 4.7206us]  Ops/s: 881.38k  Ops/s/t: 220.34k\n     8   threads:  Avg: 0.0169ms  Range: [0.0165ms, 0.0172ms]  Ops/s: 472.04k  Ops/s/t:  59.00k\n     32  threads:  Avg: 0.2282ms  Range: [0.2272ms, 0.2293ms]  Ops/s: 140.23k  Ops/s/t:   4.38k\n     Operations per second per thread (weighted average): 174.92k\n\n  > LockBasedQueue\n     2   threads:  Avg: 0.2195us  Range: [0.2176us, 0.2217us]  Ops/s:   9.11M  Ops/s/t:   4.55M\n     4   threads:  Avg: 6.7491us  Range: [4.7114us, 7.6459us]  Ops/s: 592.67k  Ops/s/t: 148.17k\n     8   threads:  Avg: 0.0326ms  Range: [0.0304ms, 0.0351ms]  Ops/s: 245.33k  Ops/s/t:  30.67k\n     32  threads:  Avg: 0.4410ms  Range: [0.3794ms, 0.4928ms]  Ops/s:  72.57k  Ops/s/t:   2.27k\n     Operations per second per thread (weighted average): 574.60k\n\n  > std::queue\n     (skipping, benchmark not supported...)\n\nmostly enqueue bulk:\n  (Measures the average speed of enqueueing an item in bulk under light contention)\n  > moodycamel::ConcurrentQueue\n      Without tokens\n         2   threads:  Avg: 8.0674ns  Range: [8.0590ns, 8.0748ns]  Ops/s: 247.91M  Ops/s/t: 123.96M\n         4   threads:  Avg: 0.0184us  Range: [0.0183us, 0.0185us]  Ops/s: 217.04M  Ops/s/t:  54.26M\n         8   threads:  Avg: 0.0383us  Range: [0.0380us, 0.0384us]  Ops/s: 208.95M  Ops/s/t:  26.12M\n         32  threads:  Avg: 0.2972us  Range: [0.2858us, 0.3040us]  Ops/s: 107.67M  Ops/s/t:   3.36M\n         Operations per second per thread (weighted average):  31.66M\n\n      With tokens\n         2   threads:  Avg: 8.0878ns  Range: [7.2902ns, 8.2116ns]  Ops/s: 247.29M  Ops/s/t: 123.64M\n         4   threads:  Avg: 0.0143us  Range: [0.0136us, 0.0146us]  Ops/s: 279.47M  Ops/s/t:  69.87M\n         8   threads:  Avg: 0.0328us  Range: [0.0306us, 0.0378us]  Ops/s: 243.54M  Ops/s/t:  30.44M\n         32  threads:  Avg: 0.2700us  Range: [0.2470us, 0.2801us]  Ops/s: 118.51M  Ops/s/t:   3.70M\n         Operations per second per thread (weighted average):  35.43M\n\n  > boost::lockfree::queue\n     (skipping, benchmark not supported...)\n\n  > tbb::concurrent_queue\n     (skipping, benchmark not supported...)\n\n  > SimpleLockFreeQueue\n     (skipping, benchmark not supported...)\n\n  > LockBasedQueue\n     (skipping, benchmark not supported...)\n\n  > std::queue\n     (skipping, benchmark not supported...)\n\nmostly dequeue:\n  (Measures the average operation speed when most threads are dequeueing)\n  > moodycamel::ConcurrentQueue\n      Without tokens\n         2   threads:  Avg: 0.1215us  Range: [0.1195us, 0.1224us]  Ops/s:  16.46M  Ops/s/t:   8.23M\n         4   threads:  Avg: 1.6265us  Range: [1.6144us, 1.6423us]  Ops/s:   2.46M  Ops/s/t: 614.83k\n         8   threads:  Avg: 5.0893us  Range: [5.0332us, 5.1180us]  Ops/s:   1.57M  Ops/s/t: 196.49k\n         Operations per second per thread (weighted average):   2.15M\n\n      With tokens\n         2   threads:  Avg: 0.1570us  Range: [0.1397us, 0.1603us]  Ops/s:  12.74M  Ops/s/t:   6.37M\n         4   threads:  Avg: 1.5041us  Range: [1.5001us, 1.5064us]  Ops/s:   2.66M  Ops/s/t: 664.87k\n         8   threads:  Avg: 1.5055us  Range: [1.4913us, 1.5111us]  Ops/s:   5.31M  Ops/s/t: 664.24k\n         Operations per second per thread (weighted average):   1.96M\n\n  > boost::lockfree::queue\n     2   threads:  Avg: 0.4529us  Range: [0.4522us, 0.4535us]  Ops/s:   4.42M  Ops/s/t:   2.21M\n     4   threads:  Avg: 2.2630us  Range: [2.0034us, 2.3220us]  Ops/s:   1.77M  Ops/s/t: 441.90k\n     8   threads:  Avg: 0.0116ms  Range: [0.0115ms, 0.0116ms]  Ops/s: 690.84k  Ops/s/t:  86.35k\n     Operations per second per thread (weighted average): 680.85k\n\n  > tbb::concurrent_queue\n     2   threads:  Avg: 0.3612us  Range: [0.3582us, 0.3629us]  Ops/s:   5.54M  Ops/s/t:   2.77M\n     4   threads:  Avg: 0.9626us  Range: [0.5721us, 1.1233us]  Ops/s:   4.16M  Ops/s/t:   1.04M\n     8   threads:  Avg: 5.8279us  Range: [5.2630us, 6.2185us]  Ops/s:   1.37M  Ops/s/t: 171.59k\n     Operations per second per thread (weighted average):   1.04M\n\n  > SimpleLockFreeQueue\n     2   threads:  Avg: 1.1719us  Range: [1.1633us, 1.1786us]  Ops/s:   1.71M  Ops/s/t: 853.34k\n     4   threads:  Avg: 4.9511us  Range: [3.2836us, 5.4309us]  Ops/s: 807.90k  Ops/s/t: 201.97k\n     8   threads:  Avg: 0.0270ms  Range: [0.0260ms, 0.0275ms]  Ops/s: 295.91k  Ops/s/t:  36.99k\n     Operations per second per thread (weighted average): 274.78k\n\n  > LockBasedQueue\n     2   threads:  Avg: 0.3299us  Range: [0.3162us, 0.3417us]  Ops/s:   6.06M  Ops/s/t:   3.03M\n     4   threads:  Avg: 5.8541us  Range: [5.5493us, 6.1109us]  Ops/s: 683.28k  Ops/s/t: 170.82k\n     8   threads:  Avg: 0.0239ms  Range: [0.0227ms, 0.0248ms]  Ops/s: 334.93k  Ops/s/t:  41.87k\n     Operations per second per thread (weighted average): 760.33k\n\n  > std::queue\n     (skipping, benchmark not supported...)\n\nmostly dequeue bulk:\n  (Measures the average speed of dequeueing an item in bulk under light contention)\n  > moodycamel::ConcurrentQueue\n      Without tokens\n         2   threads:  Avg: 0.0108us  Range: [0.0103us, 0.0109us]  Ops/s: 185.78M  Ops/s/t:  92.89M\n         4   threads:  Avg: 0.0373us  Range: [0.0372us, 0.0373us]  Ops/s: 107.36M  Ops/s/t:  26.84M\n         8   threads:  Avg: 0.1495us  Range: [0.1462us, 0.1561us]  Ops/s:  53.52M  Ops/s/t:   6.69M\n         Operations per second per thread (weighted average):  32.67M\n\n      With tokens\n         2   threads:  Avg: 3.7186ns  Range: [3.7151ns, 3.7217ns]  Ops/s: 537.84M  Ops/s/t: 268.92M\n         4   threads:  Avg: 6.9914ns  Range: [6.9631ns, 7.0045ns]  Ops/s: 572.13M  Ops/s/t: 143.03M\n         8   threads:  Avg: 0.0141us  Range: [0.0140us, 0.0143us]  Ops/s: 565.65M  Ops/s/t:  70.71M\n         Operations per second per thread (weighted average): 138.78M\n\n  > boost::lockfree::queue\n     (skipping, benchmark not supported...)\n\n  > tbb::concurrent_queue\n     (skipping, benchmark not supported...)\n\n  > SimpleLockFreeQueue\n     (skipping, benchmark not supported...)\n\n  > LockBasedQueue\n     (skipping, benchmark not supported...)\n\n  > std::queue\n     (skipping, benchmark not supported...)\n\nsingle-producer, multi-consumer (measuring all but 1 thread):\n  (Measures the average speed of dequeueing with only one producer, but multiple consumers)\n  > moodycamel::ConcurrentQueue\n      Without tokens\n         2   threads:  Avg: 0.2405us  Range: [0.2389us, 0.2410us]  Ops/s:   4.16M  Ops/s/t:   4.16M\n         4   threads:  Avg: 4.2169us  Range: [3.0232us, 4.7858us]  Ops/s: 711.43k  Ops/s/t: 237.14k\n         8   threads:  Avg: 5.7117us  Range: [4.7950us, 6.1325us]  Ops/s:   1.23M  Ops/s/t: 175.08k\n         16  threads:  Avg: 8.3830us  Range: [8.1155us, 8.6670us]  Ops/s:   1.79M  Ops/s/t: 119.29k\n         Operations per second per thread (weighted average): 593.96k\n\n      With tokens\n         2   threads:  Avg: 0.2474us  Range: [0.2461us, 0.2485us]  Ops/s:   4.04M  Ops/s/t:   4.04M\n         4   threads:  Avg: 3.3233us  Range: [3.1959us, 3.4740us]  Ops/s: 902.71k  Ops/s/t: 300.90k\n         8   threads:  Avg: 5.0620us  Range: [4.0865us, 5.8400us]  Ops/s:   1.38M  Ops/s/t: 197.55k\n         16  threads:  Avg: 0.0105ms  Range: [6.5440us, 0.0153ms]  Ops/s:   1.42M  Ops/s/t:  94.84k\n         Operations per second per thread (weighted average): 589.43k\n\n  > boost::lockfree::queue\n     2   threads:  Avg: 0.1318us  Range: [0.1267us, 0.1376us]  Ops/s:   7.59M  Ops/s/t:   7.59M\n     4   threads:  Avg: 0.3896us  Range: [0.3650us, 0.4586us]  Ops/s:   7.70M  Ops/s/t:   2.57M\n     8   threads:  Avg: 0.8681us  Range: [0.8362us, 0.9220us]  Ops/s:   8.06M  Ops/s/t:   1.15M\n     16  threads:  Avg: 2.4247us  Range: [2.3627us, 2.4832us]  Ops/s:   6.19M  Ops/s/t: 412.42k\n     Operations per second per thread (weighted average):   1.80M\n\n  > tbb::concurrent_queue\n     2   threads:  Avg: 0.3890us  Range: [0.3863us, 0.3925us]  Ops/s:   2.57M  Ops/s/t:   2.57M\n     4   threads:  Avg: 0.3788us  Range: [0.2911us, 1.0901us]  Ops/s:   7.92M  Ops/s/t:   2.64M\n     8   threads:  Avg: 0.6557us  Range: [0.5637us, 1.4010us]  Ops/s:  10.67M  Ops/s/t:   1.52M\n     16  threads:  Avg: 4.2543us  Range: [2.0247us, 0.0336ms]  Ops/s:   3.53M  Ops/s/t: 235.06k\n     Operations per second per thread (weighted average):   1.31M\n\n  > SimpleLockFreeQueue\n     2   threads:  Avg: 0.5829us  Range: [0.4318us, 0.6558us]  Ops/s:   1.72M  Ops/s/t:   1.72M\n     4   threads:  Avg: 3.7357us  Range: [2.8465us, 5.8089us]  Ops/s: 803.07k  Ops/s/t: 267.69k\n     8   threads:  Avg: 8.7515us  Range: [3.1555us, 0.0191ms]  Ops/s: 799.86k  Ops/s/t: 114.27k\n     16  threads:  Avg: 0.0202ms  Range: [0.0126ms, 0.0367ms]  Ops/s: 742.55k  Ops/s/t:  49.50k\n     Operations per second per thread (weighted average): 288.98k\n\n  > LockBasedQueue\n     2   threads:  Avg: 0.1033us  Range: [0.1021us, 0.1044us]  Ops/s:   9.68M  Ops/s/t:   9.68M\n     4   threads:  Avg: 2.7103us  Range: [2.6647us, 2.7505us]  Ops/s:   1.11M  Ops/s/t: 368.97k\n     8   threads:  Avg: 8.2018us  Range: [7.9971us, 8.4244us]  Ops/s: 853.48k  Ops/s/t: 121.93k\n     16  threads:  Avg: 0.0284ms  Range: [0.0277ms, 0.0289ms]  Ops/s: 527.88k  Ops/s/t:  35.19k\n     Operations per second per thread (weighted average):   1.17M\n\n  > std::queue\n     (skipping, benchmark not supported...)\n\nsingle-producer, multi-consumer (pre-produced):\n  (Measures the average speed of dequeueing from a queue pre-filled by one thread)\n  > moodycamel::ConcurrentQueue\n      Without tokens\n         1    thread:  Avg: 0.0357us  Range: [0.0357us, 0.0358us]  Ops/s:  27.98M  Ops/s/t:  27.98M\n         3   threads:  Avg: 1.0896us  Range: [1.0892us, 1.0903us]  Ops/s:   2.75M  Ops/s/t: 917.77k\n         7   threads:  Avg: 7.4992us  Range: [7.4811us, 7.5053us]  Ops/s: 933.43k  Ops/s/t: 133.35k\n         15  threads:  Avg: 0.0361ms  Range: [0.0359ms, 0.0362ms]  Ops/s: 414.99k  Ops/s/t:  27.67k\n         Operations per second per thread (weighted average):   3.25M\n\n      With tokens\n         1    thread:  Avg: 0.0312us  Range: [0.0312us, 0.0312us]  Ops/s:  32.05M  Ops/s/t:  32.05M\n         3   threads:  Avg: 1.8365us  Range: [1.8311us, 1.8400us]  Ops/s:   1.63M  Ops/s/t: 544.51k\n         7   threads:  Avg: 8.9960us  Range: [8.9815us, 9.0019us]  Ops/s: 778.12k  Ops/s/t: 111.16k\n         15  threads:  Avg: 0.0384ms  Range: [0.0366ms, 0.0393ms]  Ops/s: 390.49k  Ops/s/t:  26.03k\n         Operations per second per thread (weighted average):   3.61M\n\n  > boost::lockfree::queue\n     1    thread:  Avg: 0.0292us  Range: [0.0291us, 0.0293us]  Ops/s:  34.26M  Ops/s/t:  34.26M\n     3   threads:  Avg: 2.4113us  Range: [2.3990us, 2.4172us]  Ops/s:   1.24M  Ops/s/t: 414.71k\n     7   threads:  Avg: 0.0127ms  Range: [0.0125ms, 0.0127ms]  Ops/s: 552.70k  Ops/s/t:  78.96k\n     15  threads:  Avg: 0.0676ms  Range: [0.0670ms, 0.0681ms]  Ops/s: 221.74k  Ops/s/t:  14.78k\n     Operations per second per thread (weighted average):   3.81M\n\n  > tbb::concurrent_queue\n     1    thread:  Avg: 0.0199us  Range: [0.0199us, 0.0199us]  Ops/s:  50.16M  Ops/s/t:  50.16M\n     3   threads:  Avg: 1.3713us  Range: [1.3567us, 1.3797us]  Ops/s:   2.19M  Ops/s/t: 729.25k\n     7   threads:  Avg: 4.9943us  Range: [4.1482us, 5.3368us]  Ops/s:   1.40M  Ops/s/t: 200.23k\n     15  threads:  Avg: 0.0289ms  Range: [0.0224ms, 0.0332ms]  Ops/s: 519.87k  Ops/s/t:  34.66k\n     Operations per second per thread (weighted average):   5.63M\n\n  > SimpleLockFreeQueue\n     1    thread:  Avg: 0.0245us  Range: [0.0244us, 0.0245us]  Ops/s:  40.88M  Ops/s/t:  40.88M\n     3   threads:  Avg: 3.0130us  Range: [2.3021us, 3.4232us]  Ops/s: 995.68k  Ops/s/t: 331.89k\n     7   threads:  Avg: 0.0293ms  Range: [0.0260ms, 0.0304ms]  Ops/s: 238.94k  Ops/s/t:  34.13k\n     15  threads:  Avg: 0.2168ms  Range: [0.2128ms, 0.2191ms]  Ops/s:  69.19k  Ops/s/t:   4.61k\n     Operations per second per thread (weighted average):   4.49M\n\n  > LockBasedQueue\n     1    thread:  Avg: 0.0458us  Range: [0.0457us, 0.0458us]  Ops/s:  21.85M  Ops/s/t:  21.85M\n     3   threads:  Avg: 1.5927us  Range: [1.3496us, 1.9027us]  Ops/s:   1.88M  Ops/s/t: 627.87k\n     7   threads:  Avg: 0.0235ms  Range: [0.0226ms, 0.0239ms]  Ops/s: 297.80k  Ops/s/t:  42.54k\n     15  threads:  Avg: 0.0935ms  Range: [0.0502ms, 0.1009ms]  Ops/s: 160.48k  Ops/s/t:  10.70k\n     Operations per second per thread (weighted average):   2.50M\n\n  > std::queue\n     (skipping, benchmark not supported...)\n\nmulti-producer, single-consumer (measuring 1 thread):\n  (Measures the average speed of dequeueing with only one consumer, but multiple producers)\n  > moodycamel::ConcurrentQueue\n      Without tokens\n         2   threads:  Avg: 0.0729us  Range: [0.0726us, 0.0730us]  Ops/s:  13.72M  Ops/s/t:  13.72M\n         4   threads:  Avg: 0.0507us  Range: [0.0506us, 0.0508us]  Ops/s:  19.73M  Ops/s/t:  19.73M\n         8   threads:  Avg: 0.0844us  Range: [0.0839us, 0.0849us]  Ops/s:  11.85M  Ops/s/t:  11.85M\n         16  threads:  Avg: 0.2197us  Range: [0.2190us, 0.2208us]  Ops/s:   4.55M  Ops/s/t:   4.55M\n         Operations per second per thread (weighted average):  12.46M\n\n      With tokens\n         2   threads:  Avg: 0.0604us  Range: [0.0476us, 0.0624us]  Ops/s:  16.55M  Ops/s/t:  16.55M\n         4   threads:  Avg: 0.0356us  Range: [0.0354us, 0.0357us]  Ops/s:  28.11M  Ops/s/t:  28.11M\n         8   threads:  Avg: 0.0331us  Range: [0.0330us, 0.0332us]  Ops/s:  30.21M  Ops/s/t:  30.21M\n         16  threads:  Avg: 0.0326us  Range: [0.0325us, 0.0326us]  Ops/s:  30.70M  Ops/s/t:  30.70M\n         Operations per second per thread (weighted average):  26.39M\n\n  > boost::lockfree::queue\n     2   threads:  Avg: 0.0476us  Range: [0.0460us, 0.0491us]  Ops/s:  21.02M  Ops/s/t:  21.02M\n     4   threads:  Avg: 0.5888us  Range: [0.4460us, 0.6260us]  Ops/s:   1.70M  Ops/s/t:   1.70M\n     8   threads:  Avg: 0.2697us  Range: [0.1050us, 0.7683us]  Ops/s:   3.71M  Ops/s/t:   3.71M\n     16  threads:  Avg: 1.0713us  Range: [1.0330us, 1.0920us]  Ops/s: 933.44k  Ops/s/t: 933.44k\n     Operations per second per thread (weighted average):   6.84M\n\n  > tbb::concurrent_queue\n     2   threads:  Avg: 0.2368us  Range: [0.1076us, 0.2808us]  Ops/s:   4.22M  Ops/s/t:   4.22M\n     4   threads:  Avg: 0.2267us  Range: [0.2262us, 0.2269us]  Ops/s:   4.41M  Ops/s/t:   4.41M\n     8   threads:  Avg: 0.2114us  Range: [0.2098us, 0.2120us]  Ops/s:   4.73M  Ops/s/t:   4.73M\n     16  threads:  Avg: 0.2197us  Range: [0.2171us, 0.2202us]  Ops/s:   4.55M  Ops/s/t:   4.55M\n     Operations per second per thread (weighted average):   4.48M\n\n  > SimpleLockFreeQueue\n     2   threads:  Avg: 0.3092us  Range: [0.2127us, 0.4384us]  Ops/s:   3.23M  Ops/s/t:   3.23M\n     4   threads:  Avg: 0.4952us  Range: [0.4757us, 0.5015us]  Ops/s:   2.02M  Ops/s/t:   2.02M\n     8   threads:  Avg: 0.3858us  Range: [0.3843us, 0.3862us]  Ops/s:   2.59M  Ops/s/t:   2.59M\n     16  threads:  Avg: 0.3647us  Range: [0.3629us, 0.3660us]  Ops/s:   2.74M  Ops/s/t:   2.74M\n     Operations per second per thread (weighted average):   2.65M\n\n  > LockBasedQueue\n     2   threads:  Avg: 0.1043us  Range: [0.0981us, 0.1714us]  Ops/s:   9.59M  Ops/s/t:   9.59M\n     4   threads:  Avg: 0.7658us  Range: [0.7038us, 0.8431us]  Ops/s:   1.31M  Ops/s/t:   1.31M\n     8   threads:  Avg: 0.6372us  Range: [0.6062us, 0.6615us]  Ops/s:   1.57M  Ops/s/t:   1.57M\n     16  threads:  Avg: 0.5428us  Range: [0.5134us, 0.5528us]  Ops/s:   1.84M  Ops/s/t:   1.84M\n     Operations per second per thread (weighted average):   3.58M\n\n  > std::queue\n     (skipping, benchmark not supported...)\n\ndequeue from empty:\n  (Measures the average speed of attempting to dequeue from an empty queue\n  (that eight separate threads had at one point enqueued to))\n  > moodycamel::ConcurrentQueue\n      Without tokens\n         1    thread:  Avg: 0.1438us  Range: [0.0266us, 0.1617us]  Ops/s:   6.96M  Ops/s/t:   6.96M\n                ^ Note: No contention -- measures raw failed dequeue speed on empty queue\n         2   threads:  Avg: 0.2659us  Range: [0.0935us, 0.3182us]  Ops/s:   7.52M  Ops/s/t:   3.76M\n         8   threads:  Avg: 1.4211us  Range: [1.2605us, 1.5397us]  Ops/s:   5.63M  Ops/s/t: 703.66k\n         32  threads:  Avg: 0.0106ms  Range: [9.5731us, 0.0123ms]  Ops/s:   3.02M  Ops/s/t:  94.42k\n         Operations per second per thread (weighted average):   1.36M\n\n      With tokens\n         1    thread:  Avg: 0.0609us  Range: [0.0541us, 0.0784us]  Ops/s:  16.42M  Ops/s/t:  16.42M\n                ^ Note: No contention -- measures raw failed dequeue speed on empty queue\n         2   threads:  Avg: 0.1062us  Range: [0.0897us, 0.1442us]  Ops/s:  18.84M  Ops/s/t:   9.42M\n         8   threads:  Avg: 0.4811us  Range: [0.3461us, 0.5677us]  Ops/s:  16.63M  Ops/s/t:   2.08M\n         32  threads:  Avg: 5.0579us  Range: [3.0195us, 7.0480us]  Ops/s:   6.33M  Ops/s/t: 197.71k\n         Operations per second per thread (weighted average):   3.37M\n\n  > boost::lockfree::queue\n     1    thread:  Avg: 4.6996ns  Range: [4.6987ns, 4.7002ns]  Ops/s: 212.79M  Ops/s/t: 212.79M\n            ^ Note: No contention -- measures raw failed dequeue speed on empty queue\n     2   threads:  Avg: 8.7301ns  Range: [8.7266ns, 8.7359ns]  Ops/s: 229.09M  Ops/s/t: 114.55M\n     8   threads:  Avg: 0.0349us  Range: [0.0348us, 0.0349us]  Ops/s: 229.54M  Ops/s/t:  28.69M\n     32  threads:  Avg: 0.2145us  Range: [0.2145us, 0.2145us]  Ops/s: 149.19M  Ops/s/t:   4.66M\n     Operations per second per thread (weighted average):  44.25M\n\n  > tbb::concurrent_queue\n     1    thread:  Avg: 3.6913ns  Range: [3.6889ns, 3.6921ns]  Ops/s: 270.91M  Ops/s/t: 270.91M\n            ^ Note: No contention -- measures raw failed dequeue speed on empty queue\n     2   threads:  Avg: 7.3977ns  Range: [7.3920ns, 7.4032ns]  Ops/s: 270.36M  Ops/s/t: 135.18M\n     8   threads:  Avg: 0.0296us  Range: [0.0296us, 0.0296us]  Ops/s: 270.48M  Ops/s/t:  33.81M\n     32  threads:  Avg: 0.1744us  Range: [0.1743us, 0.1745us]  Ops/s: 183.45M  Ops/s/t:   5.73M\n     Operations per second per thread (weighted average):  54.14M\n\n  > SimpleLockFreeQueue\n     1    thread:  Avg: 4.8994ns  Range: [4.8967ns, 4.9013ns]  Ops/s: 204.11M  Ops/s/t: 204.11M\n            ^ Note: No contention -- measures raw failed dequeue speed on empty queue\n     2   threads:  Avg: 0.0102us  Range: [0.0102us, 0.0102us]  Ops/s: 196.03M  Ops/s/t:  98.02M\n     8   threads:  Avg: 0.0407us  Range: [0.0407us, 0.0408us]  Ops/s: 196.35M  Ops/s/t:  24.54M\n     32  threads:  Avg: 0.3004us  Range: [0.3000us, 0.3009us]  Ops/s: 106.53M  Ops/s/t:   3.33M\n     Operations per second per thread (weighted average):  39.54M\n\n  > LockBasedQueue\n     1    thread:  Avg: 0.0251us  Range: [0.0251us, 0.0251us]  Ops/s:  39.89M  Ops/s/t:  39.89M\n            ^ Note: No contention -- measures raw failed dequeue speed on empty queue\n     2   threads:  Avg: 0.1986us  Range: [0.1951us, 0.2009us]  Ops/s:  10.07M  Ops/s/t:   5.03M\n     8   threads:  Avg: 6.3745us  Range: [5.5998us, 6.5522us]  Ops/s:   1.25M  Ops/s/t: 156.87k\n     32  threads:  Avg: 0.0864ms  Range: [0.0852ms, 0.0876ms]  Ops/s: 370.26k  Ops/s/t:  11.57k\n     Operations per second per thread (weighted average):   4.36M\n\n  > std::queue\n     1    thread:  Avg: 0.6708ns  Range: [0.6705ns, 0.6710ns]  Ops/s:   1.49G  Ops/s/t:   1.49G\n            ^ Note: No contention -- measures raw failed dequeue speed on empty queue\n     Operations per second per thread (weighted average):   1.49G\n\nenqueue-dequeue pairs:\n  (Measures the average operation speed with each thread doing an enqueue\n  followed by a dequeue)\n  > moodycamel::ConcurrentQueue\n      Without tokens\n         1    thread:  Avg: 0.0214us  Range: [0.0214us, 0.0214us]  Ops/s:  46.84M  Ops/s/t:  46.84M\n                ^ Note: No contention -- measures speed of immediately dequeueing the item that was just enqueued\n         2   threads:  Avg: 0.1197us  Range: [0.0976us, 0.1773us]  Ops/s:  16.71M  Ops/s/t:   8.35M\n         4   threads:  Avg: 1.3761us  Range: [1.2900us, 1.4179us]  Ops/s:   2.91M  Ops/s/t: 726.67k\n         8   threads:  Avg: 5.7697us  Range: [5.6598us, 5.8091us]  Ops/s:   1.39M  Ops/s/t: 173.32k\n         32  threads:  Avg: 0.0754ms  Range: [0.0748ms, 0.0759ms]  Ops/s: 424.33k  Ops/s/t:  13.26k\n         Operations per second per thread (weighted average):   4.70M\n\n      With tokens\n         1    thread:  Avg: 0.0170us  Range: [0.0170us, 0.0170us]  Ops/s:  58.79M  Ops/s/t:  58.79M\n                ^ Note: No contention -- measures speed of immediately dequeueing the item that was just enqueued\n         2   threads:  Avg: 0.0498us  Range: [0.0485us, 0.0505us]  Ops/s:  40.12M  Ops/s/t:  20.06M\n         4   threads:  Avg: 0.1080us  Range: [0.1024us, 0.1103us]  Ops/s:  37.03M  Ops/s/t:   9.26M\n         8   threads:  Avg: 0.3397us  Range: [0.3264us, 0.3478us]  Ops/s:  23.55M  Ops/s/t:   2.94M\n         32  threads:  Avg: 9.0299us  Range: [8.7799us, 9.2197us]  Ops/s:   3.54M  Ops/s/t: 110.74k\n         Operations per second per thread (weighted average):   8.89M\n\n  > boost::lockfree::queue\n     1    thread:  Avg: 0.0328us  Range: [0.0328us, 0.0328us]  Ops/s:  30.45M  Ops/s/t:  30.45M\n            ^ Note: No contention -- measures speed of immediately dequeueing the item that was just enqueued\n     2   threads:  Avg: 1.1448us  Range: [0.4117us, 1.2515us]  Ops/s:   1.75M  Ops/s/t: 873.54k\n     4   threads:  Avg: 4.6480us  Range: [4.0236us, 4.8069us]  Ops/s: 860.58k  Ops/s/t: 215.15k\n     8   threads:  Avg: 0.0198ms  Range: [0.0190ms, 0.0208ms]  Ops/s: 403.50k  Ops/s/t:  50.44k\n     32  threads:  Avg: 0.4098ms  Range: [0.4018ms, 0.4142ms]  Ops/s:  78.09k  Ops/s/t:   2.44k\n     Operations per second per thread (weighted average):   2.50M\n\n  > tbb::concurrent_queue\n     1    thread:  Avg: 0.0224us  Range: [0.0224us, 0.0224us]  Ops/s:  44.66M  Ops/s/t:  44.66M\n            ^ Note: No contention -- measures speed of immediately dequeueing the item that was just enqueued\n     2   threads:  Avg: 0.5825us  Range: [0.5799us, 0.5844us]  Ops/s:   3.43M  Ops/s/t:   1.72M\n     4   threads:  Avg: 2.5531us  Range: [2.1310us, 2.6899us]  Ops/s:   1.57M  Ops/s/t: 391.67k\n     8   threads:  Avg: 0.0101ms  Range: [0.0101ms, 0.0102ms]  Ops/s: 789.08k  Ops/s/t:  98.64k\n     32  threads:  Avg: 0.1343ms  Range: [0.1311ms, 0.1371ms]  Ops/s: 238.28k  Ops/s/t:   7.45k\n     Operations per second per thread (weighted average):   3.74M\n\n  > SimpleLockFreeQueue\n     1    thread:  Avg: 0.0429us  Range: [0.0429us, 0.0429us]  Ops/s:  23.30M  Ops/s/t:  23.30M\n            ^ Note: No contention -- measures speed of immediately dequeueing the item that was just enqueued\n     2   threads:  Avg: 0.9275us  Range: [0.9030us, 0.9385us]  Ops/s:   2.16M  Ops/s/t:   1.08M\n     4   threads:  Avg: 5.2883us  Range: [5.2680us, 5.2959us]  Ops/s: 756.39k  Ops/s/t: 189.10k\n     8   threads:  Avg: 0.0297ms  Range: [0.0267ms, 0.0315ms]  Ops/s: 269.42k  Ops/s/t:  33.68k\n     32  threads:  Avg: 0.6158ms  Range: [0.6028ms, 0.6242ms]  Ops/s:  51.96k  Ops/s/t:   1.62k\n     Operations per second per thread (weighted average):   1.96M\n\n  > LockBasedQueue\n     1    thread:  Avg: 0.0503us  Range: [0.0503us, 0.0504us]  Ops/s:  19.86M  Ops/s/t:  19.86M\n            ^ Note: No contention -- measures speed of immediately dequeueing the item that was just enqueued\n     2   threads:  Avg: 0.4039us  Range: [0.3996us, 0.4073us]  Ops/s:   4.95M  Ops/s/t:   2.48M\n     4   threads:  Avg: 4.8038us  Range: [4.0986us, 5.4712us]  Ops/s: 832.68k  Ops/s/t: 208.17k\n     8   threads:  Avg: 0.0324ms  Range: [0.0286ms, 0.0335ms]  Ops/s: 246.75k  Ops/s/t:  30.84k\n     32  threads:  Avg: 0.3925ms  Range: [0.3335ms, 0.4503ms]  Ops/s:  81.52k  Ops/s/t:   2.55k\n     Operations per second per thread (weighted average):   1.85M\n\n  > std::queue\n     1    thread:  Avg: 2.7071ns  Range: [2.7069ns, 2.7074ns]  Ops/s: 369.39M  Ops/s/t: 369.39M\n            ^ Note: No contention -- measures speed of immediately dequeueing the item that was just enqueued\n     Operations per second per thread (weighted average): 369.39M\n\nheavy concurrent:\n  (Measures the average operation speed with many threads under heavy load)\n  > moodycamel::ConcurrentQueue\n      Without tokens\n         2   threads:  Avg: 0.1211us  Range: [0.1163us, 0.1233us]  Ops/s:  16.51M  Ops/s/t:   8.26M\n         3   threads:  Avg: 0.4467us  Range: [0.3247us, 0.4672us]  Ops/s:   6.72M  Ops/s/t:   2.24M\n         4   threads:  Avg: 0.9646us  Range: [0.8831us, 1.0081us]  Ops/s:   4.15M  Ops/s/t:   1.04M\n         8   threads:  Avg: 2.3965us  Range: [2.3389us, 2.4271us]  Ops/s:   3.34M  Ops/s/t: 417.27k\n         12  threads:  Avg: 4.2654us  Range: [4.2042us, 4.3185us]  Ops/s:   2.81M  Ops/s/t: 234.44k\n         16  threads:  Avg: 6.5713us  Range: [6.1844us, 6.6608us]  Ops/s:   2.43M  Ops/s/t: 152.18k\n         32  threads:  Avg: 0.0330ms  Range: [0.0318ms, 0.0333ms]  Ops/s: 970.98k  Ops/s/t:  30.34k\n         48  threads:  Avg: 0.0612ms  Range: [0.0592ms, 0.0625ms]  Ops/s: 784.29k  Ops/s/t:  16.34k\n         Operations per second per thread (weighted average): 731.94k\n\n      With tokens\n         2   threads:  Avg: 0.0491us  Range: [0.0434us, 0.0508us]  Ops/s:  40.77M  Ops/s/t:  20.39M\n         3   threads:  Avg: 0.1539us  Range: [0.1536us, 0.1541us]  Ops/s:  19.50M  Ops/s/t:   6.50M\n         4   threads:  Avg: 0.4153us  Range: [0.3947us, 0.4259us]  Ops/s:   9.63M  Ops/s/t:   2.41M\n         8   threads:  Avg: 0.7587us  Range: [0.5327us, 0.8894us]  Ops/s:  10.54M  Ops/s/t:   1.32M\n         12  threads:  Avg: 1.3762us  Range: [1.2403us, 1.5247us]  Ops/s:   8.72M  Ops/s/t: 726.65k\n         16  threads:  Avg: 2.6196us  Range: [2.2556us, 2.8414us]  Ops/s:   6.11M  Ops/s/t: 381.74k\n         32  threads:  Avg: 0.0162ms  Range: [9.3597us, 0.0203ms]  Ops/s:   1.97M  Ops/s/t:  61.66k\n         48  threads:  Avg: 0.0143ms  Range: [0.0111ms, 0.0173ms]  Ops/s:   3.35M  Ops/s/t:  69.85k\n         Operations per second per thread (weighted average):   1.91M\n\n  > boost::lockfree::queue\n     2   threads:  Avg: 1.2196us  Range: [1.2159us, 1.2220us]  Ops/s:   1.64M  Ops/s/t: 819.95k\n     3   threads:  Avg: 2.2890us  Range: [2.2667us, 2.3046us]  Ops/s:   1.31M  Ops/s/t: 436.88k\n     4   threads:  Avg: 2.9693us  Range: [2.9229us, 2.9822us]  Ops/s:   1.35M  Ops/s/t: 336.78k\n     8   threads:  Avg: 8.9729us  Range: [8.8928us, 9.0693us]  Ops/s: 891.57k  Ops/s/t: 111.45k\n     12  threads:  Avg: 0.0208ms  Range: [0.0205ms, 0.0209ms]  Ops/s: 577.87k  Ops/s/t:  48.16k\n     16  threads:  Avg: 0.0369ms  Range: [0.0355ms, 0.0376ms]  Ops/s: 433.75k  Ops/s/t:  27.11k\n     32  threads:  Avg: 0.3347ms  Range: [0.3205ms, 0.3437ms]  Ops/s:  95.62k  Ops/s/t:   2.99k\n     48  threads:  Avg: 0.7204ms  Range: [0.7067ms, 0.7367ms]  Ops/s:  66.63k  Ops/s/t:   1.39k\n     Operations per second per thread (weighted average): 114.43k\n\n  > tbb::concurrent_queue\n     2   threads:  Avg: 0.5035us  Range: [0.4944us, 0.5064us]  Ops/s:   3.97M  Ops/s/t:   1.99M\n     3   threads:  Avg: 1.1369us  Range: [1.1313us, 1.1402us]  Ops/s:   2.64M  Ops/s/t: 879.61k\n     4   threads:  Avg: 1.8101us  Range: [1.8060us, 1.8148us]  Ops/s:   2.21M  Ops/s/t: 552.45k\n     8   threads:  Avg: 8.2873us  Range: [7.6817us, 8.3997us]  Ops/s: 965.34k  Ops/s/t: 120.67k\n     12  threads:  Avg: 0.0182ms  Range: [0.0174ms, 0.0187ms]  Ops/s: 657.96k  Ops/s/t:  54.83k\n     16  threads:  Avg: 0.0403ms  Range: [0.0354ms, 0.0419ms]  Ops/s: 397.38k  Ops/s/t:  24.84k\n     32  threads:  Avg: 0.1491ms  Range: [0.1353ms, 0.1525ms]  Ops/s: 214.58k  Ops/s/t:   6.71k\n     48  threads:  Avg: 0.3679ms  Range: [0.3642ms, 0.3710ms]  Ops/s: 130.46k  Ops/s/t:   2.72k\n     Operations per second per thread (weighted average): 218.55k\n\n  > SimpleLockFreeQueue\n     2   threads:  Avg: 0.8196us  Range: [0.3717us, 0.8868us]  Ops/s:   2.44M  Ops/s/t:   1.22M\n     3   threads:  Avg: 1.6837us  Range: [1.6827us, 1.6845us]  Ops/s:   1.78M  Ops/s/t: 593.94k\n     4   threads:  Avg: 4.5087us  Range: [3.7115us, 4.9618us]  Ops/s: 887.18k  Ops/s/t: 221.79k\n     8   threads:  Avg: 0.0222ms  Range: [0.0199ms, 0.0232ms]  Ops/s: 360.16k  Ops/s/t:  45.02k\n     12  threads:  Avg: 0.0532ms  Range: [0.0515ms, 0.0538ms]  Ops/s: 225.48k  Ops/s/t:  18.79k\n     16  threads:  Avg: 0.0920ms  Range: [0.0743ms, 0.0959ms]  Ops/s: 174.00k  Ops/s/t:  10.88k\n     32  threads:  Avg: 0.4328ms  Range: [0.3996ms, 0.4452ms]  Ops/s:  73.94k  Ops/s/t:   2.31k\n     48  threads:  Avg: 0.8777ms  Range: [0.8347ms, 0.8909ms]  Ops/s:  54.69k  Ops/s/t:   1.14k\n     Operations per second per thread (weighted average): 123.28k\n\n  > LockBasedQueue\n     2   threads:  Avg: 0.3872us  Range: [0.3804us, 0.3916us]  Ops/s:   5.17M  Ops/s/t:   2.58M\n     3   threads:  Avg: 3.1674us  Range: [2.7845us, 3.3797us]  Ops/s: 947.16k  Ops/s/t: 315.72k\n     4   threads:  Avg: 6.6254us  Range: [6.4227us, 6.7718us]  Ops/s: 603.74k  Ops/s/t: 150.93k\n     8   threads:  Avg: 0.0247ms  Range: [0.0213ms, 0.0259ms]  Ops/s: 323.74k  Ops/s/t:  40.47k\n     12  threads:  Avg: 0.0514ms  Range: [0.0499ms, 0.0524ms]  Ops/s: 233.56k  Ops/s/t:  19.46k\n     16  threads:  Avg: 0.0895ms  Range: [0.0873ms, 0.0908ms]  Ops/s: 178.78k  Ops/s/t:  11.17k\n     32  threads:  Avg: 0.3723ms  Range: [0.3626ms, 0.3779ms]  Ops/s:  85.95k  Ops/s/t:   2.69k\n     48  threads:  Avg: 0.7242ms  Range: [0.7031ms, 0.7378ms]  Ops/s:  66.28k  Ops/s/t:   1.38k\n     Operations per second per thread (weighted average): 169.58k\n\n  > std::queue\n     (skipping, benchmark not supported...)\n\nOverall average operations per second per thread (where higher-concurrency runs have more weight):\n(Take this summary with a grain of salt -- look at the individual benchmark results for a much\nbetter idea of how the queues measure up to each other):\n    moodycamel::ConcurrentQueue (including bulk):  18.50M\n    boost::lockfree::queue:   3.27M\n    tbb::concurrent_queue:   4.21M\n    SimpleLockFreeQueue:   2.90M\n    LockBasedQueue:   1.12M\n    std::queue (single thread only): 436.10M\n"
  },
  {
    "path": "benchmarks/contrib/benchmarks.aws-8.log",
    "content": "# Run on a 8-core c1.xlarge AWS instance\n--- New run (Sat Nov  8 19:47:00 2014) ---\nRunning 64-bit benchmarks on an Intel(R) Xeon(R) CPU           E5506  @ 2.13GHz\n    (precise mode)\nNote that these are synthetic benchmarks. Take them with a grain of salt.\n\nLegend:\n    'Avg':     Average time taken per operation, normalized to be per thread\n    'Range':   The minimum and maximum times taken per operation (per thread)\n    'Ops/s':   Overall operations per second\n    'Ops/s/t': Operations per second per thread (inverse of 'Avg')\n    Operations include those that fail (e.g. because the queue is empty).\n    Each logical enqueue/dequeue counts as an individual operation when in bulk.\n\nbalanced:\n  (Measures the average operation speed with multiple symmetrical threads\n  under reasonable load -- small random intervals between accesses)\n  > moodycamel::ConcurrentQueue\n      Without tokens\n         2   threads:  Avg: 2.1439us  Range: [2.0316us, 2.1834us]  Ops/s: 932.90k  Ops/s/t: 466.45k\n         3   threads:  Avg: 3.8096us  Range: [3.3842us, 4.1643us]  Ops/s: 787.49k  Ops/s/t: 262.50k\n         4   threads:  Avg: 5.5406us  Range: [5.0081us, 5.6616us]  Ops/s: 721.94k  Ops/s/t: 180.48k\n         8   threads:  Avg: 0.0120ms  Range: [0.0118ms, 0.0123ms]  Ops/s: 664.05k  Ops/s/t:  83.01k\n         12  threads:  Avg: 0.0189ms  Range: [0.0188ms, 0.0191ms]  Ops/s: 633.72k  Ops/s/t:  52.81k\n         16  threads:  Avg: 0.0246ms  Range: [0.0240ms, 0.0248ms]  Ops/s: 650.46k  Ops/s/t:  40.65k\n         Operations per second per thread (weighted average): 133.15k\n\n      With tokens\n         2   threads:  Avg: 2.0623us  Range: [2.0364us, 2.0712us]  Ops/s: 969.77k  Ops/s/t: 484.88k\n         3   threads:  Avg: 3.1724us  Range: [3.1542us, 3.2327us]  Ops/s: 945.67k  Ops/s/t: 315.22k\n         4   threads:  Avg: 4.4476us  Range: [4.2467us, 4.6332us]  Ops/s: 899.36k  Ops/s/t: 224.84k\n         8   threads:  Avg: 0.0101ms  Range: [9.7889us, 0.0102ms]  Ops/s: 795.01k  Ops/s/t:  99.38k\n         12  threads:  Avg: 0.0155ms  Range: [0.0150ms, 0.0158ms]  Ops/s: 773.39k  Ops/s/t:  64.45k\n         16  threads:  Avg: 0.0213ms  Range: [0.0206ms, 0.0218ms]  Ops/s: 750.30k  Ops/s/t:  46.89k\n         Operations per second per thread (weighted average): 153.72k\n\n  > boost::lockfree::queue\n     2   threads:  Avg: 2.3908us  Range: [2.2293us, 2.6284us]  Ops/s: 836.54k  Ops/s/t: 418.27k\n     3   threads:  Avg: 4.2701us  Range: [3.5851us, 4.3783us]  Ops/s: 702.55k  Ops/s/t: 234.18k\n     4   threads:  Avg: 6.0101us  Range: [5.8873us, 6.0534us]  Ops/s: 665.55k  Ops/s/t: 166.39k\n     8   threads:  Avg: 0.0123ms  Range: [0.0120ms, 0.0125ms]  Ops/s: 647.96k  Ops/s/t:  81.00k\n     12  threads:  Avg: 0.0191ms  Range: [0.0189ms, 0.0193ms]  Ops/s: 626.99k  Ops/s/t:  52.25k\n     16  threads:  Avg: 0.0244ms  Range: [0.0234ms, 0.0248ms]  Ops/s: 656.16k  Ops/s/t:  41.01k\n     Operations per second per thread (weighted average): 123.33k\n\n  > tbb::concurrent_queue\n     2   threads:  Avg: 2.2272us  Range: [2.1376us, 2.3070us]  Ops/s: 898.01k  Ops/s/t: 449.00k\n     3   threads:  Avg: 4.0825us  Range: [4.0605us, 4.1017us]  Ops/s: 734.84k  Ops/s/t: 244.95k\n     4   threads:  Avg: 5.4065us  Range: [5.3347us, 5.4531us]  Ops/s: 739.86k  Ops/s/t: 184.96k\n     8   threads:  Avg: 0.0115ms  Range: [0.0112ms, 0.0116ms]  Ops/s: 692.97k  Ops/s/t:  86.62k\n     12  threads:  Avg: 0.0171ms  Range: [0.0169ms, 0.0172ms]  Ops/s: 702.47k  Ops/s/t:  58.54k\n     16  threads:  Avg: 0.0228ms  Range: [0.0225ms, 0.0232ms]  Ops/s: 701.16k  Ops/s/t:  43.82k\n     Operations per second per thread (weighted average): 132.93k\n\n  > SimpleLockFreeQueue\n     2   threads:  Avg: 2.2096us  Range: [2.2034us, 2.2123us]  Ops/s: 905.15k  Ops/s/t: 452.58k\n     3   threads:  Avg: 3.9077us  Range: [3.5631us, 4.2803us]  Ops/s: 767.71k  Ops/s/t: 255.90k\n     4   threads:  Avg: 5.8294us  Range: [5.7747us, 5.8686us]  Ops/s: 686.17k  Ops/s/t: 171.54k\n     8   threads:  Avg: 0.0125ms  Range: [0.0121ms, 0.0129ms]  Ops/s: 641.39k  Ops/s/t:  80.17k\n     12  threads:  Avg: 0.0187ms  Range: [0.0184ms, 0.0189ms]  Ops/s: 640.76k  Ops/s/t:  53.40k\n     16  threads:  Avg: 0.0255ms  Range: [0.0244ms, 0.0262ms]  Ops/s: 626.32k  Ops/s/t:  39.15k\n     Operations per second per thread (weighted average): 129.20k\n\n  > LockBasedQueue\n     2   threads:  Avg: 2.6149us  Range: [2.2393us, 2.8581us]  Ops/s: 764.85k  Ops/s/t: 382.43k\n     3   threads:  Avg: 5.0743us  Range: [4.9853us, 5.0976us]  Ops/s: 591.21k  Ops/s/t: 197.07k\n     4   threads:  Avg: 7.6434us  Range: [7.3726us, 7.7969us]  Ops/s: 523.33k  Ops/s/t: 130.83k\n     8   threads:  Avg: 0.0302ms  Range: [0.0269ms, 0.0328ms]  Ops/s: 264.68k  Ops/s/t:  33.09k\n     12  threads:  Avg: 0.0637ms  Range: [0.0509ms, 0.0682ms]  Ops/s: 188.37k  Ops/s/t:  15.70k\n     16  threads:  Avg: 0.1120ms  Range: [0.1001ms, 0.1184ms]  Ops/s: 142.90k  Ops/s/t:   8.93k\n     Operations per second per thread (weighted average):  85.99k\n\n  > std::queue\n     (skipping, benchmark not supported...)\n\nonly enqueue:\n  (Measures the average operation speed when all threads are producers)\n  > moodycamel::ConcurrentQueue\n      Without tokens\n         1    thread:  Avg: 0.0229us  Range: [0.0229us, 0.0230us]  Ops/s:  43.58M  Ops/s/t:  43.58M\n         2   threads:  Avg: 0.0418us  Range: [0.0416us, 0.0419us]  Ops/s:  47.84M  Ops/s/t:  23.92M\n         4   threads:  Avg: 0.0821us  Range: [0.0821us, 0.0822us]  Ops/s:  48.71M  Ops/s/t:  12.18M\n         8   threads:  Avg: 0.1621us  Range: [0.1616us, 0.1625us]  Ops/s:  49.35M  Ops/s/t:   6.17M\n         12  threads:  Avg: 0.2503us  Range: [0.2498us, 0.2507us]  Ops/s:  47.94M  Ops/s/t:   3.99M\n         16  threads:  Avg: 0.3417us  Range: [0.3406us, 0.3428us]  Ops/s:  46.82M  Ops/s/t:   2.93M\n         Operations per second per thread (weighted average):  12.03M\n\n      With tokens\n         1    thread:  Avg: 0.0146us  Range: [0.0146us, 0.0146us]  Ops/s:  68.45M  Ops/s/t:  68.45M\n         2   threads:  Avg: 0.0315us  Range: [0.0313us, 0.0316us]  Ops/s:  63.53M  Ops/s/t:  31.77M\n         4   threads:  Avg: 0.0614us  Range: [0.0613us, 0.0615us]  Ops/s:  65.10M  Ops/s/t:  16.27M\n         8   threads:  Avg: 0.1220us  Range: [0.1216us, 0.1222us]  Ops/s:  65.56M  Ops/s/t:   8.20M\n         12  threads:  Avg: 0.1901us  Range: [0.1884us, 0.1909us]  Ops/s:  63.14M  Ops/s/t:   5.26M\n         16  threads:  Avg: 0.2694us  Range: [0.2658us, 0.2733us]  Ops/s:  59.38M  Ops/s/t:   3.71M\n         Operations per second per thread (weighted average):  16.96M\n\n  > boost::lockfree::queue\n     1    thread:  Avg: 0.0745us  Range: [0.0744us, 0.0745us]  Ops/s:  13.43M  Ops/s/t:  13.43M\n     2   threads:  Avg: 0.7351us  Range: [0.6376us, 0.8720us]  Ops/s:   2.72M  Ops/s/t:   1.36M\n     4   threads:  Avg: 5.9754us  Range: [5.5307us, 6.1937us]  Ops/s: 669.41k  Ops/s/t: 167.35k\n     8   threads:  Avg: 0.0276ms  Range: [0.0263ms, 0.0282ms]  Ops/s: 289.71k  Ops/s/t:  36.21k\n     12  threads:  Avg: 0.0486ms  Range: [0.0222ms, 0.0555ms]  Ops/s: 246.97k  Ops/s/t:  20.58k\n     16  threads:  Avg: 0.1059ms  Range: [0.1018ms, 0.1092ms]  Ops/s: 151.02k  Ops/s/t:   9.44k\n     Operations per second per thread (weighted average):   1.45M\n\n  > tbb::concurrent_queue\n     1    thread:  Avg: 0.0443us  Range: [0.0442us, 0.0443us]  Ops/s:  22.60M  Ops/s/t:  22.60M\n     2   threads:  Avg: 0.3436us  Range: [0.3082us, 0.3696us]  Ops/s:   5.82M  Ops/s/t:   2.91M\n     4   threads:  Avg: 1.6788us  Range: [1.6172us, 1.7061us]  Ops/s:   2.38M  Ops/s/t: 595.67k\n     8   threads:  Avg: 8.5452us  Range: [8.4615us, 8.6459us]  Ops/s: 936.20k  Ops/s/t: 117.03k\n     12  threads:  Avg: 0.0475ms  Range: [0.0469ms, 0.0482ms]  Ops/s: 252.43k  Ops/s/t:  21.04k\n     16  threads:  Avg: 0.1398ms  Range: [0.1317ms, 0.1445ms]  Ops/s: 114.48k  Ops/s/t:   7.16k\n     Operations per second per thread (weighted average):   2.61M\n\n  > SimpleLockFreeQueue\n     1    thread:  Avg: 0.0739us  Range: [0.0738us, 0.0739us]  Ops/s:  13.54M  Ops/s/t:  13.54M\n     2   threads:  Avg: 0.4404us  Range: [0.4023us, 0.4634us]  Ops/s:   4.54M  Ops/s/t:   2.27M\n     4   threads:  Avg: 3.1988us  Range: [3.1510us, 3.2464us]  Ops/s:   1.25M  Ops/s/t: 312.62k\n     8   threads:  Avg: 0.0103ms  Range: [0.0102ms, 0.0105ms]  Ops/s: 774.38k  Ops/s/t:  96.80k\n     12  threads:  Avg: 0.0215ms  Range: [0.0212ms, 0.0216ms]  Ops/s: 557.77k  Ops/s/t:  46.48k\n     16  threads:  Avg: 0.0401ms  Range: [0.0394ms, 0.0407ms]  Ops/s: 398.68k  Ops/s/t:  24.92k\n     Operations per second per thread (weighted average):   1.62M\n\n  > LockBasedQueue\n     1    thread:  Avg: 0.0696us  Range: [0.0696us, 0.0696us]  Ops/s:  14.36M  Ops/s/t:  14.36M\n     2   threads:  Avg: 0.8199us  Range: [0.6931us, 0.8818us]  Ops/s:   2.44M  Ops/s/t:   1.22M\n     4   threads:  Avg: 5.0074us  Range: [4.9400us, 5.0589us]  Ops/s: 798.82k  Ops/s/t: 199.70k\n     8   threads:  Avg: 0.0233ms  Range: [0.0220ms, 0.0240ms]  Ops/s: 342.66k  Ops/s/t:  42.83k\n     12  threads:  Avg: 0.0427ms  Range: [0.0218ms, 0.0492ms]  Ops/s: 281.23k  Ops/s/t:  23.44k\n     16  threads:  Avg: 0.0845ms  Range: [0.0782ms, 0.0872ms]  Ops/s: 189.45k  Ops/s/t:  11.84k\n     Operations per second per thread (weighted average):   1.53M\n\n  > std::queue\n     1    thread:  Avg: 0.0109us  Range: [0.0108us, 0.0109us]  Ops/s:  92.13M  Ops/s/t:  92.13M\n     Operations per second per thread (weighted average):  92.13M\n\nonly enqueue (pre-allocated):\n  (Measures the average operation speed when all threads are producers,\n  and the queue has been stretched out first)\n  > moodycamel::ConcurrentQueue\n      Without tokens\n         1    thread:  Avg: 0.0175us  Range: [0.0175us, 0.0176us]  Ops/s:  56.98M  Ops/s/t:  56.98M\n         2   threads:  Avg: 0.0343us  Range: [0.0337us, 0.0368us]  Ops/s:  58.31M  Ops/s/t:  29.15M\n         4   threads:  Avg: 0.1314us  Range: [0.1059us, 0.1515us]  Ops/s:  30.43M  Ops/s/t:   7.61M\n         8   threads:  Avg: 0.5502us  Range: [0.4973us, 0.5676us]  Ops/s:  14.54M  Ops/s/t:   1.82M\n         Operations per second per thread (weighted average):  16.37M\n\n      With tokens\n         1    thread:  Avg: 8.0792ns  Range: [8.0657ns, 8.0857ns]  Ops/s: 123.77M  Ops/s/t: 123.77M\n         2   threads:  Avg: 0.0199us  Range: [0.0198us, 0.0200us]  Ops/s: 100.56M  Ops/s/t:  50.28M\n         4   threads:  Avg: 0.0362us  Range: [0.0361us, 0.0363us]  Ops/s: 110.40M  Ops/s/t:  27.60M\n         8   threads:  Avg: 0.0730us  Range: [0.0724us, 0.0734us]  Ops/s: 109.61M  Ops/s/t:  13.70M\n         Operations per second per thread (weighted average):  39.88M\n\n  > boost::lockfree::queue\n     1    thread:  Avg: 0.0477us  Range: [0.0476us, 0.0478us]  Ops/s:  20.96M  Ops/s/t:  20.96M\n     2   threads:  Avg: 0.7644us  Range: [0.6611us, 0.8702us]  Ops/s:   2.62M  Ops/s/t:   1.31M\n     4   threads:  Avg: 6.5308us  Range: [6.0638us, 6.9217us]  Ops/s: 612.48k  Ops/s/t: 153.12k\n     8   threads:  Avg: 0.0276ms  Range: [0.0192ms, 0.0292ms]  Ops/s: 290.08k  Ops/s/t:  36.26k\n     Operations per second per thread (weighted average):   3.21M\n\n  > tbb::concurrent_queue\n     1    thread:  Avg: 0.0440us  Range: [0.0439us, 0.0440us]  Ops/s:  22.75M  Ops/s/t:  22.75M\n     2   threads:  Avg: 0.2923us  Range: [0.2799us, 0.3120us]  Ops/s:   6.84M  Ops/s/t:   3.42M\n     4   threads:  Avg: 1.5782us  Range: [1.4991us, 1.6202us]  Ops/s:   2.53M  Ops/s/t: 633.63k\n     8   threads:  Avg: 8.5111us  Range: [8.4543us, 8.6016us]  Ops/s: 939.95k  Ops/s/t: 117.49k\n     Operations per second per thread (weighted average):   4.03M\n\n  > SimpleLockFreeQueue\n     1    thread:  Avg: 0.0563us  Range: [0.0563us, 0.0564us]  Ops/s:  17.76M  Ops/s/t:  17.76M\n     2   threads:  Avg: 0.6085us  Range: [0.6031us, 0.6223us]  Ops/s:   3.29M  Ops/s/t:   1.64M\n     4   threads:  Avg: 4.8504us  Range: [3.0550us, 5.2267us]  Ops/s: 824.68k  Ops/s/t: 206.17k\n     8   threads:  Avg: 0.0211ms  Range: [0.0205ms, 0.0215ms]  Ops/s: 378.88k  Ops/s/t:  47.36k\n     Operations per second per thread (weighted average):   2.85M\n\n  > LockBasedQueue\n     1    thread:  Avg: 0.0698us  Range: [0.0698us, 0.0698us]  Ops/s:  14.33M  Ops/s/t:  14.33M\n     2   threads:  Avg: 0.7667us  Range: [0.7002us, 0.8237us]  Ops/s:   2.61M  Ops/s/t:   1.30M\n     4   threads:  Avg: 5.0945us  Range: [4.9227us, 5.1724us]  Ops/s: 785.17k  Ops/s/t: 196.29k\n     8   threads:  Avg: 0.0233ms  Range: [0.0224ms, 0.0241ms]  Ops/s: 343.59k  Ops/s/t:  42.95k\n     Operations per second per thread (weighted average):   2.30M\n\n  > std::queue\n     1    thread:  Avg: 0.0107us  Range: [0.0107us, 0.0107us]  Ops/s:  93.28M  Ops/s/t:  93.28M\n     Operations per second per thread (weighted average):  93.28M\n\nonly enqueue bulk:\n  (Measures the average speed of enqueueing an item in bulk when all threads are producers)\n  > moodycamel::ConcurrentQueue\n      Without tokens\n         1    thread:  Avg: 8.7326ns  Range: [8.7251ns, 8.7431ns]  Ops/s: 114.51M  Ops/s/t: 114.51M\n         2   threads:  Avg: 0.0174us  Range: [0.0171us, 0.0176us]  Ops/s: 114.97M  Ops/s/t:  57.49M\n         4   threads:  Avg: 0.0346us  Range: [0.0342us, 0.0347us]  Ops/s: 115.60M  Ops/s/t:  28.90M\n         8   threads:  Avg: 0.0669us  Range: [0.0605us, 0.0692us]  Ops/s: 119.51M  Ops/s/t:  14.94M\n         12  threads:  Avg: 0.1146us  Range: [0.1120us, 0.1169us]  Ops/s: 104.72M  Ops/s/t:   8.73M\n         16  threads:  Avg: 0.1741us  Range: [0.1700us, 0.1769us]  Ops/s:  91.92M  Ops/s/t:   5.75M\n         Operations per second per thread (weighted average):  28.44M\n\n      With tokens\n         1    thread:  Avg: 8.7317ns  Range: [8.7133ns, 8.7451ns]  Ops/s: 114.53M  Ops/s/t: 114.53M\n         2   threads:  Avg: 0.0186us  Range: [0.0184us, 0.0187us]  Ops/s: 107.81M  Ops/s/t:  53.91M\n         4   threads:  Avg: 0.0382us  Range: [0.0378us, 0.0383us]  Ops/s: 104.74M  Ops/s/t:  26.19M\n         8   threads:  Avg: 0.0793us  Range: [0.0790us, 0.0796us]  Ops/s: 100.83M  Ops/s/t:  12.60M\n         12  threads:  Avg: 0.1229us  Range: [0.1217us, 0.1232us]  Ops/s:  97.64M  Ops/s/t:   8.14M\n         16  threads:  Avg: 0.1745us  Range: [0.1677us, 0.1802us]  Ops/s:  91.69M  Ops/s/t:   5.73M\n         Operations per second per thread (weighted average):  27.74M\n\n  > boost::lockfree::queue\n     (skipping, benchmark not supported...)\n\n  > tbb::concurrent_queue\n     (skipping, benchmark not supported...)\n\n  > SimpleLockFreeQueue\n     (skipping, benchmark not supported...)\n\n  > LockBasedQueue\n     (skipping, benchmark not supported...)\n\n  > std::queue\n     (skipping, benchmark not supported...)\n\nonly enqueue bulk (pre-allocated):\n  (Measures the average speed of enqueueing an item in bulk when all threads are producers,\n  and the queue has been stretched out first)\n  > moodycamel::ConcurrentQueue\n      Without tokens\n         1    thread:  Avg: 9.0071ns  Range: [8.9924ns, 9.0178ns]  Ops/s: 111.02M  Ops/s/t: 111.02M\n         2   threads:  Avg: 0.0187us  Range: [0.0184us, 0.0188us]  Ops/s: 106.79M  Ops/s/t:  53.40M\n         4   threads:  Avg: 0.0395us  Range: [0.0393us, 0.0397us]  Ops/s: 101.25M  Ops/s/t:  25.31M\n         8   threads:  Avg: 0.0831us  Range: [0.0823us, 0.0835us]  Ops/s:  96.28M  Ops/s/t:  12.04M\n         Operations per second per thread (weighted average):  37.45M\n\n      With tokens\n         1    thread:  Avg: 8.7146ns  Range: [8.7099ns, 8.7187ns]  Ops/s: 114.75M  Ops/s/t: 114.75M\n         2   threads:  Avg: 0.0185us  Range: [0.0181us, 0.0187us]  Ops/s: 108.27M  Ops/s/t:  54.14M\n         4   threads:  Avg: 0.0383us  Range: [0.0376us, 0.0384us]  Ops/s: 104.54M  Ops/s/t:  26.13M\n         8   threads:  Avg: 0.0798us  Range: [0.0794us, 0.0801us]  Ops/s: 100.25M  Ops/s/t:  12.53M\n         Operations per second per thread (weighted average):  38.52M\n\n  > boost::lockfree::queue\n     (skipping, benchmark not supported...)\n\n  > tbb::concurrent_queue\n     (skipping, benchmark not supported...)\n\n  > SimpleLockFreeQueue\n     (skipping, benchmark not supported...)\n\n  > LockBasedQueue\n     (skipping, benchmark not supported...)\n\n  > std::queue\n     (skipping, benchmark not supported...)\n\nonly dequeue:\n  (Measures the average operation speed when all threads are consumers)\n  > moodycamel::ConcurrentQueue\n      Without tokens\n         1    thread:  Avg: 0.0479us  Range: [0.0478us, 0.0479us]  Ops/s:  20.90M  Ops/s/t:  20.90M\n         2   threads:  Avg: 0.4099us  Range: [0.3972us, 0.4170us]  Ops/s:   4.88M  Ops/s/t:   2.44M\n         4   threads:  Avg: 2.7666us  Range: [2.0147us, 2.8988us]  Ops/s:   1.45M  Ops/s/t: 361.46k\n         8   threads:  Avg: 9.0300us  Range: [8.8027us, 9.1078us]  Ops/s: 885.94k  Ops/s/t: 110.74k\n         12  threads:  Avg: 0.0179ms  Range: [0.0178ms, 0.0179ms]  Ops/s: 672.15k  Ops/s/t:  56.01k\n         16  threads:  Avg: 0.0338ms  Range: [0.0332ms, 0.0340ms]  Ops/s: 473.79k  Ops/s/t:  29.61k\n         Operations per second per thread (weighted average):   1.56M\n\n      With tokens\n         1    thread:  Avg: 0.0404us  Range: [0.0404us, 0.0404us]  Ops/s:  24.75M  Ops/s/t:  24.75M\n         2   threads:  Avg: 0.0827us  Range: [0.0826us, 0.0827us]  Ops/s:  24.18M  Ops/s/t:  12.09M\n         4   threads:  Avg: 0.1745us  Range: [0.1738us, 0.1748us]  Ops/s:  22.92M  Ops/s/t:   5.73M\n         8   threads:  Avg: 0.3536us  Range: [0.3514us, 0.3559us]  Ops/s:  22.62M  Ops/s/t:   2.83M\n         12  threads:  Avg: 0.5554us  Range: [0.5457us, 0.5628us]  Ops/s:  21.60M  Ops/s/t:   1.80M\n         16  threads:  Avg: 0.7653us  Range: [0.7439us, 0.7776us]  Ops/s:  20.91M  Ops/s/t:   1.31M\n         Operations per second per thread (weighted average):   5.07M\n\n  > boost::lockfree::queue\n     1    thread:  Avg: 0.0356us  Range: [0.0355us, 0.0356us]  Ops/s:  28.11M  Ops/s/t:  28.11M\n     2   threads:  Avg: 0.4965us  Range: [0.4550us, 0.5404us]  Ops/s:   4.03M  Ops/s/t:   2.01M\n     4   threads:  Avg: 4.5768us  Range: [4.4660us, 4.6482us]  Ops/s: 873.96k  Ops/s/t: 218.49k\n     8   threads:  Avg: 0.0189ms  Range: [0.0129ms, 0.0203ms]  Ops/s: 423.34k  Ops/s/t:  52.92k\n     12  threads:  Avg: 0.0424ms  Range: [0.0411ms, 0.0432ms]  Ops/s: 282.73k  Ops/s/t:  23.56k\n     16  threads:  Avg: 0.0767ms  Range: [0.0523ms, 0.0825ms]  Ops/s: 208.48k  Ops/s/t:  13.03k\n     Operations per second per thread (weighted average):   1.85M\n\n  > tbb::concurrent_queue\n     1    thread:  Avg: 0.0290us  Range: [0.0286us, 0.0292us]  Ops/s:  34.47M  Ops/s/t:  34.47M\n     2   threads:  Avg: 0.2343us  Range: [0.2270us, 0.2470us]  Ops/s:   8.54M  Ops/s/t:   4.27M\n     4   threads:  Avg: 2.0731us  Range: [1.9837us, 2.1597us]  Ops/s:   1.93M  Ops/s/t: 482.36k\n     8   threads:  Avg: 0.0103ms  Range: [9.5712us, 0.0106ms]  Ops/s: 779.17k  Ops/s/t:  97.40k\n     12  threads:  Avg: 0.0451ms  Range: [0.0433ms, 0.0480ms]  Ops/s: 266.36k  Ops/s/t:  22.20k\n     16  threads:  Avg: 0.1436ms  Range: [0.1360ms, 0.1520ms]  Ops/s: 111.41k  Ops/s/t:   6.96k\n     Operations per second per thread (weighted average):   2.51M\n\n  > SimpleLockFreeQueue\n     1    thread:  Avg: 0.0275us  Range: [0.0275us, 0.0276us]  Ops/s:  36.31M  Ops/s/t:  36.31M\n     2   threads:  Avg: 0.8440us  Range: [0.7192us, 0.8839us]  Ops/s:   2.37M  Ops/s/t:   1.18M\n     4   threads:  Avg: 6.3769us  Range: [5.6198us, 6.7313us]  Ops/s: 627.27k  Ops/s/t: 156.82k\n     8   threads:  Avg: 0.0292ms  Range: [0.0263ms, 0.0300ms]  Ops/s: 274.34k  Ops/s/t:  34.29k\n     12  threads:  Avg: 0.0642ms  Range: [0.0548ms, 0.0662ms]  Ops/s: 186.79k  Ops/s/t:  15.57k\n     16  threads:  Avg: 0.1196ms  Range: [0.1172ms, 0.1206ms]  Ops/s: 133.76k  Ops/s/t:   8.36k\n     Operations per second per thread (weighted average):   2.22M\n\n  > LockBasedQueue\n     1    thread:  Avg: 0.0617us  Range: [0.0617us, 0.0618us]  Ops/s:  16.20M  Ops/s/t:  16.20M\n     2   threads:  Avg: 1.4892us  Range: [1.3851us, 1.5315us]  Ops/s:   1.34M  Ops/s/t: 671.48k\n     4   threads:  Avg: 8.0076us  Range: [4.8463us, 8.5494us]  Ops/s: 499.53k  Ops/s/t: 124.88k\n     8   threads:  Avg: 0.0295ms  Range: [0.0202ms, 0.0314ms]  Ops/s: 271.52k  Ops/s/t:  33.94k\n     12  threads:  Avg: 0.0594ms  Range: [0.0364ms, 0.0639ms]  Ops/s: 201.87k  Ops/s/t:  16.82k\n     16  threads:  Avg: 0.1049ms  Range: [0.0564ms, 0.1191ms]  Ops/s: 152.58k  Ops/s/t:   9.54k\n     Operations per second per thread (weighted average):   1.02M\n\n  > std::queue\n     1    thread:  Avg: 3.8947ns  Range: [3.8927ns, 3.8964ns]  Ops/s: 256.76M  Ops/s/t: 256.76M\n     Operations per second per thread (weighted average): 256.76M\n\nonly dequeue bulk:\n  (Measures the average speed of dequeueing an item in bulk when all threads are consumers)\n  > moodycamel::ConcurrentQueue\n      Without tokens\n         1    thread:  Avg: 1.8063ns  Range: [1.8008ns, 1.8111ns]  Ops/s: 553.61M  Ops/s/t: 553.61M\n         2   threads:  Avg: 5.3528ns  Range: [5.3256ns, 5.3836ns]  Ops/s: 373.63M  Ops/s/t: 186.82M\n         4   threads:  Avg: 0.0278us  Range: [0.0257us, 0.0288us]  Ops/s: 143.65M  Ops/s/t:  35.91M\n         8   threads:  Avg: 0.0860us  Range: [0.0839us, 0.0868us]  Ops/s:  93.02M  Ops/s/t:  11.63M\n         12  threads:  Avg: 0.1500us  Range: [0.1429us, 0.1535us]  Ops/s:  79.98M  Ops/s/t:   6.66M\n         16  threads:  Avg: 0.2670us  Range: [0.2490us, 0.2774us]  Ops/s:  59.92M  Ops/s/t:   3.74M\n         Operations per second per thread (weighted average):  63.04M\n\n      With tokens\n         1    thread:  Avg: 1.6650ns  Range: [1.6632ns, 1.6664ns]  Ops/s: 600.59M  Ops/s/t: 600.59M\n         2   threads:  Avg: 4.6593ns  Range: [4.5874ns, 4.7052ns]  Ops/s: 429.25M  Ops/s/t: 214.62M\n         4   threads:  Avg: 0.0159us  Range: [0.0158us, 0.0160us]  Ops/s: 251.62M  Ops/s/t:  62.91M\n         8   threads:  Avg: 0.0515us  Range: [0.0498us, 0.0528us]  Ops/s: 155.40M  Ops/s/t:  19.43M\n         12  threads:  Avg: 0.0787us  Range: [0.0764us, 0.0798us]  Ops/s: 152.54M  Ops/s/t:  12.71M\n         16  threads:  Avg: 0.1374us  Range: [0.1252us, 0.1435us]  Ops/s: 116.47M  Ops/s/t:   7.28M\n         Operations per second per thread (weighted average):  79.24M\n\n  > boost::lockfree::queue\n     (skipping, benchmark not supported...)\n\n  > tbb::concurrent_queue\n     (skipping, benchmark not supported...)\n\n  > SimpleLockFreeQueue\n     (skipping, benchmark not supported...)\n\n  > LockBasedQueue\n     (skipping, benchmark not supported...)\n\n  > std::queue\n     (skipping, benchmark not supported...)\n\nmostly enqueue:\n  (Measures the average operation speed when most threads are enqueueing)\n  > moodycamel::ConcurrentQueue\n      Without tokens\n         2   threads:  Avg: 0.0937us  Range: [0.0927us, 0.0963us]  Ops/s:  21.35M  Ops/s/t:  10.68M\n         4   threads:  Avg: 0.1862us  Range: [0.1816us, 0.1900us]  Ops/s:  21.48M  Ops/s/t:   5.37M\n         8   threads:  Avg: 0.8762us  Range: [0.7998us, 0.9349us]  Ops/s:   9.13M  Ops/s/t:   1.14M\n         Operations per second per thread (weighted average):   4.66M\n\n      With tokens\n         2   threads:  Avg: 0.0843us  Range: [0.0841us, 0.0847us]  Ops/s:  23.72M  Ops/s/t:  11.86M\n         4   threads:  Avg: 0.1088us  Range: [0.1029us, 0.1111us]  Ops/s:  36.75M  Ops/s/t:   9.19M\n         8   threads:  Avg: 0.3251us  Range: [0.2290us, 0.4168us]  Ops/s:  24.61M  Ops/s/t:   3.08M\n         Operations per second per thread (weighted average):   7.02M\n\n  > boost::lockfree::queue\n     2   threads:  Avg: 0.1152us  Range: [0.1118us, 0.1171us]  Ops/s:  17.37M  Ops/s/t:   8.68M\n     4   threads:  Avg: 2.5790us  Range: [1.8601us, 3.1117us]  Ops/s:   1.55M  Ops/s/t: 387.75k\n     8   threads:  Avg: 0.0170ms  Range: [0.0166ms, 0.0176ms]  Ops/s: 469.45k  Ops/s/t:  58.68k\n     Operations per second per thread (weighted average):   2.12M\n\n  > tbb::concurrent_queue\n     2   threads:  Avg: 0.3593us  Range: [0.3540us, 0.3657us]  Ops/s:   5.57M  Ops/s/t:   2.78M\n     4   threads:  Avg: 1.1523us  Range: [1.1393us, 1.1810us]  Ops/s:   3.47M  Ops/s/t: 867.86k\n     8   threads:  Avg: 5.9296us  Range: [5.4979us, 6.1961us]  Ops/s:   1.35M  Ops/s/t: 168.65k\n     Operations per second per thread (weighted average): 984.95k\n\n  > SimpleLockFreeQueue\n     2   threads:  Avg: 0.2142us  Range: [0.1944us, 0.2233us]  Ops/s:   9.34M  Ops/s/t:   4.67M\n     4   threads:  Avg: 2.7030us  Range: [2.4932us, 2.7637us]  Ops/s:   1.48M  Ops/s/t: 369.96k\n     8   threads:  Avg: 0.0127ms  Range: [9.8947us, 0.0138ms]  Ops/s: 628.60k  Ops/s/t:  78.58k\n     Operations per second per thread (weighted average):   1.21M\n\n  > LockBasedQueue\n     2   threads:  Avg: 0.2057us  Range: [0.1952us, 0.2165us]  Ops/s:   9.72M  Ops/s/t:   4.86M\n     4   threads:  Avg: 6.1602us  Range: [3.7945us, 7.2017us]  Ops/s: 649.33k  Ops/s/t: 162.33k\n     8   threads:  Avg: 0.0375ms  Range: [0.0334ms, 0.0419ms]  Ops/s: 213.17k  Ops/s/t:  26.65k\n     Operations per second per thread (weighted average):   1.17M\n\n  > std::queue\n     (skipping, benchmark not supported...)\n\nmostly enqueue bulk:\n  (Measures the average speed of enqueueing an item in bulk under light contention)\n  > moodycamel::ConcurrentQueue\n      Without tokens\n         2   threads:  Avg: 0.0172us  Range: [0.0172us, 0.0173us]  Ops/s: 116.00M  Ops/s/t:  58.00M\n         4   threads:  Avg: 0.0366us  Range: [0.0363us, 0.0369us]  Ops/s: 109.38M  Ops/s/t:  27.34M\n         8   threads:  Avg: 0.0797us  Range: [0.0794us, 0.0801us]  Ops/s: 100.37M  Ops/s/t:  12.55M\n         Operations per second per thread (weighted average):  27.58M\n\n      With tokens\n         2   threads:  Avg: 0.0171us  Range: [0.0171us, 0.0171us]  Ops/s: 117.11M  Ops/s/t:  58.55M\n         4   threads:  Avg: 0.0304us  Range: [0.0280us, 0.0320us]  Ops/s: 131.48M  Ops/s/t:  32.87M\n         8   threads:  Avg: 0.0714us  Range: [0.0612us, 0.0770us]  Ops/s: 112.07M  Ops/s/t:  14.01M\n         Operations per second per thread (weighted average):  30.14M\n\n  > boost::lockfree::queue\n     (skipping, benchmark not supported...)\n\n  > tbb::concurrent_queue\n     (skipping, benchmark not supported...)\n\n  > SimpleLockFreeQueue\n     (skipping, benchmark not supported...)\n\n  > LockBasedQueue\n     (skipping, benchmark not supported...)\n\n  > std::queue\n     (skipping, benchmark not supported...)\n\nmostly dequeue:\n  (Measures the average operation speed when most threads are dequeueing)\n  > moodycamel::ConcurrentQueue\n      Without tokens\n         2   threads:  Avg: 0.1035us  Range: [0.1034us, 0.1036us]  Ops/s:  19.32M  Ops/s/t:   9.66M\n         4   threads:  Avg: 1.4781us  Range: [1.4440us, 1.4955us]  Ops/s:   2.71M  Ops/s/t: 676.56k\n         8   threads:  Avg: 3.8335us  Range: [2.7691us, 4.1910us]  Ops/s:   2.09M  Ops/s/t: 260.86k\n         Operations per second per thread (weighted average):   2.52M\n\n      With tokens\n         2   threads:  Avg: 0.0843us  Range: [0.0842us, 0.0844us]  Ops/s:  23.72M  Ops/s/t:  11.86M\n         4   threads:  Avg: 0.7221us  Range: [0.6558us, 0.7557us]  Ops/s:   5.54M  Ops/s/t:   1.38M\n         8   threads:  Avg: 1.0831us  Range: [0.8750us, 1.2979us]  Ops/s:   7.39M  Ops/s/t: 923.26k\n         Operations per second per thread (weighted average):   3.55M\n\n  > boost::lockfree::queue\n     2   threads:  Avg: 0.4447us  Range: [0.3836us, 0.4890us]  Ops/s:   4.50M  Ops/s/t:   2.25M\n     4   threads:  Avg: 2.3882us  Range: [1.9014us, 2.7969us]  Ops/s:   1.67M  Ops/s/t: 418.73k\n     8   threads:  Avg: 0.0132ms  Range: [7.8331us, 0.0142ms]  Ops/s: 604.38k  Ops/s/t:  75.55k\n     Operations per second per thread (weighted average): 677.76k\n\n  > tbb::concurrent_queue\n     2   threads:  Avg: 0.1613us  Range: [0.1609us, 0.1618us]  Ops/s:  12.40M  Ops/s/t:   6.20M\n     4   threads:  Avg: 1.6693us  Range: [1.5484us, 1.7851us]  Ops/s:   2.40M  Ops/s/t: 599.07k\n     8   threads:  Avg: 7.8647us  Range: [7.4879us, 8.0231us]  Ops/s:   1.02M  Ops/s/t: 127.15k\n     Operations per second per thread (weighted average):   1.65M\n\n  > SimpleLockFreeQueue\n     2   threads:  Avg: 0.4576us  Range: [0.4205us, 0.4906us]  Ops/s:   4.37M  Ops/s/t:   2.19M\n     4   threads:  Avg: 3.7064us  Range: [3.5114us, 3.8460us]  Ops/s:   1.08M  Ops/s/t: 269.81k\n     8   threads:  Avg: 0.0188ms  Range: [0.0186ms, 0.0189ms]  Ops/s: 426.30k  Ops/s/t:  53.29k\n     Operations per second per thread (weighted average): 605.60k\n\n  > LockBasedQueue\n     2   threads:  Avg: 0.7979us  Range: [0.7404us, 0.8972us]  Ops/s:   2.51M  Ops/s/t:   1.25M\n     4   threads:  Avg: 7.7466us  Range: [7.5002us, 7.9109us]  Ops/s: 516.35k  Ops/s/t: 129.09k\n     8   threads:  Avg: 0.0258ms  Range: [0.0248ms, 0.0267ms]  Ops/s: 310.04k  Ops/s/t:  38.76k\n     Operations per second per thread (weighted average): 342.85k\n\n  > std::queue\n     (skipping, benchmark not supported...)\n\nmostly dequeue bulk:\n  (Measures the average speed of dequeueing an item in bulk under light contention)\n  > moodycamel::ConcurrentQueue\n      Without tokens\n         2   threads:  Avg: 8.3404ns  Range: [7.7191ns, 8.9024ns]  Ops/s: 239.80M  Ops/s/t: 119.90M\n         4   threads:  Avg: 0.0264us  Range: [0.0223us, 0.0274us]  Ops/s: 151.37M  Ops/s/t:  37.84M\n         8   threads:  Avg: 0.1042us  Range: [0.0994us, 0.1064us]  Ops/s:  76.75M  Ops/s/t:   9.59M\n         Operations per second per thread (weighted average):  43.63M\n\n      With tokens\n         2   threads:  Avg: 4.9164ns  Range: [4.8544ns, 5.0084ns]  Ops/s: 406.80M  Ops/s/t: 203.40M\n         4   threads:  Avg: 0.0156us  Range: [0.0155us, 0.0158us]  Ops/s: 256.40M  Ops/s/t:  64.10M\n         8   threads:  Avg: 0.0518us  Range: [0.0448us, 0.0607us]  Ops/s: 154.57M  Ops/s/t:  19.32M\n         Operations per second per thread (weighted average):  75.37M\n\n  > boost::lockfree::queue\n     (skipping, benchmark not supported...)\n\n  > tbb::concurrent_queue\n     (skipping, benchmark not supported...)\n\n  > SimpleLockFreeQueue\n     (skipping, benchmark not supported...)\n\n  > LockBasedQueue\n     (skipping, benchmark not supported...)\n\n  > std::queue\n     (skipping, benchmark not supported...)\n\nsingle-producer, multi-consumer (measuring all but 1 thread):\n  (Measures the average speed of dequeueing with only one producer, but multiple consumers)\n  > moodycamel::ConcurrentQueue\n      Without tokens\n         2   threads:  Avg: 0.1041us  Range: [0.0978us, 0.1122us]  Ops/s:   9.60M  Ops/s/t:   9.60M\n         4   threads:  Avg: 1.9386us  Range: [1.7129us, 2.3281us]  Ops/s:   1.55M  Ops/s/t: 515.83k\n         8   threads:  Avg: 0.7837us  Range: [0.5718us, 1.4367us]  Ops/s:   8.93M  Ops/s/t:   1.28M\n         16  threads:  Avg: 0.8587us  Range: [0.8096us, 1.0077us]  Ops/s:  17.47M  Ops/s/t:   1.16M\n         Operations per second per thread (weighted average):   1.99M\n\n      With tokens\n         2   threads:  Avg: 0.1034us  Range: [0.0984us, 0.1079us]  Ops/s:   9.67M  Ops/s/t:   9.67M\n         4   threads:  Avg: 1.4904us  Range: [1.3998us, 1.6162us]  Ops/s:   2.01M  Ops/s/t: 670.97k\n         8   threads:  Avg: 0.9243us  Range: [0.3801us, 6.2399us]  Ops/s:   7.57M  Ops/s/t:   1.08M\n         16  threads:  Avg: 0.7863us  Range: [0.6860us, 0.8744us]  Ops/s:  19.08M  Ops/s/t:   1.27M\n         Operations per second per thread (weighted average):   2.01M\n\n  > boost::lockfree::queue\n     2   threads:  Avg: 0.1390us  Range: [0.1325us, 0.1545us]  Ops/s:   7.19M  Ops/s/t:   7.19M\n     4   threads:  Avg: 0.4625us  Range: [0.2754us, 0.5561us]  Ops/s:   6.49M  Ops/s/t:   2.16M\n     8   threads:  Avg: 0.7324us  Range: [0.5028us, 1.2586us]  Ops/s:   9.56M  Ops/s/t:   1.37M\n     16  threads:  Avg: 0.4086us  Range: [0.3950us, 0.4355us]  Ops/s:  36.71M  Ops/s/t:   2.45M\n     Operations per second per thread (weighted average):   2.60M\n\n  > tbb::concurrent_queue\n     2   threads:  Avg: 0.0396us  Range: [0.0395us, 0.0396us]  Ops/s:  25.27M  Ops/s/t:  25.27M\n     4   threads:  Avg: 0.4785us  Range: [0.3555us, 2.2952us]  Ops/s:   6.27M  Ops/s/t:   2.09M\n     8   threads:  Avg: 6.6917us  Range: [2.8804us, 8.9630us]  Ops/s:   1.05M  Ops/s/t: 149.44k\n     16  threads:  Avg: 6.2738us  Range: [4.4906us, 0.0135ms]  Ops/s:   2.39M  Ops/s/t: 159.39k\n     Operations per second per thread (weighted average):   3.23M\n\n  > SimpleLockFreeQueue\n     2   threads:  Avg: 0.1923us  Range: [0.1744us, 0.2023us]  Ops/s:   5.20M  Ops/s/t:   5.20M\n     4   threads:  Avg: 1.5853us  Range: [0.4197us, 2.7908us]  Ops/s:   1.89M  Ops/s/t: 630.79k\n     8   threads:  Avg: 1.1113us  Range: [0.8406us, 1.7108us]  Ops/s:   6.30M  Ops/s/t: 899.83k\n     16  threads:  Avg: 0.5356us  Range: [0.5155us, 0.5548us]  Ops/s:  28.01M  Ops/s/t:   1.87M\n     Operations per second per thread (weighted average):   1.72M\n\n  > LockBasedQueue\n     2   threads:  Avg: 0.1914us  Range: [0.1719us, 0.2080us]  Ops/s:   5.22M  Ops/s/t:   5.22M\n     4   threads:  Avg: 2.8230us  Range: [2.6594us, 2.9641us]  Ops/s:   1.06M  Ops/s/t: 354.23k\n     8   threads:  Avg: 8.1605us  Range: [7.5421us, 9.6067us]  Ops/s: 857.79k  Ops/s/t: 122.54k\n     16  threads:  Avg: 0.0330ms  Range: [0.0316ms, 0.0339ms]  Ops/s: 455.18k  Ops/s/t:  30.35k\n     Operations per second per thread (weighted average): 678.72k\n\n  > std::queue\n     (skipping, benchmark not supported...)\n\nsingle-producer, multi-consumer (pre-produced):\n  (Measures the average speed of dequeueing from a queue pre-filled by one thread)\n  > moodycamel::ConcurrentQueue\n      Without tokens\n         1    thread:  Avg: 0.0479us  Range: [0.0478us, 0.0479us]  Ops/s:  20.89M  Ops/s/t:  20.89M\n         3   threads:  Avg: 1.0918us  Range: [0.9990us, 1.1343us]  Ops/s:   2.75M  Ops/s/t: 915.91k\n         7   threads:  Avg: 6.1592us  Range: [6.0475us, 6.1973us]  Ops/s:   1.14M  Ops/s/t: 162.36k\n         15  threads:  Avg: 0.0243ms  Range: [0.0240ms, 0.0245ms]  Ops/s: 617.10k  Ops/s/t:  41.14k\n         Operations per second per thread (weighted average):   2.49M\n\n      With tokens\n         1    thread:  Avg: 0.0404us  Range: [0.0404us, 0.0404us]  Ops/s:  24.74M  Ops/s/t:  24.74M\n         3   threads:  Avg: 0.9008us  Range: [0.8752us, 0.9113us]  Ops/s:   3.33M  Ops/s/t:   1.11M\n         7   threads:  Avg: 4.7648us  Range: [4.7195us, 4.8146us]  Ops/s:   1.47M  Ops/s/t: 209.87k\n         15  threads:  Avg: 0.0194ms  Range: [0.0191ms, 0.0196ms]  Ops/s: 772.72k  Ops/s/t:  51.51k\n         Operations per second per thread (weighted average):   2.96M\n\n  > boost::lockfree::queue\n     1    thread:  Avg: 0.0356us  Range: [0.0355us, 0.0357us]  Ops/s:  28.11M  Ops/s/t:  28.11M\n     3   threads:  Avg: 2.1016us  Range: [1.8879us, 2.2375us]  Ops/s:   1.43M  Ops/s/t: 475.82k\n     7   threads:  Avg: 0.0161ms  Range: [0.0149ms, 0.0163ms]  Ops/s: 435.41k  Ops/s/t:  62.20k\n     15  threads:  Avg: 0.0692ms  Range: [0.0458ms, 0.0738ms]  Ops/s: 216.64k  Ops/s/t:  14.44k\n     Operations per second per thread (weighted average):   3.15M\n\n  > tbb::concurrent_queue\n     1    thread:  Avg: 0.0286us  Range: [0.0286us, 0.0287us]  Ops/s:  34.91M  Ops/s/t:  34.91M\n     3   threads:  Avg: 0.9964us  Range: [0.9581us, 1.0265us]  Ops/s:   3.01M  Ops/s/t:   1.00M\n     7   threads:  Avg: 5.4370us  Range: [5.3420us, 5.4884us]  Ops/s:   1.29M  Ops/s/t: 183.93k\n     15  threads:  Avg: 0.1103ms  Range: [0.1003ms, 0.1155ms]  Ops/s: 135.94k  Ops/s/t:   9.06k\n     Operations per second per thread (weighted average):   4.02M\n\n  > SimpleLockFreeQueue\n     1    thread:  Avg: 0.0275us  Range: [0.0275us, 0.0275us]  Ops/s:  36.31M  Ops/s/t:  36.31M\n     3   threads:  Avg: 3.3246us  Range: [2.6774us, 3.5321us]  Ops/s: 902.37k  Ops/s/t: 300.79k\n     7   threads:  Avg: 0.0204ms  Range: [6.8770us, 0.0235ms]  Ops/s: 342.89k  Ops/s/t:  48.98k\n     15  threads:  Avg: 0.0959ms  Range: [0.0412ms, 0.1095ms]  Ops/s: 156.35k  Ops/s/t:  10.42k\n     Operations per second per thread (weighted average):   4.00M\n\n  > LockBasedQueue\n     1    thread:  Avg: 0.0616us  Range: [0.0615us, 0.0616us]  Ops/s:  16.24M  Ops/s/t:  16.24M\n     3   threads:  Avg: 2.7538us  Range: [2.6907us, 2.8152us]  Ops/s:   1.09M  Ops/s/t: 363.14k\n     7   threads:  Avg: 0.0215ms  Range: [0.0190ms, 0.0225ms]  Ops/s: 325.43k  Ops/s/t:  46.49k\n     15  threads:  Avg: 0.0868ms  Range: [0.0813ms, 0.0919ms]  Ops/s: 172.89k  Ops/s/t:  11.53k\n     Operations per second per thread (weighted average):   1.84M\n\n  > std::queue\n     (skipping, benchmark not supported...)\n\nmulti-producer, single-consumer (measuring 1 thread):\n  (Measures the average speed of dequeueing with only one consumer, but multiple producers)\n  > moodycamel::ConcurrentQueue\n      Without tokens\n         2   threads:  Avg: 0.0625us  Range: [0.0624us, 0.0626us]  Ops/s:  15.99M  Ops/s/t:  15.99M\n         4   threads:  Avg: 0.0639us  Range: [0.0625us, 0.0644us]  Ops/s:  15.66M  Ops/s/t:  15.66M\n         8   threads:  Avg: 0.0671us  Range: [0.0628us, 0.0715us]  Ops/s:  14.89M  Ops/s/t:  14.89M\n         16  threads:  Avg: 0.0916us  Range: [0.0869us, 0.0946us]  Ops/s:  10.92M  Ops/s/t:  10.92M\n         Operations per second per thread (weighted average):  14.37M\n\n      With tokens\n         2   threads:  Avg: 0.0556us  Range: [0.0555us, 0.0557us]  Ops/s:  17.99M  Ops/s/t:  17.99M\n         4   threads:  Avg: 0.0454us  Range: [0.0452us, 0.0455us]  Ops/s:  22.03M  Ops/s/t:  22.03M\n         8   threads:  Avg: 0.0410us  Range: [0.0410us, 0.0411us]  Ops/s:  24.37M  Ops/s/t:  24.37M\n         16  threads:  Avg: 0.0418us  Range: [0.0412us, 0.0421us]  Ops/s:  23.93M  Ops/s/t:  23.93M\n         Operations per second per thread (weighted average):  22.08M\n\n  > boost::lockfree::queue\n     2   threads:  Avg: 0.0444us  Range: [0.0420us, 0.0516us]  Ops/s:  22.53M  Ops/s/t:  22.53M\n     4   threads:  Avg: 0.2854us  Range: [0.2487us, 0.4188us]  Ops/s:   3.50M  Ops/s/t:   3.50M\n     8   threads:  Avg: 0.5135us  Range: [0.5043us, 0.5177us]  Ops/s:   1.95M  Ops/s/t:   1.95M\n     16  threads:  Avg: 0.5293us  Range: [0.5162us, 0.5350us]  Ops/s:   1.89M  Ops/s/t:   1.89M\n     Operations per second per thread (weighted average):   7.47M\n\n  > tbb::concurrent_queue\n     2   threads:  Avg: 0.1757us  Range: [0.1333us, 0.2080us]  Ops/s:   5.69M  Ops/s/t:   5.69M\n     4   threads:  Avg: 0.1487us  Range: [0.1463us, 0.1507us]  Ops/s:   6.72M  Ops/s/t:   6.72M\n     8   threads:  Avg: 0.1561us  Range: [0.1542us, 0.1565us]  Ops/s:   6.41M  Ops/s/t:   6.41M\n     16  threads:  Avg: 0.6278us  Range: [0.5630us, 0.6839us]  Ops/s:   1.59M  Ops/s/t:   1.59M\n     Operations per second per thread (weighted average):   5.10M\n\n  > SimpleLockFreeQueue\n     2   threads:  Avg: 0.0464us  Range: [0.0392us, 0.0543us]  Ops/s:  21.55M  Ops/s/t:  21.55M\n     4   threads:  Avg: 0.4172us  Range: [0.3421us, 0.4385us]  Ops/s:   2.40M  Ops/s/t:   2.40M\n     8   threads:  Avg: 0.2543us  Range: [0.2397us, 0.2625us]  Ops/s:   3.93M  Ops/s/t:   3.93M\n     16  threads:  Avg: 0.2392us  Range: [0.2348us, 0.2422us]  Ops/s:   4.18M  Ops/s/t:   4.18M\n     Operations per second per thread (weighted average):   8.01M\n\n  > LockBasedQueue\n     2   threads:  Avg: 0.1546us  Range: [0.1125us, 0.1981us]  Ops/s:   6.47M  Ops/s/t:   6.47M\n     4   threads:  Avg: 0.6662us  Range: [0.5840us, 0.7603us]  Ops/s:   1.50M  Ops/s/t:   1.50M\n     8   threads:  Avg: 0.7431us  Range: [0.6830us, 0.7976us]  Ops/s:   1.35M  Ops/s/t:   1.35M\n     16  threads:  Avg: 0.7052us  Range: [0.6063us, 0.7579us]  Ops/s:   1.42M  Ops/s/t:   1.42M\n     Operations per second per thread (weighted average):   2.68M\n\n  > std::queue\n     (skipping, benchmark not supported...)\n\ndequeue from empty:\n  (Measures the average speed of attempting to dequeue from an empty queue\n  (that eight separate threads had at one point enqueued to))\n  > moodycamel::ConcurrentQueue\n      Without tokens\n         1    thread:  Avg: 0.0409us  Range: [0.0406us, 0.0416us]  Ops/s:  24.45M  Ops/s/t:  24.45M\n                ^ Note: No contention -- measures raw failed dequeue speed on empty queue\n         2   threads:  Avg: 0.0905us  Range: [0.0825us, 0.0962us]  Ops/s:  22.10M  Ops/s/t:  11.05M\n         8   threads:  Avg: 0.3867us  Range: [0.3854us, 0.3899us]  Ops/s:  20.69M  Ops/s/t:   2.59M\n         Operations per second per thread (weighted average):   9.04M\n\n      With tokens\n         1    thread:  Avg: 0.0237us  Range: [0.0200us, 0.0249us]  Ops/s:  42.21M  Ops/s/t:  42.21M\n                ^ Note: No contention -- measures raw failed dequeue speed on empty queue\n         2   threads:  Avg: 0.0524us  Range: [0.0500us, 0.0539us]  Ops/s:  38.19M  Ops/s/t:  19.09M\n         8   threads:  Avg: 0.2339us  Range: [0.1980us, 0.2642us]  Ops/s:  34.21M  Ops/s/t:   4.28M\n         Operations per second per thread (weighted average):  15.51M\n\n  > boost::lockfree::queue\n     1    thread:  Avg: 6.5831ns  Range: [6.5815ns, 6.5847ns]  Ops/s: 151.90M  Ops/s/t: 151.90M\n            ^ Note: No contention -- measures raw failed dequeue speed on empty queue\n     2   threads:  Avg: 0.0122us  Range: [0.0122us, 0.0122us]  Ops/s: 163.52M  Ops/s/t:  81.76M\n     8   threads:  Avg: 0.0488us  Range: [0.0488us, 0.0489us]  Ops/s: 163.91M  Ops/s/t:  20.49M\n     Operations per second per thread (weighted average):  62.08M\n\n  > tbb::concurrent_queue\n     1    thread:  Avg: 5.1712ns  Range: [5.1697ns, 5.1721ns]  Ops/s: 193.38M  Ops/s/t: 193.38M\n            ^ Note: No contention -- measures raw failed dequeue speed on empty queue\n     2   threads:  Avg: 0.0104us  Range: [0.0103us, 0.0104us]  Ops/s: 193.18M  Ops/s/t:  96.59M\n     8   threads:  Avg: 0.0413us  Range: [0.0413us, 0.0413us]  Ops/s: 193.79M  Ops/s/t:  24.22M\n     Operations per second per thread (weighted average):  76.01M\n\n  > SimpleLockFreeQueue\n     1    thread:  Avg: 7.0505ns  Range: [7.0486ns, 7.0525ns]  Ops/s: 141.83M  Ops/s/t: 141.83M\n            ^ Note: No contention -- measures raw failed dequeue speed on empty queue\n     2   threads:  Avg: 0.0160us  Range: [0.0160us, 0.0160us]  Ops/s: 125.02M  Ops/s/t:  62.51M\n     8   threads:  Avg: 0.0638us  Range: [0.0638us, 0.0638us]  Ops/s: 125.33M  Ops/s/t:  15.67M\n     Operations per second per thread (weighted average):  52.37M\n\n  > LockBasedQueue\n     1    thread:  Avg: 0.0291us  Range: [0.0291us, 0.0291us]  Ops/s:  34.32M  Ops/s/t:  34.32M\n            ^ Note: No contention -- measures raw failed dequeue speed on empty queue\n     2   threads:  Avg: 0.2276us  Range: [0.1948us, 0.2441us]  Ops/s:   8.79M  Ops/s/t:   4.39M\n     8   threads:  Avg: 5.2936us  Range: [2.8883us, 6.2920us]  Ops/s:   1.51M  Ops/s/t: 188.91k\n     Operations per second per thread (weighted average):   7.83M\n\n  > std::queue\n     1    thread:  Avg: 0.9395ns  Range: [0.9392ns, 0.9396ns]  Ops/s:   1.06G  Ops/s/t:   1.06G\n            ^ Note: No contention -- measures raw failed dequeue speed on empty queue\n     Operations per second per thread (weighted average):   1.06G\n\nenqueue-dequeue pairs:\n  (Measures the average operation speed with each thread doing an enqueue\n  followed by a dequeue)\n  > moodycamel::ConcurrentQueue\n      Without tokens\n         1    thread:  Avg: 0.0292us  Range: [0.0292us, 0.0292us]  Ops/s:  34.23M  Ops/s/t:  34.23M\n                ^ Note: No contention -- measures speed of immediately dequeueing the item that was just enqueued\n         2   threads:  Avg: 0.2037us  Range: [0.1940us, 0.2153us]  Ops/s:   9.82M  Ops/s/t:   4.91M\n         4   threads:  Avg: 1.7694us  Range: [1.7308us, 1.7856us]  Ops/s:   2.26M  Ops/s/t: 565.17k\n         8   threads:  Avg: 6.5195us  Range: [6.3181us, 6.6066us]  Ops/s:   1.23M  Ops/s/t: 153.39k\n         Operations per second per thread (weighted average):   5.90M\n\n      With tokens\n         1    thread:  Avg: 0.0226us  Range: [0.0226us, 0.0226us]  Ops/s:  44.19M  Ops/s/t:  44.19M\n                ^ Note: No contention -- measures speed of immediately dequeueing the item that was just enqueued\n         2   threads:  Avg: 0.0487us  Range: [0.0485us, 0.0488us]  Ops/s:  41.10M  Ops/s/t:  20.55M\n         4   threads:  Avg: 0.1205us  Range: [0.1195us, 0.1214us]  Ops/s:  33.20M  Ops/s/t:   8.30M\n         8   threads:  Avg: 0.3268us  Range: [0.3128us, 0.3348us]  Ops/s:  24.48M  Ops/s/t:   3.06M\n         Operations per second per thread (weighted average):  13.60M\n\n  > boost::lockfree::queue\n     1    thread:  Avg: 0.0437us  Range: [0.0436us, 0.0437us]  Ops/s:  22.90M  Ops/s/t:  22.90M\n            ^ Note: No contention -- measures speed of immediately dequeueing the item that was just enqueued\n     2   threads:  Avg: 0.3969us  Range: [0.3245us, 0.4216us]  Ops/s:   5.04M  Ops/s/t:   2.52M\n     4   threads:  Avg: 3.3639us  Range: [3.2929us, 3.4045us]  Ops/s:   1.19M  Ops/s/t: 297.27k\n     8   threads:  Avg: 0.0146ms  Range: [0.0139ms, 0.0148ms]  Ops/s: 548.28k  Ops/s/t:  68.54k\n     Operations per second per thread (weighted average):   3.76M\n\n  > tbb::concurrent_queue\n     1    thread:  Avg: 0.0288us  Range: [0.0287us, 0.0289us]  Ops/s:  34.72M  Ops/s/t:  34.72M\n            ^ Note: No contention -- measures speed of immediately dequeueing the item that was just enqueued\n     2   threads:  Avg: 0.3518us  Range: [0.3293us, 0.3811us]  Ops/s:   5.69M  Ops/s/t:   2.84M\n     4   threads:  Avg: 2.4316us  Range: [2.3749us, 2.5254us]  Ops/s:   1.64M  Ops/s/t: 411.24k\n     8   threads:  Avg: 0.0119ms  Range: [0.0109ms, 0.0127ms]  Ops/s: 670.40k  Ops/s/t:  83.80k\n     Operations per second per thread (weighted average):   5.49M\n\n  > SimpleLockFreeQueue\n     1    thread:  Avg: 0.0477us  Range: [0.0476us, 0.0477us]  Ops/s:  20.99M  Ops/s/t:  20.99M\n            ^ Note: No contention -- measures speed of immediately dequeueing the item that was just enqueued\n     2   threads:  Avg: 0.4059us  Range: [0.3067us, 0.4286us]  Ops/s:   4.93M  Ops/s/t:   2.46M\n     4   threads:  Avg: 3.6382us  Range: [3.5906us, 3.6695us]  Ops/s:   1.10M  Ops/s/t: 274.86k\n     8   threads:  Avg: 0.0152ms  Range: [0.0140ms, 0.0157ms]  Ops/s: 526.95k  Ops/s/t:  65.87k\n     Operations per second per thread (weighted average):   3.48M\n\n  > LockBasedQueue\n     1    thread:  Avg: 0.0646us  Range: [0.0646us, 0.0646us]  Ops/s:  15.48M  Ops/s/t:  15.48M\n            ^ Note: No contention -- measures speed of immediately dequeueing the item that was just enqueued\n     2   threads:  Avg: 0.6880us  Range: [0.6445us, 0.7316us]  Ops/s:   2.91M  Ops/s/t:   1.45M\n     4   threads:  Avg: 6.0035us  Range: [5.9227us, 6.0622us]  Ops/s: 666.28k  Ops/s/t: 166.57k\n     8   threads:  Avg: 0.0200ms  Range: [0.0106ms, 0.0247ms]  Ops/s: 400.14k  Ops/s/t:  50.02k\n     Operations per second per thread (weighted average):   2.49M\n\n  > std::queue\n     1    thread:  Avg: 4.4183ns  Range: [4.4094ns, 4.4228ns]  Ops/s: 226.33M  Ops/s/t: 226.33M\n            ^ Note: No contention -- measures speed of immediately dequeueing the item that was just enqueued\n     Operations per second per thread (weighted average): 226.33M\n\nheavy concurrent:\n  (Measures the average operation speed with many threads under heavy load)\n  > moodycamel::ConcurrentQueue\n      Without tokens\n         2   threads:  Avg: 0.2189us  Range: [0.2185us, 0.2194us]  Ops/s:   9.14M  Ops/s/t:   4.57M\n         3   threads:  Avg: 0.3700us  Range: [0.3134us, 0.4042us]  Ops/s:   8.11M  Ops/s/t:   2.70M\n         4   threads:  Avg: 1.1026us  Range: [1.0439us, 1.1272us]  Ops/s:   3.63M  Ops/s/t: 906.94k\n         8   threads:  Avg: 3.1887us  Range: [3.0584us, 3.2292us]  Ops/s:   2.51M  Ops/s/t: 313.61k\n         12  threads:  Avg: 6.0866us  Range: [5.9009us, 6.2746us]  Ops/s:   1.97M  Ops/s/t: 164.30k\n         16  threads:  Avg: 9.9339us  Range: [9.5659us, 0.0102ms]  Ops/s:   1.61M  Ops/s/t: 100.67k\n         Operations per second per thread (weighted average): 959.54k\n\n      With tokens\n         2   threads:  Avg: 0.0502us  Range: [0.0475us, 0.0523us]  Ops/s:  39.86M  Ops/s/t:  19.93M\n         3   threads:  Avg: 0.1121us  Range: [0.1088us, 0.1140us]  Ops/s:  26.76M  Ops/s/t:   8.92M\n         4   threads:  Avg: 0.4054us  Range: [0.3912us, 0.4140us]  Ops/s:   9.87M  Ops/s/t:   2.47M\n         8   threads:  Avg: 0.7169us  Range: [0.5758us, 0.8319us]  Ops/s:  11.16M  Ops/s/t:   1.39M\n         12  threads:  Avg: 1.2992us  Range: [1.0963us, 1.5459us]  Ops/s:   9.24M  Ops/s/t: 769.70k\n         16  threads:  Avg: 1.8166us  Range: [1.4060us, 1.9616us]  Ops/s:   8.81M  Ops/s/t: 550.47k\n         Operations per second per thread (weighted average):   3.72M\n\n  > boost::lockfree::queue\n     2   threads:  Avg: 0.3558us  Range: [0.3235us, 0.3937us]  Ops/s:   5.62M  Ops/s/t:   2.81M\n     3   threads:  Avg: 1.7224us  Range: [1.5520us, 1.8241us]  Ops/s:   1.74M  Ops/s/t: 580.60k\n     4   threads:  Avg: 2.2439us  Range: [1.8891us, 2.4835us]  Ops/s:   1.78M  Ops/s/t: 445.65k\n     8   threads:  Avg: 8.8162us  Range: [8.5410us, 9.0435us]  Ops/s: 907.42k  Ops/s/t: 113.43k\n     12  threads:  Avg: 0.0184ms  Range: [0.0179ms, 0.0187ms]  Ops/s: 653.30k  Ops/s/t:  54.44k\n     16  threads:  Avg: 0.0289ms  Range: [0.0236ms, 0.0301ms]  Ops/s: 554.55k  Ops/s/t:  34.66k\n     Operations per second per thread (weighted average): 422.31k\n\n  > tbb::concurrent_queue\n     2   threads:  Avg: 0.3223us  Range: [0.3021us, 0.3596us]  Ops/s:   6.20M  Ops/s/t:   3.10M\n     3   threads:  Avg: 0.8995us  Range: [0.8900us, 0.9129us]  Ops/s:   3.34M  Ops/s/t:   1.11M\n     4   threads:  Avg: 1.7776us  Range: [1.6889us, 1.8523us]  Ops/s:   2.25M  Ops/s/t: 562.55k\n     8   threads:  Avg: 6.1223us  Range: [5.5484us, 6.5143us]  Ops/s:   1.31M  Ops/s/t: 163.34k\n     12  threads:  Avg: 0.0175ms  Range: [0.0137ms, 0.0198ms]  Ops/s: 686.07k  Ops/s/t:  57.17k\n     16  threads:  Avg: 0.0461ms  Range: [0.0382ms, 0.0519ms]  Ops/s: 347.11k  Ops/s/t:  21.69k\n     Operations per second per thread (weighted average): 530.15k\n\n  > SimpleLockFreeQueue\n     2   threads:  Avg: 0.4770us  Range: [0.3797us, 0.5594us]  Ops/s:   4.19M  Ops/s/t:   2.10M\n     3   threads:  Avg: 1.4174us  Range: [1.1771us, 1.6083us]  Ops/s:   2.12M  Ops/s/t: 705.51k\n     4   threads:  Avg: 3.1814us  Range: [2.8453us, 3.4126us]  Ops/s:   1.26M  Ops/s/t: 314.33k\n     8   threads:  Avg: 0.0115ms  Range: [7.8236us, 0.0142ms]  Ops/s: 693.66k  Ops/s/t:  86.71k\n     12  threads:  Avg: 0.0136ms  Range: [9.8911us, 0.0154ms]  Ops/s: 879.37k  Ops/s/t:  73.28k\n     16  threads:  Avg: 0.0194ms  Range: [0.0178ms, 0.0210ms]  Ops/s: 823.59k  Ops/s/t:  51.47k\n     Operations per second per thread (weighted average): 357.56k\n\n  > LockBasedQueue\n     2   threads:  Avg: 0.5884us  Range: [0.5593us, 0.6079us]  Ops/s:   3.40M  Ops/s/t:   1.70M\n     3   threads:  Avg: 2.7292us  Range: [2.5104us, 2.8136us]  Ops/s:   1.10M  Ops/s/t: 366.41k\n     4   threads:  Avg: 6.0285us  Range: [5.7452us, 6.1933us]  Ops/s: 663.52k  Ops/s/t: 165.88k\n     8   threads:  Avg: 0.0233ms  Range: [8.6898us, 0.0286ms]  Ops/s: 342.92k  Ops/s/t:  42.87k\n     12  threads:  Avg: 0.0594ms  Range: [0.0545ms, 0.0609ms]  Ops/s: 202.13k  Ops/s/t:  16.84k\n     16  threads:  Avg: 0.1016ms  Range: [0.0870ms, 0.1082ms]  Ops/s: 157.46k  Ops/s/t:   9.84k\n     Operations per second per thread (weighted average): 232.46k\n\n  > std::queue\n     (skipping, benchmark not supported...)\n\nOverall average operations per second per thread (where higher-concurrency runs have more weight):\n(Take this summary with a grain of salt -- look at the individual benchmark results for a much\nbetter idea of how the queues measure up to each other):\n    moodycamel::ConcurrentQueue (including bulk):  19.04M\n    boost::lockfree::queue:   4.07M\n    tbb::concurrent_queue:   5.09M\n    SimpleLockFreeQueue:   3.76M\n    LockBasedQueue:   1.36M\n    std::queue (single thread only): 297.43M\n"
  },
  {
    "path": "benchmarks/cpuid.cpp",
    "content": "#include <cstdint>\n#include <cstring>\n#include <cstdio>\n#include <cstdlib>\n\n#include \"cpuid.h\"\n\n#ifdef _WIN32\n#define WIN32_LEAN_AND_MEAN\n#include <windows.h>\n\n// See http://msdn.microsoft.com/en-us/library/windows/desktop/ms683194(v=vs.85).aspx\ntypedef BOOL (WINAPI *LPFN_GLPI)(PSYSTEM_LOGICAL_PROCESSOR_INFORMATION, PDWORD);\n\n// Helper function to count set bits in the processor mask.\nint countBitsSet(ULONG_PTR bitMask)\n{\n\tint result = 0;\n\twhile (bitMask != 0) {\n\t\tresult += (int)(bitMask & 1);\n\t\tbitMask >>= 1;\n\t}\n\treturn result;\n}\n\nbool getProcessorInfoFromOS(int& cpus, int& cores, int& logicalCores, double& clockSpeed)\n{\n\tcpus = 0;\n\tcores = 0;\n\tlogicalCores = 0;\n\tclockSpeed = 0;\n\t\n\t// Clock speed\n\tHKEY hKey;\n\tif (RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT(\"HARDWARE\\\\DESCRIPTION\\\\System\\\\CentralProcessor\\\\0\"), 0, KEY_EXECUTE, &hKey) == ERROR_SUCCESS) {\n\t\tDWORD type = REG_DWORD;\n\t\tDWORD val;\n\t\tDWORD cbData = sizeof(val);\n\t\tif (RegQueryValueEx(hKey, TEXT(\"~MHz\"), NULL, &type, (LPBYTE)&val, &cbData) == ERROR_SUCCESS) {\n\t\t\tif (type == REG_DWORD && cbData == sizeof(DWORD)) {\n\t\t\t\tclockSpeed = val / 1000.0;\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\tif (clockSpeed == 0) {\n\t\t// Can't access registry, try QueryPerformanceFrequency (nearly always same speed as CPU)\n\t\tLARGE_INTEGER f;\n\t\tif (!QueryPerformanceFrequency(&f)) {\n\t\t\treturn false;\n\t\t}\n\t\tclockSpeed = f.QuadPart / 1000.0 / 1000.0;\n\t}\n\t\n\t// Everything else\n\tLPFN_GLPI glpi;\n\tglpi = (LPFN_GLPI)GetProcAddress(GetModuleHandle(TEXT(\"kernel32\")), \"GetLogicalProcessorInformation\");\n\tif (glpi == NULL) {\n\t\treturn false;\n\t}\n\t\n\tPSYSTEM_LOGICAL_PROCESSOR_INFORMATION buffer = NULL;\n\tDWORD bufferLength = 0;\n\tif (glpi(buffer, &bufferLength) == TRUE) {\n    \treturn false;\n    }\n    \n\twhile (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {\n\t\tif (buffer != NULL) {\n\t\t\tstd::free(buffer);\n\t\t}\n\t\tbuffer = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION)std::malloc(bufferLength);\n\t\tif (buffer == NULL) {\n\t\t\treturn false;\n\t\t}\n\t\tif (glpi(buffer, &bufferLength) == TRUE) {\n\t\t\tif (bufferLength / sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION) * sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION) != bufferLength) {\n\t\t\t\t// sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION) must have changed (different from at compile time)\n\t\t\t\tstd::free(buffer);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t\n\t\t\tauto end = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION)((char*)buffer + bufferLength);\n\t\t\tfor (auto ptr = buffer; ptr != end; ++ptr) {\n\t\t\t\tswitch (ptr->Relationship) {\n\t\t\t\tcase RelationProcessorCore:\n\t\t\t\t\t++cores;\n\t\t\t\t\tlogicalCores += countBitsSet(ptr->ProcessorMask);\n\t\t\t\t\tbreak;\n\t\t\t\tcase RelationProcessorPackage:\n\t\t\t\t\t++cpus;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tstd::free(buffer);\n\t\t\treturn true;\n\t\t}\n\t}\n\tif (buffer != NULL) {\n\t\tstd::free(buffer);\n\t}\n\treturn false;\n}\n#else\n// TODO\nbool getProcessorInfoFromOS(int& cpus, int& cores, int& logicalCores, double& clockSpeed)\n{\n\treturn false;\n}\n#endif\n\n\n#if defined(__x86_64__) || defined(_M_AMD64) || defined(__amd64__) || defined (_M_X64) || defined(_M_IX86) || defined(__i386__)\n#define MOODYCAMEL_X86_OR_X64\n#endif\n\n#ifdef MOODYCAMEL_X86_OR_X64\nstruct CPUIDInfo\n{\n\tstd::uint32_t data[4];\n};\n\n#ifdef _MSC_VER\n#include <intrin.h>\n\ninline CPUIDInfo cpuid(std::uint32_t eax)\n{\n\tCPUIDInfo info;\n\t__cpuidex((int*)&info.data[0], eax, 0);\n\treturn info;\n}\n#else\n// Assume GCC-compatible inline assembly syntax\ninline CPUIDInfo cpuid(std::uint32_t eax)\n{\n\tCPUIDInfo info;\n\tasm volatile(\"cpuid\"\n\t\t: \"=a\" (info.data[0]), \"=b\" (info.data[1]), \"=c\" (info.data[2]), \"=d\" (info.data[3])\n\t\t: \"a\" (eax), \"c\" (0));\n\treturn info;\n}\n#endif\n#endif\t\t// MOODYCAMEL_X86_OR_X64\n\nnamespace moodycamel\n{\n\tconst char* getCPUString()\n\t{\n\t\t// TODO: Support non-x86/-x64 architectures\n#ifdef MOODYCAMEL_X86_OR_X64\n\t\tstatic char buf[128] = { 0 };\n\t\tif (buf[0] != 0) {\n\t\t\treturn buf;\n\t\t}\n\t\t\n\t\tCPUIDInfo info = cpuid(0x80000000);\n\t\tstd::uint32_t ex = info.data[0];\n\t\tfor (std::uint32_t i = 0; i + 0x80000002 <= ex && i != 3; ++i) {\n\t\t\t*(reinterpret_cast<CPUIDInfo*>(buf) + i) = cpuid(i + 0x80000002);\n\t\t}\n\t\t\n\t\tif (buf[0] == 0) {\n\t\t\tstrcpy(buf, UNKNOWN_CPU_STRING);\n\t\t\treturn buf;\n\t\t}\n\t\t\n\t\tinfo = cpuid(0);\n\t\tif (info.data[0] < 1) {\n\t\t\t// cpuid(1) not supported\n\t\t\treturn buf;\n\t\t}\n\t\t\n\t\t// Add number of CPUs, cores, HT, and GHz\n\t\tinfo = cpuid(1);\n\t\tbool ht = ((info.data[3] >> 28) & 1) == 1;\t// Note: This is also 1 on most multi-core systems, even if there's no HT\n\t\tint cpus, cores, logicalCores;\n\t\tdouble clockSpeed;\n\t\tif (!getProcessorInfoFromOS(cpus, cores, logicalCores, clockSpeed)) {\n\t\t\treturn buf;\n\t\t}\n\t\t// Strip @ nGHz if any, since we re-calculate this ourselves\n\t\tint atIndex;\n\t\tfor (atIndex = (int)std::strlen(buf) - 1; atIndex != -1; --atIndex) {\n\t\t\tif (buf[atIndex] == '@') {\n\t\t\t\tif (atIndex > 0 && buf[atIndex - 1] == ' ') {\n\t\t\t\t\t--atIndex;\n\t\t\t\t}\n\t\t\t\tbuf[atIndex] = '\\0';\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t// Strip trailing spaces if any\n\t\tfor (char* s = buf + std::strlen(buf); s != buf && s[-1] == ' '; --s)\n\t\t\ts[-1] = '\\0';\n\t\tchar* str = buf + std::strlen(buf);\n\t\tif (cpus > 1) {\n\t\t\t// Assume identical CPUs\n\t\t\tlogicalCores /= cpus;\n\t\t\tcores /= cpus;\n\t\t\tstd::sprintf(str, \" x%d\", cpus);\n\t\t\tstr += strlen(str);\n\t\t}\n\t\tht = ht && logicalCores != cores;\n\t\tstd::sprintf(str, \" with %d core%s%s @ %.1fGHz%s\", cores, cores == 1 ? \"\" : \"s\", ht ? \" (HyperThreaded)\" : \"\", clockSpeed, cpus > 1 ? \" each\" : \"\");\n\t\t\n\t\treturn buf;\n#else\n\t\treturn UNKNOWN_CPU_STRING;\n#endif\n\t}\n}\n"
  },
  {
    "path": "benchmarks/cpuid.h",
    "content": "#pragma once\n\nnamespace moodycamel\n{\n\tstatic const char UNKNOWN_CPU_STRING[] = \"unknown processor\";\n\t\n\t// Returns a string representing the system's CPU info.\n\t// Assumes an x86/x64 architecture (returns UNKNOWN_CPU_STRING otherwise).\n\t// Returned string is valid in perpetuity.\n\t// Not thread safe.\n\tconst char* getCPUString();\n}\n"
  },
  {
    "path": "benchmarks/dlib/algs.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n\n#ifdef DLIB_ALL_SOURCE_END\n#include \"dlib_basic_cpp_build_tutorial.txt\"\n#endif\n\n#ifndef DLIB_ALGs_\n#define DLIB_ALGs_\n\n// this file contains miscellaneous stuff                      \n\n// Give people who forget the -std=c++11 option a reminder\n#if (defined(__GNUC__) && ((__GNUC__ >= 4 && __GNUC_MINOR__ >= 8) || (__GNUC__ > 4))) || \\\n    (defined(__clang__) && ((__clang_major__ >= 3 && __clang_minor__ >= 4) || (__clang_major__ >= 3)))\n    #if __cplusplus < 201103\n        #error \"Dlib requires C++11 support.  Give your compiler the -std=c++11 option to enable it.\"\n    #endif\n#endif\n\n#if defined __NVCC__\n    // Disable the \"statement is unreachable\" message since it will go off on code that is\n    // actually reachable but just happens to not be reachable sometimes during certain\n    // template instantiations.\n    #pragma diag_suppress code_is_unreachable\n#endif\n\n\n#ifdef _MSC_VER\n\n#if  _MSC_VER < 1900\n#error \"dlib versions newer than v19.1 use C++11 and therefore require Visual Studio 2015 or newer.\"\n#endif\n\n// Disable the following warnings for Visual Studio\n\n// this is to disable the \"'this' : used in base member initializer list\"\n// warning you get from some of the GUI objects since all the objects\n// require that their parent class be passed into their constructor. \n// In this case though it is totally safe so it is ok to disable this warning.\n#pragma warning(disable : 4355)\n\n// This is a warning you get sometimes when Visual Studio performs a Koenig Lookup. \n// This is a bug in visual studio.  It is a totally legitimate thing to \n// expect from a compiler. \n#pragma warning(disable : 4675)\n\n// This is a warning you get from visual studio 2005 about things in the standard C++\n// library being \"deprecated.\"  I checked the C++ standard and it doesn't say jack \n// about any of them (I checked the searchable PDF).   So this warning is total Bunk.\n#pragma warning(disable : 4996)\n\n// This is a warning you get from visual studio 2003:\n//    warning C4345: behavior change: an object of POD type constructed with an initializer \n//    of the form () will be default-initialized.\n// I love it when this compiler gives warnings about bugs in previous versions of itself. \n#pragma warning(disable : 4345)\n\n\n// Disable warnings about conversion from size_t to unsigned long and long.\n#pragma warning(disable : 4267)\n\n// Disable warnings about conversion from double to float  \n#pragma warning(disable : 4244)\n#pragma warning(disable : 4305)\n\n// Disable \"warning C4180: qualifier applied to function type has no meaning; ignored\".\n// This warning happens often in generic code that works with functions and isn't useful.\n#pragma warning(disable : 4180)\n\n// Disable \"warning C4290: C++ exception specification ignored except to indicate a function is not __declspec(nothrow)\"\n#pragma warning(disable : 4290)\n\n\n// DNN module uses template-based network declaration that leads to very long\n// type names. Visual Studio will produce Warning C4503 in such cases. https://msdn.microsoft.com/en-us/library/074af4b6.aspx says\n// that correct binaries are still produced even when this warning happens, but linker errors from visual studio, if they occur could be confusing.\n#pragma warning( disable: 4503 )\n\n\n#endif\n\n#ifdef __BORLANDC__\n// Disable the following warnings for the Borland Compilers\n//\n// These warnings just say that the compiler is refusing to inline functions with\n// loops or try blocks in them.  \n//\n#pragma option -w-8027\n#pragma option -w-8026 \n#endif\n\n#include <string>       // for the exceptions\n\n#ifdef __CYGWIN__\nnamespace std\n{\n   typedef std::basic_string<wchar_t> wstring;\n}\n#endif\n\n#include \"platform.h\"\n#include \"windows_magic.h\"\n\n\n#include <algorithm>    // for std::swap\n#include <new>          // for std::bad_alloc\n#include <cstdlib>\n#include <stddef.h>\n#include <limits> // for std::numeric_limits for is_finite()\n#include \"assert.h\"\n#include \"error.h\"\n#include \"noncopyable.h\"\n#include \"enable_if.h\"\n#include \"uintn.h\"\n#include \"numeric_constants.h\"\n#include \"memory_manager_stateless/memory_manager_stateless_kernel_1.h\" // for the default memory manager\n\n\n\n// ----------------------------------------------------------------------------------------\n/*!A _dT !*/\n\ntemplate <typename charT>\ninline charT _dTcast (const char a, const wchar_t b);\ntemplate <>\ninline char _dTcast<char> (const char a, const wchar_t ) { return a; }\ntemplate <>\ninline wchar_t _dTcast<wchar_t> (const char , const wchar_t b) { return b; }\n\ntemplate <typename charT>\ninline const charT* _dTcast ( const char* a, const wchar_t* b);\ntemplate <>\ninline const char* _dTcast<char> ( const char* a, const wchar_t* ) { return a; }\ntemplate <>\ninline const wchar_t* _dTcast<wchar_t> ( const char* , const wchar_t* b) { return b; }\n\n\n#define _dT(charT,str) _dTcast<charT>(str,L##str) \n/*!\n    requires\n        - charT == char or wchar_t\n        - str == a string or character literal\n    ensures\n        - returns the literal in the form of a charT type literal.\n!*/\n\n// ----------------------------------------------------------------------------------------\n\n\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    /*!A default_memory_manager\n\n        This memory manager just calls new and delete directly.  \n\n    !*/\n    typedef memory_manager_stateless_kernel_1<char> default_memory_manager;\n\n// ----------------------------------------------------------------------------------------\n\n    /*!A swap !*/\n    // make swap available in the dlib namespace\n    using std::swap;\n\n// ----------------------------------------------------------------------------------------\n\n    /*!\n        Here is where I define my return codes.  It is \n        important that they all be < 0.\n    !*/\n\n    enum general_return_codes\n    {\n        TIMEOUT     = -1,\n        WOULDBLOCK  = -2,\n        OTHER_ERROR = -3,\n        SHUTDOWN    = -4,\n        PORTINUSE   = -5\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    inline unsigned long square_root (\n        unsigned long value\n    )\n    /*!\n        requires\n            - value <= 2^32 - 1\n        ensures\n            - returns the square root of value.  if the square root is not an\n              integer then it will be rounded up to the nearest integer.\n    !*/\n    {\n        unsigned long x;\n\n        // set the initial guess for what the root is depending on \n        // how big value is\n        if (value < 3)\n            return value;\n        else if (value < 4096) // 12\n            x = 45;\n        else if (value < 65536) // 16\n            x = 179;\n        else if (value < 1048576) // 20\n            x = 717;\n        else if (value < 16777216) // 24\n            x = 2867;\n        else if (value < 268435456) // 28\n            x = 11469;\n        else   // 32\n            x = 45875;\n\n\n\n        // find the root\n        x = (x + value/x)>>1;\n        x = (x + value/x)>>1;\n        x = (x + value/x)>>1;\n        x = (x + value/x)>>1;\n\n\n\n        if (x*x < value)\n            return x+1;\n        else\n            return x;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >    \n    void median (\n        T& one,\n        T& two,\n        T& three\n    );\n    /*!\n        requires\n            - T implements operator< \n            - T is swappable by a global swap()\n        ensures\n            - #one is the median \n            - #one, #two, and #three is some permutation of one, two, and three.  \n    !*/\n    \n    \n    template <\n        typename T\n        >\n    void median (\n        T& one,\n        T& two,\n        T& three\n    )    \n    {    \n        using std::swap;\n        using dlib::swap;\n\n        if ( one < two )\n        {\n            // one < two\n            if ( two < three )\n            {\n                // one < two < three : two\n                swap(one,two);\n                \n            }\n            else\n            {\n                // one < two >= three\n                if ( one < three)\n                {\n                    // three\n                    swap(three,one);\n                }\n            }\n            \n        }\n        else\n        {\n            // one >= two\n            if ( three < one )\n            {\n                // three <= one >= two\n                if ( three < two )\n                {\n                    // two\n                    swap(two,one);\n                }\n                else\n                {\n                    // three\n                    swap(three,one);\n                }\n            }\n        }        \n    }\n\n// ----------------------------------------------------------------------------------------\n\n    namespace relational_operators\n    {\n        template <\n            typename A,\n            typename B\n            >\n        constexpr bool operator> (\n            const A& a,\n            const B& b\n        ) { return b < a; }\n\n    // ---------------------------------\n\n        template <\n            typename A,\n            typename B\n            >\n        constexpr bool operator!= (\n            const A& a,\n            const B& b\n        ) { return !(a == b); }\n\n    // ---------------------------------\n\n        template <\n            typename A,\n            typename B\n            >\n        constexpr bool operator<= (\n            const A& a,\n            const B& b\n        ) { return !(b < a); }\n\n    // ---------------------------------\n\n        template <\n            typename A,\n            typename B\n            >\n        constexpr bool operator>= (\n            const A& a,\n            const B& b\n        ) { return !(a < b); }\n\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    void exchange (\n        T& a,\n        T& b\n    )\n    /*!\n        This function does the exact same thing that global swap does and it does it by\n        just calling swap.  But a lot of compilers have problems doing a Koenig Lookup\n        and the fact that this has a different name (global swap has the same name as\n        the member functions called swap) makes them compile right.\n\n        So this is a workaround but not too ugly of one.  But hopefully I get get\n        rid of this in a few years.  So this function is already deprecated. \n\n        This also means you should NOT use this function in your own code unless\n        you have to support an old buggy compiler that benefits from this hack.\n    !*/\n    {\n        using std::swap;\n        using dlib::swap;\n        swap(a,b);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    /*!A is_pointer_type\n\n        This is a template where is_pointer_type<T>::value == true when T is a pointer \n        type and false otherwise.\n    !*/\n\n    template <\n        typename T\n        >\n    class is_pointer_type\n    {\n    public:\n        enum { value = false };\n    private:\n        is_pointer_type();\n    };\n\n    template <\n        typename T\n        >\n    class is_pointer_type<T*>\n    {\n    public:\n        enum { value = true };\n    private:\n        is_pointer_type();\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    /*!A is_const_type\n\n        This is a template where is_const_type<T>::value == true when T is a const \n        type and false otherwise.\n    !*/\n\n    template <typename T>\n    struct is_const_type\n    {\n        static const bool value = false;\n    };\n    template <typename T>\n    struct is_const_type<const T>\n    {\n        static const bool value = true;\n    };\n    template <typename T>\n    struct is_const_type<const T&>\n    {\n        static const bool value = true;\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    /*!A is_reference_type \n\n        This is a template where is_reference_type<T>::value == true when T is a reference \n        type and false otherwise.\n    !*/\n\n    template <typename T>\n    struct is_reference_type\n    {\n        static const bool value = false;\n    };\n\n    template <typename T> struct is_reference_type<const T&> { static const bool value = true; };\n    template <typename T> struct is_reference_type<T&> { static const bool value = true; };\n\n// ----------------------------------------------------------------------------------------\n\n    /*!A is_same_type \n\n        This is a template where is_same_type<T,U>::value == true when T and U are the\n        same type and false otherwise.   \n    !*/\n\n    template <\n        typename T,\n        typename U\n        >\n    class is_same_type\n    {\n    public:\n        enum {value = false};\n    private:\n        is_same_type();\n    };\n\n    template <typename T>\n    class is_same_type<T,T>\n    {\n    public:\n        enum {value = true};\n    private:\n        is_same_type();\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    /*!A is_float_type\n\n        This is a template that can be used to determine if a type is one of the built\n        int floating point types (i.e. float, double, or long double).\n    !*/\n\n    template < typename T > struct is_float_type  { const static bool value = false; };\n    template <> struct is_float_type<float>       { const static bool value = true; };\n    template <> struct is_float_type<double>      { const static bool value = true; };\n    template <> struct is_float_type<long double> { const static bool value = true; };\n\n// ----------------------------------------------------------------------------------------\n\n    /*!A is_convertible\n\n        This is a template that can be used to determine if one type is convertible \n        into another type.\n\n        For example:\n            is_convertible<int,float>::value == true    // because ints are convertible to floats\n            is_convertible<int*,float>::value == false  // because int pointers are NOT convertible to floats\n    !*/\n\n    template <typename from, typename to>\n    struct is_convertible\n    {\n        struct yes_type { char a; };\n        struct no_type { yes_type a[2]; };\n        static const from& from_helper();\n        static yes_type test(to);\n        static no_type test(...);\n        const static bool value = sizeof(test(from_helper())) == sizeof(yes_type);\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    struct general_ {};\n    struct special_ : general_ {};\n    template<typename> struct int_ { typedef int type; };\n\n// ----------------------------------------------------------------------------------------\n\n\n    /*!A is_same_object \n\n        This is a templated function which checks if both of its arguments are actually\n        references to the same object.  It returns true if they are and false otherwise.\n\n    !*/\n\n    // handle the case where T and U are unrelated types.\n    template < typename T, typename U >\n    typename disable_if_c<is_convertible<T*, U*>::value || is_convertible<U*,T*>::value, bool>::type\n    is_same_object (\n        const T& a, \n        const U& b\n    ) \n    { \n        return ((void*)&a == (void*)&b); \n    }\n\n    // handle the case where T and U are related types because their pointers can be\n    // implicitly converted into one or the other.  E.g. a derived class and its base class. \n    // Or where both T and U are just the same type.  This way we make sure that if there is a\n    // valid way to convert between these two pointer types then we will take that route rather\n    // than the void* approach used otherwise.\n    template < typename T, typename U >\n    typename enable_if_c<is_convertible<T*, U*>::value || is_convertible<U*,T*>::value, bool>::type\n    is_same_object (\n        const T& a, \n        const U& b\n    ) \n    { \n        return (&a == &b); \n    }\n\n// ----------------------------------------------------------------------------------------\n\n    /*!A is_unsigned_type \n\n        This is a template where is_unsigned_type<T>::value == true when T is an unsigned\n        scalar type and false when T is a signed scalar type.\n    !*/\n    template <\n        typename T\n        >\n    struct is_unsigned_type\n    {\n        static const bool value = static_cast<T>((static_cast<T>(0)-static_cast<T>(1))) > 0;\n    };\n    template <> struct is_unsigned_type<long double> { static const bool value = false; };\n    template <> struct is_unsigned_type<double>      { static const bool value = false; };\n    template <> struct is_unsigned_type<float>       { static const bool value = false; };\n\n// ----------------------------------------------------------------------------------------\n\n    /*!A is_signed_type \n\n        This is a template where is_signed_type<T>::value == true when T is a signed\n        scalar type and false when T is an unsigned scalar type.\n    !*/\n    template <\n        typename T\n        >\n    struct is_signed_type\n    {\n        static const bool value = !is_unsigned_type<T>::value;\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    class copy_functor\n    {\n    public:\n        void operator() (\n            const T& source, \n            T& destination\n        ) const\n        {\n            destination = source;\n        }\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    /*!A static_switch\n\n        To use this template you give it some number of boolean expressions and it\n        tells you which one of them is true.   If more than one of them is true then\n        it causes a compile time error.\n\n        for example:\n            static_switch<1 + 1 == 2, 4 - 1 == 4>::value == 1  // because the first expression is true\n            static_switch<1 + 1 == 3, 4 == 4>::value == 2      // because the second expression is true\n            static_switch<1 + 1 == 3, 4 == 5>::value == 0      // 0 here because none of them are true \n            static_switch<1 + 1 == 2, 4 == 4>::value == compiler error  // because more than one expression is true \n    !*/\n\n    template < bool v1 = 0, bool v2 = 0, bool v3 = 0, bool v4 = 0, bool v5 = 0,\n               bool v6 = 0, bool v7 = 0, bool v8 = 0, bool v9 = 0, bool v10 = 0, \n               bool v11 = 0, bool v12 = 0, bool v13 = 0, bool v14 = 0, bool v15 = 0 >\n    struct static_switch; \n\n    template <> struct static_switch<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0> { const static int value = 0; };\n    template <> struct static_switch<1,0,0,0,0,0,0,0,0,0,0,0,0,0,0> { const static int value = 1; };\n    template <> struct static_switch<0,1,0,0,0,0,0,0,0,0,0,0,0,0,0> { const static int value = 2; };\n    template <> struct static_switch<0,0,1,0,0,0,0,0,0,0,0,0,0,0,0> { const static int value = 3; };\n    template <> struct static_switch<0,0,0,1,0,0,0,0,0,0,0,0,0,0,0> { const static int value = 4; };\n    template <> struct static_switch<0,0,0,0,1,0,0,0,0,0,0,0,0,0,0> { const static int value = 5; };\n    template <> struct static_switch<0,0,0,0,0,1,0,0,0,0,0,0,0,0,0> { const static int value = 6; };\n    template <> struct static_switch<0,0,0,0,0,0,1,0,0,0,0,0,0,0,0> { const static int value = 7; };\n    template <> struct static_switch<0,0,0,0,0,0,0,1,0,0,0,0,0,0,0> { const static int value = 8; };\n    template <> struct static_switch<0,0,0,0,0,0,0,0,1,0,0,0,0,0,0> { const static int value = 9; };\n    template <> struct static_switch<0,0,0,0,0,0,0,0,0,1,0,0,0,0,0> { const static int value = 10; };\n    template <> struct static_switch<0,0,0,0,0,0,0,0,0,0,1,0,0,0,0> { const static int value = 11; };\n    template <> struct static_switch<0,0,0,0,0,0,0,0,0,0,0,1,0,0,0> { const static int value = 12; };\n    template <> struct static_switch<0,0,0,0,0,0,0,0,0,0,0,0,1,0,0> { const static int value = 13; };\n    template <> struct static_switch<0,0,0,0,0,0,0,0,0,0,0,0,0,1,0> { const static int value = 14; };\n    template <> struct static_switch<0,0,0,0,0,0,0,0,0,0,0,0,0,0,1> { const static int value = 15; };\n\n// ----------------------------------------------------------------------------------------\n    /*!A is_built_in_scalar_type\n        \n        This is a template that allows you to determine if the given type is a built\n        in scalar type such as an int, char, float, short, etc.\n\n        For example, is_built_in_scalar_type<char>::value == true\n        For example, is_built_in_scalar_type<std::string>::value == false \n    !*/\n\n    template <typename T> struct is_built_in_scalar_type        { const static bool value = false; };\n\n    template <> struct is_built_in_scalar_type<float>           { const static bool value = true; };\n    template <> struct is_built_in_scalar_type<double>          { const static bool value = true; };\n    template <> struct is_built_in_scalar_type<long double>     { const static bool value = true; };\n    template <> struct is_built_in_scalar_type<short>           { const static bool value = true; };\n    template <> struct is_built_in_scalar_type<int>             { const static bool value = true; };\n    template <> struct is_built_in_scalar_type<long>            { const static bool value = true; };\n    template <> struct is_built_in_scalar_type<unsigned short>  { const static bool value = true; };\n    template <> struct is_built_in_scalar_type<unsigned int>    { const static bool value = true; };\n    template <> struct is_built_in_scalar_type<unsigned long>   { const static bool value = true; };\n    template <> struct is_built_in_scalar_type<uint64>          { const static bool value = true; };\n    template <> struct is_built_in_scalar_type<int64>           { const static bool value = true; };\n    template <> struct is_built_in_scalar_type<char>            { const static bool value = true; };\n    template <> struct is_built_in_scalar_type<signed char>     { const static bool value = true; };\n    template <> struct is_built_in_scalar_type<unsigned char>   { const static bool value = true; };\n    // Don't define one for wchar_t when using a version of visual studio\n    // older than 8.0 (visual studio 2005) since before then they improperly set\n    // wchar_t to be a typedef rather than its own type as required by the C++ \n    // standard.\n#if !defined(_MSC_VER) || _NATIVE_WCHAR_T_DEFINED\n    template <> struct is_built_in_scalar_type<wchar_t>         { const static bool value = true; };\n#endif\n\n// ----------------------------------------------------------------------------------------\n    \n    template <\n        typename T\n        >\n    typename enable_if<is_built_in_scalar_type<T>,bool>::type is_finite (\n        const T& value\n    )\n    /*!\n        requires\n            - value must be some kind of scalar type such as int or double\n        ensures\n            - returns true if value is a finite value (e.g. not infinity or NaN) and false\n              otherwise.\n    !*/\n    {\n        if (is_float_type<T>::value)\n            return -std::numeric_limits<T>::infinity() < value && value < std::numeric_limits<T>::infinity();\n        else\n            return true;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    /*!A promote \n        \n        This is a template that takes one of the built in scalar types and gives you another\n        scalar type that should be big enough to hold sums of values from the original scalar \n        type.  The new scalar type will also always be signed.\n\n        For example, promote<uint16>::type == int32\n    !*/\n\n    template <typename T, size_t s = sizeof(T)> struct promote;\n    template <typename T> struct promote<T,1> { typedef int32 type; };\n    template <typename T> struct promote<T,2> { typedef int32 type; };\n    template <typename T> struct promote<T,4> { typedef int64 type; };\n    template <typename T> struct promote<T,8> { typedef int64 type; };\n\n    template <> struct promote<float,sizeof(float)>             { typedef double type; };\n    template <> struct promote<double,sizeof(double)>           { typedef double type; };\n    template <> struct promote<long double,sizeof(long double)> { typedef long double type; };\n\n// ----------------------------------------------------------------------------------------\n    \n    /*!A assign_zero_if_built_in_scalar_type\n\n        This function assigns its argument the value of 0 if it is a built in scalar\n        type according to the is_built_in_scalar_type<> template.  If it isn't a\n        built in scalar type then it does nothing.\n    !*/\n\n    template <typename T> inline typename disable_if<is_built_in_scalar_type<T>,void>::type assign_zero_if_built_in_scalar_type (T&){}\n    template <typename T> inline typename enable_if<is_built_in_scalar_type<T>,void>::type assign_zero_if_built_in_scalar_type (T& a){a=0;}\n\n// ----------------------------------------------------------------------------------------\n\n    /*!A basic_type\n\n        This is a template that takes a type and strips off any const, volatile, or reference\n        qualifiers and gives you back the basic underlying type.  So for example:\n\n        basic_type<const int&>::type == int\n    !*/\n\n    template <typename T> struct basic_type { typedef T type; };\n    template <typename T> struct basic_type<const T> { typedef T type; };\n    template <typename T> struct basic_type<const T&> { typedef T type; };\n    template <typename T> struct basic_type<volatile const T&> { typedef T type; };\n    template <typename T> struct basic_type<T&> { typedef T type; };\n    template <typename T> struct basic_type<volatile T&> { typedef T type; };\n    template <typename T> struct basic_type<volatile T> { typedef T type; };\n    template <typename T> struct basic_type<volatile const T> { typedef T type; };\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    T put_in_range (\n        const T& a, \n        const T& b, \n        const T& val\n    )\n    /*!\n        requires\n            - T is a type that looks like double, float, int, or so forth\n        ensures\n            - if (val is within the range [a,b]) then\n                - returns val\n            - else \n                - returns the end of the range [a,b] that is closest to val\n    !*/\n    {\n        if (a < b)\n        {\n            if (val < a)\n                return a;\n            else if (val > b)\n                return b;\n        }\n        else\n        {\n            if (val < b)\n                return b;\n            else if (val > a)\n                return a;\n        }\n\n        return val;\n    }\n\n    // overload for double \n    inline double put_in_range(const double& a, const double& b, const double& val)\n    { return put_in_range<double>(a,b,val); }\n\n// ----------------------------------------------------------------------------------------\n\n    /*!A tabs \n\n        This is a template to compute the absolute value a number at compile time.\n\n        For example,\n            abs<-4>::value == 4\n            abs<4>::value == 4\n    !*/\n\n    template <long x, typename enabled=void>\n    struct tabs { const static long value = x; };\n    template <long x>\n    struct tabs<x,typename enable_if_c<(x < 0)>::type> { const static long value = -x; };\n\n// ----------------------------------------------------------------------------------------\n\n    /*!A tmax\n\n        This is a template to compute the max of two values at compile time\n\n        For example,\n            abs<4,7>::value == 7\n    !*/\n\n    template <long x, long y, typename enabled=void>\n    struct tmax { const static long value = x; };\n    template <long x, long y>\n    struct tmax<x,y,typename enable_if_c<(y > x)>::type> { const static long value = y; };\n\n// ----------------------------------------------------------------------------------------\n\n    /*!A tmin \n\n        This is a template to compute the min of two values at compile time\n\n        For example,\n            abs<4,7>::value == 4\n    !*/\n\n    template <long x, long y, typename enabled=void>\n    struct tmin { const static long value = x; };\n    template <long x, long y>\n    struct tmin<x,y,typename enable_if_c<(y < x)>::type> { const static long value = y; };\n\n// ----------------------------------------------------------------------------------------\n\n#define DLIB_MAKE_HAS_MEMBER_FUNCTION_TEST(testname, returnT, funct_name, args)                        \\\n    struct _two_bytes_##testname { char a[2]; };                                                       \\\n    template < typename T, returnT (T::*funct)args >                                                   \\\n    struct _helper_##testname { typedef char type; };                                                  \\\n    template <typename T>                                                                              \\\n    static char _has_##testname##_helper( typename _helper_##testname<T,&T::funct_name >::type ) { return 0;} \\\n    template <typename T>                                                                              \\\n    static _two_bytes_##testname _has_##testname##_helper(int) { return _two_bytes_##testname();}             \\\n    template <typename T> struct _##testname##workaroundbug {                                          \\\n                const static unsigned long U = sizeof(_has_##testname##_helper<T>('a')); };            \\\n    template <typename T, unsigned long U = _##testname##workaroundbug<T>::U >                         \\\n    struct testname      { static const bool value = false; };                                         \\\n    template <typename T>                                                                              \\\n    struct testname<T,1> { static const bool value = true; };\n    /*!A DLIB_MAKE_HAS_MEMBER_FUNCTION_TEST\n\n        The DLIB_MAKE_HAS_MEMBER_FUNCTION_TEST() macro is used to define traits templates\n        that tell you if a class has a certain member function.  For example, to make a\n        test to see if a class has a public method with the signature void print(int) you\n        would say:\n            DLIB_MAKE_HAS_MEMBER_FUNCTION_TEST(has_print, void, print, (int))\n\n        Then you can check if a class, T, has this method by looking at the boolean value:\n            has_print<T>::value \n        which will be true if the member function is in the T class.\n\n        Note that you can test for member functions taking no arguments by simply passing\n        in empty () like so:\n            DLIB_MAKE_HAS_MEMBER_FUNCTION_TEST(has_print, void, print, ())\n        This would test for a member of the form:\n            void print().\n\n        To test for const member functions you would use a statement such as this:\n            DLIB_MAKE_HAS_MEMBER_FUNCTION_TEST(has_print, void, print, ()const)\n        This would test for a member of the form: \n            void print() const.\n\n        To test for const templated member functions you would use a statement such as this:\n            DLIB_MAKE_HAS_MEMBER_FUNCTION_TEST(has_print, void, template print<int>, ())\n        This would test for a member of the form: \n            template <typename T> void print().\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    /*!A is_function \n        \n        This is a template that allows you to determine if the given type is a function.\n\n        For example,\n            void funct();\n\n            is_built_in_scalar_type<funct>::value == true\n            is_built_in_scalar_type<int>::value == false \n    !*/\n\n    template <typename T> struct is_function { static const bool value = false; };\n    template <typename T> \n    struct is_function<T (void)> { static const bool value = true; };\n    template <typename T, typename A0> \n    struct is_function<T (A0)> { static const bool value = true; };\n    template <typename T, typename A0, typename A1> \n    struct is_function<T (A0, A1)> { static const bool value = true; };\n    template <typename T, typename A0, typename A1, typename A2> \n    struct is_function<T (A0, A1, A2)> { static const bool value = true; };\n    template <typename T, typename A0, typename A1, typename A2, typename A3> \n    struct is_function<T (A0, A1, A2, A3)> { static const bool value = true; };\n    template <typename T, typename A0, typename A1, typename A2, typename A3, typename A4> \n    struct is_function<T (A0, A1, A2, A3, A4)> { static const bool value = true; };\n    template <typename T, typename A0, typename A1, typename A2, typename A3, typename A4,\n                          typename A5> \n    struct is_function<T (A0,A1,A2,A3,A4,A5)> { static const bool value = true; };\n    template <typename T, typename A0, typename A1, typename A2, typename A3, typename A4,\n                          typename A5, typename A6> \n    struct is_function<T (A0,A1,A2,A3,A4,A5,A6)> { static const bool value = true; };\n    template <typename T, typename A0, typename A1, typename A2, typename A3, typename A4,\n                          typename A5, typename A6, typename A7> \n    struct is_function<T (A0,A1,A2,A3,A4,A5,A6,A7)> { static const bool value = true; };\n    template <typename T, typename A0, typename A1, typename A2, typename A3, typename A4,\n                          typename A5, typename A6, typename A7, typename A8> \n    struct is_function<T (A0,A1,A2,A3,A4,A5,A6,A7,A8)> { static const bool value = true; };\n    template <typename T, typename A0, typename A1, typename A2, typename A3, typename A4,\n                          typename A5, typename A6, typename A7, typename A8, typename A9> \n    struct is_function<T (A0,A1,A2,A3,A4,A5,A6,A7,A8,A9)> { static const bool value = true; };\n\n\n    template <typename T> class funct_wrap0\n    {\n    public:\n        funct_wrap0(T (&f_)()):f(f_){}\n        T operator()() const { return f(); }\n    private:\n        T (&f)();\n    };\n    template <typename T, typename A0> class funct_wrap1\n    {\n    public:\n        funct_wrap1(T (&f_)(A0)):f(f_){}\n        T operator()(A0 a0) const { return f(a0); }\n    private:\n        T (&f)(A0);\n    };\n    template <typename T, typename A0, typename A1> class funct_wrap2\n    {\n    public:\n        funct_wrap2(T (&f_)(A0,A1)):f(f_){}\n        T operator()(A0 a0, A1 a1) const { return f(a0,a1); }\n    private:\n        T (&f)(A0,A1);\n    };\n    template <typename T, typename A0, typename A1, typename A2> class funct_wrap3\n    {\n    public:\n        funct_wrap3(T (&f_)(A0,A1,A2)):f(f_){}\n        T operator()(A0 a0, A1 a1, A2 a2) const { return f(a0,a1,a2); }\n    private:\n        T (&f)(A0,A1,A2);\n    };\n    template <typename T, typename A0, typename A1, typename A2, typename A3> class funct_wrap4\n    {\n    public:\n        funct_wrap4(T (&f_)(A0,A1,A2,A3)):f(f_){}\n        T operator()(A0 a0, A1 a1, A2 a2, A3 a3) const { return f(a0,a1,a2,a3); }\n    private:\n        T (&f)(A0,A1,A2,A3);\n    };\n    template <typename T, typename A0, typename A1, typename A2, typename A3, typename A4> class funct_wrap5\n    {\n    public:\n        funct_wrap5(T (&f_)(A0,A1,A2,A3,A4)):f(f_){}\n        T operator()(A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) const { return f(a0,a1,a2,a3,a4); }\n    private:\n        T (&f)(A0,A1,A2,A3,A4);\n    };\n\n    /*!A wrap_function \n        \n        This is a template that allows you to turn a global function into a \n        function object.  The reason for this template's existence is so you can\n        do stuff like this:\n            \n            template <typename T>\n            void call_funct(const T& funct)\n            {  cout << funct(); }\n\n            std::string test() { return \"asdfasf\"; }\n\n            int main()\n            {\n                call_funct(wrap_function(test));\n            }\n\n        The above code doesn't work right on some compilers if you don't\n        use wrap_function.  \n    !*/\n\n    template <typename T>\n    funct_wrap0<T> wrap_function(T (&f)()) { return funct_wrap0<T>(f); }\n    template <typename T, typename A0>\n    funct_wrap1<T,A0> wrap_function(T (&f)(A0)) { return funct_wrap1<T,A0>(f); }\n    template <typename T, typename A0, typename A1>\n    funct_wrap2<T,A0,A1> wrap_function(T (&f)(A0, A1)) { return funct_wrap2<T,A0,A1>(f); }\n    template <typename T, typename A0, typename A1, typename A2>\n    funct_wrap3<T,A0,A1,A2> wrap_function(T (&f)(A0, A1, A2)) { return funct_wrap3<T,A0,A1,A2>(f); }\n    template <typename T, typename A0, typename A1, typename A2, typename A3>\n    funct_wrap4<T,A0,A1,A2,A3> wrap_function(T (&f)(A0, A1, A2, A3)) { return funct_wrap4<T,A0,A1,A2,A3>(f); }\n    template <typename T, typename A0, typename A1, typename A2, typename A3, typename A4>\n    funct_wrap5<T,A0,A1,A2,A3,A4> wrap_function(T (&f)(A0, A1, A2, A3, A4)) { return funct_wrap5<T,A0,A1,A2,A3,A4>(f); }\n\n// ----------------------------------------------------------------------------------------\n\n    template <unsigned long bSIZE>\n    class stack_based_memory_block : noncopyable\n    {\n        /*!\n            WHAT THIS OBJECT REPRESENTS\n                This object is a simple container for a block of memory\n                of bSIZE bytes.  This memory block is located on the stack\n                and properly aligned to hold any kind of object.\n        !*/\n    public:\n        static const unsigned long size = bSIZE;\n\n        stack_based_memory_block(): data(mem.data) {}\n\n        void* get () { return data; }\n        /*!\n            ensures\n                - returns a pointer to the block of memory contained in this object\n        !*/\n\n        const void* get () const { return data; }\n        /*!\n            ensures\n                - returns a pointer to the block of memory contained in this object\n        !*/\n\n    private:\n\n        // You obviously can't have a block of memory that has zero bytes in it.\n        COMPILE_TIME_ASSERT(bSIZE > 0);\n        \n        union mem_block\n        {\n            // All of this garbage is to make sure this union is properly aligned \n            // (a union is always aligned such that everything in it would be properly\n            // aligned.  So the assumption here is that one of these objects has \n            // a large enough alignment requirement to satisfy any object this\n            // block of memory might be cast into).\n            void* void_ptr;\n            int integer;\n            struct {\n                void (stack_based_memory_block::*callback)();\n                stack_based_memory_block* o; \n            } stuff;\n            long double more_stuff;\n\n            uint64 var1;\n            uint32 var2;\n            double var3;\n\n            char data[size]; \n        } mem;\n\n        // The reason for having this variable is that doing it this way avoids\n        // warnings from gcc about violations of strict-aliasing rules.\n        void* const data; \n    };\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T, \n        typename F\n        >\n    auto max_scoring_element(\n        const T& container,\n        F score_func\n    ) -> decltype(std::make_pair(*container.begin(), 0.0))\n    /*!\n        requires\n            - container has .begin() and .end(), allowing it to be enumerated.\n            - score_func() is a function that takes an element of the container and returns a double.\n        ensures\n            - This function finds the element of container that has the largest score,\n              according to score_func(), and returns a std::pair containing that maximal\n              element along with the score.\n            - If the container is empty then make_pair(a default initialized object, -infinity) is returned.\n    !*/\n    {\n        double best_score = -std::numeric_limits<double>::infinity();\n        auto best_i = container.begin();\n        for (auto i = container.begin(); i != container.end(); ++i)\n        {\n            auto score = score_func(*i);\n            if (score > best_score)\n            {\n                best_score = score;\n                best_i = i;\n            }\n        }\n\n        using item_type = typename std::remove_reference<decltype(*best_i)>::type;\n\n        if (best_i == container.end())\n            return std::make_pair(item_type(), best_score);\n        else\n            return std::make_pair(*best_i, best_score);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T, \n        typename F\n        >\n    auto min_scoring_element(\n        const T& container, \n        F score_func\n    ) -> decltype(std::make_pair(*container.begin(), 0.0))\n    /*!\n        requires\n            - container has .begin() and .end(), allowing it to be enumerated.\n            - score_func() is a function that takes an element of the container and returns a double.\n        ensures\n            - This function finds the element of container that has the smallest score,\n              according to score_func(), and returns a std::pair containing that minimal\n              element along with the score.\n            - If the container is empty then make_pair(a default initialized object, infinity) is returned.\n    !*/\n    {\n        double best_score = std::numeric_limits<double>::infinity();\n        auto best_i = container.begin();\n        for (auto i = container.begin(); i != container.end(); ++i)\n        {\n            auto score = score_func(*i);\n            if (score < best_score)\n            {\n                best_score = score;\n                best_i = i;\n            }\n        }\n\n        using item_type = typename std::remove_reference<decltype(*best_i)>::type;\n\n        if (best_i == container.end())\n            return std::make_pair(item_type(), best_score);\n        else\n            return std::make_pair(*best_i, best_score);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_ALGs_\n\n"
  },
  {
    "path": "benchmarks/dlib/array/array_kernel.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_ARRAY_KERNEl_2_\n#define DLIB_ARRAY_KERNEl_2_\n\n#include \"array_kernel_abstract.h\"\n#include \"../interfaces/enumerable.h\"\n#include \"../algs.h\"\n#include \"../serialize.h\"\n#include \"../sort.h\"\n#include \"../is_kind.h\"\n\nnamespace dlib\n{\n\n    template <\n        typename T,\n        typename mem_manager = default_memory_manager \n        >\n    class array : public enumerable<T>\n    {\n\n        /*!\n            INITIAL VALUE\n                - array_size == 0    \n                - max_array_size == 0\n                - array_elements == 0\n                - pos == 0\n                - last_pos == 0\n                - _at_start == true\n\n            CONVENTION\n                - array_size == size() \n                - max_array_size == max_size() \n                - if (max_array_size > 0)\n                    - array_elements == pointer to max_array_size elements of type T\n                - else\n                    - array_elements == 0\n\n                - if (array_size > 0) \n                    - last_pos == array_elements + array_size - 1\n                - else\n                    - last_pos == 0\n\n\n                - at_start() == _at_start \n                - current_element_valid() == pos != 0\n                - if (current_element_valid()) then\n                    - *pos == element()\n        !*/\n\n    public:\n\n        // These typedefs are here for backwards compatibility with old versions of dlib.\n        typedef array kernel_1a;\n        typedef array kernel_1a_c;\n        typedef array kernel_2a;\n        typedef array kernel_2a_c;\n        typedef array sort_1a;\n        typedef array sort_1a_c;\n        typedef array sort_1b;\n        typedef array sort_1b_c;\n        typedef array sort_2a;\n        typedef array sort_2a_c;\n        typedef array sort_2b;\n        typedef array sort_2b_c;\n        typedef array expand_1a;\n        typedef array expand_1a_c;\n        typedef array expand_1b;\n        typedef array expand_1b_c;\n        typedef array expand_1c;\n        typedef array expand_1c_c;\n        typedef array expand_1d;\n        typedef array expand_1d_c;\n\n\n\n\n        typedef T type;\n        typedef T value_type;\n        typedef mem_manager mem_manager_type;\n\n        array (\n        ) :\n            array_size(0),\n            max_array_size(0),\n            array_elements(0),\n            pos(0),\n            last_pos(0),\n            _at_start(true)\n        {}\n\n        array(const array&) = delete;\n        array& operator=(array&) = delete; \n\n        array(\n            array&& item\n        ) : array()\n        {\n            swap(item);\n        }\n\n        array& operator=(\n            array&& item\n        )\n        {\n            swap(item);\n            return *this;\n        }\n\n        explicit array (\n            size_t new_size\n        ) :\n            array_size(0),\n            max_array_size(0),\n            array_elements(0),\n            pos(0),\n            last_pos(0),\n            _at_start(true)\n        {\n            resize(new_size);\n        }\n\n        ~array (\n        ); \n\n        void clear (\n        );\n\n        inline const T& operator[] (\n            size_t pos\n        ) const;\n\n        inline T& operator[] (\n            size_t pos\n        );\n\n        void set_size (\n            size_t size\n        );\n\n        inline size_t max_size(\n        ) const;\n\n        void set_max_size(\n            size_t max\n        );\n\n        void swap (\n            array& item\n        );\n\n        // functions from the enumerable interface\n        inline size_t size (\n        ) const;\n\n        inline bool at_start (\n        ) const;\n\n        inline void reset (\n        ) const;\n\n        bool current_element_valid (\n        ) const;\n\n        inline const T& element (\n        ) const;\n\n        inline T& element (\n        );\n\n        bool move_next (\n        ) const;\n\n        void sort (\n        );\n\n        void resize (\n            size_t new_size\n        );\n\n        const T& back (\n        ) const;\n\n        T& back (\n        );\n\n        void pop_back (\n        );\n\n        void pop_back (\n            T& item\n        );\n\n        void push_back (\n            T& item\n        );\n\n        void push_back (\n            T&& item\n        );\n\n        typedef T* iterator;\n        typedef const T* const_iterator;\n        iterator                begin()                         { return array_elements; }\n        const_iterator          begin() const                   { return array_elements; }\n        iterator                end()                           { return array_elements+array_size; }\n        const_iterator          end() const                     { return array_elements+array_size; }\n\n    private:\n\n        typename mem_manager::template rebind<T>::other pool;\n\n        // data members\n        size_t array_size;\n        size_t max_array_size;\n        T* array_elements;\n\n        mutable T* pos;\n        T* last_pos;\n        mutable bool _at_start;\n\n    };\n\n    template <\n        typename T,\n        typename mem_manager \n        >\n    inline void swap (\n        array<T,mem_manager>& a, \n        array<T,mem_manager>& b \n    ) { a.swap(b); }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    void serialize (\n        const array<T,mem_manager>& item,  \n        std::ostream& out\n    )\n    {\n        try\n        {\n            serialize(item.max_size(),out);\n            serialize(item.size(),out);\n\n            for (size_t i = 0; i < item.size(); ++i)\n                serialize(item[i],out);\n        }\n        catch (serialization_error& e)\n        { \n            throw serialization_error(e.info + \"\\n   while serializing object of type array\"); \n        }\n    }\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    void deserialize (\n        array<T,mem_manager>& item,  \n        std::istream& in\n    )\n    {\n        try\n        {\n            size_t max_size, size;\n            deserialize(max_size,in);\n            deserialize(size,in);\n            item.set_max_size(max_size);\n            item.set_size(size);\n            for (size_t i = 0; i < size; ++i)\n                deserialize(item[i],in);\n        }\n        catch (serialization_error& e)\n        { \n            item.clear();\n            throw serialization_error(e.info + \"\\n   while deserializing object of type array\"); \n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n// member function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    array<T,mem_manager>::\n    ~array (\n    )\n    {\n        if (array_elements)\n        {\n            pool.deallocate_array(array_elements);\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    void array<T,mem_manager>::\n    clear (\n    )\n    {\n        reset();\n        last_pos = 0;\n        array_size = 0;\n        if (array_elements)\n        {\n            pool.deallocate_array(array_elements);\n        }\n        array_elements = 0;\n        max_array_size = 0;\n\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    const T& array<T,mem_manager>::\n    operator[] (\n        size_t pos\n    ) const\n    {\n        // make sure requires clause is not broken\n        DLIB_ASSERT( pos < this->size() , \n            \"\\tconst T& array::operator[]\"\n            << \"\\n\\tpos must < size()\" \n            << \"\\n\\tpos: \" << pos \n            << \"\\n\\tsize(): \" << this->size()\n            << \"\\n\\tthis: \" << this\n            );\n\n        return array_elements[pos];\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    T& array<T,mem_manager>::\n    operator[] (\n        size_t pos\n    ) \n    {\n        // make sure requires clause is not broken\n        DLIB_ASSERT( pos < this->size() , \n            \"\\tT& array::operator[]\"\n            << \"\\n\\tpos must be < size()\" \n            << \"\\n\\tpos: \" << pos \n            << \"\\n\\tsize(): \" << this->size()\n            << \"\\n\\tthis: \" << this\n            );\n\n        return array_elements[pos];\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    void array<T,mem_manager>::\n    set_size (\n        size_t size\n    )\n    {\n        // make sure requires clause is not broken\n        DLIB_CASSERT(( size <= this->max_size() ),\n            \"\\tvoid array::set_size\"\n            << \"\\n\\tsize must be <= max_size()\"\n            << \"\\n\\tsize: \" << size \n            << \"\\n\\tmax size: \" << this->max_size()\n            << \"\\n\\tthis: \" << this\n            );\n\n        reset();\n        array_size = size;\n        if (size > 0)\n            last_pos = array_elements + size - 1;\n        else\n            last_pos = 0;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    size_t array<T,mem_manager>::\n    size (\n    ) const\n    {\n        return array_size;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    void array<T,mem_manager>::\n    set_max_size(\n        size_t max\n    )\n    {\n        reset();\n        array_size = 0;\n        last_pos = 0;\n        if (max != 0)\n        {\n            // if new max size is different\n            if (max != max_array_size)\n            {\n                if (array_elements)\n                {\n                    pool.deallocate_array(array_elements);\n                }\n                // try to get more memroy\n                try { array_elements = pool.allocate_array(max); }\n                catch (...) { array_elements = 0;  max_array_size = 0; throw; }\n                max_array_size = max;\n            }\n\n        }\n        // if the array is being made to be zero\n        else\n        {\n            if (array_elements)\n                pool.deallocate_array(array_elements);\n            max_array_size = 0;\n            array_elements = 0;\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    size_t array<T,mem_manager>::\n    max_size (\n    ) const\n    {\n        return max_array_size;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    void array<T,mem_manager>::\n    swap (\n        array<T,mem_manager>& item\n    )\n    {\n        auto             array_size_temp        = item.array_size;\n        auto             max_array_size_temp    = item.max_array_size;\n        T*               array_elements_temp    = item.array_elements;\n\n        item.array_size         = array_size;\n        item.max_array_size     = max_array_size;\n        item.array_elements     = array_elements;\n\n        array_size        = array_size_temp;\n        max_array_size    = max_array_size_temp;\n        array_elements    = array_elements_temp;\n\n        exchange(_at_start,item._at_start);\n        exchange(pos,item.pos);\n        exchange(last_pos,item.last_pos);\n        pool.swap(item.pool);\n    }\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n//           enumerable function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    bool array<T,mem_manager>::\n    at_start (\n    ) const\n    {\n        return _at_start;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    void array<T,mem_manager>::\n    reset (\n    ) const\n    {\n        _at_start = true;\n        pos = 0;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    bool array<T,mem_manager>::\n    current_element_valid (\n    ) const\n    {\n        return pos != 0;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    const T& array<T,mem_manager>::\n    element (\n    ) const\n    {\n        // make sure requires clause is not broken\n        DLIB_ASSERT(this->current_element_valid(),\n            \"\\tconst T& array::element()\"\n            << \"\\n\\tThe current element must be valid if you are to access it.\"\n            << \"\\n\\tthis: \" << this\n            );\n\n        return *pos;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    T& array<T,mem_manager>::\n    element (\n    )\n    {\n        // make sure requires clause is not broken\n        DLIB_ASSERT(this->current_element_valid(),\n            \"\\tT& array::element()\"\n            << \"\\n\\tThe current element must be valid if you are to access it.\"\n            << \"\\n\\tthis: \" << this\n            );\n\n        return *pos;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    bool array<T,mem_manager>::\n    move_next (\n    ) const\n    {\n        if (!_at_start)\n        {\n            if (pos < last_pos)\n            {\n                ++pos;\n                return true;\n            }\n            else\n            {\n                pos = 0;\n                return false;\n            }\n        }\n        else\n        {\n            _at_start = false;\n            if (array_size > 0)\n            {\n                pos = array_elements;\n                return true;\n            }\n            else\n            {\n                return false;\n            }\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n//                              Yet more functions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    void array<T,mem_manager>::\n    sort (\n    )\n    {\n        if (this->size() > 1)\n        {\n            // call the quick sort function for arrays that is in algs.h\n            dlib::qsort_array(*this,0,this->size()-1);\n        }\n        this->reset();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    void array<T,mem_manager>::\n    resize (\n        size_t new_size\n    )\n    {\n        if (this->max_size() < new_size)\n        {\n            array temp;\n            temp.set_max_size(new_size);\n            temp.set_size(new_size);\n            for (size_t i = 0; i < this->size(); ++i)\n            {\n                exchange((*this)[i],temp[i]);\n            }\n            temp.swap(*this);\n        }\n        else\n        {\n            this->set_size(new_size);\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    T& array<T,mem_manager>::\n    back (\n    ) \n    {\n        // make sure requires clause is not broken\n        DLIB_ASSERT( this->size() > 0 , \n                      \"\\tT& array::back()\"\n                      << \"\\n\\tsize() must be bigger than 0\" \n                      << \"\\n\\tsize(): \" << this->size()\n                      << \"\\n\\tthis:   \" << this\n        );\n\n        return (*this)[this->size()-1];\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    const T& array<T,mem_manager>::\n    back (\n    ) const\n    {\n        // make sure requires clause is not broken\n        DLIB_ASSERT( this->size() > 0 , \n                      \"\\tconst T& array::back()\"\n                      << \"\\n\\tsize() must be bigger than 0\" \n                      << \"\\n\\tsize(): \" << this->size()\n                      << \"\\n\\tthis:   \" << this\n        );\n\n        return (*this)[this->size()-1];\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    void array<T,mem_manager>::\n    pop_back (\n        T& item\n    ) \n    {\n        // make sure requires clause is not broken\n        DLIB_ASSERT( this->size() > 0 , \n                      \"\\tvoid array::pop_back()\"\n                      << \"\\n\\tsize() must be bigger than 0\" \n                      << \"\\n\\tsize(): \" << this->size()\n                      << \"\\n\\tthis:   \" << this\n        );\n\n        exchange(item,(*this)[this->size()-1]);\n        this->set_size(this->size()-1);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    void array<T,mem_manager>::\n    pop_back (\n    ) \n    {\n        // make sure requires clause is not broken\n        DLIB_ASSERT( this->size() > 0 , \n                      \"\\tvoid array::pop_back()\"\n                      << \"\\n\\tsize() must be bigger than 0\" \n                      << \"\\n\\tsize(): \" << this->size()\n                      << \"\\n\\tthis:   \" << this\n        );\n\n        this->set_size(this->size()-1);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    void array<T,mem_manager>::\n    push_back (\n        T& item\n    ) \n    {\n        if (this->max_size() == this->size())\n        {\n            // double the size of the array\n            array temp;\n            temp.set_max_size(this->size()*2 + 1);\n            temp.set_size(this->size()+1);\n            for (size_t i = 0; i < this->size(); ++i)\n            {\n                exchange((*this)[i],temp[i]);\n            }\n            exchange(item,temp[temp.size()-1]);\n            temp.swap(*this);\n        }\n        else\n        {\n            this->set_size(this->size()+1);\n            exchange(item,(*this)[this->size()-1]);\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    void array<T,mem_manager>::\n    push_back (\n        T&& item\n    ) { push_back(item); }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T, typename MM>\n    struct is_array <array<T,MM> >  \n    {\n        const static bool value = true;\n    };\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_ARRAY_KERNEl_2_\n\n"
  },
  {
    "path": "benchmarks/dlib/array/array_kernel_abstract.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_ARRAY_KERNEl_ABSTRACT_\n#ifdef DLIB_ARRAY_KERNEl_ABSTRACT_\n\n#include \"../interfaces/enumerable.h\"\n#include \"../serialize.h\"\n#include \"../algs.h\"\n\nnamespace dlib\n{\n\n    template <\n        typename T,\n        typename mem_manager = default_memory_manager \n        >\n    class array : public enumerable<T>\n    {\n\n        /*!\n            REQUIREMENTS ON T\n                T must have a default constructor.\n\n            REQUIREMENTS ON mem_manager\n                must be an implementation of memory_manager/memory_manager_kernel_abstract.h or\n                must be an implementation of memory_manager_global/memory_manager_global_kernel_abstract.h or\n                must be an implementation of memory_manager_stateless/memory_manager_stateless_kernel_abstract.h \n                mem_manager::type can be set to anything.\n\n            POINTERS AND REFERENCES TO INTERNAL DATA\n                front(), back(), swap(), max_size(), set_size(), and operator[] \n                functions do not invalidate pointers or references to internal data.\n                All other functions have no such guarantee.\n\n            INITIAL VALUE\n                size() == 0    \n                max_size() == 0\n\n            ENUMERATION ORDER\n                The enumerator will iterate over the elements of the array in the\n                order (*this)[0], (*this)[1], (*this)[2], ...\n\n            WHAT THIS OBJECT REPRESENTS\n                This object represents an ordered 1-dimensional array of items, \n                each item is associated with an integer value.  The items are \n                numbered from 0 though size() - 1 and the operator[] functions \n                run in constant time.  \n\n                Also note that unless specified otherwise, no member functions\n                of this object throw exceptions.\n        !*/\n        \n        public:\n\n            typedef T type;\n            typedef T value_type;\n            typedef mem_manager mem_manager_type;\n\n            array (\n            );\n            /*!\n                ensures \n                    - #*this is properly initialized\n                throws\n                    - std::bad_alloc or any exception thrown by T's constructor\n            !*/\n\n            explicit array (\n                size_t new_size\n            );\n            /*!\n                ensures \n                    - #*this is properly initialized\n                    - #size() == new_size\n                    - #max_size() == new_size\n                    - All elements of the array will have initial values for their type.\n                throws\n                    - std::bad_alloc or any exception thrown by T's constructor\n            !*/\n\n            ~array (\n            ); \n            /*!\n                ensures\n                    - all memory associated with *this has been released\n            !*/\n\n            array(\n                array&& item\n            );\n            /*!\n                ensures\n                    - move constructs *this from item.  Therefore, the state of item is\n                      moved into *this and #item has a valid but unspecified state.\n            !*/\n\n            array& operator=(\n                array&& item\n            );\n            /*!\n                ensures\n                    - move assigns *this from item.  Therefore, the state of item is\n                      moved into *this and #item has a valid but unspecified state.\n                    - returns a reference to #*this\n            !*/\n\n            void clear (\n            );\n            /*!\n                ensures\n                    - #*this has its initial value\n                throws\n                    - std::bad_alloc or any exception thrown by T's constructor\n                        if this exception is thrown then the array object is unusable \n                        until clear() is called and succeeds\n            !*/\n\n            const T& operator[] (\n                size_t pos\n            ) const;\n            /*!\n                requires\n                    - pos < size()\n                ensures\n                    - returns a const reference to the element at position pos\n            !*/\n            \n            T& operator[] (\n                size_t pos\n            );\n            /*!\n                requires\n                    - pos < size()\n                ensures\n                    - returns a non-const reference to the element at position pos\n            !*/\n\n            void set_size (\n                size_t size\n            );\n            /*!\n                requires\n                    - size <= max_size()\n                ensures\n                    - #size() == size\n                    - any element with index between 0 and size - 1 which was in the \n                      array before the call to set_size() retains its value and index.\n                      All other elements have undetermined (but valid for their type) \n                      values.  (e.g. this object might buffer old T objects and reuse \n                      them without reinitializing them between calls to set_size())\n                    - #at_start() == true\n                throws\n                    - std::bad_alloc or any exception thrown by T's constructor\n                        may throw this exception if there is not enough memory and \n                        if it does throw then the call to set_size() has no effect    \n            !*/\n\n            size_t max_size(\n            ) const;\n            /*!\n                ensures\n                    - returns the maximum size of *this\n            !*/\n\n            void set_max_size(\n                size_t max\n            );\n            /*!\n                ensures\n                    - #max_size() == max\n                    - #size() == 0\n                    - #at_start() == true\n                throws\n                    - std::bad_alloc or any exception thrown by T's constructor\n                        may throw this exception if there is not enough \n                        memory and if it does throw then max_size() == 0    \n            !*/\n\n            void swap (\n                array<T>& item\n            );\n            /*!\n                ensures\n                    - swaps *this and item\n            !*/ \n            \n            void sort (\n            );\n            /*!\n                requires\n                    - T must be a type with that is comparable via operator<\n                ensures\n                    - for all elements in #*this the ith element is <= the i+1 element\n                    - #at_start() == true\n                throws\n                    - std::bad_alloc or any exception thrown by T's constructor\n                        data may be lost if sort() throws\n            !*/\n\n            void resize (\n                size_t new_size\n            );\n            /*!\n                ensures\n                    - #size() == new_size\n                    - #max_size() == max(new_size,max_size())\n                    - for all i < size() && i < new_size:\n                        - #(*this)[i] == (*this)[i]\n                          (i.e. All the original elements of *this which were at index\n                          values less than new_size are unmodified.)\n                    - for all valid i >= size():\n                        - #(*this)[i] has an undefined value\n                          (i.e. any new elements of the array have an undefined value)\n                throws\n                    - std::bad_alloc or any exception thrown by T's constructor.\n                       If an exception is thrown then it has no effect on *this.\n            !*/\n\n            \n            const T& back (\n            ) const;\n            /*!\n                requires\n                    - size() != 0\n                ensures\n                    - returns a const reference to (*this)[size()-1]\n            !*/\n\n            T& back (\n            );\n            /*!\n                requires\n                    - size() != 0\n                ensures\n                    - returns a non-const reference to (*this)[size()-1]\n            !*/\n\n            void pop_back (\n                T& item\n            );\n            /*!\n                requires\n                    - size() != 0\n                ensures\n                    - #size() == size() - 1\n                    - swaps (*this)[size()-1] into item\n                    - All elements with an index less than size()-1 are \n                      unmodified by this operation.\n            !*/\n\n            void pop_back (\n            );\n            /*!\n                requires\n                    - size() != 0\n                ensures\n                    - #size() == size() - 1\n                    - All elements with an index less than size()-1 are \n                      unmodified by this operation.\n            !*/\n\n            void push_back (\n                T& item\n            );\n            /*!\n                ensures\n                    - #size() == size()+1\n                    - swaps item into (*this)[#size()-1] \n                    - #back() == item\n                    - #item has some undefined value (whatever happens to \n                      get swapped out of the array)\n                throws\n                    - std::bad_alloc or any exception thrown by T's constructor.\n                       If an exception is thrown then it has no effect on *this.\n            !*/\n\n            void push_back (T&& item) { push_back(item); }\n            /*!\n                enable push_back from rvalues \n            !*/\n\n            typedef T* iterator;\n            typedef const T* const_iterator;\n\n            iterator begin(\n            );\n            /*!\n                ensures\n                    - returns an iterator that points to the first element in this array or\n                      end() if the array is empty.\n            !*/\n\n            const_iterator begin(\n            ) const;\n            /*!\n                ensures\n                    - returns a const iterator that points to the first element in this\n                      array or end() if the array is empty.\n            !*/\n\n            iterator end(\n            );\n            /*!\n                ensures\n                    - returns an iterator that points to one past the end of the array.\n            !*/\n\n            const_iterator end(\n            ) const;\n            /*!\n                ensures\n                    - returns a const iterator that points to one past the end of the\n                      array.\n            !*/\n\n        private:\n\n            // restricted functions\n            array(array<T>&);        // copy constructor\n            array<T>& operator=(array<T>&);    // assignment operator        \n\n    };\n\n    template <\n        typename T\n        >\n    inline void swap (\n        array<T>& a, \n        array<T>& b \n    ) { a.swap(b); }\n    /*!\n        provides a global swap function\n    !*/\n\n    template <\n        typename T\n        >\n    void serialize (\n        const array<T>& item, \n        std::ostream& out \n    );   \n    /*!\n        provides serialization support \n    !*/\n\n    template <\n        typename T \n        >\n    void deserialize (\n        array<T>& item, \n        std::istream& in\n    );   \n    /*!\n        provides deserialization support \n    !*/\n\n}\n\n#endif // DLIB_ARRAY_KERNEl_ABSTRACT_\n\n"
  },
  {
    "path": "benchmarks/dlib/array/array_tools.h",
    "content": "// Copyright (C) 2013  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_ARRAY_tOOLS_H_\n#define DLIB_ARRAY_tOOLS_H_\n\n#include \"../assert.h\"\n#include \"array_tools_abstract.h\"\n\nnamespace dlib\n{\n    template <typename T>\n    void split_array (\n        T& a,\n        T& b,\n        double frac\n    )\n    {\n        // make sure requires clause is not broken\n        DLIB_ASSERT(0 <= frac && frac <= 1,\n            \"\\t void split_array()\"\n            << \"\\n\\t frac must be between 0 and 1.\"\n            << \"\\n\\t frac: \" << frac\n            );\n\n        const unsigned long asize = static_cast<unsigned long>(a.size()*frac);\n        const unsigned long bsize = a.size()-asize;\n\n        b.resize(bsize);\n        for (unsigned long i = 0; i < b.size(); ++i)\n        {\n            swap(b[i], a[i+asize]);\n        }\n        a.resize(asize);\n    }\n}\n\n#endif // DLIB_ARRAY_tOOLS_H_\n\n"
  },
  {
    "path": "benchmarks/dlib/array/array_tools_abstract.h",
    "content": "// Copyright (C) 2013  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_ARRAY_tOOLS_ABSTRACT_H_\n#ifdef DLIB_ARRAY_tOOLS_ABSTRACT_H_\n\n#include \"array_kernel_abstract.h\"\n\nnamespace dlib\n{\n    template <typename T>\n    void split_array (\n        T& a,\n        T& b,\n        double frac\n    );\n    /*!\n        requires\n            - 0 <= frac <= 1\n            - T must be an array type such as dlib::array or std::vector\n        ensures\n            - This function takes the elements of a and splits them into two groups.  The\n              first group remains in a and the second group is put into b.  The ordering of\n              elements in a is preserved.  In particular, concatenating #a with #b will\n              reproduce the original contents of a.\n            - The elements in a are moved around using global swap().  So they must be\n              swappable, but do not need to be copyable.\n            - #a.size() == floor(a.size()*frac)\n            - #b.size() == a.size()-#a.size()\n    !*/\n}\n\n#endif // DLIB_ARRAY_tOOLS_ABSTRACT_H_\n\n"
  },
  {
    "path": "benchmarks/dlib/array.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_ARRAy_\n#define DLIB_ARRAy_\n\n#include \"array/array_kernel.h\"\n#include \"array/array_tools.h\"\n\n#endif // DLIB_ARRAy_\n\n"
  },
  {
    "path": "benchmarks/dlib/assert.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_ASSERt_\n#define DLIB_ASSERt_\n\n#include \"config.h\"\n#include <sstream>\n#include <iosfwd>\n#include \"error.h\"\n\n// -----------------------------\n\n// Use some stuff from boost here\n//  (C) Copyright John Maddock 2001 - 2003.\n//  (C) Copyright Darin Adler 2001.\n//  (C) Copyright Peter Dimov 2001.\n//  (C) Copyright Bill Kempf 2002.\n//  (C) Copyright Jens Maurer 2002.\n//  (C) Copyright David Abrahams 2002 - 2003.\n//  (C) Copyright Gennaro Prota 2003.\n//  (C) Copyright Eric Friedman 2003.\n// License: Boost Software License   See LICENSE.txt for the full license.\n// \n#ifndef DLIB_BOOST_JOIN\n#define DLIB_BOOST_JOIN( X, Y ) DLIB_BOOST_DO_JOIN( X, Y )\n#define DLIB_BOOST_DO_JOIN( X, Y ) DLIB_BOOST_DO_JOIN2(X,Y)\n#define DLIB_BOOST_DO_JOIN2( X, Y ) X##Y\n#endif\n\n// figure out if the compiler has rvalue references. \n#if defined(__clang__) \n#   if __has_feature(cxx_rvalue_references)\n#       define DLIB_HAS_RVALUE_REFERENCES\n#   endif\n#   if __has_feature(cxx_generalized_initializers)\n#       define DLIB_HAS_INITIALIZER_LISTS\n#   endif\n#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 2)) && defined(__GXX_EXPERIMENTAL_CXX0X__) \n#   define DLIB_HAS_RVALUE_REFERENCES\n#   define DLIB_HAS_INITIALIZER_LISTS\n#elif defined(_MSC_VER) && _MSC_VER >= 1800\n#   define DLIB_HAS_INITIALIZER_LISTS\n#   define DLIB_HAS_RVALUE_REFERENCES\n#elif defined(_MSC_VER) && _MSC_VER >= 1600\n#   define DLIB_HAS_RVALUE_REFERENCES\n#elif defined(__INTEL_COMPILER) && defined(BOOST_INTEL_STDCXX0X)\n#   define DLIB_HAS_RVALUE_REFERENCES\n#   define DLIB_HAS_INITIALIZER_LISTS\n#endif\n\n#if defined(__APPLE__) && defined(__GNUC_LIBSTD__) && ((__GNUC_LIBSTD__-0) * 100 + __GNUC_LIBSTD_MINOR__-0 <= 402)\n // Apple has not updated libstdc++ in some time and anything under 4.02 does not have <initializer_list> for sure.\n#   undef DLIB_HAS_INITIALIZER_LISTS\n#endif\n\n// figure out if the compiler has static_assert. \n#if defined(__clang__) \n#   if __has_feature(cxx_static_assert)\n#       define DLIB_HAS_STATIC_ASSERT\n#   endif\n#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 2)) && defined(__GXX_EXPERIMENTAL_CXX0X__) \n#   define DLIB_HAS_STATIC_ASSERT\n#elif defined(_MSC_VER) && _MSC_VER >= 1600\n#   define DLIB_HAS_STATIC_ASSERT\n#elif defined(__INTEL_COMPILER) && defined(BOOST_INTEL_STDCXX0X)\n#   define DLIB_HAS_STATIC_ASSERT\n#endif\n\n\n// -----------------------------\n\nnamespace dlib\n{\n    template <bool value> struct compile_time_assert;\n    template <> struct compile_time_assert<true> { enum {value=1};  };\n\n    template <typename T, typename U> struct assert_are_same_type;\n    template <typename T> struct assert_are_same_type<T,T> {enum{value=1};};\n    template <typename T, typename U> struct assert_are_not_same_type {enum{value=1}; };\n    template <typename T> struct assert_are_not_same_type<T,T> {};\n\n    template <typename T, typename U> struct assert_types_match {enum{value=0};};\n    template <typename T> struct assert_types_match<T,T> {enum{value=1};};\n}\n\n\n// gcc 4.8 will warn about unused typedefs.  But we use typedefs in some of the compile\n// time assert macros so we need to make it not complain about them \"not being used\".\n#ifdef __GNUC__\n#define DLIB_NO_WARN_UNUSED __attribute__ ((unused))\n#else\n#define DLIB_NO_WARN_UNUSED \n#endif\n\n// Use the newer static_assert if it's available since it produces much more readable error\n// messages.\n#ifdef DLIB_HAS_STATIC_ASSERT\n    #define COMPILE_TIME_ASSERT(expression) static_assert(expression, \"Failed assertion\")\n    #define ASSERT_ARE_SAME_TYPE(type1, type2) static_assert(::dlib::assert_types_match<type1,type2>::value, \"These types should be the same but aren't.\")\n    #define ASSERT_ARE_NOT_SAME_TYPE(type1, type2) static_assert(!::dlib::assert_types_match<type1,type2>::value, \"These types should NOT be the same.\")\n#else\n    #define COMPILE_TIME_ASSERT(expression) \\\n        DLIB_NO_WARN_UNUSED typedef char DLIB_BOOST_JOIN(DLIB_CTA, __LINE__)[::dlib::compile_time_assert<(bool)(expression)>::value] \n\n    #define ASSERT_ARE_SAME_TYPE(type1, type2) \\\n        DLIB_NO_WARN_UNUSED typedef char DLIB_BOOST_JOIN(DLIB_AAST, __LINE__)[::dlib::assert_are_same_type<type1,type2>::value] \n\n    #define ASSERT_ARE_NOT_SAME_TYPE(type1, type2) \\\n        DLIB_NO_WARN_UNUSED typedef char DLIB_BOOST_JOIN(DLIB_AANST, __LINE__)[::dlib::assert_are_not_same_type<type1,type2>::value] \n#endif\n\n// -----------------------------\n\n#if defined DLIB_DISABLE_ASSERTS\n    // if DLIB_DISABLE_ASSERTS is on then never enable DLIB_ASSERT no matter what.\n    #undef ENABLE_ASSERTS\n#endif\n\n#if !defined(DLIB_DISABLE_ASSERTS) && ( defined DEBUG || defined _DEBUG)\n    // make sure ENABLE_ASSERTS is defined if we are indeed using them.\n    #ifndef ENABLE_ASSERTS\n        #define ENABLE_ASSERTS\n    #endif\n#endif\n\n// -----------------------------\n\n#ifdef __GNUC__\n// There is a bug in version 4.4.5 of GCC on Ubuntu which causes GCC to segfault\n// when __PRETTY_FUNCTION__ is used within certain templated functions.  So just\n// don't use it with this version of GCC.\n#  if !(__GNUC__ == 4 && __GNUC_MINOR__ == 4 && __GNUC_PATCHLEVEL__ == 5)\n#    define DLIB_FUNCTION_NAME __PRETTY_FUNCTION__\n#  else\n#    define DLIB_FUNCTION_NAME \"unknown function\" \n#  endif\n#elif defined(_MSC_VER)\n#define DLIB_FUNCTION_NAME __FUNCSIG__\n#else\n#define DLIB_FUNCTION_NAME \"unknown function\" \n#endif\n\n#define DLIBM_CASSERT(_exp,_message)                                              \\\n    {if ( !(_exp) )                                                         \\\n    {                                                                       \\\n        dlib_assert_breakpoint();                                           \\\n        std::ostringstream dlib_o_out;                                       \\\n        dlib_o_out << \"\\n\\nError detected at line \" << __LINE__ << \".\\n\";    \\\n        dlib_o_out << \"Error detected in file \" << __FILE__ << \".\\n\";      \\\n        dlib_o_out << \"Error detected in function \" << DLIB_FUNCTION_NAME << \".\\n\\n\";      \\\n        dlib_o_out << \"Failing expression was \" << #_exp << \".\\n\";           \\\n        dlib_o_out << std::boolalpha << _message << \"\\n\";                    \\\n        throw dlib::fatal_error(dlib::EBROKEN_ASSERT,dlib_o_out.str());      \\\n    }}                                                                      \n\n// This macro is not needed if you have a real C++ compiler.  It's here to work around bugs in Visual Studio's preprocessor.  \n#define DLIB_WORKAROUND_VISUAL_STUDIO_BUGS(x) x\n// Make it so the 2nd argument of DLIB_CASSERT is optional.  That is, you can call it like\n// DLIB_CASSERT(exp) or DLIB_CASSERT(exp,message).\n#define DLIBM_CASSERT_1_ARGS(exp)              DLIBM_CASSERT(exp,\"\")\n#define DLIBM_CASSERT_2_ARGS(exp,message)      DLIBM_CASSERT(exp,message)\n#define DLIBM_GET_3TH_ARG(arg1, arg2, arg3, ...) arg3\n#define DLIBM_CASSERT_CHOOSER(...) DLIB_WORKAROUND_VISUAL_STUDIO_BUGS(DLIBM_GET_3TH_ARG(__VA_ARGS__,  DLIBM_CASSERT_2_ARGS, DLIBM_CASSERT_1_ARGS, DLIB_CASSERT_NEVER_USED))\n#define DLIB_CASSERT(...) DLIB_WORKAROUND_VISUAL_STUDIO_BUGS(DLIBM_CASSERT_CHOOSER(__VA_ARGS__)(__VA_ARGS__))\n\n\n#ifdef ENABLE_ASSERTS \n    #define DLIB_ASSERT(...) DLIB_CASSERT(__VA_ARGS__)\n    #define DLIB_IF_ASSERT(exp) exp\n#else\n    #define DLIB_ASSERT(...) {}\n    #define DLIB_IF_ASSERT(exp) \n#endif\n\n// ----------------------------------------------------------------------------------------\n\n    /*!A DLIB_ASSERT_HAS_STANDARD_LAYOUT \n    \n        This macro is meant to cause a compiler error if a type doesn't have a simple\n        memory layout (like a C struct). In particular, types with simple layouts are\n        ones which can be copied via memcpy().\n        \n        \n        This was called a POD type in C++03 and in C++0x we are looking to check if \n        it is a \"standard layout type\".  Once we can use C++0x we can change this macro \n        to something that uses the std::is_standard_layout type_traits class.  \n        See: http://www2.research.att.com/~bs/C++0xFAQ.html#PODs\n    !*/\n    // Use the fact that in C++03 you can't put non-PODs into a union.\n#define DLIB_ASSERT_HAS_STANDARD_LAYOUT(type)   \\\n    union  DLIB_BOOST_JOIN(DAHSL_,__LINE__) { type TYPE_NOT_STANDARD_LAYOUT; };  \\\n    DLIB_NO_WARN_UNUSED typedef char DLIB_BOOST_JOIN(DAHSL2_,__LINE__)[sizeof(DLIB_BOOST_JOIN(DAHSL_,__LINE__))]; \n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n// breakpoints\nextern \"C\"\n{\n    inline void dlib_assert_breakpoint(\n    ) {}\n    /*!\n        ensures\n            - this function does nothing \n              It exists just so you can put breakpoints on it in a debugging tool.\n              It is called only when an DLIB_ASSERT or DLIB_CASSERT fails and is about to\n              throw an exception.\n    !*/\n}\n\n// -----------------------------\n\n#include \"stack_trace.h\"\n\n#endif // DLIB_ASSERt_\n\n"
  },
  {
    "path": "benchmarks/dlib/binary_search_tree/binary_search_tree_kernel_1.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_BINARY_SEARCH_TREE_KERNEl_1_\n#define DLIB_BINARY_SEARCH_TREE_KERNEl_1_\n\n#include \"binary_search_tree_kernel_abstract.h\"\n#include \"../algs.h\"\n#include \"../interfaces/map_pair.h\"\n#include \"../interfaces/enumerable.h\"\n#include \"../interfaces/remover.h\"\n#include \"../serialize.h\"\n#include <cstdlib>\n#include <functional>\n\nnamespace dlib \n{\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare = std::less<domain>\n        >\n    class binary_search_tree_kernel_1 : public enumerable<map_pair<domain,range> >,\n                                        public asc_pair_remover<domain,range,compare>\n    {\n\n        /*!\n            INITIAL VALUE\n                tree_size == 0\n                tree_root == 0\n                tree_height == 0\n                at_start_ == true\n                current_element == 0\n                stack == array of 50 node pointers\n                stack_pos == 0\n\n\n            CONVENTION\n                tree_size   == size()\n                tree_height == height()\n\n                stack[stack_pos-1] == pop()\n\n                current_element_valid() == (current_element != 0)\n                if (current_element_valid()) then\n                    element() == current_element->d and current_element->r\n                at_start_ == at_start()\n                if (current_element != 0 && current_element != tree_root) then\n                    stack[stack_pos-1] == the parent of the node pointed to by current_element\n\n                if (tree_size != 0)\n                    tree_root == pointer to the root node of the binary search tree\n                else\n                    tree_root == 0\n\n\n                for all nodes:\n                {\n                    left points to the left subtree or 0 if there is no left subtree and\n                    right points to the right subtree or 0 if there is no right subtree and\n                    all elements in a left subtree are <= the root and\n                    all elements in a right subtree are >= the root and\n                    d is the item in the domain of *this contained in the node\n                    r is the item in the range of *this contained in the node\n                    balance:\n                        balance == 0 if both subtrees have the same height\n                        balance == -1 if the left subtree has a height that is greater \n                                   than the height of the right subtree by 1\n                        balance == 1 if the right subtree has a height that is greater \n                                   than the height of the left subtree by 1\n                    for all trees:\n                        the height of the left and right subtrees differ by at most one\n                }\n\n        !*/\n    \n        class node\n        {\n        public:\n            node* left;\n            node* right;\n            domain d;\n            range r;\n            signed char balance;\n        };\n\n        class mpair : public map_pair<domain,range>\n        {\n        public:\n            const domain* d;\n            range* r;\n\n            const domain& key( \n            ) const { return *d; }\n\n            const range& value(\n            ) const { return *r; }\n\n            range& value(\n            ) { return *r; }\n        };\n\n   \n        public:\n\n            typedef domain domain_type;\n            typedef range range_type;\n            typedef compare compare_type;\n            typedef mem_manager mem_manager_type;\n\n            binary_search_tree_kernel_1(\n            ) :\n                tree_size(0),\n                tree_root(0),\n                current_element(0),\n                tree_height(0),\n                at_start_(true),\n                stack_pos(0),\n                stack(ppool.allocate_array(50))\n            {\n            }\n\n            virtual ~binary_search_tree_kernel_1(\n            ); \n    \n            inline void clear(\n            );\n\n            inline short height (\n            ) const;\n\n            inline unsigned long count (\n                const domain& item\n            ) const;\n\n            inline void add (\n                domain& d,\n                range& r\n            );\n\n            void remove (\n                const domain& d,\n                domain& d_copy,\n                range& r\n            );\n\n            void destroy (\n                const domain& item\n            );\n\n            inline const range* operator[] (\n                const domain& item\n            ) const;\n\n            inline range* operator[] (\n                const domain& item\n            );\n\n            inline void swap (\n                binary_search_tree_kernel_1& item\n            );\n\n            // function from the asc_pair_remover interface\n            void remove_any (\n                domain& d,\n                range& r\n            );\n\n            // functions from the enumerable interface\n            inline size_t size (\n            ) const;\n\n            bool at_start (\n            ) const;\n\n            inline void reset (\n            ) const;\n\n            bool current_element_valid (\n            ) const;\n\n            const map_pair<domain,range>& element (\n            ) const;\n\n            map_pair<domain,range>& element (\n            );\n\n            bool move_next (\n            ) const;\n\n            void remove_last_in_order (\n                domain& d,\n                range& r\n            );\n\n            void remove_current_element (\n                domain& d,\n                range& r\n            );\n\n            void position_enumerator (\n                const domain& d\n            ) const;\n\n        private:\n\n\n            inline void rotate_left (\n                node*& t\n            );\n            /*!\n                requires\n                    - t->balance == 2 \n                    - t->right->balance == 0 or 1 \n                    - t == reference to the pointer in t's parent node that points to t\n                ensures\n                    - #t is still a binary search tree \n                    - #t->balance is between 1 and -1 \n                    - #t now has a height smaller by 1 if #t->balance == 0\n            !*/\n\n            inline void rotate_right (\n                node*& t\n            );\n            /*!\n                requires\n                    - t->balance == -2 \n                    - t->left->balance == 0 or -1 \n                    - t == reference to the pointer in t's parent node that points to t\n                ensures\n                    - #t is still a binary search tree \n                    - #t->balance is between 1 and -1 \n                    - #t now has a height smaller by 1 if #t->balance == 0\n\n            !*/\n\n            inline void double_rotate_right (\n                node*& t\n            );\n            /*!\n                requires\n                    - t->balance == -2 \n                    - t->left->balance == 1 \n                    - t == reference to the pointer in t's parent node that points to t\n                ensures\n                    - #t is still a binary search tree \n                    - #t now has a balance of 0 \n                    - #t now has a height smaller by 1             \n            !*/\n\n            inline void double_rotate_left (\n                node*& t\n            );\n            /*!\n                requires\n                    - t->balance == 2 \n                    - t->right->balance == -1 \n                    - t == reference to the pointer in t's parent node that points to t\n                ensures\n                    - #t is still a binary search tree \n                    - #t now has a balance of 0 \n                    - #t now has a height smaller by 1\n            !*/\n\n            bool remove_biggest_element_in_tree (\n                node*& t,\n                domain& d,\n                range& r\n            );\n            /*!\n                requires\n                    - t != 0  (i.e. there must be something in the tree to remove) \n                    - t == reference to the pointer in t's parent node that points to t\n                ensures\n                    - the biggest node in t has been removed \n                    - the biggest node domain element in t has been put into #d \n                    - the biggest node range element in t has been put into #r\n                    - #t is still a binary search tree \n                    - returns false if the height of the tree has not changed \n                    - returns true if the height of the tree has shrunk by one\n            !*/\n\n            bool remove_least_element_in_tree (\n                node*& t,\n                domain& d,\n                range& r\n            );\n            /*!\n                requires\n                    - t != 0  (i.e. there must be something in the tree to remove) \n                    - t == reference to the pointer in t's parent node that points to t\n                ensures\n                    - the least node in t has been removed \n                    - the least node domain element in t has been put into #d \n                    - the least node range element in t has been put into #r\n                    - #t is still a binary search tree \n                    - returns false if the height of the tree has not changed \n                    - returns true if the height of the tree has shrunk by one\n            !*/\n\n            bool add_to_tree (\n                node*& t,\n                domain& d,\n                range& r\n            );\n            /*!\n                requires\n                    - t == reference to the pointer in t's parent node that points to t\n                ensures\n                    - the mapping (d --> r) has been added to #t \n                    - #d and #r have initial values for their types\n                    - #t is still a binary search tree \n                    - returns false if the height of the tree has not changed \n                    - returns true if the height of the tree has grown by one\n            !*/\n\n            bool remove_from_tree (\n                node*& t,\n                const domain& d,\n                domain& d_copy,\n                range& r\n            );\n            /*!\n                requires\n                    - return_reference(t,d) != 0\n                    - t == reference to the pointer in t's parent node that points to t\n                ensures\n                    - #d_copy is equivalent to d                                    \n                    - an element in t equivalent to d has been removed and swapped \n                      into #d_copy and its associated range object has been \n                      swapped into #r\n                    - #t is still a binary search tree                                     \n                    - returns false if the height of the tree has not changed \n                    - returns true if the height of the tree has shrunk by one\n            !*/\n\n            bool remove_from_tree (\n                node*& t,\n                const domain& item\n            );\n            /*!\n                requires\n                    - return_reference(t,item) != 0\n                    - t == reference to the pointer in t's parent node that points to t\n                ensures\n                    - an element in t equivalent to item has been removed                      \n                    - #t is still a binary search tree                                     \n                    - returns false if the height of the tree has not changed \n                    - returns true if the height of the tree has shrunk by one\n            !*/\n\n            const range* return_reference (\n                const node* t,\n                const domain& d\n            ) const;\n            /*!\n                ensures\n                    - if (there is a domain element equivalent to d in t) then\n                        - returns a pointer to the element in the range equivalent to d\n                    - else\n                        - returns 0\n            !*/\n\n            range* return_reference (\n                node* t,\n                const domain& d\n            );\n            /*!\n                ensures\n                    - if (there is a domain element equivalent to d in t) then\n                        - returns a pointer to the element in the range equivalent to d\n                    - else\n                        - returns 0\n            !*/\n\n\n            inline bool keep_node_balanced (\n                node*& t\n            );\n            /*!\n                requires\n                    - t != 0 \n                    - t == reference to the pointer in t's parent node that points to t\n                ensures\n                    - if (t->balance is < 1 or > 1) then \n                        - keep_node_balanced() will ensure that #t->balance == 0, -1, or 1\n                    - #t is still a binary search tree\n                    - returns true if it made the tree one height shorter \n                    - returns false if it didn't change the height\n            !*/\n\n\n            unsigned long get_count (\n                const domain& item,\n                node* tree_root\n            ) const;\n            /*!\n                requires\n                    - tree_root == the root of a binary search tree or 0\n                ensures\n                    - if (tree_root == 0) then\n                        - returns 0\n                    - else\n                        - returns the number of elements in tree_root that are \n                          equivalent to item\n            !*/\n\n\n            void delete_tree (\n                node* t\n            );\n            /*!\n                requires\n                    - t != 0\n                ensures\n                    - deallocates the node pointed to by t and all of t's left and right children\n            !*/\n\n\n            void push (\n                node* n\n            ) const { stack[stack_pos] = n; ++stack_pos; }\n            /*!\n                ensures\n                    - pushes n onto the stack\n            !*/\n            \n\n            node* pop (\n            ) const { --stack_pos; return stack[stack_pos]; }\n            /*!\n                ensures\n                    - pops the top of the stack and returns it\n            !*/\n\n\n\n            bool fix_stack (\n                node* t,\n                unsigned char depth = 0\n            );\n            /*!\n                requires\n                    - current_element != 0\n                    - depth == 0\n                    - t == tree_root\n                ensures\n                    - makes the stack contain the correct set of parent pointers.\n                      also adjusts stack_pos so it is correct.\n                    - #t is still a binary search tree                                     \n            !*/\n\n            bool remove_current_element_from_tree (\n                node*& t,\n                domain& d,\n                range& r,\n                unsigned long cur_stack_pos = 1\n            ); \n            /*!\n                requires\n                    - t == tree_root\n                    - cur_stack_pos == 1\n                    - current_element != 0\n                ensures\n                    - removes the data in the node given by current_element and swaps it into \n                      #d and #r.  \n                    - #t is still a binary search tree                                     \n                    - the enumerator is advances on to the next element but its stack is \n                      potentially corrupted.  so you must call fix_stack(tree_root) to fix\n                      it.\n                    - returns false if the height of the tree has not changed \n                    - returns true if the height of the tree has shrunk by one\n            !*/\n\n\n            // data members\n\n            mutable mpair p;\n            unsigned long tree_size;            \n            node* tree_root;\n            mutable node* current_element;            \n            typename mem_manager::template rebind<node>::other pool;\n            typename mem_manager::template rebind<node*>::other ppool;\n            short tree_height;\n            mutable bool at_start_;\n            mutable unsigned char stack_pos;\n            mutable node** stack;\n            compare comp; \n\n            // restricted functions\n            binary_search_tree_kernel_1(binary_search_tree_kernel_1&);        \n            binary_search_tree_kernel_1& operator=(binary_search_tree_kernel_1&); \n\n\n    };\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    inline void swap (\n        binary_search_tree_kernel_1<domain,range,mem_manager,compare>& a, \n        binary_search_tree_kernel_1<domain,range,mem_manager,compare>& b \n    ) { a.swap(b); }\n\n\n\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    void deserialize (\n        binary_search_tree_kernel_1<domain,range,mem_manager,compare>& item, \n        std::istream& in\n    )\n    {\n        try\n        {\n            item.clear();\n            unsigned long size;\n            deserialize(size,in);\n            domain d;\n            range r;\n            for (unsigned long i = 0; i < size; ++i)\n            {\n                deserialize(d,in);\n                deserialize(r,in);\n                item.add(d,r);\n            }\n        }\n        catch (serialization_error& e)\n        { \n            item.clear();\n            throw serialization_error(e.info + \"\\n   while deserializing object of type binary_search_tree_kernel_1\"); \n        }\n    }\n\n\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // member function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    ~binary_search_tree_kernel_1 (\n    )\n    {\n        ppool.deallocate_array(stack);\n        if (tree_size != 0)\n        {\n            delete_tree(tree_root);\n        }        \n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    void binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    clear (\n    )\n    {\n        if (tree_size > 0)\n        {\n            delete_tree(tree_root);\n            tree_root = 0;\n            tree_size = 0;\n            tree_height = 0;\n        }\n        // reset the enumerator\n        reset();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    size_t binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    size (\n    ) const\n    {\n        return tree_size;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    short binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    height (\n    ) const\n    {\n        return tree_height;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    unsigned long binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    count (\n        const domain& item\n    ) const\n    {\n        return get_count(item,tree_root);        \n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    void binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    add (\n        domain& d,\n        range& r\n    ) \n    {\n        tree_height += add_to_tree(tree_root,d,r);\n        ++tree_size;\n        // reset the enumerator\n        reset();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    void binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    remove (\n        const domain& d,\n        domain& d_copy,\n        range& r\n    ) \n    {\n        tree_height -= remove_from_tree(tree_root,d,d_copy,r);\n        --tree_size;\n        // reset the enumerator\n        reset();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    void binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    destroy (\n        const domain& item\n    ) \n    {\n        tree_height -= remove_from_tree(tree_root,item);\n        --tree_size;\n        // reset the enumerator\n        reset();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    void binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    remove_any (\n        domain& d,\n        range& r\n    ) \n    {\n        tree_height -= remove_least_element_in_tree(tree_root,d,r);\n        --tree_size;\n        // reset the enumerator\n        reset();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    range* binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    operator[] (\n        const domain& item\n    ) \n    {\n        return return_reference(tree_root,item);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    const range* binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    operator[] (\n        const domain& item\n    ) const\n    {\n        return return_reference(tree_root,item);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    void binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    swap (\n        binary_search_tree_kernel_1<domain,range,mem_manager,compare>& item\n    ) \n    {\n        pool.swap(item.pool);\n        ppool.swap(item.ppool);\n        exchange(p,item.p);\n        exchange(stack,item.stack);\n        exchange(stack_pos,item.stack_pos);\n        exchange(comp,item.comp);\n        \n\n        node* tree_root_temp            = item.tree_root;\n        unsigned long tree_size_temp    = item.tree_size;\n        short tree_height_temp          = item.tree_height;\n        node* current_element_temp      = item.current_element;\n        bool at_start_temp              = item.at_start_;\n\n        item.tree_root   = tree_root;\n        item.tree_size   = tree_size;\n        item.tree_height = tree_height;\n        item.current_element = current_element;\n        item.at_start_   = at_start_;\n\n        tree_root   = tree_root_temp;\n        tree_size   = tree_size_temp;\n        tree_height = tree_height_temp;\n        current_element = current_element_temp;\n        at_start_   = at_start_temp;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    void binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    remove_last_in_order (\n        domain& d,\n        range& r\n    )\n    {\n        tree_height -= remove_biggest_element_in_tree(tree_root,d,r);\n        --tree_size;\n        // reset the enumerator\n        reset();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    void binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    remove_current_element (\n        domain& d,\n        range& r\n    )\n    {\n        tree_height -= remove_current_element_from_tree(tree_root,d,r);\n        --tree_size;\n\n        // fix the enumerator stack if we need to\n        if (current_element)\n            fix_stack(tree_root);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    void binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    position_enumerator (\n        const domain& d\n    ) const\n    {\n        // clear the enumerator state and make sure the stack is empty\n        reset();\n        at_start_ = false;\n        node* t = tree_root;\n        bool went_left = false;\n        while (t != 0)\n        {\n            if ( comp(d , t->d) )\n            {\n                push(t);\n                // if item is on the left then look in left\n                t = t->left;\n                went_left = true;\n            }\n            else if (comp(t->d , d))\n            {\n                push(t);\n                // if item is on the right then look in right\n                t = t->right;\n                went_left = false;\n            }\n            else\n            {\n                current_element = t;\n                return;\n            }\n        }\n\n        // if we didn't find any matches but there might be something after the\n        // d in this tree.\n        if (stack_pos > 0)\n        {\n            current_element = pop();\n            // if we went left from this node then this node is the next\n            // biggest.\n            if (went_left)\n            {\n                return;\n            }\n            else\n            {\n                move_next();\n            }\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // enumerable function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    bool binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    at_start (\n    ) const\n    {\n        return at_start_;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    void binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    reset (\n    ) const\n    {\n        at_start_ = true;\n        current_element = 0;\n        stack_pos = 0;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    bool binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    current_element_valid (\n    ) const\n    {\n        return (current_element != 0);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    const map_pair<domain,range>& binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    element (\n    ) const\n    {\n        p.d = &(current_element->d);\n        p.r = &(current_element->r);\n        return p;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    map_pair<domain,range>& binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    element (\n    )\n    {\n        p.d = &(current_element->d);\n        p.r = &(current_element->r);\n        return p;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    bool binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    move_next (\n    ) const\n    {\n        // if we haven't started iterating yet\n        if (at_start_)\n        {\n            at_start_ = false;\n            if (tree_size == 0)\n            {\n                return false;\n            }\n            else\n            {                    \n                // find the first element in the tree\n                current_element = tree_root;\n                node* temp = current_element->left;\n                while (temp != 0)\n                {\n                    push(current_element);\n                    current_element = temp;\n                    temp = current_element->left;\n                }\n                return true;\n            }\n        }\n        else\n        {\n            if (current_element == 0)\n            {\n                return false;\n            }\n            else\n            {\n                node* temp;\n                bool went_up;  // true if we went up the tree from a child node to parent\n                bool from_left = false; // true if we went up and were coming from a left child node\n                // find the next element in the tree\n                if (current_element->right != 0)\n                {\n                    // go right and down    \n                    temp = current_element;\n                    push(current_element);\n                    current_element = temp->right;\n                    went_up = false;\n                }\n                else\n                {\n                    // go up to the parent if we can\n                    if (current_element == tree_root)\n                    {\n                        // in this case we have iterated over all the element of the tree\n                        current_element = 0;\n                        return false;\n                    }\n                    went_up = true;\n                    node* parent = pop();\n\n\n                    from_left = (parent->left == current_element);\n                    // go up to parent\n                    current_element = parent;\n                }\n\n\n                while (true)\n                {\n                    if (went_up)\n                    {\n                        if (from_left)\n                        {\n                            // in this case we have found the next node\n                            break;\n                        }\n                        else\n                        {\n                            if (current_element == tree_root)\n                            {\n                                // in this case we have iterated over all the elements\n                                // in the tree\n                                current_element = 0;\n                                return false;\n                            }\n                            // we should go up\n                            node* parent = pop();\n                            from_left = (parent->left == current_element);                            \n                            current_element = parent;\n                        }\n                    }\n                    else\n                    {\n                        // we just went down to a child node\n                        if (current_element->left != 0)\n                        {\n                            // go left\n                            went_up = false;\n                            temp = current_element;\n                            push(current_element);\n                            current_element = temp->left;\n                        }\n                        else\n                        {\n                            // if there is no left child then we have found the next node\n                            break;\n                        }\n                    }\n                }\n\n                return true;               \n            }\n        }\n\n    }\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // private member function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    void binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    delete_tree (\n        node* t\n    ) \n    {\n        if (t->left != 0)\n            delete_tree(t->left);\n        if (t->right != 0)\n            delete_tree(t->right);\n        pool.deallocate(t);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    void binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    rotate_left (\n        node*& t\n    ) \n    {\n\n        // set the new balance numbers\n        if (t->right->balance == 1)\n        {\n            t->balance = 0;\n            t->right->balance = 0;\n        }\n        else\n        {\n            t->balance = 1;\n            t->right->balance = -1;            \n        }\n\n        // perform the rotation\n        node* temp = t->right;\n        t->right = temp->left;\n        temp->left = t;\n        t = temp;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    void binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    rotate_right (\n        node*& t\n    ) \n    {\n        // set the new balance numbers\n        if (t->left->balance == -1)\n        {\n            t->balance = 0;\n            t->left->balance = 0;\n        }\n        else\n        {\n            t->balance = -1;\n            t->left->balance = 1;            \n        }\n\n        // preform the rotation\n        node* temp = t->left;\n        t->left = temp->right;\n        temp->right = t;\n        t = temp;    \n\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    void binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    double_rotate_right (\n        node*& t\n    )\n    {\n\n        node* temp = t;\n        t = t->left->right;\n        \n        temp->left->right = t->left;\n        t->left = temp->left;\n\n        temp->left = t->right;\n        t->right = temp;\n\n        if (t->balance < 0)\n        {  \n            t->left->balance = 0;\n            t->right->balance = 1;\n        }\n        else if (t->balance > 0)\n        {\n            t->left->balance = -1;\n            t->right->balance = 0;\n        }\n        else \n        {\n            t->left->balance = 0;\n            t->right->balance = 0;\n        }\n        t->balance = 0;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    void binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    double_rotate_left (\n        node*& t\n    )\n    {\n        node* temp = t;\n        t = t->right->left;\n        \n        temp->right->left = t->right;\n        t->right = temp->right;\n\n        temp->right = t->left;\n        t->left = temp;\n\n        if (t->balance < 0)\n        {  \n            t->left->balance = 0;\n            t->right->balance = 1;\n        }\n        else if (t->balance > 0)\n        {\n            t->left->balance = -1;\n            t->right->balance = 0;\n        }\n        else \n        {\n            t->left->balance = 0;\n            t->right->balance = 0;\n        }\n\n        t->balance = 0;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    bool binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    remove_biggest_element_in_tree (\n        node*& t,\n        domain& d,\n        range& r\n    ) \n    {\n        // make a reference to the current node so we don't have to dereference a \n        // pointer a bunch of times\n        node& tree = *t;\n\n        // if the right tree is an empty tree\n        if ( tree.right == 0)\n        {\n            // swap nodes domain and range elements into d and r\n            exchange(d,tree.d);\n            exchange(r,tree.r);\n\n            // plug hole left by removing this node\n            t = tree.left;\n\n            // delete the node that was just removed\n            pool.deallocate(&tree);    \n\n            // return that the height of this part of the tree has decreased\n            return true;\n        }\n        else\n        {\n\n            // keep going right\n\n            // if remove made the tree one height shorter\n            if ( remove_biggest_element_in_tree(tree.right,d,r) ) \n            {\n                // if this caused the current tree to strink then report that\n                if ( tree.balance == 1)\n                {\n                    --tree.balance;\n                    return true;\n                }\n                else\n                {\n                    --tree.balance;\n                    return keep_node_balanced(t);\n                }                \n            }\n\n            return false;            \n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    bool binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    remove_least_element_in_tree (\n        node*& t,\n        domain& d,\n        range& r\n    ) \n    {\n        // make a reference to the current node so we don't have to dereference a \n        // pointer a bunch of times\n        node& tree = *t;\n\n        // if the left tree is an empty tree\n        if ( tree.left == 0)\n        {\n            // swap nodes domain and range elements into d and r\n            exchange(d,tree.d);\n            exchange(r,tree.r);\n\n            // plug hole left by removing this node\n            t = tree.right;\n\n            // delete the node that was just removed\n            pool.deallocate(&tree);    \n\n            // return that the height of this part of the tree has decreased\n            return true;\n        }\n        else\n        {\n\n            // keep going left\n\n            // if remove made the tree one height shorter\n            if ( remove_least_element_in_tree(tree.left,d,r) ) \n            {\n                // if this caused the current tree to strink then report that\n                if ( tree.balance == -1)\n                {\n                    ++tree.balance;\n                    return true;\n                }\n                else\n                {\n                    ++tree.balance;\n                    return keep_node_balanced(t);\n                }                \n            }\n\n            return false;            \n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    bool binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    add_to_tree (\n        node*& t,\n        domain& d,\n        range& r\n    ) \n    {\n\n        // if found place to add\n        if (t == 0)\n        {\n            // create a node to add new item into\n            t = pool.allocate(); \n\n            // make a reference to the current node so we don't have to dereference a \n            // pointer a bunch of times\n            node& tree = *t;\n\n\n            // set left and right pointers to NULL to indicate that there are no \n            // left or right subtrees\n            tree.left = 0;\n            tree.right = 0;\n            tree.balance = 0;\n\n            // put d and r into t\n            exchange(tree.d,d);\n            exchange(tree.r,r);\n\n            // indicate that the height of this tree has increased\n            return true;\n        }\n        else  // keep looking for a place to add the new item\n        {\n            // make a reference to the current node so we don't have to dereference \n            // a pointer a bunch of times\n            node& tree = *t;\n            signed char old_balance = tree.balance;\n\n            // add the new item to whatever subtree it should go into\n            if (comp( d , tree.d) )\n                tree.balance -= add_to_tree(tree.left,d,r);\n            else\n                tree.balance += add_to_tree(tree.right,d,r);\n\n\n            // if the tree was balanced to start with\n            if (old_balance == 0)\n            {\n                // if its not balanced anymore then it grew in height\n                if (tree.balance != 0)\n                    return true;\n                else\n                    return false;\n            }\n            else\n            {\n                // if the tree is now balanced then it didn't grow\n                if (tree.balance == 0)\n                {\n                    return false;\n                }\n                else\n                {\n                    // if the tree needs to be balanced\n                    if (tree.balance != old_balance)\n                    {\n                        return !keep_node_balanced(t);\n                    }\n                    // if there has been no change in the heights\n                    else\n                    {\n                        return false;\n                    }\n                }\n            }\n        }\n    } \n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    bool binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    fix_stack (\n        node* t,\n        unsigned char depth \n    ) \n    {\n        // if we found the node we were looking for\n        if (t == current_element)\n        {\n            stack_pos = depth;\n            return true;\n        }\n        else if (t == 0)\n        {\n            return false;\n        }\n\n        if (!( comp(t->d , current_element->d)))\n        {\n            // go left\n            if (fix_stack(t->left,depth+1))\n            {\n                stack[depth] = t;\n                return true;\n            }            \n        }\n        if (!(comp(current_element->d , t->d)))\n        {\n            // go right\n            if (fix_stack(t->right,depth+1))\n            {\n                stack[depth] = t;\n                return true;\n            }            \n        }\n        return false;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    bool binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    remove_current_element_from_tree (\n        node*& t,\n        domain& d,\n        range& r,\n        unsigned long cur_stack_pos \n    ) \n    {\n        // make a reference to the current node so we don't have to dereference \n        // a pointer a bunch of times\n        node& tree = *t;\n\n        // if we found the node we were looking for\n        if (t == current_element)\n        {\n\n            // swap nodes domain and range elements into d_copy and r\n            exchange(d,tree.d);\n            exchange(r,tree.r);\n\n            // if there is no left node\n            if (tree.left == 0)\n            {\n                // move the enumerator on to the next element before we mess with the \n                // tree\n                move_next();\n\n                // plug hole left by removing this node and free memory\n                t = tree.right;  // plug hole with right subtree\n                \n                // delete old node\n                pool.deallocate(&tree);  \n\n                // indicate that the height has changed\n                return true;\n            }\n            // if there is no right node\n            else if (tree.right == 0)\n            {\n                // move the enumerator on to the next element before we mess with the \n                // tree\n                move_next();\n\n                // plug hole left by removing this node and free memory\n                t = tree.left;  // plug hole with left subtree\n\n                // delete old node\n                pool.deallocate(&tree);  \n\n                // indicate that the height of this tree has changed\n                return true;\n            }\n            // if there are both a left and right sub node\n            else\n            {\n\n                // in this case the next current element is going to get swapped back\n                // into this t node.\n                current_element = t;\n\n                // get an element that can replace the one being removed and do this \n                // if it made the right subtree shrink by one\n                if (remove_least_element_in_tree(tree.right,tree.d,tree.r))\n                {\n                    // adjust the tree height\n                    --tree.balance;\n\n                    // if the height of the current tree has dropped by one\n                    if (tree.balance == 0)\n                    {\n                        return true;\n                    }\n                    else\n                    {\n                        return keep_node_balanced(t);\n                    }\n                }\n                // else this remove did not effect the height of this tree\n                else\n                {\n                    return false;\n                }\n\n            }\n\n        }\n        else if (  (cur_stack_pos < stack_pos && stack[cur_stack_pos] == tree.left) || \n                    tree.left == current_element )\n        {\n            // go left\n            if (tree.balance == -1)\n            {\n                int balance = tree.balance;\n                balance += remove_current_element_from_tree(tree.left,d,r,cur_stack_pos+1);\n                tree.balance = balance;\n                return !tree.balance;\n            }\n            else\n            {\n                int balance = tree.balance;\n                balance += remove_current_element_from_tree(tree.left,d,r,cur_stack_pos+1);\n                tree.balance = balance;\n                return keep_node_balanced(t);\n            }\n        }\n        else if (  (cur_stack_pos < stack_pos && stack[cur_stack_pos] == tree.right) || \n                    tree.right == current_element )\n        {\n            // go right\n            if (tree.balance == 1)\n            {\n                int balance = tree.balance;\n                balance -= remove_current_element_from_tree(tree.right,d,r,cur_stack_pos+1);\n                tree.balance = balance;\n                return !tree.balance;\n            }\n            else\n            {\n                int balance = tree.balance;\n                balance -= remove_current_element_from_tree(tree.right,d,r,cur_stack_pos+1);\n                tree.balance = balance;\n                return keep_node_balanced(t);\n            }\n        }\n        \n        // this return should never happen but do it anyway to suppress compiler warnings\n        return false;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    bool binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    remove_from_tree (\n        node*& t,\n        const domain& d,\n        domain& d_copy,\n        range& r\n    ) \n    {\n        // make a reference to the current node so we don't have to dereference \n        // a pointer a bunch of times\n        node& tree = *t;\n\n        // if item is on the left\n        if (comp(d , tree.d))\n        {\n            // if the left side of the tree has the greatest height\n            if (tree.balance == -1)\n            {\n                int balance = tree.balance;\n                balance += remove_from_tree(tree.left,d,d_copy,r);\n                tree.balance = balance;\n                return !tree.balance;\n            }\n            else\n            {\n                int balance = tree.balance;\n                balance += remove_from_tree(tree.left,d,d_copy,r);\n                tree.balance = balance;\n                return keep_node_balanced(t);\n            }\n             \n        }\n        // if item is on the right\n        else if (comp(tree.d , d))\n        {\n\n            // if the right side of the tree has the greatest height\n            if (tree.balance == 1)\n            {\n                int balance = tree.balance;\n                balance -= remove_from_tree(tree.right,d,d_copy,r);\n                tree.balance = balance;\n                return !tree.balance;\n            }\n            else\n            {\n                int balance = tree.balance;\n                balance -= remove_from_tree(tree.right,d,d_copy,r);\n                tree.balance = balance;\n                return keep_node_balanced(t);\n            }\n        }\n        // if item is found\n        else \n        {\n\n            // swap nodes domain and range elements into d_copy and r\n            exchange(d_copy,tree.d);\n            exchange(r,tree.r);\n\n            // if there is no left node\n            if (tree.left == 0)\n            {\n\n                // plug hole left by removing this node and free memory\n                t = tree.right;  // plug hole with right subtree\n                \n                // delete old node\n                pool.deallocate(&tree);  \n\n                // indicate that the height has changed\n                return true;\n            }\n            // if there is no right node\n            else if (tree.right == 0)\n            {\n\n                // plug hole left by removing this node and free memory\n                t = tree.left;  // plug hole with left subtree\n\n                // delete old node\n                pool.deallocate(&tree);  \n\n                // indicate that the height of this tree has changed\n                return true;\n            }\n            // if there are both a left and right sub node\n            else\n            {\n\n                // get an element that can replace the one being removed and do this \n                // if it made the right subtree shrink by one\n                if (remove_least_element_in_tree(tree.right,tree.d,tree.r))\n                {\n                    // adjust the tree height\n                    --tree.balance;\n\n                    // if the height of the current tree has dropped by one\n                    if (tree.balance == 0)\n                    {\n                        return true;\n                    }\n                    else\n                    {\n                        return keep_node_balanced(t);\n                    }\n                }\n                // else this remove did not effect the height of this tree\n                else\n                {\n                    return false;\n                }\n\n            }\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    bool binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    remove_from_tree (\n        node*& t,\n        const domain& d\n    ) \n    {\n        // make a reference to the current node so we don't have to dereference \n        // a pointer a bunch of times\n        node& tree = *t;\n\n        // if item is on the left\n        if (comp(d , tree.d))\n        {\n            // if the left side of the tree has the greatest height\n            if (tree.balance == -1)\n            {\n                int balance = tree.balance;\n                balance += remove_from_tree(tree.left,d);\n                tree.balance = balance;\n                return !tree.balance;\n            }\n            else\n            {\n                int balance = tree.balance;\n                balance += remove_from_tree(tree.left,d);\n                tree.balance = balance;\n                return keep_node_balanced(t);\n            }\n             \n        }\n        // if item is on the right\n        else if (comp(tree.d , d))\n        {\n\n            // if the right side of the tree has the greatest height\n            if (tree.balance == 1)\n            {\n                int balance = tree.balance;\n                balance -= remove_from_tree(tree.right,d);\n                tree.balance = balance;\n                return !tree.balance;\n            }\n            else\n            {\n                int balance = tree.balance;\n                balance -= remove_from_tree(tree.right,d);\n                tree.balance = balance;\n                return keep_node_balanced(t);\n            }\n        }\n        // if item is found\n        else \n        {\n\n            // if there is no left node\n            if (tree.left == 0)\n            {\n\n                // plug hole left by removing this node and free memory\n                t = tree.right;  // plug hole with right subtree\n                \n                // delete old node\n                pool.deallocate(&tree);  \n\n                // indicate that the height has changed\n                return true;\n            }\n            // if there is no right node\n            else if (tree.right == 0)\n            {\n\n                // plug hole left by removing this node and free memory\n                t = tree.left;  // plug hole with left subtree\n\n                // delete old node\n                pool.deallocate(&tree);  \n\n                // indicate that the height of this tree has changed\n                return true;\n            }\n            // if there are both a left and right sub node\n            else\n            {\n\n                // get an element that can replace the one being removed and do this \n                // if it made the right subtree shrink by one\n                if (remove_least_element_in_tree(tree.right,tree.d,tree.r))\n                {\n                    // adjust the tree height\n                    --tree.balance;\n\n                    // if the height of the current tree has dropped by one\n                    if (tree.balance == 0)\n                    {\n                        return true;\n                    }\n                    else\n                    {\n                        return keep_node_balanced(t);\n                    }\n                }\n                // else this remove did not effect the height of this tree\n                else\n                {\n                    return false;\n                }\n\n            }\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    range* binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    return_reference (\n        node* t,\n        const domain& d\n    ) \n    {\n        while (t != 0)\n        {\n\n            if ( comp(d , t->d ))\n            {\n                // if item is on the left then look in left\n                t = t->left;\n            }\n            else if (comp(t->d , d))\n            {\n                // if item is on the right then look in right\n                t = t->right;\n            }\n            else\n            {\n                // if it's found then return a reference to it\n                return &(t->r);\n            }\n        }\n        return 0;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    const range* binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    return_reference (\n        const node* t,\n        const domain& d\n    ) const\n    {\n        while (t != 0)\n        {\n\n            if ( comp(d , t->d) )\n            {\n                // if item is on the left then look in left\n                t = t->left;\n            }\n            else if (comp(t->d , d))\n            {\n                // if item is on the right then look in right\n                t = t->right;\n            }\n            else\n            {\n                // if it's found then return a reference to it\n                return &(t->r);\n            }\n        }\n        return 0;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    bool binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    keep_node_balanced (\n        node*& t\n    )\n    {\n        // make a reference to the current node so we don't have to dereference \n        // a pointer a bunch of times\n        node& tree = *t;\n \n        // if tree does not need to be balanced then return false\n        if (tree.balance == 0)\n            return false;\n\n\n        // if tree needs to be rotated left\n        if (tree.balance == 2)\n        {\n            if (tree.right->balance >= 0)\n                rotate_left(t);\n            else\n                double_rotate_left(t);\n        }\n        // else if the tree needs to be rotated right\n        else if (tree.balance == -2)\n        {\n            if (tree.left->balance <= 0)\n                rotate_right(t);\n            else\n                double_rotate_right(t);\n        }\n   \n\n        if (t->balance == 0)\n            return true;\n        else\n            return false; \n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    unsigned long binary_search_tree_kernel_1<domain,range,mem_manager,compare>::\n    get_count (\n        const domain& d,\n        node* tree_root\n    ) const\n    {\n        if (tree_root != 0)\n        {\n            if (comp(d , tree_root->d))\n            {\n                // go left\n                return get_count(d,tree_root->left);                \n            }\n            else if (comp(tree_root->d , d))\n            {\n                // go right\n                return get_count(d,tree_root->right);\n            }\n            else\n            {\n                // go left and right to look for more matches\n                return   get_count(d,tree_root->left) \n                       + get_count(d,tree_root->right) \n                       + 1;\n            }\n        }\n        return 0;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_BINARY_SEARCH_TREE_KERNEl_1_\n\n"
  },
  {
    "path": "benchmarks/dlib/binary_search_tree/binary_search_tree_kernel_2.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_BINARY_SEARCH_TREE_KERNEl_2_\n#define DLIB_BINARY_SEARCH_TREE_KERNEl_2_\n\n#include \"binary_search_tree_kernel_abstract.h\"\n#include \"../algs.h\"\n#include \"../interfaces/map_pair.h\"\n#include \"../interfaces/enumerable.h\"\n#include \"../interfaces/remover.h\"\n#include \"../serialize.h\"\n#include <functional>\n\nnamespace dlib \n{\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare = std::less<domain>\n        >\n    class binary_search_tree_kernel_2 : public enumerable<map_pair<domain,range> >,\n                                        public asc_pair_remover<domain,range,compare>\n    {\n\n        /*!\n            INITIAL VALUE\n                NIL == pointer to a node that represents a leaf\n                tree_size == 0\n                tree_root == NIL     \n                at_start == true\n                current_element == 0\n\n\n            CONVENTION\n                current_element_valid() == (current_element != 0)\n                if (current_element_valid()) then\n                    element() == current_element->d and current_element->r\n                at_start_ == at_start()\n\n\n                tree_size   == size()\n\n                NIL == pointer to a node that represents a leaf\n\n                if (tree_size != 0)\n                    tree_root == pointer to the root node of the binary search tree\n                else\n                    tree_root == NIL\n\n                tree_root->color == black                    \n                Every leaf is black and all leafs are the NIL node.\n                The number of black nodes in any path from the root to a leaf is the \n                same. \n\n                for all nodes:\n                {\n                    - left points to the left subtree or NIL if there is no left subtree  \n                    - right points to the right subtree or NIL if there is no right \n                      subtree                                                             \n                    - parent points to the parent node or NIL if the node is the root     \n                    - ordering of nodes is determined by comparing each node's d member  \n                    - all elements in a left subtree are <= the node                      \n                    - all elements in a right subtree are >= the node                     \n                    - color == red or black                                               \n                    - if (color == red)                                                   \n                        - the node's children are black\n                }\n\n        !*/\n    \n        class node\n        {\n        public:            \n            node* left;\n            node* right;\n            node* parent;\n            domain d;\n            range r;\n            char color;\n        };\n\n        class mpair : public map_pair<domain,range>\n        {\n        public:\n            const domain* d;\n            range* r;\n\n            const domain& key( \n            ) const { return *d; }\n\n            const range& value(\n            ) const { return *r; }\n\n            range& value(\n            ) { return *r; }\n        };\n        \n     \n        const static char red = 0;\n        const static char black = 1;\n\n\n        public:\n\n            typedef domain domain_type;\n            typedef range range_type;\n            typedef compare compare_type;\n            typedef mem_manager mem_manager_type;\n\n            binary_search_tree_kernel_2(\n            ) :\n                NIL(pool.allocate()),\n                tree_size(0),\n                tree_root(NIL),\n                current_element(0),\n                at_start_(true)\n            {\n                NIL->color = black;\n                NIL->left = 0;\n                NIL->right = 0;\n                NIL->parent = 0;\n            }\n\n            virtual ~binary_search_tree_kernel_2(\n            ); \n    \n            inline void clear(\n            );\n\n            inline short height (\n            ) const;\n\n            inline unsigned long count (\n                const domain& d\n            ) const;\n\n            inline void add (\n                domain& d,\n                range& r\n            );\n\n            void remove (\n                const domain& d,\n                domain& d_copy,\n                range& r\n            );\n\n            void destroy (\n                const domain& d\n            );\n\n            void remove_any (\n                domain& d,\n                range& r\n            );\n\n            inline const range* operator[] (\n                const domain& item\n            ) const;\n\n            inline range* operator[] (\n                const domain& item\n            );\n\n            inline void swap (\n                binary_search_tree_kernel_2& item\n            );\n\n            // functions from the enumerable interface\n            inline size_t size (\n            ) const;\n\n            bool at_start (\n            ) const;\n\n            inline void reset (\n            ) const;\n\n            bool current_element_valid (\n            ) const;\n\n            const map_pair<domain,range>& element (\n            ) const;\n\n            map_pair<domain,range>& element (\n            );\n\n            bool move_next (\n            ) const;\n\n            void remove_last_in_order (\n                domain& d,\n                range& r\n            );\n\n            void remove_current_element (\n                domain& d,\n                range& r\n            );\n\n            void position_enumerator (\n                const domain& d\n            ) const;\n\n        private:\n\n            inline void rotate_left (\n                node* t\n            );\n            /*!\n                requires\n                    - t != NIL \n                    - t->right != NIL\n                ensures\n                    - performs a left rotation around t and its right child\n            !*/\n\n            inline void rotate_right (\n                node* t\n            );\n            /*!\n                requires\n                    - t != NIL \n                    - t->left != NIL\n                ensures\n                    - performs a right rotation around t and its left child\n            !*/\n\n            inline void double_rotate_right (\n                node* t\n            );\n            /*!\n                requires\n                    - t != NIL \n                    - t->left != NIL \n                    - t->left->right != NIL \n                    - double_rotate_right() is only called in fix_after_add()\n                ensures\n                    - performs a left rotation around t->left \n                    - then performs a right rotation around t\n            !*/\n\n            inline void double_rotate_left (\n                node* t\n            );\n            /*!\n                requires\n                    - t != NIL \n                    - t->right != NIL \n                    - t->right->left != NIL \n                    - double_rotate_left() is only called in fix_after_add()\n                ensures\n                    - performs a right rotation around t->right \n                    - then performs a left rotation around t\n            !*/\n\n            void remove_biggest_element_in_tree (\n                node* t,\n                domain& d,\n                range& r\n            );\n            /*!\n                requires\n                    - t != NIL  (i.e. there must be something in the tree to remove)\n                ensures\n                    - the biggest node in t has been removed \n                    - the biggest node element in t has been put into #d and #r \n                    - #t is still a binary search tree \n            !*/\n\n            bool remove_least_element_in_tree (\n                node* t,\n                domain& d,\n                range& r\n            );\n            /*!\n                requires\n                    - t != NIL  (i.e. there must be something in the tree to remove)\n                ensures\n                    - the least node in t has been removed \n                    - the least node element in t has been put into #d and #r \n                    - #t is still a binary search tree \n                    - if (the node that was removed was the one pointed to by current_element) then\n                        - returns true\n                    - else\n                        - returns false\n            !*/\n\n            void add_to_tree (\n                node* t,\n                domain& d,\n                range& r\n            );\n            /*!\n                requires\n                    - t != NIL\n                ensures\n                    - d and r are now in #t\n                    - there is a mapping from d to r in #t\n                    - #d and #r have initial values for their types\n                    - #t is still a binary search tree \n            !*/\n\n            void remove_from_tree (\n                node* t,\n                const domain& d,\n                domain& d_copy,\n                range& r\n            );\n            /*!\n                requires\n                    - return_reference(t,d) != 0\n                ensures\n                    - #d_copy is equivalent to d                                     \n                    - the first element in t equivalent to d that is encountered when searching down the tree\n                      from t has been removed and swapped into #d_copy.  Also, the associated range element \n                      has been removed and swapped into #r.\n                    - if (the node that got removed wasn't current_element) then\n                        - adjusts the current_element pointer if the data in the node that it points to gets moved.\n                    - else\n                        - the value of current_element is now invalid\n                    - #t is still a binary search tree \n            !*/\n\n            void remove_from_tree (\n                node* t,\n                const domain& d\n            );\n            /*!\n                requires\n                    - return_reference(t,d) != 0\n                ensures                                  \n                    - an element in t equivalent to d has been removed                \n                    - #t is still a binary search tree \n            !*/\n\n            const range* return_reference (\n                const node* t,\n                const domain& d\n            ) const;\n            /*!\n                ensures\n                    - if (there is a domain element equivalent to d in t) then\n                        - returns a pointer to the element in the range equivalent to d\n                    - else\n                        - returns 0\n            !*/\n\n            range* return_reference (\n                node* t,\n                const domain& d\n            );\n            /*!\n                ensures\n                    - if (there is a domain element equivalent to d in t) then\n                        - returns a pointer to the element in the range equivalent to d\n                    - else\n                        - returns 0\n            !*/\n\n            void fix_after_add (\n                node* t\n            );\n            /*!\n                requires\n                    - t == pointer to the node just added\n                    - t->color == red \n                    - t->parent != NIL (t must not be the root)\n                    - fix_after_add() is only called after a new node has been added\n                      to t\n                ensures\n                    - fixes any deviations from the CONVENTION caused by adding a node\n            !*/\n\n            void fix_after_remove (\n                node* t\n            );\n            /*!\n                requires\n                    - t == pointer to the only child of the node that was spliced out \n                    - fix_after_remove() is only called after a node has been removed\n                      from t\n                    - the color of the spliced out node was black\n                ensures\n                    - fixes any deviations from the CONVENTION causes by removing a node\n            !*/            \n\n\n            short tree_height (\n                node* t\n            ) const;\n            /*!\n                ensures\n                    - returns the number of nodes in the longest path from the root of the \n                      tree to a leaf\n            !*/\n\n            void delete_tree (\n                node* t\n            );\n            /*!\n                requires\n                    - t == root of binary search tree\n                    - t != NIL\n                ensures\n                    - deletes all nodes in t except for NIL\n            !*/\n\n            unsigned long get_count (\n                const domain& item,\n                node* tree_root\n            ) const;\n            /*!\n                requires\n                    - tree_root == the root of a binary search tree or NIL\n                ensures\n                    - if (tree_root == NIL) then\n                        - returns 0\n                    - else\n                        - returns the number of elements in tree_root that are \n                          equivalent to item\n            !*/\n\n\n\n            // data members\n            typename mem_manager::template rebind<node>::other pool;\n            node* NIL;\n            unsigned long tree_size;\n            node* tree_root;\n            mutable node* current_element;\n            mutable bool at_start_;\n            mutable mpair p;\n            compare comp;\n\n            \n\n            // restricted functions\n            binary_search_tree_kernel_2(binary_search_tree_kernel_2&);        \n            binary_search_tree_kernel_2& operator=(binary_search_tree_kernel_2&);\n\n\n    };\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    inline void swap (\n        binary_search_tree_kernel_2<domain,range,mem_manager,compare>& a, \n        binary_search_tree_kernel_2<domain,range,mem_manager,compare>& b \n    ) { a.swap(b); }\n\n\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >   \n    void deserialize (\n        binary_search_tree_kernel_2<domain,range,mem_manager,compare>& item, \n        std::istream& in\n    )\n    {\n        try\n        {\n            item.clear();\n            unsigned long size;\n            deserialize(size,in);\n            domain d;\n            range r;\n            for (unsigned long i = 0; i < size; ++i)\n            {\n                deserialize(d,in);\n                deserialize(r,in);\n                item.add(d,r);\n            }\n        }\n        catch (serialization_error& e)\n        { \n            item.clear();\n            throw serialization_error(e.info + \"\\n   while deserializing object of type binary_search_tree_kernel_2\"); \n        }\n    }\n\n\n\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // member function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    ~binary_search_tree_kernel_2 (\n    )\n    {     \n        if (tree_root != NIL)\n            delete_tree(tree_root);\n        pool.deallocate(NIL);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    void binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    clear (\n    )\n    {\n        if (tree_size > 0)\n        {\n            delete_tree(tree_root);\n            tree_root = NIL;\n            tree_size = 0;\n        }\n        // reset the enumerator\n        reset();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    size_t binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    size (\n    ) const\n    {\n        return tree_size;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    short binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    height (\n    ) const\n    {\n        return tree_height(tree_root);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    unsigned long binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    count (\n        const domain& item\n    ) const\n    {\n        return get_count(item,tree_root);        \n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    void binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    add (\n        domain& d,\n        range& r\n    ) \n    {\n        if (tree_size == 0)\n        {\n            tree_root = pool.allocate();\n            tree_root->color = black;\n            tree_root->left = NIL;\n            tree_root->right = NIL;\n            tree_root->parent = NIL;\n            exchange(tree_root->d,d);\n            exchange(tree_root->r,r);\n        }\n        else \n        {\n            add_to_tree(tree_root,d,r);\n        }\n        ++tree_size;\n        // reset the enumerator\n        reset();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    void binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    remove (\n        const domain& d,\n        domain& d_copy,\n        range& r\n    ) \n    {\n        remove_from_tree(tree_root,d,d_copy,r);\n        --tree_size;\n        // reset the enumerator\n        reset();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    void binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    destroy (\n        const domain& item\n    ) \n    {\n        remove_from_tree(tree_root,item);\n        --tree_size;\n        // reset the enumerator\n        reset();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    void binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    remove_any (\n        domain& d,\n        range& r\n    ) \n    {\n        remove_least_element_in_tree(tree_root,d,r);\n        --tree_size;\n        // reset the enumerator\n        reset();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    range* binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    operator[] (\n        const domain& d\n    ) \n    {\n        return return_reference(tree_root,d);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    const range* binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    operator[] (\n        const domain& d\n    ) const\n    {\n        return return_reference(tree_root,d);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    void binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    swap (\n        binary_search_tree_kernel_2<domain,range,mem_manager,compare>& item\n    ) \n    {\n        pool.swap(item.pool);\n        \n        exchange(p,item.p);\n        exchange(comp,item.comp);\n\n        node* tree_root_temp            = item.tree_root;\n        unsigned long tree_size_temp    = item.tree_size;\n        node* const NIL_temp            = item.NIL;\n        node* current_element_temp      = item.current_element;\n        bool at_start_temp              = item.at_start_;\n        \n        item.tree_root                  = tree_root;\n        item.tree_size                  = tree_size;\n        item.NIL                        = NIL;\n        item.current_element            = current_element;\n        item.at_start_                  = at_start_;\n        \n        tree_root                       = tree_root_temp;\n        tree_size                       = tree_size_temp;\n        NIL                             = NIL_temp;\n        current_element                 = current_element_temp;\n        at_start_                       = at_start_temp;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    void binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    remove_last_in_order (\n        domain& d,\n        range& r\n    )\n    {\n        remove_biggest_element_in_tree(tree_root,d,r);\n        --tree_size;\n        // reset the enumerator\n        reset();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    void binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    remove_current_element (\n        domain& d,\n        range& r\n    )\n    {\n        node* t = current_element;\n        move_next();\n        remove_from_tree(t,t->d,d,r);\n        --tree_size;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    void binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    position_enumerator (\n        const domain& d\n    ) const\n    {\n        // clear the enumerator state and make sure the stack is empty\n        reset();\n        at_start_ = false;\n        node* t = tree_root;\n        node* parent = NIL;\n        bool went_left = false;\n        while (t != NIL)\n        {\n            if ( comp(d , t->d ))\n            {\n                // if item is on the left then look in left\n                parent = t;\n                t = t->left;\n                went_left = true;\n            }\n            else if (comp(t->d , d))\n            {\n                // if item is on the right then look in right\n                parent = t;\n                t = t->right;\n                went_left = false;\n            }\n            else\n            {\n                current_element = t;\n                return;\n            }\n        }\n\n        // if we didn't find any matches but there might be something after the\n        // d in this tree.\n        if (parent != NIL)\n        {\n            current_element = parent;\n            // if we went left from this node then this node is the next\n            // biggest.\n            if (went_left)\n            {\n                return;\n            }\n            else\n            {\n                move_next();\n            }\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // enumerable function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    bool binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    at_start (\n    ) const\n    {\n        return at_start_;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    void binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    reset (\n    ) const\n    {\n        at_start_ = true;\n        current_element = 0;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    bool binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    current_element_valid (\n    ) const\n    {\n        return (current_element != 0);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    const map_pair<domain,range>& binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    element (\n    ) const\n    {\n        p.d = &(current_element->d);\n        p.r = &(current_element->r);\n        return p;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    map_pair<domain,range>& binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    element (\n    )\n    {\n        p.d = &(current_element->d);\n        p.r = &(current_element->r);\n        return p;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    bool binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    move_next (\n    ) const\n    {\n        // if we haven't started iterating yet\n        if (at_start_)\n        {\n            at_start_ = false;\n            if (tree_size == 0)\n            {\n                return false;\n            }\n            else\n            {\n                // find the first element in the tree\n                current_element = tree_root;\n                node* temp = current_element->left;\n                while (temp != NIL)\n                {\n                    current_element = temp;\n                    temp = current_element->left;\n                }\n                return true;\n            }\n        }\n        else\n        {\n            if (current_element == 0)\n            {\n                return false;\n            }\n            else\n            {\n                bool went_up;  // true if we went up the tree from a child node to parent\n                bool from_left = false; // true if we went up and were coming from a left child node\n                // find the next element in the tree\n                if (current_element->right != NIL)\n                {\n                    // go right and down                    \n                    current_element = current_element->right;\n                    went_up = false;\n                }\n                else\n                {\n                    went_up = true;\n                    node* parent = current_element->parent;\n                    if (parent == NIL)\n                    {\n                        // in this case we have iterated over all the element of the tree\n                        current_element = 0;\n                        return false;\n                    }\n\n                    from_left = (parent->left == current_element);\n                    // go up to parent\n                    current_element = parent;\n                }\n\n\n                while (true)\n                {\n                    if (went_up)\n                    {\n                        if (from_left)\n                        {\n                            // in this case we have found the next node\n                            break;\n                        }\n                        else\n                        {\n                            // we should go up\n                            node* parent = current_element->parent;\n                            from_left = (parent->left == current_element);                            \n                            current_element = parent;\n                            if (current_element == NIL)\n                            {\n                                // in this case we have iterated over all the elements\n                                // in the tree\n                                current_element = 0;\n                                return false;\n                            }\n                        }\n                    }\n                    else\n                    {\n                        // we just went down to a child node\n                        if (current_element->left != NIL)\n                        {\n                            // go left\n                            went_up = false;\n                            current_element = current_element->left;\n                        }\n                        else\n                        {\n                            // if there is no left child then we have found the next node\n                            break;\n                        }\n                    }\n                }\n\n                return true;               \n            }\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // private member function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    void binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    delete_tree (\n        node* t\n    )  \n    {\n        if (t->left != NIL)\n            delete_tree(t->left);\n        if (t->right != NIL)\n            delete_tree(t->right);\n        pool.deallocate(t);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    void binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    rotate_left (\n        node* t\n    ) \n    {\n\n        // perform the rotation\n        node* temp = t->right;\n        t->right = temp->left;\n        if (temp->left != NIL)\n            temp->left->parent = t;\n        temp->left = t;\n        temp->parent = t->parent;\n\n\n        if (t == tree_root)\n            tree_root = temp;\n        else \n        {\n            // if t was on the left\n            if (t->parent->left == t)\n                t->parent->left = temp;\n            else\n                t->parent->right = temp;\n        }\n\n        t->parent = temp;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    void binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    rotate_right (\n        node* t\n    ) \n    {\n        // perform the rotation\n        node* temp = t->left;\n        t->left = temp->right;\n        if (temp->right != NIL)\n            temp->right->parent = t;\n        temp->right = t;\n        temp->parent = t->parent;\n\n        if (t == tree_root)\n            tree_root = temp;\n        else \n        {\n            // if t is a left child\n            if (t->parent->left == t)\n                t->parent->left = temp;\n            else\n                t->parent->right = temp;\n        }\n\n        t->parent = temp;\n    }\n\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    void binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    double_rotate_right (\n        node* t\n    )\n    {\n\n        // preform the rotation\n        node& temp = *(t->left->right);\n        t->left = temp.right;\n        temp.right->parent = t;\n        temp.left->parent = temp.parent;\n        temp.parent->right = temp.left;\n        temp.parent->parent = &temp;\n        temp.right = t;\n        temp.left = temp.parent;\n        temp.parent = t->parent;  \n\n\n        if (tree_root == t)\n            tree_root = &temp;\n        else\n        {\n            // t is a left child\n            if (t->parent->left == t)\n                t->parent->left = &temp;\n            else\n                t->parent->right = &temp;\n        }\n        t->parent = &temp;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    void binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    double_rotate_left (\n        node* t\n    )\n    {\n\n\n        // preform the rotation\n        node& temp = *(t->right->left);\n        t->right = temp.left;\n        temp.left->parent = t;\n        temp.right->parent = temp.parent;\n        temp.parent->left = temp.right;\n        temp.parent->parent = &temp;\n        temp.left = t;\n        temp.right = temp.parent;\n        temp.parent = t->parent;  \n\n\n        if (tree_root == t)\n            tree_root = &temp;\n        else\n        {\n            // t is a left child\n            if (t->parent->left == t)\n                t->parent->left = &temp;\n            else\n                t->parent->right = &temp;\n        }\n        t->parent = &temp;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    void binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    remove_biggest_element_in_tree (\n        node* t,\n        domain& d,\n        range& r\n    ) \n    {\n\n        node* next = t->right;\n        node* child;  // the child node of the one we will slice out\n\n        if (next == NIL)\n        {\n            // need to determine if t is a right or left child\n            if (t->parent->right == t)\n                child = t->parent->right = t->left;\n            else\n                child = t->parent->left = t->left;\n\n            // update tree_root if necessary\n            if (t == tree_root)\n                tree_root = child;\n        }\n        else\n        {\n            // find the least node\n            do \n            {\n                t = next;\n                next = next->right;\n            } while (next != NIL);\n            // t is a right child\n            child = t->parent->right = t->left;\n\n        }\n        \n        // swap the item from this node into d and r\n        exchange(d,t->d);\n        exchange(r,t->r);\n\n        // plug hole right by removing this node\n        child->parent = t->parent;\n\n        // keep the red-black properties true\n        if (t->color == black)\n            fix_after_remove(child);\n\n        // free the memory for this removed node\n        pool.deallocate(t);        \n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    bool binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    remove_least_element_in_tree (\n        node* t,\n        domain& d,\n        range& r\n    ) \n    {\n\n        node* next = t->left;\n        node* child;  // the child node of the one we will slice out\n\n        if (next == NIL)\n        {\n            // need to determine if t is a left or right child\n            if (t->parent->left == t)\n                child = t->parent->left = t->right;\n            else\n                child = t->parent->right = t->right;\n\n            // update tree_root if necessary\n            if (t == tree_root)\n                tree_root = child;\n        }\n        else\n        {\n            // find the least node\n            do \n            {\n                t = next;\n                next = next->left;\n            } while (next != NIL);\n            // t is a left child\n            child = t->parent->left = t->right;\n\n        }\n        \n        // swap the item from this node into d and r\n        exchange(d,t->d);\n        exchange(r,t->r);\n\n        // plug hole left by removing this node\n        child->parent = t->parent;\n\n        // keep the red-black properties true\n        if (t->color == black)\n            fix_after_remove(child);\n\n        bool rvalue = (t == current_element);\n        // free the memory for this removed node\n        pool.deallocate(t);        \n        return rvalue;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    void binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    add_to_tree (\n        node* t,\n        domain& d,\n        range& r\n    ) \n    {\n        // parent of the current node\n        node* parent;\n\n        // find a place to add node\n        while (true)\n        {\n            parent = t;\n            // if item should be put on the left then go left\n            if (comp(d , t->d))\n            {\n                t = t->left;\n                if (t == NIL)\n                {\n                    t = parent->left = pool.allocate();\n                    break;\n                }\n            }\n            // if item should be put on the right then go right\n            else\n            {\n                t = t->right;\n                if (t == NIL)\n                {\n                    t = parent->right = pool.allocate();\n                    break;\n                }\n            }\n        }\n\n        // t is now the node where we will add item and\n        // parent is the parent of t\n\n        t->parent = parent;\n        t->left = NIL;\n        t->right = NIL;\n        t->color = red;\n        exchange(t->d,d);\n        exchange(t->r,r);\n\n\n        // keep the red-black properties true\n        fix_after_add(t);\n    } \n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    void binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    remove_from_tree (\n        node* t,\n        const domain& d,\n        domain& d_copy,\n        range& r\n    ) \n    {\n        while (true)\n        {\n            if ( comp(d , t->d) )\n            {\n                // if item is on the left then look in left\n                t = t->left;\n            }\n            else if (comp(t->d , d))\n            {\n                // if item is on the right then look in right\n                t = t->right;\n            }\n            else\n            {\n                // found the node we want to remove\n\n                // swap out the item into d_copy and r\n                exchange(d_copy,t->d);\n                exchange(r,t->r);\n\n                if (t->left == NIL)\n                {\n                    // if there is no left subtree\n\n                    node* parent = t->parent;\n                    \n                    // plug hole with right subtree\n\n\n                    // if t is on the left\n                    if (parent->left == t)\n                        parent->left = t->right;  \n                    else\n                        parent->right = t->right;\n                    t->right->parent = parent;\n\n                    // update tree_root if necessary\n                    if (t == tree_root)\n                        tree_root = t->right;\n\n                    if (t->color == black)\n                        fix_after_remove(t->right);\n\n                    // delete old node\n                    pool.deallocate(t);  \n                }\n                else if (t->right == NIL)\n                {\n                    // if there is no right subtree\n\n                    node* parent = t->parent;\n                    \n                    // plug hole with left subtree\n                    if (parent->left == t)\n                        parent->left = t->left;  \n                    else\n                        parent->right = t->left;\n                    t->left->parent = parent;\n\n                    // update tree_root if necessary\n                    if (t == tree_root)\n                        tree_root = t->left;\n\n                    if (t->color == black)\n                        fix_after_remove(t->left);\n\n                    // delete old node\n                    pool.deallocate(t);\n                }\n                else\n                {\n                    // if there is both a left and right subtree\n                    // get an element to fill this node now that its been swapped into \n                    // item_copy\n                    if (remove_least_element_in_tree(t->right,t->d,t->r))\n                    {\n                        // the node removed was the one pointed to by current_element so we\n                        // need to update it so that it points to the right spot.\n                        current_element = t;\n                    }\n                }\n\n                // quit loop\n                break;\n            }\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    void binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    remove_from_tree (\n        node* t,\n        const domain& d\n    ) \n    {\n        while (true)\n        {\n            if ( comp(d , t->d) )\n            {\n                // if item is on the left then look in left\n                t = t->left;\n            }\n            else if (comp(t->d , d))\n            {\n                // if item is on the right then look in right\n                t = t->right;\n            }\n            else\n            {\n                // found the node we want to remove\n\n\n                if (t->left == NIL)\n                {\n                    // if there is no left subtree\n\n                    node* parent = t->parent;\n                    \n                    // plug hole with right subtree\n\n\n                    if (parent->left == t)\n                        parent->left = t->right;  \n                    else\n                        parent->right = t->right;\n                    t->right->parent = parent;\n\n                    // update tree_root if necessary\n                    if (t == tree_root)\n                        tree_root = t->right;\n\n                    if (t->color == black)\n                        fix_after_remove(t->right);\n\n                    // delete old node\n                    pool.deallocate(t);  \n                }\n                else if (t->right == NIL)\n                {\n                    // if there is no right subtree\n\n                    node* parent = t->parent;\n                    \n                    // plug hole with left subtree\n                    if (parent->left == t)\n                        parent->left = t->left;  \n                    else\n                        parent->right = t->left;\n                    t->left->parent = parent;\n\n                    // update tree_root if necessary\n                    if (t == tree_root)\n                        tree_root = t->left;\n\n                    if (t->color == black)\n                        fix_after_remove(t->left);\n\n                    // delete old node\n                    pool.deallocate(t);\n                }\n                else\n                {\n                    // if there is both a left and right subtree\n                    // get an element to fill this node now that its been swapped into \n                    // item_copy\n                    remove_least_element_in_tree(t->right,t->d,t->r);\n\n                }\n\n                // quit loop\n                break;\n            }\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    range* binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    return_reference (\n        node* t,\n        const domain& d\n    ) \n    {\n        while (t != NIL)\n        {\n            if ( comp(d , t->d ))\n            {\n                // if item is on the left then look in left\n                t = t->left;\n            }\n            else if (comp(t->d , d))\n            {\n                // if item is on the right then look in right\n                t = t->right;\n            }\n            else\n            {\n                // if it's found then return a reference to it\n                return &(t->r);\n            }\n        }\n        return 0;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    const range* binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    return_reference (\n        const node* t,\n        const domain& d\n    ) const\n    {\n        while (t != NIL)\n        {\n            if ( comp(d , t->d) )\n            {\n                // if item is on the left then look in left\n                t = t->left;\n            }\n            else if (comp(t->d , d))\n            {\n                // if item is on the right then look in right\n                t = t->right;\n            }\n            else\n            {\n                // if it's found then return a reference to it\n                return &(t->r);\n            }\n        }\n        return 0;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    void binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    fix_after_add (\n        node* t\n    )\n    {\n\n        while (t->parent->color == red)\n        {\n            node& grandparent = *(t->parent->parent);\n\n            // if both t's parent and its sibling are red \n            if (grandparent.left->color == grandparent.right->color)\n            {\n                grandparent.color = red;\n                grandparent.left->color = black;\n                grandparent.right->color = black;\n                t = &grandparent;\n            }\n            else\n            {\n                // if t is a left child\n                if (t == t->parent->left)\n                {\n                    // if t's parent is a left child\n                    if (t->parent == grandparent.left)\n                    {\n                        grandparent.color = red;\n                        grandparent.left->color = black;\n                        rotate_right(&grandparent);\n                    }\n                    // if t's parent is a right child\n                    else\n                    {\n                        t->color = black;\n                        grandparent.color = red;\n                        double_rotate_left(&grandparent);\n                    }\n                }\n                // if t is a right child\n                else\n                {\n                    // if t's parent is a left child\n                    if (t->parent == grandparent.left)\n                    {\n                        t->color = black;\n                        grandparent.color = red;                        \n                        double_rotate_right(&grandparent);\n                    }\n                    // if t's parent is a right child\n                    else\n                    {\n                        grandparent.color = red;\n                        grandparent.right->color = black;\n                        rotate_left(&grandparent);\n                    }\n                }\n                break;\n            }\n        }\n        tree_root->color = black;\n    }       \n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    void binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    fix_after_remove (\n        node* t\n    )\n    {\n\n        while (t != tree_root && t->color == black)\n        {\n            if (t->parent->left == t)\n            {\n                node* sibling = t->parent->right;\n                if (sibling->color == red)\n                {\n                    sibling->color = black;\n                    t->parent->color = red;\n                    rotate_left(t->parent);\n                    sibling = t->parent->right;\n                }\n\n                if (sibling->left->color == black && sibling->right->color == black)\n                {\n                    sibling->color = red;\n                    t = t->parent;\n                }\n                else\n                {\n                    if (sibling->right->color == black)\n                    {\n                        sibling->left->color = black;\n                        sibling->color = red;\n                        rotate_right(sibling);\n                        sibling = t->parent->right;\n                    }\n\n                    sibling->color = t->parent->color;\n                    t->parent->color = black;\n                    sibling->right->color = black;\n                    rotate_left(t->parent);\n                    t = tree_root;\n\n                }\n\n\n            }\n            else\n            {\n\n                node* sibling = t->parent->left;\n                if (sibling->color == red)\n                {\n                    sibling->color = black;\n                    t->parent->color = red;\n                    rotate_right(t->parent);\n                    sibling = t->parent->left;\n                }\n\n                if (sibling->left->color == black && sibling->right->color == black)\n                {\n                    sibling->color = red;\n                    t = t->parent;\n                }\n                else\n                {\n                    if (sibling->left->color == black)\n                    {\n                        sibling->right->color = black;\n                        sibling->color = red;\n                        rotate_left(sibling);\n                        sibling = t->parent->left;\n                    }\n\n                    sibling->color = t->parent->color;\n                    t->parent->color = black;\n                    sibling->left->color = black;\n                    rotate_right(t->parent);\n                    t = tree_root;\n\n                }\n\n\n            }\n\n        }\n        t->color = black;\n    \n    }         \n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    short binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    tree_height (\n        node* t\n    ) const\n    {\n        if (t == NIL)\n            return 0;\n\n        short height1 = tree_height(t->left);\n        short height2 = tree_height(t->right);        \n        if (height1 > height2)\n            return height1 + 1;\n        else\n            return height2 + 1;\n    }       \n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    unsigned long binary_search_tree_kernel_2<domain,range,mem_manager,compare>::\n    get_count (\n        const domain& d,\n        node* tree_root\n    ) const\n    {\n        if (tree_root != NIL)\n        {\n            if (comp(d , tree_root->d))\n            {\n                // go left\n                return get_count(d,tree_root->left);                \n            }\n            else if (comp(tree_root->d , d))\n            {\n                // go right\n                return get_count(d,tree_root->right);\n            }\n            else\n            {\n                // go left and right to look for more matches\n                return   get_count(d,tree_root->left) \n                       + get_count(d,tree_root->right) \n                       + 1;\n            }\n        }\n        return 0;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_BINARY_SEARCH_TREE_KERNEl_2_\n\n"
  },
  {
    "path": "benchmarks/dlib/binary_search_tree/binary_search_tree_kernel_abstract.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_BINARY_SEARCH_TREE_KERNEl_ABSTRACT_\n#ifdef DLIB_BINARY_SEARCH_TREE_KERNEl_ABSTRACT_\n\n#include \"../interfaces/map_pair.h\"\n#include \"../interfaces/enumerable.h\"\n#include \"../interfaces/remover.h\"\n#include \"../serialize.h\"\n#include \"../algs.h\"\n#include <functional>\n\nnamespace dlib \n{\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager = default_memory_manager,\n        typename compare = std::less<domain>\n        >\n    class binary_search_tree : public enumerable<map_pair<domain,range> >, \n                               public asc_pair_remover<domain,range,compare>\n    {\n\n        /*!\n            REQUIREMENTS ON domain\n                domain must be comparable by compare where compare is a functor compatible with std::less and\n                domain is swappable by a global swap() and             \n                domain must have a default constructor\n\n            REQUIREMENTS ON range\n                range is swappable by a global swap() and\n                range must have a default constructor\n\n            REQUIREMENTS ON mem_manager\n                must be an implementation of memory_manager/memory_manager_kernel_abstract.h or\n                must be an implementation of memory_manager_global/memory_manager_global_kernel_abstract.h or\n                must be an implementation of memory_manager_stateless/memory_manager_stateless_kernel_abstract.h \n                mem_manager::type can be set to anything.\n\n\n            POINTERS AND REFERENCES TO INTERNAL DATA\n                swap(), count(), height(),  and operator[] functions \n                do not invalidate pointers or references to internal data.\n\n                position_enumerator() invalidates pointers or references to \n                data returned by element() and only by element() (i.e. pointers and\n                references returned by operator[] are still valid).\n\n                All other functions have no such guarantees.\n\n            INITIAL VALUE\n                size() == 0\n                height() == 0\n\n            ENUMERATION ORDER\n                The enumerator will iterate over the domain (and each associated\n                range element) elements in ascending order according to the compare functor.  \n                (i.e. the elements are enumerated in sorted order)              \n\n            WHAT THIS OBJECT REPRESENTS\n                this object represents a data dictionary that is built on top of some \n                kind of binary search tree.  It maps objects of type domain to objects\n                of type range.  \n\n                Also note that unless specified otherwise, no member functions\n                of this object throw exceptions.\n                    \n                NOTE:\n                    definition of equivalent:\n                    a is equivalent to b if\n                    a < b == false and\n                    b < a == false\n        !*/\n\n\n    public:\n\n        typedef domain domain_type;\n        typedef range range_type;\n        typedef compare compare_type;\n        typedef mem_manager mem_manager_type;\n\n        binary_search_tree(\n        );\n        /*!\n            ensures \n                - #*this is properly initialized\n            throws\n                - std::bad_alloc or any exception thrown by domain's or range's \n                  constructor.\n        !*/\n\n        virtual ~binary_search_tree(\n        ); \n        /*!\n            ensures\n                - all memory associated with *this has been released\n        !*/\n\n        void clear(\n        );\n        /*!\n            ensures\n                - #*this has its initial value\n            throws\n                - std::bad_alloc or any exception thrown by domain's or range's \n                  constructor.\n                    if this exception is thrown then *this is unusable \n                    until clear() is called and succeeds\n        !*/\n\n        short height (\n        ) const;\n        /*!\n            ensures\n                - returns the number of elements in the longest path from the root \n                  of the tree to a leaf\n        !*/\n\n        unsigned long count (\n            const domain& d\n        ) const;\n        /*!\n            ensures\n                - returns the number of elements in the domain of *this that are \n                  equivalent to d\n        !*/ \n\n        void add (\n            domain& d,\n            range& r\n        );\n        /*!\n            requires    \n                - &d != &r (i.e. d and r cannot be the same variable)\n            ensures             \n                - adds a mapping between d and r to *this\n                - if (count(d) == 0) then\n                    - #*(*this)[d] == r\n                - else\n                    - #(*this)[d] != 0\n                - #d and #r have initial values for their types\n                - #count(d) == count(d) + 1\n                - #at_start() == true\n                - #size() == size() + 1\n            throws  \n                - std::bad_alloc or any exception thrown by domain's or range's \n                  constructor.\n                    if add() throws then it has no effect\n        !*/\n\n        void remove (\n            const domain& d,\n            domain& d_copy,\n            range& r\n        );\n        /*!\n            requires\n                - (*this)[d] != 0 \n                - &d != &r (i.e. d and r cannot be the same variable) \n                - &d != &d_copy (i.e. d and d_copy cannot be the same variable) \n                - &r != &d_copy (i.e. r and d_copy cannot be the same variable) \n            ensures\n                - some element in the domain of *this that is equivalent to d has\n                  been removed and swapped into #d_copy.  Additionally, its \n                  associated range element has been removed and swapped into #r.\n                - #count(d) == count(d) - 1\n                - #size() == size() - 1\n                - #at_start() == true  \n        !*/\n\n        void destroy (\n            const domain& d\n        );\n        /*!\n            requires\n                - (*this)[d] != 0 \n            ensures\n                - an element in the domain of *this equivalent to d has been removed.  \n                  The element in the range of *this associated with d has also been \n                  removed.\n                - #count(d) == count(d) - 1\n                - #size() == size() - 1\n                - #at_start() == true  \n        !*/\n\n        void remove_last_in_order (\n            domain& d,\n            range& r\n        );\n        /*!\n            requires\n                - size() > 0\n            ensures\n                - the last/biggest (according to the compare functor) element in the domain of *this has\n                  been removed and swapped into #d.  The element in the range of *this\n                  associated with #d has also been removed and swapped into #r.\n                - #count(#d) == count(#d) - 1\n                - #size() == size() - 1\n                - #at_start() == true\n        !*/\n\n        void remove_current_element (\n            domain& d,\n            range& r\n        );\n        /*!\n            requires\n                - current_element_valid() == true\n            ensures\n                - the current element given by element() has been removed and swapped into d and r.\n                - #d == element().key()\n                - #r == element().value()\n                - #count(#d) == count(#d) - 1\n                - #size() == size() - 1\n                - moves the enumerator to the next element.  If element() was the last \n                  element in enumeration order then #current_element_valid() == false \n                  and #at_start() == false.\n        !*/\n\n        void position_enumerator (\n            const domain& d\n        ) const;\n        /*!\n            ensures\n                - #at_start() == false\n                - if (count(d) > 0) then\n                    - #element().key() == d\n                - else if (there are any items in the domain of *this that are bigger than \n                  d according to the compare functor) then\n                    - #element().key() == the smallest item in the domain of *this that is\n                      bigger than d according to the compare functor.\n                - else\n                    - #current_element_valid() == false\n        !*/\n\n        const range* operator[] (\n            const domain& d\n        ) const;\n        /*!\n            ensures\n                - if (there is an element in the domain equivalent to d) then\n                    - returns a pointer to an element in the range of *this that\n                      is associated with an element in the domain of *this \n                      equivalent to d.\n                - else\n                    - returns 0\n        !*/\n\n        range* operator[] (\n            const domain& d\n        );\n        /*!\n            ensures\n                - if (there is an element in the domain equivalent to d) then\n                    - returns a pointer to an element in the range of *this that\n                      is associated with an element in the domain of *this \n                      equivalent to d.\n                - else\n                    - returns 0\n        !*/\n\n        void swap (\n            binary_search_tree& item\n        );\n        /*!\n            ensures\n                - swaps *this and item\n        !*/ \n\n    private:\n\n        // restricted functions\n        binary_search_tree(binary_search_tree&);      \n        binary_search_tree& operator=(binary_search_tree&);\n\n    };\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    inline void swap (\n        binary_search_tree<domain,range,mem_manager,compare>& a, \n        binary_search_tree<domain,range,mem_manager,compare>& b \n    ) { a.swap(b); }\n    /*!\n        provides a global swap function\n    !*/\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    void deserialize (\n        binary_search_tree<domain,range,mem_manager,compare>& item, \n        std::istream& in\n    );   \n    /*!\n        provides deserialization support \n    !*/\n}\n\n#endif // DLIB_BINARY_SEARCH_TREE_KERNEl_ABSTRACT_\n\n"
  },
  {
    "path": "benchmarks/dlib/binary_search_tree/binary_search_tree_kernel_c.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_BINARY_SEARCH_TREE_KERNEl_C_\n#define DLIB_BINARY_SEARCH_TREE_KERNEl_C_\n\n#include \"../interfaces/map_pair.h\"\n#include \"binary_search_tree_kernel_abstract.h\"\n#include \"../algs.h\"\n#include \"../assert.h\"\n\nnamespace dlib \n{\n\n    template <\n        typename bst_base\n        >\n    class binary_search_tree_kernel_c : public bst_base\n    {\n        typedef typename bst_base::domain_type domain;\n        typedef typename bst_base::range_type range;\n\n        public:\n\n            binary_search_tree_kernel_c () {}\n\n            void remove (\n                const domain& d,\n                domain& d_copy,\n                range& r\n            );\n\n            void destroy (\n                const domain& d\n            );\n\n            void add (\n                domain& d,\n                range& r\n            );\n\n            void remove_any (\n                domain& d,\n                range& r\n            );\n\n            const map_pair<domain, range>& element(\n            ) const\n            {\n                DLIB_CASSERT(this->current_element_valid() == true,\n                    \"\\tconst map_pair<domain,range>& binary_search_tree::element() const\"\n                    << \"\\n\\tyou can't access the current element if it doesn't exist\"\n                    << \"\\n\\tthis: \" << this\n                );\n\n                return bst_base::element();\n            }\n\n            map_pair<domain, range>& element(\n            )\n            {\n                DLIB_CASSERT(this->current_element_valid() == true,\n                    \"\\tmap_pair<domain,range>& binary_search_tree::element()\"\n                    << \"\\n\\tyou can't access the current element if it doesn't exist\"\n                    << \"\\n\\tthis: \" << this\n                );\n\n                return bst_base::element();\n            }\n\n            void remove_last_in_order (\n                domain& d,\n                range& r\n            );\n\n            void remove_current_element (\n                domain& d,\n                range& r\n            );\n\n\n    };\n\n\n    template <\n        typename bst_base\n        >\n    inline void swap (\n        binary_search_tree_kernel_c<bst_base>& a, \n        binary_search_tree_kernel_c<bst_base>& b \n    ) { a.swap(b); }\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // member function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename bst_base\n        >\n    void binary_search_tree_kernel_c<bst_base>::\n    add (\n        domain& d,\n        range& r\n    )\n    {\n        DLIB_CASSERT( static_cast<const void*>(&d) != static_cast<void*>(&r),\n            \"\\tvoid binary_search_tree::add\"\n            << \"\\n\\tyou can't call add() and give the same object to both parameters.\"\n            << \"\\n\\tthis:       \" << this\n            << \"\\n\\t&d:         \" << &d\n            << \"\\n\\t&r:         \" << &r\n            << \"\\n\\tsize():     \" << this->size()\n            );\n\n        bst_base::add(d,r);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename bst_base\n        >\n    void binary_search_tree_kernel_c<bst_base>::\n    destroy (\n        const domain& d\n    )\n    {\n        DLIB_CASSERT(this->operator[](d) != 0,\n            \"\\tvoid binary_search_tree::destroy\"\n            << \"\\n\\tthe element must be in the tree for it to be removed\"\n            << \"\\n\\tthis:    \" << this\n            << \"\\n\\t&d:      \" << &d \n            );\n\n        bst_base::destroy(d);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename bst_base\n        >\n    void binary_search_tree_kernel_c<bst_base>::\n    remove (\n        const domain& d,\n        domain& d_copy,\n        range& r\n    )\n    {\n        DLIB_CASSERT(this->operator[](d) != 0 &&\n                (static_cast<const void*>(&d) != static_cast<void*>(&d_copy)) &&\n                (static_cast<const void*>(&d) != static_cast<void*>(&r)) &&\n                (static_cast<const void*>(&r) != static_cast<void*>(&d_copy)),\n            \"\\tvoid binary_search_tree::remove\"\n            << \"\\n\\tthe element must be in the tree for it to be removed\"\n            << \"\\n\\tthis:       \" << this\n            << \"\\n\\t&d:         \" << &d \n            << \"\\n\\t&d_copy:    \" << &d_copy\n            << \"\\n\\t&r:         \" << &r\n            );\n\n        bst_base::remove(d,d_copy,r);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename bst_base\n        >\n    void binary_search_tree_kernel_c<bst_base>::\n    remove_any(\n        domain& d,\n        range& r\n    )\n    {\n        DLIB_CASSERT(this->size() != 0 && \n            (static_cast<const void*>(&d) != static_cast<void*>(&r)),\n            \"\\tvoid binary_search_tree::remove_any\"\n            << \"\\n\\ttree must not be empty if something is going to be removed\"\n            << \"\\n\\tthis: \" << this\n            << \"\\n\\t&d:   \" << &d\n            << \"\\n\\t&r:   \" << &r\n            );\n\n        bst_base::remove_any(d,r);\n    }\n \n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename bst_base\n        >\n    void binary_search_tree_kernel_c<bst_base>::\n    remove_last_in_order (\n        domain& d,\n        range& r\n    )\n    {\n        DLIB_CASSERT(this->size() > 0, \n            \"\\tvoid binary_search_tree::remove_last_in_order()\"\n            << \"\\n\\tyou can't remove an element if it doesn't exist\"\n            << \"\\n\\tthis: \" << this\n            );\n\n        bst_base::remove_last_in_order(d,r);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename bst_base\n        >\n    void binary_search_tree_kernel_c<bst_base>::\n    remove_current_element (\n        domain& d,\n        range& r\n    ) \n    {\n        DLIB_CASSERT(this->current_element_valid() == true,\n            \"\\tvoid binary_search_tree::remove_current_element()\"\n            << \"\\n\\tyou can't remove the current element if it doesn't exist\"\n            << \"\\n\\tthis: \" << this\n            );\n\n        bst_base::remove_current_element(d,r);\n    }\n\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_BINARY_SEARCH_TREE_KERNEl_C_\n\n"
  },
  {
    "path": "benchmarks/dlib/binary_search_tree.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_BINARY_SEARCH_TREe_\n#define DLIB_BINARY_SEARCH_TREe_\n\n\n#include \"binary_search_tree/binary_search_tree_kernel_1.h\"\n#include \"binary_search_tree/binary_search_tree_kernel_2.h\"\n#include \"binary_search_tree/binary_search_tree_kernel_c.h\"\n\n\n#include \"algs.h\"\n#include <functional>\n\n\nnamespace dlib\n{\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager = default_memory_manager,\n        typename compare = std::less<domain>\n        >\n    class binary_search_tree\n    {\n        binary_search_tree() {}\n\n    public:\n        \n        //----------- kernels ---------------\n\n        // kernel_1a        \n        typedef     binary_search_tree_kernel_1<domain,range,mem_manager,compare>    \n                    kernel_1a;\n        typedef     binary_search_tree_kernel_c<kernel_1a>\n                    kernel_1a_c;\n\n\n        // kernel_2a        \n        typedef     binary_search_tree_kernel_2<domain,range,mem_manager,compare>    \n                    kernel_2a;\n        typedef     binary_search_tree_kernel_c<kernel_2a>\n                    kernel_2a_c;\n\n    };\n}\n\n#endif // DLIB_BINARY_SEARCH_TREe_\n\n"
  },
  {
    "path": "benchmarks/dlib/bound_function_pointer/bound_function_pointer_kernel_1.h",
    "content": "// Copyright (C) 2008  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_BOUND_FUNCTION_POINTER_KERNEl_1_\n#define DLIB_BOUND_FUNCTION_POINTER_KERNEl_1_\n\n#include \"../algs.h\"\n#include \"../member_function_pointer.h\"\n#include \"bound_function_pointer_kernel_abstract.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    namespace bfp1_helpers\n    {\n        template <typename T> struct strip { typedef T type; };\n        template <typename T> struct strip<T&> { typedef T type; };\n\n    // ------------------------------------------------------------------------------------\n\n        class bound_function_helper_base_base\n        {\n        public:\n            virtual ~bound_function_helper_base_base(){}\n            virtual void call() const = 0;\n            virtual bool is_set() const = 0;\n            virtual void clone(void* ptr) const = 0;\n        };\n\n    // ------------------------------------------------------------------------------------\n\n        template <typename T1, typename T2, typename T3, typename T4>\n        class bound_function_helper_base : public bound_function_helper_base_base\n        {\n        public:\n            bound_function_helper_base():arg1(0), arg2(0), arg3(0), arg4(0) {}\n\n            typename strip<T1>::type* arg1;\n            typename strip<T2>::type* arg2;\n            typename strip<T3>::type* arg3;\n            typename strip<T4>::type* arg4;\n\n\n            member_function_pointer<T1,T2,T3,T4> mfp;\n        };\n\n    // ----------------\n\n        template <typename F, typename T1 = void, typename T2 = void, typename T3 = void, typename T4 = void>\n        class bound_function_helper : public bound_function_helper_base<T1,T2,T3,T4>\n        {\n        public:\n            void call() const\n            {\n                (*fp)(*this->arg1, *this->arg2, *this->arg3, *this->arg4);\n            }\n\n            typename strip<F>::type* fp;\n        };\n\n        template <typename T1, typename T2, typename T3, typename T4>\n        class bound_function_helper<void,T1,T2,T3,T4> : public bound_function_helper_base<T1,T2,T3,T4>\n        {\n        public:\n            void call() const\n            {\n                if (this->mfp)    this->mfp(*this->arg1, *this->arg2, *this->arg3, *this->arg4);\n                else if (fp) fp(*this->arg1, *this->arg2, *this->arg3, *this->arg4);\n            }\n\n            void (*fp)(T1, T2, T3, T4);\n        };\n\n    // ----------------\n\n        template <typename F>\n        class bound_function_helper<F,void,void,void,void> : public bound_function_helper_base<void,void,void,void>\n        {\n        public:\n            void call() const\n            {\n                (*fp)();\n            }\n\n            typename strip<F>::type* fp;\n        };\n\n        template <>\n        class bound_function_helper<void,void,void,void,void> : public bound_function_helper_base<void,void,void,void>\n        {\n        public:\n            void call() const\n            {\n                if (this->mfp)    this->mfp();\n                else if (fp) fp();\n            }\n\n            void (*fp)();\n        };\n\n    // ----------------\n\n        template <typename F, typename T1>\n        class bound_function_helper<F,T1,void,void,void> : public bound_function_helper_base<T1,void,void,void>\n        {\n        public:\n            void call() const\n            {\n                (*fp)(*this->arg1);\n            }\n\n            typename strip<F>::type* fp;\n        };\n\n        template <typename T1>\n        class bound_function_helper<void,T1,void,void,void> : public bound_function_helper_base<T1,void,void,void>\n        {\n        public:\n            void call() const\n            {\n                if (this->mfp)    this->mfp(*this->arg1);\n                else if (fp) fp(*this->arg1);\n            }\n\n            void (*fp)(T1);\n        };\n\n    // ----------------\n\n        template <typename F, typename T1, typename T2>\n        class bound_function_helper<F,T1,T2,void,void> : public bound_function_helper_base<T1,T2,void,void>\n        {\n        public:\n            void call() const\n            {\n                (*fp)(*this->arg1, *this->arg2);\n            }\n\n            typename strip<F>::type* fp;\n        };\n\n        template <typename T1, typename T2>\n        class bound_function_helper<void,T1,T2,void,void> : public bound_function_helper_base<T1,T2,void,void>\n        {\n        public:\n            void call() const\n            {\n                if (this->mfp)    this->mfp(*this->arg1, *this->arg2);\n                else if (fp) fp(*this->arg1, *this->arg2);\n            }\n\n            void (*fp)(T1, T2);\n        };\n\n    // ----------------\n\n        template <typename F, typename T1, typename T2, typename T3>\n        class bound_function_helper<F,T1,T2,T3,void> : public bound_function_helper_base<T1,T2,T3,void>\n        {\n        public:\n            void call() const\n            {\n                (*fp)(*this->arg1, *this->arg2, *this->arg3);\n            }\n\n            typename strip<F>::type* fp;\n        };\n\n        template <typename T1, typename T2, typename T3>\n        class bound_function_helper<void,T1,T2,T3,void> : public bound_function_helper_base<T1,T2,T3,void>\n        {\n        public:\n\n            void call() const\n            {\n                if (this->mfp)    this->mfp(*this->arg1, *this->arg2, *this->arg3);\n                else if (fp) fp(*this->arg1, *this->arg2, *this->arg3);\n            }\n\n            void (*fp)(T1, T2, T3);\n        };\n\n    // ------------------------------------------------------------------------------------\n    // ------------------------------------------------------------------------------------\n\n        template <typename T>\n        class bound_function_helper_T : public T\n        {\n        public:\n            bound_function_helper_T(){ this->fp = 0;}\n\n            bool is_set() const\n            {\n                return this->fp != 0 || this->mfp.is_set();\n            }\n\n            template <unsigned long mem_size>\n            void safe_clone(stack_based_memory_block<mem_size>& buf)\n            {\n                // This is here just to validate the assumption that our block of memory we have made\n                // in bf_memory is the right size to store the data for this object.  If you\n                // get a compiler error on this line then email me :)\n                COMPILE_TIME_ASSERT(sizeof(bound_function_helper_T) <= mem_size);\n                clone(buf.get());\n            }\n\n            void clone   (void* ptr) const  \n            { \n                bound_function_helper_T* p = new(ptr) bound_function_helper_T(); \n                p->arg1 = this->arg1;\n                p->arg2 = this->arg2;\n                p->arg3 = this->arg3;\n                p->arg4 = this->arg4;\n                p->fp = this->fp;\n                p->mfp = this->mfp;\n            }\n        };\n\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    class bound_function_pointer\n    {\n        typedef bfp1_helpers::bound_function_helper_T<bfp1_helpers::bound_function_helper<void,int> > bf_null_type;\n\n    public:\n\n        // These typedefs are here for backwards compatibility with previous versions of\n        // dlib.\n        typedef bound_function_pointer kernel_1a;\n        typedef bound_function_pointer kernel_1a_c;\n\n\n        bound_function_pointer (\n        ) { bf_null_type().safe_clone(bf_memory); }\n\n        bound_function_pointer ( \n            const bound_function_pointer& item\n        ) { item.bf()->clone(bf_memory.get()); }\n\n        ~bound_function_pointer()\n        { destroy_bf_memory(); }\n\n        bound_function_pointer& operator= (\n            const bound_function_pointer& item\n        ) { bound_function_pointer(item).swap(*this); return *this; }\n\n        void clear (\n        ) { bound_function_pointer().swap(*this); }\n\n        bool is_set (\n        ) const\n        {\n            return bf()->is_set();\n        }\n\n        void swap (\n            bound_function_pointer& item\n        )\n        {\n            // make a temp copy of item\n            bound_function_pointer temp(item);\n\n            // destory the stuff in item\n            item.destroy_bf_memory();\n            // copy *this into item\n            bf()->clone(item.bf_memory.get());\n\n            // destory the stuff in this \n            destroy_bf_memory();\n            // copy temp into *this\n            temp.bf()->clone(bf_memory.get());\n        }\n\n        void operator() (\n        ) const\n        {\n            // make sure requires clause is not broken\n            DLIB_ASSERT(is_set() == true ,\n                \"\\tvoid bound_function_pointer::operator()\"\n                << \"\\n\\tYou must call set() before you can use this function\"\n                << \"\\n\\tthis: \" << this\n            );\n\n            bf()->call();\n        }\n\n    private:\n        struct dummy{ void nonnull() {}};\n        typedef void (dummy::*safe_bool)();\n\n    public:\n        operator safe_bool () const { return is_set() ? &dummy::nonnull : 0; }\n        bool operator!() const { return !is_set(); }\n\n    // -------------------------------------------\n    //      set function object overloads\n    // -------------------------------------------\n\n        template <typename F>\n        void set (\n            F& function_object\n        )\n        {\n            COMPILE_TIME_ASSERT(is_function<F>::value == false);\n            COMPILE_TIME_ASSERT(is_pointer_type<F>::value == false);\n            \n            using namespace bfp1_helpers;\n            destroy_bf_memory();\n            typedef bound_function_helper_T<bound_function_helper<F> > bf_helper_type;\n\n            bf_helper_type temp;\n            temp.fp = &function_object;\n\n            temp.safe_clone(bf_memory);\n        }\n\n        template <typename F, typename A1 >\n        void set (\n            F& function_object,\n            A1& arg1\n        )\n        {\n            COMPILE_TIME_ASSERT(is_function<F>::value == false);\n            COMPILE_TIME_ASSERT(is_pointer_type<F>::value == false);\n            \n            using namespace bfp1_helpers;\n            destroy_bf_memory();\n            typedef bound_function_helper_T<bound_function_helper<F,A1> > bf_helper_type;\n\n            bf_helper_type temp;\n            temp.arg1 = &arg1;\n            temp.fp = &function_object;\n\n            temp.safe_clone(bf_memory);\n        }\n\n        template <typename F, typename A1, typename A2 >\n        void set (\n            F& function_object,\n            A1& arg1,\n            A2& arg2\n        )\n        {\n            COMPILE_TIME_ASSERT(is_function<F>::value == false);\n            COMPILE_TIME_ASSERT(is_pointer_type<F>::value == false);\n            \n            using namespace bfp1_helpers;\n            destroy_bf_memory();\n            typedef bound_function_helper_T<bound_function_helper<F,A1,A2> > bf_helper_type;\n\n            bf_helper_type temp;\n            temp.arg1 = &arg1;\n            temp.arg2 = &arg2;\n            temp.fp = &function_object;\n\n            temp.safe_clone(bf_memory);\n        }\n\n        template <typename F, typename A1, typename A2, typename A3 >\n        void set (\n            F& function_object,\n            A1& arg1,\n            A2& arg2,\n            A3& arg3\n        )\n        {\n            COMPILE_TIME_ASSERT(is_function<F>::value == false);\n            COMPILE_TIME_ASSERT(is_pointer_type<F>::value == false);\n            \n            using namespace bfp1_helpers;\n            destroy_bf_memory();\n            typedef bound_function_helper_T<bound_function_helper<F,A1,A2,A3> > bf_helper_type;\n\n            bf_helper_type temp;\n            temp.arg1 = &arg1;\n            temp.arg2 = &arg2;\n            temp.arg3 = &arg3;\n            temp.fp = &function_object;\n\n            temp.safe_clone(bf_memory);\n        }\n\n        template <typename F, typename A1, typename A2, typename A3, typename A4>\n        void set (\n            F& function_object,\n            A1& arg1,\n            A2& arg2,\n            A3& arg3,\n            A4& arg4\n        )\n        {\n            COMPILE_TIME_ASSERT(is_function<F>::value == false);\n            COMPILE_TIME_ASSERT(is_pointer_type<F>::value == false);\n            \n            using namespace bfp1_helpers;\n            destroy_bf_memory();\n            typedef bound_function_helper_T<bound_function_helper<F,A1,A2,A3,A4> > bf_helper_type;\n\n            bf_helper_type temp;\n            temp.arg1 = &arg1;\n            temp.arg2 = &arg2;\n            temp.arg3 = &arg3;\n            temp.arg4 = &arg4;\n            temp.fp = &function_object;\n\n            temp.safe_clone(bf_memory);\n        }\n\n    // -------------------------------------------\n    //      set mfp overloads\n    // -------------------------------------------\n\n        template <typename T>\n        void set (\n            T& object,\n            void (T::*funct)()\n        )\n        {\n            using namespace bfp1_helpers;\n            destroy_bf_memory();\n            typedef bound_function_helper_T<bound_function_helper<void> > bf_helper_type;\n\n            bf_helper_type temp;\n            temp.mfp.set(object,funct);\n\n            temp.safe_clone(bf_memory);\n        }\n\n        template <typename T >\n        void set (\n            const T& object,\n            void (T::*funct)()const\n        )\n        {\n            using namespace bfp1_helpers;\n            destroy_bf_memory();\n            typedef bound_function_helper_T<bound_function_helper<void> > bf_helper_type;\n\n            bf_helper_type temp;\n            temp.mfp.set(object,funct);\n\n            temp.safe_clone(bf_memory);\n        }\n\n    // -------------------------------------------\n\n        template <typename T, typename T1, typename A1 >\n        void set (\n            T& object,\n            void (T::*funct)(T1),\n            A1& arg1\n        )\n        {\n            using namespace bfp1_helpers;\n            destroy_bf_memory();\n            typedef bound_function_helper_T<bound_function_helper<void,T1> > bf_helper_type;\n\n            bf_helper_type temp;\n            temp.arg1 = &arg1;\n            temp.mfp.set(object,funct);\n\n            temp.safe_clone(bf_memory);\n        }\n\n        template <typename T, typename T1, typename A1 >\n        void set (\n            const T& object,\n            void (T::*funct)(T1)const,\n            A1& arg1\n        )\n        {\n            using namespace bfp1_helpers;\n            destroy_bf_memory();\n            typedef bound_function_helper_T<bound_function_helper<void,T1> > bf_helper_type;\n\n            bf_helper_type temp;\n            temp.arg1 = &arg1;\n            temp.mfp.set(object,funct);\n\n            temp.safe_clone(bf_memory);\n        }\n\n    // ----------------\n\n        template <typename T, typename T1, typename A1,\n        typename T2, typename A2>\n        void set (\n            T& object,\n            void (T::*funct)(T1, T2),\n            A1& arg1,\n            A2& arg2\n        )\n        {\n            using namespace bfp1_helpers;\n            destroy_bf_memory();\n            typedef bound_function_helper_T<bound_function_helper<void,T1,T2> > bf_helper_type;\n\n            bf_helper_type temp;\n            temp.arg1 = &arg1;\n            temp.arg2 = &arg2;\n            temp.mfp.set(object,funct);\n\n            temp.safe_clone(bf_memory);\n        }\n\n        template <typename T, typename T1, typename A1,\n        typename T2, typename A2>\n        void set (\n            const T& object,\n            void (T::*funct)(T1, T2)const,\n            A1& arg1,\n            A2& arg2\n        )\n        {\n            using namespace bfp1_helpers;\n            destroy_bf_memory();\n            typedef bound_function_helper_T<bound_function_helper<void,T1,T2> > bf_helper_type;\n\n            bf_helper_type temp;\n            temp.arg1 = &arg1;\n            temp.arg2 = &arg2;\n            temp.mfp.set(object,funct);\n\n            temp.safe_clone(bf_memory);\n        }\n\n    // ----------------\n\n        template <typename T, typename T1, typename A1,\n        typename T2, typename A2,\n        typename T3, typename A3>\n        void set (\n            T& object,\n            void (T::*funct)(T1, T2, T3),\n            A1& arg1,\n            A2& arg2,\n            A3& arg3\n        )\n        {\n            using namespace bfp1_helpers;\n            destroy_bf_memory();\n            typedef bound_function_helper_T<bound_function_helper<void,T1,T2,T3> > bf_helper_type;\n\n            bf_helper_type temp;\n            temp.arg1 = &arg1;\n            temp.arg2 = &arg2;\n            temp.arg3 = &arg3;\n            temp.mfp.set(object,funct);\n\n            temp.safe_clone(bf_memory);\n        }\n\n        template <typename T, typename T1, typename A1,\n        typename T2, typename A2,\n        typename T3, typename A3>\n        void set (\n            const T& object,\n            void (T::*funct)(T1, T2, T3)const,\n            A1& arg1,\n            A2& arg2,\n            A3& arg3\n        )\n        {\n            using namespace bfp1_helpers;\n            destroy_bf_memory();\n            typedef bound_function_helper_T<bound_function_helper<void,T1,T2,T3> > bf_helper_type;\n\n            bf_helper_type temp;\n            temp.arg1 = &arg1;\n            temp.arg2 = &arg2;\n            temp.arg3 = &arg3;\n            temp.mfp.set(object,funct);\n\n            temp.safe_clone(bf_memory);\n        }\n\n    // ----------------\n\n        template <typename T, typename T1, typename A1,\n        typename T2, typename A2,\n        typename T3, typename A3,\n        typename T4, typename A4>\n        void set (\n            T& object,\n            void (T::*funct)(T1, T2, T3, T4),\n            A1& arg1,\n            A2& arg2,\n            A3& arg3,\n            A4& arg4\n        )\n        {\n            using namespace bfp1_helpers;\n            destroy_bf_memory();\n            typedef bound_function_helper_T<bound_function_helper<void,T1,T2,T3,T4> > bf_helper_type;\n\n            bf_helper_type temp;\n            temp.arg1 = &arg1;\n            temp.arg2 = &arg2;\n            temp.arg3 = &arg3;\n            temp.arg4 = &arg4;\n            temp.mfp.set(object,funct);\n\n            temp.safe_clone(bf_memory);\n        }\n\n        template <typename T, typename T1, typename A1,\n        typename T2, typename A2,\n        typename T3, typename A3,\n        typename T4, typename A4>\n        void set (\n            const T& object,\n            void (T::*funct)(T1, T2, T3, T4)const,\n            A1& arg1,\n            A2& arg2,\n            A3& arg3,\n            A4& arg4\n        )\n        {\n            using namespace bfp1_helpers;\n            destroy_bf_memory();\n            typedef bound_function_helper_T<bound_function_helper<void,T1,T2,T3,T4> > bf_helper_type;\n\n            bf_helper_type temp;\n            temp.arg1 = &arg1;\n            temp.arg2 = &arg2;\n            temp.arg3 = &arg3;\n            temp.arg4 = &arg4;\n            temp.mfp.set(object,funct);\n\n            temp.safe_clone(bf_memory);\n        }\n\n    // -------------------------------------------\n    //      set fp overloads\n    // -------------------------------------------\n\n        void set (\n            void (*funct)()\n        )\n        {\n            using namespace bfp1_helpers;\n            destroy_bf_memory();\n            typedef bound_function_helper_T<bound_function_helper<void> > bf_helper_type;\n\n            bf_helper_type temp;\n            temp.fp = funct;\n\n            temp.safe_clone(bf_memory);\n        }\n\n        template <typename T1, typename A1>\n        void set (\n            void (*funct)(T1),\n            A1& arg1\n        )\n        {\n            using namespace bfp1_helpers;\n            destroy_bf_memory();\n            typedef bound_function_helper_T<bound_function_helper<void,T1> > bf_helper_type;\n\n            bf_helper_type temp;\n            temp.arg1 = &arg1;\n            temp.fp = funct;\n\n            temp.safe_clone(bf_memory);\n        }\n\n        template <typename T1, typename A1,\n        typename T2, typename A2>\n        void set (\n            void (*funct)(T1, T2),\n            A1& arg1,\n            A2& arg2\n        )\n        {\n            using namespace bfp1_helpers;\n            destroy_bf_memory();\n            typedef bound_function_helper_T<bound_function_helper<void,T1,T2> > bf_helper_type;\n\n            bf_helper_type temp;\n            temp.arg1 = &arg1;\n            temp.arg2 = &arg2;\n            temp.fp = funct;\n\n            temp.safe_clone(bf_memory);\n        }\n\n        template <typename T1, typename A1,\n        typename T2, typename A2,\n        typename T3, typename A3>\n        void set (\n            void (*funct)(T1, T2, T3),\n            A1& arg1,\n            A2& arg2,\n            A3& arg3\n        )\n        {\n            using namespace bfp1_helpers;\n            destroy_bf_memory();\n            typedef bound_function_helper_T<bound_function_helper<void,T1,T2,T3> > bf_helper_type;\n\n            bf_helper_type temp;\n            temp.arg1 = &arg1;\n            temp.arg2 = &arg2;\n            temp.arg3 = &arg3;\n            temp.fp = funct;\n\n            temp.safe_clone(bf_memory);\n        }\n\n        template <typename T1, typename A1,\n        typename T2, typename A2,\n        typename T3, typename A3,\n        typename T4, typename A4>\n        void set (\n            void (*funct)(T1, T2, T3, T4),\n            A1& arg1,\n            A2& arg2,\n            A3& arg3,\n            A4& arg4\n        )\n        {\n            using namespace bfp1_helpers;\n            destroy_bf_memory();\n            typedef bound_function_helper_T<bound_function_helper<void,T1,T2,T3,T4> > bf_helper_type;\n\n            bf_helper_type temp;\n            temp.arg1 = &arg1;\n            temp.arg2 = &arg2;\n            temp.arg3 = &arg3;\n            temp.arg4 = &arg4;\n            temp.fp = funct;\n\n            temp.safe_clone(bf_memory);\n        }\n\n    // -------------------------------------------\n\n    private:\n\n        stack_based_memory_block<sizeof(bf_null_type)> bf_memory;\n\n        void destroy_bf_memory (\n        )\n        {\n            // Honestly, this probably doesn't even do anything but I'm putting\n            // it here just for good measure.\n            bf()->~bound_function_helper_base_base();\n        }\n\n        bfp1_helpers::bound_function_helper_base_base*       bf ()       \n        { return static_cast<bfp1_helpers::bound_function_helper_base_base*>(bf_memory.get()); }\n\n        const bfp1_helpers::bound_function_helper_base_base* bf () const \n        { return static_cast<const bfp1_helpers::bound_function_helper_base_base*>(bf_memory.get()); }\n\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    inline void swap (\n        bound_function_pointer& a,\n        bound_function_pointer& b\n    ) { a.swap(b); }\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_BOUND_FUNCTION_POINTER_KERNEl_1_\n\n"
  },
  {
    "path": "benchmarks/dlib/bound_function_pointer/bound_function_pointer_kernel_abstract.h",
    "content": "// Copyright (C) 2008  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_BOUND_FUNCTION_POINTER_KERNEl_ABSTRACT_\n#ifdef DLIB_BOUND_FUNCTION_POINTER_KERNEl_ABSTRACT_\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    class bound_function_pointer\n    {\n        /*!\n            INITIAL VALUE\n                is_set() == false\n\n            WHAT THIS OBJECT REPRESENTS\n                This object represents a function with all its arguments bound to \n                specific objects.  For example:\n\n                    void test(int& var) { var = var+1; }\n\n                    bound_function_pointer funct;\n\n                    int a = 4; \n                    funct.set(test,a); // bind the variable a to the first argument of the test() function \n\n                    // at this point a == 4\n                    funct();\n                    // after funct() is called a == 5\n        !*/\n\n    public:\n\n        bound_function_pointer (  \n        );\n        /*!\n            ensures                \n                - #*this is properly initialized\n        !*/\n\n        bound_function_pointer(\n            const bound_function_pointer& item\n        );\n        /*!\n            ensures\n                - *this == item\n        !*/\n\n        ~bound_function_pointer (\n        );\n        /*!\n            ensures\n                - any resources associated with *this have been released\n        !*/\n\n        bound_function_pointer& operator=(\n            const bound_function_pointer& item\n        );\n        /*!\n            ensures\n                - *this == item\n        !*/\n\n        void clear(\n        );\n        /*!\n            ensures\n                - #*this has its initial value\n        !*/\n\n        bool is_set (\n        ) const;\n        /*!\n            ensures\n                - if (this->set() has been called) then\n                    - returns true\n                - else\n                    - returns false\n        !*/\n\n        operator some_undefined_pointer_type (\n        ) const;\n        /*!\n            ensures\n                - if (is_set()) then\n                    - returns a non 0 value\n                - else\n                    - returns a 0 value\n        !*/\n\n        bool operator! (\n        ) const;\n        /*!\n            ensures\n                - returns !is_set()\n        !*/\n\n        void operator () (\n        ) const;\n        /*!\n            requires\n                - is_set() == true\n            ensures\n                - calls the bound function on the object(s) specified by the last \n                  call to this->set()\n            throws\n                - any exception thrown by the function specified by\n                  the previous call to this->set().\n                    If any of these exceptions are thrown then the call to this \n                    function will have no effect on *this.                  \n        !*/\n\n        void swap (\n            bound_function_pointer& item\n        );\n        /*!\n            ensures\n                - swaps *this and item\n        !*/ \n\n        // ----------------------\n\n        template <typename F>\n        void set (\n            F& function_object\n        );\n        /*!\n            requires\n                - function_object() is a valid expression \n            ensures\n                - #is_set() == true\n                - calls to this->operator() will call function_object()\n                  (This seems pointless but it is a useful base case)\n        !*/\n\n        template < typename T>\n        void set (\n            T& object,\n            void (T::*funct)()\n        );\n        /*!\n            requires\n                - funct == a valid member function pointer for class T\n            ensures\n                - #is_set() == true\n                - calls to this->operator() will call (object.*funct)()\n        !*/\n\n        template < typename T>\n        void set (\n            const T& object,\n            void (T::*funct)()const\n        );\n        /*!\n            requires\n                - funct == a valid bound function pointer for class T\n            ensures\n                - #is_set() == true\n                - calls to this->operator() will call (object.*funct)()\n        !*/\n\n        void set (\n            void (*funct)()\n        );\n        /*!\n            requires\n                - funct == a valid function pointer \n            ensures\n                - #is_set() == true\n                - calls to this->operator() will call funct()\n        !*/\n\n        // ----------------------\n\n        template <typename F, typename A1 >\n        void set (\n            F& function_object,\n            A1& arg1\n        );\n        /*!\n            requires\n                - function_object(arg1) is a valid expression \n            ensures\n                - #is_set() == true\n                - calls to this->operator() will call function_object(arg1)\n        !*/\n\n        template < typename T, typename T1, typename A1 >\n        void set (\n            T& object,\n            void (T::*funct)(T1),\n            A1& arg1\n        );\n        /*!\n            requires\n                - funct == a valid member function pointer for class T\n            ensures\n                - #is_set() == true\n                - calls to this->operator() will call (object.*funct)(arg1)\n        !*/\n\n        template < typename T, typename T1, typename A1 >\n        void set (\n            const T& object,\n            void (T::*funct)(T1)const,\n            A1& arg1\n        );\n        /*!\n            requires\n                - funct == a valid bound function pointer for class T\n            ensures\n                - #is_set() == true\n                - calls to this->operator() will call (object.*funct)(arg1)\n        !*/\n\n        template <typename T1, typename A1>\n        void set (\n            void (*funct)(T1),\n            A1& arg1\n        );\n        /*!\n            requires\n                - funct == a valid function pointer \n            ensures\n                - #is_set() == true\n                - calls to this->operator() will call funct(arg1)\n        !*/\n\n        // ----------------------\n        template <typename F, typename A1, typename A2 >\n        void set (\n            F& function_object,\n            A1& arg1,\n            A2& arg2\n        );\n        /*!\n            requires\n                - function_object(arg1,arg2) is a valid expression \n            ensures\n                - #is_set() == true\n                - calls to this->operator() will call function_object(arg1,arg2)\n        !*/\n\n        template < typename T, typename T1, typename A1,\n                               typename T2, typename A2>\n        void set (\n            T& object,\n            void (T::*funct)(T1,T2),\n            A1& arg1,\n            A2& arg2\n        );\n        /*!\n            requires\n                - funct == a valid member function pointer for class T\n            ensures\n                - #is_set() == true\n                - calls to this->operator() will call (object.*funct)(arg1,arg2)\n        !*/\n\n        template < typename T, typename T1, typename A1, \n                               typename T2, typename A2>\n        void set (\n            const T& object,\n            void (T::*funct)(T1,T2)const,\n            A1& arg1,\n            A2& arg2\n        );\n        /*!\n            requires\n                - funct == a valid bound function pointer for class T\n            ensures\n                - #is_set() == true\n                - calls to this->operator() will call (object.*funct)(arg1,arg2)\n        !*/\n\n        template <typename T1, typename A1,\n                  typename T2, typename A2>\n        void set (\n            void (*funct)(T1,T2),\n            A1& arg1,\n            A2& arg2\n        );\n        /*!\n            requires\n                - funct == a valid function pointer \n            ensures\n                - #is_set() == true\n                - calls to this->operator() will call funct(arg1,arg2)\n        !*/\n\n        // ----------------------\n\n        template <typename F, typename A1, typename A2, typename A3 >\n        void set (\n            F& function_object,\n            A1& arg1,\n            A2& arg2,\n            A3& arg3\n        );\n        /*!\n            requires\n                - function_object(arg1,arg2,arg3) is a valid expression \n            ensures\n                - #is_set() == true\n                - calls to this->operator() will call function_object(arg1,arg2,arg3)\n        !*/\n\n        template < typename T, typename T1, typename A1,\n                               typename T2, typename A2,\n                               typename T3, typename A3>\n        void set (\n            T& object,\n            void (T::*funct)(T1,T2,T3),\n            A1& arg1,\n            A2& arg2,\n            A3& arg3\n        );\n        /*!\n            requires\n                - funct == a valid member function pointer for class T\n            ensures\n                - #is_set() == true\n                - calls to this->operator() will call (object.*funct)(arg1,arg2,arg3)\n        !*/\n\n        template < typename T, typename T1, typename A1,\n                               typename T2, typename A2,\n                               typename T3, typename A3>\n        void set (\n            const T& object,\n            void (T::*funct)(T1,T2,T3)const,\n            A1& arg1,\n            A2& arg2,\n            A3& arg3\n        );\n        /*!\n            requires\n                - funct == a valid bound function pointer for class T\n            ensures\n                - #is_set() == true\n                - calls to this->operator() will call (object.*funct)(arg1,arg2,arg3)\n        !*/\n\n        template <typename T1, typename A1,\n                  typename T2, typename A2,\n                  typename T3, typename A3>\n        void set (\n            void (*funct)(T1,T2,T3),\n            A1& arg1,\n            A2& arg2,\n            A3& arg3\n        );\n        /*!\n            requires\n                - funct == a valid function pointer \n            ensures\n                - #is_set() == true\n                - calls to this->operator() will call funct(arg1,arg2,arg3)\n        !*/\n\n        // ----------------------\n\n        template <typename F, typename A1, typename A2, typename A3, typename A4>\n        void set (\n            F& function_object,\n            A1& arg1,\n            A2& arg2,\n            A3& arg3,\n            A4& arg4\n        );\n        /*!\n            requires\n                - function_object(arg1,arg2,arg3,arg4) is a valid expression \n            ensures\n                - #is_set() == true\n                - calls to this->operator() will call function_object(arg1,arg2,arg3,arg4)\n        !*/\n\n        template < typename T, typename T1, typename A1,\n                               typename T2, typename A2,\n                               typename T3, typename A3,\n                               typename T4, typename A4>\n        void set (\n            T& object,\n            void (T::*funct)(T1,T2,T3,T4),\n            A1& arg1,\n            A2& arg2,\n            A3& arg3,\n            A4& arg4\n        );\n        /*!\n            requires\n                - funct == a valid member function pointer for class T\n            ensures\n                - #is_set() == true\n                - calls to this->operator() will call (object.*funct)(arg1,arg2,arg3,arg4)\n        !*/\n\n        template < typename T, typename T1, typename A1,\n                               typename T2, typename A2,\n                               typename T3, typename A3,\n                               typename T4, typename A4>\n        void set (\n            const T& object,\n            void (T::*funct)(T1,T2,T3,T4)const,\n            A1& arg1,\n            A2& arg2,\n            A3& arg3,\n            A4& arg4\n        );\n        /*!\n            requires\n                - funct == a valid bound function pointer for class T\n            ensures\n                - #is_set() == true\n                - calls to this->operator() will call (object.*funct)(arg1,arg2,arg3,arg4)\n        !*/\n\n        template <typename T1, typename A1,\n                  typename T2, typename A2,\n                  typename T3, typename A3,\n                  typename T4, typename A4>\n        void set (\n            void (*funct)(T1,T2,T3,T4),\n            A1& arg1,\n            A2& arg2,\n            A3& arg3,\n            A4& arg4\n        );\n        /*!\n            requires\n                - funct == a valid function pointer \n            ensures\n                - #is_set() == true\n                - calls to this->operator() will call funct(arg1,arg2,arg3,arg4)\n        !*/\n\n    };    \n\n// ----------------------------------------------------------------------------------------\n\n    inline void swap (\n        bound_function_pointer& a,\n        bound_function_pointer& b\n    ) { a.swap(b); }\n    /*!\n        provides a global swap function\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_BOUND_FUNCTION_POINTER_KERNEl_ABSTRACT_\n\n"
  },
  {
    "path": "benchmarks/dlib/bound_function_pointer.h",
    "content": "// Copyright (C) 2008  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_BOUND_FUNCTION_POINTEr_\n#define DLIB_BOUND_FUNCTION_POINTEr_\n\n#include \"bound_function_pointer/bound_function_pointer_kernel_1.h\"\n\n#endif // DLIB_BOUND_FUNCTION_POINTEr_ \n\n\n"
  },
  {
    "path": "benchmarks/dlib/byte_orderer/byte_orderer_kernel_1.h",
    "content": "// Copyright (C) 2006  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_BYTE_ORDEREr_KERNEL_1_ \n#define DLIB_BYTE_ORDEREr_KERNEL_1_ \n\n#include \"byte_orderer_kernel_abstract.h\"\n#include \"../algs.h\"\n#include \"../assert.h\"\n\nnamespace dlib\n{\n\n    class byte_orderer \n    {\n        /*!\n            INITIAL VALUE\n                - if (this machine is little endian) then\n                    - little_endian == true\n                - else\n                    - little_endian == false\n\n            CONVENTION\n                - host_is_big_endian() == !little_endian\n                - host_is_little_endian() == little_endian\n\n                - if (this machine is little endian) then\n                    - little_endian == true\n                - else\n                    - little_endian == false\n\n\n        !*/\n\n\n    public:\n\n        // this is here for backwards compatibility with older versions of dlib.\n        typedef byte_orderer kernel_1a;\n\n        byte_orderer (        \n        )\n        {\n            // This will probably never be false but if it is then it means chars are not 8bits\n            // on this system.  Which is a problem for this object.\n            COMPILE_TIME_ASSERT(sizeof(short) >= 2);\n\n            unsigned long temp = 1;\n            unsigned char* ptr = reinterpret_cast<unsigned char*>(&temp);\n            if (*ptr == 1)\n                little_endian = true;\n            else\n                little_endian = false;\n        }\n\n        virtual ~byte_orderer (\n        ){}\n\n        bool host_is_big_endian (\n        ) const { return !little_endian; }\n\n        bool host_is_little_endian (\n        ) const { return little_endian; }\n\n        template <\n            typename T\n            >\n        inline void host_to_network (\n            T& item\n        ) const\n        { if (little_endian) flip(item); }\n\n        template <\n            typename T\n            >\n        inline void network_to_host (\n            T& item\n        ) const { if (little_endian) flip(item); }\n\n        template <\n            typename T\n            >\n        void host_to_big (\n            T& item\n        ) const { if (little_endian) flip(item); }\n\n        template <\n            typename T\n            >\n        void big_to_host (\n            T& item\n        ) const { if (little_endian) flip(item); }\n\n        template <\n            typename T\n            >\n        void host_to_little (\n            T& item\n        ) const { if (!little_endian) flip(item); }\n\n        template <\n            typename T\n            >\n        void little_to_host (\n            T& item\n        ) const { if (!little_endian) flip(item); }\n\n\n    private:\n\n        template <\n            typename T,\n            size_t size\n            >\n        inline void flip (\n            T (&array)[size]\n        ) const\n        /*!\n            ensures\n                - flips the bytes in every element of this array\n        !*/\n        {\n            for (size_t i = 0; i < size; ++i)\n            {\n                flip(array[i]);\n            }\n        }\n\n        template <\n            typename T\n            >\n        inline void flip (\n            T& item\n        ) const\n        /*!\n            ensures\n                - reverses the byte ordering in item\n        !*/\n        {\n            DLIB_ASSERT_HAS_STANDARD_LAYOUT(T);\n\n            T value;\n\n            // If you are getting this as an error then you are probably using\n            // this object wrong.  If you think you aren't then send me (Davis) an\n            // email and I'll either set you straight or change/remove this check so\n            // your stuff works :)\n            COMPILE_TIME_ASSERT(sizeof(T) <= sizeof(long double));\n\n            // If you are getting a compile error on this line then it means T is\n            // a pointer type.  It doesn't make any sense to byte swap pointers\n            // since they have no meaning outside the context of their own process.\n            // So you probably just forgot to dereference that pointer before passing\n            // it to this function  :)\n            COMPILE_TIME_ASSERT(is_pointer_type<T>::value == false);\n\n\n            const size_t size = sizeof(T);\n            unsigned char* const ptr = reinterpret_cast<unsigned char*>(&item);\n            unsigned char* const ptr_temp = reinterpret_cast<unsigned char*>(&value);\n            for (size_t i = 0; i < size; ++i)\n                ptr_temp[size-i-1] = ptr[i];\n\n            item = value;\n        }\n\n        bool little_endian;\n    };    \n\n    // make flip not do anything at all for chars\n    template <> inline void byte_orderer::flip<char> ( char& ) const {} \n    template <> inline void byte_orderer::flip<unsigned char> ( unsigned char& ) const {} \n    template <> inline void byte_orderer::flip<signed char> ( signed char& ) const {} \n}\n\n#endif // DLIB_BYTE_ORDEREr_KERNEL_1_ \n\n"
  },
  {
    "path": "benchmarks/dlib/byte_orderer/byte_orderer_kernel_abstract.h",
    "content": "// Copyright (C) 2006  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_BYTE_ORDEREr_ABSTRACT_ \n#ifdef DLIB_BYTE_ORDEREr_ABSTRACT_\n\n#include \"../algs.h\"\n\nnamespace dlib\n{\n\n    class byte_orderer \n    {\n        /*!\n            INITIAL VALUE\n                This object has no state.\n\n            WHAT THIS OBJECT REPRESENTS\n                This object simply provides a mechanism to convert data from a\n                host machine's own byte ordering to big or little endian and to \n                also do the reverse.\n\n                It also provides a pair of functions to convert to/from network byte\n                order where network byte order is big endian byte order.  This pair of\n                functions does the exact same thing as the host_to_big() and big_to_host()\n                functions and is provided simply so that client code can use the most \n                self documenting name appropriate.\n\n                Also note that this object is capable of correctly flipping the contents \n                of arrays when the arrays are declared on the stack.  e.g.  You can  \n                say things like:\n                int array[10]; \n                bo.host_to_network(array);\n        !*/\n\n    public:\n\n        byte_orderer (        \n        );\n        /*!\n            ensures                \n                - #*this is properly initialized\n            throws\n                - std::bad_alloc\n        !*/\n\n        virtual ~byte_orderer (\n        );\n        /*!\n            ensures\n                - any resources associated with *this have been released\n        !*/\n\n        bool host_is_big_endian (\n        ) const;\n        /*!\n            ensures\n                - if (the host computer is a big endian machine) then\n                    - returns true\n                - else\n                    - returns false\n        !*/\n\n        bool host_is_little_endian (\n        ) const;\n        /*!\n            ensures\n                - if (the host computer is a little endian machine) then\n                    - returns true\n                - else\n                    - returns false\n        !*/\n\n        template <\n            typename T\n            >\n        void host_to_network (\n            T& item\n        ) const;\n        /*!\n            ensures\n                - #item == the value of item converted from host byte order \n                  to network byte order.\n        !*/\n\n        template <\n            typename T\n            >\n        void network_to_host (\n            T& item\n        ) const;\n        /*!\n            ensures\n                - #item == the value of item converted from network byte order\n                  to host byte order.\n        !*/\n\n        template <\n            typename T\n            >\n        void host_to_big (\n            T& item\n        ) const;\n        /*!\n            ensures\n                - #item == the value of item converted from host byte order \n                  to big endian byte order.\n        !*/\n\n        template <\n            typename T\n            >\n        void big_to_host (\n            T& item\n        ) const;\n        /*!\n            ensures\n                - #item == the value of item converted from big endian byte order\n                  to host byte order.\n        !*/\n\n        template <\n            typename T\n            >\n        void host_to_little (\n            T& item\n        ) const;\n        /*!\n            ensures\n                - #item == the value of item converted from host byte order \n                  to little endian byte order.\n        !*/\n\n        template <\n            typename T\n            >\n        void little_to_host (\n            T& item\n        ) const;\n        /*!\n            ensures\n                - #item == the value of item converted from little endian byte order\n                  to host byte order.\n        !*/\n\n    };    \n}\n\n#endif // DLIB_BYTE_ORDEREr_ABSTRACT_ \n\n"
  },
  {
    "path": "benchmarks/dlib/byte_orderer.h",
    "content": "// Copyright (C) 2006  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_BYTE_ORDEREr_ \n#define DLIB_BYTE_ORDEREr_ \n\n\n#include \"byte_orderer/byte_orderer_kernel_1.h\"\n\n#endif // DLIB_BYTE_ORDEREr_ \n\n"
  },
  {
    "path": "benchmarks/dlib/cassert",
    "content": "#include \"dlib_include_path_tutorial.txt\"\n"
  },
  {
    "path": "benchmarks/dlib/config.h",
    "content": "\n\n// If you are compiling dlib as a shared library and installing it somewhere on your system\n// then it is important that any programs that use dlib agree on the state of the\n// DLIB_ASSERT statements (i.e. they are either always on or always off).  Therefore,\n// uncomment one of the following lines to force all DLIB_ASSERTs to either always on or\n// always off.  If you don't define one of these two macros then DLIB_ASSERT will toggle\n// automatically depending on the state of certain other macros, which is not what you want\n// when creating a shared library.\n// #define ENABLE_ASSERTS       // asserts always enabled \n/* #undef DLIB_DISABLE_ASSERTS */\n\n/* #undef DLIB_ISO_CPP_ONLY */\n/* #undef DLIB_NO_GUI_SUPPORT */\n#define DLIB_ENABLE_STACK_TRACE\n\n#define LAPACK_FORCE_UNDERSCORE\n/* #undef LAPACK_FORCE_NOUNDERSCORE */\n\n// You should also consider telling dlib to link against libjpeg, libpng, libgif, fftw, CUDA, \n// and a BLAS and LAPACK library.  To do this you need to uncomment the following #defines.\n#define DLIB_JPEG_SUPPORT\n#define DLIB_PNG_SUPPORT\n/* #undef DLIB_GIF_SUPPORT */\n/* #undef DLIB_USE_FFTW */\n#define DLIB_USE_BLAS\n#define DLIB_USE_LAPACK\n/* #undef DLIB_USE_CUDA */\n/* #undef DLIB_USE_MKL_FFT */\n\n// This variable allows dlib/test_for_odr_violations.h to catch people who mistakenly use\n// headers from one version of dlib with a compiled dlib binary from a different dlib version.\n// #define DLIB_CHECK_FOR_VERSION_MISMATCH DLIB_VERSION_MISMATCH_CHECK__EXPECTED_VERSION_19_21_99\n\n"
  },
  {
    "path": "benchmarks/dlib/console_progress_indicator.h",
    "content": "// Copyright (C) 2010  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_CONSOLE_PROGRESS_INDiCATOR_Hh_\n#define DLIB_CONSOLE_PROGRESS_INDiCATOR_Hh_\n\n#include <ctime>\n#include <cmath>\n#include <limits>\n#include <iostream>\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    class console_progress_indicator\n    {\n        /*!\n            WHAT THIS OBJECT REPRESENTS\n                This object is a tool for reporting how long a task will take\n                to complete.  \n\n                For example, consider the following bit of code:\n\n                    console_progress_indicator pbar(100)\n                    for (int i = 1; i <= 100; ++i)\n                    {\n                        pbar.print_status(i);\n                        long_running_operation();\n                    }\n\n                The above code will print a message to the console each iteration\n                which shows how much time is remaining until the loop terminates.\n        !*/\n\n    public:\n\n        inline explicit console_progress_indicator (\n            double target_value \n        ); \n        /*!\n            ensures\n                - #target() == target_value\n        !*/\n\n        inline void reset (\n            double target_value\n        );\n        /*!\n            ensures\n                - #target() == target_value\n                - performs the equivalent of:\n                    *this = console_progress_indicator(target_value)\n                    (i.e. resets this object with a new target value)\n\n        !*/\n\n        inline double target (\n        ) const;\n        /*!\n            ensures\n                - This object attempts to measure how much time is\n                  left until we reach a certain targeted value.  This\n                  function returns that targeted value.\n        !*/\n\n        inline bool print_status (\n            double cur,\n            bool always_print = false\n        );\n        /*!\n            ensures\n                - print_status() assumes it is called with values which are linearly \n                  approaching target().  It will attempt to predict how much time is \n                  remaining until cur becomes equal to target().\n                - prints a status message to the screen which indicates how much\n                  more time is left until cur is equal to target()\n                - if (always_print) then\n                    - This function prints to the screen each time it is called.\n                - else\n                    - This function throttles the printing so that at most 1 message is\n                      printed each second.  Note that it won't print anything to the screen\n                      until about one second has elapsed.  This means that the first call\n                      to print_status() never prints to the screen.\n                - This function returns true if it prints to the screen and false\n                  otherwise. \n        !*/\n\n    private:\n\n        double target_val;\n\n        time_t start_time;\n        double first_val;\n        double seen_first_val;\n        time_t last_time;\n\n    };\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n//                               IMPLEMENTATION DETAILS\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    console_progress_indicator::\n    console_progress_indicator (\n        double target_value \n    ) :\n        target_val(target_value),\n        start_time(0),\n        first_val(0),\n        seen_first_val(false),\n        last_time(0)\n    {\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    bool console_progress_indicator::\n    print_status (\n        double cur,\n        bool always_print\n    )\n    {\n        const time_t cur_time = std::time(0);\n\n        // if this is the first time print_status has been called\n        // then collect some information and exit.  We will print status\n        // on the next call.\n        if (!seen_first_val)\n        {\n            start_time = cur_time;\n            last_time = cur_time;\n            first_val = cur;\n            seen_first_val = true;\n            return false;\n        }\n\n        if (cur_time != last_time || always_print)\n        {\n            last_time = cur_time;\n            double delta_t = static_cast<double>(cur_time - start_time);\n            double delta_val = std::abs(cur - first_val);\n\n            // don't do anything if cur is equal to first_val\n            if (delta_val < std::numeric_limits<double>::epsilon())\n                return false;\n\n            double seconds = delta_t/delta_val * std::abs(target_val - cur);\n\n            std::ios::fmtflags oldflags = std::cout.flags();  \n\n            std::cout.setf(std::ios::fixed,std::ios::floatfield);\n            std::streamsize ss;\n\n            if (seconds < 60)\n            {\n                ss = std::cout.precision(0); \n                std::cout << \"Time remaining: \" << seconds << \" seconds.                 \\r\" << std::flush;\n            }\n            else if (seconds < 60*60)\n            {\n                ss = std::cout.precision(2); \n                std::cout << \"Time remaining: \" << seconds/60 << \" minutes.                 \\r\" << std::flush;\n            }\n            else \n            {\n                ss = std::cout.precision(2); \n                std::cout << \"Time remaining: \" << seconds/60/60 << \" hours.                 \\r\" << std::flush;\n            }\n\n            // restore previous output flags and precision settings\n            std::cout.flags(oldflags); \n            std::cout.precision(ss); \n\n            return true;\n        }\n\n        return false;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    double console_progress_indicator::\n    target (\n    ) const\n    {\n        return target_val;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    void console_progress_indicator::\n    reset (\n        double target_value\n    ) \n    {\n        *this = console_progress_indicator(target_value);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_CONSOLE_PROGRESS_INDiCATOR_Hh_\n\n"
  },
  {
    "path": "benchmarks/dlib/cstring",
    "content": "#include \"dlib_include_path_tutorial.txt\"\n"
  },
  {
    "path": "benchmarks/dlib/dlib_basic_cpp_build_tutorial.txt",
    "content": "#error \"Don't write #include <dlib/all/source.cpp> in your code.\"\n/*\n  In C++, it is generally an error to #include .cpp files.  This is because it\n  can lead to what are called multiply defined symbol errors.  Therefore, you\n  should compile dlib/all/source.cpp into your application just like you would\n  compile any other .cpp file.  \n  \n  If you are using Visual Studio you add .cpp files to your application using\n  the solution explorer window.  Specifically, right click on Source Files,\n  then select Add -> Existing Item and select the .cpp files you want to add.\n\n  For general information on compiling dlib see http://dlib.net/compile.html\n*/\n"
  },
  {
    "path": "benchmarks/dlib/dlib_include_path_tutorial.txt",
    "content": "#error \"Don't put the dlib folder in your include path\"\n/*\n  You are getting this error because you have added the dlib folder to your\n  compiler's include search path.  \n\n  You should *NOT* add the dlib folder itself to your compiler's include path. \n  Doing so will cause the build to fail because of name collisions (such as \n  dlib/string.h and string.h from the standard library). Instead you should \n  add the folder that contains the dlib folder to your include search path \n  and then use include statements of the form #include <dlib/queue.h> or\n  #include \"dlib/queue.h\".  This will ensure that everything builds correctly.\n\n  XCode:\n  \tThe XCode IDE often puts all folders that it knows about into \n\tthe compiler search path.  So if you are using XCode then either \n\tdon't drag the whole dlib folder into the project or alternatively \n\tmodify your XCode project settings to not auto-add all folders to \n\tthe include path.  Instead just make sure that the dlib folder is \n\titself inside a folder in your include path.  \n*/\n"
  },
  {
    "path": "benchmarks/dlib/enable_if.h",
    "content": "// Copyright 2003 (C) The Trustees of Indiana University.\n// Use, modification, and distribution is subject to the Boost Software\n// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at\n// http://www.boost.org/LICENSE_1_0.txt)\n//    Authors: Jaakko Jarvi (jajarvi at osl.iu.edu)\n//             Jeremiah Willcock (jewillco at osl.iu.edu)\n//             Andrew Lumsdaine (lums at osl.iu.edu)\n#ifndef DLIB_BOOST_UTILITY_ENABLE_IF_HPP\n#define DLIB_BOOST_UTILITY_ENABLE_IF_HPP\n\nnamespace dlib \n{\n \n  template <bool B, class T = void>\n  struct enable_if_c {\n    typedef T type;\n  };\n\n  template <class T>\n  struct enable_if_c<false, T> {};\n\n  template <class Cond, class T = void> \n  struct enable_if : public enable_if_c<Cond::value, T> {};\n\n  template <bool B, class T>\n  struct lazy_enable_if_c {\n    typedef typename T::type type;\n  };\n\n  template <class T>\n  struct lazy_enable_if_c<false, T> {};\n\n  template <class Cond, class T> \n  struct lazy_enable_if : public lazy_enable_if_c<Cond::value, T> {};\n\n\n  template <bool B, class T = void>\n  struct disable_if_c {\n    typedef T type;\n  };\n\n  template <class T>\n  struct disable_if_c<true, T> {};\n\n  template <class Cond, class T = void> \n  struct disable_if : public disable_if_c<Cond::value, T> {};\n\n  template <bool B, class T>\n  struct lazy_disable_if_c {\n    typedef typename T::type type;\n  };\n\n  template <class T>\n  struct lazy_disable_if_c<true, T> {};\n\n  template <class Cond, class T> \n  struct lazy_disable_if : public lazy_disable_if_c<Cond::value, T> {};\n\n} // namespace dlib \n\n#endif // DLIB_BOOST_UTILITY_ENABLE_IF_HPP\n\n"
  },
  {
    "path": "benchmarks/dlib/error.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_ERROr_ \n#define DLIB_ERROr_ \n\n#include <string>\n#include <new>          // for std::bad_alloc\n#include <iostream>\n#include <cassert>\n#include <cstdlib>\n#include <exception>\n\n// -------------------------------\n// ------ exception classes ------\n// -------------------------------\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    enum error_type\n    {       \n        EPORT_IN_USE,  \n        ETIMEOUT,     \n        ECONNECTION, \n        ELISTENER, \n        ERESOLVE,     \n        EMONITOR,   \n        ECREATE_THREAD,    \n        ECREATE_MUTEX,    \n        ECREATE_SIGNALER,\n        EUNSPECIFIED,   \n        EGENERAL_TYPE1,\n        EGENERAL_TYPE2,  \n        EGENERAL_TYPE3,  \n        EINVALID_OPTION,\n        ETOO_FEW_ARGS,\n        ETOO_MANY_ARGS,\n        ESOCKET,\n        ETHREAD,\n        EGUI,\n        EFATAL,\n        EBROKEN_ASSERT,\n        EIMAGE_LOAD,\n        EDIR_CREATE,\n        EINCOMPATIBLE_OPTIONS,\n        EMISSING_REQUIRED_OPTION,\n        EINVALID_OPTION_ARG,\n        EMULTIPLE_OCCURANCES,\n        ECONFIG_READER,\n        EIMAGE_SAVE,\n        ECAST_TO_STRING,\n        ESTRING_CAST,\n        EUTF8_TO_UTF32,\n        EOPTION_PARSE\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    // the base exception class\n    class error : public std::exception\n    {\n        /*!\n            WHAT THIS OBJECT REPRESENTS\n                This is the base exception class for the dlib library.  i.e. all \n                exceptions in this library inherit from this class.\n        !*/\n\n    public:\n        error(\n            error_type t,\n            const std::string& a\n        ): info(a), type(t) {}\n        /*!\n            ensures\n                - #type == t\n                - #info == a\n        !*/\n\n        error(\n            error_type t\n        ): type(t) {}\n        /*!\n            ensures\n                - #type == t\n                - #info == \"\"\n        !*/\n\n        error(\n            const std::string& a\n        ): info(a), type(EUNSPECIFIED) {}\n        /*!\n            ensures\n                - #type == EUNSPECIFIED\n                - #info == a\n        !*/\n\n        error(\n        ): type(EUNSPECIFIED) {}\n        /*!\n            ensures\n                - #type == EUNSPECIFIED\n                - #info == \"\"\n        !*/\n\n        virtual ~error(\n        ) throw() {}\n        /*!\n            ensures\n                - does nothing\n        !*/\n\n        const char* what(\n        ) const throw()\n        /*!\n            ensures\n                - if (info.size() != 0) then\n                    - returns info.c_str()\n                - else\n                    - returns type_to_string(type)\n        !*/\n        {\n            if (info.size() > 0)\n                return info.c_str(); \n            else\n                return type_to_string();\n        }\n\n        const char* type_to_string (\n        ) const throw()\n        /*!\n            ensures\n                - returns a string that names the contents of the type member.\n        !*/\n        {\n            if ( type == EPORT_IN_USE) return \"EPORT_IN_USE\";\n            else if ( type == ETIMEOUT) return \"ETIMEOUT\";\n            else if ( type == ECONNECTION) return \"ECONNECTION\"; \n            else if ( type == ELISTENER) return \"ELISTENER\"; \n            else if ( type == ERESOLVE) return \"ERESOLVE\";     \n            else if ( type == EMONITOR) return \"EMONITOR\";   \n            else if ( type == ECREATE_THREAD) return \"ECREATE_THREAD\";    \n            else if ( type == ECREATE_MUTEX) return \"ECREATE_MUTEX\";    \n            else if ( type == ECREATE_SIGNALER) return \"ECREATE_SIGNALER\";\n            else if ( type == EUNSPECIFIED) return \"EUNSPECIFIED\";   \n            else if ( type == EGENERAL_TYPE1) return \"EGENERAL_TYPE1\";\n            else if ( type == EGENERAL_TYPE2) return \"EGENERAL_TYPE2\";  \n            else if ( type == EGENERAL_TYPE3) return \"EGENERAL_TYPE3\";  \n            else if ( type == EINVALID_OPTION) return \"EINVALID_OPTION\";\n            else if ( type == ETOO_FEW_ARGS) return \"ETOO_FEW_ARGS\";\n            else if ( type == ETOO_MANY_ARGS) return \"ETOO_MANY_ARGS\";\n            else if ( type == ESOCKET) return \"ESOCKET\";\n            else if ( type == ETHREAD) return \"ETHREAD\";\n            else if ( type == EGUI) return \"EGUI\";\n            else if ( type == EFATAL) return \"EFATAL\";\n            else if ( type == EBROKEN_ASSERT) return \"EBROKEN_ASSERT\";\n            else if ( type == EIMAGE_LOAD) return \"EIMAGE_LOAD\";\n            else if ( type == EDIR_CREATE) return \"EDIR_CREATE\";\n            else if ( type == EINCOMPATIBLE_OPTIONS) return \"EINCOMPATIBLE_OPTIONS\";\n            else if ( type == EMISSING_REQUIRED_OPTION) return \"EMISSING_REQUIRED_OPTION\";\n            else if ( type == EINVALID_OPTION_ARG) return \"EINVALID_OPTION_ARG\";\n            else if ( type == EMULTIPLE_OCCURANCES) return \"EMULTIPLE_OCCURANCES\";\n            else if ( type == ECONFIG_READER) return \"ECONFIG_READER\";\n            else if ( type == EIMAGE_SAVE) return \"EIMAGE_SAVE\";\n            else if ( type == ECAST_TO_STRING) return \"ECAST_TO_STRING\";\n            else if ( type == ESTRING_CAST) return \"ESTRING_CAST\";\n            else if ( type == EUTF8_TO_UTF32) return \"EUTF8_TO_UTF32\";\n            else if ( type == EOPTION_PARSE) return \"EOPTION_PARSE\";\n            else return \"undefined error type\";\n        }\n\n        const std::string info;  // info about the error\n        const error_type type; // the type of the error\n\n    private:\n        const error& operator=(const error&);\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    class fatal_error : public error\n    {\n        /*!\n            WHAT THIS OBJECT REPRESENTS\n                As the name says, this object represents some kind of fatal error.  \n                That is, it represents an unrecoverable error and any program that\n                throws this exception is, by definition, buggy and needs to be fixed.\n\n                Note that a fatal_error exception can only be thrown once.  The second\n                time an application attempts to construct a fatal_error it will be \n                immediately aborted and an error message will be printed to std::cerr. \n                The reason for this is because the first fatal_error was apparently ignored\n                so the second fatal_error is going to make itself impossible to ignore \n                by calling abort.  The lesson here is that you should not try to ignore \n                fatal errors.\n\n                This is also the exception thrown by the DLIB_ASSERT and DLIB_CASSERT macros.\n        !*/\n\n    public:\n        fatal_error(\n            error_type t,\n            const std::string& a\n        ): error(t,a) {check_for_previous_fatal_errors();}\n        /*!\n            ensures\n                - #type == t\n                - #info == a\n        !*/\n\n        fatal_error(\n            error_type t\n        ): error(t) {check_for_previous_fatal_errors();}\n        /*!\n            ensures\n                - #type == t\n                - #info == \"\"\n        !*/\n\n        fatal_error(\n            const std::string& a\n        ): error(EFATAL,a) {check_for_previous_fatal_errors();}\n        /*!\n            ensures\n                - #type == EFATAL\n                - #info == a\n        !*/\n\n        fatal_error(\n        ): error(EFATAL) {check_for_previous_fatal_errors();}\n        /*!\n            ensures\n                - #type == EFATAL\n                - #info == \"\"\n        !*/\n\n    private:\n\n        static inline char* message ()\n        { \n            static char buf[2000];\n            buf[1999] = '\\0'; // just to be extra safe\n            return buf;\n        }\n\n        static inline void dlib_fatal_error_terminate (\n        )\n        {\n            std::cerr << \"\\n**************************** FATAL ERROR DETECTED ****************************\";\n            std::cerr << message() << std::endl;\n            std::cerr << \"******************************************************************************\\n\" << std::endl;\n        }\n\n        void check_for_previous_fatal_errors()\n        {\n            // If dlib is being use to create plugins for some other application, like\n            // MATLAB, then don't do these checks since it terminates the over arching\n            // system.  Just let the errors go to the plugin handler and it will deal with\n            // them.\n#if defined(MATLAB_MEX_FILE) || defined(DLIB_NO_ABORT_ON_2ND_FATAL_ERROR)\n            return;\n#else\n            static bool is_first_fatal_error = true;\n            if (is_first_fatal_error == false)\n            {\n                std::cerr << \"\\n\\n ************************** FATAL ERROR DETECTED ************************** \" << std::endl;\n                std::cerr << \" ************************** FATAL ERROR DETECTED ************************** \" << std::endl;\n                std::cerr << \" ************************** FATAL ERROR DETECTED ************************** \\n\" << std::endl;\n                std::cerr << \"Two fatal errors have been detected, the first was inappropriately ignored. \\n\"\n                          << \"To prevent further fatal errors from being ignored this application will be \\n\"\n                          << \"terminated immediately and you should go fix this buggy program.\\n\\n\"\n                          << \"The error message from this fatal error was:\\n\" << this->what() << \"\\n\\n\" << std::endl;\n                using namespace std;\n                assert(false);\n                abort();\n            }\n            else\n            {\n                // copy the message into the fixed message buffer so that it can be recalled by dlib_fatal_error_terminate\n                // if needed.\n                char* msg = message();\n                unsigned long i;\n                for (i = 0; i < 2000-1 && i < this->info.size(); ++i)\n                    msg[i] = info[i];\n                msg[i] = '\\0';\n\n                // set this termination handler so that if the user doesn't catch this dlib::fatal_error that is being\n                // thrown then it will eventually be printed to standard error\n                std::set_terminate(&dlib_fatal_error_terminate);\n            }\n            is_first_fatal_error = false;\n#endif\n        }\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    class gui_error : public error\n    {\n    public:\n        gui_error(\n            error_type t,\n            const std::string& a\n        ): error(t,a) {}\n        /*!\n            ensures\n                - #type == t\n                - #info == a\n        !*/\n\n        gui_error(\n            error_type t\n        ): error(t) {}\n        /*!\n            ensures\n                - #type == t\n                - #info == \"\"\n        !*/\n\n        gui_error(\n            const std::string& a\n        ): error(EGUI,a) {}\n        /*!\n            ensures\n                - #type == EGUI \n                - #info == a\n        !*/\n\n        gui_error(\n        ): error(EGUI) {}\n        /*!\n            ensures\n                - #type == EGUI\n                - #info == \"\"\n        !*/\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    class socket_error : public error\n    {\n    public:\n        socket_error(\n            error_type t,\n            const std::string& a\n        ): error(t,a) {}\n        /*!\n            ensures\n                - #type == t\n                - #info == a\n        !*/\n\n        socket_error(\n            error_type t\n        ): error(t) {}\n        /*!\n            ensures\n                - #type == t\n                - #info == \"\"\n        !*/\n\n        socket_error(\n            const std::string& a\n        ): error(ESOCKET,a) {}\n        /*!\n            ensures\n                - #type == ESOCKET\n                - #info == a\n        !*/\n\n        socket_error(\n        ): error(ESOCKET) {}\n        /*!\n            ensures\n                - #type == ESOCKET\n                - #info == \"\"\n        !*/\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    class thread_error : public error\n    {\n    public:\n        thread_error(\n            error_type t,\n            const std::string& a\n        ): error(t,a) {}\n        /*!\n            ensures\n                - #type == t\n                - #info == a\n        !*/\n\n        thread_error(\n            error_type t\n        ): error(t) {}\n        /*!\n            ensures\n                - #type == t\n                - #info == \"\"\n        !*/\n\n        thread_error(\n            const std::string& a\n        ): error(ETHREAD,a) {}\n        /*!\n            ensures\n                - #type == ETHREAD\n                - #info == a\n        !*/\n\n        thread_error(\n        ): error(ETHREAD) {}\n        /*!\n            ensures\n                - #type == ETHREAD\n                - #info == \"\"\n        !*/\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    class impossible_labeling_error : public dlib::error \n    { \n        /*!\n            WHAT THIS OBJECT REPRESENTS\n                This is the exception thrown by code that trains object detectors (e.g.\n                structural_svm_object_detection_problem) when they detect that the set of\n                truth boxes given to the training algorithm contains some impossible to\n                obtain outputs.  \n                \n                This kind of problem can happen when the set of image positions scanned by\n                the underlying object detection method doesn't include the truth rectangle\n                as a possible output.  Another possibility is when two truth boxes are very\n                close together and hard coded non-max suppression logic would prevent two\n                boxes in such close proximity from being output.\n        !*/\n    public: \n        impossible_labeling_error(const std::string& msg) : dlib::error(msg) {};\n    };\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_ERROr_\n\n"
  },
  {
    "path": "benchmarks/dlib/float_details.h",
    "content": "// Copyright (C) 2013  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_FLOAT_DEtAILS_Hh_\n#define DLIB_FLOAT_DEtAILS_Hh_\n\n#include <cmath>\n#include \"algs.h\"\n#include <limits> \n\nnamespace dlib\n{\n    struct float_details\n    {\n        /*!\n            WHAT THIS OBJECT REPRESENTS\n                This object is a tool for converting floating point numbers into an\n                explicit integer representation and then also converting back.  In\n                particular, a float_details object represents a floating point number with\n                a 64 bit mantissa and 16 bit exponent.  These are stored in the public\n                fields of the same names.\n\n                The main use of this object is to convert floating point values into a\n                known uniform representation so they can be serialized to an output stream.\n                This allows dlib serialization code to work on any system, regardless of\n                the floating point representation used by the hardware.  It also means\n                that, for example, a double can be serialized and then deserialized into a\n                float and it will perform the appropriate conversion.\n\n\n                In more detail, this object represents a floating point value equal to\n                mantissa*pow(2,exponent), except when exponent takes on any of the\n                following special values: \n                    - is_inf\n                    - is_ninf\n                    - is_nan\n                These values are used to indicate that the floating point value should be\n                either infinity, negative infinity, or not-a-number respectively.\n        !*/\n\n        float_details(\n            int64 man,\n            int16 exp\n        ) : mantissa(man), exponent(exp) {}\n        /*!\n            ensures\n                - #mantissa == man\n                - #exponent == exp\n        !*/\n\n        float_details() :\n            mantissa(0), exponent(0)\n        {}\n        /*!\n            ensures\n                - this object represents a floating point value of 0\n        !*/\n\n        float_details ( const double&      val) { *this = val; }\n        float_details ( const float&       val) { *this = val; }\n        float_details ( const long double& val) { *this = val; }\n        /*!\n            ensures\n                - converts the given value into a float_details representation.  This \n                  means that converting #*this back into a floating point number should\n                  recover the input val.\n        !*/\n\n        float_details& operator= ( const double&      val) { convert_from_T(val); return *this; }\n        float_details& operator= ( const float&       val) { convert_from_T(val); return *this; }\n        float_details& operator= ( const long double& val) { convert_from_T(val); return *this; }\n        /*!\n            ensures\n                - converts the given value into a float_details representation.  This \n                  means that converting #*this back into a floating point number should\n                  recover the input val.\n        !*/\n\n        operator double      () const { return convert_to_T<double>(); }\n        operator float       () const { return convert_to_T<float>(); }\n        operator long double () const { return convert_to_T<long double>(); }\n        /*!\n            ensures\n                - converts the contents of this float_details object into a floating point number.\n        !*/\n\n        const static int16 is_inf  = 32000;\n        const static int16 is_ninf = 32001;\n        const static int16 is_nan  = 32002;\n\n        int64 mantissa;\n        int16 exponent;\n\n\n    private:\n\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n//                                  IMPLEMENTATION DETAILS \n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n        template <typename T>\n        void convert_from_T (\n            const T& val\n        )\n        {\n            mantissa = 0;\n\n            const int digits = dlib::tmin<std::numeric_limits<T>::digits, 63>::value;\n\n            if (val == std::numeric_limits<T>::infinity())\n            {\n                exponent = is_inf;\n            }\n            else if (val == -std::numeric_limits<T>::infinity())\n            {\n                exponent = is_ninf;\n            }\n            else if (val < std::numeric_limits<T>::infinity())\n            {\n                int exp;\n                mantissa = static_cast<int64>(std::frexp(val, &exp)*(((uint64)1)<<digits));\n                exponent = exp - digits;\n\n                // Compact the representation a bit by shifting off any low order bytes \n                // which are zero in the mantissa.  This makes the numbers in mantissa and\n                // exponent generally smaller which can make serialization and other things\n                // more efficient in some cases.\n                for (int i = 0; i < 8 && ((mantissa&0xFF)==0); ++i)\n                {\n                    mantissa >>= 8;\n                    exponent += 8;\n                }\n            }\n            else\n            {\n                exponent = is_nan;\n            }\n        }\n\n        template <typename T>\n        T convert_to_T (\n        ) const\n        {\n            if (exponent < is_inf)\n                return std::ldexp((T)mantissa, exponent);\n            else if (exponent == is_inf)\n                return std::numeric_limits<T>::infinity();\n            else if (exponent == is_ninf)\n                return -std::numeric_limits<T>::infinity();\n            else\n                return std::numeric_limits<T>::quiet_NaN();\n        }\n\n    };\n\n}\n\n#endif // DLIB_FLOAT_DEtAILS_Hh_\n\n"
  },
  {
    "path": "benchmarks/dlib/fstream",
    "content": "#include \"dlib_include_path_tutorial.txt\"\n"
  },
  {
    "path": "benchmarks/dlib/hash.h",
    "content": "// Copyright (C) 2011  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_HASh_\n#define DLIB_HASh_\n\n\n#include \"general_hash/hash.h\"\n#include \"general_hash/random_hashing.h\"\n#include \"general_hash/count_bits.h\"\n\n\n#endif // DLIB_HASh_\n\n\n"
  },
  {
    "path": "benchmarks/dlib/interfaces/cmd_line_parser_option.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_CMD_LINE_PARSER_OPTIOn_\n#define DLIB_CMD_LINE_PARSER_OPTIOn_\n\n#include <string>\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename charT\n        >\n    class cmd_line_parser_option\n    {\n        /*!\n            POINTERS AND REFERENCES TO INTERNAL DATA\n                None of the functions in cmd_line_parser_option will invalidate\n                pointers or references to internal data when called.\n\n            WHAT THIS OBJECT REPRESENTS\n                This object represents a command line option.  \n        !*/\n\n    public:\n\n        typedef charT char_type;\n        typedef std::basic_string<charT> string_type;\n\n        virtual ~cmd_line_parser_option (\n        ) = 0;\n\n        virtual const string_type& name (\n        ) const = 0;\n        /*!\n            ensures\n                - returns the name of this option\n        !*/\n\n        virtual const string_type& group_name (\n        ) const = 0;\n        /*!\n            ensures\n                - returns the name of the group this option is in.  If no group was set for\n                  this option then this function returns \"\".\n        !*/\n\n        virtual const string_type& description (\n        ) const = 0;\n        /*!\n            ensures\n                - returns the description for this option\n        !*/\n\n        virtual unsigned long number_of_arguments( \n        ) const = 0;\n        /*!\n            ensures\n                - returns the number of arguments for this option\n        !*/\n\n        virtual unsigned long count(\n        ) const = 0;\n        /*!\n            ensures\n                - returns the number of times this option appears on the command line.\n        !*/\n\n        virtual const string_type& argument (\n            unsigned long arg = 0,\n            unsigned long N = 0\n        ) const = 0;\n        /*!\n            requires\n                - arg < number_of_arguments()\n                - N < count()\n            ensures\n                - returns the arg-th argument to the Nth occurrence of this \n                  option on the command line.\n        !*/\n\n        inline operator bool (\n        ) const { return count() > 0; }\n        /*!\n            ensures\n                - returns true if this option appears on the command line at all\n        !*/\n\n    protected:\n\n        // restricted functions\n        cmd_line_parser_option& operator=(const cmd_line_parser_option&){return *this;}\n\n    };\n\n    // destructor does nothing\n    template < typename charT >\n    cmd_line_parser_option<charT>::~cmd_line_parser_option() {}\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_CMD_LINE_PARSER_OPTIOn_\n\n"
  },
  {
    "path": "benchmarks/dlib/interfaces/enumerable.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_ENUMERABLe_INTERFACE_\n#define DLIB_ENUMERABLe_INTERFACE_\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    class enumerable\n    {\n        /*!\n            POINTERS AND REFERENCES TO INTERNAL DATA\n                - if (at_start()) then\n                    - all pointers and references to data returned via element() are \n                      invalid.\n                - calling move_next() or reset() invalidates pointers and references to \n                  data returned via element() and only data returned via element().\n                - calling at_start(), current_element_valid(), size(), or element() \n                  does NOT invalidate pointers or references to any internal data.\n\n            INITIAL VALUE\n                current_element_valid() == false \n                at_start() == true\n\n            WHAT THIS OBJECT REPRESENTS\n                This object represent an interface for iterating through the \n                elements in a container.  It starts out one before the first element\n                in the container. \n\n\n                EXAMPLE:  The following loops though all elements in the container\n                          and prints them to cout.\n\n                    container.reset();\n                    while(container.move_next()) {\n                        cout << container.element();\n                    }\n        !*/\n\n    public:\n        typedef T type;\n\n        inline virtual ~enumerable(\n        ) = 0;\n\n        virtual bool at_start (\n        ) const = 0;\n        /*!\n            ensures\n                - returns true if *this represents one position before the first element\n                  in the container (this would also make the current element invalid) \n                  else returns false                \n        !*/\n\n        virtual void reset (\n        ) const = 0;\n        /*!\n            ensures\n                - #current_element_valid() == false \n                - #at_start() == true\n        !*/\n\n        virtual bool current_element_valid (\n        ) const = 0;\n        /*!\n            ensures\n                - returns true if we are currently at a valid element else\n                  returns false \n        !*/\n\n        virtual const T& element (\n        ) const = 0;\n        /*!\n            requires\n                - current_element_valid() == true\n            ensures\n                - returns a const reference to the current element\n        !*/\n\n        virtual T& element (\n        ) = 0;\n        /*!\n            requires\n                - current_element_valid() == true\n            ensures\n                - returns a non-const reference to the current element\n        !*/\n\n        virtual bool move_next (\n        ) const = 0;\n        /*!\n            ensures\n                - moves to the next element.  i.e. #element() will now \n                  return the next element in the container \n                - the return value will be equal to #current_element_valid() \n                - #at_start() == false \n\n                - returns true if there is another element \n                - returns false if there are no more elements in the container\n        !*/\n\n        virtual size_t size (\n        ) const = 0;\n        /*!\n            ensures\n                - returns the number of elements in *this\n        !*/\n\n    protected:\n\n        // restricted functions\n        enumerable& operator=(const enumerable&) {return *this;} // no assignment operator\n\n    };\n\n    // destructor does nothing\n    template <typename T>\n    enumerable<T>::~enumerable() {}\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_ENUMERABLe_INTERFACE_\n\n"
  },
  {
    "path": "benchmarks/dlib/interfaces/map_pair.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_MAP_PAIr_INTERFACE_\n#define DLIB_MAP_PAIr_INTERFACE_\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n    \n    template <\n        typename T1,\n        typename T2\n        >\n    class map_pair  \n    {\n        /*!\n            POINTERS AND REFERENCES TO INTERNAL DATA\n                None of the functions in map_pair will invalidate\n                pointers or references to internal data when called.\n\n            WHAT THIS OBJECT REPRESENTS\n                this object is used to return the key/value pair used in the \n                map and hash_map containers when using the enumerable interface.\n\n                note that the enumerable interface is defined in\n                interfaces/enumerable.h\n        !*/\n\n    public:\n        typedef T1 key_type;\n        typedef T2 value_type;\n\n        virtual ~map_pair(\n        )=0;\n\n        virtual const T1& key( \n        ) const =0;\n        /*!\n            ensures\n                - returns a const reference to the key\n        !*/\n\n        virtual const T2& value(\n        ) const =0;\n        /*!\n            ensures\n                - returns a const reference to the value associated with key\n        !*/\n\n        virtual T2& value(\n        )=0;\n        /*!\n            ensures\n                - returns a non-const reference to the value associated with key\n        !*/\n\n    protected:\n\n        // restricted functions\n        map_pair<T1,T2>& operator=(const map_pair<T1,T2>&) {return *this;} // no assignment operator\n\n    };\n\n    // destructor does nothing\n    template <typename T1,typename T2> \n    map_pair<T1,T2>::~map_pair () {}\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_MAP_PAIr_INTERFACE_\n\n"
  },
  {
    "path": "benchmarks/dlib/interfaces/remover.h",
    "content": "// Copyright (C) 2005  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_REMOVER_KERNEl_INTERFACE_\n#define DLIB_REMOVER_KERNEl_INTERFACE_\n\n#include <functional>\n\n\nnamespace dlib\n{\n\n    template <\n        typename T\n        >\n    class remover \n    {\n\n        /*!\n            REQUIREMENTS ON T\n                T is swappable by a global swap() and                \n                T must have a default constructor\n\n            POINTERS AND REFERENCES TO INTERNAL DATA\n                The size() function does not invalidate pointers or \n                references to internal data.  All other functions have no such \n                guarantee.\n\n            WHAT THIS OBJECT REPRESENTS\n                This object represents some generalized interface for removing\n                single items from container classes.                  \n        !*/\n        \n\n        public:\n            typedef T type;\n\n            virtual ~remover(\n            ); \n            /*!\n                ensures\n                    - all resources associated with *this have been released.\n            !*/\n\n            virtual void remove_any (\n                T& item\n            ) = 0;\n            /*!\n                requires \n                    - size() != 0\n                ensures\n                    - #size() == size() - 1\n                    - removes an element from *this and swaps it into item.  \n                    - if (*this implements the enumerable interface) then\n                        - #at_start() == true\n            !*/\n\n            virtual size_t size (\n            ) const = 0;\n            /*!\n                ensures\n                    - returns the number of elements in *this\n            !*/\n\n        protected:\n\n            // restricted functions\n            remover& operator=(const remover&) {return *this;}    // assignment operator\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename compare\n        >\n    class asc_remover : public remover<T>\n    {\n        /*!\n            REQUIREMENTS ON T\n                T is swappable by a global swap() and                \n                T must have a default constructor and\n                T must be comparable by compare where compare is a functor compatible with std::less \n\n            WHAT THIS OBJECT REPRESENTS\n                This object represents the same thing as remover except\n                that remove_any() will remove elements in ascending order\n                according to the compare functor.  \n        !*/\n    public:\n        typedef compare compare_type;\n\n    protected:\n        // restricted functions\n        asc_remover& operator=(const asc_remover&) {return *this;}    // assignment operator\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range\n        >\n    class pair_remover \n    {\n\n        /*!\n            REQUIREMENTS ON domain\n                domain is swappable by a global swap() and                \n                domain must have a default constructor\n\n            REQUIREMENTS ON range\n                range is swappable by a global swap() and\n                range must have a default constructor\n\n            POINTERS AND REFERENCES TO INTERNAL DATA\n                The size() function does not invalidate pointers or \n                references to internal data.  All other functions have no such \n                guarantee.\n\n            WHAT THIS OBJECT REPRESENTS\n                This object represents some generalized interface for removing\n                pairs from container classes which enforce some kind of pairing on\n                the elements that they contain.  \n        !*/\n        \n        public:\n            typedef domain domain_type;\n            typedef range range_type;\n\n            virtual ~pair_remover(\n            ); \n            /*!\n                ensures\n                    - all resources associated with *this have been released.\n            !*/\n\n            virtual void remove_any (\n                domain& d,\n                range& r\n            ) = 0;\n            /*!\n                requires                     \n                    - &d != &r (i.e. d and r cannot be the same variable) \n                    - size() != 0\n                ensures\n                    - #size() == size() - 1\n                    - removes an element from the domain of *this and swaps it\n                      into d.  \n                    - removes the element in *this's range that is associated \n                      with #d and swaps it into r.\n                    - if (*this implements the enumerable interface) then\n                        - #at_start() == true\n            !*/\n\n            virtual size_t size (\n            ) const = 0;\n            /*!\n                ensures\n                    - returns the number of elements in *this \n            !*/\n\n\n        protected:\n\n            // restricted functions\n            pair_remover& operator=(const pair_remover&) {return *this;}    // assignment operator\n\n\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename compare\n        >\n    class asc_pair_remover : public pair_remover<domain,range>\n    {\n        /*!\n            REQUIREMENTS ON domain\n                domain is swappable by a global swap() and                \n                domain must have a default constructor and\n                domain must be comparable by compare where compare is a functor compatible with std::less \n\n            REQUIREMENTS ON range\n                range is swappable by a global swap() and\n                range must have a default constructor\n\n            WHAT THIS OBJECT REPRESENTS\n                This object represents the same thing as pair_remover except\n                that remove_any() will remove domain elements in ascending \n                order according to the compare functor.  \n        !*/\n    public:\n        typedef compare compare_type;\n\n    protected:\n        // restricted functions\n        asc_pair_remover& operator=(const asc_pair_remover&) {return *this;}    // assignment operator\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    // destructor does nothing\n    template <typename T>\n    remover<T>::~remover() {}\n\n    // destructor does nothing\n    template <typename domain, typename range>\n    pair_remover<domain,range>::~pair_remover() {}\n\n\n// ----------------------------------------------------------------------------------------\n\n\n}\n\n#endif // DLIB_REMOVER_KERNEl_INTERFACE_\n\n"
  },
  {
    "path": "benchmarks/dlib/iomanip",
    "content": "#include \"dlib_include_path_tutorial.txt\"\n"
  },
  {
    "path": "benchmarks/dlib/iosfwd",
    "content": "#include \"dlib_include_path_tutorial.txt\"\n"
  },
  {
    "path": "benchmarks/dlib/iostream",
    "content": "#include \"dlib_include_path_tutorial.txt\"\n"
  },
  {
    "path": "benchmarks/dlib/is_kind.h",
    "content": "// Copyright (C) 2007  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_IS_KINd_H_\n#define DLIB_IS_KINd_H_\n\n#include <vector>\n\nnamespace dlib\n{\n    /*!\n        This file contains a set of templates that enable you to determine if\n        a given type implements an abstract interface defined in one of the\n        dlib *_abstract.h files.\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    struct default_is_kind_value { static const bool value = false; };\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    struct is_graph : public default_is_kind_value\n    {\n        /*!\n            - if (T is an implementation of graph/graph_kernel_abstract.h) then\n                - is_graph<T>::value == true\n            - else\n                - is_graph<T>::value == false\n        !*/\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    struct is_directed_graph : public default_is_kind_value\n    {\n        /*!\n            - if (T is an implementation of directed_graph/directed_graph_kernel_abstract.h) then\n                - is_directed_graph<T>::value == true\n            - else\n                - is_directed_graph<T>::value == false\n        !*/\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T, typename helper = void>\n    struct is_matrix : public default_is_kind_value  \n    {\n        /*!\n            - if (T is some kind of matrix expression from the matrix/matrix_exp_abstract.h component) then\n                - is_matrix<T>::value == true\n            - else\n                - is_matrix<T>::value == false\n        !*/\n\n        // Don't set the helper to anything.  Just let it be void.\n        ASSERT_ARE_SAME_TYPE(helper,void);\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    struct is_array2d : public default_is_kind_value  \n    {\n        /*!\n            - if (T is an implementation of array2d/array2d_kernel_abstract.h) then\n                - is_array2d<T>::value == true\n            - else\n                - is_array2d<T>::value == false\n        !*/\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    struct is_array : public default_is_kind_value  \n    {\n        /*!\n            - if (T is an implementation of array/array_kernel_abstract.h) then\n                - is_array<T>::value == true\n            - else\n                - is_array<T>::value == false\n        !*/\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    struct is_std_vector : public default_is_kind_value  \n    {\n        /*!\n            - if (T is an implementation of the standard C++ std::vector object) then\n                - is_std_vector<T>::value == true\n            - else\n                - is_std_vector<T>::value == false\n        !*/\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    struct is_pair : public default_is_kind_value  \n    {\n        /*!\n            - if (T is a std::pair object) then\n                - is_std_vector<T>::value == true\n            - else\n                - is_std_vector<T>::value == false\n        !*/\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    struct is_rand : public default_is_kind_value  \n    {\n        /*!\n            - if (T is an implementation of rand/rand_kernel_abstract.h) then\n                - is_rand<T>::value == true\n            - else\n                - is_rand<T>::value == false\n        !*/\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    struct is_config_reader : public default_is_kind_value  \n    {\n        /*!\n            - if (T is an implementation of config_reader/config_reader_kernel_abstract.h) then\n                - is_config_reader<T>::value == true\n            - else\n                - is_config_reader<T>::value == false\n        !*/\n    };\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n//                              Implementation details\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <typename T, typename alloc> \n    struct is_std_vector<std::vector<T,alloc> >         { const static bool value = true; };\n    template <typename T> struct is_std_vector<T&>      { const static bool value = is_std_vector<T>::value; };\n    template <typename T> struct is_std_vector<const T&>{ const static bool value = is_std_vector<T>::value; };\n    template <typename T> struct is_std_vector<const T> { const static bool value = is_std_vector<T>::value; };\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T, typename U>\n    struct is_pair<std::pair<T,U> > { const static bool value = true; };\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_IS_KINd_H_\n\n"
  },
  {
    "path": "benchmarks/dlib/istream",
    "content": "#include \"dlib_include_path_tutorial.txt\"\n"
  },
  {
    "path": "benchmarks/dlib/locale",
    "content": "#include \"dlib_include_path_tutorial.txt\"\n"
  },
  {
    "path": "benchmarks/dlib/logger/extra_logger_headers.h",
    "content": "// Copyright (C) 2006  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_EXTRA_LOGGER_HEADERs_\n#define DLIB_EXTRA_LOGGER_HEADERs_\n\n#include \"logger_kernel_abstract.h\"\n#include \"logger_kernel_1.h\"\n#include <iostream>\n#include <string>\n#include \"../uintn.h\"\n\n// ----------------------------------------------------------------------------------------\n\nnamespace dlib\n{\n\n    void print_datetime_logger_header (\n        std::ostream& out,\n        const std::string& logger_name,\n        const log_level& l,\n        const uint64 thread_id\n    );\n    /*!\n        requires\n            - is not called more than once at a time (i.e. is not called from multiple\n              threads at the same time).\n        ensures\n            - let DATE be the current date and time (e.g. Thu Aug 31 16:41:52 2006).  \n            - prints a string to out in the form:  \"l.name (DATE) [thread_id] logger_name:\"\n    !*/\n\n}\n\n// ----------------------------------------------------------------------------------------\n\n#ifdef NO_MAKEFILE\n#include \"extra_logger_headers.cpp\"\n#endif\n\n#endif // DLIB_EXTRA_LOGGER_HEADERs_\n\n"
  },
  {
    "path": "benchmarks/dlib/logger/logger_config_file.h",
    "content": "// Copyright (C) 2007  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_LOGGER_CONFIg_FILE_\n#define DLIB_LOGGER_CONFIg_FILE_ \n\n#include \"logger_kernel_abstract.h\"\n#include \"logger_kernel_1.h\"\n#include <string>\n#include \"../config_reader.h\"\n\n// ----------------------------------------------------------------------------------------\n\nnamespace dlib\n{\n    class logger_config_file_error : public error \n    {\n        /*!\n            WHAT THIS OBJECT REPRESENTS\n                This is the exception class used by the configure_loggers_from_file()\n                function defined below.\n        !*/\n    public: \n        logger_config_file_error(const std::string& s):error(s){}\n    };\n\n    void configure_loggers_from_file (\n        const std::string& file_name\n    );\n    /*!\n        ensures\n            - configures the loggers with the contents of the file_name file\n        throws\n            - dlib::logger_config_file_error\n                this exception is thrown if there is a problem reading the config file\n    !*/\n\n    void configure_loggers_from_file (\n        const config_reader& cr \n    );\n    /*!\n        ensures\n            - configures the loggers with the contents of cr.  This function is just like\n              the above version that reads from a file except that it reads from an in-memory\n              config_reader instead.\n        throws\n            - dlib::logger_config_file_error\n                this exception is thrown if there is a problem reading the config file\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    /*!  \n        #  -----------------------------------------------\n        #  ------------- EXAMPLE CONFIG FILE -------------\n        #  -----------------------------------------------\n\n        # The overall format of the config file is the same as the one defined by\n        # the config_reader component of this library.  \n        \n        # This line is a comment line\n\n        # The config file always has a block named logger_config.  This is where all the \n        # config data for the loggers reside.\n        logger_config\n        {\n            # This sets all loggers to the level LINFO since it is just inside the \n            # logger_config block\n            logging_level = info\n\n            # Alternatively we could specify a user defined logging level by\n            # supplying a priority number.  The following line would specify \n            # that only logging levels at or above 100 are printed.  (note that \n            # you would have to comment out the logging_level statement above \n            # to avoid a conflict).\n            # logging_level = 100 \n\n            parent_logger \n            {\n                # This sets all loggers named \"parent_logger\" or children of\n                # loggers with that name to not log at all (i.e. to logging level\n                # LNONE).\n                logging_level = none\n            }\n\n\n            parent_logger2\n            {\n                # set loggers named \"parent_logger2\" and its children loggers\n                # to write their output to a file named out.txt\n                output = file out.txt \n\n                child_logger\n                {\n                    # Set loggers named \"parent_logger2.child_logger\" and children of loggers\n                    # with this name to logging level LALL\n                    logging_level = all\n\n                    # Note that this logger will also log to out.txt because that is what\n                    # its parent does and we haven't overridden it here with something else.\n                    # if we wanted this logger to write to cout instead we could uncomment\n                    # the following line:\n                    # output = cout\n                }\n            }\n        }\n\n        # So in summary, all logger config stuff goes inside a block named logger_config.  Then\n        # inside that block all blocks must be the names of loggers.  There are only two keys,\n        # logging_level and output.\n        #\n        # The valid values of logging_level are:\n        #   \"LALL\", \"LNONE\", \"LTRACE\", \"LDEBUG\", \"LINFO\", \"LWARN\", \"LERROR\", \"LFATAL\",  \n        #   \"ALL\",   \"NONE\",  \"TRACE\",  \"DEBUG\",  \"INFO\",  \"WARN\",  \"ERROR\",  \"FATAL\", \n        #   \"all\",   \"none\",  \"trace\",  \"debug\",  \"info\",  \"warn\",  \"error\",  \"fatal\", or  \n        #   any integral value\n        # \n        # The valid values of output are:\n        #   \"cout\", \"cerr\", \"clog\", or a string of the form \"file some_file_name\"\n        #   which causes the output to be logged to the specified file.\n        #\n    !*/\n\n\n}\n\n// ----------------------------------------------------------------------------------------\n\n#ifdef NO_MAKEFILE\n#include \"logger_config_file.cpp\"\n#endif\n\n#endif // DLIB_LOGGER_CONFIg_FILE_\n\n\n\n"
  },
  {
    "path": "benchmarks/dlib/logger/logger_kernel_1.h",
    "content": "// Copyright (C) 2006  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_LOGGER_KERNEl_1_\n#define DLIB_LOGGER_KERNEl_1_\n\n#include <limits>\n#include <memory>\n#include <cstring>\n#include <streambuf>\n#include <vector>\n\n#include \"../threads.h\"\n#include \"../misc_api.h\"\n#include \"../set.h\"\n#include \"logger_kernel_abstract.h\"\n#include \"../algs.h\"\n#include \"../assert.h\"\n#include \"../uintn.h\"\n#include \"../map.h\"\n#include \"../member_function_pointer.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    class log_level\n    {\n    public:\n        log_level(\n            int priority_, \n            const char* name_\n        ) : \n            priority(priority_)\n        {\n            strncpy(name,name_,19);\n            name[19] = '\\0';\n        }\n\n        bool operator< (const log_level& rhs) const { return priority <  rhs.priority; }\n        bool operator<=(const log_level& rhs) const { return priority <= rhs.priority; }\n        bool operator> (const log_level& rhs) const { return priority >  rhs.priority; }\n        bool operator>=(const log_level& rhs) const { return priority >= rhs.priority; }\n\n        int priority;\n        char name[20];\n    };\n\n    inline std::ostream& operator<< (std::ostream& out, const log_level& item)\n    {\n        out << item.name;\n        return out;\n    }\n\n    const log_level LALL  (std::numeric_limits<int>::min(),\"ALL\");\n    const log_level LNONE (std::numeric_limits<int>::max(),\"NONE\");\n    const log_level LTRACE(-100,\"TRACE\");\n    const log_level LDEBUG(0  ,\"DEBUG\");\n    const log_level LINFO (100,\"INFO \");\n    const log_level LWARN (200,\"WARN \");\n    const log_level LERROR(300,\"ERROR\");\n    const log_level LFATAL(400,\"FATAL\");\n\n// ----------------------------------------------------------------------------------------\n\n    void set_all_logging_output_streams (\n        std::ostream& out\n    );\n\n    void set_all_logging_levels (\n        const log_level& new_level\n    );\n\n    typedef void (*print_header_type)(\n        std::ostream& out, \n        const std::string& logger_name, \n        const log_level& l,\n        const uint64 thread_id\n    );\n\n    void set_all_logging_headers (\n        const print_header_type& new_header\n    );\n\n// ----------------------------------------------------------------------------------------\n\n    void print_default_logger_header (\n        std::ostream& out,\n        const std::string& logger_name,\n        const log_level& l,\n        const uint64 thread_id\n    );\n\n    template <\n        typename T\n        >\n    void set_all_logging_output_hooks (\n        T& object,\n        void (T::*hook_)(const std::string& logger_name, \n                         const log_level& l,\n                         const uint64 thread_id,\n                         const char* message_to_log)\n    );\n\n    template <\n        typename T\n        >\n    void set_all_logging_output_hooks (\n        T& object\n    )\n    {\n        set_all_logging_output_hooks(object, &T::log);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    class logger \n    {\n        /*!\n            INITIAL VALUE\n                - print_header == print_default_logger_header\n                - out.rdbuf() == std::cout.rdbuf()\n                - cur_level == LERROR\n                - auto_flush_enabled == true \n                - hook.is_set() == false\n\n            CONVENTION\n                - print_header == logger_header()\n                - if (hook.is_set() == false) then\n                    - out.rdbuf() == output_streambuf()\n                - else\n                    - out.rdbuf() == &gd.hookbuf\n                    - output_streambuf() == 0\n\n                - cur_level == level()\n                - logger_name == name()\n                - auto_flush_enabled == auto_flush()\n\n                - logger::gd::loggers == a set containing all currently existing loggers.\n                - logger::gd::m == the mutex used to lock everything in the logger\n                - logger::gd::thread_names == a map of thread ids to thread names.  \n                - logger::gd::next_thread_name == the next thread name that will be given out\n                  to a thread when we find that it isn't already in thread_names.\n        !*/\n\n    // ------------------------------------------------------------------------------------\n    // ------------------------------------------------------------------------------------\n\n        class logger_stream\n        {\n            /*!\n                INITIAL VALUE\n                    - been_used == false\n\n                CONVENTION\n                    - enabled == is_enabled()\n                    - if (been_used) then\n                        - logger::gd::m is locked\n                        - someone has used the << operator to write something to the\n                          output stream.\n            !*/\n        public:\n            logger_stream (\n                const log_level& l_,\n                logger& log_\n            ) :\n                l(l_),\n                log(log_),\n                been_used(false),\n                enabled (l.priority >= log.cur_level.priority)\n            {}\n\n            inline ~logger_stream(\n            )\n            {\n                if (!been_used)\n                {\n                    return;\n                }\n                else\n                {\n                    print_end_of_line();\n                }\n            }\n\n            bool is_enabled (\n            ) const { return enabled; }\n\n            template <typename T>\n            inline logger_stream& operator << (\n                const T& item\n            )\n            {\n                if (!enabled)\n                {\n                    return *this;\n                }\n                else\n                {\n                    print_header_and_stuff();\n                    log.out << item;\n                    return *this;\n                }\n            }\n\n        private:\n\n            void print_header_and_stuff (\n            );\n            /*!\n                ensures\n                    - if (!been_used) then\n                        - prints the logger header \n                        - locks log.gd.m\n                        - #been_used == true\n            !*/\n\n            void print_end_of_line (\n            );\n            /*!\n                ensures\n                    - prints a newline to log.out\n                    - unlocks log.gd.m\n            !*/\n\n            const log_level& l;\n            logger& log;\n            bool been_used;\n            const bool enabled;\n        }; // end of class logger_stream\n\n    // ------------------------------------------------------------------------------------\n    // ------------------------------------------------------------------------------------\n\n        friend class logger_stream;\n    public:\n\n        typedef member_function_pointer<const std::string&, const log_level&, \n                                        const uint64, const char*> hook_mfp;\n\n        logger (  \n            const std::string& name_\n        );\n\n        virtual ~logger (\n        ); \n\n        const std::string& name (\n        ) const { return logger_name; }\n\n        logger_stream operator << (\n            const log_level& l\n        ) const { return logger_stream(l,const_cast<logger&>(*this)); }\n\n        bool is_child_of (\n            const logger& log\n        ) const\n        {\n            return (name().find(log.name() + \".\") == 0) || (log.name() == name());\n        }\n\n        const log_level level (\n        ) const \n        { \n            auto_mutex M(gd.m);\n            return log_level(cur_level); \n        };\n\n        void set_level (\n            const log_level& new_level\n        )\n        {\n            auto_mutex M(gd.m);\n            gd.loggers.reset();\n            while (gd.loggers.move_next())\n            {\n                if (gd.loggers.element()->is_child_of(*this))\n                    gd.loggers.element()->cur_level = new_level;\n            }\n\n            gd.set_level(logger_name, new_level);\n        }\n\n        bool auto_flush (\n        ) const \n        { \n            auto_mutex M(gd.m);\n            return auto_flush_enabled;\n        };\n\n        void set_auto_flush (\n            bool enabled\n        )\n        {\n            auto_mutex M(gd.m);\n            gd.loggers.reset();\n            while (gd.loggers.move_next())\n            {\n                if (gd.loggers.element()->is_child_of(*this))\n                    gd.loggers.element()->auto_flush_enabled = enabled;\n            }\n\n            gd.set_auto_flush(logger_name, enabled);\n        }\n\n        std::streambuf* output_streambuf (\n        )\n        {\n            auto_mutex M(gd.m);\n\n            // if there is an output hook set then we are supposed to return 0.\n            if (hook)\n                return 0;\n            else\n                return out.rdbuf();\n        }\n\n        template <\n            typename T\n            >\n        void set_output_hook (\n            T& object,\n            void (T::*hook_)(const std::string& logger_name, \n                            const log_level& l,\n                            const uint64 thread_id,\n                            const char* message_to_log)\n        )\n        {\n            auto_mutex M(gd.m);\n            hook.set(object, hook_);\n\n            gd.loggers.reset();\n            while (gd.loggers.move_next())\n            {\n                if (gd.loggers.element()->is_child_of(*this))\n                {\n                    gd.loggers.element()->out.rdbuf(&gd.hookbuf);\n                    gd.loggers.element()->hook = hook;\n                }\n            }\n\n            gd.set_output_hook(logger_name, hook);\n            gd.set_output_stream(logger_name, gd.hookbuf);\n        }\n\n        void set_output_stream (\n            std::ostream& out_\n        ) \n        {\n            auto_mutex M(gd.m);\n            gd.loggers.reset();\n            while (gd.loggers.move_next())\n            {\n                if (gd.loggers.element()->is_child_of(*this))\n                {\n                    gd.loggers.element()->out.rdbuf(out_.rdbuf());\n                    gd.loggers.element()->hook.clear();\n                }\n            }\n\n            gd.set_output_stream(logger_name, out_);\n\n            hook.clear();\n            gd.set_output_hook(logger_name, hook);\n        }\n\n        print_header_type logger_header (\n        ) const { return print_header; }\n\n        void set_logger_header (\n            print_header_type ph\n        )\n        {\n            auto_mutex M(gd.m);\n            gd.loggers.reset();\n            while (gd.loggers.move_next())\n            {\n                if (gd.loggers.element()->is_child_of(*this))\n                    gd.loggers.element()->print_header = ph;\n            }\n\n            gd.set_logger_header(logger_name, ph);\n        }\n\n    private:\n\n    // ------------------------------------------------------------------------------------\n    // ------------------------------------------------------------------------------------\n\n        struct global_data\n        {\n            rmutex m;\n            set<logger*>::kernel_1b loggers;\n            map<thread_id_type,uint64>::kernel_1b thread_names;\n            uint64 next_thread_name;\n\n            // Make a very simple streambuf that writes characters into a std::vector<char>.  We can\n            // use this as the output target for hooks.  The reason we don't just use a std::ostringstream\n            // instead is that this way we can be guaranteed that logging doesn't perform memory allocations.\n            // This is because a std::vector never frees memory.  I.e. its capacity() doesn't go down when\n            // you resize it back to 0.  It just stays the same.\n            class hook_streambuf : public std::streambuf\n            {\n            public:\n                std::vector<char> buffer;\n                int_type overflow ( int_type c)\n                {\n                    if (c != EOF) buffer.push_back(static_cast<char>(c));\n                    return c;\n                }\n\n                std::streamsize xsputn ( const char* s, std::streamsize num)\n                {\n                    buffer.insert(buffer.end(), s, s+num);\n                    return num;\n                }\n            };\n\n            hook_streambuf hookbuf;\n\n            global_data (\n            );\n\n            ~global_data(\n            );\n\n            uint64 get_thread_name (\n            );\n            /*!\n                requires\n                    - m is locked\n                ensures\n                    - returns a unique id for the calling thread.  also makes the number\n                      small and nice unlike what you get from get_thread_id()\n            !*/\n\n            void thread_end_handler (\n            );\n            /*!\n                ensures\n                    - removes the terminated thread from thread_names\n            !*/\n\n            struct level_container\n            {\n                level_container ();\n\n                log_level val;\n                map<std::string,std::unique_ptr<level_container> >::kernel_1b_c table;\n            } level_table;\n\n            const log_level level (\n                const std::string& name\n            ) const; \n            /*!\n                ensures\n                    - returns the level loggers with the given name are supposed \n                      to have\n            !*/\n\n            void set_level (\n                const std::string& name,\n                const log_level& new_level\n            );\n            /*!\n                ensures\n                    - for all children C of name:\n                        - #level(C) == new_level\n                    - if name == \"\" then\n                        - for all loggers L:\n                            - #level(L) == new_level\n            !*/\n\n            struct auto_flush_container\n            {\n                bool val;\n                map<std::string,std::unique_ptr<auto_flush_container> >::kernel_1b_c table;\n            } auto_flush_table;\n\n            bool auto_flush (\n                const std::string& name\n            ) const;\n            /*!\n                ensures\n                    - returns the auto_flush value loggers with the given name are supposed \n                      to have\n            !*/\n\n            void set_auto_flush (\n                const std::string& name,\n                bool enabled\n            );\n            /*!\n                ensures\n                    - for all children C of name:\n                        - #auto_flush_enabled(C) == enabled \n                    - if name == \"\" then\n                        - for all loggers L:\n                            - #auto_flush_enabled(L) == enabled \n            !*/\n\n            struct output_streambuf_container\n            {\n                std::streambuf* val;\n                map<std::string,std::unique_ptr<output_streambuf_container> >::kernel_1b_c table;\n            } streambuf_table;\n\n            std::streambuf* output_streambuf (\n                const std::string& name\n            );\n            /*!\n                ensures\n                    - returns the streambuf loggers with the given name are supposed \n                      to have\n            !*/\n\n            void set_output_stream (\n                const std::string& name,\n                std::ostream& out_\n            );\n            /*!\n                ensures\n                    - for all children C of name:\n                        - #output_streambuf(C) == out_.rdbuf() \n                    - if name == \"\" then\n                        - for all loggers L:\n                            - #output_streambuf(L) == out_.rdbuf() \n            !*/\n\n            void set_output_stream (\n                const std::string& name,\n                std::streambuf& buf \n            );\n            /*!\n                ensures\n                    - for all children C of name:\n                        - #output_streambuf(C) == &buf \n                    - if name == \"\" then\n                        - for all loggers L:\n                            - #output_streambuf(L) == &buf \n            !*/\n\n            struct output_hook_container\n            {\n                hook_mfp val;\n                map<std::string,std::unique_ptr<output_hook_container> >::kernel_1b_c table;\n            } hook_table;\n\n            hook_mfp output_hook (\n                const std::string& name\n            );\n            /*!\n                ensures\n                    - returns the hook loggers with the given name are supposed \n                      to have\n            !*/\n\n            void set_output_hook (\n                const std::string& name,\n                const hook_mfp& hook\n            );\n            /*!\n                ensures\n                    - for all children C of name:\n                        - #output_hook(C) == hook \n                    - if name == \"\" then\n                        - for all loggers L:\n                            - #output_hook(L) == hook \n            !*/\n\n            struct logger_header_container\n            {\n                print_header_type val;\n                map<std::string,std::unique_ptr<logger_header_container> >::kernel_1b_c table;\n            } header_table;\n\n            print_header_type logger_header (\n                const std::string& name\n            );\n            /*!\n                ensures\n                    - returns the header function loggers with the given name are supposed \n                      to have\n            !*/\n\n            void set_logger_header (\n                const std::string& name,\n                print_header_type ph\n            );\n            /*!\n                ensures\n                    - for all children C of name:\n                        - #logger_header(C) == ph \n                    - if name == \"\" then\n                        - for all loggers L:\n                            - #logger_header(L) == ph \n            !*/\n\n        }; // end of struct global_data\n\n        static global_data& get_global_data();\n\n    // ------------------------------------------------------------------------------------\n    // ------------------------------------------------------------------------------------\n\n        friend void set_all_logging_levels (\n            const log_level& new_level\n        );\n\n        friend void set_all_logging_headers (\n            const print_header_type& new_header \n        );\n\n        friend void set_all_logging_output_streams (\n            std::ostream& out\n        );\n\n        template <\n            typename T\n            >\n        friend void set_all_logging_output_hooks (\n            T& object,\n            void (T::*hook_)(const std::string& logger_name, \n                            const log_level& l,\n                            const uint64 thread_id,\n                            const char* message_to_log)\n        )\n        {\n            logger::hook_mfp hook;\n\n            // There is a bug in one of the versions (but not all apparently) of \n            // Visual studio 2005 that causes it to error out if <T> isn't in the\n            // following line of code.  However, there is also a bug in gcc-3.3 \n            // that causes it to error out if <T> is present.  So this works around\n            // this problem.\n#if defined(_MSC_VER) && _MSC_VER == 1400\n            hook.set<T>(object, hook_);\n#else\n            hook.set(object, hook_);\n#endif\n\n            logger::global_data& gd = logger::get_global_data();\n            auto_mutex M(gd.m);\n            gd.loggers.reset();\n            while (gd.loggers.move_next())\n            {\n                gd.loggers.element()->out.rdbuf(&gd.hookbuf);\n                gd.loggers.element()->hook = hook;\n            }\n\n            gd.set_output_stream(\"\",gd.hookbuf);\n            gd.set_output_hook(\"\",hook);\n        }\n\n    // ------------------------------------------------------------------------------------\n\n        global_data& gd;\n\n        const std::string logger_name;\n\n        print_header_type print_header;\n        bool auto_flush_enabled;\n        std::ostream out;\n        log_level cur_level;\n\n        hook_mfp hook;\n\n\n        // restricted functions\n        logger(const logger&);        // copy constructor\n        logger& operator=(const logger&);    // assignment operator\n\n    };    \n\n// ----------------------------------------------------------------------------------------\n\n\n\n\n}\n\n#ifdef NO_MAKEFILE\n#include \"logger_kernel_1.cpp\"\n#endif\n\n#endif // DLIB_LOGGER_KERNEl_1_\n\n"
  },
  {
    "path": "benchmarks/dlib/logger/logger_kernel_abstract.h",
    "content": "// Copyright (C) 2006  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_LOGGER_KERNEl_ABSTRACT_\n#ifdef DLIB_LOGGER_KERNEl_ABSTRACT_\n\n#include \"../threads.h\"\n#include <limits>\n#include <string>\n#include <iostream>\n#include \"../uintn.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    class log_level\n    {\n        /*!\n            WHAT THIS OBJECT REPRESENTS\n                This object is a simple named level to log at.  It contains a numeric \n                priority and a name to use in the logging messages.\n        !*/\n    public:\n        log_level(\n            int priority_, \n            const char* name_\n        );  \n        /*!\n            ensures\n                - #priority = priority_\n                - the first 19 characters of name_ are copied into name and name\n                  is null terminated.\n        !*/\n\n        bool operator< (const log_level& rhs) const { return priority <  rhs.priority; }\n        bool operator<=(const log_level& rhs) const { return priority <= rhs.priority; }\n        bool operator> (const log_level& rhs) const { return priority >  rhs.priority; }\n        bool operator>=(const log_level& rhs) const { return priority >= rhs.priority; }\n\n        int priority;\n        char name[20];\n    };\n\n    inline std::ostream& operator<< (std::ostream& out, const log_level& item);\n    /*!\n        ensures\n            - performs out << item.name\n            - returns out\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    const log_level LALL  (std::numeric_limits<int>::min(),\"ALL\");\n    const log_level LNONE (std::numeric_limits<int>::max(),\"NONE\");\n    const log_level LTRACE(-100,\"TRACE\");\n    const log_level LDEBUG(0   ,\"DEBUG\");\n    const log_level LINFO (100 ,\"INFO \");\n    const log_level LWARN (200 ,\"WARN \");\n    const log_level LERROR(300 ,\"ERROR\");\n    const log_level LFATAL(400 ,\"FATAL\");\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    void set_all_logging_output_streams (\n        std::ostream& out\n    );\n    /*!\n        ensures\n            - for all loggers L (even loggers not yet constructed):\n                - #L.output_streambuf() == out.rdbuf() \n                - Removes any previous output hook from L.  So now the logger\n                  L will write all its messages to the given output stream.\n        throws\n            - std::bad_alloc\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    typedef void (*print_header_type)(\n        std::ostream& out, \n        const std::string& logger_name, \n        const log_level& l,\n        const uint64 thread_id\n    );\n\n    void set_all_logging_headers (\n        const print_header_type& new_header\n    );\n    /*!\n        ensures\n            - for all loggers L (even loggers not yet constructed):\n                - #L.logger_header() == new_header \n        throws\n            - std::bad_alloc\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    void set_all_logging_output_hooks (\n        T& object,\n        void (T::*hook)(const std::string& logger_name, \n                        const log_level& l,\n                        const uint64 thread_id,\n                        const char* message_to_log)\n    );\n    /*!\n        ensures\n            - for all loggers L (even loggers not yet constructed):\n                - #L.output_streambuf() == 0\n                - performs the equivalent to calling L.set_output_hook(object, hook);\n                  (i.e. sets all loggers so that they will use the given hook function)\n        throws\n            - std::bad_alloc\n    !*/\n\n    template <\n        typename T\n        >\n    void set_all_logging_output_hooks (\n        T& object\n    );\n    /*!\n        ensures\n            - calls set_all_logging_output_hooks(object, &T::log);\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    void set_all_logging_levels (\n        const log_level& new_level\n    );\n    /*!\n        ensures\n            - for all loggers L (even loggers not yet constructed):\n                - #L.level() == new_level\n        throws\n            - std::bad_alloc\n    !*/\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    void print_default_logger_header (\n        std::ostream& out,\n        const std::string& logger_name,\n        const log_level& l,\n        const uint64 thread_id\n    );\n    /*!\n        requires\n            - is not called more than once at a time (i.e. is not called from multiple\n              threads at the same time).\n        ensures\n            - let MS be the number of milliseconds since program start.  \n            - prints a string to out in the form:  \"MS l.name [thread_id] logger_name:\"\n    !*/\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    class logger \n    {\n        /*!\n            INITIAL VALUE\n                - name() == a user supplied value given to the constructor\n                - The values of level(), output_streambuf(), logger_header(), and\n                  auto_flush() are inherited from the parent of this logger. \n\n            WHAT THIS OBJECT REPRESENTS\n                This object represents a logging output stream in the style of the log4j\n                logger available for Java.  \n                \n                Additionally, the logger doesn't perform any memory allocations during\n                each logging action.  It just writes directly into the user supplied output\n                stream.  Alternatively, if you use a logging output hook no memory allocations\n                are performed either.  Logging just goes straight into a memory buffer\n                which gets passed to the user supplied logging hook.\n\n            DEFAULTS\n                If the user hasn't specified values for the four inherited values level(),\n                output_streambuf(), logger_header(), or auto_flush() then the default\n                values will be used.  The defaults are as follows:\n                - level() == LERROR\n                - output_streambuf() == std::cout.rdbuf() (i.e. the default is to log\n                  to standard output).  \n                - logger_header() == print_default_logger_header\n                - auto_flush() == true\n            \n            THREAD SAFETY\n                All methods of this class are thread safe.  Note that it is safe to \n                chain calls to operator << such as:\n                    log << LINFO << \"message \" << variable << \" more message\";\n                The logger ensures that the entire statement executes atomically so the \n                message won't be broken up by other loggers in other threads.\n        !*/\n\n        class logger_stream\n        {\n        public:\n\n            bool is_enabled (\n            ) const;\n            /*!\n                ensures\n                    - returns true if this logger stream will print out items\n                      given to it by the << operator.  returns false otherwise.\n            !*/\n\n            template <typename T>\n            logger_stream& operator << (\n                const T& item\n            );\n            /*!\n                ensures\n                    - if (is_enabled()) then\n                        - writes item to this output stream\n                    - returns *this\n            !*/\n        };\n\n    public:\n\n        logger (  \n            const std::string& name_\n        );\n        /*!\n            requires\n                - name_ != \"\"\n            ensures                \n                - #*this is properly initialized\n                - #name() == name_\n            throws\n                - std::bad_alloc\n                - dlib::thread_error\n        !*/\n\n        virtual ~logger (\n        );\n        /*!\n            ensures\n                - any resources associated with *this have been released\n        !*/\n\n        const std::string& name (\n        ) const;\n        /*!\n            ensures\n                - returns the name of this logger\n        !*/\n\n        logger_stream operator << (\n            const log_level& l\n        ) const;\n        /*!\n            ensures\n                - if (l.priority >= level().priority) then\n                    - returns a logger_stream with is_enabled() == true.  I.e. this\n                      returned stream will write its output to the I/O destination \n                      used by this logger object.\n                - else\n                    - returns a logger stream with is_enabled() == false \n            throws\n                - std::bad_alloc\n        !*/\n\n        bool is_child_of (\n            const logger& log\n        ) const;\n        /*!\n            ensures\n                - if ( (name().find(log.name() + \".\") == 0) || (log.name() == name()) ) then\n                    - returns true\n                      (i.e. if log.name() + \".\" is a prefix of name() or if both *this and log\n                      have the same name then return true)\n                - else\n                    - returns false\n        !*/\n\n        const log_level level (\n        ) const;\n        /*!\n            ensures\n                - returns the current log level of this logger.\n        !*/\n\n        void set_level (\n            const log_level& new_level\n        );\n        /*!\n            ensures\n                - for all loggers L such that L.is_child_of(*this) == true:\n                    - #L.level() == new_level\n            throws\n                - std::bad_alloc\n        !*/\n\n        bool auto_flush (\n        );\n        /*!\n            ensures\n                - returns true if the output stream is flushed after every logged message.\n                  returns false otherwise.  (Note that flushing only does anything if\n                  the logger is set to use an output stream rather than a hook)\n        !*/\n\n        void set_auto_flush (\n            bool enabled\n        );\n        /*!\n            ensures\n                - for all loggers L such that L.is_child_of(*this) == true:\n                    - #L.auto_flush() == enabled \n            throws\n                - std::bad_alloc\n        !*/\n\n                \n        template <\n            typename T\n            >\n        void set_output_hook (\n            T& object,\n            void (T::*hook)(const std::string& logger_name, \n                            const log_level& l,\n                            const uint64 thread_id,\n                            const char* message_to_log)\n        );\n        /*!\n            requires\n                - hook is a valid pointer to a member function in T \n            ensures\n                - for all loggers L such that L.is_child_of(*this) == true:\n                    - #L.output_streambuf() == 0\n                    - #L will not send its log messages to an ostream object anymore.  Instead\n                      it will call the given hook member function (i.e. (object.*hook)(name,l,id,msg) )\n                      for each message that needs to be logged.\n                    - The arguments to the hook function have the following meanings:\n                        - logger_name == The name of the logger that is printing the log message.\n                        - l == The level of the logger that is printing the log message.\n                        - thread_id == A number that uniquely identifies the thread trying to log\n                          the message.  Note that this number is unique among all threads, past and\n                          present.  Also note that this id is not the same one returned by\n                          get_thread_id().\n                        - message_to_log == the actual text of the message the user is giving to\n                          the logger object to log.\n                    - All hook functions will also only be called one at a time. This means\n                      that hook functions don't need to be thread safe.\n        !*/\n\n        std::streambuf* output_streambuf (\n        );\n        /*!\n            ensures\n                - if (an output hook isn't set) then\n                    - returns the output stream buffer that this logger writes all\n                      messages to.\n                - else\n                    - returns 0\n        !*/\n\n        void set_output_stream (\n            std::ostream& out\n        );\n        /*!\n            ensures\n                - for all loggers L such that L.is_child_of(*this) == true:\n                    - #L.output_streambuf() == out.rdbuf() \n                    - Removes any previous output hook from L.  So now the logger\n                      L will write all its messages to the given output stream.\n            throws\n                - std::bad_alloc\n        !*/\n\n        print_header_type logger_header (\n        ) const;\n        /*!\n            ensures\n                - returns the function that is called to print the header information \n                  onto each logged message.  The arguments to the function have the following\n                  meanings:\n                    - out == The output stream this function writes the header to.\n                    - logger_name == The name of the logger that is printing the log message.\n                    - l == The level of the logger that is printing the log message.\n                    - thread_id == A number that uniquely identifies the thread trying to log\n                      the message.  Note that this number is unique among all threads, past and\n                      present.  Also note that this id is not the same one returned by\n                      get_thread_id().\n                - This logger_header function will also only be called once at a time. This means\n                  the logger_header function doesn't need to be thread safe.\n                - the logger_header function is only used when output_streambuf() != 0\n        !*/\n\n        void set_logger_header (\n            print_header_type print_header\n        );\n        /*!\n            ensures\n                - for all loggers L such that L.is_child_of(*this) == true:\n                    - #L.logger_header() == print_header \n            throws\n                - std::bad_alloc\n        !*/\n\n    private:\n\n        // restricted functions\n        logger(const logger&);        // copy constructor\n        logger& operator=(const logger&);    // assignment operator\n\n    };    \n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_LOGGER_KERNEl_ABSTRACT_\n\n"
  },
  {
    "path": "benchmarks/dlib/logger.h",
    "content": "// Copyright (C) 2006  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_LOGGEr_\n#define DLIB_LOGGEr_\n\n#include \"logger/logger_kernel_1.h\"\n#include \"logger/extra_logger_headers.h\"\n#include \"logger/logger_config_file.h\"\n\n#endif // DLIB_LOGGEr_ \n\n"
  },
  {
    "path": "benchmarks/dlib/map/map_kernel_1.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_MAP_KERNEl_1_\n#define DLIB_MAP_KERNEl_1_\n\n#include \"map_kernel_abstract.h\"\n#include \"../algs.h\"\n#include \"../interfaces/enumerable.h\"\n#include \"../interfaces/map_pair.h\"\n#include \"../interfaces/remover.h\"\n#include \"../serialize.h\"\n\nnamespace dlib\n{\n\n    template <\n        typename domain,\n        typename range,\n        typename bst_base,  \n        typename mem_manager = default_memory_manager \n        >\n    class map_kernel_1 : public enumerable<map_pair<domain,range> >,\n                         public asc_pair_remover<domain,range,typename bst_base::compare_type>\n    {\n\n        /*!\n            REQUIREMENTS ON BST_BASE\n                bst_base is instantiated with domain and range and\n                implements binary_search_tree/binary_search_tree_kernel_abstract.h\n\n            INITIAL VALUE\n                bst has its initial value\n\n            CONVENTION\n                bst.size() == the number of elements in the map and\n                the elements in map are stored in bst_base\n        !*/\n        \n        public:\n\n            typedef domain domain_type;\n            typedef range range_type;\n            typedef typename bst_base::compare_type compare_type;\n            typedef mem_manager mem_manager_type;\n\n            map_kernel_1(\n            ) \n            {}\n\n            virtual ~map_kernel_1(\n            )\n            {}\n\n            inline void clear(\n            );            \n\n            inline void add (\n                domain& d,\n                range& r\n            );\n\n            inline bool is_in_domain (\n                const domain& d\n            ) const;\n\n            inline void remove_any (\n                domain& d,\n                range& r\n            );\n\n            inline void remove (\n                const domain& d,\n                domain& d_copy,\n                range& r\n            );\n \n            inline void destroy (\n                const domain& d\n            );\n \n            inline range& operator[] (\n                const domain& d\n            );\n\n            inline const range& operator[] (\n                const domain& d\n            ) const;\n\n            inline void swap (\n                map_kernel_1& item\n            );\n\n            // functions from the enumerable interface\n            inline size_t size (\n            ) const;\n\n            inline bool at_start (\n            ) const;\n\n            inline void reset (\n            ) const;\n\n            inline bool current_element_valid (\n            ) const;\n\n            inline const map_pair<domain,range>& element (\n            ) const;\n\n            inline map_pair<domain,range>& element (\n            );\n\n            inline bool move_next (\n            ) const;\n\n\n        private:\n\n            bst_base bst;\n\n            // restricted functions\n            map_kernel_1(map_kernel_1&);      \n            map_kernel_1& operator= ( map_kernel_1&);\n    };\n\n\n    template <\n        typename domain,\n        typename range,\n        typename bst_base,\n        typename mem_manager\n        >\n    inline void swap (\n        map_kernel_1<domain,range,bst_base,mem_manager>& a, \n        map_kernel_1<domain,range,bst_base,mem_manager>& b \n    ) { a.swap(b); }   \n\n\n    template <\n        typename domain,\n        typename range,\n        typename bst_base,\n        typename mem_manager\n        >\n    void deserialize (\n        map_kernel_1<domain,range,bst_base,mem_manager>& item, \n        std::istream& in\n    )\n    {\n        try\n        {\n            item.clear();\n            unsigned long size;\n            deserialize(size,in);\n            domain d;\n            range r;\n            for (unsigned long i = 0; i < size; ++i)\n            {\n                deserialize(d,in);\n                deserialize(r,in);\n                item.add(d,r);\n            }\n        }\n        catch (serialization_error& e)\n        { \n            item.clear();\n            throw serialization_error(e.info + \"\\n   while deserializing object of type map_kernel_1\"); \n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // member function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename bst_base,\n        typename mem_manager\n        >\n    void map_kernel_1<domain,range,bst_base,mem_manager>::\n    clear (\n    )\n    {\n        bst.clear();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename bst_base,\n        typename mem_manager\n        >\n    void map_kernel_1<domain,range,bst_base,mem_manager>::\n    add(\n        domain& d,\n        range& r\n    )\n    {\n        // try to add pair to bst_base\n        bst.add(d,r); \n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename bst_base,\n        typename mem_manager\n        >\n    bool map_kernel_1<domain,range,bst_base,mem_manager>::\n    is_in_domain(\n        const domain& d\n    ) const\n    {\n        return (bst[d] != 0);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename bst_base,\n        typename mem_manager\n        >\n    void map_kernel_1<domain,range,bst_base,mem_manager>::\n    remove_any(\n        domain& d,\n        range& r\n    )\n    {\n        bst.remove_any(d,r);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename bst_base,\n        typename mem_manager\n        >\n    void map_kernel_1<domain,range,bst_base,mem_manager>::\n    remove (\n        const domain& d,\n        domain& d_copy,\n        range& r\n    )\n    {\n        bst.remove(d,d_copy,r);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename bst_base,\n        typename mem_manager\n        >\n    void map_kernel_1<domain,range,bst_base,mem_manager>::\n    destroy (\n        const domain& d\n    )\n    {\n        bst.destroy(d);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename bst_base,\n        typename mem_manager\n        >\n    range& map_kernel_1<domain,range,bst_base,mem_manager>::\n    operator[](\n        const domain& d\n    )\n    {\n        return *bst[d];\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename bst_base,\n        typename mem_manager\n        >\n    const range& map_kernel_1<domain,range,bst_base,mem_manager>::\n    operator[](\n        const domain& d\n    ) const\n    {\n        return *bst[d];\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename bst_base,\n        typename mem_manager\n        >\n    size_t map_kernel_1<domain,range,bst_base,mem_manager>::\n    size (\n    ) const\n    {\n        return bst.size();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename bst_base,\n        typename mem_manager\n        >\n    void map_kernel_1<domain,range,bst_base,mem_manager>::\n    swap (\n        map_kernel_1<domain,range,bst_base,mem_manager>& item\n    )\n    {\n        bst.swap(item.bst);\n    }\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // enumerable function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename bst_base,\n        typename mem_manager\n        >\n    bool map_kernel_1<domain,range,bst_base,mem_manager>::\n    at_start (\n    ) const\n    {\n        return bst.at_start();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename bst_base,\n        typename mem_manager\n        >\n    void map_kernel_1<domain,range,bst_base,mem_manager>::\n    reset (\n    ) const\n    {\n        bst.reset();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename bst_base,\n        typename mem_manager\n        >\n    bool map_kernel_1<domain,range,bst_base,mem_manager>::\n    current_element_valid (\n    ) const\n    {\n        return bst.current_element_valid();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename bst_base,\n        typename mem_manager\n        >\n    const map_pair<domain,range>& map_kernel_1<domain,range,bst_base,mem_manager>::\n    element (\n    ) const\n    {\n        return bst.element();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename bst_base,\n        typename mem_manager\n        >\n    map_pair<domain,range>& map_kernel_1<domain,range,bst_base,mem_manager>::\n    element (\n    )\n    {\n        return bst.element();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range,\n        typename bst_base,\n        typename mem_manager\n        >\n    bool map_kernel_1<domain,range,bst_base,mem_manager>::\n    move_next (\n    ) const\n    {\n        return bst.move_next();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_MAP_KERNEl_1_\n\n"
  },
  {
    "path": "benchmarks/dlib/map/map_kernel_abstract.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_MAP_KERNEl_ABSTRACT_\n#ifdef DLIB_MAP_KERNEl_ABSTRACT_\n\n#include \"../interfaces/map_pair.h\"\n#include \"../interfaces/enumerable.h\"\n#include \"../interfaces/remover.h\"\n#include \"../serialize.h\"\n#include \"../algs.h\"\n#include <functional>\n\nnamespace dlib\n{\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager = default_memory_manager,\n        typename compare = std::less<domain>\n        >\n    class map : public enumerable<map_pair<domain,range> >, \n                public asc_pair_remover<domain,range,compare>\n    {\n\n        /*!\n            REQUIREMENTS ON domain\n                domain must be comparable by compare where compare is a functor compatible with std::less and\n                domain is swappable by a global swap() and                \n                domain must have a default constructor\n\n            REQUIREMENTS ON range\n                range is swappable by a global swap() and\n                range must have a default constructor\n\n            REQUIREMENTS ON mem_manager\n                must be an implementation of memory_manager/memory_manager_kernel_abstract.h or\n                must be an implementation of memory_manager_global/memory_manager_global_kernel_abstract.h or\n                must be an implementation of memory_manager_stateless/memory_manager_stateless_kernel_abstract.h \n                mem_manager::type can be set to anything.\n\n            POINTERS AND REFERENCES TO INTERNAL DATA\n                swap(), is_in_domain(), and operator[] functions do not invalidate \n                pointers or references to internal data.\n                All other functions have no such guarantee.\n\n            INITIAL VALUE\n                size() == 0\n\n            ENUMERATION ORDER\n                The enumerator will iterate over the domain (and each associated\n                range element) elements in ascending order according to the compare functor. \n                (i.e. the elements are enumerated in sorted order)\n\n            WHAT THIS OBJECT REPRESENTS\n                map contains items of type domain and range\n\n                This object is similar an array.  It maps items of type domain on to \n                items of type range.   \n\n                Also note that unless specified otherwise, no member functions\n                of this object throw exceptions.\n\n                definition of equivalent:\n                a is equivalent to b if\n                a < b == false and\n                b < a == false\n        !*/\n        \n        public:\n\n            typedef domain domain_type;\n            typedef range range_type;\n            typedef compare compare_type;\n            typedef mem_manager mem_manager_type;\n\n            map(\n            );\n            /*!\n                ensures \n                    - #*this is properly initialized\n                throws\n                    - std::bad_alloc or any exception thrown by domain's or range's \n                      constructor.\n            !*/\n\n            virtual ~map(\n            ); \n            /*!\n                ensures\n                    - all memory associated with *this has been released\n            !*/\n\n            void clear(\n            );\n            /*!\n                ensures\n                    - #*this has its initial value\n                throws\n                    - std::bad_alloc or any exception thrown by domain's or range's \n                      constructor.\n                        if this exception is thrown then *this is unusable \n                        until clear() is called and succeeds\n            !*/\n\n            void add (\n                domain& d,\n                range& r\n            );\n            /*!\n                requires\n                    - &d != &r (i.e. d and r cannot be the same variable)\n                    - is_in_domain(d)  == false\n                ensures\n                    - #is_in_domain(d) == true\n                    - #operator[](d)   == r\n                    - #d and #r have initial values for their types \n                    - #size() == size() + 1\n                    - #at_start() == true\n                throws\n                    - std::bad_alloc or any exception thrown by domain's or range's \n                      constructor.\n                        if add() throws then it has no effect\n            !*/\n\n            bool is_in_domain (\n                const domain& d\n            ) const;\n            /*!\n                ensures\n                    - returns whether or not an element equivalent to d is in the \n                      domain of *this\n            !*/\n\n            void remove (\n                const domain& d,\n                domain& d_copy,\n                range& r\n            );\n            /*!\n                requires\n                    - &d != &r (i.e. d and r cannot be the same variable) \n                    - &d != &d_copy (i.e. d and d_copy cannot be the same variable) \n                    - &r != &d_copy (i.e. r and d_copy cannot be the same variable) \n                    - is_in_domain(d) == true\n                ensures\n                    - #is_in_domain(d) == false \n                    - #d_copy is equivalent to d \n                    - the element in the range of *this associated with #d_copy has been \n                      swapped into #r \n                    - #size() == size() - 1\n                    - #at_start() == true\n            !*/\n\n            void destroy (\n                const domain& d\n            );\n            /*!\n                requires\n                    - is_in_domain(d) == true\n                ensures\n                    - #is_in_domain(d) == false \n                    - #size() == size() - 1\n                    - #at_start() == true\n            !*/\n\n            range& operator[] (\n                const domain& d\n            );\n            /*!\n                requires\n                    - is_in_domain(d) == true\n                ensures\n                    - returns a non-const reference to the element in the range of *this \n                      associated with the element equivalent to d\n            !*/\n\n            const range& operator[] (\n                const domain& d\n            ) const;\n            /*!\n                requires\n                    - is_in_domain(d) == true\n                ensures\n                    - returns a const reference to the element in the range of *this \n                      associated with the element equivalent to d\n            !*/\n\n            void swap (\n                map& item\n            );\n            /*!\n                ensures\n                    - swaps *this and item\n            !*/ \n\n    \n        private:\n\n            // restricted functions\n            map(map&);        // copy constructor\n            map& operator=(map&);    // assignment operator\n    };\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    inline void swap (\n        map<domain,range,mem_manager,compare>& a, \n        map<domain,range,mem_manager,compare>& b \n    ) { a.swap(b); }   \n    /*!\n        provides a global swap function\n    !*/\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager,\n        typename compare\n        >\n    void deserialize (\n        map<domain,range,mem_manager,compare>& item, \n        std::istream& in\n    );   \n    /*!\n        provides deserialization support \n    !*/\n}\n\n#endif // DLIB_MAP_KERNEl_ABSTRACT_\n\n"
  },
  {
    "path": "benchmarks/dlib/map/map_kernel_c.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_MAP_KERNEl_C_\n#define DLIB_MAP_KERNEl_C_\n\n#include \"map_kernel_abstract.h\"\n#include \"../algs.h\"\n#include \"../assert.h\"\n#include \"../interfaces/map_pair.h\"\n\nnamespace dlib\n{\n\n    template <\n        typename map_base\n        >\n    class map_kernel_c : public map_base\n    {\n\n        typedef typename map_base::domain_type domain;\n        typedef typename map_base::range_type range;\n        \n        public:\n            void add (\n                domain& d,\n                range& r\n            );\n\n            void remove_any (\n                domain& d,\n                range& r\n            );\n\n            void remove (\n                const domain& d,\n                domain& d_copy,\n                range& r\n            );\n\n            void destroy (\n                const domain& d\n            );\n\n            range& operator[] (\n                const domain& d\n            );\n\n            const range& operator[] (\n                const domain& d\n            ) const;\n\n            const map_pair<domain,range>& element (\n            ) const\n            {\n                // make sure requires clause is not broken\n                DLIB_CASSERT(this->current_element_valid() == true,\n                    \"\\tconst map_pair<domain,range>& map::element\"\n                    << \"\\n\\tyou can't access the current element if it doesn't exist\"\n                    << \"\\n\\tthis: \" << this\n                    );\n\n                // call the real function\n                return map_base::element();\n            }\n\n            map_pair<domain,range>& element (\n            )\n            {\n                // make sure requires clause is not broken\n                DLIB_CASSERT(this->current_element_valid() == true,\n                    \"\\tmap_pair<domain,range>& map::element\"\n                    << \"\\n\\tyou can't access the current element if it doesn't exist\"\n                    << \"\\n\\tthis: \" << this\n                    );\n\n                // call the real function\n                return map_base::element();\n            }\n\n    };\n\n    template <\n        typename map_base\n        >\n    inline void swap (\n        map_kernel_c<map_base>& a, \n        map_kernel_c<map_base>& b \n    ) { a.swap(b); }  \n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // member function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename map_base\n        >\n    void map_kernel_c<map_base>::\n    add (\n        domain& d,\n        range& r\n    )\n    {\n        // make sure requires clause is not broken\n        DLIB_CASSERT( (!this->is_in_domain(d)) &&\n                (static_cast<void*>(&d) != static_cast<void*>(&r)),\n            \"\\tvoid map::add\"\n            << \"\\n\\tdomain element being added must not already be in the map\"\n            << \"\\n\\tand d and r must not be the same variable\"\n            << \"\\n\\tis_in_domain(d): \" << (this->is_in_domain(d) ? \"true\" : \"false\")\n            << \"\\n\\tthis: \" << this\n            << \"\\n\\t&d:   \" << static_cast<void*>(&d)\n            << \"\\n\\t&r:   \" << static_cast<void*>(&r)\n            );\n\n        // call the real function\n        map_base::add(d,r);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename map_base\n        >\n    void map_kernel_c<map_base>::\n    remove_any (\n        domain& d,\n        range& r\n    )\n    {\n        // make sure requires clause is not broken\n        DLIB_CASSERT( (this->size() > 0)  &&\n                (static_cast<void*>(&d) != static_cast<void*>(&r)),\n            \"\\tvoid map::remove_any\"\n            << \"\\n\\tsize() must be greater than zero if something is going to be removed\"\n            << \"\\n\\tand d and r must not be the same variable.\"\n            << \"\\n\\tsize(): \" << this->size() \n            << \"\\n\\tthis:   \" << this\n            << \"\\n\\t&d:     \" << static_cast<void*>(&d)\n            << \"\\n\\t&r:     \" << static_cast<void*>(&r)\n            );\n\n        // call the real function\n        map_base::remove_any(d,r);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename map_base\n        >\n    void map_kernel_c<map_base>::\n    remove (\n        const domain& d,\n        domain& d_copy,\n        range& r\n    )\n    {\n        // make sure requires clause is not broken\n        DLIB_CASSERT( (this->is_in_domain(d)) &&\n                (static_cast<const void*>(&d) != static_cast<void*>(&r)) &&\n                (static_cast<void*>(&r) != static_cast<void*>(&d_copy)) &&\n                (static_cast<const void*>(&d) != static_cast<void*>(&d_copy)),\n            \"\\tvoid map::remove\"\n            << \"\\n\\tcan't remove something that isn't in the map or if the paremeters actually\"\n            << \"\\n\\tare the same variable.  Either way can't remove.\"\n            << \"\\n\\tis_in_domain(d): \" << (this->is_in_domain(d) ? \"true\" : \"false\")\n            << \"\\n\\tthis:      \" << this\n            << \"\\n\\t&d:        \" << static_cast<const void*>(&d)\n            << \"\\n\\t&r:        \" << static_cast<void*>(&r)\n            << \"\\n\\t&d_copy:   \" << static_cast<void*>(&d_copy)\n            );\n\n        // call the real function\n        map_base::remove(d,d_copy,r);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename map_base\n        >\n    void map_kernel_c<map_base>::\n    destroy (\n        const domain& d\n    )\n    {\n        // make sure requires clause is not broken\n        DLIB_CASSERT(this->is_in_domain(d),\n            \"\\tvoid map::destroy\"\n            << \"\\n\\tcan't remove something that isn't in the map\"\n            << \"\\n\\tthis:      \" << this\n            << \"\\n\\t&d:        \" << static_cast<const void*>(&d)\n            );\n\n        // call the real function\n        map_base::destroy(d);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename map_base\n        >\n    typename map_base::range_type& map_kernel_c<map_base>::\n    operator[] (\n        const domain& d\n    )\n    {\n        // make sure requires clause is not broken\n        DLIB_CASSERT( this->is_in_domain(d),\n            \"\\trange& map::operator[]\"\n            << \"\\n\\td must be in the domain of the map\"\n            << \"\\n\\tthis: \" << this\n            );\n\n        // call the real function\n        return map_base::operator[](d);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename map_base\n        >\n    const typename map_base::range_type& map_kernel_c<map_base>::\n    operator[] (\n        const domain& d\n    ) const\n    {\n        // make sure requires clause is not broken\n        DLIB_CASSERT( this->is_in_domain(d),\n            \"\\tconst range& map::operator[]\"\n            << \"\\n\\td must be in the domain of the map\"\n            << \"\\n\\tthis: \" << this\n            );\n\n        // call the real function\n        return map_base::operator[](d);\n    }\n    \n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_MAP_KERNEl_C_\n\n"
  },
  {
    "path": "benchmarks/dlib/map.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_MAp_\n#define DLIB_MAp_\n\n#include \"map/map_kernel_1.h\"\n#include \"map/map_kernel_c.h\"\n\n#include \"binary_search_tree.h\"\n\n\n#include \"algs.h\"\n#include <functional>\n\n\nnamespace dlib\n{\n\n    template <\n        typename domain,\n        typename range,\n        typename mem_manager = default_memory_manager,\n        typename compare = std::less<domain>\n        >\n    class map\n    {\n        map() {}\n                \n\n        // a typedef for the binary search tree used by kernel_2\n        typedef typename binary_search_tree<domain,range,mem_manager,compare>::kernel_1a\n                binary_search_tree_1;\n\n        // a typedef for the binary search tree used by kernel_2\n        typedef typename binary_search_tree<domain,range,mem_manager,compare>::kernel_2a\n                binary_search_tree_2;\n\n    public:\n        \n        //----------- kernels ---------------\n\n        // kernel_1a        \n        typedef     map_kernel_1<domain,range,binary_search_tree_1,mem_manager>    \n                    kernel_1a;\n        typedef     map_kernel_c<kernel_1a >\n                    kernel_1a_c;   \n\n        // kernel_1b        \n        typedef     map_kernel_1<domain,range,binary_search_tree_2,mem_manager>    \n                    kernel_1b;\n        typedef     map_kernel_c<kernel_1b >\n                    kernel_1b_c;   \n\n\n    };\n}\n\n#endif // DLIB_MAp_\n\n"
  },
  {
    "path": "benchmarks/dlib/member_function_pointer/make_mfp.h",
    "content": "// Copyright (C) 2011  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_MAKE_MFp_H_\n#define DLIB_MAKE_MFp_H_\n\n#include \"member_function_pointer_kernel_1.h\"\n#include \"make_mfp_abstract.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    member_function_pointer<> make_mfp (\n        T& object,\n        void (T::*cb)()\n    )\n    {\n        member_function_pointer<> temp;\n        temp.set(object, cb);\n        return temp;\n    }\n\n    template <\n        typename T\n        >\n    member_function_pointer<> make_mfp (\n        const T& object,\n        void (T::*cb)()const\n    )\n    {\n        member_function_pointer<> temp;\n        temp.set(object, cb);\n        return temp;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename A1\n        >\n    member_function_pointer<A1> make_mfp (\n        T& object,\n        void (T::*cb)(A1)\n    )\n    {\n        member_function_pointer<A1> temp;\n        temp.set(object, cb);\n        return temp;\n    }\n\n    template <\n        typename T,\n        typename A1\n        >\n    member_function_pointer<A1> make_mfp (\n        const T& object,\n        void (T::*cb)(A1)const\n    )\n    {\n        member_function_pointer<A1> temp;\n        temp.set(object, cb);\n        return temp;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename A1,\n        typename A2\n        >\n    member_function_pointer<A1,A2> make_mfp (\n        T& object,\n        void (T::*cb)(A1,A2)\n    )\n    {\n        member_function_pointer<A1,A2> temp;\n        temp.set(object, cb);\n        return temp;\n    }\n\n    template <\n        typename T,\n        typename A1,\n        typename A2\n        >\n    member_function_pointer<A1,A2> make_mfp (\n        const T& object,\n        void (T::*cb)(A1,A2)const\n    )\n    {\n        member_function_pointer<A1,A2> temp;\n        temp.set(object, cb);\n        return temp;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename A1,\n        typename A2,\n        typename A3\n        >\n    member_function_pointer<A1,A2,A3> make_mfp (\n        T& object,\n        void (T::*cb)(A1,A2,A3)\n    )\n    {\n        member_function_pointer<A1,A2,A3> temp;\n        temp.set(object, cb);\n        return temp;\n    }\n\n    template <\n        typename T,\n        typename A1,\n        typename A2,\n        typename A3\n        >\n    member_function_pointer<A1,A2,A3> make_mfp (\n        const T& object,\n        void (T::*cb)(A1,A2,A3)const\n    )\n    {\n        member_function_pointer<A1,A2,A3> temp;\n        temp.set(object, cb);\n        return temp;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename A1,\n        typename A2,\n        typename A3,\n        typename A4\n        >\n    member_function_pointer<A1,A2,A3,A4> make_mfp (\n        T& object,\n        void (T::*cb)(A1,A2,A3,A4)\n    )\n    {\n        member_function_pointer<A1,A2,A3,A4> temp;\n        temp.set(object, cb);\n        return temp;\n    }\n\n    template <\n        typename T,\n        typename A1,\n        typename A2,\n        typename A3,\n        typename A4\n        >\n    member_function_pointer<A1,A2,A3,A4> make_mfp (\n        const T& object,\n        void (T::*cb)(A1,A2,A3,A4)const\n    )\n    {\n        member_function_pointer<A1,A2,A3,A4> temp;\n        temp.set(object, cb);\n        return temp;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_MAKE_MFp_H_\n\n\n\n"
  },
  {
    "path": "benchmarks/dlib/member_function_pointer/make_mfp_abstract.h",
    "content": "// Copyright (C) 2011  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_MAKE_MFp_ABSTRACT_\n#ifdef DLIB_MAKE_MFp_ABSTRACT_\n\n#include \"member_function_pointer_kernel_abstract.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    member_function_pointer<> make_mfp (\n        T& object,\n        void (T::*cb)()\n    );\n    /*!\n        requires\n            - cb == a valid member function pointer for class T\n        ensures\n            - returns a member function pointer object MFP such that:\n                - MFP.is_set() == true\n                - calls to MFP() will call (object.*cb)()\n    !*/\n\n    template <\n        typename T\n        >\n    member_function_pointer<> make_mfp (\n        const T& object,\n        void (T::*cb)()const\n    );\n    /*!\n        requires\n            - cb == a valid member function pointer for class T\n        ensures\n            - returns a member function pointer object MFP such that:\n                - MFP.is_set() == true\n                - calls to MFP() will call (object.*cb)()\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename A1\n        >\n    member_function_pointer<A1> make_mfp (\n        T& object,\n        void (T::*cb)(A1 a1)\n    );\n    /*!\n        requires\n            - cb == a valid member function pointer for class T\n        ensures\n            - returns a member function pointer object MFP such that:\n                - MFP.is_set() == true\n                - calls to MFP(a1) will call (object.*cb)(a1)\n    !*/\n\n    template <\n        typename T,\n        typename A1\n        >\n    member_function_pointer<A1> make_mfp (\n        const T& object,\n        void (T::*cb)(A1 a1)const\n    );\n    /*!\n        requires\n            - cb == a valid member function pointer for class T\n        ensures\n            - returns a member function pointer object MFP such that:\n                - MFP.is_set() == true\n                - calls to MFP(a1) will call (object.*cb)(a1)\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename A1,\n        typename A2\n        >\n    member_function_pointer<A1,A2> make_mfp (\n        T& object,\n        void (T::*cb)(A1 a1, A2 a2)\n    );\n    /*!\n        requires\n            - cb == a valid member function pointer for class T\n        ensures\n            - returns a member function pointer object MFP such that:\n                - MFP.is_set() == true\n                - calls to MFP(a1,a2) will call (object.*cb)(a1,a2)\n    !*/\n\n    template <\n        typename T,\n        typename A1,\n        typename A2\n        >\n    member_function_pointer<A1,A2> make_mfp (\n        const T& object,\n        void (T::*cb)(A1 a1, A2 a2)const\n    );\n    /*!\n        requires\n            - cb == a valid member function pointer for class T\n        ensures\n            - returns a member function pointer object MFP such that:\n                - MFP.is_set() == true\n                - calls to MFP(a1,a2) will call (object.*cb)(a1,a2)\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename A1,\n        typename A2,\n        typename A3\n        >\n    member_function_pointer<A1,A2,A3> make_mfp (\n        T& object,\n        void (T::*cb)(A1 a1, A2 a2, A3 a3)\n    );\n    /*!\n        requires\n            - cb == a valid member function pointer for class T\n        ensures\n            - returns a member function pointer object MFP such that:\n                - MFP.is_set() == true\n                - calls to MFP(a1,a2,a3) will call (object.*cb)(a1,a2,a3)\n    !*/\n\n    template <\n        typename T,\n        typename A1,\n        typename A2,\n        typename A3\n        >\n    member_function_pointer<A1,A2,A3> make_mfp (\n        const T& object,\n        void (T::*cb)(A1 a1, A2 a2, A3 a3)const\n    );\n    /*!\n        requires\n            - cb == a valid member function pointer for class T\n        ensures\n            - returns a member function pointer object MFP such that:\n                - MFP.is_set() == true\n                - calls to MFP(a1,a2,a3) will call (object.*cb)(a1,a2,a3)\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename A1,\n        typename A2,\n        typename A3,\n        typename A4\n        >\n    member_function_pointer<A1,A2,A3,A4> make_mfp (\n        T& object,\n        void (T::*cb)(A1 a1, A2 a2, A3 a3, A4 a4)\n    );\n    /*!\n        requires\n            - cb == a valid member function pointer for class T\n        ensures\n            - returns a member function pointer object MFP such that:\n                - MFP.is_set() == true\n                - calls to MFP(a1,a2,a3,a4) will call (object.*cb)(a1,a2,a3,a4)\n    !*/\n\n    template <\n        typename T,\n        typename A1,\n        typename A2,\n        typename A3,\n        typename A4\n        >\n    member_function_pointer<A1,A2,A3,A4> make_mfp (\n        const T& object,\n        void (T::*cb)(A1 a1, A2 a2, A3 a3, A4 a4)const\n    );\n    /*!\n        requires\n            - cb == a valid member function pointer for class T\n        ensures\n            - returns a member function pointer object MFP such that:\n                - MFP.is_set() == true\n                - calls to MFP(a1,a2,a3,a4) will call (object.*cb)(a1,a2,a3,a4)\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_MAKE_MFp_ABSTRACT_\n\n\n"
  },
  {
    "path": "benchmarks/dlib/member_function_pointer/member_function_pointer_kernel_1.h",
    "content": "// Copyright (C) 2005  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_MEMBER_FUNCTION_POINTER_KERNEl_1_\n#define DLIB_MEMBER_FUNCTION_POINTER_KERNEl_1_\n\n#include \"../algs.h\"\n#include \"member_function_pointer_kernel_abstract.h\"\n#include \"../enable_if.h\"\n#include <new>\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename PARAM1 = void,\n        typename PARAM2 = void,\n        typename PARAM3 = void,\n        typename PARAM4 = void\n        >\n    class member_function_pointer;\n\n// ----------------------------------------------------------------------------------------\n\n#define DLIB_MFP_SC DLIB_ASSERT(cb != 0,                                \\\n                   \"\\tvoid member_function_pointer::set\"                \\\n                   << \"\\n\\tthe member function pointer can't be null\"   \\\n                   << \"\\n\\tthis: \" << this   );\n\n\n#define DLIB_MFP_OC DLIB_ASSERT(this->is_set() == true ,                            \\\n                   \"\\tvoid member_function_pointer::operator()\"                     \\\n                   << \"\\n\\tYou must call set() before you can use this function\"    \\\n                   << \"\\n\\tthis: \" << this);\n\n// ----------------------------------------------------------------------------------------\n\n    template <unsigned long num_args>\n    class mfp_kernel_1_base_class\n    {\n        /*\n            All member function pointer classes inherit from this class.  This\n            is where most of the things in a member function pointer are defined.\n\n            The reason for the num_args template argument to this class is to prevent\n            any sort of implicit casting between derived member function pointer classes\n            that take different numbers of arguments.\n        */\n    protected:\n        enum mfp_type { mfp_nonconst, mfp_const, mfp_null};\n\n        class mp_base_base\n        {\n        public:\n            mp_base_base(void* ptr, mfp_type type_) : o(ptr),type(type_) {}\n            virtual ~mp_base_base(){}\n            virtual void clone(void* ptr) const = 0;\n            virtual bool is_same (const mp_base_base* item) const = 0;\n            bool is_set () const { return o!=0; }\n\n            void* const o;\n            const mfp_type type;\n        };\n\n        template <typename T>\n        class mp_null : public mp_base_base \n        {\n        public:\n            typedef void (T::*mfp_pointer_type)() ;\n\n            mp_null (void* , mfp_pointer_type ) : mp_base_base(0,mfp_null), callback(0) {}\n            mp_null () : mp_base_base(0,mfp_null), callback(0) {}\n\n            const mfp_pointer_type callback;\n        };\n\n        template <typename mp_impl>\n        class mp_impl_T : public mp_impl \n        {\n            /*\n                This class supplies the implementations clone() and is_same() for any\n                classes that inherit from mp_base_base.  It does this in a very\n                roundabout way...\n            */\n               \n        public:\n            typedef typename mp_impl::mfp_pointer_type mfp_pointer_type;\n\n            mp_impl_T() : mp_impl(0,0) {}\n            mp_impl_T(void* ptr, mfp_pointer_type cb) : mp_impl(ptr,cb) {}\n\n            template <unsigned long mem_size>\n            void safe_clone(stack_based_memory_block<mem_size>& buf)\n            {\n                // This is here just to validate the assumption that our block of memory we have made\n                // in mp_memory is the right size to store the data for this object.  If you\n                // get a compiler error on this line then email me :)\n                COMPILE_TIME_ASSERT(sizeof(mp_impl_T) <= mem_size);\n                clone(buf.get());\n            }\n\n            void clone   (void* ptr) const  { new(ptr) mp_impl_T(this->o,this->callback); }\n            bool is_same (const mp_base_base* item) const \n            {\n                if (item->o == 0 && this->o == 0)\n                {\n                    return true;\n                }\n                else if (item->o == this->o && this->type == item->type)\n                {\n                    const mp_impl* i = reinterpret_cast<const mp_impl*>(item);\n                    return (i->callback == this->callback);\n                }\n                return false;\n            }\n        };\n\n        // MSVC with the /vms option, we get C2287 since the dummy class requires virtual\n        // inheritance. Adding the __virtual_inheritance specifier explicitly fixes the issue,\n        // but then Clang-CL no longer accepts it.\n        #if defined(_MSC_VER) && !defined(__clang__)\n            #define DLIB_MSVC_INHERITANCE_VIRTUAL __virtual_inheritance\n        #else\n            #define DLIB_MSVC_INHERITANCE_VIRTUAL\n        #endif\n\n        struct dummy_base { virtual void nonnull() {}; virtual ~dummy_base(){}; int a; };\n        struct DLIB_MSVC_INHERITANCE_VIRTUAL dummy : virtual public dummy_base{ void nonnull() {}; };\n\n        #undef DLIB_MSVC_INHERITANCE_VIRTUAL\n\n        typedef mp_impl_T<mp_null<dummy> > mp_null_impl;\n    public:\n\n        mfp_kernel_1_base_class (\n            const mfp_kernel_1_base_class& item\n        ) { item.mp()->clone(mp_memory.get()); }\n\n        mfp_kernel_1_base_class (  \n        ) { mp_null_impl().safe_clone(mp_memory); }\n\n        bool operator == (\n            const mfp_kernel_1_base_class& item\n        ) const { return mp()->is_same(item.mp()); }\n\n        bool operator != (\n            const mfp_kernel_1_base_class& item\n        ) const { return !(*this == item); }\n\n        mfp_kernel_1_base_class& operator= (\n            const mfp_kernel_1_base_class& item\n        ) { mfp_kernel_1_base_class(item).swap(*this); return *this;  }\n\n        ~mfp_kernel_1_base_class (\n        ) { destroy_mp_memory(); }\n\n        void clear(\n        ) { mfp_kernel_1_base_class().swap(*this); }\n\n        bool is_set (\n        ) const { return mp()->is_set(); } \n\n    private:\n        typedef void (dummy::*safe_bool)();\n\n    public:\n        operator safe_bool () const { return is_set() ? &dummy::nonnull : 0; }\n        bool operator!() const { return !is_set(); }\n\n        void swap (\n            mfp_kernel_1_base_class& item\n        ) \n        {  \n            // make a temp copy of item\n            mfp_kernel_1_base_class temp(item);\n\n            // destory the stuff in item\n            item.destroy_mp_memory();\n            // copy *this into item\n            mp()->clone(item.mp_memory.get());\n\n            // destory the stuff in this \n            destroy_mp_memory();\n            // copy temp into *this\n            temp.mp()->clone(mp_memory.get());\n        }\n\n    protected:\n\n        // The reason for adding 1 here is because visual studio 2003 will sometimes\n        // try to compile this code with sizeof(mp_null_impl) == 0 (which is a bug in visual studio).\n        // Fortunately, no actual real instances of this template seem to end up with that screwed up\n        // value so everything works fine if we just add 1 so that this degenerate case doesn't cause\n        // trouble.  Note that we know it all works fine because safe_clone() checks the size of this\n        // memory block whenever the member function pointer is used.  \n        stack_based_memory_block<sizeof(mp_null_impl)+1> mp_memory;\n\n        void destroy_mp_memory (\n        )\n        {\n            // Honestly this probably doesn't even do anything but I'm putting\n            // it here just for good measure.\n            mp()->~mp_base_base();\n        }\n\n        mp_base_base*       mp ()       { return static_cast<mp_base_base*>(mp_memory.get()); }\n        const mp_base_base* mp () const { return static_cast<const mp_base_base*>(mp_memory.get()); }\n        \n    };\n\n// ----------------------------------------------------------------------------------------\n\n    template <>\n    class member_function_pointer<void,void,void,void> : public mfp_kernel_1_base_class<0>\n    {\n        class mp_base : public mp_base_base {\n        public:\n            mp_base(void* ptr, mfp_type type_) : mp_base_base(ptr,type_) {}\n            virtual void call() const = 0;\n        };\n\n        template <typename T>\n        class mp_impl : public mp_base {\n        public:\n            typedef void (T::*mfp_pointer_type)() ;\n            void call () const { (static_cast<T*>(this->o)->*callback)(); }\n\n            mp_impl      ( void* object, mfp_pointer_type cb) : mp_base(object, mfp_nonconst), callback(cb) {}\n            const mfp_pointer_type callback;\n        };\n\n        template <typename T>\n        class mp_impl_const : public mp_base {\n        public:\n            typedef void ((T::*mfp_pointer_type)()const);\n            void call () const  { (static_cast<const T*>(this->o)->*callback)(); }\n\n            mp_impl_const ( void* object, mfp_pointer_type cb) : mp_base(object,mfp_const), callback(cb) {}\n            const mfp_pointer_type callback;\n        };\n\n    public:\n        typedef void param1_type;\n        typedef void param2_type;\n        typedef void param3_type;\n        typedef void param4_type;\n\n        // These two typedefs are here for backwards compatibility with previous versions\n        // of dlib.\n        typedef member_function_pointer kernel_1a;\n        typedef member_function_pointer kernel_1a_c;\n\n\n        void operator() () const { DLIB_MFP_OC; static_cast<const mp_base*>(mp_memory.get())->call(); }\n\n        // the reason for putting disable_if on this function is that it avoids an overload\n        // resolution bug in visual studio.\n        template <typename T> typename disable_if<is_const_type<T>,void>::type \n        set(T& object, typename mp_impl<T>::mfp_pointer_type cb) \n        { DLIB_MFP_SC;  destroy_mp_memory(); mp_impl_T<mp_impl<T> >(&object,cb).safe_clone(mp_memory); }\n\n        template <typename T> void set(const T& object, typename mp_impl_const<T>::mfp_pointer_type cb) \n        { DLIB_MFP_SC;  destroy_mp_memory(); mp_impl_T<mp_impl_const<T> >((void*)&object,cb).safe_clone(mp_memory); }\n\n    };    \n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename PARAM1\n        >\n    class member_function_pointer<PARAM1,void,void,void> : public mfp_kernel_1_base_class<1>\n    {\n        class mp_base : public mp_base_base {\n        public:\n            mp_base(void* ptr, mfp_type type_) : mp_base_base(ptr,type_) {}\n            virtual void call(PARAM1) const = 0;\n        };\n\n        template <typename T>\n        class mp_impl : public mp_base {\n        public:\n            typedef void (T::*mfp_pointer_type)(PARAM1) ;\n            void call (PARAM1 p1) const { (static_cast<T*>(this->o)->*callback)(p1); }\n\n            mp_impl      ( void* object, mfp_pointer_type cb) : mp_base(object, mfp_nonconst), callback(cb) {}\n            const mfp_pointer_type callback;\n        };\n\n        template <typename T>\n        class mp_impl_const : public mp_base {\n        public:\n            typedef void ((T::*mfp_pointer_type)(PARAM1)const);\n            void call (PARAM1 p1) const  { (static_cast<const T*>(this->o)->*callback)(p1); }\n\n            mp_impl_const ( void* object, mfp_pointer_type cb) : mp_base(object,mfp_const), callback(cb) {}\n            const mfp_pointer_type callback;\n        };\n\n    public:\n        typedef PARAM1 param1_type;\n        typedef void param2_type;\n        typedef void param3_type;\n        typedef void param4_type;\n\n        // These two typedefs are here for backwards compatibility with previous versions\n        // of dlib.\n        typedef member_function_pointer kernel_1a;\n        typedef member_function_pointer kernel_1a_c;\n\n\n        void operator() (PARAM1 p1) const { DLIB_MFP_OC;  static_cast<const mp_base*>(mp_memory.get())->call(p1); }\n\n        // the reason for putting disable_if on this function is that it avoids an overload\n        // resolution bug in visual studio.\n        template <typename T> typename disable_if<is_const_type<T>,void>::type \n        set(T& object, typename mp_impl<T>::mfp_pointer_type cb) \n        { DLIB_MFP_SC;  destroy_mp_memory(); mp_impl_T<mp_impl<T> >(&object,cb).safe_clone(mp_memory); }\n\n        template <typename T> void set(const T& object, typename mp_impl_const<T>::mfp_pointer_type cb) \n        { DLIB_MFP_SC;  destroy_mp_memory(); mp_impl_T<mp_impl_const<T> >((void*)&object,cb).safe_clone(mp_memory); }\n\n    };    \n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename PARAM1,\n        typename PARAM2\n        >\n    class member_function_pointer<PARAM1,PARAM2,void,void> : public mfp_kernel_1_base_class<2>\n    {\n        class mp_base : public mp_base_base {\n        public:\n            mp_base(void* ptr, mfp_type type_) : mp_base_base(ptr,type_) {}\n            virtual void call(PARAM1,PARAM2) const = 0;\n        };\n\n        template <typename T>\n        class mp_impl : public mp_base {\n        public:\n            typedef void (T::*mfp_pointer_type)(PARAM1,PARAM2) ;\n            void call (PARAM1 p1, PARAM2 p2) const { (static_cast<T*>(this->o)->*callback)(p1,p2); }\n\n            mp_impl      ( void* object, mfp_pointer_type cb) : mp_base(object, mfp_nonconst), callback(cb) {}\n            const mfp_pointer_type callback;\n        };\n\n        template <typename T>\n        class mp_impl_const : public mp_base {\n        public:\n            typedef void ((T::*mfp_pointer_type)(PARAM1,PARAM2)const);\n            void call (PARAM1 p1, PARAM2 p2) const  { (static_cast<const T*>(this->o)->*callback)(p1,p2); }\n\n            mp_impl_const ( void* object, mfp_pointer_type cb) : mp_base(object,mfp_const), callback(cb) {}\n            const mfp_pointer_type callback;\n        };\n\n    public:\n        typedef PARAM1 param1_type;\n        typedef PARAM2 param2_type;\n        typedef void param3_type;\n        typedef void param4_type;\n\n        // These two typedefs are here for backwards compatibility with previous versions\n        // of dlib.\n        typedef member_function_pointer kernel_1a;\n        typedef member_function_pointer kernel_1a_c;\n\n        void operator() (PARAM1 p1, PARAM2 p2) const { DLIB_MFP_OC;  static_cast<const mp_base*>(mp_memory.get())->call(p1,p2); }\n\n        // the reason for putting disable_if on this function is that it avoids an overload\n        // resolution bug in visual studio.\n        template <typename T> typename disable_if<is_const_type<T>,void>::type \n        set(T& object, typename mp_impl<T>::mfp_pointer_type cb) \n        { DLIB_MFP_SC;  destroy_mp_memory(); mp_impl_T<mp_impl<T> >(&object,cb).safe_clone(mp_memory); }\n\n        template <typename T> void set(const T& object, typename mp_impl_const<T>::mfp_pointer_type cb) \n        { DLIB_MFP_SC;  destroy_mp_memory(); mp_impl_T<mp_impl_const<T> >((void*)&object,cb).safe_clone(mp_memory); }\n\n    };    \n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename PARAM1,\n        typename PARAM2,\n        typename PARAM3\n        >\n    class member_function_pointer<PARAM1,PARAM2,PARAM3,void> : public mfp_kernel_1_base_class<3>\n    {\n        class mp_base : public mp_base_base {\n        public:\n            mp_base(void* ptr, mfp_type type_) : mp_base_base(ptr,type_) {}\n            virtual void call(PARAM1,PARAM2,PARAM3) const = 0;\n        };\n\n        template <typename T>\n        class mp_impl : public mp_base {\n        public:\n            typedef void (T::*mfp_pointer_type)(PARAM1,PARAM2,PARAM3) ;\n            void call (PARAM1 p1, PARAM2 p2, PARAM3 p3) const { (static_cast<T*>(this->o)->*callback)(p1,p2,p3); }\n\n            mp_impl      ( void* object, mfp_pointer_type cb) : mp_base(object, mfp_nonconst), callback(cb) {}\n            const mfp_pointer_type callback;\n        };\n\n        template <typename T>\n        class mp_impl_const : public mp_base {\n        public:\n            typedef void ((T::*mfp_pointer_type)(PARAM1,PARAM2,PARAM3)const);\n            void call (PARAM1 p1, PARAM2 p2, PARAM3 p3) const  { (static_cast<const T*>(this->o)->*callback)(p1,p2,p3); }\n\n            mp_impl_const ( void* object, mfp_pointer_type cb) : mp_base(object,mfp_const), callback(cb) {}\n            const mfp_pointer_type callback;\n        };\n\n    public:\n        typedef PARAM1 param1_type;\n        typedef PARAM2 param2_type;\n        typedef PARAM3 param3_type;\n        typedef void param4_type;\n\n        // These two typedefs are here for backwards compatibility with previous versions\n        // of dlib.\n        typedef member_function_pointer kernel_1a;\n        typedef member_function_pointer kernel_1a_c;\n\n        void operator() (PARAM1 p1, PARAM2 p2, PARAM3 p3) const { DLIB_MFP_OC;  static_cast<const mp_base*>(mp_memory.get())->call(p1,p2,p3); }\n\n        // the reason for putting disable_if on this function is that it avoids an overload\n        // resolution bug in visual studio.\n        template <typename T> typename disable_if<is_const_type<T>,void>::type \n        set(T& object, typename mp_impl<T>::mfp_pointer_type cb) \n        { DLIB_MFP_SC;  destroy_mp_memory(); mp_impl_T<mp_impl<T> >(&object,cb).safe_clone(mp_memory); }\n\n        template <typename T> void set(const T& object, typename mp_impl_const<T>::mfp_pointer_type cb) \n        { DLIB_MFP_SC;  destroy_mp_memory(); mp_impl_T<mp_impl_const<T> >((void*)&object,cb).safe_clone(mp_memory); }\n\n    };    \n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename PARAM1,\n        typename PARAM2,\n        typename PARAM3,\n        typename PARAM4\n        >\n    class member_function_pointer : public mfp_kernel_1_base_class<4>\n    {\n        class mp_base : public mp_base_base {\n        public:\n            mp_base(void* ptr, mfp_type type_) : mp_base_base(ptr,type_) {}\n            virtual void call(PARAM1,PARAM2,PARAM3,PARAM4) const = 0;\n        };\n\n        template <typename T>\n        class mp_impl : public mp_base {\n        public:\n            typedef void (T::*mfp_pointer_type)(PARAM1,PARAM2,PARAM3, PARAM4) ;\n            void call (PARAM1 p1, PARAM2 p2, PARAM3 p3, PARAM4 p4) const { (static_cast<T*>(this->o)->*callback)(p1,p2,p3,p4); }\n\n            mp_impl      ( void* object, mfp_pointer_type cb) : mp_base(object, mfp_nonconst), callback(cb) {}\n            const mfp_pointer_type callback;\n        };\n\n        template <typename T>\n        class mp_impl_const : public mp_base {\n        public:\n            typedef void ((T::*mfp_pointer_type)(PARAM1,PARAM2,PARAM3,PARAM4)const);\n            void call (PARAM1 p1, PARAM2 p2, PARAM3 p3, PARAM4 p4) const  { (static_cast<const T*>(this->o)->*callback)(p1,p2,p3,p4); }\n\n            mp_impl_const ( void* object, mfp_pointer_type cb) : mp_base(object,mfp_const), callback(cb) {}\n            const mfp_pointer_type callback;\n        };\n\n    public:\n        typedef PARAM1 param1_type;\n        typedef PARAM2 param2_type;\n        typedef PARAM3 param3_type;\n        typedef PARAM4 param4_type;\n\n        // These two typedefs are here for backwards compatibility with previous versions\n        // of dlib.\n        typedef member_function_pointer kernel_1a;\n        typedef member_function_pointer kernel_1a_c;\n\n        void operator() (PARAM1 p1, PARAM2 p2, PARAM3 p3, PARAM4 p4) const \n        { DLIB_MFP_OC;  static_cast<const mp_base*>(mp_memory.get())->call(p1,p2,p3,p4); }\n\n        // the reason for putting disable_if on this function is that it avoids an overload\n        // resolution bug in visual studio.\n        template <typename T> typename disable_if<is_const_type<T>,void>::type \n        set(T& object, typename mp_impl<T>::mfp_pointer_type cb) \n        { DLIB_MFP_SC;  destroy_mp_memory(); mp_impl_T<mp_impl<T> >(&object,cb).safe_clone(mp_memory); }\n\n        template <typename T> void set(const T& object, typename mp_impl_const<T>::mfp_pointer_type cb) \n        { DLIB_MFP_SC;  destroy_mp_memory(); mp_impl_T<mp_impl_const<T> >((void*)&object,cb).safe_clone(mp_memory); }\n\n    };    \n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_MEMBER_FUNCTION_POINTER_KERNEl_1_\n\n"
  },
  {
    "path": "benchmarks/dlib/member_function_pointer/member_function_pointer_kernel_abstract.h",
    "content": "// Copyright (C) 2005  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_MEMBER_FUNCTION_POINTER_KERNEl_ABSTRACT_\n#ifdef DLIB_MEMBER_FUNCTION_POINTER_KERNEl_ABSTRACT_\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename PARAM1 = void,\n        typename PARAM2 = void,\n        typename PARAM3 = void,\n        typename PARAM4 = void\n        >\n    class member_function_pointer;\n\n// ----------------------------------------------------------------------------------------\n\n    template <>\n    class member_function_pointer<void,void,void,void>\n    {\n        /*!\n            INITIAL VALUE\n                is_set() == false\n\n            WHAT THIS OBJECT REPRESENTS\n                This object represents a member function pointer.  It is useful because\n                instances of this object can be created without needing to know the type\n                of object whose member function we will be calling.\n\n                There are five template specializations of this object.  The first \n                represents a pointer to a member function taking no parameters, the\n                second represents a pointer to a member function taking one parameter, \n                the third to one taking two parameters, and so on.\n\n                You specify the parameters to your member function pointer by filling in\n                the PARAM template parameters.  For example:\n\n                    To use a pointer to a function with no parameters you would say:\n                        member_function_pointer<> my_pointer;\n                    To use a pointer to a function that takes a single int you would say:\n                        member_function_pointer<int> my_pointer;\n                    To use a pointer to a function that takes an int and then a reference\n                    to a string you would say:\n                        member_function_pointer<int,string&> my_pointer;\n\n                Also note that the formal comments are only present for the first \n                template specialization.  They are all exactly the same except for the \n                number of parameters each takes in its member function pointer.\n        !*/\n\n    public:\n        typedef void param1_type;\n        typedef void param2_type;\n        typedef void param3_type;\n        typedef void param4_type;\n\n        member_function_pointer (  \n        );\n        /*!\n            ensures                \n                - #*this is properly initialized\n        !*/\n\n        member_function_pointer(\n            const member_function_pointer& item\n        );\n        /*!\n            ensures\n                - *this == item\n        !*/\n\n        ~member_function_pointer (\n        );\n        /*!\n            ensures\n                - any resources associated with *this have been released\n        !*/\n\n        member_function_pointer& operator=(\n            const member_function_pointer& item\n        );\n        /*!\n            ensures\n                - *this == item\n        !*/\n\n        bool operator == (\n            const member_function_pointer& item\n        ) const;\n        /*!\n            ensures\n                - if (is_set() == false && item.is_set() == false) then\n                    - returns true\n                - else if (both *this and item point to the same member function\n                  in the same object instance) then\n                    - returns true\n                - else\n                    - returns false\n        !*/\n\n        bool operator != (\n            const member_function_pointer& item\n        ) const;\n        /*!\n            ensures\n                - returns !(*this == item)\n        !*/\n\n        void clear(\n        );\n        /*!\n            ensures\n                - #*this has its initial value\n        !*/\n\n        bool is_set (\n        ) const;\n        /*!\n            ensures\n                - if (this->set() has been called) then\n                    - returns true\n                - else\n                    - returns false\n        !*/\n\n        template <\n            typename T\n            >\n        void set (\n            T& object,\n            void (T::*cb)()\n        );\n        /*!\n            requires\n                - cb == a valid member function pointer for class T\n            ensures\n                - #is_set() == true\n                - calls to this->operator() will call (object.*cb)()\n        !*/\n\n        template <\n            typename T\n            >\n        void set (\n            const T& object,\n            void (T::*cb)()const\n        );\n        /*!\n            requires\n                - cb == a valid member function pointer for class T\n            ensures\n                - #is_set() == true\n                - calls to this->operator() will call (object.*cb)()\n        !*/\n\n        operator some_undefined_pointer_type (\n        ) const;\n        /*!\n            ensures\n                - if (is_set()) then\n                    - returns a non 0 value\n                - else\n                    - returns a 0 value\n        !*/\n\n        bool operator! (\n        ) const;\n        /*!\n            ensures\n                - returns !is_set()\n        !*/\n\n        void operator () (\n        ) const;\n        /*!\n            requires\n                - is_set() == true\n            ensures\n                - calls the member function on the object specified by the last \n                  call to this->set()\n            throws\n                - any exception thrown by the member function specified by\n                  the previous call to this->set().\n                    If any of these exceptions are thrown then the call to this \n                    function will have no effect on *this.                  \n        !*/\n\n        void swap (\n            member_function_pointer& item\n        );\n        /*!\n            ensures\n                - swaps *this and item\n        !*/ \n\n    };    \n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename PARAM1\n        >\n    class member_function_pointer<PARAM1,void,void,void>\n    {\n    public:\n        typedef PARAM1 param1_type;\n        typedef void param2_type;\n        typedef void param3_type;\n        typedef void param4_type;\n\n        member_function_pointer ();\n\n        member_function_pointer(\n            const member_function_pointer& item\n        );\n\n        ~member_function_pointer (\n        );\n\n        member_function_pointer& operator=(\n            const member_function_pointer& item\n        );\n\n        bool operator == (\n            const member_function_pointer& item\n        ) const;\n\n        bool operator != (\n            const member_function_pointer& item\n        ) const;\n\n        void clear();\n\n        bool is_set () const;\n\n        template <typename T>\n        void set (\n            T& object,\n            void (T::*cb)(PARAM1)\n        );\n\n        template <typename T>\n        void set (\n            const T& object,\n            void (T::*cb)(PARAM1)const\n        );\n\n        operator some_undefined_pointer_type (\n        ) const;\n\n        bool operator! (\n        ) const;\n\n        void operator () (\n            PARAM1 param1\n        ) const;\n\n        void swap (\n            member_function_pointer& item\n        );\n\n    };    \n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename PARAM1,\n        typename PARAM2\n        >\n    class member_function_pointer<PARAM1,PARAM2,void,void>\n    {\n    public:\n        typedef PARAM1 param1_type;\n        typedef PARAM2 param2_type;\n        typedef void param3_type;\n        typedef void param4_type;\n\n        member_function_pointer ();\n\n        member_function_pointer(\n            const member_function_pointer& item\n        );\n\n        ~member_function_pointer (\n        );\n\n        member_function_pointer& operator=(\n            const member_function_pointer& item\n        );\n\n        bool operator == (\n            const member_function_pointer& item\n        ) const;\n\n        bool operator != (\n            const member_function_pointer& item\n        ) const;\n\n        void clear();\n\n        bool is_set () const;\n\n        template <typename T>\n        void set (\n            T& object,\n            void (T::*cb)(PARAM1,PARAM2)\n        );\n\n        template <typename T>\n        void set (\n            const T& object,\n            void (T::*cb)(PARAM1,PARAM2)const\n        );\n\n        operator some_undefined_pointer_type (\n        ) const;\n\n        bool operator! (\n        ) const;\n\n        void operator () (\n            PARAM1 param1,\n            PARAM2 param2\n        ) const;\n\n        void swap (\n            member_function_pointer& item\n        );\n\n    };    \n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename PARAM1,\n        typename PARAM2,\n        typename PARAM3\n        >\n    class member_function_pointer<PARAM1,PARAM2,PARAM3,void>\n    {\n    public:\n        typedef PARAM1 param1_type;\n        typedef PARAM2 param2_type;\n        typedef PARAM3 param3_type;\n        typedef void param4_type;\n\n        member_function_pointer ();\n\n        member_function_pointer(\n            const member_function_pointer& item\n        );\n\n        ~member_function_pointer (\n        );\n\n        member_function_pointer& operator=(\n            const member_function_pointer& item\n        );\n\n        bool operator == (\n            const member_function_pointer& item\n        ) const;\n\n        bool operator != (\n            const member_function_pointer& item\n        ) const;\n\n        void clear();\n\n        bool is_set () const;\n\n        template <typename T>\n        void set (\n            T& object,\n            void (T::*cb)(PARAM1,PARAM2,PARAM3)\n        );\n\n        template <typename T>\n        void set (\n            const T& object,\n            void (T::*cb)(PARAM1,PARAM2,PARAM3)const\n        );\n\n        operator some_undefined_pointer_type (\n        ) const;\n\n        bool operator! (\n        ) const;\n\n        void operator () (\n            PARAM1 param1,\n            PARAM2 param2,\n            PARAM2 param3\n        ) const;\n\n        void swap (\n            member_function_pointer& item\n        );\n\n    };    \n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename PARAM1,\n        typename PARAM2,\n        typename PARAM3,\n        typename PARAM4\n        >\n    class member_function_pointer\n    {\n    public:\n        typedef PARAM1 param1_type;\n        typedef PARAM2 param2_type;\n        typedef PARAM3 param3_type;\n        typedef PARAM4 param4_type;\n\n        member_function_pointer ();\n\n        member_function_pointer(\n            const member_function_pointer& item\n        );\n\n        ~member_function_pointer (\n        );\n\n        member_function_pointer& operator=(\n            const member_function_pointer& item\n        );\n\n        bool operator == (\n            const member_function_pointer& item\n        ) const;\n\n        bool operator != (\n            const member_function_pointer& item\n        ) const;\n\n        void clear();\n\n        bool is_set () const;\n\n        template <typename T>\n        void set (\n            T& object,\n            void (T::*cb)(PARAM1,PARAM2,PARAM3,PARAM4)\n        );\n\n        template <typename T>\n        void set (\n            const T& object,\n            void (T::*cb)(PARAM1,PARAM2,PARAM3,PARAM4)const\n        );\n\n        operator some_undefined_pointer_type (\n        ) const;\n\n        bool operator! (\n        ) const;\n\n        void operator () (\n            PARAM1 param1,\n            PARAM2 param2,\n            PARAM2 param3,\n            PARAM2 param4\n        ) const;\n\n        void swap (\n            member_function_pointer& item\n        );\n\n    };    \n\n// ----------------------------------------------------------------------------------------\n\n\n}\n\n#endif // DLIB_MEMBER_FUNCTION_POINTER_KERNEl_ABSTRACT_\n\n"
  },
  {
    "path": "benchmarks/dlib/member_function_pointer.h",
    "content": "// Copyright (C) 2005  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_MEMBER_FUNCTION_POINTEr_\n#define DLIB_MEMBER_FUNCTION_POINTEr_\n\n#include \"member_function_pointer/member_function_pointer_kernel_1.h\"\n#include \"member_function_pointer/make_mfp.h\"\n\n#endif // DLIB_MEMBER_FUNCTION_POINTEr_ \n\n"
  },
  {
    "path": "benchmarks/dlib/memory_manager/memory_manager_kernel_1.h",
    "content": "// Copyright (C) 2004  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_MEMORY_MANAGER_KERNEl_1_\n#define DLIB_MEMORY_MANAGER_KERNEl_1_\n\n#include \"../algs.h\"\n#include \"memory_manager_kernel_abstract.h\"\n#include \"../assert.h\"\n#include <new>\n\n\nnamespace dlib\n{\n\n    template <\n        typename T,\n        size_t max_pool_size\n        >\n    class memory_manager_kernel_1\n    {\n        /*!            \n            INITIAL VALUE\n                allocations == 0\n                next == 0\n                pool_size == 0\n\n            REQUIREMENTS ON max_pool_size \n                max_pool_size is the maximum number of nodes we will keep in our linked list at once.\n                So you can put any value in for this argument.\n\n            CONVENTION\n                This memory manager implementation allocates T objects one at a time when there are\n                allocation requests.  Then when there is a deallocate request the returning T object\n                is place into a list of free blocks if that list has less than max_pool_size \n                blocks in it.  subsequent allocation requests will be serviced by drawing from the\n                free list whenever it isn't empty.\n\n\n                allocations == get_number_of_allocations()\n\n                - if (next != 0) then\n                    - next == the next pointer to return from allocate()\n                      and next == pointer to the first node in a linked list.  each node\n                      is one item in the memory pool.    \n                    - the last node in the linked list has next set to 0\n                    - pool_size == the number of nodes in the linked list\n                    - pool_size <= max_pool_size\n                - else\n                    - we need to call new to get the next pointer to return from allocate()\n\n        !*/\n\n        union node\n        {\n            node* next;\n            char item[sizeof(T)];\n        };\n\n    public:\n\n        typedef T type;\n\n        template <typename U>\n        struct rebind {\n            typedef memory_manager_kernel_1<U,max_pool_size> other;\n        };\n\n\n        memory_manager_kernel_1(\n        ) :\n            allocations(0),\n            next(0),\n            pool_size(0)\n        {\n        }\n\n        virtual ~memory_manager_kernel_1(\n        )\n        {\n\n            while (next != 0)\n            {\n                node* temp = next;\n                next = next->next;\n                ::operator delete ( static_cast<void*>(temp));\n            }\n        }\n\n        size_t get_number_of_allocations (\n        ) const { return allocations; }\n\n        T* allocate_array (\n            size_t size\n        )\n        {\n            T* temp = new T[size];\n            ++allocations;\n            return temp;\n        }\n\n        void deallocate_array (\n            T* item\n        )\n        {\n            --allocations;\n            delete [] item;\n        }\n\n        T* allocate (\n        ) \n        {              \n            T* temp;\n            if (next != 0)\n            {\n                temp = reinterpret_cast<T*>(next);\n\n                node* n = next->next;\n\n                try\n                {\n                    // construct this new T object with placement new.\n                    new (static_cast<void*>(temp))T();\n                }\n                catch (...)\n                {\n                    next->next = n;\n                    throw;\n                }\n\n                next = n;\n\n                --pool_size;\n            }\n            else\n            {\n                temp = static_cast<T*>(::operator new(sizeof(node)));\n                try\n                {\n                    // construct this new T object with placement new.\n                    new (static_cast<void*>(temp))T();\n                }\n                catch (...)\n                {\n                    // construction of the new object threw so delete the block of memory\n                    ::operator delete ( static_cast<void*>(temp));\n                    throw;\n                }\n            }\n\n            ++allocations;\n            return temp;\n        }\n\n        void deallocate (\n            T* item\n        ) \n        { \n            --allocations;  \n            item->~T();\n\n            if (pool_size >= max_pool_size)\n            {\n                ::operator delete ( static_cast<void*>(item));\n                return;\n            }\n\n            // add this memory chunk into our linked list.\n            node* temp = reinterpret_cast<node*>(item);\n            temp->next = next;\n            next = temp;                \n            ++pool_size;\n        }\n\n        void swap (\n            memory_manager_kernel_1& item\n        ) \n        { \n            exchange(allocations,item.allocations); \n            exchange(next,item.next); \n            exchange(pool_size,item.pool_size);\n        }\n\n    private:\n\n        // data members\n        size_t allocations;\n        node* next;\n        size_t pool_size;\n\n        // restricted functions\n        memory_manager_kernel_1(memory_manager_kernel_1&);        // copy constructor\n        memory_manager_kernel_1& operator=(memory_manager_kernel_1&);    // assignment operator\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    class memory_manager_kernel_1<T,0>\n    {\n        /*!            \n            INITIAL VALUE\n                allocations == 0\n\n            CONVENTION\n                This memory manager just calls new and delete directly so it doesn't \n                really do anything.\n\n                allocations == get_number_of_allocations()\n        !*/\n\n    public:\n\n        typedef T type;\n\n        template <typename U>\n        struct rebind {\n            typedef memory_manager_kernel_1<U,0> other;\n        };\n\n\n        memory_manager_kernel_1(\n        ) :\n            allocations(0)\n        {\n        }\n\n        virtual ~memory_manager_kernel_1(\n        )\n        {\n        }\n\n        size_t get_number_of_allocations (\n        ) const { return allocations; }\n\n        T* allocate_array (\n            size_t size\n        )\n        {\n            T* temp = new T[size];\n            ++allocations;\n            return temp;\n        }\n\n        void deallocate_array (\n            T* item\n        )\n        {\n            --allocations;\n            delete [] item;\n        }\n\n        T* allocate (\n        ) \n        {              \n            T* temp = new T;\n            ++allocations;\n            return temp;\n        }\n\n        void deallocate (\n            T* item\n        ) \n        { \n            delete item;\n            --allocations;  \n        }\n\n        void swap (\n            memory_manager_kernel_1& item\n        ) \n        { \n            exchange(allocations,item.allocations); \n        }\n\n    private:\n\n        // data members\n        size_t allocations;\n\n        // restricted functions\n        memory_manager_kernel_1(memory_manager_kernel_1&);        // copy constructor\n        memory_manager_kernel_1& operator=(memory_manager_kernel_1&);    // assignment operator\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        size_t max_pool_size\n        >\n    inline void swap (\n        memory_manager_kernel_1<T,max_pool_size>& a, \n        memory_manager_kernel_1<T,max_pool_size>& b \n    ) { a.swap(b); }   \n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_MEMORY_MANAGER_KERNEl_1_\n\n\n\n"
  },
  {
    "path": "benchmarks/dlib/memory_manager/memory_manager_kernel_2.h",
    "content": "// Copyright (C) 2004  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_MEMORY_MANAGER_KERNEl_2_\n#define DLIB_MEMORY_MANAGER_KERNEl_2_\n\n#include \"../algs.h\"\n#include \"memory_manager_kernel_abstract.h\"\n#include \"../assert.h\"\n#include <new>\n\nnamespace dlib\n{\n\n    template <\n        typename T,\n        size_t chunk_size\n        >\n    class memory_manager_kernel_2\n    {\n        /*!            \n            INITIAL VALUE\n                allocations == 0\n                next == 0\n                first_chunk == 0\n\n            REQUIREMENTS ON chunk_size\n                chunk_size is the number of items of type T we will allocate at a time. so\n                it must be > 0.\n\n            CONVENTION\n                This memory manager implementation allocates memory in blocks of chunk_size*sizeof(T)\n                bytes.  All the sizeof(T) subblocks are kept in a linked list of free memory blocks\n                and are given out whenever an allocation request occurs.  Also, memory is not freed\n                until this object is destructed.  \n\n                Note that array allocations are not memory managed.\n                \n\n\n                allocations == get_number_of_allocations()\n\n                - if (next != 0) then\n                    - next == the next pointer to return from allocate()\n                      and next == pointer to the first node in a linked list.  each node\n                      is one item in the memory pool.    \n                    - the last node in the linked list has next set to 0\n                - else\n                    - we need to call new to get the next pointer to return from allocate()\n\n\n                - if (first_chunk != 0) then\n                    - first_chunk == the first node in a linked list that contains pointers \n                      to all the chunks we have ever allocated.  The last link in the list\n                      has its next pointer set to 0.\n        !*/\n\n        union node\n        {\n            node* next;\n            char item[sizeof(T)];\n        };\n\n        struct chunk_node\n        {\n            node* chunk;\n            chunk_node* next;\n        };\n\n    public:\n\n        typedef T type;\n\n        template <typename U>\n        struct rebind {\n            typedef memory_manager_kernel_2<U,chunk_size> other;\n        };\n\n\n        memory_manager_kernel_2(\n        ) :\n            allocations(0),\n            next(0),\n            first_chunk(0)\n        {\n            // You FOOL!  You can't have a zero chunk_size.\n            COMPILE_TIME_ASSERT(chunk_size > 0);\n        }\n\n        virtual ~memory_manager_kernel_2(\n        )\n        {\n            if (allocations == 0)\n            {\n                while (first_chunk != 0)\n                {\n                    chunk_node* temp = first_chunk;\n                    first_chunk = first_chunk->next;\n                    // delete the memory chunk \n                    ::operator delete ( static_cast<void*>(temp->chunk));\n                    // delete the chunk_node\n                    delete temp;\n                }\n            }\n        }\n\n        size_t get_number_of_allocations (\n        ) const { return allocations; }\n\n        T* allocate_array (\n            size_t size\n        )\n        {\n            T* temp = new T[size];\n            ++allocations;\n            return temp;\n        }\n\n        void deallocate_array (\n            T* item\n        )\n        {\n            --allocations;\n            delete [] item;\n        }\n\n        T* allocate (\n        ) \n        {              \n            T* temp = 0;\n            if (next != 0)\n            {\n                temp = reinterpret_cast<T*>(next);\n                node* n = next->next;\n\n                try\n                {\n                    // construct this new T object with placement new.\n                    new (static_cast<void*>(temp))T();\n                }\n                catch (...)\n                {\n                    next->next = n;\n                    throw;\n                }\n\n                next = n;\n            }\n            else\n            {\n                // the linked list is empty so we need to allocate some more memory\n                node* block = 0;\n                block = static_cast<node*>(::operator new (sizeof(node)*chunk_size));\n\n                // the first part of this block can be our new object\n                temp = reinterpret_cast<T*>(block);\n\n                try\n                {\n                    // construct this new T object with placement new.\n                    new (static_cast<void*>(temp))T();\n                }\n                catch (...)\n                {\n                    // construction of the new object threw so delete the block of memory\n                    ::operator delete ( static_cast<void*>(block));\n                    throw;\n                }\n\n                // allocate a new chunk_node\n                chunk_node* chunk;\n                try {chunk = new chunk_node; }\n                catch (...) \n                { \n                    temp->~T();\n                    ::operator delete ( static_cast<void*>(block));\n                    throw;\n                }\n\n                // add this block into the chunk list\n                chunk->chunk = block;\n                chunk->next = first_chunk;\n                first_chunk = chunk;\n\n\n                ++block;\n                // now add the rest of the block into the linked list of free nodes.\n                for (size_t i = 0; i < chunk_size-1; ++i)\n                {\n                    block->next = next;\n                    next = block;\n                    ++block;\n                }\n\n            }\n\n\n            ++allocations;\n            return temp;\n        }\n\n        void deallocate (\n            T* item\n        ) \n        { \n            --allocations;  \n            item->~T();\n\n            // add this memory into our linked list.\n            node* temp = reinterpret_cast<node*>(item);\n            temp->next = next;\n            next = temp;                \n        }\n\n        void swap (\n            memory_manager_kernel_2& item\n        ) \n        { \n            exchange(allocations,item.allocations); \n            exchange(next,item.next); \n            exchange(first_chunk,item.first_chunk);\n        }\n\n    private:\n\n        // data members\n        size_t allocations;\n        node* next;\n\n        chunk_node* first_chunk;\n\n\n\n\n        // restricted functions\n        memory_manager_kernel_2(memory_manager_kernel_2&);        // copy constructor\n        memory_manager_kernel_2& operator=(memory_manager_kernel_2&);    // assignment operator\n    };\n\n    template <\n        typename T,\n        size_t chunk_size\n        >\n    inline void swap (\n        memory_manager_kernel_2<T,chunk_size>& a, \n        memory_manager_kernel_2<T,chunk_size>& b \n    ) { a.swap(b); }   \n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_MEMORY_MANAGER_KERNEl_2_\n\n"
  },
  {
    "path": "benchmarks/dlib/memory_manager/memory_manager_kernel_3.h",
    "content": "// Copyright (C) 2004  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_MEMORY_MANAGER_KERNEl_3_\n#define DLIB_MEMORY_MANAGER_KERNEl_3_\n\n#include \"../algs.h\"\n#include \"memory_manager_kernel_abstract.h\"\n#include \"../assert.h\"\n#include <new>\n#include \"memory_manager_kernel_2.h\"\n#include \"../binary_search_tree/binary_search_tree_kernel_2.h\"\n\n\nnamespace dlib\n{\n\n    template <\n        typename T,\n        size_t chunk_size\n        >\n    class memory_manager_kernel_3\n    {\n        /*!            \n            INITIAL VALUE\n                allocations == 0\n                next == 0\n                first_chunk == 0\n                bst_of_arrays == 0\n\n            REQUIREMENTS ON chunk_size\n                chunk_size is the number of items of type T we will allocate at a time. so\n                it must be > 0.\n\n            CONVENTION\n                This memory manager implementation allocates memory in blocks of chunk_size*sizeof(T)\n                bytes.  All the sizeof(T) subblocks are kept in a linked list of free memory blocks\n                and are given out whenever an allocation request occurs.  Also, memory is not freed\n                until this object is destructed.  \n                \n\n\n                allocations == get_number_of_allocations()\n\n                - if (next != 0) then\n                    - next == the next pointer to return from allocate()\n                      and next == pointer to the first node in a linked list.  each node\n                      is one item in the memory pool.    \n                    - the last node in the linked list has next set to 0\n                - else\n                    - we need to call new to get the next pointer to return from allocate()\n\n                - if (arrays != 0) then\n                    - someone has called allocate_array()\n                    - (*arrays)[size] == an array of size bytes of memory  \n\n                - if (first_chunk != 0) then\n                    - first_chunk == the first node in a linked list that contains pointers \n                      to all the chunks we have ever allocated.  The last link in the list\n                      has its next pointer set to 0.\n        !*/\n\n        union node\n        {\n            node* next;\n            char item[sizeof(T)];\n        };\n\n        struct chunk_node\n        {\n            node* chunk;\n            chunk_node* next;\n        };\n\n\n        typedef binary_search_tree_kernel_2<\n            size_t,\n            char*,\n            memory_manager_kernel_2<char,5>\n            > bst_of_arrays; \n\n    public:\n\n        typedef T type;\n\n        template <typename U>\n        struct rebind {\n            typedef memory_manager_kernel_3<U,chunk_size> other;\n        };\n\n\n        memory_manager_kernel_3(\n        ) :\n            allocations(0),\n            next(0),\n            first_chunk(0),\n            arrays(0)\n        {\n            // You FOOL!  You can't have a zero chunk_size.\n            COMPILE_TIME_ASSERT(chunk_size > 0);\n        }\n\n        virtual ~memory_manager_kernel_3(\n        )\n        {\n            if (allocations == 0)\n            {\n                while (first_chunk != 0)\n                {\n                    chunk_node* temp = first_chunk;\n                    first_chunk = first_chunk->next;\n                    // delete the memory chunk \n                    ::operator delete ( static_cast<void*>(temp->chunk));\n                    // delete the chunk_node\n                    delete temp;\n                }\n            }\n\n            if (arrays)\n            {\n                arrays->reset();\n                while (arrays->move_next())\n                {\n                    ::operator delete (arrays->element().value());\n                }\n                delete arrays;\n            }\n        }\n\n        size_t get_number_of_allocations (\n        ) const { return allocations; }\n\n        T* allocate_array (\n            size_t size\n        )\n        {\n            size_t block_size = sizeof(T)*size + sizeof(size_t)*2;\n\n            // make sure we have initialized the arrays object.\n            if (arrays == 0)\n            {\n                arrays = new bst_of_arrays;\n            }\n\n            char* temp;\n\n            // see if we have a suitable block of memory already.\n            arrays->position_enumerator(block_size);\n            if (arrays->current_element_valid())\n            {\n                // we have a suitable block of memory already so use that one.\n                arrays->remove_current_element(block_size,temp); \n            }\n            else\n            {\n                temp = static_cast<char*>(::operator new(block_size));\n            }\n\n            reinterpret_cast<size_t*>(temp)[0] = block_size;\n            reinterpret_cast<size_t*>(temp)[1] = size;\n            temp += sizeof(size_t)*2;\n\n            try\n            {\n                initialize_array(reinterpret_cast<T*>(temp),size);\n            }\n            catch (...)\n            {\n                // something was thrown while we were initializing the array so\n                // stick our memory block into arrays and rethrow the exception\n                temp -= sizeof(size_t)*2;\n                arrays->add(block_size,temp);\n                throw;\n            }\n\n            ++allocations;\n            return reinterpret_cast<T*>(temp);\n        }\n\n        void deallocate_array (\n            T* item\n        )\n        {\n            char* temp = reinterpret_cast<char*>(item);\n            temp -= sizeof(size_t)*2;\n            size_t block_size = reinterpret_cast<size_t*>(temp)[0];\n            size_t size = reinterpret_cast<size_t*>(temp)[1];\n\n            deinitialize_array(item,size);\n\n            arrays->add(block_size,temp);\n            \n            --allocations;\n        }\n\n        T* allocate (\n        ) \n        {              \n            T* temp;\n            if (next != 0)\n            {\n                temp = reinterpret_cast<T*>(next);\n                node* n = next->next;\n\n                try\n                {\n                    // construct this new T object with placement new.\n                    new (static_cast<void*>(temp))T();\n                }\n                catch (...)\n                {\n                    next->next = n;\n                    throw;\n                }\n\n                next = n;\n            }\n            else\n            {\n                // the linked list is empty so we need to allocate some more memory\n                node* block = static_cast<node*>(::operator new (sizeof(node)*chunk_size));\n\n                // the first part of this block can be our new object\n                temp = reinterpret_cast<T*>(block);\n\n                try\n                {\n                    // construct this new T object with placement new.\n                    new (static_cast<void*>(temp))T();\n                }\n                catch (...)\n                {\n                    // construction of the new object threw so delete the block of memory\n                    ::operator delete ( static_cast<void*>(block));\n                    throw;\n                }\n\n                // allocate a new chunk_node\n                chunk_node* chunk;\n                try {chunk = new chunk_node; }\n                catch (...) \n                { \n                    temp->~T();\n                    ::operator delete ( static_cast<void*>(block));\n                    throw;\n                }\n\n                // add this block into the chunk list\n                chunk->chunk = block;\n                chunk->next = first_chunk;\n                first_chunk = chunk;\n\n\n                ++block;\n                // now add the rest of the block into the linked list of free nodes.\n                for (size_t i = 0; i < chunk_size-1; ++i)\n                {\n                    block->next = next;\n                    next = block;\n                    ++block;\n                }\n\n            }\n\n\n            ++allocations;\n            return temp;\n        }\n\n        void deallocate (\n            T* item\n        ) \n        { \n            --allocations;  \n            item->~T();\n\n            // add this memory into our linked list.\n            node* temp = reinterpret_cast<node*>(item);\n            temp->next = next;\n            next = temp;                \n        }\n\n        void swap (\n            memory_manager_kernel_3& item\n        ) \n        { \n            exchange(allocations,item.allocations); \n            exchange(next,item.next); \n            exchange(first_chunk,item.first_chunk);\n            exchange(arrays,item.arrays);\n        }\n\n    private:\n\n        // data members\n        size_t allocations;\n        node* next;\n\n        chunk_node* first_chunk;\n        bst_of_arrays* arrays;\n\n\n        void initialize_array (\n            T* array,\n            size_t size\n        ) const\n        {\n            size_t i;\n            try\n            {\n                for (i = 0; i < size; ++i)\n                {\n                    // construct this new T object with placement new.\n                    new (static_cast<void*>(array+i))T();\n                }\n            }\n            catch (...)\n            {\n                // Catch any exceptions thrown during the construction process\n                // and then destruct any T objects that actually were successfully\n                // constructed.\n                for (size_t j = 0; j < i; ++j)\n                {\n                    array[i].~T();\n                }\n                throw;\n            }\n        }\n\n        void deinitialize_array (\n            T* array,\n            size_t size\n        ) const\n        {\n            for (size_t i = 0; i < size; ++i)\n            {\n                array[i].~T();\n            }\n        }\n\n        // don't do any initialization for the built in types\n        void initialize_array(unsigned char*, size_t) {} \n        void deinitialize_array(unsigned char*, size_t) {}\n        void initialize_array(signed char*, size_t) {} \n        void deinitialize_array(signed char*, size_t) {}\n        void initialize_array(char*, size_t) {} \n        void deinitialize_array(char*, size_t) {}\n        void initialize_array(int*, size_t) {} \n        void deinitialize_array(int*, size_t) {}\n        void initialize_array(unsigned int*, size_t) {} \n        void deinitialize_array(unsigned int*, size_t) {}\n        void initialize_array(unsigned long*, size_t) {} \n        void deinitialize_array(unsigned long*, size_t) {}\n        void initialize_array(long*, size_t) {} \n        void deinitialize_array(long*, size_t) {}\n        void initialize_array(float*, size_t) {} \n        void deinitialize_array(float*, size_t) {}\n        void initialize_array(double*, size_t) {} \n        void deinitialize_array(double*, size_t) {}\n        void initialize_array(short*, size_t) {} \n        void deinitialize_array(short*, size_t) {}\n        void initialize_array(unsigned short*, size_t) {} \n        void deinitialize_array(unsigned short*, size_t) {}\n\n\n\n        // restricted functions\n        memory_manager_kernel_3(memory_manager_kernel_3&);        // copy constructor\n        memory_manager_kernel_3& operator=(memory_manager_kernel_3&);    // assignment operator\n    };\n\n    template <\n        typename T,\n        size_t chunk_size\n        >\n    inline void swap (\n        memory_manager_kernel_3<T,chunk_size>& a, \n        memory_manager_kernel_3<T,chunk_size>& b \n    ) { a.swap(b); }   \n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_MEMORY_MANAGER_KERNEl_3_\n\n"
  },
  {
    "path": "benchmarks/dlib/memory_manager/memory_manager_kernel_abstract.h",
    "content": "// Copyright (C) 2004  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_MEMORY_MANAGER_KERNEl_ABSTRACT_\n#ifdef DLIB_MEMORY_MANAGER_KERNEl_ABSTRACT_\n\n#include \"../algs.h\"\n\nnamespace dlib\n{\n    template <\n        typename T\n        >\n    class memory_manager\n    {\n        /*!      \n            REQUIREMENTS ON T\n                T must have a default constructor.      \n\n            INITIAL VALUE\n                get_number_of_allocations() == 0\n\n            WHAT THIS OBJECT REPRESENTS\n                This object represents some kind of memory manager or memory pool.\n        !*/\n        \n        public:\n\n            typedef T type;\n\n            template <typename U>\n            struct rebind {\n                typedef memory_manager<U> other;\n            };\n\n            memory_manager(\n            );\n            /*!\n                ensures \n                    - #*this is properly initialized\n                throws\n                    - std::bad_alloc\n            !*/\n\n            virtual ~memory_manager(\n            ); \n            /*!\n                ensures\n                    - if (get_number_of_allocations() == 0) then\n                        - all resources associated with *this have been released.\n                    - else\n                        - The memory still allocated will not be deleted and this\n                          causes a memory leak. \n            !*/\n\n            size_t get_number_of_allocations (\n            ) const;\n            /*!\n                ensures\n                    - returns the current number of outstanding allocations\n            !*/\n \n            T* allocate (\n            );\n            /*!\n                ensures\n                    - allocates a new object of type T and returns a pointer to it.\n                    - #get_number_of_allocations() == get_number_of_allocations() + 1\n                throws\n                    - std::bad_alloc or any exception thrown by T's constructor.\n                        If this exception is thrown then the call to allocate() \n                        has no effect on #*this.\n            !*/\n\n            void deallocate (\n                T* item\n            );\n            /*!\n                requires\n                    - item == is a pointer to memory that was obtained from a call to\n                      this->allocate(). (i.e. you can't deallocate a pointer you\n                      got from a different memory_manager instance.)\n                    - the memory pointed to by item hasn't already been deallocated.\n                ensures\n                    - deallocates the object pointed to by item\n                    - #get_number_of_allocations() == get_number_of_allocations() - 1\n            !*/\n\n            T* allocate_array (\n                size_t size\n            );\n            /*!\n                ensures\n                    - allocates a new array of size objects of type T and returns a \n                      pointer to it.\n                    - #get_number_of_allocations() == get_number_of_allocations() + 1\n                throws\n                    - std::bad_alloc or any exception thrown by T's constructor.\n                        If this exception is thrown then the call to allocate() \n                        has no effect on #*this.\n            !*/\n\n            void deallocate_array (\n                T* item\n            );\n            /*!\n                requires\n                    - item == is a pointer to memory that was obtained from a call to\n                      this->allocate_array(). (i.e. you can't deallocate a pointer you\n                      got from a different memory_manager instance and it must be an\n                      array.)\n                    - the memory pointed to by item hasn't already been deallocated.\n                ensures\n                    - deallocates the array pointed to by item\n                    - #get_number_of_allocations() == get_number_of_allocations() - 1\n            !*/\n\n            void swap (\n                memory_manager& item\n            );\n            /*!\n                ensures\n                    - swaps *this and item\n            !*/ \n\n        private:\n\n            // restricted functions\n            memory_manager(memory_manager&);        // copy constructor\n            memory_manager& operator=(memory_manager&);    // assignment operator\n    };\n\n    template <\n        typename T\n        >\n    inline void swap (\n        memory_manager<T>& a, \n        memory_manager<T>& b \n    ) { a.swap(b); }   \n    /*!\n        provides a global swap function\n    !*/\n\n}\n\n#endif // DLIB_MEMORY_MANAGER_KERNEl_ABSTRACT_\n\n"
  },
  {
    "path": "benchmarks/dlib/memory_manager.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_MEMORY_MANAGEr_\n#define DLIB_MEMORY_MANAGEr_\n\n#include \"memory_manager/memory_manager_kernel_1.h\"\n#include \"memory_manager/memory_manager_kernel_2.h\"\n#include \"memory_manager/memory_manager_kernel_3.h\"\n\n\n\nnamespace dlib\n{\n\n    template <\n        typename T\n        >\n    class memory_manager\n    {\n        memory_manager() {}\n\n\n    public:\n        \n        //----------- kernels ---------------\n\n        // kernel_1        \n        typedef      memory_manager_kernel_1<T,0>\n                     kernel_1a;\n        typedef      memory_manager_kernel_1<T,10>\n                     kernel_1b;\n        typedef      memory_manager_kernel_1<T,100>\n                     kernel_1c;\n        typedef      memory_manager_kernel_1<T,1000>\n                     kernel_1d;\n        typedef      memory_manager_kernel_1<T,10000>\n                     kernel_1e;\n        typedef      memory_manager_kernel_1<T,100000>\n                     kernel_1f;\n      \n        // kernel_2        \n        typedef      memory_manager_kernel_2<T,10>\n                     kernel_2a;\n        typedef      memory_manager_kernel_2<T,100>\n                     kernel_2b;\n        typedef      memory_manager_kernel_2<T,1000>\n                     kernel_2c;\n        typedef      memory_manager_kernel_2<T,10000>\n                     kernel_2d;\n        typedef      memory_manager_kernel_2<T,100000>\n                     kernel_2e;\n      \n      \n        // kernel_3        \n        typedef      memory_manager_kernel_3<T,10>\n                     kernel_3a;\n        typedef      memory_manager_kernel_3<T,100>\n                     kernel_3b;\n        typedef      memory_manager_kernel_3<T,1000>\n                     kernel_3c;\n        typedef      memory_manager_kernel_3<T,10000>\n                     kernel_3d;\n        typedef      memory_manager_kernel_3<T,100000>\n                     kernel_3e;\n      \n      \n           \n\n    };\n}\n\n#endif // DLIB_MEMORY_MANAGEr_\n\n"
  },
  {
    "path": "benchmarks/dlib/memory_manager_global/memory_manager_global_kernel_1.h",
    "content": "// Copyright (C) 2006  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_MEMORY_MANAGER_GLOBAl_1_\n#define DLIB_MEMORY_MANAGER_GLOBAl_1_\n\n#include \"../algs.h\"\n#include \"../memory_manager/memory_manager_kernel_abstract.h\"\n#include \"memory_manager_global_kernel_abstract.h\"\n\nnamespace dlib\n{\n    template <\n        typename T,\n        typename factory\n        >\n    class memory_manager_global_kernel_1\n    {\n        /*!      \n            INITIAL VALUE\n                - *global_mm == get_global_memory_manager()\n\n            CONVENTION\n                - global_mm->get_number_of_allocations() == get_number_of_allocations()\n                - *global_mm == get_global_memory_manager()\n        !*/\n        \n        public:\n\n            typedef typename factory::template return_type<T>::type mm_global_type; \n\n            typedef T type;\n\n            template <typename U>\n            struct rebind {\n                typedef memory_manager_global_kernel_1<U,factory> other;\n            };\n\n            memory_manager_global_kernel_1(\n            ) :\n                global_mm(factory::template get_instance<T>())\n            {}\n\n            virtual ~memory_manager_global_kernel_1(\n            )  {}\n\n            size_t get_number_of_allocations (\n            ) const { return global_mm->get_number_of_allocations(); }\n\n            mm_global_type& get_global_memory_manager (\n            ) { return *global_mm; }\n\n            T* allocate (\n            )\n            {\n                return global_mm->allocate(); \n            }\n\n            void deallocate (\n                T* item\n            )\n            {\n                global_mm->deallocate(item); \n            }\n\n            T* allocate_array (\n                size_t size\n            ) \n            { \n                return global_mm->allocate_array(size); \n            }\n\n            void deallocate_array (\n                T* item\n            ) \n            { \n                global_mm->deallocate_array(item); \n            }\n\n            void swap (\n                memory_manager_global_kernel_1& item\n            )\n            {\n                exchange(item.global_mm, global_mm);\n            }\n\n        private:\n\n            mm_global_type* global_mm;\n\n\n            // restricted functions\n            memory_manager_global_kernel_1(memory_manager_global_kernel_1&);        // copy constructor\n            memory_manager_global_kernel_1& operator=(memory_manager_global_kernel_1&);    // assignment operator\n    };\n\n    template <\n        typename T,\n        typename factory\n        >\n    inline void swap (\n        memory_manager_global_kernel_1<T,factory>& a, \n        memory_manager_global_kernel_1<T,factory>& b \n    ) { a.swap(b); }   \n    /*!\n        provides a global swap function\n    !*/\n\n}\n\n#endif // DLIB_MEMORY_MANAGER_GLOBAl_1_\n\n\n\n"
  },
  {
    "path": "benchmarks/dlib/memory_manager_global/memory_manager_global_kernel_abstract.h",
    "content": "// Copyright (C) 2006  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_MEMORY_MANAGER_GLOBAl_ABSTRACT_\n#ifdef DLIB_MEMORY_MANAGER_GLOBAl_ABSTRACT_\n\n#include \"../algs.h\"\n#include \"../memory_manager/memory_manager_kernel_abstract.h\"\n\nnamespace dlib\n{\n    template <\n        typename T,\n        typename factory\n        >\n    class memory_manager_global\n    {\n        /*!      \n            REQUIREMENTS ON T\n                T must have a default constructor.      \n\n            REQUIREMENTS ON factory\n                factory must be defined as follows:\n                struct factory\n                {\n                    template <typename U>\n                    struct return_type {\n                        typedef typename memory_manager_type<U> type;\n                    };\n\n                    template <typename U>\n                    static typename return_type<U>::type* get_instance (\n                    );\n                    / *!\n                        ensures\n                            - returns a pointer to an instance of a memory_manager object\n                              where memory_manager_type implements the interface defined \n                              by dlib/memory_manager/memory_manager_kernel_abstract.h\n                    !* /\n                };\n\n            WHAT THIS OBJECT REPRESENTS\n                This object represents some kind of global memory manager or memory pool.  \n                It is identical to the memory_manager object except that it gets all of \n                its allocations from a global instance of a memory_manager object which \n                is provided by the factory object's static member get_instance().\n\n            THREAD SAFETY\n                This object is, by itself, threadsafe.  However, if you want to use this\n                object in multiple threads then you must ensure that your factory is\n                threadsafe.  This means its factory::get_instance() method should be \n                threadsafe and the memory_manager object it returns must also be threadsafe.\n        !*/\n        \n        public:\n\n            typedef typename factory::template return_type<T>::type mm_global_type; \n\n            typedef T type;\n\n            template <typename U>\n            struct rebind {\n                typedef memory_manager_global<U,factory> other;\n            };\n\n            memory_manager_global(\n            );\n            /*!\n                ensures \n                    - #*this is properly initialized\n                    - #get_global_memory_manager() == the memory manager that was \n                      returned by a call to factory::get_instance<T>()\n                throws\n                    - std::bad_alloc\n            !*/\n\n            virtual ~memory_manager_global(\n            ); \n            /*!\n                ensures\n                    - This destructor has no effect on the global memory_manager\n                      get_global_memory_manager().\n            !*/\n\n            size_t get_number_of_allocations (\n            ) const;\n            /*!\n                ensures\n                    - returns get_global_memory_manager().get_number_of_allocations()\n            !*/\n\n            mm_global_type& get_global_memory_manager (\n            );\n            /*!\n                ensures\n                    - returns a reference to the global memory manager instance being\n                      used by *this.\n            !*/\n\n            T* allocate (\n            );\n            /*!\n                ensures\n                    - #get_number_of_allocations() == get_number_of_allocations() + 1\n                    - returns get_global_memory_manager().allocate()\n                throws\n                    - std::bad_alloc or any exception thrown by T's constructor.\n                        If this exception is thrown then the call to allocate() \n                        has no effect on #*this.\n            !*/\n\n            void deallocate (\n                T* item\n            );\n            /*!\n                requires\n                    - item == is a pointer to memory that was obtained from a call to\n                      the get_global_memory_manager() object's allocate() method.\n                    - the memory pointed to by item hasn't already been deallocated.\n                ensures\n                    - calls get_global_memory_manager().deallocate(item)\n                    - #get_number_of_allocations() == get_number_of_allocations() - 1\n            !*/\n\n            T* allocate_array (\n                size_t size\n            );\n            /*!\n                ensures\n                    - #get_number_of_allocations() == get_number_of_allocations() + 1\n                    - returns get_global_memory_manager().allocate_array()\n                throws\n                    - std::bad_alloc or any exception thrown by T's constructor.\n                        If this exception is thrown then the call to allocate_array() \n                        has no effect on #*this.\n            !*/\n\n            void deallocate_array (\n                T* item\n            );\n            /*!\n                requires\n                    - item == is a pointer to memory that was obtained from a call to\n                      the get_global_memory_manager() object's allocate_array() method.\n                    - the memory pointed to by item hasn't already been deallocated.\n                ensures\n                    - calls get_global_memory_manager().deallocate_array(item)\n                    - #get_number_of_allocations() == get_number_of_allocations() - 1\n            !*/\n\n            void swap (\n                memory_manager_global& item\n            );\n            /*!\n                ensures\n                    - swaps *this and item\n            !*/ \n\n        private:\n\n            // restricted functions\n            memory_manager_global(memory_manager_global&);        // copy constructor\n            memory_manager_global& operator=(memory_manager_global&);    // assignment operator\n    };\n\n    template <\n        typename T,\n        typename factory\n        >\n    inline void swap (\n        memory_manager_global<T,factory>& a, \n        memory_manager_global<T,factory>& b \n    ) { a.swap(b); }   \n    /*!\n        provides a global swap function\n    !*/\n\n}\n\n#endif // DLIB_MEMORY_MANAGER_GLOBAl_ABSTRACT_\n\n\n"
  },
  {
    "path": "benchmarks/dlib/memory_manager_global.h",
    "content": "// Copyright (C) 2006  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_MEMORY_MANAGER_GLOBAl_\n#define DLIB_MEMORY_MANAGER_GLOBAl_\n\n#include \"memory_manager_global/memory_manager_global_kernel_1.h\"\n#include \"memory_manager.h\"\n\n\n\nnamespace dlib\n{\n\n    template <\n        typename T,\n        typename factory\n        >\n    class memory_manager_global\n    {\n        memory_manager_global() {}\n\n\n    public:\n        \n        //----------- kernels ---------------\n\n        // kernel_1        \n        typedef      memory_manager_global_kernel_1<T,factory>\n                     kernel_1a;\n      \n      \n           \n\n    };\n}\n\n#endif // DLIB_MEMORY_MANAGER_GLOBAl_\n\n"
  },
  {
    "path": "benchmarks/dlib/memory_manager_stateless/memory_manager_stateless_kernel_1.h",
    "content": "// Copyright (C) 2006  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_MEMORY_MANAGER_STATELESs_1_\n#define DLIB_MEMORY_MANAGER_STATELESs_1_\n\n#include \"memory_manager_stateless_kernel_abstract.h\"\n#include <memory>\n\nnamespace dlib\n{\n    template <\n        typename T\n        >\n    class memory_manager_stateless_kernel_1\n    {\n        /*!      \n            this implementation just calls new and delete directly\n        !*/\n        \n        public:\n\n            typedef T type;\n            const static bool is_stateless = true;\n\n            template <typename U>\n            struct rebind {\n                typedef memory_manager_stateless_kernel_1<U> other;\n            };\n\n            memory_manager_stateless_kernel_1(\n            )\n            {}\n\n            virtual ~memory_manager_stateless_kernel_1(\n            ) {}\n\n            T* allocate (\n            )\n            {\n                return new T; \n            }\n\n            void deallocate (\n                T* item\n            )\n            {\n                delete item;\n            }\n\n            T* allocate_array (\n                size_t size\n            ) \n            { \n                return new T[size];\n            }\n\n            void deallocate_array (\n                T* item\n            ) \n            { \n                delete [] item;\n            }\n\n            void swap (memory_manager_stateless_kernel_1&)\n            {}\n\n            std::unique_ptr<T> extract(\n                T* item\n            )\n            {\n                return std::unique_ptr<T>(item);\n            }\n\n            std::unique_ptr<T[]> extract_array(\n                T* item\n            )\n            {\n                return std::unique_ptr<T[]>(item);\n            }\n\n        private:\n\n            // restricted functions\n            memory_manager_stateless_kernel_1(memory_manager_stateless_kernel_1&);        // copy constructor\n            memory_manager_stateless_kernel_1& operator=(memory_manager_stateless_kernel_1&);    // assignment operator\n    };\n\n    template <\n        typename T\n        >\n    inline void swap (\n        memory_manager_stateless_kernel_1<T>& a, \n        memory_manager_stateless_kernel_1<T>& b \n    ) { a.swap(b); }   \n\n}\n\n#endif // DLIB_MEMORY_MANAGER_STATELESs_1_\n\n\n\n"
  },
  {
    "path": "benchmarks/dlib/memory_manager_stateless/memory_manager_stateless_kernel_2.h",
    "content": "// Copyright (C) 2006  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_MEMORY_MANAGER_STATELESs_2_\n#define DLIB_MEMORY_MANAGER_STATELESs_2_\n\n#include \"../algs.h\"\n#include \"memory_manager_stateless_kernel_abstract.h\"\n#include \"../threads.h\"\n\nnamespace dlib\n{\n    template <\n        typename T,\n        typename mem_manager \n        >\n    class memory_manager_stateless_kernel_2\n    {\n        /*!      \n            REQUIREMENTS ON mem_manager\n                mem_manager must be an implementation of memory_manager/memory_manager_kernel_abstract.h\n\n            CONVENTION\n                this object has a single global instance of mem_manager \n        !*/\n\n        public:\n\n            typedef T type;\n            const static bool is_stateless = true;\n\n            template <typename U>\n            struct rebind {\n                typedef memory_manager_stateless_kernel_2<U,mem_manager> other;\n            };\n\n            memory_manager_stateless_kernel_2(\n            )\n            { \n                // call this just to make sure the mutex is is initialized before \n                // multiple threads start calling the member functions.\n                global_mutex();\n            }\n\n            virtual ~memory_manager_stateless_kernel_2(\n            ) {}\n\n            T* allocate (\n            )\n            {\n                auto_mutex M(global_mutex());\n                return global_mm().allocate();\n            }\n\n            void deallocate (\n                T* item\n            )\n            {\n                auto_mutex M(global_mutex());\n                return global_mm().deallocate(item);\n            }\n\n            T* allocate_array (\n                size_t size\n            ) \n            { \n                auto_mutex M(global_mutex());\n                return global_mm().allocate_array(size);\n            }\n\n            void deallocate_array (\n                T* item\n            ) \n            { \n                auto_mutex M(global_mutex());\n                return global_mm().deallocate_array(item);\n            }\n\n            void swap (memory_manager_stateless_kernel_2&)\n            {}\n\n        private:\n\n            static mutex& global_mutex (\n            )\n            {\n                static mutex lock;\n                return lock;\n            }\n\n            typedef typename mem_manager::template rebind<T>::other rebound_mm_type; \n\n            static rebound_mm_type& global_mm (\n            ) \n            {\n                static rebound_mm_type mm;\n                return mm;\n            }\n\n            // restricted functions\n            memory_manager_stateless_kernel_2(memory_manager_stateless_kernel_2&);        // copy constructor\n            memory_manager_stateless_kernel_2& operator=(memory_manager_stateless_kernel_2&);    // assignment operator\n    };\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    inline void swap (\n        memory_manager_stateless_kernel_2<T,mem_manager>& a, \n        memory_manager_stateless_kernel_2<T,mem_manager>& b \n    ) { a.swap(b); }   \n\n}\n\n#endif // DLIB_MEMORY_MANAGER_STATELESs_2_\n\n\n\n\n"
  },
  {
    "path": "benchmarks/dlib/memory_manager_stateless/memory_manager_stateless_kernel_abstract.h",
    "content": "// Copyright (C) 2006  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_MEMORY_MANAGER_STATELESs_ABSTRACT_\n#ifdef DLIB_MEMORY_MANAGER_STATELESs_ABSTRACT_\n\n#include \"../algs.h\"\n#include <memory>\n\nnamespace dlib\n{\n    template <\n        typename T\n        >\n    class memory_manager_stateless\n    {\n        /*!      \n            REQUIREMENTS ON T\n                T must have a default constructor.      \n\n            WHAT THIS OBJECT REPRESENTS\n                This object represents some kind of stateless memory manager or memory pool.  \n                Stateless means that all instances (instances of the same kernel implementation that is) \n                of this object are identical and can be used interchangeably.  Note that \n                implementations are allowed to have some shared global state such as a \n                global memory pool.\n\n            THREAD SAFETY\n                This object is thread safe.  You may access it from any thread at any time\n                without synchronizing access.\n        !*/\n        \n        public:\n\n            typedef T type;\n            const static bool is_stateless = true;\n\n            template <typename U>\n            struct rebind {\n                typedef memory_manager_stateless<U> other;\n            };\n\n            memory_manager_stateless(\n            );\n            /*!\n                ensures \n                    - #*this is properly initialized\n                throws\n                    - std::bad_alloc\n            !*/\n\n            virtual ~memory_manager_stateless(\n            ); \n            /*!\n                ensures\n                    - frees any resources used by *this but has no effect on any shared global\n                      resources used by the implementation.\n            !*/\n\n            T* allocate (\n            );\n            /*!\n                ensures\n                    - allocates a new object of type T and returns a pointer to it.\n                throws\n                    - std::bad_alloc or any exception thrown by T's constructor.\n                        If this exception is thrown then the call to allocate() \n                        has no effect on #*this.\n            !*/\n\n            void deallocate (\n                T* item\n            );\n            /*!\n                requires\n                    - item == is a pointer to memory that was obtained from a call to\n                      allocate(). (i.e. The pointer you are deallocating must have\n                      come from the same implementation of memory_manager_stateless\n                      that is trying to deallocate it.)\n                    - the memory pointed to by item hasn't already been deallocated.\n                ensures\n                    - deallocates the object pointed to by item\n            !*/\n\n            T* allocate_array (\n                size_t size\n            );\n            /*!\n                ensures\n                    - allocates a new array of size objects of type T and returns a \n                      pointer to it.\n                throws\n                    - std::bad_alloc or any exception thrown by T's constructor.\n                        If this exception is thrown then the call to allocate() \n                        has no effect on #*this.\n            !*/\n\n            void deallocate_array (\n                T* item\n            );\n            /*!\n                requires\n                    - item == is a pointer to memory that was obtained from a call to\n                      allocate_array(). (i.e. The pointer you are deallocating must have\n                      come from the same implementation of memory_manager_stateless\n                      that is trying to deallocate it.)\n                    - the memory pointed to by item hasn't already been deallocated.\n                ensures\n                    - deallocates the array pointed to by item\n            !*/\n\n            void swap (\n                memory_manager_stateless& item\n            );\n            /*!\n                ensures\n                    - this function has no effect on *this or item.  It is just provided \n                      to make this object's interface more compatible with the other \n                      memory managers.\n            !*/ \n\n            std::unique_ptr<T> extract(\n                T* item\n            );\n            /*!\n                requires\n                    - item == is a pointer to memory that was obtained from a call to\n                      allocate(). \n                ensures\n                    - returns a unique_ptr that owns item.  That is, if the returned ptr is\n                      PTR then PTR.get() == item.  Therefore, this function extracts item\n                      from the memory manager's internal pool.  Therefore, you shouldn't \n                      call deallocate(item) after this.\n                    - Note that not all memory managers implement extract().\n            !*/\n\n            std::unique_ptr<T[]> extract_array(\n                T* item\n            );\n            /*!\n                requires\n                    - item == is a pointer to memory that was obtained from a call to\n                      allocate_array(). \n                ensures\n                    - returns a unique_ptr that owns item.  That is, if the returned ptr is\n                      PTR then PTR.get() == item.  Therefore, this function extracts item\n                      from the memory manager's internal pool.  Therefore, you shouldn't \n                      call deallocate_array(item) after this.\n                    - Note that not all memory managers implement extract().\n            !*/\n\n        private:\n\n            // restricted functions\n            memory_manager_stateless(memory_manager_stateless&);        // copy constructor\n            memory_manager_stateless& operator=(memory_manager_stateless&);    // assignment operator\n    };\n\n    template <\n        typename T\n        >\n    inline void swap (\n        memory_manager_stateless<T>& a, \n        memory_manager_stateless<T>& b \n    ) { a.swap(b); }   \n    /*!\n        provides a global swap function\n    !*/\n\n}\n\n#endif // DLIB_MEMORY_MANAGER_STATELESs_ABSTRACT_\n\n\n"
  },
  {
    "path": "benchmarks/dlib/memory_manager_stateless.h",
    "content": "// Copyright (C) 2006  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_MEMORY_MANAGER_STATELESs_\n#define DLIB_MEMORY_MANAGER_STATELESs_\n\n#include \"memory_manager_stateless/memory_manager_stateless_kernel_1.h\"\n#include \"memory_manager_stateless/memory_manager_stateless_kernel_2.h\"\n#include \"memory_manager.h\"\n\n\n\nnamespace dlib\n{\n\n    template <\n        typename T\n        >\n    class memory_manager_stateless\n    {\n        memory_manager_stateless() {}\n\n\n    public:\n        \n        //----------- kernels ---------------\n\n        // kernel_1        \n        typedef      memory_manager_stateless_kernel_1<T>\n                     kernel_1a;\n      \n        // kernel_2        \n        typedef      memory_manager_stateless_kernel_2<T,memory_manager<char>::kernel_1a>\n                     kernel_2_1a;\n        typedef      memory_manager_stateless_kernel_2<T,memory_manager<char>::kernel_1b>\n                     kernel_2_1b;\n        typedef      memory_manager_stateless_kernel_2<T,memory_manager<char>::kernel_1c>\n                     kernel_2_1c;\n        typedef      memory_manager_stateless_kernel_2<T,memory_manager<char>::kernel_1d>\n                     kernel_2_1d;\n        typedef      memory_manager_stateless_kernel_2<T,memory_manager<char>::kernel_1e>\n                     kernel_2_1e;\n        typedef      memory_manager_stateless_kernel_2<T,memory_manager<char>::kernel_1f>\n                     kernel_2_1f;\n\n        typedef      memory_manager_stateless_kernel_2<T,memory_manager<char>::kernel_2a>\n                     kernel_2_2a;\n        typedef      memory_manager_stateless_kernel_2<T,memory_manager<char>::kernel_2b>\n                     kernel_2_2b;\n        typedef      memory_manager_stateless_kernel_2<T,memory_manager<char>::kernel_2c>\n                     kernel_2_2c;\n        typedef      memory_manager_stateless_kernel_2<T,memory_manager<char>::kernel_2d>\n                     kernel_2_2d;\n        typedef      memory_manager_stateless_kernel_2<T,memory_manager<char>::kernel_2e>\n                     kernel_2_2e;\n      \n        typedef      memory_manager_stateless_kernel_2<T,memory_manager<char>::kernel_3a>\n                     kernel_2_3a;\n        typedef      memory_manager_stateless_kernel_2<T,memory_manager<char>::kernel_3b>\n                     kernel_2_3b;\n        typedef      memory_manager_stateless_kernel_2<T,memory_manager<char>::kernel_3c>\n                     kernel_2_3c;\n        typedef      memory_manager_stateless_kernel_2<T,memory_manager<char>::kernel_3d>\n                     kernel_2_3d;\n        typedef      memory_manager_stateless_kernel_2<T,memory_manager<char>::kernel_3e>\n                     kernel_2_3e;\n      \n\n    };\n}\n\n#endif // DLIB_MEMORY_MANAGER_STATELESs_\n\n"
  },
  {
    "path": "benchmarks/dlib/metaprogramming.h",
    "content": "// Copyright (C) 2017  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_METApROGRAMMING_Hh_\n#define DLIB_METApROGRAMMING_Hh_\n\n#include \"algs.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    template <size_t... n>\n    struct compile_time_integer_list \n    {\n        /*!\n            WHAT THIS OBJECT REPRESENTS\n                The point of this type is to, as the name suggests, hold a compile time list of integers.\n                As an example, here is something simple you could do with it:\n\n                    template <size_t... ints>\n                    void print_compile_time_ints (\n                        compile_time_integer_list<ints...>\n                    )\n                    {\n                        print(ints...);\n                    }\n\n                    int main()\n                    {\n                        print_compile_time_ints(compile_time_integer_list<0,4,9>());\n                    }\n\n                Which just calls: print(0,4,9);\n\n                This is a simple example, but this kind of thing is useful in larger and\n                more complex template metaprogramming constructs.\n        !*/\n\n        template <size_t m>\n        struct push_back\n        {\n            typedef compile_time_integer_list<n..., m> type;\n        };\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    template <size_t max>\n    struct make_compile_time_integer_range\n    {\n        /*!\n            WHAT THIS OBJECT REPRESENTS\n                This object makes a compile_time_integer_list containing the integers in the range [1,max] inclusive.\n                For example:\n                    make_compile_time_integer_range<4>::type\n                evaluates to:\n                    compile_time_integer_list<1,2,3,4>\n        !*/\n\n        typedef typename make_compile_time_integer_range<max-1>::type::template push_back<max>::type type;\n    };\n    // base case\n    template <> struct make_compile_time_integer_range<0> { typedef compile_time_integer_list<> type; };\n\n// ----------------------------------------------------------------------------------------\n\n    namespace impl\n    {\n        template <\n            typename Funct, \n            typename... Args,\n            typename int_<decltype(std::declval<Funct>()(std::declval<Args>()...))>::type = 0\n            >\n        bool call_if_valid (\n            special_,\n            Funct&& f, Args&&... args\n        ) \n        {  \n            f(std::forward<Args>(args)...);\n            return true;\n        }\n\n        template <\n            typename Funct, \n            typename... Args\n            >\n        bool call_if_valid (\n            general_,\n            Funct&& /*f*/, Args&&... /*args*/\n        ) { return false; }\n    }\n\n    template <typename Funct, typename... Args>\n    bool call_if_valid(Funct&& f, Args&&... args) \n    /*!\n        ensures\n            - if f(std::forward<Args>(args)...) is a valid expression then we evaluate it and return\n              true.  Otherwise we do nothing and return false.\n    !*/\n    {\n        return impl::call_if_valid(special_(), f, std::forward<Args>(args)...);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_METApROGRAMMING_Hh_\n\n\n"
  },
  {
    "path": "benchmarks/dlib/misc_api/misc_api_kernel_1.h",
    "content": "// Copyright (C) 2004  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_MISC_API_KERNEl_1_\n#define DLIB_MISC_API_KERNEl_1_\n\n#ifdef DLIB_ISO_CPP_ONLY\n#error \"DLIB_ISO_CPP_ONLY is defined so you can't use this OS dependent code.  Turn DLIB_ISO_CPP_ONLY off if you want to use it.\"\n#endif\n\n\n#include \"misc_api_kernel_abstract.h\"\n#include \"../algs.h\"\n#include <string>\n#include \"../uintn.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    void sleep (\n        unsigned long milliseconds\n    );\n\n// ----------------------------------------------------------------------------------------\n\n    std::string get_current_dir (\n    );\n\n// ----------------------------------------------------------------------------------------\n\n    class set_current_dir_error : public error\n    {\n    public:\n        set_current_dir_error(\n            const std::string& a\n        ): error(a) {}\n    };\n\n    void set_current_dir (\n        const std::string& new_dir\n    );\n\n// ----------------------------------------------------------------------------------------\n\n    class timestamper \n    {\n        /*!\n            INITIAL VALUE\n                - last_time == 0\n                - offset == 0\n                - dword_max == 2^32\n\n            CONVENTION\n                - last_time == the time returned by GetTickCount() the last time we\n                  called it.\n                - offset == the number of microseconds we should add to the result of\n                  GetTickCount() so that it is correct.\n                - dword_max == 2^32.  \n                  This is the number of values representable by a DWORD.  \n        !*/\n\n        mutable unsigned long last_time;\n        mutable uint64 offset;\n        mutable uint64 dword_max;\n\n    public:\n        timestamper(\n        ) :\n            last_time(0),\n            offset(0)\n        {\n            dword_max = 0xFFFFFFFF;\n            ++dword_max;\n        }\n\n        uint64 get_timestamp (\n        ) const;\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    class dir_create_error : public error \n    {\n    public:\n        dir_create_error(\n            const std::string& dir_name\n        ) : \n            error(EDIR_CREATE,\"Error creating directory '\" + dir_name + \"'.\"),\n            name(dir_name)\n        {}\n\n        ~dir_create_error() throw() {}\n        const std::string name;\n    }; \n\n    void create_directory (\n        const std::string& dir\n    );\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#ifdef NO_MAKEFILE\n#include \"misc_api_kernel_1.cpp\"\n#endif\n\n#endif // DLIB_MISC_API_KERNEl_1_\n\n"
  },
  {
    "path": "benchmarks/dlib/misc_api/misc_api_kernel_2.h",
    "content": "// Copyright (C) 2004  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_MISC_API_KERNEl_2_\n#define DLIB_MISC_API_KERNEl_2_\n\n#ifdef DLIB_ISO_CPP_ONLY\n#error \"DLIB_ISO_CPP_ONLY is defined so you can't use this OS dependent code.  Turn DLIB_ISO_CPP_ONLY off if you want to use it.\"\n#endif\n\n\n#include \"misc_api_kernel_abstract.h\"\n#include \"../algs.h\"\n#include <string>\n#include \"../uintn.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    void sleep (\n        unsigned long milliseconds\n    );\n\n// ----------------------------------------------------------------------------------------\n\n    std::string get_current_dir (\n    );\n\n// ----------------------------------------------------------------------------------------\n\n    class set_current_dir_error : public error\n    {\n    public:\n        set_current_dir_error(\n            const std::string& a\n        ): error(a) {}\n    };\n\n    void set_current_dir (\n        const std::string& new_dir\n    );\n\n// ----------------------------------------------------------------------------------------\n\n    class timestamper \n    {\n    public:\n        uint64 get_timestamp (\n        ) const;\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    class dir_create_error : public error \n    {\n    public:\n        dir_create_error(\n            const std::string& dir_name\n        ) : \n            error(EDIR_CREATE,\"Error creating directory '\" + dir_name + \"'.\"),\n            name(dir_name)\n        {}\n        const std::string& name;\n    }; \n\n\n    void create_directory (\n        const std::string& dir\n    );\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#ifdef NO_MAKEFILE\n#include \"misc_api_kernel_2.cpp\"\n#endif\n\n#endif // DLIB_MISC_API_KERNEl_2_\n\n"
  },
  {
    "path": "benchmarks/dlib/misc_api/misc_api_kernel_abstract.h",
    "content": "// Copyright (C) 2004  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_MISC_API_KERNEl_ABSTRACT_\n#ifdef DLIB_MISC_API_KERNEl_ABSTRACT_\n\n#include <string>\n#include \"../uintn.h\"\n#include \"../algs.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    /*!\n        GENERAL COMMENTS\n            This file just contains miscellaneous api functions\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    void sleep (\n        unsigned long milliseconds\n    );\n    /*!\n        ensures\n            - causes the calling thread to sleep for the given number of \n              milliseconds.\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    std::string get_current_dir (\n    );\n    /*!\n        ensures\n            - if (no errors occur) then\n                - returns the path to the current working directory\n            - else\n                - returns \"\"\n        throws\n            - std::bad_alloc\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    class set_current_dir_error : public error;\n\n    void set_current_dir (\n        const std::string& new_dir\n    );\n    /*!\n        ensures\n            - sets the current working directory to new_dir\n        throws\n            - std::bad_alloc\n            - set_current_dir_error\n              This exception is thrown if there is an error when attempting\n              to change the current working directory.\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    class locally_change_current_dir : noncopyable\n    {\n        /*!\n            WHAT THIS OBJECT REPRESENTS\n                This object is a RAII tool for safely switching the current directory\n                to a new directory and then automatically switching back to the original\n                directory upon this object's destruction.\n        !*/\n    public:\n        explicit locally_change_current_dir (\n            const std::string& new_dir\n        );\n        /*!\n            ensures\n                - calls set_current_dir(new_dir)\n                - #old_dir() == The value of get_current_dir() prior to switching to new_dir.\n        !*/\n\n        const std::string& old_dir (\n        ) const;\n        /*!\n            ensures\n                - returns the directory we switch back to once this object is destructed.\n        !*/\n\n        ~locally_change_current_dir(\n        );\n        /*!\n            ensures\n                - if (revert() hasn't already been called) then\n                    - calls set_current_dir(old_dir())\n        !*/\n\n        void revert (\n        );\n        /*!\n            ensures\n                - if (revert() hasn't already been called) then\n                    - calls set_current_dir(old_dir())\n        !*/\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    class dir_create_error : public error { \n    public:\n        const std::string name\n    }; \n\n    void create_directory (\n        const std::string& dir\n    );\n    /*!\n        ensures\n            - if (dir does not already exist) then\n                - creates the given directory.\n            - else\n                - the call to create_directory() has no effect.\n        throws\n            - dir_create_error\n                This exception is thrown if we were unable to create the requested\n                directory and it didn't already exist.  The type member of the exception \n                will bet set to EDIR_CREATE and the name member will be set to dir.\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    class timestamper \n    {\n        /*!\n            WHAT THIS OBJECT REPRESENTS\n                This object represents a timer that is capable of returning \n                timestamps.\n\n                Note that the time is measured in microseconds but you are not \n                guaranteed to have that level of resolution.  The actual resolution\n                is implementation dependent.\n        !*/\n\n    public:\n        uint64 get_timestamp (\n        ) const;\n        /*!\n            ensures\n                - returns a timestamp that measures the time in microseconds since an \n                  arbitrary point in the past.  Note that this arbitrary point remains\n                  the same between all calls to get_timestamp().\n        !*/\n    };\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_MISC_API_KERNEl_ABSTRACT_\n\n"
  },
  {
    "path": "benchmarks/dlib/misc_api/misc_api_shared.h",
    "content": "// Copyright (C) 2014  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_MISC_API_ShARED_Hh_\n#define DLIB_MISC_API_ShARED_Hh_\n\n#include <string>\n#include \"../noncopyable.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    class locally_change_current_dir : noncopyable\n    {\n    public:\n        explicit locally_change_current_dir (\n            const std::string& new_dir\n        )\n        {\n            reverted = false;\n            _old_dir = get_current_dir();\n            set_current_dir(new_dir);\n        }\n\n        ~locally_change_current_dir()\n        {\n            revert();\n        }\n\n        const std::string& old_dir (\n        ) const \n        {\n            return _old_dir;\n        }\n\n        void revert (\n        )\n        {\n            if (!reverted)\n            {\n                set_current_dir(_old_dir);\n                reverted = true;\n            }\n        }\n\n    private:\n        bool reverted;\n        std::string _old_dir;\n    };\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_MISC_API_ShARED_Hh_\n\n"
  },
  {
    "path": "benchmarks/dlib/misc_api/posix.h",
    "content": "// Copyright (C) 2004  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_MISC_API_KERNEl_1_\n#include \"misc_api_kernel_2.h\"\n#endif\n\n"
  },
  {
    "path": "benchmarks/dlib/misc_api/windows.h",
    "content": "// Copyright (C) 2004  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_MISC_API_KERNEl_2_\n#include \"misc_api_kernel_1.h\"\n#endif\n\n"
  },
  {
    "path": "benchmarks/dlib/misc_api.h",
    "content": "// Copyright (C) 2004  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n\n#ifndef DLIB_MISC_APi_\n#define DLIB_MISC_APi_\n\n#include \"platform.h\"\n\n#ifdef WIN32\n#include \"misc_api/windows.h\"\n#endif\n\n#ifndef WIN32\n#include \"misc_api/posix.h\"\n#endif\n\n#include \"misc_api/misc_api_shared.h\"\n\n#endif // DLIB_MISC_APi_\n\n"
  },
  {
    "path": "benchmarks/dlib/noncopyable.h",
    "content": "//  (C) Copyright Beman Dawes 1999-2003. Distributed under the Boost\n//  Software License, Version 1.0. (See accompanying file\n//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n//  Contributed by Dave Abrahams\n//  See http://www.boost.org/libs/utility for documentation.\n\n#ifndef DLIB_BOOST_NONCOPYABLE_HPP_INCLUDED\n#define DLIB_BOOST_NONCOPYABLE_HPP_INCLUDED\n\n\nnamespace dlib\n{\n    class noncopyable\n    {\n        /*!\n            This class makes it easier to declare a class as non-copyable.\n            If you want to make an object that can't be copied just inherit\n            from this object.\n        !*/\n\n    protected:\n        noncopyable() = default;\n        ~noncopyable() = default;\n    private:  // emphasize the following members are private\n        noncopyable(const noncopyable&);\n        const noncopyable& operator=(const noncopyable&);\n\n    };\n}\n\n#endif  // DLIB_BOOST_NONCOPYABLE_HPP_INCLUDED\n\n"
  },
  {
    "path": "benchmarks/dlib/numeric_constants.h",
    "content": "//Copyright (C) 2013 Steve Taylor (steve98654@gmail.com), Davis E. King\n//License: Boost Software License.  See LICENSE.txt for full license.\n#ifndef DLIB_NUMERIC_CONSTANTs_H_\n#define DLIB_NUMERIC_CONSTANTs_H_\n\nnamespace dlib \n{\n\n    // pi -- Pi\n    const double pi = 3.1415926535897932385;\n\n    // e  -- Euler's Constant\n    const double e = 2.7182818284590452354;\n\n    // sqrt_2 -- The square root of 2\n    const double sqrt_2 = 1.4142135623730950488;\n\n    // sqrt_3 -- The square root of 3\n    const double sqrt_3 = 1.7320508075688772935;\n\n    // log10_2 -- The logarithm base 10 of two\n    const double log10_2 = 0.30102999566398119521;\n\n    // light_spd -- The speed of light in vacuum in meters per second\n    const double light_spd = 2.99792458e8;\n\n    // newton_G  -- Newton's gravitational constant (in metric units of m^3/(kg*s^2))\n    const double newton_G = 6.67384e-11;\n\n    // planck_cst -- Planck's constant (in units of Joules * seconds) \n    const double planck_cst = 6.62606957e-34;\n\n    // golden_ratio -- The Golden Ratio\n    const double golden_ratio = 1.6180339887498948482;\n\n    // euler_gamma -- The Euler Mascheroni Constant \n    const double euler_gamma = 0.5772156649015328606065;\n\n    // catalan -- Catalan's Constant\n    const double catalan = 0.91596559417721901505; \n\n    // glaisher -- Glaisher Kinkelin constant\n    const double glaisher = 1.2824271291006226369;\n\n    // khinchin -- Khinchin's constant\n    const double khinchin = 2.6854520010653064453;\n\n    // apery -- Apery's constant\n    const double apery = 1.2020569031595942854;\n}\n\n#endif //DLIB_NUMERIC_CONSTANTs_H_\n\n"
  },
  {
    "path": "benchmarks/dlib/numerical_integration/integrate_function_adapt_simpson.h",
    "content": "// Copyright (C) 2013 Steve Taylor (steve98654@gmail.com)\n// License: Boost Software License  See LICENSE.txt for full license\n#ifndef DLIB_INTEGRATE_FUNCTION_ADAPT_SIMPSONh_\n#define DLIB_INTEGRATE_FUNCTION_ADAPT_SIMPSONh_\n\n#include \"integrate_function_adapt_simpson_abstract.h\"\n#include \"../assert.h\"\n\n// ----------------------------------------------------------------------------------------\n\nnamespace dlib\n{\n    template <typename T, typename funct>\n    T impl_adapt_simp_stop(const funct& f, T a, T b, T fa, T fm, T fb, T is, int cnt)\n    {\n        const int maxint = 500;\n\n        T m   = (a + b)/2.0;\n        T h   = (b - a)/4.0;\n        T fml = f(a + h);\n        T fmr = f(b - h);\n        T i1 = h/1.5*(fa+4.0*fm+fb);\n        T i2 = h/3.0*(fa+4.0*(fml+fmr)+2.0*fm+fb);\n        i1 = (16.0*i2 - i1)/15.0;\n        T Q = 0;\n\n        if ((std::abs(i1-i2) <= std::abs(is)) || (m <= a) || (b <= m))\n        {\n            Q = i1;\n        }\n        else \n        {\n            if(cnt < maxint)\n            {\n                cnt = cnt + 1;\n\n                Q = impl_adapt_simp_stop(f,a,m,fa,fml,fm,is,cnt) \n                    + impl_adapt_simp_stop(f,m,b,fm,fmr,fb,is,cnt); \n            }\n        }\n\n        return Q;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T, typename funct>\n    T integrate_function_adapt_simp(\n        const funct& f,\n        T a,\n        T b,\n        T tol = 1e-10\n    )\n    {\n        // make sure requires clause is not broken\n        DLIB_ASSERT(b > a && tol > 0,\n            \"\\t T integrate_function_adapt_simp()\"\n            << \"\\n\\t Invalid arguments were given to this function.\"\n            << \"\\n\\t a:   \" << a\n            << \"\\n\\t b:   \" << b\n            << \"\\n\\t tol: \" << tol \n            );\n\n        T eps = std::numeric_limits<T>::epsilon();\n        if(tol < eps)\n        {\n            tol = eps;\n        }\n\n        const T ba = b-a;\n        const T fa = f(a);\n        const T fb = f(b);\n        const T fm = f((a+b)/2);\n\n        T is = ba/8*(fa+fb+fm+ f(a + 0.9501*ba) + f(a + 0.2311*ba) + f(a + 0.6068*ba)\n            + f(a + 0.4860*ba) + f(a + 0.8913*ba));\n\n        if(is == 0)\n        {\n            is = b-a;\n        }\n\n        is = is*tol;\n\n        int cnt = 0;\n\n        return impl_adapt_simp_stop(f, a, b, fa, fm, fb, is, cnt);\n    }\n}\n\n// ----------------------------------------------------------------------------------------\n\n#endif // DLIB_INTEGRATE_FUNCTION_ADAPT_SIMPSONh_\n"
  },
  {
    "path": "benchmarks/dlib/numerical_integration/integrate_function_adapt_simpson_abstract.h",
    "content": "// Copyright (C) 2013 Steve Taylor (steve98654@gmail.com)\n// License: Boost Software License  See LICENSE.txt for the full license.\n#undef DLIB_INTEGRATE_FUNCTION_ADAPT_SIMPSON_ABSTRACTh_\n#ifdef DLIB_INTEGRATE_FUNCTION_ADAPT_SIMPSON_ABSTRACTh_\n\nnamespace dlib\n{\n\n    template <typename T, typename funct>\n    T integrate_function_adapt_simp(\n        const funct& f, \n        T a, \n        T b, \n        T tol = 1e-10\n    );\n    /*!\n        requires \n            - b > a\n            - tol > 0\n            - T should be either float, double, or long double\n            - The expression f(a) should be a valid expression that evaluates to a T.\n              I.e. f() should be a real valued function of a single variable.\n        ensures\n            - returns an approximation of the integral of f over the domain [a,b] using the\n              adaptive Simpson method outlined in Gander, W. and W. Gautshi, \"Adaptive\n              Quadrature -- Revisited\" BIT, Vol. 40, (2000), pp.84-101\n            - tol is a tolerance parameter that determines the overall accuracy of\n              approximated integral.  We suggest a default value of 1e-10 for tol. \n    !*/\n\n}\n\n#endif // DLIB_INTEGRATE_FUNCTION_ADAPT_SIMPSON_ABSTRACTh_\n\n"
  },
  {
    "path": "benchmarks/dlib/numerical_integration.h",
    "content": "// Copyright (C) 2013 Steve Taylor (steve98654@gmail.com)\n// License: Boost Software License  See LICENSE.txt for the full license.\n#ifndef DLIB_INTEGRATE_FUNCTION_ADAPT_SIMPSON_HEADER\n#define DLIB_INTEGRATE_FUNCTION_ADAPT_SIMPSON_HEADER\n\n#include \"numerical_integration/integrate_function_adapt_simpson.h\"\n\n#endif // DLIB_INTEGRATE_FUNCTION_ADAPT_SIMPSON_HEADER\n"
  },
  {
    "path": "benchmarks/dlib/ostream",
    "content": "#include \"dlib_include_path_tutorial.txt\"\n"
  },
  {
    "path": "benchmarks/dlib/pipe/pipe_kernel_1.h",
    "content": "// Copyright (C) 2006  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_PIPE_KERNEl_1_ \n#define DLIB_PIPE_KERNEl_1_ \n\n#include \"../algs.h\"\n#include \"../threads.h\"\n#include \"pipe_kernel_abstract.h\"\n\nnamespace dlib\n{\n\n    template <\n        typename T\n        >\n    class pipe \n    {\n        /*!\n            INITIAL VALUE\n                - pipe_size == 0\n                - pipe_max_size == defined by constructor\n                - enabled == true\n                - data == a pointer to an array of ((pipe_max_size>0)?pipe_max_size:1) T objects.\n                - dequeue_waiters == 0\n                - enqueue_waiters == 0\n                - first == 1\n                - last == 1\n                - unblock_sig_waiters == 0\n\n            CONVENTION\n                - size() == pipe_size\n                - max_size() == pipe_max_size\n                - is_enabled() == enabled\n\n                - m == the mutex used to lock access to all the members of this class\n\n                - dequeue_waiters == the number of threads blocked on calls to dequeue()\n                - enqueue_waiters == the number of threads blocked on calls to enqueue() and \n                  wait_until_empty()\n                - unblock_sig_waiters == the number of threads blocked on calls to \n                  wait_for_num_blocked_dequeues() and the destructor.  (i.e. the number of\n                  blocking calls to unblock_sig.wait())\n\n                - dequeue_sig == the signaler that threads blocked on calls to dequeue() wait on\n                - enqueue_sig == the signaler that threads blocked on calls to enqueue() \n                  or wait_until_empty() wait on.\n                - unblock_sig == the signaler that is signaled when a thread stops blocking on a call\n                  to enqueue() or dequeue().  It is also signaled when a dequeue that will probably\n                  block is called.  The destructor and wait_for_num_blocked_dequeues are the only \n                  things that will wait on this signaler.\n\n                - if (pipe_size > 0) then\n                    - data[first] == the next item to dequeue\n                    - data[last] == the item most recently added via enqueue, so the last to dequeue.\n                - else if (pipe_max_size == 0)\n                    - if (first == 0 && last == 0) then\n                        - data[0] == the next item to dequeue\n                    - else if (first == 0 && last == 1) then \n                        - data[0] has been taken out already by a dequeue\n        !*/\n\n    public:\n        // this is here for backwards compatibility with older versions of dlib.\n        typedef pipe kernel_1a;\n\n        typedef T type;\n\n        explicit pipe (  \n            size_t maximum_size\n        );\n\n        virtual ~pipe (\n        );\n\n        void empty (\n        );\n\n        void wait_until_empty (\n        ) const;\n\n        void wait_for_num_blocked_dequeues (\n            unsigned long num\n        )const;\n\n        void enable (\n        );\n\n        void disable (\n        );\n\n        bool is_enqueue_enabled (\n        ) const;\n\n        void disable_enqueue (\n        );\n\n        void enable_enqueue (\n        );\n\n        bool is_dequeue_enabled (\n        ) const;\n\n        void disable_dequeue (\n        );\n\n        void enable_dequeue (\n        );\n\n        bool is_enabled (\n        ) const;\n\n        size_t max_size (\n        ) const;\n\n        size_t size (\n        ) const;\n\n        bool enqueue (\n            T& item\n        );\n\n        bool enqueue (\n            T&& item\n        ) { return enqueue(item); }\n\n        bool dequeue (\n            T& item\n        );\n\n        bool enqueue_or_timeout (\n            T& item,\n            unsigned long timeout\n        );\n\n        bool enqueue_or_timeout (\n            T&& item,\n            unsigned long timeout\n        ) { return enqueue_or_timeout(item,timeout); }\n\n        bool dequeue_or_timeout (\n            T& item,\n            unsigned long timeout\n        );\n\n    private:\n\n        size_t pipe_size;\n        const size_t pipe_max_size;\n        bool enabled;\n\n        T* const data;\n\n        size_t first;\n        size_t last;\n\n        mutex m;\n        signaler dequeue_sig;\n        signaler enqueue_sig;\n        signaler unblock_sig;\n\n        unsigned long dequeue_waiters;\n        mutable unsigned long enqueue_waiters;\n        mutable unsigned long unblock_sig_waiters;\n        bool enqueue_enabled;\n        bool dequeue_enabled;\n\n        // restricted functions\n        pipe(const pipe&);        // copy constructor\n        pipe& operator=(const pipe&);    // assignment operator\n\n    };    \n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n//                      member function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    pipe<T>::\n    pipe (  \n        size_t maximum_size\n    ) : \n        pipe_size(0),\n        pipe_max_size(maximum_size),\n        enabled(true),\n        data(new T[(maximum_size>0) ? maximum_size : 1]),\n        first(1),\n        last(1),\n        dequeue_sig(m),\n        enqueue_sig(m),\n        unblock_sig(m),\n        dequeue_waiters(0),\n        enqueue_waiters(0),\n        unblock_sig_waiters(0),\n        enqueue_enabled(true),\n        dequeue_enabled(true)\n    {\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    pipe<T>::\n    ~pipe (\n    )\n    {\n        auto_mutex M(m);\n        ++unblock_sig_waiters;\n\n        // first make sure no one is blocked on any calls to enqueue() or dequeue()\n        enabled = false;\n        dequeue_sig.broadcast();\n        enqueue_sig.broadcast();\n        unblock_sig.broadcast();\n\n        // wait for all threads to unblock\n        while (dequeue_waiters > 0 || enqueue_waiters > 0 || unblock_sig_waiters > 1)\n            unblock_sig.wait();\n\n        delete [] data;\n        --unblock_sig_waiters;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    void pipe<T>::\n    empty (\n    )\n    {\n        auto_mutex M(m);\n        pipe_size = 0;\n\n        // let any calls to enqueue() know that the pipe is now empty\n        if (enqueue_waiters > 0)\n            enqueue_sig.broadcast();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    void pipe<T>::\n    wait_until_empty (\n    ) const\n    {\n        auto_mutex M(m);\n        // this function is sort of like a call to enqueue so treat it like that\n        ++enqueue_waiters;\n\n        while (pipe_size > 0 && enabled && dequeue_enabled )\n            enqueue_sig.wait();\n\n        // let the destructor know we are ending if it is blocked waiting\n        if (enabled == false)\n            unblock_sig.broadcast();\n\n        --enqueue_waiters;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    void pipe<T>::\n    enable (\n    )\n    {\n        auto_mutex M(m);\n        enabled = true;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    void pipe<T>::\n    disable (\n    )\n    {\n        auto_mutex M(m);\n        enabled = false;\n        dequeue_sig.broadcast();\n        enqueue_sig.broadcast();\n        unblock_sig.broadcast();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    bool pipe<T>::\n    is_enabled (\n    ) const\n    {\n        auto_mutex M(m);\n        return enabled;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    size_t pipe<T>::\n    max_size (\n    ) const\n    {\n        auto_mutex M(m);\n        return pipe_max_size;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    size_t pipe<T>::\n    size (\n    ) const\n    {\n        auto_mutex M(m);\n        return pipe_size;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    bool pipe<T>::\n    enqueue (\n        T& item\n    )\n    {\n        auto_mutex M(m);\n        ++enqueue_waiters;\n\n        // wait until there is room or we are disabled \n        while (pipe_size == pipe_max_size && enabled && enqueue_enabled &&\n               !(pipe_max_size == 0 && first == 1) )\n            enqueue_sig.wait();\n\n        if (enabled == false || enqueue_enabled == false)\n        {\n            --enqueue_waiters;\n            // let the destructor know we are unblocking\n            unblock_sig.broadcast();\n            return false;\n        }\n\n        // set the appropriate values for first and last\n        if (pipe_size == 0)\n        {\n            first = 0;\n            last = 0;\n        }\n        else\n        {\n            last = (last+1)%pipe_max_size;\n        }\n\n\n        exchange(item,data[last]);\n\n        // wake up a call to dequeue() if there are any currently blocked\n        if (dequeue_waiters > 0)\n            dequeue_sig.signal();\n\n        if (pipe_max_size > 0)\n        {\n            ++pipe_size;\n        }\n        else\n        {\n            // wait for a dequeue to take the item out\n            while (last == 0 && enabled && enqueue_enabled)\n                enqueue_sig.wait();\n\n            if (last == 0 && (enabled == false || enqueue_enabled == false))\n            {\n                last = 1;\n                first = 1;\n\n                // no one dequeued this object to put it back into item\n                exchange(item,data[0]);\n\n                --enqueue_waiters;\n                // let the destructor know we are unblocking\n                if (unblock_sig_waiters > 0)\n                    unblock_sig.broadcast();\n                return false;\n            }\n\n            last = 1;\n            first = 1;\n\n            // tell any waiting calls to enqueue() that one of them can proceed\n            if (enqueue_waiters > 1)\n                enqueue_sig.broadcast();\n\n            // let the destructor know we are unblocking\n            if (enabled == false && unblock_sig_waiters > 0)\n                unblock_sig.broadcast();\n        }\n\n        --enqueue_waiters;\n        return true;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    bool pipe<T>::\n    dequeue (\n        T& item\n    )\n    {\n        auto_mutex M(m);\n        ++dequeue_waiters;\n\n        if (pipe_size == 0)\n        {\n            // notify wait_for_num_blocked_dequeues()\n            if (unblock_sig_waiters > 0)\n                unblock_sig.broadcast();\n\n            // notify any blocked enqueue_or_timeout() calls\n            if (enqueue_waiters > 0)\n                enqueue_sig.broadcast();\n        }\n\n        // wait until there is something in the pipe or we are disabled \n        while (pipe_size == 0 && enabled && dequeue_enabled &&\n               !(pipe_max_size == 0 && first == 0 && last == 0) )\n            dequeue_sig.wait();\n\n        if (enabled == false || dequeue_enabled == false)\n        {\n            --dequeue_waiters;\n            // let the destructor know we are unblocking\n            unblock_sig.broadcast();\n            return false;\n        }\n\n        exchange(item,data[first]);\n\n        if (pipe_max_size > 0)\n        {\n            // set the appropriate values for first \n            first = (first+1)%pipe_max_size;\n\n            --pipe_size;\n        }\n        else\n        {\n            // let the enqueue waiting on us know that we took the \n            // item out already.\n            last = 1;\n        }\n\n        // wake up a call to enqueue() if there are any currently blocked\n        if (enqueue_waiters > 0)\n            enqueue_sig.broadcast();\n\n        --dequeue_waiters;\n        return true;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    bool pipe<T>::\n    enqueue_or_timeout (\n        T& item,\n        unsigned long timeout\n    )\n    {\n        auto_mutex M(m);\n        ++enqueue_waiters;\n\n        // wait until there is room or we are disabled or \n        // we run out of time.\n        bool timed_out = false;\n        while (pipe_size == pipe_max_size && enabled && enqueue_enabled &&\n               !(pipe_max_size == 0 && dequeue_waiters > 0 && first == 1) )\n        {\n            if (timeout == 0 || enqueue_sig.wait_or_timeout(timeout) == false)\n            {\n                timed_out = true;\n                break;\n            }\n        }\n\n        if (enabled == false || timed_out || enqueue_enabled == false)\n        {\n            --enqueue_waiters;\n            // let the destructor know we are unblocking\n            unblock_sig.broadcast();\n            return false;\n        }\n\n        // set the appropriate values for first and last\n        if (pipe_size == 0)\n        {\n            first = 0;\n            last = 0;\n        }\n        else\n        {\n            last = (last+1)%pipe_max_size;\n        }\n\n\n        exchange(item,data[last]);\n\n        // wake up a call to dequeue() if there are any currently blocked\n        if (dequeue_waiters > 0)\n            dequeue_sig.signal();\n\n        if (pipe_max_size > 0)\n        {\n            ++pipe_size;\n        }\n        else\n        {\n            // wait for a dequeue to take the item out\n            while (last == 0 && enabled && enqueue_enabled)\n                enqueue_sig.wait();\n\n            if (last == 0 && (enabled == false || enqueue_enabled == false))\n            {\n                last = 1;\n                first = 1;\n\n                // no one dequeued this object to put it back into item\n                exchange(item,data[0]);\n\n                --enqueue_waiters;\n                // let the destructor know we are unblocking\n                if (unblock_sig_waiters > 0)\n                    unblock_sig.broadcast();\n                return false;\n            }\n\n            last = 1;\n            first = 1;\n\n            // tell any waiting calls to enqueue() that one of them can proceed\n            if (enqueue_waiters > 1)\n                enqueue_sig.broadcast();\n\n            // let the destructor know we are unblocking\n            if (enabled == false && unblock_sig_waiters > 0)\n                unblock_sig.broadcast();\n        }\n\n        --enqueue_waiters;\n        return true;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    bool pipe<T>::\n    dequeue_or_timeout (\n        T& item,\n        unsigned long timeout\n    )\n    {\n        auto_mutex M(m);\n        ++dequeue_waiters;\n\n        if (pipe_size == 0)\n        {\n            // notify wait_for_num_blocked_dequeues()\n            if (unblock_sig_waiters > 0)\n                unblock_sig.broadcast();\n\n            // notify any blocked enqueue_or_timeout() calls\n            if (enqueue_waiters > 0)\n                enqueue_sig.broadcast();\n        }\n\n        bool timed_out = false;\n        // wait until there is something in the pipe or we are disabled or we timeout.\n        while (pipe_size == 0 && enabled && dequeue_enabled &&\n               !(pipe_max_size == 0 && first == 0 && last == 0) )\n        {\n            if (timeout == 0 || dequeue_sig.wait_or_timeout(timeout) == false)\n            {\n                timed_out = true;\n                break;\n            }\n        }\n\n        if (enabled == false || timed_out || dequeue_enabled == false)\n        {\n            --dequeue_waiters;\n            // let the destructor know we are unblocking\n            unblock_sig.broadcast();\n            return false;\n        }\n\n        exchange(item,data[first]);\n\n        if (pipe_max_size > 0)\n        {\n            // set the appropriate values for first \n            first = (first+1)%pipe_max_size;\n\n            --pipe_size;\n        }\n        else\n        {\n            // let the enqueue waiting on us know that we took the \n            // item out already.\n            last = 1;\n        }\n\n        // wake up a call to enqueue() if there are any currently blocked\n        if (enqueue_waiters > 0)\n            enqueue_sig.broadcast();\n\n        --dequeue_waiters;\n        return true;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    void pipe<T>::\n    wait_for_num_blocked_dequeues (\n        unsigned long num\n    )const\n    {\n        auto_mutex M(m);\n        ++unblock_sig_waiters;\n\n        while ( (dequeue_waiters < num || pipe_size != 0) && enabled && dequeue_enabled)\n            unblock_sig.wait();\n\n        // let the destructor know we are ending if it is blocked waiting\n        if (enabled == false)\n            unblock_sig.broadcast();\n\n        --unblock_sig_waiters;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    bool pipe<T>::\n    is_enqueue_enabled (\n    ) const\n    {\n        auto_mutex M(m);\n        return enqueue_enabled;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    void pipe<T>::\n    disable_enqueue (\n    )\n    {\n        auto_mutex M(m);\n        enqueue_enabled = false;\n        enqueue_sig.broadcast();\n    }\n\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    void pipe<T>::\n    enable_enqueue (\n    )\n    {\n        auto_mutex M(m);\n        enqueue_enabled = true;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    bool pipe<T>::\n    is_dequeue_enabled (\n    ) const\n    {\n        auto_mutex M(m);\n        return dequeue_enabled;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    void pipe<T>::\n    disable_dequeue (\n    )\n    {\n        auto_mutex M(m);\n        dequeue_enabled = false;\n        dequeue_sig.broadcast();\n    }\n\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    void pipe<T>::\n    enable_dequeue (\n    )\n    {\n        auto_mutex M(m);\n        dequeue_enabled = true;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_PIPE_KERNEl_1_\n\n"
  },
  {
    "path": "benchmarks/dlib/pipe/pipe_kernel_abstract.h",
    "content": "// Copyright (C) 2006  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_PIPE_KERNEl_ABSTRACT_ \n#ifdef DLIB_PIPE_KERNEl_ABSTRACT_ \n\n#include \"../threads.h\"\n\nnamespace dlib\n{\n\n    template <\n        typename T\n        >\n    class pipe \n    {\n        /*!\n            REQUIREMENTS ON T\n                T must be swappable by a global swap() \n                T must have a default constructor\n\n            INITIAL VALUE\n                size() == 0\n                is_enabled() == true\n                is_enqueue_enabled() == true\n                is_dequeue_enabled() == true\n\n            WHAT THIS OBJECT REPRESENTS\n                This is a first in first out queue with a fixed maximum size containing \n                items of type T.  It is suitable for passing objects between threads.\n                \n            THREAD SAFETY\n                All methods of this class are thread safe.  You may call them from any\n                thread and any number of threads my call them at once.\n        !*/\n\n    public:\n\n        typedef T type;\n\n        explicit pipe (  \n            size_t maximum_size\n        );\n        /*!\n            ensures                \n                - #*this is properly initialized\n                - #max_size() == maximum_size\n            throws\n                - std::bad_alloc\n                - dlib::thread_error\n        !*/\n\n        virtual ~pipe (\n        );\n        /*!\n            ensures\n                - any resources associated with *this have been released\n                - disables (i.e. sets is_enabled() == false) this object so that \n                  all calls currently blocking on it will return immediately. \n        !*/\n\n        void enable (\n        );\n        /*!\n            ensures\n                - #is_enabled() == true\n        !*/\n\n        void disable (\n        );\n        /*!\n            ensures\n                - #is_enabled() == false\n                - causes all current and future calls to enqueue(), dequeue(),\n                  enqueue_or_timeout() and dequeue_or_timeout() to not block but \n                  to return false immediately until enable() is called.\n                - causes all current and future calls to wait_until_empty() and\n                  wait_for_num_blocked_dequeues() to not block but return\n                  immediately until enable() is called.\n        !*/\n\n        bool is_enabled (\n        ) const;\n        /*!\n            ensures\n                - returns true if this pipe is currently enabled, false otherwise.\n        !*/\n\n        void empty (\n        );\n        /*!\n            ensures\n                - #size() == 0\n        !*/\n\n        void wait_until_empty (\n        ) const;\n        /*!\n            ensures\n                - blocks until one of the following is the case:\n                    - size() == 0  \n                    - is_enabled() == false\n                    - is_dequeue_enabled() == false\n        !*/\n\n        void wait_for_num_blocked_dequeues (\n           unsigned long num\n        ) const;\n        /*!\n            ensures\n                - blocks until one of the following is the case: \n                    - size() == 0 and the number of threads blocked on calls \n                      to dequeue() and dequeue_or_timeout() is greater than \n                      or equal to num.\n                    - is_enabled() == false\n                    - is_dequeue_enabled() == false\n        !*/\n\n        bool is_enqueue_enabled (\n        ) const;\n        /*!\n            ensures\n                - returns true if the enqueue() and enqueue_or_timeout() functions are \n                  currently enabled, returns false otherwise.  (note that the higher \n                  level is_enabled() function can overrule this one.  So if \n                  is_enabled() == false then enqueue functions are still disabled even\n                  if is_enqueue_enabled() returns true.  But if is_enqueue_enabled() == false \n                  then enqueue functions are always disabled no matter the state of \n                  is_enabled())\n        !*/\n\n        void disable_enqueue (\n        );\n        /*!\n            ensures\n                - #is_enqueue_enabled() == false \n                - causes all current and future calls to enqueue() and\n                  enqueue_or_timeout() to not block but to return false \n                  immediately until enable_enqueue() is called.\n        !*/\n\n        void enable_enqueue (\n        );\n        /*!\n            ensures\n                - #is_enqueue_enabled() == true\n        !*/\n\n        bool is_dequeue_enabled (\n        ) const;\n        /*!\n            ensures\n                - returns true if the dequeue() and dequeue_or_timeout() functions are \n                  currently enabled, returns false otherwise.  (note that the higher \n                  level is_enabled() function can overrule this one.  So if \n                  is_enabled() == false then dequeue functions are still disabled even\n                  if is_dequeue_enabled() returns true.  But if is_dequeue_enabled() == false \n                  then dequeue functions are always disabled no matter the state of \n                  is_enabled())\n        !*/\n\n        void disable_dequeue (\n        );\n        /*!\n            ensures\n                - #is_dequeue_enabled() == false \n                - causes all current and future calls to dequeue() and\n                  dequeue_or_timeout() to not block but to return false \n                  immediately until enable_dequeue() is called.\n        !*/\n\n        void enable_dequeue (\n        );\n        /*!\n            ensures\n                - #is_dequeue_enabled() == true\n        !*/\n\n        size_t max_size (\n        ) const;\n        /*!\n            ensures\n                - returns the maximum number of objects of type T that this \n                  pipe can contain.\n        !*/\n\n        size_t size (\n        ) const;\n        /*!\n            ensures\n                - returns the number of objects of type T that this\n                  object currently contains.\n        !*/\n\n        bool enqueue (\n            T& item\n        );\n        /*!\n            ensures\n                - if (size() == max_size()) then\n                    - this call to enqueue() blocks until one of the following is the case:\n                        - there is room in the pipe for another item\n                        - max_size() == 0 and another thread is trying to dequeue from this \n                          pipe and we can pass our item object directly to that thread.\n                        - someone calls disable() \n                        - someone calls disable_enqueue()\n                - else\n                    - this call does not block.\n                - if (this call to enqueue() returns true) then\n                    - #is_enabled() == true \n                    - #is_enqueue_enabled() == true\n                    - if (max_size() == 0) then\n                        - using global swap, item was passed directly to a \n                          thread attempting to dequeue from this pipe\n                    - else\n                        - using global swap, item was added into this pipe.\n                    - #item is in an undefined but valid state for its type \n                - else\n                    - item was NOT added into the pipe\n                    - #item == item (i.e. the value of item is unchanged)\n        !*/\n\n        bool enqueue (T&& item) { return enqueue(item); }\n        /*!\n            enable enqueueing from rvalues \n        !*/\n\n        bool enqueue_or_timeout (\n            T& item,\n            unsigned long timeout\n        );\n        /*!\n            ensures\n                - if (size() == max_size() && timeout > 0) then\n                    - this call to enqueue_or_timeout() blocks until one of the following is the case:\n                        - there is room in the pipe to add another item\n                        - max_size() == 0 and another thread is trying to dequeue from this pipe \n                          and we can pass our item object directly to that thread.\n                        - someone calls disable() \n                        - someone calls disable_enqueue() \n                        - timeout milliseconds passes\n                - else\n                    - this call does not block. \n                - if (this call to enqueue() returns true) then\n                    - #is_enabled() == true \n                    - #is_enqueue_enabled() == true\n                    - if (max_size() == 0) then\n                        - using global swap, item was passed directly to a \n                          thread attempting to dequeue from this pipe\n                    - else\n                        - using global swap, item was added into this pipe.\n                    - #item is in an undefined but valid state for its type\n                - else\n                    - item was NOT added into the pipe\n                    - #item == item (i.e. the value of item is unchanged)\n        !*/\n\n        bool enqueue_or_timeout (T&& item, unsigned long timeout) { return enqueue_or_timeout(item,timeout); }\n        /*!\n            enable enqueueing from rvalues \n        !*/\n\n        bool dequeue (\n            T& item\n        );\n        /*!\n            ensures\n                - if (size() == 0) then\n                    - this call to dequeue() blocks until one of the following is the case:\n                        - there is something in the pipe we can dequeue\n                        - max_size() == 0 and another thread is trying to enqueue an item \n                          onto this pipe and we can receive our item directly from that thread.  \n                        - someone calls disable()\n                        - someone calls disable_dequeue()\n                - else\n                    - this call does not block.\n                - if (this call to dequeue() returns true) then\n                    - #is_enabled() == true \n                    - #is_dequeue_enabled() == true \n                    - the oldest item that was enqueued into this pipe has been\n                      swapped into #item.\n                - else\n                    - nothing was dequeued from this pipe.\n                    - #item == item (i.e. the value of item is unchanged)\n        !*/\n\n        bool dequeue_or_timeout (\n            T& item,\n            unsigned long timeout\n        );\n        /*!\n            ensures\n                - if (size() == 0 && timeout > 0) then\n                    - this call to dequeue_or_timeout() blocks until one of the following is the case:\n                        - there is something in the pipe we can dequeue \n                        - max_size() == 0 and another thread is trying to enqueue an item onto this \n                          pipe and we can receive our item directly from that thread.  \n                        - someone calls disable() \n                        - someone calls disable_dequeue()\n                        - timeout milliseconds passes\n                - else\n                    - this call does not block.\n                - if (this call to dequeue_or_timeout() returns true) then\n                    - #is_enabled() == true \n                    - #is_dequeue_enabled() == true \n                    - the oldest item that was enqueued into this pipe has been\n                      swapped into #item.\n                - else\n                    - nothing was dequeued from this pipe.\n                    - #item == item (i.e. the value of item is unchanged)\n        !*/\n\n    private:\n\n        // restricted functions\n        pipe(const pipe&);        // copy constructor\n        pipe& operator=(const pipe&);    // assignment operator\n\n    };    \n\n}\n\n#endif // DLIB_PIPE_KERNEl_ABSTRACT_\n\n"
  },
  {
    "path": "benchmarks/dlib/pipe.h",
    "content": "// Copyright (C) 2006  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_PIPe_\n#define DLIB_PIPe_ \n\n#include \"pipe/pipe_kernel_1.h\"\n\n\n#endif // DLIB_PIPe_\n\n"
  },
  {
    "path": "benchmarks/dlib/platform.h",
    "content": "// Copyright (C) 2006  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n\n#ifdef DLIB_ALL_SOURCE_END\n#include \"dlib_basic_cpp_build_tutorial.txt\"\n#endif\n\n#ifndef DLIB_PLATFORm_\n#define DLIB_PLATFORm_\n\n\n/*!\n    This file ensures that:\n        - if (we are compiling under a posix platform) then\n            - DLIB_POSIX will be defined\n            - if (this is also Mac OS X) then\n                - MACOSX will be defined\n            - if (this is also HP-UX) then\n                - HPUX will be defined\n        - if (we are compiling under an MS Windows platform) then\n            - WIN32 will be defined\n!*/\n\n\n/*\n    A good reference for this sort of information is\n    http://predef.sourceforge.net/\n*/\n\n// Define WIN32 if this is MS Windows\n#ifndef WIN32\n    #if defined( _MSC_VER) || defined(__BORLANDC__) || defined(_WIN32) || defined(__WIN32__) || defined(__TOS_WIN__)\n    #define WIN32 \n    #endif \n#endif\n\n#ifndef WIN32\n    // since this is the only other platform the library currently supports\n    // just assume it is DLIB_POSIX if it isn't WIN32\n    #ifndef DLIB_POSIX\n        #define DLIB_POSIX\n    #endif\n \n    #ifndef HPUX\n       #if defined(__hpux ) || defined(hpux) || defined (_hpux)\n       #define HPUX\n       #endif\t\n    #endif\n\n    #ifndef MACOSX\n        #ifdef __MACOSX__\n        #define MACOSX\n        #endif \n        #ifdef __APPLE__\n        #define MACOSX\n        #endif\n    #endif\n\n#endif\n\n\n\n\n#endif // DLIB_PLATFORm_\n\n"
  },
  {
    "path": "benchmarks/dlib/queue/queue_kernel_1.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_QUEUE_KERNEl_1_\n#define DLIB_QUEUE_KERNEl_1_\n\n#include \"queue_kernel_abstract.h\"\n#include \"../algs.h\"\n#include \"../interfaces/enumerable.h\"\n#include \"../interfaces/remover.h\"\n#include \"../serialize.h\"\n\nnamespace dlib\n{\n\n    template <\n        typename T,\n        typename mem_manager = default_memory_manager\n        >\n    class queue_kernel_1 : public enumerable<T>,\n                           public remover<T>\n    {\n\n        /*!\n            INITIAL VALUE\n                queue_size == 0   \n                current_element == 0\n                at_start_ == true\n            \n            CONVENTION\n                queue_size == the number of elements in the queue\n                at_start() == at_start_\n                current_element_valid() == (current_element != 0)\n                element() == current_element->item\n\n                if (queue_size > 0)\n                {\n                    in points to the last element to be inserted into the queue\n                    out points to the next element to be dequeued\n\n                    each node points to the node inserted after it except for the most \n                    recently inserted node\n\n                    current_element == 0\n                }\n                \n        !*/\n\n\n        struct node\n        {\n            node* last;\n\n            T item;\n        };\n\n\n        public:\n\n            typedef T type;\n            typedef mem_manager mem_manager_type;\n\n            queue_kernel_1 (\n            ) :\n                in(0),\n                out(0),\n                queue_size(0),\n                current_element(0),\n                at_start_(true)\n            {\n            }\n\n            virtual ~queue_kernel_1 (\n            ); \n\n            inline void clear(\n            );\n\n            void enqueue (\n                T& item\n            );\n\n            void dequeue (\n                T& item\n            );\n\n            void cat (\n                queue_kernel_1& item\n            );\n\n            T& current (\n            );\n\n            const T& current (\n            ) const;\n            \n            void swap (\n                queue_kernel_1& item\n            );\n\n            // functions from the remover interface\n            inline void remove_any (\n                T& item\n            );\n\n            // functions from the enumerable interface\n            inline size_t size (\n            ) const;\n\n            inline bool at_start (\n            ) const;\n\n            inline void reset (\n            ) const;\n\n            bool current_element_valid (\n            ) const;\n\n            inline const T& element (\n            ) const;\n\n            inline T& element (\n            );\n\n            bool move_next (\n            ) const;\n\n        private:\n\n            void delete_nodes (\n                node* start,\n                unsigned long length\n            );\n            /*!\n                requires\n                    - start points to a node in a singly linked list \n                    - start->last points to the next node in the list \n                    - there are at least length nodes in the list beginning with start\n                ensures\n                    - length nodes have been deleted starting with the node pointed \n                      to by start\n            !*/\n\n            // data members\n\n            node* in;\n            node* out;\n            unsigned long queue_size;\n            mutable node* current_element;\n            mutable bool at_start_;\n\n            // restricted functions\n            queue_kernel_1(queue_kernel_1&);        // copy constructor\n            queue_kernel_1& operator=(queue_kernel_1&);    // assignment operator\n\n    };\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    inline void swap (\n        queue_kernel_1<T,mem_manager>& a, \n        queue_kernel_1<T,mem_manager>& b \n    ) { a.swap(b); } \n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    void deserialize (\n        queue_kernel_1<T,mem_manager>& item,  \n        std::istream& in\n    )\n    {\n        try\n        {\n            item.clear();\n            unsigned long size;\n            deserialize(size,in);\n            T temp;\n            for (unsigned long i = 0; i < size; ++i)\n            {\n                deserialize(temp,in);\n                item.enqueue(temp);\n            }\n        }\n        catch (serialization_error& e)\n        { \n            item.clear();\n            throw serialization_error(e.info + \"\\n   while deserializing object of type queue_kernel_1\"); \n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // member function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    queue_kernel_1<T,mem_manager>::\n    ~queue_kernel_1 (\n    )\n    {\n        delete_nodes(out,queue_size);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    void queue_kernel_1<T,mem_manager>::\n    clear (\n    )\n    {\n        delete_nodes(out,queue_size);\n        queue_size = 0;\n\n        // put the enumerator at the start\n        reset();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    void queue_kernel_1<T,mem_manager>::\n    enqueue (\n        T& item\n    )\n    {\n        // make new node\n        node* temp = new node;\n\n        // swap item into new node\n        exchange(item,temp->item);\n        \n        if (queue_size == 0)\n            out = temp;\n        else\n            in->last = temp;\n\n        // make in point to the new node\n        in = temp;\n        \n        ++queue_size;\n\n        // put the enumerator at the start\n        reset();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    void queue_kernel_1<T,mem_manager>::\n    dequeue (\n        T& item\n    )\n    {\n        // swap out into item\n        exchange(item,out->item);\n\n        --queue_size;\n\n        if (queue_size == 0)\n        {\n            delete out;\n        }\n        else\n        {\n            node* temp = out;\n            \n            // move out pointer to the next element in the queue\n            out = out->last;\n\n            // delete old node\n            delete temp;\n        }\n\n        // put the enumerator at the start\n        reset();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    void queue_kernel_1<T,mem_manager>::\n    cat (\n        queue_kernel_1<T,mem_manager>& item\n    )\n    {\n        if (item.queue_size > 0)\n        {\n            if (queue_size > 0)\n            {\n                in->last = item.out;\n            }\n            else\n            {\n                out = item.out;\n            }\n\n\n            in = item.in;\n            queue_size += item.queue_size;\n            item.queue_size = 0;\n        }\n\n        // put the enumerator at the start\n        reset();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    T& queue_kernel_1<T,mem_manager>::\n    current (\n    )\n    {\n        return out->item;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    const T& queue_kernel_1<T,mem_manager>::\n    current (\n    ) const\n    {\n        return out->item;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    void queue_kernel_1<T,mem_manager>::\n    swap (\n        queue_kernel_1<T,mem_manager>& item\n    )\n    {\n        node* in_temp = in;\n        node* out_temp = out;\n        unsigned long queue_size_temp = queue_size;\n        node* current_element_temp = current_element;\n        bool at_start_temp = at_start_;\n\n        in = item.in;\n        out = item.out;\n        queue_size = item.queue_size;\n        current_element = item.current_element;\n        at_start_ = item.at_start_;\n\n        item.in = in_temp;\n        item.out = out_temp;\n        item.queue_size = queue_size_temp;\n        item.current_element = current_element_temp;\n        item.at_start_ = at_start_temp;\n    }\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // enumerable function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    bool queue_kernel_1<T,mem_manager>::\n    at_start (\n    ) const\n    {\n        return at_start_;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    size_t queue_kernel_1<T,mem_manager>::\n    size (\n    ) const\n    {\n        return queue_size;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    void queue_kernel_1<T,mem_manager>::\n    reset (\n    ) const\n    {\n        at_start_ = true;\n        current_element = 0;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    bool queue_kernel_1<T,mem_manager>::\n    current_element_valid (\n    ) const\n    {\n        return (current_element != 0);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    const T& queue_kernel_1<T,mem_manager>::\n    element (\n    ) const\n    {\n        return current_element->item;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    T& queue_kernel_1<T,mem_manager>::\n    element (\n    )\n    {\n        return current_element->item;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    bool queue_kernel_1<T,mem_manager>::\n    move_next (\n    ) const\n    {\n        if (at_start_)\n        {\n            at_start_ = false;\n            // if the queue is empty then there is nothing to do\n            if (queue_size == 0)\n            {\n                return false;\n            }\n            else\n            {\n                current_element = out;\n                return true;\n            }\n        }\n        else\n        {\n            // if we are at the last element then the enumeration has finished\n            if (current_element == in || current_element == 0)\n            {\n                current_element = 0;\n                return false;\n            }\n            else\n            {\n                current_element = current_element->last;\n                return true;\n            }           \n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // remover function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    void queue_kernel_1<T,mem_manager>::\n    remove_any (\n        T& item\n    ) \n    {\n        dequeue(item);\n    }\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // private member function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    void queue_kernel_1<T,mem_manager>::\n    delete_nodes (\n        node* start,\n        unsigned long length\n    )\n    {\n        node* temp;\n        while (length)\n        {\n            temp = start->last;\n            delete start;\n            start = temp;\n            --length;\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_QUEUE_KERNEl_1_\n\n"
  },
  {
    "path": "benchmarks/dlib/queue/queue_kernel_2.h",
    "content": "// Copyright (C) 2004  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_QUEUE_KERNEl_2_\n#define DLIB_QUEUE_KERNEl_2_\n\n#include \"queue_kernel_abstract.h\"\n#include \"../algs.h\"\n#include \"../assert.h\"\n#include \"../interfaces/enumerable.h\"\n#include \"../interfaces/remover.h\"\n#include \"../serialize.h\"\n\nnamespace dlib\n{\n\n    template <\n        typename T,\n        unsigned long block_size,\n        typename mem_manager = default_memory_manager\n        >\n    class queue_kernel_2 : public enumerable<T>,\n                           public remover<T>\n    {\n\n        /*!\n            REQUIREMENTS ON block_size\n                0 < block_size < 2000000000\n\n            INITIAL VALUE\n                queue_size == 0   \n                current_element == 0\n                at_start_ == true\n            \n            CONVENTION\n                queue_size == the number of elements in the queue\n                at_start() == at_start_\n                current_element_valid() == (current_element != 0)\n                if (current_element_valid()) then\n                    element() == current_element->item[current_element_pos]\n\n                if (queue_size > 0)                \n                {                    \n                    in->item[in_pos] == the spot where we will put the next item added\n                                        into the queue\n                    out->item[out_pos] == current()\n\n                    when enqueuing elements inside each node item[0] is filled first, then \n                    item[1], then item[2], etc.\n                                                         \n\n                    each node points to the node inserted after it except for the most \n                    recently inserted node.  \n                }\n                \n        !*/\n\n\n        struct node\n        {\n            node* next;\n\n            T item[block_size];\n        };\n\n        \n        public:\n\n            typedef T type;\n            typedef mem_manager mem_manager_type;\n\n            queue_kernel_2 (\n            ) :\n                in(0),\n                out(0),\n                queue_size(0),\n                current_element(0),\n                at_start_(true)\n            {\n            }\n\n            virtual ~queue_kernel_2 (\n            ); \n\n            inline void clear(\n            );\n\n            void enqueue (\n                T& item\n            );\n\n            void dequeue (\n                T& item\n            );\n\n            void cat (\n                queue_kernel_2& item\n            );\n\n            T& current (\n            );\n\n            const T& current (\n            ) const;            \n\n            void swap (\n                queue_kernel_2& item\n            );\n\n            // functions from the remover interface\n            inline void remove_any (\n                T& item\n            );\n\n            // functions from the enumerable interface\n            inline size_t size (\n            ) const;\n\n            inline bool at_start (\n            ) const;\n\n            inline void reset (\n            ) const;\n\n            bool current_element_valid (\n            ) const;\n\n            inline const T& element (\n            ) const;\n\n            inline T& element (\n            );\n\n            bool move_next (\n            ) const;\n\n        private:\n\n            void delete_nodes (\n                node* start,\n                node* end\n            );\n            /*!\n                requires\n                    - start points to a node in a singly linked list \n                    - start->next points to the next node in the list \n                    - by following the next pointers you eventually hit the node pointed\n                      to by end\n                ensures\n                    - calls delete on the start node, the end node, and all nodes in between\n            !*/\n\n            // data members\n\n            typename mem_manager::template rebind<node>::other pool; \n\n            node* in;\n            node* out;\n            size_t queue_size;\n            size_t in_pos;\n            size_t out_pos;\n\n\n            mutable node* current_element;\n            mutable size_t current_element_pos;\n            mutable bool at_start_;\n\n            // restricted functions\n            queue_kernel_2(queue_kernel_2&);        // copy constructor\n            queue_kernel_2& operator=(queue_kernel_2&);    // assignment operator\n\n    };\n\n    template <\n        typename T,\n        unsigned long block_size,\n        typename mem_manager\n        >\n    inline void swap (\n        queue_kernel_2<T,block_size,mem_manager>& a, \n        queue_kernel_2<T,block_size,mem_manager>& b \n    ) { a.swap(b); } \n\n    template <\n        typename T,\n        unsigned long block_size,\n        typename mem_manager\n        >\n    void deserialize (\n        queue_kernel_2<T,block_size,mem_manager>& item, \n        std::istream& in\n    )\n    {\n        try\n        {\n            item.clear();\n            unsigned long size;\n            deserialize(size,in);\n            T temp;\n            for (unsigned long i = 0; i < size; ++i)\n            {\n                deserialize(temp,in);\n                item.enqueue(temp);\n            }\n        }\n        catch (serialization_error& e)\n        { \n            item.clear();\n            throw serialization_error(e.info + \"\\n   while deserializing object of type queue_kernel_2\"); \n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // member function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        unsigned long block_size,\n        typename mem_manager\n        >\n    queue_kernel_2<T,block_size,mem_manager>::\n    ~queue_kernel_2 (\n    )\n    {\n        COMPILE_TIME_ASSERT(0 < block_size && block_size < (unsigned long)(2000000000));\n\n        if (queue_size > 0)\n            delete_nodes(out,in);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        unsigned long block_size,\n        typename mem_manager\n        >\n    void queue_kernel_2<T,block_size,mem_manager>::\n    clear (\n    )\n    {\n        if (queue_size > 0)\n        {\n            delete_nodes(out,in);\n            queue_size = 0;\n        }\n\n        // put the enumerator at the start\n        reset();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        unsigned long block_size,\n        typename mem_manager\n        >\n    void queue_kernel_2<T,block_size,mem_manager>::\n    enqueue (\n        T& item\n    )\n    {\n        if (queue_size == 0)\n        {\n            out = in = pool.allocate();\n            in_pos = 0;\n            out_pos = 0;\n        }\n        else if (in_pos >= block_size)\n        {            \n            in->next = pool.allocate();\n            in_pos = 0;\n            in = in->next;\n        }\n\n        exchange(item,in->item[in_pos]);\n        ++in_pos;\n\n        ++queue_size;\n\n        // put the enumerator at the start\n        reset();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        unsigned long block_size,\n        typename mem_manager\n        >\n    void queue_kernel_2<T,block_size,mem_manager>::\n    dequeue (\n        T& item\n    )\n    {\n        // swap out into item\n        exchange(item,out->item[out_pos]);\n        \n        ++out_pos;\n        --queue_size;\n\n        // if this was the last element in this node then remove this node\n        if (out_pos == block_size)\n        {\n            out_pos = 0;\n            node* temp = out;\n            out = out->next;\n            pool.deallocate(temp);\n        }\n        else if (queue_size == 0)\n        {\n            pool.deallocate(out);\n        }\n\n        // put the enumerator at the start\n        reset();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        unsigned long block_size,\n        typename mem_manager\n        >\n    void queue_kernel_2<T,block_size,mem_manager>::\n    cat (\n        queue_kernel_2<T,block_size,mem_manager>& item\n    )\n    {\n        if (queue_size > 0)\n        {\n            T temp;\n            assign_zero_if_built_in_scalar_type(temp);\n            while (item.size() > 0)\n            {\n                item.dequeue(temp);\n                enqueue(temp);\n            }\n        }\n        else\n        {\n            in = item.in;\n            out = item.out;\n            out_pos = item.out_pos;\n            in_pos = item.in_pos;\n\n            queue_size = item.queue_size;\n            item.queue_size = 0;\n\n            // put the enumerator at the start\n            reset();\n        }       \n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        unsigned long block_size,\n        typename mem_manager\n        >\n    T& queue_kernel_2<T,block_size,mem_manager>::\n    current (\n    )\n    {\n        return out->item[out_pos];\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        unsigned long block_size,\n        typename mem_manager\n        >\n    const T& queue_kernel_2<T,block_size,mem_manager>::\n    current (\n    ) const\n    {\n        return out->item[out_pos];\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        unsigned long block_size,\n        typename mem_manager\n        >\n    void queue_kernel_2<T,block_size,mem_manager>::\n    swap (\n        queue_kernel_2<T,block_size,mem_manager>& item\n    )\n    {\n        exchange(in,item.in);\n        exchange(out,item.out);\n        exchange(queue_size,item.queue_size);\n        exchange(in_pos,item.in_pos);\n        exchange(out_pos,item.out_pos);\n        exchange(current_element,item.current_element);\n        exchange(current_element_pos,item.current_element_pos);\n        exchange(at_start_,item.at_start_);        \n        pool.swap(item.pool);\n    }\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // enumerable function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        unsigned long block_size,\n        typename mem_manager\n        >\n    size_t queue_kernel_2<T,block_size,mem_manager>::\n    size (\n    ) const\n    {\n        return queue_size;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        unsigned long block_size,\n        typename mem_manager\n        >\n    bool queue_kernel_2<T,block_size,mem_manager>::\n    at_start (\n    ) const\n    {\n        return at_start_;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        unsigned long block_size,\n        typename mem_manager\n        >\n    void queue_kernel_2<T,block_size,mem_manager>::\n    reset (\n    ) const\n    {\n        at_start_ = true;\n        current_element = 0;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        unsigned long block_size,\n        typename mem_manager\n        >\n    bool queue_kernel_2<T,block_size,mem_manager>::\n    current_element_valid (\n    ) const\n    {\n        return (current_element != 0);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        unsigned long block_size,\n        typename mem_manager\n        >\n    const T& queue_kernel_2<T,block_size,mem_manager>::\n    element (\n    ) const\n    {\n        return current_element->item[current_element_pos];\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        unsigned long block_size,\n        typename mem_manager\n        >\n    T& queue_kernel_2<T,block_size,mem_manager>::\n    element (\n    )\n    {\n        return current_element->item[current_element_pos];\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        unsigned long block_size,\n        typename mem_manager\n        >\n    bool queue_kernel_2<T,block_size,mem_manager>::\n    move_next (\n    ) const\n    {\n        if (at_start_)\n        {\n            at_start_ = false;\n            // if the queue is empty then there is nothing to do\n            if (queue_size == 0)\n            {\n                return false;\n            }\n            else\n            {\n                current_element = out;\n                current_element_pos = out_pos;\n                return true;\n            }\n        }\n        else if (current_element == 0)\n        {\n            return false;\n        }\n        else\n        {\n            ++current_element_pos;\n            // if we are at the last element then the enumeration has finished\n            if (current_element == in && current_element_pos == in_pos )\n            {\n                current_element = 0;\n                return false;\n            }\n            else if (current_element_pos == block_size)\n            {\n                current_element_pos = 0;\n                current_element = current_element->next;               \n            }           \n\n            return true;\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // remover function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        unsigned long block_size,\n        typename mem_manager\n        >\n    void queue_kernel_2<T,block_size,mem_manager>::\n    remove_any (\n        T& item\n    ) \n    {\n        dequeue(item);\n    }\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // private member function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        unsigned long block_size,\n        typename mem_manager\n        >\n    void queue_kernel_2<T,block_size,mem_manager>::\n    delete_nodes (\n        node* start,\n        node* end\n    )\n    {\n        node* temp;\n        while (start != end)\n        {\n            temp = start;\n            start = start->next;\n            pool.deallocate(temp);\n        }\n        pool.deallocate(start);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_QUEUE_KERNEl_2_\n\n"
  },
  {
    "path": "benchmarks/dlib/queue/queue_kernel_abstract.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_QUEUE_KERNEl_ABSTRACT_\n#ifdef DLIB_QUEUE_KERNEl_ABSTRACT_\n\n#include \"../interfaces/enumerable.h\"\n#include \"../interfaces/remover.h\"\n#include \"../serialize.h\"\n#include \"../algs.h\"\n\nnamespace dlib\n{\n\n    template <\n        typename T,\n        typename mem_manager = default_memory_manager\n        >\n    class queue : public enumerable<T>,\n                  public remover<T>\n    {\n\n        /*!\n            REQUIREMENTS ON T\n                T must be swappable by a global swap() \n                T must have a default constructor\n\n            REQUIREMENTS ON mem_manager\n                must be an implementation of memory_manager/memory_manager_kernel_abstract.h or\n                must be an implementation of memory_manager_global/memory_manager_global_kernel_abstract.h or\n                must be an implementation of memory_manager_stateless/memory_manager_stateless_kernel_abstract.h \n                mem_manager::type can be set to anything.\n\n            POINTERS AND REFERENCES TO INTERNAL DATA\n                swap() and current() functions do not invalidate pointers or \n                references to internal data.\n                All other functions have no such guarantee.\n\n            INITIAL VALUE\n                size() == 0    \n\n            ENUMERATION ORDER\n                The enumerator will iterate over the elements in the queue in the\n                same order they would be removed by repeated calls to dequeue().\n                (e.g. current() would be the first element enumerated)\n\n            WHAT THIS OBJECT REPRESENTS\n                This is a first in first out queue containing items of type T\n                \n                e.g. if the queue is {b,c,d,e} and then 'a' is enqueued\n                the queue becomes {a,b,c,d,e} and then calling dequeue takes e out\n                making the queue {a,b,c,d}\n\n                Also note that unless specified otherwise, no member functions\n                of this object throw exceptions.\n        !*/\n        \n        public:\n\n            typedef T type;\n            typedef mem_manager mem_manager_type;\n\n            queue (\n            );\n            /*!\n                ensures \n                    - #*this is properly initialized\n                throws\n                    - std::bad_alloc or any exception thrown by T's constructor\n            !*/\n\n            virtual ~queue (\n            ); \n            /*!\n                ensures\n                    - all memory associated with *this has been released\n            !*/\n\n            void clear(\n            );\n            /*!\n                ensures\n                    - #*this has its initial value\n                throws\n                    - std::bad_alloc or any exception thrown by T's constructor\n                        if this exception is thrown then *this is unusable \n                        until clear() is called and succeeds\n            !*/\n\n            void enqueue (\n                T& item\n            );\n            /*!\n                ensures\n                    - item is now at the left end of #*this  \n                    - #item has an initial value for its type \n                    - #size() == size() + 1\n                    - #at_start() == true\n                throws\n                    - std::bad_alloc or any exception thrown by T's constructor\n                        if enqueue() throws then it has no effect\n            !*/\n\n            void dequeue (\n                T& item\n            );\n            /*!\n                requires\n                    - size() != 0\n                ensures\n                    - #size() == size() - 1\n                    - the far right element of *this has been removed and swapped \n                      into #item \n                    - #at_start() == true\n            !*/\n\n            void cat (\n                queue& item\n            );\n            /*!\n                ensures\n                    - item has been concatenated onto the left end of *this. \n                      i.e. item.current() is attached onto the left end of *this and\n                      the left most element in item will also be the left most item \n                      in #*this \n                    - #size() == size() + item.size() \n                    - #item has its initial value \n                    - #at_start() == true\n                throws\n                    - std::bad_alloc or any exception thrown by T's constructor\n                        if cat() throws then the state of #item and *this is undefined\n                        until clear() is successfully called on them.\n            !*/\n\n            T& current (\n            );\n            /*!\n                requires\n                    - size() != 0\n                ensures\n                    - returns a const reference to the next element to be dequeued.\n                      i.e.  the right most element.\n            !*/\n\n            const T& current (\n            ) const;\n            /*!\n                requires\n                    - size() != 0\n                ensures\n                    - returns a non-const reference to the next element to be dequeued.\n                      i.e.  the right most element.\n            !*/\n            \n            void swap (\n                queue& item\n            );\n            /*!\n                ensures\n                    - swaps *this and item\n            !*/ \n\n        private:\n\n            // restricted functions\n            queue(queue&);        // copy constructor\n            queue& operator=(queue&);    // assignment operator\n\n    };\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    inline void swap (\n        queue<T,mem_manager>& a, \n        queue<T,mem_manager>& b \n    ) { a.swap(b); }   \n    /*!\n        provides a global swap function\n    !*/\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    void deserialize (\n        queue<T,mem_manager>& item, \n        std::istream& in\n    );   \n    /*!\n        provides deserialization support \n    !*/\n}\n\n#endif // DLIB_QUEUE_KERNEl_ABSTRACT_\n\n"
  },
  {
    "path": "benchmarks/dlib/queue/queue_kernel_c.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_QUEUE_KERNEl_C_\n#define DLIB_QUEUE_KERNEl_C_\n\n#include \"queue_kernel_abstract.h\"\n#include \"../algs.h\"\n#include \"../assert.h\"\n\nnamespace dlib\n{\n\n\n    template <\n        typename queue_base // is an implementation of queue_kernel_abstract.h\n        >\n    class queue_kernel_c : public queue_base\n    {\n        typedef typename queue_base::type T;\n\n        public:\n\n            void dequeue (\n                T& item\n            );\n\n            T& current (\n            );\n\n            const T& current (\n            ) const;\n\n            const T& element (\n            ) const;\n\n            T& element (\n            );\n\n            void remove_any (\n                T& item\n            );\n\n    };\n\n    template <\n        typename queue_base\n        >\n    inline void swap (\n        queue_kernel_c<queue_base>& a, \n        queue_kernel_c<queue_base>& b \n    ) { a.swap(b); }\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // member function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename queue_base\n        >\n    void queue_kernel_c<queue_base>::\n    dequeue (\n        T& item\n    )\n    {\n\n        // make sure requires clause is not broken\n        DLIB_CASSERT(this->size() != 0,\n            \"\\tvoid queue::dequeue\"\n            << \"\\n\\tsize of queue should not be zero\"\n            << \"\\n\\tthis: \" << this\n            );\n\n        // call the real function\n        queue_base::dequeue(item);\n\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename queue_base\n        >\n    const typename queue_base::type& queue_kernel_c<queue_base>::\n    current (\n    ) const\n    {\n        // make sure requires clause is not broken\n        DLIB_CASSERT(this->size() != 0,\n            \"\\tconst T& queue::current\"\n            << \"\\n\\tsize of queue should not be zero\"\n            << \"\\n\\tthis: \" << this\n            );\n\n        // call the real function\n        return queue_base::current();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename queue_base\n        >\n    typename queue_base::type& queue_kernel_c<queue_base>::\n    current (\n    ) \n    {\n        // make sure requires clause is not broken\n        DLIB_CASSERT(this->size() != 0,\n            \"\\tT& queue::current\"\n            << \"\\n\\tsize of queue should not be zero\"\n            << \"\\n\\tthis: \" << this\n            );\n\n        // call the real function\n        return queue_base::current();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename queue_base\n        >\n    const typename queue_base::type& queue_kernel_c<queue_base>::\n    element (\n    ) const\n    {\n        // make sure requires clause is not broken\n        DLIB_CASSERT(this->current_element_valid() == true,\n            \"\\tconst T& queue::element\"\n            << \"\\n\\tyou can't access the current element if it doesn't exist\"\n            << \"\\n\\tthis: \" << this\n            );\n\n        // call the real function\n        return queue_base::element();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename queue_base\n        >\n    typename queue_base::type& queue_kernel_c<queue_base>::\n    element (\n    ) \n    {\n        // make sure requires clause is not broken\n        DLIB_CASSERT(this->current_element_valid() == true,\n            \"\\tT& queue::element\"\n            << \"\\n\\tyou can't access the current element if it doesn't exist\"\n            << \"\\n\\tthis: \" << this\n            );\n\n        // call the real function\n        return queue_base::element();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename queue_base\n        >\n    void queue_kernel_c<queue_base>::\n    remove_any (\n        T& item\n    ) \n    {\n        // make sure requires clause is not broken\n        DLIB_CASSERT( (this->size() > 0),\n            \"\\tvoid queue::remove_any\"\n            << \"\\n\\tsize() must be greater than zero if something is going to be removed\"\n            << \"\\n\\tsize(): \" << this->size() \n            << \"\\n\\tthis:   \" << this\n            );\n\n        // call the real function\n        queue_base::remove_any(item);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_QUEUE_KERNEl_C_\n\n"
  },
  {
    "path": "benchmarks/dlib/queue/queue_sort_1.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_QUEUE_SORt_1_\n#define DLIB_QUEUE_SORt_1_\n\n#include \"queue_sort_abstract.h\"\n#include \"../algs.h\"\n#include <vector>\n#include \"../sort.h\"\n\nnamespace dlib\n{\n\n    template <\n        typename queue_base \n        >\n    class queue_sort_1 : public queue_base\n    {\n        typedef typename queue_base::type T;\n\n        public:\n\n            /*!\n                This implementation uses the QuickSort algorithm and\n                when the quicksort depth goes too high it uses the dlib::qsort_array()\n                function on the data.\n            !*/\n\n            void sort (\n            );\n\n            template <typename compare_type>\n            void sort (\n                const compare_type& compare\n            )\n            {\n                if (this->size() > 1)\n                {\n                    sort_this_queue(*this,0,compare);\n                }\n            }\n\n        private:\n\n            template <typename compare_type>\n            void sort_this_queue (\n                queue_base& queue,\n                long depth,\n                const compare_type& compare\n            )\n            /*!\n                ensures\n                    each element in the queue is < the element behind it according\n                    to compare\n            !*/\n            {\n                if (queue.size() <= 1)\n                {\n                    // already sorted\n                }\n                else if (queue.size() <= 29)\n                {\n                    T vect[29];\n                    const unsigned long size = queue.size();\n                    for (unsigned long i = 0; i < size; ++i)\n                    {\n                        queue.dequeue(vect[i]);\n                    }\n                    isort_array(vect,0,size-1,compare);\n                    for (unsigned long i = 0; i < size; ++i)\n                    {\n                        queue.enqueue(vect[i]);\n                    }\n                }\n                else if (depth > 50)\n                {\n                    std::vector<T> vect(queue.size());\n                    for (unsigned long i = 0; i < vect.size(); ++i)\n                    {\n                        queue.dequeue(vect[i]);\n                    }\n                    hsort_array(vect,0,vect.size()-1,compare);\n                    for (unsigned long i = 0; i < vect.size(); ++i)\n                    {\n                        queue.enqueue(vect[i]);\n                    }\n                }\n                else\n                {\n                    queue_base left, right;\n                    T partition_element;\n                    T temp;\n                    // do this just to avoid a compiler warning\n                    assign_zero_if_built_in_scalar_type(temp);\n                    assign_zero_if_built_in_scalar_type(partition_element);\n\n                    queue.dequeue(partition_element);\n\n                    // partition queue into left and right\n                    while (queue.size() > 0)\n                    {\n                        queue.dequeue(temp);\n                        if (compare(temp , partition_element))\n                        {\n                            left.enqueue(temp);\n                        }\n                        else\n                        {\n                            right.enqueue(temp);\n                        }\n                    }\n\n\n                    long ratio;\n                    if (left.size() > right.size())\n                        ratio = left.size()/(right.size()+1);  // add 1 so we can't divide by zero\n                    else\n                        ratio = right.size()/(left.size()+1);\n\n                    sort_this_queue(left,ratio+depth,compare);\n                    sort_this_queue(right,ratio+depth,compare);\n\n                    // combine the two queues\n                    left.swap(queue);\n                    queue.enqueue(partition_element);\n                    queue.cat(right);\n                }\n            }\n\n\n    };\n\n    template <\n        typename queue_base\n        >\n    inline void swap (\n        queue_sort_1<queue_base>& a, \n        queue_sort_1<queue_base>& b \n    ) { a.swap(b); }   \n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // member function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename queue_base\n        >\n    void queue_sort_1<queue_base>::\n    sort (\n    )\n    {\n        if (this->size() > 1)\n        {\n            sort_this_queue(*this,0,std::less<typename queue_base::type>());\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_QUEUE_SORt_1_\n\n"
  },
  {
    "path": "benchmarks/dlib/queue/queue_sort_abstract.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_QUEUE_SORt_ABSTRACT_\n#ifdef DLIB_QUEUE_SORt_ABSTRACT_\n\n\n#include \"queue_kernel_abstract.h\"\n\nnamespace dlib\n{\n\n    template <\n        typename queue_base\n        >\n    class queue_sort : public queue_base\n    {\n\n        /*!\n            REQUIREMENTS ON QUEUE_BASE\n                - is an implementation of queue/queue_kernel_abstract.h\n                - queue_base::type must be a type with that is comparable via operator<\n\n            POINTERS AND REFERENCES TO INTERNAL DATA\n                sort() may invalidate pointers and references to internal data.\n\n            WHAT THIS EXTENSION DOES FOR QUEUE\n                This gives a queue the ability to sort its contents by calling sort().\n        !*/\n\n\n        public:\n\n            void sort (\n            );\n            /*!\n                ensures\n                    - for all elements in #*this the ith element is <= the i+1 element\n                    - #at_start() == true\n                throws\n                    - std::bad_alloc or any exception thrown by T's constructor\n                        data may be lost if sort() throws\n            !*/\n\n            template <typename compare_type>\n            void sort (\n                const compare_type& compare\n            );\n            /*!\n                ensures\n                    - for all elements in #*this the ith element is <= the i+1 element\n                    - uses compare(a,b) as the < operator.  So if compare(a,b) == true\n                      then a comes before b in the resulting ordering.  \n                    - #at_start() == true\n                throws\n                    - std::bad_alloc or any exception thrown by T's constructor\n                        data may be lost if sort() throws\n            !*/\n    };\n\n    template <\n        template queue_base\n        >\n    inline void swap (\n        queue_sort<queue_base>& a, \n        queue_sort<queue_base>& b \n    ) { a.swap(b); }  \n    /*!\n        provides a global swap function\n    !*/\n\n}\n\n#endif // DLIB_QUEUE_SORt_ABSTRACT_\n\n"
  },
  {
    "path": "benchmarks/dlib/queue.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_QUEUe_\n#define DLIB_QUEUe_\n\n#include \"queue/queue_kernel_1.h\"\n#include \"queue/queue_kernel_2.h\"\n#include \"queue/queue_kernel_c.h\"\n\n#include \"queue/queue_sort_1.h\"\n\n\n#include \"algs.h\"\n\nnamespace dlib\n{\n\n    template <\n        typename T,\n        typename mem_manager = default_memory_manager \n        >\n    class queue\n    {\n        queue() {}\n    public:\n                \n\n        //----------- kernels ---------------\n\n        // kernel_1a        \n        typedef     queue_kernel_1<T,mem_manager>    \n                    kernel_1a;\n        typedef     queue_kernel_c<kernel_1a>\n                    kernel_1a_c;\n \n\n        // kernel_2a        \n        typedef     queue_kernel_2<T,20,mem_manager>    \n                    kernel_2a;\n        typedef     queue_kernel_c<kernel_2a>\n                    kernel_2a_c;\n\n\n        // kernel_2b        \n        typedef     queue_kernel_2<T,100,mem_manager>    \n                    kernel_2b;\n        typedef     queue_kernel_c<kernel_2b>\n                    kernel_2b_c;\n\n\n\n\n        //---------- extensions ------------\n\n        // sort_1 extend kernel_1a\n        typedef     queue_sort_1<kernel_1a>\n                    sort_1a;\n        typedef     queue_sort_1<kernel_1a_c>\n                    sort_1a_c;\n\n\n        // sort_1 extend kernel_2a\n        typedef     queue_sort_1<kernel_2a>\n                    sort_1b;\n        typedef     queue_sort_1<kernel_2a_c>\n                    sort_1b_c;\n\n\n\n        // sort_1 extend kernel_2b\n        typedef     queue_sort_1<kernel_2b>\n                    sort_1c;\n        typedef     queue_sort_1<kernel_2b_c>\n                    sort_1c_c;\n\n\n\n\n\n    };\n}\n\n#endif // DLIB_QUEUe_\n\n"
  },
  {
    "path": "benchmarks/dlib/ref.h",
    "content": "// Copyright (C) 2010  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_REFERENCE_WRAPpER_H_\n#define DLIB_REFERENCE_WRAPpER_H_\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    template<\n        typename T\n        > \n    class reference_wrapper \n    {\n        /*!\n            WHAT THIS OBJECT REPRESENTS\n                This is a simple object that just holds a reference to another object. \n                It is useful because it can serve as a kind of \"copyable reference\".  \n        !*/\n\n    public:\n        typedef T type;\n\n        explicit reference_wrapper(T& o) : obj(&o) {}\n\n        operator T&()    const { return  *obj; }\n        T& get()         const { return  *obj; }\n\n    private:\n        T* obj;\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    reference_wrapper<T> ref(\n        T& obj\n    ) { return reference_wrapper<T>(obj); }\n    /*!\n        ensures\n            - returns a reference_wrapper that contains a reference to obj.\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    reference_wrapper<T> ref(\n        reference_wrapper<T> obj\n    ) { return obj; }\n    /*!\n        ensures\n            - returns the given reference_wrapper object without modification\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    reference_wrapper<const T> cref(\n        const T& obj\n    ) { return reference_wrapper<const T>(obj); }\n    /*!\n        ensures\n            - returns a reference_wrapper that contains a constant reference to obj.\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    reference_wrapper<const T> cref(\n        reference_wrapper<T> obj\n    ) { return cref(obj.get()); }\n    /*!\n        ensures\n            - converts the given reference_wrapper into a reference_wrapper that contains a\n              constant reference.\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_REFERENCE_WRAPpER_H_\n\n"
  },
  {
    "path": "benchmarks/dlib/revision.h",
    "content": "#ifndef DLIB_REVISION_H\n#define DLIB_MAJOR_VERSION  19\n#define DLIB_MINOR_VERSION  21\n#define DLIB_PATCH_VERSION  99\n#endif\n\n"
  },
  {
    "path": "benchmarks/dlib/serialize.h",
    "content": "// Copyright (C) 2005  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_SERIALIZe_\n#define DLIB_SERIALIZe_\n\n/*!\n    There are two global functions in the dlib namespace that provide serialization and\n    deserialization support.  Their signatures and specifications are as follows:\n        \n        void serialize (\n            const serializable_type& item,\n            std::ostream& out\n        );\n        /!*\n            ensures\n                - writes the state of item to the output stream out\n                - if (serializable_type implements the enumerable interface) then\n                    - item.at_start() == true\n            throws                    \n                - serialization_error\n                    This exception is thrown if there is some problem which prevents\n                    us from successfully writing item to the output stream.\n                - any other exception\n        *!/\n\n        void deserialize (\n            serializable_type& item,\n            std::istream& in\n        );\n        /!*\n            ensures\n                - #item == a deserialized copy of the serializable_type that was\n                  in the input stream in.\n                - Reads all the bytes associated with the serialized serializable_type\n                  contained inside the input stream and no more.  This means you\n                  can serialize multiple objects to an output stream and then read\n                  them all back in, one after another, using deserialize().\n                - if (serializable_type implements the enumerable interface) then\n                    - item.at_start() == true\n            throws                    \n                - serialization_error\n                    This exception is thrown if there is some problem which prevents\n                    us from successfully deserializing item from the input stream.\n                    If this exception is thrown then item will have an initial value \n                    for its type.\n                - any other exception\n        *!/\n\n    For convenience, you can also serialize to a file using this syntax:\n        serialize(\"your_file.dat\") << some_object << another_object;\n\n        // or to a memory buffer.\n        std::vector<char> memory_buffer;\n        serialize(memory_buffer) << some_object << another_object;\n\n        // or some other stream\n        std::ostringstream memory_buffer2;\n        serialize(memory_buffer2) << some_object << another_object;\n\n    That overwrites the contents of your_file.dat with the serialized data from some_object\n    and another_object.  Then to recall the objects from the file you can do:\n        deserialize(\"your_file.dat\") >> some_object >> another_object;\n        // or from a memory buffer or another stream called memory_buffer.\n        deserialize(memory_buffer) >> some_object >> another_object;\n\n    Finally, you can chain as many objects together using the << and >> operators as you\n    like.\n\n\n    This file provides serialization support to the following object types:\n        - The C++ base types (NOT including raw pointer)\n        - std::string\n        - std::wstring\n        - std::vector\n        - std::list\n        - std::forward_list\n        - std::array\n        - std::deque\n        - std::map\n        - std::unordered_map\n        - std::multimap\n        - std::unordered_multimap\n        - std::set\n        - std::unordered_set\n        - std::multiset\n        - std::unordered_multiset\n        - std::pair\n        - std::tuple\n        - std::complex\n        - std::unique_ptr\n        - std::shared_ptr\n        - dlib::uint64\n        - dlib::int64\n        - float_details\n        - enumerable<T> where T is a serializable type\n        - map_pair<D,R> where D and R are both serializable types.\n        - C style arrays of serializable types\n        - Google protocol buffer objects.\n\n    This file provides deserialization support to the following object types:\n        - The C++ base types (NOT including raw pointers)\n        - std::string\n        - std::wstring\n        - std::vector\n        - std::list\n        - std::forward_list\n        - std::array\n        - std::deque\n        - std::map\n        - std::unordered_map\n        - std::multimap\n        - std::unordered_multimap\n        - std::set\n        - std::unordered_set\n        - std::multiset\n        - std::unordered_multiset\n        - std::pair\n        - std::tuple\n        - std::complex\n        - std::unique_ptr\n        - std::shared_ptr\n        - dlib::uint64\n        - dlib::int64\n        - float_details\n        - C style arrays of serializable types\n        - Google protocol buffer objects.\n\n    Support for deserialization of objects which implement the enumerable or\n    map_pair interfaces is the responsibility of those objects.  \n    \n    Note that you can deserialize an integer value to any integral type (except for a \n    char type) if its value will fit into the target integer type.  I.e.  the types \n    short, int, long, unsigned short, unsigned int, unsigned long, and dlib::uint64 \n    can all receive serialized data from each other so long as the actual serialized \n    value fits within the receiving integral type's range.\n\n    Also note that for any container to be serializable the type of object it contains \n    must be serializable.\n\n    FILE STREAMS\n        If you are serializing to and from file streams it is important to \n        remember to set the file streams to binary mode using the std::ios::binary\n        flag.  \n\n\n    INTEGRAL SERIALIZATION FORMAT\n        All C++ integral types (except the char types) are serialized to the following\n        format:\n        The first byte is a control byte.  It tells you if the serialized number is \n        positive or negative and also tells you how many of the following bytes are \n        part of the number.  The absolute value of the number is stored in little \n        endian byte order and follows the control byte.\n\n        The control byte:  \n            The high order bit of the control byte is a flag that tells you if the\n            encoded number is negative or not.  It is set to 1 when the number is\n            negative and 0 otherwise.\n            The 4 low order bits of the control byte represent an unsigned number\n            and tells you how many of the following bytes are part of the encoded\n            number.\n\n    bool SERIALIZATION FORMAT\n        A bool value is serialized as the single byte character '1' or '0' in ASCII.\n        Where '1' indicates true and '0' indicates false.\n\n    FLOATING POINT SERIALIZATION FORMAT\n        To serialize a floating point value we convert it into a float_details object and\n        then serialize the exponent and mantissa values using dlib's integral serialization\n        format.  Therefore, the output is first the exponent and then the mantissa.  Note that\n        the mantissa is a signed integer (i.e. there is not a separate sign bit).\n\n\n    MAKING YOUR OWN CUSTOM OBJECTS SERIALIZABLE\n        Suppose you create your own type, my_custom_type, and you want it to be serializable.  I.e.\n        you want to be able to use the tools above to save and load it.  E.g. maybe you have a\n        std::vector<my_custom_type> you wish to save.\n\n        To make my_custom_type properly serializable all you have to do is define global serialize\n        and deserialize functions **IN THE SAME NAMESPACE AS MY_CUSTOM_TYPE**.  You must define them\n        in your namespace so that argument dependent lookup will be able to find them.  So your code\n        might look like this:\n\n            namespace your_namespace \n            {\n                struct my_custom_type\n                {\n                    int a;\n                    float b;\n                    std::vector<float> c;\n                };\n                void serialize (const my_custom_type& item, std::ostream& out);\n                void deserialize (my_custom_type& item, std::istream& in);\n            }\n       \n        That's all you need to do.  You may optionally avail yourself of the\n        DLIB_DEFINE_DEFAULT_SERIALIZATION macro, which generates global friend serialize and\n        deserialize functions for you.  In that case you would do this instead:\n\n            namespace your_namespace \n            {\n                struct my_custom_type\n                {\n                    int a;\n                    float b;\n                    std::vector<float> c;\n\n                    DLIB_DEFINE_DEFAULT_SERIALIZATION(my_custom_type, a, b, c);\n                };\n            }\n\n!*/\n\n\n#include \"algs.h\"\n#include \"assert.h\"\n#include <iomanip>\n#include <cstddef>\n#include <iostream>\n#include <fstream>\n#include <string>\n#include <vector>\n#include <list>\n#include <forward_list>\n#include <array>\n#include <deque>\n#include <complex>\n#include <map>\n#include <unordered_map>\n#include <tuple>\n#include <memory>\n#include <set>\n#include <unordered_set>\n#include <limits>\n#include <type_traits>\n#include <utility>\n#include \"uintn.h\"\n#include \"interfaces/enumerable.h\"\n#include \"interfaces/map_pair.h\"\n#include \"enable_if.h\"\n#include \"unicode.h\"\n#include \"byte_orderer.h\"\n#include \"float_details.h\"\n#include \"vectorstream.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    class serialization_error : public error \n    {\n        /*!\n            WHAT THIS OBJECT REPRESENTS\n                This is the exception object.  It is thrown if serialization or\n                deserialization fails.\n        !*/\n\n    public: \n        serialization_error(const std::string& e):error(e) {}\n    };\n\n\n    void check_serialized_version(\n        const std::string& expected_version, \n        std::istream& in\n    );\n    /*!\n        ensures\n            - Deserializes a string from in and if it doesn't match expected_version we\n              throw serialization_error.\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    /*!A ramdump information !*/\n    template <typename T>\n    struct ramdump_t\n    {\n        /*!\n            WHAT THIS OBJECT REPRESENTS\n                This is a type decoration used to indicate that serialization should be\n                done by simply dumping the memory of some object to disk as fast as\n                possible without any sort of conversions.  This means that the data written\n                will be \"non-portable\" in the sense that the format output by a RAM dump\n                may depend on things like the endianness of your CPU or settings of certain\n                compiler switches.\n\n                You use this object like this:\n                   serialize(\"yourfile.dat\") << ramdump(yourobject);\n                   deserialize(\"yourfile.dat\") >> ramdump(yourobject);\n                or \n                   serialize(ramdump(yourobject), out);\n                   deserialize(ramdump(yourobject), in);\n\n                Also, not all objects have a ramdump mode.  If you try to use ramdump on an\n                object that does not define a serialization dump for ramdump you will get a\n                compiler error.\n        !*/\n        ramdump_t(T& item_) : item(item_) {}\n        T& item;\n    };\n\n    // This function just makes a ramdump that wraps an object.\n    template <typename T>\n    ramdump_t<typename std::remove_reference<T>::type> ramdump(T&& item) \n    { \n        return ramdump_t<typename std::remove_reference<T>::type>(item); \n    }\n\n\n    template <\n        typename T\n        >\n    void serialize (\n        const ramdump_t<const T>& item_, \n        std::ostream& out\n    )\n    {\n        // Move the const from inside the ramdump_t template to outside so we can bind\n        // against a serialize() call that takes just a const ramdump_t<T>.  Doing this\n        // saves you from needing to write multiple overloads of serialize() to handle\n        // these different const placement cases.\n        const auto temp = ramdump(const_cast<T&>(item_.item));\n        serialize(temp, out);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    namespace ser_helper\n    {\n\n        template <\n            typename T\n            >\n        typename enable_if_c<std::numeric_limits<T>::is_signed,bool>::type pack_int (\n            T item,\n            std::ostream& out\n        )\n        /*!\n            requires\n                - T is a signed integral type\n            ensures\n                - if (no problems occur serializing item) then\n                    - writes item to out\n                    - returns false\n                - else\n                    - returns true\n        !*/\n        {\n            COMPILE_TIME_ASSERT(sizeof(T) <= 8);\n            unsigned char buf[9];\n            unsigned char size = sizeof(T);\n            unsigned char neg;\n            if (item < 0)\n            {\n                neg = 0x80;\n                item *= -1;\n            }\n            else\n            {\n                neg = 0;\n            }\n\n            for (unsigned char i = 1; i <= sizeof(T); ++i)\n            {\n                buf[i] = static_cast<unsigned char>(item&0xFF);                \n                item >>= 8;\n                if (item == 0) { size = i; break; }\n            }\n\n            std::streambuf* sbuf = out.rdbuf();\n            buf[0] = size|neg;\n            if (sbuf->sputn(reinterpret_cast<char*>(buf),size+1) != size+1)\n            {\n                out.setstate(std::ios::eofbit | std::ios::badbit);\n                return true;\n            }\n\n            return false;\n        }\n\n    // ------------------------------------------------------------------------------------\n\n        template <\n            typename T\n            >\n        typename enable_if_c<std::numeric_limits<T>::is_signed,bool>::type unpack_int (\n            T& item,\n            std::istream& in\n        )\n        /*!\n            requires\n                - T is a signed integral type\n            ensures\n                - if (there are no problems deserializing item) then\n                    - returns false\n                    - #item == the value stored in in\n                - else\n                    - returns true\n\n        !*/\n        {\n            COMPILE_TIME_ASSERT(sizeof(T) <= 8);\n\n\n            unsigned char buf[8];\n            unsigned char size;\n            bool is_negative;\n\n            std::streambuf* sbuf = in.rdbuf();\n\n            item = 0;\n            int ch = sbuf->sbumpc();\n            if (ch != EOF)\n            {\n                size = static_cast<unsigned char>(ch);\n            }\n            else\n            {\n                in.setstate(std::ios::badbit);\n                return true;\n            }\n\n            if (size&0x80)\n                is_negative = true;\n            else\n                is_negative = false;\n            size &= 0x0F;\n            \n            // check if the serialized object is too big\n            if (size > (unsigned long)tmin<sizeof(T),8>::value || size == 0)\n            {\n                return true;\n            }\n\n            if (sbuf->sgetn(reinterpret_cast<char*>(&buf),size) != size)\n            {\n                in.setstate(std::ios::badbit);\n                return true;\n            }\n\n\n            for (unsigned char i = size-1; true; --i)\n            {\n                item <<= 8;\n                item |= buf[i];\n                if (i == 0)\n                    break;\n            }\n\n            if (is_negative)\n                item *= -1;\n        \n\n            return false;\n        }\n\n    // ------------------------------------------------------------------------------------\n\n        template <\n            typename T\n            >\n        typename disable_if_c<std::numeric_limits<T>::is_signed,bool>::type pack_int (\n            T item,\n            std::ostream& out\n        )\n        /*!\n            requires\n                - T is an unsigned integral type\n            ensures\n                - if (no problems occur serializing item) then\n                    - writes item to out\n                    - returns false\n                - else\n                    - returns true\n        !*/\n        {\n            COMPILE_TIME_ASSERT(sizeof(T) <= 8);\n            unsigned char buf[9];\n            unsigned char size = sizeof(T);\n\n            for (unsigned char i = 1; i <= sizeof(T); ++i)\n            {\n                buf[i] = static_cast<unsigned char>(item&0xFF);                \n                item >>= 8;\n                if (item == 0) { size = i; break; }\n            }\n\n            std::streambuf* sbuf = out.rdbuf();\n            buf[0] = size;\n            if (sbuf->sputn(reinterpret_cast<char*>(buf),size+1) != size+1)\n            {\n                out.setstate(std::ios::eofbit | std::ios::badbit);\n                return true;\n            }\n\n            return false;\n        }\n\n    // ------------------------------------------------------------------------------------\n\n        template <\n            typename T\n            >\n        typename disable_if_c<std::numeric_limits<T>::is_signed,bool>::type unpack_int (\n            T& item,\n            std::istream& in\n        )\n        /*!\n            requires\n                - T is an unsigned integral type\n            ensures\n                - if (there are no problems deserializing item) then\n                    - returns false\n                    - #item == the value stored in in\n                - else\n                    - returns true\n\n        !*/\n        {\n            COMPILE_TIME_ASSERT(sizeof(T) <= 8);\n\n            unsigned char buf[8];\n            unsigned char size;\n\n            item = 0;\n\n            std::streambuf* sbuf = in.rdbuf();\n            int ch = sbuf->sbumpc();\n            if (ch != EOF)\n            {\n                size = static_cast<unsigned char>(ch);\n            }\n            else\n            {\n                in.setstate(std::ios::badbit);\n                return true;\n            }\n\n\n            // mask out the 3 reserved bits\n            size &= 0x8F;\n\n            // check if an error occurred \n            if (size > (unsigned long)tmin<sizeof(T),8>::value || size == 0)\n                return true;\n           \n\n            if (sbuf->sgetn(reinterpret_cast<char*>(&buf),size) != size)\n            {\n                in.setstate(std::ios::badbit);\n                return true;\n            }\n\n            for (unsigned char i = size-1; true; --i)\n            {\n                item <<= 8;\n                item |= buf[i];\n                if (i == 0)\n                    break;\n            }\n\n            return false;\n        }\n\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    #define USE_DEFAULT_INT_SERIALIZATION_FOR(T)  \\\n        inline void serialize (const T& item, std::ostream& out) \\\n        { if (ser_helper::pack_int(item,out)) throw serialization_error(\"Error serializing object of type \" + std::string(#T)); }   \\\n        inline void deserialize (T& item, std::istream& in) \\\n        { if (ser_helper::unpack_int(item,in)) throw serialization_error(\"Error deserializing object of type \" + std::string(#T)); }   \n\n    template <typename T>\n    inline bool pack_byte (\n        const T& ch,\n        std::ostream& out\n    )\n    {\n        std::streambuf* sbuf = out.rdbuf();\n        return (sbuf->sputc((char)ch) == EOF);\n    }\n\n    template <typename T>\n    inline bool unpack_byte (\n        T& ch,\n        std::istream& in\n    )\n    {\n        std::streambuf* sbuf = in.rdbuf();\n        int temp = sbuf->sbumpc();\n        if (temp != EOF)\n        {\n            ch = static_cast<T>(temp);\n            return false;\n        }\n        else\n        {\n            return true;\n        }\n    }\n\n    #define USE_DEFAULT_BYTE_SERIALIZATION_FOR(T)  \\\n        inline void serialize (const T& item,std::ostream& out) \\\n        { if (pack_byte(item,out)) throw serialization_error(\"Error serializing object of type \" + std::string(#T)); } \\\n        inline void deserialize (T& item, std::istream& in) \\\n        { if (unpack_byte(item,in)) throw serialization_error(\"Error deserializing object of type \" + std::string(#T)); }   \n\n// ----------------------------------------------------------------------------------------\n\n    USE_DEFAULT_INT_SERIALIZATION_FOR(short)\n    USE_DEFAULT_INT_SERIALIZATION_FOR(int)\n    USE_DEFAULT_INT_SERIALIZATION_FOR(long)\n    USE_DEFAULT_INT_SERIALIZATION_FOR(unsigned short)\n    USE_DEFAULT_INT_SERIALIZATION_FOR(unsigned int)\n    USE_DEFAULT_INT_SERIALIZATION_FOR(unsigned long)\n    USE_DEFAULT_INT_SERIALIZATION_FOR(uint64)\n    USE_DEFAULT_INT_SERIALIZATION_FOR(int64)\n\n    USE_DEFAULT_BYTE_SERIALIZATION_FOR(char)\n    USE_DEFAULT_BYTE_SERIALIZATION_FOR(signed char)\n    USE_DEFAULT_BYTE_SERIALIZATION_FOR(unsigned char)\n\n    // Don't define serialization for wchar_t when using visual studio and\n    // _NATIVE_WCHAR_T_DEFINED isn't defined since if it isn't they improperly set\n    // wchar_t to be a typedef rather than its own type as required by the C++ \n    // standard.\n#if !defined(_MSC_VER) || _NATIVE_WCHAR_T_DEFINED\n    USE_DEFAULT_INT_SERIALIZATION_FOR(wchar_t)\n#endif\n\n// ----------------------------------------------------------------------------------------\n\n    inline void serialize(\n        const float_details& item,\n        std::ostream& out\n    )\n    {\n        serialize(item.mantissa, out);\n        serialize(item.exponent, out);\n    }\n\n    inline void deserialize(\n        float_details& item,\n        std::istream& in \n    )\n    {\n        deserialize(item.mantissa, in);\n        deserialize(item.exponent, in);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    inline void serialize_floating_point (\n        const T& item,\n        std::ostream& out\n    )\n    { \n        try\n        {\n            float_details temp = item;\n            serialize(temp, out);\n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while serializing a floating point number.\"); }\n    }\n\n    template <typename T>\n    inline bool old_deserialize_floating_point (\n        T& item,\n        std::istream& in \n    )\n    {\n        std::ios::fmtflags oldflags = in.flags();  \n        in.flags(static_cast<std::ios_base::fmtflags>(0));\n        std::streamsize ss = in.precision(35); \n        if (in.peek() == 'i')\n        {\n            item = std::numeric_limits<T>::infinity();\n            in.get();\n            in.get();\n            in.get();\n        }\n        else if (in.peek() == 'n')\n        {\n            item = -std::numeric_limits<T>::infinity();\n            in.get();\n            in.get();\n            in.get();\n            in.get();\n        }\n        else if (in.peek() == 'N')\n        {\n            item = std::numeric_limits<T>::quiet_NaN();\n            in.get();\n            in.get();\n            in.get();\n        }\n        else\n        {\n            in >> item; \n        }\n        in.flags(oldflags); \n        in.precision(ss); \n        return (in.get() != ' ');\n    }\n\n    template <typename T>\n    inline void deserialize_floating_point (\n        T& item,\n        std::istream& in \n    )\n    {\n        // check if the serialized data uses the older ASCII based format.  We can check\n        // this easily because the new format starts with the integer control byte which\n        // always has 0 bits in the positions corresponding to the bitmask 0x70.  Moreover,\n        // since the previous format used ASCII numbers we know that no valid bytes can\n        // have bit values of one in the positions indicated 0x70.  So this test looks at\n        // the first byte and checks if the serialized data uses the old format or the new\n        // format.\n        if ((in.rdbuf()->sgetc()&0x70) == 0)\n        {\n            try\n            {\n                // Use the fast and compact binary serialization format.\n                float_details temp;\n                deserialize(temp, in);\n                item = temp;\n            }\n            catch (serialization_error& e)\n            { throw serialization_error(e.info + \"\\n   while deserializing a floating point number.\"); }\n        }\n        else\n        {\n            if (old_deserialize_floating_point(item, in))\n                throw serialization_error(\"Error deserializing a floating point number.\");\n        }\n    }\n\n    inline void serialize ( const float& item, std::ostream& out) \n    { \n        serialize_floating_point(item,out);\n    }\n\n    inline void deserialize (float& item, std::istream& in) \n    { \n        deserialize_floating_point(item,in);\n    }\n\n    inline void serialize ( const double& item, std::ostream& out) \n    { \n        serialize_floating_point(item,out);\n    }\n\n    inline void deserialize (double& item, std::istream& in) \n    { \n        deserialize_floating_point(item,in);\n    }\n\n    inline void serialize ( const long double& item, std::ostream& out) \n    { \n        serialize_floating_point(item,out);\n    }\n\n    inline void deserialize ( long double& item, std::istream& in) \n    { \n        deserialize_floating_point(item,in);\n    }\n\n// ----------------------------------------------------------------------------------------\n// prototypes\n\n    template <typename domain, typename range, typename compare, typename alloc>\n    void serialize (\n        const std::map<domain,range, compare, alloc>& item,\n        std::ostream& out\n    );\n\n    template <typename domain, typename range, typename compare, typename alloc>\n    void deserialize (\n        std::map<domain, range, compare, alloc>& item,\n        std::istream& in\n    );\n    \n    template <typename domain, typename range, typename hash, typename keyEqual, typename alloc>\n    void serialize (\n        const std::unordered_map<domain, range, hash, keyEqual, alloc>& item,\n        std::ostream& out\n    );\n\n    template <typename domain, typename range, typename hash, typename keyEqual, typename alloc>\n    void deserialize (\n        std::unordered_map<domain, range, hash, keyEqual, alloc>& item,\n        std::istream& in\n    );\n    \n    template <typename domain, typename range, typename compare, typename alloc>\n    void serialize (\n        const std::multimap<domain,range, compare, alloc>& item,\n        std::ostream& out\n    );\n\n    template <typename domain, typename range, typename compare, typename alloc>\n    void deserialize (\n        std::multimap<domain, range, compare, alloc>& item,\n        std::istream& in\n    );\n    \n    template <typename domain, typename range, typename hash, typename keyEqual, typename alloc>\n    void serialize (\n        const std::unordered_multimap<domain, range, hash, keyEqual, alloc>& item,\n        std::ostream& out\n    );\n\n    template <typename domain, typename range, typename hash, typename keyEqual, typename alloc>\n    void deserialize (\n        std::unordered_multimap<domain, range, hash, keyEqual, alloc>& item,\n        std::istream& in\n    );\n\n    template <typename domain, typename compare, typename alloc>\n    void serialize (\n        const std::set<domain, compare, alloc>& item,\n        std::ostream& out\n    );\n\n    template <typename domain, typename compare, typename alloc>\n    void deserialize (\n        std::set<domain, compare, alloc>& item,\n        std::istream& in\n    );\n    \n    template <typename domain, typename hash, typename keyEqual, typename alloc>\n    void serialize (\n        const std::unordered_set<domain, hash, keyEqual, alloc>& item,\n        std::ostream& out\n    );\n\n    template <typename domain, typename hash, typename keyEqual, typename alloc>\n    void deserialize (\n        std::unordered_set<domain, hash, keyEqual, alloc>& item,\n        std::istream& in\n    );\n    \n    template <typename domain, typename compare, typename alloc>\n    void serialize (\n        const std::multiset<domain, compare, alloc>& item,\n        std::ostream& out\n    );\n\n    template <typename domain, typename compare, typename alloc>\n    void deserialize (\n        std::multiset<domain, compare, alloc>& item,\n        std::istream& in\n    );\n    \n    template <typename domain, typename hash, typename keyEqual, typename alloc>\n    void serialize (\n        const std::unordered_multiset<domain, hash, keyEqual, alloc>& item,\n        std::ostream& out\n    );\n\n    template <typename domain, typename hash, typename keyEqual, typename alloc>\n    void deserialize (\n        std::unordered_multiset<domain, hash, keyEqual, alloc>& item,\n        std::istream& in\n    );\n\n    template <typename T, typename alloc>\n    void serialize (\n        const std::vector<T,alloc>& item,\n        std::ostream& out\n    );\n\n    template <typename T, typename alloc>\n    void deserialize (\n        std::vector<T,alloc>& item,\n        std::istream& in\n    );\n    \n    template <typename T, typename alloc>\n    void serialize (\n        const std::list<T,alloc>& item,\n        std::ostream& out\n    );\n\n    template <typename T, typename alloc>\n    void deserialize (\n        std::list<T,alloc>& item,\n        std::istream& in\n    );\n    \n    template <typename T, typename alloc>\n    void serialize (\n        const std::forward_list<T,alloc>& item,\n        std::ostream& out\n    );\n\n    template <typename T, typename alloc>\n    void deserialize (\n        std::forward_list<T,alloc>& item,\n        std::istream& in\n    );\n\n    template <typename T, typename alloc>\n    void serialize (\n        const std::deque<T,alloc>& item,\n        std::ostream& out\n    );\n\n    template <typename T, typename alloc>\n    void deserialize (\n        std::deque<T,alloc>& item,\n        std::istream& in\n    );\n    \n    template <typename... Types>\n    void serialize (\n        const std::tuple<Types...>& item,\n        std::ostream& out\n    );\n\n    template <typename... Types>\n    void deserialize (\n        std::tuple<Types...>& item,\n        std::istream& in\n    );\n\n    template <typename T, typename deleter>\n    void serialize (\n        const std::unique_ptr<T, deleter>& item,\n        std::ostream& out\n    );\n\n    template <typename T, typename deleter>\n    void deserialize (\n        std::unique_ptr<T, deleter>& item,\n        std::istream& in\n    );\n    \n    template <typename T>\n    void serialize (\n        const std::shared_ptr<T>& item,\n        std::ostream& out\n    );\n\n    template <typename T>\n    void deserialize (\n        std::shared_ptr<T>& item,\n        std::istream& in\n    );\n    \n    inline void serialize (\n        const std::string& item,\n        std::ostream& out\n    );\n\n    inline void deserialize (\n        std::string& item,\n        std::istream& in\n    );\n\n    inline void serialize (\n        const std::wstring& item,\n        std::ostream& out\n    );\n\n    inline void deserialize (\n        std::wstring& item,\n        std::istream& in\n    );\n\n    inline void serialize (\n        const ustring& item,\n        std::ostream& out\n    );\n\n    inline void deserialize (\n        ustring& item,\n        std::istream& in\n    );\n\n    template <\n        typename T\n        >\n    inline void serialize (\n        const enumerable<T>& item,\n        std::ostream& out\n    );\n\n    template <\n        typename domain,\n        typename range\n        >\n    inline void serialize (\n        const map_pair<domain,range>& item,\n        std::ostream& out\n    );\n\n    template <\n        typename T,\n        size_t length\n        >\n    inline void serialize (\n        const T (&array)[length],\n        std::ostream& out\n    );\n\n    template <\n        typename T,\n        size_t length\n        >\n    inline void deserialize (\n        T (&array)[length],\n        std::istream& in\n    );\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    inline void serialize (\n        bool item,\n        std::ostream& out\n    )\n    {\n        if (item)\n            out << '1';\n        else\n            out << '0';\n\n        if (!out) \n            throw serialization_error(\"Error serializing object of type bool\");    \n    }\n\n    inline void deserialize (\n        bool& item,\n        std::istream& in\n    )\n    {\n        int ch = in.get();\n        if (ch != EOF)\n        {\n            if (ch == '1')\n                item = true;\n            else if (ch == '0')\n                item = false;\n            else\n                throw serialization_error(\"Error deserializing object of type bool\");    \n        }\n        else\n        {\n            throw serialization_error(\"Error deserializing object of type bool\");    \n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename first_type, typename second_type>\n    void serialize (\n        const std::pair<first_type, second_type>& item,\n        std::ostream& out\n    )\n    {\n        try\n        { \n            serialize(item.first,out); \n            serialize(item.second,out); \n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while serializing object of type std::pair\"); }\n    }\n\n    template <typename first_type, typename second_type>\n    void deserialize (\n        std::pair<first_type, second_type>& item,\n        std::istream& in \n    )\n    {\n        try\n        { \n            deserialize(item.first,in); \n            deserialize(item.second,in); \n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while deserializing object of type std::pair\"); }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template<std::size_t I = 0, typename FuncT, typename... Tp>\n    inline typename std::enable_if<I == sizeof...(Tp), void>::type\n    for_each_in_tuple(std::tuple<Tp...>&, FuncT)\n    {}\n\n    template<std::size_t I = 0, typename FuncT, typename... Tp>\n    inline typename std::enable_if<I < sizeof...(Tp), void>::type\n    for_each_in_tuple(std::tuple<Tp...>& t, FuncT f)\n    {\n        f(std::get<I>(t));\n        for_each_in_tuple<I + 1, FuncT, Tp...>(t, f);\n    }\n    \n    template<std::size_t I = 0, typename FuncT, typename... Tp>\n    inline typename std::enable_if<I == sizeof...(Tp), void>::type\n    for_each_in_tuple(const std::tuple<Tp...>&, FuncT)\n    {}\n\n    template<std::size_t I = 0, typename FuncT, typename... Tp>\n    inline typename std::enable_if<I < sizeof...(Tp), void>::type\n    for_each_in_tuple(const std::tuple<Tp...>& t, FuncT f)\n    {\n        f(std::get<I>(t));\n        for_each_in_tuple<I + 1, FuncT, Tp...>(t, f);\n    }\n    \n    struct serialize_tuple_helper\n    {\n        serialize_tuple_helper(std::ostream& out_) : out(out_) {}\n        \n        template<typename T>\n        void operator()(const T& item)\n        {\n            serialize(item, out);\n        }\n                \n        std::ostream& out;\n    };\n    \n    struct deserialize_tuple_helper\n    {\n        deserialize_tuple_helper(std::istream& in_) : in(in_) {}\n        \n        template<typename T>\n        void operator()(T& item)\n        {\n            deserialize(item, in);\n        }\n                \n        std::istream& in;\n    };\n\n    template <typename... Types>\n    void serialize (\n        const std::tuple<Types...>& item,\n        std::ostream& out\n    )\n    {\n        try\n        { \n            for_each_in_tuple(item, serialize_tuple_helper(out));\n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while serializing object of type std::tuple\"); }\n    }\n\n    template <typename... Types>\n    void deserialize (\n        std::tuple<Types...>& item,\n        std::istream& in\n    )\n    {\n        try\n        { \n            for_each_in_tuple(item, deserialize_tuple_helper(in));\n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while deserializing object of type std::tuple\"); }\n    }\n    \n// ----------------------------------------------------------------------------------------\n    \n    template <typename domain, typename range, typename compare, typename alloc>\n    void serialize (\n        const std::map<domain,range, compare, alloc>& item,\n        std::ostream& out\n    )\n    {\n        try\n        { \n            const unsigned long size = static_cast<unsigned long>(item.size());\n\n            serialize(size,out); \n            typename std::map<domain,range,compare,alloc>::const_iterator i;\n            for (i = item.begin(); i != item.end(); ++i)\n            {\n                serialize(i->first,out);\n                serialize(i->second,out);\n            }\n\n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while serializing object of type std::map\"); }\n    }\n\n    template <typename domain, typename range, typename compare, typename alloc>\n    void deserialize (\n        std::map<domain, range, compare, alloc>& item,\n        std::istream& in\n    )\n    {\n        try \n        { \n            item.clear();\n\n            unsigned long size;\n            deserialize(size,in); \n            domain d;\n            range r;\n            for (unsigned long i = 0; i < size; ++i)\n            {\n                deserialize(d,in);\n                deserialize(r,in);\n                item[d] = r;\n            }\n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while deserializing object of type std::map\"); }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename domain, typename range, typename hash, typename keyEqual, typename alloc>\n    void serialize (\n        const std::unordered_map<domain, range, hash, keyEqual, alloc>& item,\n        std::ostream& out\n    )\n    {\n        try\n        { \n            serialize(item.size(),out); \n            for (const auto& x : item)\n            {\n                serialize(x.first,out);\n                serialize(x.second,out);\n            }\n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while serializing object of type std::unordered_map\"); }\n    }\n\n    template <typename domain, typename range, typename hash, typename keyEqual, typename alloc>\n    void deserialize (\n        std::unordered_map<domain, range, hash, keyEqual, alloc>& item,\n        std::istream& in\n    )\n    {\n        try \n        { \n            item.clear();\n            std::size_t size;\n            deserialize(size,in); \n            domain d;\n            range r;\n            for (unsigned long i = 0; i < size; ++i)\n            {\n                deserialize(d,in);\n                deserialize(r,in);\n                item[d] = r;\n            }\n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while deserializing object of type std::unordered_map\"); }\n    }\n    \n// ----------------------------------------------------------------------------------------\n    \n    template <typename domain, typename range, typename compare, typename alloc>\n    void serialize (\n        const std::multimap<domain,range, compare, alloc>& item,\n        std::ostream& out\n    )\n    {\n        try\n        { \n            serialize(item.size(),out); \n            for (const auto& x : item)\n            {\n                serialize(x.first,out);\n                serialize(x.second,out);\n            }\n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while serializing object of type std::multimap\"); }\n    }\n\n    template <typename domain, typename range, typename compare, typename alloc>\n    void deserialize (\n        std::multimap<domain, range, compare, alloc>& item,\n        std::istream& in\n    )\n    {\n        try \n        { \n            item.clear();\n            std::size_t size;\n            deserialize(size,in); \n            domain d;\n            range r;\n            for (unsigned long i = 0; i < size; ++i)\n            {\n                deserialize(d,in);\n                deserialize(r,in);\n                item.insert({d,r});\n            }\n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while deserializing object of type std::multimap\"); }\n    }\n    \n// ----------------------------------------------------------------------------------------\n    \n    template <typename domain, typename range, typename hash, typename keyEqual, typename alloc>\n    void serialize (\n        const std::unordered_multimap<domain, range, hash, keyEqual, alloc>& item,\n        std::ostream& out\n    )\n    {\n        try\n        { \n            serialize(item.size(),out); \n            for (const auto& x : item)\n            {\n                serialize(x.first,out);\n                serialize(x.second,out);\n            }\n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while serializing object of type std::unordered_multimap\"); }\n    }\n\n    template <typename domain, typename range, typename hash, typename keyEqual, typename alloc>\n    void deserialize (\n        std::unordered_multimap<domain, range, hash, keyEqual, alloc>& item,\n        std::istream& in\n    )\n    {\n        try \n        { \n            item.clear();\n            std::size_t size;\n            deserialize(size,in); \n            domain d;\n            range r;\n            for (unsigned long i = 0; i < size; ++i)\n            {\n                deserialize(d,in);\n                deserialize(r,in);\n                item.insert({d,r});\n            }\n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while deserializing object of type std::unordered_multimap\"); }\n    }\n    \n// ----------------------------------------------------------------------------------------\n   \n    template <typename domain, typename compare, typename alloc>\n    void serialize (\n        const std::set<domain, compare, alloc>& item,\n        std::ostream& out\n    )\n    {\n        try\n        { \n            const unsigned long size = static_cast<unsigned long>(item.size());\n\n            serialize(size,out); \n            typename std::set<domain,compare,alloc>::const_iterator i;\n            for (i = item.begin(); i != item.end(); ++i)\n            {\n                serialize(*i,out);\n            }\n\n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while serializing object of type std::set\"); }\n    }\n\n    template <typename domain, typename compare, typename alloc>\n    void deserialize (\n        std::set<domain, compare, alloc>& item,\n        std::istream& in\n    )\n    {\n        try \n        { \n            item.clear();\n\n            unsigned long size;\n            deserialize(size,in); \n            domain d;\n            for (unsigned long i = 0; i < size; ++i)\n            {\n                deserialize(d,in);\n                item.insert(d);\n            }\n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while deserializing object of type std::set\"); }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename domain, typename hash, typename keyEqual, typename alloc>\n    void serialize (\n        const std::unordered_set<domain, hash, keyEqual, alloc>& item,\n        std::ostream& out\n    )\n    {\n        try\n        { \n            serialize(item.size(),out); \n            for (const auto& x : item)\n                serialize(x,out);\n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while serializing object of type std::unordered_set\"); }\n    }\n\n    template <typename domain, typename hash, typename keyEqual, typename alloc>\n    void deserialize (\n        std::unordered_set<domain, hash, keyEqual, alloc>& item,\n        std::istream& in\n    )\n    {\n        try \n        { \n            item.clear();\n            std::size_t size;\n            deserialize(size,in); \n            domain d;\n            for (unsigned long i = 0; i < size; ++i)\n            {\n                deserialize(d,in);\n                item.insert(d);\n            }\n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while deserializing object of type std::unordered_set\"); }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename domain, typename compare, typename alloc>\n    void serialize (\n        const std::multiset<domain, compare, alloc>& item,\n        std::ostream& out\n    )\n    {\n        try\n        { \n            serialize(item.size(),out); \n            for (const auto& x : item)\n                serialize(x,out);\n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while serializing object of type std::multiset\"); }\n    }\n\n    template <typename domain, typename compare, typename alloc>\n    void deserialize (\n        std::multiset<domain, compare, alloc>& item,\n        std::istream& in\n    )\n    {\n        try \n        { \n            item.clear();\n            std::size_t size;\n            deserialize(size,in); \n            domain d;\n            for (unsigned long i = 0; i < size; ++i)\n            {\n                deserialize(d,in);\n                item.insert(d);\n            }\n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while deserializing object of type std::multiset\"); }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename domain, typename hash, typename keyEqual, typename alloc>\n    void serialize (\n        const std::unordered_multiset<domain, hash, keyEqual, alloc>& item,\n        std::ostream& out\n    )\n    {\n        try\n        { \n            serialize(item.size(),out); \n            for (const auto& x : item)\n                serialize(x,out);\n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while serializing object of type std::unordered_multiset\"); }\n    }\n\n    template <typename domain, typename hash, typename keyEqual, typename alloc>\n    void deserialize (\n        std::unordered_multiset<domain, hash, keyEqual, alloc>& item,\n        std::istream& in\n    )\n    {\n        try \n        { \n            item.clear();\n            std::size_t size;\n            deserialize(size,in); \n            domain d;\n            for (unsigned long i = 0; i < size; ++i)\n            {\n                deserialize(d,in);\n                item.insert(d);\n            }\n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while deserializing object of type std::unordered_multiset\"); }\n    }\n        \n// ----------------------------------------------------------------------------------------\n\n    template <typename alloc>\n    void serialize (\n        const std::vector<bool,alloc>& item,\n        std::ostream& out\n    )\n    {\n        std::vector<unsigned char> temp(item.size());\n        for (unsigned long i = 0; i < item.size(); ++i)\n        {\n            if (item[i])\n                temp[i] = '1';\n            else\n                temp[i] = '0';\n        }\n        serialize(temp, out);\n    }\n\n    template <typename alloc>\n    void deserialize (\n        std::vector<bool,alloc>& item,\n        std::istream& in \n    )\n    {\n        std::vector<unsigned char> temp;\n        deserialize(temp, in);\n        item.resize(temp.size());\n        for (unsigned long i = 0; i < temp.size(); ++i)\n        {\n            if (temp[i] == '1')\n                item[i] = true;\n            else\n                item[i] = false;\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T, typename alloc>\n    void serialize (\n        const std::vector<T,alloc>& item,\n        std::ostream& out\n    )\n    {\n        try\n        { \n            const unsigned long size = static_cast<unsigned long>(item.size());\n\n            serialize(size,out); \n            for (unsigned long i = 0; i < item.size(); ++i)\n                serialize(item[i],out);\n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while serializing object of type std::vector\"); }\n    }\n\n    template <typename T, typename alloc>\n    void deserialize (\n        std::vector<T, alloc>& item,\n        std::istream& in\n    )\n    {\n        try \n        { \n            unsigned long size;\n            deserialize(size,in); \n            item.resize(size);\n            for (unsigned long i = 0; i < size; ++i)\n                deserialize(item[i],in);\n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while deserializing object of type std::vector\"); }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename alloc>\n    void serialize (\n        const std::vector<char,alloc>& item,\n        std::ostream& out\n    )\n    {\n        try\n        { \n            const unsigned long size = static_cast<unsigned long>(item.size());\n            serialize(size,out); \n            if (item.size() != 0)\n                out.write(&item[0], item.size());\n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while serializing object of type std::vector\"); }\n    }\n\n    template <typename alloc>\n    void deserialize (\n        std::vector<char, alloc>& item,\n        std::istream& in\n    )\n    {\n        try \n        { \n            unsigned long size;\n            deserialize(size,in); \n            item.resize(size);\n            if (item.size() != 0)\n                in.read(&item[0], item.size());\n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while deserializing object of type std::vector\"); }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename alloc>\n    void serialize (\n        const std::vector<unsigned char,alloc>& item,\n        std::ostream& out\n    )\n    {\n        try\n        { \n            const unsigned long size = static_cast<unsigned long>(item.size());\n            serialize(size,out); \n            if (item.size() != 0)\n                out.write((char*)&item[0], item.size());\n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while serializing object of type std::vector\"); }\n    }\n\n    template <typename alloc>\n    void deserialize (\n        std::vector<unsigned char, alloc>& item,\n        std::istream& in\n    )\n    {\n        try \n        { \n            unsigned long size;\n            deserialize(size,in); \n            item.resize(size);\n            if (item.size() != 0)\n                in.read((char*)&item[0], item.size());\n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while deserializing object of type std::vector\"); }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T, typename alloc>\n    void serialize (\n        const std::list<T,alloc>& item,\n        std::ostream& out\n    )\n    {\n        try\n        { \n            const unsigned long size = static_cast<unsigned long>(item.size());\n            serialize(size,out); \n            for (const auto& x : item)\n                serialize(x, out);\n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while serializing object of type std::list\"); }\n    }\n\n    template <typename T, typename alloc>\n    void deserialize (\n        std::list<T,alloc>& item,\n        std::istream& in\n    )\n    {\n        try \n        { \n            unsigned long size;\n            deserialize(size, in);\n            item.resize(size);\n            for (auto& x : item)\n                deserialize(x, in);\n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while deserializing object of type std::list\"); }\n    }\n    \n// ----------------------------------------------------------------------------------------\n    \n    template <typename T, typename alloc>\n    void serialize (\n        const std::forward_list<T,alloc>& item,\n        std::ostream& out\n    )\n    {\n        try\n        { \n            const unsigned long size = std::distance(item.begin(), item.end());\n            serialize(size,out); \n            for (const auto& x : item)\n                serialize(x, out);\n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while serializing object of type std::forward_list\"); }\n    }\n\n    template <typename T, typename alloc>\n    void deserialize (\n        std::forward_list<T,alloc>& item,\n        std::istream& in\n    )\n    {\n        try \n        { \n            unsigned long size;\n            deserialize(size,in); \n            item.resize(size);\n            for (auto& x : item)\n                deserialize(x,in);\n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while deserializing object of type std::forward_list\"); }\n    }\n    \n// ----------------------------------------------------------------------------------------\n    \n    template <typename T, typename alloc>\n    void serialize (\n        const std::deque<T,alloc>& item,\n        std::ostream& out\n    )\n    {\n        try\n        { \n            const unsigned long size = static_cast<unsigned long>(item.size());\n\n            serialize(size,out); \n            for (unsigned long i = 0; i < item.size(); ++i)\n                serialize(item[i],out);\n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while serializing object of type std::deque\"); }\n    }\n\n    template <typename T, typename alloc>\n    void deserialize (\n        std::deque<T, alloc>& item,\n        std::istream& in\n    )\n    {\n        try \n        { \n            unsigned long size;\n            deserialize(size,in); \n            item.resize(size);\n            for (unsigned long i = 0; i < size; ++i)\n                deserialize(item[i],in);\n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while deserializing object of type std::deque\"); }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    inline void serialize (\n        const std::string& item,\n        std::ostream& out\n    )\n    {\n        const unsigned long size = static_cast<unsigned long>(item.size());\n        try{ serialize(size,out); }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while serializing object of type std::string\"); }\n\n        out.write(item.c_str(),size);\n        if (!out) throw serialization_error(\"Error serializing object of type std::string\");\n    }\n\n    inline void deserialize (\n        std::string& item,\n        std::istream& in\n    )\n    {\n        unsigned long size;\n        try { deserialize(size,in); }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while deserializing object of type std::string\"); }\n\n        item.resize(size);\n        if (size != 0)\n        {\n            in.read(&item[0],size);\n            if (!in) throw serialization_error(\"Error deserializing object of type std::string\");\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    inline void serialize (\n        const std::wstring& item,\n        std::ostream& out\n    )\n    {\n        const unsigned long size = static_cast<unsigned long>(item.size());\n        try{ serialize(size,out); }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while serializing object of type std::wstring\"); }\n\n        for (unsigned long i = 0; i < item.size(); ++i)\n            serialize(item[i], out);\n        if (!out) throw serialization_error(\"Error serializing object of type std::wstring\");\n    }\n\n    inline void deserialize (\n        std::wstring& item,\n        std::istream& in\n    )\n    {\n        unsigned long size;\n        try { deserialize(size,in); }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while deserializing object of type std::wstring\"); }\n\n        item.resize(size);\n        for (unsigned long i = 0; i < item.size(); ++i)\n            deserialize(item[i],in);\n\n        if (!in) throw serialization_error(\"Error deserializing object of type std::wstring\");\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    inline void serialize (\n        const ustring& item,\n        std::ostream& out\n    )\n    {\n        const unsigned long size = static_cast<unsigned long>(item.size());\n        try{ serialize(size,out); }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while serializing object of type ustring\"); }\n\n        for (unsigned long i = 0; i < item.size(); ++i)\n            serialize(item[i], out);\n        if (!out) throw serialization_error(\"Error serializing object of type ustring\");\n    }\n\n    inline void deserialize (\n        ustring& item,\n        std::istream& in\n    )\n    {\n        unsigned long size;\n        try { deserialize(size,in); }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while deserializing object of type ustring\"); }\n\n        item.resize(size);\n        for (unsigned long i = 0; i < item.size(); ++i)\n            deserialize(item[i],in);\n\n        if (!in) throw serialization_error(\"Error deserializing object of type ustring\");\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    inline void serialize (\n        const enumerable<T>& item,\n        std::ostream& out\n    )\n    {\n        try\n        {\n            item.reset();\n            serialize(item.size(),out);\n            while (item.move_next())\n                serialize(item.element(),out);\n            item.reset();\n        }\n        catch (serialization_error& e)\n        {\n            throw serialization_error(e.info + \"\\n   while serializing object of type enumerable\");\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename domain,\n        typename range\n        >\n    inline void serialize (\n        const map_pair<domain,range>& item,\n        std::ostream& out\n    )\n    {\n        try\n        {\n            serialize(item.key(),out);\n            serialize(item.value(),out);\n        }\n        catch (serialization_error& e)\n        {\n            throw serialization_error(e.info + \"\\n   while serializing object of type map_pair\");\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        size_t length\n        >\n    inline void serialize (\n        const T (&array)[length],\n        std::ostream& out\n    )\n    {\n        try\n        {\n            serialize(length,out);\n            for (size_t i = 0; i < length; ++i)\n                serialize(array[i],out);\n        }\n        catch (serialization_error& e)\n        {\n            throw serialization_error(e.info + \"\\n   while serializing a C style array\");\n        }\n    }\n\n    template <\n        size_t length\n        >\n    inline void serialize (\n        const char (&array)[length],\n        std::ostream& out\n    )\n    {\n        if (length != 0 && array[length-1] == '\\0')\n        {\n            // If this is a null terminated string then don't serialize the trailing null.\n            // We do this so that the serialization format for C-strings is the same as\n            // std::string.\n            serialize(length-1, out);\n            out.write(array, length-1);\n            if (!out)\n                throw serialization_error(\"Error serializing a C-style string\");\n        }\n        else \n        {\n            try\n            {\n                serialize(length,out);\n            }\n            catch (serialization_error& e)\n            {\n                throw serialization_error(e.info + \"\\n   while serializing a C style array\");\n            }\n            if (length != 0)\n                out.write(array, length);\n            if (!out)\n                throw serialization_error(\"Error serializing a C-style string\");\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        size_t length\n        >\n    inline void deserialize (\n        T (&array)[length],\n        std::istream& in\n    )\n    {\n        size_t size;\n        try\n        {\n            deserialize(size,in); \n            if (size == length)\n            {\n                for (size_t i = 0; i < length; ++i)\n                    deserialize(array[i],in);            \n            }\n        }\n        catch (serialization_error& e)\n        {\n            throw serialization_error(e.info + \"\\n   while deserializing a C style array\");\n        }\n\n        if (size != length)\n            throw serialization_error(\"Error deserializing a C style array, lengths do not match\");\n    }\n\n    template <\n        size_t length\n        >\n    inline void deserialize (\n        char (&array)[length],\n        std::istream& in\n    )\n    {\n        size_t size;\n        try\n        {\n            deserialize(size,in); \n        }\n        catch (serialization_error& e)\n        {\n            throw serialization_error(e.info + \"\\n   while deserializing a C style array\");\n        }\n\n        if (size == length)\n        {\n            in.read(array, size);\n            if (!in)\n                throw serialization_error(\"Error deserializing a C-style array\");\n        }\n        else if (size+1 == length)\n        {\n            // In this case we are deserializing a C-style array so we need to add the null\n            // terminator.\n            in.read(array, size);\n            array[size] = '\\0';\n            if (!in)\n                throw serialization_error(\"Error deserializing a C-style string\");\n        }\n        else\n        {\n            throw serialization_error(\"Error deserializing a C style array, lengths do not match\");\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        size_t N\n        >\n    inline void serialize (\n        const std::array<T,N>& array,\n        std::ostream& out\n    )\n    {\n        typedef T c_array_type[N];\n        serialize(*(const c_array_type*)array.data(), out);\n    }\n\n    template <\n        typename T,\n        size_t N\n        >\n    inline void deserialize (\n        std::array<T,N>& array,\n        std::istream& in \n    )\n    {\n        typedef T c_array_type[N];\n        deserialize(*(c_array_type*)array.data(), in);\n    }\n\n    template <\n        typename T\n        >\n    inline void serialize (\n        const std::array<T,0>& /*array*/,\n        std::ostream& out\n    )\n    {\n        size_t N = 0;\n        serialize(N, out);\n    }\n\n    template <\n        typename T\n        >\n    inline void deserialize (\n        std::array<T,0>& /*array*/,\n        std::istream& in \n    )\n    {\n        size_t N;\n        deserialize(N, in);\n        if (N != 0)\n        {\n            std::ostringstream sout;\n            sout << \"Expected std::array of size 0 but found a size of \" << N;\n            throw serialization_error(sout.str());\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    inline void serialize (\n        const std::complex<T>& item,\n        std::ostream& out\n    )\n    {\n        try\n        {\n            serialize(item.real(),out);\n            serialize(item.imag(),out);\n        }\n        catch (serialization_error& e)\n        {\n            throw serialization_error(e.info + \"\\n   while serializing an object of type std::complex\");\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    inline void deserialize (\n        std::complex<T>& item,\n        std::istream& in\n    )\n    {\n        try\n        {\n            T real, imag;\n            deserialize(real,in); \n            deserialize(imag,in); \n            item = std::complex<T>(real,imag);\n        }\n        catch (serialization_error& e)\n        {\n            throw serialization_error(e.info + \"\\n   while deserializing an object of type std::complex\");\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T, typename deleter>\n    void serialize (\n        const std::unique_ptr<T, deleter>& item,\n        std::ostream& out\n    )\n    {\n        try\n        {\n            bool is_non_empty = item != nullptr;\n            serialize(is_non_empty, out);\n            if (is_non_empty)\n                serialize(*item, out);\n        }\n        catch (serialization_error& e)\n        {\n            throw serialization_error(e.info + \"\\n   while serializing an object of type std::unique_ptr\");\n        }\n    }\n\n    template <typename T, typename deleter>\n    void deserialize (\n        std::unique_ptr<T, deleter>& item,\n        std::istream& in\n    )\n    {\n        try\n        {\n            //when deserializing unique_ptr, this is fresh state, so reset the pointers, even if item is non-empty\n            bool is_non_empty;\n            deserialize(is_non_empty, in);\n            item.reset(is_non_empty ? new T() : nullptr); //can't use make_unique since dlib does not use C++14 as a minimum requirement.\n            \n            if (is_non_empty)\n                deserialize(*item, in);\n        }\n        catch (serialization_error& e)\n        {\n            throw serialization_error(e.info + \"\\n   while deserializing an object of type std::unique_ptr\");\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void serialize (\n        const std::shared_ptr<T>& item,\n        std::ostream& out\n    )\n    {\n        try\n        {\n            bool is_non_empty = item != nullptr;\n            serialize(is_non_empty, out);\n            if (is_non_empty)\n                serialize(*item, out);\n        }\n        catch (serialization_error& e)\n        {\n            throw serialization_error(e.info + \"\\n   while serializing an object of type std::shared_ptr\");\n        }\n    }\n\n    template <typename T>\n    void deserialize (\n        std::shared_ptr<T>& item,\n        std::istream& in\n    )\n    {\n        try\n        {\n            //when deserializing shared_ptr, this is fresh state, so reset the pointers, even if item is non-empty\n            bool is_non_empty;\n            deserialize(is_non_empty, in);\n            item = is_non_empty ? std::make_shared<T>() : nullptr;\n            \n            if (is_non_empty)\n                deserialize(*item, in);\n        }\n        catch (serialization_error& e)\n        {\n            throw serialization_error(e.info + \"\\n   while deserializing an object of type std::shared_ptr\");\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    class proxy_serialize\n    {\n    public:\n        explicit proxy_serialize (\n            const std::string& filename\n        ) : fout_optional_owning_ptr(new std::ofstream(filename.c_str(), std::ios::binary)),\n            fout(*fout_optional_owning_ptr)\n        {\n            if (!fout)\n                throw serialization_error(\"Unable to open \" + filename + \" for writing.\");\n        }\n        \n        explicit proxy_serialize (\n            std::vector<char>& buf\n        ) : fout_optional_owning_ptr(new vectorstream(buf)),\n            fout(*fout_optional_owning_ptr)\n        {\n        }\n        \n        explicit proxy_serialize (\n            std::ostream& ss\n        ) : fout_optional_owning_ptr(nullptr),\n            fout(ss)\n        {}\n        \n        template <typename T>\n        inline proxy_serialize& operator<<(const T& item)\n        {\n            serialize(item, fout);\n            return *this;\n        }\n\n    private:\n        std::unique_ptr<std::ostream> fout_optional_owning_ptr;\n        std::ostream& fout;\n    };\n    \n    class proxy_deserialize\n    {\n    public:\n        explicit proxy_deserialize (\n            const std::string& filename_\n        )  : filename(filename_),\n             fin_optional_owning_ptr(new std::ifstream(filename.c_str(), std::ios::binary)),\n             fin(*fin_optional_owning_ptr)   \n        {\n            if (!fin)\n                throw serialization_error(\"Unable to open \" + filename + \" for reading.\");\n            init();\n        }\n        \n        explicit proxy_deserialize (\n            std::vector<char>& buf\n        ) : fin_optional_owning_ptr(new vectorstream(buf)),\n            fin(*fin_optional_owning_ptr)   \n        {\n            init();\n        }\n        \n        explicit proxy_deserialize (\n            std::istream& ss\n        ) : fin_optional_owning_ptr(nullptr),\n            fin(ss)\n        {\n            init();\n        }\n                \n        template <typename T>\n        inline proxy_deserialize& operator>>(T& item)\n        {\n            return doit(item);\n        }\n\n        template <typename T>\n        inline proxy_deserialize& operator>>(ramdump_t<T>&& item)\n        {\n            return doit(std::move(item));\n        }\n        \n    private:\n\n        void init()\n        {\n            // read the file header into a buffer and then seek back to the start of the\n            // file.\n            fin.read(file_header,4);\n            fin.clear();\n            fin.seekg(0);\n        }\n        \n    private:\n        \n        template <typename T>\n        inline proxy_deserialize& doit(T&& item)\n        {\n            try\n            {\n                if (fin.peek() == EOF)\n                    throw serialization_error(\"No more objects were in the stream!\");\n                deserialize(std::forward<T>(item), fin);\n            }\n            catch (serialization_error& e)\n            {\n                std::string suffix;\n                if (looks_like_a_compressed_file())\n                    suffix = \"\\n *** THIS LOOKS LIKE A COMPRESSED FILE.  DID YOU FORGET TO DECOMPRESS IT? *** \\n\";\n\n                const std::string stream_description = filename.empty() ? \"stream\" : \"file '\" + filename + \"'\";\n                \n                if (objects_read == 0)\n                {\n                    throw serialization_error(\"An error occurred while trying to read the first\" \n                        \" object from the \" + stream_description + \".\\nERROR: \" + e.info + \"\\n\" + suffix);\n                }\n                else if (objects_read == 1)\n                {\n                    throw serialization_error(\"An error occurred while trying to read the second\" \n                        \" object from the \" + stream_description + \".\\nERROR: \" + e.info + \"\\n\" + suffix);\n                }\n                else if (objects_read == 2)\n                {\n                    throw serialization_error(\"An error occurred while trying to read the third\" \n                        \" object from the \" + stream_description + \".\\nERROR: \" + e.info + \"\\n\" + suffix);\n                }\n                else \n                {\n                    throw serialization_error(\"An error occurred while trying to read the \" +\n                        std::to_string(objects_read+1) + \"th object from the \" + stream_description + \".\\nERROR: \" + e.info + \"\\n\" + suffix);\n                }\n            }\n            ++objects_read;\n            return *this;\n        }\n\n        int objects_read = 0;\n        const std::string filename = \"\";\n        std::unique_ptr<std::istream> fin_optional_owning_ptr;\n        std::istream& fin;\n\n        // We don't need to look at the file header.  However, it's here because people\n        // keep posting questions to the dlib forums asking why they get file load errors.\n        // Then it turns out that the problem is they have a compressed file that NEEDS TO\n        // BE DECOMPRESSED by bzip2 or whatever and the reason they are getting\n        // deserialization errors is because they didn't decompress the file.  So we are\n        // going to check if this file looks like a compressed file and if so then emit an\n        // error message telling them to unzip the file. :(\n        char file_header[4] = {0,0,0,0};\n\n        bool looks_like_a_compressed_file(\n        ) const \n        {\n            if (file_header[0] == 'B' && file_header[1] == 'Z' && file_header[2] == 'h' &&\n                ('0' <= file_header[3] && file_header[3] <= '9') )\n            {\n                return true;\n            }\n\n            return false;\n        }\n    };\n\n    inline proxy_serialize serialize(const std::string& filename)\n    { return proxy_serialize(filename); }\n    inline proxy_serialize serialize(std::ostream& ss)\n    { return proxy_serialize(ss); }\n    inline proxy_serialize serialize(std::vector<char>& buf)\n    { return proxy_serialize(buf); }\n    inline proxy_deserialize deserialize(const std::string& filename)\n    { return proxy_deserialize(filename); }\n    inline proxy_deserialize deserialize(std::istream& ss)\n    { return proxy_deserialize(ss); }\n    inline proxy_deserialize deserialize(std::vector<char>& buf)\n    { return proxy_deserialize(buf); }\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n// forward declare the MessageLite object so we can reference it below.\nnamespace google\n{\n    namespace protobuf\n    {\n        class MessageLite;\n    }\n}\n\nnamespace dlib\n{\n\n    /*!A is_protocol_buffer\n        This is a template that tells you if a type is a Google protocol buffer object.  \n    !*/\n\n    template <typename T, typename U = void > \n    struct is_protocol_buffer \n    {\n        static const bool value = false;\n    };\n\n    template <typename T>\n    struct is_protocol_buffer <T,typename enable_if<is_convertible<T*,::google::protobuf::MessageLite*> >::type  >\n    {\n        static const bool value = true;\n    };\n\n    template <typename T>\n    typename enable_if<is_protocol_buffer<T> >::type serialize(const T& item, std::ostream& out)\n    {\n        // Note that Google protocol buffer messages are not self delimiting \n        // (see https://developers.google.com/protocol-buffers/docs/techniques)\n        // This means they don't record their length or where they end, so we have \n        // to record this information ourselves.  So we save the size as a little endian 32bit \n        // integer prefixed onto the front of the message.\n\n        byte_orderer bo;\n\n        // serialize into temp string\n        std::string temp;\n        if (!item.SerializeToString(&temp))\n            throw dlib::serialization_error(\"Error while serializing a Google Protocol Buffer object.\");\n        if (temp.size() > std::numeric_limits<uint32>::max())\n            throw dlib::serialization_error(\"Error while serializing a Google Protocol Buffer object, message too large.\");\n\n        // write temp to the output stream\n        uint32 size = static_cast<uint32>(temp.size());\n        bo.host_to_little(size);\n        out.write((char*)&size, sizeof(size));\n        out.write(temp.c_str(), temp.size());\n    }\n\n    template <typename T>\n    typename enable_if<is_protocol_buffer<T> >::type deserialize(T& item, std::istream& in)\n    {\n        // Note that Google protocol buffer messages are not self delimiting \n        // (see https://developers.google.com/protocol-buffers/docs/techniques)\n        // This means they don't record their length or where they end, so we have \n        // to record this information ourselves.  So we save the size as a little endian 32bit \n        // integer prefixed onto the front of the message.\n\n        byte_orderer bo;\n\n        uint32 size = 0;\n        // read the size\n        in.read((char*)&size, sizeof(size));\n        bo.little_to_host(size);\n        if (!in || size == 0)\n            throw dlib::serialization_error(\"Error while deserializing a Google Protocol Buffer object.\");\n\n        // read the bytes into temp\n        std::string temp;\n        temp.resize(size);\n        in.read(&temp[0], size);\n\n        // parse temp into item\n        if (!in || !item.ParseFromString(temp))\n        {\n            throw dlib::serialization_error(\"Error while deserializing a Google Protocol Buffer object.\");\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    inline void check_serialized_version(const std::string& expected_version, std::istream& in)\n    {\n        std::string version;\n        deserialize(version, in);\n        if (version != expected_version)\n        {\n            throw serialization_error(\"Unexpected version '\"+version+\n                \"' found while deserializing object. Expected version to be '\"+expected_version+\"'.\");\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template<typename T>\n    inline void serialize_these(std::ostream& out, const T& x)\n    {\n        using dlib::serialize;\n        serialize(x, out);\n    }\n    \n    template<typename T, typename... Rest>\n    inline void serialize_these(std::ostream& out, const T& x, const Rest& ... rest)\n    {\n        serialize_these(out, x);\n        serialize_these(out, rest...);\n    }\n    \n    template<typename T>\n    inline void deserialize_these(std::istream& in, T& x)\n    {\n        using dlib::deserialize;\n        deserialize(x, in);\n    }\n    \n    template<typename T, typename... Rest>\n    inline void deserialize_these(std::istream& in, T& x, Rest& ... rest)\n    {\n        deserialize_these(in, x);\n        deserialize_these(in, rest...);\n    }  \n    \n    #define DLIB_DEFINE_DEFAULT_SERIALIZATION(Type, ...)                \\\n    void serialize_to(std::ostream& out) const                          \\\n    {                                                                   \\\n        using dlib::serialize;                                          \\\n        using dlib::serialize_these;                                    \\\n        try                                                             \\\n        {                                                               \\\n            /* Write a version header so that if, at a later time, */   \\\n            /* you realize you need to change the serialization    */   \\\n            /* format you can identify which version of the format */   \\\n            /* you are encountering when reading old files.        */   \\\n            int version = 1;                                            \\\n            serialize(version, out);                                    \\\n            serialize_these(out, __VA_ARGS__);                          \\\n        }                                                               \\\n        catch (dlib::serialization_error& e)                            \\\n        {                                                               \\\n            throw dlib::serialization_error(e.info + \"\\n   while serializing object of type \" #Type); \\\n        }                                                               \\\n    }                                                                   \\\n                                                                        \\\n    void deserialize_from(std::istream& in)                             \\\n    {                                                                   \\\n        using dlib::deserialize;                                        \\\n        using dlib::deserialize_these;                                  \\\n        try                                                             \\\n        {                                                               \\\n            int version = 0;                                            \\\n            deserialize(version, in);                                   \\\n            if (version != 1)                                           \\\n                throw dlib::serialization_error(\"Unexpected version found while deserializing \" #Type); \\\n            deserialize_these(in, __VA_ARGS__);                         \\\n        }                                                               \\\n        catch (dlib::serialization_error& e)                            \\\n        {                                                               \\\n            throw dlib::serialization_error(e.info + \"\\n   while deserializing object of type \" #Type); \\\n        }                                                               \\\n    }                                                                   \\\n    inline friend void serialize(const Type& item, std::ostream& out)   \\\n    {                                                                   \\\n        item.serialize_to(out);                                         \\\n    }                                                                   \\\n    inline friend void deserialize(Type& item, std::istream& in)        \\\n    {                                                                   \\\n        item.deserialize_from(in);                                      \\\n    }\n}\n\n#endif // DLIB_SERIALIZe_\n\n"
  },
  {
    "path": "benchmarks/dlib/set/set_compare_1.h",
    "content": "// Copyright (C) 2005  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_SET_COMPARe_1_\n#define DLIB_SET_COMPARe_1_\n\n#include \"set_compare_abstract.h\"\n\n#include \"../algs.h\"\n\n\n\nnamespace dlib\n{\n\n    template <\n        typename set_base \n        >\n    class set_compare_1 : public set_base\n    {\n\n        public:\n\n            bool operator< (\n                const set_compare_1& rhs\n            ) const;\n\n            bool operator== (\n                const set_compare_1& rhs\n            ) const;\n\n    };\n\n\n    template <\n        typename set_base\n        >\n    inline void swap (\n        set_compare_1<set_base>& a, \n        set_compare_1<set_base>& b \n    ) { a.swap(b); }  \n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // member function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename set_base\n        >\n    bool set_compare_1<set_base>::\n    operator< (\n        const set_compare_1<set_base>& rhs\n    ) const\n    {\n        bool result = false;\n        if (set_base::size() < rhs.size())\n            result = true;\n\n        if (set_base::size() == rhs.size())\n        {\n            rhs.reset();\n            set_base::reset();\n            while (rhs.move_next())\n            {\n                set_base::move_next();\n                if (set_base::element() < rhs.element())\n                {\n                    result = true;\n                    break;\n                }\n                else if (rhs.element() < set_base::element())\n                {\n                    break;\n                }\n            }            \n        }\n\n        set_base::reset();\n        rhs.reset();\n\n        return result;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename set_base\n        >\n    bool set_compare_1<set_base>::\n    operator== (\n        const set_compare_1<set_base>& rhs\n    ) const\n    {\n        bool result = true;\n        if (set_base::size() != rhs.size())\n            result = false;\n\n\n        rhs.reset();\n        set_base::reset();\n        while (rhs.move_next() && set_base::move_next())\n        {            \n            if (!(rhs.element() == set_base::element()))\n            {\n                result = false;\n                break;\n            }\n        }\n\n        set_base::reset();\n        rhs.reset();\n\n        return result;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_SET_COMPARe_1_\n\n"
  },
  {
    "path": "benchmarks/dlib/set/set_compare_abstract.h",
    "content": "// Copyright (C) 2005  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_SET_COMPARe_ABSTRACT_\n#ifdef DLIB_SET_COMPARe_ABSTRACT_\n\n#include \"set_kernel_abstract.h\"\n\n#include \"../algs.h\"\n\n\nnamespace dlib\n{\n\n    template <\n        typename set_base\n        >\n    class set_compare : public set_base\n    {\n\n        /*!\n            REQUIREMENTS ON set_base\n                must be an implementation of set/set_kernel_abstract.h\n\n            POINTERS AND REFERENCES TO INTERNAL DATA\n                operator== and operator< invalidate pointers or references to \n                data members.\n\n            WHAT THIS EXTENSION DOES FOR set\n                This gives a set the ability to compare itself to other \n                sets using the < and == operators. \n\n                The < operator is conceptually weird for sets.  It is useful \n                though because it allows you to make sets of sets since\n                sets require that their containing type implement operator<.\n\n                Also note that it is the case that for any two sets a and b \n                if (a<b) == false and (b<a) == false then a == b. \n\n                Also note that unless specified otherwise, no member functions\n                of this object throw exceptions.\n               \n\n            NOTATION\n                For the purposes of defining what these operators do I will \n                use the operator[] to reference the elements of the sets.\n                operator[] is defined to access the elements of the set in \n                the same order they would be enumerated by the enumerable \n                interface.\n        !*/\n\n        public:\n\n            bool operator< (\n                const set_compare& rhs\n            ) const;\n            /*!\n                ensures\n                    - #at_start() == true\n                    - if (size() < rhs.size()) then\n                        - returns true\n                    - else if (size() > rhs.size()) then\n                        - returns false\n                    - else\n                        - returns true if there exists an integer j such that 0 <= j < size() \n                          and for all integers i such that 0 <= i < j where it is true that\n                          (*this)[i] == rhs[i] and (*this)[j] < rhs[j] \n                        - returns false if there is no j that will satisfy the above conditions.                    \n            !*/\n\n            bool operator== (\n                const set_compare& rhs\n            ) const;\n            /*!\n                ensures\n                    - #at_start() == true\n                    - returns true if *this and rhs contain the same elements.\n                      returns false otherwise.\n            !*/\n    };\n\n\n    template <\n        typename set_base\n        >\n    inline void swap (\n        set_compare<set_base>& a, \n        set_compare<set_base>& b \n    ) { a.swap(b); } \n    /*!\n        provides a global swap function\n    !*/\n\n}\n\n#endif // DLIB_SET_COMPARe_ABSTRACT_\n\n"
  },
  {
    "path": "benchmarks/dlib/set/set_kernel_1.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_SET_KERNEl_1_\n#define DLIB_SET_KERNEl_1_\n\n#include \"set_kernel_abstract.h\"\n#include \"../algs.h\"\n#include \"../interfaces/enumerable.h\"\n#include \"../interfaces/remover.h\"\n#include \"../serialize.h\"\n\nnamespace dlib\n{\n\n    template <\n        typename T,\n        typename bst_base,\n        typename mem_manager = default_memory_manager\n        >\n    class set_kernel_1 : public enumerable<const T>,\n                         public asc_remover<T,typename bst_base::compare_type>\n    {\n\n        /*!\n            REQUIREMENTS ON bst_base\n                bst_base is instantiated with <domain=T,range=char> and\n                implements binray_search_tree/binary_search_tree_kernel_abstract.h\n\n            INITIAL VALUE\n                bst has its initial value\n\n            CONVENTION\n                bst.size() == the number of elements in the set and\n                the elements in the set are stored in bst\n        !*/\n        \n\n        public:\n\n            typedef T type;\n            typedef typename bst_base::compare_type compare_type;\n            typedef mem_manager mem_manager_type;\n\n            set_kernel_1(\n            )\n            {\n            }\n\n            virtual ~set_kernel_1(\n            )\n            {}\n\n            inline void clear(\n            );\n\n            inline void add (\n                T& item\n            );\n\n            inline bool is_member (\n                const T& item\n            ) const;\n\n            inline void remove (\n                const T& item,\n                T& item_copy\n            );\n\n            inline void destroy (\n                const T& item\n            );\n\n            inline void swap (\n                set_kernel_1& item\n            );\n\n            // functions from the remover interface\n            inline void remove_any (\n                T& item\n            );\n\n            // functions from the enumerable interface\n            inline size_t size (\n            ) const;\n\n            inline bool at_start (\n            ) const;\n\n            inline void reset (\n            ) const;\n\n            inline bool current_element_valid (\n            ) const;\n\n            inline const T& element (\n            ) const;\n\n     \n            inline const T& element (\n            );\n\n            inline bool move_next (\n            ) const;\n\n            \n        private:\n\n            bst_base bst;\n            char junk;\n\n            // restricted functions\n            set_kernel_1(set_kernel_1&);        \n            set_kernel_1& operator=(set_kernel_1&); \n\n    };\n\n    template <\n        typename T,\n        typename bst_base,\n        typename mem_manager\n        >\n    inline void swap (\n        set_kernel_1<T,bst_base,mem_manager>& a, \n        set_kernel_1<T,bst_base,mem_manager>& b \n    ) { a.swap(b); } \n\n    template <\n        typename T,\n        typename bst_base,\n        typename mem_manager\n        >\n    void deserialize (\n        set_kernel_1<T,bst_base,mem_manager>& item, \n        std::istream& in\n    )\n    {\n        try\n        {\n            item.clear();\n            unsigned long size;\n            deserialize(size,in);\n            T temp;\n            for (unsigned long i = 0; i < size; ++i)\n            {\n                deserialize(temp,in);\n                item.add(temp);\n            }\n        }\n        catch (serialization_error& e)\n        { \n            item.clear();\n            throw serialization_error(e.info + \"\\n   while deserializing object of type set_kernel_1\"); \n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // member function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename bst_base,\n        typename mem_manager\n        >\n    void set_kernel_1<T,bst_base,mem_manager>::\n    clear (\n    )\n    {\n        bst.clear();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename bst_base,\n        typename mem_manager\n        >\n    void set_kernel_1<T,bst_base,mem_manager>::\n    add (\n        T& item\n    )\n    {\n        bst.add(item,junk);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename bst_base,\n        typename mem_manager\n        >\n    bool set_kernel_1<T,bst_base,mem_manager>::\n    is_member(\n        const T& item\n    ) const\n    {\n        return (bst[item] != 0);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename bst_base,\n        typename mem_manager\n        >\n    void set_kernel_1<T,bst_base,mem_manager>::\n    remove_any (\n        T& item\n    )\n    {\n        bst.remove_any(item,junk);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename bst_base,\n        typename mem_manager\n        >\n    void set_kernel_1<T,bst_base,mem_manager>::\n    remove(\n        const T& item,\n        T& item_copy\n    )\n    {\n        bst.remove(item,item_copy,junk);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename bst_base,\n        typename mem_manager\n        >\n    void set_kernel_1<T,bst_base,mem_manager>::\n    destroy(\n        const T& item\n    )\n    {\n        bst.destroy(item);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename bst_base,\n        typename mem_manager\n        >\n    size_t set_kernel_1<T,bst_base,mem_manager>::\n    size (\n    ) const\n    {\n        return bst.size();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename bst_base,\n        typename mem_manager\n        >\n    void set_kernel_1<T,bst_base,mem_manager>::\n    swap (\n        set_kernel_1<T,bst_base,mem_manager>& item\n    )\n    {\n        bst.swap(item.bst);\n    }\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // enumerable function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename bst_base,\n        typename mem_manager\n        >\n    bool set_kernel_1<T,bst_base,mem_manager>::\n    at_start (\n    ) const\n    {\n        return bst.at_start();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename bst_base,\n        typename mem_manager\n        >\n    void set_kernel_1<T,bst_base,mem_manager>::\n    reset (\n    ) const\n    {\n        bst.reset();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename bst_base,\n        typename mem_manager\n        >\n    bool set_kernel_1<T,bst_base,mem_manager>::\n    current_element_valid (\n    ) const\n    {\n        return bst.current_element_valid();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename bst_base,\n        typename mem_manager\n        >\n    const T& set_kernel_1<T,bst_base,mem_manager>::\n    element (\n    ) const\n    {\n        return bst.element().key();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename bst_base,\n        typename mem_manager\n        >\n    const T& set_kernel_1<T,bst_base,mem_manager>::\n    element (\n    )\n    {\n        return bst.element().key();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename bst_base,\n        typename mem_manager\n        >\n    bool set_kernel_1<T,bst_base,mem_manager>::\n    move_next (\n    ) const\n    {\n        return bst.move_next();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_SET_KERNEl_1_\n\n"
  },
  {
    "path": "benchmarks/dlib/set/set_kernel_abstract.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_SET_KERNEl_ABSTRACT_\n#ifdef DLIB_SET_KERNEl_ABSTRACT_\n\n#include \"../interfaces/enumerable.h\"\n#include \"../interfaces/remover.h\"\n#include \"../serialize.h\"\n#include \"../algs.h\"\n#include <functional>\n\nnamespace dlib\n{\n\n    template <\n        typename T,\n        typename mem_manager = default_memory_manager,\n        typename compare = std::less<T>\n        >\n    class set : public enumerable<const T>,\n                public asc_remover<T,compare>\n    {\n\n        /*!                \n            REQUIREMENTS ON T\n                T must be comparable by compare where compare is a functor compatible with std::less and\n                T must be swappable by a global swap() and\n                T must have a default constructor\n\n            REQUIREMENTS ON mem_manager\n                must be an implementation of memory_manager/memory_manager_kernel_abstract.h or\n                must be an implementation of memory_manager_global/memory_manager_global_kernel_abstract.h or\n                must be an implementation of memory_manager_stateless/memory_manager_stateless_kernel_abstract.h \n                mem_manager::type can be set to anything.\n\n            POINTERS AND REFERENCES TO INTERNAL DATA\n                swap() and is_member() functions do not invalidate pointers \n                or references to internal data.\n                All other functions have no such guarantee.\n\n            INITIAL VALUE\n                size() == 0    \n\n            ENUMERATION ORDER\n                The enumerator will iterate over the elements in the set in \n                ascending order according to the compare functor. \n                (i.e. the elements are enumerated in sorted order)\n\n            WHAT THIS OBJECT REPRESENTS\n                set contains items of type T\n\n                This object represents an unaddressed collection of items. \n                Every element in a set is unique.\n\n                definition of equivalent:\n                a is equivalent to b if\n                a < b == false and\n                b < a == false\n        !*/\n        \n        public:\n\n            typedef T type;\n            typedef compare compare_type;\n            typedef mem_manager mem_manager_type;\n\n            set(\n            );\n            /*!\n                ensures \n                    - #*this is properly initialized\n                throws\n                    - std::bad_alloc or any exception thrown by T's constructor\n            !*/\n\n            virtual ~set(\n            ); \n            /*!\n                ensures\n                    - all memory associated with *this has been released\n            !*/\n\n            void clear(\n            );\n            /*!\n                ensures\n                    - #*this has its initial value\n                throws\n                    - std::bad_alloc or any exception thrown by T's constructor\n                        if this exception is thrown then *this is unusable \n                        until clear() is called and succeeds\n            !*/\n\n            void add (\n                T& item\n            );\n            /*!\n                requires\n                    - is_member(item) == false\n                ensures\n                    - #is_member(item) == true \n                    - #item has an initial value for its type \n                    - #size() == size() + 1\n                    - #at_start() == true\n                throws\n                    - std::bad_alloc or any exception thrown by T's constructor\n                        if add() throws then it has no effect\n            !*/\n\n            bool is_member (\n                const T& item\n            ) const;\n            /*!\n                ensures\n                    - returns whether or not there is an element in *this equivalent to \n                      item\n            !*/\n\n            void remove (\n                const T& item,\n                T& item_copy\n            );\n            /*!\n                requires\n                    - is_member(item) == true\n                    - &item != &item_copy (i.e. item and item_copy cannot be the same \n                      variable) \n                ensures\n                    - #is_member(item) == false \n                    - the element in *this equivalent to item has been removed and \n                      swapped into #item_copy\n                    - #size() == size() - 1\n                    - #at_start() == true\n            !*/\n\n            void destroy (\n                const T& item\n            );\n            /*!\n                requires\n                    - is_member(item) == true\n                ensures\n                    - #is_member(item) == false \n                    - #size() == size() - 1\n                    - #at_start() == true\n            !*/\n\n            void swap (\n                set& item\n            );\n            /*!\n                ensures\n                    - swaps *this and item\n            !*/ \n    \n        private:\n\n            // restricted functions\n            set(set&);        // copy constructor\n            set& operator=(set&);    // assignment operator\n\n    };\n\n    template <\n        typename T,\n        typename mem_manager,\n        typename compare\n        >\n    inline void swap (\n        set<T,mem_manager,compare>& a, \n        set<T,mem_manager,compare>& b \n    ) { a.swap(b); }   \n    /*!\n        provides a global swap function\n    !*/\n\n    template <\n        typename T,\n        typename mem_manager,\n        typename compare\n        >\n    void deserialize (\n        set<T,mem_manager,compare>& item, \n        std::istream& in\n    );   \n    /*!\n        provides deserialization support \n    !*/\n}\n\n#endif // DLIB_SET_KERNEl_ABSTRACT_\n\n"
  },
  {
    "path": "benchmarks/dlib/set/set_kernel_c.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_SET_KERNEl_C_\n#define DLIB_SET_KERNEl_C_\n\n#include \"set_kernel_abstract.h\"\n#include \"../algs.h\"\n#include \"../assert.h\"\n\nnamespace dlib\n{\n\n    template <\n        typename set_base\n        >\n    class set_kernel_c : public set_base\n    {\n        typedef typename set_base::type T;\n    public:\n\n        void add (\n            T& item\n        );\n\n        void remove_any (\n            T& item\n        );\n\n        void remove (\n            const T& item,\n            T& item_copy\n        );\n\n        void destroy (\n            const T& item\n        );\n\n        const T& element (\n        );\n\n        const T& element (\n        ) const;\n    };\n\n\n    template <\n        typename set_base\n        >\n    inline void swap (\n        set_kernel_c<set_base>& a, \n        set_kernel_c<set_base>& b \n    ) { a.swap(b); } \n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n// member function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename set_base\n        >\n    void set_kernel_c<set_base>::\n    add(\n        T& item\n    )\n    {\n        // make sure requires clause is not broken\n        DLIB_CASSERT( !this->is_member(item),\n                 \"\\tvoid set::add\"\n                 << \"\\n\\titem being added must not already be in the set\"\n                 << \"\\n\\tthis: \" << this\n        );\n\n        // call the real function\n        set_base::add(item);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename set_base\n        >\n    void set_kernel_c<set_base>::\n    remove (\n        const T& item,\n        T& item_copy\n    )\n    {\n        // make sure requires clause is not broken\n        DLIB_CASSERT( this->is_member(item) &&\n                 (static_cast<const void*>(&item) != static_cast<void*>(&item_copy)),\n                 \"\\tvoid set::remove\"\n                 << \"\\n\\titem should be in the set if it's going to be removed\"\n                 << \"\\n\\tthis:            \" << this\n                 << \"\\n\\t&item:           \" << &item \n                 << \"\\n\\t&item_copy:      \" << &item_copy\n                 << \"\\n\\tis_member(item): \" << (this->is_member(item)?\"true\":\"false\")\n        );\n\n        // call the real function\n        set_base::remove(item,item_copy);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename set_base\n        >\n    void set_kernel_c<set_base>::\n    destroy (\n        const T& item\n    )\n    {\n        // make sure requires clause is not broken\n        DLIB_CASSERT( this->is_member(item), \n                 \"\\tvoid set::destroy\"\n                 << \"\\n\\titem should be in the set if it's going to be removed\"\n                 << \"\\n\\tthis:            \" << this\n                 << \"\\n\\t&item:           \" << &item \n        );\n\n        // call the real function\n        set_base::destroy(item);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename set_base\n        >\n    void set_kernel_c<set_base>::\n    remove_any (\n        T& item\n    ) \n    {\n        // make sure requires clause is not broken\n        DLIB_CASSERT( this->size() != 0,\n                 \"\\tvoid set::remove_any\"\n                 << \"\\n\\tsize must be greater than zero if an item is to be removed\"\n                 << \"\\n\\tthis: \" << this\n        );\n\n        // call the real function\n        set_base::remove_any(item);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename set_base\n        >\n    const typename set_base::type& set_kernel_c<set_base>::\n    element (\n    ) const\n    {\n        // make sure requires clause is not broken\n        DLIB_CASSERT(this->current_element_valid() == true,\n                \"\\tconst T& set::element() const\"\n                << \"\\n\\tyou can't access the current element if it doesn't exist\"\n                << \"\\n\\tthis: \" << this\n        );\n\n        // call the real function\n        return set_base::element();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename set_base\n        >\n    const typename set_base::type& set_kernel_c<set_base>::\n    element (\n    ) \n    {\n        // make sure requires clause is not broken\n        DLIB_CASSERT(this->current_element_valid() == true,\n                \"\\tconst T& set::element\"\n                << \"\\n\\tyou can't access the current element if it doesn't exist\"\n                << \"\\n\\tthis: \" << this\n        );\n\n        // call the real function\n        return set_base::element();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n\n}\n\n#endif // DLIB_SET_KERNEl_C_\n\n"
  },
  {
    "path": "benchmarks/dlib/set.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_SEt_\n#define DLIB_SEt_\n\n#include \"set/set_kernel_1.h\"\n#include \"set/set_kernel_c.h\"\n\n\n\n#include \"binary_search_tree.h\"\n\n#include \"set/set_compare_1.h\"\n\n#include \"algs.h\"\n#include <functional>\n\nnamespace dlib\n{\n\n    template <\n        typename T,\n        typename mem_manager = default_memory_manager,\n        typename compare = std::less<T>\n        >\n    class set\n    {\n        set() {}\n\n\n\n\n\n        typedef typename binary_search_tree<T,char,mem_manager,compare>::kernel_1a\n                binary_search_tree_1;\n\n        typedef typename binary_search_tree<T,char,mem_manager,compare>::kernel_2a\n                binary_search_tree_2;\n\n    public:\n        \n        //----------- kernels ---------------\n\n        // kernel_1a\n        typedef     set_kernel_1<T,binary_search_tree_1,mem_manager>\n                    kernel_1a;\n        typedef     set_kernel_c<kernel_1a>\n                    kernel_1a_c;\n\n        // kernel_1b\n        typedef     set_kernel_1<T,binary_search_tree_2,mem_manager>\n                    kernel_1b;\n        typedef     set_kernel_c<kernel_1b>\n                    kernel_1b_c;\n\n\n        //---------- extensions ------------\n\n        // compare extensions\n        typedef     set_compare_1<kernel_1a>\n                    compare_1a;\n        typedef     set_compare_1<kernel_1a_c>\n                    compare_1a_c;\n\n        typedef     set_compare_1<kernel_1b>\n                    compare_1b;\n        typedef     set_compare_1<kernel_1b_c>\n                    compare_1b_c;\n\n    };\n}\n\n#endif // DLIB_SEt_\n\n"
  },
  {
    "path": "benchmarks/dlib/sliding_buffer/circular_buffer.h",
    "content": "// Copyright (C) 2012  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_CIRCULAR_BuFFER_Hh_\n#define DLIB_CIRCULAR_BuFFER_Hh_\n\n#include \"circular_buffer_abstract.h\"\n#include <vector>\n#include \"../algs.h\"\n#include \"../serialize.h\"\n#include \"../matrix/matrix_mat.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    class circular_buffer\n    {\n    public:\n        typedef default_memory_manager mem_manager_type;\n        typedef T value_type;\n        typedef T type;\n\n        circular_buffer()\n        {\n        }\n\n        explicit circular_buffer(unsigned long s)\n        {\n            resize(s);\n        }\n\n        void clear (\n        )\n        {\n            offset = 0;\n            data.clear();\n        }\n\n        T& operator[] ( unsigned long i) \n        { \n            DLIB_ASSERT(i < size(),\n                \"\\t T& circular_buffer::operator[](i)\"\n                << \"\\n\\t You have supplied an invalid index\"\n                << \"\\n\\t this:   \" << this\n                << \"\\n\\t i:      \" << i \n                << \"\\n\\t size(): \" << size()\n            );\n            return data[(i+offset)%data.size()]; \n        }\n\n        const T& operator[] ( unsigned long i) const \n        { \n            DLIB_ASSERT(i < size(),\n                \"\\t const T& circular_buffer::operator[](i)\"\n                << \"\\n\\t You have supplied an invalid index\"\n                << \"\\n\\t this:   \" << this\n                << \"\\n\\t i:      \" << i \n                << \"\\n\\t size(): \" << size()\n            );\n            return data[(i+offset)%data.size()]; \n        }\n\n        void resize(unsigned long size) \n        {  \n            offset = 0;\n            data.resize(size); \n        }\n\n        void assign(\n            unsigned long size, \n            const T& value\n        ) \n        { \n            offset = 0;\n            data.assign(size,value); \n        }\n\n        unsigned long size() const { return data.size(); }\n\n        void push_front(const T& value)\n        {\n            if (data.size() != 0)\n            {\n                offset = (offset - 1 + data.size())%data.size();\n                data[offset] = value;\n            }\n        }\n\n        void push_back(const T& value)\n        {\n            if (data.size() != 0)\n            {\n                data[offset] = value;\n                offset = (offset + 1 + data.size())%data.size();\n            }\n        }\n\n        T& front(\n        ) \n        { \n            DLIB_CASSERT(size() > 0,\n                \"\\t T& circular_buffer::front()\"\n                << \"\\n\\t You can't call front() on an empty circular_buffer\"\n                << \"\\n\\t this:   \" << this\n            );\n            return (*this)[0];\n        }\n\n        const T& front(\n        ) const\n        { \n            DLIB_CASSERT(size() > 0,\n                \"\\t const T& circular_buffer::front()\"\n                << \"\\n\\t You can't call front() on an empty circular_buffer\"\n                << \"\\n\\t this:   \" << this\n            );\n            return (*this)[0];\n        }\n\n        T& back(\n        ) \n        { \n            DLIB_CASSERT(size() > 0,\n                \"\\t T& circular_buffer::back()\"\n                << \"\\n\\t You can't call back() on an empty circular_buffer\"\n                << \"\\n\\t this:   \" << this\n            );\n            return (*this)[size()-1];\n        }\n\n        const T& back(\n        ) const\n        { \n            DLIB_CASSERT(size() > 0,\n                \"\\t const T& circular_buffer::back()\"\n                << \"\\n\\t You can't call back() on an empty circular_buffer\"\n                << \"\\n\\t this:   \" << this\n            );\n            return (*this)[size()-1];\n        }\n\n        void swap( circular_buffer& item)\n        {\n            std::swap(item.offset, offset);\n            data.swap(item.data);\n        }\n\n\n    private:\n        std::vector<T> data;\n\n        unsigned long offset = 0;\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    void swap (\n        circular_buffer<T>& a, \n        circular_buffer<T>& b \n    ) { a.swap(b); }   \n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    void serialize (\n        const circular_buffer<T>& item, \n        std::ostream& out \n    )   \n    {\n        try\n        {\n            serialize(item.size(),out);\n            for (unsigned long i = 0; i < item.size(); ++i)\n                serialize(item[i],out);\n        }\n        catch (serialization_error& e)\n        { \n            throw serialization_error(e.info + \"\\n   while serializing object of type circular_buffer\"); \n        }\n\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    void deserialize (\n        circular_buffer<T>& item, \n        std::istream& in\n    )   \n    {\n        try\n        {\n            unsigned long size;\n            deserialize(size,in);\n            item.resize(size);\n            for (unsigned long i = 0; i < size; ++i)\n                deserialize(item[i],in);\n        }\n        catch (serialization_error& e)\n        { \n            item.clear();\n            throw serialization_error(e.info + \"\\n   while deserializing object of type circular_buffer\"); \n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    const matrix_op<op_array_to_mat<circular_buffer<T> > > mat (\n        const circular_buffer<T>& m \n    )\n    {\n        typedef op_array_to_mat<circular_buffer<T> > op;\n        return matrix_op<op>(op(m));\n    }\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_CIRCULAR_BuFFER_Hh_\n\n"
  },
  {
    "path": "benchmarks/dlib/sliding_buffer/circular_buffer_abstract.h",
    "content": "// Copyright (C) 2012  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_CIRCULAR_BuFFER_ABSTRACT_Hh_\n#ifdef DLIB_CIRCULAR_BuFFER_ABSTRACT_Hh_\n\n#include \"../algs.h\"\n#include \"../serialize.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    class circular_buffer\n    {\n        /*!\n            REQUIREMENTS ON T\n                T must have a default constructor and be copyable.\n\n            POINTERS AND REFERENCES TO INTERNAL DATA\n                swap(), size(), front(), back(), and operator[] functions do \n                not invalidate pointers or references to internal data.\n                All other functions have no such guarantee.\n\n            INITIAL VALUE\n                - size() == 0\n\n            WHAT THIS OBJECT REPRESENTS\n                This object is a circular buffer of objects of type T.  This means \n                that when objects are pushed onto one of its ends it does not grow \n                in size.  Instead, it shifts all elements over one to make room for \n                the new element and the element at the opposing end falls off the \n                buffer and is lost.\n        !*/\n\n    public:\n        typedef default_memory_manager mem_manager_type;\n        typedef T value_type;\n        typedef T type;\n\n        circular_buffer(\n        );\n        /*!\n            ensures\n                - #size() == 0\n                - this object is properly initialized\n        !*/\n\n        explicit circular_buffer(\n            unsigned long s\n        );\n        /*!\n            ensures\n                - #size() == s\n                - this object is properly initialized\n        !*/\n\n        void clear (\n        );\n        /*!\n            ensures\n                - this object has its initial value\n                - #size() == 0\n        !*/\n\n        T& operator[] ( \n            unsigned long i\n        ) const;\n        /*!\n            requires\n                - i < size()\n            ensures\n                - returns a non-const reference to the i-th element of this circular buffer\n        !*/\n\n        const T& operator[] ( \n            unsigned long i\n        ) const;\n        /*!\n            requires\n                - i < size()\n            ensures\n                - returns a const reference to the i-th element of this circular buffer\n        !*/\n\n        void resize(\n            unsigned long new_size\n        ); \n        /*!\n            ensures\n                - #size() == new_size\n        !*/\n\n        void assign(\n            unsigned long new_size, \n            const T& value\n        ); \n        /*!\n            ensures\n                - #size() == new_size \n                - for all valid i:\n                    - (*this)[i] == value\n        !*/\n\n        unsigned long size(\n        ) const; \n        /*!\n            ensures\n                - returns the number of elements in this circular buffer\n        !*/\n\n        T& front(\n        );\n        /*!\n            requires\n                - size() > 0\n            ensures\n                - returns a reference to (*this)[0]\n        !*/\n\n        const T& front(\n        ) const;\n        /*!\n            requires\n                - size() > 0\n            ensures\n                - returns a const reference to (*this)[0]\n        !*/\n\n        T& back(\n        );\n        /*!\n            requires\n                - size() > 0\n            ensures\n                - returns a reference to (*this)[size()-1]\n        !*/\n\n        const T& back(\n        ) const;\n        /*!\n            requires\n                - size() > 0\n            ensures\n                - returns a const reference to (*this)[size()-1]\n        !*/\n\n        void push_front(\n            const T& value\n        );\n        /*!\n            ensures\n                - #size() == size()\n                  (i.e. the size of this object does not change)\n                - if (size() != 0) then\n                    - #front() == value\n                    - all items are shifted over such that, \n                        - #(*this)[1] == (*this)[0]\n                        - #(*this)[2] == (*this)[1]\n                        - #(*this)[3] == (*this)[2]\n                        - etc.\n                        - back() is shifted out of the circular buffer\n                - else\n                    - This function has no effect on this object \n        !*/\n\n        void push_back(\n            const T& value\n        );\n        /*!\n            ensures\n                - #size() == size()\n                  (i.e. the size of this object does not change)\n                - if (size() != 0) then\n                    - #back() == value\n                    - all items are shifted over such that, \n                        - front() is shifted out of the circular buffer \n                        - #(*this)[0] == (*this)[1]\n                        - #(*this)[1] == (*this)[2]\n                        - #(*this)[2] == (*this)[3]\n                        - etc.\n                - else\n                    - This function has no effect on this object \n        !*/\n\n        void swap (\n            circular_buffer& item\n        );\n        /*!\n            ensures\n                - swaps *this with item\n        !*/\n\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    void swap (\n        circular_buffer<T>& a, \n        circular_buffer<T>& b \n    ) { a.swap(b); }   \n    /*!\n        provides a global swap function\n    !*/\n\n    template <\n        typename T\n        >\n    void serialize (\n        const circular_buffer<T>& item, \n        std::ostream& out \n    );   \n    /*!\n        provides serialization support \n    !*/\n\n    template <\n        typename T\n        >\n    void deserialize (\n        circular_buffer<T>& item, \n        std::istream& in\n    );   \n    /*!\n        provides deserialization support \n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    const matrix_exp mat (\n        const circular_buffer<T>& m \n    );\n    /*!\n        ensures\n            - returns a matrix R such that:\n                - is_col_vector(R) == true \n                - R.size() == m.size()\n                - for all valid r:\n                  R(r) == m[r]\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_CIRCULAR_BuFFER_ABSTRACT_Hh_\n\n\n"
  },
  {
    "path": "benchmarks/dlib/sliding_buffer/sliding_buffer_kernel_1.h",
    "content": "// Copyright (C) 2004  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_SLIDING_BUFFER_KERNEl_1_\n#define DLIB_SLIDING_BUFFER_KERNEl_1_\n\n#include \"sliding_buffer_kernel_abstract.h\"\n#include \"../algs.h\"\n#include \"../interfaces/enumerable.h\"\n#include \"../serialize.h\"\n\nnamespace dlib\n{\n\n    template <\n        typename T\n        >\n    class sliding_buffer_kernel_1 : public enumerable<T>\n    {\n        /*!\n            INITIAL VALUE\n                - buffer_size == 0\n                - buffer == 0\n                - buffer_start == 0\n                - current == 0\n                - at_start_ == true\n\n            CONVENTION\n                - buffer_size == size()\n                \n                - element() == (*this)[current]\n                - current_element_valid() == (current < buffer_size) && at_start_ == false\n                - at_start() == at_start_\n\n                - if (buffer_size != 0) then                    \n                    - buffer[(buffer_start+i)&(mask)] == operator[](i)   \n                    - mask == buffer_size-1\n                - else\n                    - buffer == 0\n                    - buffer_size == 0\n        !*/\n\n    public:\n\n        typedef T type;\n\n        sliding_buffer_kernel_1 (\n        ) :\n            buffer_start(0),\n            buffer_size(0),\n            buffer(0),\n            current(0),\n            at_start_(true)\n        {}\n\n        virtual ~sliding_buffer_kernel_1 (\n        ) { if (buffer) delete [] buffer; }\n\n        void clear(\n        ) \n        {\n            buffer_size = 0; \n            if (buffer) delete [] buffer;\n            buffer = 0;\n            at_start_ = true;\n            current = 0;\n        }\n\n        void set_size (\n            unsigned long exp_size\n        )\n        {\n            at_start_ = true;\n            if (buffer) delete [] buffer;\n            buffer_size = 1;\n            while (exp_size != 0)\n            {\n                --exp_size;\n                buffer_size <<= 1;            \n            }\n            mask = buffer_size-1;\n            try { buffer = new T[buffer_size]; }\n            catch (...) { buffer = 0; buffer_size = 0; throw; }\n        }\n\n        size_t size (\n        ) const { return buffer_size; }\n\n        void rotate_left (\n            unsigned long amount\n        ) { buffer_start = ((buffer_start-amount)&mask); at_start_ = true; }\n\n        void rotate_right (\n            unsigned long amount\n        ) { buffer_start = ((buffer_start+amount)&mask); at_start_ = true;}\n\n        const T& operator[] (\n            unsigned long index\n        ) const { return buffer[(buffer_start+index)&mask]; }\n\n        T& operator[] (\n            unsigned long index\n        ) { return buffer[(buffer_start+index)&mask]; }\n\n        unsigned long get_element_id(\n            unsigned long index\n        ) const { return ((buffer_start+index)&mask); }\n\n        unsigned long get_element_index (\n            unsigned long element_id \n        ) const { return ((element_id-buffer_start)&mask);}\n\n        void swap (\n            sliding_buffer_kernel_1<T>& item\n        )\n        {\n            exchange(buffer_start,item.buffer_start);\n            exchange(buffer_size,item.buffer_size);\n            exchange(buffer,item.buffer);\n            exchange(mask,item.mask);\n            exchange(current,item.current);\n            exchange(at_start_,item.at_start_);\n        }\n\n\n        bool at_start (\n        ) const { return at_start_; }\n\n        void reset (\n        ) const { at_start_ = true; }\n\n        bool current_element_valid (\n        ) const { return (current < buffer_size) && (at_start_ == false); }\n\n        const T& element (\n        ) const { return (*this)[current]; }\n\n        T& element (\n        ) { return (*this)[current]; }\n\n        bool move_next (\n        ) const \n        { \n            if (at_start_ == false)\n            {\n                if (current+1 < buffer_size)\n                {\n                    ++current;\n                    return true;\n                }\n                else\n                {\n                    current = buffer_size;\n                    return false;\n                }\n            }\n            else \n            {\n                at_start_ = false;\n                current = 0;\n                return (buffer_size != 0);\n            }\n        }\n\n\n    private:\n\n        // data members\n        unsigned long buffer_start;\n        unsigned long buffer_size;\n        T* buffer;\n        unsigned long mask;\n\n\n        mutable unsigned long current;\n        mutable bool at_start_;\n\n        // restricted functions\n        sliding_buffer_kernel_1(sliding_buffer_kernel_1<T>&);        // copy constructor\n        sliding_buffer_kernel_1<T>& operator=(sliding_buffer_kernel_1<T>&);    // assignment operator\n\n    };      \n\n    template <\n        typename T\n        >\n    inline void swap (\n        sliding_buffer_kernel_1<T>& a, \n        sliding_buffer_kernel_1<T>& b \n    ) { a.swap(b); }   \n\n    template <\n        typename T\n        >\n    void deserialize (\n        sliding_buffer_kernel_1<T>& item, \n        std::istream& in\n    )   \n    {\n        try\n        {\n            item.clear();\n            unsigned long size;\n            deserialize(size,in);\n            if (size > 0)\n            {\n                int count = 0;\n                while (size != 1)\n                {\n                    size /= 2;\n                    ++count;\n                }\n                item.set_size(count);\n\n                for (unsigned long i = 0; i < item.size(); ++i)\n                    deserialize(item[i],in);\n            }\n        }\n        catch (serialization_error& e)\n        { \n            item.clear();\n            throw serialization_error(e.info + \"\\n   while deserializing object of type sliding_buffer_kernel_1\"); \n        }\n    }\n}\n\n#endif // DLIB_SLIDING_BUFFER_KERNEl_1_\n\n"
  },
  {
    "path": "benchmarks/dlib/sliding_buffer/sliding_buffer_kernel_abstract.h",
    "content": "// Copyright (C) 2004  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_SLIDING_BUFFER_KERNEl_ABSTRACT_\n#ifdef DLIB_SLIDING_BUFFER_KERNEl_ABSTRACT_\n\n#include \"../algs.h\"\n#include \"../interfaces/enumerable.h\"\n#include \"../serialize.h\"\n\nnamespace dlib\n{\n\n    template <\n        typename T\n        >\n    class sliding_buffer : public enumerable<T>\n    {\n        /*!\n            REQUIREMENTS ON T\n                T must have a default constructor\n\n            INITIAL VALUE\n                size() == 0\n\n            ENUMERATION ORDER\n                The enumerator will iterate over the elements of the sliding_buffer in the\n                order (*this)[0], (*this)[1], (*this)[2], ...\n\n            WHAT THIS OBJECT REPRESENTS\n                This object represents an array of T objects.  The main\n                feature of this object is its ability to rotate its contents\n                left or right.   An example will make it clear.\n\n                suppose we have the following buffer (assuming T is a char):\n                \"some data!\"    <-- the data in the buffer\n                 9876543210     <-- the index numbers associated with each character\n\n                applying rotate_left(2) to this buffer would give us\n                \"me data!so\"\n                 9876543210\n\n                if instead of calling rotate_left we call rotate_right(3) instead we would have\n                \"ta!some da\"\n                 9876543210                              \n\n                Also note that unless specified otherwise, no member functions\n                of this object throw exceptions.\n        !*/\n\n    public:\n\n        typedef T type;\n\n        sliding_buffer (\n        );\n        /*!\n            ensures                \n                - #*this is properly initialized           \n            throws\n                - std::bad_alloc or any exception thrown by T's constructor.\n        !*/\n\n        virtual ~sliding_buffer (\n        );\n        /*!\n            ensures\n                - any resources associated with *this have been released\n        !*/\n\n        void clear(\n        );\n        /*!\n            ensures\n                - #*this has its initial value\n            throws\n                - std::bad_alloc or any exception thrown by T's constructor.\n                    if this exception is thrown then #*this is unusable \n                    until clear() is called and succeeds\n        !*/\n\n        void set_size (\n            unsigned long exp_size\n        );\n        /*!\n            requires\n                - 0 < exp_size < 32\n            ensures\n                - #size() == 2^exp_size\n                - the value of all elements in the buffer are undefined\n                - #at_start() == true\n            throws\n                - std::bad_alloc or any exception thrown by T's constructor.\n                    if this exception is thrown then #size() == 0\n        !*/\n\n        void rotate_left (\n            unsigned long amount\n        );\n        /*!\n            ensures\n                - for all i where 0 <= i < size():\n                  (#*this)[i] == (*this)[(i-amount)&(size()-1)]\n                  i.e. rotates the contents of *this left by amount spaces\n                - #at_start() == true\n        !*/\n\n        void rotate_right (\n            unsigned long amount\n        );\n        /*!\n            ensures\n                - for all i where 0 <= i < size():\n                  (#*this)[i] == (*this)[(i+amount)&(size()-1)]\n                  i.e. rotates the contents of *this right by amount spaces\n                - #at_start() == true\n        !*/\n\n        unsigned long get_element_id (\n            unsigned long index\n        ) const;\n        /*!\n            requires\n                - index < size()\n            ensures \n                - returns an element id number that uniquely references the element at \n                  the given index.  (you can use this id to locate the new position of \n                  an element after the buffer has been rotated)\n                - returned value is < size()\n        !*/\n\n        unsigned long get_element_index (\n            unsigned long element_id \n        ) const;\n        /*!\n            require\n                - element_id < size()\n            ensures\n                - returns the index of the element with the given element_id.\n                  ( (*this)[get_element_index(element_id)] will always refer to the same element\n                  no matter where it has been rotated to)\n                - returned value is < size()\n        !*/\n\n        const T& operator[] (\n            unsigned long index\n        ) const;\n        /*!\n            requires\n                - index < size()\n            ensures\n                - returns a const reference to the element in *this at position index\n        !*/\n\n        T& operator[] (\n            unsigned long index\n        );\n        /*!\n            requires\n                - index < size()\n            ensures\n                - returns a reference to the element in *this at position index\n        !*/\n\n        void swap (\n            sliding_buffer<T>& item\n        );\n        /*!\n            ensures\n                - swaps *this and item\n        !*/ \n\n    private:\n\n        // restricted functions\n        sliding_buffer(sliding_buffer<T>&);        // copy constructor\n        sliding_buffer<T>& operator=(sliding_buffer<T>&);    // assignment operator\n\n    };      \n\n    template <\n        typename T\n        >\n    void swap (\n        sliding_buffer<T>& a, \n        sliding_buffer<T>& b \n    ) { a.swap(b); }   \n    /*!\n        provides a global swap function\n    !*/\n\n    template <\n        typename T\n        >\n    void deserialize (\n        sliding_buffer<T>& item, \n        std::istream& in\n    );   \n    /*!\n        provides deserialization support \n    !*/\n\n}\n\n#endif // DLIB_SLIDING_BUFFER_KERNEl_ABSTRACT_\n\n"
  },
  {
    "path": "benchmarks/dlib/sliding_buffer/sliding_buffer_kernel_c.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_SLIDING_BUFFER_KERNEl_C_\n#define DLIB_SLIDING_BUFFER_KERNEl_C_\n\n#include \"sliding_buffer_kernel_abstract.h\"\n#include \"../algs.h\"\n#include \"../assert.h\"\n#include <iostream>\n\nnamespace dlib\n{\n\n    template <\n        typename sb_base\n        >\n    class sliding_buffer_kernel_c : public sb_base\n    {\n        typedef typename sb_base::type T;\n        \n        public:\n            void set_size (\n                unsigned long exp_size\n            );\n\n            const T& operator[] (\n                unsigned long index\n            ) const;\n\n            T& operator[] (\n                unsigned long index\n            );\n\n            unsigned long get_element_id (\n                unsigned long index\n            ) const;\n\n            unsigned long get_element_index (\n                unsigned long element_id \n            ) const;\n\n            const T& element (\n            ) const;\n\n            T& element (\n            );\n\n\n    };\n\n    template <\n        typename sb_base\n        >\n    inline void swap (\n        sliding_buffer_kernel_c<sb_base>& a, \n        sliding_buffer_kernel_c<sb_base>& b \n    ) { a.swap(b); }  \n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // member function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename sb_base\n        >\n    void sliding_buffer_kernel_c<sb_base>::\n    set_size (\n        unsigned long exp_size\n    ) \n    {\n        // make sure requires clause is not broken\n        DLIB_CASSERT( 0 < exp_size && exp_size < 32,\n            \"\\tvoid sliding_buffer::set_size(unsigned long)\"\n            << \"\\n\\texp_size must be some number between 1 and 31\"\n            << \"\\n\\tthis:     \" << this\n            << \"\\n\\texp_size: \" << exp_size\n            );\n\n        // call the real function\n        sb_base::set_size(exp_size);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename sb_base\n        >\n    unsigned long sliding_buffer_kernel_c<sb_base>::\n    get_element_id (\n        unsigned long index\n    ) const\n    {\n        // make sure requires clause is not broken\n        DLIB_CASSERT( index < this->size(),\n            \"\\tunsigned long sliding_buffer::get_element_id(unsigned long) const\"\n            << \"\\n\\tindex must be in the range 0 to size()-1\"\n            << \"\\n\\tthis:   \" << this\n            << \"\\n\\tsize(): \" << this->size()\n            << \"\\n\\tindex:  \" << index\n            );\n\n        // call the real function\n        return sb_base::get_element_id(index);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename sb_base\n        >\n    unsigned long sliding_buffer_kernel_c<sb_base>::\n    get_element_index (\n        unsigned long element_id\n    ) const\n    {\n        // make sure requires clause is not broken\n        DLIB_CASSERT( element_id < this->size(),\n            \"\\tunsigned long sliding_buffer::get_element_index(unsigned long) const\"\n            << \"\\n\\tid must be in the range 0 to size()-1\"\n            << \"\\n\\tthis:   \" << this\n            << \"\\n\\tsize(): \" << this->size()\n            << \"\\n\\tid:     \" << element_id\n            );\n\n        // call the real function\n        return sb_base::get_element_index(element_id);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename sb_base\n        >\n    const typename sb_base::type& sliding_buffer_kernel_c<sb_base>::\n    operator[] (\n        unsigned long index\n    ) const\n    {\n        // make sure requires clause is not broken\n        DLIB_CASSERT( index < this->size(),\n            \"\\tconst T& sliding_buffer::operator[](unsigned long) const\"\n            << \"\\n\\tindex must be in the range 0 to size()-1\"\n            << \"\\n\\tthis:   \" << this\n            << \"\\n\\tsize(): \" << this->size()\n            << \"\\n\\tindex:  \" << index\n            );\n\n        // call the real function\n        return sb_base::operator[](index);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename sb_base\n        >\n    typename sb_base::type& sliding_buffer_kernel_c<sb_base>::\n    operator[] (\n        unsigned long index\n    ) \n    {\n        // make sure requires clause is not broken\n        DLIB_CASSERT( index < this->size(),\n            \"\\tT& sliding_buffer::operator[](unsigned long)\"\n            << \"\\n\\tindex must be in the range 0 to size()-1\"\n            << \"\\n\\tthis:   \" << this\n            << \"\\n\\tsize(): \" << this->size()\n            << \"\\n\\tindex:  \" << index\n            );\n\n        // call the real function\n        return sb_base::operator[](index);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename sb_base\n        >\n    const typename sb_base::type& sliding_buffer_kernel_c<sb_base>::\n    element (\n    ) const\n    {\n        // make sure requires clause is not broken\n        DLIB_CASSERT(this->current_element_valid() == true,\n            \"\\tconst T& sliding_buffer::element\"\n            << \"\\n\\tyou can't access the current element if it doesn't exist\"\n            << \"\\n\\tthis: \" << this\n            );\n\n        // call the real function\n        return sb_base::element();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename sb_base\n        >\n    typename sb_base::type& sliding_buffer_kernel_c<sb_base>::\n    element (\n    ) \n    {\n        // make sure requires clause is not broken\n        DLIB_CASSERT(this->current_element_valid() == true,\n            \"\\tT& sliding_buffer::element\"\n            << \"\\n\\tyou can't access the current element if it doesn't exist\"\n            << \"\\n\\tthis: \" << this\n            );\n\n        // call the real function\n        return sb_base::element();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_SLIDING_BUFFER_KERNEl_C_\n\n"
  },
  {
    "path": "benchmarks/dlib/sliding_buffer.h",
    "content": "// Copyright (C) 2004  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_SLIDING_BUFFEr_\n#define DLIB_SLIDING_BUFFEr_\n\n\n#include \"sliding_buffer/sliding_buffer_kernel_1.h\"\n#include \"sliding_buffer/sliding_buffer_kernel_c.h\"\n#include \"sliding_buffer/circular_buffer.h\"\n\n\n\nnamespace dlib\n{\n\n    template <\n        typename T\n        >\n    class sliding_buffer\n    {\n\n        sliding_buffer() {}\n    public:\n        \n        //----------- kernels ---------------\n\n        // kernel_1a        \n        typedef     sliding_buffer_kernel_1<T>    \n                    kernel_1a;\n        typedef     sliding_buffer_kernel_c<kernel_1a>\n                    kernel_1a_c;\n   \n\n    };\n}\n\n#endif // DLIB_SLIDING_BUFFEr_\n\n"
  },
  {
    "path": "benchmarks/dlib/sockets/posix.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_SOCKETS_KERNEl_1_\n#include \"sockets_kernel_2.h\"\n#endif\n\n"
  },
  {
    "path": "benchmarks/dlib/sockets/sockets_extensions.h",
    "content": "// Copyright (C) 2006  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_SOCKETS_EXTENSIONs_\n#define DLIB_SOCKETS_EXTENSIONs_\n\n#include <iosfwd>\n#include <memory>\n#include <string>\n\n#include \"../sockets.h\"\n#include \"../smart_pointers/scoped_ptr.h\"\n#include \"sockets_extensions_abstract.h\"\n\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    class invalid_network_address : public dlib::error \n    { \n    public: \n        invalid_network_address(const std::string& msg) : dlib::error(msg) {};\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    struct network_address\n    {\n        network_address() : port(0){}\n\n        network_address(\n            const std::string& full_address\n        );\n\n        network_address (\n            const char* full_address\n        )\n        {\n            *this = network_address(std::string(full_address));\n        }\n\n        network_address(\n            const std::string& host_address_,\n            const unsigned short port_\n        ) : host_address(host_address_), port(port_) {}\n            \n        std::string host_address;\n        unsigned short port;\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    inline bool operator < (\n        const network_address& a,\n        const network_address& b\n    ) \n    {\n        if (a.host_address < b.host_address)\n            return true;\n        else if (a.host_address > b.host_address)\n            return false;\n        else if (a.port < b.port)\n            return true;\n        else\n            return false;\n    }\n\n    inline bool operator== (\n        const network_address& a,\n        const network_address& b\n    ) { return a.host_address == b.host_address && a.port == b.port; }\n\n    inline bool operator != (\n        const network_address& a,\n        const network_address& b\n    ) { return !(a == b); }\n\n// ----------------------------------------------------------------------------------------\n\n    void serialize(\n        const network_address& item,\n        std::ostream& out\n    );\n\n    void deserialize(\n        network_address& item,\n        std::istream& in \n    );\n\n    std::ostream& operator<< (\n        std::ostream& out,\n        const network_address& item\n    );\n\n    std::istream& operator>> (\n        std::istream& in,\n        network_address& item\n    );\n\n// ----------------------------------------------------------------------------------------\n\n    connection* connect (\n        const std::string& host_or_ip,\n        unsigned short port\n    );\n\n// ----------------------------------------------------------------------------------------\n\n    connection* connect (\n        const network_address& addr\n    );\n\n// ----------------------------------------------------------------------------------------\n\n    connection* connect (\n        const std::string& host_or_ip,\n        unsigned short port,\n        unsigned long timeout\n    );\n\n// ----------------------------------------------------------------------------------------\n\n    bool is_ip_address (\n        std::string ip\n    );\n\n// ----------------------------------------------------------------------------------------\n\n    void close_gracefully (\n        connection* con,\n        unsigned long timeout = 500\n    );\n\n// ----------------------------------------------------------------------------------------\n\n    void close_gracefully (\n        std::unique_ptr<connection>& con,\n        unsigned long timeout = 500\n    );\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#ifdef NO_MAKEFILE\n#include \"sockets_extensions.cpp\"\n#endif\n\n#endif // DLIB_SOCKETS_EXTENSIONs_\n\n"
  },
  {
    "path": "benchmarks/dlib/sockets/sockets_extensions_abstract.h",
    "content": "// Copyright (C) 2006  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_SOCKETS_EXTENSIONs_ABSTRACT_\n#ifdef DLIB_SOCKETS_EXTENSIONs_ABSTRACT_\n\n#include <memory>\n#include <string>\n\n#include \"sockets_kernel_abstract.h\"\n#include \"../error.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    class invalid_network_address : public dlib::error \n    { \n        /*!\n            WHAT THIS OBJECT REPRESENTS\n                This is the exception thrown by network_address's constructor if the\n                input is invalid.\n        !*/\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    struct network_address\n    {\n        /*!\n            WHAT THIS OBJECT REPRESENTS\n                This object is simply a container for two things:\n                    - A host machine address which is either an IP address or DNS name\n                      for a machine.\n                    - A port number.\n            \n                Together, these things define a machine and port on that machine.\n        !*/\n\n        network_address(\n        );\n        /*!\n            ensures\n                - host_address == \"\"\n                - #port == 0\n        !*/\n\n        network_address(\n            const std::string& full_address\n        );\n        /*!\n            ensures\n                - interprets full_address as a network address of the form:\n                    host_address:port\n                  and assigns each part into #host_address and #port.  For example,\n                  network_address(\"localhost:80\") would result in a network_address\n                  object where host_address was \"localhost\" and port was 80.\n            throws\n                - invalid_network_address\n                    This exception is thrown if the full_address string can't be\n                    interpreted as a valid network address.\n        !*/\n\n        network_address (\n            const char* full_address\n        );\n        /*!\n            requires\n                - full_address == a valid pointer to a null terminated string\n            ensures\n                - Invoking this constructor is equivalent to performing \n                  network_address(std::string(full_address))\n        !*/\n\n        network_address(\n            const std::string& host_address_,\n            const unsigned short port_\n        );\n        /*!\n            ensures\n                - #host_address == host_address_\n                - #port == port_\n        !*/\n            \n\n        std::string host_address;\n        unsigned short port;\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    inline bool operator < (\n        const network_address& a,\n        const network_address& b\n    );\n    /*!\n        ensures\n            - provides a total ordering over network_address objects so you can use them in\n              the standard associative containers.  The ordering is defined such that if\n              you sorted network addresses they would sort first on the host_address string\n              and then, for network_address objects with equal host_address, they would\n              sort on the port number\n    !*/\n\n    inline bool operator== (\n        const network_address& a,\n        const network_address& b\n    );\n    /*!\n        ensures\n            - returns true if a and b contain exactly the same address and false otherwise.\n              That is, the following must be true for this function to return true:\n                - a.host_address == b.host_address\n                - a.port == b.port\n              Note that this means that two addresses which are logically equivalent but\n              written differently will not compare equal.  For example, suppose example.com\n              has the IP address 10.1.1.1.  Then network_address(\"10.1.1.1:80\") and\n              network_address(\"example.com:80\") really refer to the same network resource\n              but will nevertheless not compare equal since.\n    !*/\n\n    inline bool operator != (\n        const network_address& a,\n        const network_address& b\n    );\n    /*!\n        ensures\n            - returns !(a == b)\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    void serialize(\n        const network_address& item,\n        std::ostream& out\n    );\n    /*!\n        ensures\n            - provides serialization support\n    !*/\n\n    void deserialize(\n        network_address& item,\n        std::istream& in \n    );\n    /*!\n        ensures\n            - provides deserialization support\n    !*/\n\n    std::ostream& operator<< (\n        std::ostream& out,\n        const network_address& item\n    );\n    /*!\n        ensures\n            - writes the given network_address to the output stream.  The format is the\n              host_address, then a colon, then the port number.  So for example:\n                cout << network_address(\"localhost\", 80);\n              would print:\n                localhost:80\n            - returns #out \n    !*/\n\n    std::istream& operator>> (\n        std::istream& in,\n        network_address& item\n    );\n    /*!\n        ensures\n            - reads a network_address from the given input stream.  The expected format is\n              the same as the one used to print them by the above operator<<() routine. \n            - returns #in\n            - if (there is an error reading the network_address) then\n                - #in.good() == false\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    connection* connect (\n        const std::string& host_or_ip,\n        unsigned short port\n    );\n    /*!\n        ensures\n            - returns a connection object that is connected to the given host at the \n              given port\n        throws\n            - dlib::socket_error\n                This exception is thrown if there is some problem that prevents us from\n                creating the connection\n            - std::bad_alloc\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    connection* connect (\n        const network_address& addr\n    );\n    /*!\n        ensures\n            - returns connect(addr.host_address, addr_port);\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    connection* connect (\n        const std::string& host_or_ip,\n        unsigned short port,\n        unsigned long timeout\n    );\n    /*!\n        ensures\n            - returns a connection object that is connected to the given host at the \n              given port.  \n            - blocks for at most timeout milliseconds\n        throws\n            - dlib::socket_error\n                This exception is thrown if there is some problem that prevents us from\n                creating the connection or if timeout milliseconds elapses before the\n                connect is successful.\n            - std::bad_alloc\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n\n    bool is_ip_address (\n        std::string ip\n    );\n    /*!\n        ensures\n            - if (ip is a valid ip address) then\n                - returns true\n            - else\n                - returns false\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    void close_gracefully (\n        connection* con,\n        unsigned long timeout = 500\n    );\n    /*!\n        requires\n            - con == a valid pointer to a connection object or 0\n        ensures\n            - This function does nothing if con == 0, otherwise it performs the following:\n                - performs a graceful close of the given connection and if it takes longer\n                  than timeout milliseconds to complete then forces the connection closed. \n                    - Specifically, a graceful close means that the outgoing part of con is\n                      closed (a FIN is sent) and then we wait for the other end to to close\n                      their end of the connection.  This way any data still on its way to\n                      the other end of the connection will be received properly.\n                - This function will block until the graceful close is completed or we\n                  timeout.\n                - calls \"delete con;\".  Thus con is no longer a valid pointer after this\n                  function has finished.\n        throws\n            - std::bad_alloc or dlib::thread_error\n                If either of these exceptions are thrown con will still be closed via\n                \"delete con;\" \n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    void close_gracefully (\n        std::unique_ptr<connection>& con,\n        unsigned long timeout = 500\n    );\n    /*!\n        requires\n            - con == a valid pointer to a connection object or con.get() == 0\n        ensures\n            - This function does nothing if con.get() == 0, otherwise it performs the\n              following:\n                - performs a graceful close of the given connection and if it takes longer\n                  than timeout milliseconds to complete then forces the connection closed. \n                    - Specifically, a graceful close means that the outgoing part of con is\n                      closed (a FIN is sent) and then we wait for the other end to to close\n                      their end of the connection.  This way any data still on its way to\n                      the other end of the connection will be received properly.\n                - This function will block until the graceful close is completed or we\n                  timeout.\n                - #con.get() == 0.  Thus con is no longer a valid pointer after this\n                  function has finished.\n        throws\n            - std::bad_alloc or dlib::thread_error\n                If either of these exceptions are thrown con will still be closed and\n                deleted (i.e. #con.get() == 0).\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_SOCKETS_EXTENSIONs_ABSTRACT_\n\n\n"
  },
  {
    "path": "benchmarks/dlib/sockets/sockets_kernel_1.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net), Miguel Grinberg\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_SOCKETS_KERNEl_1_\n#define DLIB_SOCKETS_KERNEl_1_\n\n#ifdef DLIB_ISO_CPP_ONLY\n#error \"DLIB_ISO_CPP_ONLY is defined so you can't use this OS dependent code.  Turn DLIB_ISO_CPP_ONLY off if you want to use it.\"\n#endif\n\n#include \"sockets_kernel_abstract.h\"\n\n#include <memory>\n#include <string>\n\n#include \"../algs.h\"\n#include \"../threads.h\"\n#include \"../uintn.h\"\n\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    // forward declarations\n    class socket_factory;\n    class listener;\n    class SOCKET_container;\n\n// ----------------------------------------------------------------------------------------\n\n    // lookup functions\n\n    int\n    get_local_hostname (\n        std::string& hostname\n    );\n\n// -----------------\n\n    int \n    hostname_to_ip (\n        const std::string& hostname,\n        std::string& ip,\n        int n = 0\n    );\n\n// -----------------\n\n    int\n    ip_to_hostname (\n        const std::string& ip,\n        std::string& hostname\n    );\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // connection object\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    class connection\n    {\n        /*!\n            INITIAL_VALUE\n                - sd                      == false\n                - sdo                     == false\n                - sdr                     == 0\n\n            CONVENTION\n                - connection_socket       == the socket handle for this connection.  \n                - connection_foreign_port == the port that foreign host is using for \n                  this connection.\n                - connection_foreign_ip   == a string containing the IP address of the \n                  foreign host.\n                - connection_local_port   == the port that the local host is using for \n                  this connection.\n                - connection_local_ip     == a string containing the IP address of the \n                  local interface being used by this connection.\n\n                - sd == if shutdown() has been called then true else false.\n                - sdo == if shutdown_outgoing() has been called then true else false.\n                - sdr == the return value of shutdown() if it has been called.  if it \n                  hasn't been called then 0.\n                        \n        !*/\n\n        friend class listener;                // make listener a friend of connection\n        // make create_connection a friend of connection\n        friend int create_connection ( \n            connection*& new_connection,\n            unsigned short foreign_port, \n            const std::string& foreign_ip, \n            unsigned short local_port,\n            const std::string& local_ip \n        );\n\n    public:\n\n        ~connection (\n        );\n\n        void* user_data;\n\n        long write (\n            const char* buf, \n            long num\n        );\n\n        long read (\n            char* buf, \n            long num\n        );\n\n        long read (\n            char* buf, \n            long num,\n            unsigned long timeout\n        );\n\n        unsigned short get_local_port (\n        ) const {  return connection_local_port; }\n\n        unsigned short get_foreign_port ( \n        ) const { return connection_foreign_port; }\n\n        const std::string& get_local_ip (\n        ) const { return connection_local_ip; }\n\n        const std::string& get_foreign_ip (\n        ) const { return connection_foreign_ip; }\n\n        int shutdown_outgoing (\n        );\n\n        int shutdown (\n        );\n\n        // I would use SOCKET here but I don't want to include the windows\n        // header files since they bring in a bunch of unpleasantness.  So\n        // I'm doing this instead which should ultimately be the same type\n        // as the SOCKET win the windows API.\n        typedef unsigned_type<void*>::type socket_descriptor_type;\n\n        int disable_nagle(\n        );\n\n        socket_descriptor_type get_socket_descriptor (\n        ) const;\n\n    private:\n\n        bool readable (\n            unsigned long timeout \n        ) const;\n        /*! \n            requires \n                - timeout < 2000000  \n            ensures \n                - returns true if a read call on this connection will not block. \n                - returns false if a read call on this connection will block or if \n                  there was an error. \n        !*/ \n\n        bool sd_called (\n        )const\n        /*!\n            ensures\n                - returns true if shutdown() has been called else\n                  returns false\n        !*/\n        {\n            sd_mutex.lock();\n            bool temp = sd;\n            sd_mutex.unlock();\n            return temp;\n        }\n\n        bool sdo_called (\n        )const\n        /*!\n            ensures\n                - returns true if shutdown_outgoing() or shutdown() has been called \n                  else returns false\n        !*/\n        {\n            sd_mutex.lock();\n            bool temp = false;\n            if (sdo || sd)\n                temp = true;\n            sd_mutex.unlock();\n            return temp;\n        }\n\n\n        // data members\n        SOCKET_container& connection_socket;\n        const unsigned short connection_foreign_port;\n        const std::string connection_foreign_ip; \n        const unsigned short connection_local_port;\n        const std::string connection_local_ip;\n\n        bool sd;  // called shutdown\n        bool sdo; // called shutdown_outgoing\n        int sdr; // return value for shutdown \n        mutex sd_mutex; // a lock for the three above vars\n\n\n        connection(\n            SOCKET_container sock,\n            unsigned short foreign_port, \n            const std::string& foreign_ip, \n            unsigned short local_port,\n            const std::string& local_ip\n        ); \n        /*!\n            requires\n                sock is a socket handle and \n                sock is the handle for the connection between foreign_ip:foreign_port \n                and local_ip:local_port\n            ensures\n                *this is initialized correctly with the above parameters\n        !*/\n\n\n        // restricted functions\n        connection(connection&);        // copy constructor\n        connection& operator=(connection&);    // assignment operator\n    }; \n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // listener object\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    class listener\n    {\n        /*!\n            CONVENTION\n                if (inaddr_any == false)\n                {\n                    listening_ip == a string containing the address the listener is \n                                    listening on\n                }\n                else\n                {\n                    the listener is listening on all interfaces\n                }\n                \n                listening_port == the port the listener is listening on\n                listening_socket == the listening socket handle for this object\n        !*/\n\n        // make the create_listener a friend of listener\n        friend int create_listener (\n            listener*& new_listener,\n            unsigned short port,\n            const std::string& ip \n        );\n\n    public:\n\n        ~listener (\n        );\n\n        int accept (\n            connection*& new_connection,\n            unsigned long timeout = 0\n        );\n\n        int accept (\n            std::unique_ptr<connection>& new_connection,\n            unsigned long timeout = 0\n        );\n\n        unsigned short get_listening_port (\n        ) { return listening_port; }\n\n        const std::string& get_listening_ip (\n        ) { return listening_ip; }\n\n    private:\n\n        // data members\n        SOCKET_container& listening_socket;\n        const unsigned short listening_port;\n        const std::string listening_ip;\n        const bool inaddr_any;\n\n        listener(\n            SOCKET_container sock,\n            unsigned short port,\n            const std::string& ip\n        );\n        /*!\n            requires\n                sock is a socket handle                                             and \n                sock is listening on the port and ip(may be \"\") indicated in the \n                above parameters\n            ensures\n                *this is initialized correctly with the above parameters\n        !*/\n\n\n        // restricted functions\n        listener(listener&);        // copy constructor\n        listener& operator=(listener&);    // assignment operator\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    int create_listener (\n        listener*& new_listener,\n        unsigned short port,\n        const std::string& ip = \"\"\n    );\n\n    int create_connection ( \n        connection*& new_connection,\n        unsigned short foreign_port, \n        const std::string& foreign_ip, \n        unsigned short local_port = 0,\n        const std::string& local_ip = \"\"\n    );\n\n    int create_listener (\n        std::unique_ptr<listener>& new_listener,\n        unsigned short port,\n        const std::string& ip = \"\"\n    );\n\n    int create_connection ( \n        std::unique_ptr<connection>& new_connection,\n        unsigned short foreign_port, \n        const std::string& foreign_ip, \n        unsigned short local_port = 0,\n        const std::string& local_ip = \"\"\n    );\n\n// ----------------------------------------------------------------------------------------\n\n\n}\n\n#ifdef NO_MAKEFILE\n#include \"sockets_kernel_1.cpp\"\n#endif\n\n#endif // DLIB_SOCKETS_KERNEl_1_\n\n"
  },
  {
    "path": "benchmarks/dlib/sockets/sockets_kernel_2.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net), Miguel Grinberg\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_SOCKETS_KERNEl_2_\n#define DLIB_SOCKETS_KERNEl_2_\n\n#ifdef DLIB_ISO_CPP_ONLY\n#error \"DLIB_ISO_CPP_ONLY is defined so you can't use this OS dependent code.  Turn DLIB_ISO_CPP_ONLY off if you want to use it.\"\n#endif\n\n#include \"../platform.h\"\n\n#include \"sockets_kernel_abstract.h\"\n\n#define _BSD_SOCKLEN_T_\n\n#include <ctime>\n#include <memory>\n#include <string>\n\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <errno.h>\n\n#ifndef HPUX\n#include <sys/select.h>\n#endif\n#include <arpa/inet.h>\n#include <signal.h>\n#include <inttypes.h>\n#include <netdb.h>\n#include <unistd.h>\n#include <sys/param.h>\n\n#include <netinet/in.h>\n\n#include \"../threads.h\"\n#include \"../algs.h\"\n\n\n\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    // forward declarations\n    class socket_factory;\n    class listener;\n\n// ----------------------------------------------------------------------------------------\n\n    // lookup functions\n\n    int\n    get_local_hostname (\n        std::string& hostname\n    );\n\n// -----------------\n\n    int \n    hostname_to_ip (\n        const std::string& hostname,\n        std::string& ip,\n        int n = 0\n    );\n\n// -----------------\n\n    int\n    ip_to_hostname (\n        const std::string& ip,\n        std::string& hostname\n    );\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // connection object\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    class connection\n    {\n        /*!\n            INITIAL_VALUE\n                sd                      == false\n                sdo                     == false\n                sdr                     == 0\n\n\n            CONVENTION\n                connection_socket       == the socket handle for this connection.  \n                connection_foreign_port == the port that foreign host is using for \n                                           this connection\n                connection_foreign_ip   == a string containing the IP address of the \n                                           foreign host\n                connection_local_port   == the port that the local host is using for \n                                           this connection\n                connection_local_ip     == a string containing the IP address of the \n                                           local interface being used by this connection\n\n                sd                      == if shutdown() has been called then true\n                                           else false\n                sdo                     == if shutdown_outgoing() has been called then true\n                                           else false\n                sdr                     == the return value of shutdown() if it has been\n                                           called.  if it hasn't been called then 0\n\n\n        !*/\n\n        friend class listener;                // make listener a friend of connection\n        // make create_connection a friend of connection\n        friend int create_connection ( \n            connection*& new_connection,\n            unsigned short foreign_port, \n            const std::string& foreign_ip, \n            unsigned short local_port,\n            const std::string& local_ip\n        );\n\n    public:\n\n        ~connection();\n\n        void* user_data;\n\n        long write (\n            const char* buf, \n            long num\n        );\n\n        long read (\n            char* buf, \n            long num\n        );\n\n        long read (\n            char* buf, \n            long num,\n            unsigned long timeout\n        );\n\n        int get_local_port (\n        ) const { return connection_local_port; }\n\n        int get_foreign_port ( \n        ) const { return connection_foreign_port; }\n\n        const std::string& get_local_ip (\n        ) const { return connection_local_ip; }\n\n        const std::string& get_foreign_ip (\n        ) const { return connection_foreign_ip; }\n\n        int shutdown_outgoing (\n        ) \n        {\n            sd_mutex.lock();\n            if (sdo || sd)\n            {\n                sd_mutex.unlock();\n                return sdr;\n            }\n            sdo = true;\n            sdr = ::shutdown(connection_socket,SHUT_WR); \n            int temp = sdr;\n            sd_mutex.unlock();\n            return temp;  \n        }\n\n        int shutdown (\n        ) \n        {\n            sd_mutex.lock();\n            if (sd)\n            {\n                sd_mutex.unlock();\n                return sdr;\n            }\n            sd = true;\n            sdr = ::shutdown(connection_socket,SHUT_RDWR); \n            int temp = sdr;\n            sd_mutex.unlock();            \n            return temp;\n        }\n\n        int disable_nagle(\n        );\n\n        typedef int socket_descriptor_type;\n\n        socket_descriptor_type get_socket_descriptor (\n        ) const { return connection_socket; }\n\n    private:\n\n        bool readable (\n            unsigned long timeout \n        ) const;\n        /*! \n            requires \n                - timeout < 2000000  \n            ensures \n                - returns true if a read call on this connection will not block. \n                - returns false if a read call on this connection will block or if \n                  there was an error. \n        !*/ \n\n        bool sd_called (\n        )const\n        /*!\n            ensures\n                - returns true if shutdown() has been called else\n                - returns false\n        !*/\n        {\n            sd_mutex.lock();\n            bool temp = sd;\n            sd_mutex.unlock();\n            return temp;\n        }\n\n        bool sdo_called (\n        )const\n        /*!\n            ensures\n                - returns true if shutdown_outgoing() or shutdown() has been called\n                  else returns false\n        !*/\n        {\n            sd_mutex.lock();\n            bool temp = false;\n            if (sdo || sd)\n                temp = true;\n            sd_mutex.unlock();\n            return temp;\n        }\n\n\n        // data members\n        int connection_socket;\n        const int connection_foreign_port;\n        const std::string connection_foreign_ip; \n        const int connection_local_port;\n        const std::string connection_local_ip;\n\n        bool sd;  // called shutdown\n        bool sdo; // called shutdown_outgoing\n        int sdr; // return value for shutdown \n        mutex sd_mutex; // a lock for the three above vars\n\n        connection(\n            int sock,\n            int foreign_port, \n            const std::string& foreign_ip, \n            int local_port,\n            const std::string& local_ip\n        ); \n        /*!\n            requires\n                - sock is a socket handle \n                - sock is the handle for the connection between foreign_ip:foreign_port \n                  and local_ip:local_port\n            ensures\n                - *this is initialized correctly with the above parameters\n        !*/\n\n\n        // restricted functions\n        connection();\n        connection(connection&);        // copy constructor\n        connection& operator=(connection&);    // assignement opertor\n    }; \n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // listener object\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    class listener\n    {\n        /*!\n            CONVENTION\n                if (inaddr_any == false)\n                {\n                    listening_ip == a string containing the address the listener is \n                                    listening on\n                }\n                else\n                {\n                    the listener is listening on all interfaces\n                }\n                \n                listening_port == the port the listener is listening on\n                listening_socket == the listening socket handle for this object\n        !*/\n\n        // make the create_listener a friend of listener\n        friend int create_listener (\n            listener*& new_listener,\n            unsigned short port,\n            const std::string& ip\n        );\n\n    public:\n\n        ~listener();\n\n        int accept (\n            connection*& new_connection,\n            unsigned long timeout = 0\n        );\n\n        int accept (\n            std::unique_ptr<connection>& new_connection,\n            unsigned long timeout = 0\n        );\n\n        int get_listening_port (\n        ) const { return listening_port; }\n\n        const std::string& get_listening_ip (\n        ) const { return listening_ip; }\n\n    private:\n\n        // data members\n        int listening_socket;\n        const int listening_port;\n        const std::string listening_ip;\n        const bool inaddr_any;\n\n        listener(\n            int sock,\n            int port,\n            const std::string& ip\n        );\n        /*!\n            requires\n                - sock is a socket handle \n                - sock is listening on the port and ip(may be \"\") indicated in the above \n                  parameters\n            ensures\n                - *this is initialized correctly with the above parameters\n        !*/\n\n\n        // restricted functions\n        listener();\n        listener(listener&);        // copy constructor\n        listener& operator=(listener&);    // assignement opertor\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    int create_listener (\n        listener*& new_listener,\n        unsigned short port,\n        const std::string& ip = \"\"\n    );\n\n    int create_connection ( \n        connection*& new_connection,\n        unsigned short foreign_port, \n        const std::string& foreign_ip, \n        unsigned short local_port = 0,\n        const std::string& local_ip = \"\"\n    );\n\n    int create_listener (\n        std::unique_ptr<listener>& new_listener,\n        unsigned short port,\n        const std::string& ip = \"\"\n    );\n\n    int create_connection ( \n        std::unique_ptr<connection>& new_connection,\n        unsigned short foreign_port, \n        const std::string& foreign_ip, \n        unsigned short local_port = 0,\n        const std::string& local_ip = \"\"\n    );\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#ifdef NO_MAKEFILE\n#include \"sockets_kernel_2.cpp\"\n#endif\n\n#endif // DLIB_SOCKETS_KERNEl_2_\n\n"
  },
  {
    "path": "benchmarks/dlib/sockets/sockets_kernel_abstract.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_SOCKETS_KERNEl_ABSTRACT_\n#ifdef DLIB_SOCKETS_KERNEl_ABSTRACT_\n\n#include <string>\n#include \"../threads.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    /*!\n        GENERAL COMMENTS:\n            Nothing in here will throw exceptions.   \n            \n            All ip address strings in this file refer to IPv4 addresses.  For \n            example \"192.168.1.1\"\n\n            Timeouts:\n                All timeout values are measured in milliseconds but you are not \n                guaranteed to have that level of resolution.  The actual resolution\n                is implementation defined.\n\n            GENERAL WARNING\n                Don't call any of these functions or make any of these objects \n                before main() has been entered.  \n\n        EXCEPTIONS\n            Unless specified otherwise, nothing in this file throws exceptions.\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    // LOOKUP FUNCTIONS\n\n    // all lookup functions are thread-safe\n\n    int get_local_hostname (\n        std::string& hostname\n    );\n    /*!\n        ensures\n            - if (#get_local_hostname() == 0) then\n                - #hostname == a string containing the hostname of the local computer \n\n            - returns 0 upon success\n            - returns OTHER_ERROR upon failure and in this case #hostname's value \n              is undefined\n    !*/ \n\n// -----------------\n\n    int hostname_to_ip (\n        const std::string& hostname,\n        std::string& ip,\n        int n = 0\n    );\n    /*!\n        requires\n            - n >= 0\n        ensures\n            - if (#hostname_to_ip() == 0) then\n                - #ip == string containing the nth ip address associated with the hostname\n\n            - returns 0 upon success \n            - returns OTHER_ERROR upon failure  \n    !*/\n\n// -----------------\n\n    int ip_to_hostname (\n        const std::string& ip,\n        std::string& hostname\n    );\n    /*!\n        ensures\n            - if (#ip_to_hostname() == 0) then\n                - #hostname == string containing the hostname associated with ip\n\n            - returns 0 upon success \n            - returns OTHER_ERROR upon failure \n    !*/\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    //\n    // socket creation functions\n    // \n    // The following functions are guaranteed to be thread-safe\n    //\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------    \n\n    int create_listener (\n        listener*& new_listener,\n        unsigned short port,\n        const std::string& ip = \"\"\n    );\n    /*!\n        requires\n            - 0 <= port <= 65535\n        ensures\n            - if (#create_listener() == 0) then\n                - #new_listener == a pointer to a listener object that is listening on \n                  the specified port and ip for an incoming connection \n                - if (ip == \"\") then \n                    - the new listener will be listening on all interfaces \n                - if (port == 0) then \n                    - the operating system will assign a free port to listen on \n\n\n            - returns 0 if create_listener was successful \n            - returns PORTINUSE if the specified local port was already in use \n            - returns OTHER_ERROR if some other error occurred\n    !*/\n\n    int create_listener (\n        std::unique_ptr<listener>& new_listener,\n        unsigned short port,\n        const std::string& ip = \"\"\n    );\n    /*!\n        This function is just an overload of the above function but it gives you a\n        std::unique_ptr smart pointer instead of a C pointer.\n    !*/\n\n    int create_connection ( \n        connection*& new_connection,\n        unsigned short foreign_port, \n        const std::string& foreign_ip, \n        unsigned short local_port = 0,\n        const std::string& local_ip = \"\"\n    );\n    /*!\n        requires\n            - 0 <  foreign_port <= 65535 \n            - 0 <= local_port   <= 65535\n        ensures\n            - if (#create_connection() == 0) then\n                - #new_connection  == a pointer to a connection object that is connected \n                  to foreign_ip on port foreign_port and is using the local interface \n                  local_ip and local port local_port\n                - #new_connection->user_data == 0\n                - if (local_ip == \"\") then \n                    - the operating system will chose this for you\n                - if (local_port == 0) then \n                    - the operating system will chose this for you\n\n            - returns 0 if create_connection was successful \n            - returns PORTINUSE if the specified local port was already in use \n            - returns OTHER_ERROR if some other error occurred\n        !*/\n\n    int create_connection ( \n        std::unique_ptr<connection>& new_connection,\n        unsigned short foreign_port, \n        const std::string& foreign_ip, \n        unsigned short local_port = 0,\n        const std::string& local_ip = \"\"\n    );\n    /*!\n        This function is just an overload of the above function but it gives you a\n        std::unique_ptr smart pointer instead of a C pointer.\n    !*/\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // connection object\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    class connection\n    {\n        /*!\n            WHAT THIS OBJECT REPRESENTS\n                This object represents a TCP connection.\n\n                Instances of this class can only be created by using the \n                create_connection function or listener class defined below.\n\n                NOTE:  \n                    A connection object must ALWAYS be closed (delete the pointer to the \n                    connection) or it will cause a resource leak.  \n\n                    Note also that all errors indicated by a return code of OTHER_ERROR\n                    are fatal so if one occurs the connection should just be closed.\n\n            CLOSING A CONNECTION\n                Note that if ~connection() or shutdown() is called before the remote client \n                has received all sent data it is possible that the data will be lost.  To \n                avoid this you should call the close_gracefully() function to close your \n                connections (unless you actually do want to immediately dispose of a \n                connection and don't care about the data).\n                (example: close_gracefully(con); // close con gracefully but force it closed\n                                                   // if it takes more than 500 milliseconds.)\n\n            THREAD SAFETY\n                - It is always safe to call shutdown() or shutdown_outgoing().   \n                - you may NOT call any function more than once at a time (except the \n                  shutdown functions).\n                - do not call read() more than once at a time\n                - do not call write() more than once at a time\n                - You can safely call shutdown or shutdown_outgoing in conjunction with \n                  the read/write functions.\n                    This is helpful if you want to unblock another thread that is \n                    blocking on a read/write operation.  Shutting down the connection \n                    will cause the read/write functions to return a value of SHUTDOWN.\n\n            OUT-OF-BAND DATA:\n                All out-of-band data will be put inline into the normal data stream.\n                This means that you can read any out-of-band data via calls to read(). \n                (i.e. the SO_OOBINLINE socket option will be set) \n        !*/\n\n    public:\n\n        ~connection (\n        );\n        /*!\n            requires\n                - no other threads are using this connection object \n            ensures\n                - closes the connection (this is an abrupt non-graceful close) \n                - frees the resources used by this object\n        !*/\n\n        void* user_data;\n        /*!\n            This pointer is provided so that the client programmer may easily associate\n            some data with a connection object.  You can really do whatever you want\n            with it.  Initially user_data is 0.\n        !*/\n\n        long write (\n            const char* buf, \n            long num\n        );\n        /*!\n            requires\n                - num > 0 \n                - buf points to an array of at least num bytes\n            ensures\n                - will block until ONE of the following occurs:\n                    - num bytes from buf have been written to the connection \n                    - an error has occurred\n                    - the outgoing channel of the connection has been shutdown locally\n\n                - returns num if write succeeded \n                - returns OTHER_ERROR if there was an error (this could be due to a \n                  connection close)\n                - returns SHUTDOWN if the outgoing channel of the connection has been \n                  shutdown locally\n        !*/\n\n        long read (\n            char* buf, \n            long num\n        );\n        /*!\n            requires\n                - num > 0 \n                - buf points to an array of at least num bytes\n            ensures\n                - read() will not read more than num bytes of data into #buf \n                - read blocks until ONE of the following happens:\n                    - there is some data available and it has been written into #buf \n                    - the remote end of the connection is closed \n                    - an error has occurred\n                    - the connection has been shutdown locally\n\n                - returns the number of bytes read into #buf if there was any data.\n                - returns 0 if the connection has ended/terminated and there is no more data.\n                - returns OTHER_ERROR if there was an error.\n                - returns SHUTDOWN if the connection has been shutdown locally\n        !*/\n\n        long read (\n            char* buf, \n            long num,\n            unsigned long timeout \n        );\n        /*!\n            requires\n                - num > 0 \n                - buf points to an array of at least num bytes\n                - timeout < 2000000                \n            ensures\n                - read() will not read more than num bytes of data into #buf \n                - if (timeout > 0) then read() blocks until ONE of the following happens:\n                    - there is some data available and it has been written into #buf \n                    - the remote end of the connection is closed \n                    - an error has occurred\n                    - the connection has been shutdown locally\n                    - timeout milliseconds has elapsed\n                - else\n                    - read() does not block\n\n                - returns the number of bytes read into #buf if there was any data.\n                - returns 0 if the connection has ended/terminated and there is no more data.\n                - returns TIMEOUT if timeout milliseconds elapsed before we got any data.\n                - returns OTHER_ERROR if there was an error.\n                - returns SHUTDOWN if the connection has been shutdown locally\n        !*/\n\n        unsigned short get_local_port (\n        ) const;\n        /*!\n            ensures\n                - returns the local port number for this connection\n        !*/\n\n        unsigned short get_foreign_port ( \n        ) const;\n        /*!\n            ensures\n                - returns the foreign port number for this connection\n        !*/\n\n        const std::string& get_local_ip (\n        ) const;\n        /*!\n            ensures\n                - returns the IP of the local interface this connection is using\n        !*/\n\n        const std::string& get_foreign_ip (\n        ) const;\n        /*!\n            ensures\n                - returns the IP of the foreign host for this connection\n        !*/\n\n        int shutdown (\n        );\n        /*!\n            ensures\n                - if (#shutdown() == 0 && connection was still open) then\n                    - terminates the connection but does not free the resources for the \n                      connection object \n\n                - any read() or write() calls on this connection will return immediately \n                  with the code SHUTDOWN.\n\n                - returns 0 upon success \n                - returns OTHER_ERROR if there was an error\n        !*/        \n\n        int shutdown_outgoing (\n        );\n        /*!\n            ensures\n                - if (#shutdown_outgoing() == 0 && outgoing channel was still open) then\n                    - sends a FIN to indicate that no more data will be sent on this \n                      connection but leaves the receive half of the connection open to \n                      receive more data from the other host \n\n                - any calls to write() will return immediately with the code SHUTDOWN.\n\n                - returns 0 upon success \n                - returns OTHER_ERROR if there was an error \n        !*/\n\n        int disable_nagle(\n        );\n        /*!\n            ensures\n                - Sets the TCP_NODELAY socket option to disable Nagle's algorithm.\n                  This can sometimes reduce transmission latency, however, in almost\n                  all normal cases you don't want to mess with this as the default\n                  setting is usually appropriate.  \n\n                - returns 0 upon success\n                - returns OTHER_ERROR if there was an error \n        !*/\n\n        typedef platform_specific_type socket_descriptor_type;\n        socket_descriptor_type get_socket_descriptor (\n        ) const;\n        /*!\n            ensures\n                - returns the underlying socket descriptor for this connection\n                  object.  The reason you might want access to this is to \n                  pass it to some other library that requires a socket file \n                  descriptor.  However, if you do this then you probably shouldn't \n                  use the dlib::connection read() and write() anymore since\n                  whatever you are doing with the socket descriptor is probably \n                  doing I/O with the socket.\n        !*/\n\n    private:\n        // restricted functions\n        connection();\n        connection(connection&);        // copy constructor\n        connection& operator=(connection&);    // assignment operator\n\n    }; \n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // listener object\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    class listener\n    {\n        /*!\n            WHAT THIS OBJECT REPRESENTS\n                This object represents a TCP socket waiting for incoming connections.\n                Calling accept returns a pointer to any new incoming connections on its\n                port.\n\n                Instances of this class can only be created by using the \n                create_listener function defined below.\n\n                NOTE:  \n                    A listener object must ALWAYS be closed (delete the pointer to it) or \n                    it will cause a resource leak.  \n\n                    Note also that all errors indicated by a return code of OTHER_ERROR\n                    are fatal so if one occurs the listener should be closed.\n\n            THREAD SAFETY\n                None of the functions in this object are guaranteed to be thread-safe.\n                This means that you must serialize all access to this object.\n        !*/\n\n    public:\n\n        ~listener (\n        );\n        /*!\n            requires\n                - no other threads are using this listener object \n            ensures\n                - closes the listener \n                - frees the resources used by this object\n        !*/\n\n        int accept (\n            connection*& new_connection,\n            unsigned long timeout = 0\n        );\n        /*!\n            requires\n                - timeout < 2000000                \n            ensures\n                - blocks until a new connection is ready or timeout milliseconds have \n                  elapsed.\n                - #new_connection == a pointer to the new connection object \n                - #new_connection->user_data == 0\n                - if (timeout == 0) then \n                    - the timeout argument is ignored\n\n                - returns 0 if accept() was successful                \n                - returns TIMEOUT if timeout milliseconds have elapsed \n                - returns OTHER_ERROR if an error has occurred \n        !*/\n\n        int accept (\n            std::unique_ptr<connection>& new_connection,\n            unsigned long timeout = 0\n        );\n        /*!\n            This function is just an overload of the above function but it gives you a\n            std::unique_ptr smart pointer instead of a C pointer.\n        !*/\n\n        unsigned short get_listening_port (\n        ) const;\n        /*!\n            ensures\n                - returns the port number that this object is listening on\n        !*/\n\n        const std::string& get_listening_ip (\n        ) const;\n        /*!\n            ensures\n                - returns a string containing the IP (e.g. \"127.0.0.1\") of the \n                  interface this object is listening on \n                - returns \"\" if it is accepting connections on all interfaces\n        !*/\n\n    private:\n        // restricted functions\n        listener();\n        listener(listener&);        // copy constructor\n        listener& operator=(listener&);    // assignment operator\n    };\n}\n\n#endif // DLIB_SOCKETS_KERNEl_ABSTRACT_\n\n"
  },
  {
    "path": "benchmarks/dlib/sockets/windows.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_SOCKETS_KERNEl_2_\n#include \"sockets_kernel_1.h\"\n#endif\n\n"
  },
  {
    "path": "benchmarks/dlib/sockets.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_SOCKETs_\n#define DLIB_SOCKETs_\n\n#include \"platform.h\"\n\n\n#ifdef WIN32\n#include \"sockets/windows.h\"\n#endif\n\n#ifndef WIN32\n#include \"sockets/posix.h\"\n#endif\n\n#include \"sockets/sockets_extensions.h\"\n\n#endif // DLIB_SOCKETs_\n\n"
  },
  {
    "path": "benchmarks/dlib/sort.h",
    "content": "// Copyright (C) 2005  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_SORt_\n#define DLIB_SORt_\n\n#include \"algs.h\"\n#include <functional>\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename compare\n        >\n    inline void qsort_array (\n        T& array,\n        unsigned long left,\n        unsigned long right,\n        const compare& comp \n    );\n    /*!\n        requires\n            - T implements operator[]                                 \n            - the items in array must be comparable by comp where comp is a function\n              object with the same syntax as std::less<>\n            - the items in array must be swappable by a global swap()   \n            - left and right are within the bounds of array\n              i.e. array[left] and array[right] are valid elements\n            - left <= right\n        ensures\n            - for all elements in #array between and including left and right the \n              ith element is < the i+1 element\n            - sorts using a quick sort algorithm\n    !*/ \n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename compare\n        >\n    void hsort_array (\n        T& array,\n        unsigned long left,\n        unsigned long right,\n        const compare& comp \n    );\n    /*!\n        requires\n            - T implements operator[]                                 \n            - the items in array must be comparable by comp where comp is a function\n              object with the same syntax as std::less<>\n            - the items in array must be swappable by a global swap()   \n            - left and right are within the bounds of array\n              i.e. array[left] and array[right] are valid elements\n            - left <= right\n        ensures\n            - for all elements in #array between and including left and right the \n              ith element is < the i+1 element\n            - sorts using a heapsort algorithm\n    !*/ \n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename compare\n        >\n    void isort_array (\n        T& array,\n        unsigned long left,\n        unsigned long right,\n        const compare& comp \n    );\n    /*!\n        requires\n            - T implements operator[]                                 \n            - the items in array must be comparable by comp where comp is a function\n              object with the same syntax as std::less<>\n            - the items in array must be swappable by a global swap()   \n            - left and right are within the bounds of array\n              i.e. array[left] and array[right] are valid elements\n            - left <= right\n        ensures\n            - for all elements in #array between and including left and right the \n              ith element is < the i+1 element\n            - sorts using an insertion sort algorithm\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    inline void qsort_array (\n        T& array,\n        unsigned long left,\n        unsigned long right\n    ); \n    /*!\n        requires\n            - T implements operator[]                                 \n            - the items in array must be comparable by std::less         \n            - the items in array must be swappable by a global swap()   \n            - left and right are within the bounds of array\n              i.e. array[left] and array[right] are valid elements\n            - left <= right\n        ensures\n            - for all elements in #array between and including left and right the \n              ith element is < the i+1 element\n            - sorts using a quick sort algorithm\n    !*/ \n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    void hsort_array (\n        T& array,\n        unsigned long left,\n        unsigned long right\n    );\n    /*!\n        requires\n            - T implements operator[]                                 \n            - the items in array must be comparable by std::less         \n            - the items in array must be swappable by a global swap()   \n            - left and right are within the bounds of array\n              i.e. array[left] and array[right] are valid elements\n            - left <= right\n        ensures\n            - for all elements in #array between and including left and right the \n              ith element is < the i+1 element\n            - sorts using a heapsort algorithm\n    !*/ \n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    void isort_array (\n        T& array,\n        unsigned long left,\n        unsigned long right\n    ); \n    /*!\n        requires\n            - T implements operator[]                                 \n            - the items in array must be comparable by std::less      \n            - the items in array must be swappable by a global swap()   \n            - left and right are within the bounds of array\n              i.e. array[left] and array[right] are valid elements\n            - left <= right\n        ensures\n            - for all elements in #array between and including left and right the \n              ith element is < the i+1 element\n            - sorts using an insertion sort algorithm\n    !*/\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n//                            IMPLEMENTATION DETAILS\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    namespace sort_helpers\n    {\n        template <typename T>\n        inline const std::less<T> comp (const T&)\n        {\n            return std::less<T>();\n        }\n\n        template <\n            typename T,\n            typename Y,\n            typename compare\n            >\n        inline unsigned long qsort_partition (\n            T& array,\n            Y& pivot,\n            const unsigned long left,\n            const unsigned long right,\n            const compare& comp\n        )\n        /*!\n            requires\n                - &pivot == &array[right]\n                - T implements operator[]                             \n                - the items in array must be comparable by comp     \n                - left and right are within the bounts of the array\n                - left < right\n            ensures\n                - returns a number called partition_element such that:\n                    - left <= partition_element <= right                              \n                    - all elements in #array < #array[partition_element] have \n                    indices >= left and < partition_element                         \n                    - all elements in #array > #array[partition_element] have \n                    indices > partition_element and <= right\n        !*/\n        {\n            DLIB_ASSERT (&pivot == &array[right] && left < right,\n                    \"\\tunsigned long qsort_partition()\"\n                    << \"\\n\\t&pivot:        \" << &pivot\n                    << \"\\n\\t&array[right]: \" << &array[right]\n                    << \"\\n\\tleft:          \" << left\n                    << \"\\n\\tright:         \" << right );\n\n            exchange(array[(right-left)/2 +left],pivot);\n\n            unsigned long i = left;\n            for (unsigned long j = left; j < right; ++j)\n            {\n                if (comp(array[j] , pivot))\n                {\n                    swap(array[i],array[j]);\n                    ++i;\n                }\n            }\n            exchange(array[i],pivot);\n            \n            return i;\n        }\n\n// ----------------------------------------------------------------------------------------\n\n        template <\n            typename T,\n            typename compare\n            >\n        void qsort_array_main (\n            T& array,\n            const unsigned long left,\n            const unsigned long right,\n            unsigned long depth_check,\n            const compare& comp\n        )\n        /*!\n            requires\n                - T implements operator[]                                 \n                - the items in array must be comparable by comp         \n                - the items in array must be swappable by a global swap()   \n                - left and right are within the bounds of array\n                  i.e. array[left] and array[right] are valid elements\n            ensures\n                - for all elements in #array between and including left and right the \n                  ith element is < the i+1 element\n                - will only recurse about as deep as log(depth_check) calls\n                - sorts using a quick sort algorithm\n        !*/ \n        {\n            if ( left < right)\n            {\n                if (right-left < 30 || depth_check == 0)\n                {\n                    hsort_array(array,left,right,comp);\n                }\n                else\n                {\n                    // The idea here is to only let quick sort go about log(N)\n                    // calls deep before it kicks into something else.\n                    depth_check >>= 1;\n                    depth_check += (depth_check>>4);\n\n                    unsigned long partition_element = \n                        qsort_partition(array,array[right],left,right,comp);\n                    \n                    if (partition_element > 0)\n                        qsort_array_main(array,left,partition_element-1,depth_check,comp);\n                    qsort_array_main(array,partition_element+1,right,depth_check,comp);\n                }\n            }\n        }\n\n// ----------------------------------------------------------------------------------------\n\n        template <\n            typename T,\n            typename compare\n            >\n        void heapify (\n            T& array,\n            const unsigned long start,\n            const unsigned long end,\n            unsigned long i,\n            const compare& comp\n        )\n        /*!\n            requires\n                - T implements operator[]                                 \n                - the items in array must be comparable by comp        \n                - the items in array must be swappable by a global swap()   \n                - start, end, and i are within the bounds of array\n                  i.e. array[start], array[end], and array[i] are valid elements\n                - start <= i <= end\n                - array[i/2] is a max heap\n                - array[i/2+1] is a max heap\n                - start and end specify the range of the array we are working with.\n            ensures\n                - array[i] is now a max heap\n        !*/\n        {\n            DLIB_ASSERT (start <= i && i <= end,\n                    \"\\tvoid heapify()\"\n                    << \"\\n\\tstart:   \" << start \n                    << \"\\n\\tend:     \" << end \n                    << \"\\n\\ti:       \" << i );\n\n            bool keep_going = true;            \n            unsigned long left;\n            unsigned long right;   \n            unsigned long largest; \n            while (keep_going)\n            {\n                keep_going = false;\n                left = (i<<1)+1-start;\n                right = left+1;\n\n                if (left <= end && comp(array[i] , array[left]))\n                    largest = left;\n                else\n                    largest = i;\n\n                if (right <= end && comp(array[largest] , array[right]))\n                    largest = right;\n\n                if (largest != i)\n                {\n                    exchange(array[i],array[largest]);\n                    i = largest;\n                    keep_going = true;\n                }\n            }\n        }\n\n// ----------------------------------------------------------------------------------------\n    }\n// ----------------------------------------------------------------------------------------\n\n\n    template <\n        typename T\n        >\n    inline void qsort_array (\n        T& array,\n        unsigned long left,\n        unsigned long right\n    ) \n    {\n        using namespace sort_helpers;\n        qsort_array(array,left,right,comp(array[left]));\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    void hsort_array (\n        T& array,\n        unsigned long left,\n        unsigned long right\n    )\n    {\n        using namespace sort_helpers;\n        hsort_array(array,left,right,comp(array[left]));\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    void isort_array (\n        T& array,\n        unsigned long left,\n        unsigned long right\n    ) \n    {\n        using namespace sort_helpers;\n        isort_array(array,left,right,comp(array[left]));\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename compare\n        >\n    void isort_array (\n        T& array,\n        const unsigned long left,\n        const unsigned long right,\n        const compare& comp\n    )\n    {\n        DLIB_ASSERT (left <= right,\n                \"\\tvoid isort_array()\"\n                << \"\\n\\tleft:          \" << left\n                << \"\\n\\tright:         \" << right );\n        using namespace sort_helpers;\n\n        unsigned long pos;\n        for (unsigned long i = left+1; i <= right; ++i)\n        {\n            // everything from left to i-1 is sorted.\n            pos = i;\n            for (unsigned long j = i-1; comp(array[pos] , array[j]); --j)\n            {\n                exchange(array[pos],array[j]);\n                pos = j;\n                \n                if (j == left)\n                    break;\n            }\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename compare\n        >\n    void qsort_array (\n        T& array,\n        const unsigned long left,\n        const unsigned long right,\n        const compare& comp\n    )\n    {      \n        DLIB_ASSERT (left <= right,\n                \"\\tvoid qsort_array()\"\n                << \"\\n\\tleft:          \" << left\n                << \"\\n\\tright:         \" << right );\n\n        sort_helpers::qsort_array_main(array,left,right,right-left,comp);\n    }\n\n// ----------------------------------------------------------------------------------------\n    \n    template <\n        typename T,\n        typename compare\n        >\n    void hsort_array (\n        T& array,\n        const unsigned long left,\n        const unsigned long right,\n        const compare& comp\n    )\n    {\n        DLIB_ASSERT (left <= right,\n                \"\\tvoid hsort_array()\"\n                << \"\\n\\tleft:          \" << left\n                << \"\\n\\tright:         \" << right );\n\n        if (right-left < 30)\n        {\n            isort_array(array,left,right,comp);\n            return;\n        }\n\n        // turn array into a max heap\n        for (unsigned long i = left+((right-left)>>1);; --i)\n        {\n            sort_helpers::heapify(array,left,right,i,comp);\n            if (i == left)\n                break;\n        }\n\n        // now sort the array\n        for (unsigned long i = right; i > left;)\n        {\n            exchange(array[i],array[left]);\n            sort_helpers::heapify(array,left,--i,left,comp);\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_SORt_\n\n"
  },
  {
    "path": "benchmarks/dlib/sparse_vector.h",
    "content": "// Copyright (C) 2012  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_SPaRSE_VECTOR_Hh_\n#define DLIB_SPaRSE_VECTOR_Hh_ \n\n#include \"svm/sparse_vector.h\"\n\n#endif // DLIB_SPaRSE_VECTOR_Hh_ \n\n\n"
  },
  {
    "path": "benchmarks/dlib/sstream",
    "content": "#include \"dlib_include_path_tutorial.txt\"\n"
  },
  {
    "path": "benchmarks/dlib/stack/stack_kernel_1.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_STACK_KERNEl_1_\n#define DLIB_STACK_KERNEl_1_\n\n#include \"stack_kernel_abstract.h\"\n#include \"../algs.h\"\n#include \"../interfaces/enumerable.h\"\n#include \"../interfaces/remover.h\"\n#include \"../serialize.h\"\n\nnamespace dlib\n{\n\n    template <\n        typename T,\n        typename mem_manager = default_memory_manager\n        >\n    class stack_kernel_1 : public enumerable<T>,\n                           public remover<T>\n    {\n\n        /*!\n            INITIAL VALUE\n                stack_size == 0 \n                top == 0\n                current_element == 0\n                _at_start == true\n\n\n            CONVENTION\n                at_start() == _at_start\n                current_element_valid() == (current_element != 0)\n                if (current_element != 0) then\n                    element() == current_element->item\n\n                stack_size == the number of elements in the stack. \n                Each node points to the next node to be poped off the stack.\n                The last node in the list has its next pointer is set to 0.\n                \n                if (size == 0)\n                {\n                    top == 0\n                }\n                else\n                {\n                    top == pointer to the last element added to the stack\n                }\n        !*/\n        \n        struct node\n        {\n            node* next;\n            T item;\n        };\n        \n        public:\n\n            typedef T type;\n            typedef mem_manager mem_manager_type;\n\n            stack_kernel_1(\n            ):\n                top(0),\n                stack_size(0),\n                current_element(0),\n                _at_start(true)\n            {}\n    \n            virtual ~stack_kernel_1(\n            );\n\n            inline void clear(\n            );\n\n            inline void push(\n                T& item\n            );\n\n            void pop(\n                T& item\n            );\n\n            T& current(\n            );\n\n            const T& current(\n            ) const;\n\n            inline void swap (\n                stack_kernel_1& item\n            );\n        \n            // functions from the remover interface\n            inline void remove_any (\n                T& item\n            ); \n\n            // functions from the enumerable interface\n            inline size_t size (\n            ) const;\n\n            inline bool at_start (\n            ) const;\n\n            inline void reset (\n            ) const;\n\n            bool current_element_valid (\n            ) const;\n\n            inline const T& element (\n            ) const;\n\n            inline T& element (\n            );\n\n            bool move_next (\n            ) const;\n\n        private:\n\n            void delete_elements_in_stack(\n                node*& top\n            );\n            /*!\n                requires\n                    - top points to the top of the stack\n                ensures\n                    - all memory has been freed \n                    - #top = 0\n            !*/\n\n\n            // data members\n            typename mem_manager::template rebind<node>::other pool;\n            node* top;\n            unsigned long stack_size;\n            mutable node* current_element;\n            mutable bool _at_start;\n\n\n            // restricted functions\n            stack_kernel_1(stack_kernel_1&);        // copy constructor\n            stack_kernel_1& operator=(stack_kernel_1&); // assignment operator\n\n    };\n\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    inline void swap (\n        stack_kernel_1<T,mem_manager>& a, \n        stack_kernel_1<T,mem_manager>& b \n    ) { a.swap(b); } \n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    void deserialize (\n        stack_kernel_1<T,mem_manager>& item, \n        std::istream& in\n    )\n    {\n        try\n        {\n            item.clear();\n            unsigned long size;\n            deserialize(size,in);\n            T temp = T();\n            stack_kernel_1<T> temp_stack;\n            for (unsigned long i = 0; i < size; ++i)\n            {\n                deserialize(temp,in);\n                temp_stack.push(temp);\n            }\n            while (temp_stack.size() > 0)\n            {\n                temp_stack.pop(temp);\n                item.push(temp);\n            }\n        }\n        catch (serialization_error& e)\n        { \n            item.clear();\n            throw serialization_error(e.info + \"\\n   while deserializing object of type stack_kernel_1\"); \n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // member function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    \n    template <\n        typename T,\n        typename mem_manager\n        >\n    stack_kernel_1<T,mem_manager>::\n    ~stack_kernel_1(\n    ) \n    {\n        delete_elements_in_stack(top);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    void stack_kernel_1<T,mem_manager>::\n    clear(\n    )\n    {\n        if (stack_size != 0)\n        {\n            delete_elements_in_stack(top);\n            stack_size = 0;\n        }\n        reset();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    T& stack_kernel_1<T,mem_manager>::\n    current(\n    )\n    {\n        return top->item;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    const T& stack_kernel_1<T,mem_manager>::\n    current(\n    ) const\n    {\n        return top->item;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    void stack_kernel_1<T,mem_manager>::\n    swap(\n        stack_kernel_1<T,mem_manager>& item\n    )\n    {\n        pool.swap(item.pool);\n\n        // declare temp variables\n        node* top_temp;\n        unsigned long stack_size_temp;\n\n        // swap stack_size variables\n        stack_size_temp = item.stack_size;\n        item.stack_size = stack_size;\n        stack_size = stack_size_temp;\n\n        // swap top pointers\n        top_temp = item.top;\n        item.top = top;\n        top = top_temp;\n\n        exchange(current_element,item.current_element);\n        exchange(_at_start,item._at_start);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    void stack_kernel_1<T,mem_manager>::\n    push(\n        T& item\n    )\n    {\n        // allocate memory for new node\n        node* new_node = pool.allocate();\n\n        // swap item into new_node\n        exchange(new_node->item,item);\n        \n        // put new_node into stack\n        new_node->next = top;\n        top = new_node;\n        ++stack_size;\n\n        reset();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    void stack_kernel_1<T,mem_manager>::\n    pop(\n        T& item\n    )\n    {\n        node* old_node = top;\n        top = top->next;\n\n        // swap the item from the stack into item\n        exchange(old_node->item,item);\n        \n        // free the memory\n        pool.deallocate(old_node);\n        --stack_size;\n\n        reset();\n    }\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // private member function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    void stack_kernel_1<T,mem_manager>::\n    delete_elements_in_stack(\n        node*& top\n    )\n    {\n        node* temp;\n        while (top != 0)\n        {\n            temp = top->next;\n            pool.deallocate(top);\n            top = temp;\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // enumerable function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n   \n    template <\n        typename T,\n        typename mem_manager\n        >\n    size_t stack_kernel_1<T,mem_manager>::\n    size (\n    ) const\n    {\n        return stack_size;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    bool stack_kernel_1<T,mem_manager>::\n    at_start (\n    ) const\n    {\n        return _at_start;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    void stack_kernel_1<T,mem_manager>::\n    reset (\n    ) const\n    {\n        _at_start = true;\n        current_element = 0;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    bool stack_kernel_1<T,mem_manager>::\n    current_element_valid (\n    ) const\n    {\n        return current_element != 0;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    const T& stack_kernel_1<T,mem_manager>::\n    element (\n    ) const\n    {\n        return current_element->item;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    T& stack_kernel_1<T,mem_manager>::\n    element (\n    )\n    {\n        return current_element->item;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    bool stack_kernel_1<T,mem_manager>::\n    move_next (\n    ) const\n    {\n        if (!_at_start)\n        {\n            if (current_element)\n            {\n                current_element = current_element->next;\n                if (current_element)\n                    return true;\n                else\n                    return false;\n                }\n            else\n            {\n                return false;\n            }\n        }\n        else\n        {\n            _at_start = false;\n            if (stack_size)\n            {\n                current_element = top;\n                return true;\n            }\n            else\n            {\n                return false;\n            }\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // remover function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    void stack_kernel_1<T,mem_manager>::\n    remove_any (\n        T& item\n    ) \n    {\n        pop(item);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_STACK_KERNEl_1_\n\n"
  },
  {
    "path": "benchmarks/dlib/stack/stack_kernel_abstract.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_STACK_KERNEl_ABSTRACT_\n#ifdef DLIB_STACK_KERNEl_ABSTRACT_\n\n#include \"../interfaces/enumerable.h\"\n#include \"../interfaces/remover.h\"\n#include \"../serialize.h\"\n#include \"../algs.h\"\n\nnamespace dlib\n{\n\n    template <\n        typename T,\n        typename mem_manager = default_memory_manager\n        >\n    class stack : public enumerable<T>,\n                  public remover<T>\n    {\n\n        /*!\n            REQUIREMENTS ON T\n                T must be swappable by a global swap() and\n                T must have a default constructor\n\n            REQUIREMENTS ON mem_manager\n                must be an implementation of memory_manager/memory_manager_kernel_abstract.h or\n                must be an implementation of memory_manager_global/memory_manager_global_kernel_abstract.h or\n                must be an implementation of memory_manager_stateless/memory_manager_stateless_kernel_abstract.h \n                mem_manager::type can be set to anything.\n\n            POINTERS AND REFERENCES TO INTERNAL DATA\n                swap() and current() functions do not invalidate pointers \n                or references to internal data.\n                All other functions have no such guarantee.\n\n            INITIAL VALUE\n                size() == 0    \n            \n            ENUMERATION ORDER\n                The enumerator will iterate over the elements in the stack in the\n                same order they would be removed in by repeated calls to pop().\n                (e.g. current() would be the first element enumerated)\n\n            WHAT THIS OBJECT REPRESENTS\n                This is a last in first out stack containing items of type T.\n                \n                e.g. if the stack is {b,c,d,e} then a is put in\n                the stack becomes {a,b,c,d,e} and then pop takes a back out\n                returning the stack to {b,c,d,e}\n\n                Also note that unless specified otherwise, no member functions\n                of this object throw exceptions.\n        !*/\n        \n        public:\n\n            typedef T type;\n            typedef mem_manager mem_manager_type;\n\n            stack (\n            );\n            /*!\n                ensures \n                    - #*this is properly initialized\n                throws\n                    - std::bad_alloc or any exception thrown by T's constructor\n            !*/\n\n            virtual ~stack (\n            ); \n            /*!\n                ensures\n                    - all memory associated with *this has been released\n            !*/\n\n            void clear(\n            );\n            /*!\n                ensures\n                    - #*this has its initial value\n                throws\n                    - std::bad_alloc or any exception thrown by T's constructor\n                        if this exception is thrown then *this is unusable \n                        until clear() is called and succeeds\n            !*/\n\n            void push (\n                T& item\n            );\n            /*!\n                ensures\n                    - item has been swapped onto the top of the stack\n                    - #current() == item\n                    - #item has an initial value for its type \n                    - #size() == size() + 1\n                    - #at_start() == true\n                throws\n                    - std::bad_alloc or any exception thrown by T's constructor\n                        if push() throws then it has no effect\n            !*/\n\n            void pop (\n                T& item\n            );\n            /*!\n                requires\n                    - size() != 0\n                ensures\n                    - #size() == size() - 1\n                    - #item   == current()\n                      i.e. the top element of *this has been removed and swapped \n                      into #item\n                    - #at_start() == true\n            !*/\n\n            T& current (\n            );\n            /*!\n                requires\n                    - size() != 0\n                ensures\n                    - returns a const reference to the element at the top of *this\n            !*/\n\n            const T& current (\n            ) const;\n            /*!\n                requires\n                    - size() != 0\n                ensures\n                    - returns a non-const reference to the element at the top of *this\n            !*/\n            \n            void swap (\n                stack& item\n            );\n            /*!\n                ensures\n                    - swaps *this and item\n            !*/ \n\n\n        private:\n\n            // restricted functions\n            stack(stack&);        // copy constructor\n            stack& operator=(stack&);    // assignment operator\n\n    };\n\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    inline void swap (\n        stack<T,mem_manager>& a, \n        stack<T,mem_manager>& b \n    ) { a.swap(b); }  \n    /*!\n        provides a global swap function\n    !*/\n\n    template <\n        typename T,\n        typename mem_manager\n        >\n    void deserialize (\n        stack<T,mem_manager>& item, \n        std::istream& in\n    );   \n    /*!\n        provides deserialization support \n    !*/\n}\n\n#endif // DLIB_STACK_KERNEl_ABSTRACT_\n\n"
  },
  {
    "path": "benchmarks/dlib/stack/stack_kernel_c.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_STACK_KERNEl_C_\n#define DLIB_STACK_KERNEl_C_\n\n#include \"stack_kernel_abstract.h\"\n#include \"../algs.h\"\n#include \"../assert.h\"\n\nnamespace dlib\n{\n\n    template <\n        typename stack_base\n        >\n    class stack_kernel_c : public stack_base\n    {\n        typedef typename stack_base::type T;\n        public:\n            void pop(\n                T& item\n            );\n\n            T& current(\n            );\n\n            const T& current(\n            ) const;\n\n            const T& element( \n            ) const;\n\n            T& element(\n            );\n\n            void remove_any (\n                T& item\n            );\n\n    };\n\n\n    template <\n        typename stack_base\n        >\n    inline void swap (\n        stack_kernel_c<stack_base>& a, \n        stack_kernel_c<stack_base>& b \n    ) { a.swap(b); } \n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // member function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename stack_base\n        >\n    void stack_kernel_c<stack_base>::\n    pop(\n        T& item\n    )\n    {\n\n        // make sure requires clause is not broken\n        DLIB_CASSERT(this->size() != 0,\n            \"\\tvoid stack::pop\"\n            << \"\\n\\tsize of stack should not be zero\"\n            << \"\\n\\tthis: \" << this\n            );\n        \n        // call the real function\n        stack_base::pop(item);\n\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename stack_base\n        >\n    const typename stack_base::type& stack_kernel_c<stack_base>::\n    current(\n    ) const\n    {\n        // make sure requires clause is not broken\n        DLIB_CASSERT(this->size() != 0,\n            \"\\tconst T& stack::current\"\n            << \"\\n\\tsize of stack should not be zero\"\n            << \"\\n\\tthis: \" << this\n            );\n    \n        // call the real function\n        return stack_base::current();\n\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename stack_base\n        >\n    typename stack_base::type& stack_kernel_c<stack_base>::\n    current(\n    )\n    {\n        // make sure requires clause is not broken\n        DLIB_CASSERT(this->size() != 0,\n            \"\\tT& stack::current\"\n            << \"\\n\\tsize of stack should not be zero\"\n            << \"\\n\\tthis: \" << this\n            );\n\n        // call the real function\n        return stack_base::current();\n\n    }\n\n// ----------------------------------------------------------------------------------------\n    \n    template <\n        typename stack_base\n        >\n    typename stack_base::type& stack_kernel_c<stack_base>::\n    element(\n    )\n    {\n        // make sure requires clause is not broken\n        DLIB_CASSERT(this->current_element_valid(),\n            \"\\tT& stack::element\"\n            << \"\\n\\tThe current element must be valid if you are to access it.\"\n            << \"\\n\\tthis: \" << this\n            );\n\n        // call the real function\n        return stack_base::element();\n\n    }\n\n// ----------------------------------------------------------------------------------------\n    \n    template <\n        typename stack_base\n        >\n    const typename stack_base::type& stack_kernel_c<stack_base>::\n    element(\n    ) const\n    {\n        // make sure requires clause is not broken\n        DLIB_CASSERT(this->current_element_valid(),\n            \"\\tconst T& stack::element\"\n            << \"\\n\\tThe current element must be valid if you are to access it.\"\n            << \"\\n\\tthis: \" << this\n            );\n\n        // call the real function\n        return stack_base::element();\n\n    }\n\n// ----------------------------------------------------------------------------------------\n    \n    template <\n        typename stack_base\n        >\n    void stack_kernel_c<stack_base>::\n    remove_any (\n        T& item\n    ) \n    {\n        // make sure requires clause is not broken\n        DLIB_CASSERT( (this->size() > 0),\n            \"\\tvoid stack::remove_any\"\n            << \"\\n\\tsize() must be greater than zero if something is going to be removed\"\n            << \"\\n\\tsize(): \" << this->size() \n            << \"\\n\\tthis:   \" << this\n            );\n\n        // call the real function\n        stack_base::remove_any(item);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_STACK_KERNEl_C_\n\n"
  },
  {
    "path": "benchmarks/dlib/stack.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_STACk_\n#define DLIB_STACk_\n\n#include \"stack/stack_kernel_1.h\"\n#include \"stack/stack_kernel_c.h\"\n#include \"algs.h\"\n\nnamespace dlib\n{\n\n    template <\n        typename T,\n        typename mem_manager = default_memory_manager \n        >\n    class stack\n    {\n        stack() {}\n    public:\n        \n        //----------- kernels ---------------\n\n        // kernel_1a        \n        typedef     stack_kernel_1<T,mem_manager>    \n                    kernel_1a;\n        typedef     stack_kernel_c<kernel_1a>\n                    kernel_1a_c;\n \n    };\n}\n\n#endif // DLIB_STACk_\n\n"
  },
  {
    "path": "benchmarks/dlib/stack_trace.h",
    "content": "// Copyright (C) 2008  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_STACK_TRACe_\n#define DLIB_STACK_TRACe_\n\n/*!\n    This file defines 3 things.  Two of them are preprocessor macros that\n    enable you to tag functions with the dlib stack trace watcher.  The\n    third thing is a function named get_stack_trace() which returns the\n    current stack trace in std::string form.\n\n    To enable the stack trace you must #define DLIB_ENABLE_STACK_TRACE.\n    When this #define isn't set then the 3 things described above\n    still exist but they don't do anything.\n\n    Also note that when the stack trace is enabled it changes the DLIB_ASSERT\n    and DLIB_CASSERT macros so that they print stack traces when \n    an assert fails.\n\n    See the following example program for details:\n\n    #include <iostream>\n    #include <dlib/stack_trace.h>\n\n    void funct2()\n    {\n        // put this macro at the top of each function you would\n        // like to appear in stack traces\n        DLIB_STACK_TRACE;\n\n        // you may print the current stack trace as follows. \n        std::cout << dlib::get_stack_trace() << endl;\n    }\n\n    void funct()\n    {\n        // This alternate form of DLIB_STACK_TRACE allows you to specify\n        // the string used to name the current function.  The other form\n        // will usually output an appropriate function name automatically\n        // so this may not be needed.\n        DLIB_STACK_TRACE_NAMED(\"funct\");\n        funct2();\n    }\n\n    int main()\n    {\n        funct();\n    }\n!*/\n\n\n#include <string>\n#include \"assert.h\"\n\n// only setup the stack trace stuff if the asserts are enabled (which happens in debug mode\n// basically).  Also, this stuff doesn't work if you use NO_MAKEFILE\n#if defined(DLIB_ENABLE_STACK_TRACE) \n#ifdef NO_MAKEFILE \n#error \"You can't use the dlib stack trace stuff and NO_MAKEFILE at the same time\"\n#endif\n\nnamespace dlib\n{\n    const std::string get_stack_trace();\n}\n\n// redefine the DLIB_CASSERT macro to include the stack trace\n#undef DLIBM_CASSERT\n#define DLIBM_CASSERT(_exp,_message)                                              \\\n    {if ( !(_exp) )                                                         \\\n    {                                                                       \\\n        std::ostringstream dlib_o_out;                                       \\\n        dlib_o_out << \"\\n\\nError occurred at line \" << __LINE__ << \".\\n\";    \\\n        dlib_o_out << \"Error occurred in file \" << __FILE__ << \".\\n\";      \\\n        dlib_o_out << \"Error occurred in function \" << DLIB_FUNCTION_NAME << \".\\n\\n\";      \\\n        dlib_o_out << \"Failing expression was \" << #_exp << \".\\n\";           \\\n        dlib_o_out << _message << \"\\n\\n\";                                      \\\n        dlib_o_out << \"Stack Trace: \\n\" << dlib::get_stack_trace() << \"\\n\";        \\\n        dlib_assert_breakpoint();                                           \\\n        throw dlib::fatal_error(dlib::EBROKEN_ASSERT,dlib_o_out.str());      \\\n    }}                                                                      \n\n\n\nnamespace dlib\n{\n\n    class stack_tracer\n    {\n    public:\n        stack_tracer (\n            const char* funct_name,\n            const char* file_name,\n            const int line_number\n        );\n\n        ~stack_tracer();\n\n    };\n}\n\n#define DLIB_STACK_TRACE_NAMED(x) dlib::stack_tracer dlib_stack_tracer_object(x,__FILE__,__LINE__)\n#define DLIB_STACK_TRACE dlib::stack_tracer dlib_stack_tracer_object(DLIB_FUNCTION_NAME,__FILE__,__LINE__)\n\n#else // don't do anything if ENABLE_ASSERTS isn't defined\n#define DLIB_STACK_TRACE_NAMED(x) \n#define DLIB_STACK_TRACE \n\nnamespace dlib\n{\n    inline const std::string get_stack_trace() { return std::string(\"stack trace not enabled\");}\n}\n\n#endif\n\n\n#endif // DLIB_STACK_TRACe_\n\n"
  },
  {
    "path": "benchmarks/dlib/std_allocator.h",
    "content": "// Copyright (C) 2007  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_STD_ALLOc_H_\n#define DLIB_STD_ALLOc_H_\n\n#include <limits>\n#include <memory>\n#include \"enable_if.h\"\n#include \"algs.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        typename M\n        >\n    class std_allocator \n    {\n        /*!\n            REQUIREMENTS ON M \n                must be an implementation of memory_manager/memory_manager_kernel_abstract.h or\n                must be an implementation of memory_manager_global/memory_manager_global_kernel_abstract.h or\n                must be an implementation of memory_manager_stateless/memory_manager_stateless_kernel_abstract.h \n                M::type can be set to anything.\n\n            WHAT THIS OBJECT REPRESENTS\n                This object is an implementation of an allocator that conforms to the C++ standard \n                requirements for allocator objects.  The M template argument is one of the dlib\n                memory manager objects and this allocator implementation will do all of its memory allocations\n                using whatever dlib memory manager you supply.   \n\n                Thus, using this allocator object you can use any of the dlib memory manager objects with\n                the containers in the STL or with any other object that requires a C++ allocator object.\n\n                It is important to note that many STL implementations make the assumption that the memory\n                allocated by one allocator can be freed by another.  This effectively means that you should\n                only use a global or stateless memory manager with the std_allocator.  Either that or you\n                have to verify that your version of the STL isn't going to try and allocate and deallocate\n                memory with different allocators.\n        !*/\n\n    public:\n        //type definitions\n        typedef std::size_t     size_type;\n        typedef std::ptrdiff_t  difference_type;\n        typedef T*              pointer;\n        typedef const T*        const_pointer;\n        typedef T&              reference;\n        typedef const T&        const_reference;\n        typedef T               value_type;\n\n        //rebind std_allocator to type U\n        template <typename U>\n        struct rebind {\n            typedef std_allocator<U,M> other;\n        };\n\n        //return address of values\n        pointer address (reference value) const { return &value; }\n\n        const_pointer address (const_reference value) const { return &value; }\n\n        /*constructors and destructor\n         *-nothing to do because the std_allocator has no state\n        */\n        std_allocator() throw() { }\n\n        std_allocator(const std_allocator&) throw() { } \n\n        template <typename U>\n        std_allocator (const std_allocator<U,M>&) throw() { }\n\n        ~std_allocator() throw() { }\n\n        //return maximum number of elements that can be allocated\n        size_type max_size () const throw() \n        {\n            //for numeric_limits see Section 4.3, page 59\n            return std::numeric_limits<size_t>::max() / sizeof(T);\n        }\n\n        //allocate but don't initialize num elements of type T\n        pointer allocate (\n            size_type num,\n            typename std_allocator<void,M>::const_pointer  = 0\n        ) \n        {\n            return (pointer) pool.allocate_array(num*sizeof(T));\n        }\n\n        // This function is not required by the C++ standard but some versions of the STL\n        // distributed with gcc erroneously require it.  See the bug report for further\n        // details: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51626\n        void construct(pointer p) { return construct(p, value_type()); }\n\n        //initialize elements of allocated storage p with value value\n        void construct (pointer p, const T& value) \n        {\n            //initialize memory with placement new\n            new((void*)p)T(value);\n        }\n\n\n        //destroy elements of initialized storage p\n        void destroy (pointer p) \n        {\n            // destroy objects by calling their destructor\n            p->~T();\n        }\n\n        //deallocate storage p of deleted elements\n        void deallocate (pointer p, size_type ) \n        {\n            pool.deallocate_array((char*)p);\n        }\n\n        void swap (\n            std_allocator& item\n        )\n        {\n            pool.swap(item.pool);\n        }\n\n        std_allocator& operator= (const std_allocator&) { return *this;}\n\n    private:\n        typename M::template rebind<char>::other pool; \n    };\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename M\n        >\n    class std_allocator<void,M> \n    {\n    public:\n        //type definitions\n        typedef std::size_t     size_type;\n        typedef std::ptrdiff_t  difference_type;\n        typedef void*              pointer;\n        typedef const void*        const_pointer;\n        typedef void               value_type;\n\n        //rebind std_allocator to type U\n        template <typename U>\n        struct rebind {\n            typedef std_allocator<U,M> other;\n        };\n\n    };\n    \n// ----------------------------------------------------------------------------------------\n\n    template <typename M1, typename M2, typename enabled = void>\n    struct std_alloc_compare\n    { const static bool are_interchangeable = false; };\n\n    template <typename M1, typename M2>\n    struct std_alloc_compare<M1,M2,typename enable_if<is_same_type<typename M1::mm_global_type, typename M2::mm_global_type> >::type>\n    { const static bool are_interchangeable = true; };\n\n    template <typename M>\n\tstruct std_alloc_compare<M,M,typename enable_if_c<M::is_stateless>::type>\n    { const static bool are_interchangeable = true; };\n\n    //return that all specializations of this std_allocator are interchangeable if they use memory_manager_global\n    // instances with the same mm_global_type\n    template <typename T1, typename M1, typename T2, typename M2>\n    bool operator== (\n        const std_allocator<T1,M1>&,\n        const std_allocator<T2,M2>&\n    ) throw() \n    { return std_alloc_compare<M1,M2>::are_interchangeable; }\n\n    template <typename T1, typename M1, typename T2, typename M2>\n    bool operator!= (\n        const std_allocator<T1,M1>&,\n        const std_allocator<T2,M2>&\n    ) throw() \n    { return !std_alloc_compare<M1,M2>::are_interchangeable; }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T, typename M>\n    void swap (\n        std_allocator<T,M>& a,\n        std_allocator<T,M>& b\n    ) { a.swap(b); }\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_STD_ALLOc_H_\n\n"
  },
  {
    "path": "benchmarks/dlib/stl_checked/std_vector_c.h",
    "content": "// Copyright (C) 2008  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_STD_VECTOr_C_H_\n#define DLIB_STD_VECTOr_C_H_\n\n#include <vector>\n#include <algorithm>\n#include \"../assert.h\"\n#include \"std_vector_c_abstract.h\"\n#include \"../serialize.h\"\n#include \"../is_kind.h\"\n\nnamespace dlib\n{\n\n    template <\n        typename T,\n        typename Allocator = std::allocator<T>\n        >\n    class std_vector_c : public std::vector<T,Allocator>\n    {\n        typedef typename std::vector<T,Allocator> base_type;\n    public:\n        // types:\n        typedef typename Allocator::reference         reference;\n        typedef typename Allocator::const_reference   const_reference;\n        typedef typename base_type::iterator          iterator;       // See 23.1\n        typedef typename base_type::const_iterator    const_iterator; // See 23.1\n        typedef typename base_type::size_type         size_type;      // See 23.1\n        typedef typename base_type::difference_type   difference_type;// See 23.1\n        typedef T                                     value_type;\n        typedef Allocator                             allocator_type;\n        typedef typename Allocator::pointer           pointer;\n        typedef typename Allocator::const_pointer     const_pointer;\n        typedef std::reverse_iterator<iterator>       reverse_iterator;\n        typedef std::reverse_iterator<const_iterator> const_reverse_iterator;\n\n\n        // 23.2.4.1 construct/copy/destroy:\n        explicit std_vector_c(const Allocator& alloc= Allocator()) : base_type(alloc) {}\n\n        explicit std_vector_c(size_type n, const T& value = T(),\n                              const Allocator& alloc= Allocator()) : base_type(n, value, alloc) {}\n\n        template <typename InputIterator>\n        std_vector_c(InputIterator first, InputIterator last,\n                     const Allocator& alloc= Allocator()) : base_type(first,last,alloc) {}\n\n        std_vector_c(const std::vector<T,Allocator>& x) : base_type(x) {}\n\n        std_vector_c<T,Allocator>& operator=(const std::vector<T,Allocator>& x)\n        {\n            static_cast<base_type&>(*this) = x;\n            return *this;\n        }\n\n        template <typename InputIterator>\n        void assign(InputIterator first, InputIterator last)    { base_type::assign(first,last); }\n        void assign(size_type n, const T& u)                    { base_type::assign(n,u); }\n        allocator_type          get_allocator() const           { return base_type::get_allocator(); }\n        // iterators:\n        iterator                begin()                         { return base_type::begin(); }\n        const_iterator          begin() const                   { return base_type::begin(); }\n        iterator                end()                           { return base_type::end(); }\n        const_iterator          end() const                     { return base_type::end(); }\n        reverse_iterator        rbegin()                        { return base_type::rbegin(); }\n        const_reverse_iterator  rbegin() const                  { return base_type::rbegin(); }\n        reverse_iterator        rend()                          { return base_type::rend(); }\n        const_reverse_iterator  rend() const                    { return base_type::rend(); }\n        // 23.2.4.2 capacity:\n        size_type               size() const                    { return base_type::size(); }\n        size_type               max_size() const                { return base_type::max_size(); }\n        void                    resize(size_type sz, T c = T()) { base_type::resize(sz,c); }\n        size_type               capacity() const                { return base_type::capacity(); }\n        bool                    empty() const                   { return base_type::empty(); }\n        void                    reserve(size_type n)            { base_type::reserve(n); }\n\n        // element access:\n        const_reference         at(size_type n) const           { return base_type::at(n); }\n        reference               at(size_type n)                 { return base_type::at(n); }\n\n\n        // 23.2.4.3 modifiers:\n        void     push_back(const T& x) { base_type::push_back(x); }\n        void     swap(std_vector_c<T,Allocator>& x) { base_type::swap(x); }\n        void     clear() { base_type::clear(); }\n\n\n    // ------------------------------------------------------\n    // Things that have preconditions that should be checked.\n    // ------------------------------------------------------\n\n        reference operator[](\n            size_type n\n        ) \n        { \n            DLIB_CASSERT(n < size(),\n                \"\\treference std_vector_c::operator[](n)\"\n                << \"\\n\\tYou have supplied an invalid index\"\n                << \"\\n\\tthis:   \" << this\n                << \"\\n\\tn:      \" << n \n                << \"\\n\\tsize(): \" << size()\n            );\n            return static_cast<base_type&>(*this)[n]; \n        }\n\n    // ------------------------------------------------------\n\n        const_reference operator[](\n            size_type n\n        ) const \n        { \n            DLIB_CASSERT(n < size(),\n                \"\\tconst_reference std_vector_c::operator[](n)\"\n                << \"\\n\\tYou have supplied an invalid index\"\n                << \"\\n\\tthis:   \" << this\n                << \"\\n\\tn:      \" << n \n                << \"\\n\\tsize(): \" << size()\n            );\n            return static_cast<const base_type&>(*this)[n]; \n        }\n\n    // ------------------------------------------------------\n\n        reference front(\n        ) \n        { \n            DLIB_CASSERT(size() > 0,\n                \"\\treference std_vector_c::front()\"\n                << \"\\n\\tYou can't call front() on an empty vector\"\n                << \"\\n\\tthis:   \" << this\n            );\n            return base_type::front(); \n        }\n\n    // ------------------------------------------------------\n\n        const_reference front(\n        ) const \n        {\n            DLIB_CASSERT(size() > 0,\n                \"\\tconst_reference std_vector_c::front()\"\n                << \"\\n\\tYou can't call front() on an empty vector\"\n                << \"\\n\\tthis:   \" << this\n            );\n            return base_type::front(); \n        }\n\n    // ------------------------------------------------------\n\n        reference back(\n        ) \n        { \n            DLIB_CASSERT(size() > 0,\n                \"\\treference std_vector_c::back()\"\n                << \"\\n\\tYou can't call back() on an empty vector\"\n                << \"\\n\\tthis:   \" << this\n            );\n            return base_type::back(); \n        }\n\n    // ------------------------------------------------------\n\n        const_reference back(\n        ) const \n        { \n            DLIB_CASSERT(size() > 0,\n                \"\\tconst_reference std_vector_c::back()\"\n                << \"\\n\\tYou can't call back() on an empty vector\"\n                << \"\\n\\tthis:   \" << this\n            );\n            return base_type::back(); \n        }\n\n    // ------------------------------------------------------\n\n        void pop_back(\n        ) \n        { \n            DLIB_CASSERT(size() > 0,\n                \"\\tconst_reference std_vector_c::pop_back()\"\n                << \"\\n\\tYou can't call pop_back() on an empty vector\"\n                << \"\\n\\tthis:   \" << this\n            );\n            base_type::pop_back(); \n        }\n\n    // ------------------------------------------------------\n\n        iterator insert(\n            iterator position, \n            const T& x\n        ) \n        { \n            DLIB_CASSERT( begin() <= position && position <= end(), \n                \"\\titerator std_vector_c::insert(position,x)\"\n                << \"\\n\\tYou have called insert() with an invalid position\"\n                << \"\\n\\tthis:   \" << this\n            );\n            return base_type::insert(position, x); \n        }\n\n    // ------------------------------------------------------\n\n        void insert(\n            iterator position, \n            size_type n, \n            const T& x\n        ) \n        { \n            DLIB_CASSERT( begin() <= position && position <= end(), \n                \"\\tvoid std_vector_c::insert(position,n,x)\"\n                << \"\\n\\tYou have called insert() with an invalid position\"\n                << \"\\n\\tthis:   \" << this\n            );\n            base_type::insert(position, n, x); \n        }\n\n    // ------------------------------------------------------\n\n        template <typename InputIterator>\n        void insert(\n            iterator position,\n            InputIterator first, \n            InputIterator last\n        ) \n        { \n            DLIB_CASSERT( begin() <= position && position <= end(), \n                \"\\tvoid std_vector_c::insert(position,first,last)\"\n                << \"\\n\\tYou have called insert() with an invalid position\"\n                << \"\\n\\tthis:   \" << this\n            );\n            base_type::insert(position, first, last); \n        }\n\n    // ------------------------------------------------------\n\n        iterator erase(\n            iterator position\n        ) \n        { \n            DLIB_CASSERT( begin() <= position && position < end(), \n                \"\\titerator std_vector_c::erase(position)\"\n                << \"\\n\\tYou have called erase() with an invalid position\"\n                << \"\\n\\tthis:   \" << this\n            );\n            return base_type::erase(position); \n        }\n\n    // ------------------------------------------------------\n\n        iterator erase(\n            iterator first, \n            iterator last\n        ) \n        { \n            DLIB_CASSERT( begin() <= first && first <= last && last <= end(),\n                \"\\titerator std_vector_c::erase(first,last)\"\n                << \"\\n\\tYou have called erase() with an invalid range of iterators\"\n                << \"\\n\\tthis:   \" << this\n            );\n            return base_type::erase(first,last); \n        }\n\n    // ------------------------------------------------------\n\n\n    };\n\n// ----------------------------------------------------------------------------------------\n\n// Add these swaps just to make absolutely sure the specialized swap always gets called even\n// if the compiler is crappy and would otherwise mess it up.\n    template <typename T, typename Allocator>\n    void swap(std_vector_c<T,Allocator>& x, std_vector_c<T,Allocator>& y) { x.swap(y); }\n\n    template <typename T, typename Allocator>\n    void swap(std::vector<T,Allocator>& x, std_vector_c<T,Allocator>& y) { x.swap(y); }\n\n    template <typename T, typename Allocator>\n    void swap(std_vector_c<T,Allocator>& x, std::vector<T,Allocator>& y) { y.swap(x); }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T, typename alloc>\n    void serialize (\n        const std_vector_c<T,alloc>& item,\n        std::ostream& out\n    )\n    {\n        try\n        { \n            const unsigned long size = static_cast<unsigned long>(item.size());\n\n            serialize(size,out); \n            for (unsigned long i = 0; i < item.size(); ++i)\n                serialize(item[i],out);\n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while serializing object of type std_vector_c\"); }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T, typename alloc>\n    void deserialize (\n        std_vector_c<T, alloc>& item,\n        std::istream& in\n    )\n    {\n        try \n        { \n            unsigned long size;\n            deserialize(size,in); \n            item.resize(size);\n            for (unsigned long i = 0; i < size; ++i)\n                deserialize(item[i],in);\n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while deserializing object of type std_vector_c\"); }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T, typename alloc> \n    struct is_std_vector<std_vector_c<T,alloc> >        { const static bool value = true; };\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_STD_VECTOr_C_H_\n\n"
  },
  {
    "path": "benchmarks/dlib/stl_checked/std_vector_c_abstract.h",
    "content": "// Copyright (C) 2008  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_STD_VECTOr_C_ABSTRACT_H_\n#ifdef DLIB_STD_VECTOr_C_ABSTRACT_H_\n\n#include <vector>\n#include <algorithm>\n#include \"../assert.h\"\n\nnamespace dlib\n{\n\n    template <\n        typename T,\n        typename Allocator = std::allocator<T>\n        >\n    class std_vector_c : public std::vector<T,Allocator>\n    {\n        /*!\n            WHAT THIS OBJECT REPRESENTS\n                This object is a simple wrapper around the std::vector object.  It \n                provides an identical interface but also checks the preconditions of\n                each member function.  That is, if you violate a requires\n                clause the dlib::fatal_error exception is thrown. \n        !*/\n\n        typedef typename std::vector<T,Allocator> base_type;\n    public:\n        typedef typename Allocator::reference         reference;\n        typedef typename Allocator::const_reference   const_reference;\n        typedef typename base_type::iterator          iterator;       \n        typedef typename base_type::const_iterator    const_iterator; \n        typedef typename base_type::size_type         size_type;      \n        typedef typename base_type::difference_type   difference_type;\n        typedef T                                     value_type;\n        typedef Allocator                             allocator_type;\n        typedef typename Allocator::pointer           pointer;\n        typedef typename Allocator::const_pointer     const_pointer;\n        typedef std::reverse_iterator<iterator>       reverse_iterator;\n        typedef std::reverse_iterator<const_iterator> const_reverse_iterator;\n\n\n        explicit std_vector_c(\n            const Allocator& alloc = Allocator()\n        );\n        /*!\n            ensures\n                - #get_allocator() == alloc\n                - #size() == 0\n        !*/\n\n        explicit std_vector_c (\n            size_type n, \n            const T& value = T(),\n            const Allocator& alloc = Allocator()\n        );\n        /*!\n            ensures\n                - #size() == n\n                - #get_allocator() == alloc\n                - for all valid i:\n                    - (*this)[i] == value\n        !*/\n\n        template <typename InputIterator>\n        std_vector_c (\n            InputIterator first,\n            InputIterator last,\n            const Allocator& alloc = Allocator()\n        );\n        /*!\n            ensures\n                - #size() == std::distance(first,last)\n                - #get_allocator() == alloc\n                - std::equal(first, last, begin()) == true\n        !*/\n\n        std_vector_c(\n            const std::vector<T,Allocator>& x\n        );\n        /*!\n            ensures\n                - #*this == x\n        !*/\n\n        std_vector_c<T,Allocator>& operator= (\n            const std::vector<T,Allocator>& x\n        );\n        /*!\n            ensures\n                - #*this == x\n                - returns #*this\n        !*/\n\n        template <typename InputIterator>\n        void assign(\n            InputIterator first, \n            InputIterator last\n        );\n        /*!\n            ensures\n                - #size() == std::distance(first,last)\n                - std::equal(first, last, begin()) == true\n        !*/\n\n        void assign(\n            size_type n, \n            const T& value \n        ); \n        /*!\n            ensures\n                - #size() == n\n                - for all valid i:\n                    - (*this)[i] == value\n        !*/\n\n        allocator_type get_allocator(\n        ) const;\n        /*!\n            ensures\n                - returns the allocator used by this vector\n        !*/\n        \n        iterator begin(\n        );\n        /*!\n            ensures\n                - if (size() > 0) then\n                    - returns an iterator referring to the first element in \n                      this container.\n                - else\n                    - returns end()\n        !*/\n        \n        const_iterator begin(\n        ) const;\n        /*!\n            ensures\n                - if (size() > 0) then\n                    - returns a const_iterator referring to the first element in \n                      this container.\n                - else\n                    - returns end()\n        !*/\n\n        iterator end(\n        ); \n        /*!\n            ensures\n                - returns an iterator that represents one past the end of\n                  this container\n        !*/\n\n        const_iterator end(\n        ) const;\n        /*!\n            ensures\n                - returns an iterator that represents one past the end of\n                  this container\n        !*/\n\n        reverse_iterator rbegin(\n        );\n        /*!\n            ensures\n                - returns std::reverse_iterator(end())\n        !*/\n\n        const_reverse_iterator rbegin(\n        ) const;\n        /*!\n            ensures\n                - returns std::reverse_iterator(end())\n        !*/\n        \n        reverse_iterator rend(\n        );\n        /*!\n            ensures\n                - returns std::reverse_iterator(begin())\n        !*/\n\n        const_reverse_iterator rend(\n        ) const; \n        /*!\n            ensures\n                - returns std::reverse_iterator(begin())\n        !*/\n\n        size_type size(\n        ) const;  \n        /*!\n            ensures\n                - returns end()-begin()\n                  (i.e. returns the number of elements in this container)\n        !*/\n\n        size_type max_size(\n        ) const;\n        /*!\n            ensures\n                - returns the maximum number of elements this vector can contain\n        !*/\n\n        void resize(\n            size_type sz, \n            T c = T()\n        );\n        /*!\n            ensures\n                - #size() == sz\n                - any element with index between 0 and sz - 1 which was in the \n                  vector before the call to resize() retains its value and index.\n                  All other elements have a value given by c.\n        !*/\n\n        size_type capacity(\n        ) const;\n        /*!\n            ensures\n                - returns the total number of elements that the vector can hold without \n                  requiring reallocation. \n        !*/\n\n        bool empty(\n        ) const; \n        /*!\n            ensures\n                - if (size() == 0) then\n                    - returns true\n                - else\n                    - returns false\n        !*/\n\n        void reserve(\n            size_type n\n        ); \n        /*!\n            ensures\n                - #capacity() >= n\n        !*/\n\n        const_reference at(\n            size_type n\n        ) const; \n        /*!\n            ensures\n                - if (n < size()) then \n                    - returns a const reference to (*this)[n]\n                - else\n                    - throws std::out_of_range\n        !*/\n\n        reference at(\n            size_type n\n        ); \n        /*!\n            ensures\n                - if (n < size()) then \n                    - returns a reference to (*this)[n]\n                - else\n                    - throws std::out_of_range\n        !*/\n\n        void push_back(\n            const T& x\n        ); \n        /*!\n            ensures\n                - #size() == size() + 1\n                - #back() == x\n        !*/\n\n        void swap(\n            std_vector_c<T,Allocator>& x\n        );\n        /*!\n            ensures\n                - swaps the state of *this and x\n        !*/\n\n        void clear(\n        ); \n        /*!\n            ensures\n                - #size() == 0\n        !*/\n\n        reference operator[](\n            size_type n\n        ); \n        /*!\n            requires\n                - n < size()\n            ensures\n                - returns a reference to the nth element of this container\n        !*/\n\n        const_reference operator[](\n            size_type n\n        ) const;\n        /*!\n            requires\n                - n < size()\n            ensures\n                - returns a const reference to the nth element of this container\n        !*/\n\n        reference front(\n        );\n        /*!\n            requires\n                - size() > 0\n            ensures\n                - returns a reference to (*this)[0]\n        !*/\n\n        const_reference front(\n        ) const;\n        /*!\n            requires\n                - size() > 0\n            ensures\n                - returns a const reference to (*this)[0]\n        !*/\n\n        reference back(\n        );\n        /*!\n            requires\n                - size() > 0\n            ensures\n                - returns a reference to (*this)[size()-1]\n        !*/\n\n        const_reference back(\n        ) const;\n        /*!\n            requires\n                - size() > 0\n            ensures\n                - returns a const reference to (*this)[size()-1]\n        !*/\n\n        void pop_back(\n        );\n        /*!\n            requires\n                - size() > 0\n            ensures\n                - #size() == size() - 1\n                - removes the last element in the vector but leaves the others\n                  unmodified.\n        !*/\n\n        iterator insert(\n            iterator position, \n            const T& x\n        );\n        /*!\n            requires\n                - begin() <= position && position <= end()\n                  (i.e. position references an element in this vector object)\n            ensures\n                - #size() == size() + 1\n                - inserts a copy of x into *this before the given position\n                - returns an iterator that points to the copy of x inserted\n                  into *this\n        !*/\n\n        void insert(\n            iterator position, \n            size_type n, \n            const T& x\n        );\n        /*!\n            requires\n                - begin() <= position && position <= end()\n                  (i.e. position references an element in this vector object)\n            ensures\n                - #size() == size() + n\n                - inserts n copies of x into *this before the given position\n        !*/\n\n        template <typename InputIterator>\n        void insert(\n            iterator position,\n            InputIterator first, \n            InputIterator last\n        );\n        /*!\n            requires\n                - begin() <= position && position <= end()\n                  (i.e. position references an element in this vector object)\n                - first and last are not iterators into *this\n            ensures\n                - #size() == size() + std::distance(last,first)\n                - inserts copies of the range of elements [first,last) into *this \n                  before the given position\n        !*/\n\n        iterator erase(\n            iterator position\n        ); \n        /*!\n            requires\n                - begin() <= position && position < end()\n                  (i.e. position references an element in this vector object)\n            ensures\n                - #size() == size() - 1 \n                - removes the element in this vector referenced by position but\n                  leaves all other elements in this vector unmodified.\n                - if (position < end()-1) then\n                    - returns an iterator referencing the element immediately \n                      following *position prior to the erase.\n                - else\n                    - returns end()\n        !*/\n\n        iterator erase(\n            iterator first, \n            iterator last\n        );\n        /*!\n            requires\n                - begin() <= first && first <= last && last <= end()\n                  (i.e. the range [first,last) must be inside this container )\n            ensures\n                - #size() == size() - (last-first) \n                - removes the elements in this vector referenced by the\n                  iterator range [first,last) but leaves all other elements \n                  in this vector unmodified.\n                - if (last < end()-1) then\n                    - returns an iterator referencing the element immediately \n                      following *last prior to the erase.\n                - else\n                    - returns end()\n        !*/\n\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T, typename alloc>\n    void serialize (\n        const std_vector_c<T,alloc>& item,\n        std::ostream& out\n    );\n    /*!\n        provides serialization support \n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T, typename alloc>\n    void deserialize (\n        std_vector_c<T, alloc>& item,\n        std::istream& in\n    );\n    /*!\n        provides deserialization support \n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_STD_VECTOr_C_ABSTRACT_H_\n\n\n"
  },
  {
    "path": "benchmarks/dlib/stl_checked.h",
    "content": "// Copyright (C) 2008  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_STL_CHECKEd_HEADER\n#define DLIB_STL_CHECKEd_HEADER\n\n#include \"stl_checked/std_vector_c.h\"\n\n#endif // DLIB_STL_CHECKEd_HEADER\n\n\n"
  },
  {
    "path": "benchmarks/dlib/string/cassert",
    "content": "#include \"../dlib_include_path_tutorial.txt\"\n"
  },
  {
    "path": "benchmarks/dlib/string/iomanip",
    "content": "#include \"../dlib_include_path_tutorial.txt\"\n"
  },
  {
    "path": "benchmarks/dlib/string/iosfwd",
    "content": "#include \"../dlib_include_path_tutorial.txt\"\n"
  },
  {
    "path": "benchmarks/dlib/string/iostream",
    "content": "#include \"../dlib_include_path_tutorial.txt\"\n"
  },
  {
    "path": "benchmarks/dlib/string/locale",
    "content": "#include \"../dlib_include_path_tutorial.txt\"\n"
  },
  {
    "path": "benchmarks/dlib/string/string.h",
    "content": "// Copyright (C) 2006  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_STRINg_\n#define DLIB_STRINg_ \n\n#include \"string_abstract.h\"\n#include <sstream>\n#include \"../algs.h\"\n#include <string>\n#include <iostream>\n#include <iomanip>\n#include \"../error.h\"\n#include \"../assert.h\"\n#include \"../uintn.h\"\n#include <cctype>\n#include <algorithm>\n#include <vector>\n#include \"../enable_if.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    inline const typename disable_if<is_same_type<charT,char>,std::string>::type narrow (\n        const std::basic_string<charT,traits,alloc>& str\n    )\n    {\n        std::string temp;\n        temp.reserve(str.size());\n        std::string::size_type i;\n        for (i = 0; i < str.size(); ++i)\n        {\n            if (zero_extend_cast<unsigned long>(str[i]) > 255)\n                temp += ' ';\n            else\n                temp += zero_extend_cast<char>(str[i]);\n        }\n        return temp;\n    }\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    inline const typename enable_if<is_same_type<charT,char>,std::string>::type narrow (\n        const std::basic_string<charT,traits,alloc>& str\n    )\n    { \n        return str;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<char,traits,alloc> tolower (\n        const std::basic_string<char,traits,alloc>& str\n    )\n    {\n        std::basic_string<char,traits,alloc> temp;\n\n        temp.resize(str.size());\n\n        for (typename std::basic_string<char,traits,alloc>::size_type i = 0; i < str.size(); ++i)\n            temp[i] = (char)std::tolower(str[i]);\n\n        return temp;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<char,traits,alloc> toupper (\n        const std::basic_string<char,traits,alloc>& str\n    )\n    {\n        std::basic_string<char,traits,alloc> temp;\n\n        temp.resize(str.size());\n\n        for (typename std::basic_string<char,traits,alloc>::size_type i = 0; i < str.size(); ++i)\n            temp[i] = (char)std::toupper(str[i]);\n\n        return temp;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename traits,\n        typename alloc\n        >\n    bool strings_equal_ignore_case (\n        const std::basic_string<char,traits,alloc>& str1,\n        const std::basic_string<char,traits,alloc>& str2\n    )\n    {\n        if (str1.size() != str2.size())\n            return false;\n\n        for (typename std::basic_string<char,traits,alloc>::size_type i = 0; i < str1.size(); ++i)\n        {\n            if (std::tolower(str1[i]) != std::tolower(str2[i]))\n                return false;\n        }\n\n        return true;\n    }\n\n    template <\n        typename traits,\n        typename alloc\n        >\n    bool strings_equal_ignore_case (\n        const std::basic_string<char,traits,alloc>& str1,\n        const char* str2\n    )\n    {\n        typename std::basic_string<char,traits,alloc>::size_type i;\n        for (i = 0; i < str1.size(); ++i)\n        {\n            // if we hit the end of str2 then the strings aren't the same length\n            if (str2[i] == '\\0')\n                return false;\n\n            if (std::tolower(str1[i]) != std::tolower(str2[i]))\n                return false;\n        }\n\n        // This happens when str2 is longer than str1\n        if (str2[i] != '\\0')\n            return false;\n\n        return true;\n    }\n\n    template <\n        typename traits,\n        typename alloc\n        >\n    bool strings_equal_ignore_case (\n        const char* str1,\n        const std::basic_string<char,traits,alloc>& str2\n    )\n    {\n        return strings_equal_ignore_case(str2, str1);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename traits,\n        typename alloc\n        >\n    bool strings_equal_ignore_case (\n        const std::basic_string<char,traits,alloc>& str1,\n        const std::basic_string<char,traits,alloc>& str2,\n        unsigned long num\n    )\n    {\n        if (str1.size() != str2.size() && (str1.size() < num || str2.size() < num))\n            return false;\n\n        for (typename std::basic_string<char,traits,alloc>::size_type i = 0; i < str1.size() && i < num; ++i)\n        {\n            if (std::tolower(str1[i]) != std::tolower(str2[i]))\n                return false;\n        }\n\n        return true;\n    }\n\n    template <\n        typename traits,\n        typename alloc\n        >\n    bool strings_equal_ignore_case (\n        const std::basic_string<char,traits,alloc>& str1,\n        const char* str2,\n        unsigned long num\n    )\n    {\n        typename std::basic_string<char,traits,alloc>::size_type i;\n        for (i = 0; i < str1.size() && i < num; ++i)\n        {\n            // if we hit the end of str2 then the strings aren't the same length\n            if (str2[i] == '\\0')\n                return false;\n\n            if (std::tolower(str1[i]) != std::tolower(str2[i]))\n                return false;\n        }\n\n        return true;\n    }\n\n    template <\n        typename traits,\n        typename alloc\n        >\n    bool strings_equal_ignore_case (\n        const char* str1,\n        const std::basic_string<char,traits,alloc>& str2,\n        unsigned long num\n    )\n    {\n        return strings_equal_ignore_case(str2, str1, num);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    class cast_to_string_error : public error\n    {\n    public:\n        cast_to_string_error():error(ECAST_TO_STRING) {}\n    };\n\n    template <\n        typename T\n        >\n    const std::string cast_to_string (\n        const T& item \n    )\n    {\n        std::ostringstream sout;\n        sout << item;\n        if (!sout)\n            throw cast_to_string_error();\n        return sout.str();\n    }\n\n    // don't declare this if we are using mingw because it apparently doesn't\n    // support iostreams with wchar_t?\n#if !(defined(__MINGW32__) && (__GNUC__ < 4))\n    template <\n        typename T\n        >\n    const std::wstring cast_to_wstring (\n        const T& item \n    )\n    {\n        std::basic_ostringstream<wchar_t> sout;\n        sout << item;\n        if (!sout)\n            throw cast_to_string_error();\n        return sout.str();\n    }\n#endif\n\n// ----------------------------------------------------------------------------------------\n\n    inline std::string pad_int_with_zeros (\n        int i,\n        unsigned long width = 6\n    )\n    {\n        std::ostringstream sout;\n        sout << std::setw(width) << std::setfill('0') << i;\n        return sout.str();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    class string_cast_error : public error\n    {\n    public:\n        string_cast_error(const std::string& str):\n            error(ESTRING_CAST,\"string cast error: invalid string = '\" + str + \"'\") {}\n    };\n\n    template <\n        typename T\n        >\n    struct string_cast_helper\n    {\n        template < typename charT, typename traits, typename alloc >\n        static const T cast (\n            const std::basic_string<charT,traits,alloc>& str\n        )\n        {\n            using namespace std;\n            basic_istringstream<charT,traits,alloc> sin(str);\n            T temp;\n            sin >> temp;\n            if (!sin) throw string_cast_error(narrow(str));\n            if (sin.get() != std::char_traits<charT>::eof()) throw string_cast_error(narrow(str));   \n            return temp;\n        }\n    };\n\n    template <typename C, typename T, typename A>\n    struct string_cast_helper<std::basic_string<C,T,A> >\n    {\n        template < typename charT, typename traits, typename alloc >\n        static const std::basic_string<C,T,A> cast (\n            const std::basic_string<charT,traits,alloc>& str\n        )\n        {\n            std::basic_string<C,T,A> temp;\n            temp.resize(str.size());\n            for (unsigned long i = 0; i < str.size(); ++i)\n                temp[i] = zero_extend_cast<C>(str[i]);\n            return temp;\n        }\n    };\n\n    template <>\n    struct string_cast_helper<bool>\n    {\n        template < typename charT, typename traits, typename alloc >\n        static bool cast (\n            const std::basic_string<charT,traits,alloc>& str\n        )\n        {\n            using namespace std;\n            if (str.size() == 1 && str[0] == '1')\n                return true;\n            if (str.size() == 1 && str[0] == '0')\n                return false;\n            if (tolower(narrow(str)) == \"true\")\n                return true;\n            if (tolower(narrow(str)) == \"false\")\n                return false;\n\n            throw string_cast_error(narrow(str));\n        }\n    };\n\n#define DLIB_STRING_CAST_INTEGRAL(type)                             \\\n    template <>                                                     \\\n    struct string_cast_helper<type>                                 \\\n    {                                                               \\\n        template < typename charT, typename traits, typename alloc> \\\n        static type cast (                                    \\\n            const std::basic_string<charT,traits,alloc>& str        \\\n        )                                                           \\\n        {                                                           \\\n            using namespace std;                                    \\\n            basic_istringstream<charT,traits,alloc> sin(str);       \\\n            type temp;                                              \\\n            if (str.size() > 2 && str[0] == _dT(charT,'0') && str[1] == _dT(charT,'x'))   \\\n                sin >> hex >> temp;                                 \\\n            else                                                    \\\n                sin >> temp;                                        \\\n            if (!sin) throw string_cast_error(narrow(str));                 \\\n            if (sin.get() != std::char_traits<charT>::eof()) throw string_cast_error(narrow(str));     \\\n            return temp;                                            \\\n        }                                                           \\\n    };\n\n    DLIB_STRING_CAST_INTEGRAL(unsigned short)\n    DLIB_STRING_CAST_INTEGRAL(short)\n    DLIB_STRING_CAST_INTEGRAL(unsigned int)\n    DLIB_STRING_CAST_INTEGRAL(int)\n    DLIB_STRING_CAST_INTEGRAL(unsigned long)\n    DLIB_STRING_CAST_INTEGRAL(long)\n    DLIB_STRING_CAST_INTEGRAL(uint64)\n\n    template <\n        typename T,\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    inline const T string_cast (\n        const std::basic_string<charT,traits,alloc>& str\n    )\n    {\n        COMPILE_TIME_ASSERT(is_pointer_type<T>::value == false);\n        return string_cast_helper<T>::cast(str);\n    }\n\n    template <typename T>\n    inline const T string_cast (const char* str){ return string_cast<T>(std::string(str)); }\n    template <typename T>\n    inline const T string_cast (const wchar_t* str){ return string_cast<T>(std::wstring(str)); }\n\n// ----------------------------------------------------------------------------------------\n\n    class string_assign\n    {\n        template <\n            typename charT,\n            typename traits,\n            typename alloc\n            >\n        class string_assign_helper\n        {\n        public:\n            string_assign_helper (\n                const std::basic_string<charT,traits,alloc>& str_\n            ) : str(str_) {}\n\n            template <typename T>\n            operator T () const\n            {\n                return string_cast<T>(str);\n            }\n\n        private:\n\n            const std::basic_string<charT,traits,alloc>& str;\n        };\n\n    // -------------\n\n        class char_assign_helper\n        {\n        public:\n            char_assign_helper (\n                const char* str_\n            ) : str(str_) {}\n\n            template <typename T>\n            operator T () const\n            {\n                return string_cast<T>(str);\n            }\n\n        private:\n\n            const char* str;\n        };\n\n    // -------------\n\n        class wchar_t_assign_helper\n        {\n        public:\n            wchar_t_assign_helper (\n                const wchar_t* str_\n            ) : str(str_) {}\n\n            template <typename T>\n            operator T () const\n            {\n                return string_cast<T>(str);\n            }\n\n        private:\n\n            const wchar_t* str;\n        };\n\n    // -------------\n\n    public:\n\n        template <\n            typename charT,\n            typename traits,\n            typename alloc\n            >\n        string_assign_helper<charT,traits,alloc> operator=(\n            const std::basic_string<charT,traits,alloc>& str\n        ) const\n        {\n            return string_assign_helper<charT,traits,alloc>(str);\n        }\n\n        char_assign_helper operator= (\n            const char* str\n        ) const \n        {\n            return char_assign_helper(str);\n        }\n\n        wchar_t_assign_helper operator= (\n            const wchar_t* str\n        ) const \n        {\n            return wchar_t_assign_helper(str);\n        }\n    };\n\n    const string_assign sa = string_assign();\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<charT,traits,alloc> wrap_string (\n        const std::basic_string<charT,traits,alloc>& str,\n        const unsigned long first_pad = 0,\n        const unsigned long rest_pad = 0,\n        const unsigned long max_per_line = 79\n    )\n    {\n        DLIB_ASSERT ( first_pad < max_per_line && rest_pad < max_per_line && \n                 rest_pad >= first_pad,\n                 \"\\tconst std::basic_string<charT,traits,alloc> wrap_string()\"\n                 << \"\\n\\tfirst_pad:    \" << first_pad\n                 << \"\\n\\trest_pad:     \" << rest_pad\n                 << \"\\n\\tmax_per_line: \" << max_per_line  );\n\n        using namespace std;\n\n        basic_ostringstream<charT,traits,alloc> sout;\n        basic_istringstream<charT,traits,alloc> sin(str);\n\n        for (unsigned long i = 0; i < rest_pad; ++i)\n            sout << _dT(charT,\" \");\n        const basic_string<charT,traits,alloc> pad(sout.str());\n        sout.str(_dT(charT,\"\"));\n\n        for (unsigned long i = 0; i < first_pad; ++i)\n            sout << _dT(charT,\" \");\n\n\n        typename basic_string<charT,traits,alloc>::size_type remaining = max_per_line - rest_pad;\n\n        basic_string<charT,traits,alloc> temp;\n\n        sin >> temp;\n        while (sin)\n        {\n            if (temp.size() > remaining)\n            {\n                if (temp.size() + rest_pad >= max_per_line)\n                {\n                    string::size_type i = 0;\n                    for (; i < temp.size(); ++i)\n                    {\n                        sout << temp[i];\n                        --remaining;\n                        if (remaining == 0)\n                        {\n                            sout << _dT(charT,\"\\n\") << pad;\n                            remaining = max_per_line - rest_pad;\n                        }\n                    }\n                }\n                else\n                {\n                    sout << _dT(charT,\"\\n\") << pad << temp;\n                    remaining = max_per_line - rest_pad - temp.size();\n                }\n            }\n            else if (temp.size() == remaining)\n            {\n                sout << temp;\n                remaining = 0;\n            }\n            else\n            {\n                sout << temp;\n                remaining -= temp.size();\n            }\n\n            sin >> temp;\n            if (remaining == 0 && sin)\n            {\n                sout << _dT(charT,\"\\n\") << pad;\n                remaining = max_per_line - rest_pad;\n            }\n            else\n            {\n                sout << _dT(charT,\" \");\n                --remaining;\n            }\n        }\n\n        return sout.str();\n    }\n\n    template <\n        typename charT\n        >\n    const std::basic_string<charT> wrap_string (\n        const charT* str,\n        const unsigned long first_pad = 0,\n        const unsigned long rest_pad = 0,\n        const unsigned long max_per_line = 79\n    ) { return wrap_string(std::basic_string<charT>(str),first_pad,rest_pad,max_per_line); }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<charT,traits,alloc> ltrim (\n        const std::basic_string<charT,traits,alloc>& str,\n        const std::basic_string<charT,traits,alloc>& trim_chars \n    )\n    {\n        typedef std::basic_string<charT,traits,alloc> string;\n        typename string::size_type pos = str.find_first_not_of(trim_chars);\n        if (pos != string::npos)\n            return str.substr(pos);\n        else\n            return std::basic_string<charT,traits,alloc>();\n    }\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<charT,traits,alloc> ltrim (\n        const std::basic_string<charT,traits,alloc>& str,\n        const charT* trim_chars = _dT(charT,\" \\t\\r\\n\")\n    ) { return ltrim(str,std::basic_string<charT,traits,alloc>(trim_chars)); }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<charT,traits,alloc> rtrim (\n        const std::basic_string<charT,traits,alloc>& str,\n        const std::basic_string<charT,traits,alloc>& trim_chars \n    )\n    {\n        typedef std::basic_string<charT,traits,alloc> string;\n\n        typename string::size_type pos = str.find_last_not_of(trim_chars);\n        if (pos != string::npos)\n            return str.substr(0,pos+1);\n        else\n            return std::basic_string<charT,traits,alloc>();\n    }\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<charT,traits,alloc> rtrim (\n        const std::basic_string<charT,traits,alloc>& str,\n        const charT* trim_chars = _dT(charT,\" \\t\\r\\n\")\n    ) { return rtrim(str,std::basic_string<charT,traits,alloc>(trim_chars)); }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<charT,traits,alloc> trim (\n        const std::basic_string<charT,traits,alloc>& str,\n        const std::basic_string<charT,traits,alloc>& trim_chars \n    )\n    {\n        typedef std::basic_string<charT,traits,alloc> string;\n        typename string::size_type lpos = str.find_first_not_of(trim_chars); \n        if (lpos != string::npos)\n        {\n            typename string::size_type rpos = str.find_last_not_of(trim_chars);\n            return str.substr(lpos,rpos-lpos+1);\n        }\n        else\n        {\n            return std::basic_string<charT,traits,alloc>();\n        }\n    }\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<charT,traits,alloc> trim (\n        const std::basic_string<charT,traits,alloc>& str,\n        const charT* trim_chars = _dT(charT,\" \\t\\r\\n\")\n    ) { return trim(str,std::basic_string<charT,traits,alloc>(trim_chars)); }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<charT,traits,alloc> rpad (\n        const std::basic_string<charT,traits,alloc>& str,\n        long pad_length,\n        const std::basic_string<charT,traits,alloc>& pad_string \n    )\n    {\n        typedef std::basic_string<charT,traits,alloc> string;\n        // if str is too big then just return str\n        if (pad_length <= static_cast<long>(str.size()))\n            return str;\n\n        // make the string we will padd onto the string\n        string P;\n        while (P.size() < pad_length - str.size())\n            P += pad_string;\n        P = P.substr(0,pad_length - str.size());\n\n        // return the padded string\n        return str + P;\n    }\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<charT,traits,alloc> rpad (\n        const std::basic_string<charT,traits,alloc>& str,\n        long pad_length,\n        const charT* pad_string = _dT(charT,\" \")\n    ) { return rpad(str,pad_length,std::basic_string<charT,traits,alloc>(pad_string)); }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<charT,traits,alloc> lpad (\n        const std::basic_string<charT,traits,alloc>& str,\n        long pad_length,\n        const std::basic_string<charT,traits,alloc>& pad_string \n    )\n    {\n        typedef std::basic_string<charT,traits,alloc> string;\n        // if str is too big then just return str\n        if (pad_length <= static_cast<long>(str.size()))\n            return str;\n\n        // make the string we will padd onto the string\n        string P;\n        while (P.size() < pad_length - str.size())\n            P += pad_string;\n        P = P.substr(0,pad_length - str.size());\n\n        // return the padded string\n        return P + str;\n    }\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<charT,traits,alloc> lpad (\n        const std::basic_string<charT,traits,alloc>& str,\n        long pad_length,\n        const charT* pad_string = _dT(charT,\" \")\n    ) { return lpad(str,pad_length,std::basic_string<charT,traits,alloc>(pad_string)); }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<charT,traits,alloc> pad (\n        const std::basic_string<charT,traits,alloc>& str,\n        long pad_length,\n        const std::basic_string<charT,traits,alloc>& pad_string \n    )\n    {\n        const long str_size = static_cast<long>(str.size());\n        return rpad(lpad(str,(pad_length-str_size)/2 + str_size,pad_string),  \n                    pad_length, \n                    pad_string);\n    }\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<charT,traits,alloc> pad (\n        const std::basic_string<charT,traits,alloc>& str,\n        long pad_length,\n        const charT* pad_string = _dT(charT,\" \")\n    ) { return pad(str,pad_length,std::basic_string<charT,traits,alloc>(pad_string)); }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<charT,traits,alloc> left_substr (\n        const std::basic_string<charT,traits,alloc>& str,\n        const std::basic_string<charT,traits,alloc>& delim \n    )\n    {\n        return str.substr(0,str.find_first_of(delim));\n    }\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<charT,traits,alloc> left_substr (\n        const std::basic_string<charT,traits,alloc>& str,\n        const charT* delim = _dT(charT,\" \\n\\r\\t\")\n    )\n    {\n        return str.substr(0,str.find_first_of(delim));\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<charT,traits,alloc> right_substr (\n        const std::basic_string<charT,traits,alloc>& str,\n        const std::basic_string<charT,traits,alloc>& delim \n    )\n    {\n        typename std::basic_string<charT,traits,alloc>::size_type delim_pos = str.find_last_of(delim);\n        if (delim_pos != std::basic_string<charT,traits,alloc>::npos)\n            return str.substr(delim_pos+1);\n        else\n            return _dT(charT,\"\");\n    }\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<charT,traits,alloc> right_substr (\n        const std::basic_string<charT,traits,alloc>& str,\n        const charT* delim = _dT(charT,\" \\n\\r\\t\")\n    )\n    {\n        typename std::basic_string<charT,traits,alloc>::size_type delim_pos = str.find_last_of(delim);\n        if (delim_pos != std::basic_string<charT,traits,alloc>::npos)\n            return str.substr(delim_pos+1);\n        else\n            return _dT(charT,\"\");\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    std::pair<std::basic_string<charT,traits,alloc>, std::basic_string<charT,traits,alloc> > \n    split_on_first (\n        const std::basic_string<charT,traits,alloc>& str,\n        const charT* delim = _dT(charT,\" \\n\\r\\t\")\n    )\n    {\n        typename std::basic_string<charT,traits,alloc>::size_type delim_pos = str.find_first_of(delim);\n        if (delim_pos != std::basic_string<charT,traits,alloc>::npos)\n            return std::make_pair(str.substr(0, delim_pos), str.substr(delim_pos+1));\n        else\n            return std::make_pair(str, _dT(charT,\"\"));\n    }\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    inline std::pair<std::basic_string<charT,traits,alloc>, std::basic_string<charT,traits,alloc> > \n    split_on_first (\n        const std::basic_string<charT,traits,alloc>& str,\n        const std::basic_string<charT,traits,alloc>& delim \n    )\n    {\n        return split_on_first(str, delim.c_str());\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    std::pair<std::basic_string<charT,traits,alloc>, std::basic_string<charT,traits,alloc> > \n    split_on_last (\n        const std::basic_string<charT,traits,alloc>& str,\n        const charT* delim = _dT(charT,\" \\n\\r\\t\")\n    )\n    {\n        typename std::basic_string<charT,traits,alloc>::size_type delim_pos = str.find_last_of(delim);\n        if (delim_pos != std::basic_string<charT,traits,alloc>::npos)\n            return std::make_pair(str.substr(0, delim_pos), str.substr(delim_pos+1));\n        else\n            return std::make_pair(str, _dT(charT,\"\"));\n    }\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    inline std::pair<std::basic_string<charT,traits,alloc>, std::basic_string<charT,traits,alloc> > \n    split_on_last (\n        const std::basic_string<charT,traits,alloc>& str,\n        const std::basic_string<charT,traits,alloc>& delim \n    )\n    {\n        return split_on_last(str, delim.c_str());\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::vector<std::basic_string<charT,traits,alloc> > split (\n        const std::basic_string<charT,traits,alloc>& str,\n        const charT* delim = _dT(charT,\" \\n\\r\\t\")\n    )\n    {\n        std::basic_string<charT,traits,alloc> temp;\n\n        std::vector<std::basic_string<charT,traits,alloc> > res;\n\n        for (unsigned long i = 0; i < str.size(); ++i)\n        {\n            // check if delim contains the character str[i]\n            bool hit = false;\n            const charT* d = delim;\n            while (*d != '\\0')\n            {\n                if (str[i] == *d)\n                {\n                    hit = true;\n                    break;\n                }\n                ++d;\n            }\n\n            if (hit)\n            {\n                if (temp.size() != 0)\n                {\n                    res.push_back(temp);\n                    temp.clear();\n                }\n            }\n            else\n            {\n                temp.push_back(str[i]);\n            }\n        }\n\n        if (temp.size() != 0)\n            res.push_back(temp);\n\n        return res;\n    }\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::vector<std::basic_string<charT,traits,alloc> > split (\n        const std::basic_string<charT,traits,alloc>& str,\n        const std::basic_string<charT,traits,alloc>& delim \n    )\n    {\n        return split(str,delim.c_str());\n    }\n\n    inline const std::vector<std::string> split (\n        const char* str,\n        const char* delim = \" \\n\\r\\t\"\n    )\n    {\n        return split(std::string(str),delim);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_STRINg_\n\n"
  },
  {
    "path": "benchmarks/dlib/string/string_abstract.h",
    "content": "// Copyright (C) 2006  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_STRINg_ABSTRACT_\n#ifdef DLIB_STRINg_ABSTRACT_\n\n#include <string>\n#include <iostream>\n#include <vector>\n#include \"../error.h\"\n\nnamespace dlib\n{\n\n// ---------------------------------------------------------------------------------------- \n\n    class string_cast_error : public error\n    {\n    public:\n        string_cast_error():error(ECAST_TO_STRING) {}\n    };\n\n    template <\n        typename T,\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const T string_cast (\n        const std::basic_string<charT,traits,alloc>& str\n    );\n    /*!\n        requires\n            - T is not a pointer type\n        ensures\n            - returns str converted to T\n        throws\n            - string_cast_error\n                This exception is thrown if string_cast() is unable to convert\n                str into a T.  Also, string_cast_error::info == str\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    class string_assign\n    {\n        /*!\n            WHAT THIS OBJECT REPRESENTS\n                This is a simple tool which provides an alternative syntax for using\n                the string_cast() function.  It can be understood by considering\n                the following example:\n\n                    string_assign sa;\n                    int val;\n                    double dval;\n\n                    val  = sa = \"1234\";   // executes: val = string_cast<int>(\"1234\");\n                    dval = sa = \"3.141\";  // executes: val = string_cast<double>(\"3.141\");\n\n                After executing, val will be equal to 1234 and dval will be 3.141.\n                Note that you can use string_assign to assign to any type which you could\n                use with string_cast(), except for std::basic_string, assigning to this\n                type is ambiguous for boring technical reasons.  But there isn't much\n                point in using this tool to assign from one string to another so it doesn't \n                matter.   \n\n                Additionally, note that there is a global instance of this object, dlib::sa. \n                So you never have to create a string_assign object yourself.  Finally, this \n                object is totally stateless and threadsafe.   \n        !*/\n    };\n\n    const string_assign sa = string_assign();\n\n// ----------------------------------------------------------------------------------------\n\n    class cast_to_string_error : public error\n    {\n    public:\n        cast_to_string_error():error(ECAST_TO_STRING) {}\n    };\n\n    template <\n        typename T\n        >\n    const std::string cast_to_string (\n        const T& item \n    );\n    /*!\n        requires\n            - T is not a pointer type\n        ensures\n            - returns item converted to std::string\n        throws\n            - cast_to_string_error\n                This exception is thrown if cast_to_string() is unable to convert\n                item into a std::string.  \n    !*/\n\n    template <\n        typename T\n        >\n    const std::wstring cast_to_wstring (\n        const T& item \n    );\n    /*!\n        requires\n            - T is not a pointer type\n        ensures\n            - returns item converted to std::wstring\n        throws\n            - cast_to_string_error\n                This exception is thrown if cast_to_string() is unable to convert\n                item into a std::string.  \n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    std::string pad_int_with_zeros (\n        int i,\n        unsigned long width = 6\n    );\n    /*!\n        ensures\n            - converts i into a string of at least width characters in length.  If\n              necessary, the string will be padded with leading zeros to get\n              to width characters.\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::string narrow (\n        const std::basic_string<charT,traits,alloc>& str\n    );\n    /*!\n        ensures\n            - returns str as a std::string by converting every character in it to a char.\n              Note that any characters that do not have a mapping to type char will be \n              converted to a space.\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<charT,traits,alloc> wrap_string (\n        const std::basic_string<charT,traits,alloc>& str,\n        const unsigned long first_pad = 0,\n        const unsigned long rest_pad = 0,\n        const unsigned long max_per_line = 79\n    );\n    /*!\n        requires\n            - first_pad < max_per_line\n            - rest_pad < max_per_line\n            - rest_pad >= first_pad\n        ensures\n            - returns a copy of str S such that:\n                - S is broken up into lines separated by the \\n character.\n                - The first line starts with first_pad space characters.\n                - The second and all subsequent lines start with rest_pad space characters.\n                - The first line is no longer than max_per_line - (rest_pad-first_pad) characters.\n                - The second and all subsequent lines are no longer than max_per_line characters. \n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename traits \n        typename alloc\n        >\n    const std::basic_string<char,traits,alloc> tolower (\n        const std::basic_string<char,traits,alloc>& str\n    );\n    /*!\n        ensures\n            - returns a copy of str S such that:\n                - #S.size() == str.size()\n                - #S[i] == std::tolower(str[i])\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<char,traits,alloc> toupper (\n        const std::basic_string<char,traits,alloc>& str\n    );\n    /*!\n        ensures\n            - returns a copy of str S such that:\n                - #S.size() == str.size()\n                - #S[i] == std::toupper(str[i])\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename traits,\n        typename alloc\n        >\n    bool strings_equal_ignore_case (\n        const std::basic_string<char,traits,alloc>& str1,\n        const std::basic_string<char,traits,alloc>& str2\n    );\n    /*!\n        ensures\n            - returns tolower(str1) == tolower(str2)\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename traits,\n        typename alloc\n        >\n    bool strings_equal_ignore_case (\n        const std::basic_string<char,traits,alloc>& str1,\n        const std::basic_string<char,traits,alloc>& str2,\n        unsigned long num\n    );\n    /*!\n        ensures\n            - returns tolower(str1.substr(0,num)) == tolower(str2.substr(0,num))\n              (i.e. only compares the first num characters)\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<charT,traits,alloc> ltrim (\n        const std::basic_string<charT,traits,alloc>& str,\n        const std::basic_string<charT,traits,alloc>& trim_chars \n    );\n    /*!\n        ensures\n            - returns a copy of str with any leading trim_chars  \n              from the left side of the string removed. \n    !*/\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<charT,traits,alloc> ltrim (\n        const std::basic_string<charT,traits,alloc>& str,\n        const charT* trim_chars = _dT(charT,\" \\t\\r\\n\")\n    );\n    /*!\n        requires\n            - trim_chars == a valid null-terminated C string\n        ensures\n            - returns ltrim(str, std::basic_string<charT,traits,alloc>(trim_chars))\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<charT,traits,alloc> rtrim (\n        const std::basic_string<charT,traits,alloc>& str,\n        const std::basic_string<charT,traits,alloc>& trim_chars \n    );\n    /*!\n        ensures\n            - returns a copy of str with any trailing trim_chars \n              from the right side of the string removed. \n    !*/\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<charT,traits,alloc> rtrim (\n        const std::basic_string<charT,traits,alloc>& str,\n        const charT* trim_chars = _dT(charT,\" \\t\\r\\n\")\n    );\n    /*!\n        requires\n            - trim_chars == a valid null-terminated C string\n        ensures\n            - returns rtrim(str, std::basic_string<charT,traits,alloc>(trim_chars))\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<charT,traits,alloc> trim (\n        const std::basic_string<charT,traits,alloc>& str,\n        const std::basic_string<charT,traits,alloc>& trim_chars \n    );\n    /*!\n        ensures\n            - returns a copy of str with any leading or trailing trim_chars \n              from the ends of the string removed. \n    !*/\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<charT,traits,alloc> trim (\n        const std::basic_string<charT,traits,alloc>& str,\n        const charT* trim_chars = _dT(charT,\" \\t\\r\\n\")\n    );\n    /*!\n        requires\n            - trim_chars == a valid null-terminated C string\n        ensures\n            - returns trim(str, std::basic_string<charT,traits,alloc>(trim_chars))\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<charT,traits,alloc> rpad (\n        const std::basic_string<charT,traits,alloc>& str,\n        long pad_length,\n        const std::basic_string<charT,traits,alloc>& pad_string \n    );\n    /*!\n        ensures\n            - if (pad_length <= str.size()) then\n                - returns str\n            - else\n                - let P be a string defined as follows:\n                    - P.size() == pad_length - str.size()\n                    - P == (pad_string + pad_string + ... + pad_string).substr(0,pad_length - str.size())\n                      (i.e. P == a string with the above specified size that contains just\n                      repitions of the pad_string)\n                - returns the string str + P \n    !*/\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<charT,traits,alloc> rpad (\n        const std::basic_string<charT,traits,alloc>& str,\n        long pad_length,\n        const charT* pad_string = _dT(charT,\" \")\n    );\n    /*!\n        requires\n            - pad_string == a valid null-terminated C string\n        ensures\n            - returns rpad(str, pad_length, std::basic_string<charT,traits,alloc>(pad_string))\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<charT,traits,alloc> lpad (\n        const std::basic_string<charT,traits,alloc>& str,\n        long pad_length,\n        const std::basic_string<charT,traits,alloc>& pad_string \n    );\n    /*!\n        ensures\n            - if (pad_length <= str.size()) then\n                - returns str\n            - else\n                - let P be a string defined as follows:\n                    - P.size() == pad_length - str.size()\n                    - P == (pad_string + pad_string + ... + pad_string).substr(0,pad_length - str.size())\n                      (i.e. P == a string with the above specified size that contains just\n                      repitions of the pad_string)\n                - returns the string P + str\n    !*/\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<charT,traits,alloc> lpad (\n        const std::basic_string<charT,traits,alloc>& str,\n        long pad_length,\n        const charT* pad_string = _dT(charT,\" \")\n    );\n    /*!\n        requires\n            - pad_string == a valid null-terminated C string\n        ensures\n            - returns lpad(str, pad_length, std::basic_string<charT,traits,alloc>(pad_string))\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<charT,traits,alloc> pad (\n        const std::basic_string<charT,traits,alloc>& str,\n        long pad_length,\n        const std::basic_string<charT,traits,alloc>& pad_string \n    );\n    /*!\n        ensures\n            - let str_size == static_cast<long>(str.size())\n            - returns rpad( lpad(str, (pad_length-str_size)/2 + str_size, pad_string),  \n                            pad_length, \n                            pad_string);\n    !*/\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<charT,traits,alloc> pad (\n        const std::basic_string<charT,traits,alloc>& str,\n        long pad_length,\n        const charT* pad_string = _dT(charT,\" \")\n    );\n    /*!\n        requires\n            - pad_string == a valid null-terminated C string\n        ensures\n            - returns pad(str, pad_length, std::basic_string<charT,traits,alloc>(pad_string))\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<charT,traits,alloc> left_substr (\n        const std::basic_string<charT,traits,alloc>& str,\n        const std::basic_string<charT,traits,alloc>& delim \n    );\n    /*!\n        ensures\n            - let delim_pos = str.find_first_of(delim)\n            - returns str.substr(0,delim_pos)\n    !*/\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<charT,traits,alloc> left_substr (\n        const std::basic_string<charT,traits,alloc>& str,\n        const charT* delim = _dT(charT,\" \\n\\r\\t\")\n    );\n    /*!\n        requires\n            - delim == a valid null-terminated C string\n        ensures\n            - returns left_substr(str, std::basic_string<charT,traits,alloc>(delim))\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::basic_string<charT,traits,alloc> right_substr (\n        const std::basic_string<charT,traits,alloc>& str,\n        const std::basic_string<charT,traits,alloc>& delim \n    );\n    /*!\n        ensures\n            - let delim_pos = str.find_last_of(delim)\n            - if (delim_pos == std::string::npos) then\n                - returns \"\"\n            - else\n                - returns str.substr(delim_pos+1)\n    !*/\n\n    template <\n        typename charT,\n        typename traits\n        typename alloc\n        >\n    const std::basic_string<charT,traits,alloc> right_substr (\n        const std::basic_string<charT,traits,alloc>& str,\n        const charT* delim = _dT(charT,\" \\n\\r\\t\")\n    );\n    /*!\n        requires\n            - delim == a valid null-terminated C string\n        ensures\n            - returns right_substr(str, std::basic_string<charT,traits,alloc>(delim))\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    std::pair<std::basic_string<charT,traits,alloc>, std::basic_string<charT,traits,alloc> > \n    split_on_first (\n        const std::basic_string<charT,traits,alloc>& str,\n        const charT* delim = _dT(charT, \" \\n\\r\\t\")\n    );\n    /*!\n        ensures\n            - This function splits string into two parts, the split is based on the first\n              occurrence of any character from delim.  \n            - let delim_pos = str.find_first_of(delim)\n            - if (delim_pos == std::string::npos) then\n                - returns make_pair(str,\"\")\n            - else\n                - return make_pair(str.substr(0, delim_pos), str.substr(delim_pos+1));\n    !*/\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    std::pair<std::basic_string<charT,traits,alloc>, std::basic_string<charT,traits,alloc> > \n    split_on_first (\n        const std::basic_string<charT,traits,alloc>& str,\n        const std::basic_string<charT,traits,alloc>& delim \n    );\n    /*!\n        requires\n            - delim == a valid null-terminated C string\n        ensures\n            - returns split_on_first(str, delim.c_str())\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    std::pair<std::basic_string<charT,traits,alloc>, std::basic_string<charT,traits,alloc> > \n    split_on_last (\n        const std::basic_string<charT,traits,alloc>& str,\n        const charT* delim = _dT(charT, \" \\n\\r\\t\")\n    );\n    /*!\n        ensures\n            - This function splits string into two parts, the split is based on the last \n              occurrence of any character from delim.  \n            - let delim_pos = str.find_last_of(delim)\n            - if (delim_pos == std::string::npos) then\n                - returns make_pair(str,\"\")\n            - else\n                - return make_pair(str.substr(0, delim_pos), str.substr(delim_pos+1));\n    !*/\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    std::pair<std::basic_string<charT,traits,alloc>, std::basic_string<charT,traits,alloc> > \n    split_on_last (\n        const std::basic_string<charT,traits,alloc>& str,\n        const std::basic_string<charT,traits,alloc>& delim \n    );\n    /*!\n        requires\n            - delim == a valid null-terminated C string\n        ensures\n            - returns split_on_last(str, delim.c_str())\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::vector<std::basic_string<charT,traits,alloc> > split (\n        const std::basic_string<charT,traits,alloc>& str,\n        const std::basic_string<charT,traits,alloc>& delim \n    );\n    /*!\n        ensures\n            - Breaks the given string str into a sequence of substrings delimited\n              by characters in delim and returns the results.  \n            - returns a vector V such that:\n                - V.size() == the number of substrings found in str.\n                - for all i: V[i] == The ith substring.  Note that it will not contain\n                  any delimiter characters (i.e. characters in delim).  It will also\n                  never be an empty string.\n                - V contains the substrings in the order in which they appear in str.\n                  That is, V[0] contains the first substring, V[1] the second, and\n                  so on.\n    !*/\n\n    template <\n        typename charT,\n        typename traits,\n        typename alloc\n        >\n    const std::vector<std::basic_string<charT,traits,alloc> > split (\n        const std::basic_string<charT,traits,alloc>& str,\n        const charT* delim = _dT(charT,\" \\n\\r\\t\")\n    );\n    /*!\n        requires\n            - trim_chars == a valid null-terminated C string\n        ensures\n            - returns split(str, std::basic_string<charT,traits,alloc>(delim))\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_STRINg_ABSTRACT_\n\n"
  },
  {
    "path": "benchmarks/dlib/string.h",
    "content": "// Copyright (C) 2006  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_STRINg_TOP_\n#define DLIB_STRINg_TOP_ \n\n#include \"string/string.h\"\n\n#endif // DLIB_STRINg_TOP_\n\n"
  },
  {
    "path": "benchmarks/dlib/test_for_odr_violations.cpp",
    "content": "// Copyright (C) 2014  Davis E. King (davis@dlib.net)\r\n// License: Boost Software License   See LICENSE.txt for the full license.\r\n#ifndef DLIB_TEST_FOR_ODR_VIOLATIONS_CPp_\r\n#define DLIB_TEST_FOR_ODR_VIOLATIONS_CPp_\r\n\r\n#include \"test_for_odr_violations.h\"\r\n\r\nextern \"C\"\r\n{\r\n// The point of this block of code is to cause a link time error that will prevent a user\r\n// from compiling part of their application with DLIB_ASSERT enabled and part with them\r\n// disabled since doing that would be a violation of C++'s one definition rule. \r\n#ifdef ENABLE_ASSERTS\r\n    const int USER_ERROR__inconsistent_build_configuration__see_dlib_faq_1 = 0;\r\n#else\r\n    const int USER_ERROR__inconsistent_build_configuration__see_dlib_faq_1_ = 0;\r\n#endif\r\n\r\n\r\n// The point of this block of code is to cause a link time error if someone builds dlib via\r\n// cmake as a separately installable library, and therefore generates a dlib/config.h from\r\n// cmake, but then proceeds to use the default unconfigured dlib/config.h from version\r\n// control.  It should be obvious why this is bad, if it isn't you need to read a book\r\n// about C++.  Moreover, it can only happen if someone manually copies files around and\r\n// messes things up.  If instead they run `make install` or `cmake --build .  --target\r\n// install` things will be setup correctly, which is what they should do.  To summarize: DO\r\n// NOT BUILD A STANDALONE DLIB AND THEN GO CHERRY PICKING FILES FROM THE BUILD FOLDER AND\r\n// MIXING THEM WITH THE SOURCE FROM GITHUB.  USE CMAKE'S INSTALL SCRIPTS TO INSTALL DLIB.\r\n// Or even better, don't install dlib at all and instead build your program as shown in\r\n// examples/CMakeLists.txt\r\n#if defined(DLIB_NOT_CONFIGURED) && !defined(DLIB__CMAKE_GENERATED_A_CONFIG_H_FILE)\r\n    const int USER_ERROR__inconsistent_build_configuration__see_dlib_faq_2 = 0;\r\n#endif\r\n\r\n\r\n\r\n\r\n\r\n#ifdef DLIB_CHECK_FOR_VERSION_MISMATCH\r\n    const int DLIB_CHECK_FOR_VERSION_MISMATCH = 0;\r\n#endif\r\n\r\n}\r\n\r\n\r\n#endif // DLIB_TEST_FOR_ODR_VIOLATIONS_CPp_\r\n\r\n"
  },
  {
    "path": "benchmarks/dlib/test_for_odr_violations.h",
    "content": "// Copyright (C) 2014  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_TEST_FOR_ODR_VIOLATIONS_H_\n#define DLIB_TEST_FOR_ODR_VIOLATIONS_H_\n\n#include \"assert.h\"\n#include \"config.h\"\n\nextern \"C\"\n{\n// =========================>>> WHY YOU ARE GETTING AN ERROR HERE <<<=========================\n// The point of this block of code is to cause a link time error that will prevent a user\n// from compiling part of their application with DLIB_ASSERT enabled and part with it\n// disabled since doing that would be a violation of C++'s one definition rule.  So if you\n// are getting an error here then you are either not enabling DLIB_ASSERT consistently\n// (e.g. by compiling part of your program in a debug mode and part in a release mode) or\n// you have simply forgotten to compile dlib/all/source.cpp into your application.\n// =========================>>> WHY YOU ARE GETTING AN ERROR HERE <<<=========================\n#ifdef ENABLE_ASSERTS\n    const extern int USER_ERROR__inconsistent_build_configuration__see_dlib_faq_1;\n    const int DLIB_NO_WARN_UNUSED dlib_check_assert_helper_variable = USER_ERROR__inconsistent_build_configuration__see_dlib_faq_1;\n#endif\n\n\n\n// The point of this block of code is to cause a link time error if someone builds dlib via\n// cmake as a separately installable library, and therefore generates a dlib/config.h from\n// cmake, but then proceeds to use the default unconfigured dlib/config.h from version\n// control.  It should be obvious why this is bad, if it isn't you need to read a book\n// about C++.  Moreover, it can only happen if someone manually copies files around and\n// messes things up.  If instead they run `make install` or `cmake --build .  --target\n// install` things will be setup correctly, which is what they should do.  To summarize: DO\n// NOT BUILD A STANDALONE DLIB AND THEN GO CHERRY PICKING FILES FROM THE BUILD FOLDER AND\n// MIXING THEM WITH THE SOURCE FROM GITHUB.  USE CMAKE'S INSTALL SCRIPTS TO INSTALL DLIB.\n// Or even better, don't install dlib at all and instead build your program as shown in\n// examples/CMakeLists.txt\n#if defined(DLIB_NOT_CONFIGURED) && !defined(DLIB__CMAKE_GENERATED_A_CONFIG_H_FILE)\n    const extern int USER_ERROR__inconsistent_build_configuration__see_dlib_faq_2;\n    const int DLIB_NO_WARN_UNUSED dlib_check_not_configured_helper_variable = USER_ERROR__inconsistent_build_configuration__see_dlib_faq_2;\n#endif\n\n\n\n// Cause the user to get a linker error if they try to use header files from one version of\n// dlib with the compiled binary from a different version of dlib.\n#ifdef DLIB_CHECK_FOR_VERSION_MISMATCH\n    const extern int DLIB_CHECK_FOR_VERSION_MISMATCH;\n    const int DLIB_NO_WARN_UNUSED dlib_check_for_version_mismatch = DLIB_CHECK_FOR_VERSION_MISMATCH;\n#endif\n\n}\n\n#endif // DLIB_TEST_FOR_ODR_VIOLATIONS_H_\n\n"
  },
  {
    "path": "benchmarks/dlib/threads/async.h",
    "content": "// Copyright (C) 2016  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_AsYNC_Hh_\n#define DLIB_AsYNC_Hh_ \n\n// C++11 things don't work in old versions of visual studio \n#if !defined( _MSC_VER) ||  _MSC_VER >= 1900\n\n#include \"async_abstract.h\"\n#include \"thread_pool_extension.h\"\n#include <future>\n#include <functional>\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    namespace impl\n    {\n        template <typename T> struct selector {};\n\n        template <typename T, typename U, typename V>\n        void call_prom_set_value(\n            T& prom,\n            U& fun,\n            selector<V> \n        )\n        {\n            prom.set_value(fun());\n        }\n\n        template <typename T, typename U>\n        void call_prom_set_value(\n            T& prom,\n            U& fun,\n            selector<void>\n        )\n        {\n            fun();\n            prom.set_value();\n        }\n\n        template <typename> struct result_of;\n\n#if (__cplusplus >= 201703L ||                          \\\n     (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)) && \\\n    __cpp_lib_is_invocable >= 201703L\n        template <typename F, typename... Args>\n        struct result_of<F(Args...)> : std::invoke_result<F, Args...> {};\n#else\n        template <typename F, typename... Args>\n        struct result_of<F(Args...)>\n                : std::result_of<F&&(Args&&...)> {};\n#endif\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    thread_pool& default_thread_pool();\n\n// ----------------------------------------------------------------------------------------\n\n    template < \n        typename Function, \n        typename ...Args\n        >\n    std::future<typename impl::result_of<Function(Args...)>::type> async(\n        thread_pool& tp, \n        Function&& f, \n        Args&&... args \n    )\n    {\n        auto prom = std::make_shared<std::promise<typename impl::result_of<Function(Args...)>::type>>();\n        std::future<typename impl::result_of<Function(Args...)>::type> ret = prom->get_future();\n        using bind_t = decltype(std::bind(std::forward<Function>(f), std::forward<Args>(args)...));\n        auto fun = std::make_shared<bind_t>(std::bind(std::forward<Function>(f), std::forward<Args>(args)...));\n        tp.add_task_by_value([fun, prom]()\n        { \n            try\n            {\n                impl::call_prom_set_value(*prom, *fun, impl::selector<typename impl::result_of<Function(Args...)>::type>());\n            }\n            catch(...)\n            {\n                prom->set_exception(std::current_exception());\n            }\n        });\n        return ret;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template < \n        typename Function, \n        typename ...Args\n        >\n    std::future<typename impl::result_of<Function(Args...)>::type> async(\n        Function&& f, \n        Args&&... args \n    )\n    {\n        return async(default_thread_pool(), std::forward<Function>(f), std::forward<Args>(args)...);\n    }\n\n}\n\n// ----------------------------------------------------------------------------------------\n\n#ifdef NO_MAKEFILE\n#include \"async.cpp\"\n#endif\n\n#endif\n#endif // DLIB_AsYNC_Hh_\n\n\n\n"
  },
  {
    "path": "benchmarks/dlib/threads/async_abstract.h",
    "content": "// Copyright (C) 2016  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_AsYNC_ABSTRACT_Hh_\n#ifdef DLIB_AsYNC_ABSTRACT_Hh_ \n\n#include \"thread_pool_extension_abstract.h\"\n#include <future>\n#include <functional>\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    thread_pool& default_thread_pool(\n    );\n    /*!\n        ensures\n            - returns a reference to a global thread_pool.  If the DLIB_NUM_THREADS\n              environment variable is set to an integer then the thread pool will contain\n              DLIB_NUM_THREADS threads, otherwise it will contain\n              std::thread::hardware_concurrency() threads.\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template < \n        typename Function, \n        typename ...Args\n        >\n    std::future<typename std::result_of<Function(Args...)>::type> async(\n        thread_pool& tp, \n        Function&& f, \n        Args&&... args \n    );\n    /*!\n        requires\n            - f must be a function and f(args...) must be a valid expression.\n        ensures\n            - This function behaves just like std::async(std::launch::async, f, args)\n              except that instead of spawning a new thread to process each task it submits\n              the task to the provided dlib::thread_pool.  Therefore, dlib::async() is\n              guaranteed to use a bounded number of threads unlike std::async().  This also\n              means that calls to dlib::async() will block if there aren't any free threads\n              in the thread pool.\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template < \n        typename Function, \n        typename ...Args\n        >\n    std::future<typename std::result_of<Function(Args...)>::type> async(\n        Function&& f, \n        Args&&... args \n    );\n    /*!\n        ensures\n            - Calling this function is equivalent to directly calling async(default_thread_pool(), f, args...)\n    !*/\n}\n\n// ----------------------------------------------------------------------------------------\n\n#endif // DLIB_AsYNC_ABSTRACT_Hh_\n\n"
  },
  {
    "path": "benchmarks/dlib/threads/auto_mutex_extension.h",
    "content": "// Copyright (C) 2005  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_AUTO_MUTEX_EXTENSIOn_\n#define DLIB_AUTO_MUTEX_EXTENSIOn_\n\n#include \"threads_kernel.h\"\n#include \"rmutex_extension.h\"\n#include \"read_write_mutex_extension.h\"\n#include \"auto_mutex_extension_abstract.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    class auto_mutex\n    {\n        /*!\n            INITIAL VALUE\n                - if (m != 0) then\n                    - the mutex pointed to by m is locked\n                - if (r != 0) then\n                    - the mutex pointed to by r is locked\n                - if (rw != 0) then\n                    - the mutex pointed to by rw is locked\n                - exactly one of r, m, or rw is not 0.\n\n            CONVENTION\n                - if (m != 0) then\n                    - the mutex pointed to by m is locked\n                - if (r != 0) then\n                    - the mutex pointed to by r is locked\n                - if (rw != 0) then\n                    - the mutex pointed to by rw is locked\n                - exactly one of r, m, or rw is not 0.\n        !*/\n    public:\n\n        explicit auto_mutex (\n            const mutex& m_\n        ) : m(&m_),\n            r(0),\n            rw(0)\n        {\n            m->lock();\n        }\n\n        explicit auto_mutex (\n            const rmutex& r_\n        ) : m(0),\n            r(&r_),\n            rw(0)\n        {\n            r->lock();\n        }\n\n        explicit auto_mutex (\n            const read_write_mutex& rw_\n        ) : m(0),\n            r(0),\n            rw(&rw_)\n        {\n            rw->lock();\n        }\n\n        void unlock()\n        {\n            if (m != 0)\n            {\n                m->unlock();\n                m = 0;\n            }\n            else if (r != 0)\n            {\n                r->unlock();\n                r = 0;\n            }\n            else if (rw != 0)\n            {\n                rw->unlock();\n                rw = 0;\n            }\n        }\n\n        ~auto_mutex (\n        )\n        {\n            unlock();\n        }\n\n    private:\n\n        const mutex* m;\n        const rmutex* r;\n        const read_write_mutex* rw;\n\n        // restricted functions\n        auto_mutex(auto_mutex&);        // copy constructor\n        auto_mutex& operator=(auto_mutex&);    // assignment operator\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    class auto_mutex_readonly\n    {\n    public:\n\n        explicit auto_mutex_readonly (\n            const read_write_mutex& rw_\n        ) : rw(rw_), _has_write_lock(false), _has_read_lock(true)\n        {\n            rw.lock_readonly();\n        }\n\n        ~auto_mutex_readonly (\n        )\n        {\n            unlock();\n        }\n\n        void lock_readonly (\n        )\n        {\n            if (!_has_read_lock)\n            {\n                unlock();\n                rw.lock_readonly();\n                _has_read_lock = true;\n            }\n        }\n\n        void lock_write (\n        )\n        {\n            if (!_has_write_lock)\n            {\n                unlock();\n                rw.lock();\n                _has_write_lock = true;\n            }\n        }\n\n        void unlock (\n        )\n        {\n            if (_has_write_lock)\n            {\n                rw.unlock();\n                _has_write_lock = false;\n            }\n            else if (_has_read_lock)\n            {\n                rw.unlock_readonly();\n                _has_read_lock = false;\n            }\n        }\n\n        bool has_read_lock (\n        ) { return _has_read_lock; }\n\n        bool has_write_lock (\n        ) { return _has_write_lock; }\n\n    private:\n\n        const read_write_mutex& rw;\n        bool _has_write_lock;\n        bool _has_read_lock;\n\n        // restricted functions\n        auto_mutex_readonly(auto_mutex_readonly&);        // copy constructor\n        auto_mutex_readonly& operator=(auto_mutex_readonly&);    // assignment operator\n    };\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_AUTO_MUTEX_EXTENSIOn_\n\n"
  },
  {
    "path": "benchmarks/dlib/threads/auto_mutex_extension_abstract.h",
    "content": "// Copyright (C) 2005  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_AUTO_MUTEX_EXTENSIOn_ABSTRACT_\n#ifdef DLIB_AUTO_MUTEX_EXTENSIOn_ABSTRACT_\n\n#include \"threads_kernel_abstract.h\"\n#include \"rmutex_extension_abstract.h\"\n#include \"read_write_mutex_extension_abstract.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    class auto_mutex\n    {\n        /*!\n            INITIAL VALUE\n                The mutex given in the constructor is locked and associated with this \n                object.\n\n            WHAT THIS OBJECT REPRESENTS\n                This object represents a mechanism for automatically locking and unlocking\n                a mutex object.\n        !*/\n    public:\n\n        explicit auto_mutex (\n            const mutex& m\n        );\n        /*!\n            ensures\n                - #*this is properly initialized\n                - m will be locked\n        !*/\n\n        explicit auto_mutex (\n            const rmutex& m\n        );\n        /*!\n            ensures\n                - #*this is properly initialized\n                - m will be locked\n        !*/\n\n        explicit auto_mutex (\n            const read_write_mutex& m\n        );\n        /*!\n            ensures\n                - #*this is properly initialized\n                - m will be locked via m.lock() (i.e. a write lock will be obtained)\n        !*/\n\n        void unlock(\n        );\n        /*!\n            ensures\n                - if (unlock() has not already been called) then\n                    - The mutex associated with *this has been unlocked.  This is useful if\n                      you want to unlock a mutex before the auto_mutex destructor executes.\n        !*/\n\n        ~auto_mutex (\n        );\n        /*!\n            ensures\n                - all resources allocated by *this have been freed\n                - calls unlock()\n        !*/\n\n    private:\n        // restricted functions\n        auto_mutex(auto_mutex&);        // copy constructor\n        auto_mutex& operator=(auto_mutex&);    // assignment operator\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    class auto_mutex_readonly\n    {\n        /*!\n            INITIAL VALUE\n                The mutex given in the constructor is locked using a read-only lock and\n                associated with this object.\n\n            WHAT THIS OBJECT REPRESENTS\n                This object represents a mechanism for automatically locking and unlocking\n                a read_write_mutex object.  In particular, a readonly lock is used.\n        !*/\n    public:\n\n        explicit auto_mutex_readonly (\n            const read_write_mutex& m\n        );\n        /*!\n            ensures\n                - #*this is properly initialized\n                - a readonly lock will be obtained on m using m.lock_readonly()\n                - #has_read_lock() == true\n        !*/\n\n        ~auto_mutex_readonly (\n        );\n        /*!\n            ensures\n                - all resources allocated by *this have been freed\n                - the mutex associated with *this has been unlocked\n        !*/\n\n        bool has_read_lock (\n        );\n        /*!\n            ensures\n                - returns true if this object has called read_write_mutex::lock_readonly()\n                  on its associated mutex and has yet to release that lock.\n        !*/\n\n        bool has_write_lock (\n        ); \n        /*!\n            ensures\n                - returns true if this object has called read_write_mutex::lock() on its\n                  associated mutex and has yet to release that lock.\n        !*/\n\n        void lock_readonly (\n        );\n        /*!\n            ensures\n                - This function converts the lock on the associated mutex into a readonly lock.\n                  Specifically:\n                  if (!has_read_lock()) then\n                    - if (has_write_lock()) then\n                        - unlocks the associated mutex and then relocks it by calling\n                          read_write_mutex::lock_readonly()\n                    - else\n                        - locks the associated mutex by calling read_write_mutex::lock_readonly()\n                - #has_read_lock() == true\n                - Note that the lock switch is not atomic.  This means that whatever\n                  resource is protected by the mutex might have been modified during the\n                  call to lock_readonly().\n        !*/\n\n        void lock_write (\n        );\n        /*!\n            ensures\n                - This function converts the lock on the associated mutex into a write lock.\n                  Specifically:\n                  if (!has_write_lock()) then\n                    - if (has_read_lock()) then\n                        - unlocks the associated mutex and then relocks it by calling\n                          read_write_mutex::lock()\n                    - else\n                        - locks the associated mutex by calling read_write_mutex::lock()\n                - #has_write_lock() == true\n                - Note that the lock switch is not atomic.  This means that whatever\n                  resource is protected by the mutex might have been modified during the\n                  call to lock_write().\n        !*/\n\n        void unlock (\n        );\n        /*!\n            ensures\n                - if (has_read_lock() || has_write_lock()) then\n                    - unlocks the associated mutex.  This is useful if you want to unlock a\n                      mutex before the auto_mutex_readonly destructor executes.\n                - #has_read_lock() == false\n                - #has_write_lock() == false\n        !*/\n\n    private:\n        // restricted functions\n        auto_mutex_readonly(auto_mutex_readonly&);        // copy constructor\n        auto_mutex_readonly& operator=(auto_mutex_readonly&);    // assignment operator\n    };\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_AUTO_MUTEX_EXTENSIOn_ABSTRACT_\n\n"
  },
  {
    "path": "benchmarks/dlib/threads/auto_unlock_extension.h",
    "content": "// Copyright (C) 2006  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_AUTO_UNLOCK_EXTENSIOn_\n#define DLIB_AUTO_UNLOCK_EXTENSIOn_\n\n#include \"threads_kernel.h\"\n#include \"rmutex_extension.h\"\n#include \"read_write_mutex_extension.h\"\n#include \"auto_unlock_extension_abstract.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    class auto_unlock\n    {\n        /*!\n            INITIAL VALUE\n                - if (m != 0) then\n                    - the mutex pointed to by m is locked\n                - if (r != 0) then\n                    - the mutex pointed to by r is locked\n                - if (rw != 0) then\n                    - the mutex pointed to by rw is locked\n                - exactly one of r, m, or rw is not 0.\n\n            CONVENTION\n                - if (m != 0) then\n                    - the mutex pointed to by m is locked\n                - if (r != 0) then\n                    - the mutex pointed to by r is locked\n                - if (rw != 0) then\n                    - the mutex pointed to by rw is locked\n                - exactly one of r, m, or rw is not 0.\n        !*/\n    public:\n\n        explicit auto_unlock (\n            const mutex& m_\n        ) : m(&m_),\n            r(0),\n            rw(0)\n        {}\n\n        explicit auto_unlock (\n            const rmutex& r_\n        ) : m(0),\n            r(&r_),\n            rw(0)\n        {}\n\n        explicit auto_unlock (\n            const read_write_mutex& rw_\n        ) : m(0),\n            r(0),\n            rw(&rw_)\n        {}\n\n        ~auto_unlock (\n        )\n        {\n            if (m != 0)\n                m->unlock();\n            else if (r != 0)\n                r->unlock();\n            else\n                rw->unlock();\n        }\n\n    private:\n\n        const mutex* m;\n        const rmutex* r;\n        const read_write_mutex* rw;\n\n        // restricted functions\n        auto_unlock(auto_unlock&);        // copy constructor\n        auto_unlock& operator=(auto_unlock&);    // assignment operator\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    class auto_unlock_readonly\n    {\n\n    public:\n\n        explicit auto_unlock_readonly (\n            const read_write_mutex& rw_\n        ) :\n            rw(rw_)\n        {}\n\n        ~auto_unlock_readonly (\n        )\n        {\n            rw.unlock_readonly();\n        }\n\n    private:\n\n        const read_write_mutex& rw;\n\n        // restricted functions\n        auto_unlock_readonly(auto_unlock_readonly&);        // copy constructor\n        auto_unlock_readonly& operator=(auto_unlock_readonly&);    // assignment operator\n    };\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_AUTO_UNLOCK_EXTENSIOn_\n\n\n"
  },
  {
    "path": "benchmarks/dlib/threads/auto_unlock_extension_abstract.h",
    "content": "// Copyright (C) 2006  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_AUTO_UNLOCK_EXTENSIOn_ABSTRACT_\n#ifdef DLIB_AUTO_UNLOCK_EXTENSIOn_ABSTRACT_\n\n#include \"threads_kernel_abstract.h\"\n#include \"rmutex_extension_abstract.h\"\n#include \"read_write_mutex_extension_abstract.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    class auto_unlock\n    {\n        /*!\n            INITIAL VALUE\n                The mutex given in the constructor is associated with this object.\n\n            WHAT THIS OBJECT REPRESENTS\n                This object represents a mechanism for automatically unlocking\n                a mutex object.  It is useful when you already have a locked mutex\n                and want to make sure it gets unlocked even if an exception is thrown \n                or you quit the function at a weird spot.\n        !*/\n    public:\n\n        explicit auto_unlock (\n            const mutex& m\n        );\n        /*!\n            ensures\n                - #*this is properly initialized\n                - does not modify m in any way \n        !*/\n\n        explicit auto_unlock (\n            const rmutex& m\n        );\n        /*!\n            ensures\n                - #*this is properly initialized\n                - does not modify m in any way \n        !*/\n\n        explicit auto_unlock (\n            const read_write_mutex& m\n        );\n        /*!\n            ensures\n                - #*this is properly initialized\n                - does not modify m in any way \n        !*/\n\n        ~auto_unlock (\n        );\n        /*!\n            ensures\n                - all resources allocated by *this have been freed\n                - calls unlock() on the mutex associated with *this\n        !*/\n\n    private:\n        // restricted functions\n        auto_unlock(auto_unlock&);        // copy constructor\n        auto_unlock& operator=(auto_unlock&);    // assignment operator\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    class auto_unlock_readonly\n    {\n        /*!\n            INITIAL VALUE\n                The mutex given in the constructor is associated with this object.\n\n            WHAT THIS OBJECT REPRESENTS\n                This object represents a mechanism for automatically unlocking\n                a read_write_mutex object.  It is useful when you already have a locked mutex\n                and want to make sure it gets unlocked even if an exception is thrown \n                or you quit the function at a weird spot.  Note that the mutex\n                is unlocked by calling unlock_readonly() on it.\n        !*/\n    public:\n\n        explicit auto_unlock_readonly (\n            const read_write_mutex& m\n        );\n        /*!\n            ensures\n                - #*this is properly initialized\n                - does not modify m in any way \n        !*/\n\n        ~auto_unlock_readonly (\n        );\n        /*!\n            ensures\n                - all resources allocated by *this have been freed\n                - calls unlock_readonly() on the mutex associated with *this\n        !*/\n\n    private:\n        // restricted functions\n        auto_unlock_readonly(auto_unlock_readonly&);        // copy constructor\n        auto_unlock_readonly& operator=(auto_unlock_readonly&);    // assignment operator\n    };\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_AUTO_UNLOCK_EXTENSIOn_ABSTRACT_\n\n\n"
  },
  {
    "path": "benchmarks/dlib/threads/create_new_thread_extension.h",
    "content": "// Copyright (C) 2006  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_CREATE_NEW_THREAD_EXTENSIOn_\n#define DLIB_CREATE_NEW_THREAD_EXTENSIOn_ \n\n#include \"threads_kernel_abstract.h\"\n#include \"create_new_thread_extension_abstract.h\"\n#include \"../threads.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        void (T::*funct)()\n        >\n    inline void dlib_create_new_thread_helper (\n        void* obj\n    )\n    {\n        T* o = static_cast<T*>(obj);\n        (o->*funct)();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        void (T::*funct)()\n        >\n    inline bool create_new_thread (\n        T& obj\n    )\n    {\n        return create_new_thread(dlib_create_new_thread_helper<T,funct>,&obj);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_CREATE_NEW_THREAD_EXTENSIOn_\n\n\n"
  },
  {
    "path": "benchmarks/dlib/threads/create_new_thread_extension_abstract.h",
    "content": "// Copyright (C) 2006  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_CREATE_NEW_THREAD_EXTENSIOn_ABSTRACT_\n#ifdef DLIB_CREATE_NEW_THREAD_EXTENSIOn_ABSTRACT_ \n\n#include \"threads_kernel_abstract.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T,\n        void (T::*funct)()\n        >\n    bool create_new_thread (\n        T& obj\n    );\n    /*!\n        ensures\n            - creates a new thread and calls obj.*funct() from it.\n            - returns true upon success and false upon failure to create the new thread.\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_CREATE_NEW_THREAD_EXTENSIOn_ABSTRACT_\n\n\n\n"
  },
  {
    "path": "benchmarks/dlib/threads/multithreaded_object_extension.h",
    "content": "// Copyright (C) 2007  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_MULTITHREADED_OBJECT_EXTENSIOn_\n#define DLIB_MULTITHREADED_OBJECT_EXTENSIOn_ \n\n#include \"multithreaded_object_extension_abstract.h\"\n#include \"threads_kernel.h\"\n#include \"auto_mutex_extension.h\"\n#include \"rmutex_extension.h\"\n#include \"rsignaler_extension.h\"\n#include \"../algs.h\"\n#include \"../assert.h\"\n#include \"../map.h\"\n#include \"../member_function_pointer.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    class multithreaded_object\n    {\n        /*!\n            INITIAL VALUE\n                - is_running_ == false\n                - should_stop_ == false\n                - thread_ids.size() == 0\n                - dead_threads.size() == 0\n                - threads_started == 0\n\n            CONVENTION\n                - number_of_threads_registered() == thread_ids.size() + dead_threads.size()\n                - number_of_threads_alive() == threads_started \n\n                - is_running() == is_running_\n                - should_stop() == should_stop_\n\n                - thread_ids == a map of current thread ids to the member function\n                  pointers that that thread runs.  \n                - threads_started == the number of threads that have been spawned to run \n                  thread_helper but haven't ended yet.\n                  \n                - dead_threads == a queue that contains all the member function pointers\n                  for threads that are currently registered but not running\n\n                - m_ == the mutex used to protect all our variables\n                - s == the signaler for m_\n        !*/\n\n    public:\n\n        multithreaded_object (\n        );\n\n        virtual ~multithreaded_object (\n        ) = 0;\n\n        void clear (\n        );\n\n        bool is_running (\n        ) const;\n\n        unsigned long number_of_threads_alive (\n        ) const;\n\n        unsigned long number_of_threads_registered (\n        ) const;\n\n        void wait (\n        ) const;\n\n        void start (\n        );\n\n        void pause (\n        );\n\n        void stop (\n        );\n\n    protected:\n\n        bool should_stop (\n        ) const;\n\n        template <\n            typename T\n            >\n        void register_thread (\n            T& object,\n            void (T::*thread)()\n        )\n        {\n            auto_mutex M(m_);\n            try\n            {\n                mfp mf;\n                mf.set(object,thread);\n                dead_threads.enqueue(mf);\n                if (is_running_)\n                    start();\n            }\n            catch (...)\n            {\n                is_running_ = false;\n                should_stop_ = true;\n                s.broadcast();\n                throw;\n            }\n        }\n\n    private:\n\n        class raii_thread_helper\n        {\n        public:\n            raii_thread_helper(multithreaded_object& self_, thread_id_type id_);\n            ~raii_thread_helper();\n\n            multithreaded_object& self;\n            thread_id_type id;\n        };\n\n        void thread_helper(\n        );\n\n        typedef member_function_pointer<> mfp;\n\n        rmutex m_;\n        rsignaler s;\n        map<thread_id_type,mfp,memory_manager<char>::kernel_2a>::kernel_1a thread_ids;\n        queue<mfp,memory_manager<char>::kernel_2a>::kernel_1a dead_threads;\n\n        bool is_running_;\n        bool should_stop_;\n        unsigned long threads_started;\n\n        // restricted functions\n        multithreaded_object(multithreaded_object&);        // copy constructor\n        multithreaded_object& operator=(multithreaded_object&);    // assignment operator\n    };\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#ifdef NO_MAKEFILE\n#include \"multithreaded_object_extension.cpp\"\n#endif\n\n#endif // DLIB_MULTITHREADED_OBJECT_EXTENSIOn_\n\n"
  },
  {
    "path": "benchmarks/dlib/threads/multithreaded_object_extension_abstract.h",
    "content": "// Copyright (C) 2007  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_MULTITHREADED_OBJECT_EXTENSIOn_ABSTRACT_\n#ifdef DLIB_MULTITHREADED_OBJECT_EXTENSIOn_ABSTRACT_ \n\n#include \"threads_kernel_abstract.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    class multithreaded_object\n    {\n        /*!\n            INITIAL VALUE\n                - is_running() == false\n                - number_of_threads_alive() == 0\n                - number_of_threads_registered() == 0\n\n            WHAT THIS OBJECT REPRESENTS\n                This object represents a multithreaded object.  It is similar to \n                the threaded_object except it allows you to have many threads in a \n                single object rather than just one.  To use it you inherit from it \n                and register the member functions in your new class that you want \n                to run in their own threads by calling register_thread().  Then when \n                you call start() it will spawn all the registered functions\n                in their own threads.\n        !*/\n\n    public:\n\n        multithreaded_object (\n        );\n        /*!\n            ensures\n                - #*this is properly initialized\n            throws\n                - std::bad_alloc\n                - dlib::thread_error\n                    the constructor may throw this exception if there is a problem \n                    gathering resources to create threading objects.\n        !*/\n\n        virtual ~multithreaded_object (\n        ) = 0;\n        /*!\n            requires\n                - number_of_threads_alive() == 0\n                  (i.e. in the destructor for the object you derive from this one you\n                  must wait for all the threads to end.)\n            ensures\n                - all resources allocated by *this have been freed.  \n        !*/\n\n        void clear(\n        );\n        /*!\n            ensures\n                - #*this has its initial value\n                - blocks until all threads have terminated\n            throws\n                - std::bad_alloc or dlib::thread_error\n                    if an exception is thrown then *this is unusable \n                    until clear() is called and succeeds\n        !*/\n\n        bool is_running (\n        ) const;\n        /*!\n            ensures\n                - if (number_of_threads_alive() > 0 && the threads are currently supposed to be executing) then\n                    - returns true\n                - else\n                    - returns false\n        !*/\n\n        unsigned long number_of_threads_alive (\n        ) const;\n        /*!\n            ensures\n                - returns the number of threads that are currently alive (i.e.\n                  the number of threads that have started but not yet terminated)\n        !*/\n\n        unsigned long number_of_threads_registered (\n        ) const;\n        /*!\n            ensures\n                - returns the number of threads that have been registered by\n                  calls to register_thread()\n        !*/\n\n        void wait (\n        ) const;\n        /*!\n            requires\n                - is not called from one of this object's threads \n            ensures\n                - if (number_of_threads_alive() > 0) then\n                    - blocks until all the threads in this object have terminated \n                      (i.e. blocks until number_of_threads_alive() == 0)\n        !*/\n\n        void start (\n        );\n        /*!\n            ensures\n                - #number_of_threads_alive() == number_of_threads_registered()\n                - #is_running() == true\n                - #should_stop() == false\n                - all the threads registered are up and running. \n            throws\n                - std::bad_alloc or dlib::thread_error\n                    If either of these exceptions are thrown then \n                    #is_running() == false and should_stop() == true\n        !*/\n\n        void pause (\n        );\n        /*!\n            ensures\n                - #is_running() == false\n        !*/\n\n        void stop (\n        );\n        /*!\n            ensures\n                - #should_stop() == true\n                - #is_running() == false\n        !*/\n\n    protected:\n\n        template <\n            typename T\n            >\n        void register_thread (\n            T& object,\n            void (T::*thread)()\n        );\n        /*!\n            requires\n                - (object.*thread)() forms a valid function call\n                - the thread function does not throw\n            ensures\n                - registers the member function pointed to by thread as one of the threads\n                  that runs when is_running() == true\n                - #number_of_threads_registered() == number_of_threads_registered() + 1\n                - if (is_running() == true)\n                    - spawns this new member function in its own thread\n                    - #number_of_threads_alive() += number_of_threads_alive() + 1\n            throws\n                - std::bad_alloc or dlib::thread_error\n                    If either of these exceptions are thrown then \n                    #is_running() == false and should_stop() == true\n        !*/\n\n        bool should_stop (\n        ) const;\n        /*!\n            requires\n                - is only called from one of the registered threads in this object \n            ensures\n                - if (is_running() == false && should_stop() == false) then\n                    - blocks until (#is_running() == true || #should_stop() == true) \n                - if (this thread is supposed to terminate) then\n                    - returns true\n                - else\n                    - returns false\n        !*/\n\n    private:\n\n        // restricted functions\n        multithreaded_object(multithreaded_object&);        // copy constructor\n        multithreaded_object& operator=(multithreaded_object&);    // assignment operator\n    };\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_MULTITHREADED_OBJECT_EXTENSIOn_ABSTRACT_\n\n"
  },
  {
    "path": "benchmarks/dlib/threads/parallel_for_extension.h",
    "content": "// Copyright (C) 2013  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_PARALLEL_FoR_Hh_\n#define DLIB_PARALLEL_FoR_Hh_ \n\n#include \"parallel_for_extension_abstract.h\"\n#include \"thread_pool_extension.h\"\n#include \"../console_progress_indicator.h\"\n#include \"async.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    namespace impl\n    {\n\n        template <typename T>\n        class helper_parallel_for\n        {\n        public:\n            helper_parallel_for (\n                T& obj_,\n                void (T::*funct_)(long)\n            ) : \n                obj(obj_),\n                funct(funct_)\n            {}\n\n            T& obj;\n            void (T::*funct)(long);\n\n            void process_block (long begin, long end)\n            {\n                for (long i = begin; i < end; ++i)\n                    (obj.*funct)(i);\n            }\n        };\n        \n        template <typename T>\n        class helper_parallel_for_funct\n        {\n        public:\n            helper_parallel_for_funct (\n                const T& funct_\n            ) : funct(funct_) {}\n\n            const T& funct;\n\n            void run(long i)\n            {\n                funct(i);\n            }\n        };\n\n        template <typename T>\n        class helper_parallel_for_funct2\n        {\n        public:\n            helper_parallel_for_funct2 (\n                const T& funct_\n            ) : funct(funct_) {}\n\n            const T& funct;\n\n            void run(long begin, long end)\n            {\n                funct(begin, end);\n            }\n        };\n    }\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for_blocked (\n        thread_pool& tp,\n        long begin,\n        long end,\n        T& obj,\n        void (T::*funct)(long, long),\n        long chunks_per_thread = 8\n    )\n    {\n        // make sure requires clause is not broken\n        DLIB_ASSERT(begin <= end && chunks_per_thread > 0,\n            \"\\t void parallel_for_blocked()\"\n            << \"\\n\\t Invalid inputs were given to this function\"\n            << \"\\n\\t begin: \" << begin \n            << \"\\n\\t end:   \" << end\n            << \"\\n\\t chunks_per_thread: \" << chunks_per_thread\n            );\n\n        if (tp.num_threads_in_pool() != 0)\n        {\n            const long num = end-begin;\n            const long num_workers = static_cast<long>(tp.num_threads_in_pool());\n            // How many samples to process in a single task (aim for chunks_per_thread jobs per worker)\n            const long block_size = std::max(1L, num/(num_workers*chunks_per_thread));\n            for (long i = 0; i < num; i+=block_size)\n            {\n                tp.add_task(obj, funct, begin+i, begin+std::min(i+block_size, num));\n            }\n            tp.wait_for_all_tasks();\n        }\n        else\n        {\n            // Since there aren't any threads in the pool we might as well just invoke\n            // the function directly since that's all the thread_pool object would do.\n            // But doing it ourselves skips a mutex lock.\n            (obj.*funct)(begin, end);\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for_blocked (\n        unsigned long num_threads,\n        long begin,\n        long end,\n        T& obj,\n        void (T::*funct)(long, long),\n        long chunks_per_thread = 8\n    )\n    {\n        // make sure requires clause is not broken\n        DLIB_ASSERT(begin <= end && chunks_per_thread > 0,\n            \"\\t void parallel_for_blocked()\"\n            << \"\\n\\t Invalid inputs were given to this function\"\n            << \"\\n\\t begin: \" << begin \n            << \"\\n\\t end:   \" << end\n            << \"\\n\\t chunks_per_thread: \" << chunks_per_thread\n            );\n\n        thread_pool tp(num_threads);\n        parallel_for_blocked(tp, begin, end, obj, funct, chunks_per_thread);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for_blocked (\n        thread_pool& tp,\n        long begin,\n        long end,\n        const T& funct,\n        long chunks_per_thread = 8\n    )\n    {\n        // make sure requires clause is not broken\n        DLIB_ASSERT(begin <= end && chunks_per_thread > 0,\n            \"\\t void parallel_for_blocked()\"\n            << \"\\n\\t Invalid inputs were given to this function\"\n            << \"\\n\\t begin: \" << begin \n            << \"\\n\\t end:   \" << end\n            << \"\\n\\t chunks_per_thread: \" << chunks_per_thread\n            );\n\n        impl::helper_parallel_for_funct2<T> helper(funct);\n        parallel_for_blocked(tp, begin, end,  helper, &impl::helper_parallel_for_funct2<T>::run,  chunks_per_thread);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for_blocked (\n        unsigned long num_threads,\n        long begin,\n        long end,\n        const T& funct,\n        long chunks_per_thread = 8\n    )\n    {\n        // make sure requires clause is not broken\n        DLIB_ASSERT(begin <= end && chunks_per_thread > 0,\n            \"\\t void parallel_for_blocked()\"\n            << \"\\n\\t Invalid inputs were given to this function\"\n            << \"\\n\\t begin: \" << begin \n            << \"\\n\\t end:   \" << end\n            << \"\\n\\t chunks_per_thread: \" << chunks_per_thread\n            );\n\n        thread_pool tp(num_threads);\n        parallel_for_blocked(tp, begin, end, funct, chunks_per_thread);\n    }\n\n    template <typename T>\n    void parallel_for_blocked (\n        long begin,\n        long end,\n        const T& funct,\n        long chunks_per_thread = 8\n    )\n    {\n        parallel_for_blocked(default_thread_pool(), begin, end, funct, chunks_per_thread);\n    }\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for (\n        thread_pool& tp,\n        long begin,\n        long end,\n        T& obj,\n        void (T::*funct)(long),\n        long chunks_per_thread = 8\n    )\n    {\n        // make sure requires clause is not broken\n        DLIB_ASSERT(begin <= end && chunks_per_thread > 0,\n            \"\\t void parallel_for()\"\n            << \"\\n\\t Invalid inputs were given to this function\"\n            << \"\\n\\t begin: \" << begin \n            << \"\\n\\t end:   \" << end\n            << \"\\n\\t chunks_per_thread: \" << chunks_per_thread\n            );\n\n        impl::helper_parallel_for<T> helper(obj, funct);\n        parallel_for_blocked(tp, begin, end, helper, &impl::helper_parallel_for<T>::process_block, chunks_per_thread);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for (\n        unsigned long num_threads,\n        long begin,\n        long end,\n        T& obj,\n        void (T::*funct)(long),\n        long chunks_per_thread = 8\n    )\n    {\n        // make sure requires clause is not broken\n        DLIB_ASSERT(begin <= end && chunks_per_thread > 0,\n            \"\\t void parallel_for()\"\n            << \"\\n\\t Invalid inputs were given to this function\"\n            << \"\\n\\t begin: \" << begin \n            << \"\\n\\t end:   \" << end\n            << \"\\n\\t chunks_per_thread: \" << chunks_per_thread\n            );\n\n        thread_pool tp(num_threads);\n        parallel_for(tp, begin, end, obj, funct, chunks_per_thread);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for (\n        thread_pool& tp,\n        long begin,\n        long end,\n        const T& funct,\n        long chunks_per_thread = 8\n    )\n    {\n        // make sure requires clause is not broken\n        DLIB_ASSERT(begin <= end && chunks_per_thread > 0,\n            \"\\t void parallel_for()\"\n            << \"\\n\\t Invalid inputs were given to this function\"\n            << \"\\n\\t begin: \" << begin \n            << \"\\n\\t end:   \" << end\n            << \"\\n\\t chunks_per_thread: \" << chunks_per_thread\n            );\n\n        impl::helper_parallel_for_funct<T> helper(funct);\n        parallel_for(tp, begin, end,  helper, &impl::helper_parallel_for_funct<T>::run,  chunks_per_thread);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for (\n        unsigned long num_threads,\n        long begin,\n        long end,\n        const T& funct,\n        long chunks_per_thread = 8\n    )\n    {\n        // make sure requires clause is not broken\n        DLIB_ASSERT(begin <= end && chunks_per_thread > 0,\n            \"\\t void parallel_for()\"\n            << \"\\n\\t Invalid inputs were given to this function\"\n            << \"\\n\\t begin: \" << begin \n            << \"\\n\\t end:   \" << end\n            << \"\\n\\t chunks_per_thread: \" << chunks_per_thread\n            );\n\n        thread_pool tp(num_threads);\n        parallel_for(tp, begin, end, funct, chunks_per_thread);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for (\n        long begin,\n        long end,\n        const T& funct,\n        long chunks_per_thread = 8\n    )\n    {\n        parallel_for(default_thread_pool(), begin, end, funct, chunks_per_thread);\n    }\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    namespace impl\n    {\n        template <typename T>\n        class parfor_verbose_helper\n        {\n        public:\n            parfor_verbose_helper(T& obj_, void (T::*funct_)(long), long begin, long end) :\n                obj(obj_), funct(funct_), pbar(end-begin)\n            {\n                count = 0;\n                wrote_to_screen = pbar.print_status(0);\n            }\n\n            ~parfor_verbose_helper()\n            {\n                if (wrote_to_screen)\n                    std::cout << std::endl;\n            }\n\n            mutable long count;\n            T& obj;\n            void (T::*funct)(long);\n            mutable console_progress_indicator pbar;\n            mutable bool wrote_to_screen;\n            mutex m;\n\n            void operator()(long i) const\n            {\n                (obj.*funct)(i);\n                {\n                    auto_mutex lock(m);\n                    wrote_to_screen = pbar.print_status(++count) || wrote_to_screen;\n                }\n            }\n\n        };\n\n        template <typename T>\n        class parfor_verbose_helper3\n        {\n        public:\n            parfor_verbose_helper3(T& obj_, void (T::*funct_)(long,long), long begin, long end) :\n                obj(obj_), funct(funct_), pbar(end-begin)\n            {\n                count = 0;\n                wrote_to_screen = pbar.print_status(0);\n            }\n\n            ~parfor_verbose_helper3()\n            {\n                if (wrote_to_screen)\n                    std::cout << std::endl;\n            }\n\n            mutable long count;\n            T& obj;\n            void (T::*funct)(long,long);\n            mutable console_progress_indicator pbar;\n            mutable bool wrote_to_screen;\n            mutex m;\n\n            void operator()(long begin, long end) const\n            {\n                (obj.*funct)(begin, end);\n                {\n                    auto_mutex lock(m);\n                    count += end-begin;\n                    wrote_to_screen = pbar.print_status(count) || wrote_to_screen;\n                }\n            }\n        };\n\n        template <typename T>\n        class parfor_verbose_helper2\n        {\n        public:\n            parfor_verbose_helper2(const T& obj_, long begin, long end) : obj(obj_), pbar(end-begin)\n            {\n                count = 0;\n                wrote_to_screen = pbar.print_status(0);\n            }\n\n            ~parfor_verbose_helper2()\n            {\n                if (wrote_to_screen)\n                    std::cout << std::endl;\n            }\n\n            mutable long count;\n            const T& obj;\n            mutable console_progress_indicator pbar;\n            mutable bool wrote_to_screen;\n            mutex m;\n\n            void operator()(long i) const\n            {\n                obj(i);\n                {\n                    auto_mutex lock(m);\n                    wrote_to_screen = pbar.print_status(++count) || wrote_to_screen;\n                }\n            }\n\n            void operator()(long begin, long end) const\n            {\n                obj(begin, end);\n                {\n                    auto_mutex lock(m);\n                    count += end-begin;\n                    wrote_to_screen = pbar.print_status(count) || wrote_to_screen;\n                }\n            }\n        };\n    }\n\n    template <typename T>\n    void parallel_for_verbose (\n        thread_pool& tp,\n        long begin,\n        long end,\n        T& obj,\n        void (T::*funct)(long),\n        long chunks_per_thread = 8\n    )\n    {\n        // make sure requires clause is not broken\n        DLIB_ASSERT(begin <= end && chunks_per_thread > 0,\n            \"\\t void parallel_for_verbose()\"\n            << \"\\n\\t Invalid inputs were given to this function\"\n            << \"\\n\\t begin: \" << begin \n            << \"\\n\\t end:   \" << end\n            << \"\\n\\t chunks_per_thread: \" << chunks_per_thread\n            );\n\n        impl::parfor_verbose_helper<T> helper(obj, funct, begin, end);\n        parallel_for(tp, begin, end, helper, chunks_per_thread);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for_verbose (\n        unsigned long num_threads,\n        long begin,\n        long end,\n        T& obj,\n        void (T::*funct)(long),\n        long chunks_per_thread = 8\n    )\n    {\n        // make sure requires clause is not broken\n        DLIB_ASSERT(begin <= end && chunks_per_thread > 0,\n            \"\\t void parallel_for_verbose()\"\n            << \"\\n\\t Invalid inputs were given to this function\"\n            << \"\\n\\t begin: \" << begin \n            << \"\\n\\t end:   \" << end\n            << \"\\n\\t chunks_per_thread: \" << chunks_per_thread\n            );\n\n        impl::parfor_verbose_helper<T> helper(obj, funct, begin, end);\n        parallel_for(num_threads, begin, end, helper, chunks_per_thread);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for_verbose (\n        thread_pool& tp,\n        long begin,\n        long end,\n        const T& funct,\n        long chunks_per_thread = 8\n    )\n    {\n        // make sure requires clause is not broken\n        DLIB_ASSERT(begin <= end && chunks_per_thread > 0,\n            \"\\t void parallel_for_verbose()\"\n            << \"\\n\\t Invalid inputs were given to this function\"\n            << \"\\n\\t begin: \" << begin \n            << \"\\n\\t end:   \" << end\n            << \"\\n\\t chunks_per_thread: \" << chunks_per_thread\n            );\n\n        impl::parfor_verbose_helper2<T> helper(funct, begin, end);\n        parallel_for(tp, begin, end,  helper, chunks_per_thread);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for_verbose (\n        unsigned long num_threads,\n        long begin,\n        long end,\n        const T& funct,\n        long chunks_per_thread = 8\n    )\n    {\n        // make sure requires clause is not broken\n        DLIB_ASSERT(begin <= end && chunks_per_thread > 0,\n            \"\\t void parallel_for_verbose()\"\n            << \"\\n\\t Invalid inputs were given to this function\"\n            << \"\\n\\t begin: \" << begin \n            << \"\\n\\t end:   \" << end\n            << \"\\n\\t chunks_per_thread: \" << chunks_per_thread\n            );\n\n        impl::parfor_verbose_helper2<T> helper(funct, begin, end);\n        parallel_for(num_threads, begin, end, helper, chunks_per_thread);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for_verbose (\n        long begin,\n        long end,\n        const T& funct,\n        long chunks_per_thread = 8\n    )\n    {\n        // make sure requires clause is not broken\n        DLIB_ASSERT(begin <= end && chunks_per_thread > 0,\n            \"\\t void parallel_for_verbose()\"\n            << \"\\n\\t Invalid inputs were given to this function\"\n            << \"\\n\\t begin: \" << begin \n            << \"\\n\\t end:   \" << end\n            << \"\\n\\t chunks_per_thread: \" << chunks_per_thread\n            );\n\n        impl::parfor_verbose_helper2<T> helper(funct, begin, end);\n        parallel_for(begin, end, helper, chunks_per_thread);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for_blocked_verbose (\n        thread_pool& tp,\n        long begin,\n        long end,\n        T& obj,\n        void (T::*funct)(long,long),\n        long chunks_per_thread = 8\n    )\n    {\n        // make sure requires clause is not broken\n        DLIB_ASSERT(begin <= end && chunks_per_thread > 0,\n            \"\\t void parallel_for_blocked_verbose()\"\n            << \"\\n\\t Invalid inputs were given to this function\"\n            << \"\\n\\t begin: \" << begin \n            << \"\\n\\t end:   \" << end\n            << \"\\n\\t chunks_per_thread: \" << chunks_per_thread\n            );\n\n        impl::parfor_verbose_helper3<T> helper(obj, funct, begin, end);\n        parallel_for_blocked(tp, begin, end, helper, chunks_per_thread);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for_blocked_verbose (\n        unsigned long num_threads,\n        long begin,\n        long end,\n        T& obj,\n        void (T::*funct)(long,long),\n        long chunks_per_thread = 8\n    )\n    {\n        // make sure requires clause is not broken\n        DLIB_ASSERT(begin <= end && chunks_per_thread > 0,\n            \"\\t void parallel_for_blocked_verbose()\"\n            << \"\\n\\t Invalid inputs were given to this function\"\n            << \"\\n\\t begin: \" << begin \n            << \"\\n\\t end:   \" << end\n            << \"\\n\\t chunks_per_thread: \" << chunks_per_thread\n            );\n\n        impl::parfor_verbose_helper3<T> helper(obj, funct, begin, end);\n        parallel_for_blocked(num_threads, begin, end, helper, chunks_per_thread);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for_blocked_verbose (\n        thread_pool& tp,\n        long begin,\n        long end,\n        const T& funct,\n        long chunks_per_thread = 8\n    )\n    {\n        // make sure requires clause is not broken\n        DLIB_ASSERT(begin <= end && chunks_per_thread > 0,\n            \"\\t void parallel_for_blocked_verbose()\"\n            << \"\\n\\t Invalid inputs were given to this function\"\n            << \"\\n\\t begin: \" << begin \n            << \"\\n\\t end:   \" << end\n            << \"\\n\\t chunks_per_thread: \" << chunks_per_thread\n            );\n\n        impl::parfor_verbose_helper2<T> helper(funct, begin, end);\n        parallel_for_blocked(tp, begin, end,  helper, chunks_per_thread);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for_blocked_verbose (\n        unsigned long num_threads,\n        long begin,\n        long end,\n        const T& funct,\n        long chunks_per_thread = 8\n    )\n    {\n        // make sure requires clause is not broken\n        DLIB_ASSERT(begin <= end && chunks_per_thread > 0,\n            \"\\t void parallel_for_blocked_verbose()\"\n            << \"\\n\\t Invalid inputs were given to this function\"\n            << \"\\n\\t begin: \" << begin \n            << \"\\n\\t end:   \" << end\n            << \"\\n\\t chunks_per_thread: \" << chunks_per_thread\n            );\n\n        impl::parfor_verbose_helper2<T> helper(funct, begin, end);\n        parallel_for_blocked(num_threads, begin, end, helper, chunks_per_thread);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for_blocked_verbose (\n        long begin,\n        long end,\n        const T& funct,\n        long chunks_per_thread = 8\n    )\n    {\n        // make sure requires clause is not broken\n        DLIB_ASSERT(begin <= end && chunks_per_thread > 0,\n            \"\\t void parallel_for_blocked_verbose()\"\n            << \"\\n\\t Invalid inputs were given to this function\"\n            << \"\\n\\t begin: \" << begin \n            << \"\\n\\t end:   \" << end\n            << \"\\n\\t chunks_per_thread: \" << chunks_per_thread\n            );\n\n        impl::parfor_verbose_helper2<T> helper(funct, begin, end);\n        parallel_for_blocked(begin, end, helper, chunks_per_thread);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_PARALLEL_FoR_Hh_\n\n"
  },
  {
    "path": "benchmarks/dlib/threads/parallel_for_extension_abstract.h",
    "content": "// Copyright (C) 2013  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_PARALLEL_FoR_ABSTRACT_Hh_\n#ifdef DLIB_PARALLEL_FoR_ABSTRACT_Hh_ \n\n#include \"thread_pool_extension_abstract.h\"\n#include \"async_abstract.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for_blocked (\n        thread_pool& tp,\n        long begin,\n        long end,\n        T& obj,\n        void (T::*funct)(long, long),\n        long chunks_per_thread = 8\n    );\n    /*!\n        requires\n            - begin <= end\n            - chunks_per_thread > 0\n        ensures\n            - This is a convenience function for submitting a block of jobs to a thread_pool.  \n              In particular, given the half open range [begin, end), this function will\n              split the range into approximately tp.num_threads_in_pool()*chunks_per_thread\n              blocks, which it will then submit to the thread_pool.  The given thread_pool\n              will then call (obj.*funct)() on each of the subranges.\n            - To be precise, suppose we have broken the range [begin, end) into the\n              following subranges:\n                - [begin[0], end[0])\n                - [begin[1], end[1])\n                - [begin[2], end[2])\n                  ...\n                - [begin[n], end[n])\n              Then parallel_for_blocked() submits each of these subranges to tp for\n              processing such that (obj.*funct)(begin[i], end[i]) is invoked for all valid\n              values of i.  Moreover, the subranges are non-overlapping and completely\n              cover the total range of [begin, end).\n            - This function will not perform any memory allocations or create any system\n              resources such as mutex objects.\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for_blocked (\n        unsigned long num_threads,\n        long begin,\n        long end,\n        T& obj,\n        void (T::*funct)(long, long),\n        long chunks_per_thread = 8\n    );\n    /*!\n        requires\n            - begin <= end\n            - chunks_per_thread > 0\n        ensures\n            - This function is equivalent to the following block of code:\n                thread_pool tp(num_threads);\n                parallel_for_blocked(tp, begin, end, obj, funct, chunks_per_thread);\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for_blocked (\n        thread_pool& tp,\n        long begin,\n        long end,\n        const T& funct,\n        long chunks_per_thread = 8\n    );\n    /*!\n        requires\n            - chunks_per_thread > 0\n            - begin <= end\n        ensures\n            - This is a convenience function for submitting a block of jobs to a\n              thread_pool.  In particular, given the range [begin, end), this function will\n              split the range into approximately tp.num_threads_in_pool()*chunks_per_thread\n              blocks, which it will then submit to the thread_pool.  The given thread_pool\n              will then call funct() on each of the subranges.\n            - To be precise, suppose we have broken the range [begin, end) into the\n              following subranges:\n                - [begin[0], end[0])\n                - [begin[1], end[1])\n                - [begin[2], end[2])\n                  ...\n                - [begin[n], end[n])\n              Then parallel_for_blocked() submits each of these subranges to tp for\n              processing such that funct(begin[i], end[i]) is invoked for all valid values\n              of i.\n            - This function will not perform any memory allocations or create any system\n              resources such as mutex objects.\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for_blocked (\n        unsigned long num_threads,\n        long begin,\n        long end,\n        const T& funct,\n        long chunks_per_thread = 8\n    );\n    /*!\n        requires\n            - begin <= end\n            - chunks_per_thread > 0\n        ensures\n            - This function is equivalent to the following block of code:\n                thread_pool tp(num_threads);\n                parallel_for_blocked(tp, begin, end, funct, chunks_per_thread);\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for_blocked (\n        long begin,\n        long end,\n        const T& funct,\n        long chunks_per_thread = 8\n    );\n    /*!\n        requires\n            - begin <= end\n            - chunks_per_thread > 0\n        ensures\n            - This function is equivalent to the following block of code:\n                parallel_for_blocked(default_thread_pool(), begin, end, funct, chunks_per_thread);\n    !*/\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for (\n        thread_pool& tp,\n        long begin,\n        long end,\n        T& obj,\n        void (T::*funct)(long),\n        long chunks_per_thread = 8\n    );\n    /*!\n        requires\n            - begin <= end\n            - chunks_per_thread > 0\n        ensures\n            - This function is equivalent to the following function call:\n              parallel_for_blocked(tp, begin, end, [&](long begin_sub, long end_sub) \n                {\n                  for (long i = begin_sub; i < end_sub; ++i)\n                      (obj.*funct)(i);  \n                }, chunks_per_thread);\n            - Therefore, this routine invokes (obj.*funct)(i) for all i in the range\n              [begin, end).  However, it does so using tp.num_threads_in_pool() parallel\n              threads.\n            - This function will not perform any memory allocations or create any system\n              resources such as mutex objects.\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for (\n        unsigned long num_threads,\n        long begin,\n        long end,\n        T& obj,\n        void (T::*funct)(long),\n        long chunks_per_thread = 8\n    );\n    /*!\n        requires\n            - begin <= end\n            - chunks_per_thread > 0\n        ensures\n            - This function is equivalent to the following block of code:\n                thread_pool tp(num_threads);\n                parallel_for(tp, begin, end, obj, funct, chunks_per_thread);\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for (\n        thread_pool& tp,\n        long begin,\n        long end,\n        const T& funct,\n        long chunks_per_thread = 8\n    );\n    /*!\n        requires\n            - begin <= end\n            - chunks_per_thread > 0\n        ensures\n            - This function is equivalent to the following function call:\n              parallel_for_blocked(tp, begin, end, [&](long begin_sub, long end_sub) \n                {\n                  for (long i = begin_sub; i < end_sub; ++i)\n                      funct(i);  \n                }, chunks_per_thread);\n            - Therefore, this routine invokes funct(i) for all i in the range [begin, end).\n              However, it does so using tp.num_threads_in_pool() parallel threads.\n            - This function will not perform any memory allocations or create any system\n              resources such as mutex objects.\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for (\n        unsigned long num_threads,\n        long begin,\n        long end,\n        const T& funct,\n        long chunks_per_thread = 8\n    );\n    /*!\n        requires\n            - begin <= end\n            - chunks_per_thread > 0\n        ensures\n            - This function is equivalent to the following block of code:\n                thread_pool tp(num_threads);\n                parallel_for(tp, begin, end, funct, chunks_per_thread);\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for (\n        long begin,\n        long end,\n        const T& funct,\n        long chunks_per_thread = 8\n    );\n    /*!\n        requires\n            - begin <= end\n            - chunks_per_thread > 0\n        ensures\n            - This function is equivalent to the following block of code:\n                parallel_for(default_thread_pool(), begin, end, funct, chunks_per_thread);\n    !*/\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for_verbose (\n        thread_pool& tp,\n        long begin,\n        long end,\n        T& obj,\n        void (T::*funct)(long),\n        long chunks_per_thread = 8\n    );\n    /*!\n        requires\n            - begin <= end\n            - chunks_per_thread > 0\n        ensures\n            - This function is identical to the parallel_for() routine defined above except\n              that it will print messages to cout showing the progress in executing the\n              parallel for loop.\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for_verbose (\n        unsigned long num_threads,\n        long begin,\n        long end,\n        T& obj,\n        void (T::*funct)(long),\n        long chunks_per_thread = 8\n    );\n    /*!\n        requires\n            - begin <= end\n            - chunks_per_thread > 0\n        ensures\n            - This function is identical to the parallel_for() routine defined above except\n              that it will print messages to cout showing the progress in executing the\n              parallel for loop.\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for_verbose (\n        thread_pool& tp,\n        long begin,\n        long end,\n        const T& funct,\n        long chunks_per_thread = 8\n    );\n    /*!\n        requires\n            - begin <= end\n            - chunks_per_thread > 0\n        ensures\n            - This function is identical to the parallel_for() routine defined above except\n              that it will print messages to cout showing the progress in executing the\n              parallel for loop.\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for_verbose (\n        unsigned long num_threads,\n        long begin,\n        long end,\n        const T& funct,\n        long chunks_per_thread = 8\n    );\n    /*!\n        requires\n            - begin <= end\n            - chunks_per_thread > 0\n        ensures\n            - This function is identical to the parallel_for() routine defined above except\n              that it will print messages to cout showing the progress in executing the\n              parallel for loop.\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for_verbose (\n        long begin,\n        long end,\n        const T& funct,\n        long chunks_per_thread = 8\n    );\n    /*!\n        requires\n            - begin <= end\n            - chunks_per_thread > 0\n        ensures\n            - This function is identical to the parallel_for() routine defined above except\n              that it will print messages to cout showing the progress in executing the\n              parallel for loop.\n            - It will also use the default_thread_pool().\n    !*/\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for_blocked_verbose (\n        thread_pool& tp,\n        long begin,\n        long end,\n        T& obj,\n        void (T::*funct)(long,long),\n        long chunks_per_thread = 8\n    );\n    /*!\n        requires\n            - begin <= end\n            - chunks_per_thread > 0\n        ensures\n            - This function is identical to the parallel_for_blocked() routine defined\n              above except that it will print messages to cout showing the progress in\n              executing the parallel for loop.\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for_blocked_verbose (\n        unsigned long num_threads,\n        long begin,\n        long end,\n        T& obj,\n        void (T::*funct)(long,long),\n        long chunks_per_thread = 8\n    );\n    /*!\n        requires\n            - begin <= end\n            - chunks_per_thread > 0\n        ensures\n            - This function is identical to the parallel_for_blocked() routine defined\n              above except that it will print messages to cout showing the progress in\n              executing the parallel for loop.\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for_blocked_verbose (\n        thread_pool& tp,\n        long begin,\n        long end,\n        const T& funct,\n        long chunks_per_thread = 8\n    );\n    /*!\n        requires\n            - begin <= end\n            - chunks_per_thread > 0\n        ensures\n            - This function is identical to the parallel_for_blocked() routine defined\n              above except that it will print messages to cout showing the progress in\n              executing the parallel for loop.\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for_blocked_verbose (\n        unsigned long num_threads,\n        long begin,\n        long end,\n        const T& funct,\n        long chunks_per_thread = 8\n    );\n    /*!\n        requires\n            - begin <= end\n            - chunks_per_thread > 0\n        ensures\n            - This function is identical to the parallel_for_blocked() routine defined\n              above except that it will print messages to cout showing the progress in\n              executing the parallel for loop.\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void parallel_for_blocked_verbose (\n        long begin,\n        long end,\n        const T& funct,\n        long chunks_per_thread = 8\n    );\n    /*!\n        requires\n            - begin <= end\n            - chunks_per_thread > 0\n        ensures\n            - This function is identical to the parallel_for_blocked() routine defined\n              above except that it will print messages to cout showing the progress in\n              executing the parallel for loop.\n            - It will also use the default_thread_pool()\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_PARALLEL_FoR_ABSTRACT_Hh_\n\n\n"
  },
  {
    "path": "benchmarks/dlib/threads/posix.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_THREADS_KERNEl_1_\n#include \"threads_kernel_2.h\"\n#endif\n\n"
  },
  {
    "path": "benchmarks/dlib/threads/read_write_mutex_extension.h",
    "content": "// Copyright (C) 2010  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_READ_WRITE_MUTEX_EXTENSIOn_\n#define DLIB_READ_WRITE_MUTEX_EXTENSIOn_\n\n#include \"threads_kernel.h\"\n#include \"read_write_mutex_extension_abstract.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    class read_write_mutex\n    {\n        /*!\n            INITIAL VALUE\n                - max_locks == defined by constructor \n                - available_locks == max_locks\n                - write_lock_in_progress == false\n                - write_lock_active == false\n\n            CONVENTION\n                - Each time someone gets a read only lock they take one of the \"available locks\"\n                  and each write lock takes all possible locks (i.e. max_locks).  The number of\n                  available locks is recorded in available_locks.  Any time you try to lock this \n                  object and there aren't available locks you have to wait.\n\n                - max_locks == max_readonly_locks()\n\n                - if (some thread is on the process of obtaining a write lock) then\n                    - write_lock_in_progress == true\n                - else\n                    - write_lock_in_progress == false\n\n                - if (some thread currently has a write lock on this mutex) then\n                    - write_lock_active == true\n                - else\n                    - write_lock_active == false\n        !*/\n\n    public:\n\n        read_write_mutex (\n        ) : s(m),\n            max_locks(0xFFFFFFFF),\n            available_locks(max_locks),\n            write_lock_in_progress(false),\n            write_lock_active(false)\n        {}\n\n        explicit read_write_mutex (\n            unsigned long max_locks_\n        ) : s(m),\n            max_locks(max_locks_),\n            available_locks(max_locks_),\n            write_lock_in_progress(false),\n            write_lock_active(false)\n        {\n            // make sure requires clause is not broken\n            DLIB_ASSERT(max_locks > 0,\n                \"\\t read_write_mutex::read_write_mutex(max_locks)\"\n                << \"\\n\\t You must give a non-zero value for max_locks\"\n                << \"\\n\\t this: \" << this\n                );\n        }\n\n        ~read_write_mutex (\n        )\n        {}\n\n        void lock (\n        ) const\n        {\n            m.lock();\n\n            // If another write lock is already in progress then wait for it to finish\n            // before we start trying to grab all the available locks.  This way we \n            // don't end up fighting over the locks.\n            while (write_lock_in_progress)\n                s.wait();\n\n            // grab the right to perform a write lock\n            write_lock_in_progress = true;\n\n            // now start grabbing all the locks\n            unsigned long locks_obtained = available_locks;\n            available_locks = 0;\n            while (locks_obtained != max_locks)\n            {\n                s.wait();\n                locks_obtained += available_locks;\n                available_locks = 0;\n            }\n\n            write_lock_in_progress = false;\n            write_lock_active = true;\n\n            m.unlock();\n        }\n\n        void unlock (\n        ) const\n        {\n            m.lock();\n\n            // only do something if there really was a lock in place\n            if (write_lock_active)\n            {\n                available_locks = max_locks;\n                write_lock_active = false;\n                s.broadcast();\n            }\n\n            m.unlock();\n        }\n\n        void lock_readonly (\n        ) const\n        {\n            m.lock();\n\n            while (available_locks == 0)\n                s.wait();\n\n            --available_locks;\n\n            m.unlock();\n        }\n\n        void unlock_readonly (\n        ) const\n        {\n            m.lock();\n\n            // If this condition is false then it means there are no more readonly locks\n            // to free.  So we don't do anything.\n            if (available_locks != max_locks && !write_lock_active)\n            {\n                ++available_locks;\n\n                // only perform broadcast when there is another thread that might be listening\n                if (available_locks == 1 || write_lock_in_progress)\n                {\n                    s.broadcast();\n                }\n            }\n\n            m.unlock();\n        }\n\n        unsigned long max_readonly_locks (\n        ) const\n        {\n            return max_locks;\n        }\n\n    private:\n        mutex m;\n        signaler s;\n        const unsigned long max_locks;\n        mutable unsigned long available_locks;\n        mutable bool write_lock_in_progress; \n        mutable bool write_lock_active;\n\n        // restricted functions\n        read_write_mutex(read_write_mutex&);        // copy constructor\n        read_write_mutex& operator=(read_write_mutex&);    // assignment operator\n    };\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_READ_WRITE_MUTEX_EXTENSIOn_\n\n\n"
  },
  {
    "path": "benchmarks/dlib/threads/read_write_mutex_extension_abstract.h",
    "content": "// Copyright (C) 2010  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_READWRITE_MUTEX_EXTENSIOn_ABSTRACT_\n#ifdef DLIB_READWRITE_MUTEX_EXTENSIOn_ABSTRACT_\n\n#include \"threads_kernel_abstract.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    class read_write_mutex\n    {\n        /*!\n            INITIAL VALUE\n                read_write_mutex is in the fully unlocked state\n\n            WHAT THIS OBJECT REPRESENTS\n                This object represents a mutex intended to be used for synchronous \n                thread control of shared data. When a thread wants to access some \n                shared data it locks out other threads by calling lock() and calls \n                unlock() when it is finished.   \n\n                This mutex also has the additional ability to distinguish between\n                a lock for the purposes of modifying some shared data, a write lock,\n                and a lock for the purposes of only reading shared data, a readonly\n                lock.  The lock() and unlock() functions are used for write locks while\n                the lock_readonly() and unlock_readonly() are for readonly locks.  \n\n                The difference between a readonly and write lock can be understood as \n                follows.  The read_write_mutex will allow many threads to obtain simultaneous\n                readonly locks but will only allow a single thread to obtain a write lock.\n                Moreover, while the write lock is obtained no other threads are allowed\n                to have readonly locks.  \n        !*/\n    public:\n\n        read_write_mutex (\n        );\n        /*!\n            ensures\n                - #*this is properly initialized\n                - max_readonly_locks() == 0xFFFFFFFF\n                  (i.e. about 4 billion)\n            throws\n                - dlib::thread_error\n                    the constructor may throw this exception if there is a problem \n                    gathering resources to create the read_write_mutex.\n        !*/\n\n        explicit read_write_mutex (\n            unsigned long max_locks\n        );\n        /*!\n            requires\n                - max_locks > 0\n            ensures\n                - #*this is properly initialized\n                - max_readonly_locks() == max_locks\n            throws\n                - dlib::thread_error\n                    the constructor may throw this exception if there is a problem \n                    gathering resources to create the read_write_mutex.\n        !*/\n\n        ~read_write_mutex (\n        );\n        /*!\n            requires\n                - *this is not locked\n            ensures\n                - all resources allocated by *this have been freed\n        !*/\n\n        void lock (\n        ) const;\n        /*!\n            requires\n                - The thread calling this function does not have any kind of lock on this \n                  object\n            ensures\n                - if (there is any kind of lock on *this) then \n                    - the calling thread is put to sleep until a write lock becomes available. \n                      Once available, a write lock is obtained on this mutex and this function \n                      terminates.\n                - else  \n                    - a write lock is obtained on this mutex and the calling thread is not put to sleep \n        !*/\n\n        void unlock (\n        ) const;\n        /*!\n            ensures\n                - if (there is a write lock on *this) then\n                    - #*this is unlocked (i.e. other threads may now lock this object)\n                - else\n                    - the call to unlock() has no effect\n        !*/\n\n        unsigned long max_readonly_locks (\n        ) const;\n        /*!\n            ensures\n                - returns the maximum number of concurrent readonly locks this object will allow.\n        !*/\n\n        void lock_readonly (\n        ) const;\n        /*!\n            requires\n                - The thread calling this function does not already have a write\n                  lock on this object\n            ensures\n                - if (there is a write lock on *this or there are no free readonly locks) then\n                    - the calling thread is put to sleep until there is no longer a write lock\n                      and a free readonly lock is available.  Once this is the case, a readonly \n                      lock is obtained and this function terminates.\n                - else \n                    - a readonly lock is obtained on *this and the calling thread is not put\n                      to sleep.  Note that multiple readonly locks can be obtained at once.\n        !*/\n\n        void unlock_readonly (\n        ) const;\n        /*!\n            ensures\n                - if (there is a readonly lock on *this) then\n                    - one readonly lock is removed from *this.  \n                - else\n                    - the call to unlock_readonly() has no effect.\n        !*/\n\n    private:\n        // restricted functions\n        read_write_mutex(read_write_mutex&);        // copy constructor\n        read_write_mutex& operator=(read_write_mutex&);    // assignment operator\n    };\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_READWRITE_MUTEX_EXTENSIOn_ABSTRACT_\n\n\n"
  },
  {
    "path": "benchmarks/dlib/threads/rmutex_extension.h",
    "content": "// Copyright (C) 2005  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_RMUTEX_EXTENSIOn_\n#define DLIB_RMUTEX_EXTENSIOn_\n\n#include \"threads_kernel.h\"\n#include \"rmutex_extension_abstract.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    class rmutex\n    {\n        /*!\n            INITIAL VALUE\n                count == 0\n                thread_id == 0\n\n            CONVENTION\n                - count == lock_count()\n\n                - if (no thread currently has a lock on this mutex) then\n                    - count == 0\n                - else\n                    - count == the number of times the thread that owns this mutex has\n                      called lock()\n                    - thread_id == the id of this thread.\n        !*/\n    public:\n\n        rmutex (\n        ) : s(m),\n            thread_id(0),\n            count(0)\n        {}\n\n        ~rmutex (\n        )\n        {}\n\n        unsigned long lock_count (\n        ) const\n        {\n            return count;\n        }\n\n        void lock (\n            unsigned long times = 1\n        ) const\n        {\n            const thread_id_type current_thread_id = get_thread_id();\n            m.lock();\n            if (thread_id == current_thread_id)\n            {\n                // we already own this mutex in this case\n                count += times;                \n            }\n            else\n            {\n                // wait for our turn to claim this rmutex\n                while (count != 0)\n                    s.wait();\n\n                count = times;\n                thread_id = current_thread_id;\n            }\n            m.unlock();\n        }\n\n        void unlock (\n            unsigned long times = 1\n        ) const\n        {\n            const thread_id_type current_thread_id = get_thread_id();\n            m.lock();\n            if (thread_id == current_thread_id)\n            {\n                if (count <= times)\n                {\n                    count = 0;\n                    s.signal();\n                }\n                else\n                {\n                    count -= times;\n                }\n            }\n            m.unlock();\n        }\n\n    private:\n        mutex m;\n        signaler s;\n        mutable thread_id_type thread_id;\n        mutable unsigned long count;\n\n        // restricted functions\n        rmutex(rmutex&);        // copy constructor\n        rmutex& operator=(rmutex&);    // assignment operator\n    };\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_RMUTEX_EXTENSIOn_\n\n"
  },
  {
    "path": "benchmarks/dlib/threads/rmutex_extension_abstract.h",
    "content": "// Copyright (C) 2005  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_RMUTEX_EXTENSIOn_ABSTRACT_\n#ifdef DLIB_RMUTEX_EXTENSIOn_ABSTRACT_\n\n#include \"threads_kernel_abstract.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    class rmutex\n    {\n        /*!\n            INITIAL VALUE\n                rmutex is in the unlocked state\n\n            WHAT THIS OBJECT REPRESENTS\n                This object represents a recursive mutex intended to be used for synchronous \n                thread control of shared data. When a thread wants to access some \n                shared data it locks out other threads by calling lock() and calls \n                unlock() when it is finished.  \n\n                The difference between this and the normal mutex object is that it is safe to\n                call lock() from a thread that already has a lock on this mutex.  Doing\n                so just increments a counter but otherwise has no effect on the mutex.\n                Note that unlock() must be called for each call to lock() to release the\n                mutex.\n        !*/\n    public:\n\n        rmutex (\n        );\n        /*!\n            ensures\n                - #*this is properly initialized\n            throws\n                - dlib::thread_error\n                    the constructor may throw this exception if there is a problem \n                    gathering resources to create the rmutex.\n        !*/\n\n        ~rmutex (\n        );\n        /*!\n            requires\n                - *this is not locked\n            ensures\n                - all resources allocated by *this have been freed\n        !*/\n\n        unsigned long lock_count (\n        ) const;\n        /*!\n            requires\n                - the calling thread has a lock on this mutex\n            ensures\n                - returns the number of times the thread has called lock()\n        !*/\n\n        void lock (\n            unsigned long times = 1\n        ) const;\n        /*!\n            ensures\n                - if (*this is currently locked by another thread) then \n                    - the thread that called lock() on *this is put to sleep until \n                      it becomes available.               \n                    - #lock_count() == times\n                - if (*this is currently unlocked) then \n                    - #*this becomes locked and the current thread is NOT put to sleep \n                      but now \"owns\" #*this\n                    - #lock_count() == times\n                - if (*this is locked and owned by the current thread) then\n                    - the calling thread retains its lock on *this and isn't put to sleep.  \n                    - #lock_count() == lock_count() + times\n        !*/\n\n        void unlock (\n            unsigned long times = 1\n        ) const;\n        /*!\n            ensures\n                - if (*this is currently locked and owned by the thread calling unlock) then\n                    - if (lock_count() <= times ) then\n                        - #*this is unlocked (i.e. other threads may now lock this object)\n                    - else\n                        - #*this will remain locked\n                        - #lock_count() == lock_count() - times\n                - else\n                    - the call to unlock() has no effect\n        !*/\n\n\n    private:\n        // restricted functions\n        rmutex(rmutex&);        // copy constructor\n        rmutex& operator=(rmutex&);    // assignment operator\n    };\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_RMUTEX_EXTENSIOn_ABSTRACT_\n\n"
  },
  {
    "path": "benchmarks/dlib/threads/rsignaler_extension.h",
    "content": "// Copyright (C) 2006  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_RSIGNALER_EXTENSIOn_\n#define DLIB_RSIGNALER_EXTENSIOn_ \n\n#include \"rsignaler_extension_abstract.h\"\n#include \"rmutex_extension.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    class rsignaler\n    {\n    public:\n        rsignaler (\n            const rmutex& associated_mutex\n        ) : \n            assoc_mutex(associated_mutex),\n            s(m)\n        {}\n\n        ~rsignaler (\n        )\n        {}\n\n        void wait (\n        ) const\n        {\n            m.lock();\n            const unsigned long lock_count = assoc_mutex.lock_count();\n            assoc_mutex.unlock(lock_count);\n            s.wait();\n            m.unlock();\n            assoc_mutex.lock(lock_count);\n        }\n\n        bool wait_or_timeout (\n            unsigned long milliseconds\n        ) const\n        {\n            m.lock();\n            const unsigned long lock_count = assoc_mutex.lock_count();\n            assoc_mutex.unlock(lock_count);\n            bool res = s.wait_or_timeout(milliseconds);\n            m.unlock();\n            assoc_mutex.lock(lock_count);\n            return res;\n        }\n\n        void signal (\n        ) const \n        { \n            m.lock();\n            s.signal(); \n            m.unlock();\n        }\n\n        void broadcast (\n        ) const \n        { \n            m.lock();\n            s.broadcast(); \n            m.unlock();\n        }\n\n        const rmutex& get_mutex (\n        ) const { return assoc_mutex; }\n\n    private:\n\n        const rmutex& assoc_mutex;\n        mutex m;\n        signaler s;\n\n\n        // restricted functions\n        rsignaler(rsignaler&);        // copy constructor\n        rsignaler& operator=(rsignaler&);    // assignment operator\n    };\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_RSIGNALER_EXTENSIOn_ \n\n\n\n"
  },
  {
    "path": "benchmarks/dlib/threads/rsignaler_extension_abstract.h",
    "content": "// Copyright (C) 2006  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_RSIGNALER_EXTENSIOn_ABSTRACT_\n#ifdef DLIB_RSIGNALER_EXTENSIOn_ABSTRACT_ \n\n#include \"threads_kernel_abstract.h\"\n#include \"rmutex_extension_abstract.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    class rsignaler\n    {\n        /*!\n            WHAT THIS OBJECT REPRESENTS\n                This object represents an event signaling system for threads.  It gives \n                a thread the ability to wake up other threads that are waiting for a \n                particular signal. \n\n                Each rsignaler object is associated with one and only one rmutex object.  \n                More than one rsignaler object may be associated with a single rmutex\n                but a signaler object may only be associated with a single rmutex.\n\n                NOTE:\n                You must guard against spurious wakeups.  This means that a thread\n                might return from a call to wait even if no other thread called\n                signal.  This is rare but must be guarded against. \n\n                Also note that this object is identical to the signaler object \n                except that it works with rmutex objects rather than mutex objects.\n        !*/\n\n    public:\n\n        rsignaler (\n            const rmutex& associated_mutex\n        );\n        /*!\n            ensures\n                - #*this is properly initialized \n                - #get_mutex() == associated_mutex\n            throws\n                - dlib::thread_error\n                    the constructor may throw this exception if there is a problem \n                    gathering resources to create the signaler.    \n        !*/\n\n\n        ~rsignaler (\n        );\n        /*!\n            ensures\n                - all resources allocated by *this have been freed\n        !*/\n\n        void wait (\n        ) const;\n        /*!\n            requires\n                - get_mutex() is locked and owned by the calling thread\n            ensures\n                - atomically unlocks get_mutex() and blocks the calling thread                      \n                - calling thread may wake if another thread calls signal() or broadcast()\n                  on *this\n                - when wait() returns the calling thread again has a lock on get_mutex()\n        !*/\n\n        bool wait_or_timeout (\n            unsigned long milliseconds\n        ) const;\n        /*!\n            requires\n                - get_mutex() is locked and owned by the calling thread\n            ensures\n                - atomically unlocks get_mutex() and blocks the calling thread\n                - calling thread may wake if another thread calls signal() or broadcast()\n                  on *this\n                - after the specified number of milliseconds has elapsed the calling thread\n                  will wake once get_mutex() is free\n                - when wait returns the calling thread again has a lock on get_mutex()\n\n                - returns false if the call to wait_or_timeout timed out \n                - returns true if the call did not time out\n        !*/\n\n        void signal (\n        ) const;\n        /*!\n            ensures\n                - if (at least one thread is waiting on *this) then\n                    - at least one of the waiting threads will wake \n        !*/\n\n        void broadcast (\n        ) const;\n        /*!\n            ensures\n                - any and all threads waiting on *this will wake \n        !*/\n\n        const rmutex& get_mutex (\n        ) const;\n        /*!\n            ensures\n                - returns a const reference to the rmutex associated with *this\n        !*/\n\n\n    private:\n        // restricted functions\n        rsignaler(rsignaler&);        // copy constructor\n        rsignaler& operator=(rsignaler&);    // assignment operator\n    };\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_RSIGNALER_EXTENSIOn_ABSTRACT_ \n\n\n"
  },
  {
    "path": "benchmarks/dlib/threads/thread_function_extension.h",
    "content": "// Copyright (C) 2007  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_THREAD_FUNCTIOn_\n#define DLIB_THREAD_FUNCTIOn_\n\n#include <memory>\n\n#include \"thread_function_extension_abstract.h\"\n#include \"threads_kernel.h\"\n#include \"auto_mutex_extension.h\"\n#include \"threaded_object_extension.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    class thread_function : private threaded_object\n    {\n        \n        class base_funct\n        {\n        public:\n            virtual void go() = 0;\n            virtual ~base_funct() {}\n        };\n\n        template <typename F, typename T1, typename T2, typename T3, typename T4>\n        class super_funct_4 : public base_funct\n        {\n        public:\n            super_funct_4 ( F funct, T1 arg1, T2 arg2, T3 arg3, T4 arg4) :\n                f(funct),\n                a1(arg1),\n                a2(arg2),\n                a3(arg3),\n                a4(arg4)\n            {\n            }\n\n            void go() { f(a1, a2, a3, a4); }\n\n\n            F f;\n            T1 a1;\n            T2 a2;\n            T3 a3;\n            T4 a4;\n        };\n\n        template <typename F, typename T1, typename T2, typename T3>\n        class super_funct_3 : public base_funct\n        {\n        public:\n            super_funct_3 ( F funct, T1 arg1, T2 arg2, T3 arg3):\n                f(funct),\n                a1(arg1),\n                a2(arg2),\n                a3(arg3)\n            {\n            }\n\n            void go() { f(a1, a2, a3); }\n\n\n            F f;\n            T1 a1;\n            T2 a2;\n            T3 a3;\n        };\n\n        template <typename F, typename T1, typename T2>\n        class super_funct_2 : public base_funct\n        {\n        public:\n            super_funct_2 ( F funct, T1 arg1, T2 arg2) :\n                f(funct),\n                a1(arg1),\n                a2(arg2)\n            {\n            }\n\n            void go() { f(a1, a2); }\n\n\n            F f;\n            T1 a1;\n            T2 a2;\n        };\n\n        template <typename F, typename T>\n        class super_funct_1 : public base_funct\n        {\n        public:\n            super_funct_1 ( F funct, T arg) : f(funct), a(arg)\n            {\n            }\n\n            void go() { f(a); }\n\n\n            F f;\n            T a;\n        };\n\n        template <typename F>\n        class super_funct_0 : public base_funct\n        {\n        public:\n            super_funct_0 ( F funct) : f(funct)\n            {\n            }\n            \n            void go() { f(); }\n\n            F f;\n        };\n\n    public:\n\n        template <typename F>\n        thread_function (\n            F funct\n        )\n        {\n            f.reset(new super_funct_0<F>(funct));\n            start();\n        }\n\n        template <typename F, typename T>\n        thread_function (\n            F funct,\n            T arg\n        )\n        {\n            f.reset(new super_funct_1<F,T>(funct,arg));\n            start();\n        }\n\n        template <typename F, typename T1, typename T2>\n        thread_function (\n            F funct,\n            T1 arg1,\n            T2 arg2\n        )\n        {\n            f.reset(new super_funct_2<F,T1,T2>(funct, arg1, arg2));\n            start();\n        }\n\n        template <typename F, typename T1, typename T2, typename T3>\n        thread_function (\n            F funct,\n            T1 arg1,\n            T2 arg2,\n            T3 arg3\n        )\n        {\n            f.reset(new super_funct_3<F,T1,T2,T3>(funct, arg1, arg2, arg3));\n            start();\n        }\n\n        template <typename F, typename T1, typename T2, typename T3, typename T4>\n        thread_function (\n            F funct,\n            T1 arg1,\n            T2 arg2,\n            T3 arg3,\n            T4 arg4\n        )\n        {\n            f.reset(new super_funct_4<F,T1,T2,T3,T4>(funct, arg1, arg2, arg3, arg4));\n            start();\n        }\n\n        ~thread_function (\n        )\n        {\n            threaded_object::wait();\n        }\n\n        bool is_alive (\n        ) const\n        {\n            return threaded_object::is_alive();\n        }\n\n        void wait (\n        ) const\n        {\n            threaded_object::wait();\n        }\n\n    private:\n\n        void thread ()\n        {\n            f->go();\n        }\n\n        std::unique_ptr<base_funct> f;\n\n        // restricted functions\n        thread_function(thread_function&);        // copy constructor\n        thread_function& operator=(thread_function&);    // assignment operator\n    };\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_THREAD_FUNCTIOn_\n\n\n\n"
  },
  {
    "path": "benchmarks/dlib/threads/thread_function_extension_abstract.h",
    "content": "// Copyright (C) 2007  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_THREAD_FUNCTIOn_ABSTRACT_\n#ifdef DLIB_THREAD_FUNCTIOn_ABSTRACT_ \n\n#include \"threads_kernel_abstract.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    class thread_function \n    {\n        /*!\n            WHAT THIS OBJECT REPRESENTS\n                This object represents a thread on a global C++ function or function\n                object.  That is, it allows you to run a function in its own thread.\n        !*/\n    public:\n\n        template <typename F>\n        thread_function (\n            F funct\n        );\n        /*!\n            ensures\n                - #*this is properly initialized\n                - the function funct has been started in its own thread\n            throws\n                - std::bad_alloc\n                - dlib::thread_error\n                    the constructor may throw this exception if there is a problem \n                    gathering resources to create threading objects.\n        !*/\n\n        template <typename F, typename T1>\n        thread_function (\n            F funct,\n            T1 arg1\n        );\n        /*!\n            ensures\n                - #*this is properly initialized\n                - A thread has been created and it will call funct(arg1)\n            throws\n                - std::bad_alloc\n                - dlib::thread_error\n                    the constructor may throw this exception if there is a problem \n                    gathering resources to create threading objects.\n        !*/\n\n        template <typename F, typename T1, typename T2>\n        thread_function (\n            F funct,\n            T1 arg1,\n            T2 arg2\n        );\n        /*!\n            ensures\n                - #*this is properly initialized\n                - A thread has been created and it will call funct(arg1, arg2)\n            throws\n                - std::bad_alloc\n                - dlib::thread_error\n                    the constructor may throw this exception if there is a problem \n                    gathering resources to create threading objects.\n        !*/\n\n        template <typename F, typename T1, typename T2, typename T3>\n        thread_function (\n            F funct,\n            T1 arg1,\n            T2 arg2,\n            T3 arg3\n        );\n        /*!\n            ensures\n                - #*this is properly initialized\n                - A thread has been created and it will call funct(arg1, arg2, arg3)\n            throws\n                - std::bad_alloc\n                - dlib::thread_error\n                    the constructor may throw this exception if there is a problem \n                    gathering resources to create threading objects.\n        !*/\n\n        template <typename F, typename T1, typename T2, typename T3, typename T4>\n        thread_function (\n            F funct,\n            T1 arg1,\n            T2 arg2,\n            T3 arg3,\n            T4 arg4\n        );\n        /*!\n            ensures\n                - #*this is properly initialized\n                - A thread has been created and it will call funct(arg1, arg2, arg3, arg4)\n            throws\n                - std::bad_alloc\n                - dlib::thread_error\n                    the constructor may throw this exception if there is a problem \n                    gathering resources to create threading objects.\n        !*/\n\n        ~thread_function (\n        );\n        /*!\n            ensures\n                - all resources allocated by *this have been freed.  \n                - blocks until is_alive() == false\n        !*/\n\n        bool is_alive (\n        ) const;\n        /*!\n            ensures\n                - if (this object's thread has yet to terminate) then\n                    - returns true\n                - else\n                    - returns false\n        !*/\n\n        void wait (\n        ) const;\n        /*!\n            ensures\n                - if (is_alive() == true) then\n                    - blocks until this object's thread terminates\n        !*/\n\n    private:\n\n        // restricted functions\n        thread_function(thread_function&);        // copy constructor\n        thread_function& operator=(thread_function&);    // assignment operator\n    };\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_THREAD_FUNCTIOn_ABSTRACT_\n\n\n"
  },
  {
    "path": "benchmarks/dlib/threads/thread_pool_extension.h",
    "content": "// Copyright (C) 2008  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_THREAD_POOl_Hh_\n#define DLIB_THREAD_POOl_Hh_ \n\n#include <exception>\n#include <memory>\n#include <thread>\n\n#include \"thread_pool_extension_abstract.h\"\n#include \"multithreaded_object_extension.h\"\n#include \"../member_function_pointer.h\"\n#include \"../bound_function_pointer.h\"\n#include \"threads_kernel.h\"\n#include \"auto_mutex_extension.h\"\n#include \"../uintn.h\"\n#include \"../array.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    class thread_pool_implementation;\n\n    template <\n        typename T\n        >\n    class future\n    {\n        /*!\n            INITIAL VALUE\n                - task_id == 0\n                - tp.get() == 0\n\n            CONVENTION\n                - is_ready() == (tp.get() == 0)\n                - get() == var\n\n                - if (tp.get() != 0)\n                    - tp == a pointer to the thread_pool_implementation that is using this future object\n                    - task_id == the task id of the task in the thread pool tp that is using\n                      this future object.\n        !*/\n    public:\n\n        future (\n        ) : task_id(0) {}\n\n        future (\n            const T& item\n        ) : task_id(0), var(item) {}\n\n        future (\n            const future& item\n        ) :task_id(0), var(item.get()) {}\n\n        ~future (\n        ) { wait(); }\n\n        future& operator=(\n            const T& item\n        ) { get() = item; return *this; }\n\n        future& operator=(\n            const future& item\n        ) { get() = item.get(); return *this; }\n\n        operator T& (\n        ) { return get(); }\n\n        operator const T& (\n        ) const { return get(); }\n\n        T& get (\n        ) { wait(); return var; }\n\n        const T& get (\n        ) const { wait(); return var; }\n\n        bool is_ready (\n        ) const { return tp.get() == 0; }\n\n    private:\n\n        friend class thread_pool;\n\n        inline void wait () const;\n\n        mutable uint64 task_id;\n        mutable std::shared_ptr<thread_pool_implementation> tp;\n\n        T var;\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    inline void swap (\n        future<T>& a,\n        future<T>& b\n    ) { dlib::exchange(a.get(), b.get()); }\n    // Note that dlib::exchange() just calls std::swap.  I'm only using it because\n    // this works around some bugs in certain compilers.\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T> bool operator== (const future<T>& a, const future<T>& b) { return a.get() == b.get(); }\n    template <typename T> bool operator!= (const future<T>& a, const future<T>& b) { return a.get() != b.get(); }\n    template <typename T> bool operator<= (const future<T>& a, const future<T>& b) { return a.get() <= b.get(); }\n    template <typename T> bool operator>= (const future<T>& a, const future<T>& b) { return a.get() >= b.get(); }\n    template <typename T> bool operator<  (const future<T>& a, const future<T>& b) { return a.get() <  b.get(); }\n    template <typename T> bool operator>  (const future<T>& a, const future<T>& b) { return a.get() >  b.get(); }\n\n    template <typename T> bool operator== (const future<T>& a, const T& b)         { return a.get() == b; }\n    template <typename T> bool operator== (const T& a,         const future<T>& b) { return a       == b.get(); }\n    template <typename T> bool operator!= (const future<T>& a, const T& b)         { return a.get() != b; }\n    template <typename T> bool operator!= (const T& a,         const future<T>& b) { return a       != b.get(); }\n    template <typename T> bool operator<= (const future<T>& a, const T& b)         { return a.get() <= b; }\n    template <typename T> bool operator<= (const T& a,         const future<T>& b) { return a       <= b.get(); }\n    template <typename T> bool operator>= (const future<T>& a, const T& b)         { return a.get() >= b; }\n    template <typename T> bool operator>= (const T& a,         const future<T>& b) { return a       >= b.get(); }\n    template <typename T> bool operator<  (const future<T>& a, const T& b)         { return a.get() <  b; }\n    template <typename T> bool operator<  (const T& a,         const future<T>& b) { return a       <  b.get(); }\n    template <typename T> bool operator>  (const future<T>& a, const T& b)         { return a.get() >  b; }\n    template <typename T> bool operator>  (const T& a,         const future<T>& b) { return a       >  b.get(); }\n\n// ----------------------------------------------------------------------------------------\n\n    class thread_pool_implementation \n    {\n        /*!\n            CONVENTION\n                - num_threads_in_pool() == tasks.size()\n                - if (the destructor has been called) then\n                    - we_are_destructing == true\n                - else\n                    - we_are_destructing == false\n\n                - is_task_thread() == is_worker_thread(get_thread_id())\n\n                - m == the mutex used to protect everything in this object\n                - worker_thread_ids == an array that contains the thread ids for\n                  all the threads in the thread pool\n        !*/\n        typedef bound_function_pointer::kernel_1a_c bfp_type;\n\n        friend class thread_pool;\n        explicit thread_pool_implementation (\n            unsigned long num_threads\n        );\n\n    public:\n        ~thread_pool_implementation(\n        );\n\n        void wait_for_task (\n            uint64 task_id\n        ) const;\n\n        unsigned long num_threads_in_pool (\n        ) const;\n\n        void wait_for_all_tasks (\n        ) const;\n\n        bool is_task_thread (\n        ) const;\n\n        template <typename T>\n        uint64 add_task (\n            T& obj,\n            void (T::*funct)()\n        )\n        {\n            auto_mutex M(m);\n            const thread_id_type my_thread_id = get_thread_id();\n\n            // find a thread that isn't doing anything\n            long idx = find_empty_task_slot();\n            if (idx == -1 && is_worker_thread(my_thread_id))\n            {\n                // this function is being called from within a worker thread and there\n                // aren't any other worker threads free so just perform the task right\n                // here\n\n                M.unlock();\n                (obj.*funct)();\n\n                // return a task id that is both non-zero and also one\n                // that is never normally returned.  This way calls\n                // to wait_for_task() will never block given this id.\n                return 1;\n            }\n\n            // wait until there is a thread that isn't doing anything\n            while (idx == -1)\n            {\n                task_done_signaler.wait();\n                idx = find_empty_task_slot();\n            }\n\n            tasks[idx].thread_id = my_thread_id;\n            tasks[idx].task_id = make_next_task_id(idx);\n            tasks[idx].mfp0.set(obj,funct);\n\n            task_ready_signaler.signal();\n\n            return tasks[idx].task_id;\n        }\n\n        template <typename T>\n        uint64 add_task (\n            T& obj,\n            void (T::*funct)(long),\n            long arg1\n        )\n        {\n            auto_mutex M(m);\n            const thread_id_type my_thread_id = get_thread_id();\n\n            // find a thread that isn't doing anything\n            long idx = find_empty_task_slot();\n            if (idx == -1 && is_worker_thread(my_thread_id))\n            {\n                // this function is being called from within a worker thread and there\n                // aren't any other worker threads free so just perform the task right\n                // here\n\n                M.unlock();\n                (obj.*funct)(arg1);\n\n                // return a task id that is both non-zero and also one\n                // that is never normally returned.  This way calls\n                // to wait_for_task() will never block given this id.\n                return 1;\n            }\n\n            // wait until there is a thread that isn't doing anything\n            while (idx == -1)\n            {\n                task_done_signaler.wait();\n                idx = find_empty_task_slot();\n            }\n\n            tasks[idx].thread_id = my_thread_id;\n            tasks[idx].task_id = make_next_task_id(idx);\n            tasks[idx].mfp1.set(obj,funct);\n            tasks[idx].arg1 = arg1;\n\n            task_ready_signaler.signal();\n\n            return tasks[idx].task_id;\n        }\n\n        template <typename T>\n        uint64 add_task (\n            T& obj,\n            void (T::*funct)(long,long),\n            long arg1,\n            long arg2\n        )\n        {\n            auto_mutex M(m);\n            const thread_id_type my_thread_id = get_thread_id();\n\n            // find a thread that isn't doing anything\n            long idx = find_empty_task_slot();\n            if (idx == -1 && is_worker_thread(my_thread_id))\n            {\n                // this function is being called from within a worker thread and there\n                // aren't any other worker threads free so just perform the task right\n                // here\n\n                M.unlock();\n                (obj.*funct)(arg1, arg2);\n\n                // return a task id that is both non-zero and also one\n                // that is never normally returned.  This way calls\n                // to wait_for_task() will never block given this id.\n                return 1;\n            }\n\n            // wait until there is a thread that isn't doing anything\n            while (idx == -1)\n            {\n                task_done_signaler.wait();\n                idx = find_empty_task_slot();\n            }\n\n            tasks[idx].thread_id = my_thread_id;\n            tasks[idx].task_id = make_next_task_id(idx);\n            tasks[idx].mfp2.set(obj,funct);\n            tasks[idx].arg1 = arg1;\n            tasks[idx].arg2 = arg2;\n\n            task_ready_signaler.signal();\n\n            return tasks[idx].task_id;\n        }\n\n        struct function_object_copy \n        {\n            virtual ~function_object_copy(){}\n        };\n\n        template <typename T>\n        struct function_object_copy_instance : function_object_copy\n        {\n            function_object_copy_instance(const T& item_) : item(item_) {}\n            T item;\n            virtual ~function_object_copy_instance(){}\n        };\n\n        uint64 add_task_internal (\n            const bfp_type& bfp,\n            std::shared_ptr<function_object_copy>& item\n        );\n        /*!\n            ensures\n                - adds a task to call the given bfp object.\n                - swaps item into the internal task object which will have a lifetime\n                  at least as long as the running task.\n                - returns the task id for this new task\n        !*/\n\n        uint64 add_task_internal (\n            const bfp_type& bfp\n        ) { std::shared_ptr<function_object_copy> temp; return add_task_internal(bfp, temp); }\n        /*!\n            ensures\n                - adds a task to call the given bfp object.\n                - returns the task id for this new task\n        !*/\n\n        void shutdown_pool (\n        );\n        /*!\n            ensures\n                - causes all threads to terminate and blocks the\n                  caller until this happens.\n        !*/\n\n    private:\n\n        bool is_worker_thread (\n            const thread_id_type id\n        ) const;\n        /*!\n            requires\n                - m is locked\n            ensures\n                - if (thread with given id is one of the thread pool's worker threads or num_threads_in_pool() == 0) then\n                    - returns true\n                - else\n                    - returns false\n        !*/\n\n        void thread (\n        );\n        /*!\n            this is the function that executes the threads in the thread pool\n        !*/\n\n        long find_empty_task_slot (\n        ) const;\n        /*!\n            requires\n                - m is locked\n            ensures\n                - if (there is currently a empty task slot) then\n                    - returns the index of that task slot in tasks\n                    - there is a task slot\n                - else\n                    - returns -1\n        !*/\n\n        long find_ready_task (\n        ) const;\n        /*!\n            requires\n                - m is locked\n            ensures\n                - if (there is currently a task to do) then\n                    - returns the index of that task in tasks\n                - else\n                    - returns -1\n        !*/\n\n        uint64 make_next_task_id (\n            long idx\n        );\n        /*!\n            requires\n                - m is locked\n                - 0 <= idx < tasks.size()\n            ensures\n                - returns the next index to be used for tasks that are placed in\n                  tasks[idx]\n        !*/\n\n        unsigned long task_id_to_index (\n            uint64 id\n        ) const;\n        /*!\n            requires\n                - m is locked\n                - num_threads_in_pool() != 0\n            ensures\n                - returns the index in tasks corresponding to the given id\n        !*/\n\n        struct task_state_type\n        {\n            task_state_type() : is_being_processed(false), task_id(0), next_task_id(2), arg1(0), arg2(0), eptr(nullptr) {}\n\n            bool is_ready () const \n            /*!\n                ensures\n                    - if (is_empty() == false && no thread is currently processing this task) then\n                        - returns true\n                    - else\n                        - returns false\n            !*/\n            {\n                return !is_being_processed && !is_empty();\n            }\n\n            bool is_empty () const\n            /*!\n                ensures\n                    - if (this task state is empty.  i.e. it doesn't contain a task to be processed) then\n                        - returns true\n                    - else \n                        - returns false\n            !*/\n            {\n                return task_id == 0;\n            }\n\n            bool is_being_processed;  // true when a thread is working on this task \n            uint64 task_id; // the id of this task.  0 means this task is empty\n            thread_id_type thread_id; // the id of the thread that requested this task \n\n            uint64 next_task_id;\n\n            long arg1;\n            long arg2;\n\n            member_function_pointer<> mfp0;\n            member_function_pointer<long> mfp1;\n            member_function_pointer<long,long> mfp2;\n            bfp_type bfp;\n\n            std::shared_ptr<function_object_copy> function_copy;\n            mutable std::exception_ptr eptr; // non-null if the task threw an exception\n\n            void propagate_exception() const\n            {\n                if (eptr)\n                {\n                    auto tmp = eptr;\n                    eptr = nullptr;\n                    std::rethrow_exception(tmp);\n                }\n            }\n\n        };\n\n        array<task_state_type> tasks;\n        array<thread_id_type> worker_thread_ids;\n\n        mutex m;\n        signaler task_done_signaler;\n        signaler task_ready_signaler;\n        bool we_are_destructing;\n\n        std::vector<std::thread> threads;\n\n        // restricted functions\n        thread_pool_implementation(thread_pool_implementation&);        // copy constructor\n        thread_pool_implementation& operator=(thread_pool_implementation&);    // assignment operator\n\n    };\n\n\n// ----------------------------------------------------------------------------------------\n\n    class thread_pool \n    {\n        /*!\n            This object is just a shell that holds a std::shared_ptr \n            to the real thread_pool_implementation object.  The reason for doing\n            it this way is so that we can allow any mixture of destruction orders\n            between thread_pool objects and futures.  Whoever gets destroyed\n            last cleans up the thread_pool_implementation resources.\n        !*/\n        typedef bound_function_pointer::kernel_1a_c bfp_type;\n\n    public:\n        explicit thread_pool (\n            unsigned long num_threads\n        ) \n        {\n            impl.reset(new thread_pool_implementation(num_threads));\n        }\n\n        ~thread_pool (\n        )\n        {\n            try\n            {\n                impl->shutdown_pool();\n            }\n            catch (std::exception& e)\n            {\n                std::cerr << \"An unhandled exception was inside a dlib::thread_pool when it was destructed.\" << std::endl;\n                std::cerr << \"It's what string is: \\n\" << e.what() << std::endl;\n                using namespace std;\n                assert(false);\n                abort();\n            }\n            catch (...)\n            {\n                std::cerr << \"An unhandled exception was inside a dlib::thread_pool when it was destructed.\" << std::endl;\n                using namespace std;\n                assert(false);\n                abort();\n            }\n        }\n\n        void wait_for_task (\n            uint64 task_id\n        ) const { impl->wait_for_task(task_id); }\n\n        unsigned long num_threads_in_pool (\n        ) const { return impl->num_threads_in_pool(); }\n\n        void wait_for_all_tasks (\n        ) const { impl->wait_for_all_tasks(); }\n\n        bool is_task_thread (\n        ) const { return impl->is_task_thread(); }\n\n        template <typename T>\n        uint64 add_task (\n            T& obj,\n            void (T::*funct)()\n        )\n        {\n            return impl->add_task(obj, funct);\n        }\n\n        template <typename T>\n        uint64 add_task (\n            T& obj,\n            void (T::*funct)(long),\n            long arg1\n        )\n        {\n            return impl->add_task(obj, funct, arg1);\n        }\n\n        template <typename T>\n        uint64 add_task (\n            T& obj,\n            void (T::*funct)(long,long),\n            long arg1,\n            long arg2\n        )\n        {\n            return impl->add_task(obj, funct, arg1, arg2);\n        }\n\n        // --------------------\n\n        template <typename F>\n        uint64 add_task (\n            F& function_object\n        ) \n        { \n            COMPILE_TIME_ASSERT(is_function<F>::value == false);\n            COMPILE_TIME_ASSERT(is_pointer_type<F>::value == false);\n            \n            bfp_type temp;\n            temp.set(function_object);\n            uint64 id = impl->add_task_internal(temp);\n\n            return id;\n        }\n        \n        template <typename F>\n        uint64 add_task_by_value (\n            const F& function_object\n        ) \n        { \n            thread_pool_implementation::function_object_copy_instance<F>* ptr = 0;\n            ptr = new thread_pool_implementation::function_object_copy_instance<F>(function_object);\n            std::shared_ptr<thread_pool_implementation::function_object_copy> function_copy(ptr);\n\n\n            bfp_type temp;\n            temp.set(ptr->item);\n            uint64 id = impl->add_task_internal(temp, function_copy);\n\n            return id;\n        }\n        \n        template <typename T>\n        uint64 add_task (\n            const T& obj,\n            void (T::*funct)() const\n        ) \n        { \n            bfp_type temp;\n            temp.set(obj,funct);\n            uint64 id = impl->add_task_internal(temp);\n\n            return id;\n        }\n        \n        template <typename T>\n        uint64 add_task_by_value (\n            const T& obj,\n            void (T::*funct)() const\n        ) \n        { \n            thread_pool_implementation::function_object_copy_instance<const T>* ptr = 0;\n            ptr = new thread_pool_implementation::function_object_copy_instance<const T>(obj);\n            std::shared_ptr<thread_pool_implementation::function_object_copy> function_copy(ptr);\n\n            bfp_type temp;\n            temp.set(ptr->item,funct);\n            uint64 id = impl->add_task_internal(temp, function_copy);\n\n            return id;\n        }\n        \n        template <typename T>\n        uint64 add_task_by_value (\n            const T& obj,\n            void (T::*funct)() \n        ) \n        { \n            thread_pool_implementation::function_object_copy_instance<T>* ptr = 0;\n            ptr = new thread_pool_implementation::function_object_copy_instance<T>(obj);\n            std::shared_ptr<thread_pool_implementation::function_object_copy> function_copy(ptr);\n\n            bfp_type temp;\n            temp.set(ptr->item,funct);\n            uint64 id = impl->add_task_internal(temp, function_copy);\n\n            return id;\n        }\n\n        uint64 add_task (\n            void (*funct)()\n        ) \n        { \n            bfp_type temp;\n            temp.set(funct);\n            uint64 id = impl->add_task_internal(temp);\n\n            return id;\n        }\n\n        // --------------------\n\n        template <typename F, typename A1>\n        uint64 add_task (\n            F& function_object,\n            future<A1>& arg1\n        ) \n        { \n            COMPILE_TIME_ASSERT(is_function<F>::value == false);\n            COMPILE_TIME_ASSERT(is_pointer_type<F>::value == false);\n            \n            bfp_type temp;\n            temp.set(function_object,arg1.get());\n            uint64 id = impl->add_task_internal(temp);\n\n            // tie the future to this task\n            arg1.task_id = id;\n            arg1.tp = impl;\n            return id;\n        }\n        \n        template <typename F, typename A1>\n        uint64 add_task_by_value (\n            const F& function_object,\n            future<A1>& arg1\n        ) \n        { \n            thread_pool_implementation::function_object_copy_instance<F>* ptr = 0;\n            ptr = new thread_pool_implementation::function_object_copy_instance<F>(function_object);\n            std::shared_ptr<thread_pool_implementation::function_object_copy> function_copy(ptr);\n\n            bfp_type temp;\n            temp.set(ptr->item, arg1.get());\n            uint64 id = impl->add_task_internal(temp, function_copy);\n\n            // tie the future to this task\n            arg1.task_id = id;\n            arg1.tp = impl;\n            return id;\n        }\n        \n        template <typename T, typename T1, typename A1>\n        uint64 add_task (\n            T& obj,\n            void (T::*funct)(T1),\n            future<A1>& arg1\n        ) \n        { \n            bfp_type temp;\n            temp.set(obj,funct,arg1.get());\n            uint64 id = impl->add_task_internal(temp);\n\n            // tie the future to this task\n            arg1.task_id = id;\n            arg1.tp = impl;\n            return id;\n        }\n\n        template <typename T, typename T1, typename A1>\n        uint64 add_task_by_value (\n            const T& obj,\n            void (T::*funct)(T1),\n            future<A1>& arg1\n        ) \n        { \n            thread_pool_implementation::function_object_copy_instance<T>* ptr = 0;\n            ptr = new thread_pool_implementation::function_object_copy_instance<T>(obj);\n            std::shared_ptr<thread_pool_implementation::function_object_copy> function_copy(ptr);\n\n            bfp_type temp;\n            temp.set(ptr->item,funct,arg1.get());\n            uint64 id = impl->add_task_internal(temp, function_copy);\n\n            // tie the future to this task\n            arg1.task_id = id;\n            arg1.tp = impl;\n            return id;\n        }\n        \n        \n        template <typename T, typename T1, typename A1>\n        uint64 add_task (\n            const T& obj,\n            void (T::*funct)(T1) const,\n            future<A1>& arg1\n        ) \n        { \n            bfp_type temp;\n            temp.set(obj,funct,arg1.get());\n            uint64 id = impl->add_task_internal(temp);\n\n            // tie the future to this task\n            arg1.task_id = id;\n            arg1.tp = impl;\n            return id;\n        }\n        \n        template <typename T, typename T1, typename A1>\n        uint64 add_task_by_value (\n            const T& obj,\n            void (T::*funct)(T1) const,\n            future<A1>& arg1\n        ) \n        { \n            thread_pool_implementation::function_object_copy_instance<const T>* ptr = 0;\n            ptr = new thread_pool_implementation::function_object_copy_instance<const T>(obj);\n            std::shared_ptr<thread_pool_implementation::function_object_copy> function_copy(ptr);\n\n            bfp_type temp;\n            temp.set(ptr->item,funct,arg1.get());\n            uint64 id = impl->add_task_internal(temp, function_copy);\n\n            // tie the future to this task\n            arg1.task_id = id;\n            arg1.tp = impl;\n            return id;\n        }\n        \n        template <typename T1, typename A1>\n        uint64 add_task (\n            void (*funct)(T1),\n            future<A1>& arg1\n        ) \n        { \n            bfp_type temp;\n            temp.set(funct,arg1.get());\n            uint64 id = impl->add_task_internal(temp);\n\n            // tie the future to this task\n            arg1.task_id = id;\n            arg1.tp = impl;\n            return id;\n        }\n\n        // --------------------\n\n        template <typename F, typename A1, typename A2>\n        uint64 add_task (\n            F& function_object,\n            future<A1>& arg1,\n            future<A2>& arg2\n        ) \n        { \n            COMPILE_TIME_ASSERT(is_function<F>::value == false);\n            COMPILE_TIME_ASSERT(is_pointer_type<F>::value == false);\n            \n            bfp_type temp;\n            temp.set(function_object, arg1.get(), arg2.get());\n            uint64 id = impl->add_task_internal(temp);\n\n            // tie the future to this task\n            arg1.task_id = id;\n            arg1.tp = impl;\n            arg2.task_id = id;\n            arg2.tp = impl;\n            return id;\n        }\n        \n        template <typename F, typename A1, typename A2>\n        uint64 add_task_by_value (\n            const F& function_object,\n            future<A1>& arg1,\n            future<A2>& arg2\n        ) \n        { \n            thread_pool_implementation::function_object_copy_instance<F>* ptr = 0;\n            ptr = new thread_pool_implementation::function_object_copy_instance<F>(function_object);\n            std::shared_ptr<thread_pool_implementation::function_object_copy> function_copy(ptr);\n\n            bfp_type temp;\n            temp.set(ptr->item, arg1.get(), arg2.get());\n            uint64 id = impl->add_task_internal(temp, function_copy);\n\n            // tie the future to this task\n            arg1.task_id = id;\n            arg1.tp = impl;\n            arg2.task_id = id;\n            arg2.tp = impl;\n            return id;\n        }\n        \n        template <typename T, typename T1, typename A1,\n                              typename T2, typename A2>\n        uint64 add_task (\n            T& obj,\n            void (T::*funct)(T1,T2),\n            future<A1>& arg1,\n            future<A2>& arg2\n        ) \n        { \n            bfp_type temp;\n            temp.set(obj, funct, arg1.get(), arg2.get());\n            uint64 id = impl->add_task_internal(temp);\n\n            // tie the futures to this task\n            arg1.task_id = id;\n            arg1.tp = impl;\n            arg2.task_id = id;\n            arg2.tp = impl;\n            return id;\n        }\n        \n        template <typename T, typename T1, typename A1,\n                              typename T2, typename A2>\n        uint64 add_task_by_value (\n            const T& obj,\n            void (T::*funct)(T1,T2),\n            future<A1>& arg1,\n            future<A2>& arg2\n        ) \n        { \n            thread_pool_implementation::function_object_copy_instance<T>* ptr = 0;\n            ptr = new thread_pool_implementation::function_object_copy_instance<T>(obj);\n            std::shared_ptr<thread_pool_implementation::function_object_copy> function_copy(ptr);\n\n            bfp_type temp;\n            temp.set(ptr->item, funct, arg1.get(), arg2.get());\n            uint64 id = impl->add_task_internal(temp, function_copy);\n\n            // tie the futures to this task\n            arg1.task_id = id;\n            arg1.tp = impl;\n            arg2.task_id = id;\n            arg2.tp = impl;\n            return id;\n        }\n        \n        template <typename T, typename T1, typename A1,\n                              typename T2, typename A2>\n        uint64 add_task (\n            const T& obj,\n            void (T::*funct)(T1,T2) const,\n            future<A1>& arg1,\n            future<A2>& arg2\n        ) \n        { \n            bfp_type temp;\n            temp.set(obj, funct, arg1.get(), arg2.get());\n            uint64 id = impl->add_task_internal(temp);\n\n            // tie the futures to this task\n            arg1.task_id = id;\n            arg1.tp = impl;\n            arg2.task_id = id;\n            arg2.tp = impl;\n            return id;\n        }\n        \n        template <typename T, typename T1, typename A1,\n                              typename T2, typename A2>\n        uint64 add_task_by_value (\n            const T& obj,\n            void (T::*funct)(T1,T2) const,\n            future<A1>& arg1,\n            future<A2>& arg2\n        ) \n        { \n            thread_pool_implementation::function_object_copy_instance<const T>* ptr = 0;\n            ptr = new thread_pool_implementation::function_object_copy_instance<const T>(obj);\n            std::shared_ptr<thread_pool_implementation::function_object_copy> function_copy(ptr);\n\n            bfp_type temp;\n            temp.set(ptr->item, funct, arg1.get(), arg2.get());\n            uint64 id = impl->add_task_internal(temp, function_copy);\n\n            // tie the futures to this task\n            arg1.task_id = id;\n            arg1.tp = impl;\n            arg2.task_id = id;\n            arg2.tp = impl;\n            return id;\n        }\n        \n        template <typename T1, typename A1,\n                  typename T2, typename A2>\n        uint64 add_task (\n            void (*funct)(T1,T2),\n            future<A1>& arg1,\n            future<A2>& arg2\n        ) \n        { \n            bfp_type temp;\n            temp.set(funct, arg1.get(), arg2.get());\n            uint64 id = impl->add_task_internal(temp);\n\n            // tie the futures to this task\n            arg1.task_id = id;\n            arg1.tp = impl;\n            arg2.task_id = id;\n            arg2.tp = impl;\n            return id;\n        }\n\n        // --------------------\n\n        template <typename F, typename A1, typename A2, typename A3>\n        uint64 add_task (\n            F& function_object,\n            future<A1>& arg1,\n            future<A2>& arg2,\n            future<A3>& arg3\n        ) \n        { \n            COMPILE_TIME_ASSERT(is_function<F>::value == false);\n            COMPILE_TIME_ASSERT(is_pointer_type<F>::value == false);\n            \n            bfp_type temp;\n            temp.set(function_object, arg1.get(), arg2.get(), arg3.get());\n            uint64 id = impl->add_task_internal(temp);\n\n            // tie the future to this task\n            arg1.task_id = id;\n            arg1.tp = impl;\n            arg2.task_id = id;\n            arg2.tp = impl;\n            arg3.task_id = id;\n            arg3.tp = impl;\n            return id;\n        }\n        \n        template <typename F, typename A1, typename A2, typename A3>\n        uint64 add_task_by_value (\n            const F& function_object,\n            future<A1>& arg1,\n            future<A2>& arg2,\n            future<A3>& arg3\n        ) \n        { \n            thread_pool_implementation::function_object_copy_instance<F>* ptr = 0;\n            ptr = new thread_pool_implementation::function_object_copy_instance<F>(function_object);\n            std::shared_ptr<thread_pool_implementation::function_object_copy> function_copy(ptr);\n\n            bfp_type temp;\n            temp.set(ptr->item, arg1.get(), arg2.get(), arg3.get());\n            uint64 id = impl->add_task_internal(temp, function_copy);\n\n            // tie the future to this task\n            arg1.task_id = id;\n            arg1.tp = impl;\n            arg2.task_id = id;\n            arg2.tp = impl;\n            arg3.task_id = id;\n            arg3.tp = impl;\n            return id;\n        }\n        \n        template <typename T, typename T1, typename A1,\n                              typename T2, typename A2,\n                              typename T3, typename A3>\n        uint64 add_task (\n            T& obj,\n            void (T::*funct)(T1,T2,T3),\n            future<A1>& arg1,\n            future<A2>& arg2,\n            future<A3>& arg3\n        ) \n        { \n            bfp_type temp;\n            temp.set(obj, funct, arg1.get(), arg2.get(), arg3.get());\n            uint64 id = impl->add_task_internal(temp);\n\n            // tie the futures to this task\n            arg1.task_id = id;\n            arg1.tp = impl;\n            arg2.task_id = id;\n            arg2.tp = impl;\n            arg3.task_id = id;\n            arg3.tp = impl;\n            return id;\n        }\n        \n        template <typename T, typename T1, typename A1,\n                              typename T2, typename A2,\n                              typename T3, typename A3>\n        uint64 add_task_by_value (\n            const T& obj,\n            void (T::*funct)(T1,T2,T3),\n            future<A1>& arg1,\n            future<A2>& arg2,\n            future<A3>& arg3\n        ) \n        { \n            thread_pool_implementation::function_object_copy_instance<T>* ptr = 0;\n            ptr = new thread_pool_implementation::function_object_copy_instance<T>(obj);\n            std::shared_ptr<thread_pool_implementation::function_object_copy> function_copy(ptr);\n\n            bfp_type temp;\n            temp.set(ptr->item, funct, arg1.get(), arg2.get(), arg3.get());\n            uint64 id = impl->add_task_internal(temp, function_copy);\n\n            // tie the futures to this task\n            arg1.task_id = id;\n            arg1.tp = impl;\n            arg2.task_id = id;\n            arg2.tp = impl;\n            arg3.task_id = id;\n            arg3.tp = impl;\n            return id;\n        }\n        \n        template <typename T, typename T1, typename A1,\n                              typename T2, typename A2,\n                              typename T3, typename A3>\n        uint64 add_task (\n            const T& obj,\n            void (T::*funct)(T1,T2,T3) const,\n            future<A1>& arg1,\n            future<A2>& arg2,\n            future<A3>& arg3\n        ) \n        { \n            bfp_type temp;\n            temp.set(obj, funct, arg1.get(), arg2.get(), arg3.get());\n            uint64 id = impl->add_task_internal(temp);\n\n            // tie the futures to this task\n            arg1.task_id = id;\n            arg1.tp = impl;\n            arg2.task_id = id;\n            arg2.tp = impl;\n            arg3.task_id = id;\n            arg3.tp = impl;\n            return id;\n        }\n        \n        template <typename T, typename T1, typename A1,\n                              typename T2, typename A2,\n                              typename T3, typename A3>\n        uint64 add_task_by_value (\n            const T& obj,\n            void (T::*funct)(T1,T2,T3) const,\n            future<A1>& arg1,\n            future<A2>& arg2,\n            future<A3>& arg3\n        ) \n        { \n            thread_pool_implementation::function_object_copy_instance<const T>* ptr = 0;\n            ptr = new thread_pool_implementation::function_object_copy_instance<const T>(obj);\n            std::shared_ptr<thread_pool_implementation::function_object_copy> function_copy(ptr);\n\n            bfp_type temp;\n            temp.set(ptr->item, funct, arg1.get(), arg2.get(), arg3.get());\n            uint64 id = impl->add_task_internal(temp, function_copy);\n\n            // tie the futures to this task\n            arg1.task_id = id;\n            arg1.tp = impl;\n            arg2.task_id = id;\n            arg2.tp = impl;\n            arg3.task_id = id;\n            arg3.tp = impl;\n            return id;\n        }\n        \n        template <typename T1, typename A1,\n                  typename T2, typename A2,\n                  typename T3, typename A3>\n        uint64 add_task (\n            void (*funct)(T1,T2,T3),\n            future<A1>& arg1,\n            future<A2>& arg2,\n            future<A3>& arg3\n        ) \n        { \n            bfp_type temp;\n            temp.set(funct, arg1.get(), arg2.get(), arg3.get());\n            uint64 id = impl->add_task_internal(temp);\n\n            // tie the futures to this task\n            arg1.task_id = id;\n            arg1.tp = impl;\n            arg2.task_id = id;\n            arg2.tp = impl;\n            arg3.task_id = id;\n            arg3.tp = impl;\n            return id;\n        }\n\n        // --------------------\n\n        template <typename F, typename A1, typename A2, typename A3, typename A4>\n        uint64 add_task (\n            F& function_object,\n            future<A1>& arg1,\n            future<A2>& arg2,\n            future<A3>& arg3,\n            future<A4>& arg4\n        ) \n        { \n            COMPILE_TIME_ASSERT(is_function<F>::value == false);\n            COMPILE_TIME_ASSERT(is_pointer_type<F>::value == false);\n            \n            bfp_type temp;\n            temp.set(function_object, arg1.get(), arg2.get(), arg3.get(), arg4.get());\n            uint64 id = impl->add_task_internal(temp);\n\n            // tie the future to this task\n            arg1.task_id = id;\n            arg1.tp = impl;\n            arg2.task_id = id;\n            arg2.tp = impl;\n            arg3.task_id = id;\n            arg3.tp = impl;\n            arg4.task_id = id;\n            arg4.tp = impl;\n            return id;\n        }\n        \n        template <typename F, typename A1, typename A2, typename A3, typename A4>\n        uint64 add_task_by_value (\n            const F& function_object,\n            future<A1>& arg1,\n            future<A2>& arg2,\n            future<A3>& arg3,\n            future<A4>& arg4\n        ) \n        { \n            thread_pool_implementation::function_object_copy_instance<F>* ptr = 0;\n            ptr = new thread_pool_implementation::function_object_copy_instance<F>(function_object);\n            std::shared_ptr<thread_pool_implementation::function_object_copy> function_copy(ptr);\n\n            bfp_type temp;\n            temp.set(ptr->item, arg1.get(), arg2.get(), arg3.get(), arg4.get());\n            uint64 id = impl->add_task_internal(temp, function_copy);\n\n            // tie the future to this task\n            arg1.task_id = id;\n            arg1.tp = impl;\n            arg2.task_id = id;\n            arg2.tp = impl;\n            arg3.task_id = id;\n            arg3.tp = impl;\n            arg4.task_id = id;\n            arg4.tp = impl;\n            return id;\n        }\n        \n        template <typename T, typename T1, typename A1,\n                              typename T2, typename A2,\n                              typename T3, typename A3,\n                              typename T4, typename A4>\n        uint64 add_task (\n            T& obj,\n            void (T::*funct)(T1,T2,T3,T4),\n            future<A1>& arg1,\n            future<A2>& arg2,\n            future<A3>& arg3,\n            future<A4>& arg4\n        ) \n        { \n            bfp_type temp;\n            temp.set(obj, funct, arg1.get(), arg2.get(), arg3.get(), arg4.get());\n            uint64 id = impl->add_task_internal(temp);\n\n            // tie the futures to this task\n            arg1.task_id = id;\n            arg1.tp = impl;\n            arg2.task_id = id;\n            arg2.tp = impl;\n            arg3.task_id = id;\n            arg3.tp = impl;\n            arg4.task_id = id;\n            arg4.tp = impl;\n            return id;\n        }\n        \n        template <typename T, typename T1, typename A1,\n                              typename T2, typename A2,\n                              typename T3, typename A3,\n                              typename T4, typename A4>\n        uint64 add_task_by_value (\n            const T& obj,\n            void (T::*funct)(T1,T2,T3,T4),\n            future<A1>& arg1,\n            future<A2>& arg2,\n            future<A3>& arg3,\n            future<A4>& arg4\n        ) \n        { \n            thread_pool_implementation::function_object_copy_instance<T>* ptr = 0;\n            ptr = new thread_pool_implementation::function_object_copy_instance<T>(obj);\n            std::shared_ptr<thread_pool_implementation::function_object_copy> function_copy(ptr);\n\n            bfp_type temp;\n            temp.set(ptr->item, funct, arg1.get(), arg2.get(), arg3.get(), arg4.get());\n            uint64 id = impl->add_task_internal(temp, function_copy);\n\n            // tie the futures to this task\n            arg1.task_id = id;\n            arg1.tp = impl;\n            arg2.task_id = id;\n            arg2.tp = impl;\n            arg3.task_id = id;\n            arg3.tp = impl;\n            arg4.task_id = id;\n            arg4.tp = impl;\n            return id;\n        }\n        \n        template <typename T, typename T1, typename A1,\n                              typename T2, typename A2,\n                              typename T3, typename A3,\n                              typename T4, typename A4>\n        uint64 add_task (\n            const T& obj,\n            void (T::*funct)(T1,T2,T3,T4) const,\n            future<A1>& arg1,\n            future<A2>& arg2,\n            future<A3>& arg3,\n            future<A4>& arg4\n        ) \n        { \n            bfp_type temp;\n            temp.set(obj, funct, arg1.get(), arg2.get(), arg3.get(), arg4.get());\n            uint64 id = impl->add_task_internal(temp);\n\n            // tie the futures to this task\n            arg1.task_id = id;\n            arg1.tp = impl;\n            arg2.task_id = id;\n            arg2.tp = impl;\n            arg3.task_id = id;\n            arg3.tp = impl;\n            arg4.task_id = id;\n            arg4.tp = impl;\n            return id;\n        }\n        \n        template <typename T, typename T1, typename A1,\n                              typename T2, typename A2,\n                              typename T3, typename A3,\n                              typename T4, typename A4>\n        uint64 add_task_by_value (\n            const T& obj,\n            void (T::*funct)(T1,T2,T3,T4) const,\n            future<A1>& arg1,\n            future<A2>& arg2,\n            future<A3>& arg3,\n            future<A4>& arg4\n        ) \n        { \n            thread_pool_implementation::function_object_copy_instance<const T>* ptr = 0;\n            ptr = new thread_pool_implementation::function_object_copy_instance<const T>(obj);\n            std::shared_ptr<thread_pool_implementation::function_object_copy> function_copy(ptr);\n\n            bfp_type temp;\n            temp.set(ptr->item, funct, arg1.get(), arg2.get(), arg3.get(), arg4.get());\n            uint64 id = impl->add_task_internal(temp, function_copy);\n\n            // tie the futures to this task\n            arg1.task_id = id;\n            arg1.tp = impl;\n            arg2.task_id = id;\n            arg2.tp = impl;\n            arg3.task_id = id;\n            arg3.tp = impl;\n            arg4.task_id = id;\n            arg4.tp = impl;\n            return id;\n        }\n        \n        template <typename T1, typename A1,\n                  typename T2, typename A2,\n                  typename T3, typename A3,\n                  typename T4, typename A4>\n        uint64 add_task (\n            void (*funct)(T1,T2,T3,T4),\n            future<A1>& arg1,\n            future<A2>& arg2,\n            future<A3>& arg3,\n            future<A4>& arg4\n        ) \n        { \n            bfp_type temp;\n            temp.set(funct, arg1.get(), arg2.get(), arg3.get(), arg4.get());\n            uint64 id = impl->add_task_internal(temp);\n\n            // tie the futures to this task\n            arg1.task_id = id;\n            arg1.tp = impl;\n            arg2.task_id = id;\n            arg2.tp = impl;\n            arg3.task_id = id;\n            arg3.tp = impl;\n            arg4.task_id = id;\n            arg4.tp = impl;\n            return id;\n        }\n\n    private:\n\n        std::shared_ptr<thread_pool_implementation> impl;\n\n        // restricted functions\n        thread_pool(thread_pool&);        // copy constructor\n        thread_pool& operator=(thread_pool&);    // assignment operator\n\n    };\n\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void future<T>::\n    wait (\n    ) const\n    {\n        if (tp)\n        {\n            tp->wait_for_task(task_id);\n            tp.reset();\n            task_id = 0;\n        }\n    }\n\n}\n\n// ----------------------------------------------------------------------------------------\n\n#ifdef NO_MAKEFILE\n#include \"thread_pool_extension.cpp\"\n#endif\n\n#endif // DLIB_THREAD_POOl_Hh_\n\n\n"
  },
  {
    "path": "benchmarks/dlib/threads/thread_pool_extension_abstract.h",
    "content": "// Copyright (C) 2008  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_THREAD_POOl_ABSTRACT_Hh_\n#ifdef DLIB_THREAD_POOl_ABSTRACT_Hh_ \n\n#include \"threads_kernel_abstract.h\"\n#include \"../uintn.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    class future\n    {\n        /*!\n            INITIAL VALUE \n                - is_ready() == true\n\n            WHAT THIS OBJECT REPRESENTS\n                This object represents a container that allows you to safely pass objects \n                into the tasks performed by the thread_pool object defined below.  An\n                example will make it clear:\n\n                    // Suppose you have a global function defined as follows\n                    void add (int a, int b, int& result) { result = a + b; }\n\n                    // Also suppose you have a thread_pool named tp defined somewhere.\n                    // Then you could do the following.\n                    future<int> a, b, result;\n                    a = 3;\n                    b = 4;\n                    // this function call causes another thread to execute a call to the add() function\n                    // and passes in the int objects contained in a, b, and result\n                    tp.add_task(add,a,b,result);\n                    // This line will wait for the task in the thread pool to finish and then print the\n                    // value in the result integer.  So it will print a 7.\n                    cout << result << endl;\n        !*/\n\n    public:\n        future (\n        );\n        /*!\n            ensures\n                - The object of type T contained in this future has\n                  an initial value for its type. \n                - #is_ready() == true\n        !*/\n\n        future (\n            const T& item\n        );\n        /*!\n            ensures\n                - #get() == item\n                - #is_ready() == true\n        !*/\n\n        future (\n            const future& item\n        ); \n        /*!\n            ensures\n                - if (item.is_ready() == false) then\n                    - the call to this function blocks until the thread processing the task related\n                      to the item future has finished.\n                - #is_ready() == true\n                - #item.is_ready() == true\n                - #get() == item.get()\n        !*/\n\n        ~future (\n        );\n        /*!\n            ensures\n                - if (is_ready() == false) then\n                    - the call to this function blocks until the thread processing the task related\n                      to this future has finished.\n        !*/\n\n        bool is_ready (\n        ) const;\n        /*!\n            ensures\n                - if (the value of this future may not yet be ready to be accessed because it \n                  is in use by a task in a thread_pool) then\n                    - returns false \n                - else\n                    - returns true \n        !*/\n\n        future& operator=(\n            const T& item\n        );\n        /*!\n            ensures\n                - if (is_ready() == false) then\n                    - the call to this function blocks until the thread processing the task related\n                      to this future has finished.\n                - #is_ready() == true\n                - #get() == item\n                - returns *this\n        !*/\n\n        future& operator=(\n            const future& item\n        );\n        /*!\n            ensures\n                - if (is_ready() == false || item.is_ready() == false) then\n                    - the call to this function blocks until the threads processing the tasks related\n                      to this future and the item future have finished.\n                - #is_ready() == true\n                - #item.is_ready() == true\n                - #get() == item.get()\n                - returns *this\n        !*/\n\n        operator T& (\n        );\n        /*!\n            ensures\n                - if (is_ready() == false) then\n                    - the call to this function blocks until the thread processing the task related\n                      to this future has finished.\n                - #is_ready() == true\n                - returns get()\n        !*/\n\n        operator const T& (\n        ) const;\n        /*!\n            ensures\n                - if (is_ready() == false) then\n                    - the call to this function blocks until the thread processing the task related\n                      to this future has finished.\n                - #is_ready() == true\n                - returns get()\n        !*/\n\n        T& get (\n        );\n        /*!\n            ensures\n                - if (is_ready() == false) then\n                    - the call to this function blocks until the thread processing the task related\n                      to this future has finished.\n                - #is_ready() == true\n                - returns a non-const reference to the object of type T contained inside this future\n        !*/\n\n        const T& get (\n        ) const;\n        /*!\n            ensures\n                - if (is_ready() == false) then\n                    - the call to this function blocks until the thread processing the task related\n                      to this future has finished.\n                - #is_ready() == true\n                - returns a const reference to the object of type T contained inside this future\n        !*/\n\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    inline void swap (\n        future<T>& a,\n        future<T>& b\n    ) { std::swap(a.get(), b.get()); }\n    /*!\n        provides a global swap function\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n\n//  The future object comes with overloads for all the usual comparison operators.\n\n    template <typename T> bool operator== (const future<T>& a, const future<T>& b) { return a.get() == b.get(); }\n    template <typename T> bool operator!= (const future<T>& a, const future<T>& b) { return a.get() != b.get(); }\n    template <typename T> bool operator<= (const future<T>& a, const future<T>& b) { return a.get() <= b.get(); }\n    template <typename T> bool operator>= (const future<T>& a, const future<T>& b) { return a.get() >= b.get(); }\n    template <typename T> bool operator<  (const future<T>& a, const future<T>& b) { return a.get() <  b.get(); }\n    template <typename T> bool operator>  (const future<T>& a, const future<T>& b) { return a.get() >  b.get(); }\n\n    template <typename T> bool operator== (const future<T>& a, const T& b)         { return a.get() == b; }\n    template <typename T> bool operator== (const T& a,         const future<T>& b) { return a       == b.get(); }\n    template <typename T> bool operator!= (const future<T>& a, const T& b)         { return a.get() != b; }\n    template <typename T> bool operator!= (const T& a,         const future<T>& b) { return a       != b.get(); }\n    template <typename T> bool operator<= (const future<T>& a, const T& b)         { return a.get() <= b; }\n    template <typename T> bool operator<= (const T& a,         const future<T>& b) { return a       <= b.get(); }\n    template <typename T> bool operator>= (const future<T>& a, const T& b)         { return a.get() >= b; }\n    template <typename T> bool operator>= (const T& a,         const future<T>& b) { return a       >= b.get(); }\n    template <typename T> bool operator<  (const future<T>& a, const T& b)         { return a.get() <  b; }\n    template <typename T> bool operator<  (const T& a,         const future<T>& b) { return a       <  b.get(); }\n    template <typename T> bool operator>  (const future<T>& a, const T& b)         { return a.get() >  b; }\n    template <typename T> bool operator>  (const T& a,         const future<T>& b) { return a       >  b.get(); }\n\n// ----------------------------------------------------------------------------------------\n\n    class thread_pool \n    {\n        /*!\n            WHAT THIS OBJECT REPRESENTS\n                This object represents a fixed size group of threads which you can\n                submit tasks to and then wait for those tasks to be completed. \n\n                Note that setting the number of threads to 0 is a valid way to\n                use this object.  It causes it to not contain any threads\n                at all.  When tasks are submitted to the object in this mode\n                the tasks are processed within the calling thread.  So in this\n                mode any thread that calls add_task() is considered to be\n                a thread_pool thread capable of executing tasks.\n\n                This object is also implemented such that no memory allocations occur \n                after the thread_pool has been constructed so long as the user doesn't \n                call any of the add_task_by_value() routines.  The future object also \n                doesn't perform any memory allocations or contain any system resources \n                such as mutex objects. \n\n            EXCEPTIONS\n                Note that if an exception is thrown inside a task thread and is not caught\n                then the exception will be trapped inside the thread pool and rethrown at a\n                later time when someone calls one of the add task or wait member functions\n                of the thread pool.  This allows exceptions to propagate out of task threads\n                and into the calling code where they can be handled.\n        !*/\n\n    public:\n        explicit thread_pool (\n            unsigned long num_threads\n        );\n        /*!\n            ensures\n                - #num_threads_in_pool() == num_threads\n            throws\n                - std::bad_alloc\n                - dlib::thread_error\n                    the constructor may throw this exception if there is a problem \n                    gathering resources to create threading objects.\n        !*/\n\n        ~thread_pool(\n        );\n        /*!\n            ensures\n                - blocks until all tasks in the pool have finished.\n                - If one of the threads has generated an exception but it hasn't yet been\n                  rethrown to the caller (e.g. by calling wait_for_all_tasks()) then the\n                  program will be terminated.  So make sure you handle all the possible\n                  exceptions from your tasks.\n        !*/\n\n        bool is_task_thread (\n        ) const;\n        /*!\n            ensures\n                - if (the thread calling this function is one of the threads in this\n                  thread pool or num_threads_in_pool() == 0) then\n                    - returns true\n                - else\n                    - returns false\n        !*/\n\n        unsigned long num_threads_in_pool (\n        ) const;\n        /*!\n            ensures\n                - returns the number of threads contained in this thread pool.  That is, returns\n                  the maximum number of tasks that this object will process concurrently.\n        !*/\n\n        template <typename F>\n        uint64 add_task_by_value (\n            const F& function_object\n        );\n        /*!\n            requires\n                - function_object() is a valid expression \n            ensures\n                - makes a copy of function_object, call it FCOPY.\n                - if (is_task_thread() == true and there aren't any free threads available) then\n                    - calls FCOPY() within the calling thread and returns when it finishes\n                - else\n                    - the call to this function blocks until there is a free thread in the pool\n                      to process this new task.  Once a free thread is available the task\n                      is handed off to that thread which then calls FCOPY().\n                - returns a task id that can be used by this->wait_for_task() to wait\n                  for the submitted task to finish.\n        !*/\n\n        template <typename T>\n        uint64 add_task (\n            T& obj,\n            void (T::*funct)()\n        );\n        /*!\n            requires\n                - funct == a valid member function pointer for class T\n                - obj will not go out of scope until after the task has completed (i.e. \n                  this function passes obj to the task by reference.  If you want to avoid\n                  this restriction then use add_task_by_value())\n            ensures\n                - if (is_task_thread() == true and there aren't any free threads available) then\n                    - calls (obj.*funct)() within the calling thread and returns\n                      when it finishes.\n                - else\n                    - the call to this function blocks until there is a free thread in the pool\n                      to process this new task.  Once a free thread is available the task\n                      is handed off to that thread which then calls (obj.*funct)()\n                - returns a task id that can be used by this->wait_for_task() to wait\n                  for the submitted task to finish.\n        !*/\n\n        template <typename T>\n        uint64 add_task_by_value (\n            const T& obj,\n            void (T::*funct)() \n        ); \n        /*!\n            requires\n                - funct == a valid member function pointer for class T\n            ensures\n                - makes a copy of obj, call it OBJ_COPY.\n                - if (is_task_thread() == true and there aren't any free threads available) then\n                    - calls (OBJ_COPY.*funct)() within the calling thread and returns \n                      when it finishes.\n                - else\n                    - the call to this function blocks until there is a free thread in the pool\n                      to process this new task.  Once a free thread is available the task\n                      is handed off to that thread which then calls (OBJ_COPY.*funct)().\n                - returns a task id that can be used by this->wait_for_task() to wait\n                  for the submitted task to finish.\n        !*/\n\n        template <typename T>\n        uint64 add_task (\n            T& obj,\n            void (T::*funct)(long),\n            long arg1\n        );\n        /*!\n            requires\n                - funct == a valid member function pointer for class T\n                - obj will not go out of scope until after the task has completed (i.e. \n                  this function passes obj to the task by reference.  If you want to avoid\n                  this restriction then use add_task_by_value())\n            ensures\n                - if (is_task_thread() == true and there aren't any free threads available) then\n                    - calls (obj.*funct)(arg1) within the calling thread and returns\n                      when it finishes\n                - else\n                    - the call to this function blocks until there is a free thread in the pool\n                      to process this new task.  Once a free thread is available the task\n                      is handed off to that thread which then calls (obj.*funct)(arg1)\n                - returns a task id that can be used by this->wait_for_task() to wait\n                  for the submitted task to finish.\n        !*/\n\n        template <typename T>\n        uint64 add_task (\n            T& obj,\n            void (T::*funct)(long,long),\n            long arg1,\n            long arg2\n        );\n        /*!\n            requires\n                - funct == a valid member function pointer for class T\n                - obj will not go out of scope until after the task has completed (i.e. \n                  this function passes obj to the task by reference.  If you want to avoid\n                  this restriction then use add_task_by_value())\n            ensures\n                - if (is_task_thread() == true and there aren't any free threads available) then\n                    - calls (obj.*funct)(arg1,arg2) within the calling thread and returns\n                      when it finishes\n                - else\n                    - the call to this function blocks until there is a free thread in the pool\n                      to process this new task.  Once a free thread is available the task\n                      is handed off to that thread which then calls (obj.*funct)(arg1,arg2)\n                - returns a task id that can be used by this->wait_for_task() to wait\n                  for the submitted task to finish.\n        !*/\n\n        void wait_for_task (\n            uint64 task_id\n        ) const;\n        /*!\n            ensures\n                - if (there is currently a task with the given id being executed in the thread pool) then\n                    - the call to this function blocks until the task with the given id is complete\n                - else\n                    - the call to this function returns immediately\n        !*/\n\n        void wait_for_all_tasks (\n        ) const;\n        /*!\n            ensures\n                - the call to this function blocks until all tasks which were submitted\n                  to the thread pool by the thread that is calling this function have \n                  finished.\n        !*/\n\n        // --------------------\n\n        template <typename F, typename A1>\n        uint64 add_task (\n            F& function_object,\n            future<A1>& arg1\n        );\n        /*!\n            requires\n                - function_object(arg1.get()) is a valid expression \n                  (i.e. The A1 type stored in the future must be a type that can be passed into the given function object)\n                - function_object will not go out of scope until after the task has completed (i.e. \n                  this function passes function_object to the task by reference.  If you want to avoid\n                  this restriction then use add_task_by_value())\n            ensures\n                - if (is_task_thread() == true and there aren't any free threads available) then\n                    - calls function_object(arg1.get()) within the calling thread and returns\n                      when it finishes\n                - else\n                    - the call to this function blocks until there is a free thread in the pool\n                      to process this new task.  Once a free thread is available the task\n                      is handed off to that thread which then calls function_object(arg1.get()).\n                - #arg1.is_ready() == false \n                - returns a task id that can be used by this->wait_for_task() to wait\n                  for the submitted task to finish.\n        !*/\n\n        template <typename F, typename A1>\n        uint64 add_task_by_value (\n            const F& function_object,\n            future<A1>& arg1\n        );\n        /*!\n            requires\n                - function_object(arg1.get()) is a valid expression \n                  (i.e. The A1 type stored in the future must be a type that can be passed into the given function object)\n            ensures\n                - makes a copy of function_object, call it FCOPY.\n                - if (is_task_thread() == true and there aren't any free threads available) then\n                    - calls FCOPY(arg1.get()) within the calling thread and returns when it finishes\n                - else\n                    - the call to this function blocks until there is a free thread in the pool\n                      to process this new task.  Once a free thread is available the task\n                      is handed off to that thread which then calls FCOPY(arg1.get()).\n                - #arg1.is_ready() == false \n                - returns a task id that can be used by this->wait_for_task() to wait\n                  for the submitted task to finish.\n        !*/\n\n        template <typename T, typename T1, typename A1>\n        uint64 add_task (\n            T& obj,\n            void (T::*funct)(T1),\n            future<A1>& arg1\n        ); \n        /*!\n            requires\n                - funct == a valid member function pointer for class T\n                - (obj.*funct)(arg1.get()) must be a valid expression.\n                  (i.e. The A1 type stored in the future must be a type that can be passed into the given function)\n                - obj will not go out of scope until after the task has completed (i.e. \n                  this function passes obj to the task by reference.  If you want to avoid\n                  this restriction then use add_task_by_value())\n            ensures\n                - if (is_task_thread() == true and there aren't any free threads available) then\n                    - calls (obj.*funct)(arg1.get()) within the calling thread and returns\n                      when it finishes\n                - else\n                    - the call to this function blocks until there is a free thread in the pool\n                      to process this new task.  Once a free thread is available the task\n                      is handed off to that thread which then calls (obj.*funct)(arg1.get()).\n                - #arg1.is_ready() == false \n                - returns a task id that can be used by this->wait_for_task() to wait\n                  for the submitted task to finish.\n        !*/\n        \n        template <typename T, typename T1, typename A1>\n        uint64 add_task_by_value (\n            const T& obj,\n            void (T::*funct)(T1),\n            future<A1>& arg1\n        ); \n        /*!\n            requires\n                - funct == a valid member function pointer for class T\n                - (obj.*funct)(arg1.get()) must be a valid expression.\n                  (i.e. The A1 type stored in the future must be a type that can be passed into the given function)\n            ensures\n                - makes a copy of obj, call it OBJ_COPY.\n                - if (is_task_thread() == true and there aren't any free threads available) then\n                    - calls (OBJ_COPY.*funct)(arg1.get()) within the calling thread and returns \n                      when it finishes.\n                - else\n                    - the call to this function blocks until there is a free thread in the pool\n                      to process this new task.  Once a free thread is available the task\n                      is handed off to that thread which then calls (OBJ_COPY.*funct)(arg1.get()).\n                - returns a task id that can be used by this->wait_for_task() to wait\n                  for the submitted task to finish.\n        !*/\n\n        template <typename T, typename T1, typename A1>\n        uint64 add_task (\n            const T& obj,\n            void (T::*funct)(T1) const,\n            future<A1>& arg1\n        ); \n        /*!\n            requires\n                - funct == a valid member function pointer for class T\n                - (obj.*funct)(arg1.get()) must be a valid expression.\n                  (i.e. The A1 type stored in the future must be a type that can be passed into the given function)\n                - obj will not go out of scope until after the task has completed (i.e. \n                  this function passes obj to the task by reference.  If you want to avoid\n                  this restriction then use add_task_by_value())\n            ensures\n                - if (is_task_thread() == true and there aren't any free threads available) then\n                    - calls (obj.*funct)(arg1.get()) within the calling thread and returns\n                      when it finishes\n                - else\n                    - the call to this function blocks until there is a free thread in the pool\n                      to process this new task.  Once a free thread is available the task\n                      is handed off to that thread which then calls (obj.*funct)(arg1.get()).\n                - #arg1.is_ready() == false \n                - returns a task id that can be used by this->wait_for_task() to wait\n                  for the submitted task to finish.\n        !*/\n        \n        template <typename T, typename T1, typename A1>\n        uint64 add_task_by_value (\n            const T& obj,\n            void (T::*funct)(T1) const,\n            future<A1>& arg1\n        ); \n        /*!\n            requires\n                - funct == a valid member function pointer for class T\n                - (obj.*funct)(arg1.get()) must be a valid expression.\n                  (i.e. The A1 type stored in the future must be a type that can be passed into the given function)\n            ensures\n                - makes a copy of obj, call it OBJ_COPY.\n                - if (is_task_thread() == true and there aren't any free threads available) then\n                    - calls (OBJ_COPY.*funct)(arg1.get()) within the calling thread and returns \n                      when it finishes.\n                - else\n                    - the call to this function blocks until there is a free thread in the pool\n                      to process this new task.  Once a free thread is available the task\n                      is handed off to that thread which then calls (OBJ_COPY.*funct)(arg1.get()).\n                - returns a task id that can be used by this->wait_for_task() to wait\n                  for the submitted task to finish.\n        !*/\n\n        template <typename T1, typename A1>\n        uint64 add_task (\n            void (*funct)(T1),\n            future<A1>& arg1\n        ); \n        /*!\n            requires\n                - funct == a valid function pointer \n                - (funct)(arg1.get()) must be a valid expression.\n                  (i.e. The A1 type stored in the future must be a type that can be passed into the given function)\n            ensures\n                - if (is_task_thread() == true and there aren't any free threads available) then\n                    - calls funct(arg1.get()) within the calling thread and returns\n                      when it finishes\n                - else\n                    - the call to this function blocks until there is a free thread in the pool\n                      to process this new task.  Once a free thread is available the task\n                      is handed off to that thread which then calls funct(arg1.get()).\n                - #arg1.is_ready() == false \n                - returns a task id that can be used by this->wait_for_task() to wait\n                  for the submitted task to finish.\n        !*/\n\n        // --------------------------------------------------------------------------------\n        // The remainder of this class just contains overloads for add_task() and add_task_by_value() \n        // that take up to 4 futures (as well as 0 futures).  Their behavior is identical to the above \n        // add_task() and add_task_by_value() functions.\n        // --------------------------------------------------------------------------------\n\n        template <typename F, typename A1, typename A2>\n        uint64 add_task (\n            F& function_object,\n            future<A1>& arg1,\n            future<A2>& arg2\n        );\n\n        template <typename F, typename A1, typename A2>\n        uint64 add_task_by_value (\n            const F& function_object,\n            future<A1>& arg1,\n            future<A2>& arg2\n        );\n\n        template <typename T, typename T1, typename A1,\n                              typename T2, typename A2>\n        uint64 add_task (\n            T& obj,\n            void (T::*funct)(T1,T2),\n            future<A1>& arg1,\n            future<A2>& arg2\n        ); \n        \n        uint64 add_task_by_value (\n            const T& obj,\n            void (T::*funct)(T1,T2),\n            future<A1>& arg1,\n            future<A2>& arg2\n        ); \n\n        template <typename T, typename T1, typename A1,\n                              typename T2, typename A2>\n        uint64 add_task (\n            const T& obj,\n            void (T::*funct)(T1,T2) const,\n            future<A1>& arg1,\n            future<A2>& arg2\n        ); \n        \n        template <typename T, typename T1, typename A1,\n                              typename T2, typename A2>\n        uint64 add_task_by_value (\n            const T& obj,\n            void (T::*funct)(T1,T2) const,\n            future<A1>& arg1,\n            future<A2>& arg2\n        ); \n\n        template <typename T1, typename A1,\n                  typename T2, typename A2>\n        uint64 add_task (\n            void (*funct)(T1,T2),\n            future<A1>& arg1,\n            future<A2>& arg2\n        ); \n\n        // --------------------\n\n        template <typename F, typename A1, typename A2, typename A3>\n        uint64 add_task (\n            F& function_object,\n            future<A1>& arg1,\n            future<A2>& arg2,\n            future<A3>& arg3\n        );\n\n        template <typename F, typename A1, typename A2, typename A3>\n        uint64 add_task_by_value (\n            const F& function_object,\n            future<A1>& arg1,\n            future<A2>& arg2,\n            future<A3>& arg3\n        );\n\n        template <typename T, typename T1, typename A1,\n                              typename T2, typename A2,\n                              typename T3, typename A3>\n        uint64 add_task (\n            T& obj,\n            void (T::*funct)(T1,T2,T3),\n            future<A1>& arg1,\n            future<A2>& arg2,\n            future<A3>& arg3\n        ); \n\n        template <typename T, typename T1, typename A1,\n                              typename T2, typename A2,\n                              typename T3, typename A3>\n        uint64 add_task_by_value (\n            const T& obj,\n            void (T::*funct)(T1,T2,T3),\n            future<A1>& arg1,\n            future<A2>& arg2,\n            future<A3>& arg3\n        ); \n        \n        template <typename T, typename T1, typename A1,\n                              typename T2, typename A2,\n                              typename T3, typename A3>\n        uint64 add_task (\n            const T& obj,\n            void (T::*funct)(T1,T2,T3) const,\n            future<A1>& arg1,\n            future<A2>& arg2,\n            future<A3>& arg3\n        ); \n\n        template <typename T, typename T1, typename A1,\n                              typename T2, typename A2,\n                              typename T3, typename A3>\n        uint64 add_task_by_value (\n            const T& obj,\n            void (T::*funct)(T1,T2,T3) const,\n            future<A1>& arg1,\n            future<A2>& arg2,\n            future<A3>& arg3\n        ); \n        \n        template <typename T1, typename A1,\n                  typename T2, typename A2,\n                  typename T3, typename A3>\n        uint64 add_task (\n            void (*funct)(T1,T2,T3),\n            future<A1>& arg1,\n            future<A2>& arg2,\n            future<A3>& arg3\n        ); \n\n        // --------------------\n\n        template <typename F, typename A1, typename A2, typename A3, typename A4>\n        uint64 add_task (\n            F& function_object,\n            future<A1>& arg1,\n            future<A2>& arg2,\n            future<A3>& arg3,\n            future<A4>& arg4\n        );\n\n        template <typename F, typename A1, typename A2, typename A3, typename A4>\n        uint64 add_task_by_value (\n            const F& function_object,\n            future<A1>& arg1,\n            future<A2>& arg2,\n            future<A3>& arg3,\n            future<A4>& arg4\n        );\n\n        template <typename T, typename T1, typename A1,\n                              typename T2, typename A2,\n                              typename T3, typename A3,\n                              typename T4, typename A4>\n        uint64 add_task (\n            T& obj,\n            void (T::*funct)(T1,T2,T3,T4),\n            future<A1>& arg1,\n            future<A2>& arg2,\n            future<A3>& arg3,\n            future<A4>& arg4\n        ); \n\n        template <typename T, typename T1, typename A1,\n                              typename T2, typename A2,\n                              typename T3, typename A3,\n                              typename T4, typename A4>\n        uint64 add_task_by_value (\n            const T& obj,\n            void (T::*funct)(T1,T2,T3,T4),\n            future<A1>& arg1,\n            future<A2>& arg2,\n            future<A3>& arg3,\n            future<A4>& arg4\n        ); \n        \n        template <typename T, typename T1, typename A1,\n                              typename T2, typename A2,\n                              typename T3, typename A3,\n                              typename T4, typename A4>\n        uint64 add_task (\n            const T& obj,\n            void (T::*funct)(T1,T2,T3,T4) const,\n            future<A1>& arg1,\n            future<A2>& arg2,\n            future<A3>& arg3,\n            future<A4>& arg4\n        ); \n\n        template <typename T, typename T1, typename A1,\n                              typename T2, typename A2,\n                              typename T3, typename A3,\n                              typename T4, typename A4>\n        uint64 add_task_by_value (\n            const T& obj,\n            void (T::*funct)(T1,T2,T3,T4) const,\n            future<A1>& arg1,\n            future<A2>& arg2,\n            future<A3>& arg3,\n            future<A4>& arg4\n        ); \n        \n        template <typename T1, typename A1,\n                  typename T2, typename A2,\n                  typename T3, typename A3,\n                  typename T4, typename A4>\n        uint64 add_task (\n            void (*funct)(T1,T2,T3,T4),\n            future<A1>& arg1,\n            future<A2>& arg2,\n            future<A3>& arg3,\n            future<A4>& arg4\n        );\n\n        // --------------------\n\n        template <typename F>\n        uint64 add_task (\n            F& function_object\n        );\n\n        template <typename T>\n        uint64 add_task (\n            const T& obj,\n            void (T::*funct)() const,\n        ); \n        \n        template <typename T>\n        uint64 add_task_by_value (\n            const T& obj,\n            void (T::*funct)() const\n        ); \n\n        uint64 add_task (\n            void (*funct)()\n        ); \n\n        // --------------------\n\n    private:\n\n        // restricted functions\n        thread_pool(thread_pool&);        // copy constructor\n        thread_pool& operator=(thread_pool&);    // assignment operator\n    };\n\n}\n\n// ----------------------------------------------------------------------------------------\n\n#endif // DLIB_THREAD_POOl_ABSTRACT_Hh_\n\n\n\n"
  },
  {
    "path": "benchmarks/dlib/threads/thread_specific_data_extension.h",
    "content": "// Copyright (C) 2006  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_THREAD_SPECIFIC_DATA_EXTENSIOn_\n#define DLIB_THREAD_SPECIFIC_DATA_EXTENSIOn_\n\n#include \"thread_specific_data_extension_abstract.h\"\n#include \"threads_kernel_abstract.h\"\n#include \"../binary_search_tree.h\"\n#include \"auto_mutex_extension.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    class thread_specific_data\n    {\n        /*!\n            CONVENTION\n                - for all valid ID:\n                  (*items[ID]) == pointer to the data for thread with id ID\n        !*/\n    public:\n\n        thread_specific_data (\n        )\n        {\n            thread_end_handler_calls_left = 0;\n        }\n\n        ~thread_specific_data (\n        )\n        {\n            // We should only call the unregister_thread_end_handler function if there are\n            // some outstanding callbacks we expect to get.  Otherwise lets avoid calling it\n            // since the dlib state that maintains the registered thread end handlers may have\n            // been destructed already (since the program might be in the process of terminating).\n            bool call_unregister = false;\n            m.lock();\n            if (thread_end_handler_calls_left > 0)\n                call_unregister = true;\n            m.unlock();\n\n            if (call_unregister)\n                unregister_thread_end_handler(const_cast<thread_specific_data&>(*this),&thread_specific_data::thread_end_handler);\n\n            auto_mutex M(m);\n            items.reset();\n            while (items.move_next())\n            {\n                delete items.element().value();\n            }\n        }\n\n        inline T& data (\n        ) { return get_data(); }\n\n        inline const T& data (\n        ) const { return get_data(); }\n\n    private:\n\n        T& get_data (\n        ) const\n        {\n            thread_id_type id = get_thread_id();\n            auto_mutex M(m);\n\n            T** item = items[id];\n            if (item)\n            {\n                return **item;\n            }\n            else\n            {\n                // register an end handler for this thread so long as it is a dlib created thread.\n                T* new_item = new T;\n\n                bool in_tree = false;\n                try\n                {\n                    T* temp_item = new_item;\n                    thread_id_type temp_id = id;\n                    items.add(temp_id,temp_item);\n                    in_tree = true;\n\n                    if (is_dlib_thread(id))\n                    {\n                        register_thread_end_handler(const_cast<thread_specific_data&>(*this),&thread_specific_data::thread_end_handler);\n                        ++thread_end_handler_calls_left;\n                    }\n                }\n                catch (...)\n                {\n                    if (in_tree)\n                    {\n                        items.destroy(id);\n                    }\n                    delete new_item;\n                    throw;\n                }\n\n                return *new_item;\n            }\n        }\n\n        void thread_end_handler (\n        )\n        {\n            const thread_id_type id = get_thread_id();\n            thread_id_type junk = 0;\n            T* item = 0;\n            auto_mutex M(m);\n            --thread_end_handler_calls_left;\n            if (items[id])\n            {\n                items.remove(id,junk,item);\n                delete item;\n            }\n        }\n\n        mutable typename binary_search_tree<thread_id_type,T*>::kernel_2a items;\n        mutex m;\n        mutable long thread_end_handler_calls_left;\n\n        // restricted functions\n        thread_specific_data(thread_specific_data&);        // copy constructor\n        thread_specific_data& operator=(thread_specific_data&);    // assignment operator\n    };\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_THREAD_SPECIFIC_DATA_EXTENSIOn_\n\n\n\n"
  },
  {
    "path": "benchmarks/dlib/threads/thread_specific_data_extension_abstract.h",
    "content": "// Copyright (C) 2006  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_THREAD_SPECIFIC_DATA_EXTENSIOn_ABSTRACT_\n#ifdef DLIB_THREAD_SPECIFIC_DATA_EXTENSIOn_ABSTRACT_\n\n#include \"threads_kernel_abstract.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    class thread_specific_data\n    {\n        /*!\n            WHAT THIS OBJECT REPRESENTS\n                This object represents a container of thread specific data.  When\n                a thread calls the data() member function it gets a reference to a T object\n                that is specific to its own thread.  Each subsequent call to data() from that\n                thread returns the same instance.  Also note that when a thread ends\n                the instance of its data() object gets destroyed and freed (if the thread\n                was created by the dlib library).  So any pointers or references to the object \n                will be invalid after the thread has ended.\n        !*/\n    public:\n\n        thread_specific_data (\n        );\n        /*!\n            ensures\n                - #*this is properly initialized\n        !*/\n\n        ~thread_specific_data (\n        );\n        /*!\n            ensures\n                - all resources allocated by *this have been freed.  This includes\n                  all the thread specific data returned by the data() functions.\n        !*/\n\n        T& data (\n        );\n        /*!\n            ensures\n                - if (the calling thread has NOT called this->data() before) then\n                    - constructs an instance of T that is specific to the calling\n                      thread.\n                - returns a reference to the T instance that was constructed for \n                  the calling thread.\n            throws\n                - std::bad_alloc or any exception thrown by T's constructor\n                  If an exception is thrown then the call to data() will have\n                  no effect on *this.\n        !*/\n\n        const T& data (\n        ) const;\n        /*!\n            ensures\n                - if (the calling thread has NOT called this->data() before) then\n                    - constructs an instance of T that is specific to the calling\n                      thread.\n                - returns a const reference to the T instance that was constructed for \n                  the calling thread.\n            throws\n                - std::bad_alloc or any exception thrown by T's constructor\n                  If an exception is thrown then the call to data() will have\n                  no effect on *this.\n        !*/\n\n    private:\n        // restricted functions\n        thread_specific_data(thread_specific_data&);        // copy constructor\n        thread_specific_data& operator=(thread_specific_data&);    // assignment operator\n    };\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_THREAD_SPECIFIC_DATA_EXTENSIOn_ABSTRACT_\n\n\n"
  },
  {
    "path": "benchmarks/dlib/threads/threaded_object_extension.h",
    "content": "// Copyright (C) 2007  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_THREADED_OBJECT_EXTENSIOn_\n#define DLIB_THREADED_OBJECT_EXTENSIOn_ \n\n#include \"threaded_object_extension_abstract.h\"\n#include \"threads_kernel.h\"\n#include \"auto_mutex_extension.h\"\n#include \"../algs.h\"\n#include \"../assert.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    class threaded_object\n    {\n        /*!\n            INITIAL VALUE\n                - is_running_ == false\n                - is_alive_ == false \n                - should_stop_ == false\n                - should_respawn_ == false\n\n#ifdef ENABLE_ASSERTS\n                - id_valid == false \n                - id1 == get_main_thread_id()\n#endif\n\n            CONVENTION\n                - is_running() == is_running_\n                - is_alive() == is_alive_\n                - should_stop() == should_stop_\n                - should_respawn() == should_respawn_\n\n\n#ifdef ENABLE_ASSERTS\n                - if (when thread() is executing) then\n                    - id1 == the id of the running thread \n                    - id_valid == true\n                - else\n                    - id1 == an undefined value\n                    - id_valid == false\n#endif\n\n                - m_ == the mutex used to protect all our variables\n                - s == the signaler for m_\n        !*/\n\n    public:\n\n        threaded_object (\n        );\n\n        virtual ~threaded_object (\n        );\n\n        bool is_running (\n        ) const;\n\n        bool is_alive (\n        ) const;\n\n        void wait (\n        ) const;\n\n        void start (\n        );\n\n        void restart (\n        );\n\n        void set_respawn (\n        );\n\n        bool should_respawn (\n        ) const;\n\n        void pause (\n        );\n\n        void stop (\n        );\n\n    protected:\n\n        bool should_stop (\n        ) const;\n\n    private:\n\n        void thread_helper(\n        );\n\n        virtual void thread (\n        ) = 0;\n\n        mutex m_;\n        signaler s;\n        thread_id_type id1;\n        bool is_running_;\n        bool is_alive_;\n        bool should_stop_;\n        bool should_respawn_;\n        bool id_valid;\n\n        // restricted functions\n        threaded_object(threaded_object&);        // copy constructor\n        threaded_object& operator=(threaded_object&);    // assignment operator\n    };\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#ifdef NO_MAKEFILE\n#include \"threaded_object_extension.cpp\"\n#endif\n\n#endif // DLIB_THREADED_OBJECT_EXTENSIOn_\n\n\n"
  },
  {
    "path": "benchmarks/dlib/threads/threaded_object_extension_abstract.h",
    "content": "// Copyright (C) 2007  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_THREADED_OBJECT_EXTENSIOn_ABSTRACT_\n#ifdef DLIB_THREADED_OBJECT_EXTENSIOn_ABSTRACT_ \n\n#include \"threads_kernel_abstract.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    class threaded_object\n    {\n        /*!\n            INITIAL VALUE\n                - is_running() == false\n                - is_alive() == false \n                - should_respawn() == false\n\n            WHAT THIS OBJECT REPRESENTS\n                This object represents a simple threaded object.  To use it you inherit\n                from it and define the thread() function.  Then when you call start()\n                it will spawn a thread that calls this->thread().  \n        !*/\n    public:\n\n        threaded_object (\n        );\n        /*!\n            ensures\n                - #*this is properly initialized\n            throws\n                - std::bad_alloc\n                - dlib::thread_error\n                    the constructor may throw this exception if there is a problem \n                    gathering resources to create threading objects.\n        !*/\n\n        virtual ~threaded_object (\n        );\n        /*!\n            requires\n                - is_alive() == false\n                  (i.e. in the destructor for the object you derive from this one you\n                  must wait for this->thread() to end.)\n            ensures\n                - all resources allocated by *this have been freed.  \n        !*/\n\n        bool is_running (\n        ) const;\n        /*!\n            requires\n                - is not called from this->thread()\n            ensures\n                - if (is_alive() && this->thread() is currently supposed to be executing) then\n                    - returns true\n                - else\n                    - returns false\n        !*/\n\n        bool is_alive (\n        ) const;\n        /*!\n            requires\n                - is not called from this->thread()\n            ensures\n                - if (this->thread() has been called by some thread and has yet to terminate) then\n                    - returns true\n                - else\n                    - returns false\n        !*/\n\n        void wait (\n        ) const;\n        /*!\n            requires\n                - is not called from this->thread()\n            ensures\n                - if (is_alive() == true) then\n                    - blocks until this->thread() terminates\n        !*/\n\n        void start (\n        );\n        /*!\n            requires\n                - is not called from this->thread()\n            ensures\n                - #is_alive() == true\n                - #is_running() == true\n                - #should_stop() == false\n            throws\n                - std::bad_alloc or dlib::thread_error\n                    If either of these exceptions are thrown then \n                    #is_alive() == false and #is_running() == false\n        !*/\n\n        void set_respawn (\n        );\n        /*!\n            requires\n                - is not called from this->thread()\n            ensures\n                - #should_respawn() == true\n        !*/\n\n        bool should_respawn (\n        ) const;\n        /*!\n            requires\n                - is not called from this->thread()\n            ensures\n                - returns true if the thread will automatically restart upon termination and\n                  false otherwise.  Note that every time a thread starts it sets should_respawn() \n                  back to false.  Therefore, a single call to set_respawn() can cause at most\n                  one respawn to occur. \n        !*/\n\n        void restart (\n        );\n        /*!\n            requires\n                - is not called from this->thread()\n            ensures\n                - This function atomically executes set_respawn() and start().  The precise meaning of this\n                  is defined below.\n                - if (is_alive()) then\n                    - #should_respawn() == true\n                - else\n                    - #should_respawn() == false \n                - #is_alive() == true\n                - #is_running() == true\n                - #should_stop() == false\n            throws\n                - std::bad_alloc or dlib::thread_error\n                    If either of these exceptions are thrown then \n                    #is_alive() == false and #is_running() == false\n        !*/\n\n        void pause (\n        );\n        /*!\n            requires\n                - is not called from this->thread()\n            ensures\n                - #is_running() == false\n        !*/\n\n        void stop (\n        );\n        /*!\n            requires\n                - is not called from this->thread()\n            ensures\n                - #should_stop() == true\n                - #is_running() == false\n                - #should_respawn() == false\n        !*/\n\n    protected:\n\n        bool should_stop (\n        ) const;\n        /*!\n            requires\n                - is only called from the thread that executes this->thread()\n            ensures\n                - calls to this function block until (#is_running() == true || #should_stop() == true) \n                - if (this thread is supposed to terminate) then\n                    - returns true\n                - else\n                    - returns false\n        !*/\n\n    private:\n\n        virtual void thread (\n        ) = 0;\n        /*!\n            requires\n                - is executed in its own thread\n                - is only executed in one thread at a time\n            throws\n                - does not throw any exceptions\n        !*/\n\n        // restricted functions\n        threaded_object(threaded_object&);        // copy constructor\n        threaded_object& operator=(threaded_object&);    // assignment operator\n    };\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_THREADED_OBJECT_EXTENSIOn_ABSTRACT_\n\n"
  },
  {
    "path": "benchmarks/dlib/threads/threads_kernel.h",
    "content": "// Copyright (C) 2006  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_THREADs_KERNEL_\n#define DLIB_THREADs_KERNEL_\n\n#include \"../platform.h\"\n\n#ifdef WIN32\n#include \"windows.h\"\n#endif\n\n#ifndef WIN32\n#include \"posix.h\"\n#endif\n\n#endif // DLIB_THREADs_KERNEL_\n\n\n"
  },
  {
    "path": "benchmarks/dlib/threads/threads_kernel_1.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_THREADS_KERNEl_1_\n#define DLIB_THREADS_KERNEl_1_\n\n#ifdef DLIB_ISO_CPP_ONLY\n#error \"DLIB_ISO_CPP_ONLY is defined so you can't use this OS dependent code.  Turn DLIB_ISO_CPP_ONLY off if you want to use it.\"\n#endif\n\n#include \"threads_kernel_abstract.h\"\n\n#include \"../windows_magic.h\"\n#include <windows.h>\n#include \"../algs.h\"\n#include <condition_variable>\n#include <mutex>\n#include <chrono>\n\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n    \n    typedef DWORD thread_id_type;\n\n    inline thread_id_type get_thread_id (\n    )\n    {\n        return GetCurrentThreadId();\n    }\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // mutex object\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    // forward declaration of signaler\n    class signaler;\n\n    class mutex\n    {\n    public:\n\n        mutex (\n        ) \n        {\n        }\n\n        ~mutex (\n        ) {  }\n\n        void lock (\n        ) const { cs.lock(); }\n\n        void unlock (\n        ) const { cs.unlock(); }\n\n    private:\n\n        friend class signaler;\n\n        mutable std::mutex cs;\n\n        // restricted functions\n        mutex(mutex&);        // copy constructor\n        mutex& operator=(mutex&);    // assignment operator\n    };\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // signaler object\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    class signaler\n    {\n\n    public:\n        signaler (\n            const mutex& associated_mutex\n        ) :\n            m(associated_mutex)\n        {           \n\n        }\n\n        ~signaler (\n        ) { }\n\n        void wait (\n        ) const\n        { \n            std::unique_lock<std::mutex> cs(m.cs, std::defer_lock);\n            cv.wait(cs);\n        }\n\n        bool wait_or_timeout (\n            unsigned long milliseconds\n        ) const\n        { \n            std::unique_lock<std::mutex> cs(m.cs, std::defer_lock);\n            auto status = cv.wait_until(cs, std::chrono::system_clock::now() + std::chrono::milliseconds(milliseconds));\n            return status == std::cv_status::no_timeout;\n        }\n\n        void signal (\n        ) const \n        { \n            cv.notify_one();\n        }\n\n        void broadcast (\n        ) const \n        { \n            cv.notify_all();\n        }\n\n        const mutex& get_mutex (\n        ) const { return m; }\n\n    private:\n\n        mutable std::condition_variable cv;\n\n        const mutex& m;\n\n        // restricted functions\n        signaler(signaler&);        // copy constructor\n        signaler& operator=(signaler&);    // assignment operator\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    namespace threads_kernel_shared_helpers\n    {\n        bool spawn_thread (\n            void (*funct)(void*),\n            void* param\n        );\n        /*!\n            is identical to create_new_thread() but just doesn't use any thread pooling.\n        !*/\n    }\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#include \"threads_kernel_shared.h\"\n\n#ifdef NO_MAKEFILE\n#include \"threads_kernel_1.cpp\"\n#endif\n\n#endif // DLIB_THREADS_KERNEl_1_\n\n"
  },
  {
    "path": "benchmarks/dlib/threads/threads_kernel_2.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_THREADS_KERNEl_2_\n#define DLIB_THREADS_KERNEl_2_\n\n#ifdef DLIB_ISO_CPP_ONLY\n#error \"DLIB_ISO_CPP_ONLY is defined so you can't use this OS dependent code.  Turn DLIB_ISO_CPP_ONLY off if you want to use it.\"\n#endif\n\n#include \"threads_kernel_abstract.h\"\n#include <pthread.h>\n#include <errno.h>\n#include <sys/time.h>\n#include \"../algs.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n    \n    typedef pthread_t thread_id_type;\n\n    inline thread_id_type get_thread_id (\n    )\n    {\n        return pthread_self();\n    }\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // mutex object\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    // forward declaration of signaler \n    class signaler;\n\n    class mutex\n    {\n        // give signaler access to hMutex\n        friend class signaler;\n    public:\n\n        mutex (\n        )\n        { \n            if (pthread_mutex_init(&myMutex,0)) \n            {\n                throw dlib::thread_error(ECREATE_MUTEX,\n        \"in function mutex::mutex() an error occurred making the mutex\"\n                );      \n            }\n        }\n\n        ~mutex (\n        ) { pthread_mutex_destroy(&myMutex); }\n\n        void lock (\n        ) const { pthread_mutex_lock(&myMutex); }\n\n        void unlock (\n        ) const { pthread_mutex_unlock(&myMutex); }\n\n    private:\n\n        mutable pthread_mutex_t myMutex;\n\n        // restricted functions\n        mutex(mutex&);        // copy constructor\n        mutex& operator=(mutex&);    // assignement opertor\n    };\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // signaler object\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    class signaler\n    {\n\n    public:\n\n\n        signaler (\n            const mutex& assoc_mutex\n        ) :\n            associated_mutex(&assoc_mutex.myMutex),\n            m(assoc_mutex)\n        { \n            if (pthread_cond_init(&cond,0))\n            {\n                throw dlib::thread_error(ECREATE_SIGNALER,\n        \"in function signaler::signaler() an error occurred making the signaler\"\n                );      \n            }\n        }\n\n        ~signaler (\n        ) { pthread_cond_destroy(&cond); }\n\n        void wait (\n        ) const\n        { \n            pthread_cond_wait(&cond,associated_mutex);\n        }\n\n        bool wait_or_timeout (\n            unsigned long milliseconds\n        ) const\n        { \n            timespec time_to_wait;\n\n            timeval curtime;\n            gettimeofday(&curtime,0);\n\n            // get the time and adjust the timespec object by the appropriate amount\n            time_to_wait.tv_sec = milliseconds/1000 + curtime.tv_sec;\n            time_to_wait.tv_nsec = curtime.tv_usec;\n            time_to_wait.tv_nsec *= 1000; \n            time_to_wait.tv_nsec += (milliseconds%1000)*1000000;\n\n            time_to_wait.tv_sec += time_to_wait.tv_nsec/1000000000;\n            time_to_wait.tv_nsec = time_to_wait.tv_nsec%1000000000;\n\n            if ( pthread_cond_timedwait(&cond,associated_mutex,&time_to_wait) == ETIMEDOUT)\n            {\n                return false;\n            }\n            else \n            {\n                return true;\n            }\n        }\n\n        void signal (\n        ) const { pthread_cond_signal(&cond); }\n\n        void broadcast (\n        ) const { pthread_cond_broadcast(&cond); }\n\n        const mutex& get_mutex (\n        ) const { return m; }\n\n    private:\n\n        pthread_mutex_t* const associated_mutex;\n        mutable pthread_cond_t  cond;\n        const mutex& m;\n\n        // restricted functions\n        signaler(signaler&);        // copy constructor\n        signaler& operator=(signaler&);    // assignement opertor\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    namespace threads_kernel_shared_helpers\n    {\n        bool spawn_thread (\n            void (*funct)(void*),\n            void* param\n        );\n        /*!\n            is identical to create_new_thread() but just doesn't use any thread pooling.\n        !*/\n    }\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#include \"threads_kernel_shared.h\"\n\n#ifdef NO_MAKEFILE\n#include \"threads_kernel_2.cpp\"\n#endif\n\n#endif // DLIB_THREADS_KERNEl_2_\n\n"
  },
  {
    "path": "benchmarks/dlib/threads/threads_kernel_abstract.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_THREADS_KERNEl_ABSTRACT_\n#ifdef DLIB_THREADS_KERNEl_ABSTRACT_\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    /*!\n        THREAD POOLING\n            When threads end they go into a global thread pool and each waits there \n            for 30 seconds before timing out and having its resources returned to the \n            operating system.  When create_new_thread() is called it first looks in the\n            thread pool to see if there are any threads it can snatch from the pool, if \n            not then it makes a new one.  \n\n            Note that whenever I say something happens when a thread \"terminates\" or \"ends\"\n            I mean \"when it returns to the thread pool.\"  From the client programmer point\n            of view a thread terminates/ends when it returns to the dlib thread pool and you \n            shouldn't and indeed don't need to know when it actually gets its resources\n            reclaimed by the operating system.\n\n            If you want to change the timeout to a different value you can #define \n            DLIB_THREAD_POOL_TIMEOUT to whatever value (in milliseconds) that you like.\n\n        EXCEPTIONS\n            Unless specified otherwise, nothing in this file throws exceptions.\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    thread_id_type get_thread_id (\n    );\n    /*!\n        ensures\n            - returns a unique id for the calling thread.  Note that while the id is unique \n              among all currently existing threads it may have been used by a previous\n              thread that has terminated.\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    bool is_dlib_thread (\n        thread_id_type id = get_thread_id()\n    );\n    /*!\n        ensures\n            - if (the thread with the given id was spawned by a call to\n                  dlib::create_new_thread) then\n                - returns true\n            - else\n                - returns false\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    void register_thread_end_handler (\n        T& obj,\n        void (T::*handler)()\n    );\n    /*!\n        requires\n            - handler == a valid member function pointer for class T\n            - handler does not throw\n            - handler does not call register_thread_end_handler()\n            - handler does not block\n            - is_dlib_thread() == true (i.e. the calling thread was spawned by dlib::create_new_thread())\n        ensures\n            - let ID == the thread id for the thread calling register_thread_end_handler()\n            - (obj.*handler)() will be called when the thread with thread id ID is \n              terminating and it will be called from within that terminating thread.  \n              (i.e. inside the handler function get_thread_id() == ID == the id of the \n              thread that is terminating. )\n            - each call to this function adds another handler that will be called when\n              the given thread terminates.  This means that if you call it a bunch of \n              times then you will end up registering multiple handlers (or single \n              handlers multiple times) that will be called when the thread ends. \n        throws\n            - std::bad_alloc\n              If this exception is thrown then the call to this function had no effect.\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    void unregister_thread_end_handler (\n        T& obj,\n        void (T::*handler)()\n    );\n    /*!\n        requires\n            - handler == a valid member function pointer for class T\n        ensures\n            - Undoes all previous calls to register_thread_end_handler(obj,handler).  \n              So the given handler won't be called when any threads end.\n        throws\n            - std::bad_alloc\n              If this exception is thrown then the call to this function had no effect.\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    bool create_new_thread (\n        void (*funct)(void*),\n        void* param\n    );\n    /*!\n        ensures\n            - creates a new thread for the function pointed to by funct \n            - passes it param as its parameter. (i.e. calls funct(param) from the new thread)\n            - returns true upon success and false upon failure to create the new thread\n    !*/\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // mutex object\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    class mutex\n    {\n        /*!\n            INITIAL VALUE\n                mutex is in the unlocked state\n\n            WHAT THIS OBJECT REPRESENTS\n                This object represents a mutex intended to be used for synchronous \n                thread control of shared data. When a thread wants to access some \n                shared data it locks out other threads by calling lock() and calls \n                unlock() when it is finished.  \n        !*/\n    public:\n\n        mutex (\n        );\n        /*!\n            ensures\n                - #*this is properly initialized\n            throws\n                - dlib::thread_error\n                    the constructor may throw this exception if there is a problem \n                    gathering resources to create the mutex.\n        !*/\n\n        ~mutex (\n        );\n        /*!\n            requires\n                - *this is not locked\n            ensures\n                - all resources allocated by *this have been freed\n        !*/\n\n        void lock (\n        ) const;\n        /*!\n            requires\n                - the thread calling lock() does not already have a lock on *this\n            ensures\n                - if (*this is currently locked by another thread) then \n                    - the thread that called lock() on *this is put to sleep until \n                      it becomes available                  \n                - if (*this is currently unlocked) then \n                    - #*this becomes locked and the current thread is NOT put to sleep \n                      but now \"owns\" #*this\n        !*/\n\n        void unlock (\n        ) const;\n        /*!\n            requires\n                - the thread calling unlock() already has a lock on *this\n            ensures\n                - #*this is unlocked (i.e. other threads may now lock this object)\n        !*/\n\n\n    private:\n        // restricted functions\n        mutex(mutex&);        // copy constructor\n        mutex& operator=(mutex&);    // assignment operator\n    };\n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // signaler object\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    class signaler\n    {\n        /*!\n\n            WHAT THIS OBJECT REPRESENTS\n                This object represents an event signaling system for threads.  It gives \n                a thread the ability to wake up other threads that are waiting for a \n                particular signal. \n\n                Each signaler object is associated with one and only one mutex object.  \n                More than one signaler object may be associated with a single mutex\n                but a signaler object may only be associated with a single mutex.\n\n                NOTE:\n                You must guard against spurious wakeups.  This means that a thread\n                might return from a call to wait even if no other thread called\n                signal.  This is rare but must be guarded against. \n        !*/\n    public:\n\n        signaler (\n            const mutex& associated_mutex\n        );\n        /*!\n            ensures\n                - #*this is properly initialized \n                - #get_mutex() == associated_mutex\n            throws\n                - dlib::thread_error\n                    the constructor may throw this exception if there is a problem \n                    gathering resources to create the signaler.    \n        !*/\n\n\n        ~signaler (\n        );\n        /*!\n            ensures\n                - all resources allocated by *this have been freed\n        !*/\n\n        void wait (\n        ) const;\n        /*!\n            requires\n                - get_mutex() is locked and owned by the calling thread\n            ensures\n                - atomically unlocks get_mutex() and blocks the calling thread                      \n                - calling thread may wake if another thread calls signal() or broadcast()\n                  on *this\n                - when wait() returns the calling thread again has a lock on get_mutex()\n        !*/\n\n        bool wait_or_timeout (\n            unsigned long milliseconds\n        ) const;\n        /*!\n            requires\n                - get_mutex() is locked and owned by the calling thread\n            ensures\n                - atomically unlocks get_mutex() and blocks the calling thread\n                - calling thread may wake if another thread calls signal() or broadcast()\n                  on *this\n                - after the specified number of milliseconds has elapsed the calling thread\n                  will wake once get_mutex() is free\n                - when wait returns the calling thread again has a lock on get_mutex()\n\n                - returns false if the call to wait_or_timeout timed out \n                - returns true if the call did not time out\n        !*/\n\n\n        void signal (\n        ) const;\n        /*!\n            ensures\n                - if (at least one thread is waiting on *this) then\n                    - at least one of the waiting threads will wake \n        !*/\n\n        void broadcast (\n        ) const;\n        /*!\n            ensures\n                - any and all threads waiting on *this will wake \n        !*/\n\n        const mutex& get_mutex (\n        ) const;\n        /*!\n            ensures\n                - returns a const reference to the mutex associated with *this\n        !*/\n\n    private:\n        // restricted functions\n        signaler(signaler&);        // copy constructor\n        signaler& operator=(signaler&);    // assignment operator\n    };\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_THREADS_KERNEl_ABSTRACT_\n\n"
  },
  {
    "path": "benchmarks/dlib/threads/threads_kernel_shared.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_THREADS_KERNEl_SHARED_\n#define DLIB_THREADS_KERNEl_SHARED_\n\n// this file should be included at the bottom of one of the thread kernel headers for a \n// specific platform.\n//#include \"../threads.h\"\n#include \"auto_mutex_extension.h\"\n#include \"../binary_search_tree.h\"\n#include \"../member_function_pointer.h\"\n#include \"../memory_manager.h\"\n#include \"../queue.h\"\n#include \"../set.h\"\n#include \"../test_for_odr_violations.h\"\n\n\n\n\n\nnamespace dlib\n{\n\n\n// ----------------------------------------------------------------------------------------\n\n    namespace threads_kernel_shared\n    {\n        void thread_starter (\n            void*\n        );\n\n        class threader\n        {\n            /*!\n                INITIAL VALUE\n                    - pool_count == 0 and\n                    - data_ready is associated with the mutex data_mutex \n                    - data_empty is associated with the mutex data_mutex\n                    - destructed is associated with the mutex data_mutex\n                    - destruct == false\n                    - total_count == 0\n                    - function_pointer == 0\n                    - do_not_ever_destruct == false\n\n                CONVENTION\n                    - data_ready is associated with the mutex data_mutex \n                    - data_empty is associated with the mutex data_mutex \n                    - data_ready == a signaler used signal when there is new data waiting \n                      to start a thread with.\n                    - data_empty == a signaler used to signal when the data is now empty \n                    - pool_count == the number of suspended threads in the thread pool \n                    - total_count == the number of threads that are executing anywhere.  i.e.\n                      pool_count + the ones that are currently running some user function.\n                    - if (function_pointer != 0) then\n                        - parameter == a void pointer pointing to the parameter which \n                          should be used to start the next thread \n                        - function_pointer == a pointer to the next function to make a \n                          new thread with\n\n                    - if (the destructor is running) then\n                        - destruct == true\n                    - else\n                        - destruct == false\n\n                    - thread_ids is locked by the data_mutex\n                    - thread_ids == a set that contains the thread id for each thread spawned by this\n                      object.\n            !*/\n\n\n        public:\n            threader (\n            );\n           \n            ~threader (\n            );\n\n            void destruct_if_ready (\n            );\n            /*!\n                ensures\n                    - if (there are no threads currently running and we haven't set do_not_ever_destruct) then\n                        - calls delete this\n                    - else\n                        - does nothing\n            !*/\n\n            bool create_new_thread (\n                void (*funct)(void*),\n                void* param\n            );\n\n            template <\n                typename T\n                >\n            void unregister_thread_end_handler (\n                T& obj,\n                void (T::*handler)()\n            )\n            {\n                member_function_pointer<> mfp, junk_mfp;\n                mfp.set(obj,handler);\n\n                thread_id_type junk_id;\n\n                // find any member function pointers in the registry that point to the same\n                // thing as mfp and remove them\n                auto_mutex M(reg.m);\n                reg.reg.reset();\n                while (reg.reg.move_next())\n                {\n                    while (reg.reg.current_element_valid() && reg.reg.element().value() == mfp)\n                    {\n                        reg.reg.remove_current_element(junk_id, junk_mfp);\n                    }\n                }\n            }\n\n            template <\n                typename T\n                >\n            void register_thread_end_handler (\n                T& obj,\n                void (T::*handler)()\n            )\n            {\n                thread_id_type id = get_thread_id();\n                member_function_pointer<> mfp;\n                mfp.set(obj,handler);\n\n                auto_mutex M(reg.m);\n                reg.reg.add(id,mfp);\n            }\n\n            bool is_dlib_thread (\n                thread_id_type id\n            );\n\n        private:\n\n            friend void thread_starter (\n                void*\n            );\n\n            void call_end_handlers (\n            );\n            /*!\n                ensures\n                    - calls the registered end handlers for the calling thread and\n                      then removes them from reg.reg\n            !*/\n\n\n            // private data\n            set<thread_id_type,memory_manager<char>::kernel_2b>::kernel_1b_c thread_ids;\n            unsigned long total_count;\n            void* parameter;\n            void (*function_pointer)(void*);\n            unsigned long pool_count;\n            mutex data_mutex;           // mutex to protect the above data\n            signaler data_ready;        // signaler to signal when there is new data\n            signaler data_empty;        // signaler to signal when the data is empty\n            bool destruct;\n            signaler destructed;        // signaler to signal when a thread has ended \n            bool do_not_ever_destruct;\n\n            struct registry_type\n            {\n                mutex m;\n                binary_search_tree<\n                    thread_id_type,\n                    member_function_pointer<>,\n                    memory_manager<char>::kernel_2a\n                    >::kernel_2a_c reg;\n            };\n\n            // stuff for the register_thread_end_handler \n            registry_type reg;\n\n\n            // restricted functions\n            threader(threader&);        // copy constructor\n            threader& operator=(threader&);    // assignement opertor\n\n        };\n\n    // ------------------------------------------------------------------------------------\n\n        threader& thread_pool (\n        ); \n        /*!\n            ensures\n                - returns a reference to the global threader object\n        !*/\n\n    // ------------------------------------------------------------------------------------\n\n        extern bool thread_pool_has_been_destroyed;\n    }\n\n    bool is_dlib_thread (\n        thread_id_type id \n    );\n\n    bool is_dlib_thread (\n    );\n\n// ----------------------------------------------------------------------------------------\n\n    inline bool create_new_thread (\n        void (*funct)(void*),\n        void* param\n    )\n    {\n        try\n        {\n            // now make this thread\n            return threads_kernel_shared::thread_pool().create_new_thread(funct,param);\n        }\n        catch (std::bad_alloc&)\n        {\n            return false;\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    inline void register_thread_end_handler (\n        T& obj,\n        void (T::*handler)()\n    )\n    {\n        DLIB_ASSERT(is_dlib_thread(),            \n               \"\\tvoid register_thread_end_handler\"\n            << \"\\n\\tYou can't register a thread end handler for a thread dlib didn't spawn.\"\n            );\n\n        threads_kernel_shared::thread_pool().register_thread_end_handler(obj,handler);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    inline void unregister_thread_end_handler (\n        T& obj,\n        void (T::*handler)()\n    )\n    {\n        // Check if the thread pool has been destroyed and if it has then don't do anything.\n        // This bool here is always true except when the program has started to terminate and\n        // the thread pool object has been destroyed.  This if is here to catch other global\n        // objects that have destructors that try to call unregister_thread_end_handler().  \n        // Without this check we get into trouble if the thread pool is destroyed before these\n        // objects.\n        if (threads_kernel_shared::thread_pool_has_been_destroyed == false)\n            threads_kernel_shared::thread_pool().unregister_thread_end_handler(obj,handler);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#ifdef NO_MAKEFILE\n#include \"threads_kernel_shared.cpp\"\n#endif\n\n#endif // DLIB_THREADS_KERNEl_SHARED_\n\n"
  },
  {
    "path": "benchmarks/dlib/threads/windows.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_THREADS_KERNEl_2_\n#include \"threads_kernel_1.h\"\n#endif\n\n"
  },
  {
    "path": "benchmarks/dlib/threads.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n\n#ifdef DLIB_ALL_SOURCE_END\n#include \"dlib_basic_cpp_build_tutorial.txt\"\n#endif\n\n#ifndef DLIB_THREADs_\n#define DLIB_THREADs_\n\n#include \"threads/threads_kernel.h\"\n\n#include \"threads/auto_mutex_extension.h\"\n#include \"threads/auto_unlock_extension.h\"\n#include \"threads/create_new_thread_extension.h\"\n#include \"threads/multithreaded_object_extension.h\"\n#include \"threads/rmutex_extension.h\"\n#include \"threads/rsignaler_extension.h\"\n#include \"threads/threaded_object_extension.h\"\n#include \"threads/thread_specific_data_extension.h\"\n#include \"threads/thread_function_extension.h\"\n#include \"threads/thread_pool_extension.h\"\n#include \"threads/read_write_mutex_extension.h\"\n#include \"threads/parallel_for_extension.h\"\n#include \"threads/async.h\"\n\n#endif // DLIB_THREADs_\n\n"
  },
  {
    "path": "benchmarks/dlib/time_this.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_TIME_THIs_\n#define DLIB_TIME_THIs_\n\n\n#include <chrono>\n\n// ----------------------------------------------------------------------------------------\n\n#define TIME_THIS_TO(_tt_op,_tt_out)                                                                            \\\n    {                                                                                                           \\\n        auto _tt_start = std::chrono::high_resolution_clock::now();                                             \\\n        {_tt_op;}                                                                                               \\\n        auto _tt_stop = std::chrono::high_resolution_clock::now();                                              \\\n        auto _tt_thetime = _tt_stop-_tt_start;                                                                          \\\n        using std::chrono::duration_cast;                                                                       \\\n        using std::chrono::duration;                                                                            \\\n        if (_tt_thetime >= std::chrono::minutes(1))                                                             \\\n            _tt_out << \"\\ntime: \" << duration_cast<duration<double,std::ratio<60>>>(_tt_thetime).count() << \"min\\n\";           \\\n        else if (_tt_thetime >= std::chrono::seconds(1))                                                        \\\n            _tt_out << \"\\ntime: \" << duration_cast<duration<double>>(_tt_thetime).count() << \"sec\\n\";           \\\n        else if (_tt_thetime >= std::chrono::milliseconds(1))                                                   \\\n            _tt_out << \"\\ntime: \" << duration_cast<duration<double,std::milli>>(_tt_thetime).count() << \"ms\\n\"; \\\n        else if (_tt_thetime >= std::chrono::microseconds(1))                                                   \\\n            _tt_out << \"\\ntime: \" << duration_cast<duration<double,std::micro>>(_tt_thetime).count() << \"us\\n\"; \\\n        else                                                                                                    \\\n            _tt_out << \"\\ntime: \" << duration_cast<duration<double,std::nano>>(_tt_thetime).count() << \"ns\\n\";  \\\n    }\n\n#define TIME_THIS(_tt_op)  TIME_THIS_TO(_tt_op,std::cout)\n\n// ----------------------------------------------------------------------------------------\n\n#endif // DLIB_TIME_THIs_\n\n"
  },
  {
    "path": "benchmarks/dlib/timeout/timeout.h",
    "content": "// Copyright (C) 2007  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_TIMEOUT_KERNEl_1_\n#define DLIB_TIMEOUT_KERNEl_1_\n\n#include \"../threads.h\"\n#include \"../algs.h\"\n#include \"../misc_api.h\"\n#include \"timeout_abstract.h\"\n#include \"../uintn.h\"\n#include \"../timer.h\"\n\n#ifdef _MSC_VER\n// this is to disable the \"'this' : used in base member initializer list\"\n// warning you get from some of the GUI objects since all the objects\n// require that their parent class be passed into their constructor. \n// In this case though it is totally safe so it is ok to disable this warning.\n#pragma warning(disable : 4355)\n#endif // _MSC_VER\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    class timeout \n    {\n        /*!\n            INITIAL VALUE\n                - b == a pointer to some kind of bind object\n\n            CONVENTION\n                - b == a pointer to some kind of bind object\n        !*/\n\n        class bind\n        {\n        public:\n            virtual void go() = 0;\n            virtual ~bind() {}\n        };\n\n        template <typename T>\n        class functor : public bind\n        {\n        public:\n            functor(const T& f) : function(f) {}\n            T function;\n            void go() { function(); }\n        };\n\n        template <typename T, typename R>\n        class zero : public bind\n        {\n        public:\n            T* object;\n            R (T::*callback_function)();\n            void go() { (object->*callback_function)(); }\n\n        };\n\n        template <typename T, typename R, typename U>\n        class one : public bind\n        {\n        public:\n            T* object;\n            R (T::*callback_function)(U);\n            U val;\n            void go() { (object->*callback_function)(val); }\n        };\n\n    public:\n\n        // This typedef is here for backwards compatibility with previous versions of dlib.\n        typedef timeout kernel_1a;\n\n        template <\n            typename T\n            >\n        timeout (\n            T callback_function,\n            unsigned long ms_to_timeout\n        ) :\n            t(*this,&timeout::trigger_timeout)\n        {\n            b = new functor<T>(callback_function);\n            t.set_delay_time(ms_to_timeout);\n            t.start();\n        }\n\n        template <\n            typename T\n            >\n        timeout (  \n            T& object,\n            void (T::*callback_function)(),\n            unsigned long ms_to_timeout\n        ): \n            t(*this,&timeout::trigger_timeout)\n        {\n            zero<T,void>* B = new zero<T,void>;\n            b = B;\n            B->object = &object;\n            B->callback_function = callback_function;\n            t.set_delay_time(ms_to_timeout);\n            t.start();\n        }\n\n        template <\n            typename T,\n            typename U\n            >\n        timeout (  \n            T& object,\n            void (T::*callback_function)(U callback_function_argument),\n            unsigned long ms_to_timeout,\n            U callback_function_argument\n        ): \n            t(*this,&timeout::trigger_timeout)\n        {\n            one<T,void,U>* B = new one<T,void,U>;\n            b = B;\n            B->object = &object; \n            B->callback_function = callback_function;\n            B->val = callback_function_argument;\n            t.set_delay_time(ms_to_timeout);\n            t.start();\n        }\n\n        template <\n            typename T\n            >\n        timeout (  \n            T& object,\n            int (T::*callback_function)(),\n            unsigned long ms_to_timeout\n        ): \n            t(*this,&timeout::trigger_timeout)\n        {\n            zero<T,int>* B = new zero<T,int>;\n            b = B;\n            B->object = &object;\n            B->callback_function = callback_function;\n            t.set_delay_time(ms_to_timeout);\n            t.start();\n        }\n\n        template <\n            typename T,\n            typename U\n            >\n        timeout (  \n            T& object,\n            int (T::*callback_function)(U callback_function_argument),\n            unsigned long ms_to_timeout,\n            U callback_function_argument\n        ): \n            t(*this,&timeout::trigger_timeout)\n        {\n            one<T,int,U>* B = new one<T,int,U>;\n            b = B;\n            B->object = &object; \n            B->callback_function = callback_function;\n            B->val = callback_function_argument;\n            t.set_delay_time(ms_to_timeout);\n            t.start();\n        }\n\n        virtual ~timeout (\n        )\n        {\n            t.stop_and_wait();\n            delete b;\n        }\n\n    private:\n\n        void trigger_timeout ()\n        {\n            b->go();\n            t.stop();\n        }\n\n        dlib::timer<timeout> t;\n        bind* b;\n\n        // restricted functions\n        timeout(const timeout&);        // copy constructor\n        timeout& operator=(const timeout&);    // assignment operator\n\n    };    \n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_TIMEOUT_KERNEl_1_\n\n\n\n"
  },
  {
    "path": "benchmarks/dlib/timeout/timeout_abstract.h",
    "content": "// Copyright (C) 2007  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_TIMEOUT_KERNEl_ABSTRACT_\n#ifdef DLIB_TIMEOUT_KERNEl_ABSTRACT_\n\n#include \"../threads.h\"\n\nnamespace dlib\n{\n\n    class timeout \n    {\n        /*!\n            WHAT THIS OBJECT REPRESENTS\n                This object provides a simple way to implement a timeout.  An example will\n                make its use clear.  Suppose we want to read from a socket but we want to\n                terminate the connection if the read takes longer than 10 seconds.  This\n                could be accomplished as follows:\n\n                connection* con = a connection from somewhere;\n                {\n                    // setup a timer that will call con->shutdown() in 10 seconds\n                    timeout t(*con,&connection::shutdown,10000); \n                    // Now call read on the connection.  If this call to read() takes more\n                    // than 10 seconds then the t timeout will trigger and shutdown the\n                    // connection.  If read completes in less than 10 seconds then the t\n                    // object will be destructed on the next line due to the } and then the\n                    // timeout won't trigger.\n                    con->read(buf,100);\n                }\n\n                \n                Alternatively, if you have a compiler capable of using C++11 lambda\n                functions, you can use a syntax like this:\n                {\n                    timeout t([con](){ con->shutdown(); }, 10000);\n                    con->read(buf,100);\n                }\n\n                More generally, you can use this with things other than sockets.  For\n                example, the following statement will print \"Hello world!\" after 1000ms:\n                    timeout t([](){ cout << \"Hello world!\" << endl; },  1000);\n\n\n\n            THREAD SAFETY\n                All methods of this class are thread safe. \n        !*/\n\n    public:\n\n        template <\n            typename T\n            >\n        timeout (\n            T callback_function,\n            unsigned long ms_to_timeout\n        );\n        /*!\n            requires\n                - callback_function does not throw\n            ensures                \n                - does not block.\n                - #*this is properly initialized\n                - if (this object isn't destructed in ms_to_timeout milliseconds) then\n                    - callback_function() will be called in ms_to_timeout milliseconds.\n            throws\n                - std::bad_alloc\n                - dlib::thread_error\n        !*/\n\n        template <\n            typename T\n            >\n        timeout (  \n            T& object,\n            void (T::*callback_function)(),\n            unsigned long ms_to_timeout\n        );\n        /*!\n            requires\n                - callback_function does not throw\n            ensures                \n                - does not block.\n                - #*this is properly initialized\n                - if (this object isn't destructed in ms_to_timeout milliseconds) then\n                    - (object.*callback_function)() will be called in ms_to_timeout \n                      milliseconds.\n            throws\n                - std::bad_alloc\n                - dlib::thread_error\n        !*/\n\n        template <\n            typename T,\n            typename U\n            >\n        timeout (  \n            T& object,\n            void (T::*callback_function)(U callback_function_argument),\n            unsigned long ms_to_timeout,\n            U callback_function_argument\n        );\n        /*!\n            requires\n                - callback_function does not throw\n            ensures                \n                - does not block.\n                - #*this is properly initialized\n                - if (this object isn't destructed in ms_to_timeout milliseconds) then\n                    - (object.*callback_function)(callback_function_argument) will be \n                      called in ms_to_timeout milliseconds.\n            throws\n                - std::bad_alloc\n                - dlib::thread_error\n        !*/\n\n        template <\n            typename T\n            >\n        timeout (  \n            T& object,\n            int (T::*callback_function)(),\n            unsigned long ms_to_timeout\n        );\n        /*!\n            requires\n                - callback_function does not throw\n            ensures                \n                - does not block.\n                - #*this is properly initialized\n                - if (this object isn't destructed in ms_to_timeout milliseconds) then\n                    - (object.*callback_function)() will be called in ms_to_timeout \n                      milliseconds.\n            throws\n                - std::bad_alloc\n                - dlib::thread_error\n        !*/\n\n        template <\n            typename T,\n            typename U\n            >\n        timeout (  \n            T& object,\n            int (T::*callback_function)(U callback_function_argument),\n            unsigned long ms_to_timeout,\n            U callback_function_argument\n        );\n        /*!\n            requires\n                - callback_function does not throw\n            ensures                \n                - does not block.\n                - #*this is properly initialized\n                - if (this object isn't destructed in ms_to_timeout milliseconds) then\n                    - (object.*callback_function)(callback_function_argument) will be \n                      called in ms_to_timeout milliseconds.\n            throws\n                - std::bad_alloc\n                - dlib::thread_error\n        !*/\n\n        virtual ~timeout (\n        );\n        /*!\n            requires\n                - is not called from inside the callback_function given to the\n                  constructor.\n            ensures\n                - any resources associated with *this have been released\n                - if (the callback_function hasn't been called yet) then\n                    - the callback_function specified in the constructor will not be called\n        !*/\n\n    private:\n\n        // restricted functions\n        timeout(const timeout&);        // copy constructor\n        timeout& operator=(const timeout&);    // assignment operator\n\n    };    \n\n}\n\n#endif // DLIB_TIMEOUT_KERNEl_ABSTRACT_\n\n\n"
  },
  {
    "path": "benchmarks/dlib/timeout.h",
    "content": "// Copyright (C) 2007  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_TIMEOUt_\n#define DLIB_TIMEOUt_\n\n#include \"timeout/timeout.h\"\n\n#endif // DLIB_TIMEOUt_\n\n\n"
  },
  {
    "path": "benchmarks/dlib/timer/timer.h",
    "content": "// Copyright (C) 2007  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_TIMEr_Hh_\n#define DLIB_TIMEr_Hh_\n\n#include <memory>\n\n#include \"../threads.h\"\n#include \"../algs.h\"\n#include \"../misc_api.h\"\n#include \"timer_abstract.h\"\n#include \"../uintn.h\"\n#include \"../binary_search_tree.h\"\n#include \"timer_heavy.h\"\n\nnamespace dlib\n{\n\n    struct timer_base : public threaded_object\n    {\n        /*!\n            WHAT THIS OBJECT REPRESENTS\n                This object contains the base members of the timer object.\n                It exists so that we can access them from outside any templated functions.\n        !*/\n\n        unsigned long delay;\n        // these are only modified by the global_clock\n        uint64 next_time_to_run;\n        timestamper ts;\n        bool running;\n        bool in_global_clock;\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    class timer_global_clock : private threaded_object\n    {\n        /*!\n            This object sets up a timer that triggers the action function\n            for timer objects that are tracked inside this object. \n            INITIAL VALUE\n                - shutdown == false\n                - running == false\n\n            CONVENTION\n                - if (shutdown) then\n                    - thread() should terminate\n                - else (running) then\n                    - thread() is running\n\n                - tm[time] == pointer to a timer_base object \n        !*/\n        typedef binary_search_tree<uint64,timer_base*,memory_manager<char>::kernel_2b>::kernel_2a_c time_map;\n    public:\n\n        ~timer_global_clock();\n\n        void add (\n            timer_base* r\n        );\n        /*!\n            requires\n                - m is locked\n            ensures\n                - starts the thread if it isn't already started\n                - adds r to tm\n                - #r->in_global_clock == true\n                - updates r->next_time_to_run appropriately according to\n                    r->delay\n        !*/\n\n        void remove (\n            timer_base* r\n        );\n        /*!\n            requires\n                - m is locked\n            ensures\n                - if (r is in tm) then\n                    - removes r from tm\n                - #r->in_global_clock == false\n        !*/\n\n        void adjust_delay (\n            timer_base* r,\n            unsigned long new_delay\n        );\n        /*!\n            requires\n                - m is locked\n            ensures\n                - #r->delay == new_delay\n                - if (r->in_global_clock) then\n                    - the time to the next event will have been appropriately adjusted\n        !*/\n\n        mutex m;\n\n        friend std::shared_ptr<timer_global_clock> get_global_clock();\n\n    private:\n        timer_global_clock();\n\n        time_map tm;  \n        signaler s;\n        bool shutdown;\n        bool running;\n        timestamper ts;\n\n        void thread();\n        /*!\n            ensures\n                - spawns timer tasks as is appropriate\n        !*/\n    };\n    std::shared_ptr<timer_global_clock> get_global_clock();\n    /*!\n        ensures\n            - returns the global instance of the timer_global_clock object\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    class timer : private timer_base \n    {\n        /*!\n            INITIAL VALUE\n                - running   == false\n                - delay     == 1000\n                - ao        == a pointer to the action_object()\n                - af        == a pointer to the action_function()\n                - in_global_clock == false\n                - next_time_to_run == 0\n                - gc == get_global_clock()\n\n            CONVENTION\n                - the mutex used to lock everything is gc->m\n                - running == is_running()\n                - delay == delay_time()\n                - *ao == action_object()\n                - af == action_function()    \n                - if (!running) then\n                    - in_global_clock == false\n                - else \n                    - next_time_to_run == the next time this timer should run according\n                      to the timestamper in the global_clock\n        !*/\n\n    public:\n\n        // These typedefs are here for backwards compatibility with previous versions of\n        // dlib.\n        typedef timer_heavy<T> kernel_1a;\n        typedef timer kernel_2a;\n\n        typedef void (T::*af_type)();\n\n        timer(  \n            T& ao_,\n            af_type af_\n        );\n\n        virtual ~timer(\n        );\n\n        void clear(\n        );\n\n        af_type action_function (\n        ) const;\n\n        const T& action_object (\n        ) const;\n\n        T& action_object (\n        );\n\n        bool is_running (\n        ) const;\n\n        unsigned long delay_time (\n        ) const;\n\n        void set_delay_time (\n            unsigned long milliseconds\n        );\n        \n        void start (            \n        );\n\n        void stop (\n        );\n\n        void stop_and_wait (\n        );\n\n    private: \n\n        void thread (\n        );\n        /*!\n            ensures\n                - calls the action function\n        !*/\n\n        // data members\n        T& ao;\n        const af_type af;\n        std::shared_ptr<timer_global_clock> gc;\n\n        // restricted functions\n        timer(const timer&);        // copy constructor\n        timer& operator=(const timer&);    // assignment operator\n\n    };    \n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // member function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    \n    template <\n        typename T\n        >\n    timer<T>::\n    timer(  \n        T& ao_,\n        af_type af_\n    ) : \n        ao(ao_),\n        af(af_),\n        gc(get_global_clock())\n    {\n        delay = 1000;\n        next_time_to_run = 0;\n        running = false;\n        in_global_clock = false;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    timer<T>::\n    ~timer(\n    )\n    {\n        clear();\n        wait();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    void timer<T>::\n    clear(\n    )\n    {\n        auto_mutex M(gc->m);\n        running = false;\n        gc->remove(this);\n        delay = 1000;        \n        next_time_to_run = 0;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    typename timer<T>::af_type timer<T>::\n    action_function (\n    ) const\n    {\n        return af;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    const T& timer<T>::\n    action_object (\n    ) const\n    {\n        return ao;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    T& timer<T>::\n    action_object (\n    )\n    {\n        return ao;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    bool timer<T>::\n    is_running (\n    ) const\n    {\n        auto_mutex M(gc->m);\n        return running;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    unsigned long timer<T>::\n    delay_time (\n    ) const\n    {\n        auto_mutex M(gc->m);\n        return delay;        \n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    void timer<T>::\n    set_delay_time (\n        unsigned long milliseconds\n    )\n    {\n        auto_mutex M(gc->m);\n        gc->adjust_delay(this,milliseconds);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    void timer<T>::\n    start (            \n    )\n    {\n        auto_mutex M(gc->m);\n        if (!running)\n        {\n            gc->add(this);\n            running = true;\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    void timer<T>::\n    stop (\n    )\n    {\n        gc->m.lock();\n        running = false;\n        gc->remove(this);\n        gc->m.unlock();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    void timer<T>::\n    thread (\n    )\n    {\n        // call the action function\n        (ao.*af)(); \n        auto_mutex M(gc->m);\n        if (running)\n        {\n            gc->remove(this);\n            gc->add(this);\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    void timer<T>::\n    stop_and_wait (\n    )\n    {\n        gc->m.lock();\n        running = false;\n        gc->remove(this);\n        gc->m.unlock();\n        wait();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#ifdef NO_MAKEFILE\n#include \"timer.cpp\"\n#endif\n\n#endif // DLIB_TIMEr_Hh_\n\n\n"
  },
  {
    "path": "benchmarks/dlib/timer/timer_abstract.h",
    "content": "// Copyright (C) 2005  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_TIMER_KERNEl_ABSTRACT_\n#ifdef DLIB_TIMER_KERNEl_ABSTRACT_\n\n#include \"../threads.h\"\n\nnamespace dlib\n{\n\n    template <\n        typename T\n        >\n    class timer \n    {\n        /*!\n            INITIAL VALUE\n                is_running()      == false\n                delay_time()      == 1000\n                action_object()   == The object that is passed into the constructor\n                action_function() == The member function pointer that is passed to \n                                     the constructor.\n\n            WHAT THIS OBJECT REPRESENTS\n                This object represents a timer that will call a given member function \n                (the action function) repeatedly at regular intervals and in its own\n                thread.\n\n                Note that the delay_time() is measured in milliseconds but you are not \n                guaranteed to have that level of resolution.  The actual resolution\n                is implementation dependent.\n\n            THREAD SAFETY\n                All methods of this class are thread safe. \n        !*/\n\n    public:\n\n        typedef void (T::*af_type)();\n\n        timer (  \n            T& ao,\n            af_type af\n        );\n        /*!\n            requires\n                - af does not throw\n            ensures                \n                - does not block.\n                - #*this is properly initialized\n                - #action_object() == ao\n                - #action_function() == af\n                  (af is a member function pointer to a member in the class T)\n            throws\n                - std::bad_alloc\n                - dlib::thread_error\n        !*/\n\n        virtual ~timer (\n        );\n        /*!\n            requires\n                - is not called from inside the action_function()\n            ensures\n                - any resources associated with *this have been released\n                - will not call the action_function() anymore.\n                - if (the action function is currently executing) then\n                    - blocks until it finishes\n        !*/\n\n        void clear(\n        );\n        /*!\n            ensures\n                - #*this has its initial value\n                - does not block\n            throws\n                - std::bad_alloc or dlib::thread_error\n                    If either of these exceptions are thrown then #*this is unusable \n                    until clear() is called and succeeds.\n        !*/\n\n        af_type action_function (\n        ) const;\n        /*!\n            ensures\n                - does not block.\n                - returns a pointer to the member function of action_object() that is\n                  called by *this.\n        !*/\n\n        const T& action_object (\n        ) const;\n        /*!\n            ensures\n                - does not block.\n                - returns a const reference to the object used to call the member\n                  function pointer action_function()\n        !*/\n\n        T& action_object (\n        );\n        /*!\n            ensures\n                - does not block.\n                - returns a non-const reference to the object used to call the member\n                  function pointer action_function()\n        !*/\n\n        bool is_running (\n        ) const;\n        /*!\n            ensures\n                - does not block.\n                - if (*this is currently scheduled to call the action_function()) then\n                    - returns true\n                - else\n                    - returns false\n        !*/\n\n        unsigned long delay_time (\n        ) const;\n        /*!\n            ensures\n                - does not block.\n                - returns the amount of time, in milliseconds, that *this will wait between\n                  the return of one call to the action_function() and the beginning of the\n                  next call to the action_function().\n        !*/\n\n        void set_delay_time (\n            unsigned long milliseconds\n        );\n        /*!            \n            ensures\n                - does not block.\n                - #delay_time() == milliseconds\n            throws\n                - std::bad_alloc or dlib::thread_error\n                    If either of these exceptions are thrown then #is_running() == false\n                    but otherwise this function succeeds\n        !*/\n        \n        void start (            \n        );\n        /*!\n            ensures\n                - does not block.\n                - if (is_running() == false) then\n                    - #is_running() == true\n                    - The action_function() will run in another thread.\n                    - The first call to the action_function() will occur in roughly \n                      delay_time() milliseconds.\n                - else\n                    - this call to start() has no effect\n            throws\n                - dlib::thread_error or std::bad_alloc\n                    If this exception is thrown then #is_running() == false but \n                    otherwise this call to start() has no effect.\n        !*/\n\n        void stop (\n        );\n        /*!\n            ensures\n                - #is_running() == false\n                - does not block.\n        !*/\n\n        void stop_and_wait (\n        );\n        /*!\n            ensures \n                - #is_running() == false\n                - if (the action function is currently executing) then\n                    - blocks until it finishes\n        !*/\n\n    private:\n\n        // restricted functions\n        timer(const timer<T>&);        // copy constructor\n        timer<T>& operator=(const timer<T>&);    // assignment operator\n\n    };    \n\n}\n\n#endif // DLIB_TIMER_KERNEl_ABSTRACT_\n\n"
  },
  {
    "path": "benchmarks/dlib/timer/timer_heavy.h",
    "content": "// Copyright (C) 2005  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_TIMER_KERNEl_1_\n#define DLIB_TIMER_KERNEl_1_\n\n#include \"../threads.h\"\n#include \"../algs.h\"\n#include \"../misc_api.h\"\n#include \"timer_abstract.h\"\n\nnamespace dlib\n{\n\n    template <\n        typename T\n        >\n    class timer_heavy\n    {\n        /*!\n            WHAT THIS OBJECT REPRESENTS\n                This is an implementation of the timer_abstract.h interface.  It is very\n                simple and uses only one thread which is always alive in a timer_heavy.\n                The reason this object exists is for historical reasons.  Originally, the\n                dlib::timer was a multi-implementation component and the timer_heavy was\n                its first implementation.  It was superseded later by the more efficient\n                dlib::timer.  However, timer_heavy is still around so that\n                dlib::timer::kernel_1a has something to refer to.  This way, old client\n                code which somehow depends on the same thread always calling a timer action\n                function isn't going to be disrupted.\n\n\n            INITIAL VALUE\n                - running   == false\n                - delay     == 1000\n                - ao        == a pointer to the action_object()\n                - af        == a pointer to the action_function()\n                - m         == a mutex that locks everything in this class\n                - s         == a signaler for mutex m\n                - stop_running == false\n\n            CONVENTION\n                - running && !stop_running == is_running()\n                - delay == delay_time()\n                - *ao == action_object()\n                - af == action_function()    \n\n                - if (running) then\n                    - there is a thread running\n                - if (is_running()) then\n                    - next_time_to_run == the time when the next execution of the action\n                      function should occur.  (the time is given by ts.get_timestamp())\n\n                - stop_running is used to tell the thread to quit.  If it is\n                  set to true then the thread should end.\n        !*/\n\n    public:\n\n        typedef void (T::*af_type)();\n\n        timer_heavy(  \n            T& ao_,\n            af_type af_\n        );\n\n        virtual ~timer_heavy(\n        );\n\n        void clear(\n        );\n\n        af_type action_function (\n        ) const;\n\n        const T& action_object (\n        ) const;\n\n        T& action_object (\n        );\n\n        bool is_running (\n        ) const;\n\n        unsigned long delay_time (\n        ) const;\n\n        void set_delay_time (\n            unsigned long milliseconds\n        );\n        \n        void start (            \n        );\n\n        void stop (\n        );\n\n        void stop_and_wait (\n        );\n\n    private:\n\n        void thread (\n        );\n        /*!\n            requires\n                - is run in its own thread\n            ensures\n                - calls the action function for the given timer object in the manner\n                  specified by timer_kernel_abstract.h\n        !*/\n\n        // data members\n        T& ao;\n        const af_type af;\n        unsigned long delay;\n        mutex m;\n        signaler s;\n\n        bool running;\n        bool stop_running;\n        timestamper ts;\n        uint64 next_time_to_run;\n\n        // restricted functions\n        timer_heavy(const timer_heavy<T>&);        // copy constructor\n        timer_heavy<T>& operator=(const timer_heavy<T>&);    // assignment operator\n\n    };    \n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // member function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    \n    template <\n        typename T\n        >\n    timer_heavy<T>::\n    timer_heavy(  \n        T& ao_,\n        af_type af_\n    ) : \n        ao(ao_),\n        af(af_),\n        delay(1000),\n        s(m),\n        running(false),\n        stop_running(false)\n    {\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    timer_heavy<T>::\n    ~timer_heavy(\n    )\n    {\n        stop_and_wait();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    void timer_heavy<T>::\n    clear(\n    )\n    {\n        m.lock();\n        stop_running = true;\n        delay = 1000;        \n        s.broadcast();\n        m.unlock();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    typename timer_heavy<T>::af_type timer_heavy<T>::\n    action_function (\n    ) const\n    {\n        return af;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    const T& timer_heavy<T>::\n    action_object (\n    ) const\n    {\n        return ao;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    T& timer_heavy<T>::\n    action_object (\n    )\n    {\n        return ao;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    bool timer_heavy<T>::\n    is_running (\n    ) const\n    {\n        auto_mutex M(m);\n        return running && !stop_running;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    unsigned long timer_heavy<T>::\n    delay_time (\n    ) const\n    {\n        auto_mutex M(m);\n        return delay;        \n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    void timer_heavy<T>::\n    set_delay_time (\n        unsigned long milliseconds\n    )\n    {\n        m.lock();\n\n        // if (is_running()) then we should adjust next_time_to_run\n        if (running && !stop_running)\n        {\n            next_time_to_run -= delay*1000;\n            next_time_to_run += milliseconds*1000;\n        }\n\n        delay = milliseconds;\n        s.broadcast();\n        m.unlock();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    void timer_heavy<T>::\n    start (            \n    )\n    {\n        auto_mutex M(m);\n\n        // if (is_running() == false) then reset the countdown to the next call \n        // to the action_function()\n        if ( (running && !stop_running) == false)\n            next_time_to_run = ts.get_timestamp() + delay*1000;\n\n        stop_running = false;\n        if (running == false)\n        {\n            running = true;\n\n            // start the thread\n            if (create_new_thread<timer_heavy,&timer_heavy::thread>(*this) == false)\n            {\n                running = false;\n                throw dlib::thread_error(\"error creating new thread in timer_heavy::start\");\n            }\n        }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    void timer_heavy<T>::\n    stop (\n    )\n    {\n        m.lock();\n        stop_running = true;\n        s.broadcast();\n        m.unlock();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    void timer_heavy<T>::\n    thread (\n    )\n    {\n        auto_mutex M(m);\n        unsigned long delay_remaining;\n        uint64 current_time = ts.get_timestamp();\n\n        if (current_time < next_time_to_run)\n            delay_remaining = static_cast<unsigned long>((next_time_to_run-current_time)/1000);\n        else\n            delay_remaining = 0;\n\n        while (stop_running == false)\n        {\n            if (delay_remaining > 0)\n                s.wait_or_timeout(delay_remaining);\n\n            if (stop_running)\n                break;            \n\n            current_time = ts.get_timestamp();\n            if (current_time < next_time_to_run)\n            {\n                // then we woke up too early so we should keep waiting\n                delay_remaining = static_cast<unsigned long>((next_time_to_run-current_time)/1000);\n\n                // rounding might make this be zero anyway.  So if it is\n                // then we will say we have hit the next time to run.\n                if (delay_remaining > 0)\n                    continue;\n            }\n\n            // call the action function \n            m.unlock();\n            (ao.*af)(); \n            m.lock();\n\n            current_time = ts.get_timestamp();\n            next_time_to_run = current_time + delay*1000;\n            delay_remaining = delay;\n        }\n        running = false;\n        stop_running = false;\n        s.broadcast();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    void timer_heavy<T>::\n    stop_and_wait (\n    )\n    {\n        m.lock();\n        if (running)\n        {\n            // make the running thread terminate\n            stop_running = true;\n\n            s.broadcast();\n            // wait for the thread to quit\n            while (running)\n                s.wait();          \n        }\n        m.unlock();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_TIMER_KERNEl_1_\n\n"
  },
  {
    "path": "benchmarks/dlib/timer.h",
    "content": "// Copyright (C) 2005  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_TIMEr_\n#define DLIB_TIMEr_\n\n#include \"timer/timer.h\"\n#include \"timer/timer_heavy.h\"\n\n#endif // DLIB_TIMEr_\n\n"
  },
  {
    "path": "benchmarks/dlib/timing.h",
    "content": "// Copyright (C) 2011  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_TImING_Hh_\n#define DLIB_TImING_Hh_\n\n#include <chrono> \n#include <atomic> \n#include <cstring>\n#include \"string.h\"\n\n#include <iostream>\n\n// ----------------------------------------------------------------------------------------\n\n/*!A timing\n\n    This set of functions is useful for determining how much time is spent\n    executing blocks of code.  Consider the following example:\n\n    int main()\n    {\n        using namespace dlib::timing;\n        for (int i = 0; i < 10; ++i)\n        {\n            // timing block #1\n            start(1,\"block #1\");\n            dlib::sleep(500);\n            stop(1);\n\n            // timing block #2\n            start(2,\"block #2\");\n            dlib::sleep(1000);\n            stop(2);\n        }\n\n        print();\n    }\n\n    This program would output:\n        Timing report: \n            block #1: 5.0 seconds\n            block #2: 10.0 seconds\n\n    So we spent 5 seconds in block #1 and 10 seconds in block #2\n\n\n\n    Additionally, note that you can use an RAII style timing block object.  For\n    example, if we wanted to find out how much time we spent in a loop a convenient\n    way to do this would be as follows:\n\n    int main()\n    {\n        using namespace dlib::timing;\n        for (int i = 0; i < 10; ++i)\n        {\n            block tb(1, \"main loop\");\n\n            dlib::sleep(1500);\n        } \n\n        print();\n    }\n\n    This program would output:\n        Timing report: \n            block main loop: 15.0 seconds\n\n!*/\n\n// ----------------------------------------------------------------------------------------\n\nnamespace dlib\n{\n    namespace timing\n    {\n        const int TIME_SLOTS = 500;\n        const int NAME_LENGTH = 40;\n\n        inline std::atomic<uint64_t>* time_buf()\n        {\n            static std::atomic<uint64_t> buf[TIME_SLOTS];\n            return buf;\n        }\n\n        inline char* name_buf(int i, const char* name)\n        {\n            static char buf[TIME_SLOTS][NAME_LENGTH] = {{0}};\n            // if this name buffer is empty then copy name into it\n            if (buf[i][0] == '\\0')\n            {\n                using namespace std;\n                strncpy(buf[i], name, NAME_LENGTH-1);\n                buf[i][NAME_LENGTH-1] = '\\0';\n            }\n            // return the name buffer\n            return buf[i];\n        }\n\n        inline uint64_t ts()\n        {\n            using namespace std::chrono;\n            return duration_cast<duration<double,std::nano>>(high_resolution_clock::now().time_since_epoch()).count();\n        }\n\n        inline void start(int i)\n        {\n            time_buf()[i] -= ts();\n        }\n\n        inline void start(int i, const char* name)\n        {\n            time_buf()[i] -= ts();\n            name_buf(i,name);\n        }\n\n        inline void stop(int i)\n        {\n            time_buf()[i] += ts();\n        }\n\n        inline void print()\n        {\n            using namespace std;\n            cout << \"Timing report: \" << endl;\n\n            // figure out how long the longest name is going to be.\n            unsigned long max_name_length = 0;\n            for (int i = 0; i < TIME_SLOTS; ++i)\n            {\n                string name;\n                // Check if the name buffer is empty.  Use the name it contains if it isn't.\n                if (name_buf(i,\"\")[0] != '\\0')\n                    name = cast_to_string(i) + \": \" + name_buf(i,\"\");\n                else \n                    name = cast_to_string(i);\n                max_name_length = std::max<unsigned long>(max_name_length, name.size());\n            }\n\n            for (int i = 0; i < TIME_SLOTS; ++i)\n            {\n                if (time_buf()[i] != 0)\n                {\n                    double time = time_buf()[i]/1000.0/1000.0;\n                    string name;\n                    // Check if the name buffer is empty.  Use the name it contains if it isn't.\n                    if (name_buf(i,\"\")[0] != '\\0')\n                        name = cast_to_string(i) + \": \" + name_buf(i,\"\");\n                    else \n                        name = cast_to_string(i);\n\n                    // make sure the name is always the same length.  Do so by padding with spaces\n                    if (name.size() < max_name_length)\n                        name += string(max_name_length-name.size(),' ');\n\n                    if (time < 1000)\n                        cout << \"  \" << name << \": \" << time << \" milliseconds\" << endl;\n                    else if (time < 1000*60)\n                        cout << \"  \" << name << \": \" << time/1000.0 << \" seconds\" << endl;\n                    else if (time < 1000*60*60)\n                        cout << \"  \" << name << \": \" << time/1000.0/60.0 << \" minutes\" << endl;\n                    else\n                        cout << \"  \" << name << \": \" << time/1000.0/60.0/60.0 << \" hours\" << endl;\n                }\n            }\n        }\n\n        inline void clear()\n        {\n            for (int i = 0; i < TIME_SLOTS; ++i)\n            {\n                // clear timing buffer\n                time_buf()[i] = 0;\n                // clear name buffer\n                name_buf(i,\"\")[0] = '\\0';\n            }\n        }\n\n        struct block\n        {\n            /*!\n                WHAT THIS OBJECT REPRESENTS\n                    This is an RAII tool for calling start() and stop()\n            !*/\n\n            block(int i):idx(i) {start(idx);}\n            block(int i, const char* str):idx(i) {start(idx,str);}\n            ~block() { stop(idx); }\n            const int idx;\n        };\n    }\n}\n\n\n#endif // DLIB_TImING_Hh_\n\n"
  },
  {
    "path": "benchmarks/dlib/tokenizer/tokenizer_kernel_1.h",
    "content": "// Copyright (C) 2005  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_TOKENIZER_KERNEl_1_\n#define DLIB_TOKENIZER_KERNEl_1_\n\n#include <string>\n#include <iosfwd>\n#include <climits>\n#include \"../algs.h\"\n#include \"tokenizer_kernel_abstract.h\"\n\nnamespace dlib\n{\n\n    class tokenizer_kernel_1 \n    {\n        /*!\n            INITIAL VALUE\n                - in == 0\n                - streambuf == 0\n                - have_peeked == false\n                - head == \"_\" + lowercase_letters() + uppercase_letters()\n                - body == \"_\" + lowercase_letters() + uppercase_letters() + numbers()\n                - headset == pointer to an array of UCHAR_MAX bools and set according \n                  to the CONVENTION.\n                - bodyset == pointer to an array of UCHAR_MAX bools and set according \n                  to the CONVENTION.\n\n            CONVENTION  \n                - if (stream_is_set()) then\n                    - get_stream() == *in\n                    - streambuf == in->rdbuf()\n                - else\n                    - in == 0\n                    - streambuf == 0\n\n                - body == get_identifier_body()\n                - head == get_identifier_head()\n\n                - if (the char x appears in head) then\n                    - headset[static_cast<unsigned char>(x)] == true\n                - else\n                    - headset[static_cast<unsigned char>(x)] == false\n\n                - if (the char x appears in body) then\n                    - bodyset[static_cast<unsigned char>(x)] == true\n                - else\n                    - bodyset[static_cast<unsigned char>(x)] == false\n\n                - if (have_peeked) then\n                    - next_token == the next token to be returned from get_token()\n                    - next_type == the type of token in peek_token\n        !*/\n\n    public:\n\n        // The name of this enum is irrelevant but on some compilers (gcc on MAC OS X) not having it named\n        // causes an error for whatever reason\n        enum some_random_name\n        {\n            END_OF_LINE,\n            END_OF_FILE,\n            IDENTIFIER,\n            CHAR,\n            NUMBER,\n            WHITE_SPACE\n        };\n\n        tokenizer_kernel_1 (        \n        );\n\n        virtual ~tokenizer_kernel_1 (\n        );\n\n        void clear(\n        );\n\n        void set_stream (\n            std::istream& in\n        );\n\n        bool stream_is_set (\n        ) const;\n\n        std::istream& get_stream (\n        ) const;\n\n        void get_token (\n            int& type,\n            std::string& token\n        );\n\n        void swap (\n            tokenizer_kernel_1& item\n        );\n\n        void set_identifier_token (\n            const std::string& head,\n            const std::string& body\n        );\n\n        int peek_type (\n        ) const;\n\n        const std::string& peek_token (\n        ) const;\n\n        const std::string get_identifier_head (\n        ) const;\n\n        const std::string get_identifier_body (\n        ) const;\n\n        const std::string lowercase_letters (\n        ) const;\n\n        const std::string uppercase_letters (\n        ) const;\n\n        const std::string numbers (\n        ) const;\n\n    private:\n\n        // restricted functions\n        tokenizer_kernel_1(const tokenizer_kernel_1&);        // copy constructor\n        tokenizer_kernel_1& operator=(const tokenizer_kernel_1&);    // assignment operator\n\n\n        // data members\n        std::istream* in;\n        std::streambuf* streambuf;\n        std::string head;\n        std::string body;\n        bool* headset;\n        bool* bodyset;\n\n        mutable std::string next_token;\n        mutable int next_type;\n        mutable bool have_peeked;\n    };    \n\n    inline void swap (\n        tokenizer_kernel_1& a, \n        tokenizer_kernel_1& b \n    ) { a.swap(b); }   \n\n}\n\n#ifdef NO_MAKEFILE\n#include \"tokenizer_kernel_1.cpp\"\n#endif\n\n#endif // DLIB_TOKENIZER_KERNEl_1\n\n"
  },
  {
    "path": "benchmarks/dlib/tokenizer/tokenizer_kernel_abstract.h",
    "content": "// Copyright (C) 2005  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_TOKENIZER_KERNEl_ABSTRACT_\n#ifdef DLIB_TOKENIZER_KERNEl_ABSTRACT_\n\n#include <string>\n#include <ioswfd>\n\nnamespace dlib\n{\n\n    class tokenizer \n    {\n        /*!\n            INITIAL VALUE\n                stream_is_set() == false\n                get_identifier_head() == \"_\" + lowercase_letters() + uppercase_letters()\n                get_identifier_body() == \"_\" + lowercase_letters() + uppercase_letters() + \n                                         numbers()\n\n            WHAT THIS OBJECT REPRESENTS\n                This object represents a simple tokenizer for textual data.\n\n            BUFFERING\n                This object is allowed to buffer data from the input stream.\n                Thus if you clear it or switch streams (via calling set_stream())\n                any buffered data will be lost.\n\n            TOKENS\n                When picking out tokens the tokenizer will always extract the \n                longest token it can.  For example, if faced with the string \n                \"555\" it will consider the three 5s to be a single NUMBER \n                token not three smaller NUMBER tokens.\n\n                Also note that no characters in the input stream are discarded.\n                They will all be returned in the text of some token.  \n                Additionally, each character will never be returned more than once.  \n                This means that if you concatenated all returned tokens it would exactly\n                reproduce the contents of the input stream.\n\n                The tokens are defined as follows:\n\n                END_OF_LINE\n                    This is a single character token and is always the '\\n' \n                    character.\n\n                END_OF_FILE\n                    This token represents the end of file.  It doesn't have any\n                    actual characters associated with it.  \n\n                IDENTIFIER\n                    This is a multi-character token.  It is defined as a string that\n                    begins with a character from get_identifier_head() and is \n                    followed by any number of characters from get_identifier_body().\n                       \n                NUMBER\n                    This is a multi-character token.  It is defined as a sequence of\n                    numbers. \n\n                WHITE_SPACE\n                    This is a multi character token.  It is defined as a sequence of\n                    one or more spaces, carrage returns, and tabs.  I.e. It is\n                    composed of characters from the following string \" \\r\\t\".\n\n                CHAR\n                    This is a single character token.  It matches anything that isn't\n                    part of one of the above tokens.                    \n        !*/\n\n    public:\n\n        enum \n        {\n            END_OF_LINE,\n            END_OF_FILE,\n            IDENTIFIER,\n            CHAR,\n            NUMBER,\n            WHITE_SPACE\n        };\n\n        tokenizer (        \n        );\n        /*!\n            ensures                \n                - #*this is properly initialized\n            throws\n                - std::bad_alloc\n        !*/\n\n        virtual ~tokenizer (\n        );\n        /*!\n            ensures\n                - any resources associated with *this have been released\n        !*/\n\n        void clear(\n        );\n        /*!\n            ensures\n                - #*this has its initial value\n            throws\n                - std::bad_alloc\n                    If this exception is thrown then #*this is unusable \n                    until clear() is called and succeeds.\n        !*/\n\n        void set_stream (\n            std::istream& in\n        );\n        /*!\n            ensures\n                - #*this will read data from in and tokenize it\n                - #stream_is_set() == true\n                - #get_stream() == in\n        !*/\n\n        bool stream_is_set (\n        ) const;\n        /*!\n            ensures\n                - returns true if a stream has been associated with *this by calling\n                  set_stream()\n        !*/\n\n        std::istream& get_stream (\n        ) const;\n        /*!\n            requires\n                - stream_is_set() == true\n            ensures\n                - returns a reference to the istream object that *this is reading \n                  from.\n        !*/\n\n        void get_token (\n            int& type,\n            std::string& token\n        );\n        /*!\n            requires\n                - stream_is_set() == true\n            ensures\n                - #token == the next token from the input stream get_stream()\n                - #type == the type of the token in #token\n            throws\n                - bad_alloc\n                    If this exception is thrown then the call to this function will \n                    have no effect on *this but the values of #type and #token will be \n                    undefined.  Additionally, some characters may have been read\n                    from the stream get_stream() and lost.\n        !*/\n\n        int peek_type (\n        ) const;\n        /*!\n            requires\n                - stream_is_set() == true\n            ensures\n                - returns the type of the token that will be returned from\n                  the next call to get_token()\n            throws\n                - bad_alloc\n                    If this exception is thrown then the call to this function will \n                    have no effect on *this.  However, some characters may have been \n                    read from the stream get_stream() and lost.\n        !*/\n\n        const std::string& peek_token (\n        ) const;\n        /*!\n            requires\n                - stream_is_set() == true\n            ensures\n                - returns the text of the token that will be returned from\n                  the next call to get_token()\n            throws\n                - bad_alloc\n                    If this exception is thrown then the call to this function will \n                    have no effect on *this.  However, some characters may have been \n                    read from the stream get_stream() and lost.\n        !*/\n\n        void set_identifier_token (\n            const std::string& head,\n            const std::string& body\n        );\n        /*!\n            requires\n                - head.find_first_of(\" \\r\\t\\n0123456789\") == std::string::npos\n                  (i.e. head doesn't contain any characters from the string\n                  \" \\r\\t\\n0123456789\").\n                - body.find_frst_of(\" \\r\\t\\n\") == std::string::npos\n                  (i.e. body doesn't contain any characters from the string \" \\r\\t\\n\").\n            ensures\n                - #get_identifier_head() == head\n                - #get_identifier_body() == body\n            throws\n                - std::bad_alloc\n                    If this exception is thrown then #*this is unusable \n                    until clear() is called and succeeds.\n        !*/\n\n        const std::string get_identifier_head (\n        ) const;\n        /*!\n            ensures\n                - returns a string containing the characters that can be the start\n                  of an IDENTIFIER token.\n            throws\n                - std::bad_alloc\n                    If this exception is thrown then the call to this function\n                    has no effect.\n        !*/\n\n        const std::string get_identifier_body (\n        ) const;\n        /*!\n            ensures\n                - returns a string containing the characters that can appear in the\n                  body of an IDENTIFIER token.\n            throws\n                - std::bad_alloc\n                    If this exception is thrown then the call to this function\n                    has no effect.\n        !*/\n\n        const std::string lowercase_letters (\n        ) const;\n        /*!\n            ensures\n                - returns \"abcdefghijklmnopqrstuvwxyz\"\n            throws\n                - std::bad_alloc\n                    If this exception is thrown then the call to this function\n                    has no effect.\n        !*/\n\n        const std::string uppercase_letters (\n        ) const;\n        /*!\n            ensures\n                - returns \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n            throws\n                - std::bad_alloc\n                    If this exception is thrown then the call to this function\n                    has no effect.\n        !*/\n\n        const std::string numbers (\n        ) const;\n        /*!\n            ensures\n                - returns \"0123456789\"\n            throws\n                - std::bad_alloc\n                    If this exception is thrown then the call to this function\n                    has no effect.\n        !*/\n\n        void swap (\n            tokenizer& item\n        );\n        /*!\n            ensures\n                - swaps *this and item\n        !*/ \n\n    private:\n\n        // restricted functions\n        tokenizer(const tokenizer&);        // copy constructor\n        tokenizer& operator=(const tokenizer&);    // assignment operator\n\n    };    \n\n    inline void swap (\n        tokenizer& a, \n        tokenizer& b \n    ) { a.swap(b); }   \n    /*!\n        provides a global swap function\n    !*/\n\n}\n\n#endif // DLIB_TOKENIZER_KERNEl_ABSTRACT_\n\n"
  },
  {
    "path": "benchmarks/dlib/tokenizer/tokenizer_kernel_c.h",
    "content": "// Copyright (C) 2003  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_TOKENIZER_KERNEl_C_\n#define DLIB_TOKENIZER_KERNEl_C_\n\n#include \"tokenizer_kernel_abstract.h\"\n#include \"../assert.h\"\n#include <string>\n#include <iostream>\n\nnamespace dlib\n{\n\n    template <\n        typename tokenizer\n        >\n    class tokenizer_kernel_c : public tokenizer\n    {\n        \n        public:\n            std::istream& get_stream (\n            ) const;\n\n            void get_token (\n                int& type,\n                std::string& token\n            );\n\n            void set_identifier_token (\n                const std::string& head,\n                const std::string& body\n            );\n\n            int peek_type (\n            ) const;\n\n            const std::string& peek_token (\n            ) const;\n    };\n\n    template <\n        typename tokenizer\n        >\n    inline void swap (\n        tokenizer_kernel_c<tokenizer>& a, \n        tokenizer_kernel_c<tokenizer>& b \n    ) { a.swap(b); }  \n\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n    // member function definitions\n// ----------------------------------------------------------------------------------------\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename tokenizer\n        >\n    void tokenizer_kernel_c<tokenizer>::\n    set_identifier_token (\n        const std::string& head,\n        const std::string& body\n    ) \n    {\n        using namespace std;\n        // make sure requires clause is not broken\n        DLIB_CASSERT( head.find_first_of(\" \\r\\t\\n0123456789\") == string::npos &&\n                body.find_first_of(\" \\r\\t\\n\") == string::npos ,\n            \"\\tvoid tokenizer::set_identifier_token()\"\n            << \"\\n\\tyou can't define the IDENTIFIER token this way.\"\n            << \"\\n\\thead: \" << head\n            << \"\\n\\tbody: \" << body\n            << \"\\n\\tthis: \" << this\n            );\n\n        // call the real function\n        tokenizer::set_identifier_token(head,body);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename tokenizer\n        >\n    std::istream& tokenizer_kernel_c<tokenizer>::\n    get_stream (\n    ) const\n    {\n        // make sure requires clause is not broken\n        DLIB_CASSERT( this->stream_is_set() == true,\n            \"\\tstd::istream& tokenizer::get_stream()\"\n            << \"\\n\\tyou must set a stream for this object before you can get it\"\n            << \"\\n\\tthis: \" << this\n            );\n\n        // call the real function\n        return tokenizer::get_stream();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename tokenizer\n        >\n    int tokenizer_kernel_c<tokenizer>::\n    peek_type (\n    ) const\n    {\n        // make sure requires clause is not broken\n        DLIB_CASSERT( this->stream_is_set() == true,\n            \"\\tint tokenizer::peek_type()\"\n            << \"\\n\\tyou must set a stream for this object before you peek at what it contains\"\n            << \"\\n\\tthis: \" << this\n            );\n\n        // call the real function\n        return tokenizer::peek_type();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename tokenizer\n        >\n    const std::string& tokenizer_kernel_c<tokenizer>::\n    peek_token (\n    ) const\n    {\n        // make sure requires clause is not broken\n        DLIB_CASSERT( this->stream_is_set() == true,\n            \"\\tint tokenizer::peek_token()\"\n            << \"\\n\\tyou must set a stream for this object before you peek at what it contains\"\n            << \"\\n\\tthis: \" << this\n            );\n\n        // call the real function\n        return tokenizer::peek_token();\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename tokenizer\n        >\n    void tokenizer_kernel_c<tokenizer>::\n    get_token (\n        int& type,\n        std::string& token\n    )\n    {\n        // make sure requires clause is not broken\n        DLIB_CASSERT( this->stream_is_set() == true,\n            \"\\tvoid tokenizer::get_token()\"\n            << \"\\n\\tyou must set a stream for this object before you can get tokens from it.\"\n            << \"\\n\\tthis: \" << this\n            );\n\n        // call the real function\n        tokenizer::get_token(type,token);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_TOKENIZER_KERNEl_C_\n\n\n"
  },
  {
    "path": "benchmarks/dlib/tokenizer.h",
    "content": "// Copyright (C) 2005  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_TOKENIZEr_\n#define DLIB_TOKENIZEr_\n\n#include \"tokenizer/tokenizer_kernel_1.h\"\n#include \"tokenizer/tokenizer_kernel_c.h\"\n\n\nnamespace dlib\n{\n\n    class tokenizer\n    {\n        tokenizer() {}\n\n\n    public:\n        \n        //----------- kernels ---------------\n\n        // kernel_1a        \n        typedef     tokenizer_kernel_1\n                    kernel_1a;\n        typedef     tokenizer_kernel_c<kernel_1a>\n                    kernel_1a_c;\n          \n\n    };\n}\n\n#endif // DLIB_TOKENIZEr_\n\n"
  },
  {
    "path": "benchmarks/dlib/uintn.h",
    "content": "// Copyright (C) 2005  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n\n#ifndef DLIB_UINtn_\n#define DLIB_UINtn_\n\n#include \"assert.h\"\n\nnamespace dlib\n{\n\n    /*!\n        uint64 is a typedef for an unsigned integer that is exactly 64 bits wide.\n        uint32 is a typedef for an unsigned integer that is exactly 32 bits wide.\n        uint16 is a typedef for an unsigned integer that is exactly 16 bits wide.\n        uint8  is a typedef for an unsigned integer that is exactly 8  bits wide.\n\n        int64 is a typedef for an integer that is exactly 64 bits wide.\n        int32 is a typedef for an integer that is exactly 32 bits wide.\n        int16 is a typedef for an integer that is exactly 16 bits wide.\n        int8  is a typedef for an integer that is exactly 8  bits wide.\n    !*/\n\n\n#ifdef __GNUC__\n    typedef unsigned long long uint64;\n    typedef long long int64;\n#elif defined(__BORLANDC__)\n    typedef unsigned __int64 uint64;\n    typedef __int64 int64;\n#elif defined(_MSC_VER)\n    typedef unsigned __int64 uint64;\n    typedef __int64 int64;\n#else\n    typedef unsigned long long uint64;\n    typedef long long int64;\n#endif\n\n    typedef unsigned short uint16;\n    typedef unsigned int   uint32;\n    typedef unsigned char  uint8;\n\n    typedef short int16;\n    typedef int   int32;\n    typedef char  int8;\n\n\n    // make sure these types have the right sizes on this platform\n    COMPILE_TIME_ASSERT(sizeof(uint8)  == 1);\n    COMPILE_TIME_ASSERT(sizeof(uint16) == 2);\n    COMPILE_TIME_ASSERT(sizeof(uint32) == 4);\n    COMPILE_TIME_ASSERT(sizeof(uint64) == 8);\n\n    COMPILE_TIME_ASSERT(sizeof(int8)  == 1);\n    COMPILE_TIME_ASSERT(sizeof(int16) == 2);\n    COMPILE_TIME_ASSERT(sizeof(int32) == 4);\n    COMPILE_TIME_ASSERT(sizeof(int64) == 8);\n\n\n\n    template <typename T, size_t s = sizeof(T)>\n    struct unsigned_type;\n    template <typename T>\n    struct unsigned_type<T,1> { typedef uint8 type; };\n    template <typename T>\n    struct unsigned_type<T,2> { typedef uint16 type; };\n    template <typename T>\n    struct unsigned_type<T,4> { typedef uint32 type; };\n    template <typename T>\n    struct unsigned_type<T,8> { typedef uint64 type; };\n    /*!\n        ensures\n            - sizeof(unsigned_type<T>::type) == sizeof(T)\n            - unsigned_type<T>::type is an unsigned integral type\n    !*/\n\n    template <typename T, typename U>\n    T zero_extend_cast(\n        const U val\n    )\n    /*!\n        requires\n            - U and T are integral types\n        ensures\n            - let ut be a typedef for unsigned_type<U>::type\n            - return static_cast<T>(static_cast<ut>(val));\n    !*/\n    {\n        typedef typename unsigned_type<U>::type ut;\n        return static_cast<T>(static_cast<ut>(val));\n    }\n\n}\n\n#endif // DLIB_UINtn_\n\n"
  },
  {
    "path": "benchmarks/dlib/unicode/unicode.h",
    "content": "// Copyright (C) 2007  Davis E. King (davis@dlib.net), and Nils Labugt\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_UNICODe_H_\n#define DLIB_UNICODe_H_\n\n#include \"../uintn.h\"\n#include \"../algs.h\"\n#include \"unicode_abstract.h\"\n#include <string>\n#include <cstring>\n\n#include <fstream>\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    typedef uint32 unichar;\n\n#if defined(__GNUC__) && __GNUC__ < 4 && __GNUC_MINOR__ < 4\n    struct unichar_traits \n    {\n        typedef dlib::unichar    char_type;\n        typedef dlib::unichar    int_type;\n        typedef std::streamoff   off_type;\n        typedef std::streampos   pos_type;\n        typedef std::mbstate_t   state_type;\n\n        static void assign(char_type& c1, const char_type& c2) { c1 = c2; }\n        static bool eq(const char_type& c1, const char_type& c2) { return c1 == c2; }\n        static bool lt(const char_type& c1, const char_type& c2) { return c1 < c2; }\n        static int compare(const char_type* s1, const char_type* s2, size_t n) \n        {\n            for (size_t i = 0; i < n; ++i)\n            {\n                if (s1[i] < s2[i])\n                    return -1;\n                else if (s1[i] > s2[i])\n                    return 1;\n            }\n            return 0;\n        }\n\n        static size_t length(const char_type* s)\n        {\n            size_t i = 0;\n            while (s[i] != 0)\n                ++i;\n            return i;\n        }\n\n        static const char_type* find(const char_type* s, size_t n,\n                                     const char_type& a)\n        {\n            for (size_t i = 0; i < n; ++i)\n            {\n                if (s[i] == a)\n                {\n                    return s+i;\n                }\n            }\n            return 0;\n        }\n\n        static char_type* move(char_type* s1, const char_type* s2, size_t n)\n        {\n            return static_cast<char_type*>(std::memmove(s1, s2, sizeof(char_type)*n));\n        }\n\n        static char_type* copy(char_type* s1, const char_type* s2, size_t n)\n        {\n            for (size_t i = 0; i < n; ++i)\n                s1[i] = s2[i];\n\n            return s1;\n        }\n\n        static char_type* assign(char_type* s, size_t n, char_type a)\n        {\n            for (size_t i = 0; i < n; ++i)\n                s[i] = a;\n\n            return s;\n        }\n\n\n        static int_type not_eof(const int_type& c) \n        {\n            if (!eq_int_type(c,eof()))\n                return to_int_type(c);\n            else\n                return 0;\n        }\n\n        static char_type to_char_type(const int_type& c) { return static_cast<char_type>(c); }\n        static int_type to_int_type(const char_type& c) { return zero_extend_cast<int_type>(c); }\n\n        static bool eq_int_type(const int_type& c1, const int_type& c2) { return c1 == c2; }\n\n        static int_type eof() { return static_cast<int_type>(EOF); }\n    };\n\n    typedef std::basic_string<unichar, unichar_traits> ustring;\n#else\n    typedef std::basic_string<unichar> ustring;\n#endif\n\n// ----------------------------------------------------------------------------------------\n\n    namespace unicode_helpers\n    {\n\n        template <\n            typename charT\n            >\n        int u8_to_u32(\n            charT& result,\n            std::istream& in\n        )\n        /*!\n            ensures\n                - if (there just wasn't any more data and we hit EOF) then\n                    - returns 0\n                - else if (we decoded another character without error) then\n                    - #result == the decoded character\n                    - returns the number of bytes consumed to make this character\n                - else\n                    - some error occurred\n                    - returns -1\n        !*/\n        {\n            int val = in.get();\n            if (val == EOF)\n                return 0;\n\n            unichar ch[4];\n            ch[0] = zero_extend_cast<unichar>(val);\n            if ( ch[0] < 0x80 )\n            {\n                result = static_cast<charT>(ch[0]);\n                return 1;\n            }\n            if ( ( ch[0] & ~0x3F ) == 0x80 )\n            {\n                // invalid leading byte\n                return -1;\n            }\n            if ( ( ch[0] & ~0x1F ) == 0xC0 )\n            {\n                val = in.get();\n                if ( val == EOF )\n                    return -1;\n                \n                ch[1] = zero_extend_cast<unichar>(val); \n                if ( ( ch[1] & ~0x3F ) != 0x80 )\n                    return -1; // invalid tail\n                if ( ( ch[0] & ~0x01 ) == 0xC0 )\n                    return -1; // overlong form\n                ch[0] &= 0x1F;\n                ch[1] &= 0x3F;\n                result = static_cast<charT>(( ch[0] << 6 ) | ch[1]);\n                return 2;\n            }\n            if ( ( ch[0] & ~0x0F ) == 0xE0 )\n            {\n                for ( unsigned n = 1;n < 3;n++ )\n                {\n                    val = in.get();\n                    if ( val == EOF )\n                        return -1;\n                    ch[n] = zero_extend_cast<unichar>(val); \n                    if ( ( ch[n] & ~0x3F ) != 0x80 )\n                        return -1; // invalid tail\n                    ch[n] &= 0x3F;\n                }\n                ch[0] &= 0x0F;\n                result = static_cast<charT>(( ch[0] << 12 ) | ( ch[1] << 6 ) | ch[2]);\n                if ( result < 0x0800 )\n                    return -1; // overlong form\n                if ( result >= 0xD800 && result < 0xE000 )\n                    return -1; // invalid character (UTF-16 surrogate pairs)\n                if ( result >= 0xFDD0 && result <= 0xFDEF )\n                    return -1; // noncharacter\n                if ( result >= 0xFFFE )\n                    return -1; // noncharacter\n                return 3;\n            }\n            if ( ( ch[0] & ~0x07 ) == 0xF0 )\n            {\n                for ( unsigned n = 1;n < 4;n++ )\n                {\n                    val = in.get();\n                    if ( val == EOF )\n                        return -1;\n                    ch[n] = zero_extend_cast<unichar>(val); \n                    if ( ( ch[n] & ~0x3F ) != 0x80 )\n                        return -1; // invalid tail\n                    ch[n] &= 0x3F;\n                }\n                if ( ( ch[0] ^ 0xF6 ) < 4 )\n                    return -1;\n                ch[0] &= 0x07;\n                result  = static_cast<charT>(( ch[0] << 18 ) | ( ch[1] << 12 ) | ( ch[2] << 6 ) | ch[3]);\n                if ( result < 0x10000 )\n                    return -1; // overlong form\n                if ( (result & 0xFFFF) >= 0xFFFE )\n                    return -1; // noncharacter\n                return 4;\n            }\n            return -1;\n        }\n\n    // ------------------------------------------------------------------------------------\n\n        template <typename charT>\n        class basic_utf8_streambuf : public std::basic_streambuf<charT>\n        {\n        public:\n            basic_utf8_streambuf (\n                std::ifstream& fin_\n            ) :\n                fin(fin_)\n            {\n                this->setg(in_buffer+max_putback, \n                     in_buffer+max_putback, \n                     in_buffer+max_putback);\n            }\n\n        protected:\n\n            typedef typename std::basic_streambuf<charT>::int_type int_type;\n\n            // input functions\n            int_type underflow( \n            )\n            {\n                if (this->gptr() < this->egptr())\n                {\n                    return zero_extend_cast<int_type>(*this->gptr());\n                }\n\n                int num_put_back = static_cast<int>(this->gptr() - this->eback());\n                if (num_put_back > max_putback)\n                {\n                    num_put_back = max_putback;\n                }\n\n                // copy the putback characters into the putback end of the in_buffer\n                std::memmove(in_buffer+(max_putback-num_put_back), this->gptr()-num_put_back, num_put_back);\n\n\n                // fill the buffer with characters\n                int n = in_buffer_size-max_putback;\n                int i;\n                for (i = 0; i < n; ++i)\n                {\n                    charT ch;\n                    if (unicode_helpers::u8_to_u32(ch,fin) > 0)\n                    {\n                        (in_buffer+max_putback)[i] = ch;\n                    }\n                    else\n                    {\n                        break;\n                    }\n                }\n\n                if (i == 0)\n                {\n                    // an error occurred or we hit EOF\n                    return EOF;\n                }\n\n                // reset in_buffer pointers\n                this->setg (in_buffer+(max_putback-num_put_back),\n                      in_buffer+max_putback,\n                      in_buffer+max_putback+i);\n\n                return zero_extend_cast<int_type>(*this->gptr());\n            }\n\n        private:\n            std::ifstream& fin;\n            static const int max_putback = 4;\n            static const int in_buffer_size = 10;\n            charT in_buffer[in_buffer_size];\n        };\n    }\n\n// ----------------------------------------------------------------------------------------\n#if defined(__GNUC__) && __GNUC__ >= 6\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wmisleading-indentation\"\n#endif\n    template <typename T>\n    bool is_combining_char(\n        const T ch_\n    )\n    {\n        const unichar ch = zero_extend_cast<unichar>(ch_);\n        if ( ch < 0x300 ) return false;\n        if ( ch < 0x370 ) return true;\n\n        if ( ch < 0x800 )\n        {\n            if ( ch < 0x483 )return false;if ( ch < 0x48A )return true;\n\n            if ( ch < 0x591 )return false;if ( ch < 0x5D0 )\n            {\n                if ( ch == 0x5C0 )return false;\n                if ( ch == 0x5C3 )return false;\n                if ( ch == 0x5C6 )return false;\n                return true;\n            }\n            if ( ch < 0x610 )return false;if ( ch < 0x616 )return true;\n            if ( ch < 0x64B )return false;if ( ch < 0x660 )return true;\n\n            if ( ch == 0x670 )return true;\n\n            if ( ch < 0x6D6 )return false;if ( ch < 0x6EE )\n            {\n                if ( ch == 0x6DD )return false;\n                if ( ch == 0x6E5 )return false;\n                if ( ch == 0x6E6 )return false;\n                if ( ch == 0x6E9 )return false;\n                return true;\n            }\n            if ( ch == 0x711 )return true;\n\n            if ( ch < 0x730 )return false;if ( ch < 0x74B )return true;\n            if ( ch < 0x7A6 )return false;if ( ch < 0x7B1 )return true;\n            if ( ch < 0x7EB )return false;if ( ch < 0x7F4 )return true;\n            return false;\n        }\n        if ( ch < 0xA00 )\n        {\n            if ( ch < 0x901 )return false;if ( ch < 0x904 )return true;\n            if ( ch < 0x93C )return false;if ( ch < 0x955 )\n            {\n                if ( ch == 0x93D )return false;\n                if ( ch == 0x950 )return false;\n                return true;\n            }\n            if ( ch < 0x962 )return false;if ( ch < 0x964 )return true;\n            if ( ch < 0x981 )return false;if ( ch < 0x984 )return true;\n            if ( ch < 0x9BC )return false;if ( ch < 0x9D8 )\n            {\n                if ( ch == 0x9BD )return false;\n                if ( ch == 0x9CE )return false;\n                return true;\n            }\n            if ( ch < 0x9E2 )return false;if ( ch < 0x9E4 )return true;\n            return false;\n        }\n        if ( ch < 0xC00 )\n        {\n            if ( ch < 0xA01 )return false;if ( ch < 0xA04 )return true;\n            if ( ch < 0xA3C )return false;if ( ch < 0xA4E )return true;\n            if ( ch < 0xA70 )return false;if ( ch < 0xA72 )return true;\n            if ( ch < 0xA81 )return false;if ( ch < 0xA84 )return true;\n            if ( ch < 0xABC )return false;if ( ch < 0xACE )\n            {\n                if ( ch == 0xABD )return false;\n                return true;\n            }\n            if ( ch < 0xAE2 )return false;if ( ch < 0xAE4 )return true;\n            if ( ch < 0xB01 )return false;if ( ch < 0xB04 )return true;\n            if ( ch < 0xB3C )return false;if ( ch < 0xB58 )\n            {\n                if ( ch == 0xB3D )return false;\n                return true;\n            }\n            if ( ch == 0xB82 )return true;\n\n            if ( ch < 0xBBE )return false;if ( ch < 0xBD8 )return true;\n\n            if ( ch == 0xBF4 )return true;\n            if ( ch == 0xBF8 )return true;\n            return false;\n        }\n        if(ch < 0xE00)\n        {\n            if ( ch < 0xC01 )return false;if ( ch < 0xC04 )return true;\n            if ( ch < 0xC3E )return false;if ( ch < 0xC57 )return true;\n            if ( ch < 0xC82 )return false;if ( ch < 0xC84 )return true;\n            if ( ch < 0xCBC )return false;if ( ch < 0xCD7 )\n            {\n                if ( ch == 0xCBD )return false;\n                return true;\n            }\n            if ( ch < 0xCE2 )return false;if ( ch < 0xCE4 )return true;\n            if ( ch < 0xD02 )return false;if ( ch < 0xD04 )return true;\n            if ( ch < 0xD3E )return false;if ( ch < 0xD58 )return true;\n            if ( ch < 0xD82 )return false;if ( ch < 0xD84 )return true;\n            if ( ch < 0xDCA )return false;if ( ch < 0xDF4 )return true;\n            return false;\n        }\n        if(ch < 0x1000)\n        {\n            if ( ch == 0xE31 )return true;\n\n            if ( ch < 0xE34 )return false;if ( ch < 0xE3B )return true;\n            if ( ch < 0xE47 )return false;if ( ch < 0xE4F )return true;\n\n            if ( ch == 0xEB1 )return true;\n\n            if ( ch < 0xEB4 )return false;if ( ch < 0xEBD )return true;\n            if ( ch < 0xEC8 )return false;if ( ch < 0xECE )return true;\n            if ( ch < 0xF18 )return false;if ( ch < 0xF1A )return true;\n\n            if ( ch == 0xF35 )return true;\n            if ( ch == 0xF37 )return true;\n            if ( ch == 0xF39 )return true;\n\n            if ( ch < 0xF3E )return false;if ( ch < 0xF40 )return true;\n            if ( ch < 0xF71 )return false;if ( ch < 0xF88 )\n            {\n                if ( ch == 0xF85 )return false;\n                return true;\n            }\n            if ( ch < 0xF90 )return false;if ( ch < 0xFBD )return true;\n\n            if ( ch == 0xFC6 )return true;\n            return false;\n        }\n        if ( ch < 0x1800 )\n        {\n            if ( ch < 0x102C )return false;if ( ch < 0x1040 )return true;\n            if ( ch < 0x1056 )return false;if ( ch < 0x105A )return true;\n\n            if ( ch == 0x135F )return true;\n\n            if ( ch < 0x1712 )return false;if ( ch < 0x1715 )return true;\n            if ( ch < 0x1732 )return false;if ( ch < 0x1735 )return true;\n            if ( ch < 0x1752 )return false;if ( ch < 0x1754 )return true;\n            if ( ch < 0x1772 )return false;if ( ch < 0x1774 )return true;\n            if ( ch < 0x17B6 )return false;if ( ch < 0x17D4 )return true;\n\n            if ( ch == 0x17DD )return true;\n            return false;\n        }\n        if(ch < 0x2000)\n        {\n            if ( ch < 0x180B )return false;if ( ch < 0x180E )return true;\n\n            if ( ch == 0x18A9 )return true;\n\n            if ( ch < 0x1920 )return false;if ( ch < 0x193C )return true;\n            if ( ch < 0x19B0 )return false;if ( ch < 0x19C1 )return true;\n            if ( ch < 0x19C8 )return false;if ( ch < 0x19CA )return true;\n            if ( ch < 0x1A17 )return false;if ( ch < 0x1A1C )return true;\n            if ( ch < 0x1B00 )return false;if ( ch < 0x1B05 )return true;\n            if ( ch < 0x1B34 )return false;if ( ch < 0x1B45 )return true;\n            if ( ch < 0x1B6B )return false;if ( ch < 0x1B74 )return true;\n            if ( ch < 0x1DC0 )return false;if ( ch < 0x1E00 )return true;\n            return false;\n        }\n        if ( ch < 0x20D0 )return false;if ( ch < 0x2100 )return true;\n        if ( ch < 0x302A )return false;if ( ch < 0x3030 )return true;\n        if ( ch < 0x3099 )return false;if ( ch < 0x309B )return true;\n\n        if ( ch == 0xA802 )return true;\n        if ( ch == 0xA806 )return true;\n        if ( ch == 0xA80B )return true;\n\n        if ( ch < 0xA823 )return false;if ( ch < 0xA828 )return true;\n\n        if ( ch == 0xFB1E )return true;\n\n        if ( ch < 0xFE00 )return false;if ( ch < 0xFE10 )return true;\n        if ( ch < 0xFE20 )return false;if ( ch < 0xFE30 )return true;\n        if ( ch < 0x10A01 )return false;if ( ch < 0x10A10 )return true;\n        if ( ch < 0x10A38 )return false;if ( ch < 0x10A40 )return true;\n        if ( ch < 0x1D165 )return false;if ( ch < 0x1D16A )return true;\n        if ( ch < 0x1D16D )return false;if ( ch < 0x1D173 )return true;\n        if ( ch < 0x1D17B )return false;if ( ch < 0x1D183 )return true;\n        if ( ch < 0x1D185 )return false;if ( ch < 0x1D18C )return true;\n        if ( ch < 0x1D1AA )return false;if ( ch < 0x1D1AE )return true;\n        if ( ch < 0x1D242 )return false;if ( ch < 0x1D245 )return true;\n        if ( ch < 0xE0100 )return false;if ( ch < 0xE01F0 )return true;\n        return false;\n    }\n#if defined(__GNUC__) && __GNUC__ >= 6\n#pragma GCC diagnostic pop\n#endif\n\n// ----------------------------------------------------------------------------------------\n\n    class invalid_utf8_error : public error\n    {\n    public:\n        invalid_utf8_error():error(EUTF8_TO_UTF32) {}\n    };\n\n    inline const ustring convert_utf8_to_utf32 (\n        const std::string& str\n    )\n    {\n        using namespace unicode_helpers;\n        ustring temp;\n        std::istringstream sin(str);\n\n        temp.reserve(str.size());\n\n        int status;\n        unichar ch;\n        while ( (status = u8_to_u32(ch,sin)) > 0)\n            temp.push_back(ch);\n\n        if (status < 0)\n            throw invalid_utf8_error();\n\n        return temp;\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    bool is_surrogate(unichar ch);\n\n    unichar surrogate_pair_to_unichar(unichar first, unichar second);\n\n    void unichar_to_surrogate_pair(unichar unicode, unichar &first, unichar &second);\n\n\n    const ustring convert_wstring_to_utf32 (\n        const std::wstring &wstr\n    );\n\n    const std::wstring convert_utf32_to_wstring (\n        const ustring &src\n    );\n\n    const std::wstring convert_mbstring_to_wstring (\n        const std::string &src\n    );\n\n    const std::string convert_wstring_to_mbstring(\n        const std::wstring &src\n    );\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename charT>\n    class basic_utf8_ifstream : public std::basic_istream<charT>\n    {\n    public:\n\n        basic_utf8_ifstream (\n        ) : std::basic_istream<charT>(&buf), buf(fin) {}\n\n        basic_utf8_ifstream (\n            const char* file_name,\n            std::ios_base::openmode mode = std::ios::in \n        ) : \n            std::basic_istream<charT>(&buf),\n            buf(fin)\n        {\n            fin.open(file_name,mode);\n            // make this have the same error state as fin\n            this->clear(fin.rdstate());\n        }\n\n        basic_utf8_ifstream (\n            const std::string& file_name,\n            std::ios_base::openmode mode = std::ios::in \n        ) : \n            std::basic_istream<charT>(&buf),\n            buf(fin)\n        {\n            fin.open(file_name.c_str(),mode);\n            // make this have the same error state as fin\n            this->clear(fin.rdstate());\n        }\n\n        void open(\n            const std::string& file_name,\n            std::ios_base::openmode mode = std::ios::in \n        )\n        {\n            open(file_name.c_str(),mode);\n        }\n\n        void open (\n            const char* file_name,\n            std::ios_base::openmode mode = std::ios::in \n        )\n        {\n            fin.close();\n            fin.clear();\n            fin.open(file_name,mode);\n            // make this have the same error state as fin\n            this->clear(fin.rdstate());\n        }\n\n        void close (\n        )\n        {\n            fin.close();\n            // make this have the same error state as fin\n            this->clear(fin.rdstate());\n        }\n\n    private:\n\n        std::ifstream fin;\n        unicode_helpers::basic_utf8_streambuf<charT> buf;\n    };\n\n    typedef basic_utf8_ifstream<unichar> utf8_uifstream;\n    typedef basic_utf8_ifstream<wchar_t> utf8_wifstream;\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#ifdef NO_MAKEFILE\n#include \"unicode.cpp\"\n#endif\n\n#endif // DLIB_UNICODe_H_\n\n"
  },
  {
    "path": "benchmarks/dlib/unicode/unicode_abstract.h",
    "content": "// Copyright (C) 2007  Davis E. King (davis@dlib.net), and Nils Labugt\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_UNICODe_ABSTRACT_H_\n#ifdef DLIB_UNICODe_ABSTRACT_H_\n\n#include \"../uintn.h\"\n#include \"../error.h\"\n#include <string>\n#include <fstream>\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    // a typedef for an unsigned 32bit integer to hold our UNICODE characters \n    typedef uint32 unichar;\n\n    // a typedef for a string object to hold our UNICODE strings\n    typedef std::basic_string<unichar> ustring;\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    bool is_combining_char(\n        const T ch_\n    );\n    /*!\n        ensures\n            - if (ch_ is a unicode combining character) then\n                - returns true\n            - else\n                - returns false\n    !*/\n\n    bool is_surrogate(\n        unichar ch\n    );\n    /*!\n        ensures\n            - if (ch is a unicode surrogate character) then\n                - returns true\n            - else\n                - returns false\n    !*/\n\n    unichar surrogate_pair_to_unichar(\n        unichar first, \n        unichar second\n    );\n    /*!\n        requires\n            - 0xD800 <= first < 0xDC00\n            - 0xDC00 <= second < 0xE000\n            - is_surrogate(first) == true\n            - is_surrogate(second) == true\n        ensures\n            - converts two surrogates into one unicode character\n    !*/\n\n    void unichar_to_surrogate_pair(\n        unichar ch, \n        unichar& first, \n        unichar& second\n    );\n    /*!\n        requires\n            - ch >= 0x10000 (i.e. is not in Basic Multilingual Plane) \n        ensures\n            - surrogate_pair_to_unichar(#first,#second) == ch\n              (i.e. converts ch into two surrogate characters)\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    class invalid_utf8_error : public error\n    {\n    public:\n        invalid_utf8_error():error(EUTF8_TO_UTF32) {}\n    };\n\n    const ustring convert_utf8_to_utf32 (\n        const std::string& str\n    );\n    /*!\n        ensures\n            - if (str is a valid UTF-8 encoded string) then\n                - returns a copy of str that has been converted into a\n                  unichar string\n            - else\n                - throws invalid_utf8_error\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    const ustring convert_wstring_to_utf32 (\n        const std::wstring &wstr\n    );\n    /*!\n        requires\n            - wstr is a valid UTF-16 string when sizeof(wchar_t) == 2\n            - wstr is a valid UTF-32 string when sizeof(wchar_t) == 4\n        ensures\n            - converts wstr into UTF-32 string\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    const std::wstring convert_utf32_to_wstring (\n        const ustring &str\n    );\n    /*!\n        requires\n            - str is a valid UTF-32 encoded string\n        ensures\n            - converts str into wstring whose encoding is UTF-16 when sizeof(wchar_t) == 2\n            - converts str into wstring whose encoding is UTF-32 when sizeof(wchar_t) == 4\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    const std::wstring convert_mbstring_to_wstring (\n        const std::string &str\n    );\n    /*!\n        requires\n            - str is a valid multibyte string whose encoding is same as current locale setting\n        ensures\n            - converts str into wstring whose encoding is UTF-16 when sizeof(wchar_t) == 2\n            - converts str into wstring whose encoding is UTF-32 when sizeof(wchar_t) == 4\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    const std::string convert_wstring_to_mbstring (\n        const std::wstring &src\n    );\n    /*!\n        requires\n            - str is a valid wide character string string whose encoding is same as current \n              locale setting\n        ensures\n            - returns a multibyte encoded version of the given string\n    !*/\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename charT\n        >\n    class basic_utf8_ifstream : public std::basic_istream<charT>\n    {\n        /*!\n            WHAT THIS OBJECT REPRESENTS\n                This object represents an input file stream much like the\n                normal std::ifstream except that it knows how to read UTF-8 \n                data.  So when you read characters out of this stream it will\n                automatically convert them from the UTF-8 multibyte encoding\n                into a fixed width wide character encoding.\n        !*/\n\n    public:\n\n        basic_utf8_ifstream (\n        );\n        /*!\n            ensures\n                - constructs an input stream that isn't yet associated with\n                  a file.\n        !*/\n\n        basic_utf8_ifstream (\n            const char* file_name,\n            std::ios_base::openmode mode = std::ios::in \n        );\n        /*!\n            ensures\n                - tries to open the given file for reading by this stream\n                - mode is interpreted exactly the same was as the open mode\n                  argument used by std::ifstream.\n        !*/\n\n        basic_utf8_ifstream (\n            const std::string& file_name,\n            std::ios_base::openmode mode = std::ios::in \n        );\n        /*!\n            ensures\n                - tries to open the given file for reading by this stream\n                - mode is interpreted exactly the same was as the open mode\n                  argument used by std::ifstream.\n        !*/\n\n        void open(\n            const std::string& file_name,\n            std::ios_base::openmode mode = std::ios::in \n        );\n        /*!\n            ensures\n                - tries to open the given file for reading by this stream\n                - mode is interpreted exactly the same was as the open mode\n                  argument used by std::ifstream.\n        !*/\n\n        void open (\n            const char* file_name,\n            std::ios_base::openmode mode = std::ios::in \n        );\n        /*!\n            ensures\n                - tries to open the given file for reading by this stream\n                - mode is interpreted exactly the same was as the open mode\n                  argument used by std::ifstream.\n        !*/\n\n        void close (\n        );\n        /*!\n            ensures\n                - any file opened by this stream has been closed\n        !*/\n    };\n\n    typedef basic_utf8_ifstream<unichar> utf8_uifstream;\n    typedef basic_utf8_ifstream<wchar_t> utf8_wifstream;\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_UNICODe_ABSTRACT_H_\n\n\n"
  },
  {
    "path": "benchmarks/dlib/unicode.h",
    "content": "// Copyright (C) 2007  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_UNICODe_TOP_\n#define DLIB_UNICODe_TOP_ \n\n#include \"unicode/unicode.h\"\n\n#endif // DLIB_UNICODe_TOP_\n\n"
  },
  {
    "path": "benchmarks/dlib/unordered_pair.h",
    "content": "// Copyright (C) 2010  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_UNORDERED_PAiR_Hh_\n#define DLIB_UNORDERED_PAiR_Hh_\n\n#include \"serialize.h\"\n\nnamespace dlib\n{\n\n// ----------------------------------------------------------------------------------------\n\n    template <\n        typename T\n        >\n    struct unordered_pair \n    {\n        /*!\n            REQUIREMENTS ON T\n                T must be default constructable, copyable, and comparable using\n                operator < and ==\n\n            WHAT THIS OBJECT REPRESENTS\n                This object is very similar to the std::pair struct except unordered_pair \n                is only capable of representing an unordered set of two items rather than \n                an ordered list of two items like std::pair.  \n\n                This is best illustrated by example.  Suppose we have the following\n                five variables:\n                    std::pair<int,int> p1(1, 5), p2(5,1);\n                    unordered_pair<int> up1(1,5), up2(5,1), up3(6,7);\n\n                Then it is the case that:   \n                    up1 == up2\n                    up1 != up3\n                    p1 != p2\n\n               So the unordered_pair doesn't care about the order of the arguments.\n               In this case, up1 and up2 are both equivalent.\n\n        !*/\n\n        typedef T type;\n        typedef T first_type;\n        typedef T second_type;\n\n        const T first;\n        const T second;\n\n        unordered_pair() : first(), second() \n        /*!\n            ensures\n                - #first and #second are default initialized\n        !*/ {}\n\n        unordered_pair(\n            const T& a, \n            const T& b\n        ) :\n            first( a < b ? a : b),\n            second(a < b ? b : a)\n        /*!\n            ensures\n                - #first <= #second\n                - #first and #second contain copies of the items a and b.\n        !*/ {}\n\n        template <typename U>\n        unordered_pair (\n            const unordered_pair <U>& p\n        ) :\n            first(p.first),\n            second(p.second)\n        /*!\n            ensures\n                - #*this is a copy of p\n        !*/ {}\n\n        unordered_pair& operator= (\n            const unordered_pair& item\n        ) \n        /*!\n            ensures\n                - #*this == item\n        !*/\n        {\n            const_cast<T&>(first) = item.first;\n            const_cast<T&>(second) = item.second;\n            return *this;\n        }\n    };\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    bool operator==(const unordered_pair<T>& a, const unordered_pair <T>& b)\n    {\n        return a.first == b.first && a.second == b.second;\n    }\n\n    template <typename T>\n    bool operator!=(const unordered_pair<T>& a, const unordered_pair <T>& b)\n    {\n        return !(a == b);\n    }\n\n    template <typename T>\n    bool operator<(const unordered_pair<T>& a, const unordered_pair<T>& b)\n    {\n        return (a.first < b.first || (!(b.first < a.first) && a.second < b.second));\n    }\n\n    template <typename T>\n    bool operator>(const unordered_pair<T>& a, const unordered_pair <T>& b)\n    {\n        return b < a;\n    }\n\n    template <typename T>\n    bool operator<=(const unordered_pair<T>& a, const unordered_pair <T>& b)\n    {\n        return !(b < a);\n    }\n\n    template <typename T>\n    bool operator>=(const unordered_pair<T>& a, const unordered_pair <T>& b)\n    {\n        return !(a < b);\n    }\n\n    template <typename T>\n    unordered_pair<T> make_unordered_pair (const T& a, const T& b)\n    {\n        return unordered_pair<T>(a,b);\n    }\n\n// ----------------------------------------------------------------------------------------\n\n    template <typename T>\n    void serialize (\n        const unordered_pair<T>& item,\n        std::ostream& out\n    )\n    {\n        try\n        { \n            serialize(item.first,out); \n            serialize(item.second,out); \n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while serializing object of type unordered_pair\"); }\n    }\n\n    template <typename T>\n    void deserialize (\n        unordered_pair<T>& item,\n        std::istream& in \n    )\n    {\n        try\n        { \n            T a, b;\n            deserialize(a,in); \n            deserialize(b,in); \n            item = make_unordered_pair(a,b);\n        }\n        catch (serialization_error& e)\n        { throw serialization_error(e.info + \"\\n   while deserializing object of type unordered_pair\"); }\n    }\n\n// ----------------------------------------------------------------------------------------\n\n}\n\n#endif // DLIB_UNORDERED_PAiR_Hh_\n\n"
  },
  {
    "path": "benchmarks/dlib/vectorstream/unserialize.h",
    "content": "// Copyright (C) 2016  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_uNSERIALIZE_Hh_\n#define DLIB_uNSERIALIZE_Hh_\n\n#include \"unserialize_abstract.h\"\n\n#include \"../serialize.h\"\n#include \"../algs.h\"\n#include \"vectorstream.h\"\n\n\n\nnamespace dlib\n{\n    class unserialize : public std::istream\n    {\n        class mystreambuf : public std::streambuf\n        {\n            typedef std::vector<char>::size_type size_type;\n            size_type read_pos; // buffer[read_pos] == next byte to read from buffer\n        public:\n            std::vector<char> buffer;\n            std::istream& str;\n\n            template <typename T>\n            mystreambuf(\n                const T& item,\n                std::istream& str_\n            ) :\n                read_pos(0),\n                str(str_) \n            {\n                // put the item into our buffer.\n                vectorstream vstr(buffer);\n                serialize(item, vstr);\n            }\n\n\n            // ------------------------ INPUT FUNCTIONS ------------------------\n\n            int_type underflow( \n            )\n            {\n                if (read_pos < buffer.size())\n                    return static_cast<unsigned char>(buffer[read_pos]);\n                else\n                    return str.peek();\n            }\n\n            int_type uflow( \n            )\n            {   \n                if (read_pos < buffer.size())\n                    return static_cast<unsigned char>(buffer[read_pos++]);\n                else\n                    return str.get();\n            }\n\n            std::streamsize xsgetn (\n                char* s, \n                std::streamsize n\n            )\n            { \n                if (read_pos < buffer.size())\n                {\n                    const size_type num = std::min<size_type>(n, buffer.size()-read_pos);\n                    std::memcpy(s, &buffer[read_pos], num);\n                    read_pos += num;\n                    return num;\n                }\n                else\n                {\n                    return str.rdbuf()->sgetn(s,n);\n                }\n                return 0;\n            }\n\n        };\n\n    public:\n\n        template <typename T>\n        unserialize (\n            const T& item,\n            std::istream& str \n        ) :\n            std::istream(&buf),\n            buf(item, str)\n        {}\n\n    private:\n        mystreambuf buf;\n    };\n}\n\n#endif // DLIB_uNSERIALIZE_Hh_\n\n"
  },
  {
    "path": "benchmarks/dlib/vectorstream/unserialize_abstract.h",
    "content": "// Copyright (C) 2016  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_uNSERIALIZE_ABSTRACT_Hh_\n#ifdef DLIB_uNSERIALIZE_ABSTRACT_Hh_\n\n#include \"../serialize.h\"\n#include <iostream>\n\nnamespace dlib\n{\n    class unserialize : public std::istream\n    {\n        /*!\n            WHAT THIS OBJECT REPRESENTS\n                This is a tool that allows you to effectively put an object you just\n                deserialized from a stream back into the stream.  Its use is best\n                illustrated via an example.  \n\n                void example(std::istream& in)\n                {\n                    // Suppose that in contains serialized copies of three \"some_type\"\n                    // objects.  You could read them as follows:\n                    some_type obj1, obj2, obj3;\n\n                    deserialize(obj1, in); // reads obj1 from stream.\n                    deserialize(obj2, in); // reads obj2 from stream.\n\n                    unserialize in2(obj2, in); // make the in2 stream that has obj2 at its front.\n                    deserialize(obj2, in2); // reads obj2 from stream again.\n                    deserialize(obj3, in2); // reads obj3 from stream.\n                }\n\n                The reason unserialize is useful is because it allows you to peek at the\n                next object in a stream and potentially do something different based on\n                what object is coming next, but still allowing subsequent deserialize()\n                statements to be undisturbed by the fact that you peeked at the data.\n        !*/\n\n    public:\n\n        template <typename T>\n        unserialize (\n            const T& item,\n            std::istream& in \n        );\n        /*!\n            requires\n                - T must be serializable \n            ensures\n                - The bytes in this stream begin with a serialized copy of item followed\n                  immediately by the bytes in the given istream.\n        !*/\n    };\n}\n\n#endif // DLIB_uNSERIALIZE_ABSTRACT_Hh_\n\n\n"
  },
  {
    "path": "benchmarks/dlib/vectorstream/vectorstream.h",
    "content": "// Copyright (C) 2012  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_VECTORStREAM_Hh_\n#define DLIB_VECTORStREAM_Hh_\n\n#include \"vectorstream_abstract.h\"\n\n#include <cstring>\n#include <iostream>\n#include <streambuf>\n#include <vector>\n#include <cstdio>\n#include \"../algs.h\"\n#include \"../assert.h\"\n\n#ifdef _MSC_VER\n// Disable the warning about inheriting from std::iostream 'via dominance' since this warning is a warning about\n// visual studio conforming to the standard and is ignorable.  See http://connect.microsoft.com/VisualStudio/feedback/details/733720/inheriting-from-std-fstream-produces-c4250-warning\n// for further details if interested.\n#pragma warning(disable : 4250)\n#endif // _MSC_VER\n\nnamespace dlib\n{\n    class vectorstream : public std::iostream\n    {\n        class vector_streambuf : public std::streambuf\n        {\n            typedef std::vector<char>::size_type size_type;\n            size_type read_pos; // buffer[read_pos] == next byte to read from buffer\n        public:\n            std::vector<char>& buffer;\n\n            vector_streambuf(\n                std::vector<char>& buffer_\n            ) :\n                read_pos(0),\n                buffer(buffer_) \n            {}\n\n\n            void seekg(size_type pos)\n            {\n                read_pos = pos;\n            }\n\n            pos_type seekpos(pos_type pos, std::ios_base::openmode mode = std::ios_base::in | std::ios_base::out)\n            {\n                return seekoff(pos - pos_type(off_type(0)), std::ios_base::beg, mode);\n            }\n\n            pos_type seekoff(off_type off, std::ios_base::seekdir dir,\n                             std::ios_base::openmode mode = std::ios_base::in | std::ios_base::out )\n            {\n                DLIB_CASSERT(mode == std::ios_base::in, \"vectorstream does not support std::ios_base::out\");\n                switch (dir)\n                {\n                    case std::ios_base::beg:\n                        read_pos = off;\n                        break;\n                    case std::ios_base::cur:\n                        read_pos += off;\n                        break;\n                    case std::ios_base::end:\n                        read_pos = buffer.size() + off;\n                        break;\n                    default:\n                        break;\n                }\n                return pos_type(read_pos);\n            }\n\n            // ------------------------ OUTPUT FUNCTIONS ------------------------\n\n            int_type overflow ( int_type c)\n            {\n                if (c != EOF) buffer.push_back(static_cast<char>(c));\n                return c;\n            }\n\n            std::streamsize xsputn ( const char* s, std::streamsize num)\n            {\n                buffer.insert(buffer.end(), s, s+num);\n                return num;\n            }\n\n            // ------------------------ INPUT FUNCTIONS ------------------------\n\n            int_type underflow( \n            )\n            {\n                if (read_pos < buffer.size())\n                    return static_cast<unsigned char>(buffer[read_pos]);\n                else\n                    return EOF;\n            }\n\n            int_type uflow( \n            )\n            {   \n                if (read_pos < buffer.size())\n                    return static_cast<unsigned char>(buffer[read_pos++]);\n                else\n                    return EOF;\n            }\n\n            int_type pbackfail(\n                int_type c\n            )\n            {  \n                // if they are trying to push back a character that they didn't read last\n                // that is an error\n                const unsigned long prev = read_pos-1;\n                if (c != EOF && prev < buffer.size() && \n                    c != static_cast<unsigned char>(buffer[prev]))\n                {\n                    return EOF;\n                }\n\n                read_pos = prev;\n                return 1;\n            }\n\n            std::streamsize xsgetn (\n                char* s, \n                std::streamsize n\n            )\n            { \n                if (read_pos < buffer.size())\n                {\n                    const size_type num = std::min<size_type>(n, buffer.size()-read_pos);\n                    std::memcpy(s, &buffer[read_pos], num);\n                    read_pos += num;\n                    return num;\n                }\n                return 0;\n            }\n\n        };\n\n    public:\n\n        vectorstream (\n            std::vector<char>& buffer\n        ) :\n            std::iostream(&buf),\n            buf(buffer)\n        {}\n            \n        vectorstream(const vectorstream& ori) = delete;\n        vectorstream(vectorstream&& item) = delete;\n            \n    private:\n        vector_streambuf buf;\n    };\n}\n\n#endif // DLIB_VECTORStREAM_Hh_\n\n"
  },
  {
    "path": "benchmarks/dlib/vectorstream/vectorstream_abstract.h",
    "content": "// Copyright (C) 2012  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#undef DLIB_VECTORStREAM_ABSTRACT_Hh_\n#ifdef DLIB_VECTORStREAM_ABSTRACT_Hh_\n\n#include <iostream>\n#include <vector>\n\nnamespace dlib\n{\n    class vectorstream : public std::iostream\n    {\n        /*!\n            WHAT THIS OBJECT REPRESENTS\n                This is an iostream object that reads and writes from an in-memory buffer.\n                It functions very much the same way as the std::stringstream object.\n                However, while the std::stringstream holds its buffer internally and it can\n                only be accessed by copying it out, the vectorstream uses an external\n                std::vector<char> as its buffer.  That is, it holds a reference to an\n                external vector and does not contain any internal buffers of its own.  \n\n                This object is useful as a slightly more efficient alternative to the\n                std::stringstream since you can avoid the overhead of copying buffer\n                contents to and from the stream.  This is particularly useful when used as\n                a source or target for serialization routines.\n        !*/\n\n    public:\n\n        vectorstream (\n            std::vector<char>& buffer\n        );\n        /*!\n            ensures\n                - This object will use the given vector as its read/write buffer.  That is:\n                    - Any data written to this stream will be appended to the given buffer\n                    - Any data read from this stream is read from the given buffer,\n                      starting with buffer[0], then buffer[1], and so on.  Just like\n                      std::stringstream, writes to the stream do not move the position of\n                      the next byte that will be read from the buffer.\n                - This constructor does not copy the buffer.  Only a reference to it will\n                  be used.  Therefore, any time data is written to this stream it will\n                  immediately show up in the buffer.\n        !*/\n\n        std::istream& seekg (\n            std::streampos pos\n        );\n        /*!\n            ensures\n                - The next read from this object will read from the position buffer[pos],\n                  where buffer is the std::vector given to this object's constructor.  Note\n                  that if pos >= buffer.size() then the next read will simply return EOF.\n                - returns *this\n        !*/\n\n    };\n}\n\n#endif // DLIB_VECTORStREAM_ABSTRACT_Hh_\n\n\n"
  },
  {
    "path": "benchmarks/dlib/vectorstream.h",
    "content": "// Copyright (C) 2012  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_VECTORSTReAMh_\n#define DLIB_VECTORSTReAMh_\n\n#include \"vectorstream/vectorstream.h\"\n#include \"vectorstream/unserialize.h\"\n\n\n#endif // DLIB_VECTORSTReAMh_\n\n"
  },
  {
    "path": "benchmarks/dlib/windows_magic.h",
    "content": "// Copyright (C) 2006  Davis E. King (davis@dlib.net)\n// License: Boost Software License   See LICENSE.txt for the full license.\n#ifndef DLIB_WINDOWS_MAGIc_ \n#define DLIB_WINDOWS_MAGIc_ \n\n#include \"platform.h\"\n\n#ifdef WIN32\n\n// This file contains all the magical #defines you have to setup  before you\n// include the windows header files.  \n\n#ifndef NOMINMAX\n#define NOMINMAX // prevent windows from messing with std::min and std::max\n#endif\n\n// Prevent windows from #defining IN or OUT\n#ifndef _NO_W32_PSEUDO_MODIFIERS\n#define _NO_W32_PSEUDO_MODIFIERS\n#endif\n\n// now just for good measure undefine min and max if they are defined\n#ifdef min\n#undef min\n#endif\n\n#ifdef max \n#undef max \n#endif\n\n#ifdef NO_MAKEFILE\n// only define this if all the cpp files are going to be sucked into the headers \n// because otherwise we don't need it since everything is isolated in the sockets\n// cpp file and this declaration for _WINSOCKAPI_ appears there also.\n#ifndef _WINSOCKAPI_\n#define _WINSOCKAPI_   /* Prevent inclusion of winsock.h in windows.h */\n#endif\n#endif\n\n// This is something stupid you have to do to make visual studio include the right\n// stuff.  I don't really know what the deal is with this.\n#if _WIN32_WINNT < 0x0500\n#undef _WIN32_WINNT\n#define _WIN32_WINNT 0x0500\n#endif\n\n#endif // WIN32\n\n#endif // DLIB_WINDOWS_MAGIc_\n\n"
  },
  {
    "path": "benchmarks/dlibqueue.h",
    "content": "#pragma once\n\n#include <utility>\n#include \"dlib/pipe.h\"\n#include \"wrappers.h\"\n\ntemplate<typename T>\nstruct DlibQueueWrapper\n{\npublic:\n    typedef DummyToken producer_token_t;\n    typedef DummyToken consumer_token_t;\n\npublic:\n    DlibQueueWrapper() : q(1024*1024*1024) { }\n\n    template<typename U>\n    inline bool enqueue(U&& item)\n    {\n        return q.enqueue(std::forward<U>(item));\n    }\n\n    inline bool try_dequeue(T& item)\n    {\n        return q.dequeue_or_timeout(item, 0);\n    }\n\n    // Dummy token methods (not used)\n    bool enqueue(producer_token_t const&, T const&) { return false; }\n    bool try_enqueue(producer_token_t, T const&) { return false; }\n    bool try_dequeue(consumer_token_t, T& item) { return false; }\n    template<typename It> bool enqueue_bulk(It, size_t) { return false; }\n    template<typename It> bool enqueue_bulk(producer_token_t const&, It, size_t) { return false; }\n    template<typename It> size_t try_dequeue_bulk(It, size_t) { return 0; }\n    template<typename It> size_t try_dequeue_bulk(consumer_token_t, It, size_t) { return 0; }\n\nprivate:\n    dlib::pipe<T> q;\n};\n"
  },
  {
    "path": "benchmarks/extract_graph_data.py",
    "content": "#!/usr/bin/python\n\n# A simple script that reads the last run from the benchmark log file,\n# and creates two CSV files containing the data required to make pretty\n# performance graphs for enqueuing and dequeueing.\n# The x-axis of the graph is meant to be the number of threads (first column), with\n# the y-axis representing thousands of operations/second/thread (one column per queue).\n\nimport sys\nimport re\n\n\ndef extract(bench, log, data, hasBulk = True):\n\t# data = { thread_count: [ locked, boost, tbb, moodycamel, moodycamel_tok, moodycamel_bulk ], ... }\n\t\n\tdef do_extract(bench, queue_header):\n\t\tblock = re.search(r'^' + bench + r':.*?' + queue_header + r'\\s*(.*?)\\s*^\\s*Operations per second', log, re.S | re.M | re.I).group(1)\n\t\tfor threads, opsst in re.findall(r'^\\s*(\\d+)\\s+thread.*?([0-9\\.]+[kMG]?\\s*$)', block, re.M | re.I):\n\t\t\tthreads = int(threads)\n\t\t\tmultiplier = 1\n\t\t\tif opsst[-1] in 'kMG':\n\t\t\t\tmultiplier = { 'k': 1000, 'M': 1000000, 'G': 1000000000 }[opsst[-1]]\n\t\t\t\topsst = opsst[:-1]\n\t\t\topsst = int(float(opsst) * multiplier)\n\t\t\tif threads not in data:\n\t\t\t\tdata[threads] = []\n\t\t\tdata[threads].append(opsst)\n\t\n\tdo_extract(bench, 'LockBasedQueue')\n\tdo_extract(bench, 'boost::lockfree::queue')\n\tdo_extract(bench, 'tbb::concurrent_queue')\n\tdo_extract(bench, 'Without tokens')\n\tdo_extract(bench, 'With tokens')\n\tif hasBulk:\n\t\tdo_extract(bench + ' bulk', 'With tokens')\n\n\ndef write_csv(data, path, hasBulk = True):\n\twith open(path, 'w') as f:\n\t\tf.write('threads,\"std::queue + std::mutex\",\"boost::lockfree::queue\",\"tbb::concurrent_queue\",\"moodycamel::ConcurrentQueue (no tokens)\",\"moodycamel::ConcurrentQueue\",' + ('\"moodycamel::ConcurrentQueue (bulk)\"' if hasBulk else '') + '\\n')\n\t\tfor threads in sorted(data.keys()):\n\t\t\tf.write(str(threads))\n\t\t\tfor opsst in data[threads]:\n\t\t\t\tf.write(',' + str(opsst))\n\t\t\tf.write('\\n')\n\n\ntry:\n\tfilename = 'benchmarks.log' if len(sys.argv) < 2 else sys.argv[1]\n\twith open(filename, 'r') as f:\n\t\tpieces = f.read().split('--- New run')\n\t\tlog = pieces[-1]\n\t\t\n\t\tenq_data = { }\n\t\textract('only enqueue', log, enq_data)\n\t\t\n\t\tdeq_data = { }\n\t\textract('only dequeue', log, deq_data)\n\t\t\n\t\theavy_data = { }\n\t\textract('heavy concurrent', log, heavy_data, False)\n\t\t\n\t\twrite_csv(enq_data, 'enqueue.csv')\n\t\twrite_csv(deq_data, 'dequeue.csv')\n\t\twrite_csv(heavy_data, 'heavy.csv', False)\nexcept IOError:\n\tprint('Usage: ' + sys.argv[0] + ' path/to/benchmarks.log')\n"
  },
  {
    "path": "benchmarks/lockbasedqueue.h",
    "content": "// ©2013-2014 Cameron Desrochers.\n// Distributed under the simplified BSD license (see the LICENSE file that\n// should have come with this file).\n\n#pragma once\n\n#include \"wrappers.h\"\n#include <mutex>\n\n// Naïve implementation of a simple lock-based queue. A std::mutex is obtained for every\n// method. Note that while the queue size is not fixed, each enqueue operation allocates\n// memory, and each dequeue frees memory.\ntemplate<typename T>\nclass LockBasedQueue\n{\npublic:\n\ttypedef DummyToken producer_token_t;\n\ttypedef DummyToken consumer_token_t;\n\t\npublic:\n\tLockBasedQueue()\n\t{\n\t\ttail = nullptr;\n\t\thead = nullptr;\n\t}\n\t\n\t~LockBasedQueue()\n\t{\n\t\twhile (head != nullptr) {\n\t\t\tNode* next = head->next;\n\t\t\tdelete head;\n\t\t\thead = next;\n\t\t}\n\t}\n\t\n\ttemplate<typename U>\n\tinline bool enqueue(U&& item)\n\t{\n\t\tNode* node = new Node(item);\n\t\t\n\t\tstd::lock_guard<std::mutex> guard(mutex);\n\t\tif (tail == nullptr) {\n\t\t\thead = tail = node;\n\t\t}\n\t\telse {\n\t\t\ttail->next = node;\n\t\t\ttail = node;\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\t\n\tinline bool try_dequeue(T& item)\n\t{\n\t\tstd::lock_guard<std::mutex> guard(mutex);\n\t\tif (head == nullptr) {\n\t\t\treturn false;\n\t\t}\n\t\telse {\n\t\t\titem = std::move(head->item);\n\t\t\tNode* next = head->next;\n\t\t\tdelete head;\n\t\t\thead = next;\n\t\t\tif (head == nullptr) {\n\t\t\t\ttail = nullptr;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t}\n\t\n\t// Dummy token methods (not used)\n\tbool enqueue(producer_token_t const&, T const&) { return false; }\n\tbool try_enqueue(producer_token_t, T const&) { return false; }\n\tbool try_dequeue(consumer_token_t, T& item) { return false; }\n\ttemplate<typename It> bool enqueue_bulk(It, size_t) { return false; }\n\ttemplate<typename It> bool enqueue_bulk(producer_token_t const&, It, size_t) { return false; }\n\ttemplate<typename It> size_t try_dequeue_bulk(It, size_t) { return 0; }\n\ttemplate<typename It> size_t try_dequeue_bulk(consumer_token_t, It, size_t) { return 0; }\n\t\nprivate:\n\tstruct Node\n\t{\n\t\tT item;\n\t\tNode* next;\n\t\t\n\t\ttemplate<typename U>\n\t\tNode(U&& item)\n\t\t\t: item(std::forward<U>(item)), next(nullptr)\n\t\t{\n\t\t}\n\t};\n\t\n\tstd::mutex mutex;\n\tNode* head;\n\tNode* tail;\n};\n"
  },
  {
    "path": "benchmarks/makefile",
    "content": "# ©2013-2014 Cameron Desrochers\r\n\r\ninclude ../build/makefile.inc\r\n\r\ndefault:\r\n\t$(MAKE) -C ../build bin/benchmarks$(EXT)\r\n\r\nrun: default\r\n\t../build/bin/benchmarks$(EXT)\r\n"
  },
  {
    "path": "benchmarks/simplelockfree.h",
    "content": "// ©2013-2014 Cameron Desrochers.\n// Distributed under the simplified BSD license (see the LICENSE file that\n// should have come with this file).\n\n#pragma once\n\n#include \"wrappers.h\"\n#include <atomic>\n#include <cstdint>\n\n#if defined(_MSC_VER) && _MSC_VER < 1900\n#define alignas(T)\n#endif\n\n// Fairly simple, yet correct, implementation of a simple lock-free queue based on linked pointers with CAS\ntemplate<typename T>\nclass SimpleLockFreeQueue\n{\npublic:\n\ttypedef DummyToken producer_token_t;\n\ttypedef DummyToken consumer_token_t;\n\t\n\t// Total maximum capacity: 2**39 (half a terabyte's worth -- off-by-one aligned indices)\n\tstatic const int UBER_BLOCKS = 256;\n\tstatic const int UBER_BLOCK_SIZE = 256;\n\tstatic const int ULTRA_BLOCK_SIZE = 256;\n\tstatic const int SUPER_BLOCK_SIZE = 256;\n\tstatic const int BLOCK_SIZE = 128;\n\t\nprivate:\n\tstatic const uint64_t VERSION_MASK = 0xFFFFFF0000000000ULL;\n\tstatic const uint64_t VERSION_INCR = 0x0000010000000000ULL;\n\tstatic const uint64_t UBER_BLOCK_IDX_MASK\t= 0xFF00000000ULL;\n\tstatic const uint64_t UBER_BLOCK_MASK \t\t= 0x00FF000000ULL;\n\tstatic const uint64_t ULTRA_BLOCK_MASK \t\t= 0x0000FF0000ULL;\n\tstatic const uint64_t SUPER_BLOCK_MASK \t\t= 0x000000FF00ULL;\n\tstatic const uint64_t BLOCK_MASK \t\t\t= 0x00000000FEULL;\n\t\n\tstatic const uint64_t UBER_BLOCK_IDX_SHIFT\t= 32;\n\tstatic const uint64_t UBER_BLOCK_SHIFT \t\t= 24;\n\tstatic const uint64_t ULTRA_BLOCK_SHIFT\t\t= 16;\n\tstatic const uint64_t SUPER_BLOCK_SHIFT\t\t= 8;\n\tstatic const uint64_t BLOCK_SHIFT \t\t\t= 1;\n\t\n\ttypedef std::uint64_t idx_t;\n\t\npublic:\n\tSimpleLockFreeQueue()\n\t\t: nextNodeIdx(2), freeListHead(0)\n\t{\n\t\t// Invariants: Head and tail are never null\n\t\tauto initialNode = allocate_blank_node();\n\t\thead.store(set_consumed_flag(initialNode), std::memory_order_relaxed);\n\t\ttail.store(initialNode, std::memory_order_relaxed);\n\t\tstd::atomic_thread_fence(std::memory_order_seq_cst);\n\t}\n\t\n\t~SimpleLockFreeQueue()\n\t{\n\t\tstd::atomic_thread_fence(std::memory_order_seq_cst);\n\t\tidx_t idx = head.load(std::memory_order_relaxed);\n\t\tif (is_consumed(idx)) {\n\t\t\tidx = clear_consumed_flag(idx);\n\t\t\tauto node = get_node_at(idx);\n\t\t\tauto next = node->next.load(std::memory_order_relaxed);\n\t\t\tnode->~Node();\n\t\t\tidx = next;\n\t\t}\n\t\twhile (idx != 0) {\n\t\t\tauto node = get_node_at(idx);\n\t\t\tauto next = node->next.load(std::memory_order_relaxed);\n\t\t\tnode->item()->~T();\n\t\t\tnode->~Node();\n\t\t\tidx = next;\n\t\t}\n\t\t\n\t\tidx = freeListHead.load(std::memory_order_relaxed);\n\t\twhile (idx != 0) {\n\t\t\tauto node = get_node_at(idx);\n\t\t\tauto next = node->next.load(std::memory_order_relaxed);\n\t\t\tnode->~Node();\n\t\t\tidx = next;\n\t\t}\n\t}\n\t\n\t\n\ttemplate<typename U>\n\tinline bool enqueue(U&& item)\n\t{\n\t\tidx_t nodeIdx = allocate_node_for(std::forward<U>(item));\n\t\t\n\t\tauto tail_ = tail.load(std::memory_order_relaxed);\n\t\twhile (!tail.compare_exchange_weak(tail_, nodeIdx, std::memory_order_release, std::memory_order_relaxed))\n\t\t\tcontinue;\n\t\tget_node_at(tail_)->next.store(nodeIdx, std::memory_order_release);\n\t\t\n\t\treturn true;\n\t}\n\t\n\tinline bool try_dequeue(T& item)\n\t{\n\t\twhile (true) {\n\t\t\tauto rawHead_ = head.load(std::memory_order_acquire);\n\t\t\tauto head_ = clear_consumed_flag(rawHead_);\n\t\t\tauto headNode = get_node_at(head_);\n\t\t\tauto next = headNode->next.load(std::memory_order_relaxed);\n\t\t\tif (next == 0) {\n\t\t\t\t// Can't move head (that would make head null), but can try to dequeue the node at head anyway\n\t\t\t\tif (is_consumed(rawHead_)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (head.compare_exchange_strong(head_, set_consumed_flag(head_), std::memory_order_release, std::memory_order_relaxed)) {\n\t\t\t\t\t// Whee, we own the right to dequeue this item\n\t\t\t\t\titem = std::move(*headNode->item());\n\t\t\t\t\theadNode->item()->~T();\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Remove node whether it's already been consumed or not; if it hasn't been consumed, consume it!\n\t\t\t\t\n\t\t\t\t// head_->next can't possibly change, since once it's not null nobody writes to it (and ABA is avoided with versioning)\n\t\t\t\tif (head.compare_exchange_weak(rawHead_, next, std::memory_order_acq_rel, std::memory_order_relaxed)) {\n\t\t\t\t\t// Aha, we successfully moved the head. But does it have anything in it?\n\t\t\t\t\tif (!is_consumed(rawHead_)) {\n\t\t\t\t\t\titem = std::move(*headNode->item());\n\t\t\t\t\t\theadNode->item()->~T();\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tadd_node_to_free_list(head_, headNode);\n\t\t\t\t\t\n\t\t\t\t\tif (!is_consumed(rawHead_)) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\t// Dummy token methods (not used)\n\tbool enqueue(producer_token_t const&, T const&) { return false; }\n\tbool try_enqueue(producer_token_t, T const&) { return false; }\n\tbool try_dequeue(consumer_token_t, T& item) { return false; }\n\ttemplate<typename It> bool enqueue_bulk(It, size_t) { return false; }\n\ttemplate<typename It> bool enqueue_bulk(producer_token_t const&, It, size_t) { return false; }\n\ttemplate<typename It> size_t try_dequeue_bulk(It, size_t) { return 0; }\n\ttemplate<typename It> size_t try_dequeue_bulk(consumer_token_t, It, size_t) { return 0; }\n\t\nprivate:\n\tstruct Node\n\t{\n\t\tstd::atomic<idx_t> next;\n\t\t\n\t\talignas(T)\n\t\tchar rawItem[sizeof(T)];\n\t\t\n\t\ttemplate<typename U>\n\t\tNode(U&& item)\n\t\t\t: next(0)\n\t\t{\n\t\t\tnew (this->item()) T(std::forward<U>(item));\n\t\t}\n\t\t\n\t\tNode()\n\t\t\t: next(0)\n\t\t{\n\t\t}\n\t\t\n\t\tinline T* item() { return reinterpret_cast<T*>(rawItem); }\n\t};\n\t\n\tstruct Block\n\t{\n\t\talignas(Node)\n\t\tchar nodes[sizeof(Node) * BLOCK_SIZE];\n\t\t\n\t\tinline char* node_pos(idx_t idx) { return nodes + ((idx & BLOCK_MASK) >> BLOCK_SHIFT) * sizeof(Node); }\n\t};\n\t\n\ttemplate<typename TSubBlock, int BlockSize>\n\tstruct HigherOrderBlock\n\t{\n\t\tstd::atomic<TSubBlock*> subblocks[BlockSize];\n\t\t\n\t\tHigherOrderBlock()\n\t\t{\n\t\t\tfor (int i = 0; i != BlockSize; ++i) {\n\t\t\t\tsubblocks[i].store(nullptr, std::memory_order_release);\n\t\t\t}\n\t\t}\n\t\t\n\t\t~HigherOrderBlock()\n\t\t{\n\t\t\tfor (int i = 0; i != BlockSize; ++i) {\n\t\t\t\tif (subblocks[i].load(std::memory_order_relaxed) != nullptr) {\n\t\t\t\t\tdelete subblocks[i].load(std::memory_order_relaxed);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\t\n\ttypedef HigherOrderBlock<Block, SUPER_BLOCK_SIZE> SuperBlock;\n\ttypedef HigherOrderBlock<SuperBlock, ULTRA_BLOCK_SIZE> UltraBlock;\n\ttypedef HigherOrderBlock<UltraBlock, UBER_BLOCK_SIZE> UberBlock;\n\ttypedef HigherOrderBlock<UberBlock, UBER_BLOCKS> UberBlockContainer;\n\t\n\t\nprivate:\n\tinline idx_t set_consumed_flag(idx_t idx)\n\t{\n\t\treturn idx | (idx_t)1;\n\t}\n\t\n\tinline idx_t clear_consumed_flag(idx_t idx)\n\t{\n\t\treturn idx & ~(idx_t)1;\n\t}\n\t\n\tinline bool is_consumed(idx_t idx)\n\t{\n\t\treturn (idx & 1) != 0;\n\t}\n\t\n\t\n\tinline void add_node_to_free_list(idx_t idx, Node* node)\n\t{\n\t\tauto head = freeListHead.load(std::memory_order_relaxed);\n\t\tdo {\n\t\t\tnode->next.store(head, std::memory_order_relaxed);\n\t\t} while (!freeListHead.compare_exchange_weak(head, idx, std::memory_order_release, std::memory_order_relaxed));\n\t}\n\t\n\tinline idx_t try_get_node_from_free_list()\n\t{\n\t\tauto head = freeListHead.load(std::memory_order_acquire);\n\t\twhile (head != 0 && !freeListHead.compare_exchange_weak(head, get_node_at(head)->next.load(std::memory_order_relaxed), std::memory_order_acquire)) {\n\t\t\tcontinue;\n\t\t}\n\t\t\n\t\tif (head != 0) {\n\t\t\t// Increment version\n\t\t\thead = (head & ~VERSION_MASK) | ((head + VERSION_INCR) & VERSION_MASK);\n\t\t}\n\t\treturn head;\n\t}\n\t\n\t\n\tinline Node* get_node_at(idx_t idx)\n\t{\n\t\tauto uberBlock = uberBlockContainer.subblocks[(idx & UBER_BLOCK_IDX_MASK) >> UBER_BLOCK_IDX_SHIFT].load(std::memory_order_relaxed);\n\t\tauto ultraBlock = uberBlock->subblocks[(idx & UBER_BLOCK_MASK) >> UBER_BLOCK_SHIFT].load(std::memory_order_relaxed);\n\t\tauto superBlock = ultraBlock->subblocks[(idx & ULTRA_BLOCK_MASK) >> ULTRA_BLOCK_SHIFT].load(std::memory_order_relaxed);\n\t\tauto block = superBlock->subblocks[(idx & SUPER_BLOCK_MASK) >> SUPER_BLOCK_SHIFT].load(std::memory_order_relaxed);\n\t\treturn reinterpret_cast<Node*>(block->node_pos(idx));\n\t}\n\t\n\ttemplate<typename U>\n\tinline idx_t allocate_node_for(U&& item)\n\t{\n\t\tauto idx = try_get_node_from_free_list();\n\t\tif (idx != 0) {\n\t\t\tauto node = get_node_at(idx);\n\t\t\tnode->next.store(0, std::memory_order_relaxed);\n\t\t\tnew (node->item()) T(std::forward<U>(item));\n\t\t\treturn idx;\n\t\t}\n\t\tnew (new_node_address(idx)) Node(std::forward<U>(item));\n\t\treturn idx;\n\t}\n\t\n\tinline idx_t allocate_blank_node()\n\t{\n\t\tidx_t idx;\n\t\tnew (new_node_address(idx)) Node();\n\t\treturn idx;\n\t}\n\t\n\tinline char* new_node_address(idx_t& idx)\n\t{\n\t\tidx = nextNodeIdx.fetch_add(static_cast<idx_t>(1) << BLOCK_SHIFT, std::memory_order_relaxed);\n\t\t\n\t\tstd::size_t uberBlockContainerIdx = (idx & UBER_BLOCK_IDX_MASK) >> UBER_BLOCK_IDX_SHIFT;\n\t\tstd::size_t uberBlockIdx = (idx & UBER_BLOCK_MASK) >> UBER_BLOCK_SHIFT;\n\t\tstd::size_t ultraBlockIdx = (idx & ULTRA_BLOCK_MASK) >> ULTRA_BLOCK_SHIFT;\n\t\tstd::size_t superBlockIdx = (idx & SUPER_BLOCK_MASK) >> SUPER_BLOCK_SHIFT;\n\t\t\n\t\tauto uberBlock = lookup_subblock<UberBlockContainer, UberBlock>(&uberBlockContainer, uberBlockContainerIdx);\n\t\tauto ultraBlock = lookup_subblock<UberBlock, UltraBlock>(uberBlock, uberBlockIdx);\n\t\tauto superBlock = lookup_subblock<UltraBlock, SuperBlock>(ultraBlock, ultraBlockIdx);\n\t\tauto block = lookup_subblock<SuperBlock, Block>(superBlock, superBlockIdx);\n\t\treturn block->node_pos(idx);\n\t}\n\t\n\ttemplate<typename TBlock, typename TSubBlock>\n\tinline TSubBlock* lookup_subblock(TBlock* block, std::size_t idx)\n\t{\n\t\tauto ptr = block->subblocks[idx].load(std::memory_order_acquire);\n\t\tif (ptr == nullptr) {\n\t\t\tauto newBlock = new TSubBlock();\n\t\t\tif (!block->subblocks[idx].compare_exchange_strong(ptr, newBlock, std::memory_order_release, std::memory_order_acquire)) {\n\t\t\t\tdelete newBlock;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tptr = newBlock;\n\t\t\t}\n\t\t}\n\t\treturn ptr;\n\t}\n\t\nprivate:\n\tstd::atomic<idx_t> nextNodeIdx;\n\tstd::atomic<idx_t> head;\n\tstd::atomic<idx_t> tail;\n\tstd::atomic<idx_t> freeListHead;\n\t\n\tUberBlockContainer uberBlockContainer;\n};\n"
  },
  {
    "path": "benchmarks/stdqueue.h",
    "content": "// ©2014 Cameron Desrochers.\n\n#pragma once\n\n#include <queue>\n\n#include \"wrappers.h\"\n\n// Simple wrapper around std::queue (not thread safe)\ntemplate<typename T>\nclass StdQueueWrapper\n{\npublic:\n\ttypedef DummyToken producer_token_t;\n\ttypedef DummyToken consumer_token_t;\n\t\npublic:\n\ttemplate<typename U>\n\tinline bool enqueue(U&& item)\n\t{\n\t\tq.push(std::forward<U>(item));\n\t\treturn true;\n\t}\n\t\n\tinline bool try_dequeue(T& item)\n\t{\n\t\tif (q.empty()) {\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\titem = std::move(q.front());\n\t\tq.pop();\n\t\treturn true;\n\t}\n\t\n\t// Dummy token methods (not used)\n\tbool enqueue(producer_token_t const&, T const&) { return false; }\n\tbool try_enqueue(producer_token_t, T const&) { return false; }\n\tbool try_dequeue(consumer_token_t, T& item) { return false; }\n\ttemplate<typename It> bool enqueue_bulk(It, size_t) { return false; }\n\ttemplate<typename It> bool enqueue_bulk(producer_token_t const&, It, size_t) { return false; }\n\ttemplate<typename It> size_t try_dequeue_bulk(It, size_t) { return 0; }\n\ttemplate<typename It> size_t try_dequeue_bulk(consumer_token_t, It, size_t) { return 0; }\n\nprivate:\n\tstd::queue<T> q;\n};\n"
  },
  {
    "path": "benchmarks/tbb/COPYING",
    "content": "\t\t    GNU GENERAL PUBLIC LICENSE\n\t\t       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.,\n 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n\t\t\t    Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicense is intended to guarantee your freedom to share and change free\nsoftware--to make sure the software is free for all its users.  This\nGeneral Public License applies to most of the Free Software\nFoundation's software and to any other program whose authors commit to\nusing it.  (Some other Free Software Foundation software is covered by\nthe GNU Lesser General Public License instead.)  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthis service if you wish), that you receive source code or can get it\nif you want it, that you can change the software or use pieces of it\nin new free programs; and that you know you can do these things.\n\n  To protect your rights, we need to make restrictions that forbid\nanyone to deny you these rights or to ask you to surrender the rights.\nThese restrictions translate to certain responsibilities for you if you\ndistribute copies of the software, or if you modify it.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must give the recipients all the rights that\nyou have.  You must make sure that they, too, receive or can get the\nsource code.  And you must show them these terms so they know their\nrights.\n\n  We protect your rights with two steps: (1) copyright the software, and\n(2) offer you this license which gives you legal permission to copy,\ndistribute and/or modify the software.\n\n  Also, for each author's protection and ours, we want to make certain\nthat everyone understands that there is no warranty for this free\nsoftware.  If the software is modified by someone else and passed on, we\nwant its recipients to know that what they have is not the original, so\nthat any problems introduced by others will not reflect on the original\nauthors' reputations.\n\n  Finally, any free program is threatened constantly by software\npatents.  We wish to avoid the danger that redistributors of a free\nprogram will individually obtain patent licenses, in effect making the\nprogram proprietary.  To prevent this, we have made it clear that any\npatent must be licensed for everyone's free use or not licensed at all.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n\t\t    GNU GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License applies to any program or other work which contains\na notice placed by the copyright holder saying it may be distributed\nunder the terms of this General Public License.  The \"Program\", below,\nrefers to any such program or work, and a \"work based on the Program\"\nmeans either the Program or any derivative work under copyright law:\nthat is to say, a work containing the Program or a portion of it,\neither verbatim or with modifications and/or translated into another\nlanguage.  (Hereinafter, translation is included without limitation in\nthe term \"modification\".)  Each licensee is addressed as \"you\".\n\nActivities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning the Program is not restricted, and the output from the Program\nis covered only if its contents constitute a work based on the\nProgram (independent of having been made by running the Program).\nWhether that is true depends on what the Program does.\n\n  1. You may copy and distribute verbatim copies of the Program's\nsource code as you receive it, in any medium, provided that you\nconspicuously and appropriately publish on each copy an appropriate\ncopyright notice and disclaimer of warranty; keep intact all the\nnotices that refer to this License and to the absence of any warranty;\nand give any other recipients of the Program a copy of this License\nalong with the Program.\n\nYou may charge a fee for the physical act of transferring a copy, and\nyou may at your option offer warranty protection in exchange for a fee.\n\n  2. You may modify your copy or copies of the Program or any portion\nof it, thus forming a work based on the Program, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) You must cause the modified files to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    b) You must cause any work that you distribute or publish, that in\n    whole or in part contains or is derived from the Program or any\n    part thereof, to be licensed as a whole at no charge to all third\n    parties under the terms of this License.\n\n    c) If the modified program normally reads commands interactively\n    when run, you must cause it, when started running for such\n    interactive use in the most ordinary way, to print or display an\n    announcement including an appropriate copyright notice and a\n    notice that there is no warranty (or else, saying that you provide\n    a warranty) and that users may redistribute the program under\n    these conditions, and telling the user how to view a copy of this\n    License.  (Exception: if the Program itself is interactive but\n    does not normally print such an announcement, your work based on\n    the Program is not required to print an announcement.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Program,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Program, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote it.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Program.\n\nIn addition, mere aggregation of another work not based on the Program\nwith the Program (or with a work based on the Program) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may copy and distribute the Program (or a work based on it,\nunder Section 2) in object code or executable form under the terms of\nSections 1 and 2 above provided that you also do one of the following:\n\n    a) Accompany it with the complete corresponding machine-readable\n    source code, which must be distributed under the terms of Sections\n    1 and 2 above on a medium customarily used for software interchange; or,\n\n    b) Accompany it with a written offer, valid for at least three\n    years, to give any third party, for a charge no more than your\n    cost of physically performing source distribution, a complete\n    machine-readable copy of the corresponding source code, to be\n    distributed under the terms of Sections 1 and 2 above on a medium\n    customarily used for software interchange; or,\n\n    c) Accompany it with the information you received as to the offer\n    to distribute corresponding source code.  (This alternative is\n    allowed only for noncommercial distribution and only if you\n    received the program in object code or executable form with such\n    an offer, in accord with Subsection b above.)\n\nThe source code for a work means the preferred form of the work for\nmaking modifications to it.  For an executable work, complete source\ncode means all the source code for all modules it contains, plus any\nassociated interface definition files, plus the scripts used to\ncontrol compilation and installation of the executable.  However, as a\nspecial exception, the source code distributed need not include\nanything that is normally distributed (in either source or binary\nform) with the major components (compiler, kernel, and so on) of the\noperating system on which the executable runs, unless that component\nitself accompanies the executable.\n\nIf distribution of executable or object code is made by offering\naccess to copy from a designated place, then offering equivalent\naccess to copy the source code from the same place counts as\ndistribution of the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  4. You may not copy, modify, sublicense, or distribute the Program\nexcept as expressly provided under this License.  Any attempt\notherwise to copy, modify, sublicense or distribute the Program is\nvoid, and will automatically terminate your rights under this License.\nHowever, parties who have received copies, or rights, from you under\nthis License will not have their licenses terminated so long as such\nparties remain in full compliance.\n\n  5. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Program or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Program (or any work based on the\nProgram), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Program or works based on it.\n\n  6. Each time you redistribute the Program (or any work based on the\nProgram), the recipient automatically receives a license from the\noriginal licensor to copy, distribute or modify the Program subject to\nthese terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties to\nthis License.\n\n  7. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Program at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Program by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Program.\n\nIf any portion of this section is held invalid or unenforceable under\nany particular circumstance, the balance of the section is intended to\napply and the section as a whole is intended to apply in other\ncircumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system, which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  8. If the distribution and/or use of the Program is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Program under this License\nmay add an explicit geographical distribution limitation excluding\nthose countries, so that distribution is permitted only in or among\ncountries not thus excluded.  In such case, this License incorporates\nthe limitation as if written in the body of this License.\n\n  9. The Free Software Foundation may publish revised and/or new versions\nof the General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Program\nspecifies a version number of this License which applies to it and \"any\nlater version\", you have the option of following the terms and conditions\neither of that version or of any later version published by the Free\nSoftware Foundation.  If the Program does not specify a version number of\nthis License, you may choose any version ever published by the Free Software\nFoundation.\n\n  10. If you wish to incorporate parts of the Program into other free\nprograms whose distribution conditions are different, write to the author\nto ask for permission.  For software which is copyrighted by the Free\nSoftware Foundation, write to the Free Software Foundation; we sometimes\nmake exceptions for this.  Our decision will be guided by the two goals\nof preserving the free status of all derivatives of our free software and\nof promoting the sharing and reuse of software generally.\n\n\t\t\t    NO WARRANTY\n\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n\n\t\t     END OF TERMS AND CONDITIONS\n\n\t    How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software; you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation; either version 2 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License along\n    with this program; if not, write to the Free Software Foundation, Inc.,\n    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf the program is interactive, make it output a short notice like this\nwhen it starts in an interactive mode:\n\n    Gnomovision version 69, Copyright (C) year name of author\n    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, the commands you use may\nbe called something other than `show w' and `show c'; they could even be\nmouse-clicks or menu items--whatever suits your program.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the program, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n  `Gnomovision' (which makes passes at compilers) written by James Hacker.\n\n  <signature of Ty Coon>, 1 April 1989\n  Ty Coon, President of Vice\n\nThis General Public License does not permit incorporating your program into\nproprietary programs.  If your program is a subroutine library, you may\nconsider it more useful to permit linking proprietary applications with the\nlibrary.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.\n----------------     END OF Gnu General Public License     ----------------\n\nThe source code of Threading Building Blocks is distributed under version 2\nof the GNU General Public License, with the so-called \"runtime exception,\"\nas follows (or see any header or implementation file):\n\n   As a special exception, you may use this file as part of a free software\n   library without restriction.  Specifically, if other files instantiate\n   templates or use macros or inline functions from this file, or you compile\n   this file and link it with other files to produce an executable, this\n   file does not by itself cause the resulting executable to be covered by\n   the GNU General Public License.  This exception does not however\n   invalidate any other reasons why the executable file might be covered by\n   the GNU General Public License.\n"
  },
  {
    "path": "benchmarks/tbb/README.txt",
    "content": "This is a partial copy of the Intel TBB open source version.\r\nThe version taken is 4.3, obtained from https://www.threadingbuildingblocks.org/download\r\nThe files in this directory consist of the files taken from src/tbb and include/tbb"
  },
  {
    "path": "benchmarks/tbb/aggregator.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB__aggregator_H\n#define __TBB__aggregator_H\n\n#if !TBB_PREVIEW_AGGREGATOR\n#error Set TBB_PREVIEW_AGGREGATOR before including aggregator.h\n#endif\n\n#include \"atomic.h\"\n#include \"tbb_profiling.h\"\n\nnamespace tbb {\nnamespace interface6 {\n\nusing namespace tbb::internal;\n\nclass aggregator_operation {\n    template<typename handler_type> friend class aggregator_ext;\n    uintptr_t status;\n    aggregator_operation* my_next;\npublic:\n    enum aggregator_operation_status { agg_waiting=0, agg_finished };\n    aggregator_operation() : status(agg_waiting), my_next(NULL) {}\n    /// Call start before handling this operation\n    void start() { call_itt_notify(acquired, &status); }\n    /// Call finish when done handling this operation\n    /** The operation will be released to its originating thread, and possibly deleted. */\n    void finish() { itt_store_word_with_release(status, uintptr_t(agg_finished)); }\n    aggregator_operation* next() { return itt_hide_load_word(my_next);}\n    void set_next(aggregator_operation* n) { itt_hide_store_word(my_next, n); }\n};\n\nnamespace internal {\n\nclass basic_operation_base : public aggregator_operation {\n    friend class basic_handler;\n    virtual void apply_body() = 0;\npublic:\n    basic_operation_base() : aggregator_operation() {}\n    virtual ~basic_operation_base() {}\n};\n\ntemplate<typename Body>\nclass basic_operation : public basic_operation_base, no_assign {\n    const Body& my_body;\n    /*override*/ void apply_body() { my_body(); }\npublic:\n    basic_operation(const Body& b) : basic_operation_base(), my_body(b) {}\n};\n\nclass basic_handler {\npublic:\n    basic_handler() {}\n    void operator()(aggregator_operation* op_list) const { \n        while (op_list) {\n            // ITT note: &(op_list->status) tag is used to cover accesses to the operation data.\n            // The executing thread \"acquires\" the tag (see start()) and then performs\n            // the associated operation w/o triggering a race condition diagnostics.\n            // A thread that created the operation is waiting for its status (see execute_impl()),\n            // so when this thread is done with the operation, it will \"release\" the tag \n            // and update the status (see finish()) to give control back to the waiting thread.\n            basic_operation_base& request = static_cast<basic_operation_base&>(*op_list);\n            // IMPORTANT: need to advance op_list to op_list->next() before calling request.finish()\n            op_list = op_list->next();\n            request.start();\n            request.apply_body();\n            request.finish();\n        }\n    }\n};\n\n} // namespace internal\n\n//! Aggregator base class and expert interface\n/** An aggregator for collecting operations coming from multiple sources and executing\n    them serially on a single thread. */\ntemplate <typename handler_type>\nclass aggregator_ext : tbb::internal::no_copy {\npublic:\n    aggregator_ext(const handler_type& h) : handler_busy(0), handle_operations(h) { mailbox = NULL; }\n\n    //! EXPERT INTERFACE: Enter a user-made operation into the aggregator's mailbox.\n    /** Details of user-made operations must be handled by user-provided handler */\n    void process(aggregator_operation *op) { execute_impl(*op); }\n\n protected:\n    /** Place operation in mailbox, then either handle mailbox or wait for the operation \n        to be completed by a different thread. */\n    void execute_impl(aggregator_operation& op) {\n        aggregator_operation* res;\n\n        // ITT note: &(op.status) tag is used to cover accesses to this operation. This\n        // thread has created the operation, and now releases it so that the handler\n        // thread may handle the associated operation w/o triggering a race condition;\n        // thus this tag will be acquired just before the operation is handled in the\n        // handle_operations functor.\n        call_itt_notify(releasing, &(op.status));\n        // insert the operation in the queue\n        do {\n            // ITT may flag the following line as a race; it is a false positive:\n            // This is an atomic read; we don't provide itt_hide_load_word for atomics\n            op.my_next = res = mailbox; // NOT A RACE \n        } while (mailbox.compare_and_swap(&op, res) != res);\n        if (!res) { // first in the list; handle the operations\n            // ITT note: &mailbox tag covers access to the handler_busy flag, which this\n            // waiting handler thread will try to set before entering handle_operations.\n            call_itt_notify(acquired, &mailbox);\n            start_handle_operations();\n            __TBB_ASSERT(op.status, NULL);\n        }\n        else { // not first; wait for op to be ready\n            call_itt_notify(prepare, &(op.status));\n            spin_wait_while_eq(op.status, uintptr_t(aggregator_operation::agg_waiting));\n            itt_load_word_with_acquire(op.status);\n        }\n    }\n\n\n private:\n    //! An atomically updated list (aka mailbox) of aggregator_operations\n    atomic<aggregator_operation *> mailbox;\n\n    //! Controls thread access to handle_operations\n    /** Behaves as boolean flag where 0=false, 1=true */\n    uintptr_t handler_busy;\n\n    handler_type handle_operations;\n\n    //! Trigger the handling of operations when the handler is free\n    void start_handle_operations() {\n        aggregator_operation *pending_operations;\n\n        // ITT note: &handler_busy tag covers access to mailbox as it is passed\n        // between active and waiting handlers.  Below, the waiting handler waits until\n        // the active handler releases, and the waiting handler acquires &handler_busy as\n        // it becomes the active_handler. The release point is at the end of this\n        // function, when all operations in mailbox have been handled by the\n        // owner of this aggregator.\n        call_itt_notify(prepare, &handler_busy);\n        // get handler_busy: only one thread can possibly spin here at a time\n        spin_wait_until_eq(handler_busy, uintptr_t(0));\n        call_itt_notify(acquired, &handler_busy);\n        // acquire fence not necessary here due to causality rule and surrounding atomics\n        __TBB_store_with_release(handler_busy, uintptr_t(1));\n\n        // ITT note: &mailbox tag covers access to the handler_busy flag itself. \n        // Capturing the state of the mailbox signifies that handler_busy has been \n        // set and a new active handler will now process that list's operations.\n        call_itt_notify(releasing, &mailbox);\n        // grab pending_operations\n        pending_operations = mailbox.fetch_and_store(NULL);\n\n        // handle all the operations\n        handle_operations(pending_operations);\n\n        // release the handler\n        itt_store_word_with_release(handler_busy, uintptr_t(0));\n    }\n};\n\n//! Basic aggregator interface\nclass aggregator : private aggregator_ext<internal::basic_handler> {\npublic:\n    aggregator() : aggregator_ext<internal::basic_handler>(internal::basic_handler()) {}\n    //! BASIC INTERFACE: Enter a function for exclusive execution by the aggregator.\n    /** The calling thread stores the function object in a basic_operation and\n        places the operation in the aggregator's mailbox */\n    template<typename Body>\n    void execute(const Body& b) {\n        internal::basic_operation<Body> op(b);\n        this->execute_impl(op);\n    }\n};\n\n} // namespace interface6\n\nusing interface6::aggregator;\nusing interface6::aggregator_ext;\nusing interface6::aggregator_operation;\n\n} // namespace tbb\n\n#endif  // __TBB__aggregator_H\n"
  },
  {
    "path": "benchmarks/tbb/aligned_space.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_aligned_space_H\n#define __TBB_aligned_space_H\n\n#include \"tbb_stddef.h\"\n#include \"tbb_machine.h\"\n\nnamespace tbb {\n\n//! Block of space aligned sufficiently to construct an array T with N elements.\n/** The elements are not constructed or destroyed by this class.\n    @ingroup memory_allocation */\ntemplate<typename T,size_t N=1>\nclass aligned_space {\nprivate:\n    typedef __TBB_TypeWithAlignmentAtLeastAsStrict(T) element_type;\n    element_type array[(sizeof(T)*N+sizeof(element_type)-1)/sizeof(element_type)];\npublic:\n    //! Pointer to beginning of array\n    T* begin() {return internal::punned_cast<T*>(this);}\n\n    //! Pointer to one past last element in array.\n    T* end() {return begin()+N;}\n};\n\n} // namespace tbb \n\n#endif /* __TBB_aligned_space_H */\n"
  },
  {
    "path": "benchmarks/tbb/arena.cpp",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#include \"scheduler.h\"\n#include \"governor.h\"\n#include \"arena.h\"\n#include \"itt_notify.h\"\n#include \"semaphore.h\"\n\n#include <functional>\n\n#if __TBB_STATISTICS_STDOUT\n#include <cstdio>\n#endif\n\nnamespace tbb {\nnamespace internal {\n\nvoid arena::process( generic_scheduler& s ) {\n    __TBB_ASSERT( is_alive(my_guard), NULL );\n    __TBB_ASSERT( governor::is_set(&s), NULL );\n    __TBB_ASSERT( !s.my_innermost_running_task, NULL );\n    __TBB_ASSERT( !s.my_dispatching_task, NULL );\n\n    __TBB_ASSERT( my_num_slots != 1, NULL );\n    // Start search for an empty slot from the one we occupied the last time\n    unsigned index = s.my_arena_index < my_num_slots ? s.my_arena_index : s.my_random.get() % (my_num_slots - 1) + 1,\n             end = index;\n    __TBB_ASSERT( index != 0, \"A worker cannot occupy slot 0\" );\n    __TBB_ASSERT( index < my_num_slots, NULL );\n\n    // Find a vacant slot\n    for ( ;; ) {\n        if ( !my_slots[index].my_scheduler && as_atomic(my_slots[index].my_scheduler).compare_and_swap(&s, NULL ) == NULL )\n            break;\n        if ( ++index == my_num_slots )\n            index = 1;\n        if ( index == end ) {\n            // Likely this arena is already saturated\n            goto quit;\n        }\n    }\n    ITT_NOTIFY(sync_acquired, my_slots + index);\n    s.my_arena = this;\n    s.my_arena_index = index;\n    s.my_arena_slot = my_slots + index;\n#if __TBB_TASK_PRIORITY\n    s.my_local_reload_epoch = *s.my_ref_reload_epoch;\n    __TBB_ASSERT( !s.my_offloaded_tasks, NULL );\n#endif /* __TBB_TASK_PRIORITY */\n    s.attach_mailbox( affinity_id(index+1) );\n\n    s.my_arena_slot->hint_for_pop  = index; // initial value for round-robin\n\n#if !__TBB_FP_CONTEXT\n    my_cpu_ctl_env.set_env();\n#endif\n\n#if __TBB_SCHEDULER_OBSERVER\n    __TBB_ASSERT( !s.my_last_local_observer, \"There cannot be notified local observers when entering arena\" );\n    my_observers.notify_entry_observers( s.my_last_local_observer, /*worker=*/true );\n#endif /* __TBB_SCHEDULER_OBSERVER */\n\n    atomic_update( my_limit, index + 1, std::less<unsigned>() );\n\n    for ( ;; ) {\n        // Try to steal a task.\n        // Passing reference count is technically unnecessary in this context,\n        // but omitting it here would add checks inside the function.\n        __TBB_ASSERT( is_alive(my_guard), NULL );\n        task* t = s.receive_or_steal_task( s.my_dummy_task->prefix().ref_count, /*return_if_no_work=*/true );\n        if (t) {\n            // A side effect of receive_or_steal_task is that my_innermost_running_task can be set.\n            // But for the outermost dispatch loop of a worker it has to be NULL.\n            s.my_innermost_running_task = NULL;\n            __TBB_ASSERT( !s.my_dispatching_task, NULL );\n            s.local_wait_for_all(*s.my_dummy_task,t);\n        }\n        __TBB_ASSERT ( __TBB_load_relaxed(s.my_arena_slot->head) == __TBB_load_relaxed(s.my_arena_slot->tail),\n                       \"Worker cannot leave arena while its task pool is not empty\" );\n        __TBB_ASSERT( s.my_arena_slot->task_pool == EmptyTaskPool, \"Empty task pool is not marked appropriately\" );\n        // This check prevents relinquishing more than necessary workers because\n        // of the non-atomicity of the decision making procedure\n        if (num_workers_active() > my_num_workers_allotted)\n            break;\n    }\n#if __TBB_SCHEDULER_OBSERVER\n    my_observers.notify_exit_observers( s.my_last_local_observer, /*worker=*/true );\n    s.my_last_local_observer = NULL;\n#endif /* __TBB_SCHEDULER_OBSERVER */\n#if __TBB_TASK_PRIORITY\n    if ( s.my_offloaded_tasks )\n        orphan_offloaded_tasks( s );\n#endif /* __TBB_TASK_PRIORITY */\n#if __TBB_STATISTICS\n    ++s.my_counters.arena_roundtrips;\n    *my_slots[index].my_counters += s.my_counters;\n    s.my_counters.reset();\n#endif /* __TBB_STATISTICS */\n    __TBB_store_with_release( my_slots[index].my_scheduler, (generic_scheduler*)NULL );\n    s.my_arena_slot = 0; // detached from slot\n    s.my_inbox.detach();\n    __TBB_ASSERT( s.my_inbox.is_idle_state(true), NULL );\n    __TBB_ASSERT( !s.my_innermost_running_task, NULL );\n    __TBB_ASSERT( !s.my_dispatching_task, NULL );\n    __TBB_ASSERT( is_alive(my_guard), NULL );\nquit:\n    // In contrast to earlier versions of TBB (before 3.0 U5) now it is possible\n    // that arena may be temporarily left unpopulated by threads. See comments in\n    // arena::on_thread_leaving() for more details.\n#if !__TBB_TRACK_PRIORITY_LEVEL_SATURATION\n    on_thread_leaving</*is_master*/false>();\n#endif /* !__TBB_TRACK_PRIORITY_LEVEL_SATURATION */\n}\n\narena::arena ( market& m, unsigned max_num_workers ) {\n    __TBB_ASSERT( !my_guard, \"improperly allocated arena?\" );\n    __TBB_ASSERT( sizeof(my_slots[0]) % NFS_GetLineSize()==0, \"arena::slot size not multiple of cache line size\" );\n    __TBB_ASSERT( (uintptr_t)this % NFS_GetLineSize()==0, \"arena misaligned\" );\n#if __TBB_TASK_PRIORITY\n    __TBB_ASSERT( !my_reload_epoch && !my_orphaned_tasks && !my_skipped_fifo_priority, \"New arena object is not zeroed\" );\n#endif /* __TBB_TASK_PRIORITY */\n    my_market = &m;\n    my_limit = 1;\n    // Two slots are mandatory: for the master, and for 1 worker (required to support starvation resistant tasks).\n    my_num_slots = num_slots_to_reserve(max_num_workers);\n    my_max_num_workers = max_num_workers;\n    my_references = 1; // accounts for the master\n#if __TBB_TASK_PRIORITY\n    my_bottom_priority = my_top_priority = normalized_normal_priority;\n#endif /* __TBB_TASK_PRIORITY */\n    my_aba_epoch = m.my_arenas_aba_epoch;\n#if __TBB_SCHEDULER_OBSERVER\n    my_observers.my_arena = this;\n#endif /* __TBB_SCHEDULER_OBSERVER */\n    __TBB_ASSERT ( my_max_num_workers < my_num_slots, NULL );\n    // Construct slots. Mark internal synchronization elements for the tools.\n    for( unsigned i = 0; i < my_num_slots; ++i ) {\n        __TBB_ASSERT( !my_slots[i].my_scheduler && !my_slots[i].task_pool, NULL );\n        __TBB_ASSERT( !my_slots[i].task_pool_ptr, NULL );\n        __TBB_ASSERT( !my_slots[i].my_task_pool_size, NULL );\n        ITT_SYNC_CREATE(my_slots + i, SyncType_Scheduler, SyncObj_WorkerTaskPool);\n        mailbox(i+1).construct();\n        ITT_SYNC_CREATE(&mailbox(i+1), SyncType_Scheduler, SyncObj_Mailbox);\n        my_slots[i].hint_for_pop = i;\n#if __TBB_STATISTICS\n        my_slots[i].my_counters = new ( NFS_Allocate(1, sizeof(statistics_counters), NULL) ) statistics_counters;\n#endif /* __TBB_STATISTICS */\n    }\n#if __TBB_TASK_PRIORITY\n    for ( intptr_t i = 0; i < num_priority_levels; ++i ) {\n        my_task_stream[i].initialize(my_num_slots);\n        ITT_SYNC_CREATE(my_task_stream + i, SyncType_Scheduler, SyncObj_TaskStream);\n    }\n#else /* !__TBB_TASK_PRIORITY */\n    my_task_stream.initialize(my_num_slots);\n    ITT_SYNC_CREATE(&my_task_stream, SyncType_Scheduler, SyncObj_TaskStream);\n#endif /* !__TBB_TASK_PRIORITY */\n    my_mandatory_concurrency = false;\n#if __TBB_TASK_GROUP_CONTEXT\n    // Context to be used by root tasks by default (if the user has not specified one).\n    // The arena's context should not capture fp settings for the sake of backward compatibility.\n    my_default_ctx =\n            new ( NFS_Allocate(1, sizeof(task_group_context), NULL) ) task_group_context(task_group_context::isolated, task_group_context::default_traits);\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n#if __TBB_FP_CONTEXT\n    my_default_ctx->capture_fp_settings();\n#else\n    my_cpu_ctl_env.get_env();\n#endif\n}\n\narena& arena::allocate_arena( market& m, unsigned max_num_workers ) {\n    __TBB_ASSERT( sizeof(base_type) + sizeof(arena_slot) == sizeof(arena), \"All arena data fields must go to arena_base\" );\n    __TBB_ASSERT( sizeof(base_type) % NFS_GetLineSize() == 0, \"arena slots area misaligned: wrong padding\" );\n    __TBB_ASSERT( sizeof(mail_outbox) == NFS_MaxLineSize, \"Mailbox padding is wrong\" );\n    size_t n = allocation_size(max_num_workers);\n    unsigned char* storage = (unsigned char*)NFS_Allocate( 1, n, NULL );\n    // Zero all slots to indicate that they are empty\n    memset( storage, 0, n );\n    return *new( storage + num_slots_to_reserve(max_num_workers) * sizeof(mail_outbox) ) arena(m, max_num_workers);\n}\n\nvoid arena::free_arena () {\n    __TBB_ASSERT( is_alive(my_guard), NULL );\n    __TBB_ASSERT( !my_references, \"There are threads in the dying arena\" );\n    __TBB_ASSERT( !my_num_workers_requested && !my_num_workers_allotted, \"Dying arena requests workers\" );\n    __TBB_ASSERT( my_pool_state == SNAPSHOT_EMPTY || !my_max_num_workers, \"Inconsistent state of a dying arena\" );\n#if !__TBB_STATISTICS_EARLY_DUMP\n    GATHER_STATISTIC( dump_arena_statistics() );\n#endif\n    poison_value( my_guard );\n    intptr_t drained = 0;\n    for ( unsigned i = 0; i < my_num_slots; ++i ) {\n        __TBB_ASSERT( !my_slots[i].my_scheduler, \"arena slot is not empty\" );\n#if !__TBB_TASK_ARENA\n        __TBB_ASSERT( my_slots[i].task_pool == EmptyTaskPool, NULL );\n#else\n        //TODO: understand the assertion and modify\n#endif\n        __TBB_ASSERT( my_slots[i].head == my_slots[i].tail, NULL ); // TODO: replace by is_quiescent_local_task_pool_empty\n        my_slots[i].free_task_pool();\n#if __TBB_STATISTICS\n        NFS_Free( my_slots[i].my_counters );\n#endif /* __TBB_STATISTICS */\n        drained += mailbox(i+1).drain();\n    }\n#if __TBB_TASK_PRIORITY && TBB_USE_ASSERT\n    for ( intptr_t i = 0; i < num_priority_levels; ++i )\n        __TBB_ASSERT(my_task_stream[i].empty() && my_task_stream[i].drain()==0, \"Not all enqueued tasks were executed\");\n#elif !__TBB_TASK_PRIORITY\n    __TBB_ASSERT(my_task_stream.empty() && my_task_stream.drain()==0, \"Not all enqueued tasks were executed\");\n#endif /* !__TBB_TASK_PRIORITY */\n#if __TBB_COUNT_TASK_NODES\n    my_market->update_task_node_count( -drained );\n#endif /* __TBB_COUNT_TASK_NODES */\n    my_market->release();\n#if __TBB_TASK_GROUP_CONTEXT\n    __TBB_ASSERT( my_default_ctx, \"Master thread never entered the arena?\" );\n    my_default_ctx->~task_group_context();\n    NFS_Free(my_default_ctx);\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n#if __TBB_SCHEDULER_OBSERVER\n    if ( !my_observers.empty() )\n        my_observers.clear();\n#endif /* __TBB_SCHEDULER_OBSERVER */\n    void* storage  = &mailbox(my_num_slots);\n    __TBB_ASSERT( my_references == 0, NULL );\n    __TBB_ASSERT( my_pool_state == SNAPSHOT_EMPTY || !my_max_num_workers, NULL );\n    this->~arena();\n#if TBB_USE_ASSERT > 1\n    memset( storage, 0, allocation_size(my_max_num_workers) );\n#endif /* TBB_USE_ASSERT */\n    NFS_Free( storage );\n}\n\n#if __TBB_STATISTICS\nvoid arena::dump_arena_statistics () {\n    statistics_counters total;\n    for( unsigned i = 0; i < my_num_slots; ++i ) {\n#if __TBB_STATISTICS_EARLY_DUMP\n        generic_scheduler* s = my_slots[i].my_scheduler;\n        if ( s )\n            *my_slots[i].my_counters += s->my_counters;\n#else\n        __TBB_ASSERT( !my_slots[i].my_scheduler, NULL );\n#endif\n        if ( i != 0 ) {\n            total += *my_slots[i].my_counters;\n            dump_statistics( *my_slots[i].my_counters, i );\n        }\n    }\n    dump_statistics( *my_slots[0].my_counters, 0 );\n#if __TBB_STATISTICS_STDOUT\n#if !__TBB_STATISTICS_TOTALS_ONLY\n    printf( \"----------------------------------------------\\n\" );\n#endif\n    dump_statistics( total, workers_counters_total );\n    total += *my_slots[0].my_counters;\n    dump_statistics( total, arena_counters_total );\n#if !__TBB_STATISTICS_TOTALS_ONLY\n    printf( \"==============================================\\n\" );\n#endif\n#endif /* __TBB_STATISTICS_STDOUT */\n}\n#endif /* __TBB_STATISTICS */\n\n#if __TBB_TASK_PRIORITY\n// The method inspects a scheduler to determine:\n// 1. if it has tasks that can be retrieved and executed (via the return value);\n// 2. if it has any tasks at all, including those of lower priority (via tasks_present);\n// 3. if it is able to work with enqueued tasks (via dequeuing_possible).\ninline bool arena::may_have_tasks ( generic_scheduler* s, bool& tasks_present, bool& dequeuing_possible ) {\n    if ( !s\n#if __TBB_TASK_ARENA\n            || s->my_arena != this\n#endif\n            ) return false;\n    dequeuing_possible |= s->worker_outermost_level();\n    if ( s->my_pool_reshuffling_pending ) {\n        // This primary task pool is nonempty and may contain tasks at the current\n        // priority level. Its owner is winnowing lower priority tasks at the moment.\n        tasks_present = true;\n        return true;\n    }\n    if ( s->my_offloaded_tasks ) {\n        tasks_present = true;\n        if ( s->my_local_reload_epoch < *s->my_ref_reload_epoch ) {\n            // This scheduler's offload area is nonempty and may contain tasks at the\n            // current priority level.\n            return true;\n        }\n    }\n    return false;\n}\n\nvoid arena::orphan_offloaded_tasks(generic_scheduler& s) {\n    __TBB_ASSERT( s.my_offloaded_tasks, NULL );\n    GATHER_STATISTIC( ++s.my_counters.prio_orphanings );\n    ++my_abandonment_epoch;\n    __TBB_ASSERT( s.my_offloaded_task_list_tail_link && !*s.my_offloaded_task_list_tail_link, NULL );\n    task* orphans;\n    do {\n        orphans = const_cast<task*>(my_orphaned_tasks);\n        *s.my_offloaded_task_list_tail_link = orphans;\n    } while ( as_atomic(my_orphaned_tasks).compare_and_swap(s.my_offloaded_tasks, orphans) != orphans );\n    s.my_offloaded_tasks = NULL;\n#if TBB_USE_ASSERT\n    s.my_offloaded_task_list_tail_link = NULL;\n#endif /* TBB_USE_ASSERT */\n}\n#endif /* __TBB_TASK_PRIORITY */\n\nbool arena::is_out_of_work() {\n    // TODO: rework it to return at least a hint about where a task was found; better if the task itself.\n    for(;;) {\n        pool_state_t snapshot = my_pool_state;\n        switch( snapshot ) {\n            case SNAPSHOT_EMPTY:\n                return true;\n            case SNAPSHOT_FULL: {\n                // Use unique id for \"busy\" in order to avoid ABA problems.\n                const pool_state_t busy = pool_state_t(&busy);\n                // Request permission to take snapshot\n                if( my_pool_state.compare_and_swap( busy, SNAPSHOT_FULL )==SNAPSHOT_FULL ) {\n                    // Got permission. Take the snapshot.\n                    // NOTE: This is not a lock, as the state can be set to FULL at\n                    //       any moment by a thread that spawns/enqueues new task.\n                    size_t n = my_limit;\n                    // Make local copies of volatile parameters. Their change during\n                    // snapshot taking procedure invalidates the attempt, and returns\n                    // this thread into the dispatch loop.\n#if __TBB_TASK_PRIORITY\n                    intptr_t top_priority = my_top_priority;\n                    uintptr_t reload_epoch = my_reload_epoch;\n                    // Inspect primary task pools first\n#endif /* __TBB_TASK_PRIORITY */\n                    size_t k;\n                    for( k=0; k<n; ++k ) {\n                        if( my_slots[k].task_pool != EmptyTaskPool &&\n                            __TBB_load_relaxed(my_slots[k].head) < __TBB_load_relaxed(my_slots[k].tail) )\n                        {\n                            // k-th primary task pool is nonempty and does contain tasks.\n                            break;\n                        }\n                        if( my_pool_state!=busy )\n                            return false; // the work was published\n                    }\n                    __TBB_ASSERT( k <= n, NULL );\n                    bool work_absent = k == n;\n#if __TBB_TASK_PRIORITY\n                    // Variable tasks_present indicates presence of tasks at any priority\n                    // level, while work_absent refers only to the current priority.\n                    bool tasks_present = !work_absent || my_orphaned_tasks;\n                    bool dequeuing_possible = false;\n                    if ( work_absent ) {\n                        // Check for the possibility that recent priority changes\n                        // brought some tasks to the current priority level\n\n                        uintptr_t abandonment_epoch = my_abandonment_epoch;\n                        // Master thread's scheduler needs special handling as it\n                        // may be destroyed at any moment (workers' schedulers are\n                        // guaranteed to be alive while at least one thread is in arena).\n                        // Have to exclude concurrency with task group state change propagation too.\n                        // TODO: check whether it is still necessary since some pools belong to slots now\n                        my_market->my_arenas_list_mutex.lock();\n                        generic_scheduler *s = my_slots[0].my_scheduler;\n                        if ( s && as_atomic(my_slots[0].my_scheduler).compare_and_swap(LockedMaster, s) == s ) { //TODO: remove need to lock\n                            __TBB_ASSERT( my_slots[0].my_scheduler == LockedMaster && s != LockedMaster, NULL );\n                            work_absent = !may_have_tasks( s, tasks_present, dequeuing_possible );\n                            __TBB_store_with_release( my_slots[0].my_scheduler, s );\n                        }\n                        my_market->my_arenas_list_mutex.unlock();\n                        // The following loop is subject to data races. While k-th slot's\n                        // scheduler is being examined, corresponding worker can either\n                        // leave to RML or migrate to another arena.\n                        // But the races are not prevented because all of them are benign.\n                        // First, the code relies on the fact that worker thread's scheduler\n                        // object persists until the whole library is deinitialized.\n                        // Second, in the worst case the races can only cause another\n                        // round of stealing attempts to be undertaken. Introducing complex\n                        // synchronization into this coldest part of the scheduler's control\n                        // flow does not seem to make sense because it both is unlikely to\n                        // ever have any observable performance effect, and will require\n                        // additional synchronization code on the hotter paths.\n                        for( k = 1; work_absent && k < n; ++k ) {\n                            if( my_pool_state!=busy )\n                                return false; // the work was published\n                            work_absent = !may_have_tasks( my_slots[k].my_scheduler, tasks_present, dequeuing_possible );\n                        }\n                        // Preclude premature switching arena off because of a race in the previous loop.\n                        work_absent = work_absent\n                                      && !__TBB_load_with_acquire(my_orphaned_tasks)\n                                      && abandonment_epoch == my_abandonment_epoch;\n                    }\n#endif /* __TBB_TASK_PRIORITY */\n                    // Test and test-and-set.\n                    if( my_pool_state==busy ) {\n#if __TBB_TASK_PRIORITY\n                        bool no_fifo_tasks = my_task_stream[top_priority].empty();\n                        work_absent = work_absent && (!dequeuing_possible || no_fifo_tasks)\n                                      && top_priority == my_top_priority && reload_epoch == my_reload_epoch;\n#else\n                        bool no_fifo_tasks = my_task_stream.empty();\n                        work_absent = work_absent && no_fifo_tasks;\n#endif /* __TBB_TASK_PRIORITY */\n                        if( work_absent ) {\n#if __TBB_TASK_PRIORITY\n                            if ( top_priority > my_bottom_priority ) {\n                                if ( my_market->lower_arena_priority(*this, top_priority - 1, reload_epoch)\n                                     && !my_task_stream[top_priority].empty() )\n                                {\n                                    atomic_update( my_skipped_fifo_priority, top_priority, std::less<intptr_t>());\n                                }\n                            }\n                            else if ( !tasks_present && !my_orphaned_tasks && no_fifo_tasks ) {\n#endif /* __TBB_TASK_PRIORITY */\n                                // save current demand value before setting SNAPSHOT_EMPTY,\n                                // to avoid race with advertise_new_work.\n                                int current_demand = (int)my_max_num_workers;\n                                if( my_pool_state.compare_and_swap( SNAPSHOT_EMPTY, busy )==busy ) {\n                                    // This thread transitioned pool to empty state, and thus is\n                                    // responsible for telling RML that there is no other work to do.\n                                    my_market->adjust_demand( *this, -current_demand );\n#if __TBB_TASK_PRIORITY\n                                    // Check for the presence of enqueued tasks \"lost\" on some of\n                                    // priority levels because updating arena priority and switching\n                                    // arena into \"populated\" (FULL) state happen non-atomically.\n                                    // Imposing atomicity would require task::enqueue() to use a lock,\n                                    // which is unacceptable.\n                                    bool switch_back = false;\n                                    for ( int p = 0; p < num_priority_levels; ++p ) {\n                                        if ( !my_task_stream[p].empty() ) {\n                                            switch_back = true;\n                                            if ( p < my_bottom_priority || p > my_top_priority )\n                                                my_market->update_arena_priority(*this, p);\n                                        }\n                                    }\n                                    if ( switch_back )\n                                        advertise_new_work</*Spawned*/false>();\n#endif /* __TBB_TASK_PRIORITY */\n                                    return true;\n                                }\n                                return false;\n#if __TBB_TASK_PRIORITY\n                            }\n#endif /* __TBB_TASK_PRIORITY */\n                        }\n                        // Undo previous transition SNAPSHOT_FULL-->busy, unless another thread undid it.\n                        my_pool_state.compare_and_swap( SNAPSHOT_FULL, busy );\n                    }\n                }\n                return false;\n            }\n            default:\n                // Another thread is taking a snapshot.\n                return false;\n        }\n    }\n}\n\n#if __TBB_COUNT_TASK_NODES\nintptr_t arena::workers_task_node_count() {\n    intptr_t result = 0;\n    for( unsigned i = 1; i < my_num_slots; ++i ) {\n        generic_scheduler* s = my_slots[i].my_scheduler;\n        if( s )\n            result += s->my_task_node_count;\n    }\n    return result;\n}\n#endif /* __TBB_COUNT_TASK_NODES */\n\nvoid arena::enqueue_task( task& t, intptr_t prio, FastRandom &random )\n{\n#if __TBB_RECYCLE_TO_ENQUEUE\n    __TBB_ASSERT( t.state()==task::allocated || t.state()==task::to_enqueue, \"attempt to enqueue task with inappropriate state\" );\n#else\n    __TBB_ASSERT( t.state()==task::allocated, \"attempt to enqueue task that is not in 'allocated' state\" );\n#endif\n    t.prefix().state = task::ready;\n    t.prefix().extra_state |= es_task_enqueued; // enqueued task marker\n\n#if TBB_USE_ASSERT\n    if( task* parent = t.parent() ) {\n        internal::reference_count ref_count = parent->prefix().ref_count;\n        __TBB_ASSERT( ref_count!=0, \"attempt to enqueue task whose parent has a ref_count==0 (forgot to set_ref_count?)\" );\n        __TBB_ASSERT( ref_count>0, \"attempt to enqueue task whose parent has a ref_count<0\" );\n        parent->prefix().extra_state |= es_ref_count_active;\n    }\n    __TBB_ASSERT(t.prefix().affinity==affinity_id(0), \"affinity is ignored for enqueued tasks\");\n#endif /* TBB_USE_ASSERT */\n\n#if __TBB_TASK_PRIORITY\n    intptr_t p = prio ? normalize_priority(priority_t(prio)) : normalized_normal_priority;\n    assert_priority_valid(p);\n    task_stream &ts = my_task_stream[p];\n#else /* !__TBB_TASK_PRIORITY */\n    __TBB_ASSERT_EX(prio == 0, \"the library is not configured to respect the task priority\");\n    task_stream &ts = my_task_stream;\n#endif /* !__TBB_TASK_PRIORITY */\n    ITT_NOTIFY(sync_releasing, &ts);\n    ts.push( &t, random );\n#if __TBB_TASK_PRIORITY\n    if ( p != my_top_priority )\n        my_market->update_arena_priority( *this, p );\n#endif /* __TBB_TASK_PRIORITY */\n    advertise_new_work< /*Spawned=*/ false >();\n#if __TBB_TASK_PRIORITY\n    if ( p != my_top_priority )\n        my_market->update_arena_priority( *this, p );\n#endif /* __TBB_TASK_PRIORITY */\n}\n\n#if __TBB_TASK_ARENA\nstruct nested_arena_context : no_copy {\n    generic_scheduler &my_scheduler;\n    scheduler_state const my_orig_state;\n    void *my_orig_ptr;\n    bool my_adjusting;\n    nested_arena_context(generic_scheduler *s, arena* a, bool needs_adjusting, bool as_worker = false)\n        : my_scheduler(*s), my_orig_state(*s), my_orig_ptr(NULL), my_adjusting(needs_adjusting) {\n        s->nested_arena_entry(a, *this, as_worker);\n    }\n    ~nested_arena_context() {\n        my_scheduler.nested_arena_exit(*this);\n        (scheduler_state&)my_scheduler = my_orig_state; // restore arena settings\n    }\n};\n\nvoid generic_scheduler::nested_arena_entry(arena* a, nested_arena_context& c, bool as_worker) {\n    if( a == my_arena ) {\n#if __TBB_TASK_GROUP_CONTEXT\n        c.my_orig_ptr = my_innermost_running_task =\n                new(&allocate_task(sizeof(empty_task), NULL, a->my_default_ctx)) empty_task;\n#endif\n        return;\n    }\n    __TBB_ASSERT( is_alive(a->my_guard), NULL );\n    // overwrite arena settings\n#if __TBB_TASK_PRIORITY\n    if ( my_offloaded_tasks )\n        my_arena->orphan_offloaded_tasks( *this );\n    my_ref_top_priority = &a->my_top_priority;\n    my_ref_reload_epoch = &a->my_reload_epoch;\n    my_local_reload_epoch = a->my_reload_epoch;\n#endif /* __TBB_TASK_PRIORITY */\n    my_arena = a;\n    my_arena_index = 0;\n    my_arena_slot = my_arena->my_slots + my_arena_index;\n    my_inbox.detach(); // TODO: mailboxes were not designed for switching, add copy constructor?\n    attach_mailbox( affinity_id(my_arena_index+1) );\n    my_innermost_running_task = my_dispatching_task = as_worker? NULL : my_dummy_task;\n#if __TBB_TASK_GROUP_CONTEXT\n    // save dummy's context and replace it by arena's context\n    c.my_orig_ptr = my_dummy_task->prefix().context;\n    my_dummy_task->prefix().context = a->my_default_ctx;\n#endif\n#if __TBB_ARENA_OBSERVER\n    my_last_local_observer = 0; // TODO: try optimize number of calls\n    my_arena->my_observers.notify_entry_observers( my_last_local_observer, /*worker=*/false );\n#endif\n    // TODO? ITT_NOTIFY(sync_acquired, a->my_slots + index);\n    // TODO: it requires market to have P workers (not P-1)\n    // TODO: it still allows temporary oversubscription by 1 worker (due to my_max_num_workers)\n    // TODO: a preempted worker should be excluded from assignment to other arenas e.g. my_slack--\n    if( c.my_adjusting ) my_arena->my_market->adjust_demand(*my_arena, -1);\n}\n\nvoid generic_scheduler::nested_arena_exit(nested_arena_context& c) {\n    if( my_arena == c.my_orig_state.my_arena ) {\n#if __TBB_TASK_GROUP_CONTEXT\n        free_task<small_local_task>(*(task*)c.my_orig_ptr); // TODO: use scoped_task instead?\n#endif\n        return;\n    }\n    if( c.my_adjusting ) my_arena->my_market->adjust_demand(*my_arena, 1);\n#if __TBB_ARENA_OBSERVER\n    my_arena->my_observers.notify_exit_observers( my_last_local_observer, /*worker=*/false );\n#endif /* __TBB_SCHEDULER_OBSERVER */\n\n#if __TBB_TASK_PRIORITY\n    if ( my_offloaded_tasks )\n        my_arena->orphan_offloaded_tasks( *this );\n    my_local_reload_epoch = *c.my_orig_state.my_ref_reload_epoch;\n    while ( as_atomic(my_arena->my_slots[0].my_scheduler).compare_and_swap( NULL, this) != this )\n        __TBB_Yield(); // TODO: task priority can use master slot for locking while accessing the scheduler\n#else\n    // Free the master slot. TODO: support multiple masters\n    __TBB_store_with_release(my_arena->my_slots[0].my_scheduler, (generic_scheduler*)NULL);\n#endif\n    my_arena->my_exit_monitors.notify_all_relaxed(); // TODO: fix concurrent monitor to use notify_one (test MultipleMastersPart4 fails)\n#if __TBB_TASK_GROUP_CONTEXT\n    // restore context of dummy task\n    my_dummy_task->prefix().context = (task_group_context*)c.my_orig_ptr;\n#endif\n}\n\nvoid generic_scheduler::wait_until_empty() {\n    my_dummy_task->prefix().ref_count++; // prevents exit from local_wait_for_all when local work is done enforcing the stealing\n    while( my_arena->my_pool_state != arena::SNAPSHOT_EMPTY )\n        local_wait_for_all(*my_dummy_task, NULL);\n    my_dummy_task->prefix().ref_count--;\n}\n\n#endif /* __TBB_TASK_ARENA */\n\n} // namespace internal\n} // namespace tbb\n\n#if __TBB_TASK_ARENA\n#include \"scheduler_utility.h\"\n\nnamespace tbb {\nnamespace interface7 {\nnamespace internal {\n\nvoid task_arena_base::internal_initialize( ) {\n    __TBB_ASSERT( my_master_slots <= 1, \"Number of slots reserved for master can be only [0,1]\");\n    if( my_master_slots > 1 ) my_master_slots = 1; // TODO: make more masters\n    if( my_max_concurrency < 1 )\n        my_max_concurrency = (int)governor::default_num_threads();\n    // TODO: reimplement in an efficient way. We need a scheduler instance in this thread\n    // but the scheduler is only required for task allocation and fifo random seeds until\n    // master wants to join the arena. (Idea - to create a restricted specialization)\n    // It is excessive to create an implicit arena for master here anyway. But scheduler\n    // instance implies master thread to be always connected with arena.\n    // browse recursively into init_scheduler and arena::process for details\n    if( !governor::local_scheduler_if_initialized() )\n        governor::init_scheduler( (unsigned)my_max_concurrency - my_master_slots + 1/*TODO: address in market instead*/, 0, true );\n    // TODO: we will need to introduce a mechanism for global settings, including stack size, used by all arenas\n    arena* new_arena = &market::create_arena( my_max_concurrency - my_master_slots/*it's +1 slot for num_masters=0*/, ThreadStackSize );\n    if(as_atomic(my_arena).compare_and_swap(new_arena, NULL) != NULL) { // there is a race possible on my_initialized\n        __TBB_ASSERT(my_arena, NULL);                             // other thread was the first\n        new_arena->on_thread_leaving</*is_master*/true>(); // deallocate new arena\n    }\n#if __TBB_TASK_GROUP_CONTEXT\n    else {\n        my_context = new_arena->my_default_ctx;\n        my_context->my_version_and_traits |= my_version_and_traits & exact_exception_flag;\n    }\n#endif\n}\n\nvoid task_arena_base::internal_terminate( ) {\n    if( my_arena ) {// task_arena was initialized\n#if __TBB_STATISTICS_EARLY_DUMP\n        GATHER_STATISTIC( my_arena->dump_arena_statistics() );\n#endif\n        my_arena->on_thread_leaving</*is_master*/true>();\n        my_arena = 0;\n#if __TBB_TASK_GROUP_CONTEXT\n        my_context = 0;\n#endif\n    }\n}\n\nvoid task_arena_base::internal_enqueue( task& t, intptr_t prio ) const {\n    __TBB_ASSERT(my_arena, NULL);\n    generic_scheduler* s = governor::local_scheduler_if_initialized();\n    __TBB_ASSERT(s, \"Scheduler is not initialized\"); // we allocated a task so can expect the scheduler\n#if __TBB_TASK_GROUP_CONTEXT\n    __TBB_ASSERT(my_arena->my_default_ctx == t.prefix().context, NULL);\n    __TBB_ASSERT(!my_arena->my_default_ctx->is_group_execution_cancelled(), // TODO: any better idea?\n                 \"The task will not be executed because default task_group_context of task_arena is cancelled. Has previously enqueued task thrown an exception?\");\n#endif\n    my_arena->enqueue_task( t, prio, s->my_random );\n}\n\nclass delegated_task : public task {\n    internal::delegate_base & my_delegate;\n    concurrent_monitor & my_monitor;\n    task * my_root;\n    /*override*/ task* execute() {\n        generic_scheduler& s = *(generic_scheduler*)prefix().owner;\n        __TBB_ASSERT(s.worker_outermost_level() || s.master_outermost_level(), \"expected to be enqueued and received on the outermost level\");\n        // but this task can mimics outermost level, detect it\n        if( s.master_outermost_level() && s.my_dummy_task->state() == task::executing ) {\n#if TBB_USE_EXCEPTIONS\n            // RTTI is available, check whether the cast is valid\n            __TBB_ASSERT(dynamic_cast<delegated_task*>(s.my_dummy_task), 0);\n#endif\n            set_ref_count(1); // required by the semantics of recycle_to_enqueue()\n            recycle_to_enqueue();\n            return NULL;\n        }\n        struct outermost_context : internal::no_copy {\n            delegated_task * t;\n            generic_scheduler & s;\n            task * orig_dummy;\n            task_group_context * orig_ctx;\n            outermost_context(delegated_task *_t, generic_scheduler &_s) : t(_t), s(_s) {\n                orig_dummy = s.my_dummy_task;\n#if __TBB_TASK_GROUP_CONTEXT\n                orig_ctx = t->prefix().context;\n                t->prefix().context = s.my_arena->my_default_ctx;\n#endif\n                s.my_dummy_task = t; // mimics outermost master\n                __TBB_ASSERT(s.my_innermost_running_task == t, NULL);\n            }\n            ~outermost_context() {\n                s.my_dummy_task = orig_dummy;\n#if TBB_USE_EXCEPTIONS\n                // restore context for sake of registering potential exception\n                t->prefix().context = orig_ctx;\n#endif\n            }\n        } scope(this, s);\n        my_delegate();\n        return NULL;\n    }\n    ~delegated_task() {\n        // potential exception was already registered. It must happen before the notification\n        __TBB_ASSERT(my_root->ref_count()==2, NULL);\n        __TBB_store_with_release(my_root->prefix().ref_count, 1); // must precede the wakeup\n        my_monitor.notify_relaxed(*this);\n    }\npublic:\n    delegated_task( internal::delegate_base & d, concurrent_monitor & s, task * t )\n        : my_delegate(d), my_monitor(s), my_root(t) {}\n    // predicate for concurrent_monitor notification\n    bool operator()(uintptr_t ctx) const { return (void*)ctx == (void*)&my_delegate; }\n};\n\nvoid task_arena_base::internal_execute( internal::delegate_base& d) const {\n    __TBB_ASSERT(my_arena, NULL);\n    generic_scheduler* s = governor::local_scheduler();\n    __TBB_ASSERT(s, \"Scheduler is not initialized\");\n    // TODO: is it safe to assign slot to a scheduler which is not yet switched?\n    // TODO TEMP: one master, make more masters\n    if( s->my_arena == my_arena || (!__TBB_load_with_acquire(my_arena->my_slots[0].my_scheduler)\n            && as_atomic(my_arena->my_slots[0].my_scheduler).compare_and_swap(s, NULL ) == NULL) ) {\n        cpu_ctl_env_helper cpu_ctl_helper;\n        cpu_ctl_helper.set_env( __TBB_CONTEXT_ARG1(my_context) );\n#if TBB_USE_EXCEPTIONS\n        try {\n#endif\n        //TODO: replace dummy tasks for workers as well to avoid using of the_dummy_context\n        nested_arena_context scope(s, my_arena, !my_master_slots);\n        d();\n#if TBB_USE_EXCEPTIONS\n        } catch(...) {\n            cpu_ctl_helper.restore_default(); // TODO: is it needed on Windows?\n            if( my_version_and_traits & exact_exception_flag ) throw;\n            else {\n                task_group_context exception_container( task_group_context::isolated,\n                    task_group_context::default_traits & ~task_group_context::exact_exception );\n                exception_container.register_pending_exception();\n                __TBB_ASSERT(exception_container.my_exception, NULL);\n                exception_container.my_exception->throw_self();\n            }\n        }\n#endif\n    } else {\n        concurrent_monitor::thread_context waiter;\n#if __TBB_TASK_GROUP_CONTEXT\n        task_group_context exec_context( task_group_context::isolated, my_version_and_traits & exact_exception_flag );\n#if __TBB_FP_CONTEXT\n        exec_context.copy_fp_settings( *my_context );\n#endif\n#endif\n        auto_empty_task root(__TBB_CONTEXT_ARG(s, &exec_context));\n        root.prefix().ref_count = 2;\n        my_arena->enqueue_task( *new( task::allocate_root(__TBB_CONTEXT_ARG1(exec_context)) )\n                                delegated_task(d, my_arena->my_exit_monitors, &root),\n                                0, s->my_random ); // TODO: priority?\n        do {\n            my_arena->my_exit_monitors.prepare_wait(waiter, (uintptr_t)&d);\n            if( __TBB_load_with_acquire(root.prefix().ref_count) < 2 ) {\n                my_arena->my_exit_monitors.cancel_wait(waiter);\n                break;\n            }\n            else if( !__TBB_load_with_acquire(my_arena->my_slots[0].my_scheduler) // TODO: refactor into a function?\n                    && as_atomic(my_arena->my_slots[0].my_scheduler).compare_and_swap(s, NULL ) == NULL ) {\n                my_arena->my_exit_monitors.cancel_wait(waiter);\n                nested_arena_context scope(s, my_arena, !my_master_slots);\n                s->local_wait_for_all(root, NULL);\n#if TBB_USE_EXCEPTIONS\n                __TBB_ASSERT( !exec_context.my_exception, NULL ); // exception can be thrown above, not deferred\n#endif\n                __TBB_ASSERT( root.prefix().ref_count == 0, NULL );\n                break;\n            } else {\n                my_arena->my_exit_monitors.commit_wait(waiter);\n            }\n        } while( __TBB_load_with_acquire(root.prefix().ref_count) == 2 );\n#if TBB_USE_EXCEPTIONS\n        // process possible exception\n        if( task_group_context::exception_container_type *pe = exec_context.my_exception )\n            pe->throw_self();\n#endif\n    }\n}\n\n// this wait task is a temporary approach to wait for arena emptiness for masters without slots\n// TODO: it will be rather reworked for one source of notification from is_out_of_work\nclass wait_task : public task {\n    binary_semaphore & my_signal;\n    /*override*/ task* execute() {\n        generic_scheduler* s = governor::local_scheduler_if_initialized();\n        __TBB_ASSERT( s, NULL );\n        if( s->my_arena_index && s->worker_outermost_level() ) {// on outermost level of workers only\n            s->local_wait_for_all( *s->my_dummy_task, NULL ); // run remaining tasks\n        } else s->my_arena->is_out_of_work(); // avoids starvation of internal_wait: issuing this task makes arena full\n        my_signal.V();\n        return NULL;\n    }\npublic:\n    wait_task ( binary_semaphore & sema ) : my_signal(sema) {}\n};\n\nvoid task_arena_base::internal_wait() const {\n    __TBB_ASSERT(my_arena, NULL);\n    generic_scheduler* s = governor::local_scheduler();\n    __TBB_ASSERT(s, \"Scheduler is not initialized\");\n    __TBB_ASSERT(s->my_arena != my_arena || s->my_arena_index == 0, \"task_arena::wait_until_empty() is not supported within a worker context\" );\n    if( s->my_arena == my_arena ) {\n        //unsupported, but try do something for outermost master\n        __TBB_ASSERT(s->master_outermost_level(), \"unsupported\");\n        if( !s->my_arena_index )\n            while( my_arena->num_workers_active() )\n                s->wait_until_empty();\n    } else for(;;) {\n        while( my_arena->my_pool_state != arena::SNAPSHOT_EMPTY ) {\n            if( !__TBB_load_with_acquire(my_arena->my_slots[0].my_scheduler) // TODO TEMP: one master, make more masters\n                && as_atomic(my_arena->my_slots[0].my_scheduler).compare_and_swap(s, NULL) == NULL ) {\n                nested_arena_context a(s, my_arena, !my_master_slots, true);\n                s->wait_until_empty();\n            } else {\n                binary_semaphore waiter; // TODO: replace by a single event notification from is_out_of_work\n                internal_enqueue( *new( task::allocate_root(__TBB_CONTEXT_ARG1(*my_context)) ) wait_task(waiter), 0 ); // TODO: priority?\n                waiter.P(); // TODO: concurrent_monitor\n            }\n        }\n        if( !my_arena->num_workers_active() && !my_arena->my_slots[0].my_scheduler) // no activity\n            break; // spin until workers active but avoid spinning in a worker\n        __TBB_Yield(); // wait until workers and master leave\n    }\n}\n\n/*static*/ int task_arena_base::internal_current_slot() {\n    generic_scheduler* s = governor::local_scheduler_if_initialized();\n    return s? int(s->my_arena_index) : -1;\n}\n\n\n} // tbb::interfaceX::internal\n} // tbb::interfaceX\n} // tbb\n#endif /* __TBB_TASK_ARENA */\n"
  },
  {
    "path": "benchmarks/tbb/arena.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef _TBB_arena_H\n#define _TBB_arena_H\n\n#include \"tbb/tbb_stddef.h\"\n#include \"tbb/atomic.h\"\n\n#include \"tbb/tbb_machine.h\"\n\n#include \"scheduler_common.h\"\n#include \"intrusive_list.h\"\n#include \"task_stream.h\"\n#include \"../rml/include/rml_tbb.h\"\n#include \"mailbox.h\"\n#include \"observer_proxy.h\"\n#include \"market.h\"\n#include \"governor.h\"\n#if __TBB_TASK_ARENA\n#include \"concurrent_monitor.h\"\n#endif\n\nnamespace tbb {\n\nclass task_group_context;\nclass allocate_root_with_context_proxy;\n\nnamespace internal {\n\n//! arena data except the array of slots\n/** Separated in order to simplify padding. \n    Intrusive list node base class is used by market to form a list of arenas. **/\nstruct arena_base : padded<intrusive_list_node> {\n    //! Number of workers that have been marked out by the resource manager to service the arena\n    unsigned my_num_workers_allotted;   // heavy use in stealing loop\n\n    //! References of the arena\n    /** Counts workers and master references separately. Bit 0 indicates reference from implicit\n        master or explicit task_arena; the next bits contain number of workers servicing the arena.*/\n    atomic<unsigned> my_references;     // heavy use in stealing loop\n\n#if __TBB_TASK_PRIORITY\n    //! Highest priority of recently spawned or enqueued tasks.\n    volatile intptr_t my_top_priority;  // heavy use in stealing loop\n\n    //! Maximal currently busy slot.\n    atomic<unsigned> my_limit;          // heavy use in stealing loop\n\n    //! Task pool for the tasks scheduled via task::enqueue() method\n    /** Such scheduling guarantees eventual execution even if\n        - new tasks are constantly coming (by extracting scheduled tasks in\n          relaxed FIFO order);\n        - the enqueuing thread does not call any of wait_for_all methods. **/\n    task_stream my_task_stream[num_priority_levels]; // heavy use in stealing loop\n#else /* !__TBB_TASK_PRIORITY */\n    //! Task pool for the tasks scheduled via task::enqueue() method\n    /** Such scheduling guarantees eventual execution even if\n        - new tasks are constantly coming (by extracting scheduled tasks in\n          relaxed FIFO order);\n        - the enqueuing thread does not call any of wait_for_all methods. **/\n    task_stream my_task_stream;         // heavy use in stealing loop\n\n    //! Maximal currently busy slot.\n    atomic<unsigned> my_limit;          // heavy use in stealing loop\n#endif /* !__TBB_TASK_PRIORITY */\n\n    //! Number of workers that are currently requested from the resource manager\n    int my_num_workers_requested;\n\n    //! Number of slots in the arena\n    unsigned my_num_slots;\n\n    //! Number of workers requested by the master thread owning the arena\n    unsigned my_max_num_workers;\n\n    //! Market owning this arena\n    market* my_market;\n\n    //! ABA prevention marker\n    uintptr_t my_aba_epoch;\n\n#if !__TBB_FP_CONTEXT\n    //! FPU control settings of arena's master thread captured at the moment of arena instantiation.\n    __TBB_cpu_ctl_env_t my_cpu_ctl_env;\n#endif\n\n#if __TBB_TRACK_PRIORITY_LEVEL_SATURATION\n    int my_num_workers_present;\n#endif /* __TBB_TRACK_PRIORITY_LEVEL_SATURATION */\n\n    //! Current task pool state and estimate of available tasks amount.\n    /** The estimate is either 0 (SNAPSHOT_EMPTY) or infinity (SNAPSHOT_FULL). \n        Special state is \"busy\" (any other unsigned value). \n        Note that the implementation of arena::is_busy_or_empty() requires \n        my_pool_state to be unsigned. */\n    tbb::atomic<uintptr_t> my_pool_state;\n\n#if __TBB_TASK_GROUP_CONTEXT\n    //! Default task group context.\n    /** Used by root tasks allocated directly by the master thread (not from inside\n        a TBB task) without explicit context specification. **/\n    task_group_context* my_default_ctx;\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n#if __TBB_SCHEDULER_OBSERVER\n    //! List of local observers attached to this arena.\n    observer_list my_observers;\n#endif /* __TBB_SCHEDULER_OBSERVER */\n\n#if __TBB_TASK_PRIORITY\n    //! Lowest normalized priority of available spawned or enqueued tasks.\n    intptr_t my_bottom_priority;\n\n    //! Tracks events that may bring tasks in offload areas to the top priority level.\n    /** Incremented when arena top priority changes or a task group priority\n        is elevated to the current arena's top level. **/\n    uintptr_t my_reload_epoch;\n\n    //! List of offloaded tasks abandoned by workers revoked by the market\n    task* my_orphaned_tasks;\n\n    //! Counter used to track the occurrence of recent orphaning and re-sharing operations.\n    tbb::atomic<uintptr_t> my_abandonment_epoch;\n\n    //! Highest priority level containing enqueued tasks\n    /** It being greater than 0 means that high priority enqueued tasks had to be\n        bypassed because all workers were blocked in nested dispatch loops and\n        were unable to progress at then current priority level. **/\n    tbb::atomic<intptr_t> my_skipped_fifo_priority;\n#endif /* !__TBB_TASK_PRIORITY */\n\n    //! Indicates if there is an oversubscribing worker created to service enqueued tasks.\n    bool my_mandatory_concurrency;\n\n#if __TBB_TASK_ARENA\n    //! exit notifications after arena slot is released\n    concurrent_monitor my_exit_monitors;\n#endif\n\n#if TBB_USE_ASSERT\n    //! Used to trap accesses to the object after its destruction.\n    uintptr_t my_guard;\n#endif /* TBB_USE_ASSERT */\n}; // struct arena_base\n\nclass arena\n#if (__GNUC__<4 || __GNUC__==4 && __GNUC_MINOR__==0) && !__INTEL_COMPILER\n    : public padded<arena_base>\n#else\n    : private padded<arena_base>\n#endif\n{\nprivate:\n    friend class generic_scheduler;\n    template<typename SchedulerTraits> friend class custom_scheduler;\n    friend class governor;\n    friend class task_scheduler_observer_v3;\n    friend class market;\n    friend class tbb::task;\n    friend class tbb::task_group_context;\n    friend class allocate_root_with_context_proxy;\n    friend class intrusive_list<arena>;\n    friend class interface7::internal::task_arena_base; // declared in scheduler_common.h\n    friend class interface7::internal::delegated_task;\n    friend class interface7::internal::wait_task;\n\n    typedef padded<arena_base> base_type;\n\n    //! Constructor\n    arena ( market&, unsigned max_num_workers );\n\n    //! Allocate an instance of arena.\n    static arena& allocate_arena( market&, unsigned max_num_workers );\n\n    static int unsigned num_slots_to_reserve ( unsigned max_num_workers ) {\n        return max(2u, max_num_workers + 1);\n    }\n\n    static int allocation_size ( unsigned max_num_workers ) {\n        return sizeof(base_type) + num_slots_to_reserve(max_num_workers) * (sizeof(mail_outbox) + sizeof(arena_slot));\n    }\n\n#if __TBB_TASK_GROUP_CONTEXT\n    //! Finds all contexts affected by the state change and propagates the new state to them.\n    /** The propagation is relayed to the market because tasks created by one \n        master thread can be passed to and executed by other masters. This means \n        that context trees can span several arenas at once and thus state change\n        propagation cannot be generally localized to one arena only. **/\n    template <typename T>\n    bool propagate_task_group_state ( T task_group_context::*mptr_state, task_group_context& src, T new_state );\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n    //! Get reference to mailbox corresponding to given affinity_id.\n    mail_outbox& mailbox( affinity_id id ) {\n        __TBB_ASSERT( 0<id, \"affinity id must be positive integer\" );\n        __TBB_ASSERT( id <= my_num_slots, \"affinity id out of bounds\" );\n\n        return ((mail_outbox*)this)[-(int)id];\n    }\n\n    //! Completes arena shutdown, destructs and deallocates it.\n    void free_arena ();\n\n    typedef uintptr_t pool_state_t;\n\n    //! No tasks to steal since last snapshot was taken\n    static const pool_state_t SNAPSHOT_EMPTY = 0;\n\n    //! At least one task has been offered for stealing since the last snapshot started\n    static const pool_state_t SNAPSHOT_FULL = pool_state_t(-1);\n\n    //! No tasks to steal or snapshot is being taken.\n    static bool is_busy_or_empty( pool_state_t s ) { return s < SNAPSHOT_FULL; }\n\n    //! The number of workers active in the arena.\n    unsigned num_workers_active( ) {\n        return my_references >> 1;\n    }\n\n    //! If necessary, raise a flag that there is new job in arena.\n    template<bool Spawned> void advertise_new_work();\n\n    //! Check if there is job anywhere in arena.\n    /** Return true if no job or if arena is being cleaned up. */\n    bool is_out_of_work();\n\n    //! enqueue a task into starvation-resistance queue\n    void enqueue_task( task&, intptr_t, FastRandom & );\n\n    //! Registers the worker with the arena and enters TBB scheduler dispatch loop\n    void process( generic_scheduler& );\n\n    //! Notification that worker or master leaves its arena\n    template<bool is_master>\n    inline void on_thread_leaving ( );\n\n#if __TBB_STATISTICS\n    //! Outputs internal statistics accumulated by the arena\n    void dump_arena_statistics ();\n#endif /* __TBB_STATISTICS */\n\n#if __TBB_TASK_PRIORITY\n    //! Check if recent priority changes may bring some tasks to the current priority level soon\n    /** /param tasks_present indicates presence of tasks at any priority level. **/\n    inline bool may_have_tasks ( generic_scheduler*, bool& tasks_present, bool& dequeuing_possible );\n\n    //! Puts offloaded tasks into global list of orphaned tasks\n    void orphan_offloaded_tasks ( generic_scheduler& s );\n#endif /* __TBB_TASK_PRIORITY */\n\n#if __TBB_COUNT_TASK_NODES\n    //! Returns the number of task objects \"living\" in worker threads\n    intptr_t workers_task_node_count();\n#endif\n\n    /** Must be the last data field */\n    arena_slot my_slots[1];\n}; // class arena\n\n\ntemplate<bool is_master>\ninline void arena::on_thread_leaving ( ) {\n    //\n    // Implementation of arena destruction synchronization logic contained various\n    // bugs/flaws at the different stages of its evolution, so below is a detailed\n    // description of the issues taken into consideration in the framework of the\n    // current design.\n    //\n    // In case of using fire-and-forget tasks (scheduled via task::enqueue())\n    // master thread is allowed to leave its arena before all its work is executed,\n    // and market may temporarily revoke all workers from this arena. Since revoked\n    // workers never attempt to reset arena state to EMPTY and cancel its request\n    // to RML for threads, the arena object is destroyed only when both the last\n    // thread is leaving it and arena's state is EMPTY (that is its master thread\n    // left and it does not contain any work).\n    //\n    // A worker that checks for work presence and transitions arena to the EMPTY\n    // state (in snapshot taking procedure arena::is_out_of_work()) updates\n    // arena::my_pool_state first and only then arena::my_num_workers_requested.\n    // So the check for work absence must be done against the latter field.\n    //\n    // In a time window between decrementing the active threads count and checking\n    // if there is an outstanding request for workers. New worker thread may arrive,\n    // finish remaining work, set arena state to empty, and leave decrementing its\n    // refcount and destroying. Then the current thread will destroy the arena\n    // the second time. To preclude it a local copy of the outstanding request\n    // value can be stored before decrementing active threads count.\n    //\n    // But this technique may cause two other problem. When the stored request is\n    // zero, it is possible that arena still has threads and they can generate new\n    // tasks and thus re-establish non-zero requests. Then all the threads can be\n    // revoked (as described above) leaving this thread the last one, and causing\n    // it to destroy non-empty arena.\n    //\n    // The other problem takes place when the stored request is non-zero. Another\n    // thread may complete the work, set arena state to empty, and leave without\n    // arena destruction before this thread decrements the refcount. This thread\n    // cannot destroy the arena either. Thus the arena may be \"orphaned\".\n    //\n    // In both cases we cannot dereference arena pointer after the refcount is\n    // decremented, as our arena may already be destroyed.\n    //\n    // If this is the master thread, market can be concurrently destroyed.\n    // In case of workers market's liveness is ensured by the RML connection\n    // rundown protocol, according to which the client (i.e. the market) lives\n    // until RML server notifies it about connection termination, and this\n    // notification is fired only after all workers return into RML.\n    //\n    // Thus if we decremented refcount to zero we ask the market to check arena\n    // state (including the fact if it is alive) under the lock.\n    //\n    uintptr_t aba_epoch = my_aba_epoch;\n    market* m = my_market;\n    __TBB_ASSERT(my_references > int(!is_master), \"broken arena reference counter\");\n    if ( (my_references -= is_master? 1:2 ) == 0 ) // worker's counter starts from bit 1\n        market::try_destroy_arena( m, this, aba_epoch, is_master );\n}\n\ntemplate<bool Spawned> void arena::advertise_new_work() {\n    if( !Spawned ) { // i.e. the work was enqueued\n        if( my_max_num_workers==0 ) {\n            my_max_num_workers = 1;\n            __TBB_ASSERT(!my_mandatory_concurrency, \"\");\n            my_mandatory_concurrency = true;\n            __TBB_ASSERT(!num_workers_active(), \"\");\n            my_pool_state = SNAPSHOT_FULL;\n            my_market->adjust_demand( *this, 1 );\n            return;\n        }\n        // Local memory fence is required to avoid missed wakeups; see the comment below.\n        // Starvation resistant tasks require mandatory concurrency, so missed wakeups are unacceptable.\n        atomic_fence(); \n    }\n    // Double-check idiom that, in case of spawning, is deliberately sloppy about memory fences.\n    // Technically, to avoid missed wakeups, there should be a full memory fence between the point we \n    // released the task pool (i.e. spawned task) and read the arena's state.  However, adding such a \n    // fence might hurt overall performance more than it helps, because the fence would be executed \n    // on every task pool release, even when stealing does not occur.  Since TBB allows parallelism, \n    // but never promises parallelism, the missed wakeup is not a correctness problem.\n    pool_state_t snapshot = my_pool_state;\n    if( is_busy_or_empty(snapshot) ) {\n        // Attempt to mark as full.  The compare_and_swap below is a little unusual because the \n        // result is compared to a value that can be different than the comparand argument.\n        if( my_pool_state.compare_and_swap( SNAPSHOT_FULL, snapshot )==SNAPSHOT_EMPTY ) {\n            if( snapshot!=SNAPSHOT_EMPTY ) {\n                // This thread read \"busy\" into snapshot, and then another thread transitioned \n                // my_pool_state to \"empty\" in the meantime, which caused the compare_and_swap above \n                // to fail.  Attempt to transition my_pool_state from \"empty\" to \"full\".\n                if( my_pool_state.compare_and_swap( SNAPSHOT_FULL, SNAPSHOT_EMPTY )!=SNAPSHOT_EMPTY ) {\n                    // Some other thread transitioned my_pool_state from \"empty\", and hence became\n                    // responsible for waking up workers.\n                    return;\n                }\n            }\n            // This thread transitioned pool from empty to full state, and thus is responsible for\n            // telling RML that there is work to do.\n            if( Spawned ) {\n                if( my_mandatory_concurrency ) {\n                    __TBB_ASSERT(my_max_num_workers==1, \"\");\n                    __TBB_ASSERT(!governor::local_scheduler()->is_worker(), \"\");\n                    // There was deliberate oversubscription on 1 core for sake of starvation-resistant tasks.\n                    // Now a single active thread (must be the master) supposedly starts a new parallel region\n                    // with relaxed sequential semantics, and oversubscription should be avoided.\n                    // Demand for workers has been decreased to 0 during SNAPSHOT_EMPTY, so just keep it.\n                    my_max_num_workers = 0;\n                    my_mandatory_concurrency = false;\n                    return;\n                }\n            }\n            my_market->adjust_demand( *this, my_max_num_workers );\n        }\n    }\n}\n\n} // namespace internal\n} // namespace tbb\n\n#endif /* _TBB_arena_H */\n"
  },
  {
    "path": "benchmarks/tbb/atomic.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_atomic_H\n#define __TBB_atomic_H\n\n#include <cstddef>\n\n#if _MSC_VER\n#define __TBB_LONG_LONG __int64\n#else\n#define __TBB_LONG_LONG long long\n#endif /* _MSC_VER */\n\n#include \"tbb_machine.h\"\n\n#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)\n    // Workaround for overzealous compiler warnings\n    #pragma warning (push)\n    #pragma warning (disable: 4244 4267 4512)\n#endif\n\nnamespace tbb {\n\n//! Specifies memory semantics.\nenum memory_semantics {\n    //! Sequential consistency\n    full_fence,\n    //! Acquire\n    acquire,\n    //! Release\n    release,\n    //! No ordering\n    relaxed\n};\n\n//! @cond INTERNAL\nnamespace internal {\n\n#if __TBB_ATTRIBUTE_ALIGNED_PRESENT\n    #define __TBB_DECL_ATOMIC_FIELD(t,f,a) t f  __attribute__ ((aligned(a)));\n#elif __TBB_DECLSPEC_ALIGN_PRESENT\n    #define __TBB_DECL_ATOMIC_FIELD(t,f,a) __declspec(align(a)) t f;\n#else\n    #error Do not know syntax for forcing alignment.\n#endif\n\ntemplate<size_t S>\nstruct atomic_rep;           // Primary template declared, but never defined.\n\ntemplate<>\nstruct atomic_rep<1> {       // Specialization\n    typedef int8_t word;\n};\ntemplate<>\nstruct atomic_rep<2> {       // Specialization\n    typedef int16_t word;\n};\ntemplate<>\nstruct atomic_rep<4> {       // Specialization\n#if _MSC_VER && !_WIN64\n    // Work-around that avoids spurious /Wp64 warnings\n    typedef intptr_t word;\n#else\n    typedef int32_t word;\n#endif\n};\n#if __TBB_64BIT_ATOMICS\ntemplate<>\nstruct atomic_rep<8> {       // Specialization\n    typedef int64_t word;\n};\n#endif\n\ntemplate<typename value_type, size_t size>\nstruct aligned_storage;\n\n//the specializations are needed to please MSVC syntax of __declspec(align()) which accept _literal_ constants only\n#if __TBB_ATOMIC_CTORS\n    #define ATOMIC_STORAGE_PARTIAL_SPECIALIZATION(S)                  \\\n    template<typename value_type>                                     \\\n    struct aligned_storage<value_type,S> {                            \\\n        __TBB_DECL_ATOMIC_FIELD(value_type,my_value,S)                \\\n        aligned_storage() = default ;                                 \\\n        constexpr aligned_storage(value_type value):my_value(value){} \\\n    };                                                                \\\n\n#else\n    #define ATOMIC_STORAGE_PARTIAL_SPECIALIZATION(S)                  \\\n    template<typename value_type>                                     \\\n    struct aligned_storage<value_type,S> {                            \\\n        __TBB_DECL_ATOMIC_FIELD(value_type,my_value,S)                \\\n    };                                                                \\\n\n#endif\n\ntemplate<typename value_type>\nstruct aligned_storage<value_type,1> {\n    value_type my_value;\n#if __TBB_ATOMIC_CTORS\n    aligned_storage() = default ;\n    constexpr aligned_storage(value_type value):my_value(value){}\n#endif\n};\n\nATOMIC_STORAGE_PARTIAL_SPECIALIZATION(2)\nATOMIC_STORAGE_PARTIAL_SPECIALIZATION(4)\n#if __TBB_64BIT_ATOMICS\nATOMIC_STORAGE_PARTIAL_SPECIALIZATION(8)\n#endif\n\ntemplate<size_t Size, memory_semantics M>\nstruct atomic_traits;        // Primary template declared, but not defined.\n\n#define __TBB_DECL_FENCED_ATOMIC_PRIMITIVES(S,M)                                                         \\\n    template<> struct atomic_traits<S,M> {                                                               \\\n        typedef atomic_rep<S>::word word;                                                                \\\n        inline static word compare_and_swap( volatile void* location, word new_value, word comparand ) { \\\n            return __TBB_machine_cmpswp##S##M(location,new_value,comparand);                             \\\n        }                                                                                                \\\n        inline static word fetch_and_add( volatile void* location, word addend ) {                       \\\n            return __TBB_machine_fetchadd##S##M(location,addend);                                        \\\n        }                                                                                                \\\n        inline static word fetch_and_store( volatile void* location, word value ) {                      \\\n            return __TBB_machine_fetchstore##S##M(location,value);                                       \\\n        }                                                                                                \\\n    };\n\n#define __TBB_DECL_ATOMIC_PRIMITIVES(S)                                                                  \\\n    template<memory_semantics M>                                                                         \\\n    struct atomic_traits<S,M> {                                                                          \\\n        typedef atomic_rep<S>::word word;                                                                \\\n        inline static word compare_and_swap( volatile void* location, word new_value, word comparand ) { \\\n            return __TBB_machine_cmpswp##S(location,new_value,comparand);                                \\\n        }                                                                                                \\\n        inline static word fetch_and_add( volatile void* location, word addend ) {                       \\\n            return __TBB_machine_fetchadd##S(location,addend);                                           \\\n        }                                                                                                \\\n        inline static word fetch_and_store( volatile void* location, word value ) {                      \\\n            return __TBB_machine_fetchstore##S(location,value);                                          \\\n        }                                                                                                \\\n    };\n\ntemplate<memory_semantics M>\nstruct atomic_load_store_traits;    // Primary template declaration\n\n#define __TBB_DECL_ATOMIC_LOAD_STORE_PRIMITIVES(M)                      \\\n    template<> struct atomic_load_store_traits<M> {                     \\\n        template <typename T>                                           \\\n        inline static T load( const volatile T& location ) {            \\\n            return __TBB_load_##M( location );                          \\\n        }                                                               \\\n        template <typename T>                                           \\\n        inline static void store( volatile T& location, T value ) {     \\\n            __TBB_store_##M( location, value );                         \\\n        }                                                               \\\n    }\n\n#if __TBB_USE_FENCED_ATOMICS\n__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,full_fence)\n__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,full_fence)\n__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,full_fence)\n__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,acquire)\n__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,acquire)\n__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,acquire)\n__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,release)\n__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,release)\n__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,release)\n__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(1,relaxed)\n__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(2,relaxed)\n__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(4,relaxed)\n#if __TBB_64BIT_ATOMICS\n__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,full_fence)\n__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,acquire)\n__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,release)\n__TBB_DECL_FENCED_ATOMIC_PRIMITIVES(8,relaxed)\n#endif\n#else /* !__TBB_USE_FENCED_ATOMICS */\n__TBB_DECL_ATOMIC_PRIMITIVES(1)\n__TBB_DECL_ATOMIC_PRIMITIVES(2)\n__TBB_DECL_ATOMIC_PRIMITIVES(4)\n#if __TBB_64BIT_ATOMICS\n__TBB_DECL_ATOMIC_PRIMITIVES(8)\n#endif\n#endif /* !__TBB_USE_FENCED_ATOMICS */\n\n__TBB_DECL_ATOMIC_LOAD_STORE_PRIMITIVES(full_fence);\n__TBB_DECL_ATOMIC_LOAD_STORE_PRIMITIVES(acquire);\n__TBB_DECL_ATOMIC_LOAD_STORE_PRIMITIVES(release);\n__TBB_DECL_ATOMIC_LOAD_STORE_PRIMITIVES(relaxed);\n\n//! Additive inverse of 1 for type T.\n/** Various compilers issue various warnings if -1 is used with various integer types.\n    The baroque expression below avoids all the warnings (we hope). */\n#define __TBB_MINUS_ONE(T) (T(T(0)-T(1)))\n\n//! Base class that provides basic functionality for atomic<T> without fetch_and_add.\n/** Works for any type T that has the same size as an integral type, has a trivial constructor/destructor,\n    and can be copied/compared by memcpy/memcmp. */\ntemplate<typename T>\nstruct atomic_impl {\nprotected:\n    aligned_storage<T,sizeof(T)> my_storage;\nprivate:\n    //TODO: rechecks on recent versions of gcc if union is still the _only_ way to do a conversion without warnings\n    //! Union type used to convert type T to underlying integral type.\n    template<typename value_type>\n    union converter {\n        typedef typename atomic_rep<sizeof(value_type)>::word bits_type;\n        converter(){}\n        converter(value_type a_value) : value(a_value) {}\n        value_type value;\n        bits_type bits;\n    };\n\n    template<typename value_t>\n    static typename converter<value_t>::bits_type to_bits(value_t value){\n        return converter<value_t>(value).bits;\n    }\n    template<typename value_t>\n    static value_t to_value(typename converter<value_t>::bits_type bits){\n        converter<value_t> u;\n        u.bits = bits;\n        return u.value;\n    }\n\n    template<typename value_t>\n    union ptr_converter;            //Primary template declared, but never defined.\n\n    template<typename value_t>\n    union ptr_converter<value_t *> {\n        ptr_converter(){}\n        ptr_converter(value_t* a_value) : value(a_value) {}\n        value_t* value;\n        uintptr_t bits;\n    };\n    //TODO: check if making to_bits accepting reference (thus unifying it with to_bits_ref)\n    //does not hurt performance\n    template<typename value_t>\n    static typename converter<value_t>::bits_type & to_bits_ref(value_t& value){\n        //TODO: this #ifdef is temporary workaround, as union conversion seems to fail\n        //on suncc for 64 bit types for 32 bit target\n        #if !__SUNPRO_CC\n            return *(typename converter<value_t>::bits_type*)ptr_converter<value_t*>(&value).bits;\n        #else\n            return *(typename converter<value_t>::bits_type*)(&value);\n        #endif\n    }\n\n\npublic:\n    typedef T value_type;\n\n#if __TBB_ATOMIC_CTORS\n    atomic_impl() = default ;\n    constexpr atomic_impl(value_type value):my_storage(value){}\n#endif\n    template<memory_semantics M>\n    value_type fetch_and_store( value_type value ) {\n          return to_value<value_type>(\n                  internal::atomic_traits<sizeof(value_type),M>::fetch_and_store( &my_storage.my_value, to_bits(value) )\n          );\n    }\n\n    value_type fetch_and_store( value_type value ) {\n        return fetch_and_store<full_fence>(value);\n    }\n\n    template<memory_semantics M>\n    value_type compare_and_swap( value_type value, value_type comparand ) {\n        return to_value<value_type>(\n                internal::atomic_traits<sizeof(value_type),M>::compare_and_swap( &my_storage.my_value, to_bits(value), to_bits(comparand) )\n        );\n    }\n\n    value_type compare_and_swap( value_type value, value_type comparand ) {\n        return compare_and_swap<full_fence>(value,comparand);\n    }\n\n    operator value_type() const volatile {                // volatile qualifier here for backwards compatibility\n        return  to_value<value_type>(\n                __TBB_load_with_acquire( to_bits_ref(my_storage.my_value) )\n        );\n    }\n\n    template<memory_semantics M>\n    value_type load () const {\n        return to_value<value_type>(\n                internal::atomic_load_store_traits<M>::load( to_bits_ref(my_storage.my_value) )\n        );\n    }\n\n    value_type load () const {\n        return load<acquire>();\n    }\n\n    template<memory_semantics M>\n    void store ( value_type value ) {\n        internal::atomic_load_store_traits<M>::store( to_bits_ref(my_storage.my_value), to_bits(value));\n    }\n\n    void store ( value_type value ) {\n        store<release>( value );\n    }\n\nprotected:\n    value_type store_with_release( value_type rhs ) {\n       //TODO: unify with store<release>\n        __TBB_store_with_release( to_bits_ref(my_storage.my_value), to_bits(rhs) );\n        return rhs;\n    }\n};\n\n//! Base class that provides basic functionality for atomic<T> with fetch_and_add.\n/** I is the underlying type.\n    D is the difference type.\n    StepType should be char if I is an integral type, and T if I is a T*. */\ntemplate<typename I, typename D, typename StepType>\nstruct atomic_impl_with_arithmetic: atomic_impl<I> {\npublic:\n    typedef I value_type;\n#if    __TBB_ATOMIC_CTORS\n    atomic_impl_with_arithmetic() = default ;\n    constexpr atomic_impl_with_arithmetic(value_type value): atomic_impl<I>(value){}\n#endif\n    template<memory_semantics M>\n    value_type fetch_and_add( D addend ) {\n        return value_type(internal::atomic_traits<sizeof(value_type),M>::fetch_and_add( &this->my_storage.my_value, addend*sizeof(StepType) ));\n    }\n\n    value_type fetch_and_add( D addend ) {\n        return fetch_and_add<full_fence>(addend);\n    }\n\n    template<memory_semantics M>\n    value_type fetch_and_increment() {\n        return fetch_and_add<M>(1);\n    }\n\n    value_type fetch_and_increment() {\n        return fetch_and_add(1);\n    }\n\n    template<memory_semantics M>\n    value_type fetch_and_decrement() {\n        return fetch_and_add<M>(__TBB_MINUS_ONE(D));\n    }\n\n    value_type fetch_and_decrement() {\n        return fetch_and_add(__TBB_MINUS_ONE(D));\n    }\n\npublic:\n    value_type operator+=( D value ) {\n        return fetch_and_add(value)+value;\n    }\n\n    value_type operator-=( D value ) {\n        // Additive inverse of value computed using binary minus,\n        // instead of unary minus, for sake of avoiding compiler warnings.\n        return operator+=(D(0)-value);\n    }\n\n    value_type operator++() {\n        return fetch_and_add(1)+1;\n    }\n\n    value_type operator--() {\n        return fetch_and_add(__TBB_MINUS_ONE(D))-1;\n    }\n\n    value_type operator++(int) {\n        return fetch_and_add(1);\n    }\n\n    value_type operator--(int) {\n        return fetch_and_add(__TBB_MINUS_ONE(D));\n    }\n};\n\n} /* Internal */\n//! @endcond\n\n//! Primary template for atomic.\n/** See the Reference for details.\n    @ingroup synchronization */\ntemplate<typename T>\nstruct atomic: internal::atomic_impl<T> {\n#if __TBB_ATOMIC_CTORS\n    atomic() = default;\n    constexpr atomic(T arg): internal::atomic_impl<T>(arg) {}\n#endif\n    T operator=( T rhs ) {\n        // \"this\" required here in strict ISO C++ because store_with_release is a dependent name\n        return this->store_with_release(rhs);\n    }\n    atomic<T>& operator=( const atomic<T>& rhs ) {this->store_with_release(rhs); return *this;}\n};\n\n#if __TBB_ATOMIC_CTORS\n    #define __TBB_DECL_ATOMIC(T)                                                                    \\\n        template<> struct atomic<T>: internal::atomic_impl_with_arithmetic<T,T,char> {              \\\n            atomic() = default;                                                                     \\\n            constexpr atomic(T arg): internal::atomic_impl_with_arithmetic<T,T,char>(arg) {}        \\\n                                                                                                    \\\n            T operator=( T rhs ) {return store_with_release(rhs);}                                  \\\n            atomic<T>& operator=( const atomic<T>& rhs ) {store_with_release(rhs); return *this;}   \\\n        };\n#else\n    #define __TBB_DECL_ATOMIC(T)                                                                    \\\n        template<> struct atomic<T>: internal::atomic_impl_with_arithmetic<T,T,char> {              \\\n            T operator=( T rhs ) {return store_with_release(rhs);}                                  \\\n            atomic<T>& operator=( const atomic<T>& rhs ) {store_with_release(rhs); return *this;}   \\\n        };\n#endif\n\n#if __TBB_64BIT_ATOMICS\n//TODO: consider adding non-default (and atomic) copy constructor for 32bit platform\n__TBB_DECL_ATOMIC(__TBB_LONG_LONG)\n__TBB_DECL_ATOMIC(unsigned __TBB_LONG_LONG)\n#else\n// test_atomic will verify that sizeof(long long)==8\n#endif\n__TBB_DECL_ATOMIC(long)\n__TBB_DECL_ATOMIC(unsigned long)\n\n#if _MSC_VER && !_WIN64\n#if __TBB_ATOMIC_CTORS\n/* Special version of __TBB_DECL_ATOMIC that avoids gratuitous warnings from cl /Wp64 option.\n   It is identical to __TBB_DECL_ATOMIC(unsigned) except that it replaces operator=(T)\n   with an operator=(U) that explicitly converts the U to a T.  Types T and U should be\n   type synonyms on the platform.  Type U should be the wider variant of T from the\n   perspective of /Wp64. */\n#define __TBB_DECL_ATOMIC_ALT(T,U) \\\n    template<> struct atomic<T>: internal::atomic_impl_with_arithmetic<T,T,char> {             \\\n        atomic() = default ;                                                                   \\\n        constexpr atomic(T arg): internal::atomic_impl_with_arithmetic<T,T,char>(arg) {}       \\\n        T operator=( U rhs ) {return store_with_release(T(rhs));}                              \\\n        atomic<T>& operator=( const atomic<T>& rhs ) {store_with_release(rhs); return *this;}  \\\n    };\n#else\n#define __TBB_DECL_ATOMIC_ALT(T,U) \\\n    template<> struct atomic<T>: internal::atomic_impl_with_arithmetic<T,T,char> {             \\\n        T operator=( U rhs ) {return store_with_release(T(rhs));}                              \\\n        atomic<T>& operator=( const atomic<T>& rhs ) {store_with_release(rhs); return *this;}  \\\n    };\n#endif\n__TBB_DECL_ATOMIC_ALT(unsigned,size_t)\n__TBB_DECL_ATOMIC_ALT(int,ptrdiff_t)\n#else\n__TBB_DECL_ATOMIC(unsigned)\n__TBB_DECL_ATOMIC(int)\n#endif /* _MSC_VER && !_WIN64 */\n\n__TBB_DECL_ATOMIC(unsigned short)\n__TBB_DECL_ATOMIC(short)\n__TBB_DECL_ATOMIC(char)\n__TBB_DECL_ATOMIC(signed char)\n__TBB_DECL_ATOMIC(unsigned char)\n\n#if !_MSC_VER || defined(_NATIVE_WCHAR_T_DEFINED)\n__TBB_DECL_ATOMIC(wchar_t)\n#endif /* _MSC_VER||!defined(_NATIVE_WCHAR_T_DEFINED) */\n\n//! Specialization for atomic<T*> with arithmetic and operator->.\ntemplate<typename T> struct atomic<T*>: internal::atomic_impl_with_arithmetic<T*,ptrdiff_t,T> {\n#if __TBB_ATOMIC_CTORS\n    atomic() = default ;\n    constexpr atomic(T* arg): internal::atomic_impl_with_arithmetic<T*,ptrdiff_t,T>(arg) {}\n#endif\n    T* operator=( T* rhs ) {\n        // \"this\" required here in strict ISO C++ because store_with_release is a dependent name\n        return this->store_with_release(rhs);\n    }\n    atomic<T*>& operator=( const atomic<T*>& rhs ) {\n        this->store_with_release(rhs); return *this;\n    }\n    T* operator->() const {\n        return (*this);\n    }\n};\n\n//! Specialization for atomic<void*>, for sake of not allowing arithmetic or operator->.\ntemplate<> struct atomic<void*>: internal::atomic_impl<void*> {\n#if __TBB_ATOMIC_CTORS\n    atomic() = default ;\n    constexpr atomic(void* arg): internal::atomic_impl<void*>(arg) {}\n#endif\n    void* operator=( void* rhs ) {\n        // \"this\" required here in strict ISO C++ because store_with_release is a dependent name\n        return this->store_with_release(rhs);\n    }\n    atomic<void*>& operator=( const atomic<void*>& rhs ) {\n        this->store_with_release(rhs); return *this;\n    }\n};\n\n// Helpers to workaround ugly syntax of calling template member function of a\n// template class with template argument dependent on template parameters.\n\ntemplate <memory_semantics M, typename T>\nT load ( const atomic<T>& a ) { return a.template load<M>(); }\n\ntemplate <memory_semantics M, typename T>\nvoid store ( atomic<T>& a, T value ) { a.template store<M>(value); }\n\nnamespace interface6{\n//! Make an atomic for use in an initialization (list), as an alternative to zero-initialization or normal assignment.\ntemplate<typename T>\natomic<T> make_atomic(T t) {\n    atomic<T> a;\n    store<relaxed>(a,t);\n    return a;\n}\n}\nusing interface6::make_atomic;\n\nnamespace internal {\ntemplate<memory_semantics M, typename T >\nvoid swap(atomic<T> & lhs, atomic<T> & rhs){\n    T tmp = load<M>(lhs);\n    store<M>(lhs,load<M>(rhs));\n    store<M>(rhs,tmp);\n}\n\n// only to aid in the gradual conversion of ordinary variables to proper atomics\ntemplate<typename T>\ninline atomic<T>& as_atomic( T& t ) {\n    return (atomic<T>&)t;\n}\n} // namespace tbb::internal\n\n} // namespace tbb\n\n#if _MSC_VER && !__INTEL_COMPILER\n    #pragma warning (pop)\n#endif // warnings 4244, 4267 are back\n\n#endif /* __TBB_atomic_H */\n"
  },
  {
    "path": "benchmarks/tbb/blocked_range.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_blocked_range_H\n#define __TBB_blocked_range_H\n\n#include \"tbb_stddef.h\"\n\nnamespace tbb {\n\n/** \\page range_req Requirements on range concept\n    Class \\c R implementing the concept of range must define:\n    - \\code R::R( const R& ); \\endcode               Copy constructor\n    - \\code R::~R(); \\endcode                        Destructor\n    - \\code bool R::is_divisible() const; \\endcode   True if range can be partitioned into two subranges\n    - \\code bool R::empty() const; \\endcode          True if range is empty\n    - \\code R::R( R& r, split ); \\endcode            Split range \\c r into two subranges.\n**/\n\n//! A range over which to iterate.\n/** @ingroup algorithms */\ntemplate<typename Value>\nclass blocked_range {\npublic:\n    //! Type of a value\n    /** Called a const_iterator for sake of algorithms that need to treat a blocked_range\n        as an STL container. */\n    typedef Value const_iterator;\n\n    //! Type for size of a range\n    typedef std::size_t size_type;\n\n    //! Construct range with default-constructed values for begin and end.\n    /** Requires that Value have a default constructor. */\n    blocked_range() : my_end(), my_begin() {}\n\n    //! Construct range over half-open interval [begin,end), with the given grainsize.\n    blocked_range( Value begin_, Value end_, size_type grainsize_=1 ) :\n        my_end(end_), my_begin(begin_), my_grainsize(grainsize_)\n    {\n        __TBB_ASSERT( my_grainsize>0, \"grainsize must be positive\" );\n    }\n\n    //! Beginning of range.\n    const_iterator begin() const {return my_begin;}\n\n    //! One past last value in range.\n    const_iterator end() const {return my_end;}\n\n    //! Size of the range\n    /** Unspecified if end()<begin(). */\n    size_type size() const {\n        __TBB_ASSERT( !(end()<begin()), \"size() unspecified if end()<begin()\" );\n        return size_type(my_end-my_begin);\n    }\n\n    //! The grain size for this range.\n    size_type grainsize() const {return my_grainsize;}\n\n    //------------------------------------------------------------------------\n    // Methods that implement Range concept\n    //------------------------------------------------------------------------\n\n    //! True if range is empty.\n    bool empty() const {return !(my_begin<my_end);}\n\n    //! True if range is divisible.\n    /** Unspecified if end()<begin(). */\n    bool is_divisible() const {return my_grainsize<size();}\n\n    //! Split range.\n    /** The new Range *this has the second part, the old range r has the first part.\n        Unspecified if end()<begin() or !is_divisible(). */\n    blocked_range( blocked_range& r, split ) :\n        my_end(r.my_end),\n        my_begin(do_split(r, split())),\n        my_grainsize(r.my_grainsize)\n    {\n        // only comparison 'less than' is required from values of blocked_range objects\n        __TBB_ASSERT( !(my_begin < r.my_end) && !(r.my_end < my_begin), \"blocked_range has been split incorrectly\" );\n    }\n\n#if __TBB_USE_PROPORTIONAL_SPLIT_IN_BLOCKED_RANGES\n    //! Static field to support proportional split\n    static const bool is_divisible_in_proportion = true;\n\n    //! Split range.\n    /** The new Range *this has the second part split according to specified proportion, the old range r has the first part.\n        Unspecified if end()<begin() or !is_divisible(). */\n    blocked_range( blocked_range& r, proportional_split& proportion ) :\n        my_end(r.my_end),\n        my_begin(do_split(r, proportion)),\n        my_grainsize(r.my_grainsize)\n    {\n        // only comparison 'less than' is required from values of blocked_range objects\n        __TBB_ASSERT( !(my_begin < r.my_end) && !(r.my_end < my_begin), \"blocked_range has been split incorrectly\" );\n    }\n#endif /* __TBB_USE_PROPORTIONAL_SPLIT_IN_BLOCKED_RANGES */\n\nprivate:\n    /** NOTE: my_end MUST be declared before my_begin, otherwise the forking constructor will break. */\n    Value my_end;\n    Value my_begin;\n    size_type my_grainsize;\n\n    //! Auxiliary function used by forking constructor.\n    /** Using this function lets us not require that Value support assignment or default construction. */\n    static Value do_split( blocked_range& r, split )\n    {\n        __TBB_ASSERT( r.is_divisible(), \"cannot split blocked_range that is not divisible\" );\n        Value middle = r.my_begin + (r.my_end - r.my_begin) / 2u;\n        r.my_end = middle;\n        return middle;\n    }\n\n#if __TBB_USE_PROPORTIONAL_SPLIT_IN_BLOCKED_RANGES\n    static Value do_split( blocked_range& r, proportional_split& proportion )\n    {\n        __TBB_ASSERT( r.is_divisible(), \"cannot split blocked_range that is not divisible\" );\n\n        // usage of 32-bit floating point arithmetic is not enough to handle ranges of\n        // more than 2^24 iterations accurately. However, even on ranges with 2^64\n        // iterations the computational error approximately equals to 0.000001% which\n        // makes small impact on uniform distribution of such range's iterations (assuming\n        // all iterations take equal time to complete). See 'test_partitioner_whitebox'\n        // for implementation of an exact split algorithm\n        size_type right_part = size_type(float(r.size()) * float(proportion.right())\n                                         / float(proportion.left() + proportion.right()) + 0.5f);\n        return r.my_end = Value(r.my_end - right_part);\n    }\n#endif /* __TBB_USE_PROPORTIONAL_SPLIT_IN_BLOCKED_RANGES */\n\n    template<typename RowValue, typename ColValue>\n    friend class blocked_range2d;\n\n    template<typename RowValue, typename ColValue, typename PageValue>\n    friend class blocked_range3d;\n};\n\n} // namespace tbb\n\n#endif /* __TBB_blocked_range_H */\n"
  },
  {
    "path": "benchmarks/tbb/blocked_range2d.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_blocked_range2d_H\n#define __TBB_blocked_range2d_H\n\n#include \"tbb_stddef.h\"\n#include \"blocked_range.h\"\n\nnamespace tbb {\n\n//! A 2-dimensional range that models the Range concept.\n/** @ingroup algorithms */\ntemplate<typename RowValue, typename ColValue=RowValue>\nclass blocked_range2d {\npublic:\n    //! Type for size of an iteration range\n    typedef blocked_range<RowValue> row_range_type;\n    typedef blocked_range<ColValue> col_range_type;\n\nprivate:\n    row_range_type my_rows;\n    col_range_type my_cols;\n\npublic:\n\n    blocked_range2d( RowValue row_begin, RowValue row_end, typename row_range_type::size_type row_grainsize,\n                     ColValue col_begin, ColValue col_end, typename col_range_type::size_type col_grainsize ) :\n        my_rows(row_begin,row_end,row_grainsize),\n        my_cols(col_begin,col_end,col_grainsize)\n    {\n    }\n\n    blocked_range2d( RowValue row_begin, RowValue row_end,\n                     ColValue col_begin, ColValue col_end ) :\n        my_rows(row_begin,row_end),\n        my_cols(col_begin,col_end)\n    {\n    }\n\n    //! True if range is empty\n    bool empty() const {\n        // Yes, it is a logical OR here, not AND.\n        return my_rows.empty() || my_cols.empty();\n    }\n\n    //! True if range is divisible into two pieces.\n    bool is_divisible() const {\n        return my_rows.is_divisible() || my_cols.is_divisible();\n    }\n\n    blocked_range2d( blocked_range2d& r, split ) :\n        my_rows(r.my_rows),\n        my_cols(r.my_cols)\n    {\n        split split_obj;\n        do_split(r, split_obj);\n    }\n\n#if __TBB_USE_PROPORTIONAL_SPLIT_IN_BLOCKED_RANGES\n    //! Static field to support proportional split\n    static const bool is_divisible_in_proportion = true;\n\n    blocked_range2d( blocked_range2d& r, proportional_split& proportion ) :\n        my_rows(r.my_rows),\n        my_cols(r.my_cols)\n    {\n        do_split(r, proportion);\n    }\n#endif /* __TBB_USE_PROPORTIONAL_SPLIT_IN_BLOCKED_RANGES */\n\n    template <typename Split>\n    void do_split( blocked_range2d& r, Split& split_obj )\n    {\n        if( my_rows.size()*double(my_cols.grainsize()) < my_cols.size()*double(my_rows.grainsize()) ) {\n            my_cols.my_begin = col_range_type::do_split(r.my_cols, split_obj);\n        } else {\n            my_rows.my_begin = row_range_type::do_split(r.my_rows, split_obj);\n        }\n    }\n\n    //! The rows of the iteration space\n    const row_range_type& rows() const {return my_rows;}\n\n    //! The columns of the iteration space\n    const col_range_type& cols() const {return my_cols;}\n};\n\n} // namespace tbb\n\n#endif /* __TBB_blocked_range2d_H */\n"
  },
  {
    "path": "benchmarks/tbb/blocked_range3d.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_blocked_range3d_H\n#define __TBB_blocked_range3d_H\n\n#include \"tbb_stddef.h\"\n#include \"blocked_range.h\"\n\nnamespace tbb {\n\n//! A 3-dimensional range that models the Range concept.\n/** @ingroup algorithms */\ntemplate<typename PageValue, typename RowValue=PageValue, typename ColValue=RowValue>\nclass blocked_range3d {\npublic:\n    //! Type for size of an iteration range\n    typedef blocked_range<PageValue> page_range_type;\n    typedef blocked_range<RowValue>  row_range_type;\n    typedef blocked_range<ColValue>  col_range_type;\n\nprivate:\n    page_range_type my_pages;\n    row_range_type  my_rows;\n    col_range_type  my_cols;\n\npublic:\n\n    blocked_range3d( PageValue page_begin, PageValue page_end,\n                     RowValue  row_begin,  RowValue row_end,\n                     ColValue  col_begin,  ColValue col_end ) :\n        my_pages(page_begin,page_end),\n        my_rows(row_begin,row_end),\n        my_cols(col_begin,col_end)\n    {\n    }\n\n    blocked_range3d( PageValue page_begin, PageValue page_end, typename page_range_type::size_type page_grainsize,\n                     RowValue  row_begin,  RowValue row_end,   typename row_range_type::size_type row_grainsize,\n                     ColValue  col_begin,  ColValue col_end,   typename col_range_type::size_type col_grainsize ) :\n        my_pages(page_begin,page_end,page_grainsize),\n        my_rows(row_begin,row_end,row_grainsize),\n        my_cols(col_begin,col_end,col_grainsize)\n    {\n    }\n\n    //! True if range is empty\n    bool empty() const {\n        // Yes, it is a logical OR here, not AND.\n        return my_pages.empty() || my_rows.empty() || my_cols.empty();\n    }\n\n    //! True if range is divisible into two pieces.\n    bool is_divisible() const {\n        return  my_pages.is_divisible() || my_rows.is_divisible() || my_cols.is_divisible();\n    }\n\n    blocked_range3d( blocked_range3d& r, split ) :\n        my_pages(r.my_pages),\n        my_rows(r.my_rows),\n        my_cols(r.my_cols)\n    {\n        split split_obj;\n        do_split(r, split_obj);\n    }\n\n#if __TBB_USE_PROPORTIONAL_SPLIT_IN_BLOCKED_RANGES\n    //! Static field to support proportional split\n    static const bool is_divisible_in_proportion = true;\n\n    blocked_range3d( blocked_range3d& r, proportional_split& proportion ) :\n        my_pages(r.my_pages),\n        my_rows(r.my_rows),\n        my_cols(r.my_cols)\n    {\n        do_split(r, proportion);\n    }\n#endif /* __TBB_USE_PROPORTIONAL_SPLIT_IN_BLOCKED_RANGES */\n\n    template <typename Split>\n    void do_split( blocked_range3d& r, Split& split_obj)\n    {\n        if ( my_pages.size()*double(my_rows.grainsize()) < my_rows.size()*double(my_pages.grainsize()) ) {\n            if ( my_rows.size()*double(my_cols.grainsize()) < my_cols.size()*double(my_rows.grainsize()) ) {\n                my_cols.my_begin = col_range_type::do_split(r.my_cols, split_obj);\n            } else {\n                my_rows.my_begin = row_range_type::do_split(r.my_rows, split_obj);\n            }\n\t} else {\n            if ( my_pages.size()*double(my_cols.grainsize()) < my_cols.size()*double(my_pages.grainsize()) ) {\n                my_cols.my_begin = col_range_type::do_split(r.my_cols, split_obj);\n            } else {\n                my_pages.my_begin = page_range_type::do_split(r.my_pages, split_obj);\n            }\n        }\n    }\n\n    //! The pages of the iteration space\n    const page_range_type& pages() const {return my_pages;}\n\n    //! The rows of the iteration space\n    const row_range_type& rows() const {return my_rows;}\n\n    //! The columns of the iteration space\n    const col_range_type& cols() const {return my_cols;}\n\n};\n\n} // namespace tbb\n\n#endif /* __TBB_blocked_range3d_H */\n"
  },
  {
    "path": "benchmarks/tbb/cache_aligned_allocator.cpp",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#include \"tbb/tbb_config.h\"\n#include \"tbb/cache_aligned_allocator.h\"\n#include \"tbb/tbb_allocator.h\"\n#include \"tbb/tbb_exception.h\"\n#include \"tbb_misc.h\"\n#include \"dynamic_link.h\"\n#include <cstdlib>\n\n#if _WIN32||_WIN64\n#include \"tbb/machine/windows_api.h\"\n#else\n#include <dlfcn.h>\n#endif /* _WIN32||_WIN64 */\n\nusing namespace std;\n\n#if __TBB_WEAK_SYMBOLS_PRESENT\n\n#pragma weak scalable_malloc\n#pragma weak scalable_free\n#pragma weak scalable_aligned_malloc\n#pragma weak scalable_aligned_free\n\nextern \"C\" {\n    void* scalable_malloc( size_t );\n    void  scalable_free( void* );\n    void* scalable_aligned_malloc( size_t, size_t );\n    void  scalable_aligned_free( void* );\n}\n\n#endif /* __TBB_WEAK_SYMBOLS_PRESENT */\n\nnamespace tbb {\n\nnamespace internal {\n\n//! Dummy routine used for first indirect call via MallocHandler.\nstatic void* DummyMalloc( size_t size );\n\n//! Dummy routine used for first indirect call via FreeHandler.\nstatic void DummyFree( void * ptr );\n\n//! Handler for memory allocation\nstatic void* (*MallocHandler)( size_t size ) = &DummyMalloc;\n\n//! Handler for memory deallocation\nstatic void (*FreeHandler)( void* pointer ) = &DummyFree;\n\n//! Dummy routine used for first indirect call via padded_allocate_handler.\nstatic void* dummy_padded_allocate( size_t bytes, size_t alignment );\n\n//! Dummy routine used for first indirect call via padded_free_handler.\nstatic void dummy_padded_free( void * ptr );\n\n// ! Allocates memory using standard malloc. It is used when scalable_allocator is not available\nstatic void* padded_allocate( size_t bytes, size_t alignment );\n\n// ! Allocates memory using standard free. It is used when scalable_allocator is not available\nstatic void padded_free( void* p );\n\n//! Handler for padded memory allocation\nstatic void* (*padded_allocate_handler)( size_t bytes, size_t alignment ) = &dummy_padded_allocate;\n\n//! Handler for padded memory deallocation\nstatic void (*padded_free_handler)( void* p ) = &dummy_padded_free;\n\n//! Table describing how to link the handlers.\nstatic const dynamic_link_descriptor MallocLinkTable[] = {\n    DLD(scalable_malloc, MallocHandler),\n    DLD(scalable_free, FreeHandler),\n    DLD(scalable_aligned_malloc, padded_allocate_handler),\n    DLD(scalable_aligned_free, padded_free_handler),\n};\n\n\n#if TBB_USE_DEBUG\n#define DEBUG_SUFFIX \"_debug\"\n#else\n#define DEBUG_SUFFIX\n#endif /* TBB_USE_DEBUG */\n\n// MALLOCLIB_NAME is the name of the TBB memory allocator library.\n#if _WIN32||_WIN64\n#define MALLOCLIB_NAME \"tbbmalloc\" DEBUG_SUFFIX \".dll\"\n#elif __APPLE__\n#define MALLOCLIB_NAME \"libtbbmalloc\" DEBUG_SUFFIX \".dylib\"\n#elif __FreeBSD__ || __NetBSD__ || __sun || _AIX || __ANDROID__\n#define MALLOCLIB_NAME \"libtbbmalloc\" DEBUG_SUFFIX \".so\"\n#elif __linux__  // Note that order of these #elif's is important!\n#define MALLOCLIB_NAME \"libtbbmalloc\" DEBUG_SUFFIX  __TBB_STRING(.so.TBB_COMPATIBLE_INTERFACE_VERSION)\n#else\n#error Unknown OS\n#endif\n\n//! Initialize the allocation/free handler pointers.\n/** Caller is responsible for ensuring this routine is called exactly once.\n    The routine attempts to dynamically link with the TBB memory allocator.\n    If that allocator is not found, it links to malloc and free. */\nvoid initialize_handler_pointers() {\n    __TBB_ASSERT( MallocHandler==&DummyMalloc, NULL );\n    bool success = dynamic_link( MALLOCLIB_NAME, MallocLinkTable, 4 );\n    if( !success ) {\n        // If unsuccessful, set the handlers to the default routines.\n        // This must be done now, and not before FillDynamicLinks runs, because if other\n        // threads call the handlers, we want them to go through the DoOneTimeInitializations logic,\n        // which forces them to wait.\n        FreeHandler = &free;\n        MallocHandler = &malloc;\n        padded_allocate_handler = &padded_allocate;\n        padded_free_handler = &padded_free;\n    }\n#if !__TBB_RML_STATIC\n    PrintExtraVersionInfo( \"ALLOCATOR\", success?\"scalable_malloc\":\"malloc\" );\n#endif\n}\n\nstatic tbb::atomic<do_once_state> initialization_state;\nvoid initialize_cache_aligned_allocator() {\n    atomic_do_once( &initialize_handler_pointers, initialization_state );\n}\n\n//! Executed on very first call through MallocHandler\nstatic void* DummyMalloc( size_t size ) {\n    initialize_cache_aligned_allocator();\n    __TBB_ASSERT( MallocHandler!=&DummyMalloc, NULL );\n    return (*MallocHandler)( size );\n}\n\n//! Executed on very first call through FreeHandler\nstatic void DummyFree( void * ptr ) {\n    initialize_cache_aligned_allocator();\n    __TBB_ASSERT( FreeHandler!=&DummyFree, NULL );\n    (*FreeHandler)( ptr );\n}\n\n//! Executed on very first call through padded_allocate_handler\nstatic void* dummy_padded_allocate( size_t bytes, size_t alignment ) {\n    initialize_cache_aligned_allocator();\n    __TBB_ASSERT( padded_allocate_handler!=&dummy_padded_allocate, NULL );\n    return (*padded_allocate_handler)(bytes, alignment);\n}\n\n//! Executed on very first call through padded_free_handler\nstatic void dummy_padded_free( void * ptr ) {\n    initialize_cache_aligned_allocator();\n    __TBB_ASSERT( padded_free_handler!=&dummy_padded_free, NULL );\n    (*padded_free_handler)( ptr );\n}    \n\nstatic size_t NFS_LineSize = 128;\n\nsize_t NFS_GetLineSize() {\n    return NFS_LineSize;\n}\n\n#if _MSC_VER && !defined(__INTEL_COMPILER)\n    // unary minus operator applied to unsigned type, result still unsigned\n    #pragma warning( disable: 4146 4706 )\n#endif\n\nvoid* NFS_Allocate( size_t n, size_t element_size, void* /*hint*/ ) {\n    size_t m = NFS_LineSize;\n    __TBB_ASSERT( m<=NFS_MaxLineSize, \"illegal value for NFS_LineSize\" );\n    __TBB_ASSERT( (m & (m-1))==0, \"must be power of two\" );\n    size_t bytes = n*element_size;\n\n    if (bytes<n || bytes+m<bytes) {\n        // Overflow\n        throw_exception(eid_bad_alloc);\n    }\n    // scalable_aligned_malloc considers zero size request an error, and returns NULL\n    if (bytes==0) bytes = 1;\n    \n    void* result = (*padded_allocate_handler)( bytes, m );\n    if (!result)\n        throw_exception(eid_bad_alloc);\n\n    __TBB_ASSERT( ((size_t)result&(m-1)) == 0, \"The address returned isn't aligned to cache line size\" );\n    return result;\n}\n\nvoid NFS_Free( void* p ) {\n    (*padded_free_handler)( p );\n}\n\nstatic void* padded_allocate( size_t bytes, size_t alignment ) {    \n    unsigned char* result = NULL;\n    unsigned char* base = (unsigned char*)malloc(alignment+bytes);\n    if( base ) {        \n        // Round up to the next line\n        result = (unsigned char*)((uintptr_t)(base+alignment)&-alignment);\n        // Record where block actually starts.\n        ((uintptr_t*)result)[-1] = uintptr_t(base);\n    }\n    return result;    \n}\n\nstatic void padded_free( void* p ) {\n    if( p ) {\n        __TBB_ASSERT( (uintptr_t)p>=0x4096, \"attempt to free block not obtained from cache_aligned_allocator\" );\n        // Recover where block actually starts\n        unsigned char* base = ((unsigned char**)p)[-1];\n        __TBB_ASSERT( (void*)((uintptr_t)(base+NFS_LineSize)&-NFS_LineSize)==p, \"not allocated by NFS_Allocate?\" );\n        free(base);\n    }\n}\n\nvoid* __TBB_EXPORTED_FUNC allocate_via_handler_v3( size_t n ) {    \n    void* result = (*MallocHandler) (n);\n    if (!result) {\n        throw_exception(eid_bad_alloc);\n    }\n    return result;\n}\n\nvoid __TBB_EXPORTED_FUNC deallocate_via_handler_v3( void *p ) {\n    if( p ) {        \n        (*FreeHandler)( p );\n    }\n}\n\nbool __TBB_EXPORTED_FUNC is_malloc_used_v3() {\n    if (MallocHandler == &DummyMalloc) {\n        void* void_ptr = (*MallocHandler)(1);\n        (*FreeHandler)(void_ptr);\n    }\n    __TBB_ASSERT( MallocHandler!=&DummyMalloc && FreeHandler!=&DummyFree, NULL );\n    // Cast to void avoids type mismatch errors on some compilers (e.g. __IBMCPP__)\n    __TBB_ASSERT( !(((void*)MallocHandler==(void*)&malloc) ^ ((void*)FreeHandler==(void*)&free)),\n                  \"Both shim pointers must refer to routines from the same package (either TBB or CRT)\" );\n    return (void*)MallocHandler == (void*)&malloc;\n}\n\n} // namespace internal\n\n} // namespace tbb\n"
  },
  {
    "path": "benchmarks/tbb/cache_aligned_allocator.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_cache_aligned_allocator_H\n#define __TBB_cache_aligned_allocator_H\n\n#include <new>\n#include \"tbb_stddef.h\"\n#if __TBB_ALLOCATOR_CONSTRUCT_VARIADIC\n #include <utility> // std::forward\n#endif\n\nnamespace tbb {\n\n//! @cond INTERNAL\nnamespace internal {\n    //! Cache/sector line size.\n    /** @ingroup memory_allocation */\n    size_t __TBB_EXPORTED_FUNC NFS_GetLineSize();\n\n    //! Allocate memory on cache/sector line boundary.\n    /** @ingroup memory_allocation */\n    void* __TBB_EXPORTED_FUNC NFS_Allocate( size_t n_element, size_t element_size, void* hint );\n\n    //! Free memory allocated by NFS_Allocate.\n    /** Freeing a NULL pointer is allowed, but has no effect.\n        @ingroup memory_allocation */\n    void __TBB_EXPORTED_FUNC NFS_Free( void* );\n}\n//! @endcond\n\n#if _MSC_VER && !defined(__INTEL_COMPILER)\n    // Workaround for erroneous \"unreferenced parameter\" warning in method destroy.\n    #pragma warning (push)\n    #pragma warning (disable: 4100)\n#endif\n\n//! Meets \"allocator\" requirements of ISO C++ Standard, Section 20.1.5\n/** The members are ordered the same way they are in section 20.4.1\n    of the ISO C++ standard.\n    @ingroup memory_allocation */\ntemplate<typename T>\nclass cache_aligned_allocator {\npublic:\n    typedef typename internal::allocator_type<T>::value_type value_type;\n    typedef value_type* pointer;\n    typedef const value_type* const_pointer;\n    typedef value_type& reference;\n    typedef const value_type& const_reference;\n    typedef size_t size_type;\n    typedef ptrdiff_t difference_type;\n    template<typename U> struct rebind {\n        typedef cache_aligned_allocator<U> other;\n    };\n\n    cache_aligned_allocator() throw() {}\n    cache_aligned_allocator( const cache_aligned_allocator& ) throw() {}\n    template<typename U> cache_aligned_allocator(const cache_aligned_allocator<U>&) throw() {}\n\n    pointer address(reference x) const {return &x;}\n    const_pointer address(const_reference x) const {return &x;}\n    \n    //! Allocate space for n objects, starting on a cache/sector line.\n    pointer allocate( size_type n, const void* hint=0 ) {\n        // The \"hint\" argument is always ignored in NFS_Allocate thus const_cast shouldn't hurt\n        return pointer(internal::NFS_Allocate( n, sizeof(value_type), const_cast<void*>(hint) ));\n    }\n\n    //! Free block of memory that starts on a cache line\n    void deallocate( pointer p, size_type ) {\n        internal::NFS_Free(p);\n    }\n\n    //! Largest value for which method allocate might succeed.\n    size_type max_size() const throw() {\n        return (~size_t(0)-internal::NFS_MaxLineSize)/sizeof(value_type);\n    }\n\n    //! Copy-construct value at location pointed to by p.\n#if __TBB_ALLOCATOR_CONSTRUCT_VARIADIC\n    template<typename U, typename... Args>\n    void construct(U *p, Args&&... args)\n        { ::new((void *)p) U(std::forward<Args>(args)...); }\n#else // __TBB_ALLOCATOR_CONSTRUCT_VARIADIC\n#if __TBB_CPP11_RVALUE_REF_PRESENT\n    void construct( pointer p, value_type&& value ) {::new((void*)(p)) value_type(std::move(value));}\n#endif\n    void construct( pointer p, const value_type& value ) {::new((void*)(p)) value_type(value);}\n#endif // __TBB_ALLOCATOR_CONSTRUCT_VARIADIC\n\n    //! Destroy value at location pointed to by p.\n    void destroy( pointer p ) {p->~value_type();}\n};\n\n#if _MSC_VER && !defined(__INTEL_COMPILER)\n    #pragma warning (pop)\n#endif // warning 4100 is back\n\n//! Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1\n/** @ingroup memory_allocation */\ntemplate<> \nclass cache_aligned_allocator<void> {\npublic:\n    typedef void* pointer;\n    typedef const void* const_pointer;\n    typedef void value_type;\n    template<typename U> struct rebind {\n        typedef cache_aligned_allocator<U> other;\n    };\n};\n\ntemplate<typename T, typename U>\ninline bool operator==( const cache_aligned_allocator<T>&, const cache_aligned_allocator<U>& ) {return true;}\n\ntemplate<typename T, typename U>\ninline bool operator!=( const cache_aligned_allocator<T>&, const cache_aligned_allocator<U>& ) {return false;}\n\n} // namespace tbb\n\n#endif /* __TBB_cache_aligned_allocator_H */\n"
  },
  {
    "path": "benchmarks/tbb/cilk-tbb-interop.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n/* The API to enable interoperability between Intel(R) Cilk(TM) Plus and \n   Intel(R) Threading Building Blocks. */\n\n#ifndef CILK_TBB_INTEROP_H\n#define CILK_TBB_INTEROP_H\n\n#ifndef _WIN32\n#ifdef IN_CILK_RUNTIME\n#define CILK_EXPORT __attribute__((visibility(\"protected\")))\n#else\n#define CILK_EXPORT /* nothing */\n#endif\n#else\n#ifdef IN_CILK_RUNTIME\n#define CILK_EXPORT __declspec(dllexport)\n#else\n#define CILK_EXPORT __declspec(dllimport)\n#endif  // IN_CILK_RUNTIME\n#endif // _WIN32\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif /* __cplusplus */\n\n/* A return code.  0 indicates success */\ntypedef int __cilk_tbb_retcode;\n\nenum __cilk_tbb_stack_op {\n    CILK_TBB_STACK_ORPHAN, // disconnecting stack from a thread\n    CILK_TBB_STACK_ADOPT,  // reconnecting orphaned stack to a trhead\n    CILK_TBB_STACK_RELEASE // releasing stack\n};\n\ntypedef __cilk_tbb_retcode (*__cilk_tbb_pfn_stack_op)(enum __cilk_tbb_stack_op, void* data);\n\ntypedef __cilk_tbb_retcode (*__cilk_tbb_pfn_unwatch_stacks)(void *data);\n\n/* Each thunk structure has two pointers: \"routine\" and \"data\".\n   The caller of the thunk invokes *routine, passing \"data\" as the void* parameter. */\n\n/* Thunk invoked by Intel Cilk Plus runtime (cilkrts) when it changes the relationship\n   between a stack and a thread. It does not matter what stack the thunk runs on.\n   The thread (not fiber) on which the thunk runs is important.\n\n   CILK_TBB_STACK_ORPHAN\n      The thunk must be invoked on the thread disconnecting itself from the stack.\n      Must \"happen before\" the stack is adopted elsewhere.\n   CILK_TBB_STACK_ADOPT\n      The thunk must be invoked on the thread adopting the stack.\n   CILK_TBB_STACK_RELEASE\n      The thunk must be invoked on the thread doing the releasing,\n      Must \"happen before\" the stack is used elsewhere.\n\n   When a non-empty stack is transfered between threads, the first thread must orphan it \n   and the second thread must adopt it.\n\n   An empty stack can be transfered similarly, or simply released by the first thread.\n\n   Here is a summary of the actions as transitions on a state machine.\n\n                       watch                                    ORPHAN\n                       -->-->                                   -->--\n                      /      \\                                 /     \\\n   (freed empty stack)       (TBB sees stack running on thread)      (stack in limbo)\n                |     \\     /                                  \\     /     |\n                |      --<--                                    --<--      |\n                ^      RELEASE or                              ADOPT       V\n                 \\     unwatch                                            / \n                  \\                                                      /\n                   --------------------------<---------------------------\n                                          RELEASE\n*/\nstruct __cilk_tbb_stack_op_thunk {\n    __cilk_tbb_pfn_stack_op routine;\n    void* data;                 /* Set by TBB */\n};\n\n/* Thunk invoked by TBB when it is no longer interested in watching the stack bound to the current thread. */\nstruct __cilk_tbb_unwatch_thunk {\n    __cilk_tbb_pfn_unwatch_stacks routine;\n    void* data;      \n};\n\n/* Defined by cilkrts, called by TBB.\n   Requests that cilkrts invoke __cilk_tbb_stack_op_thunk when it orphans a stack. \n   cilkrts sets *u to a thunk that TBB should call when it is no longer interested in watching the stack. */\nCILK_EXPORT\n__cilk_tbb_retcode __cilkrts_watch_stack(struct __cilk_tbb_unwatch_thunk* u,\n                                         struct __cilk_tbb_stack_op_thunk o);\n\n#ifdef __cplusplus\n}\n#endif /* __cplusplus */\n\n#endif  // CILK_TBB_INTEROP_H\n"
  },
  {
    "path": "benchmarks/tbb/combinable.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_combinable_H\n#define __TBB_combinable_H\n\n#include \"enumerable_thread_specific.h\"\n#include \"cache_aligned_allocator.h\"\n\nnamespace tbb {\n/** \\name combinable\n    **/\n//@{\n//! Thread-local storage with optional reduction\n/** @ingroup containers */\n    template <typename T>\n        class combinable {\n    private:\n        typedef typename tbb::cache_aligned_allocator<T> my_alloc;\n\n        typedef typename tbb::enumerable_thread_specific<T, my_alloc, ets_no_key> my_ets_type;\n        my_ets_type my_ets; \n \n    public:\n\n        combinable() { }\n\n        template <typename finit>\n        combinable( finit _finit) : my_ets(_finit) { }\n\n        //! destructor\n        ~combinable() { \n        }\n\n        combinable(const combinable& other) : my_ets(other.my_ets) { }\n\n        combinable & operator=( const combinable & other) { my_ets = other.my_ets; return *this; }\n\n        void clear() { my_ets.clear(); }\n\n        T& local() { return my_ets.local(); }\n\n        T& local(bool & exists) { return my_ets.local(exists); }\n\n        // combine_func_t has signature T(T,T) or T(const T&, const T&)\n        template <typename combine_func_t>\n        T combine(combine_func_t f_combine) { return my_ets.combine(f_combine); }\n\n        // combine_func_t has signature void(T) or void(const T&)\n        template <typename combine_func_t>\n        void combine_each(combine_func_t f_combine) { my_ets.combine_each(f_combine); }\n\n    };\n} // namespace tbb\n#endif /* __TBB_combinable_H */\n"
  },
  {
    "path": "benchmarks/tbb/compat/condition_variable",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_condition_variable_H\n#define __TBB_condition_variable_H\n\n#if _WIN32||_WIN64\n#include \"../machine/windows_api.h\"\n\nnamespace tbb { \nnamespace interface5 {\nnamespace internal { \nstruct condition_variable_using_event\n{\n    //! Event for blocking waiting threads.\n    HANDLE event;\n    //! Protects invariants involving n_waiters, release_count, and epoch.\n    CRITICAL_SECTION mutex;\n    //! Number of threads waiting on this condition variable\n    int n_waiters;\n    //! Number of threads remaining that should no longer wait on this condition variable.\n    int release_count;\n    //! To keep threads from waking up prematurely with earlier signals.\n    unsigned epoch;\n};\n}}} // namespace tbb::interface5::internal\n\n#ifndef CONDITION_VARIABLE_INIT\ntypedef void* CONDITION_VARIABLE;\ntypedef CONDITION_VARIABLE* PCONDITION_VARIABLE;\n#endif\n\n#else /* if not _WIN32||_WIN64 */\n#include <errno.h> // some systems need it for ETIMEDOUT\n#include <pthread.h>\n#if __linux__\n#include <ctime>\n#else /* generic Unix */\n#include <sys/time.h>\n#endif\n#endif /* _WIN32||_WIN64 */\n\n#include \"../tbb_stddef.h\"\n#include \"../mutex.h\"\n#include \"../tbb_thread.h\"\n#include \"../tbb_exception.h\"\n#include \"../tbb_profiling.h\"\n\nnamespace tbb {\n\nnamespace interface5 {\n\n// C++0x standard working draft 30.4.3\n// Lock tag types\nstruct defer_lock_t { }; //! do not acquire ownership of the mutex\nstruct try_to_lock_t { }; //! try to acquire ownership of the mutex without blocking\nstruct adopt_lock_t { }; //! assume the calling thread has already\nconst defer_lock_t defer_lock = {};\nconst try_to_lock_t try_to_lock = {};\nconst adopt_lock_t adopt_lock = {};\n\n// C++0x standard working draft 30.4.3.1\n//! lock_guard \ntemplate<typename M>\nclass lock_guard : tbb::internal::no_copy {\npublic:\n    //! mutex type\n    typedef M mutex_type;\n\n    //! Constructor\n    /** precondition: If mutex_type is not a recursive mutex, the calling thread\n        does not own the mutex m. */\n    explicit lock_guard(mutex_type& m) : pm(m) {m.lock();}\n    \n    //! Adopt_lock constructor\n    /** precondition: the calling thread owns the mutex m. */\n    lock_guard(mutex_type& m, adopt_lock_t) : pm(m) {}\n\n    //! Destructor\n    ~lock_guard() { pm.unlock(); }\nprivate:\n    mutex_type& pm;\n};\n\n// C++0x standard working draft 30.4.3.2\n//! unique_lock \ntemplate<typename M>\nclass unique_lock : tbb::internal::no_copy {\n    friend class condition_variable;\npublic:\n    typedef M mutex_type;\n\n    // 30.4.3.2.1 construct/copy/destroy\n    // NB: Without constructors that take an r-value reference to a unique_lock, the following constructor is of little use.\n    //! Constructor\n    /** postcondition: pm==0 && owns==false */\n    unique_lock() : pm(NULL), owns(false) {}\n\n    //! Constructor\n    /** precondition: if mutex_type is not a recursive mutex, the  calling thread\n        does not own the mutex m.  If the precondition is not met, a deadlock occurs.\n        postcondition: pm==&m and owns==true */\n    explicit unique_lock(mutex_type& m) : pm(&m) {m.lock(); owns=true;}\n\n    //! Defer_lock constructor\n    /** postcondition: pm==&m and owns==false */\n    unique_lock(mutex_type& m, defer_lock_t) : pm(&m), owns(false) {}\n\n    //! Try_to_lock constructor\n    /** precondition: if mutex_type is not a recursive mutex, the  calling thread\n       does not own the mutex m.  If the precondition is not met, a deadlock occurs.\n       postcondition: pm==&m and owns==res where res is the value returned by\n       the call to m.try_lock(). */\n    unique_lock(mutex_type& m, try_to_lock_t) : pm(&m) {owns = m.try_lock();}\n\n    //! Adopt_lock constructor\n    /** precondition: the calling thread owns the mutex. If it does not, mutex->unlock() would fail.\n        postcondition: pm==&m and owns==true */\n    unique_lock(mutex_type& m, adopt_lock_t) : pm(&m), owns(true) {}\n\n    //! Timed unique_lock acquisition.\n    /** To avoid requiring support for namespace chrono, this method deviates from the working draft in that \n        it uses tbb::tick_count::interval_t to specify the time duration. */\n    unique_lock(mutex_type& m, const tick_count::interval_t &i) : pm(&m) {owns = try_lock_for( i );}\n\n    //! Destructor\n    ~unique_lock() { if( owns ) pm->unlock(); }\n\n    // 30.4.3.2.2 locking\n    //! Lock the mutex and own it.\n    void lock() {\n        if( pm ) {\n            if( !owns ) {\n                pm->lock();\n                owns = true;\n            } else \n                throw_exception_v4( tbb::internal::eid_possible_deadlock );\n        } else \n            throw_exception_v4( tbb::internal::eid_operation_not_permitted );\n        __TBB_ASSERT( owns, NULL );\n    }\n\n    //! Try to lock the mutex. \n    /** If successful, note that this lock owns it. Otherwise, set it false. */\n    bool try_lock() {\n        if( pm ) {\n            if( !owns )\n                owns = pm->try_lock();\n            else\n                throw_exception_v4( tbb::internal::eid_possible_deadlock );\n        } else \n            throw_exception_v4( tbb::internal::eid_operation_not_permitted );\n        return owns;\n    }\n \n    //! Try to lock the mutex. \n    bool try_lock_for( const tick_count::interval_t &i );\n\n    //! Unlock the mutex\n    /** And note that this lock no longer owns it. */\n    void unlock() { \n        if( owns ) {\n            pm->unlock();\n            owns = false;\n        } else\n            throw_exception_v4( tbb::internal::eid_operation_not_permitted );\n        __TBB_ASSERT( !owns, NULL );\n    }\n\n    // 30.4.3.2.3 modifiers\n    //! Swap the two unique locks\n    void swap(unique_lock& u) {\n        mutex_type* t_pm = u.pm;    u.pm   = pm;    pm   = t_pm;\n        bool t_owns      = u.owns;  u.owns = owns;  owns = t_owns;\n    }\n\n    //! Release control over the mutex.\n    mutex_type* release() {\n        mutex_type* o_pm = pm; \n        pm = NULL; \n        owns = false; \n        return o_pm; \n    }\n\n    // 30.4.3.2.4 observers\n    //! Does this lock own the mutex?\n    bool owns_lock() const { return owns; }\n\n    // TODO: Un-comment 'explicit' when the last non-C++0x compiler support is dropped\n    //! Does this lock own the mutex?\n    /*explicit*/ operator bool() const { return owns; }\n\n    //! Return the mutex that this lock currently has.\n    mutex_type* mutex() const { return pm; }\n\nprivate:\n    mutex_type* pm;\n    bool owns;\n};\n\ntemplate<typename M>\nbool unique_lock<M>::try_lock_for( const tick_count::interval_t &i)\n{ \n    const int unique_lock_tick = 100; /* microseconds; 0.1 milliseconds */\n    // the smallest wait-time is 0.1 milliseconds.\n    bool res = pm->try_lock();\n    int duration_in_micro; \n    if( !res && (duration_in_micro=int(i.seconds()*1e6))>unique_lock_tick ) {\n        tick_count::interval_t i_100( double(unique_lock_tick)/1e6 /* seconds */); // 100 microseconds = 0.1*10E-3\n        do {\n            this_tbb_thread::sleep(i_100); // sleep for 100 micro seconds\n            duration_in_micro -= unique_lock_tick;\n            res = pm->try_lock();\n        } while( !res && duration_in_micro>unique_lock_tick );\n    }\n    return (owns=res);\n}\n\n//! Swap the two unique locks that have the mutexes of same type \ntemplate<typename M>\nvoid swap(unique_lock<M>& x, unique_lock<M>& y) { x.swap( y ); }\n\nnamespace internal {\n\n#if _WIN32||_WIN64\nunion condvar_impl_t {\n    condition_variable_using_event cv_event;\n    CONDITION_VARIABLE             cv_native;\n};\nvoid __TBB_EXPORTED_FUNC internal_initialize_condition_variable( condvar_impl_t& cv );\nvoid __TBB_EXPORTED_FUNC internal_destroy_condition_variable(    condvar_impl_t& cv );\nvoid __TBB_EXPORTED_FUNC internal_condition_variable_notify_one( condvar_impl_t& cv );\nvoid __TBB_EXPORTED_FUNC internal_condition_variable_notify_all( condvar_impl_t& cv );\nbool __TBB_EXPORTED_FUNC internal_condition_variable_wait( condvar_impl_t& cv, mutex* mtx, const tick_count::interval_t* i = NULL );\n\n#else /* if !(_WIN32||_WIN64), i.e., POSIX threads */\ntypedef pthread_cond_t condvar_impl_t;\n#endif\n\n} // namespace internal\n\n//! cv_status\n/** C++0x standard working draft 30.5 */\nenum cv_status { no_timeout, timeout }; \n\n//! condition variable\n/** C++0x standard working draft 30.5.1 \n    @ingroup synchronization */\nclass condition_variable : tbb::internal::no_copy {\npublic:\n    //! Constructor\n    condition_variable() { \n#if _WIN32||_WIN64\n        internal_initialize_condition_variable( my_cv ); \n#else\n        pthread_cond_init( &my_cv, NULL );\n#endif\n    }\n\n    //! Destructor\n    ~condition_variable() { \n        //precondition: There shall be no thread blocked on *this.\n#if _WIN32||_WIN64\n        internal_destroy_condition_variable( my_cv );\n#else\n        pthread_cond_destroy( &my_cv );\n#endif\n    }\n\n    //! Notify one thread and wake it up\n    void notify_one() { \n#if _WIN32||_WIN64\n        internal_condition_variable_notify_one( my_cv ); \n#else\n        pthread_cond_signal( &my_cv );\n#endif\n    }\n\n    //! Notify all threads \n    void notify_all() { \n#if _WIN32||_WIN64\n        internal_condition_variable_notify_all( my_cv ); \n#else\n        pthread_cond_broadcast( &my_cv );\n#endif\n    }\n\n    //! Release the mutex associated with the lock and wait on this condition variable\n    void wait(unique_lock<mutex>& lock);\n\n    //! Wait on this condition variable while pred is false\n    template <class Predicate>\n    void wait(unique_lock<mutex>& lock, Predicate pred) {\n        while( !pred() )\n            wait( lock );\n    }\n\n    //! Timed version of wait()\n    cv_status wait_for(unique_lock<mutex>& lock, const tick_count::interval_t &i );\n\n    //! Timed version of the predicated wait\n    /** The loop terminates when pred() returns true or when the time duration specified by rel_time (i) has elapsed. */\n    template<typename Predicate>\n    bool wait_for(unique_lock<mutex>& lock, const tick_count::interval_t &i, Predicate pred)\n    {\n        while( !pred() ) {\n            cv_status st = wait_for( lock, i );\n            if( st==timeout )\n                return pred();\n        }\n        return true;\n    }\n\n    // C++0x standard working draft. 30.2.3\n    typedef internal::condvar_impl_t* native_handle_type;\n\n    native_handle_type native_handle() { return (native_handle_type) &my_cv; }\n\nprivate:\n    internal::condvar_impl_t my_cv;\n};\n\n\n#if _WIN32||_WIN64\ninline void condition_variable::wait( unique_lock<mutex>& lock )\n{\n    __TBB_ASSERT( lock.owns, NULL );\n    lock.owns = false;\n    if( !internal_condition_variable_wait( my_cv, lock.mutex() ) ) {\n        int ec = GetLastError();\n        // on Windows 7, SleepConditionVariableCS() may return ERROR_TIMEOUT while the doc says it returns WAIT_TIMEOUT\n        __TBB_ASSERT_EX( ec!=WAIT_TIMEOUT&&ec!=ERROR_TIMEOUT, NULL );\n        lock.owns = true;\n        throw_exception_v4( tbb::internal::eid_condvar_wait_failed );\n    }\n    lock.owns = true;\n}\n\ninline cv_status condition_variable::wait_for( unique_lock<mutex>& lock, const tick_count::interval_t& i )\n{\n    cv_status rc = no_timeout;\n    __TBB_ASSERT( lock.owns, NULL );\n    lock.owns = false;\n    // condvar_wait could be SleepConditionVariableCS (or SleepConditionVariableSRW) or our own pre-vista cond_var_wait()\n    if( !internal_condition_variable_wait( my_cv, lock.mutex(), &i ) ) {\n        int ec = GetLastError();\n        if( ec==WAIT_TIMEOUT || ec==ERROR_TIMEOUT )\n            rc = timeout;\n        else {\n            lock.owns = true;\n            throw_exception_v4( tbb::internal::eid_condvar_wait_failed );\n        }\n    }\n    lock.owns = true;\n    return rc;\n}\n\n#else /* !(_WIN32||_WIN64) */\ninline void condition_variable::wait( unique_lock<mutex>& lock )\n{\n    __TBB_ASSERT( lock.owns, NULL );\n    lock.owns = false;\n    if( pthread_cond_wait( &my_cv, lock.mutex()->native_handle() ) ) {\n        lock.owns = true;\n        throw_exception_v4( tbb::internal::eid_condvar_wait_failed );\n    }\n    // upon successful return, the mutex has been locked and is owned by the calling thread.\n    lock.owns = true;\n}\n\ninline cv_status condition_variable::wait_for( unique_lock<mutex>& lock, const tick_count::interval_t& i )\n{\n#if __linux__\n    struct timespec req;\n    double sec = i.seconds();\n    clock_gettime( CLOCK_REALTIME, &req );\n    req.tv_sec  += static_cast<long>(sec);\n    req.tv_nsec += static_cast<long>( (sec - static_cast<long>(sec))*1e9 );\n#else /* generic Unix */\n    struct timeval tv;\n    struct timespec req;\n    double sec = i.seconds();\n    int status = gettimeofday(&tv, NULL);\n    __TBB_ASSERT_EX( status==0, \"gettimeofday failed\" );\n    req.tv_sec  = tv.tv_sec + static_cast<long>(sec);\n    req.tv_nsec = tv.tv_usec*1000 + static_cast<long>( (sec - static_cast<long>(sec))*1e9 );\n#endif /*(choice of OS) */\n    if( req.tv_nsec>=1e9 ) {\n        req.tv_sec  += 1;\n        req.tv_nsec -= static_cast<long int>(1e9);\n    }\n    __TBB_ASSERT( 0<=req.tv_nsec && req.tv_nsec<1e9, NULL );\n\n    int ec;\n    cv_status rc = no_timeout;\n    __TBB_ASSERT( lock.owns, NULL );\n    lock.owns = false;\n    if( ( ec=pthread_cond_timedwait( &my_cv, lock.mutex()->native_handle(), &req ) ) ) {\n        if( ec==ETIMEDOUT )\n            rc = timeout;\n        else {\n            __TBB_ASSERT( lock.try_lock()==false, NULL );\n            lock.owns = true;\n            throw_exception_v4( tbb::internal::eid_condvar_wait_failed );\n        }\n    }\n    lock.owns = true;\n    return rc;\n}\n#endif /* !(_WIN32||_WIN64) */\n\n} // namespace interface5\n\n__TBB_DEFINE_PROFILING_SET_NAME(interface5::condition_variable)\n\n} // namespace tbb \n\n#if TBB_IMPLEMENT_CPP0X\n\nnamespace std {\n\nusing tbb::interface5::defer_lock_t;\nusing tbb::interface5::try_to_lock_t;\nusing tbb::interface5::adopt_lock_t;\nusing tbb::interface5::defer_lock;\nusing tbb::interface5::try_to_lock;\nusing tbb::interface5::adopt_lock;\nusing tbb::interface5::lock_guard;\nusing tbb::interface5::unique_lock;\nusing tbb::interface5::swap;   /* this is for void std::swap(unique_lock<M>&,unique_lock<M>&) */\nusing tbb::interface5::condition_variable;\nusing tbb::interface5::cv_status;\nusing tbb::interface5::timeout;\nusing tbb::interface5::no_timeout;\n\n} // namespace std \n\n#endif /* TBB_IMPLEMENT_CPP0X */\n\n#endif /* __TBB_condition_variable_H */\n"
  },
  {
    "path": "benchmarks/tbb/compat/ppl.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_compat_ppl_H\n#define __TBB_compat_ppl_H\n\n#include \"../task_group.h\"\n#include \"../parallel_invoke.h\"\n#include \"../parallel_for_each.h\"\n#include \"../parallel_for.h\"\n#include \"../tbb_exception.h\"\n#include \"../critical_section.h\"\n#include \"../reader_writer_lock.h\"\n#include \"../combinable.h\"\n\nnamespace Concurrency {\n\n#if __TBB_TASK_GROUP_CONTEXT\n    using tbb::task_handle;\n    using tbb::task_group_status;\n    using tbb::task_group;\n    using tbb::structured_task_group;\n    using tbb::invalid_multiple_scheduling;\n    using tbb::missing_wait;\n    using tbb::make_task;\n\n    using tbb::not_complete;\n    using tbb::complete;\n    using tbb::canceled;\n\n    using tbb::is_current_task_group_canceling;\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n    using tbb::parallel_invoke;\n    using tbb::strict_ppl::parallel_for;\n    using tbb::parallel_for_each;\n    using tbb::critical_section;\n    using tbb::reader_writer_lock;\n    using tbb::combinable;\n\n    using tbb::improper_lock;\n\n} // namespace Concurrency\n\n#endif /* __TBB_compat_ppl_H */\n"
  },
  {
    "path": "benchmarks/tbb/compat/thread",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_thread_H\n#define __TBB_thread_H\n\n#include \"../tbb_thread.h\"\n\n#if TBB_IMPLEMENT_CPP0X\n\nnamespace std {\n\ntypedef tbb::tbb_thread thread;\n\nnamespace this_thread {\n    using tbb::this_tbb_thread::get_id;\n    using tbb::this_tbb_thread::yield;\n\n    inline void sleep_for(const tbb::tick_count::interval_t& rel_time) {\n        tbb::internal::thread_sleep_v3( rel_time );\n    }\n\n}\n\n}\n\n#endif /* TBB_IMPLEMENT_CPP0X */\n\n#endif /* __TBB_thread_H */\n"
  },
  {
    "path": "benchmarks/tbb/compat/tuple",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_tuple_H\n#define __TBB_tuple_H\n\n#include <utility>\n#include \"../tbb_stddef.h\"\n\n// build preprocessor variables for varying number of arguments\n// Need the leading comma so the empty __TBB_T_PACK will not cause a syntax error.\n#if __TBB_VARIADIC_MAX <= 5\n#define __TBB_T_PACK\n#define __TBB_U_PACK\n#define __TBB_TYPENAME_T_PACK\n#define __TBB_TYPENAME_U_PACK\n#define __TBB_NULL_TYPE_PACK\n#define __TBB_REF_T_PARAM_PACK\n#define __TBB_CONST_REF_T_PARAM_PACK\n#define __TBB_T_PARAM_LIST_PACK\n#define __TBB_CONST_NULL_REF_PACK\n//\n#elif __TBB_VARIADIC_MAX == 6\n#define __TBB_T_PACK ,__T5\n#define __TBB_U_PACK ,__U5\n#define __TBB_TYPENAME_T_PACK , typename __T5\n#define __TBB_TYPENAME_U_PACK , typename __U5\n#define __TBB_NULL_TYPE_PACK , null_type\n#define __TBB_REF_T_PARAM_PACK ,__T5& t5\n#define __TBB_CONST_REF_T_PARAM_PACK ,const __T5& t5\n#define __TBB_T_PARAM_LIST_PACK ,t5\n#define __TBB_CONST_NULL_REF_PACK , const null_type&\n//\n#elif __TBB_VARIADIC_MAX == 7\n#define __TBB_T_PACK ,__T5, __T6\n#define __TBB_U_PACK ,__U5, __U6\n#define __TBB_TYPENAME_T_PACK , typename __T5 , typename __T6\n#define __TBB_TYPENAME_U_PACK , typename __U5 , typename __U6\n#define __TBB_NULL_TYPE_PACK , null_type, null_type\n#define __TBB_REF_T_PARAM_PACK ,__T5& t5, __T6& t6\n#define __TBB_CONST_REF_T_PARAM_PACK ,const __T5& t5, const __T6& t6\n#define __TBB_T_PARAM_LIST_PACK ,t5 ,t6\n#define __TBB_CONST_NULL_REF_PACK , const null_type&, const null_type&\n//\n#elif __TBB_VARIADIC_MAX == 8\n#define __TBB_T_PACK ,__T5, __T6, __T7\n#define __TBB_U_PACK ,__U5, __U6, __U7\n#define __TBB_TYPENAME_T_PACK , typename __T5 , typename __T6, typename __T7\n#define __TBB_TYPENAME_U_PACK , typename __U5 , typename __U6, typename __U7\n#define __TBB_NULL_TYPE_PACK , null_type, null_type, null_type\n#define __TBB_REF_T_PARAM_PACK ,__T5& t5, __T6& t6, __T7& t7\n#define __TBB_CONST_REF_T_PARAM_PACK , const __T5& t5, const __T6& t6, const __T7& t7\n#define __TBB_T_PARAM_LIST_PACK ,t5 ,t6 ,t7\n#define __TBB_CONST_NULL_REF_PACK , const null_type&, const null_type&, const null_type&\n//\n#elif __TBB_VARIADIC_MAX == 9\n#define __TBB_T_PACK ,__T5, __T6, __T7, __T8\n#define __TBB_U_PACK ,__U5, __U6, __U7, __U8\n#define __TBB_TYPENAME_T_PACK , typename __T5, typename __T6, typename __T7, typename __T8\n#define __TBB_TYPENAME_U_PACK , typename __U5, typename __U6, typename __U7, typename __U8\n#define __TBB_NULL_TYPE_PACK , null_type, null_type, null_type, null_type\n#define __TBB_REF_T_PARAM_PACK ,__T5& t5, __T6& t6, __T7& t7, __T8& t8\n#define __TBB_CONST_REF_T_PARAM_PACK , const __T5& t5, const __T6& t6, const __T7& t7, const __T8& t8\n#define __TBB_T_PARAM_LIST_PACK ,t5 ,t6 ,t7 ,t8\n#define __TBB_CONST_NULL_REF_PACK , const null_type&, const null_type&, const null_type&, const null_type&\n//\n#elif __TBB_VARIADIC_MAX >= 10\n#define __TBB_T_PACK ,__T5, __T6, __T7, __T8, __T9\n#define __TBB_U_PACK ,__U5, __U6, __U7, __U8, __U9\n#define __TBB_TYPENAME_T_PACK , typename __T5, typename __T6, typename __T7, typename __T8, typename __T9\n#define __TBB_TYPENAME_U_PACK , typename __U5, typename __U6, typename __U7, typename __U8, typename __U9\n#define __TBB_NULL_TYPE_PACK , null_type, null_type, null_type, null_type, null_type\n#define __TBB_REF_T_PARAM_PACK ,__T5& t5, __T6& t6, __T7& t7, __T8& t8, __T9& t9\n#define __TBB_CONST_REF_T_PARAM_PACK , const __T5& t5, const __T6& t6, const __T7& t7, const __T8& t8, const __T9& t9\n#define __TBB_T_PARAM_LIST_PACK ,t5 ,t6 ,t7 ,t8 ,t9\n#define __TBB_CONST_NULL_REF_PACK , const null_type&, const null_type&, const null_type&, const null_type&, const null_type&\n#endif\n\n\n\nnamespace tbb {\nnamespace interface5 {\n\nnamespace internal {\nstruct null_type { };\n}\nusing internal::null_type;\n\n// tuple forward declaration\ntemplate <typename __T0=null_type, typename __T1=null_type, typename __T2=null_type,\n          typename __T3=null_type, typename __T4=null_type\n#if __TBB_VARIADIC_MAX >= 6\n, typename __T5=null_type\n#if __TBB_VARIADIC_MAX >= 7\n, typename __T6=null_type\n#if __TBB_VARIADIC_MAX >= 8\n, typename __T7=null_type\n#if __TBB_VARIADIC_MAX >= 9\n, typename __T8=null_type\n#if __TBB_VARIADIC_MAX >= 10\n, typename __T9=null_type\n#endif\n#endif\n#endif\n#endif\n#endif\n>\nclass tuple;\n\nnamespace internal {\n\n// const null_type temp\ninline const null_type cnull() { return null_type(); }\n\n// cons forward declaration\ntemplate <typename __HT, typename __TT> struct cons;\n\n// type of a component of the cons\ntemplate<int __N, typename __T>\nstruct component {\n    typedef typename __T::tail_type next;\n    typedef typename component<__N-1,next>::type type;\n};\n\ntemplate<typename __T>\nstruct component<0,__T> {\n    typedef typename __T::head_type type;\n};\n\ntemplate<>\nstruct component<0,null_type> {\n    typedef null_type type;\n};\n\n// const version of component\n\ntemplate<int __N, typename __T>\nstruct component<__N, const __T>\n{\n    typedef typename __T::tail_type next;\n    typedef const typename component<__N-1,next>::type type;\n};\n\ntemplate<typename __T>\nstruct component<0, const __T>\n{\n    typedef const typename __T::head_type type;\n};\n\n\n// helper class for getting components of cons\ntemplate< int __N>\nstruct get_helper {\ntemplate<typename __HT, typename __TT>\ninline static typename component<__N, cons<__HT,__TT> >::type& get(cons<__HT,__TT>& ti) {\n    return get_helper<__N-1>::get(ti.tail);\n}\ntemplate<typename __HT, typename __TT>\ninline static typename component<__N, cons<__HT,__TT> >::type const& get(const cons<__HT,__TT>& ti) {\n    return get_helper<__N-1>::get(ti.tail);\n}\n};\n\ntemplate<>\nstruct get_helper<0> {\ntemplate<typename __HT, typename __TT>\ninline static typename component<0, cons<__HT,__TT> >::type& get(cons<__HT,__TT>& ti) {\n    return ti.head;\n}\ntemplate<typename __HT, typename __TT>\ninline static typename component<0, cons<__HT,__TT> >::type const& get(const cons<__HT,__TT>& ti) {\n    return ti.head;\n}\n};\n\n// traits adaptor\ntemplate <typename __T0, typename __T1, typename __T2, typename __T3, typename __T4 __TBB_TYPENAME_T_PACK>\nstruct tuple_traits {\n    typedef cons <__T0, typename tuple_traits<__T1, __T2, __T3, __T4 __TBB_T_PACK , null_type>::U > U;\n};\n\ntemplate <typename __T0>\nstruct tuple_traits<__T0, null_type, null_type, null_type, null_type __TBB_NULL_TYPE_PACK > {\n    typedef cons<__T0, null_type> U;\n};\n\ntemplate<>\nstruct tuple_traits<null_type, null_type, null_type, null_type, null_type __TBB_NULL_TYPE_PACK > {\n    typedef null_type U;\n};\n\n\n// core cons defs\ntemplate <typename __HT, typename __TT>\nstruct cons{\n\n    typedef __HT head_type;\n    typedef __TT tail_type;\n\n    head_type head; \n    tail_type tail;\n\n    static const int length = 1 + tail_type::length;\n\n    // default constructors\n    explicit cons() : head(), tail() { }\n\n    // non-default constructors\n    cons(head_type& h, const tail_type& t) : head(h), tail(t) { }\n\n    template <typename __T0, typename __T1, typename __T2, typename __T3, typename __T4 __TBB_TYPENAME_T_PACK >\n    cons(const __T0& t0, const __T1& t1, const __T2& t2, const __T3& t3, const __T4& t4 __TBB_CONST_REF_T_PARAM_PACK) :\n        head(t0), tail(t1, t2, t3, t4 __TBB_T_PARAM_LIST_PACK, cnull()) { }\n\n    template <typename __T0, typename __T1, typename __T2, typename __T3, typename __T4 __TBB_TYPENAME_T_PACK >\n    cons(__T0& t0, __T1& t1, __T2& t2, __T3& t3, __T4& t4 __TBB_REF_T_PARAM_PACK) :\n        head(t0), tail(t1, t2, t3, t4 __TBB_T_PARAM_LIST_PACK , cnull()) { }\n\n    template <typename __HT1, typename __TT1>\n    cons(const cons<__HT1,__TT1>& other) : head(other.head), tail(other.tail) { }\n\n    cons& operator=(const cons& other) { head = other.head; tail = other.tail; return *this; }\n\n    friend bool operator==(const cons& me, const cons& other) {\n        return me.head == other.head && me.tail == other.tail;\n    }\n    friend bool operator<(const cons& me, const cons& other)  {\n        return me.head < other.head || (!(other.head < me.head) && me.tail < other.tail);\n    }\n    friend bool operator>(const cons& me, const cons& other)  { return other<me; }\n    friend bool operator!=(const cons& me, const cons& other) { return !(me==other); }\n    friend bool operator>=(const cons& me, const cons& other) { return !(me<other); }\n    friend bool operator<=(const cons& me, const cons& other) { return !(me>other); }\n\n    template<typename __HT1, typename __TT1>\n    friend bool operator==(const cons<__HT,__TT>& me, const cons<__HT1,__TT1>& other) {\n        return me.head == other.head && me.tail == other.tail;\n    }\n\n    template<typename __HT1, typename __TT1>\n    friend bool operator<(const cons<__HT,__TT>& me, const cons<__HT1,__TT1>& other) {\n        return me.head < other.head || (!(other.head < me.head) && me.tail < other.tail);\n    }\n\n    template<typename __HT1, typename __TT1>\n    friend bool operator>(const cons<__HT,__TT>& me, const cons<__HT1,__TT1>& other) { return other<me; }\n\n    template<typename __HT1, typename __TT1>\n    friend bool operator!=(const cons<__HT,__TT>& me, const cons<__HT1,__TT1>& other) { return !(me==other); }\n\n    template<typename __HT1, typename __TT1>\n    friend bool operator>=(const cons<__HT,__TT>& me, const cons<__HT1,__TT1>& other) { return !(me<other); }\n\n    template<typename __HT1, typename __TT1>\n    friend bool operator<=(const cons<__HT,__TT>& me, const cons<__HT1,__TT1>& other) { return !(me>other); }\n\n\n};  // cons\n\n\ntemplate <typename __HT>\nstruct cons<__HT,null_type> { \n\n    typedef __HT head_type;\n    typedef null_type tail_type;\n\n    head_type head; \n\n    static const int length = 1;\n\n    // default constructor\n    cons() : head() { /*std::cout << \"default constructor 1\\n\";*/ }\n\n    cons(const null_type&, const null_type&, const null_type&, const null_type&, const null_type& __TBB_CONST_NULL_REF_PACK) : head() { /*std::cout << \"default constructor 2\\n\";*/ }\n\n    // non-default constructor\n    template<typename __T1>\n    cons(__T1& t1, const null_type&, const null_type&, const null_type&, const null_type& __TBB_CONST_NULL_REF_PACK) : head(t1) { /*std::cout << \"non-default a1, t1== \" << t1 << \"\\n\";*/}\n\n    cons(head_type& h, const null_type& = null_type() ) : head(h) { }\n    cons(const head_type& t0, const null_type&, const null_type&, const null_type&, const null_type& __TBB_CONST_NULL_REF_PACK) : head(t0) { }\n\n    // converting constructor\n    template<typename __HT1>\n    cons(__HT1 h1, const null_type&, const null_type&, const null_type&, const null_type& __TBB_CONST_NULL_REF_PACK) : head(h1) { }\n\n    // copy constructor\n    template<typename __HT1>\n    cons( const cons<__HT1, null_type>& other) : head(other.head) { }\n\n    // assignment operator\n    cons& operator=(const cons& other) { head = other.head; return *this; }\n\n    friend bool operator==(const cons& me, const cons& other) { return me.head == other.head; }\n    friend bool operator<(const cons& me, const cons& other) { return me.head < other.head; }\n    friend bool operator>(const cons& me, const cons& other) { return other<me; }\n    friend bool operator!=(const cons& me, const cons& other) {return !(me==other); }\n    friend bool operator<=(const cons& me, const cons& other) {return !(me>other); }\n    friend bool operator>=(const cons& me, const cons& other) {return !(me<other); }\n\n    template<typename __HT1>\n    friend bool operator==(const cons<__HT,null_type>& me, const cons<__HT1,null_type>& other) {\n        return me.head == other.head;\n    }\n\n    template<typename __HT1>\n    friend bool operator<(const cons<__HT,null_type>& me, const cons<__HT1,null_type>& other) {\n        return me.head < other.head;\n    }\n\n    template<typename __HT1>\n    friend bool operator>(const cons<__HT,null_type>& me, const cons<__HT1,null_type>& other) { return other<me; }\n\n    template<typename __HT1>\n    friend bool operator!=(const cons<__HT,null_type>& me, const cons<__HT1,null_type>& other) { return !(me==other); }\n\n    template<typename __HT1>\n    friend bool operator<=(const cons<__HT,null_type>& me, const cons<__HT1,null_type>& other) { return !(me>other); }\n\n    template<typename __HT1>\n    friend bool operator>=(const cons<__HT,null_type>& me, const cons<__HT1,null_type>& other) { return !(me<other); }\n\n};  // cons\n\ntemplate <>\nstruct cons<null_type,null_type> { typedef null_type tail_type; static const int length = 0; };\n\n// wrapper for default constructor\ntemplate<typename __T>\ninline const __T wrap_dcons(__T*) { return __T(); }\n\n} // namespace internal\n\n// tuple definition\ntemplate<typename __T0, typename __T1, typename __T2, typename __T3, typename __T4 __TBB_TYPENAME_T_PACK >\nclass tuple : public internal::tuple_traits<__T0, __T1, __T2, __T3, __T4 __TBB_T_PACK >::U {\n    // friends\n    template <typename __T> friend class tuple_size;\n    template<int __N, typename __T> friend struct tuple_element;\n\n    // stl components\n    typedef tuple<__T0,__T1,__T2,__T3,__T4 __TBB_T_PACK > value_type;\n    typedef value_type *pointer;\n    typedef const value_type *const_pointer;\n    typedef value_type &reference;\n    typedef const value_type &const_reference;\n    typedef size_t size_type;\n\n    typedef typename internal::tuple_traits<__T0,__T1,__T2,__T3, __T4 __TBB_T_PACK >::U my_cons;\n\npublic:\n    tuple(const __T0& t0=internal::wrap_dcons((__T0*)NULL)\n          ,const __T1& t1=internal::wrap_dcons((__T1*)NULL)\n          ,const __T2& t2=internal::wrap_dcons((__T2*)NULL)\n          ,const __T3& t3=internal::wrap_dcons((__T3*)NULL)\n          ,const __T4& t4=internal::wrap_dcons((__T4*)NULL)\n#if __TBB_VARIADIC_MAX >= 6\n          ,const __T5& t5=internal::wrap_dcons((__T5*)NULL)\n#if __TBB_VARIADIC_MAX >= 7\n          ,const __T6& t6=internal::wrap_dcons((__T6*)NULL)\n#if __TBB_VARIADIC_MAX >= 8\n          ,const __T7& t7=internal::wrap_dcons((__T7*)NULL)\n#if __TBB_VARIADIC_MAX >= 9\n          ,const __T8& t8=internal::wrap_dcons((__T8*)NULL)\n#if __TBB_VARIADIC_MAX >= 10\n          ,const __T9& t9=internal::wrap_dcons((__T9*)NULL)\n#endif\n#endif\n#endif\n#endif\n#endif\n          ) :\n        my_cons(t0,t1,t2,t3,t4 __TBB_T_PARAM_LIST_PACK) { }\n\n    template<int __N>\n    struct internal_tuple_element {\n        typedef typename internal::component<__N,my_cons>::type type;\n    };\n\n    template<int __N>\n    typename internal_tuple_element<__N>::type& get() { return internal::get_helper<__N>::get(*this); }\n\n    template<int __N>\n    typename internal_tuple_element<__N>::type const& get() const { return internal::get_helper<__N>::get(*this); }\n\n    template<typename __U1, typename __U2>\n    tuple& operator=(const internal::cons<__U1,__U2>& other) {\n        my_cons::operator=(other);\n        return *this;\n    }\n\n    template<typename __U1, typename __U2>\n    tuple& operator=(const std::pair<__U1,__U2>& other) {\n        // __TBB_ASSERT(tuple_size<value_type>::value == 2, \"Invalid size for pair to tuple assignment\");\n        this->head = other.first;\n        this->tail.head = other.second;\n        return *this;\n    }\n\n    friend bool operator==(const tuple& me, const tuple& other) {return static_cast<const my_cons &>(me)==(other);}\n    friend bool operator<(const tuple& me,  const tuple& other) {return static_cast<const my_cons &>(me)<(other);}\n    friend bool operator>(const tuple& me,  const tuple& other) {return static_cast<const my_cons &>(me)>(other);}\n    friend bool operator!=(const tuple& me, const tuple& other) {return static_cast<const my_cons &>(me)!=(other);}\n    friend bool operator>=(const tuple& me, const tuple& other) {return static_cast<const my_cons &>(me)>=(other);}\n    friend bool operator<=(const tuple& me, const tuple& other) {return static_cast<const my_cons &>(me)<=(other);}\n\n};  // tuple\n\n// empty tuple\ntemplate<>\nclass tuple<null_type, null_type, null_type, null_type, null_type __TBB_NULL_TYPE_PACK > : public null_type {\n};\n\n// helper classes\n\ntemplate < typename __T>\nclass tuple_size {\npublic:\n    static const size_t value = 1 + tuple_size<typename __T::tail_type>::value;\n};\n\ntemplate <>\nclass tuple_size<tuple<> > { \npublic:\n    static const size_t value = 0;\n};\n\ntemplate <>\nclass tuple_size<null_type> {\npublic:\n    static const size_t value = 0;\n};\n\ntemplate<int __N, typename __T>\nstruct tuple_element {\n    typedef typename internal::component<__N, typename __T::my_cons>::type type;\n};\n\ntemplate<int __N, typename __T0, typename __T1, typename __T2, typename __T3, typename __T4 __TBB_TYPENAME_T_PACK >\ninline static typename tuple_element<__N,tuple<__T0,__T1,__T2,__T3,__T4 __TBB_T_PACK > >::type&\n    get(tuple<__T0,__T1,__T2,__T3,__T4 __TBB_T_PACK >& t) { return internal::get_helper<__N>::get(t); }\n\ntemplate<int __N, typename __T0, typename __T1, typename __T2, typename __T3, typename __T4 __TBB_TYPENAME_T_PACK >\ninline static typename tuple_element<__N,tuple<__T0,__T1,__T2,__T3,__T4 __TBB_T_PACK > >::type const&\n    get(const tuple<__T0,__T1,__T2,__T3,__T4 __TBB_T_PACK >& t) { return internal::get_helper<__N>::get(t); }\n\n}  // interface5\n} // tbb\n\n#if !__TBB_CPP11_TUPLE_PRESENT\nnamespace tbb {\n    namespace flow {\n        using tbb::interface5::tuple;\n        using tbb::interface5::tuple_size;\n        using tbb::interface5::tuple_element;\n        using tbb::interface5::get;\n    }\n}\n#endif\n\n#undef __TBB_T_PACK\n#undef __TBB_U_PACK\n#undef __TBB_TYPENAME_T_PACK\n#undef __TBB_TYPENAME_U_PACK\n#undef __TBB_NULL_TYPE_PACK\n#undef __TBB_REF_T_PARAM_PACK\n#undef __TBB_CONST_REF_T_PARAM_PACK\n#undef __TBB_T_PARAM_LIST_PACK\n#undef __TBB_CONST_NULL_REF_PACK\n \n#endif /* __TBB_tuple_H */\n"
  },
  {
    "path": "benchmarks/tbb/concurrent_hash_map.cpp",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#include \"tbb/concurrent_hash_map.h\"\n\nnamespace tbb {\n\nnamespace internal {\n#if !TBB_NO_LEGACY\nstruct hash_map_segment_base {\n    typedef spin_rw_mutex segment_mutex_t;\n    //! Type of a hash code.\n    typedef size_t hashcode_t;\n    //! Log2 of n_segment\n    static const size_t n_segment_bits = 6;\n    //! Maximum size of array of chains\n    static const size_t max_physical_size = size_t(1)<<(8*sizeof(hashcode_t)-n_segment_bits);\n    //! Mutex that protects this segment\n    segment_mutex_t my_mutex;\n    // Number of nodes\n    atomic<size_t> my_logical_size;\n    // Size of chains\n    /** Always zero or a power of two */\n    size_t my_physical_size;\n    //! True if my_logical_size>=my_physical_size.\n    /** Used to support Intel(R) Thread Checker. */\n    bool __TBB_EXPORTED_METHOD internal_grow_predicate() const;\n};\n\nbool hash_map_segment_base::internal_grow_predicate() const {\n    // Intel(R) Thread Checker considers the following reads to be races, so we hide them in the \n    // library so that Intel(R) Thread Checker will ignore them.  The reads are used in a double-check\n    // context, so the program is nonetheless correct despite the race.\n    return my_logical_size >= my_physical_size && my_physical_size < max_physical_size;\n}\n#endif//!TBB_NO_LEGACY\n\n} // namespace internal\n\n} // namespace tbb\n\n"
  },
  {
    "path": "benchmarks/tbb/concurrent_hash_map.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_concurrent_hash_map_H\n#define __TBB_concurrent_hash_map_H\n\n#include \"tbb_stddef.h\"\n\n#if !TBB_USE_EXCEPTIONS && _MSC_VER\n    // Suppress \"C++ exception handler used, but unwind semantics are not enabled\" warning in STL headers\n    #pragma warning (push)\n    #pragma warning (disable: 4530)\n#endif\n\n#include <iterator>\n#include <utility>      // Need std::pair\n#include <cstring>      // Need std::memset\n\n#if !TBB_USE_EXCEPTIONS && _MSC_VER\n    #pragma warning (pop)\n#endif\n\n#include \"cache_aligned_allocator.h\"\n#include \"tbb_allocator.h\"\n#include \"spin_rw_mutex.h\"\n#include \"atomic.h\"\n#include \"tbb_exception.h\"\n#include \"tbb_profiling.h\"\n#include \"internal/_concurrent_unordered_impl.h\" // Need tbb_hasher\n#if __TBB_INITIALIZER_LISTS_PRESENT\n#include <initializer_list>\n#endif\n#if TBB_USE_PERFORMANCE_WARNINGS || __TBB_STATISTICS\n#include <typeinfo>\n#endif\n#if __TBB_STATISTICS\n#include <stdio.h>\n#endif\n\nnamespace tbb {\n\n//! hash_compare that is default argument for concurrent_hash_map\ntemplate<typename Key>\nstruct tbb_hash_compare {\n    static size_t hash( const Key& a ) { return tbb_hasher(a); }\n    static bool equal( const Key& a, const Key& b ) { return a == b; }\n};\n\nnamespace interface5 {\n\n    template<typename Key, typename T, typename HashCompare = tbb_hash_compare<Key>, typename A = tbb_allocator<std::pair<Key, T> > >\n    class concurrent_hash_map;\n\n    //! @cond INTERNAL\n    namespace internal {\n    using namespace tbb::internal;\n\n\n    //! Type of a hash code.\n    typedef size_t hashcode_t;\n    //! Node base type\n    struct hash_map_node_base : tbb::internal::no_copy {\n        //! Mutex type\n        typedef spin_rw_mutex mutex_t;\n        //! Scoped lock type for mutex\n        typedef mutex_t::scoped_lock scoped_t;\n        //! Next node in chain\n        hash_map_node_base *next;\n        mutex_t mutex;\n    };\n    //! Incompleteness flag value\n    static hash_map_node_base *const rehash_req = reinterpret_cast<hash_map_node_base*>(size_t(3));\n    //! Rehashed empty bucket flag\n    static hash_map_node_base *const empty_rehashed = reinterpret_cast<hash_map_node_base*>(size_t(0));\n    //! base class of concurrent_hash_map\n    class hash_map_base {\n    public:\n        //! Size type\n        typedef size_t size_type;\n        //! Type of a hash code.\n        typedef size_t hashcode_t;\n        //! Segment index type\n        typedef size_t segment_index_t;\n        //! Node base type\n        typedef hash_map_node_base node_base;\n        //! Bucket type\n        struct bucket : tbb::internal::no_copy {\n            //! Mutex type for buckets\n            typedef spin_rw_mutex mutex_t;\n            //! Scoped lock type for mutex\n            typedef mutex_t::scoped_lock scoped_t;\n            mutex_t mutex;\n            node_base *node_list;\n        };\n        //! Count of segments in the first block\n        static size_type const embedded_block = 1;\n        //! Count of segments in the first block\n        static size_type const embedded_buckets = 1<<embedded_block;\n        //! Count of segments in the first block\n        static size_type const first_block = 8; //including embedded_block. perfect with bucket size 16, so the allocations are power of 4096\n        //! Size of a pointer / table size\n        static size_type const pointers_per_table = sizeof(segment_index_t) * 8; // one segment per bit\n        //! Segment pointer\n        typedef bucket *segment_ptr_t;\n        //! Segment pointers table type\n        typedef segment_ptr_t segments_table_t[pointers_per_table];\n        //! Hash mask = sum of allocated segment sizes - 1\n        atomic<hashcode_t> my_mask;\n        //! Segment pointers table. Also prevents false sharing between my_mask and my_size\n        segments_table_t my_table;\n        //! Size of container in stored items\n        atomic<size_type> my_size; // It must be in separate cache line from my_mask due to performance effects\n        //! Zero segment\n        bucket my_embedded_segment[embedded_buckets];\n#if __TBB_STATISTICS\n        atomic<unsigned> my_info_resizes; // concurrent ones\n        mutable atomic<unsigned> my_info_restarts; // race collisions\n        atomic<unsigned> my_info_rehashes;  // invocations of rehash_bucket\n#endif\n        //! Constructor\n        hash_map_base() {\n            std::memset( this, 0, pointers_per_table*sizeof(segment_ptr_t) // 32*4=128   or 64*8=512\n                + sizeof(my_size) + sizeof(my_mask)  // 4+4 or 8+8\n                + embedded_buckets*sizeof(bucket) ); // n*8 or n*16\n            for( size_type i = 0; i < embedded_block; i++ ) // fill the table\n                my_table[i] = my_embedded_segment + segment_base(i);\n            my_mask = embedded_buckets - 1;\n            __TBB_ASSERT( embedded_block <= first_block, \"The first block number must include embedded blocks\");\n#if __TBB_STATISTICS\n            my_info_resizes = 0; // concurrent ones\n            my_info_restarts = 0; // race collisions\n            my_info_rehashes = 0;  // invocations of rehash_bucket\n#endif\n        }\n\n        //! @return segment index of given index in the array\n        static segment_index_t segment_index_of( size_type index ) {\n            return segment_index_t( __TBB_Log2( index|1 ) );\n        }\n\n        //! @return the first array index of given segment\n        static segment_index_t segment_base( segment_index_t k ) {\n            return (segment_index_t(1)<<k & ~segment_index_t(1));\n        }\n\n        //! @return segment size except for @arg k == 0\n        static size_type segment_size( segment_index_t k ) {\n            return size_type(1)<<k; // fake value for k==0\n        }\n\n        //! @return true if @arg ptr is valid pointer\n        static bool is_valid( void *ptr ) {\n            return reinterpret_cast<uintptr_t>(ptr) > uintptr_t(63);\n        }\n\n        //! Initialize buckets\n        static void init_buckets( segment_ptr_t ptr, size_type sz, bool is_initial ) {\n            if( is_initial ) std::memset(ptr, 0, sz*sizeof(bucket) );\n            else for(size_type i = 0; i < sz; i++, ptr++) {\n                *reinterpret_cast<intptr_t*>(&ptr->mutex) = 0;\n                ptr->node_list = rehash_req;\n            }\n        }\n\n        //! Add node @arg n to bucket @arg b\n        static void add_to_bucket( bucket *b, node_base *n ) {\n            __TBB_ASSERT(b->node_list != rehash_req, NULL);\n            n->next = b->node_list;\n            b->node_list = n; // its under lock and flag is set\n        }\n\n        //! Exception safety helper\n        struct enable_segment_failsafe : tbb::internal::no_copy {\n            segment_ptr_t *my_segment_ptr;\n            enable_segment_failsafe(segments_table_t &table, segment_index_t k) : my_segment_ptr(&table[k]) {}\n            ~enable_segment_failsafe() {\n                if( my_segment_ptr ) *my_segment_ptr = 0; // indicate no allocation in progress\n            }\n        };\n\n        //! Enable segment\n        void enable_segment( segment_index_t k, bool is_initial = false ) {\n            __TBB_ASSERT( k, \"Zero segment must be embedded\" );\n            enable_segment_failsafe watchdog( my_table, k );\n            cache_aligned_allocator<bucket> alloc;\n            size_type sz;\n            __TBB_ASSERT( !is_valid(my_table[k]), \"Wrong concurrent assignment\");\n            if( k >= first_block ) {\n                sz = segment_size( k );\n                segment_ptr_t ptr = alloc.allocate( sz );\n                init_buckets( ptr, sz, is_initial );\n                itt_hide_store_word( my_table[k], ptr );\n                sz <<= 1;// double it to get entire capacity of the container\n            } else { // the first block\n                __TBB_ASSERT( k == embedded_block, \"Wrong segment index\" );\n                sz = segment_size( first_block );\n                segment_ptr_t ptr = alloc.allocate( sz - embedded_buckets );\n                init_buckets( ptr, sz - embedded_buckets, is_initial );\n                ptr -= segment_base(embedded_block);\n                for(segment_index_t i = embedded_block; i < first_block; i++) // calc the offsets\n                    itt_hide_store_word( my_table[i], ptr + segment_base(i) );\n            }\n            itt_store_word_with_release( my_mask, sz-1 );\n            watchdog.my_segment_ptr = 0;\n        }\n\n        //! Get bucket by (masked) hashcode\n        bucket *get_bucket( hashcode_t h ) const throw() { // TODO: add throw() everywhere?\n            segment_index_t s = segment_index_of( h );\n            h -= segment_base(s);\n            segment_ptr_t seg = my_table[s];\n            __TBB_ASSERT( is_valid(seg), \"hashcode must be cut by valid mask for allocated segments\" );\n            return &seg[h];\n        }\n\n        // internal serial rehashing helper\n        void mark_rehashed_levels( hashcode_t h ) throw () {\n            segment_index_t s = segment_index_of( h );\n            while( segment_ptr_t seg = my_table[++s] )\n                if( seg[h].node_list == rehash_req ) {\n                    seg[h].node_list = empty_rehashed;\n                    mark_rehashed_levels( h + ((hashcode_t)1<<s) ); // optimized segment_base(s)\n                }\n        }\n\n        //! Check for mask race\n        // Splitting into two functions should help inlining\n        inline bool check_mask_race( const hashcode_t h, hashcode_t &m ) const {\n            hashcode_t m_now, m_old = m;\n            m_now = (hashcode_t) itt_load_word_with_acquire( my_mask );\n            if( m_old != m_now )\n                return check_rehashing_collision( h, m_old, m = m_now );\n            return false;\n        }\n\n        //! Process mask race, check for rehashing collision\n        bool check_rehashing_collision( const hashcode_t h, hashcode_t m_old, hashcode_t m ) const {\n            __TBB_ASSERT(m_old != m, NULL); // TODO?: m arg could be optimized out by passing h = h&m\n            if( (h & m_old) != (h & m) ) { // mask changed for this hashcode, rare event\n                // condition above proves that 'h' has some other bits set beside 'm_old'\n                // find next applicable mask after m_old    //TODO: look at bsl instruction\n                for( ++m_old; !(h & m_old); m_old <<= 1 ) // at maximum few rounds depending on the first block size\n                    ;\n                m_old = (m_old<<1) - 1; // get full mask from a bit\n                __TBB_ASSERT((m_old&(m_old+1))==0 && m_old <= m, NULL);\n                // check whether it is rehashing/ed\n                if( itt_load_word_with_acquire(get_bucket(h & m_old)->node_list) != rehash_req )\n                {\n#if __TBB_STATISTICS\n                    my_info_restarts++; // race collisions\n#endif\n                    return true;\n                }\n            }\n            return false;\n        }\n\n        //! Insert a node and check for load factor. @return segment index to enable.\n        segment_index_t insert_new_node( bucket *b, node_base *n, hashcode_t mask ) {\n            size_type sz = ++my_size; // prefix form is to enforce allocation after the first item inserted\n            add_to_bucket( b, n );\n            // check load factor\n            if( sz >= mask ) { // TODO: add custom load_factor\n                segment_index_t new_seg = __TBB_Log2( mask+1 ); //optimized segment_index_of\n                __TBB_ASSERT( is_valid(my_table[new_seg-1]), \"new allocations must not publish new mask until segment has allocated\");\n                static const segment_ptr_t is_allocating = (segment_ptr_t)2;\n                if( !itt_hide_load_word(my_table[new_seg])\n                  && as_atomic(my_table[new_seg]).compare_and_swap(is_allocating, NULL) == NULL )\n                    return new_seg; // The value must be processed\n            }\n            return 0;\n        }\n\n        //! Prepare enough segments for number of buckets\n        void reserve(size_type buckets) {\n            if( !buckets-- ) return;\n            bool is_initial = !my_size;\n            for( size_type m = my_mask; buckets > m; m = my_mask )\n                enable_segment( segment_index_of( m+1 ), is_initial );\n        }\n        //! Swap hash_map_bases\n        void internal_swap(hash_map_base &table) {\n            using std::swap;\n            swap(this->my_mask, table.my_mask);\n            swap(this->my_size, table.my_size);\n            for(size_type i = 0; i < embedded_buckets; i++)\n                swap(this->my_embedded_segment[i].node_list, table.my_embedded_segment[i].node_list);\n            for(size_type i = embedded_block; i < pointers_per_table; i++)\n                swap(this->my_table[i], table.my_table[i]);\n        }\n    };\n\n    template<typename Iterator>\n    class hash_map_range;\n\n    //! Meets requirements of a forward iterator for STL */\n    /** Value is either the T or const T type of the container.\n        @ingroup containers */\n    template<typename Container, typename Value>\n    class hash_map_iterator\n        : public std::iterator<std::forward_iterator_tag,Value>\n    {\n        typedef Container map_type;\n        typedef typename Container::node node;\n        typedef hash_map_base::node_base node_base;\n        typedef hash_map_base::bucket bucket;\n\n        template<typename C, typename T, typename U>\n        friend bool operator==( const hash_map_iterator<C,T>& i, const hash_map_iterator<C,U>& j );\n\n        template<typename C, typename T, typename U>\n        friend bool operator!=( const hash_map_iterator<C,T>& i, const hash_map_iterator<C,U>& j );\n\n        template<typename C, typename T, typename U>\n        friend ptrdiff_t operator-( const hash_map_iterator<C,T>& i, const hash_map_iterator<C,U>& j );\n\n        template<typename C, typename U>\n        friend class hash_map_iterator;\n\n        template<typename I>\n        friend class hash_map_range;\n\n        void advance_to_next_bucket() { // TODO?: refactor to iterator_base class\n            size_t k = my_index+1;\n            while( my_bucket && k <= my_map->my_mask ) {\n                // Following test uses 2's-complement wizardry\n                if( k& (k-2) ) // not the beginning of a segment\n                    ++my_bucket;\n                else my_bucket = my_map->get_bucket( k );\n                my_node = static_cast<node*>( my_bucket->node_list );\n                if( hash_map_base::is_valid(my_node) ) {\n                    my_index = k; return;\n                }\n                ++k;\n            }\n            my_bucket = 0; my_node = 0; my_index = k; // the end\n        }\n#if !defined(_MSC_VER) || defined(__INTEL_COMPILER)\n        template<typename Key, typename T, typename HashCompare, typename A>\n        friend class interface5::concurrent_hash_map;\n#else\n    public: // workaround\n#endif\n        //! concurrent_hash_map over which we are iterating.\n        const Container *my_map;\n\n        //! Index in hash table for current item\n        size_t my_index;\n\n        //! Pointer to bucket\n        const bucket *my_bucket;\n\n        //! Pointer to node that has current item\n        node *my_node;\n\n        hash_map_iterator( const Container &map, size_t index, const bucket *b, node_base *n );\n\n    public:\n        //! Construct undefined iterator\n        hash_map_iterator() {}\n        hash_map_iterator( const hash_map_iterator<Container,typename Container::value_type> &other ) :\n            my_map(other.my_map),\n            my_index(other.my_index),\n            my_bucket(other.my_bucket),\n            my_node(other.my_node)\n        {}\n        Value& operator*() const {\n            __TBB_ASSERT( hash_map_base::is_valid(my_node), \"iterator uninitialized or at end of container?\" );\n            return my_node->item;\n        }\n        Value* operator->() const {return &operator*();}\n        hash_map_iterator& operator++();\n\n        //! Post increment\n        hash_map_iterator operator++(int) {\n            hash_map_iterator old(*this);\n            operator++();\n            return old;\n        }\n    };\n\n    template<typename Container, typename Value>\n    hash_map_iterator<Container,Value>::hash_map_iterator( const Container &map, size_t index, const bucket *b, node_base *n ) :\n        my_map(&map),\n        my_index(index),\n        my_bucket(b),\n        my_node( static_cast<node*>(n) )\n    {\n        if( b && !hash_map_base::is_valid(n) )\n            advance_to_next_bucket();\n    }\n\n    template<typename Container, typename Value>\n    hash_map_iterator<Container,Value>& hash_map_iterator<Container,Value>::operator++() {\n        my_node = static_cast<node*>( my_node->next );\n        if( !my_node ) advance_to_next_bucket();\n        return *this;\n    }\n\n    template<typename Container, typename T, typename U>\n    bool operator==( const hash_map_iterator<Container,T>& i, const hash_map_iterator<Container,U>& j ) {\n        return i.my_node == j.my_node && i.my_map == j.my_map;\n    }\n\n    template<typename Container, typename T, typename U>\n    bool operator!=( const hash_map_iterator<Container,T>& i, const hash_map_iterator<Container,U>& j ) {\n        return i.my_node != j.my_node || i.my_map != j.my_map;\n    }\n\n    //! Range class used with concurrent_hash_map\n    /** @ingroup containers */\n    template<typename Iterator>\n    class hash_map_range {\n        typedef typename Iterator::map_type map_type;\n        Iterator my_begin;\n        Iterator my_end;\n        mutable Iterator my_midpoint;\n        size_t my_grainsize;\n        //! Set my_midpoint to point approximately half way between my_begin and my_end.\n        void set_midpoint() const;\n        template<typename U> friend class hash_map_range;\n    public:\n        //! Type for size of a range\n        typedef std::size_t size_type;\n        typedef typename Iterator::value_type value_type;\n        typedef typename Iterator::reference reference;\n        typedef typename Iterator::difference_type difference_type;\n        typedef Iterator iterator;\n\n        //! True if range is empty.\n        bool empty() const {return my_begin==my_end;}\n\n        //! True if range can be partitioned into two subranges.\n        bool is_divisible() const {\n            return my_midpoint!=my_end;\n        }\n        //! Split range.\n        hash_map_range( hash_map_range& r, split ) :\n            my_end(r.my_end),\n            my_grainsize(r.my_grainsize)\n        {\n            r.my_end = my_begin = r.my_midpoint;\n            __TBB_ASSERT( !empty(), \"Splitting despite the range is not divisible\" );\n            __TBB_ASSERT( !r.empty(), \"Splitting despite the range is not divisible\" );\n            set_midpoint();\n            r.set_midpoint();\n        }\n        //! type conversion\n        template<typename U>\n        hash_map_range( hash_map_range<U>& r) :\n            my_begin(r.my_begin),\n            my_end(r.my_end),\n            my_midpoint(r.my_midpoint),\n            my_grainsize(r.my_grainsize)\n        {}\n        //! Init range with container and grainsize specified\n        hash_map_range( const map_type &map, size_type grainsize_ = 1 ) :\n            my_begin( Iterator( map, 0, map.my_embedded_segment, map.my_embedded_segment->node_list ) ),\n            my_end( Iterator( map, map.my_mask + 1, 0, 0 ) ),\n            my_grainsize( grainsize_ )\n        {\n            __TBB_ASSERT( grainsize_>0, \"grainsize must be positive\" );\n            set_midpoint();\n        }\n        const Iterator& begin() const {return my_begin;}\n        const Iterator& end() const {return my_end;}\n        //! The grain size for this range.\n        size_type grainsize() const {return my_grainsize;}\n    };\n\n    template<typename Iterator>\n    void hash_map_range<Iterator>::set_midpoint() const {\n        // Split by groups of nodes\n        size_t m = my_end.my_index-my_begin.my_index;\n        if( m > my_grainsize ) {\n            m = my_begin.my_index + m/2u;\n            hash_map_base::bucket *b = my_begin.my_map->get_bucket(m);\n            my_midpoint = Iterator(*my_begin.my_map,m,b,b->node_list);\n        } else {\n            my_midpoint = my_end;\n        }\n        __TBB_ASSERT( my_begin.my_index <= my_midpoint.my_index,\n            \"my_begin is after my_midpoint\" );\n        __TBB_ASSERT( my_midpoint.my_index <= my_end.my_index,\n            \"my_midpoint is after my_end\" );\n        __TBB_ASSERT( my_begin != my_midpoint || my_begin == my_end,\n            \"[my_begin, my_midpoint) range should not be empty\" );\n    }\n\n    } // internal\n//! @endcond\n\n#if _MSC_VER && !defined(__INTEL_COMPILER)\n    // Suppress \"conditional expression is constant\" warning.\n    #pragma warning( push )\n    #pragma warning( disable: 4127 )\n#endif\n\n//! Unordered map from Key to T.\n/** concurrent_hash_map is associative container with concurrent access.\n\n@par Compatibility\n    The class meets all Container Requirements from C++ Standard (See ISO/IEC 14882:2003(E), clause 23.1).\n\n@par Exception Safety\n    - Hash function is not permitted to throw an exception. User-defined types Key and T are forbidden from throwing an exception in destructors.\n    - If exception happens during insert() operations, it has no effect (unless exception raised by HashCompare::hash() function during grow_segment).\n    - If exception happens during operator=() operation, the container can have a part of source items, and methods size() and empty() can return wrong results.\n\n@par Changes since TBB 2.1\n    - Replaced internal algorithm and data structure. Patent is pending.\n    - Added buckets number argument for constructor\n\n@par Changes since TBB 2.0\n    - Fixed exception-safety\n    - Added template argument for allocator\n    - Added allocator argument in constructors\n    - Added constructor from a range of iterators\n    - Added several new overloaded insert() methods\n    - Added get_allocator()\n    - Added swap()\n    - Added count()\n    - Added overloaded erase(accessor &) and erase(const_accessor&)\n    - Added equal_range() [const]\n    - Added [const_]pointer, [const_]reference, and allocator_type types\n    - Added global functions: operator==(), operator!=(), and swap()\n\n    @ingroup containers */\ntemplate<typename Key, typename T, typename HashCompare, typename Allocator>\nclass concurrent_hash_map : protected internal::hash_map_base {\n    template<typename Container, typename Value>\n    friend class internal::hash_map_iterator;\n\n    template<typename I>\n    friend class internal::hash_map_range;\n\npublic:\n    typedef Key key_type;\n    typedef T mapped_type;\n    typedef std::pair<const Key,T> value_type;\n    typedef hash_map_base::size_type size_type;\n    typedef ptrdiff_t difference_type;\n    typedef value_type *pointer;\n    typedef const value_type *const_pointer;\n    typedef value_type &reference;\n    typedef const value_type &const_reference;\n    typedef internal::hash_map_iterator<concurrent_hash_map,value_type> iterator;\n    typedef internal::hash_map_iterator<concurrent_hash_map,const value_type> const_iterator;\n    typedef internal::hash_map_range<iterator> range_type;\n    typedef internal::hash_map_range<const_iterator> const_range_type;\n    typedef Allocator allocator_type;\n\nprotected:\n    friend class const_accessor;\n    struct node;\n    typedef typename Allocator::template rebind<node>::other node_allocator_type;\n    node_allocator_type my_allocator;\n    HashCompare my_hash_compare;\n\n    struct node : public node_base {\n        value_type item;\n        node( const Key &key ) : item(key, T()) {}\n        node( const Key &key, const T &t ) : item(key, t) {}\n#if __TBB_CPP11_RVALUE_REF_PRESENT\n        node( value_type&& i ) : item(std::move(i)){}\n#endif //__TBB_CPP11_RVALUE_REF_PRESENT\n        node( const value_type& i ) : item(i) {}\n\n        // exception-safe allocation, see C++ Standard 2003, clause 5.3.4p17\n        void *operator new( size_t /*size*/, node_allocator_type &a ) {\n            void *ptr = a.allocate(1);\n            if(!ptr)\n                tbb::internal::throw_exception(tbb::internal::eid_bad_alloc);\n            return ptr;\n        }\n        // match placement-new form above to be called if exception thrown in constructor\n        void operator delete( void *ptr, node_allocator_type &a ) { a.deallocate(static_cast<node*>(ptr),1); }\n    };\n\n    void delete_node( node_base *n ) {\n        my_allocator.destroy( static_cast<node*>(n) );\n        my_allocator.deallocate( static_cast<node*>(n), 1);\n    }\n\n    static node* allocate_node_copy_construct(node_allocator_type& allocator, const Key &key, const T * t){\n        return  new( allocator ) node(key, *t);\n    }\n\n    static node* allocate_node_default_construct(node_allocator_type& allocator, const Key &key, const T * ){\n        return  new( allocator ) node(key);\n    }\n\n    static node* do_not_allocate_node(node_allocator_type& , const Key &, const T * ){\n        __TBB_ASSERT(false,\"this dummy function should not be called\");\n        return NULL;\n    }\n\n    node *search_bucket( const key_type &key, bucket *b ) const {\n        node *n = static_cast<node*>( b->node_list );\n        while( is_valid(n) && !my_hash_compare.equal(key, n->item.first) )\n            n = static_cast<node*>( n->next );\n        __TBB_ASSERT(n != internal::rehash_req, \"Search can be executed only for rehashed bucket\");\n        return n;\n    }\n\n    //! bucket accessor is to find, rehash, acquire a lock, and access a bucket\n    class bucket_accessor : public bucket::scoped_t {\n        bucket *my_b;\n    public:\n        bucket_accessor( concurrent_hash_map *base, const hashcode_t h, bool writer = false ) { acquire( base, h, writer ); }\n        //! find a bucket by masked hashcode, optionally rehash, and acquire the lock\n        inline void acquire( concurrent_hash_map *base, const hashcode_t h, bool writer = false ) {\n            my_b = base->get_bucket( h );\n            // TODO: actually, notification is unnecessary here, just hiding double-check\n            if( itt_load_word_with_acquire(my_b->node_list) == internal::rehash_req\n                && try_acquire( my_b->mutex, /*write=*/true ) )\n            {\n                if( my_b->node_list == internal::rehash_req ) base->rehash_bucket( my_b, h ); //recursive rehashing\n            }\n            else bucket::scoped_t::acquire( my_b->mutex, writer );\n            __TBB_ASSERT( my_b->node_list != internal::rehash_req, NULL);\n        }\n        //! check whether bucket is locked for write\n        bool is_writer() { return bucket::scoped_t::is_writer; }\n        //! get bucket pointer\n        bucket *operator() () { return my_b; }\n    };\n\n    // TODO refactor to hash_base\n    void rehash_bucket( bucket *b_new, const hashcode_t h ) {\n        __TBB_ASSERT( *(intptr_t*)(&b_new->mutex), \"b_new must be locked (for write)\");\n        __TBB_ASSERT( h > 1, \"The lowermost buckets can't be rehashed\" );\n        __TBB_store_with_release(b_new->node_list, internal::empty_rehashed); // mark rehashed\n        hashcode_t mask = ( 1u<<__TBB_Log2( h ) ) - 1; // get parent mask from the topmost bit\n#if __TBB_STATISTICS\n        my_info_rehashes++; // invocations of rehash_bucket\n#endif\n\n        bucket_accessor b_old( this, h & mask );\n\n        mask = (mask<<1) | 1; // get full mask for new bucket\n        __TBB_ASSERT( (mask&(mask+1))==0 && (h & mask) == h, NULL );\n    restart:\n        for( node_base **p = &b_old()->node_list, *n = __TBB_load_with_acquire(*p); is_valid(n); n = *p ) {\n            hashcode_t c = my_hash_compare.hash( static_cast<node*>(n)->item.first );\n#if TBB_USE_ASSERT\n            hashcode_t bmask = h & (mask>>1);\n            bmask = bmask==0? 1 : ( 1u<<(__TBB_Log2( bmask )+1 ) ) - 1; // minimal mask of parent bucket\n            __TBB_ASSERT( (c & bmask) == (h & bmask), \"hash() function changed for key in table\" );\n#endif\n            if( (c & mask) == h ) {\n                if( !b_old.is_writer() )\n                    if( !b_old.upgrade_to_writer() ) {\n                        goto restart; // node ptr can be invalid due to concurrent erase\n                    }\n                *p = n->next; // exclude from b_old\n                add_to_bucket( b_new, n );\n            } else p = &n->next; // iterate to next item\n        }\n    }\n\n    struct call_clear_on_leave {\n        concurrent_hash_map* my_ch_map;\n        call_clear_on_leave( concurrent_hash_map* a_ch_map ) : my_ch_map(a_ch_map) {}\n        void dismiss() {my_ch_map = 0;}\n        ~call_clear_on_leave(){\n            if (my_ch_map){\n                my_ch_map->clear();\n            }\n        }\n    };\npublic:\n\n    class accessor;\n    //! Combines data access, locking, and garbage collection.\n    class const_accessor : private node::scoped_t /*which derived from no_copy*/ {\n        friend class concurrent_hash_map<Key,T,HashCompare,Allocator>;\n        friend class accessor;\n    public:\n        //! Type of value\n        typedef const typename concurrent_hash_map::value_type value_type;\n\n        //! True if result is empty.\n        bool empty() const { return !my_node; }\n\n        //! Set to null\n        void release() {\n            if( my_node ) {\n                node::scoped_t::release();\n                my_node = 0;\n            }\n        }\n\n        //! Return reference to associated value in hash table.\n        const_reference operator*() const {\n            __TBB_ASSERT( my_node, \"attempt to dereference empty accessor\" );\n            return my_node->item;\n        }\n\n        //! Return pointer to associated value in hash table.\n        const_pointer operator->() const {\n            return &operator*();\n        }\n\n        //! Create empty result\n        const_accessor() : my_node(NULL) {}\n\n        //! Destroy result after releasing the underlying reference.\n        ~const_accessor() {\n            my_node = NULL; // scoped lock's release() is called in its destructor\n        }\n    protected:\n        bool is_writer() { return node::scoped_t::is_writer; }\n        node *my_node;\n        hashcode_t my_hash;\n    };\n\n    //! Allows write access to elements and combines data access, locking, and garbage collection.\n    class accessor: public const_accessor {\n    public:\n        //! Type of value\n        typedef typename concurrent_hash_map::value_type value_type;\n\n        //! Return reference to associated value in hash table.\n        reference operator*() const {\n            __TBB_ASSERT( this->my_node, \"attempt to dereference empty accessor\" );\n            return this->my_node->item;\n        }\n\n        //! Return pointer to associated value in hash table.\n        pointer operator->() const {\n            return &operator*();\n        }\n    };\n\n    //! Construct empty table.\n    concurrent_hash_map( const allocator_type &a = allocator_type() )\n        : internal::hash_map_base(), my_allocator(a)\n    {}\n\n    //! Construct empty table with n preallocated buckets. This number serves also as initial concurrency level.\n    concurrent_hash_map( size_type n, const allocator_type &a = allocator_type() )\n        : my_allocator(a)\n    {\n        reserve( n );\n    }\n\n    //! Copy constructor\n    concurrent_hash_map( const concurrent_hash_map &table, const allocator_type &a = allocator_type() )\n        : internal::hash_map_base(), my_allocator(a)\n    {\n        internal_copy(table);\n    }\n\n#if __TBB_CPP11_RVALUE_REF_PRESENT\n    //! Move constructor\n    concurrent_hash_map( concurrent_hash_map &&table )\n        : internal::hash_map_base(), my_allocator(std::move(table.get_allocator()))\n    {\n        swap(table);\n    }\n\n    //! Move constructor \n    concurrent_hash_map( concurrent_hash_map &&table, const allocator_type &a )\n        : internal::hash_map_base(), my_allocator(a)\n    {\n        if (a == table.get_allocator()){\n            this->swap(table);\n        }else{\n            call_clear_on_leave scope_guard(this);\n            internal_copy(std::make_move_iterator(table.begin()), std::make_move_iterator(table.end()));\n            scope_guard.dismiss();\n        }\n    }\n#endif //__TBB_CPP11_RVALUE_REF_PRESENT\n\n    //! Construction with copying iteration range and given allocator instance\n    template<typename I>\n    concurrent_hash_map( I first, I last, const allocator_type &a = allocator_type() )\n        : my_allocator(a)\n    {\n        reserve( std::distance(first, last) ); // TODO: load_factor?\n        internal_copy(first, last);\n    }\n\n#if __TBB_INITIALIZER_LISTS_PRESENT\n    //! Construct empty table with n preallocated buckets. This number serves also as initial concurrency level.\n    concurrent_hash_map( std::initializer_list<value_type> il, const allocator_type &a = allocator_type() )\n        : my_allocator(a)\n    {\n        reserve(il.size());\n        internal_copy(il.begin(), il.end());\n    }\n\n#endif //__TBB_INITIALIZER_LISTS_PRESENT\n\n    //! Assignment\n    concurrent_hash_map& operator=( const concurrent_hash_map &table ) {\n        if( this!=&table ) {\n            clear();\n            internal_copy(table);\n        }\n        return *this;\n    }\n\n#if __TBB_CPP11_RVALUE_REF_PRESENT\n    //! Move Assignment\n    concurrent_hash_map& operator=( concurrent_hash_map &&table ) {\n        if(this != &table){\n            typedef typename tbb::internal::allocator_traits<allocator_type>::propagate_on_container_move_assignment pocma_t;\n            if(pocma_t::value || this->my_allocator == table.my_allocator) {\n                concurrent_hash_map trash (std::move(*this));\n                //TODO: swapping allocators here may be a problem, replace with single direction moving iff pocma is set\n                this->swap(table);\n            } else {\n                //do per element move\n                concurrent_hash_map moved_copy(std::move(table), this->my_allocator);\n                this->swap(moved_copy);\n            }\n        }\n        return *this;\n    }\n#endif //__TBB_CPP11_RVALUE_REF_PRESENT\n\n#if __TBB_INITIALIZER_LISTS_PRESENT\n    //! Assignment\n    concurrent_hash_map& operator=( std::initializer_list<value_type> il ) {\n        clear();\n        reserve(il.size());\n        internal_copy(il.begin(), il.end());\n        return *this;\n    }\n#endif //__TBB_INITIALIZER_LISTS_PRESENT\n\n\n    //! Rehashes and optionally resizes the whole table.\n    /** Useful to optimize performance before or after concurrent operations.\n        Also enables using of find() and count() concurrent methods in serial context. */\n    void rehash(size_type n = 0);\n\n    //! Clear table\n    void clear();\n\n    //! Clear table and destroy it.\n    ~concurrent_hash_map() { clear(); }\n\n    //------------------------------------------------------------------------\n    // Parallel algorithm support\n    //------------------------------------------------------------------------\n    range_type range( size_type grainsize=1 ) {\n        return range_type( *this, grainsize );\n    }\n    const_range_type range( size_type grainsize=1 ) const {\n        return const_range_type( *this, grainsize );\n    }\n\n    //------------------------------------------------------------------------\n    // STL support - not thread-safe methods\n    //------------------------------------------------------------------------\n    iterator begin() { return iterator( *this, 0, my_embedded_segment, my_embedded_segment->node_list ); }\n    iterator end() { return iterator( *this, 0, 0, 0 ); }\n    const_iterator begin() const { return const_iterator( *this, 0, my_embedded_segment, my_embedded_segment->node_list ); }\n    const_iterator end() const { return const_iterator( *this, 0, 0, 0 ); }\n    std::pair<iterator, iterator> equal_range( const Key& key ) { return internal_equal_range( key, end() ); }\n    std::pair<const_iterator, const_iterator> equal_range( const Key& key ) const { return internal_equal_range( key, end() ); }\n\n    //! Number of items in table.\n    size_type size() const { return my_size; }\n\n    //! True if size()==0.\n    bool empty() const { return my_size == 0; }\n\n    //! Upper bound on size.\n    size_type max_size() const {return (~size_type(0))/sizeof(node);}\n\n    //! Returns the current number of buckets\n    size_type bucket_count() const { return my_mask+1; }\n\n    //! return allocator object\n    allocator_type get_allocator() const { return this->my_allocator; }\n\n    //! swap two instances. Iterators are invalidated\n    void swap( concurrent_hash_map &table );\n\n    //------------------------------------------------------------------------\n    // concurrent map operations\n    //------------------------------------------------------------------------\n\n    //! Return count of items (0 or 1)\n    size_type count( const Key &key ) const {\n        return const_cast<concurrent_hash_map*>(this)->lookup(/*insert*/false, key, NULL, NULL, /*write=*/false, &do_not_allocate_node );\n    }\n\n    //! Find item and acquire a read lock on the item.\n    /** Return true if item is found, false otherwise. */\n    bool find( const_accessor &result, const Key &key ) const {\n        result.release();\n        return const_cast<concurrent_hash_map*>(this)->lookup(/*insert*/false, key, NULL, &result, /*write=*/false, &do_not_allocate_node );\n    }\n\n    //! Find item and acquire a write lock on the item.\n    /** Return true if item is found, false otherwise. */\n    bool find( accessor &result, const Key &key ) {\n        result.release();\n        return lookup(/*insert*/false, key, NULL, &result, /*write=*/true, &do_not_allocate_node );\n    }\n\n    //! Insert item (if not already present) and acquire a read lock on the item.\n    /** Returns true if item is new. */\n    bool insert( const_accessor &result, const Key &key ) {\n        result.release();\n        return lookup(/*insert*/true, key, NULL, &result, /*write=*/false, &allocate_node_default_construct );\n    }\n\n    //! Insert item (if not already present) and acquire a write lock on the item.\n    /** Returns true if item is new. */\n    bool insert( accessor &result, const Key &key ) {\n        result.release();\n        return lookup(/*insert*/true, key, NULL, &result, /*write=*/true, &allocate_node_default_construct );\n    }\n\n    //! Insert item by copying if there is no such key present already and acquire a read lock on the item.\n    /** Returns true if item is new. */\n    bool insert( const_accessor &result, const value_type &value ) {\n        result.release();\n        return lookup(/*insert*/true, value.first, &value.second, &result, /*write=*/false, &allocate_node_copy_construct );\n    }\n\n    //! Insert item by copying if there is no such key present already and acquire a write lock on the item.\n    /** Returns true if item is new. */\n    bool insert( accessor &result, const value_type &value ) {\n        result.release();\n        return lookup(/*insert*/true, value.first, &value.second, &result, /*write=*/true, &allocate_node_copy_construct );\n    }\n\n    //! Insert item by copying if there is no such key present already\n    /** Returns true if item is inserted. */\n    bool insert( const value_type &value ) {\n        return lookup(/*insert*/true, value.first, &value.second, NULL, /*write=*/false, &allocate_node_copy_construct );\n    }\n\n    //! Insert range [first, last)\n    template<typename I>\n    void insert( I first, I last ) {\n        for ( ; first != last; ++first )\n            insert( *first );\n    }\n\n#if __TBB_INITIALIZER_LISTS_PRESENT\n    //! Insert initializer list\n    void insert( std::initializer_list<value_type> il ) {\n        insert( il.begin(), il.end() );\n    }\n#endif //__TBB_INITIALIZER_LISTS_PRESENT\n\n    //! Erase item.\n    /** Return true if item was erased by particularly this call. */\n    bool erase( const Key& key );\n\n    //! Erase item by const_accessor.\n    /** Return true if item was erased by particularly this call. */\n    bool erase( const_accessor& item_accessor ) {\n        return exclude( item_accessor );\n    }\n\n    //! Erase item by accessor.\n    /** Return true if item was erased by particularly this call. */\n    bool erase( accessor& item_accessor ) {\n        return exclude( item_accessor );\n    }\n\nprotected:\n    //! Insert or find item and optionally acquire a lock on the item.\n    bool lookup(bool op_insert, const Key &key, const T *t, const_accessor *result, bool write,  node* (*allocate_node)(node_allocator_type& ,  const Key &, const T * )  ) ;\n\n    //! delete item by accessor\n    bool exclude( const_accessor &item_accessor );\n\n    //! Returns an iterator for an item defined by the key, or for the next item after it (if upper==true)\n    template<typename I>\n    std::pair<I, I> internal_equal_range( const Key& key, I end ) const;\n\n    //! Copy \"source\" to *this, where *this must start out empty.\n    void internal_copy( const concurrent_hash_map& source );\n\n    template<typename I>\n    void internal_copy( I first, I last );\n\n    //! Fast find when no concurrent erasure is used. For internal use inside TBB only!\n    /** Return pointer to item with given key, or NULL if no such item exists.\n        Must not be called concurrently with erasure operations. */\n    const_pointer internal_fast_find( const Key& key ) const {\n        hashcode_t h = my_hash_compare.hash( key );\n        hashcode_t m = (hashcode_t) itt_load_word_with_acquire( my_mask );\n        node *n;\n    restart:\n        __TBB_ASSERT((m&(m+1))==0, \"data structure is invalid\");\n        bucket *b = get_bucket( h & m );\n        // TODO: actually, notification is unnecessary here, just hiding double-check\n        if( itt_load_word_with_acquire(b->node_list) == internal::rehash_req )\n        {\n            bucket::scoped_t lock;\n            if( lock.try_acquire( b->mutex, /*write=*/true ) ) {\n                if( b->node_list == internal::rehash_req)\n                    const_cast<concurrent_hash_map*>(this)->rehash_bucket( b, h & m ); //recursive rehashing\n            }\n            else lock.acquire( b->mutex, /*write=*/false );\n            __TBB_ASSERT(b->node_list!=internal::rehash_req,NULL);\n        }\n        n = search_bucket( key, b );\n        if( n )\n            return &n->item;\n        else if( check_mask_race( h, m ) )\n            goto restart;\n        return 0;\n    }\n};\n\ntemplate<typename Key, typename T, typename HashCompare, typename A>\nbool concurrent_hash_map<Key,T,HashCompare,A>::lookup( bool op_insert, const Key &key, const T *t, const_accessor *result, bool write, node* (*allocate_node)(node_allocator_type& , const Key&, const T*) ) {\n    __TBB_ASSERT( !result || !result->my_node, NULL );\n    bool return_value;\n    hashcode_t const h = my_hash_compare.hash( key );\n    hashcode_t m = (hashcode_t) itt_load_word_with_acquire( my_mask );\n    segment_index_t grow_segment = 0;\n    node *n, *tmp_n = 0;\n    restart:\n    {//lock scope\n        __TBB_ASSERT((m&(m+1))==0, \"data structure is invalid\");\n        return_value = false;\n        // get bucket\n        bucket_accessor b( this, h & m );\n\n        // find a node\n        n = search_bucket( key, b() );\n        if( op_insert ) {\n            // [opt] insert a key\n            if( !n ) {\n                if( !tmp_n ) {\n                    tmp_n = allocate_node(my_allocator, key, t);\n                }\n                if( !b.is_writer() && !b.upgrade_to_writer() ) { // TODO: improved insertion\n                    // Rerun search_list, in case another thread inserted the item during the upgrade.\n                    n = search_bucket( key, b() );\n                    if( is_valid(n) ) { // unfortunately, it did\n                        b.downgrade_to_reader();\n                        goto exists;\n                    }\n                }\n                if( check_mask_race(h, m) )\n                    goto restart; // b.release() is done in ~b().\n                // insert and set flag to grow the container\n                grow_segment = insert_new_node( b(), n = tmp_n, m );\n                tmp_n = 0;\n                return_value = true;\n            }\n        } else { // find or count\n            if( !n ) {\n                if( check_mask_race( h, m ) )\n                    goto restart; // b.release() is done in ~b(). TODO: replace by continue\n                return false;\n            }\n            return_value = true;\n        }\n    exists:\n        if( !result ) goto check_growth;\n        // TODO: the following seems as generic/regular operation\n        // acquire the item\n        if( !result->try_acquire( n->mutex, write ) ) {\n            for( tbb::internal::atomic_backoff backoff(true);; ) {\n                if( result->try_acquire( n->mutex, write ) ) break;\n                if( !backoff.bounded_pause() ) {\n                    // the wait takes really long, restart the operation\n                    b.release();\n                    __TBB_ASSERT( !op_insert || !return_value, \"Can't acquire new item in locked bucket?\" );\n                    __TBB_Yield();\n                    m = (hashcode_t) itt_load_word_with_acquire( my_mask );\n                    goto restart;\n                }\n            }\n        }\n    }//lock scope\n    result->my_node = n;\n    result->my_hash = h;\ncheck_growth:\n    // [opt] grow the container\n    if( grow_segment ) {\n#if __TBB_STATISTICS\n        my_info_resizes++; // concurrent ones\n#endif\n        enable_segment( grow_segment );\n    }\n    if( tmp_n ) // if op_insert only\n        delete_node( tmp_n );\n    return return_value;\n}\n\ntemplate<typename Key, typename T, typename HashCompare, typename A>\ntemplate<typename I>\nstd::pair<I, I> concurrent_hash_map<Key,T,HashCompare,A>::internal_equal_range( const Key& key, I end_ ) const {\n    hashcode_t h = my_hash_compare.hash( key );\n    hashcode_t m = my_mask;\n    __TBB_ASSERT((m&(m+1))==0, \"data structure is invalid\");\n    h &= m;\n    bucket *b = get_bucket( h );\n    while( b->node_list == internal::rehash_req ) {\n        m = ( 1u<<__TBB_Log2( h ) ) - 1; // get parent mask from the topmost bit\n        b = get_bucket( h &= m );\n    }\n    node *n = search_bucket( key, b );\n    if( !n )\n        return std::make_pair(end_, end_);\n    iterator lower(*this, h, b, n), upper(lower);\n    return std::make_pair(lower, ++upper);\n}\n\ntemplate<typename Key, typename T, typename HashCompare, typename A>\nbool concurrent_hash_map<Key,T,HashCompare,A>::exclude( const_accessor &item_accessor ) {\n    __TBB_ASSERT( item_accessor.my_node, NULL );\n    node_base *const n = item_accessor.my_node;\n    hashcode_t const h = item_accessor.my_hash;\n    hashcode_t m = (hashcode_t) itt_load_word_with_acquire( my_mask );\n    do {\n        // get bucket\n        bucket_accessor b( this, h & m, /*writer=*/true );\n        node_base **p = &b()->node_list;\n        while( *p && *p != n )\n            p = &(*p)->next;\n        if( !*p ) { // someone else was first\n            if( check_mask_race( h, m ) )\n                continue;\n            item_accessor.release();\n            return false;\n        }\n        __TBB_ASSERT( *p == n, NULL );\n        *p = n->next; // remove from container\n        my_size--;\n        break;\n    } while(true);\n    if( !item_accessor.is_writer() ) // need to get exclusive lock\n        item_accessor.upgrade_to_writer(); // return value means nothing here\n    item_accessor.release();\n    delete_node( n ); // Only one thread can delete it\n    return true;\n}\n\ntemplate<typename Key, typename T, typename HashCompare, typename A>\nbool concurrent_hash_map<Key,T,HashCompare,A>::erase( const Key &key ) {\n    node_base *n;\n    hashcode_t const h = my_hash_compare.hash( key );\n    hashcode_t m = (hashcode_t) itt_load_word_with_acquire( my_mask );\nrestart:\n    {//lock scope\n        // get bucket\n        bucket_accessor b( this, h & m );\n    search:\n        node_base **p = &b()->node_list;\n        n = *p;\n        while( is_valid(n) && !my_hash_compare.equal(key, static_cast<node*>(n)->item.first ) ) {\n            p = &n->next;\n            n = *p;\n        }\n        if( !n ) { // not found, but mask could be changed\n            if( check_mask_race( h, m ) )\n                goto restart;\n            return false;\n        }\n        else if( !b.is_writer() && !b.upgrade_to_writer() ) {\n            if( check_mask_race( h, m ) ) // contended upgrade, check mask\n                goto restart;\n            goto search;\n        }\n        *p = n->next;\n        my_size--;\n    }\n    {\n        typename node::scoped_t item_locker( n->mutex, /*write=*/true );\n    }\n    // note: there should be no threads pretending to acquire this mutex again, do not try to upgrade const_accessor!\n    delete_node( n ); // Only one thread can delete it due to write lock on the bucket\n    return true;\n}\n\ntemplate<typename Key, typename T, typename HashCompare, typename A>\nvoid concurrent_hash_map<Key,T,HashCompare,A>::swap(concurrent_hash_map<Key,T,HashCompare,A> &table) {\n    //TODO: respect C++11 allocator_traits<A>::propogate_on_constainer_swap\n    using std::swap;\n    swap(this->my_allocator, table.my_allocator);\n    swap(this->my_hash_compare, table.my_hash_compare);\n    internal_swap(table);\n}\n\ntemplate<typename Key, typename T, typename HashCompare, typename A>\nvoid concurrent_hash_map<Key,T,HashCompare,A>::rehash(size_type sz) {\n    reserve( sz ); // TODO: add reduction of number of buckets as well\n    hashcode_t mask = my_mask;\n    hashcode_t b = (mask+1)>>1; // size or first index of the last segment\n    __TBB_ASSERT((b&(b-1))==0, NULL); // zero or power of 2\n    bucket *bp = get_bucket( b ); // only the last segment should be scanned for rehashing\n    for(; b <= mask; b++, bp++ ) {\n        node_base *n = bp->node_list;\n        __TBB_ASSERT( is_valid(n) || n == internal::empty_rehashed || n == internal::rehash_req, \"Broken internal structure\" );\n        __TBB_ASSERT( *reinterpret_cast<intptr_t*>(&bp->mutex) == 0, \"concurrent or unexpectedly terminated operation during rehash() execution\" );\n        if( n == internal::rehash_req ) { // rehash bucket, conditional because rehashing of a previous bucket may affect this one\n            hashcode_t h = b; bucket *b_old = bp;\n            do {\n                __TBB_ASSERT( h > 1, \"The lowermost buckets can't be rehashed\" );\n                hashcode_t m = ( 1u<<__TBB_Log2( h ) ) - 1; // get parent mask from the topmost bit\n                b_old = get_bucket( h &= m );\n            } while( b_old->node_list == internal::rehash_req );\n            // now h - is index of the root rehashed bucket b_old\n            mark_rehashed_levels( h ); // mark all non-rehashed children recursively across all segments\n            for( node_base **p = &b_old->node_list, *q = *p; is_valid(q); q = *p ) {\n                hashcode_t c = my_hash_compare.hash( static_cast<node*>(q)->item.first );\n                if( (c & mask) != h ) { // should be rehashed\n                    *p = q->next; // exclude from b_old\n                    bucket *b_new = get_bucket( c & mask );\n                    __TBB_ASSERT( b_new->node_list != internal::rehash_req, \"hash() function changed for key in table or internal error\" );\n                    add_to_bucket( b_new, q );\n                } else p = &q->next; // iterate to next item\n            }\n        }\n    }\n#if TBB_USE_PERFORMANCE_WARNINGS\n    int current_size = int(my_size), buckets = int(mask)+1, empty_buckets = 0, overpopulated_buckets = 0; // usage statistics\n    static bool reported = false;\n#endif\n#if TBB_USE_ASSERT || TBB_USE_PERFORMANCE_WARNINGS\n    for( b = 0; b <= mask; b++ ) {// only last segment should be scanned for rehashing\n        if( b & (b-2) ) ++bp; // not the beginning of a segment\n        else bp = get_bucket( b );\n        node_base *n = bp->node_list;\n        __TBB_ASSERT( *reinterpret_cast<intptr_t*>(&bp->mutex) == 0, \"concurrent or unexpectedly terminated operation during rehash() execution\" );\n        __TBB_ASSERT( is_valid(n) || n == internal::empty_rehashed, \"Broken internal structure\" );\n#if TBB_USE_PERFORMANCE_WARNINGS\n        if( n == internal::empty_rehashed ) empty_buckets++;\n        else if( n->next ) overpopulated_buckets++;\n#endif\n#if TBB_USE_ASSERT\n        for( ; is_valid(n); n = n->next ) {\n            hashcode_t h = my_hash_compare.hash( static_cast<node*>(n)->item.first ) & mask;\n            __TBB_ASSERT( h == b, \"hash() function changed for key in table or internal error\" );\n        }\n#endif\n    }\n#endif // TBB_USE_ASSERT || TBB_USE_PERFORMANCE_WARNINGS\n#if TBB_USE_PERFORMANCE_WARNINGS\n    if( buckets > current_size) empty_buckets -= buckets - current_size;\n    else overpopulated_buckets -= current_size - buckets; // TODO: load_factor?\n    if( !reported && buckets >= 512 && ( 2*empty_buckets > current_size || 2*overpopulated_buckets > current_size ) ) {\n        tbb::internal::runtime_warning(\n            \"Performance is not optimal because the hash function produces bad randomness in lower bits in %s.\\nSize: %d  Empties: %d  Overlaps: %d\",\n            typeid(*this).name(), current_size, empty_buckets, overpopulated_buckets );\n        reported = true;\n    }\n#endif\n}\n\ntemplate<typename Key, typename T, typename HashCompare, typename A>\nvoid concurrent_hash_map<Key,T,HashCompare,A>::clear() {\n    hashcode_t m = my_mask;\n    __TBB_ASSERT((m&(m+1))==0, \"data structure is invalid\");\n#if TBB_USE_ASSERT || TBB_USE_PERFORMANCE_WARNINGS || __TBB_STATISTICS\n#if TBB_USE_PERFORMANCE_WARNINGS || __TBB_STATISTICS\n    int current_size = int(my_size), buckets = int(m)+1, empty_buckets = 0, overpopulated_buckets = 0; // usage statistics\n    static bool reported = false;\n#endif\n    bucket *bp = 0;\n    // check consistency\n    for( segment_index_t b = 0; b <= m; b++ ) {\n        if( b & (b-2) ) ++bp; // not the beginning of a segment\n        else bp = get_bucket( b );\n        node_base *n = bp->node_list;\n        __TBB_ASSERT( is_valid(n) || n == internal::empty_rehashed || n == internal::rehash_req, \"Broken internal structure\" );\n        __TBB_ASSERT( *reinterpret_cast<intptr_t*>(&bp->mutex) == 0, \"concurrent or unexpectedly terminated operation during clear() execution\" );\n#if TBB_USE_PERFORMANCE_WARNINGS || __TBB_STATISTICS\n        if( n == internal::empty_rehashed ) empty_buckets++;\n        else if( n == internal::rehash_req ) buckets--;\n        else if( n->next ) overpopulated_buckets++;\n#endif\n#if __TBB_EXTRA_DEBUG\n        for(; is_valid(n); n = n->next ) {\n            hashcode_t h = my_hash_compare.hash( static_cast<node*>(n)->item.first );\n            h &= m;\n            __TBB_ASSERT( h == b || get_bucket(h)->node_list == internal::rehash_req, \"hash() function changed for key in table or internal error\" );\n        }\n#endif\n    }\n#if TBB_USE_PERFORMANCE_WARNINGS || __TBB_STATISTICS\n#if __TBB_STATISTICS\n    printf( \"items=%d buckets: capacity=%d rehashed=%d empty=%d overpopulated=%d\"\n        \" concurrent: resizes=%u rehashes=%u restarts=%u\\n\",\n        current_size, int(m+1), buckets, empty_buckets, overpopulated_buckets,\n        unsigned(my_info_resizes), unsigned(my_info_rehashes), unsigned(my_info_restarts) );\n    my_info_resizes = 0; // concurrent ones\n    my_info_restarts = 0; // race collisions\n    my_info_rehashes = 0;  // invocations of rehash_bucket\n#endif\n    if( buckets > current_size) empty_buckets -= buckets - current_size;\n    else overpopulated_buckets -= current_size - buckets; // TODO: load_factor?\n    if( !reported && buckets >= 512 && ( 2*empty_buckets > current_size || 2*overpopulated_buckets > current_size ) ) {\n        tbb::internal::runtime_warning(\n            \"Performance is not optimal because the hash function produces bad randomness in lower bits in %s.\\nSize: %d  Empties: %d  Overlaps: %d\",\n            typeid(*this).name(), current_size, empty_buckets, overpopulated_buckets );\n        reported = true;\n    }\n#endif\n#endif//TBB_USE_ASSERT || TBB_USE_PERFORMANCE_WARNINGS || __TBB_STATISTICS\n    my_size = 0;\n    segment_index_t s = segment_index_of( m );\n    __TBB_ASSERT( s+1 == pointers_per_table || !my_table[s+1], \"wrong mask or concurrent grow\" );\n    cache_aligned_allocator<bucket> alloc;\n    do {\n        __TBB_ASSERT( is_valid( my_table[s] ), \"wrong mask or concurrent grow\" );\n        segment_ptr_t buckets_ptr = my_table[s];\n        size_type sz = segment_size( s ? s : 1 );\n        for( segment_index_t i = 0; i < sz; i++ )\n            for( node_base *n = buckets_ptr[i].node_list; is_valid(n); n = buckets_ptr[i].node_list ) {\n                buckets_ptr[i].node_list = n->next;\n                delete_node( n );\n            }\n        if( s >= first_block) // the first segment or the next\n            alloc.deallocate( buckets_ptr, sz );\n        else if( s == embedded_block && embedded_block != first_block )\n            alloc.deallocate( buckets_ptr, segment_size(first_block)-embedded_buckets );\n        if( s >= embedded_block ) my_table[s] = 0;\n    } while(s-- > 0);\n    my_mask = embedded_buckets - 1;\n}\n\ntemplate<typename Key, typename T, typename HashCompare, typename A>\nvoid concurrent_hash_map<Key,T,HashCompare,A>::internal_copy( const concurrent_hash_map& source ) {\n    reserve( source.my_size ); // TODO: load_factor?\n    hashcode_t mask = source.my_mask;\n    if( my_mask == mask ) { // optimized version\n        bucket *dst = 0, *src = 0;\n        bool rehash_required = false;\n        for( hashcode_t k = 0; k <= mask; k++ ) {\n            if( k & (k-2) ) ++dst,src++; // not the beginning of a segment\n            else { dst = get_bucket( k ); src = source.get_bucket( k ); }\n            __TBB_ASSERT( dst->node_list != internal::rehash_req, \"Invalid bucket in destination table\");\n            node *n = static_cast<node*>( src->node_list );\n            if( n == internal::rehash_req ) { // source is not rehashed, items are in previous buckets\n                rehash_required = true;\n                dst->node_list = internal::rehash_req;\n            } else for(; n; n = static_cast<node*>( n->next ) ) {\n                add_to_bucket( dst, new( my_allocator ) node(n->item.first, n->item.second) );\n                ++my_size; // TODO: replace by non-atomic op\n            }\n        }\n        if( rehash_required ) rehash();\n    } else internal_copy( source.begin(), source.end() );\n}\n\ntemplate<typename Key, typename T, typename HashCompare, typename A>\ntemplate<typename I>\nvoid concurrent_hash_map<Key,T,HashCompare,A>::internal_copy(I first, I last) {\n    hashcode_t m = my_mask;\n    for(; first != last; ++first) {\n        hashcode_t h = my_hash_compare.hash( (*first).first );\n        bucket *b = get_bucket( h & m );\n        __TBB_ASSERT( b->node_list != internal::rehash_req, \"Invalid bucket in destination table\");\n        node *n = new( my_allocator ) node(*first);\n        add_to_bucket( b, n );\n        ++my_size; // TODO: replace by non-atomic op\n    }\n}\n\n} // namespace interface5\n\nusing interface5::concurrent_hash_map;\n\n\ntemplate<typename Key, typename T, typename HashCompare, typename A1, typename A2>\ninline bool operator==(const concurrent_hash_map<Key, T, HashCompare, A1> &a, const concurrent_hash_map<Key, T, HashCompare, A2> &b) {\n    if(a.size() != b.size()) return false;\n    typename concurrent_hash_map<Key, T, HashCompare, A1>::const_iterator i(a.begin()), i_end(a.end());\n    typename concurrent_hash_map<Key, T, HashCompare, A2>::const_iterator j, j_end(b.end());\n    for(; i != i_end; ++i) {\n        j = b.equal_range(i->first).first;\n        if( j == j_end || !(i->second == j->second) ) return false;\n    }\n    return true;\n}\n\ntemplate<typename Key, typename T, typename HashCompare, typename A1, typename A2>\ninline bool operator!=(const concurrent_hash_map<Key, T, HashCompare, A1> &a, const concurrent_hash_map<Key, T, HashCompare, A2> &b)\n{    return !(a == b); }\n\ntemplate<typename Key, typename T, typename HashCompare, typename A>\ninline void swap(concurrent_hash_map<Key, T, HashCompare, A> &a, concurrent_hash_map<Key, T, HashCompare, A> &b)\n{    a.swap( b ); }\n\n#if _MSC_VER && !defined(__INTEL_COMPILER)\n    #pragma warning( pop )\n#endif // warning 4127 is back\n\n} // namespace tbb\n\n#endif /* __TBB_concurrent_hash_map_H */\n"
  },
  {
    "path": "benchmarks/tbb/concurrent_lru_cache.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_concurrent_lru_cache_H\n#define __TBB_concurrent_lru_cache_H\n\n#if ! TBB_PREVIEW_CONCURRENT_LRU_CACHE\n    #error Set TBB_PREVIEW_CONCURRENT_LRU_CACHE to include concurrent_lru_cache.h\n#endif\n\n#include <map>\n#include <list>\n\n#include \"tbb_stddef.h\"\n#include \"atomic.h\"\n#include \"internal/_aggregator_impl.h\"\n\nnamespace tbb{\nnamespace interface6 {\n\n\ntemplate <typename key_type, typename value_type, typename value_functor_type = value_type (*)(key_type) >\nclass concurrent_lru_cache : internal::no_assign{\nprivate:\n    typedef concurrent_lru_cache self_type;\n    typedef value_functor_type value_function_type;\n    typedef std::size_t ref_counter_type;\n    struct map_value_type;\n    typedef std::map<key_type, map_value_type> map_storage_type;\n    typedef std::list<typename map_storage_type::iterator> lru_list_type;\n    struct map_value_type {\n        value_type my_value;\n        ref_counter_type my_ref_counter;\n        typename lru_list_type::iterator my_lru_list_iterator;\n        bool my_is_ready;\n\n        map_value_type (value_type const& a_value,  ref_counter_type a_ref_counter,    typename lru_list_type::iterator a_lru_list_iterator, bool a_is_ready)\n            : my_value(a_value), my_ref_counter(a_ref_counter), my_lru_list_iterator (a_lru_list_iterator), my_is_ready(a_is_ready)\n        {}\n    };\n\n    class handle_object;\n\n    struct aggregator_operation;\n    typedef aggregator_operation aggregated_operation_type;\n    typedef tbb::internal::aggregating_functor<self_type,aggregated_operation_type> aggregator_function_type;\n    friend class tbb::internal::aggregating_functor<self_type,aggregated_operation_type>;\n    typedef tbb::internal::aggregator<aggregator_function_type, aggregated_operation_type> aggregator_type;\n\nprivate:\n    value_function_type my_value_function;\n    std::size_t const my_number_of_lru_history_items;\n    map_storage_type my_map_storage;\n    lru_list_type my_lru_list;\n    aggregator_type my_aggregator;\n\npublic:\n    typedef handle_object handle;\n\npublic:\n    concurrent_lru_cache(value_function_type f, std::size_t number_of_lru_history_items)\n        : my_value_function(f),my_number_of_lru_history_items(number_of_lru_history_items)\n    {\n        my_aggregator.initialize_handler(aggregator_function_type(this));\n    }\n\n    handle_object operator[](key_type k){\n        retrieve_aggregator_operation op(k);\n        my_aggregator.execute(&op);\n        if (op.is_new_value_needed()){\n             op.result().second.my_value = my_value_function(k);\n             __TBB_store_with_release(op.result().second.my_is_ready, true);\n        }else{\n            tbb::internal::spin_wait_while_eq(op.result().second.my_is_ready,false);\n        }\n        return handle_object(*this,op.result());\n    }\nprivate:\n    void signal_end_of_usage(typename map_storage_type::reference value_ref){\n        signal_end_of_usage_aggregator_operation op(value_ref);\n        my_aggregator.execute(&op);\n    }\n\nprivate:\n    struct handle_move_t:no_assign{\n        concurrent_lru_cache & my_cache_ref;\n        typename map_storage_type::reference my_map_record_ref;\n        handle_move_t(concurrent_lru_cache & cache_ref, typename map_storage_type::reference value_ref):my_cache_ref(cache_ref),my_map_record_ref(value_ref) {};\n    };\n    class handle_object {\n        concurrent_lru_cache * my_cache_pointer;\n        typename map_storage_type::reference my_map_record_ref;\n    public:\n        handle_object(concurrent_lru_cache & cache_ref, typename map_storage_type::reference value_ref):my_cache_pointer(&cache_ref), my_map_record_ref(value_ref) {}\n        handle_object(handle_move_t m):my_cache_pointer(&m.my_cache_ref), my_map_record_ref(m.my_map_record_ref){}\n        operator handle_move_t(){ return move(*this);}\n        value_type& value(){\n            __TBB_ASSERT(my_cache_pointer,\"get value from moved from object?\");\n            return my_map_record_ref.second.my_value;\n        }\n        ~handle_object(){\n            if (my_cache_pointer){\n                my_cache_pointer->signal_end_of_usage(my_map_record_ref);\n            }\n        }\n    private:\n        friend handle_move_t move(handle_object& h){\n            return handle_object::move(h);\n        }\n        static handle_move_t move(handle_object& h){\n            __TBB_ASSERT(h.my_cache_pointer,\"move from the same object twice ?\");\n            concurrent_lru_cache * cache_pointer = NULL;\n            std::swap(cache_pointer,h.my_cache_pointer);\n            return handle_move_t(*cache_pointer,h.my_map_record_ref);\n        }\n    private:\n        void operator=(handle_object&);\n#if __SUNPRO_CC\n    // Presumably due to a compiler error, private copy constructor\n    // breaks expressions like handle h = cache[key];\n    public:\n#endif\n        handle_object(handle_object &);\n    };\nprivate:\n    //TODO: looks like aggregator_operation is a perfect match for statically typed variant type\n    struct aggregator_operation : tbb::internal::aggregated_operation<aggregator_operation>{\n        enum e_op_type {op_retive, op_signal_end_of_usage};\n        //TODO: try to use pointer to function apply_visitor here\n        //TODO: try virtual functions and measure the difference\n        e_op_type my_operation_type;\n        aggregator_operation(e_op_type operation_type): my_operation_type(operation_type) {}\n        void cast_and_handle(self_type& container ){\n            if (my_operation_type==op_retive){\n                static_cast<retrieve_aggregator_operation*>(this)->handle(container);\n            }else{\n                static_cast<signal_end_of_usage_aggregator_operation*>(this)->handle(container);\n            }\n        }\n    };\n    struct retrieve_aggregator_operation : aggregator_operation, private internal::no_assign {\n        key_type my_key;\n        typename map_storage_type::pointer my_result_map_record_pointer;\n        bool my_is_new_value_needed;\n        retrieve_aggregator_operation(key_type key):aggregator_operation(aggregator_operation::op_retive),my_key(key),my_is_new_value_needed(false){}\n        void handle(self_type& container ){\n            my_result_map_record_pointer = & container.retrieve_serial(my_key,my_is_new_value_needed);\n        }\n        typename map_storage_type::reference result(){ return * my_result_map_record_pointer; }\n        bool is_new_value_needed(){return my_is_new_value_needed;}\n    };\n    struct signal_end_of_usage_aggregator_operation : aggregator_operation, private internal::no_assign {\n        typename map_storage_type::reference my_map_record_ref;\n        signal_end_of_usage_aggregator_operation(typename map_storage_type::reference map_record_ref):aggregator_operation(aggregator_operation::op_signal_end_of_usage),my_map_record_ref(map_record_ref){}\n        void handle(self_type& container ){\n            container.signal_end_of_usage_serial(my_map_record_ref);\n        }\n    };\n\nprivate:\n   void handle_operations(aggregator_operation* op_list){\n       while(op_list){\n           op_list->cast_and_handle(*this);\n           aggregator_operation* tmp = op_list;\n           op_list=op_list->next;\n           tbb::internal::itt_store_word_with_release(tmp->status, uintptr_t(1));\n       }\n   }\n\nprivate:\n   typename map_storage_type::reference retrieve_serial(key_type k, bool& is_new_value_needed){\n        typename map_storage_type::iterator it = my_map_storage.find(k);\n        if (it == my_map_storage.end()){\n            it = my_map_storage.insert(it,std::make_pair(k,map_value_type(value_type(),0,my_lru_list.end(),false)));\n            is_new_value_needed = true;\n        }else {\n            typename lru_list_type::iterator list_it = it->second.my_lru_list_iterator;\n            if (list_it!=my_lru_list.end()) {\n                __TBB_ASSERT(!it->second.my_ref_counter,\"item to be evicted should not have a live references\");\n                //item is going to be used. Therefore it is not a subject for eviction\n                //so - remove it from LRU history.\n                my_lru_list.erase(list_it);\n                it->second.my_lru_list_iterator= my_lru_list.end();\n            }\n        }\n        ++(it->second.my_ref_counter);\n        return *it;\n    }\n\n    void signal_end_of_usage_serial(typename map_storage_type::reference map_record_ref){\n        typename map_storage_type::iterator it = my_map_storage.find(map_record_ref.first);\n        __TBB_ASSERT(it!=my_map_storage.end(),\"cache should not return past-end iterators to outer world\");\n        __TBB_ASSERT(&(*it) == &map_record_ref,\"dangling reference has been returned to outside world? data race ?\");\n        __TBB_ASSERT( my_lru_list.end()== std::find(my_lru_list.begin(),my_lru_list.end(),it),\n                \"object in use should not be in list of unused objects \");\n        if (! --(it->second.my_ref_counter)){\n            //it was the last reference so put it to the LRU history\n            if (my_lru_list.size()>=my_number_of_lru_history_items){\n                //evict items in order to get a space\n                size_t number_of_elements_to_evict = 1 + my_lru_list.size() - my_number_of_lru_history_items;\n                for (size_t i=0; i<number_of_elements_to_evict; ++i){\n                    typename map_storage_type::iterator it_to_evict = my_lru_list.back();\n                    __TBB_ASSERT(!it_to_evict->second.my_ref_counter,\"item to be evicted should not have a live references\");\n                    my_lru_list.pop_back();\n                    my_map_storage.erase(it_to_evict);\n                }\n            }\n            my_lru_list.push_front(it);\n            it->second.my_lru_list_iterator = my_lru_list.begin();\n        }\n    }\n};\n} // namespace interface6\n\nusing interface6::concurrent_lru_cache;\n\n} // namespace tbb\n#endif //__TBB_concurrent_lru_cache_H\n"
  },
  {
    "path": "benchmarks/tbb/concurrent_monitor.cpp",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#include \"concurrent_monitor.h\"\n\nnamespace tbb {\nnamespace internal {\n\nvoid concurrent_monitor::thread_context::init() {\n    new (sema.begin()) binary_semaphore;\n    ready = true;\n}\n\nconcurrent_monitor::~concurrent_monitor() {\n    abort_all();\n    __TBB_ASSERT( waitset_ec.empty(), \"waitset not empty?\" );\n}\n\nvoid concurrent_monitor::prepare_wait( thread_context& thr, uintptr_t ctx ) {\n    if( !thr.ready )\n        thr.init();\n    // this is good place to pump previous spurious wakeup\n    else if( thr.spurious ) {\n        thr.spurious = false;\n        thr.semaphore().P();\n    }\n    thr.context = ctx;\n    thr.in_waitset = true;\n    {\n        tbb::spin_mutex::scoped_lock l( mutex_ec );\n        __TBB_store_relaxed( thr.epoch, __TBB_load_relaxed(epoch) );\n        waitset_ec.add( (waitset_t::node_t*)&thr );\n    }\n    atomic_fence();\n}\n\nvoid concurrent_monitor::cancel_wait( thread_context& thr ) {\n    // spurious wakeup will be pumped in the following prepare_wait()\n    thr.spurious = true;\n    // try to remove node from waitset\n    bool th_in_waitset = thr.in_waitset;\n    if( th_in_waitset ) {\n        tbb::spin_mutex::scoped_lock l( mutex_ec );\n        if (thr.in_waitset) {\n            // successfully removed from waitset,\n            // so there will be no spurious wakeup\n            thr.in_waitset = false;\n            thr.spurious = false;\n            waitset_ec.remove( (waitset_t::node_t&)thr );\n        }\n    }\n}\n\nvoid concurrent_monitor::notify_one_relaxed() {\n    if( waitset_ec.empty() )\n        return;\n    waitset_node_t* n;\n    const waitset_node_t* end = waitset_ec.end();\n    {\n        tbb::spin_mutex::scoped_lock l( mutex_ec );\n        __TBB_store_relaxed( epoch, __TBB_load_relaxed(epoch) + 1 );\n        n = waitset_ec.front();\n        if( n!=end ) {\n            waitset_ec.remove( *n );\n            to_thread_context(n)->in_waitset = false;\n        }\n    }\n    if( n!=end )\n        to_thread_context(n)->semaphore().V();\n}\n\nvoid concurrent_monitor::notify_all_relaxed() {\n    if( waitset_ec.empty() )\n        return;\n    dllist_t temp;\n    const waitset_node_t* end;\n    {\n        tbb::spin_mutex::scoped_lock l( mutex_ec );\n        __TBB_store_relaxed( epoch, __TBB_load_relaxed(epoch) + 1 );\n        waitset_ec.flush_to( temp );\n        end = temp.end();\n        for( waitset_node_t* n=temp.front(); n!=end; n=n->next )\n            to_thread_context(n)->in_waitset = false;\n    }\n    waitset_node_t* nxt;\n    for( waitset_node_t* n=temp.front(); n!=end; n=nxt ) {\n        nxt = n->next;\n        to_thread_context(n)->semaphore().V();\n    }\n#if TBB_USE_ASSERT\n    temp.clear();\n#endif\n}\n\nvoid concurrent_monitor::abort_all_relaxed() {\n    if( waitset_ec.empty() )\n        return;\n    dllist_t temp;\n    const waitset_node_t* end;\n    {\n        tbb::spin_mutex::scoped_lock l( mutex_ec );\n        __TBB_store_relaxed( epoch, __TBB_load_relaxed(epoch) + 1 );\n        waitset_ec.flush_to( temp );\n        end = temp.end();\n        for( waitset_node_t* n=temp.front(); n!=end; n=n->next )\n            to_thread_context(n)->in_waitset = false;\n    }\n    waitset_node_t* nxt;\n    for( waitset_node_t* n=temp.front(); n!=end; n=nxt ) {\n        nxt = n->next;\n        to_thread_context(n)->aborted = true;\n        to_thread_context(n)->semaphore().V();\n    }\n#if TBB_USE_ASSERT\n    temp.clear();\n#endif\n}\n\n} // namespace internal\n} // namespace tbb\n"
  },
  {
    "path": "benchmarks/tbb/concurrent_monitor.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_concurrent_monitor_H\n#define __TBB_concurrent_monitor_H\n\n#include \"tbb/tbb_stddef.h\"\n#include \"tbb/atomic.h\"\n#include \"tbb/spin_mutex.h\"\n#include \"tbb/tbb_exception.h\"\n#include \"tbb/aligned_space.h\"\n\n#include \"semaphore.h\"\n\nnamespace tbb {\nnamespace internal {\n\n//! Circular doubly-linked list with sentinel\n/** head.next points to the front and head.prev points to the back */\nclass circular_doubly_linked_list_with_sentinel : no_copy {\npublic:\n    struct node_t {\n        node_t* next;\n        node_t* prev;\n        explicit node_t() : next((node_t*)(uintptr_t)0xcdcdcdcd), prev((node_t*)(uintptr_t)0xcdcdcdcd) {}\n    };\n\n    // ctor\n    circular_doubly_linked_list_with_sentinel() {clear();}\n    // dtor\n    ~circular_doubly_linked_list_with_sentinel() {__TBB_ASSERT( head.next==&head && head.prev==&head, \"the list is not empty\" );}\n\n    inline size_t  size()  const {return count;}\n    inline bool    empty() const {return size()==0;}\n    inline node_t* front() const {return head.next;}\n    inline node_t* last()  const {return head.prev;}\n    inline node_t* begin() const {return front();}\n    inline const node_t* end() const {return &head;}\n\n    //! add to the back of the list\n    inline void add( node_t* n ) {\n        __TBB_store_relaxed(count, __TBB_load_relaxed(count) + 1);\n        n->prev = head.prev;\n        n->next = &head;\n        head.prev->next = n;\n        head.prev = n;\n    }\n\n    //! remove node 'n'\n    inline void remove( node_t& n ) {\n        __TBB_store_relaxed(count, __TBB_load_relaxed(count) - 1);\n        n.prev->next = n.next;\n        n.next->prev = n.prev;\n    }\n\n    //! move all elements to 'lst' and initialize the 'this' list\n    inline void flush_to( circular_doubly_linked_list_with_sentinel& lst ) {\n        if( const size_t l_count = __TBB_load_relaxed(count) ) {\n            __TBB_store_relaxed(lst.count, l_count);\n            lst.head.next = head.next;\n            lst.head.prev = head.prev;\n            head.next->prev = &lst.head;\n            head.prev->next = &lst.head;\n            clear();\n        }\n    }\n\n    void clear() {head.next = head.prev = &head; __TBB_store_relaxed(count, 0);}\nprivate:\n    __TBB_atomic size_t count;\n    node_t head;\n};\n\ntypedef circular_doubly_linked_list_with_sentinel waitset_t;\ntypedef circular_doubly_linked_list_with_sentinel dllist_t;\ntypedef circular_doubly_linked_list_with_sentinel::node_t waitset_node_t;\n\n//! concurrent_monitor\n/** fine-grained concurrent_monitor implementation */\nclass concurrent_monitor : no_copy {\npublic:\n    /** per-thread descriptor for concurrent_monitor */\n    class thread_context : waitset_node_t, no_copy {\n        friend class concurrent_monitor;\n    public:\n        thread_context() : spurious(false), aborted(false), ready(false), context(0) {\n            epoch = 0;\n            in_waitset = false;\n        }\n        ~thread_context() {\n            if (ready) {\n                if( spurious ) semaphore().P();\n                semaphore().~binary_semaphore();\n            }\n        }\n        binary_semaphore& semaphore() { return *sema.begin(); }\n    private:\n        //! The method for lazy initialization of the thread_context's semaphore.\n        //  Inlining of the method is undesirable, due to extra instructions for\n        //  exception support added at caller side.\n        __TBB_NOINLINE( void init() );\n        tbb::aligned_space<binary_semaphore> sema;\n        __TBB_atomic unsigned epoch;\n        tbb::atomic<bool> in_waitset;\n        bool  spurious;\n        bool  aborted;\n        bool  ready;\n        uintptr_t context;\n    };\n\n    //! ctor\n    concurrent_monitor() {__TBB_store_relaxed(epoch, 0);}\n\n    //! dtor\n    ~concurrent_monitor() ; \n\n    //! prepare wait by inserting 'thr' into the wait queue\n    void prepare_wait( thread_context& thr, uintptr_t ctx = 0 );\n\n    //! Commit wait if event count has not changed; otherwise, cancel wait.\n    /** Returns true if committed, false if canceled. */\n    inline bool commit_wait( thread_context& thr ) {\n        const bool do_it = thr.epoch == __TBB_load_relaxed(epoch);\n        // this check is just an optimization\n        if( do_it ) {\n            __TBB_ASSERT( thr.ready, \"use of commit_wait() without prior prepare_wait()\");\n            thr.semaphore().P();\n            __TBB_ASSERT( !thr.in_waitset, \"still in the queue?\" );\n            if( thr.aborted )\n                throw_exception( eid_user_abort );\n        } else {\n            cancel_wait( thr );\n        }\n        return do_it;\n    }\n    //! Cancel the wait. Removes the thread from the wait queue if not removed yet.\n    void cancel_wait( thread_context& thr );\n\n    //! Wait for a condition to be satisfied with waiting-on context\n    template<typename WaitUntil, typename Context>\n    void wait( WaitUntil until, Context on );\n\n    //! Notify one thread about the event\n    void notify_one() {atomic_fence(); notify_one_relaxed();}\n\n    //! Notify one thread about the event. Relaxed version.\n    void notify_one_relaxed();\n\n    //! Notify all waiting threads of the event\n    void notify_all() {atomic_fence(); notify_all_relaxed();}\n\n    //! Notify all waiting threads of the event; Relaxed version\n    void notify_all_relaxed();\n\n    //! Notify waiting threads of the event that satisfies the given predicate\n    template<typename P> void notify( const P& predicate ) {atomic_fence(); notify_relaxed( predicate );}\n\n    //! Notify waiting threads of the event that satisfies the given predicate; Relaxed version\n    template<typename P> void notify_relaxed( const P& predicate );\n\n    //! Abort any sleeping threads at the time of the call\n    void abort_all() {atomic_fence(); abort_all_relaxed(); }\n \n    //! Abort any sleeping threads at the time of the call; Relaxed version\n    void abort_all_relaxed();\n\nprivate:\n    tbb::spin_mutex mutex_ec;\n    waitset_t       waitset_ec;\n    __TBB_atomic unsigned epoch;\n    thread_context* to_thread_context( waitset_node_t* n ) { return static_cast<thread_context*>(n); }\n};\n\ntemplate<typename WaitUntil, typename Context>\nvoid concurrent_monitor::wait( WaitUntil until, Context on )\n{\n    bool slept = false;\n    thread_context thr_ctx;\n    prepare_wait( thr_ctx, on() );\n    while( !until() ) {\n        if( (slept = commit_wait( thr_ctx ) )==true )\n            if( until() ) break;\n        slept = false;\n        prepare_wait( thr_ctx, on() );\n    }\n    if( !slept )\n        cancel_wait( thr_ctx );\n}\n\ntemplate<typename P>\nvoid concurrent_monitor::notify_relaxed( const P& predicate ) {\n        if( waitset_ec.empty() )\n            return;\n        dllist_t temp;\n        waitset_node_t* nxt;\n        const waitset_node_t* end = waitset_ec.end();\n        {\n            tbb::spin_mutex::scoped_lock l( mutex_ec );\n            __TBB_store_relaxed(epoch, __TBB_load_relaxed(epoch) + 1);\n            for( waitset_node_t* n=waitset_ec.last(); n!=end; n=nxt ) {\n                nxt = n->prev;\n                thread_context* thr = to_thread_context( n );\n                if( predicate( thr->context ) ) {\n                    waitset_ec.remove( *n );\n                    thr->in_waitset = false;\n                    temp.add( n );\n                }\n            }\n        }\n\n        end = temp.end();\n        for( waitset_node_t* n=temp.front(); n!=end; n=nxt ) {\n            nxt = n->next;\n            to_thread_context(n)->semaphore().V();\n        }\n#if TBB_USE_ASSERT\n        temp.clear();\n#endif\n}\n\n} // namespace internal\n} // namespace tbb\n\n#endif /* __TBB_concurrent_monitor_H */\n"
  },
  {
    "path": "benchmarks/tbb/concurrent_priority_queue.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_concurrent_priority_queue_H\n#define __TBB_concurrent_priority_queue_H\n\n#include \"atomic.h\"\n#include \"cache_aligned_allocator.h\"\n#include \"tbb_exception.h\"\n#include \"tbb_stddef.h\"\n#include \"tbb_profiling.h\"\n#include \"internal/_aggregator_impl.h\"\n#include <vector>\n#include <iterator>\n#include <functional>\n\n#if __TBB_INITIALIZER_LISTS_PRESENT\n    #include <initializer_list>\n#endif\n\nnamespace tbb {\nnamespace interface5 {\n\nusing namespace tbb::internal;\n\n//! Concurrent priority queue\ntemplate <typename T, typename Compare=std::less<T>, typename A=cache_aligned_allocator<T> >\nclass concurrent_priority_queue {\n public:\n    //! Element type in the queue.\n    typedef T value_type;\n\n    //! Reference type\n    typedef T& reference;\n\n    //! Const reference type\n    typedef const T& const_reference;\n\n    //! Integral type for representing size of the queue.\n    typedef size_t size_type;\n\n    //! Difference type for iterator\n    typedef ptrdiff_t difference_type;\n\n    //! Allocator type\n    typedef A allocator_type;\n\n    //! Constructs a new concurrent_priority_queue with default capacity\n    explicit concurrent_priority_queue(const allocator_type& a = allocator_type()) : mark(0), my_size(0), data(a)\n    {\n        my_aggregator.initialize_handler(my_functor_t(this));\n    }\n\n    //! Constructs a new concurrent_priority_queue with init_sz capacity\n    explicit concurrent_priority_queue(size_type init_capacity, const allocator_type& a = allocator_type()) :\n        mark(0), my_size(0), data(a)\n    {\n        data.reserve(init_capacity);\n        my_aggregator.initialize_handler(my_functor_t(this));\n    }\n\n    //! [begin,end) constructor\n    template<typename InputIterator>\n    concurrent_priority_queue(InputIterator begin, InputIterator end, const allocator_type& a = allocator_type()) :\n        mark(0), data(begin, end, a)\n    {\n        my_aggregator.initialize_handler(my_functor_t(this));\n        heapify();\n        my_size = data.size();\n    }\n\n#if __TBB_INITIALIZER_LISTS_PRESENT\n    //! Constructor from std::initializer_list\n    concurrent_priority_queue(std::initializer_list<T> init_list, const allocator_type &a = allocator_type()) :\n        mark(0),data(init_list.begin(), init_list.end(), a)\n    {\n        my_aggregator.initialize_handler(my_functor_t(this));\n        heapify();\n        my_size = data.size();\n    }\n#endif //# __TBB_INITIALIZER_LISTS_PRESENT\n\n    //! Copy constructor\n    /** This operation is unsafe if there are pending concurrent operations on the src queue. */\n    explicit concurrent_priority_queue(const concurrent_priority_queue& src) : mark(src.mark),\n        my_size(src.my_size), data(src.data.begin(), src.data.end(), src.data.get_allocator())\n    {\n        my_aggregator.initialize_handler(my_functor_t(this));\n        heapify();\n    }\n\n    //! Copy constructor with specific allocator\n    /** This operation is unsafe if there are pending concurrent operations on the src queue. */\n    concurrent_priority_queue(const concurrent_priority_queue& src, const allocator_type& a) : mark(src.mark),\n        my_size(src.my_size), data(src.data.begin(), src.data.end(), a)\n    {\n        my_aggregator.initialize_handler(my_functor_t(this));\n        heapify();\n    }\n\n    //! Assignment operator\n    /** This operation is unsafe if there are pending concurrent operations on the src queue. */\n    concurrent_priority_queue& operator=(const concurrent_priority_queue& src) {\n        if (this != &src) {\n            vector_t(src.data.begin(), src.data.end(), src.data.get_allocator()).swap(data);\n            mark = src.mark;\n            my_size = src.my_size;\n        }\n        return *this;\n    }\n\n#if __TBB_CPP11_RVALUE_REF_PRESENT\n    //! Move constructor\n    /** This operation is unsafe if there are pending concurrent operations on the src queue. */\n    concurrent_priority_queue(concurrent_priority_queue&& src) : mark(src.mark),\n        my_size(src.my_size), data(std::move(src.data))\n    {\n        my_aggregator.initialize_handler(my_functor_t(this));\n    }\n\n    //! Move constructor with specific allocator\n    /** This operation is unsafe if there are pending concurrent operations on the src queue. */\n    concurrent_priority_queue(concurrent_priority_queue&& src, const allocator_type& a) : mark(src.mark),\n        my_size(src.my_size),\n#if __TBB_ALLOCATOR_TRAITS_PRESENT\n        data(std::move(src.data), a)\n#else\n    // Some early version of C++11 STL vector does not have a constructor of vector(vector&& , allocator).\n    // It seems that the reason is absence of support of allocator_traits (stateful allocators).\n        data(a)\n#endif //__TBB_ALLOCATOR_TRAITS_PRESENT\n    {\n        my_aggregator.initialize_handler(my_functor_t(this));\n#if !__TBB_ALLOCATOR_TRAITS_PRESENT\n        if (a != src.data.get_allocator()){\n            data.reserve(src.data.size());\n            data.assign(std::make_move_iterator(src.data.begin()), std::make_move_iterator(src.data.end()));\n        }else{\n            data = std::move(src.data);\n        }\n#endif //!__TBB_ALLOCATOR_TRAITS_PRESENT\n    }\n\n    //! Move assignment operator\n    /** This operation is unsafe if there are pending concurrent operations on the src queue. */\n    concurrent_priority_queue& operator=( concurrent_priority_queue&& src) {\n        if (this != &src) {\n            mark = src.mark;\n            my_size = src.my_size;\n#if !__TBB_ALLOCATOR_TRAITS_PRESENT\n            if (data.get_allocator() != src.data.get_allocator()){\n                vector_t(std::make_move_iterator(src.data.begin()), std::make_move_iterator(src.data.end()), data.get_allocator()).swap(data);\n            }else\n#endif //!__TBB_ALLOCATOR_TRAITS_PRESENT\n            {\n                data = std::move(src.data);\n            }\n        }\n        return *this;\n    }\n#endif //__TBB_CPP11_RVALUE_REF_PRESENT\n\n    //! Assign the queue from [begin,end) range, not thread-safe\n    template<typename InputIterator>\n    void assign(InputIterator begin, InputIterator end) {\n        vector_t(begin, end, data.get_allocator()).swap(data);\n        mark = 0;\n        my_size = data.size();\n        heapify();\n    }\n\n#if __TBB_INITIALIZER_LISTS_PRESENT\n    //! Assign the queue from std::initializer_list, not thread-safe\n    void assign(std::initializer_list<T> il) { this->assign(il.begin(), il.end()); }\n\n    //! Assign from std::initializer_list, not thread-safe\n    concurrent_priority_queue& operator=(std::initializer_list<T> il) {\n        this->assign(il.begin(), il.end());\n        return *this;\n    }\n#endif //# __TBB_INITIALIZER_LISTS_PRESENT\n\n    //! Returns true if empty, false otherwise\n    /** Returned value may not reflect results of pending operations.\n        This operation reads shared data and will trigger a race condition. */\n    bool empty() const { return size()==0; }\n\n    //! Returns the current number of elements contained in the queue\n    /** Returned value may not reflect results of pending operations.\n        This operation reads shared data and will trigger a race condition. */\n    size_type size() const { return __TBB_load_with_acquire(my_size); }\n\n    //! Pushes elem onto the queue, increasing capacity of queue if necessary\n    /** This operation can be safely used concurrently with other push, try_pop or emplace operations. */\n    void push(const_reference elem) {\n        cpq_operation op_data(elem, PUSH_OP);\n        my_aggregator.execute(&op_data);\n        if (op_data.status == FAILED) // exception thrown\n            throw_exception(eid_bad_alloc);\n    }\n\n#if __TBB_CPP11_RVALUE_REF_PRESENT\n    //! Pushes elem onto the queue, increasing capacity of queue if necessary\n    /** This operation can be safely used concurrently with other push, try_pop or emplace operations. */\n    void push(value_type &&elem) {\n        cpq_operation op_data(elem, PUSH_RVALUE_OP);\n        my_aggregator.execute(&op_data);\n        if (op_data.status == FAILED) // exception thrown\n            throw_exception(eid_bad_alloc);\n    }\n\n#if __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT\n    //! Constructs a new element using args as the arguments for its construction and pushes it onto the queue */\n    /** This operation can be safely used concurrently with other push, try_pop or emplace operations. */\n    template<typename... Args>\n    void emplace(Args&&... args) {\n        push(value_type(std::forward<Args>(args)...));\n    }\n#endif /* __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT */\n#endif /* __TBB_CPP11_RVALUE_REF_PRESENT */\n\n    //! Gets a reference to and removes highest priority element\n    /** If a highest priority element was found, sets elem and returns true,\n        otherwise returns false.\n        This operation can be safely used concurrently with other push, try_pop or emplace operations. */\n    bool try_pop(reference elem) {\n        cpq_operation op_data(POP_OP);\n        op_data.elem = &elem;\n        my_aggregator.execute(&op_data);\n        return op_data.status==SUCCEEDED;\n    }\n\n    //! Clear the queue; not thread-safe\n    /** This operation is unsafe if there are pending concurrent operations on the queue.\n        Resets size, effectively emptying queue; does not free space.\n        May not clear elements added in pending operations. */\n    void clear() {\n        data.clear();\n        mark = 0;\n        my_size = 0;\n    }\n\n    //! Swap this queue with another; not thread-safe\n    /** This operation is unsafe if there are pending concurrent operations on the queue. */\n    void swap(concurrent_priority_queue& q) {\n        using std::swap;\n        data.swap(q.data);\n        swap(mark, q.mark);\n        swap(my_size, q.my_size);\n    }\n\n    //! Return allocator object\n    allocator_type get_allocator() const { return data.get_allocator(); }\n\n private:\n    enum operation_type {INVALID_OP, PUSH_OP, POP_OP, PUSH_RVALUE_OP};\n    enum operation_status { WAIT=0, SUCCEEDED, FAILED };\n\n    class cpq_operation : public aggregated_operation<cpq_operation> {\n     public:\n        operation_type type;\n        union {\n            value_type *elem;\n            size_type sz;\n        };\n        cpq_operation(const_reference e, operation_type t) :\n            type(t), elem(const_cast<value_type*>(&e)) {}\n        cpq_operation(operation_type t) : type(t) {}\n    };\n\n    class my_functor_t {\n        concurrent_priority_queue<T, Compare, A> *cpq;\n     public:\n        my_functor_t() {}\n        my_functor_t(concurrent_priority_queue<T, Compare, A> *cpq_) : cpq(cpq_) {}\n        void operator()(cpq_operation* op_list) {\n            cpq->handle_operations(op_list);\n        }\n    };\n\n    typedef tbb::internal::aggregator< my_functor_t, cpq_operation > aggregator_t;\n    aggregator_t my_aggregator;\n    //! Padding added to avoid false sharing\n    char padding1[NFS_MaxLineSize - sizeof(aggregator_t)];\n    //! The point at which unsorted elements begin\n    size_type mark;\n    __TBB_atomic size_type my_size;\n    Compare compare;\n    //! Padding added to avoid false sharing\n    char padding2[NFS_MaxLineSize - (2*sizeof(size_type)) - sizeof(Compare)];\n    //! Storage for the heap of elements in queue, plus unheapified elements\n    /** data has the following structure:\n\n         binary unheapified\n          heap   elements\n        ____|_______|____\n        |       |       |\n        v       v       v\n        [_|...|_|_|...|_| |...| ]\n         0       ^       ^       ^\n                 |       |       |__capacity\n                 |       |__my_size\n                 |__mark\n\n        Thus, data stores the binary heap starting at position 0 through\n        mark-1 (it may be empty).  Then there are 0 or more elements\n        that have not yet been inserted into the heap, in positions\n        mark through my_size-1. */\n    typedef std::vector<value_type, allocator_type> vector_t;\n    vector_t data;\n\n    void handle_operations(cpq_operation *op_list) {\n        cpq_operation *tmp, *pop_list=NULL;\n\n        __TBB_ASSERT(mark == data.size(), NULL);\n\n        // First pass processes all constant (amortized; reallocation may happen) time pushes and pops.\n        while (op_list) {\n            // ITT note: &(op_list->status) tag is used to cover accesses to op_list\n            // node. This thread is going to handle the operation, and so will acquire it\n            // and perform the associated operation w/o triggering a race condition; the\n            // thread that created the operation is waiting on the status field, so when\n            // this thread is done with the operation, it will perform a\n            // store_with_release to give control back to the waiting thread in\n            // aggregator::insert_operation.\n            call_itt_notify(acquired, &(op_list->status));\n            __TBB_ASSERT(op_list->type != INVALID_OP, NULL);\n            tmp = op_list;\n            op_list = itt_hide_load_word(op_list->next);\n            if (tmp->type == POP_OP) {\n                if (mark < data.size() &&\n                    compare(data[0], data[data.size()-1])) {\n                    // there are newly pushed elems and the last one\n                    // is higher than top\n                    *(tmp->elem) = move(data[data.size()-1]);\n                    __TBB_store_with_release(my_size, my_size-1);\n                    itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));\n                    data.pop_back();\n                    __TBB_ASSERT(mark<=data.size(), NULL);\n                }\n                else { // no convenient item to pop; postpone\n                    itt_hide_store_word(tmp->next, pop_list);\n                    pop_list = tmp;\n                }\n            } else { // PUSH_OP or PUSH_RVALUE_OP\n                __TBB_ASSERT(tmp->type == PUSH_OP || tmp->type == PUSH_RVALUE_OP, \"Unknown operation\" );\n                __TBB_TRY{\n                    if (tmp->type == PUSH_OP) {\n                        data.push_back(*(tmp->elem));\n                    } else {\n                        data.push_back(move(*(tmp->elem)));\n                    }\n                    __TBB_store_with_release(my_size, my_size + 1);\n                    itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));\n                } __TBB_CATCH(...) {\n                    itt_store_word_with_release(tmp->status, uintptr_t(FAILED));\n                }\n            }\n        }\n\n        // second pass processes pop operations\n        while (pop_list) {\n            tmp = pop_list;\n            pop_list = itt_hide_load_word(pop_list->next);\n            __TBB_ASSERT(tmp->type == POP_OP, NULL);\n            if (data.empty()) {\n                itt_store_word_with_release(tmp->status, uintptr_t(FAILED));\n            }\n            else {\n                __TBB_ASSERT(mark<=data.size(), NULL);\n                if (mark < data.size() &&\n                    compare(data[0], data[data.size()-1])) {\n                    // there are newly pushed elems and the last one is\n                    // higher than top\n                    *(tmp->elem) = move(data[data.size()-1]);\n                    __TBB_store_with_release(my_size, my_size-1);\n                    itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));\n                    data.pop_back();\n                }\n                else { // extract top and push last element down heap\n                    *(tmp->elem) = move(data[0]);\n                    __TBB_store_with_release(my_size, my_size-1);\n                    itt_store_word_with_release(tmp->status, uintptr_t(SUCCEEDED));\n                    reheap();\n                }\n            }\n        }\n\n        // heapify any leftover pushed elements before doing the next\n        // batch of operations\n        if (mark<data.size()) heapify();\n        __TBB_ASSERT(mark == data.size(), NULL);\n    }\n\n    //! Merge unsorted elements into heap\n    void heapify() {\n        if (!mark && data.size()>0) mark = 1;\n        for (; mark<data.size(); ++mark) {\n            // for each unheapified element under size\n            size_type cur_pos = mark;\n            value_type to_place = move(data[mark]);\n            do { // push to_place up the heap\n                size_type parent = (cur_pos-1)>>1;\n                if (!compare(data[parent], to_place)) break;\n                data[cur_pos] = move(data[parent]);\n                cur_pos = parent;\n            } while( cur_pos );\n            data[cur_pos] = move(to_place);\n        }\n    }\n\n    //! Re-heapify after an extraction\n    /** Re-heapify by pushing last element down the heap from the root. */\n    void reheap() {\n        size_type cur_pos=0, child=1;\n\n        while (child < mark) {\n            size_type target = child;\n            if (child+1 < mark && compare(data[child], data[child+1]))\n                ++target;\n            // target now has the higher priority child\n            if (compare(data[target], data[data.size()-1])) break;\n            data[cur_pos] = move(data[target]);\n            cur_pos = target;\n            child = (cur_pos<<1)+1;\n        }\n        if (cur_pos != data.size()-1)\n            data[cur_pos] = move(data[data.size()-1]);\n        data.pop_back();\n        if (mark > data.size()) mark = data.size();\n    }\n};\n\n} // namespace interface5\n\nusing interface5::concurrent_priority_queue;\n\n} // namespace tbb\n\n#endif /* __TBB_concurrent_priority_queue_H */\n"
  },
  {
    "path": "benchmarks/tbb/concurrent_queue.cpp",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#include \"tbb/tbb_stddef.h\"\n#include \"tbb/tbb_machine.h\"\n#include \"tbb/tbb_exception.h\"\n// Define required to satisfy test in internal file.\n#define  __TBB_concurrent_queue_H\n#include \"tbb/internal/_concurrent_queue_impl.h\"\n#include \"concurrent_monitor.h\"\n#include \"itt_notify.h\"\n#include <new>\n\n#if !TBB_USE_EXCEPTIONS && _MSC_VER\n    // Suppress \"C++ exception handler used, but unwind semantics are not enabled\" warning in STL headers\n    #pragma warning (push)\n    #pragma warning (disable: 4530)\n#endif\n\n#include <cstring>   // for memset()\n\n#if !TBB_USE_EXCEPTIONS && _MSC_VER\n    #pragma warning (pop)\n#endif\n\nusing namespace std;\n\n#if defined(_MSC_VER) && defined(_Wp64)\n    // Workaround for overzealous compiler warnings in /Wp64 mode\n    #pragma warning (disable: 4267)\n#endif\n\n#define RECORD_EVENTS 0\n\n\nnamespace tbb {\n\nnamespace internal {\n\ntypedef concurrent_queue_base_v3 concurrent_queue_base;\n\ntypedef size_t ticket;\n\n//! A queue using simple locking.\n/** For efficiency, this class has no constructor.\n    The caller is expected to zero-initialize it. */\nstruct micro_queue {\n    typedef concurrent_queue_base::page page;\n\n    friend class micro_queue_pop_finalizer;\n\n    atomic<page*> head_page;\n    atomic<ticket> head_counter;\n\n    atomic<page*> tail_page;\n    atomic<ticket> tail_counter;\n\n    spin_mutex page_mutex;\n\n    void push( const void* item, ticket k, concurrent_queue_base& base,\n               concurrent_queue_base::copy_specifics op_type );\n\n    void abort_push( ticket k, concurrent_queue_base& base );\n\n    bool pop( void* dst, ticket k, concurrent_queue_base& base );\n\n    micro_queue& assign( const micro_queue& src, concurrent_queue_base& base,\n                         concurrent_queue_base::copy_specifics op_type );\n\n    page* make_copy ( concurrent_queue_base& base, const page* src_page, size_t begin_in_page,\n                      size_t end_in_page, ticket& g_index, concurrent_queue_base::copy_specifics op_type ) ;\n\n    void make_invalid( ticket k );\n};\n\n// we need to yank it out of micro_queue because of concurrent_queue_base::deallocate_page being virtual.\nclass micro_queue_pop_finalizer: no_copy {\n    typedef concurrent_queue_base::page page;\n    ticket my_ticket;\n    micro_queue& my_queue;\n    page* my_page;\n    concurrent_queue_base &base;\npublic:\n    micro_queue_pop_finalizer( micro_queue& queue, concurrent_queue_base& b, ticket k, page* p ) :\n        my_ticket(k), my_queue(queue), my_page(p), base(b)\n    {}\n    ~micro_queue_pop_finalizer() {\n        page* p = my_page;\n        if( p ) {\n            spin_mutex::scoped_lock lock( my_queue.page_mutex );\n            page* q = p->next;\n            my_queue.head_page = q;\n            if( !q ) {\n                my_queue.tail_page = NULL;\n            }\n        }\n        my_queue.head_counter = my_ticket;\n        if( p )\n           base.deallocate_page( p );\n    }\n};\n\nstruct predicate_leq {\n    ticket t;\n    predicate_leq( ticket t_ ) : t(t_) {}\n    bool operator() ( uintptr_t p ) const {return (ticket)p<=t;}\n};\n\n//! Internal representation of a ConcurrentQueue.\n/** For efficiency, this class has no constructor.\n    The caller is expected to zero-initialize it. */\nclass concurrent_queue_rep {\npublic:\nprivate:\n    friend struct micro_queue;\n\n    //! Approximately n_queue/golden ratio\n    static const size_t phi = 3;\n\npublic:\n    //! Must be power of 2\n    static const size_t n_queue = 8;\n\n    //! Map ticket to an array index\n    static size_t index( ticket k ) {\n        return k*phi%n_queue;\n    }\n\n    atomic<ticket> head_counter;\n    concurrent_monitor items_avail;\n    atomic<size_t> n_invalid_entries;\n    char pad1[NFS_MaxLineSize-((sizeof(atomic<ticket>)+sizeof(concurrent_monitor)+sizeof(atomic<size_t>))&(NFS_MaxLineSize-1))];\n\n    atomic<ticket> tail_counter;\n    concurrent_monitor slots_avail;\n    char pad2[NFS_MaxLineSize-((sizeof(atomic<ticket>)+sizeof(concurrent_monitor))&(NFS_MaxLineSize-1))];\n    micro_queue array[n_queue];\n\n    micro_queue& choose( ticket k ) {\n        // The formula here approximates LRU in a cache-oblivious way.\n        return array[index(k)];\n    }\n\n    //! Value for effective_capacity that denotes unbounded queue.\n    static const ptrdiff_t infinite_capacity = ptrdiff_t(~size_t(0)/2);\n};\n\n#if _MSC_VER && !defined(__INTEL_COMPILER)\n    // unary minus operator applied to unsigned type, result still unsigned\n    #pragma warning( push )\n    #pragma warning( disable: 4146 )\n#endif\n\nstatic void* invalid_page;\n\n//------------------------------------------------------------------------\n// micro_queue\n//------------------------------------------------------------------------\nvoid micro_queue::push( const void* item, ticket k, concurrent_queue_base& base,\n                        concurrent_queue_base::copy_specifics op_type ) {\n    k &= -concurrent_queue_rep::n_queue;\n    page* p = NULL;\n    // find index on page where we would put the data\n    size_t index = modulo_power_of_two( k/concurrent_queue_rep::n_queue, base.items_per_page );\n    if( !index ) {  // make a new page\n        __TBB_TRY {\n            p = base.allocate_page();\n        } __TBB_CATCH(...) {\n            ++base.my_rep->n_invalid_entries;\n            make_invalid( k );\n        }\n        p->mask = 0;\n        p->next = NULL;\n    }\n\n    // wait for my turn\n    if( tail_counter!=k ) // The developer insisted on keeping first check out of the backoff loop\n        for( atomic_backoff b(true);;b.pause() ) {\n            ticket tail = tail_counter;\n            if( tail==k ) break;\n            else if( tail&0x1 ) {\n                // no memory. throws an exception; assumes concurrent_queue_rep::n_queue>1\n                ++base.my_rep->n_invalid_entries;\n                throw_exception( eid_bad_last_alloc );\n            }\n        }\n\n    if( p ) { // page is newly allocated; insert in micro_queue\n        spin_mutex::scoped_lock lock( page_mutex );\n        if( page* q = tail_page )\n            q->next = p;\n        else\n            head_page = p;\n        tail_page = p;\n    }\n\n    if (item) {\n        p = tail_page;\n        ITT_NOTIFY( sync_acquired, p );\n        __TBB_TRY {\n            if( concurrent_queue_base::copy == op_type ) {\n                base.copy_item( *p, index, item );\n            } else {\n                __TBB_ASSERT( concurrent_queue_base::move == op_type, NULL );\n                static_cast<concurrent_queue_base_v8&>(base).move_item( *p, index, item );\n            }\n        }  __TBB_CATCH(...) {\n            ++base.my_rep->n_invalid_entries;\n            tail_counter += concurrent_queue_rep::n_queue;\n            __TBB_RETHROW();\n        }\n        ITT_NOTIFY( sync_releasing, p );\n        // If no exception was thrown, mark item as present.\n        p->mask |= uintptr_t(1)<<index;\n    }\n    else // no item; this was called from abort_push\n        ++base.my_rep->n_invalid_entries;\n\n    tail_counter += concurrent_queue_rep::n_queue;\n}\n\n\nvoid micro_queue::abort_push( ticket k, concurrent_queue_base& base ) {\n    push(NULL, k, base, concurrent_queue_base::copy);\n}\n\nbool micro_queue::pop( void* dst, ticket k, concurrent_queue_base& base ) {\n    k &= -concurrent_queue_rep::n_queue;\n    spin_wait_until_eq( head_counter, k );\n    spin_wait_while_eq( tail_counter, k );\n    page& p = *head_page;\n    __TBB_ASSERT( &p, NULL );\n    size_t index = modulo_power_of_two( k/concurrent_queue_rep::n_queue, base.items_per_page );\n    bool success = false;\n    {\n        micro_queue_pop_finalizer finalizer( *this, base, k+concurrent_queue_rep::n_queue, index==base.items_per_page-1 ? &p : NULL );\n        if( p.mask & uintptr_t(1)<<index ) {\n            success = true;\n            ITT_NOTIFY( sync_acquired, dst );\n            ITT_NOTIFY( sync_acquired, head_page );\n            base.assign_and_destroy_item( dst, p, index );\n            ITT_NOTIFY( sync_releasing, head_page );\n        } else {\n            --base.my_rep->n_invalid_entries;\n        }\n    }\n    return success;\n}\n\nmicro_queue& micro_queue::assign( const micro_queue& src, concurrent_queue_base& base,\n                                  concurrent_queue_base::copy_specifics op_type )\n{\n    head_counter = src.head_counter;\n    tail_counter = src.tail_counter;\n\n    const page* srcp = src.head_page;\n    if( srcp ) {\n        ticket g_index = head_counter;\n        __TBB_TRY {\n            size_t n_items  = (tail_counter-head_counter)/concurrent_queue_rep::n_queue;\n            size_t index = modulo_power_of_two( head_counter/concurrent_queue_rep::n_queue, base.items_per_page );\n            size_t end_in_first_page = (index+n_items<base.items_per_page)?(index+n_items):base.items_per_page;\n\n            head_page = make_copy( base, srcp, index, end_in_first_page, g_index, op_type );\n            page* cur_page = head_page;\n\n            if( srcp != src.tail_page ) {\n                for( srcp = srcp->next; srcp!=src.tail_page; srcp=srcp->next ) {\n                    cur_page->next = make_copy( base, srcp, 0, base.items_per_page, g_index, op_type );\n                    cur_page = cur_page->next;\n                }\n\n                __TBB_ASSERT( srcp==src.tail_page, NULL );\n\n                size_t last_index = modulo_power_of_two( tail_counter/concurrent_queue_rep::n_queue, base.items_per_page );\n                if( last_index==0 ) last_index = base.items_per_page;\n\n                cur_page->next = make_copy( base, srcp, 0, last_index, g_index, op_type );\n                cur_page = cur_page->next;\n            }\n            tail_page = cur_page;\n        } __TBB_CATCH(...) {\n            make_invalid( g_index );\n        }\n    } else {\n        head_page = tail_page = NULL;\n    }\n    return *this;\n}\n\nconcurrent_queue_base::page* micro_queue::make_copy( concurrent_queue_base& base,\n    const concurrent_queue_base::page* src_page, size_t begin_in_page, size_t end_in_page,\n    ticket& g_index, concurrent_queue_base::copy_specifics op_type )\n{\n    page* new_page = base.allocate_page();\n    new_page->next = NULL;\n    new_page->mask = src_page->mask;\n    for( ; begin_in_page!=end_in_page; ++begin_in_page, ++g_index )\n        if( new_page->mask & uintptr_t(1)<<begin_in_page )\n            if( concurrent_queue_base::copy == op_type ) {\n                base.copy_page_item( *new_page, begin_in_page, *src_page, begin_in_page );\n            } else {\n                __TBB_ASSERT( concurrent_queue_base::move == op_type, NULL );\n                static_cast<concurrent_queue_base_v8&>(base).move_page_item( *new_page, begin_in_page, *src_page, begin_in_page );\n            }\n    return new_page;\n}\n\nvoid micro_queue::make_invalid( ticket k )\n{\n    static concurrent_queue_base::page dummy = {static_cast<page*>((void*)1), 0};\n    // mark it so that no more pushes are allowed.\n    invalid_page = &dummy;\n    {\n        spin_mutex::scoped_lock lock( page_mutex );\n        tail_counter = k+concurrent_queue_rep::n_queue+1;\n        if( page* q = tail_page )\n            q->next = static_cast<page*>(invalid_page);\n        else\n            head_page = static_cast<page*>(invalid_page);\n        tail_page = static_cast<page*>(invalid_page);\n    }\n    __TBB_RETHROW();\n}\n\n#if _MSC_VER && !defined(__INTEL_COMPILER)\n    #pragma warning( pop )\n#endif // warning 4146 is back\n\n//------------------------------------------------------------------------\n// concurrent_queue_base\n//------------------------------------------------------------------------\nconcurrent_queue_base_v3::concurrent_queue_base_v3( size_t item_sz ) {\n    items_per_page = item_sz<=  8 ? 32 :\n                     item_sz<= 16 ? 16 :\n                     item_sz<= 32 ?  8 :\n                     item_sz<= 64 ?  4 :\n                     item_sz<=128 ?  2 :\n                     1;\n    my_capacity = size_t(-1)/(item_sz>1 ? item_sz : 2);\n    my_rep = cache_aligned_allocator<concurrent_queue_rep>().allocate(1);\n    __TBB_ASSERT( (size_t)my_rep % NFS_GetLineSize()==0, \"alignment error\" );\n    __TBB_ASSERT( (size_t)&my_rep->head_counter % NFS_GetLineSize()==0, \"alignment error\" );\n    __TBB_ASSERT( (size_t)&my_rep->tail_counter % NFS_GetLineSize()==0, \"alignment error\" );\n    __TBB_ASSERT( (size_t)&my_rep->array % NFS_GetLineSize()==0, \"alignment error\" );\n    memset(my_rep,0,sizeof(concurrent_queue_rep));\n    new ( &my_rep->items_avail ) concurrent_monitor();\n    new ( &my_rep->slots_avail ) concurrent_monitor();\n    this->item_size = item_sz;\n}\n\nconcurrent_queue_base_v3::~concurrent_queue_base_v3() {\n    size_t nq = my_rep->n_queue;\n    for( size_t i=0; i<nq; i++ )\n        __TBB_ASSERT( my_rep->array[i].tail_page==NULL, \"pages were not freed properly\" );\n    cache_aligned_allocator<concurrent_queue_rep>().deallocate(my_rep,1);\n}\n\nvoid concurrent_queue_base_v3::internal_push( const void* src ) {\n    internal_insert_item( src, copy );\n}\n\nvoid concurrent_queue_base_v8::internal_push_move( const void* src ) {\n   internal_insert_item( src, move );\n}\n\nvoid concurrent_queue_base_v3::internal_insert_item( const void* src, copy_specifics op_type ) {\n    concurrent_queue_rep& r = *my_rep;\n    ticket k = r.tail_counter++;\n    ptrdiff_t e = my_capacity;\n#if DO_ITT_NOTIFY\n    bool sync_prepare_done = false;\n#endif\n    if( (ptrdiff_t)(k-r.head_counter)>=e ) { // queue is full\n#if DO_ITT_NOTIFY\n        if( !sync_prepare_done ) {\n            ITT_NOTIFY( sync_prepare, &sync_prepare_done );\n            sync_prepare_done = true;\n        }\n#endif\n        bool slept = false;\n        concurrent_monitor::thread_context thr_ctx;\n        r.slots_avail.prepare_wait( thr_ctx, ((ptrdiff_t)(k-e)) );\n        while( (ptrdiff_t)(k-r.head_counter)>=const_cast<volatile ptrdiff_t&>(e = my_capacity) ) {\n            __TBB_TRY {\n                slept = r.slots_avail.commit_wait( thr_ctx );\n            } __TBB_CATCH( tbb::user_abort& ) {\n                r.choose(k).abort_push(k, *this);\n                __TBB_RETHROW();\n            } __TBB_CATCH(...) {\n                __TBB_RETHROW();\n            }\n            if (slept == true) break;\n            r.slots_avail.prepare_wait( thr_ctx, ((ptrdiff_t)(k-e)) );\n        }\n        if( !slept )\n            r.slots_avail.cancel_wait( thr_ctx );\n    }\n    ITT_NOTIFY( sync_acquired, &sync_prepare_done );\n    __TBB_ASSERT( (ptrdiff_t)(k-r.head_counter)<my_capacity, NULL);\n    r.choose( k ).push( src, k, *this, op_type );\n    r.items_avail.notify( predicate_leq(k) );\n}\n\nvoid concurrent_queue_base_v3::internal_pop( void* dst ) {\n    concurrent_queue_rep& r = *my_rep;\n    ticket k;\n#if DO_ITT_NOTIFY\n    bool sync_prepare_done = false;\n#endif\n    do {\n        k=r.head_counter++;\n        if ( (ptrdiff_t)(r.tail_counter-k)<=0 ) { // queue is empty\n#if DO_ITT_NOTIFY\n            if( !sync_prepare_done ) {\n                ITT_NOTIFY( sync_prepare, dst );\n                sync_prepare_done = true;\n            }\n#endif\n            bool slept = false;\n            concurrent_monitor::thread_context thr_ctx;\n            r.items_avail.prepare_wait( thr_ctx, k );\n            while( (ptrdiff_t)(r.tail_counter-k)<=0 ) {\n                __TBB_TRY {\n                    slept = r.items_avail.commit_wait( thr_ctx );\n                } __TBB_CATCH( tbb::user_abort& ) {\n                    r.head_counter--;\n                    __TBB_RETHROW();\n                } __TBB_CATCH(...) {\n                    __TBB_RETHROW();\n                }\n                if (slept == true) break;\n                r.items_avail.prepare_wait( thr_ctx, k );\n            }\n            if( !slept )\n                r.items_avail.cancel_wait( thr_ctx );\n        }\n        __TBB_ASSERT((ptrdiff_t)(r.tail_counter-k)>0, NULL);\n    } while( !r.choose(k).pop(dst,k,*this) );\n\n    // wake up a producer..\n    r.slots_avail.notify( predicate_leq(k) );\n}\n\nvoid concurrent_queue_base_v3::internal_abort() {\n    concurrent_queue_rep& r = *my_rep;\n    r.items_avail.abort_all();\n    r.slots_avail.abort_all();\n}\n\nbool concurrent_queue_base_v3::internal_pop_if_present( void* dst ) {\n    concurrent_queue_rep& r = *my_rep;\n    ticket k;\n    do {\n        k = r.head_counter;\n        for(;;) {\n            if( (ptrdiff_t)(r.tail_counter-k)<=0 ) {\n                // Queue is empty\n                return false;\n            }\n            // Queue had item with ticket k when we looked.  Attempt to get that item.\n            ticket tk=k;\n            k = r.head_counter.compare_and_swap( tk+1, tk );\n            if( k==tk )\n                break;\n            // Another thread snatched the item, retry.\n        }\n    } while( !r.choose( k ).pop( dst, k, *this ) );\n\n    r.slots_avail.notify( predicate_leq(k) );\n\n    return true;\n}\n\nbool concurrent_queue_base_v3::internal_push_if_not_full( const void* src ) {\n    return internal_insert_if_not_full( src, copy );\n}\n\nbool concurrent_queue_base_v8::internal_push_move_if_not_full( const void* src ) {\n    return internal_insert_if_not_full( src, move );\n}\n\nbool concurrent_queue_base_v3::internal_insert_if_not_full( const void* src, copy_specifics op_type ) {\n    concurrent_queue_rep& r = *my_rep;\n    ticket k = r.tail_counter;\n    for(;;) {\n        if( (ptrdiff_t)(k-r.head_counter)>=my_capacity ) {\n            // Queue is full\n            return false;\n        }\n        // Queue had empty slot with ticket k when we looked.  Attempt to claim that slot.\n        ticket tk=k;\n        k = r.tail_counter.compare_and_swap( tk+1, tk );\n        if( k==tk )\n            break;\n        // Another thread claimed the slot, so retry.\n    }\n    r.choose(k).push(src, k, *this, op_type);\n    r.items_avail.notify( predicate_leq(k) );\n    return true;\n}\n\nptrdiff_t concurrent_queue_base_v3::internal_size() const {\n    __TBB_ASSERT( sizeof(ptrdiff_t)<=sizeof(size_t), NULL );\n    return ptrdiff_t(my_rep->tail_counter-my_rep->head_counter-my_rep->n_invalid_entries);\n}\n\nbool concurrent_queue_base_v3::internal_empty() const {\n    ticket tc = my_rep->tail_counter;\n    ticket hc = my_rep->head_counter;\n    // if tc!=r.tail_counter, the queue was not empty at some point between the two reads.\n    return ( tc==my_rep->tail_counter && ptrdiff_t(tc-hc-my_rep->n_invalid_entries)<=0 );\n}\n\nvoid concurrent_queue_base_v3::internal_set_capacity( ptrdiff_t capacity, size_t /*item_sz*/ ) {\n    my_capacity = capacity<0 ? concurrent_queue_rep::infinite_capacity : capacity;\n}\n\nvoid concurrent_queue_base_v3::internal_finish_clear() {\n    size_t nq = my_rep->n_queue;\n    for( size_t i=0; i<nq; ++i ) {\n        page* tp = my_rep->array[i].tail_page;\n        __TBB_ASSERT( my_rep->array[i].head_page==tp, \"at most one page should remain\" );\n        if( tp!=NULL) {\n            if( tp!=invalid_page ) deallocate_page( tp );\n            my_rep->array[i].tail_page = NULL;\n        }\n    }\n}\n\nvoid concurrent_queue_base_v3::internal_throw_exception() const {\n    throw_exception( eid_bad_alloc );\n}\n\nvoid concurrent_queue_base_v3::internal_assign( const concurrent_queue_base& src, copy_specifics op_type ) {\n    items_per_page = src.items_per_page;\n    my_capacity = src.my_capacity;\n\n    // copy concurrent_queue_rep.\n    my_rep->head_counter = src.my_rep->head_counter;\n    my_rep->tail_counter = src.my_rep->tail_counter;\n    my_rep->n_invalid_entries = src.my_rep->n_invalid_entries;\n\n    // copy micro_queues\n    for( size_t i = 0; i<my_rep->n_queue; ++i )\n        my_rep->array[i].assign( src.my_rep->array[i], *this, op_type );\n\n    __TBB_ASSERT( my_rep->head_counter==src.my_rep->head_counter && my_rep->tail_counter==src.my_rep->tail_counter,\n            \"the source concurrent queue should not be concurrently modified.\" );\n}\n\nvoid concurrent_queue_base_v3::assign( const concurrent_queue_base& src ) {\n    internal_assign( src, copy );\n}\n\nvoid concurrent_queue_base_v8::move_content( concurrent_queue_base_v8& src ) {\n    internal_assign( src, move );\n}\n\n//------------------------------------------------------------------------\n// concurrent_queue_iterator_rep\n//------------------------------------------------------------------------\nclass concurrent_queue_iterator_rep: no_assign {\npublic:\n    ticket head_counter;\n    const concurrent_queue_base& my_queue;\n    const size_t offset_of_last;\n    concurrent_queue_base::page* array[concurrent_queue_rep::n_queue];\n    concurrent_queue_iterator_rep( const concurrent_queue_base& queue, size_t offset_of_last_ ) :\n        head_counter(queue.my_rep->head_counter),\n        my_queue(queue),\n        offset_of_last(offset_of_last_)\n    {\n        const concurrent_queue_rep& rep = *queue.my_rep;\n        for( size_t k=0; k<concurrent_queue_rep::n_queue; ++k )\n            array[k] = rep.array[k].head_page;\n    }\n    //! Set item to point to kth element.  Return true if at end of queue or item is marked valid; false otherwise.\n    bool get_item( void*& item, size_t k ) {\n        if( k==my_queue.my_rep->tail_counter ) {\n            item = NULL;\n            return true;\n        } else {\n            concurrent_queue_base::page* p = array[concurrent_queue_rep::index(k)];\n            __TBB_ASSERT(p,NULL);\n            size_t i = modulo_power_of_two( k/concurrent_queue_rep::n_queue, my_queue.items_per_page );\n            item = static_cast<unsigned char*>(static_cast<void*>(p)) + offset_of_last + my_queue.item_size*i;\n            return (p->mask & uintptr_t(1)<<i)!=0;\n        }\n    }\n};\n\n//------------------------------------------------------------------------\n// concurrent_queue_iterator_base\n//------------------------------------------------------------------------\n\nvoid concurrent_queue_iterator_base_v3::initialize( const concurrent_queue_base& queue, size_t offset_of_last ) {\n    my_rep = cache_aligned_allocator<concurrent_queue_iterator_rep>().allocate(1);\n    new( my_rep ) concurrent_queue_iterator_rep(queue,offset_of_last);\n    size_t k = my_rep->head_counter;\n    if( !my_rep->get_item(my_item, k) ) advance();\n}\n\nconcurrent_queue_iterator_base_v3::concurrent_queue_iterator_base_v3( const concurrent_queue_base& queue ) {\n    initialize(queue,0);\n}\n\nconcurrent_queue_iterator_base_v3::concurrent_queue_iterator_base_v3( const concurrent_queue_base& queue, size_t offset_of_last ) {\n    initialize(queue,offset_of_last);\n}\n\nvoid concurrent_queue_iterator_base_v3::assign( const concurrent_queue_iterator_base& other ) {\n    if( my_rep!=other.my_rep ) {\n        if( my_rep ) {\n            cache_aligned_allocator<concurrent_queue_iterator_rep>().deallocate(my_rep, 1);\n            my_rep = NULL;\n        }\n        if( other.my_rep ) {\n            my_rep = cache_aligned_allocator<concurrent_queue_iterator_rep>().allocate(1);\n            new( my_rep ) concurrent_queue_iterator_rep( *other.my_rep );\n        }\n    }\n    my_item = other.my_item;\n}\n\nvoid concurrent_queue_iterator_base_v3::advance() {\n    __TBB_ASSERT( my_item, \"attempt to increment iterator past end of queue\" );\n    size_t k = my_rep->head_counter;\n    const concurrent_queue_base& queue = my_rep->my_queue;\n#if TBB_USE_ASSERT\n    void* tmp;\n    my_rep->get_item(tmp,k);\n    __TBB_ASSERT( my_item==tmp, NULL );\n#endif /* TBB_USE_ASSERT */\n    size_t i = modulo_power_of_two( k/concurrent_queue_rep::n_queue, queue.items_per_page );\n    if( i==queue.items_per_page-1 ) {\n        concurrent_queue_base::page*& root = my_rep->array[concurrent_queue_rep::index(k)];\n        root = root->next;\n    }\n    // advance k\n    my_rep->head_counter = ++k;\n    if( !my_rep->get_item(my_item, k) ) advance();\n}\n\nconcurrent_queue_iterator_base_v3::~concurrent_queue_iterator_base_v3() {\n    //delete my_rep;\n    cache_aligned_allocator<concurrent_queue_iterator_rep>().deallocate(my_rep, 1);\n    my_rep = NULL;\n}\n\n} // namespace internal\n\n} // namespace tbb\n"
  },
  {
    "path": "benchmarks/tbb/concurrent_queue.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_concurrent_queue_H\n#define __TBB_concurrent_queue_H\n\n#include \"internal/_concurrent_queue_impl.h\"\n\nnamespace tbb {\n\nnamespace strict_ppl {\n\n//! A high-performance thread-safe non-blocking concurrent queue.\n/** Multiple threads may each push and pop concurrently.\n    Assignment construction is not allowed.\n    @ingroup containers */\ntemplate<typename T, typename A = cache_aligned_allocator<T> > \nclass concurrent_queue: public internal::concurrent_queue_base_v3<T> {\n    template<typename Container, typename Value> friend class internal::concurrent_queue_iterator;\n\n    //! Allocator type\n    typedef typename A::template rebind<char>::other page_allocator_type;\n    page_allocator_type my_allocator;\n\n    //! Allocates a block of size n (bytes)\n    /*override*/ virtual void *allocate_block( size_t n ) {\n        void *b = reinterpret_cast<void*>(my_allocator.allocate( n ));\n        if( !b )\n            internal::throw_exception(internal::eid_bad_alloc); \n        return b;\n    }\n\n    //! Deallocates block created by allocate_block.\n    /*override*/ virtual void deallocate_block( void *b, size_t n ) {\n        my_allocator.deallocate( reinterpret_cast<char*>(b), n );\n    }\n\n    static void copy_construct_item(T* location, const void* src){\n        new (location) T(*static_cast<const T*>(src));\n    }\n\n#if __TBB_CPP11_RVALUE_REF_PRESENT\n    static void move_construct_item(T* location, const void* src) {\n        new (location) T( std::move(*static_cast<T*>(const_cast<void*>(src))) );\n    }\n#endif /* __TBB_CPP11_RVALUE_REF_PRESENT */\npublic:\n    //! Element type in the queue.\n    typedef T value_type;\n\n    //! Reference type\n    typedef T& reference;\n\n    //! Const reference type\n    typedef const T& const_reference;\n\n    //! Integral type for representing size of the queue.\n    typedef size_t size_type;\n\n    //! Difference type for iterator\n    typedef ptrdiff_t difference_type;\n\n    //! Allocator type\n    typedef A allocator_type;\n\n    //! Construct empty queue\n    explicit concurrent_queue(const allocator_type& a = allocator_type()) :\n        my_allocator( a )\n    {\n    }\n\n    //! [begin,end) constructor\n    template<typename InputIterator>\n    concurrent_queue( InputIterator begin, InputIterator end, const allocator_type& a = allocator_type()) :\n        my_allocator( a )\n    {\n        for( ; begin != end; ++begin )\n            this->push(*begin);\n    }\n\n    //! Copy constructor\n    concurrent_queue( const concurrent_queue& src, const allocator_type& a = allocator_type()) :\n        internal::concurrent_queue_base_v3<T>(), my_allocator( a )\n    {\n        this->assign( src, copy_construct_item );\n    }\n\n#if __TBB_CPP11_RVALUE_REF_PRESENT\n    //! Move constructors\n    concurrent_queue( concurrent_queue&& src ) :\n        internal::concurrent_queue_base_v3<T>(), my_allocator( std::move(src.my_allocator) )\n    {\n        this->internal_swap( src );\n    }\n\n    concurrent_queue( concurrent_queue&& src, const allocator_type& a ) :\n        internal::concurrent_queue_base_v3<T>(), my_allocator( a )\n    {\n        // checking that memory allocated by one instance of allocator can be deallocated\n        // with another\n        if( my_allocator == src.my_allocator) {\n            this->internal_swap( src );\n        } else {\n            // allocators are different => performing per-element move\n            this->assign( src, move_construct_item );\n            src.clear();\n        }\n    }\n#endif /* __TBB_CPP11_RVALUE_REF_PRESENT */\n\n    //! Destroy queue\n    ~concurrent_queue();\n\n    //! Enqueue an item at tail of queue.\n    void push( const T& source ) {\n        this->internal_push( &source, copy_construct_item );\n    }\n\n#if __TBB_CPP11_RVALUE_REF_PRESENT\n    void push( T&& source ) {\n        this->internal_push( &source, move_construct_item );\n    }\n\n#if __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT\n    template<typename... Arguments>\n    void emplace( Arguments&&... args ) {\n        push( T(std::forward<Arguments>( args )...) );\n    }\n#endif //__TBB_CPP11_VARIADIC_TEMPLATES_PRESENT\n#endif /* __TBB_CPP11_RVALUE_REF_PRESENT */\n\n    //! Attempt to dequeue an item from head of queue.\n    /** Does not wait for item to become available.\n        Returns true if successful; false otherwise. */\n    bool try_pop( T& result ) {\n        return this->internal_try_pop( &result );\n    }\n\n    //! Return the number of items in the queue; thread unsafe\n    size_type unsafe_size() const {return this->internal_size();}\n\n    //! Equivalent to size()==0.\n    bool empty() const {return this->internal_empty();}\n\n    //! Clear the queue. not thread-safe.\n    void clear() ;\n\n    //! Return allocator object\n    allocator_type get_allocator() const { return this->my_allocator; }\n\n    typedef internal::concurrent_queue_iterator<concurrent_queue,T> iterator;\n    typedef internal::concurrent_queue_iterator<concurrent_queue,const T> const_iterator;\n\n    //------------------------------------------------------------------------\n    // The iterators are intended only for debugging.  They are slow and not thread safe.\n    //------------------------------------------------------------------------\n    iterator unsafe_begin() {return iterator(*this);}\n    iterator unsafe_end() {return iterator();}\n    const_iterator unsafe_begin() const {return const_iterator(*this);}\n    const_iterator unsafe_end() const {return const_iterator();}\n} ;\n\ntemplate<typename T, class A>\nconcurrent_queue<T,A>::~concurrent_queue() {\n    clear();\n    this->internal_finish_clear();\n}\n\ntemplate<typename T, class A>\nvoid concurrent_queue<T,A>::clear() {\n    while( !empty() ) {\n        T value;\n        this->internal_try_pop(&value);\n    }\n}\n\n} // namespace strict_ppl\n\n//! A high-performance thread-safe blocking concurrent bounded queue.\n/** This is the pre-PPL TBB concurrent queue which supports boundedness and blocking semantics.\n    Note that method names agree with the PPL-style concurrent queue.\n    Multiple threads may each push and pop concurrently.\n    Assignment construction is not allowed.\n    @ingroup containers */\ntemplate<typename T, class A = cache_aligned_allocator<T> >\nclass concurrent_bounded_queue: public internal::concurrent_queue_base_v8 {\n    template<typename Container, typename Value> friend class internal::concurrent_queue_iterator;\n\n    //! Allocator type\n    typedef typename A::template rebind<char>::other page_allocator_type;\n    page_allocator_type my_allocator;\n\n    typedef typename concurrent_queue_base_v3::padded_page<T> padded_page;\n    typedef typename concurrent_queue_base_v3::copy_specifics copy_specifics;\n\n    //! Class used to ensure exception-safety of method \"pop\"\n    class destroyer: internal::no_copy {\n        T& my_value;\n    public:\n        destroyer( T& value ) : my_value(value) {}\n        ~destroyer() {my_value.~T();}\n    };\n\n    T& get_ref( page& p, size_t index ) {\n        __TBB_ASSERT( index<items_per_page, NULL );\n        return (&static_cast<padded_page*>(static_cast<void*>(&p))->last)[index];\n    }\n\n    /*override*/ virtual void copy_item( page& dst, size_t index, const void* src ) {\n        new( &get_ref(dst,index) ) T(*static_cast<const T*>(src));\n    }\n\n#if __TBB_CPP11_RVALUE_REF_PRESENT\n    /*override*/ virtual void move_item( page& dst, size_t index, const void* src ) {\n        new( &get_ref(dst,index) ) T( std::move(*static_cast<T*>(const_cast<void*>(src))) );\n    }\n#else\n    /*override*/ virtual void move_item( page&, size_t, const void* ) {\n        __TBB_ASSERT( false, \"Unreachable code\" );\n    }\n#endif\n\n    /*override*/ virtual void copy_page_item( page& dst, size_t dindex, const page& src, size_t sindex ) {\n        new( &get_ref(dst,dindex) ) T( get_ref( const_cast<page&>(src), sindex ) );\n    }\n\n#if __TBB_CPP11_RVALUE_REF_PRESENT\n    /*override*/ virtual void move_page_item( page& dst, size_t dindex, const page& src, size_t sindex ) {\n        new( &get_ref(dst,dindex) ) T( std::move(get_ref( const_cast<page&>(src), sindex )) );\n    }\n#else\n    /*override*/ virtual void move_page_item( page&, size_t, const page&, size_t ) {\n        __TBB_ASSERT( false, \"Unreachable code\" );\n    }\n#endif\n\n    /*override*/ virtual void assign_and_destroy_item( void* dst, page& src, size_t index ) {\n        T& from = get_ref(src,index);\n        destroyer d(from);\n        *static_cast<T*>(dst) = tbb::internal::move( from );\n    }\n\n    /*override*/ virtual page *allocate_page() {\n        size_t n = sizeof(padded_page) + (items_per_page-1)*sizeof(T);\n        page *p = reinterpret_cast<page*>(my_allocator.allocate( n ));\n        if( !p )\n            internal::throw_exception(internal::eid_bad_alloc);\n        return p;\n    }\n\n    /*override*/ virtual void deallocate_page( page *p ) {\n        size_t n = sizeof(padded_page) + (items_per_page-1)*sizeof(T);\n        my_allocator.deallocate( reinterpret_cast<char*>(p), n );\n    }\n\npublic:\n    //! Element type in the queue.\n    typedef T value_type;\n\n    //! Allocator type\n    typedef A allocator_type;\n\n    //! Reference type\n    typedef T& reference;\n\n    //! Const reference type\n    typedef const T& const_reference;\n\n    //! Integral type for representing size of the queue.\n    /** Note that the size_type is a signed integral type.\n        This is because the size can be negative if there are pending pops without corresponding pushes. */\n    typedef std::ptrdiff_t size_type;\n\n    //! Difference type for iterator\n    typedef std::ptrdiff_t difference_type;\n\n    //! Construct empty queue\n    explicit concurrent_bounded_queue(const allocator_type& a = allocator_type()) : \n        concurrent_queue_base_v8( sizeof(T) ), my_allocator( a )\n    {\n    }\n\n    //! Copy constructor\n    concurrent_bounded_queue( const concurrent_bounded_queue& src, const allocator_type& a = allocator_type())\n        : concurrent_queue_base_v8( sizeof(T) ), my_allocator( a )\n    {\n        assign( src );\n    }\n\n#if __TBB_CPP11_RVALUE_REF_PRESENT\n    //! Move constructors\n    concurrent_bounded_queue( concurrent_bounded_queue&& src )\n        : concurrent_queue_base_v8( sizeof(T) ), my_allocator( std::move(src.my_allocator) )\n    {\n        internal_swap( src );\n    }\n\n    concurrent_bounded_queue( concurrent_bounded_queue&& src, const allocator_type& a )\n        : concurrent_queue_base_v8( sizeof(T) ), my_allocator( a )\n    {\n        // checking that memory allocated by one instance of allocator can be deallocated\n        // with another\n        if( my_allocator == src.my_allocator) {\n            this->internal_swap( src );\n        } else {\n            // allocators are different => performing per-element move\n            this->move_content( src );\n            src.clear();\n        }\n    }\n#endif /* __TBB_CPP11_RVALUE_REF_PRESENT */\n\n    //! [begin,end) constructor\n    template<typename InputIterator>\n    concurrent_bounded_queue( InputIterator begin, InputIterator end,\n                              const allocator_type& a = allocator_type())\n        : concurrent_queue_base_v8( sizeof(T) ), my_allocator( a )\n    {\n        for( ; begin != end; ++begin )\n            internal_push_if_not_full(&*begin);\n    }\n\n    //! Destroy queue\n    ~concurrent_bounded_queue();\n\n    //! Enqueue an item at tail of queue.\n    void push( const T& source ) {\n        internal_push( &source );\n    }\n\n#if __TBB_CPP11_RVALUE_REF_PRESENT\n    //! Move an item at tail of queue.\n    void push( T&& source ) {\n        internal_push_move( &source );\n    }\n\n#if __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT\n    template<typename... Arguments>\n    void emplace( Arguments&&... args ) {\n        push( T(std::forward<Arguments>( args )...) );\n    }\n#endif /* __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT */\n#endif /* __TBB_CPP11_RVALUE_REF_PRESENT */\n\n    //! Dequeue item from head of queue.\n    /** Block until an item becomes available, and then dequeue it. */\n    void pop( T& destination ) {\n        internal_pop( &destination );\n    }\n\n#if TBB_USE_EXCEPTIONS\n    //! Abort all pending queue operations\n    void abort() {\n        internal_abort();\n    }\n#endif\n\n    //! Enqueue an item at tail of queue if queue is not already full.\n    /** Does not wait for queue to become not full.\n        Returns true if item is pushed; false if queue was already full. */\n    bool try_push( const T& source ) {\n        return internal_push_if_not_full( &source );\n    }\n\n#if __TBB_CPP11_RVALUE_REF_PRESENT\n    //! Move an item at tail of queue if queue is not already full.\n    /** Does not wait for queue to become not full.\n        Returns true if item is pushed; false if queue was already full. */\n    bool try_push( T&& source ) {\n        return internal_push_move_if_not_full( &source );\n    }\n#if __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT\n    template<typename... Arguments>\n    bool try_emplace( Arguments&&... args ) {\n        return try_push( T(std::forward<Arguments>( args )...) );\n    }\n#endif /* __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT */\n#endif /* __TBB_CPP11_RVALUE_REF_PRESENT */\n\n    //! Attempt to dequeue an item from head of queue.\n    /** Does not wait for item to become available.\n        Returns true if successful; false otherwise. */\n    bool try_pop( T& destination ) {\n        return internal_pop_if_present( &destination );\n    }\n\n    //! Return number of pushes minus number of pops.\n    /** Note that the result can be negative if there are pops waiting for the \n        corresponding pushes.  The result can also exceed capacity() if there \n        are push operations in flight. */\n    size_type size() const {return internal_size();}\n\n    //! Equivalent to size()<=0.\n    bool empty() const {return internal_empty();}\n\n    //! Maximum number of allowed elements\n    size_type capacity() const {\n        return my_capacity;\n    }\n\n    //! Set the capacity\n    /** Setting the capacity to 0 causes subsequent try_push operations to always fail,\n        and subsequent push operations to block forever. */\n    void set_capacity( size_type new_capacity ) {\n        internal_set_capacity( new_capacity, sizeof(T) );\n    }\n\n    //! return allocator object\n    allocator_type get_allocator() const { return this->my_allocator; }\n\n    //! clear the queue. not thread-safe.\n    void clear() ;\n\n    typedef internal::concurrent_queue_iterator<concurrent_bounded_queue,T> iterator;\n    typedef internal::concurrent_queue_iterator<concurrent_bounded_queue,const T> const_iterator;\n\n    //------------------------------------------------------------------------\n    // The iterators are intended only for debugging.  They are slow and not thread safe.\n    //------------------------------------------------------------------------\n    iterator unsafe_begin() {return iterator(*this);}\n    iterator unsafe_end() {return iterator();}\n    const_iterator unsafe_begin() const {return const_iterator(*this);}\n    const_iterator unsafe_end() const {return const_iterator();}\n\n}; \n\ntemplate<typename T, class A>\nconcurrent_bounded_queue<T,A>::~concurrent_bounded_queue() {\n    clear();\n    internal_finish_clear();\n}\n\ntemplate<typename T, class A>\nvoid concurrent_bounded_queue<T,A>::clear() {\n    while( !empty() ) {\n        T value;\n        internal_pop_if_present(&value);\n    }\n}\n\nusing strict_ppl::concurrent_queue;\n\n} // namespace tbb\n\n#endif /* __TBB_concurrent_queue_H */\n"
  },
  {
    "path": "benchmarks/tbb/concurrent_unordered_map.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n/* Container implementations in this header are based on PPL implementations\n   provided by Microsoft. */\n\n#ifndef __TBB_concurrent_unordered_map_H\n#define __TBB_concurrent_unordered_map_H\n\n#include \"internal/_concurrent_unordered_impl.h\"\n\nnamespace tbb\n{\n\nnamespace interface5 {\n\n// Template class for hash map traits\ntemplate<typename Key, typename T, typename Hash_compare, typename Allocator, bool Allow_multimapping>\nclass concurrent_unordered_map_traits\n{\nprotected:\n    typedef std::pair<const Key, T> value_type;\n    typedef Key key_type;\n    typedef Hash_compare hash_compare;\n    typedef typename Allocator::template rebind<value_type>::other allocator_type;\n    enum { allow_multimapping = Allow_multimapping };\n\n    concurrent_unordered_map_traits() : my_hash_compare() {}\n    concurrent_unordered_map_traits(const hash_compare& hc) : my_hash_compare(hc) {}\n\n    class value_compare : public std::binary_function<value_type, value_type, bool>\n    {\n        friend class concurrent_unordered_map_traits<Key, T, Hash_compare, Allocator, Allow_multimapping>;\n\n    public:\n        bool operator()(const value_type& left, const value_type& right) const\n        {\n            return (my_hash_compare(left.first, right.first));\n        }\n\n        value_compare(const hash_compare& comparator) : my_hash_compare(comparator) {}\n\n    protected:\n        hash_compare my_hash_compare;    // the comparator predicate for keys\n    };\n\n    template<class Type1, class Type2>\n    static const Key& get_key(const std::pair<Type1, Type2>& value) {\n        return (value.first);\n    }\n\n    hash_compare my_hash_compare; // the comparator predicate for keys\n};\n\ntemplate <typename Key, typename T, typename Hasher = tbb::tbb_hash<Key>, typename Key_equality = std::equal_to<Key>,\n         typename Allocator = tbb::tbb_allocator<std::pair<const Key, T> > >\nclass concurrent_unordered_map :\n    public internal::concurrent_unordered_base< concurrent_unordered_map_traits<Key, T,\n    internal::hash_compare<Key, Hasher, Key_equality>, Allocator, false> >\n{\n    // Base type definitions\n    typedef internal::hash_compare<Key, Hasher, Key_equality> hash_compare;\n    typedef concurrent_unordered_map_traits<Key, T, hash_compare, Allocator, false> traits_type;\n    typedef internal::concurrent_unordered_base< traits_type > base_type;\n#if __TBB_EXTRA_DEBUG\npublic:\n#endif\n    using traits_type::allow_multimapping;\npublic:\n    using base_type::end;\n    using base_type::find;\n    using base_type::insert;\n\n    // Type definitions\n    typedef Key key_type;\n    typedef typename base_type::value_type value_type;\n    typedef T mapped_type;\n    typedef Hasher hasher;\n    typedef Key_equality key_equal;\n    typedef hash_compare key_compare;\n\n    typedef typename base_type::allocator_type allocator_type;\n    typedef typename base_type::pointer pointer;\n    typedef typename base_type::const_pointer const_pointer;\n    typedef typename base_type::reference reference;\n    typedef typename base_type::const_reference const_reference;\n\n    typedef typename base_type::size_type size_type;\n    typedef typename base_type::difference_type difference_type;\n\n    typedef typename base_type::iterator iterator;\n    typedef typename base_type::const_iterator const_iterator;\n    typedef typename base_type::iterator local_iterator;\n    typedef typename base_type::const_iterator const_local_iterator;\n\n    // Construction/destruction/copying\n    explicit concurrent_unordered_map(size_type n_of_buckets = base_type::initial_bucket_number,\n        const hasher& _Hasher = hasher(), const key_equal& _Key_equality = key_equal(),\n        const allocator_type& a = allocator_type())\n        : base_type(n_of_buckets, key_compare(_Hasher, _Key_equality), a)\n    {\n    }\n\n    concurrent_unordered_map(const Allocator& a) : base_type(base_type::initial_bucket_number, key_compare(), a)\n    {\n    }\n\n    template <typename Iterator>\n    concurrent_unordered_map(Iterator first, Iterator last, size_type n_of_buckets = base_type::initial_bucket_number,\n        const hasher& _Hasher = hasher(), const key_equal& _Key_equality = key_equal(),\n        const allocator_type& a = allocator_type())\n        : base_type(n_of_buckets, key_compare(_Hasher, _Key_equality), a)\n    {\n        insert(first, last);\n    }\n\n#if __TBB_INITIALIZER_LISTS_PRESENT\n    //! Constructor from initializer_list\n    concurrent_unordered_map(std::initializer_list<value_type> il, size_type n_of_buckets = base_type::initial_bucket_number,\n        const hasher& _Hasher = hasher(), const key_equal& _Key_equality = key_equal(),\n        const allocator_type& a = allocator_type())\n        : base_type(n_of_buckets, key_compare(_Hasher, _Key_equality), a)\n    {\n        this->insert(il.begin(),il.end());\n    }\n#endif //# __TBB_INITIALIZER_LISTS_PRESENT\n\n#if __TBB_CPP11_RVALUE_REF_PRESENT && __TBB_CPP11_IMPLICIT_MOVE_MEMBERS_GENERATION_FOR_DERIVED_BROKEN\n    concurrent_unordered_map(const concurrent_unordered_map& table)\n        : base_type(table)\n    {\n    }\n\n    concurrent_unordered_map& operator=(const concurrent_unordered_map& table)\n    {\n        return static_cast<concurrent_unordered_map&>(base_type::operator=(table));\n    }\n\n    concurrent_unordered_map(concurrent_unordered_map&& table)\n        : base_type(std::move(table))\n    {\n    }\n\n    concurrent_unordered_map& operator=(concurrent_unordered_map&& table)\n    {\n        return static_cast<concurrent_unordered_map&>(base_type::operator=(std::move(table)));\n    }\n#endif //__TBB_CPP11_IMPLICIT_MOVE_MEMBERS_GENERATION_FOR_DERIVED_BROKEN\n\n    concurrent_unordered_map(const concurrent_unordered_map& table, const Allocator& a)\n        : base_type(table, a)\n    {\n    }\n\n#if __TBB_CPP11_RVALUE_REF_PRESENT\n    concurrent_unordered_map(concurrent_unordered_map&& table, const Allocator& a) : base_type(std::move(table), a)\n    {\n    }\n#endif\n    // Observers\n    mapped_type& operator[](const key_type& key)\n    {\n        iterator where = find(key);\n\n        if (where == end())\n        {\n            where = insert(std::pair<key_type, mapped_type>(key, mapped_type())).first;\n        }\n\n        return ((*where).second);\n    }\n\n    mapped_type& at(const key_type& key)\n    {\n        iterator where = find(key);\n\n        if (where == end())\n        {\n            tbb::internal::throw_exception(tbb::internal::eid_invalid_key);\n        }\n\n        return ((*where).second);\n    }\n\n    const mapped_type& at(const key_type& key) const\n    {\n        const_iterator where = find(key);\n\n        if (where == end())\n        {\n            tbb::internal::throw_exception(tbb::internal::eid_invalid_key);\n        }\n\n        return ((*where).second);\n    }\n};\n\ntemplate < typename Key, typename T, typename Hasher = tbb::tbb_hash<Key>, typename Key_equality = std::equal_to<Key>,\n        typename Allocator = tbb::tbb_allocator<std::pair<const Key, T> > >\nclass concurrent_unordered_multimap :\n    public internal::concurrent_unordered_base< concurrent_unordered_map_traits< Key, T,\n    internal::hash_compare<Key, Hasher, Key_equality>, Allocator, true> >\n{\n    // Base type definitions\n    typedef internal::hash_compare<Key, Hasher, Key_equality> hash_compare;\n    typedef concurrent_unordered_map_traits<Key, T, hash_compare, Allocator, true> traits_type;\n    typedef internal::concurrent_unordered_base<traits_type> base_type;\n#if __TBB_EXTRA_DEBUG\npublic:\n#endif\n    using traits_type::allow_multimapping;\npublic:\n    using base_type::insert;\n\n    // Type definitions\n    typedef Key key_type;\n    typedef typename base_type::value_type value_type;\n    typedef T mapped_type;\n    typedef Hasher hasher;\n    typedef Key_equality key_equal;\n    typedef hash_compare key_compare;\n\n    typedef typename base_type::allocator_type allocator_type;\n    typedef typename base_type::pointer pointer;\n    typedef typename base_type::const_pointer const_pointer;\n    typedef typename base_type::reference reference;\n    typedef typename base_type::const_reference const_reference;\n\n    typedef typename base_type::size_type size_type;\n    typedef typename base_type::difference_type difference_type;\n\n    typedef typename base_type::iterator iterator;\n    typedef typename base_type::const_iterator const_iterator;\n    typedef typename base_type::iterator local_iterator;\n    typedef typename base_type::const_iterator const_local_iterator;\n\n    // Construction/destruction/copying\n    explicit concurrent_unordered_multimap(size_type n_of_buckets = base_type::initial_bucket_number,\n        const hasher& _Hasher = hasher(), const key_equal& _Key_equality = key_equal(),\n        const allocator_type& a = allocator_type())\n        : base_type(n_of_buckets, key_compare(_Hasher, _Key_equality), a)\n    {\n    }\n\n    concurrent_unordered_multimap(const Allocator& a) : base_type(base_type::initial_bucket_number, key_compare(), a)\n    {\n    }\n\n    template <typename Iterator>\n    concurrent_unordered_multimap(Iterator first, Iterator last, size_type n_of_buckets = base_type::initial_bucket_number,\n        const hasher& _Hasher = hasher(), const key_equal& _Key_equality = key_equal(),\n        const allocator_type& a = allocator_type())\n        : base_type(n_of_buckets,key_compare(_Hasher,_Key_equality), a)\n    {\n        insert(first, last);\n    }\n\n#if __TBB_INITIALIZER_LISTS_PRESENT\n    //! Constructor from initializer_list\n    concurrent_unordered_multimap(std::initializer_list<value_type> il, size_type n_of_buckets = base_type::initial_bucket_number,\n        const hasher& _Hasher = hasher(), const key_equal& _Key_equality = key_equal(),\n        const allocator_type& a = allocator_type())\n        : base_type(n_of_buckets, key_compare(_Hasher, _Key_equality), a)\n    {\n        this->insert(il.begin(),il.end());\n    }\n#endif //# __TBB_INITIALIZER_LISTS_PRESENT\n\n#if __TBB_CPP11_RVALUE_REF_PRESENT && __TBB_CPP11_IMPLICIT_MOVE_MEMBERS_GENERATION_FOR_DERIVED_BROKEN\n    concurrent_unordered_multimap(const concurrent_unordered_multimap& table)\n        : base_type(table)\n    {\n    }\n\n    concurrent_unordered_multimap& operator=(const concurrent_unordered_multimap& table)\n    {\n        return static_cast<concurrent_unordered_multimap&>(base_type::operator=(table));\n    }\n\n    concurrent_unordered_multimap(concurrent_unordered_multimap&& table)\n        : base_type(std::move(table))\n    {\n    }\n\n    concurrent_unordered_multimap& operator=(concurrent_unordered_multimap&& table)\n    {\n        return static_cast<concurrent_unordered_multimap&>(base_type::operator=(std::move(table)));\n    }\n#endif //__TBB_CPP11_IMPLICIT_MOVE_MEMBERS_GENERATION_FOR_DERIVED_BROKEN\n\n    concurrent_unordered_multimap(const concurrent_unordered_multimap& table, const Allocator& a)\n        : base_type(table, a)\n    {\n    }\n\n#if __TBB_CPP11_RVALUE_REF_PRESENT\n    concurrent_unordered_multimap(concurrent_unordered_multimap&& table, const Allocator& a) : base_type(std::move(table), a)\n    {\n    }\n#endif\n};\n} // namespace interface5\n\nusing interface5::concurrent_unordered_map;\nusing interface5::concurrent_unordered_multimap;\n\n} // namespace tbb\n\n#endif// __TBB_concurrent_unordered_map_H\n"
  },
  {
    "path": "benchmarks/tbb/concurrent_unordered_set.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n/* Container implementations in this header are based on PPL implementations\n   provided by Microsoft. */\n\n#ifndef __TBB_concurrent_unordered_set_H\n#define __TBB_concurrent_unordered_set_H\n\n#include \"internal/_concurrent_unordered_impl.h\"\n\nnamespace tbb\n{\n\nnamespace interface5 {\n\n// Template class for hash set traits\ntemplate<typename Key, typename Hash_compare, typename Allocator, bool Allow_multimapping>\nclass concurrent_unordered_set_traits\n{\nprotected:\n    typedef Key value_type;\n    typedef Key key_type;\n    typedef Hash_compare hash_compare;\n    typedef typename Allocator::template rebind<value_type>::other allocator_type;\n    enum { allow_multimapping = Allow_multimapping };\n\n    concurrent_unordered_set_traits() : my_hash_compare() {}\n    concurrent_unordered_set_traits(const hash_compare& hc) : my_hash_compare(hc) {}\n\n    typedef hash_compare value_compare;\n\n    static const Key& get_key(const value_type& value) {\n        return value;\n    }\n\n    hash_compare my_hash_compare; // the comparator predicate for keys\n};\n\ntemplate <typename Key, typename Hasher = tbb::tbb_hash<Key>, typename Key_equality = std::equal_to<Key>, typename Allocator = tbb::tbb_allocator<Key> >\nclass concurrent_unordered_set : public internal::concurrent_unordered_base< concurrent_unordered_set_traits<Key, internal::hash_compare<Key, Hasher, Key_equality>, Allocator, false> >\n{\n    // Base type definitions\n    typedef internal::hash_compare<Key, Hasher, Key_equality> hash_compare;\n    typedef internal::concurrent_unordered_base< concurrent_unordered_set_traits<Key, hash_compare, Allocator, false> > base_type;\n    typedef concurrent_unordered_set_traits<Key, internal::hash_compare<Key, Hasher, Key_equality>, Allocator, false> traits_type;\n#if __TBB_EXTRA_DEBUG\npublic:\n#endif\n    using traits_type::allow_multimapping;\npublic:\n    using base_type::insert;\n\n    // Type definitions\n    typedef Key key_type;\n    typedef typename base_type::value_type value_type;\n    typedef Key mapped_type;\n    typedef Hasher hasher;\n    typedef Key_equality key_equal;\n    typedef hash_compare key_compare;\n\n    typedef typename base_type::allocator_type allocator_type;\n    typedef typename base_type::pointer pointer;\n    typedef typename base_type::const_pointer const_pointer;\n    typedef typename base_type::reference reference;\n    typedef typename base_type::const_reference const_reference;\n\n    typedef typename base_type::size_type size_type;\n    typedef typename base_type::difference_type difference_type;\n\n    typedef typename base_type::iterator iterator;\n    typedef typename base_type::const_iterator const_iterator;\n    typedef typename base_type::iterator local_iterator;\n    typedef typename base_type::const_iterator const_local_iterator;\n\n    // Construction/destruction/copying\n    explicit concurrent_unordered_set(size_type n_of_buckets = base_type::initial_bucket_number, const hasher& a_hasher = hasher(),\n        const key_equal& a_keyeq = key_equal(), const allocator_type& a = allocator_type())\n        : base_type(n_of_buckets, key_compare(a_hasher, a_keyeq), a)\n    {\n    }\n\n    concurrent_unordered_set(const Allocator& a) : base_type(base_type::initial_bucket_number, key_compare(), a)\n    {\n    }\n\n    template <typename Iterator>\n    concurrent_unordered_set(Iterator first, Iterator last, size_type n_of_buckets = base_type::initial_bucket_number, const hasher& a_hasher = hasher(),\n        const key_equal& a_keyeq = key_equal(), const allocator_type& a = allocator_type())\n        : base_type(n_of_buckets, key_compare(a_hasher, a_keyeq), a)\n    {\n        insert(first, last);\n    }\n\n#if __TBB_INITIALIZER_LISTS_PRESENT\n    //! Constructor from initializer_list\n   concurrent_unordered_set(std::initializer_list<value_type> il, size_type n_of_buckets = base_type::initial_bucket_number, const hasher& a_hasher = hasher(),\n        const key_equal& a_keyeq = key_equal(), const allocator_type& a = allocator_type())\n        : base_type(n_of_buckets, key_compare(a_hasher, a_keyeq), a)\n    {\n        this->insert(il.begin(),il.end());\n    }\n#endif //# __TBB_INITIALIZER_LISTS_PRESENT\n\n#if __TBB_CPP11_RVALUE_REF_PRESENT && __TBB_CPP11_IMPLICIT_MOVE_MEMBERS_GENERATION_FOR_DERIVED_BROKEN\n    concurrent_unordered_set(const concurrent_unordered_set& table)\n        : base_type(table)\n    {\n    }\n\n    concurrent_unordered_set& operator=(const concurrent_unordered_set& table)\n    {\n        return static_cast<concurrent_unordered_set&>(base_type::operator=(table));\n    }\n\n    concurrent_unordered_set(concurrent_unordered_set&& table)\n        : base_type(std::move(table))\n    {\n    }\n\n    concurrent_unordered_set& operator=(concurrent_unordered_set&& table)\n    {\n        return static_cast<concurrent_unordered_set&>(base_type::operator=(std::move(table)));\n    }\n#endif //__TBB_CPP11_IMPLICIT_MOVE_MEMBERS_GENERATION_FOR_DERIVED_BROKEN\n\n    concurrent_unordered_set(const concurrent_unordered_set& table, const Allocator& a)\n        : base_type(table, a)\n    {\n    }\n\n#if __TBB_CPP11_RVALUE_REF_PRESENT\n    concurrent_unordered_set(concurrent_unordered_set&& table, const Allocator& a)\n        : base_type(std::move(table), a)\n    {\n    }\n#endif //__TBB_CPP11_RVALUE_REF_PRESENT\n\n};\n\ntemplate <typename Key, typename Hasher = tbb::tbb_hash<Key>, typename Key_equality = std::equal_to<Key>,\n         typename Allocator = tbb::tbb_allocator<Key> >\nclass concurrent_unordered_multiset :\n    public internal::concurrent_unordered_base< concurrent_unordered_set_traits<Key,\n    internal::hash_compare<Key, Hasher, Key_equality>, Allocator, true> >\n{\n    // Base type definitions\n    typedef internal::hash_compare<Key, Hasher, Key_equality> hash_compare;\n    typedef concurrent_unordered_set_traits<Key, hash_compare, Allocator, true> traits_type;\n    typedef internal::concurrent_unordered_base< traits_type > base_type;\n#if __TBB_EXTRA_DEBUG\npublic:\n#endif\n    using traits_type::allow_multimapping;\npublic:\n    using base_type::insert;\n\n    // Type definitions\n    typedef Key key_type;\n    typedef typename base_type::value_type value_type;\n    typedef Key mapped_type;\n    typedef Hasher hasher;\n    typedef Key_equality key_equal;\n    typedef hash_compare key_compare;\n\n    typedef typename base_type::allocator_type allocator_type;\n    typedef typename base_type::pointer pointer;\n    typedef typename base_type::const_pointer const_pointer;\n    typedef typename base_type::reference reference;\n    typedef typename base_type::const_reference const_reference;\n\n    typedef typename base_type::size_type size_type;\n    typedef typename base_type::difference_type difference_type;\n\n    typedef typename base_type::iterator iterator;\n    typedef typename base_type::const_iterator const_iterator;\n    typedef typename base_type::iterator local_iterator;\n    typedef typename base_type::const_iterator const_local_iterator;\n\n    // Construction/destruction/copying\n    explicit concurrent_unordered_multiset(size_type n_of_buckets = base_type::initial_bucket_number,\n        const hasher& _Hasher = hasher(), const key_equal& _Key_equality = key_equal(),\n        const allocator_type& a = allocator_type())\n        : base_type(n_of_buckets, key_compare(_Hasher, _Key_equality), a)\n    {\n    }\n\n    concurrent_unordered_multiset(const Allocator& a) : base_type(base_type::initial_bucket_number, key_compare(), a)\n    {\n    }\n\n    template <typename Iterator>\n    concurrent_unordered_multiset(Iterator first, Iterator last, size_type n_of_buckets = base_type::initial_bucket_number,\n        const hasher& _Hasher = hasher(), const key_equal& _Key_equality = key_equal(),\n        const allocator_type& a = allocator_type())\n        : base_type(n_of_buckets, key_compare(_Hasher, _Key_equality), a)\n    {\n        insert(first, last);\n    }\n\n#if __TBB_INITIALIZER_LISTS_PRESENT\n    //! Constructor from initializer_list\n   concurrent_unordered_multiset(std::initializer_list<value_type> il, size_type n_of_buckets = base_type::initial_bucket_number, const hasher& a_hasher = hasher(),\n        const key_equal& a_keyeq = key_equal(), const allocator_type& a = allocator_type())\n        : base_type(n_of_buckets, key_compare(a_hasher, a_keyeq), a)\n    {\n        this->insert(il.begin(),il.end());\n    }\n#endif //# __TBB_INITIALIZER_LISTS_PRESENT    \n\n#if __TBB_CPP11_RVALUE_REF_PRESENT && __TBB_CPP11_IMPLICIT_MOVE_MEMBERS_GENERATION_FOR_DERIVED_BROKEN\n   concurrent_unordered_multiset(const concurrent_unordered_multiset& table)\n        : base_type(table)\n    {\n    }\n\n   concurrent_unordered_multiset& operator=(const concurrent_unordered_multiset& table)\n    {\n        return static_cast<concurrent_unordered_multiset&>(base_type::operator=(table));\n    }\n\n   concurrent_unordered_multiset(concurrent_unordered_multiset&& table)\n        : base_type(std::move(table))\n    {\n    }\n\n   concurrent_unordered_multiset& operator=(concurrent_unordered_multiset&& table)\n    {\n        return static_cast<concurrent_unordered_multiset&>(base_type::operator=(std::move(table)));\n    }\n#endif //__TBB_CPP11_IMPLICIT_MOVE_MEMBERS_GENERATION_FOR_DERIVED_BROKEN\n\n    concurrent_unordered_multiset(const concurrent_unordered_multiset& table, const Allocator& a)\n        : base_type(table, a)\n    {\n    }\n\n#if __TBB_CPP11_RVALUE_REF_PRESENT\n    concurrent_unordered_multiset(concurrent_unordered_multiset&& table, const Allocator& a)\n        : base_type(std::move(table), a)\n    {\n    }\n#endif //__TBB_CPP11_RVALUE_REF_PRESENT\n};\n} // namespace interface5\n\nusing interface5::concurrent_unordered_set;\nusing interface5::concurrent_unordered_multiset;\n\n} // namespace tbb\n\n#endif// __TBB_concurrent_unordered_set_H\n"
  },
  {
    "path": "benchmarks/tbb/concurrent_vector.cpp",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#if (_MSC_VER)\n    //MSVC 10 \"deprecated\" application of some std:: algorithms to raw pointers as not safe.\n    //The reason is that destination is not checked against bounds/having enough place.\n    #define _SCL_SECURE_NO_WARNINGS\n#endif\n\n#include \"tbb/concurrent_vector.h\"\n#include \"tbb/cache_aligned_allocator.h\"\n#include \"tbb/tbb_exception.h\"\n#include \"tbb_misc.h\"\n#include \"itt_notify.h\"\n\n#if !TBB_USE_EXCEPTIONS && _MSC_VER\n    // Suppress \"C++ exception handler used, but unwind semantics are not enabled\" warning in STL headers\n    #pragma warning (push)\n    #pragma warning (disable: 4530)\n#endif\n\n#include <cstring>\n#include <memory> //for uninitialized_fill_n\n\n#if !TBB_USE_EXCEPTIONS && _MSC_VER\n    #pragma warning (pop)\n#endif\n\n#if defined(_MSC_VER) && defined(_Wp64)\n    // Workaround for overzealous compiler warnings in /Wp64 mode\n    #pragma warning (disable: 4267)\n#endif\n\nusing namespace std;\n\nnamespace tbb {\n\nnamespace internal {\n    class concurrent_vector_base_v3::helper :no_assign {\npublic:\n    //! memory page size\n    static const size_type page_size = 4096;\n\n    inline static bool incompact_predicate(size_type size) { // assert size != 0, see source/test/test_vector_layout.cpp\n        return size < page_size || ((size-1)%page_size < page_size/2 && size < page_size * 128); // for more details\n    }\n\n    inline static size_type find_segment_end(const concurrent_vector_base_v3 &v) {\n        segment_t *s = v.my_segment;\n        segment_index_t u = s==v.my_storage? pointers_per_short_table : pointers_per_long_table;\n        segment_index_t k = 0;\n        while( k < u && (s[k].load<relaxed>()==segment_allocated() ))\n            ++k;\n        return k;\n    }\n\n    // TODO: optimize accesses to my_first_block\n    //! assign first segment size. k - is index of last segment to be allocated, not a count of segments\n    inline static void assign_first_segment_if_necessary(concurrent_vector_base_v3 &v, segment_index_t k) {\n        if( !v.my_first_block ) {\n            /* There was a suggestion to set first segment according to incompact_predicate:\n            while( k && !helper::incompact_predicate(segment_size( k ) * element_size) )\n                --k; // while previous vector size is compact, decrement\n            // reasons to not do it:\n            // * constructor(n) is not ready to accept fragmented segments\n            // * backward compatibility due to that constructor\n            // * current version gives additional guarantee and faster init.\n            // * two calls to reserve() will give the same effect.\n            */\n            v.my_first_block.compare_and_swap(k+1, 0); // store number of segments\n        }\n    }\n\n    inline static void *allocate_segment(concurrent_vector_base_v3 &v, size_type n) {\n        void *ptr = v.vector_allocator_ptr(v, n);\n        if(!ptr) throw_exception(eid_bad_alloc); // check for bad allocation, throw exception\n        return ptr;\n    }\n\n    //! Publish segment so other threads can see it.\n    template<typename argument_type>\n    inline static void publish_segment( segment_t& s, argument_type rhs ) {\n        // see also itt_store_pointer_with_release_v3()\n        ITT_NOTIFY( sync_releasing, &s );\n        s.store<release>(rhs);\n    }\n\n    static size_type enable_segment(concurrent_vector_base_v3 &v, size_type k, size_type element_size, bool mark_as_not_used_on_failure = false);\n\n    // TODO: rename as get_segments_table() and return segment pointer\n    inline static void extend_table_if_necessary(concurrent_vector_base_v3 &v, size_type k, size_type start ) {\n        if(k >= pointers_per_short_table && v.my_segment == v.my_storage)\n            extend_segment_table(v, start );\n    }\n\n    static void extend_segment_table(concurrent_vector_base_v3 &v, size_type start);\n\n    struct segment_not_used_predicate: no_assign {\n        segment_t &s;\n        segment_not_used_predicate(segment_t &segment) : s(segment) {}\n        bool operator()() const { return s.load<relaxed>() == segment_not_used ();}\n    };\n    inline static segment_t& acquire_segment(concurrent_vector_base_v3 &v, size_type index, size_type element_size, bool owner) {\n        segment_t &s = v.my_segment[index]; // TODO: pass v.my_segment as argument\n        if( s.load<acquire>() == segment_not_used() ) { // do not check for segment_allocation_failed state\n            if( owner ) {\n                enable_segment( v, index, element_size );\n            } else {\n                ITT_NOTIFY(sync_prepare, &s);\n                spin_wait_while(segment_not_used_predicate(s));\n                ITT_NOTIFY(sync_acquired, &s);\n            }\n        } else {\n            ITT_NOTIFY(sync_acquired, &s);\n        }\n        if(s.load<relaxed>() != segment_allocated())\n            throw_exception(eid_bad_last_alloc); // throw custom exception, because it's hard to recover correctly after segment_allocation_failed state\n        return s;\n    }\n\n    ///// non-static fields of helper for exception-safe iteration across segments\n    segment_t *table;// TODO: review all segment_index_t as just short type\n    size_type first_block, k, sz, start, finish, element_size;\n    helper(segment_t *segments, size_type fb, size_type esize, size_type index, size_type s, size_type f) throw()\n        : table(segments), first_block(fb), k(index), sz(0), start(s), finish(f), element_size(esize) {}\n    inline void first_segment() throw() {\n        __TBB_ASSERT( start <= finish, NULL );\n        __TBB_ASSERT( first_block || !finish, NULL );\n        if( k < first_block ) k = 0; // process solid segment at a time\n        size_type base = segment_base( k );\n        __TBB_ASSERT( base <= start, NULL );\n        finish -= base; start -= base; // rebase as offsets from segment k\n        sz = k ? base : segment_size( first_block ); // sz==base for k>0\n    }\n    inline void next_segment() throw() {\n        finish -= sz; start = 0; // offsets from next segment\n        if( !k ) k = first_block;\n        else { ++k; sz = segment_size( k ); }\n    }\n    template<typename F>\n    inline size_type apply(const F &func) {\n        first_segment();\n        while( sz < finish ) { // work for more than one segment\n            //TODO: remove extra load() of table[k] inside func\n            func( table[k], table[k].load<relaxed>().pointer<char>() + element_size*start, sz - start );\n            next_segment();\n        }\n        func( table[k], table[k].load<relaxed>().pointer<char>() + element_size*start, finish - start );\n        return k;\n    }\n    inline segment_value_t get_segment_value(size_type index, bool wait) {\n        segment_t &s = table[index];\n        if( wait && (s.load<acquire>() == segment_not_used()) ) {\n            ITT_NOTIFY(sync_prepare, &s);\n            spin_wait_while(segment_not_used_predicate(s));\n            ITT_NOTIFY(sync_acquired, &s);\n        }\n        return s.load<relaxed>();\n    }\n    ~helper() {\n        if( sz >= finish ) return; // the work is done correctly\n        cleanup();\n    }\n\n    //! Out of line code to assists destructor in infrequent cases.\n    void cleanup();\n\n    /// TODO: turn into lambda functions when available\n    struct init_body {\n        internal_array_op2 func;\n        const void *arg;\n        init_body(internal_array_op2 init, const void *src) : func(init), arg(src) {}\n        void operator()(segment_t &, void *begin, size_type n) const {\n            func( begin, arg, n );\n        }\n    };\n    struct safe_init_body {\n        internal_array_op2 func;\n        const void *arg;\n        safe_init_body(internal_array_op2 init, const void *src) : func(init), arg(src) {}\n        void operator()(segment_t &s, void *begin, size_type n) const {\n            if(s.load<relaxed>() != segment_allocated())\n                throw_exception(eid_bad_last_alloc); // throw custom exception\n            func( begin, arg, n );\n        }\n    };\n    struct destroy_body {\n        internal_array_op1 func;\n        destroy_body(internal_array_op1 destroy) : func(destroy) {}\n        void operator()(segment_t &s, void *begin, size_type n) const {\n            if(s.load<relaxed>() == segment_allocated())\n                func( begin, n );\n        }\n    };\n};\n\nvoid concurrent_vector_base_v3::helper::extend_segment_table(concurrent_vector_base_v3 &v, concurrent_vector_base_v3::size_type start) {\n    if( start > segment_size(pointers_per_short_table) ) start = segment_size(pointers_per_short_table);\n    // If other threads are trying to set pointers in the short segment, wait for them to finish their\n    // assignments before we copy the short segment to the long segment. Note: grow_to_at_least depends on it\n    for( segment_index_t i = 0; segment_base(i) < start && v.my_segment == v.my_storage; i++ ){\n        if(v.my_storage[i].load<relaxed>() == segment_not_used()) {\n            ITT_NOTIFY(sync_prepare, &v.my_storage[i]);\n            atomic_backoff backoff(true);\n            while( v.my_segment == v.my_storage && (v.my_storage[i].load<relaxed>() == segment_not_used()) )\n                backoff.pause();\n            ITT_NOTIFY(sync_acquired, &v.my_storage[i]);\n        }\n    }\n    if( v.my_segment != v.my_storage ) return;\n\n    segment_t* new_segment_table = (segment_t*)NFS_Allocate( pointers_per_long_table, sizeof(segment_t), NULL );\n    __TBB_ASSERT(new_segment_table, \"NFS_Allocate should throws exception if it cannot allocate the requested storage, and not returns zero pointer\" );\n    std::uninitialized_fill_n(new_segment_table,size_t(pointers_per_long_table),segment_t()); //init newly allocated table\n   //TODO: replace with static assert\n    __TBB_STATIC_ASSERT(pointers_per_long_table >= pointers_per_short_table, \"size of the big table should be not lesser than of the small one, as we copy values to it\" );\n    std::copy(v.my_storage, v.my_storage+pointers_per_short_table, new_segment_table);//copy values from old table, here operator= of segment_t is used\n    if( v.my_segment.compare_and_swap( new_segment_table, v.my_storage ) != v.my_storage )\n        NFS_Free( new_segment_table );\n    // else TODO: add ITT_NOTIFY signals for v.my_segment?\n}\n\nconcurrent_vector_base_v3::size_type concurrent_vector_base_v3::helper::enable_segment(concurrent_vector_base_v3 &v, concurrent_vector_base_v3::size_type k, concurrent_vector_base_v3::size_type element_size,\n        bool mark_as_not_used_on_failure ) {\n\n    struct segment_scope_guard : no_copy{\n        segment_t* my_segment_ptr;\n        bool my_mark_as_not_used;\n        segment_scope_guard(segment_t& segment, bool mark_as_not_used) : my_segment_ptr(&segment), my_mark_as_not_used(mark_as_not_used){}\n        void dismiss(){ my_segment_ptr = 0;}\n        ~segment_scope_guard(){\n            if (my_segment_ptr){\n                if (!my_mark_as_not_used){\n                    publish_segment(*my_segment_ptr, segment_allocation_failed());\n                }else{\n                    publish_segment(*my_segment_ptr, segment_not_used());\n                }\n            }\n        }\n    };\n\n    segment_t* s = v.my_segment; // TODO: optimize out as argument? Optimize accesses to my_first_block\n    __TBB_ASSERT(s[k].load<relaxed>() != segment_allocated(), \"concurrent operation during growth?\");\n\n    size_type size_of_enabled_segment =  segment_size(k);\n    size_type size_to_allocate = size_of_enabled_segment;\n    if( !k ) {\n        assign_first_segment_if_necessary(v, default_initial_segments-1);\n        size_of_enabled_segment =  2 ;\n        size_to_allocate = segment_size(v.my_first_block);\n\n    } else  {\n        spin_wait_while_eq( v.my_first_block, segment_index_t(0) );\n    }\n\n    if( k && (k < v.my_first_block)){ //no need to allocate anything\n        // s[0].array is changed only once ( 0 -> !0 ) and points to uninitialized memory\n        segment_value_t array0 = s[0].load<acquire>();\n        if(array0 == segment_not_used()){\n            // sync_prepare called only if there is a wait\n            ITT_NOTIFY(sync_prepare, &s[0]);\n            spin_wait_while( segment_not_used_predicate(s[0]));\n            array0 = s[0].load<acquire>();\n        }\n        ITT_NOTIFY(sync_acquired, &s[0]);\n        if(array0 != segment_allocated()) { // check for segment_allocation_failed state of initial segment\n            publish_segment(s[k], segment_allocation_failed()); // and assign segment_allocation_failed state here\n            throw_exception(eid_bad_last_alloc); // throw custom exception\n        }\n        publish_segment( s[k],\n            static_cast<void*>(array0.pointer<char>() + segment_base(k)*element_size )\n        );\n    } else {\n        segment_scope_guard k_segment_guard(s[k], mark_as_not_used_on_failure);\n        publish_segment(s[k], allocate_segment(v, size_to_allocate));\n        k_segment_guard.dismiss();\n    }\n    return size_of_enabled_segment;\n}\n\nvoid concurrent_vector_base_v3::helper::cleanup() {\n    if( !sz ) { // allocation failed, restore the table\n        segment_index_t k_start = k, k_end = segment_index_of(finish-1);\n        if( segment_base( k_start ) < start )\n            get_segment_value(k_start++, true); // wait\n        if( k_start < first_block ) {\n            segment_value_t segment0 = get_segment_value(0, start>0); // wait if necessary\n            if((segment0 != segment_not_used()) && !k_start ) ++k_start;\n            if(segment0 != segment_allocated())\n                for(; k_start < first_block && k_start <= k_end; ++k_start )\n                    publish_segment(table[k_start], segment_allocation_failed());\n            else for(; k_start < first_block && k_start <= k_end; ++k_start )\n                    publish_segment(table[k_start], static_cast<void*>(\n                        (segment0.pointer<char>()) + segment_base(k_start)*element_size) );\n        }\n        for(; k_start <= k_end; ++k_start ) // not in first block\n            if(table[k_start].load<acquire>() == segment_not_used())\n                publish_segment(table[k_start], segment_allocation_failed());\n        // fill allocated items\n        first_segment();\n        goto recover;\n    }\n    while( sz <= finish ) { // there is still work for at least one segment\n        next_segment();\nrecover:\n        segment_value_t array = table[k].load<relaxed>();\n        if(array == segment_allocated())\n            std::memset( (array.pointer<char>()) + element_size*start, 0, ((sz<finish?sz:finish) - start)*element_size );\n        else __TBB_ASSERT( array == segment_allocation_failed(), NULL );\n    }\n}\n\nconcurrent_vector_base_v3::~concurrent_vector_base_v3() {\n    segment_t* s = my_segment;\n    if( s != my_storage ) {\n#if TBB_USE_ASSERT\n        //to please assert in segment_t destructor\n        std::fill_n(my_storage,size_t(pointers_per_short_table),segment_t());\n#endif /* TBB_USE_ASSERT */\n#if TBB_USE_DEBUG\n        for( segment_index_t i = 0; i < pointers_per_long_table; i++)\n            __TBB_ASSERT( my_segment[i].load<relaxed>() != segment_allocated(), \"Segment should have been freed. Please recompile with new TBB before using exceptions.\");\n#endif\n        my_segment = my_storage;\n        NFS_Free( s );\n    }\n}\n\nconcurrent_vector_base_v3::size_type concurrent_vector_base_v3::internal_capacity() const {\n    return segment_base( helper::find_segment_end(*this) );\n}\n\nvoid concurrent_vector_base_v3::internal_throw_exception(size_type t) const {\n    switch(t) {\n        case 0: throw_exception(eid_out_of_range);\n        case 1: throw_exception(eid_segment_range_error);\n        case 2: throw_exception(eid_index_range_error);\n    }\n}\n\nvoid concurrent_vector_base_v3::internal_reserve( size_type n, size_type element_size, size_type max_size ) {\n    if( n>max_size )\n        throw_exception(eid_reservation_length_error);\n    __TBB_ASSERT( n, NULL );\n    helper::assign_first_segment_if_necessary(*this, segment_index_of(n-1));\n    segment_index_t k = helper::find_segment_end(*this);\n\n    for( ; segment_base(k)<n; ++k ) {\n        helper::extend_table_if_necessary(*this, k, 0);\n        if(my_segment[k].load<relaxed>() != segment_allocated())\n            helper::enable_segment(*this, k, element_size, true ); //in case of failure mark segments as not used\n    }\n}\n\n//TODO: Looks like atomic loads can be done relaxed here, as the only place this method is called from\n//is the constructor, which does not require synchronization (for more details see comment in the\n// concurrent_vector_base constructor).\nvoid concurrent_vector_base_v3::internal_copy( const concurrent_vector_base_v3& src, size_type element_size, internal_array_op2 copy ) {\n    size_type n = src.my_early_size;\n    __TBB_ASSERT( my_segment == my_storage, NULL);\n    if( n ) {\n        helper::assign_first_segment_if_necessary(*this, segment_index_of(n-1));\n        size_type b;\n        for( segment_index_t k=0; (b=segment_base(k))<n; ++k ) {\n            if( (src.my_segment.load<acquire>() == src.my_storage && k >= pointers_per_short_table)\n                || (src.my_segment[k].load<relaxed>() != segment_allocated())) {\n                my_early_size = b; break;\n            }\n            helper::extend_table_if_necessary(*this, k, 0);\n            size_type m = helper::enable_segment(*this, k, element_size);\n            if( m > n-b ) m = n-b;\n            my_early_size = b+m;\n            copy( my_segment[k].load<relaxed>().pointer<void>(), src.my_segment[k].load<relaxed>().pointer<void>(), m );\n        }\n    }\n}\n\nvoid concurrent_vector_base_v3::internal_assign( const concurrent_vector_base_v3& src, size_type element_size, internal_array_op1 destroy, internal_array_op2 assign, internal_array_op2 copy ) {\n    size_type n = src.my_early_size;\n    while( my_early_size>n ) { // TODO: improve\n        segment_index_t k = segment_index_of( my_early_size-1 );\n        size_type b=segment_base(k);\n        size_type new_end = b>=n ? b : n;\n        __TBB_ASSERT( my_early_size>new_end, NULL );\n        if( my_segment[k].load<relaxed>() != segment_allocated()) // check vector was broken before\n            throw_exception(eid_bad_last_alloc); // throw custom exception\n        // destructors are supposed to not throw any exceptions\n        destroy( my_segment[k].load<relaxed>().pointer<char>() + element_size*(new_end-b), my_early_size-new_end );\n        my_early_size = new_end;\n    }\n    size_type dst_initialized_size = my_early_size;\n    my_early_size = n;\n    helper::assign_first_segment_if_necessary(*this, segment_index_of(n));\n    size_type b;\n    for( segment_index_t k=0; (b=segment_base(k))<n; ++k ) {\n        if( (src.my_segment.load<acquire>() == src.my_storage && k >= pointers_per_short_table)\n            || src.my_segment[k].load<relaxed>() != segment_allocated() ) { // if source is damaged\n                my_early_size = b; break; // TODO: it may cause undestructed items\n        }\n        helper::extend_table_if_necessary(*this, k, 0);\n        if( my_segment[k].load<relaxed>() == segment_not_used())\n            helper::enable_segment(*this, k, element_size);\n        else if( my_segment[k].load<relaxed>() != segment_allocated() )\n            throw_exception(eid_bad_last_alloc); // throw custom exception\n        size_type m = k? segment_size(k) : 2;\n        if( m > n-b ) m = n-b;\n        size_type a = 0;\n        if( dst_initialized_size>b ) {\n            a = dst_initialized_size-b;\n            if( a>m ) a = m;\n            assign( my_segment[k].load<relaxed>().pointer<void>(), src.my_segment[k].load<relaxed>().pointer<void>(), a );\n            m -= a;\n            a *= element_size;\n        }\n        if( m>0 )\n            copy( my_segment[k].load<relaxed>().pointer<char>() + a, src.my_segment[k].load<relaxed>().pointer<char>() + a, m );\n    }\n    __TBB_ASSERT( src.my_early_size==n, \"detected use of concurrent_vector::operator= with right side that was concurrently modified\" );\n}\n\nvoid* concurrent_vector_base_v3::internal_push_back( size_type element_size, size_type& index ) {\n    __TBB_ASSERT( sizeof(my_early_size)==sizeof(uintptr_t), NULL );\n    size_type tmp = my_early_size.fetch_and_increment<acquire>();\n    index = tmp;\n    segment_index_t k_old = segment_index_of( tmp );\n    size_type base = segment_base(k_old);\n    helper::extend_table_if_necessary(*this, k_old, tmp);\n    segment_t& s = helper::acquire_segment(*this, k_old, element_size, base==tmp);\n    size_type j_begin = tmp-base;\n    return (void*)(s.load<relaxed>().pointer<char>() + element_size*j_begin);\n}\n\nvoid concurrent_vector_base_v3::internal_grow_to_at_least( size_type new_size, size_type element_size, internal_array_op2 init, const void *src ) {\n    internal_grow_to_at_least_with_result( new_size, element_size, init, src );\n}\n\nconcurrent_vector_base_v3::size_type concurrent_vector_base_v3::internal_grow_to_at_least_with_result( size_type new_size, size_type element_size, internal_array_op2 init, const void *src ) {\n    size_type e = my_early_size;\n    while( e<new_size ) {\n        size_type f = my_early_size.compare_and_swap(new_size,e);\n        if( f==e ) {\n            internal_grow( e, new_size, element_size, init, src );\n            break;\n        }\n        e = f;\n    }\n    // Check/wait for segments allocation completes\n    segment_index_t i, k_old = segment_index_of( new_size-1 );\n    if( k_old >= pointers_per_short_table && my_segment == my_storage ) {\n        spin_wait_while_eq( my_segment, my_storage );\n    }\n    for( i = 0; i <= k_old; ++i ) {\n        segment_t &s = my_segment[i];\n        if(s.load<relaxed>() == segment_not_used()) {\n            ITT_NOTIFY(sync_prepare, &s);\n            atomic_backoff backoff(true);\n            while( my_segment[i].load<acquire>() == segment_not_used() ) // my_segment may change concurrently\n                backoff.pause();\n            ITT_NOTIFY(sync_acquired, &s);\n        }\n        if( my_segment[i].load<relaxed>() != segment_allocated() )\n            throw_exception(eid_bad_last_alloc);\n    }\n#if TBB_USE_DEBUG\n    size_type capacity = internal_capacity();\n    __TBB_ASSERT( capacity >= new_size, NULL);\n#endif\n    return e;\n}\n\nconcurrent_vector_base_v3::size_type concurrent_vector_base_v3::internal_grow_by( size_type delta, size_type element_size, internal_array_op2 init, const void *src ) {\n    size_type result = my_early_size.fetch_and_add(delta);\n    internal_grow( result, result+delta, element_size, init, src );\n    return result;\n}\n\nvoid concurrent_vector_base_v3::internal_grow( const size_type start, size_type finish, size_type element_size, internal_array_op2 init, const void *src ) {\n    __TBB_ASSERT( start<finish, \"start must be less than finish\" );\n    segment_index_t k_start = segment_index_of(start), k_end = segment_index_of(finish-1);\n    helper::assign_first_segment_if_necessary(*this, k_end);\n    helper::extend_table_if_necessary(*this, k_end, start);\n    helper range(my_segment, my_first_block, element_size, k_start, start, finish);\n    for(; k_end > k_start && k_end >= range.first_block; --k_end ) // allocate segments in reverse order\n        helper::acquire_segment(*this, k_end, element_size, true/*for k_end>k_start*/);\n    for(; k_start <= k_end; ++k_start ) // but allocate first block in straight order\n        helper::acquire_segment(*this, k_start, element_size, segment_base( k_start ) >= start );\n    range.apply( helper::init_body(init, src) );\n}\n\nvoid concurrent_vector_base_v3::internal_resize( size_type n, size_type element_size, size_type max_size, const void *src,\n                                                internal_array_op1 destroy, internal_array_op2 init ) {\n    size_type j = my_early_size;\n    if( n > j ) { // construct items\n        internal_reserve(n, element_size, max_size);\n        my_early_size = n;\n        helper for_each(my_segment, my_first_block, element_size, segment_index_of(j), j, n);\n        for_each.apply( helper::safe_init_body(init, src) );\n    } else {\n        my_early_size = n;\n        helper for_each(my_segment, my_first_block, element_size, segment_index_of(n), n, j);\n        for_each.apply( helper::destroy_body(destroy) );\n    }\n}\n\nconcurrent_vector_base_v3::segment_index_t concurrent_vector_base_v3::internal_clear( internal_array_op1 destroy ) {\n    __TBB_ASSERT( my_segment, NULL );\n    size_type j = my_early_size;\n    my_early_size = 0;\n    helper for_each(my_segment, my_first_block, 0, 0, 0, j); // element_size is safe to be zero if 'start' is zero\n    j = for_each.apply( helper::destroy_body(destroy) );\n    size_type i = helper::find_segment_end(*this);\n    return j < i? i : j+1;\n}\n\nvoid *concurrent_vector_base_v3::internal_compact( size_type element_size, void *table, internal_array_op1 destroy, internal_array_op2 copy )\n{\n    const size_type my_size = my_early_size;\n    const segment_index_t k_end = helper::find_segment_end(*this); // allocated segments\n    const segment_index_t k_stop = my_size? segment_index_of(my_size-1) + 1 : 0; // number of segments to store existing items: 0=>0; 1,2=>1; 3,4=>2; [5-8]=>3;..\n    const segment_index_t first_block = my_first_block; // number of merged segments, getting values from atomics\n\n    segment_index_t k = first_block;\n    if(k_stop < first_block)\n        k = k_stop;\n    else\n        while (k < k_stop && helper::incompact_predicate(segment_size( k ) * element_size) ) k++;\n    if(k_stop == k_end && k == first_block)\n        return NULL;\n\n    segment_t *const segment_table = my_segment;\n    internal_segments_table &old = *static_cast<internal_segments_table*>( table );\n    //this call is left here for sake of backward compatibility, and as a placeholder for table initialization\n    std::fill_n(old.table,sizeof(old.table)/sizeof(old.table[0]),segment_t());\n    old.first_block=0;\n\n    if ( k != first_block && k ) // first segment optimization\n    {\n        // exception can occur here\n        void *seg = helper::allocate_segment(*this, segment_size(k));\n        old.table[0].store<relaxed>(seg);\n        old.first_block = k; // fill info for freeing new segment if exception occurs\n        // copy items to the new segment\n        size_type my_segment_size = segment_size( first_block );\n        for (segment_index_t i = 0, j = 0; i < k && j < my_size; j = my_segment_size) {\n            __TBB_ASSERT( segment_table[i].load<relaxed>() == segment_allocated(), NULL);\n            void *s = static_cast<void*>(\n                static_cast<char*>(seg) + segment_base(i)*element_size );\n            //TODO: refactor to use std::min\n            if(j + my_segment_size >= my_size) my_segment_size = my_size - j;\n            __TBB_TRY { // exception can occur here\n                copy( s, segment_table[i].load<relaxed>().pointer<void>(), my_segment_size );\n            } __TBB_CATCH(...) { // destroy all the already copied items\n                helper for_each(&old.table[0], old.first_block, element_size,\n                    0, 0, segment_base(i)+ my_segment_size);\n                for_each.apply( helper::destroy_body(destroy) );\n                __TBB_RETHROW();\n            }\n            my_segment_size = i? segment_size( ++i ) : segment_size( i = first_block );\n        }\n        // commit the changes\n        std::copy(segment_table,segment_table + k,old.table);\n        for (segment_index_t i = 0; i < k; i++) {\n            segment_table[i].store<relaxed>(static_cast<void*>(\n                static_cast<char*>(seg) + segment_base(i)*element_size ));\n        }\n        old.first_block = first_block; my_first_block = k; // now, first_block != my_first_block\n        // destroy original copies\n        my_segment_size = segment_size( first_block ); // old.first_block actually\n        for (segment_index_t i = 0, j = 0; i < k && j < my_size; j = my_segment_size) {\n            if(j + my_segment_size >= my_size) my_segment_size = my_size - j;\n            // destructors are supposed to not throw any exceptions\n            destroy( old.table[i].load<relaxed>().pointer<void>(), my_segment_size );\n            my_segment_size = i? segment_size( ++i ) : segment_size( i = first_block );\n        }\n    }\n    // free unnecessary segments allocated by reserve() call\n    if ( k_stop < k_end ) {\n        old.first_block = first_block;\n        std::copy(segment_table+k_stop, segment_table+k_end, old.table+k_stop );\n        std::fill_n(segment_table+k_stop, (k_end-k_stop), segment_t());\n        if( !k ) my_first_block = 0;\n    }\n    return table;\n}\n\nvoid concurrent_vector_base_v3::internal_swap(concurrent_vector_base_v3& v)\n{\n    size_type my_sz = my_early_size.load<acquire>();\n    size_type v_sz = v.my_early_size.load<relaxed>();\n    if(!my_sz && !v_sz) return;\n\n    bool my_was_short = (my_segment.load<relaxed>() == my_storage);\n    bool v_was_short  = (v.my_segment.load<relaxed>() == v.my_storage);\n\n    //In C++11, this would be: swap(my_storage, v.my_storage);\n    for (int i=0; i < pointers_per_short_table; ++i){\n        swap(my_storage[i], v.my_storage[i]);\n    }\n    tbb::internal::swap<relaxed>(my_first_block, v.my_first_block);\n    tbb::internal::swap<relaxed>(my_segment, v.my_segment);\n    if (my_was_short){\n        v.my_segment.store<relaxed>(v.my_storage);\n    }\n    if(v_was_short){\n        my_segment.store<relaxed>(my_storage);\n    }\n\n    my_early_size.store<relaxed>(v_sz);\n    v.my_early_size.store<release>(my_sz);\n}\n\n} // namespace internal\n\n} // tbb\n"
  },
  {
    "path": "benchmarks/tbb/concurrent_vector.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_concurrent_vector_H\n#define __TBB_concurrent_vector_H\n\n#include \"tbb_stddef.h\"\n#include \"tbb_exception.h\"\n#include \"atomic.h\"\n#include \"cache_aligned_allocator.h\"\n#include \"blocked_range.h\"\n#include \"tbb_machine.h\"\n#include \"tbb_profiling.h\"\n#include <new>\n#include <cstring>   // for memset()\n\n#if !TBB_USE_EXCEPTIONS && _MSC_VER\n    // Suppress \"C++ exception handler used, but unwind semantics are not enabled\" warning in STL headers\n    #pragma warning (push)\n    #pragma warning (disable: 4530)\n#endif\n\n#include <algorithm>\n#include <iterator>\n\n#if !TBB_USE_EXCEPTIONS && _MSC_VER\n    #pragma warning (pop)\n#endif\n\n#if _MSC_VER==1500 && !__INTEL_COMPILER\n    // VS2008/VC9 seems to have an issue; limits pull in math.h\n    #pragma warning( push )\n    #pragma warning( disable: 4985 )\n#endif\n#include <limits> /* std::numeric_limits */\n#if _MSC_VER==1500 && !__INTEL_COMPILER\n    #pragma warning( pop )\n#endif\n\n#if __TBB_INITIALIZER_LISTS_PRESENT\n    #include <initializer_list>\n#endif\n\n#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)\n    // Workaround for overzealous compiler warnings in /Wp64 mode\n    #pragma warning (push)\n#if defined(_Wp64)\n    #pragma warning (disable: 4267)\n#endif\n    #pragma warning (disable: 4127) //warning C4127: conditional expression is constant\n#endif\n\nnamespace tbb {\n\ntemplate<typename T, class A = cache_aligned_allocator<T> >\nclass concurrent_vector;\n\ntemplate<typename Container, typename Value>\nclass vector_iterator;\n\n//! @cond INTERNAL\nnamespace internal {\n\n    //! Bad allocation marker\n    static void *const vector_allocation_error_flag = reinterpret_cast<void*>(size_t(63));\n\n    //! Exception helper function\n    template<typename T>\n    void handle_unconstructed_elements(T* array, size_t n_of_elements){\n        std::memset(array, 0, n_of_elements * sizeof(T));\n    }\n\n    //! Base class of concurrent vector implementation.\n    /** @ingroup containers */\n    class concurrent_vector_base_v3 {\n    protected:\n\n        // Basic types declarations\n        typedef size_t segment_index_t;\n        typedef size_t size_type;\n\n        // Using enumerations due to Mac linking problems of static const variables\n        enum {\n            // Size constants\n            default_initial_segments = 1, // 2 initial items\n            //! Number of slots for segment pointers inside the class\n            pointers_per_short_table = 3, // to fit into 8 words of entire structure\n            pointers_per_long_table = sizeof(segment_index_t) * 8 // one segment per bit\n        };\n\n        struct segment_not_used {};\n        struct segment_allocated {};\n        struct segment_allocation_failed {};\n\n        class segment_t;\n        class segment_value_t {\n            void* array;\n        private:\n            //TODO: More elegant way to grant access to selected functions _only_?\n            friend class segment_t;\n            explicit segment_value_t(void* an_array):array(an_array) {}\n        public:\n            friend bool operator==(segment_value_t const& lhs, segment_not_used ) { return lhs.array == 0;}\n            friend bool operator==(segment_value_t const& lhs, segment_allocated) { return lhs.array > internal::vector_allocation_error_flag;}\n            friend bool operator==(segment_value_t const& lhs, segment_allocation_failed) { return lhs.array == internal::vector_allocation_error_flag;}\n            template<typename argument_type>\n            friend bool operator!=(segment_value_t const& lhs, argument_type arg) { return ! (lhs == arg);}\n\n            template<typename T>\n            T* pointer() const {  return static_cast<T*>(const_cast<void*>(array)); }\n        };\n\n        // Segment pointer.\n        class segment_t {\n            atomic<void*> array;\n        public:\n            segment_t(){ store<relaxed>(segment_not_used());}\n            //Copy ctor and assignment operator are defined to ease using of stl algorithms.\n            //These algorithms usually not a synchronization point, so, semantic is\n            //intentionally relaxed here.\n            segment_t(segment_t const& rhs ){ array.store<relaxed>(rhs.array.load<relaxed>());}\n\n            void swap(segment_t & rhs ){\n                tbb::internal::swap<relaxed>(array, rhs.array);\n            }\n\n            segment_t& operator=(segment_t const& rhs ){\n                array.store<relaxed>(rhs.array.load<relaxed>());\n                return *this;\n            }\n\n            template<memory_semantics M>\n            segment_value_t load() const { return segment_value_t(array.load<M>());}\n\n            template<memory_semantics M>\n            void store(segment_not_used) {\n                array.store<M>(0);\n            }\n\n            template<memory_semantics M>\n            void store(segment_allocation_failed) {\n                __TBB_ASSERT(load<relaxed>() != segment_allocated(),\"transition from \\\"allocated\\\" to \\\"allocation failed\\\" state looks non-logical\");\n                array.store<M>(internal::vector_allocation_error_flag);\n            }\n\n            template<memory_semantics M>\n            void store(void* allocated_segment_pointer) __TBB_NOEXCEPT(true) {\n                __TBB_ASSERT(segment_value_t(allocated_segment_pointer) == segment_allocated(),\n                     \"other overloads of store should be used for marking segment as not_used or allocation_failed\" );\n                array.store<M>(allocated_segment_pointer);\n            }\n\n#if TBB_USE_ASSERT\n            ~segment_t() {\n                __TBB_ASSERT(load<relaxed>() != segment_allocated(), \"should have been freed by clear\" );\n            }\n#endif /* TBB_USE_ASSERT */\n        };\n        friend void swap(segment_t & , segment_t & ) __TBB_NOEXCEPT(true);\n\n        // Data fields\n\n        //! allocator function pointer\n        void* (*vector_allocator_ptr)(concurrent_vector_base_v3 &, size_t);\n\n        //! count of segments in the first block\n        atomic<size_type> my_first_block;\n\n        //! Requested size of vector\n        atomic<size_type> my_early_size;\n\n        //! Pointer to the segments table\n        atomic<segment_t*> my_segment;\n\n        //! embedded storage of segment pointers\n        segment_t my_storage[pointers_per_short_table];\n\n        // Methods\n\n        concurrent_vector_base_v3() {\n            //Here the semantic is intentionally relaxed.\n            //The reason this is next:\n            //Object that is in middle of construction (i.e. its constructor is not yet finished)\n            //cannot be used concurrently until the construction is finished.\n            //Thus to flag other threads that construction is finished, some synchronization with\n            //acquire-release semantic should be done by the (external) code that uses the vector.\n            //So, no need to do the synchronization inside the vector.\n\n            my_early_size.store<relaxed>(0);\n            my_first_block.store<relaxed>(0); // here is not default_initial_segments\n            my_segment.store<relaxed>(my_storage);\n        }\n\n        __TBB_EXPORTED_METHOD ~concurrent_vector_base_v3();\n\n        //these helpers methods use the fact that segments are allocated so\n        //that every segment size is a (increasing) power of 2.\n        //with one exception 0 segment has size of 2 as well segment 1;\n        //e.g. size of segment with index of 3 is 2^3=8;\n        static segment_index_t segment_index_of( size_type index ) {\n            return segment_index_t( __TBB_Log2( index|1 ) );\n        }\n\n        static segment_index_t segment_base( segment_index_t k ) {\n            return (segment_index_t(1)<<k & ~segment_index_t(1));\n        }\n\n        static inline segment_index_t segment_base_index_of( segment_index_t &index ) {\n            segment_index_t k = segment_index_of( index );\n            index -= segment_base(k);\n            return k;\n        }\n\n        static size_type segment_size( segment_index_t k ) {\n            return segment_index_t(1)<<k; // fake value for k==0\n        }\n\n\n        static bool is_first_element_in_segment(size_type element_index){\n            //check if element_index is a power of 2 that is at least 2.\n            //The idea is to detect if the iterator crosses a segment boundary,\n            //and 2 is the minimal index for which it's true\n            __TBB_ASSERT(element_index, \"there should be no need to call \"\n                                        \"is_first_element_in_segment for 0th element\" );\n            return is_power_of_two_factor( element_index, 2 );\n        }\n\n        //! An operation on an n-element array starting at begin.\n        typedef void (__TBB_EXPORTED_FUNC *internal_array_op1)(void* begin, size_type n );\n\n        //! An operation on n-element destination array and n-element source array.\n        typedef void (__TBB_EXPORTED_FUNC *internal_array_op2)(void* dst, const void* src, size_type n );\n\n        //! Internal structure for compact()\n        struct internal_segments_table {\n            segment_index_t first_block;\n            segment_t table[pointers_per_long_table];\n        };\n\n        void __TBB_EXPORTED_METHOD internal_reserve( size_type n, size_type element_size, size_type max_size );\n        size_type __TBB_EXPORTED_METHOD internal_capacity() const;\n        void internal_grow( size_type start, size_type finish, size_type element_size, internal_array_op2 init, const void *src );\n        size_type __TBB_EXPORTED_METHOD internal_grow_by( size_type delta, size_type element_size, internal_array_op2 init, const void *src );\n        void* __TBB_EXPORTED_METHOD internal_push_back( size_type element_size, size_type& index );\n        segment_index_t __TBB_EXPORTED_METHOD internal_clear( internal_array_op1 destroy );\n        void* __TBB_EXPORTED_METHOD internal_compact( size_type element_size, void *table, internal_array_op1 destroy, internal_array_op2 copy );\n        void __TBB_EXPORTED_METHOD internal_copy( const concurrent_vector_base_v3& src, size_type element_size, internal_array_op2 copy );\n        void __TBB_EXPORTED_METHOD internal_assign( const concurrent_vector_base_v3& src, size_type element_size,\n                              internal_array_op1 destroy, internal_array_op2 assign, internal_array_op2 copy );\n        //! Obsolete\n        void __TBB_EXPORTED_METHOD internal_throw_exception(size_type) const;\n        void __TBB_EXPORTED_METHOD internal_swap(concurrent_vector_base_v3& v);\n\n        void __TBB_EXPORTED_METHOD internal_resize( size_type n, size_type element_size, size_type max_size, const void *src,\n                                                    internal_array_op1 destroy, internal_array_op2 init );\n        size_type __TBB_EXPORTED_METHOD internal_grow_to_at_least_with_result( size_type new_size, size_type element_size, internal_array_op2 init, const void *src );\n\n        //! Deprecated entry point for backwards compatibility to TBB 2.1.\n        void __TBB_EXPORTED_METHOD internal_grow_to_at_least( size_type new_size, size_type element_size, internal_array_op2 init, const void *src );\nprivate:\n        //! Private functionality\n        class helper;\n        friend class helper;\n\n        template<typename Container, typename Value>\n        friend class vector_iterator;\n\n    };\n\n    inline void swap(concurrent_vector_base_v3::segment_t & lhs, concurrent_vector_base_v3::segment_t & rhs) __TBB_NOEXCEPT(true) {\n        lhs.swap(rhs);\n    }\n\n    typedef concurrent_vector_base_v3 concurrent_vector_base;\n\n    //! Meets requirements of a forward iterator for STL and a Value for a blocked_range.*/\n    /** Value is either the T or const T type of the container.\n        @ingroup containers */\n    template<typename Container, typename Value>\n    class vector_iterator\n    {\n        //! concurrent_vector over which we are iterating.\n        Container* my_vector;\n\n        //! Index into the vector\n        size_t my_index;\n\n        //! Caches my_vector-&gt;internal_subscript(my_index)\n        /** NULL if cached value is not available */\n        mutable Value* my_item;\n\n        template<typename C, typename T>\n        friend vector_iterator<C,T> operator+( ptrdiff_t offset, const vector_iterator<C,T>& v );\n\n        template<typename C, typename T, typename U>\n        friend bool operator==( const vector_iterator<C,T>& i, const vector_iterator<C,U>& j );\n\n        template<typename C, typename T, typename U>\n        friend bool operator<( const vector_iterator<C,T>& i, const vector_iterator<C,U>& j );\n\n        template<typename C, typename T, typename U>\n        friend ptrdiff_t operator-( const vector_iterator<C,T>& i, const vector_iterator<C,U>& j );\n\n        template<typename C, typename U>\n        friend class internal::vector_iterator;\n\n#if !defined(_MSC_VER) || defined(__INTEL_COMPILER)\n        template<typename T, class A>\n        friend class tbb::concurrent_vector;\n#else\npublic: // workaround for MSVC\n#endif\n\n        vector_iterator( const Container& vector, size_t index, void *ptr = 0 ) :\n            my_vector(const_cast<Container*>(&vector)),\n            my_index(index),\n            my_item(static_cast<Value*>(ptr))\n        {}\n\n    public:\n        //! Default constructor\n        vector_iterator() : my_vector(NULL), my_index(~size_t(0)), my_item(NULL) {}\n\n        vector_iterator( const vector_iterator<Container,typename Container::value_type>& other ) :\n            my_vector(other.my_vector),\n            my_index(other.my_index),\n            my_item(other.my_item)\n        {}\n\n        vector_iterator operator+( ptrdiff_t offset ) const {\n            return vector_iterator( *my_vector, my_index+offset );\n        }\n        vector_iterator &operator+=( ptrdiff_t offset ) {\n            my_index+=offset;\n            my_item = NULL;\n            return *this;\n        }\n        vector_iterator operator-( ptrdiff_t offset ) const {\n            return vector_iterator( *my_vector, my_index-offset );\n        }\n        vector_iterator &operator-=( ptrdiff_t offset ) {\n            my_index-=offset;\n            my_item = NULL;\n            return *this;\n        }\n        Value& operator*() const {\n            Value* item = my_item;\n            if( !item ) {\n                item = my_item = &my_vector->internal_subscript(my_index);\n            }\n            __TBB_ASSERT( item==&my_vector->internal_subscript(my_index), \"corrupt cache\" );\n            return *item;\n        }\n        Value& operator[]( ptrdiff_t k ) const {\n            return my_vector->internal_subscript(my_index+k);\n        }\n        Value* operator->() const {return &operator*();}\n\n        //! Pre increment\n        vector_iterator& operator++() {\n            size_t element_index = ++my_index;\n            if( my_item ) {\n                //TODO: consider using of knowledge about \"first_block optimization\" here as well?\n                if( concurrent_vector_base::is_first_element_in_segment(element_index)) {\n                    //if the iterator crosses a segment boundary, the pointer become invalid\n                    //as possibly next segment is in another memory location\n                    my_item= NULL;\n                } else {\n                    ++my_item;\n                }\n            }\n            return *this;\n        }\n\n        //! Pre decrement\n        vector_iterator& operator--() {\n            __TBB_ASSERT( my_index>0, \"operator--() applied to iterator already at beginning of concurrent_vector\" );\n            size_t element_index = my_index--;\n            if( my_item ) {\n                if(concurrent_vector_base::is_first_element_in_segment(element_index)) {\n                    //if the iterator crosses a segment boundary, the pointer become invalid\n                    //as possibly next segment is in another memory location\n                    my_item= NULL;\n                } else {\n                    --my_item;\n                }\n            }\n            return *this;\n        }\n\n        //! Post increment\n        vector_iterator operator++(int) {\n            vector_iterator result = *this;\n            operator++();\n            return result;\n        }\n\n        //! Post decrement\n        vector_iterator operator--(int) {\n            vector_iterator result = *this;\n            operator--();\n            return result;\n        }\n\n        // STL support\n\n        typedef ptrdiff_t difference_type;\n        typedef Value value_type;\n        typedef Value* pointer;\n        typedef Value& reference;\n        typedef std::random_access_iterator_tag iterator_category;\n    };\n\n    template<typename Container, typename T>\n    vector_iterator<Container,T> operator+( ptrdiff_t offset, const vector_iterator<Container,T>& v ) {\n        return vector_iterator<Container,T>( *v.my_vector, v.my_index+offset );\n    }\n\n    template<typename Container, typename T, typename U>\n    bool operator==( const vector_iterator<Container,T>& i, const vector_iterator<Container,U>& j ) {\n        return i.my_index==j.my_index && i.my_vector == j.my_vector;\n    }\n\n    template<typename Container, typename T, typename U>\n    bool operator!=( const vector_iterator<Container,T>& i, const vector_iterator<Container,U>& j ) {\n        return !(i==j);\n    }\n\n    template<typename Container, typename T, typename U>\n    bool operator<( const vector_iterator<Container,T>& i, const vector_iterator<Container,U>& j ) {\n        return i.my_index<j.my_index;\n    }\n\n    template<typename Container, typename T, typename U>\n    bool operator>( const vector_iterator<Container,T>& i, const vector_iterator<Container,U>& j ) {\n        return j<i;\n    }\n\n    template<typename Container, typename T, typename U>\n    bool operator>=( const vector_iterator<Container,T>& i, const vector_iterator<Container,U>& j ) {\n        return !(i<j);\n    }\n\n    template<typename Container, typename T, typename U>\n    bool operator<=( const vector_iterator<Container,T>& i, const vector_iterator<Container,U>& j ) {\n        return !(j<i);\n    }\n\n    template<typename Container, typename T, typename U>\n    ptrdiff_t operator-( const vector_iterator<Container,T>& i, const vector_iterator<Container,U>& j ) {\n        return ptrdiff_t(i.my_index)-ptrdiff_t(j.my_index);\n    }\n\n    template<typename T, class A>\n    class allocator_base {\n    public:\n        typedef typename A::template\n            rebind<T>::other allocator_type;\n        allocator_type my_allocator;\n\n        allocator_base(const allocator_type &a = allocator_type() ) : my_allocator(a) {}\n\n    };\n\n} // namespace internal\n//! @endcond\n\n//! Concurrent vector container\n/** concurrent_vector is a container having the following main properties:\n    - It provides random indexed access to its elements. The index of the first element is 0.\n    - It ensures safe concurrent growing its size (different threads can safely append new elements).\n    - Adding new elements does not invalidate existing iterators and does not change indices of existing items.\n\n@par Compatibility\n    The class meets all Container Requirements and Reversible Container Requirements from\n    C++ Standard (See ISO/IEC 14882:2003(E), clause 23.1). But it doesn't meet\n    Sequence Requirements due to absence of insert() and erase() methods.\n\n@par Exception Safety\n    Methods working with memory allocation and/or new elements construction can throw an\n    exception if allocator fails to allocate memory or element's default constructor throws one.\n    Concurrent vector's element of type T must conform to the following requirements:\n    - Throwing an exception is forbidden for destructor of T.\n    - Default constructor of T must not throw an exception OR its non-virtual destructor must safely work when its object memory is zero-initialized.\n    .\n    Otherwise, the program's behavior is undefined.\n@par\n    If an exception happens inside growth or assignment operation, an instance of the vector becomes invalid unless it is stated otherwise in the method documentation.\n    Invalid state means:\n    - There are no guarantees that all items were initialized by a constructor. The rest of items is zero-filled, including item where exception happens.\n    - An invalid vector instance cannot be repaired; it is unable to grow anymore.\n    - Size and capacity reported by the vector are incorrect, and calculated as if the failed operation were successful.\n    - Attempt to access not allocated elements using operator[] or iterators results in access violation or segmentation fault exception, and in case of using at() method a C++ exception is thrown.\n    .\n    If a concurrent grow operation successfully completes, all the elements it has added to the vector will remain valid and accessible even if one of subsequent grow operations fails.\n\n@par Fragmentation\n    Unlike an STL vector, a concurrent_vector does not move existing elements if it needs\n    to allocate more memory. The container is divided into a series of contiguous arrays of\n    elements. The first reservation, growth, or assignment operation determines the size of\n    the first array. Using small number of elements as initial size incurs fragmentation that\n    may increase element access time. Internal layout can be optimized by method compact() that\n    merges several smaller arrays into one solid.\n\n@par Changes since TBB 2.1\n    - Fixed guarantees of concurrent_vector::size() and grow_to_at_least() methods to assure elements are allocated.\n    - Methods end()/rbegin()/back() are partly thread-safe since they use size() to get the end of vector\n    - Added resize() methods (not thread-safe)\n    - Added cbegin/cend/crbegin/crend methods\n    - Changed return type of methods grow* and push_back to iterator\n\n@par Changes since TBB 2.0\n    - Implemented exception-safety guarantees\n    - Added template argument for allocator\n    - Added allocator argument in constructors\n    - Faster index calculation\n    - First growth call specifies a number of segments to be merged in the first allocation.\n    - Fixed memory blow up for swarm of vector's instances of small size\n    - Added grow_by(size_type n, const_reference t) growth using copying constructor to init new items.\n    - Added STL-like constructors.\n    - Added operators ==, < and derivatives\n    - Added at() method, approved for using after an exception was thrown inside the vector\n    - Added get_allocator() method.\n    - Added assign() methods\n    - Added compact() method to defragment first segments\n    - Added swap() method\n    - range() defaults on grainsize = 1 supporting auto grainsize algorithms.\n\n    @ingroup containers */\ntemplate<typename T, class A>\nclass concurrent_vector: protected internal::allocator_base<T, A>,\n                         private internal::concurrent_vector_base {\nprivate:\n    template<typename I>\n    class generic_range_type: public blocked_range<I> {\n    public:\n        typedef T value_type;\n        typedef T& reference;\n        typedef const T& const_reference;\n        typedef I iterator;\n        typedef ptrdiff_t difference_type;\n        generic_range_type( I begin_, I end_, size_t grainsize_ = 1) : blocked_range<I>(begin_,end_,grainsize_) {}\n        template<typename U>\n        generic_range_type( const generic_range_type<U>& r) : blocked_range<I>(r.begin(),r.end(),r.grainsize()) {}\n        generic_range_type( generic_range_type& r, split ) : blocked_range<I>(r,split()) {}\n    };\n\n    template<typename C, typename U>\n    friend class internal::vector_iterator;\n\npublic:\n    //------------------------------------------------------------------------\n    // STL compatible types\n    //------------------------------------------------------------------------\n    typedef internal::concurrent_vector_base_v3::size_type size_type;\n    typedef typename internal::allocator_base<T, A>::allocator_type allocator_type;\n\n    typedef T value_type;\n    typedef ptrdiff_t difference_type;\n    typedef T& reference;\n    typedef const T& const_reference;\n    typedef T *pointer;\n    typedef const T *const_pointer;\n\n    typedef internal::vector_iterator<concurrent_vector,T> iterator;\n    typedef internal::vector_iterator<concurrent_vector,const T> const_iterator;\n\n#if !defined(_MSC_VER) || _CPPLIB_VER>=300\n    // Assume ISO standard definition of std::reverse_iterator\n    typedef std::reverse_iterator<iterator> reverse_iterator;\n    typedef std::reverse_iterator<const_iterator> const_reverse_iterator;\n#else\n    // Use non-standard std::reverse_iterator\n    typedef std::reverse_iterator<iterator,T,T&,T*> reverse_iterator;\n    typedef std::reverse_iterator<const_iterator,T,const T&,const T*> const_reverse_iterator;\n#endif /* defined(_MSC_VER) && (_MSC_VER<1300) */\n\n    //------------------------------------------------------------------------\n    // Parallel algorithm support\n    //------------------------------------------------------------------------\n    typedef generic_range_type<iterator> range_type;\n    typedef generic_range_type<const_iterator> const_range_type;\n\n    //------------------------------------------------------------------------\n    // STL compatible constructors & destructors\n    //------------------------------------------------------------------------\n\n    //! Construct empty vector.\n    explicit concurrent_vector(const allocator_type &a = allocator_type())\n        : internal::allocator_base<T, A>(a), internal::concurrent_vector_base()\n    {\n        vector_allocator_ptr = &internal_allocator;\n    }\n\n    //Constructors are not required to have synchronization\n    //(for more details see comment in the concurrent_vector_base constructor).\n#if __TBB_INITIALIZER_LISTS_PRESENT\n    //! Constructor from initializer_list\n    concurrent_vector(std::initializer_list<T> init_list, const allocator_type &a = allocator_type())\n        : internal::allocator_base<T, A>(a), internal::concurrent_vector_base()\n    {\n        vector_allocator_ptr = &internal_allocator;\n        __TBB_TRY {\n            internal_assign_iterators(init_list.begin(), init_list.end());\n        } __TBB_CATCH(...) {\n            segment_t *table = my_segment.load<relaxed>();;\n            internal_free_segments( table, internal_clear(&destroy_array), my_first_block.load<relaxed>());\n            __TBB_RETHROW();\n        }\n\n    }\n#endif //# __TBB_INITIALIZER_LISTS_PRESENT\n\n    //! Copying constructor\n    concurrent_vector( const concurrent_vector& vector, const allocator_type& a = allocator_type() )\n        : internal::allocator_base<T, A>(a), internal::concurrent_vector_base()\n    {\n        vector_allocator_ptr = &internal_allocator;\n        __TBB_TRY {\n            internal_copy(vector, sizeof(T), &copy_array);\n        } __TBB_CATCH(...) {\n            segment_t *table = my_segment.load<relaxed>();\n            internal_free_segments( table, internal_clear(&destroy_array), my_first_block.load<relaxed>());\n            __TBB_RETHROW();\n        }\n    }\n\n#if __TBB_CPP11_RVALUE_REF_PRESENT\n    //! Move constructor\n    //TODO add __TBB_NOEXCEPT(true) and static_assert(std::has_nothrow_move_constructor<A>::value)\n    concurrent_vector( concurrent_vector&& source)\n        : internal::allocator_base<T, A>(std::move(source)), internal::concurrent_vector_base()\n    {\n        vector_allocator_ptr = &internal_allocator;\n        concurrent_vector_base_v3::internal_swap(source);\n    }\n\n    concurrent_vector( concurrent_vector&& source, const allocator_type& a)\n        : internal::allocator_base<T, A>(a), internal::concurrent_vector_base()\n    {\n        vector_allocator_ptr = &internal_allocator;\n        //C++ standard requires instances of an allocator being compared for equality,\n        //which means that memory allocated by one instance is possible to deallocate with the other one.\n        if (a == source.my_allocator) {\n            concurrent_vector_base_v3::internal_swap(source);\n        } else {\n            __TBB_TRY {\n                internal_copy(source, sizeof(T), &move_array);\n            } __TBB_CATCH(...) {\n                segment_t *table = my_segment.load<relaxed>();\n                internal_free_segments( table, internal_clear(&destroy_array), my_first_block.load<relaxed>());\n                __TBB_RETHROW();\n            }\n        }\n    }\n\n#endif\n\n    //! Copying constructor for vector with different allocator type\n    template<class M>\n    concurrent_vector( const concurrent_vector<T, M>& vector, const allocator_type& a = allocator_type() )\n        : internal::allocator_base<T, A>(a), internal::concurrent_vector_base()\n    {\n        vector_allocator_ptr = &internal_allocator;\n        __TBB_TRY {\n            internal_copy(vector.internal_vector_base(), sizeof(T), &copy_array);\n        } __TBB_CATCH(...) {\n            segment_t *table = my_segment.load<relaxed>();\n            internal_free_segments( table, internal_clear(&destroy_array), my_first_block.load<relaxed>() );\n            __TBB_RETHROW();\n        }\n    }\n\n    //! Construction with initial size specified by argument n\n    explicit concurrent_vector(size_type n)\n    {\n        vector_allocator_ptr = &internal_allocator;\n        __TBB_TRY {\n            internal_resize( n, sizeof(T), max_size(), NULL, &destroy_array, &initialize_array );\n        } __TBB_CATCH(...) {\n            segment_t *table = my_segment.load<relaxed>();\n            internal_free_segments( table, internal_clear(&destroy_array), my_first_block.load<relaxed>() );\n            __TBB_RETHROW();\n        }\n    }\n\n    //! Construction with initial size specified by argument n, initialization by copying of t, and given allocator instance\n    concurrent_vector(size_type n, const_reference t, const allocator_type& a = allocator_type())\n        : internal::allocator_base<T, A>(a)\n    {\n        vector_allocator_ptr = &internal_allocator;\n        __TBB_TRY {\n            internal_resize( n, sizeof(T), max_size(), static_cast<const void*>(&t), &destroy_array, &initialize_array_by );\n        } __TBB_CATCH(...) {\n            segment_t *table = my_segment.load<relaxed>();\n            internal_free_segments( table, internal_clear(&destroy_array), my_first_block.load<relaxed>() );\n            __TBB_RETHROW();\n        }\n    }\n\n    //! Construction with copying iteration range and given allocator instance\n    template<class I>\n    concurrent_vector(I first, I last, const allocator_type &a = allocator_type())\n        : internal::allocator_base<T, A>(a)\n    {\n        vector_allocator_ptr = &internal_allocator;\n        __TBB_TRY {\n            internal_assign_range(first, last, static_cast<is_integer_tag<std::numeric_limits<I>::is_integer> *>(0) );\n        } __TBB_CATCH(...) {\n            segment_t *table = my_segment.load<relaxed>();\n            internal_free_segments( table, internal_clear(&destroy_array), my_first_block.load<relaxed>() );\n            __TBB_RETHROW();\n        }\n    }\n\n    //! Assignment\n    concurrent_vector& operator=( const concurrent_vector& vector ) {\n        if( this != &vector )\n            internal_assign(vector, sizeof(T), &destroy_array, &assign_array, &copy_array);\n        return *this;\n    }\n\n#if __TBB_CPP11_RVALUE_REF_PRESENT\n    //TODO: add __TBB_NOEXCEPT()\n    //! Move assignment\n    concurrent_vector& operator=( concurrent_vector&& other ) {\n        __TBB_ASSERT(this != &other, \"Move assignment to itself is prohibited \");\n        typedef typename tbb::internal::allocator_traits<A>::propagate_on_container_move_assignment pocma_t;\n        if(pocma_t::value || this->my_allocator == other.my_allocator) {\n            concurrent_vector trash (std::move(*this));\n            internal_swap(other);\n            if (pocma_t::value) {\n                this->my_allocator = std::move(other.my_allocator);\n            }\n        } else {\n            internal_assign(other, sizeof(T), &destroy_array, &move_assign_array, &move_array);\n        }\n        return *this;\n    }\n#endif\n    //TODO: add an template assignment operator? (i.e. with different element type)\n\n    //! Assignment for vector with different allocator type\n    template<class M>\n    concurrent_vector& operator=( const concurrent_vector<T, M>& vector ) {\n        if( static_cast<void*>( this ) != static_cast<const void*>( &vector ) )\n            internal_assign(vector.internal_vector_base(),\n                sizeof(T), &destroy_array, &assign_array, &copy_array);\n        return *this;\n    }\n\n#if __TBB_INITIALIZER_LISTS_PRESENT\n    //! Assignment for initializer_list\n    concurrent_vector& operator=( std::initializer_list<T> init_list ) {\n        internal_clear(&destroy_array);\n        internal_assign_iterators(init_list.begin(), init_list.end());\n        return *this;\n    }\n#endif //#if __TBB_INITIALIZER_LISTS_PRESENT\n\n    //------------------------------------------------------------------------\n    // Concurrent operations\n    //------------------------------------------------------------------------\n    //! Grow by \"delta\" elements.\n    /** Returns iterator pointing to the first new element. */\n    iterator grow_by( size_type delta ) {\n        return iterator(*this, delta ? internal_grow_by( delta, sizeof(T), &initialize_array, NULL ) : my_early_size.load());\n    }\n\n    //! Grow by \"delta\" elements using copying constructor.\n    /** Returns iterator pointing to the first new element. */\n    iterator grow_by( size_type delta, const_reference t ) {\n        return iterator(*this, delta ? internal_grow_by( delta, sizeof(T), &initialize_array_by, static_cast<const void*>(&t) ) : my_early_size.load());\n    }\n\n    /** Returns iterator pointing to the first new element. */\n    template<typename I>\n    iterator grow_by( I first, I last ) {\n        typename std::iterator_traits<I>::difference_type delta = std::distance(first, last);\n        __TBB_ASSERT( delta >= 0, NULL);\n\n        return iterator(*this, delta ? internal_grow_by(delta, sizeof(T), &copy_range<I>, static_cast<const void*>(&first)) : my_early_size.load());\n    }\n\n#if __TBB_INITIALIZER_LISTS_PRESENT\n    /** Returns iterator pointing to the first new element. */\n    iterator grow_by( std::initializer_list<T> init_list ) {\n        return grow_by( init_list.begin(), init_list.end() );\n    }\n#endif //#if __TBB_INITIALIZER_LISTS_PRESENT\n\n    //! Append minimal sequence of elements such that size()>=n.\n    /** The new elements are default constructed.  Blocks until all elements in range [0..n) are allocated.\n        May return while other elements are being constructed by other threads.\n        Returns iterator that points to beginning of appended sequence.\n        If no elements were appended, returns iterator pointing to nth element. */\n    iterator grow_to_at_least( size_type n ) {\n        size_type m=0;\n        if( n ) {\n            m = internal_grow_to_at_least_with_result( n, sizeof(T), &initialize_array, NULL );\n            if( m>n ) m=n;\n        }\n        return iterator(*this, m);\n    };\n\n    /** Analogous to grow_to_at_least( size_type n ) with exception that the new\n        elements are initialized by copying of t instead of default construction. */\n    iterator grow_to_at_least( size_type n, const_reference t ) {\n        size_type m=0;\n        if( n ) {\n            m = internal_grow_to_at_least_with_result( n, sizeof(T), &initialize_array_by, &t);\n            if( m>n ) m=n;\n        }\n        return iterator(*this, m);\n    };\n\n    //! Push item\n    /** Returns iterator pointing to the new element. */\n    iterator push_back( const_reference item )\n    {\n        size_type k;\n        T* ptr = static_cast<T*>(internal_push_back(sizeof(T),k));\n        element_construction_guard g(ptr);\n        new(ptr) T(item);\n        g.dismiss();\n        return iterator(*this, k, ptr);\n    }\n\n#if    __TBB_CPP11_RVALUE_REF_PRESENT\n    //! Push item, move-aware\n    /** Returns iterator pointing to the new element. */\n    iterator push_back(  T&& item )\n    {\n        size_type k;\n        T* ptr = static_cast<T*>(internal_push_back(sizeof(T),k));\n        element_construction_guard g(ptr);\n        new(ptr) T(std::move(item));\n        g.dismiss();\n        return iterator(*this, k, ptr);\n    }\n#if __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT\n    //! Push item, create item \"in place\" with provided arguments\n    /** Returns iterator pointing to the new element. */\n    template<typename... Args>\n    iterator emplace_back(  Args&&... args)\n    {\n        size_type k;\n        T* ptr = static_cast<T*>(internal_push_back(sizeof(T),k));\n        element_construction_guard g(ptr);\n        new(ptr) T( std::forward<Args>(args)...);\n        g.dismiss();\n        return iterator(*this, k, ptr);\n    }\n#endif //__TBB_CPP11_VARIADIC_TEMPLATES_PRESENT\n#endif //__TBB_CPP11_RVALUE_REF_PRESENT\n    //! Get reference to element at given index.\n    /** This method is thread-safe for concurrent reads, and also while growing the vector,\n        as long as the calling thread has checked that index < size(). */\n    reference operator[]( size_type index ) {\n        return internal_subscript(index);\n    }\n\n    //! Get const reference to element at given index.\n    const_reference operator[]( size_type index ) const {\n        return internal_subscript(index);\n    }\n\n    //! Get reference to element at given index. Throws exceptions on errors.\n    reference at( size_type index ) {\n        return internal_subscript_with_exceptions(index);\n    }\n\n    //! Get const reference to element at given index. Throws exceptions on errors.\n    const_reference at( size_type index ) const {\n        return internal_subscript_with_exceptions(index);\n    }\n\n    //! Get range for iterating with parallel algorithms\n    range_type range( size_t grainsize = 1 ) {\n        return range_type( begin(), end(), grainsize );\n    }\n\n    //! Get const range for iterating with parallel algorithms\n    const_range_type range( size_t grainsize = 1 ) const {\n        return const_range_type( begin(), end(), grainsize );\n    }\n\n    //------------------------------------------------------------------------\n    // Capacity\n    //------------------------------------------------------------------------\n    //! Return size of vector. It may include elements under construction\n    size_type size() const {\n        size_type sz = my_early_size, cp = internal_capacity();\n        return cp < sz ? cp : sz;\n    }\n\n    //! Return false if vector is not empty or has elements under construction at least.\n    bool empty() const {return !my_early_size;}\n\n    //! Maximum size to which array can grow without allocating more memory. Concurrent allocations are not included in the value.\n    size_type capacity() const {return internal_capacity();}\n\n    //! Allocate enough space to grow to size n without having to allocate more memory later.\n    /** Like most of the methods provided for STL compatibility, this method is *not* thread safe.\n        The capacity afterwards may be bigger than the requested reservation. */\n    void reserve( size_type n ) {\n        if( n )\n            internal_reserve(n, sizeof(T), max_size());\n    }\n\n    //! Resize the vector. Not thread-safe.\n    void resize( size_type n ) {\n        internal_resize( n, sizeof(T), max_size(), NULL, &destroy_array, &initialize_array );\n    }\n\n    //! Resize the vector, copy t for new elements. Not thread-safe.\n    void resize( size_type n, const_reference t ) {\n        internal_resize( n, sizeof(T), max_size(), static_cast<const void*>(&t), &destroy_array, &initialize_array_by );\n    }\n\n    //! Optimize memory usage and fragmentation.\n    void shrink_to_fit();\n\n    //! Upper bound on argument to reserve.\n    size_type max_size() const {return (~size_type(0))/sizeof(T);}\n\n    //------------------------------------------------------------------------\n    // STL support\n    //------------------------------------------------------------------------\n\n    //! start iterator\n    iterator begin() {return iterator(*this,0);}\n    //! end iterator\n    iterator end() {return iterator(*this,size());}\n    //! start const iterator\n    const_iterator begin() const {return const_iterator(*this,0);}\n    //! end const iterator\n    const_iterator end() const {return const_iterator(*this,size());}\n    //! start const iterator\n    const_iterator cbegin() const {return const_iterator(*this,0);}\n    //! end const iterator\n    const_iterator cend() const {return const_iterator(*this,size());}\n    //! reverse start iterator\n    reverse_iterator rbegin() {return reverse_iterator(end());}\n    //! reverse end iterator\n    reverse_iterator rend() {return reverse_iterator(begin());}\n    //! reverse start const iterator\n    const_reverse_iterator rbegin() const {return const_reverse_iterator(end());}\n    //! reverse end const iterator\n    const_reverse_iterator rend() const {return const_reverse_iterator(begin());}\n    //! reverse start const iterator\n    const_reverse_iterator crbegin() const {return const_reverse_iterator(end());}\n    //! reverse end const iterator\n    const_reverse_iterator crend() const {return const_reverse_iterator(begin());}\n    //! the first item\n    reference front() {\n        __TBB_ASSERT( size()>0, NULL);\n        return (my_segment[0].template load<relaxed>().template pointer<T>())[0];\n    }\n    //! the first item const\n    const_reference front() const {\n        __TBB_ASSERT( size()>0, NULL);\n        return static_cast<const T*>(my_segment[0].array)[0];\n    }\n    //! the last item\n    reference back() {\n        __TBB_ASSERT( size()>0, NULL);\n        return internal_subscript( size()-1 );\n    }\n    //! the last item const\n    const_reference back() const {\n        __TBB_ASSERT( size()>0, NULL);\n        return internal_subscript( size()-1 );\n    }\n    //! return allocator object\n    allocator_type get_allocator() const { return this->my_allocator; }\n\n    //! assign n items by copying t item\n    void assign(size_type n, const_reference t) {\n        clear();\n        internal_resize( n, sizeof(T), max_size(), static_cast<const void*>(&t), &destroy_array, &initialize_array_by );\n    }\n\n    //! assign range [first, last)\n    template<class I>\n    void assign(I first, I last) {\n        clear(); internal_assign_range( first, last, static_cast<is_integer_tag<std::numeric_limits<I>::is_integer> *>(0) );\n    }\n\n#if __TBB_INITIALIZER_LISTS_PRESENT\n    //! assigns an initializer list\n    void assign(std::initializer_list<T> init_list) {\n        clear(); internal_assign_iterators( init_list.begin(), init_list.end());\n    }\n#endif //# __TBB_INITIALIZER_LISTS_PRESENT\n\n    //! swap two instances\n    void swap(concurrent_vector &vector) {\n        using std::swap;\n        if( this != &vector ) {\n            concurrent_vector_base_v3::internal_swap(static_cast<concurrent_vector_base_v3&>(vector));\n            swap(this->my_allocator, vector.my_allocator);\n        }\n    }\n\n    //! Clear container while keeping memory allocated.\n    /** To free up the memory, use in conjunction with method compact(). Not thread safe **/\n    void clear() {\n        internal_clear(&destroy_array);\n    }\n\n    //! Clear and destroy vector.\n    ~concurrent_vector() {\n        segment_t *table = my_segment.load<relaxed>();\n        internal_free_segments( table, internal_clear(&destroy_array), my_first_block.load<relaxed>() );\n        // base class destructor call should be then\n    }\n\n    const internal::concurrent_vector_base_v3 &internal_vector_base() const { return *this; }\nprivate:\n    //! Allocate k items\n    static void *internal_allocator(internal::concurrent_vector_base_v3 &vb, size_t k) {\n        return static_cast<concurrent_vector<T, A>&>(vb).my_allocator.allocate(k);\n    }\n    //! Free k segments from table\n    void internal_free_segments(segment_t table[], segment_index_t k, segment_index_t first_block);\n\n    //! Get reference to element at given index.\n    T& internal_subscript( size_type index ) const;\n\n    //! Get reference to element at given index with errors checks\n    T& internal_subscript_with_exceptions( size_type index ) const;\n\n    //! assign n items by copying t\n    void internal_assign_n(size_type n, const_pointer p) {\n        internal_resize( n, sizeof(T), max_size(), static_cast<const void*>(p), &destroy_array, p? &initialize_array_by : &initialize_array );\n    }\n\n    //! helper class\n    template<bool B> class is_integer_tag;\n\n    //! assign integer items by copying when arguments are treated as iterators. See C++ Standard 2003 23.1.1p9\n    template<class I>\n    void internal_assign_range(I first, I last, is_integer_tag<true> *) {\n        internal_assign_n(static_cast<size_type>(first), &static_cast<T&>(last));\n    }\n    //! inline proxy assign by iterators\n    template<class I>\n    void internal_assign_range(I first, I last, is_integer_tag<false> *) {\n        internal_assign_iterators(first, last);\n    }\n    //! assign by iterators\n    template<class I>\n    void internal_assign_iterators(I first, I last);\n\n    //these functions are marked __TBB_EXPORTED_FUNC as they are called from within the library\n\n    //! Construct n instances of T, starting at \"begin\".\n    static void __TBB_EXPORTED_FUNC initialize_array( void* begin, const void*, size_type n );\n\n    //! Copy-construct n instances of T, starting at \"begin\".\n    static void __TBB_EXPORTED_FUNC initialize_array_by( void* begin, const void* src, size_type n );\n\n    //! Copy-construct n instances of T by copying single element pointed to by src, starting at \"dst\".\n    static void __TBB_EXPORTED_FUNC copy_array( void* dst, const void* src, size_type n );\n\n#if __TBB_CPP11_RVALUE_REF_PRESENT\n    //! Move-construct n instances of T, starting at \"dst\" by copying according element of src array.\n    static void __TBB_EXPORTED_FUNC move_array( void* dst, const void* src, size_type n );\n    //! Move-assign (using operator=) n instances of T, starting at \"dst\" by assigning according element of src array.\n    static void __TBB_EXPORTED_FUNC move_assign_array( void* dst, const void* src, size_type n );\n#endif\n    //! Copy-construct n instances of T, starting at \"dst\" by iterator range of [p_type_erased_iterator, p_type_erased_iterator+n).\n    template<typename Iterator>\n    static void __TBB_EXPORTED_FUNC copy_range( void* dst, const void* p_type_erased_iterator, size_type n );\n\n    //! Assign (using operator=) n instances of T, starting at \"dst\" by assigning according element of src array.\n    static void __TBB_EXPORTED_FUNC assign_array( void* dst, const void* src, size_type n );\n\n    //! Destroy n instances of T, starting at \"begin\".\n    static void __TBB_EXPORTED_FUNC destroy_array( void* begin, size_type n );\n\n    //! Exception-aware helper class for filling a segment by exception-danger operators of user class\n    class internal_loop_guide : internal::no_copy {\n    public:\n        const pointer array;\n        const size_type n;\n        size_type i;\n\n        static const T* as_const_pointer(const void *ptr) { return static_cast<const T *>(ptr); }\n        static T* as_pointer(const void *src) { return static_cast<T*>(const_cast<void *>(src)); }\n\n        internal_loop_guide(size_type ntrials, void *ptr)\n            : array(as_pointer(ptr)), n(ntrials), i(0) {}\n        void init() {   for(; i < n; ++i) new( &array[i] ) T(); }\n        void init(const void *src) { for(; i < n; ++i) new( &array[i] ) T(*as_const_pointer(src)); }\n        void copy(const void *src) { for(; i < n; ++i) new( &array[i] ) T(as_const_pointer(src)[i]); }\n        void assign(const void *src) { for(; i < n; ++i) array[i] = as_const_pointer(src)[i]; }\n#if __TBB_CPP11_RVALUE_REF_PRESENT\n        void move_assign(const void *src)       { for(; i < n; ++i) array[i]         =  std::move(as_pointer(src)[i]);   }\n        void move_construct(const void *src)    { for(; i < n; ++i) new( &array[i] ) T( std::move(as_pointer(src)[i]) ); }\n#endif\n        //TODO: rename to construct_range\n        template<class I> void iterate(I &src) { for(; i < n; ++i, ++src) new( &array[i] ) T( *src ); }\n        ~internal_loop_guide() {\n            if(i < n) {// if an exception was raised, fill the rest of items with zeros\n                internal::handle_unconstructed_elements(array+i, n-i);\n            }\n        }\n    };\n\n    class element_construction_guard : internal::no_copy{\n        pointer element;\n    public:\n        element_construction_guard(pointer an_element) : element (an_element){}\n        void dismiss(){ element = NULL; }\n        ~element_construction_guard(){\n            if (element){\n                internal::handle_unconstructed_elements(element, 1);\n            }\n        }\n    };\n};\n\n#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)\n#pragma warning (push)\n#pragma warning (disable: 4701) // potentially uninitialized local variable \"old\"\n#endif\ntemplate<typename T, class A>\nvoid concurrent_vector<T, A>::shrink_to_fit() {\n    internal_segments_table old;\n    __TBB_TRY {\n        if( internal_compact( sizeof(T), &old, &destroy_array, &copy_array ) )\n            internal_free_segments( old.table, pointers_per_long_table, old.first_block ); // free joined and unnecessary segments\n    } __TBB_CATCH(...) {\n        if( old.first_block ) // free segment allocated for compacting. Only for support of exceptions in ctor of user T[ype]\n            internal_free_segments( old.table, 1, old.first_block );\n        __TBB_RETHROW();\n    }\n}\n#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)\n#pragma warning (pop)\n#endif // warning 4701 is back\n\ntemplate<typename T, class A>\nvoid concurrent_vector<T, A>::internal_free_segments(segment_t table[], segment_index_t k, segment_index_t first_block) {\n    // Free the arrays\n    while( k > first_block ) {\n        --k;\n        segment_value_t segment_value = table[k].load<relaxed>();\n        table[k].store<relaxed>(segment_not_used());\n        if( segment_value == segment_allocated() ) // check for correct segment pointer\n            this->my_allocator.deallocate( (segment_value.pointer<T>()), segment_size(k) );\n    }\n    segment_value_t segment_value = table[0].load<relaxed>();\n    if( segment_value == segment_allocated() ) {\n        __TBB_ASSERT( first_block > 0, NULL );\n        while(k > 0) table[--k].store<relaxed>(segment_not_used());\n        this->my_allocator.deallocate( (segment_value.pointer<T>()), segment_size(first_block) );\n    }\n}\n\ntemplate<typename T, class A>\nT& concurrent_vector<T, A>::internal_subscript( size_type index ) const {\n    //TODO: unify both versions of internal_subscript\n    __TBB_ASSERT( index < my_early_size, \"index out of bounds\" );\n    size_type j = index;\n    segment_index_t k = segment_base_index_of( j );\n    __TBB_ASSERT( my_segment.load<acquire>() != my_storage || k < pointers_per_short_table, \"index is being allocated\" );\n    //no need in load with acquire (load<acquire>) since thread works in own space or gets\n    //the information about added elements via some form of external synchronization\n    //TODO: why not make a load of my_segment relaxed as well ?\n    //TODO: add an assertion that my_segment[k] is properly aligned to please ITT\n    segment_value_t segment_value =  my_segment[k].template load<relaxed>();\n    __TBB_ASSERT( segment_value != segment_allocation_failed(), \"the instance is broken by bad allocation. Use at() instead\" );\n    __TBB_ASSERT( segment_value != segment_not_used(), \"index is being allocated\" );\n    return (( segment_value.pointer<T>()))[j];\n}\n\ntemplate<typename T, class A>\nT& concurrent_vector<T, A>::internal_subscript_with_exceptions( size_type index ) const {\n    if( index >= my_early_size )\n        internal::throw_exception(internal::eid_out_of_range); // throw std::out_of_range\n    size_type j = index;\n    segment_index_t k = segment_base_index_of( j );\n    //TODO: refactor this condition into separate helper function, e.g. fits_into_small_table\n    if( my_segment.load<acquire>() == my_storage && k >= pointers_per_short_table )\n        internal::throw_exception(internal::eid_segment_range_error); // throw std::range_error\n    // no need in load with acquire (load<acquire>) since thread works in own space or gets\n    //the information about added elements via some form of external synchronization\n    //TODO: why not make a load of my_segment relaxed as well ?\n    //TODO: add an assertion that my_segment[k] is properly aligned to please ITT\n    segment_value_t segment_value =  my_segment[k].template load<relaxed>();\n    if( segment_value != segment_allocated() ) // check for correct segment pointer\n        internal::throw_exception(internal::eid_index_range_error); // throw std::range_error\n    return (segment_value.pointer<T>())[j];\n}\n\ntemplate<typename T, class A> template<class I>\nvoid concurrent_vector<T, A>::internal_assign_iterators(I first, I last) {\n    __TBB_ASSERT(my_early_size == 0, NULL);\n    size_type n = std::distance(first, last);\n    if( !n ) return;\n    internal_reserve(n, sizeof(T), max_size());\n    my_early_size = n;\n    segment_index_t k = 0;\n    //TODO: unify segment iteration code with concurrent_base_v3::helper\n    size_type sz = segment_size( my_first_block );\n    while( sz < n ) {\n        internal_loop_guide loop(sz, my_segment[k].template load<relaxed>().template pointer<void>());\n        loop.iterate(first);\n        n -= sz;\n        if( !k ) k = my_first_block;\n        else { ++k; sz <<= 1; }\n    }\n    internal_loop_guide loop(n, my_segment[k].template load<relaxed>().template pointer<void>());\n    loop.iterate(first);\n}\n\ntemplate<typename T, class A>\nvoid concurrent_vector<T, A>::initialize_array( void* begin, const void *, size_type n ) {\n    internal_loop_guide loop(n, begin); loop.init();\n}\n\ntemplate<typename T, class A>\nvoid concurrent_vector<T, A>::initialize_array_by( void* begin, const void *src, size_type n ) {\n    internal_loop_guide loop(n, begin); loop.init(src);\n}\n\ntemplate<typename T, class A>\nvoid concurrent_vector<T, A>::copy_array( void* dst, const void* src, size_type n ) {\n    internal_loop_guide loop(n, dst); loop.copy(src);\n}\n\n#if __TBB_CPP11_RVALUE_REF_PRESENT\ntemplate<typename T, class A>\nvoid concurrent_vector<T, A>::move_array( void* dst, const void* src, size_type n ) {\n    internal_loop_guide loop(n, dst); loop.move_construct(src);\n}\n\ntemplate<typename T, class A>\nvoid concurrent_vector<T, A>::move_assign_array( void* dst, const void* src, size_type n ) {\n    internal_loop_guide loop(n, dst); loop.move_assign(src);\n}\n#endif\n\ntemplate<typename T, class A>\ntemplate<typename I>\nvoid concurrent_vector<T, A>::copy_range( void* dst, const void* p_type_erased_iterator, size_type n ){\n    I & iterator ((*const_cast<I*>(static_cast<const I*>(p_type_erased_iterator))));\n    internal_loop_guide loop(n, dst); loop.iterate(iterator);\n}\n\ntemplate<typename T, class A>\nvoid concurrent_vector<T, A>::assign_array( void* dst, const void* src, size_type n ) {\n    internal_loop_guide loop(n, dst); loop.assign(src);\n}\n\n#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)\n    // Workaround for overzealous compiler warning\n    #pragma warning (push)\n    #pragma warning (disable: 4189)\n#endif\ntemplate<typename T, class A>\nvoid concurrent_vector<T, A>::destroy_array( void* begin, size_type n ) {\n    T* array = static_cast<T*>(begin);\n    for( size_type j=n; j>0; --j )\n        array[j-1].~T(); // destructors are supposed to not throw any exceptions\n}\n#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)\n    #pragma warning (pop)\n#endif // warning 4189 is back\n\n// concurrent_vector's template functions\ntemplate<typename T, class A1, class A2>\ninline bool operator==(const concurrent_vector<T, A1> &a, const concurrent_vector<T, A2> &b) {\n    //TODO: call size() only once per vector (in operator==)\n    // Simply:    return a.size() == b.size() && std::equal(a.begin(), a.end(), b.begin());\n    if(a.size() != b.size()) return false;\n    typename concurrent_vector<T, A1>::const_iterator i(a.begin());\n    typename concurrent_vector<T, A2>::const_iterator j(b.begin());\n    for(; i != a.end(); ++i, ++j)\n        if( !(*i == *j) ) return false;\n    return true;\n}\n\ntemplate<typename T, class A1, class A2>\ninline bool operator!=(const concurrent_vector<T, A1> &a, const concurrent_vector<T, A2> &b)\n{    return !(a == b); }\n\ntemplate<typename T, class A1, class A2>\ninline bool operator<(const concurrent_vector<T, A1> &a, const concurrent_vector<T, A2> &b)\n{    return (std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end())); }\n\ntemplate<typename T, class A1, class A2>\ninline bool operator>(const concurrent_vector<T, A1> &a, const concurrent_vector<T, A2> &b)\n{    return b < a; }\n\ntemplate<typename T, class A1, class A2>\ninline bool operator<=(const concurrent_vector<T, A1> &a, const concurrent_vector<T, A2> &b)\n{    return !(b < a); }\n\ntemplate<typename T, class A1, class A2>\ninline bool operator>=(const concurrent_vector<T, A1> &a, const concurrent_vector<T, A2> &b)\n{    return !(a < b); }\n\ntemplate<typename T, class A>\ninline void swap(concurrent_vector<T, A> &a, concurrent_vector<T, A> &b)\n{    a.swap( b ); }\n\n} // namespace tbb\n\n#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)\n    #pragma warning (pop)\n#endif // warning 4267,4127 are back\n\n#endif /* __TBB_concurrent_vector_H */\n"
  },
  {
    "path": "benchmarks/tbb/condition_variable.cpp",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#include \"tbb/tbb_config.h\"\n#include \"tbb/compat/condition_variable\"\n#include \"tbb/atomic.h\"\n#include \"tbb_misc.h\"\n#include \"dynamic_link.h\"\n#include \"itt_notify.h\"\n\nnamespace tbb {\n\nnamespace internal {\n\n//condition_variable\n#if _WIN32||_WIN64\nusing tbb::interface5::internal::condition_variable_using_event;\n\nstatic atomic<do_once_state> condvar_api_state;\n\nvoid WINAPI init_condvar_using_event( condition_variable_using_event* cv_event )\n{\n    // TODO: For Metro port, we can always use the API for condition variables, without dynamic_link etc.\n    cv_event->event = CreateEventEx(NULL, NULL, 0x1 /*CREATE_EVENT_MANUAL_RESET*/, EVENT_ALL_ACCESS );\n    InitializeCriticalSectionEx( &cv_event->mutex, 4000, 0 );\n    cv_event->n_waiters = 0;\n    cv_event->release_count = 0;\n    cv_event->epoch = 0;\n}\n\nBOOL WINAPI sleep_condition_variable_cs_using_event( condition_variable_using_event* cv_event, LPCRITICAL_SECTION cs, DWORD dwMilliseconds )\n{\n    EnterCriticalSection( &cv_event->mutex );\n    ++cv_event->n_waiters;\n    unsigned my_generation = cv_event->epoch;\n    LeaveCriticalSection( &cv_event->mutex );\n    LeaveCriticalSection( cs );\n    for (;;) {\n        // should come here at least once\n        DWORD rc = WaitForSingleObjectEx( cv_event->event, dwMilliseconds, FALSE );\n        EnterCriticalSection( &cv_event->mutex );\n        if( rc!=WAIT_OBJECT_0 ) {\n            --cv_event->n_waiters;\n            LeaveCriticalSection( &cv_event->mutex );\n            if( rc==WAIT_TIMEOUT ) {\n                SetLastError( WAIT_TIMEOUT );\n                EnterCriticalSection( cs );\n            }\n            return false;\n        }\n        __TBB_ASSERT( rc==WAIT_OBJECT_0, NULL );\n        if( cv_event->release_count>0 && cv_event->epoch!=my_generation )\n            break;\n        LeaveCriticalSection( &cv_event->mutex );\n    }\n\n    // still in the critical section\n    --cv_event->n_waiters;\n    int count = --cv_event->release_count;\n    LeaveCriticalSection( &cv_event->mutex );\n\n    if( count==0 ) {\n        __TBB_ASSERT( cv_event->event, \"Premature destruction of condition variable?\" );\n        ResetEvent( cv_event->event );\n    }\n    EnterCriticalSection( cs );\n    return true;\n}\n\nvoid WINAPI wake_condition_variable_using_event( condition_variable_using_event* cv_event )\n{\n    EnterCriticalSection( &cv_event->mutex );\n    if( cv_event->n_waiters>cv_event->release_count ) {\n        SetEvent( cv_event->event ); // Signal the manual-reset event.\n        ++cv_event->release_count;\n        ++cv_event->epoch;\n    }\n    LeaveCriticalSection( &cv_event->mutex );\n}\n\nvoid WINAPI wake_all_condition_variable_using_event( condition_variable_using_event* cv_event )\n{\n    EnterCriticalSection( &cv_event->mutex );\n    if( cv_event->n_waiters>0 ) {\n        SetEvent( cv_event->event );\n        cv_event->release_count = cv_event->n_waiters;\n        ++cv_event->epoch;\n    }\n    LeaveCriticalSection( &cv_event->mutex );\n}\n\nvoid WINAPI destroy_condvar_using_event( condition_variable_using_event* cv_event )\n{\n    HANDLE my_event = cv_event->event;\n    EnterCriticalSection( &cv_event->mutex );\n    // NULL is an invalid HANDLE value\n    cv_event->event = NULL;\n    if( cv_event->n_waiters>0 ) {\n        LeaveCriticalSection( &cv_event->mutex );\n        spin_wait_until_eq( cv_event->n_waiters, 0 );\n        // make sure the last thread completes its access to cv\n        EnterCriticalSection( &cv_event->mutex );\n    }\n    LeaveCriticalSection( &cv_event->mutex );\n    CloseHandle( my_event );\n}\n\nvoid WINAPI destroy_condvar_noop( CONDITION_VARIABLE* /*cv*/ ) { /*no op*/ }\n\nstatic void (WINAPI *__TBB_init_condvar)( PCONDITION_VARIABLE ) = (void (WINAPI *)(PCONDITION_VARIABLE))&init_condvar_using_event;\nstatic BOOL (WINAPI *__TBB_condvar_wait)( PCONDITION_VARIABLE, LPCRITICAL_SECTION, DWORD ) = (BOOL (WINAPI *)(PCONDITION_VARIABLE,LPCRITICAL_SECTION, DWORD))&sleep_condition_variable_cs_using_event;\nstatic void (WINAPI *__TBB_condvar_notify_one)( PCONDITION_VARIABLE ) = (void (WINAPI *)(PCONDITION_VARIABLE))&wake_condition_variable_using_event;\nstatic void (WINAPI *__TBB_condvar_notify_all)( PCONDITION_VARIABLE ) = (void (WINAPI *)(PCONDITION_VARIABLE))&wake_all_condition_variable_using_event;\nstatic void (WINAPI *__TBB_destroy_condvar)( PCONDITION_VARIABLE ) = (void (WINAPI *)(PCONDITION_VARIABLE))&destroy_condvar_using_event;\n\n//! Table describing how to link the handlers.\nstatic const dynamic_link_descriptor CondVarLinkTable[] = {\n    DLD(InitializeConditionVariable, __TBB_init_condvar),\n    DLD(SleepConditionVariableCS,    __TBB_condvar_wait),\n    DLD(WakeConditionVariable,       __TBB_condvar_notify_one),\n    DLD(WakeAllConditionVariable,    __TBB_condvar_notify_all)\n};\n\nvoid init_condvar_module()\n{\n    __TBB_ASSERT( (uintptr_t)__TBB_init_condvar==(uintptr_t)&init_condvar_using_event, NULL );\n    if( dynamic_link( \"Kernel32.dll\", CondVarLinkTable, 4 ) )\n        __TBB_destroy_condvar = (void (WINAPI *)(PCONDITION_VARIABLE))&destroy_condvar_noop;\n}\n#endif /* _WIN32||_WIN64 */\n\n} // namespace internal\n\n#if _WIN32||_WIN64\n\nnamespace interface5 {\nnamespace internal {\n\nusing tbb::internal::condvar_api_state;\nusing tbb::internal::__TBB_init_condvar;\nusing tbb::internal::__TBB_condvar_wait;\nusing tbb::internal::__TBB_condvar_notify_one;\nusing tbb::internal::__TBB_condvar_notify_all;\nusing tbb::internal::__TBB_destroy_condvar;\nusing tbb::internal::init_condvar_module;\n\nvoid internal_initialize_condition_variable( condvar_impl_t& cv )\n{\n    atomic_do_once( &init_condvar_module, condvar_api_state );\n    __TBB_init_condvar( &cv.cv_native );\n}\n\nvoid internal_destroy_condition_variable( condvar_impl_t& cv )\n{\n    __TBB_destroy_condvar( &cv.cv_native );\n}\n\nvoid internal_condition_variable_notify_one( condvar_impl_t& cv )\n{\n    __TBB_condvar_notify_one ( &cv.cv_native );\n}\n\nvoid internal_condition_variable_notify_all( condvar_impl_t& cv )\n{\n    __TBB_condvar_notify_all( &cv.cv_native );\n}\n\nbool internal_condition_variable_wait( condvar_impl_t& cv, mutex* mtx, const tick_count::interval_t* i )\n{\n    DWORD duration = i ? DWORD((i->seconds()*1000)) : INFINITE;\n    mtx->set_state( mutex::INITIALIZED );\n    BOOL res = __TBB_condvar_wait( &cv.cv_native, mtx->native_handle(), duration );\n    mtx->set_state( mutex::HELD );\n    return res?true:false;\n}\n\n} // namespace internal\n} // nameespace interface5\n\n#endif /* _WIN32||_WIN64 */\n\n} // namespace tbb\n"
  },
  {
    "path": "benchmarks/tbb/critical_section.cpp",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#include \"tbb/critical_section.h\"\n#include \"itt_notify.h\"\n\nnamespace tbb {\n    namespace internal {\n\nvoid critical_section_v4::internal_construct() {\n    ITT_SYNC_CREATE(&my_impl, _T(\"ppl::critical_section\"), _T(\"\"));\n}\n}  // namespace internal\n}  // namespace tbb\n"
  },
  {
    "path": "benchmarks/tbb/critical_section.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef _TBB_CRITICAL_SECTION_H_\n#define _TBB_CRITICAL_SECTION_H_\n\n#if _WIN32||_WIN64\n#include \"machine/windows_api.h\"\n#else\n#include <pthread.h>\n#include <errno.h>\n#endif  // _WIN32||WIN64\n\n#include \"tbb_stddef.h\"\n#include \"tbb_thread.h\"\n#include \"tbb_exception.h\"\n\n#include \"tbb_profiling.h\"\n\nnamespace tbb {\n\n    namespace internal {\nclass critical_section_v4 : internal::no_copy {\n#if _WIN32||_WIN64\n    CRITICAL_SECTION my_impl;\n#else\n    pthread_mutex_t my_impl;\n#endif\n    tbb_thread::id my_tid;\npublic:\n\n    void __TBB_EXPORTED_METHOD internal_construct();\n\n    critical_section_v4() { \n#if _WIN32||_WIN64\n        InitializeCriticalSectionEx( &my_impl, 4000, 0 );\n#else\n        pthread_mutex_init(&my_impl, NULL);\n#endif\n        internal_construct();\n    }\n\n    ~critical_section_v4() {\n        __TBB_ASSERT(my_tid == tbb_thread::id(), \"Destroying a still-held critical section\");\n#if _WIN32||_WIN64\n        DeleteCriticalSection(&my_impl); \n#else\n        pthread_mutex_destroy(&my_impl);\n#endif\n    }\n\n    class scoped_lock : internal::no_copy {\n    private:\n        critical_section_v4 &my_crit;\n    public:\n        scoped_lock( critical_section_v4& lock_me) :my_crit(lock_me) {\n            my_crit.lock();\n        }\n\n        ~scoped_lock() {\n            my_crit.unlock();\n        }\n    };\n\n    void lock() { \n        tbb_thread::id local_tid = this_tbb_thread::get_id();\n        if(local_tid == my_tid) throw_exception( eid_improper_lock );\n#if _WIN32||_WIN64\n        EnterCriticalSection( &my_impl );\n#else\n        int rval = pthread_mutex_lock(&my_impl);\n        __TBB_ASSERT_EX(!rval, \"critical_section::lock: pthread_mutex_lock failed\");\n#endif\n        __TBB_ASSERT(my_tid == tbb_thread::id(), NULL);\n        my_tid = local_tid;\n    }\n\n    bool try_lock() {\n        bool gotlock;\n        tbb_thread::id local_tid = this_tbb_thread::get_id();\n        if(local_tid == my_tid) return false;\n#if _WIN32||_WIN64\n        gotlock = TryEnterCriticalSection( &my_impl ) != 0;\n#else\n        int rval = pthread_mutex_trylock(&my_impl);\n        // valid returns are 0 (locked) and [EBUSY]\n        __TBB_ASSERT(rval == 0 || rval == EBUSY, \"critical_section::trylock: pthread_mutex_trylock failed\");\n        gotlock = rval == 0;\n#endif\n        if(gotlock)  {\n            my_tid = local_tid;\n        }\n        return gotlock;\n    }\n\n    void unlock() {\n        __TBB_ASSERT(this_tbb_thread::get_id() == my_tid, \"thread unlocking critical_section is not thread that locked it\");\n        my_tid = tbb_thread::id();\n#if _WIN32||_WIN64\n        LeaveCriticalSection( &my_impl );\n#else\n        int rval = pthread_mutex_unlock(&my_impl);\n        __TBB_ASSERT_EX(!rval, \"critical_section::unlock: pthread_mutex_unlock failed\");\n#endif\n    }\n\n    static const bool is_rw_mutex = false;\n    static const bool is_recursive_mutex = false;\n    static const bool is_fair_mutex = true;\n}; // critical_section_v4\n} // namespace internal\ntypedef internal::critical_section_v4 critical_section;\n\n__TBB_DEFINE_PROFILING_SET_NAME(critical_section)\n} // namespace tbb\n#endif  // _TBB_CRITICAL_SECTION_H_\n"
  },
  {
    "path": "benchmarks/tbb/custom_scheduler.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef _TBB_custom_scheduler_H\n#define _TBB_custom_scheduler_H\n\n#include \"scheduler.h\"\n#include \"observer_proxy.h\"\n#include \"itt_notify.h\"\n\nnamespace tbb {\nnamespace internal {\n\n//! Amount of time to pause between steals.\n/** The default values below were found to be best empirically for K-Means\n    on the 32-way Altix and 4-way (*2 for HT) fxqlin04. */\n#ifdef __TBB_STEALING_PAUSE\nstatic const long PauseTime = __TBB_STEALING_PAUSE;\n#elif __TBB_ipf\nstatic const long PauseTime = 1500;\n#else\nstatic const long PauseTime = 80;\n#endif\n\n//------------------------------------------------------------------------\n//! Traits classes for scheduler\n//------------------------------------------------------------------------\n\nstruct DefaultSchedulerTraits {\n    static const bool itt_possible = true;\n    static const bool has_slow_atomic = false;\n};\n\nstruct IntelSchedulerTraits {\n    static const bool itt_possible = false;\n#if __TBB_x86_32||__TBB_x86_64\n    static const bool has_slow_atomic = true;\n#else\n    static const bool has_slow_atomic = false;\n#endif /* __TBB_x86_32||__TBB_x86_64 */\n};\n\n//------------------------------------------------------------------------\n// custom_scheduler\n//------------------------------------------------------------------------\n\n//! A scheduler with a customized evaluation loop.\n/** The customization can use SchedulerTraits to make decisions without needing a run-time check. */\ntemplate<typename SchedulerTraits>\nclass custom_scheduler: private generic_scheduler {\n    typedef custom_scheduler<SchedulerTraits> scheduler_type;\n\n    //! Scheduler loop that dispatches tasks.\n    /** If child is non-NULL, it is dispatched first.\n        Then, until \"parent\" has a reference count of 1, other task are dispatched or stolen. */\n    /*override*/\n    void local_wait_for_all( task& parent, task* child );\n\n    //! Entry point from client code to the scheduler loop that dispatches tasks.\n    /** The method is virtual, but the *this object is used only for sake of dispatching on the correct vtable,\n        not necessarily the correct *this object.  The correct *this object is looked up in TLS. */\n    /*override*/\n    void wait_for_all( task& parent, task* child ) {\n        static_cast<custom_scheduler*>(governor::local_scheduler())->scheduler_type::local_wait_for_all( parent, child );\n    }\n\n    //! Construct a custom_scheduler\n    custom_scheduler( arena* a, size_t index ) : generic_scheduler(a, index) {}\n\n    //! Decrements ref_count of a predecessor.\n    /** If it achieves 0, the predecessor is scheduled for execution.\n        When changing, remember that this is a hot path function. */\n    void tally_completion_of_predecessor( task& s, task*& bypass_slot ) {\n        task_prefix& p = s.prefix();\n        if( SchedulerTraits::itt_possible )\n            ITT_NOTIFY(sync_releasing, &p.ref_count);\n        if( SchedulerTraits::has_slow_atomic && p.ref_count==1 )\n            p.ref_count=0;\n        else if( __TBB_FetchAndDecrementWrelease(&p.ref_count) > 1 ) {// more references exist\n            // '__TBB_cl_evict(&p)' degraded performance of parallel_preorder example\n            return;\n        }\n\n        // Ordering on p.ref_count (superfluous if SchedulerTraits::has_slow_atomic)\n        __TBB_control_consistency_helper();\n        __TBB_ASSERT(p.ref_count==0, \"completion of task caused predecessor's reference count to underflow\");\n        if( SchedulerTraits::itt_possible )\n            ITT_NOTIFY(sync_acquired, &p.ref_count);\n#if TBB_USE_ASSERT\n        p.extra_state &= ~es_ref_count_active;\n#endif /* TBB_USE_ASSERT */\n\n#if __TBB_RECYCLE_TO_ENQUEUE\n        if (p.state==task::to_enqueue) {\n            // related to __TBB_TASK_ARENA TODO: try keep priority of the task\n            // e.g. rework task_prefix to remember priority of received task and use here\n            my_arena->enqueue_task(s, 0, my_random );\n        } else\n#endif /*__TBB_RECYCLE_TO_ENQUEUE*/\n        if( bypass_slot==NULL )\n            bypass_slot = &s;\n        else\n            local_spawn( s, s.prefix().next );\n    }\n\npublic:\n    static generic_scheduler* allocate_scheduler( arena* a, size_t index ) {\n        scheduler_type* s = (scheduler_type*)NFS_Allocate(1,sizeof(scheduler_type),NULL);\n        new( s ) scheduler_type( a, index );\n        s->assert_task_pool_valid();\n        ITT_SYNC_CREATE(s, SyncType_Scheduler, SyncObj_TaskPoolSpinning);\n        return s;\n    }\n\n    //! Try getting a task from the mailbox or stealing from another scheduler.\n    /** Returns the stolen task or NULL if all attempts fail. */\n    /* override */ task* receive_or_steal_task( __TBB_atomic reference_count& completion_ref_count, bool return_if_no_work );\n\n}; // class custom_scheduler<>\n\n//------------------------------------------------------------------------\n// custom_scheduler methods\n//------------------------------------------------------------------------\ntemplate<typename SchedulerTraits>\ntask* custom_scheduler<SchedulerTraits>::receive_or_steal_task( __TBB_atomic reference_count& completion_ref_count,\n                                                                bool return_if_no_work ) {\n    task* t = NULL;\n    bool outermost_dispatch_level = return_if_no_work || master_outermost_level();\n    bool can_steal_here = can_steal();\n    my_inbox.set_is_idle( true );\n#if __TBB_HOARD_NONLOCAL_TASKS\n    __TBB_ASSERT(!my_nonlocal_free_list, NULL);\n#endif\n#if __TBB_TASK_PRIORITY\n    if ( return_if_no_work && my_arena->my_skipped_fifo_priority ) {\n        // This thread can dequeue FIFO tasks, and some priority levels of\n        // FIFO tasks have been bypassed (to prevent deadlock caused by\n        // dynamic priority changes in nested task group hierarchy).\n        intptr_t skipped_priority = my_arena->my_skipped_fifo_priority;\n        if ( my_arena->my_skipped_fifo_priority.compare_and_swap(0, skipped_priority) == skipped_priority &&\n             skipped_priority > my_arena->my_top_priority )\n        {\n            my_market->update_arena_priority( *my_arena, skipped_priority );\n        }\n    }\n    task_stream *ts;\n#else /* !__TBB_TASK_PRIORITY */\n    task_stream *ts = &my_arena->my_task_stream;\n#endif /* !__TBB_TASK_PRIORITY */\n    // TODO: Try to find a place to reset my_limit (under market's lock)\n    // The number of slots potentially used in the arena. Updated once in a while, as my_limit changes rarely.\n    size_t n = my_arena->my_limit-1;\n    int yield_count = 0;\n    // The state \"failure_count==-1\" is used only when itt_possible is true,\n    // and denotes that a sync_prepare has not yet been issued.\n    for( int failure_count = -static_cast<int>(SchedulerTraits::itt_possible);; ++failure_count) {\n        __TBB_ASSERT( my_arena->my_limit > 0, NULL );\n        __TBB_ASSERT( my_arena_index <= n, NULL );\n        if( completion_ref_count==1 ) {\n            if( SchedulerTraits::itt_possible ) {\n                if( failure_count!=-1 ) {\n                    ITT_NOTIFY(sync_prepare, &completion_ref_count);\n                    // Notify Intel(R) Thread Profiler that thread has stopped spinning.\n                    ITT_NOTIFY(sync_acquired, this);\n                }\n                ITT_NOTIFY(sync_acquired, &completion_ref_count);\n            }\n            __TBB_ASSERT( !t, NULL );\n            __TBB_control_consistency_helper(); // on ref_count\n            break; // exit stealing loop and return;\n        }\n        // Check if the resource manager requires our arena to relinquish some threads\n        if ( return_if_no_work && my_arena->my_num_workers_allotted < my_arena->num_workers_active() ) {\n#if !__TBB_TASK_ARENA\n            __TBB_ASSERT( is_worker(), NULL );\n#endif\n            if( SchedulerTraits::itt_possible && failure_count != -1 )\n                ITT_NOTIFY(sync_cancel, this);\n            return NULL;\n        }\n#if __TBB_TASK_PRIORITY\n        ts = &my_arena->my_task_stream[my_arena->my_top_priority];\n#endif\n        // Check if there are tasks mailed to this thread via task-to-thread affinity mechanism.\n        __TBB_ASSERT(my_affinity_id, NULL);\n        if ( n && !my_inbox.empty() && (t = get_mailbox_task()) ) {\n            GATHER_STATISTIC( ++my_counters.mails_received );\n        }\n        // Check if there are tasks in starvation-resistant stream.\n        // Only allowed for workers with empty stack, which is identified by return_if_no_work.\n        else if ( outermost_dispatch_level && !ts->empty() && (t = ts->pop( my_arena_slot->hint_for_pop)) ) {\n            ITT_NOTIFY(sync_acquired, ts);\n            // just proceed with the obtained task\n        }\n#if __TBB_TASK_PRIORITY\n        // Check if any earlier offloaded non-top priority tasks become returned to the top level\n        else if ( my_offloaded_tasks && (t=reload_tasks()) ) {\n            // just proceed with the obtained task\n        }\n#endif /* __TBB_TASK_PRIORITY */\n        else if ( can_steal_here && n ) {\n            // Try to steal a task from a random victim.\n            size_t k = my_random.get() % n;\n            arena_slot* victim = &my_arena->my_slots[k];\n            // The following condition excludes the master that might have\n            // already taken our previous place in the arena from the list .\n            // of potential victims. But since such a situation can take\n            // place only in case of significant oversubscription, keeping\n            // the checks simple seems to be preferable to complicating the code.\n            if( k >= my_arena_index )\n                ++victim;               // Adjusts random distribution to exclude self\n            task **pool = victim->task_pool;\n            if( pool == EmptyTaskPool || !(t = steal_task( *victim )) )\n                goto fail;\n            if( is_proxy(*t) ) {\n                task_proxy &tp = *(task_proxy*)t;\n                t = tp.extract_task<task_proxy::pool_bit>();\n                if ( !t ) {\n                    // Proxy was empty, so it's our responsibility to free it\n                    free_task<no_cache_small_task>(tp);\n                    goto fail;\n                }\n                GATHER_STATISTIC( ++my_counters.proxies_stolen );\n            }\n            t->prefix().extra_state |= es_task_is_stolen;\n            if( is_version_3_task(*t) ) {\n                my_innermost_running_task = t;\n                t->prefix().owner = this;\n                t->note_affinity( my_affinity_id );\n            }\n            GATHER_STATISTIC( ++my_counters.steals_committed );\n        } // end of stealing branch\n        else\n            goto fail;\n        // A task was successfully obtained somewhere\n        __TBB_ASSERT(t,NULL);\n#if __TBB_SCHEDULER_OBSERVER\n        my_arena->my_observers.notify_entry_observers( my_last_local_observer, is_worker() );\n        the_global_observer_list.notify_entry_observers( my_last_global_observer, is_worker() );\n#endif /* __TBB_SCHEDULER_OBSERVER */\n        if ( SchedulerTraits::itt_possible && failure_count != -1 ) {\n            // FIXME - might be victim, or might be selected from a mailbox\n            // Notify Intel(R) Thread Profiler that thread has stopped spinning.\n            ITT_NOTIFY(sync_acquired, this);\n        }\n        break; // exit stealing loop and return\nfail:\n        GATHER_STATISTIC( ++my_counters.steals_failed );\n        if( SchedulerTraits::itt_possible && failure_count==-1 ) {\n            // The first attempt to steal work failed, so notify Intel(R) Thread Profiler that\n            // the thread has started spinning.  Ideally, we would do this notification\n            // *before* the first failed attempt to steal, but at that point we do not\n            // know that the steal will fail.\n            ITT_NOTIFY(sync_prepare, this);\n            failure_count = 0;\n        }\n        // Pause, even if we are going to yield, because the yield might return immediately.\n        __TBB_Pause(PauseTime);\n        const int failure_threshold = 2*int(n+1);\n        if( failure_count>=failure_threshold ) {\n#if __TBB_YIELD2P\n            failure_count = 0;\n#else\n            failure_count = failure_threshold;\n#endif\n            __TBB_Yield();\n#if __TBB_TASK_PRIORITY\n            // Check if there are tasks abandoned by other workers\n            if ( my_arena->my_orphaned_tasks ) {\n                // Epoch must be advanced before seizing the list pointer\n                ++my_arena->my_abandonment_epoch;\n                task* orphans = (task*)__TBB_FetchAndStoreW( &my_arena->my_orphaned_tasks, 0 );\n                if ( orphans ) {\n                    task** link = NULL;\n                    // Get local counter out of the way (we've just brought in external tasks)\n                    my_local_reload_epoch--;\n                    t = reload_tasks( orphans, link, effective_reference_priority() );\n                    if ( orphans ) {\n                        *link = my_offloaded_tasks;\n                        if ( !my_offloaded_tasks )\n                            my_offloaded_task_list_tail_link = link;\n                        my_offloaded_tasks = orphans;\n                    }\n                    __TBB_ASSERT( !my_offloaded_tasks == !my_offloaded_task_list_tail_link, NULL );\n                    if ( t ) {\n                        if( SchedulerTraits::itt_possible )\n                            ITT_NOTIFY(sync_cancel, this);\n                        break; // exit stealing loop and return\n                    }\n                }\n            }\n#endif /* __TBB_TASK_PRIORITY */\n            const int yield_threshold = 100;\n            if( yield_count++ >= yield_threshold ) {\n                // When a worker thread has nothing to do, return it to RML.\n                // For purposes of affinity support, the thread is considered idle while in RML.\n#if __TBB_TASK_PRIORITY\n                if( return_if_no_work || my_arena->my_top_priority > my_arena->my_bottom_priority ) {\n                    if ( my_arena->is_out_of_work() && return_if_no_work ) {\n#else /* !__TBB_TASK_PRIORITY */\n                    if ( return_if_no_work && my_arena->is_out_of_work() ) {\n#endif /* !__TBB_TASK_PRIORITY */\n                        if( SchedulerTraits::itt_possible )\n                            ITT_NOTIFY(sync_cancel, this);\n                        return NULL;\n                    }\n#if __TBB_TASK_PRIORITY\n                }\n                if ( my_offloaded_tasks ) {\n                    // Safeguard against any sloppiness in managing reload epoch\n                    // counter (e.g. on the hot path because of performance reasons).\n                    my_local_reload_epoch--;\n                    // Break the deadlock caused by a higher priority dispatch loop\n                    // stealing and offloading a lower priority task. Priority check\n                    // at the stealing moment cannot completely preclude such cases\n                    // because priorities can changes dynamically.\n                    if ( !return_if_no_work && *my_ref_top_priority > my_arena->my_top_priority ) {\n                        GATHER_STATISTIC( ++my_counters.prio_ref_fixups );\n                        my_ref_top_priority = &my_arena->my_top_priority;\n                        // it's expected that only outermost workers can use global reload epoch\n                        __TBB_ASSERT(!worker_outermost_level(), NULL);\n                        __TBB_ASSERT(my_ref_reload_epoch == &my_arena->my_reload_epoch, NULL);\n                    }\n                }\n#endif /* __TBB_TASK_PRIORITY */\n            } // end of arena snapshot branch\n            // If several attempts did not find work, re-read the arena limit.\n            n = my_arena->my_limit-1;\n        } // end of yielding branch\n    } // end of nonlocal task retrieval loop\n    my_inbox.set_is_idle( false );\n    return t;\n}\n\ntemplate<typename SchedulerTraits>\nvoid custom_scheduler<SchedulerTraits>::local_wait_for_all( task& parent, task* child ) {\n    __TBB_ASSERT( governor::is_set(this), NULL );\n    __TBB_ASSERT( parent.ref_count() >= (child && child->parent() == &parent ? 2 : 1), \"ref_count is too small\" );\n    assert_task_pool_valid();\n    // Using parent's refcount in sync_prepare (in the stealing loop below) is\n    // a workaround for TP. We need to name it here to display correctly in Ampl.\n    if( SchedulerTraits::itt_possible )\n        ITT_SYNC_CREATE(&parent.prefix().ref_count, SyncType_Scheduler, SyncObj_TaskStealingLoop);\n#if __TBB_TASK_GROUP_CONTEXT\n    __TBB_ASSERT( parent.prefix().context || (is_worker() && &parent == my_dummy_task), \"parent task does not have context\" );\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n    task* t = child;\n    // Constant all_local_work_done is an unreachable refcount value that prevents\n    // early quitting the dispatch loop. It is defined to be in the middle of the range\n    // of negative values representable by the reference_count type.\n    static const reference_count\n        // For normal dispatch loops\n        parents_work_done = 1,\n        // For termination dispatch loops in masters\n        all_local_work_done = (reference_count)3 << (sizeof(reference_count) * 8 - 2);\n    reference_count quit_point;\n#if __TBB_TASK_PRIORITY\n    __TBB_ASSERT( (uintptr_t)*my_ref_top_priority < (uintptr_t)num_priority_levels, NULL );\n    volatile intptr_t *old_ref_top_priority = my_ref_top_priority;\n    // When entering nested parallelism level market level counter\n    // must be replaced with the one local to this arena.\n    volatile uintptr_t *old_ref_reload_epoch = my_ref_reload_epoch;\n#endif /* __TBB_TASK_PRIORITY */\n    task* old_dispatching_task = my_dispatching_task;\n    my_dispatching_task = my_innermost_running_task;\n    if( master_outermost_level() ) {\n        // We are in the outermost task dispatch loop of a master thread or a worker which mimics master\n        __TBB_ASSERT( !is_worker() || my_dispatching_task != old_dispatching_task, NULL );\n        quit_point = &parent == my_dummy_task ? all_local_work_done : parents_work_done;\n    } else {\n        quit_point = parents_work_done;\n#if __TBB_TASK_PRIORITY\n        if ( &parent != my_dummy_task ) {\n            // We are in a nested dispatch loop.\n            // Market or arena priority must not prevent child tasks from being\n            // executed so that dynamic priority changes did not cause deadlock.\n            my_ref_top_priority = &parent.prefix().context->my_priority;\n            my_ref_reload_epoch = &my_arena->my_reload_epoch;\n            if(my_ref_reload_epoch != old_ref_reload_epoch)\n                my_local_reload_epoch = *my_ref_reload_epoch-1;\n        }\n#endif /* __TBB_TASK_PRIORITY */\n    }\n\n    cpu_ctl_env_helper cpu_ctl_helper;\n    if ( t )\n        cpu_ctl_helper.set_env( __TBB_CONTEXT_ARG1(t->prefix().context) );\n\n#if TBB_USE_EXCEPTIONS\n    // Infinite safeguard EH loop\n    for (;;) {\n    try {\n#endif /* TBB_USE_EXCEPTIONS */\n    // Outer loop receives tasks from global environment (via mailbox, FIFO queue(s),\n    // and by  stealing from other threads' task pools).\n    // All exit points from the dispatch loop are located in its immediate scope.\n    for(;;) {\n        // Middle loop retrieves tasks from the local task pool.\n        for(;;) {\n            // Inner loop evaluates tasks coming from nesting loops and those returned\n            // by just executed tasks (bypassing spawn or enqueue calls).\n            while(t) {\n                __TBB_ASSERT( my_inbox.is_idle_state(false), NULL );\n                __TBB_ASSERT(!is_proxy(*t),\"unexpected proxy\");\n                __TBB_ASSERT( t->prefix().owner, NULL );\n                assert_task_valid(*t);\n#if __TBB_TASK_GROUP_CONTEXT && TBB_USE_ASSERT\n                assert_context_valid(t->prefix().context);\n                if ( !t->prefix().context->my_cancellation_requested )\n#endif\n                __TBB_ASSERT( 1L<<t->state() & (1L<<task::allocated|1L<<task::ready|1L<<task::reexecute), NULL );\n                assert_task_pool_valid();\n#if __TBB_TASK_PRIORITY\n                intptr_t p = priority(*t);\n                if ( p != *my_ref_top_priority && (t->prefix().extra_state & es_task_enqueued) == 0) {\n                    assert_priority_valid(p);\n                    if ( p != my_arena->my_top_priority ) {\n                        my_market->update_arena_priority( *my_arena, p );\n                    }\n                    if ( p < effective_reference_priority() ) {\n                        if ( !my_offloaded_tasks ) {\n                            my_offloaded_task_list_tail_link = &t->prefix().next_offloaded;\n                            // Erase possible reference to the owner scheduler (next_offloaded is a union member)\n                            *my_offloaded_task_list_tail_link = NULL;\n                        }\n                        offload_task( *t, p );\n                        if ( in_arena() ) {\n                            t = winnow_task_pool();\n                            if ( t )\n                                continue;\n                        }\n                        else {\n                            // Mark arena as full to unlock arena priority level adjustment\n                            // by arena::is_out_of_work(), and ensure worker's presence.\n                            my_arena->advertise_new_work<false>();\n                        }\n                        goto stealing_ground;\n                    }\n                }\n#endif /* __TBB_TASK_PRIORITY */\n                task* t_next = NULL;\n                my_innermost_running_task = t;\n                t->prefix().owner = this;\n                t->prefix().state = task::executing;\n#if __TBB_TASK_GROUP_CONTEXT\n                if ( !t->prefix().context->my_cancellation_requested )\n#endif\n                {\n                    GATHER_STATISTIC( ++my_counters.tasks_executed );\n                    GATHER_STATISTIC( my_counters.avg_arena_concurrency += my_arena->num_workers_active() );\n                    GATHER_STATISTIC( my_counters.avg_assigned_workers += my_arena->my_num_workers_allotted );\n#if __TBB_TASK_PRIORITY\n                    GATHER_STATISTIC( my_counters.avg_arena_prio += p );\n                    GATHER_STATISTIC( my_counters.avg_market_prio += my_market->my_global_top_priority );\n#endif /* __TBB_TASK_PRIORITY */\n                    ITT_STACK(SchedulerTraits::itt_possible, callee_enter, t->prefix().context->itt_caller);\n                    t_next = t->execute();\n                    ITT_STACK(SchedulerTraits::itt_possible, callee_leave, t->prefix().context->itt_caller);\n                    if (t_next) {\n                        __TBB_ASSERT( t_next->state()==task::allocated,\n                                \"if task::execute() returns task, it must be marked as allocated\" );\n                        reset_extra_state(t_next);\n#if TBB_USE_ASSERT\n                        affinity_id next_affinity=t_next->prefix().affinity;\n                        if (next_affinity != 0 && next_affinity != my_affinity_id)\n                            GATHER_STATISTIC( ++my_counters.affinity_ignored );\n#endif\n                    }\n                }\n                assert_task_pool_valid();\n                switch( t->state() ) {\n                    case task::executing: {\n                        task* s = t->parent();\n                        __TBB_ASSERT( my_innermost_running_task==t, NULL );\n                        __TBB_ASSERT( t->prefix().ref_count==0, \"Task still has children after it has been executed\" );\n                        t->~task();\n                        if( s )\n                            tally_completion_of_predecessor(*s, t_next);\n                        free_task<no_hint>( *t );\n                        assert_task_pool_valid();\n                        break;\n                    }\n\n                    case task::recycle: // set by recycle_as_safe_continuation()\n                        t->prefix().state = task::allocated;\n#if __TBB_RECYCLE_TO_ENQUEUE\n                    case task::to_enqueue: // set by recycle_to_enqueue()\n#endif\n                        __TBB_ASSERT( t_next != t, \"a task returned from method execute() can not be recycled in another way\" );\n                        reset_extra_state(t);\n                        // for safe continuation, need atomically decrement ref_count;\n                        tally_completion_of_predecessor(*t, t_next);\n                        assert_task_pool_valid();\n                        break;\n\n                    case task::reexecute: // set by recycle_to_reexecute()\n                        __TBB_ASSERT( t_next, \"reexecution requires that method execute() return another task\" );\n                        __TBB_ASSERT( t_next != t, \"a task returned from method execute() can not be recycled in another way\" );\n                        t->prefix().state = task::allocated;\n                        reset_extra_state(t);\n                        local_spawn( *t, t->prefix().next );\n                        assert_task_pool_valid();\n                        break;\n                    case task::allocated:\n                        reset_extra_state(t);\n                        break;\n#if TBB_USE_ASSERT\n                    case task::ready:\n                        __TBB_ASSERT( false, \"task is in READY state upon return from method execute()\" );\n                        break;\n                    default:\n                        __TBB_ASSERT( false, \"illegal state\" );\n#else\n                    default: // just to shut up some compilation warnings\n                        break;\n#endif /* TBB_USE_ASSERT */\n                }\n                GATHER_STATISTIC( t_next ? ++my_counters.spawns_bypassed : 0 );\n                t = t_next;\n            } // end of scheduler bypass loop\n\n            assert_task_pool_valid();\n            if ( parent.prefix().ref_count == quit_point ) {\n                __TBB_ASSERT( quit_point != all_local_work_done, NULL );\n                __TBB_control_consistency_helper(); // on ref_count\n                ITT_NOTIFY(sync_acquired, &parent.prefix().ref_count);\n                goto done;\n            }\n            if ( in_arena() ) {\n                t = get_task();\n            }\n            else {\n                __TBB_ASSERT( is_quiescent_local_task_pool_reset(), NULL );\n                break;\n            }\n            __TBB_ASSERT(!t || !is_proxy(*t),\"unexpected proxy\");\n            assert_task_pool_valid();\n\n            if ( !t ) break;\n\n            cpu_ctl_helper.set_env( __TBB_CONTEXT_ARG1(t->prefix().context) );\n        }; // end of local task pool retrieval loop\n\n#if __TBB_TASK_PRIORITY\nstealing_ground:\n#endif /* __TBB_TASK_PRIORITY */\n#if __TBB_HOARD_NONLOCAL_TASKS\n        // before stealing, previously stolen task objects are returned\n        for (; my_nonlocal_free_list; my_nonlocal_free_list = t ) {\n            t = my_nonlocal_free_list->prefix().next;\n            free_nonlocal_small_task( *my_nonlocal_free_list );\n        }\n#endif\n        if ( quit_point == all_local_work_done ) {\n            __TBB_ASSERT( !in_arena() && is_quiescent_local_task_pool_reset(), NULL );\n            __TBB_ASSERT( !worker_outermost_level(), NULL );\n            my_innermost_running_task = my_dispatching_task;\n            my_dispatching_task = old_dispatching_task;\n#if __TBB_TASK_PRIORITY\n            my_ref_top_priority = old_ref_top_priority;\n            if(my_ref_reload_epoch != old_ref_reload_epoch)\n                my_local_reload_epoch = *old_ref_reload_epoch-1;\n            my_ref_reload_epoch = old_ref_reload_epoch;\n#endif /* __TBB_TASK_PRIORITY */\n            return;\n        }\n        // The following assertion may be falsely triggered in the presence of enqueued tasks\n        //__TBB_ASSERT( my_arena->my_max_num_workers > 0 || my_market->my_ref_count > 1\n        //              || parent.prefix().ref_count == 1, \"deadlock detected\" );\n\n        // Dispatching task pointer is NULL *iff* this is a worker thread in its outermost\n        // dispatch loop (i.e. its execution stack is empty). In this case it should exit it\n        // either when there is no more work in the current arena, or when revoked by the market.\n        \n        t = receive_or_steal_task( parent.prefix().ref_count, worker_outermost_level() );\n        if ( !t )\n            goto done;\n        __TBB_ASSERT(!is_proxy(*t),\"unexpected proxy\");\n\n        // The user can capture another the FPU settings to the context so the\n        // cached data in the helper can be out-of-date and we cannot do fast\n        // check.\n        cpu_ctl_helper.set_env( __TBB_CONTEXT_ARG1(t->prefix().context) );\n    } // end of infinite stealing loop\n#if TBB_USE_EXCEPTIONS\n    __TBB_ASSERT( false, \"Must never get here\" );\n    } // end of try-block\n    TbbCatchAll( t->prefix().context );\n    // Complete post-processing ...\n    if( t->state() == task::recycle\n#if __TBB_RECYCLE_TO_ENQUEUE\n        // TODO: the enqueue semantics gets lost below, consider reimplementing\n        ||  t->state() == task::to_enqueue\n#endif\n      ) {\n        // ... for recycled tasks to atomically decrement ref_count\n        t->prefix().state = task::allocated;\n        if( SchedulerTraits::itt_possible )\n            ITT_NOTIFY(sync_releasing, &t->prefix().ref_count);\n        if( __TBB_FetchAndDecrementWrelease(&t->prefix().ref_count)==1 ) {\n            if( SchedulerTraits::itt_possible )\n                ITT_NOTIFY(sync_acquired, &t->prefix().ref_count);\n        }else{\n            t = NULL;\n        }\n    }\n    } // end of infinite EH loop\n    __TBB_ASSERT( false, \"Must never get here too\" );\n#endif /* TBB_USE_EXCEPTIONS */\ndone:\n    my_innermost_running_task = my_dispatching_task;\n    my_dispatching_task = old_dispatching_task;\n#if __TBB_TASK_PRIORITY\n    my_ref_top_priority = old_ref_top_priority;\n    if(my_ref_reload_epoch != old_ref_reload_epoch)\n        my_local_reload_epoch = *old_ref_reload_epoch-1;\n    my_ref_reload_epoch = old_ref_reload_epoch;\n#endif /* __TBB_TASK_PRIORITY */\n    if ( !ConcurrentWaitsEnabled(parent) ) {\n        if ( parent.prefix().ref_count != parents_work_done ) {\n            // This is a worker that was revoked by the market.\n#if __TBB_TASK_ARENA\n            __TBB_ASSERT( worker_outermost_level(),\n                \"Worker thread exits nested dispatch loop prematurely\" );\n#else\n            __TBB_ASSERT( is_worker() && worker_outermost_level(),\n                \"Worker thread exits nested dispatch loop prematurely\" );\n#endif\n            return;\n        }\n        parent.prefix().ref_count = 0;\n    }\n#if TBB_USE_ASSERT\n    parent.prefix().extra_state &= ~es_ref_count_active;\n#endif /* TBB_USE_ASSERT */\n#if __TBB_TASK_GROUP_CONTEXT\n    __TBB_ASSERT(parent.prefix().context && default_context(), NULL);\n    task_group_context* parent_ctx = parent.prefix().context;\n    if ( parent_ctx->my_cancellation_requested ) {\n        task_group_context::exception_container_type *pe = parent_ctx->my_exception;\n        if ( master_outermost_level() && parent_ctx == default_context() ) {\n            // We are in the outermost task dispatch loop of a master thread, and\n            // the whole task tree has been collapsed. So we may clear cancellation data.\n            parent_ctx->my_cancellation_requested = 0;\n            // TODO: Add assertion that master's dummy task context does not have children\n            parent_ctx->my_state &= ~(uintptr_t)task_group_context::may_have_children;\n        }\n        if ( pe ) {\n            // On Windows, FPU control settings changed in the helper destructor are not visible\n            // outside a catch block. So restore the default settings manually before rethrowing\n            // the exception.\n            cpu_ctl_helper.restore_default();\n            pe->throw_self();\n        }\n    }\n    __TBB_ASSERT(!is_worker() || !CancellationInfoPresent(*my_dummy_task),\n        \"Worker's dummy task context modified\");\n    __TBB_ASSERT(!master_outermost_level() || !CancellationInfoPresent(*my_dummy_task),\n        \"Unexpected exception or cancellation data in the master's dummy task\");\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n    assert_task_pool_valid();\n}\n\n} // namespace internal\n} // namespace tbb\n\n#endif /* _TBB_custom_scheduler_H */\n"
  },
  {
    "path": "benchmarks/tbb/dynamic_link.cpp",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#include \"dynamic_link.h\"\n#include \"tbb/tbb_config.h\"\n\n/*\n    This file is used by both TBB and OpenMP RTL. Do not use __TBB_ASSERT() macro\n    and runtime_warning() function because they are not available in OpenMP. Use\n    LIBRARY_ASSERT and DYNAMIC_LINK_WARNING instead.\n*/\n\n#include <cstdarg>          // va_list etc.\n#if _WIN32\n    #include <malloc.h>\n\n    // Unify system calls\n    #define dlopen( name, flags )   LoadLibraryA( name )\n    #define dlsym( handle, name )   GetProcAddress( handle, name )\n    #define dlclose( handle )       ( ! FreeLibrary( handle ) )\n    #define dlerror()               GetLastError()\n#ifndef PATH_MAX\n    #define PATH_MAX                MAX_PATH\n#endif\n#else /* _WIN32 */\n    #include <dlfcn.h>\n    #include <string.h>\n    #include <unistd.h>\n    #include <limits.h>\n    #include <stdlib.h>\n#endif /* _WIN32 */\n\n#if __TBB_WEAK_SYMBOLS_PRESENT\n    //TODO: use function attribute for weak symbols instead of the pragma.\n    #pragma weak dlopen\n    #pragma weak dlsym\n    #pragma weak dlclose\n    #pragma weak dlerror\n    #pragma weak dladdr\n#endif /* __TBB_WEAK_SYMBOLS_PRESENT */\n\n#include \"tbb/tbb_misc.h\"\n\n#define __USE_TBB_ATOMICS       ( !(__linux__&&__ia64__) || __TBB_BUILD )\n#define __USE_STATIC_DL_INIT    (!__ANDROID__)\n\n#if !__USE_TBB_ATOMICS\n#include <pthread.h>\n#endif\n\n/*\ndynamic_link is a common interface for searching for required symbols in an\nexecutable and dynamic libraries.\n\ndynamic_link provides certain guarantees:\n  1. Either all or none of the requested symbols are resolved. Moreover, if\n  symbols are not resolved, the dynamic_link_descriptor table is not modified;\n  2. All returned symbols have secured life time: this means that none of them\n  can be invalidated until dynamic_unlink is called;\n  3. Any loaded library is loaded only via the full path. The full path is that\n  from which the runtime itself was loaded. (This is done to avoid security\n  issues caused by loading libraries from insecure paths).\n\ndynamic_link searches for the requested symbols in three stages, stopping as\nsoon as all of the symbols have been resolved.\n\n  1. Search the global scope:\n    a. On Windows: dynamic_link tries to obtain the handle of the requested\n    library and if it succeeds it resolves the symbols via that handle.\n    b. On Linux: dynamic_link tries to search for the symbols in the global\n    scope via the main program handle. If the symbols are present in the global\n    scope their life time is not guaranteed (since dynamic_link does not know\n    anything about the library from which they are exported). Therefore it\n    tries to \"pin\" the symbols by obtaining the library name and reopening it.\n    dlopen may fail to reopen the library in two cases:\n       i. The symbols are exported from the executable. Currently dynamic _link\n      cannot handle this situation, so it will not find these symbols in this\n      step.\n      ii. The necessary library has been unloaded and cannot be reloaded. It\n      seems there is nothing that can be done in this case. No symbols are\n      returned.\n\n  2. Dynamic load: an attempt is made to load the requested library via the\n  full path.\n    The full path used is that from which the runtime itself was loaded. If the\n    library can be loaded, then an attempt is made to resolve the requested\n    symbols in the newly loaded library.\n    If the symbols are not found the library is unloaded.\n\n  3. Weak symbols: if weak symbols are available they are returned.\n*/\n\nOPEN_INTERNAL_NAMESPACE\n\n#if __TBB_WEAK_SYMBOLS_PRESENT || __TBB_DYNAMIC_LOAD_ENABLED\n\n#if !defined(DYNAMIC_LINK_WARNING) && !__TBB_WIN8UI_SUPPORT\n    // Report runtime errors and continue.\n    #define DYNAMIC_LINK_WARNING dynamic_link_warning\n    static void dynamic_link_warning( dynamic_link_error_t code, ... ) {\n        (void) code;\n    } // library_warning\n#endif /* DYNAMIC_LINK_WARNING */\n    static bool resolve_symbols( dynamic_link_handle module, const dynamic_link_descriptor descriptors[], size_t required )\n    {\n        LIBRARY_ASSERT( module != NULL, \"Module handle is NULL\" );\n        if ( module == NULL )\n            return false;\n\n        #if __TBB_WEAK_SYMBOLS_PRESENT\n            if ( !dlsym ) return false;\n        #endif /* __TBB_WEAK_SYMBOLS_PRESENT */\n\n        const size_t n_desc=20; // Usually we don't have more than 20 descriptors per library\n        LIBRARY_ASSERT( required <= n_desc, \"Too many descriptors is required\" );\n        if ( required > n_desc ) return false;\n        pointer_to_handler h[n_desc];\n\n        for ( size_t k = 0; k < required; ++k ) {\n            dynamic_link_descriptor const & desc = descriptors[k];\n            pointer_to_handler addr = (pointer_to_handler)dlsym( module, desc.name );\n            if ( !addr ) {\n                return false;\n            }\n            h[k] = addr;\n        }\n\n        // Commit the entry points.\n        // Cannot use memset here, because the writes must be atomic.\n        for( size_t k = 0; k < required; ++k )\n            *descriptors[k].handler = h[k];\n        return true;\n    }\n\n#if __TBB_WIN8UI_SUPPORT\n    bool dynamic_link( const char*  library, const dynamic_link_descriptor descriptors[], size_t required, dynamic_link_handle*, int flags ) {\n        dynamic_link_handle tmp_handle = NULL;\n        TCHAR wlibrary[256];\n        if ( MultiByteToWideChar(CP_UTF8, 0, library, -1, wlibrary, 255) == 0 ) return false;\n        if ( flags & DYNAMIC_LINK_LOAD )\n            tmp_handle = LoadPackagedLibrary( wlibrary, 0 );\n        if (tmp_handle != NULL){\n            return resolve_symbols(tmp_handle, descriptors, required);\n        }else{\n            return false;\n        }\n    }\n    void dynamic_unlink( dynamic_link_handle ) {\n    }\n    void dynamic_unlink_all() {\n    }\n#else\n/*\n    There is a security issue on Windows: LoadLibrary() may load and execute malicious code.\n    See http://www.microsoft.com/technet/security/advisory/2269637.mspx for details.\n    To avoid the issue, we have to pass full path (not just library name) to LoadLibrary. This\n    function constructs full path to the specified library (it is assumed the library located\n    side-by-side with the tbb.dll.\n\n    The function constructs absolute path for given relative path. Important: Base directory is not\n    current one, it is the directory tbb.dll loaded from.\n\n    Example:\n        Let us assume \"tbb.dll\" is located in \"c:\\program files\\common\\intel\\\" directory, e. g.\n        absolute path of tbb library is \"c:\\program files\\common\\intel\\tbb.dll\". Absolute path for\n        \"tbbmalloc.dll\" would be \"c:\\program files\\common\\intel\\tbbmalloc.dll\". Absolute path for\n        \"malloc\\tbbmalloc.dll\" would be \"c:\\program files\\common\\intel\\malloc\\tbbmalloc.dll\".\n*/\n\n    // Struct handle_storage is used by dynamic_link routine to store handles of\n    // all loaded or pinned dynamic libraries. When TBB is shut down, it calls\n    // dynamic_unlink_all() that unloads modules referenced by handle_storage.\n    // This struct should not have any constructors since it may be used before\n    // the constructor is called.\n    #define MAX_LOADED_MODULES 8 // The number of maximum possible modules which can be loaded\n\n    struct handle_storage {\n    #if __USE_TBB_ATOMICS\n        ::tbb::atomic<size_t> my_size;\n    #else\n        size_t my_size;\n        pthread_spinlock_t my_lock;\n    #endif\n        dynamic_link_handle my_handles[MAX_LOADED_MODULES];\n\n        void add_handle(const dynamic_link_handle &handle) {\n        #if !__USE_TBB_ATOMICS\n            int res = pthread_spin_lock( &my_lock );\n            LIBRARY_ASSERT( res==0, \"pthread_spin_lock failed\" );\n        #endif\n            const size_t ind = my_size++;\n        #if !__USE_TBB_ATOMICS\n            res = pthread_spin_unlock( &my_lock );\n            LIBRARY_ASSERT( res==0, \"pthread_spin_unlock failed\" );\n        #endif\n            LIBRARY_ASSERT( ind < MAX_LOADED_MODULES, \"Too many modules are loaded\" );\n            my_handles[ind] = handle;\n        }\n\n        void free_handles() {\n            const size_t size = my_size;\n            for (size_t i=0; i<size; ++i)\n                dynamic_unlink( my_handles[i] );\n        }\n    };\n\n    handle_storage handles;\n\n#if __USE_TBB_ATOMICS\n    static void atomic_once ( void (*func) (void), tbb::atomic< tbb::internal::do_once_state > &once_state ) {\n        tbb::internal::atomic_do_once( func, once_state );\n    }\n#define ATOMIC_ONCE_DECL( var ) tbb::atomic< tbb::internal::do_once_state > var\n#else\n    static void atomic_once ( void (*func) (), pthread_once_t &once_state ) {\n        pthread_once( &once_state, func );\n    }\n#define ATOMIC_ONCE_DECL( var ) pthread_once_t var = PTHREAD_ONCE_INIT\n#endif\n\n    ATOMIC_ONCE_DECL( init_dl_data_state );\n\n    static struct _ap_data {\n        char _path[PATH_MAX+1];\n        size_t _len;\n    } ap_data;\n\n    static void init_ap_data() {\n    #if _WIN32\n        // Get handle of our DLL first.\n        HMODULE handle;\n        BOOL brc = GetModuleHandleExA(\n            GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,\n            (LPSTR)( & dynamic_link ), // any function inside the library can be used for the address\n            & handle\n            );\n        if ( !brc ) { // Error occurred.\n            int err = GetLastError();\n            DYNAMIC_LINK_WARNING( dl_sys_fail, \"GetModuleHandleEx\", err );\n            return;\n        }\n        // Now get path to our DLL.\n        DWORD drc = GetModuleFileNameA( handle, ap_data._path, static_cast< DWORD >( PATH_MAX ) );\n        if ( drc == 0 ) { // Error occurred.\n            int err = GetLastError();\n            DYNAMIC_LINK_WARNING( dl_sys_fail, \"GetModuleFileName\", err );\n            return;\n        }\n        if ( drc >= PATH_MAX ) { // Buffer too short.\n            DYNAMIC_LINK_WARNING( dl_buff_too_small );\n            return;\n        }\n        // Find the position of the last backslash.\n        char *backslash = strrchr( ap_data._path, '\\\\' );\n\n        if ( !backslash ) {    // Backslash not found.\n            LIBRARY_ASSERT( backslash!=NULL, \"Unbelievable.\");\n            return;\n        }\n        LIBRARY_ASSERT( backslash >= ap_data._path, \"Unbelievable.\");\n        ap_data._len = (size_t)(backslash - ap_data._path) + 1;\n        *(backslash+1) = 0;\n    #else\n        // Get the library path\n        #if __TBB_WEAK_SYMBOLS_PRESENT\n            if ( !dladdr || !dlerror ) return;\n        #endif /* __TBB_WEAK_SYMBOLS_PRESENT */\n        Dl_info dlinfo;\n        int res = dladdr( (void*)&dynamic_link, &dlinfo ); // any function inside the library can be used for the address\n        if ( !res ) {\n            char const * err = dlerror();\n            DYNAMIC_LINK_WARNING( dl_sys_fail, \"dladdr\", err );\n            return;\n        } else {\n            LIBRARY_ASSERT( dlinfo.dli_fname!=NULL, \"Unbelievable.\" );\n        }\n\n        char const *slash = strrchr( dlinfo.dli_fname, '/' );\n        size_t fname_len=0;\n        if ( slash ) {\n            LIBRARY_ASSERT( slash >= dlinfo.dli_fname, \"Unbelievable.\");\n            fname_len = (size_t)(slash - dlinfo.dli_fname) + 1;\n        }\n\n        size_t rc;\n        if ( dlinfo.dli_fname[0]=='/' ) {\n            // The library path is absolute\n            rc = 0;\n            ap_data._len = 0;\n        } else {\n            // The library path is relative so get the current working directory\n            if ( !getcwd( ap_data._path, sizeof(ap_data._path)/sizeof(ap_data._path[0]) ) ) {\n                DYNAMIC_LINK_WARNING( dl_buff_too_small );\n                return;\n            }\n            ap_data._len = strlen( ap_data._path );\n            ap_data._path[ap_data._len++]='/';\n            rc = ap_data._len;\n        }\n\n        if ( fname_len>0 ) {\n            if ( ap_data._len>PATH_MAX ) {\n                DYNAMIC_LINK_WARNING( dl_buff_too_small );\n                ap_data._len=0;\n                return;\n            }\n            strncpy( ap_data._path+rc, dlinfo.dli_fname, fname_len );\n            ap_data._len += fname_len;\n            ap_data._path[ap_data._len]=0;\n        }\n    #endif /* _WIN32 */\n    }\n\n    static void init_dl_data() {\n        init_ap_data();\n    #if !__USE_TBB_ATOMICS\n        int res;\n        res = pthread_spin_init( &handles.my_lock, PTHREAD_PROCESS_SHARED );\n        LIBRARY_ASSERT( res==0, \"pthread_spin_init failed\" );\n    #endif\n    }\n\n    // ap_data structure is initialized with current directory on Linux.\n    // So it should be initialized as soon as possible since the current directory may be changed.\n    // static_init_ap_data object provides this initialization during library loading.\n    static class _static_init_dl_data {\n    public:\n        _static_init_dl_data() {\n    #if __USE_STATIC_DL_INIT\n            atomic_once( &init_dl_data, init_dl_data_state );\n    #endif\n        }\n    #if !__USE_TBB_ATOMICS\n        ~_static_init_dl_data() {\n            int res;\n            res = pthread_spin_destroy( &handles.my_lock );\n            LIBRARY_ASSERT( res==0, \"pthread_spin_destroy failed\" );\n        }\n    #endif\n    } static_init_dl_data;\n\n    /*\n        The function constructs absolute path for given relative path. Important: Base directory is not\n        current one, it is the directory libtbb.so loaded from.\n\n        Arguments:\n        in  name -- Name of a file (may be with relative path; it must not be an absolute one).\n        out path -- Buffer to save result (absolute path) to.\n        in  len  -- Size of buffer.\n        ret      -- 0         -- Error occurred.\n                    > len     -- Buffer too short, required size returned.\n                    otherwise -- Ok, number of characters (not counting terminating null) written to\n                    buffer.\n    */\n    #if __TBB_DYNAMIC_LOAD_ENABLED\n    static size_t abs_path( char const * name, char * path, size_t len ) {\n        atomic_once( &init_dl_data, init_dl_data_state );\n\n        if ( !ap_data._len )\n            return 0;\n\n        size_t name_len = strlen( name );\n        size_t full_len = name_len+ap_data._len;\n        if ( full_len < len ) {\n            strncpy( path, ap_data._path, ap_data._len );\n            strncpy( path+ap_data._len, name, name_len );\n            path[full_len] = 0;\n        }\n        return full_len;\n    }\n    #endif  // __TBB_DYNAMIC_LOAD_ENABLED\n\n    #if __TBB_WEAK_SYMBOLS_PRESENT\n    static bool weak_symbol_link( const dynamic_link_descriptor descriptors[], size_t required )\n    {\n        // Check if the required entries are present in what was loaded into our process.\n        for ( size_t k = 0; k < required; ++k )\n            if ( !descriptors[k].ptr )\n                return false;\n        // Commit the entry points.\n        for ( size_t k = 0; k < required; ++k )\n            *descriptors[k].handler = (pointer_to_handler) descriptors[k].ptr;\n        return true;\n    }\n    #else\n    static bool weak_symbol_link( const dynamic_link_descriptor[], size_t ) {\n        return false;\n    }\n    #endif /* __TBB_WEAK_SYMBOLS_PRESENT */\n\n    void dynamic_unlink( dynamic_link_handle handle ) {\n        if ( handle ) {\n    #if __TBB_WEAK_SYMBOLS_PRESENT\n        LIBRARY_ASSERT( dlclose != NULL, \"dlopen is present but dlclose is NOT present!?\" );\n    #endif /* __TBB_WEAK_SYMBOLS_PRESENT */\n    #if __TBB_DYNAMIC_LOAD_ENABLED\n            dlclose( handle );\n    #endif /* __TBB_DYNAMIC_LOAD_ENABLED */\n        }\n    }\n\n    void dynamic_unlink_all() {\n        handles.free_handles();\n    }\n\n    #if _WIN32\n    static dynamic_link_handle global_symbols_link( const char* library, const dynamic_link_descriptor descriptors[], size_t required ) {\n        dynamic_link_handle library_handle;\n        if ( GetModuleHandleExA( 0, library, &library_handle ) ) {\n            if ( resolve_symbols( library_handle, descriptors, required ) )\n                return library_handle;\n            else\n                FreeLibrary( library_handle );\n        }\n        return 0;\n    }\n    #else /* _WIN32 */\n    // It is supposed that all symbols are from the only one library\n    static dynamic_link_handle pin_symbols( dynamic_link_descriptor desc, const dynamic_link_descriptor descriptors[], size_t required ) {\n        // The library has been loaded by another module and contains at least one requested symbol.\n        // But after we obtained the symbol the library can be unloaded by another thread\n        // invalidating our symbol. Therefore we need to pin the library in memory.\n        dynamic_link_handle library_handle;\n        Dl_info info;\n        // Get library's name from earlier found symbol\n        if ( dladdr( (void*)*desc.handler, &info ) ) {\n            // Pin the library\n            library_handle = dlopen( info.dli_fname, RTLD_LAZY );\n            if ( library_handle ) {\n                // If original library was unloaded before we pinned it\n                // and then another module loaded in its place, the earlier\n                // found symbol would become invalid. So revalidate them.\n                if ( !resolve_symbols( library_handle, descriptors, required ) ) {\n                    // Wrong library.\n                    dynamic_unlink(library_handle);\n                    library_handle = 0;\n                }\n            } else {\n                char const * err = dlerror();\n                DYNAMIC_LINK_WARNING( dl_lib_not_found, info.dli_fname, err );\n            }\n        }\n        else {\n            // The library have been unloaded by another thread\n            library_handle = 0;\n        }\n        return library_handle;\n    }\n\n    static dynamic_link_handle global_symbols_link( const char*, const dynamic_link_descriptor descriptors[], size_t required ) {\n    #if __TBB_WEAK_SYMBOLS_PRESENT\n        if ( !dlopen ) return 0;\n    #endif /* __TBB_WEAK_SYMBOLS_PRESENT */\n        dynamic_link_handle library_handle = dlopen( NULL, RTLD_LAZY );\n    #if __ANDROID__\n        // On Android dlopen( NULL ) returns NULL if it is called during dynamic module initialization.\n        if ( !library_handle )\n            return 0;\n    #endif\n        // Check existence of only the first symbol, then use it to find the library and load all necessary symbols\n        pointer_to_handler handler;\n        dynamic_link_descriptor desc = { descriptors[0].name, &handler };\n        if ( resolve_symbols( library_handle, &desc, 1 ) )\n                return pin_symbols( desc, descriptors, required );\n        return 0;\n    }\n    #endif /* _WIN32 */\n\n    static void save_library_handle( dynamic_link_handle src, dynamic_link_handle *dst ) {\n        if ( dst )\n            *dst = src;\n        else\n            handles.add_handle( src );\n    }\n\n    dynamic_link_handle dynamic_load( const char* library, const dynamic_link_descriptor descriptors[], size_t required ) {\n    #if __TBB_DYNAMIC_LOAD_ENABLED\n    #if _XBOX\n        return LoadLibrary (library);\n    #else /* _XBOX */\n        size_t const len = PATH_MAX + 1;\n        char path[ len ];\n        size_t rc = abs_path( library, path, len );\n        if ( 0 < rc && rc < len ) {\n    #if _WIN32\n            // Prevent Windows from displaying silly message boxes if it fails to load library\n            // (e.g. because of MS runtime problems - one of those crazy manifest related ones)\n            UINT prev_mode = SetErrorMode (SEM_FAILCRITICALERRORS);\n    #endif /* _WIN32 */\n    #if __TBB_WEAK_SYMBOLS_PRESENT\n        if ( !dlopen ) return 0;\n    #endif /* __TBB_WEAK_SYMBOLS_PRESENT */\n            dynamic_link_handle library_handle = dlopen( path, RTLD_LAZY );\n    #if _WIN32\n            SetErrorMode (prev_mode);\n    #endif /* _WIN32 */\n            if( library_handle ) {\n                if( !resolve_symbols( library_handle, descriptors, required ) ) {\n                    // The loaded library does not contain all the expected entry points\n                    dynamic_unlink( library_handle );\n                    library_handle = NULL;\n                }\n            } else\n                DYNAMIC_LINK_WARNING( dl_lib_not_found, path, dlerror() );\n            return library_handle;\n        } else if ( rc>=len )\n                DYNAMIC_LINK_WARNING( dl_buff_too_small );\n                // rc == 0 means failing of init_ap_data so the warning has already been issued.\n    #endif /* _XBOX */\n    #endif /* __TBB_DYNAMIC_LOAD_ENABLED */\n        return 0;\n    }\n\n    bool dynamic_link( const char* library, const dynamic_link_descriptor descriptors[], size_t required, dynamic_link_handle *handle, int flags ) {\n        // TODO: May global_symbols_link find weak symbols?\n        dynamic_link_handle library_handle = ( flags & DYNAMIC_LINK_GLOBAL ) ? global_symbols_link( library, descriptors, required ) : 0;\n\n        if ( !library_handle && ( flags & DYNAMIC_LINK_LOAD ) )\n            library_handle = dynamic_load( library, descriptors, required );\n\n        if ( !library_handle && ( flags & DYNAMIC_LINK_WEAK ) )\n            return weak_symbol_link( descriptors, required );\n\n        save_library_handle( library_handle, handle );\n        return true;\n    }\n\n#endif /*__TBB_WIN8UI_SUPPORT*/\n#else /* __TBB_WEAK_SYMBOLS_PRESENT || __TBB_DYNAMIC_LOAD_ENABLED */\n    bool dynamic_link( const char*, const dynamic_link_descriptor*, size_t, dynamic_link_handle *handle, int ) {\n        if ( handle )\n            *handle=0;\n        return false;\n    }\n\n    void dynamic_unlink( dynamic_link_handle ) {\n    }\n\n    void dynamic_unlink_all() {\n    }\n#endif /* __TBB_WEAK_SYMBOLS_PRESENT || __TBB_DYNAMIC_LOAD_ENABLED */\n\nCLOSE_INTERNAL_NAMESPACE\n"
  },
  {
    "path": "benchmarks/tbb/dynamic_link.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_dynamic_link\n#define __TBB_dynamic_link\n\n// Support for dynamic loading entry points from other shared libraries.\n\n#include \"tbb/tbb_stddef.h\"\n\n#ifdef LIBRARY_ASSERT\n    #undef __TBB_ASSERT\n    #define __TBB_ASSERT(x,y) LIBRARY_ASSERT(x,y)\n#else\n    #define LIBRARY_ASSERT(x,y) __TBB_ASSERT_EX(x,y)\n#endif /* !LIBRARY_ASSERT */\n\n/** By default, symbols declared and defined here go into namespace tbb::internal.\n    To put them in other namespace, define macros OPEN_INTERNAL_NAMESPACE\n    and CLOSE_INTERNAL_NAMESPACE to override the following default definitions. **/\n#ifndef OPEN_INTERNAL_NAMESPACE\n#define OPEN_INTERNAL_NAMESPACE namespace tbb { namespace internal {\n#define CLOSE_INTERNAL_NAMESPACE }}\n#endif /* OPEN_INTERNAL_NAMESPACE */\n\n#include <stddef.h>\n#if _WIN32\n#include \"tbb/machine/windows_api.h\"\n#endif /* _WIN32 */\n\nOPEN_INTERNAL_NAMESPACE\n\n//! Type definition for a pointer to a void somefunc(void)\ntypedef void (*pointer_to_handler)();\n\n//! The helper to construct dynamic_link_descriptor structure\n// Double cast through the void* in DLD macro is necessary to\n// prevent warnings from some compilers (g++ 4.1)\n#if __TBB_WEAK_SYMBOLS_PRESENT\n#define DLD(s,h) {#s, (pointer_to_handler*)(void*)(&h), (pointer_to_handler)&s}\n#else \n#define DLD(s,h) {#s, (pointer_to_handler*)(void*)(&h)}\n#endif /* __TBB_WEAK_SYMBOLS_PRESENT */\n//! Association between a handler name and location of pointer to it.\nstruct dynamic_link_descriptor {\n    //! Name of the handler\n    const char* name;\n    //! Pointer to the handler\n    pointer_to_handler* handler;\n#if __TBB_WEAK_SYMBOLS_PRESENT\n    //! Weak symbol\n    pointer_to_handler ptr;\n#endif\n};\n\n#if _WIN32\ntypedef HMODULE dynamic_link_handle;\n#else\ntypedef void* dynamic_link_handle;\n#endif /* _WIN32 */\n\nconst int DYNAMIC_LINK_GLOBAL = 0x01;\nconst int DYNAMIC_LINK_LOAD   = 0x02;\nconst int DYNAMIC_LINK_WEAK   = 0x04;\nconst int DYNAMIC_LINK_ALL    = DYNAMIC_LINK_GLOBAL | DYNAMIC_LINK_LOAD | DYNAMIC_LINK_WEAK;\n\n//! Fill in dynamically linked handlers.\n/** 'library' is the name of the requested library. It should not contain a full\n    path since dynamic_link adds the full path (from which the runtime itself\n    was loaded) to the library name.\n    'required' is the number of the initial entries in the array descriptors[]\n    that have to be found in order for the call to succeed. If the library and\n    all the required handlers are found, then the corresponding handler\n    pointers are set, and the return value is true.  Otherwise the original\n    array of descriptors is left untouched and the return value is false.\n    'required' is limited by 20 (exceeding of this value will result in failure\n    to load the symbols and the return value will be false).\n    'handle' is the handle of the library if it is loaded. Otherwise it is left\n    untouched.\n    'flags' is the set of DYNAMIC_LINK_* flags. Each of the DYNAMIC_LINK_* flags\n    allows its corresponding linking stage.\n**/\nbool dynamic_link( const char* library,\n                   const dynamic_link_descriptor descriptors[],\n                   size_t required,\n                   dynamic_link_handle* handle = 0,\n                   int flags = DYNAMIC_LINK_ALL );\n\nvoid dynamic_unlink( dynamic_link_handle handle );\n\nvoid dynamic_unlink_all();\n\nenum dynamic_link_error_t {\n    dl_success = 0,\n    dl_lib_not_found,     // char const * lib, dlerr_t err\n    dl_sym_not_found,     // char const * sym, dlerr_t err\n                          // Note: dlerr_t depends on OS: it is char const * on Linux* and OS X*, int on Windows*.\n    dl_sys_fail,          // char const * func, int err\n    dl_buff_too_small     // none\n}; // dynamic_link_error_t\n\nCLOSE_INTERNAL_NAMESPACE\n\n#endif /* __TBB_dynamic_link */\n"
  },
  {
    "path": "benchmarks/tbb/enumerable_thread_specific.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_enumerable_thread_specific_H\n#define __TBB_enumerable_thread_specific_H\n\n#include \"concurrent_vector.h\"\n#include \"tbb_thread.h\"\n#include \"tbb_allocator.h\"\n#include \"tbb_profiling.h\"\n#include \"cache_aligned_allocator.h\"\n#include \"aligned_space.h\"\n#include <string.h>  // for memcpy\n\n#if _WIN32||_WIN64\n#include \"machine/windows_api.h\"\n#else\n#include <pthread.h>\n#endif\n\nnamespace tbb {\n\n//! enum for selecting between single key and key-per-instance versions\nenum ets_key_usage_type { ets_key_per_instance, ets_no_key };\n\nnamespace interface6 {\n\n    //! @cond\n    namespace internal {\n\n        using namespace tbb::internal;\n\n        template<ets_key_usage_type ETS_key_type>\n        class ets_base: tbb::internal::no_copy {\n        protected:\n#if _WIN32||_WIN64\n            typedef DWORD key_type;\n#else\n            typedef pthread_t key_type;\n#endif\n#if __TBB_PROTECTED_NESTED_CLASS_BROKEN\n        public:\n#endif\n            struct slot;\n\n            struct array {\n                array* next;\n                size_t lg_size;\n                slot& at( size_t k ) {\n                    return ((slot*)(void*)(this+1))[k];\n                }\n                size_t size() const {return (size_t)1<<lg_size;}\n                size_t mask() const {return size()-1;}\n                size_t start( size_t h ) const {\n                    return h>>(8*sizeof(size_t)-lg_size);\n                }\n            };\n            struct slot {\n                key_type key;\n                void* ptr;\n                bool empty() const {return !key;}\n                bool match( key_type k ) const {return key==k;}\n                bool claim( key_type k ) {\n                    __TBB_ASSERT(sizeof(tbb::atomic<key_type>)==sizeof(key_type), NULL);\n                    return tbb::internal::punned_cast<tbb::atomic<key_type>*>(&key)->compare_and_swap(k,0)==0;\n                }\n            };\n#if __TBB_PROTECTED_NESTED_CLASS_BROKEN\n        protected:\n#endif\n\n            static key_type key_of_current_thread() {\n               tbb::tbb_thread::id id = tbb::this_tbb_thread::get_id();\n               key_type k;\n               memcpy( &k, &id, sizeof(k) );\n               return k;\n            }\n\n            //! Root of linked list of arrays of decreasing size.\n            /** NULL if and only if my_count==0.\n                Each array in the list is half the size of its predecessor. */\n            atomic<array*> my_root;\n            atomic<size_t> my_count;\n            virtual void* create_local() = 0;\n            virtual void* create_array(size_t _size) = 0;  // _size in bytes\n            virtual void free_array(void* ptr, size_t _size) = 0; // _size in bytes\n            array* allocate( size_t lg_size ) {\n                size_t n = 1<<lg_size;\n                array* a = static_cast<array*>(create_array( sizeof(array)+n*sizeof(slot) ));\n                a->lg_size = lg_size;\n                std::memset( a+1, 0, n*sizeof(slot) );\n                return a;\n            }\n            void free(array* a) {\n                size_t n = 1<<(a->lg_size);\n                free_array( (void *)a, size_t(sizeof(array)+n*sizeof(slot)) );\n            }\n            static size_t hash( key_type k ) {\n                // Multiplicative hashing.  Client should use *upper* bits.\n                // casts required for Mac gcc4.* compiler\n                return uintptr_t(k)*tbb::internal::select_size_t_constant<0x9E3779B9,0x9E3779B97F4A7C15ULL>::value;\n            }\n\n            ets_base() {my_root=NULL; my_count=0;}\n            virtual ~ets_base();  // g++ complains if this is not virtual...\n            void* table_lookup( bool& exists );\n            void table_clear();\n            // table_find is used in copying ETS, so is not used in concurrent context.  So\n            // we don't need itt annotations for it.\n            slot& table_find( key_type k ) {\n                size_t h = hash(k);\n                array* r = my_root;\n                size_t mask = r->mask();\n                for(size_t i = r->start(h);;i=(i+1)&mask) {\n                    slot& s = r->at(i);\n                    if( s.empty() || s.match(k) )\n                        return s;\n                }\n            }\n            void table_reserve_for_copy( const ets_base& other ) {\n                __TBB_ASSERT(!my_root,NULL);\n                __TBB_ASSERT(!my_count,NULL);\n                if( other.my_root ) {\n                    array* a = allocate(other.my_root->lg_size);\n                    a->next = NULL;\n                    my_root = a;\n                    my_count = other.my_count;\n                }\n            }\n        };\n\n        template<ets_key_usage_type ETS_key_type>\n        ets_base<ETS_key_type>::~ets_base() {\n            __TBB_ASSERT(!my_root, NULL);\n        }\n\n        template<ets_key_usage_type ETS_key_type>\n        void ets_base<ETS_key_type>::table_clear() {\n            while( array* r = my_root ) {\n                my_root = r->next;\n                free(r);\n            }\n            my_count = 0;\n        }\n\n        template<ets_key_usage_type ETS_key_type>\n        void* ets_base<ETS_key_type>::table_lookup( bool& exists ) {\n            const key_type k = key_of_current_thread();\n\n            __TBB_ASSERT(k!=0,NULL);\n            void* found;\n            size_t h = hash(k);\n            for( array* r=my_root; r; r=r->next ) {\n                call_itt_notify(acquired,r);\n                size_t mask=r->mask();\n                for(size_t i = r->start(h); ;i=(i+1)&mask) {\n                    slot& s = r->at(i);\n                    if( s.empty() ) break;\n                    if( s.match(k) ) {\n                        if( r==my_root ) {\n                            // Success at top level\n                            exists = true;\n                            return s.ptr;\n                        } else {\n                            // Success at some other level.  Need to insert at top level.\n                            exists = true;\n                            found = s.ptr;\n                            goto insert;\n                        }\n                    }\n                }\n            }\n            // Key does not yet exist.  The density of slots in the table does not exceed 0.5,\n            // for if this will occur a new table is allocated with double the current table\n            // size, which is swapped in as the new root table.  So an empty slot is guaranteed.\n            exists = false;\n            found = create_local();\n            {\n                size_t c = ++my_count;\n                array* r = my_root;\n                call_itt_notify(acquired,r);\n                if( !r || c>r->size()/2 ) {\n                    size_t s = r ? r->lg_size : 2;\n                    while( c>size_t(1)<<(s-1) ) ++s;\n                    array* a = allocate(s);\n                    for(;;) {\n                        a->next = r;\n                        call_itt_notify(releasing,a);\n                        array* new_r = my_root.compare_and_swap(a,r);\n                        if( new_r==r ) break;\n                        call_itt_notify(acquired, new_r);\n                        if( new_r->lg_size>=s ) {\n                            // Another thread inserted an equal or  bigger array, so our array is superfluous.\n                            free(a);\n                            break;\n                        }\n                        r = new_r;\n                    }\n                }\n            }\n        insert:\n        // Whether a slot has been found in an older table, or if it has been inserted at this level,\n        // it has already been accounted for in the total.  Guaranteed to be room for it, and it is\n        // not present, so search for empty slot and use it.\n            array* ir = my_root;\n            call_itt_notify(acquired, ir);\n            size_t mask = ir->mask();\n            for(size_t i = ir->start(h);;i=(i+1)&mask) {\n                slot& s = ir->at(i);\n                if( s.empty() ) {\n                    if( s.claim(k) ) {\n                        s.ptr = found;\n                        return found;\n                    }\n                }\n            }\n        }\n\n        //! Specialization that exploits native TLS\n        template <>\n        class ets_base<ets_key_per_instance>: protected ets_base<ets_no_key> {\n            typedef ets_base<ets_no_key> super;\n#if _WIN32||_WIN64\n#if __TBB_WIN8UI_SUPPORT\n            typedef DWORD tls_key_t;\n            void create_key() { my_key = FlsAlloc(NULL); }\n            void destroy_key() { FlsFree(my_key); }\n            void set_tls(void * value) { FlsSetValue(my_key, (LPVOID)value); }\n            void* get_tls() { return (void *)FlsGetValue(my_key); }\n#else\n            typedef DWORD tls_key_t;\n            void create_key() { my_key = TlsAlloc(); }\n            void destroy_key() { TlsFree(my_key); }\n            void set_tls(void * value) { TlsSetValue(my_key, (LPVOID)value); }\n            void* get_tls() { return (void *)TlsGetValue(my_key); }\n#endif\n#else\n            typedef pthread_key_t tls_key_t;\n            void create_key() { pthread_key_create(&my_key, NULL); }\n            void destroy_key() { pthread_key_delete(my_key); }\n            void set_tls( void * value ) const { pthread_setspecific(my_key, value); }\n            void* get_tls() const { return pthread_getspecific(my_key); }\n#endif\n            tls_key_t my_key;\n            virtual void* create_local() = 0;\n            virtual void* create_array(size_t _size) = 0;  // _size in bytes\n            virtual void free_array(void* ptr, size_t _size) = 0; // size in bytes\n        public:\n            ets_base() {create_key();}\n            ~ets_base() {destroy_key();}\n            void* table_lookup( bool& exists ) {\n                void* found = get_tls();\n                if( found ) {\n                    exists=true;\n                } else {\n                    found = super::table_lookup(exists);\n                    set_tls(found);\n                }\n                return found;\n            }\n            void table_clear() {\n                destroy_key();\n                create_key();\n                super::table_clear();\n            }\n        };\n\n        //! Random access iterator for traversing the thread local copies.\n        template< typename Container, typename Value >\n        class enumerable_thread_specific_iterator\n#if defined(_WIN64) && defined(_MSC_VER)\n            // Ensure that Microsoft's internal template function _Val_type works correctly.\n            : public std::iterator<std::random_access_iterator_tag,Value>\n#endif /* defined(_WIN64) && defined(_MSC_VER) */\n        {\n            //! current position in the concurrent_vector\n\n            Container *my_container;\n            typename Container::size_type my_index;\n            mutable Value *my_value;\n\n            template<typename C, typename T>\n            friend enumerable_thread_specific_iterator<C,T> operator+( ptrdiff_t offset,\n                                                                       const enumerable_thread_specific_iterator<C,T>& v );\n\n            template<typename C, typename T, typename U>\n            friend bool operator==( const enumerable_thread_specific_iterator<C,T>& i,\n                                    const enumerable_thread_specific_iterator<C,U>& j );\n\n            template<typename C, typename T, typename U>\n            friend bool operator<( const enumerable_thread_specific_iterator<C,T>& i,\n                                   const enumerable_thread_specific_iterator<C,U>& j );\n\n            template<typename C, typename T, typename U>\n            friend ptrdiff_t operator-( const enumerable_thread_specific_iterator<C,T>& i, const enumerable_thread_specific_iterator<C,U>& j );\n\n            template<typename C, typename U>\n            friend class enumerable_thread_specific_iterator;\n\n            public:\n\n            enumerable_thread_specific_iterator( const Container &container, typename Container::size_type index ) :\n                my_container(&const_cast<Container &>(container)), my_index(index), my_value(NULL) {}\n\n            //! Default constructor\n            enumerable_thread_specific_iterator() : my_container(NULL), my_index(0), my_value(NULL) {}\n\n            template<typename U>\n            enumerable_thread_specific_iterator( const enumerable_thread_specific_iterator<Container, U>& other ) :\n                    my_container( other.my_container ), my_index( other.my_index), my_value( const_cast<Value *>(other.my_value) ) {}\n\n            enumerable_thread_specific_iterator operator+( ptrdiff_t offset ) const {\n                return enumerable_thread_specific_iterator(*my_container, my_index + offset);\n            }\n\n            enumerable_thread_specific_iterator &operator+=( ptrdiff_t offset ) {\n                my_index += offset;\n                my_value = NULL;\n                return *this;\n            }\n\n            enumerable_thread_specific_iterator operator-( ptrdiff_t offset ) const {\n                return enumerable_thread_specific_iterator( *my_container, my_index-offset );\n            }\n\n            enumerable_thread_specific_iterator &operator-=( ptrdiff_t offset ) {\n                my_index -= offset;\n                my_value = NULL;\n                return *this;\n            }\n\n            Value& operator*() const {\n                Value* value = my_value;\n                if( !value ) {\n                    value = my_value = reinterpret_cast<Value *>(&(*my_container)[my_index].value);\n                }\n                __TBB_ASSERT( value==reinterpret_cast<Value *>(&(*my_container)[my_index].value), \"corrupt cache\" );\n                return *value;\n            }\n\n            Value& operator[]( ptrdiff_t k ) const {\n               return (*my_container)[my_index + k].value;\n            }\n\n            Value* operator->() const {return &operator*();}\n\n            enumerable_thread_specific_iterator& operator++() {\n                ++my_index;\n                my_value = NULL;\n                return *this;\n            }\n\n            enumerable_thread_specific_iterator& operator--() {\n                --my_index;\n                my_value = NULL;\n                return *this;\n            }\n\n            //! Post increment\n            enumerable_thread_specific_iterator operator++(int) {\n                enumerable_thread_specific_iterator result = *this;\n                ++my_index;\n                my_value = NULL;\n                return result;\n            }\n\n            //! Post decrement\n            enumerable_thread_specific_iterator operator--(int) {\n                enumerable_thread_specific_iterator result = *this;\n                --my_index;\n                my_value = NULL;\n                return result;\n            }\n\n            // STL support\n            typedef ptrdiff_t difference_type;\n            typedef Value value_type;\n            typedef Value* pointer;\n            typedef Value& reference;\n            typedef std::random_access_iterator_tag iterator_category;\n        };\n\n        template<typename Container, typename T>\n        enumerable_thread_specific_iterator<Container,T> operator+( ptrdiff_t offset,\n                                                                    const enumerable_thread_specific_iterator<Container,T>& v ) {\n            return enumerable_thread_specific_iterator<Container,T>( v.my_container, v.my_index + offset );\n        }\n\n        template<typename Container, typename T, typename U>\n        bool operator==( const enumerable_thread_specific_iterator<Container,T>& i,\n                         const enumerable_thread_specific_iterator<Container,U>& j ) {\n            return i.my_index==j.my_index && i.my_container == j.my_container;\n        }\n\n        template<typename Container, typename T, typename U>\n        bool operator!=( const enumerable_thread_specific_iterator<Container,T>& i,\n                         const enumerable_thread_specific_iterator<Container,U>& j ) {\n            return !(i==j);\n        }\n\n        template<typename Container, typename T, typename U>\n        bool operator<( const enumerable_thread_specific_iterator<Container,T>& i,\n                        const enumerable_thread_specific_iterator<Container,U>& j ) {\n            return i.my_index<j.my_index;\n        }\n\n        template<typename Container, typename T, typename U>\n        bool operator>( const enumerable_thread_specific_iterator<Container,T>& i,\n                        const enumerable_thread_specific_iterator<Container,U>& j ) {\n            return j<i;\n        }\n\n        template<typename Container, typename T, typename U>\n        bool operator>=( const enumerable_thread_specific_iterator<Container,T>& i,\n                         const enumerable_thread_specific_iterator<Container,U>& j ) {\n            return !(i<j);\n        }\n\n        template<typename Container, typename T, typename U>\n        bool operator<=( const enumerable_thread_specific_iterator<Container,T>& i,\n                         const enumerable_thread_specific_iterator<Container,U>& j ) {\n            return !(j<i);\n        }\n\n        template<typename Container, typename T, typename U>\n        ptrdiff_t operator-( const enumerable_thread_specific_iterator<Container,T>& i,\n                             const enumerable_thread_specific_iterator<Container,U>& j ) {\n            return i.my_index-j.my_index;\n        }\n\n    template<typename SegmentedContainer, typename Value >\n        class segmented_iterator\n#if defined(_WIN64) && defined(_MSC_VER)\n        : public std::iterator<std::input_iterator_tag, Value>\n#endif\n        {\n            template<typename C, typename T, typename U>\n            friend bool operator==(const segmented_iterator<C,T>& i, const segmented_iterator<C,U>& j);\n\n            template<typename C, typename T, typename U>\n            friend bool operator!=(const segmented_iterator<C,T>& i, const segmented_iterator<C,U>& j);\n\n            template<typename C, typename U>\n            friend class segmented_iterator;\n\n            public:\n\n                segmented_iterator() {my_segcont = NULL;}\n\n                segmented_iterator( const SegmentedContainer& _segmented_container ) :\n                    my_segcont(const_cast<SegmentedContainer*>(&_segmented_container)),\n                    outer_iter(my_segcont->end()) { }\n\n                ~segmented_iterator() {}\n\n                typedef typename SegmentedContainer::iterator outer_iterator;\n                typedef typename SegmentedContainer::value_type InnerContainer;\n                typedef typename InnerContainer::iterator inner_iterator;\n\n                // STL support\n                typedef ptrdiff_t difference_type;\n                typedef Value value_type;\n                typedef typename SegmentedContainer::size_type size_type;\n                typedef Value* pointer;\n                typedef Value& reference;\n                typedef std::input_iterator_tag iterator_category;\n\n                // Copy Constructor\n                template<typename U>\n                segmented_iterator(const segmented_iterator<SegmentedContainer, U>& other) :\n                    my_segcont(other.my_segcont),\n                    outer_iter(other.outer_iter),\n                    // can we assign a default-constructed iterator to inner if we're at the end?\n                    inner_iter(other.inner_iter)\n                {}\n\n                // assignment\n                template<typename U>\n                segmented_iterator& operator=( const segmented_iterator<SegmentedContainer, U>& other) {\n                    if(this != &other) {\n                        my_segcont = other.my_segcont;\n                        outer_iter = other.outer_iter;\n                        if(outer_iter != my_segcont->end()) inner_iter = other.inner_iter;\n                    }\n                    return *this;\n                }\n\n                // allow assignment of outer iterator to segmented iterator.  Once it is\n                // assigned, move forward until a non-empty inner container is found or\n                // the end of the outer container is reached.\n                segmented_iterator& operator=(const outer_iterator& new_outer_iter) {\n                    __TBB_ASSERT(my_segcont != NULL, NULL);\n                    // check that this iterator points to something inside the segmented container\n                    for(outer_iter = new_outer_iter ;outer_iter!=my_segcont->end(); ++outer_iter) {\n                        if( !outer_iter->empty() ) {\n                            inner_iter = outer_iter->begin();\n                            break;\n                        }\n                    }\n                    return *this;\n                }\n\n                // pre-increment\n                segmented_iterator& operator++() {\n                    advance_me();\n                    return *this;\n                }\n\n                // post-increment\n                segmented_iterator operator++(int) {\n                    segmented_iterator tmp = *this;\n                    operator++();\n                    return tmp;\n                }\n\n                bool operator==(const outer_iterator& other_outer) const {\n                    __TBB_ASSERT(my_segcont != NULL, NULL);\n                    return (outer_iter == other_outer &&\n                            (outer_iter == my_segcont->end() || inner_iter == outer_iter->begin()));\n                }\n\n                bool operator!=(const outer_iterator& other_outer) const {\n                    return !operator==(other_outer);\n\n                }\n\n                // (i)* RHS\n                reference operator*() const {\n                    __TBB_ASSERT(my_segcont != NULL, NULL);\n                    __TBB_ASSERT(outer_iter != my_segcont->end(), \"Dereferencing a pointer at end of container\");\n                    __TBB_ASSERT(inner_iter != outer_iter->end(), NULL); // should never happen\n                    return *inner_iter;\n                }\n\n                // i->\n                pointer operator->() const { return &operator*();}\n\n            private:\n                SegmentedContainer*             my_segcont;\n                outer_iterator outer_iter;\n                inner_iterator inner_iter;\n\n                void advance_me() {\n                    __TBB_ASSERT(my_segcont != NULL, NULL);\n                    __TBB_ASSERT(outer_iter != my_segcont->end(), NULL); // not true if there are no inner containers\n                    __TBB_ASSERT(inner_iter != outer_iter->end(), NULL); // not true if the inner containers are all empty.\n                    ++inner_iter;\n                    while(inner_iter == outer_iter->end() && ++outer_iter != my_segcont->end()) {\n                        inner_iter = outer_iter->begin();\n                    }\n                }\n        };    // segmented_iterator\n\n        template<typename SegmentedContainer, typename T, typename U>\n        bool operator==( const segmented_iterator<SegmentedContainer,T>& i,\n                         const segmented_iterator<SegmentedContainer,U>& j ) {\n            if(i.my_segcont != j.my_segcont) return false;\n            if(i.my_segcont == NULL) return true;\n            if(i.outer_iter != j.outer_iter) return false;\n            if(i.outer_iter == i.my_segcont->end()) return true;\n            return i.inner_iter == j.inner_iter;\n        }\n\n        // !=\n        template<typename SegmentedContainer, typename T, typename U>\n        bool operator!=( const segmented_iterator<SegmentedContainer,T>& i,\n                         const segmented_iterator<SegmentedContainer,U>& j ) {\n            return !(i==j);\n        }\n\n        template<typename T>\n        struct destruct_only: tbb::internal::no_copy {\n            tbb::aligned_space<T> value;\n            ~destruct_only() {value.begin()[0].~T();}\n        };\n\n        template<typename T>\n        struct construct_by_default: tbb::internal::no_assign {\n            void construct(void*where) {new(where) T();} // C++ note: the () in T() ensure zero initialization.\n            construct_by_default( int ) {}\n        };\n\n        template<typename T>\n        struct construct_by_exemplar: tbb::internal::no_assign {\n            const T exemplar;\n            void construct(void*where) {new(where) T(exemplar);}\n            construct_by_exemplar( const T& t ) : exemplar(t) {}\n        };\n\n        template<typename T, typename Finit>\n        struct construct_by_finit: tbb::internal::no_assign {\n            Finit f;\n            void construct(void* where) {new(where) T(f());}\n            construct_by_finit( const Finit& f_ ) : f(f_) {}\n        };\n\n        // storage for initialization function pointer\n        template<typename T>\n        class callback_base {\n        public:\n            // Clone *this\n            virtual callback_base* clone() = 0;\n            // Destruct and free *this\n            virtual void destroy() = 0;\n            // Need virtual destructor to satisfy GCC compiler warning\n            virtual ~callback_base() { }\n            // Construct T at where\n            virtual void construct(void* where) = 0;\n        };\n\n        template <typename T, typename Constructor>\n        class callback_leaf: public callback_base<T>, Constructor {\n            template<typename X> callback_leaf( const X& x ) : Constructor(x) {}\n\n            typedef typename tbb::tbb_allocator<callback_leaf> my_allocator_type;\n\n            /*override*/ callback_base<T>* clone() {\n                void* where = my_allocator_type().allocate(1);\n                return new(where) callback_leaf(*this);\n            }\n\n            /*override*/ void destroy() {\n                my_allocator_type().destroy(this);\n                my_allocator_type().deallocate(this,1);\n            }\n\n            /*override*/ void construct(void* where) {\n                Constructor::construct(where);\n            }\n        public:\n            template<typename X>\n            static callback_base<T>* make( const X& x ) {\n                void* where = my_allocator_type().allocate(1);\n                return new(where) callback_leaf(x);\n            }\n        };\n\n        //! Template for adding padding in order to avoid false sharing\n        /** ModularSize should be sizeof(U) modulo the cache line size.\n            All maintenance of the space will be done explicitly on push_back,\n            and all thread local copies must be destroyed before the concurrent\n            vector is deleted.\n        */\n        template<typename U, size_t ModularSize>\n        struct ets_element {\n            ets_element() { /* avoid cl warning C4345 about default initialization of POD types */ }\n            char value[ModularSize==0 ? sizeof(U) : sizeof(U)+(tbb::internal::NFS_MaxLineSize-ModularSize)];\n            void unconstruct() {\n                tbb::internal::punned_cast<U*>(&value)->~U();\n            }\n        };\n\n    } // namespace internal\n    //! @endcond\n\n    //! The enumerable_thread_specific container\n    /** enumerable_thread_specific has the following properties:\n        - thread-local copies are lazily created, with default, exemplar or function initialization.\n        - thread-local copies do not move (during lifetime, and excepting clear()) so the address of a copy is invariant.\n        - the contained objects need not have operator=() defined if combine is not used.\n        - enumerable_thread_specific containers may be copy-constructed or assigned.\n        - thread-local copies can be managed by hash-table, or can be accessed via TLS storage for speed.\n        - outside of parallel contexts, the contents of all thread-local copies are accessible by iterator or using combine or combine_each methods\n\n    @par Segmented iterator\n        When the thread-local objects are containers with input_iterators defined, a segmented iterator may\n        be used to iterate over all the elements of all thread-local copies.\n\n    @par combine and combine_each\n        - Both methods are defined for enumerable_thread_specific.\n        - combine() requires the the type T have operator=() defined.\n        - neither method modifies the contents of the object (though there is no guarantee that the applied methods do not modify the object.)\n        - Both are evaluated in serial context (the methods are assumed to be non-benign.)\n\n    @ingroup containers */\n    template <typename T,\n              typename Allocator=cache_aligned_allocator<T>,\n              ets_key_usage_type ETS_key_type=ets_no_key >\n    class enumerable_thread_specific: internal::ets_base<ETS_key_type> {\n\n        template<typename U, typename A, ets_key_usage_type C> friend class enumerable_thread_specific;\n\n        typedef internal::ets_element<T,sizeof(T)%tbb::internal::NFS_MaxLineSize> padded_element;\n\n        //! A generic range, used to create range objects from the iterators\n        template<typename I>\n        class generic_range_type: public blocked_range<I> {\n        public:\n            typedef T value_type;\n            typedef T& reference;\n            typedef const T& const_reference;\n            typedef I iterator;\n            typedef ptrdiff_t difference_type;\n            generic_range_type( I begin_, I end_, size_t grainsize_ = 1) : blocked_range<I>(begin_,end_,grainsize_) {}\n            template<typename U>\n            generic_range_type( const generic_range_type<U>& r) : blocked_range<I>(r.begin(),r.end(),r.grainsize()) {}\n            generic_range_type( generic_range_type& r, split ) : blocked_range<I>(r,split()) {}\n        };\n\n        typedef typename Allocator::template rebind< padded_element >::other padded_allocator_type;\n        typedef tbb::concurrent_vector< padded_element, padded_allocator_type > internal_collection_type;\n\n        internal::callback_base<T> *my_construct_callback;\n\n        internal_collection_type my_locals;\n\n        /*override*/ void* create_local() {\n            void* lref = &*my_locals.grow_by(1);\n            my_construct_callback->construct(lref);\n            return lref;\n        }\n\n        void unconstruct_locals() {\n            for(typename internal_collection_type::iterator cvi = my_locals.begin(); cvi != my_locals.end(); ++cvi) {\n                cvi->unconstruct();\n            }\n        }\n\n        typedef typename Allocator::template rebind< uintptr_t >::other array_allocator_type;\n\n        // _size is in bytes\n        /*override*/ void* create_array(size_t _size) {\n            size_t nelements = (_size + sizeof(uintptr_t) -1) / sizeof(uintptr_t);\n            return array_allocator_type().allocate(nelements);\n        }\n\n        /*override*/ void free_array( void* _ptr, size_t _size) {\n            size_t nelements = (_size + sizeof(uintptr_t) -1) / sizeof(uintptr_t);\n            array_allocator_type().deallocate( reinterpret_cast<uintptr_t *>(_ptr),nelements);\n        }\n\n    public:\n\n        //! Basic types\n        typedef Allocator allocator_type;\n        typedef T value_type;\n        typedef T& reference;\n        typedef const T& const_reference;\n        typedef T* pointer;\n        typedef const T* const_pointer;\n        typedef typename internal_collection_type::size_type size_type;\n        typedef typename internal_collection_type::difference_type difference_type;\n\n        // Iterator types\n        typedef typename internal::enumerable_thread_specific_iterator< internal_collection_type, value_type > iterator;\n        typedef typename internal::enumerable_thread_specific_iterator< internal_collection_type, const value_type > const_iterator;\n\n        // Parallel range types\n        typedef generic_range_type< iterator > range_type;\n        typedef generic_range_type< const_iterator > const_range_type;\n\n        //! Default constructor.  Each local instance of T is default constructed.\n        enumerable_thread_specific() :\n            my_construct_callback( internal::callback_leaf<T,internal::construct_by_default<T> >::make(/*dummy argument*/0) )\n        {}\n\n        //! Constructor with initializer functor.  Each local instance of T is constructed by T(finit()).\n        template <typename Finit>\n        enumerable_thread_specific( Finit finit ) :\n            my_construct_callback( internal::callback_leaf<T,internal::construct_by_finit<T,Finit> >::make( finit ) )\n        {}\n\n        //! Constructor with exemplar.  Each local instance of T is copied-constructed from the exemplar.\n        enumerable_thread_specific(const T& exemplar) :\n            my_construct_callback( internal::callback_leaf<T,internal::construct_by_exemplar<T> >::make( exemplar ) )\n        {}\n\n        //! Destructor\n        ~enumerable_thread_specific() {\n            my_construct_callback->destroy();\n            this->clear();  // deallocation before the derived class is finished destructing\n            // So free(array *) is still accessible\n        }\n\n        //! returns reference to local, discarding exists\n        reference local() {\n            bool exists;\n            return local(exists);\n        }\n\n        //! Returns reference to calling thread's local copy, creating one if necessary\n        reference local(bool& exists)  {\n            void* ptr = this->table_lookup(exists);\n            return *(T*)ptr;\n        }\n\n        //! Get the number of local copies\n        size_type size() const { return my_locals.size(); }\n\n        //! true if there have been no local copies created\n        bool empty() const { return my_locals.empty(); }\n\n        //! begin iterator\n        iterator begin() { return iterator( my_locals, 0 ); }\n        //! end iterator\n        iterator end() { return iterator(my_locals, my_locals.size() ); }\n\n        //! begin const iterator\n        const_iterator begin() const { return const_iterator(my_locals, 0); }\n\n        //! end const iterator\n        const_iterator end() const { return const_iterator(my_locals, my_locals.size()); }\n\n        //! Get range for parallel algorithms\n        range_type range( size_t grainsize=1 ) { return range_type( begin(), end(), grainsize ); }\n\n        //! Get const range for parallel algorithms\n        const_range_type range( size_t grainsize=1 ) const { return const_range_type( begin(), end(), grainsize ); }\n\n        //! Destroys local copies\n        void clear() {\n            unconstruct_locals();\n            my_locals.clear();\n            this->table_clear();\n            // callback is not destroyed\n            // exemplar is not destroyed\n        }\n\n    private:\n\n        template<typename U, typename A2, ets_key_usage_type C2>\n        void internal_copy( const enumerable_thread_specific<U, A2, C2>& other);\n\n    public:\n\n        template<typename U, typename Alloc, ets_key_usage_type Cachetype>\n        enumerable_thread_specific( const enumerable_thread_specific<U, Alloc, Cachetype>& other ) : internal::ets_base<ETS_key_type> ()\n        {\n            internal_copy(other);\n        }\n\n        enumerable_thread_specific( const enumerable_thread_specific& other ) : internal::ets_base<ETS_key_type> ()\n        {\n            internal_copy(other);\n        }\n\n    private:\n\n        template<typename U, typename A2, ets_key_usage_type C2>\n        enumerable_thread_specific &\n        internal_assign(const enumerable_thread_specific<U, A2, C2>& other) {\n            if(static_cast<void *>( this ) != static_cast<const void *>( &other )) {\n                this->clear();\n                my_construct_callback->destroy();\n                my_construct_callback = 0;\n                internal_copy( other );\n            }\n            return *this;\n        }\n\n    public:\n\n        // assignment\n        enumerable_thread_specific& operator=(const enumerable_thread_specific& other) {\n            return internal_assign(other);\n        }\n\n        template<typename U, typename Alloc, ets_key_usage_type Cachetype>\n        enumerable_thread_specific& operator=(const enumerable_thread_specific<U, Alloc, Cachetype>& other)\n        {\n            return internal_assign(other);\n        }\n\n        // combine_func_t has signature T(T,T) or T(const T&, const T&)\n        template <typename combine_func_t>\n        T combine(combine_func_t f_combine) {\n            if(begin() == end()) {\n                internal::destruct_only<T> location;\n                my_construct_callback->construct(location.value.begin());\n                return *location.value.begin();\n            }\n            const_iterator ci = begin();\n            T my_result = *ci;\n            while(++ci != end())\n                my_result = f_combine( my_result, *ci );\n            return my_result;\n        }\n\n        // combine_func_t has signature void(T) or void(const T&)\n        template <typename combine_func_t>\n        void combine_each(combine_func_t f_combine) {\n            for(const_iterator ci = begin(); ci != end(); ++ci) {\n                f_combine( *ci );\n            }\n        }\n\n    }; // enumerable_thread_specific\n\n    template <typename T, typename Allocator, ets_key_usage_type ETS_key_type>\n    template<typename U, typename A2, ets_key_usage_type C2>\n    void enumerable_thread_specific<T,Allocator,ETS_key_type>::internal_copy( const enumerable_thread_specific<U, A2, C2>& other) {\n        // Initialize my_construct_callback first, so that it is valid even if rest of this routine throws an exception.\n        my_construct_callback = other.my_construct_callback->clone();\n\n        typedef internal::ets_base<ets_no_key> base;\n        __TBB_ASSERT(my_locals.size()==0,NULL);\n        this->table_reserve_for_copy( other );\n        for( base::array* r=other.my_root; r; r=r->next ) {\n            for( size_t i=0; i<r->size(); ++i ) {\n                base::slot& s1 = r->at(i);\n                if( !s1.empty() ) {\n                    base::slot& s2 = this->table_find(s1.key);\n                    if( s2.empty() ) {\n                        void* lref = &*my_locals.grow_by(1);\n                        s2.ptr = new(lref) T(*(U*)s1.ptr);\n                        s2.key = s1.key;\n                    } else {\n                        // Skip the duplicate\n                    }\n                }\n            }\n        }\n    }\n\n    template< typename Container >\n    class flattened2d {\n\n        // This intermediate typedef is to address issues with VC7.1 compilers\n        typedef typename Container::value_type conval_type;\n\n    public:\n\n        //! Basic types\n        typedef typename conval_type::size_type size_type;\n        typedef typename conval_type::difference_type difference_type;\n        typedef typename conval_type::allocator_type allocator_type;\n        typedef typename conval_type::value_type value_type;\n        typedef typename conval_type::reference reference;\n        typedef typename conval_type::const_reference const_reference;\n        typedef typename conval_type::pointer pointer;\n        typedef typename conval_type::const_pointer const_pointer;\n\n        typedef typename internal::segmented_iterator<Container, value_type> iterator;\n        typedef typename internal::segmented_iterator<Container, const value_type> const_iterator;\n\n        flattened2d( const Container &c, typename Container::const_iterator b, typename Container::const_iterator e ) :\n            my_container(const_cast<Container*>(&c)), my_begin(b), my_end(e) { }\n\n        flattened2d( const Container &c ) :\n            my_container(const_cast<Container*>(&c)), my_begin(c.begin()), my_end(c.end()) { }\n\n        iterator begin() { return iterator(*my_container) = my_begin; }\n        iterator end() { return iterator(*my_container) = my_end; }\n        const_iterator begin() const { return const_iterator(*my_container) = my_begin; }\n        const_iterator end() const { return const_iterator(*my_container) = my_end; }\n\n        size_type size() const {\n            size_type tot_size = 0;\n            for(typename Container::const_iterator i = my_begin; i != my_end; ++i) {\n                tot_size += i->size();\n            }\n            return tot_size;\n        }\n\n    private:\n\n        Container *my_container;\n        typename Container::const_iterator my_begin;\n        typename Container::const_iterator my_end;\n\n    };\n\n    template <typename Container>\n    flattened2d<Container> flatten2d(const Container &c, const typename Container::const_iterator b, const typename Container::const_iterator e) {\n        return flattened2d<Container>(c, b, e);\n    }\n\n    template <typename Container>\n    flattened2d<Container> flatten2d(const Container &c) {\n        return flattened2d<Container>(c);\n    }\n\n} // interface6\n\nnamespace internal {\nusing interface6::internal::segmented_iterator;\n}\n\nusing interface6::enumerable_thread_specific;\nusing interface6::flattened2d;\nusing interface6::flatten2d;\n\n} // namespace tbb\n\n#endif\n"
  },
  {
    "path": "benchmarks/tbb/flow_graph.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_flow_graph_H\n#define __TBB_flow_graph_H\n\n#include \"tbb_stddef.h\"\n#include \"atomic.h\"\n#include \"spin_mutex.h\"\n#include \"null_mutex.h\"\n#include \"spin_rw_mutex.h\"\n#include \"null_rw_mutex.h\"\n#include \"task.h\"\n#include \"cache_aligned_allocator.h\"\n#include \"tbb_exception.h\"\n#include \"internal/_aggregator_impl.h\"\n#include \"tbb_profiling.h\"\n\n#if TBB_DEPRECATED_FLOW_ENQUEUE\n#define FLOW_SPAWN(a) tbb::task::enqueue((a))\n#else\n#define FLOW_SPAWN(a) tbb::task::spawn((a))\n#endif\n\n// use the VC10 or gcc version of tuple if it is available.\n#if __TBB_CPP11_TUPLE_PRESENT\n    #include <tuple>\nnamespace tbb {\n    namespace flow {\n        using std::tuple;\n        using std::tuple_size;\n        using std::tuple_element;\n        using std::get;\n    }\n}\n#else\n    #include \"compat/tuple\"\n#endif\n\n#include<list>\n#include<queue>\n\n/** @file\n  \\brief The graph related classes and functions\n\n  There are some applications that best express dependencies as messages\n  passed between nodes in a graph.  These messages may contain data or\n  simply act as signals that a predecessors has completed. The graph\n  class and its associated node classes can be used to express such\n  applications.\n*/\n\nnamespace tbb {\nnamespace flow {\n\n//! An enumeration the provides the two most common concurrency levels: unlimited and serial\nenum concurrency { unlimited = 0, serial = 1 };\n\nnamespace interface7 {\n\nnamespace internal {\n    template<typename T, typename M> class successor_cache;\n    template<typename T, typename M> class broadcast_cache;\n    template<typename T, typename M> class round_robin_cache;\n}\n\n//! An empty class used for messages that mean \"I'm done\"\nclass continue_msg {};\n\ntemplate< typename T > class sender;\ntemplate< typename T > class receiver;\nclass continue_receiver;\n\n//! Pure virtual template class that defines a sender of messages of type T\ntemplate< typename T >\nclass sender {\npublic:\n    //! The output type of this sender\n    typedef T output_type;\n\n    //! The successor type for this node\n    typedef receiver<T> successor_type;\n\n    virtual ~sender() {}\n\n    //! Add a new successor to this node\n    virtual bool register_successor( successor_type &r ) = 0;\n\n    //! Removes a successor from this node\n    virtual bool remove_successor( successor_type &r ) = 0;\n\n    //! Request an item from the sender\n    virtual bool try_get( T & ) { return false; }\n\n    //! Reserves an item in the sender\n    virtual bool try_reserve( T & ) { return false; }\n\n    //! Releases the reserved item\n    virtual bool try_release( ) { return false; }\n\n    //! Consumes the reserved item\n    virtual bool try_consume( ) { return false; }\n\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n    //! interface to record edges for traversal & deletion\n    virtual void    internal_add_built_successor( successor_type & )    = 0;\n    virtual void    internal_delete_built_successor( successor_type & ) = 0;\n    virtual void    copy_successors( std::vector<successor_type *> &)   = 0;\n    virtual size_t  successor_count()                                   = 0;\n#endif\n};\n\ntemplate< typename T > class limiter_node;  // needed for resetting decrementer\ntemplate< typename R, typename B > class run_and_put_task;\n\nstatic tbb::task * const SUCCESSFULLY_ENQUEUED = (task *)-1;\n\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n// flags to modify the behavior of the graph reset().  Can be combined.\nenum reset_flags {\n    rf_reset_protocol   = 0,\n    rf_reset_bodies     = 1<<0,  // delete the current node body, reset to a copy of the initial node body.\n    rf_extract          = 1<<1   // delete edges (extract() for single node, reset() for graph.)\n};\n\n#define __TBB_PFG_RESET_ARG(exp) exp\n#define __TBB_COMMA ,\n#else\n#define __TBB_PFG_RESET_ARG(exp)  /* nothing */\n#define __TBB_COMMA /* nothing */\n#endif\n\n// enqueue left task if necessary.  Returns the non-enqueued task if there is one.\nstatic inline tbb::task *combine_tasks( tbb::task * left, tbb::task * right) {\n    // if no RHS task, don't change left.\n    if(right == NULL) return left;\n    // right != NULL\n    if(left == NULL) return right;\n    if(left == SUCCESSFULLY_ENQUEUED) return right;\n    // left contains a task\n    if(right != SUCCESSFULLY_ENQUEUED) {\n        // both are valid tasks\n        FLOW_SPAWN(*left);\n        return right;\n    }\n    return left;\n}\n\n//! Pure virtual template class that defines a receiver of messages of type T\ntemplate< typename T >\nclass receiver {\npublic:\n    //! The input type of this receiver\n    typedef T input_type;\n\n    //! The predecessor type for this node\n    typedef sender<T> predecessor_type;\n\n    //! Destructor\n    virtual ~receiver() {}\n\n    //! Put an item to the receiver\n    bool try_put( const T& t ) {\n        task *res = try_put_task(t);\n        if(!res) return false;\n        if (res != SUCCESSFULLY_ENQUEUED) FLOW_SPAWN(*res);\n        return true;\n    }\n\n    //! put item to successor; return task to run the successor if possible.\nprotected:\n    template< typename R, typename B > friend class run_and_put_task;\n    template<typename X, typename Y> friend class internal::broadcast_cache;\n    template<typename X, typename Y> friend class internal::round_robin_cache;\n    virtual task *try_put_task(const T& t) = 0;\npublic:\n\n    //! Add a predecessor to the node\n    virtual bool register_predecessor( predecessor_type & ) { return false; }\n\n    //! Remove a predecessor from the node\n    virtual bool remove_predecessor( predecessor_type & ) { return false; }\n\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n    virtual void   internal_add_built_predecessor( predecessor_type & )    = 0;\n    virtual void   internal_delete_built_predecessor( predecessor_type & ) = 0;\n    virtual void   copy_predecessors( std::vector<predecessor_type *> & )  = 0;\n    virtual size_t predecessor_count()                                     = 0;\n#endif\n\nprotected:\n    //! put receiver back in initial state\n    template<typename U> friend class limiter_node;\n    virtual void reset_receiver(__TBB_PFG_RESET_ARG(reset_flags f = rf_reset_protocol ) ) = 0;\n\n    template<typename TT, typename M>\n        friend class internal::successor_cache;\n    virtual bool is_continue_receiver() { return false; }\n};\n\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n//* holder of edges both for caches and for those nodes which do not have predecessor caches.\n// C == receiver< ... > or sender< ... >, depending.\ntemplate<typename C>\nclass edge_container {\n\npublic:\n    typedef std::vector<C *> edge_vector;\n\n    void add_edge( C &s) {\n        built_edges.push_back( &s );\n    }\n\n    void delete_edge( C &s) {\n        for ( typename edge_vector::iterator i = built_edges.begin(); i != built_edges.end(); ++i ) {\n            if ( *i == &s )  {\n                (void)built_edges.erase(i);\n                return;  // only remove one predecessor per request\n            }\n        }\n    }\n\n    void copy_edges( edge_vector &v) {\n        v = built_edges;\n    }\n\n    size_t edge_count() {\n        return (size_t)(built_edges.size());\n    }\n\n    void clear() {\n        built_edges.clear();\n    }\n\n    template< typename S > void sender_extract( S &s ); \n    template< typename R > void receiver_extract( R &r ); \n    \nprivate: \n    edge_vector built_edges;\n};\n#endif  /* TBB_PREVIEW_FLOW_GRAPH_FEATURES */\n\n//! Base class for receivers of completion messages\n/** These receivers automatically reset, but cannot be explicitly waited on */\nclass continue_receiver : public receiver< continue_msg > {\npublic:\n\n    //! The input type\n    typedef continue_msg input_type;\n\n    //! The predecessor type for this node\n    typedef sender< continue_msg > predecessor_type;\n\n    //! Constructor\n    continue_receiver( int number_of_predecessors = 0 ) {\n        my_predecessor_count = my_initial_predecessor_count = number_of_predecessors;\n        my_current_count = 0;\n    }\n\n    //! Copy constructor\n    continue_receiver( const continue_receiver& src ) : receiver<continue_msg>() {\n        my_predecessor_count = my_initial_predecessor_count = src.my_initial_predecessor_count;\n        my_current_count = 0;\n    }\n\n    //! Destructor\n    virtual ~continue_receiver() { }\n\n    //! Increments the trigger threshold\n    /* override */ bool register_predecessor( predecessor_type & ) {\n        spin_mutex::scoped_lock l(my_mutex);\n        ++my_predecessor_count;\n        return true;\n    }\n\n    //! Decrements the trigger threshold\n    /** Does not check to see if the removal of the predecessor now makes the current count\n        exceed the new threshold.  So removing a predecessor while the graph is active can cause\n        unexpected results. */\n    /* override */ bool remove_predecessor( predecessor_type & ) {\n        spin_mutex::scoped_lock l(my_mutex);\n        --my_predecessor_count;\n        return true;\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n    typedef std::vector<predecessor_type *> predecessor_vector_type;\n\n    /*override*/ void internal_add_built_predecessor( predecessor_type &s) {\n        spin_mutex::scoped_lock l(my_mutex);\n        my_built_predecessors.add_edge( s );\n    }\n\n    /*override*/ void internal_delete_built_predecessor( predecessor_type &s) {\n        spin_mutex::scoped_lock l(my_mutex);\n        my_built_predecessors.delete_edge(s);\n    }\n\n    /*override*/ void copy_predecessors( predecessor_vector_type &v) {\n        spin_mutex::scoped_lock l(my_mutex);\n        my_built_predecessors.copy_edges(v);\n    }\n\n    /*override*/ size_t predecessor_count() {\n        spin_mutex::scoped_lock l(my_mutex);\n        return my_built_predecessors.edge_count();\n    }\n#endif  /* TBB_PREVIEW_FLOW_GRAPH_FEATURES */\n    \nprotected:\n    template< typename R, typename B > friend class run_and_put_task;\n    template<typename X, typename Y> friend class internal::broadcast_cache;\n    template<typename X, typename Y> friend class internal::round_robin_cache;\n    // execute body is supposed to be too small to create a task for.\n    /* override */ task *try_put_task( const input_type & ) {\n        {\n            spin_mutex::scoped_lock l(my_mutex);\n            if ( ++my_current_count < my_predecessor_count )\n                return SUCCESSFULLY_ENQUEUED;\n            else\n                my_current_count = 0;\n        }\n        task * res = execute();\n        if(!res) return SUCCESSFULLY_ENQUEUED;\n        return res;\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n    edge_container<predecessor_type> my_built_predecessors;\n#endif\n    spin_mutex my_mutex;\n    int my_predecessor_count;\n    int my_current_count;\n    int my_initial_predecessor_count;\n    // the friend declaration in the base class did not eliminate the \"protected class\"\n    // error in gcc 4.1.2\n    template<typename U> friend class limiter_node;\n    /*override*/void reset_receiver( __TBB_PFG_RESET_ARG(reset_flags f) )\n    {\n        my_current_count = 0;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        if(f & rf_extract) {\n            my_built_predecessors.receiver_extract(*this);\n            my_predecessor_count = my_initial_predecessor_count;\n        }\n#endif\n    }\n\n    //! Does whatever should happen when the threshold is reached\n    /** This should be very fast or else spawn a task.  This is\n        called while the sender is blocked in the try_put(). */\n    virtual task * execute() = 0;\n    template<typename TT, typename M>\n        friend class internal::successor_cache;\n    /*override*/ bool is_continue_receiver() { return true; }\n};\n}  // interface7\n}  // flow\n}  // tbb\n\n#include \"internal/_flow_graph_trace_impl.h\"\n\nnamespace tbb {\nnamespace flow {\nnamespace interface7 {\n\n#include \"internal/_flow_graph_types_impl.h\"\n#include \"internal/_flow_graph_impl.h\"\nusing namespace internal::graph_policy_namespace;\n\nclass graph;\nclass graph_node;\n\ntemplate <typename GraphContainerType, typename GraphNodeType>\nclass graph_iterator {\n    friend class graph;\n    friend class graph_node;\npublic:\n    typedef size_t size_type;\n    typedef GraphNodeType value_type;\n    typedef GraphNodeType* pointer;\n    typedef GraphNodeType& reference;\n    typedef const GraphNodeType& const_reference;\n    typedef std::forward_iterator_tag iterator_category;\n\n    //! Default constructor\n    graph_iterator() : my_graph(NULL), current_node(NULL) {}\n\n    //! Copy constructor\n    graph_iterator(const graph_iterator& other) :\n        my_graph(other.my_graph), current_node(other.current_node)\n    {}\n\n    //! Assignment\n    graph_iterator& operator=(const graph_iterator& other) {\n        if (this != &other) {\n            my_graph = other.my_graph;\n            current_node = other.current_node;\n        }\n        return *this;\n    }\n\n    //! Dereference\n    reference operator*() const;\n\n    //! Dereference\n    pointer operator->() const;\n\n    //! Equality\n    bool operator==(const graph_iterator& other) const {\n        return ((my_graph == other.my_graph) && (current_node == other.current_node));\n    }\n\n    //! Inequality\n    bool operator!=(const graph_iterator& other) const { return !(operator==(other)); }\n\n    //! Pre-increment\n    graph_iterator& operator++() {\n        internal_forward();\n        return *this;\n    }\n\n    //! Post-increment\n    graph_iterator operator++(int) {\n        graph_iterator result = *this;\n        operator++();\n        return result;\n    }\n\nprivate:\n    // the graph over which we are iterating\n    GraphContainerType *my_graph;\n    // pointer into my_graph's my_nodes list\n    pointer current_node;\n\n    //! Private initializing constructor for begin() and end() iterators\n    graph_iterator(GraphContainerType *g, bool begin);\n    void internal_forward();\n};\n\n//! The graph class\n/** This class serves as a handle to the graph */\nclass graph : tbb::internal::no_copy {\n    friend class graph_node;\n\n    template< typename Body >\n    class run_task : public task {\n    public:\n        run_task( Body& body ) : my_body(body) {}\n        task *execute() {\n            my_body();\n            return NULL;\n        }\n    private:\n        Body my_body;\n    };\n\n    template< typename Receiver, typename Body >\n    class run_and_put_task : public task {\n    public:\n        run_and_put_task( Receiver &r, Body& body ) : my_receiver(r), my_body(body) {}\n        task *execute() {\n            task *res = my_receiver.try_put_task( my_body() );\n            if(res == SUCCESSFULLY_ENQUEUED) res = NULL;\n            return res;\n        }\n    private:\n        Receiver &my_receiver;\n        Body my_body;\n    };\n\npublic:\n    //! Constructs a graph with isolated task_group_context\n    explicit graph() : my_nodes(NULL), my_nodes_last(NULL)\n    {\n        own_context = true;\n        cancelled = false;\n        caught_exception = false;\n        my_context = new task_group_context();\n        my_root_task = ( new ( task::allocate_root(*my_context) ) empty_task );\n        my_root_task->set_ref_count(1);\n        tbb::internal::fgt_graph( this );\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        my_is_active = true;\n#endif\n    }\n\n    //! Constructs a graph with use_this_context as context\n    explicit graph(task_group_context& use_this_context) :\n    my_context(&use_this_context), my_nodes(NULL), my_nodes_last(NULL)\n    {\n        own_context = false;\n        my_root_task = ( new ( task::allocate_root(*my_context) ) empty_task );\n        my_root_task->set_ref_count(1);\n        tbb::internal::fgt_graph( this );\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        my_is_active = true;\n#endif\n    }\n\n    //! Destroys the graph.\n    /** Calls wait_for_all, then destroys the root task and context. */\n    ~graph() {\n        wait_for_all();\n        my_root_task->set_ref_count(0);\n        task::destroy( *my_root_task );\n        if (own_context) delete my_context;\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_TRACE\n    void set_name( const char *name ) {\n        tbb::internal::fgt_graph_desc( this, name );\n    }\n#endif\n\n    //! Used to register that an external entity may still interact with the graph.\n    /** The graph will not return from wait_for_all until a matching number of decrement_wait_count calls\n        is made. */\n    void increment_wait_count() {\n        if (my_root_task)\n            my_root_task->increment_ref_count();\n    }\n\n    //! Deregisters an external entity that may have interacted with the graph.\n    /** The graph will not return from wait_for_all until all the number of decrement_wait_count calls\n        matches the number of increment_wait_count calls. */\n    void decrement_wait_count() {\n        if (my_root_task)\n            my_root_task->decrement_ref_count();\n    }\n\n    //! Spawns a task that runs a body and puts its output to a specific receiver\n    /** The task is spawned as a child of the graph. This is useful for running tasks\n        that need to block a wait_for_all() on the graph.  For example a one-off source. */\n    template< typename Receiver, typename Body >\n        void run( Receiver &r, Body body ) {\n       FLOW_SPAWN( (* new ( task::allocate_additional_child_of( *my_root_task ) )\n                   run_and_put_task< Receiver, Body >( r, body )) );\n    }\n\n    //! Spawns a task that runs a function object\n    /** The task is spawned as a child of the graph. This is useful for running tasks\n        that need to block a wait_for_all() on the graph. For example a one-off source. */\n    template< typename Body >\n    void run( Body body ) {\n       FLOW_SPAWN( * new ( task::allocate_additional_child_of( *my_root_task ) ) run_task< Body >( body ) );\n    }\n\n    //! Wait until graph is idle and decrement_wait_count calls equals increment_wait_count calls.\n    /** The waiting thread will go off and steal work while it is block in the wait_for_all. */\n    void wait_for_all() {\n        cancelled = false;\n        caught_exception = false;\n        if (my_root_task) {\n#if TBB_USE_EXCEPTIONS\n            try {\n#endif\n                my_root_task->wait_for_all();\n                cancelled = my_context->is_group_execution_cancelled();\n#if TBB_USE_EXCEPTIONS\n            }\n            catch(...) {\n                my_root_task->set_ref_count(1);\n                my_context->reset();\n                caught_exception = true;\n                cancelled = true;\n                throw;\n            }\n#endif\n            my_context->reset();  // consistent with behavior in catch()\n            my_root_task->set_ref_count(1);\n        }\n    }\n\n    //! Returns the root task of the graph\n    task * root_task() {\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        if (!my_is_active) \n            return NULL;\n        else\n#endif\n            return my_root_task;\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n    void set_active(bool a = true) {\n       my_is_active = a;\n    }\n\n    bool is_active() {\n       return my_is_active;\n    }\n#endif\n\n    // ITERATORS\n    template<typename C, typename N>\n    friend class graph_iterator;\n\n    // Graph iterator typedefs\n    typedef graph_iterator<graph,graph_node> iterator;\n    typedef graph_iterator<const graph,const graph_node> const_iterator;\n\n    // Graph iterator constructors\n    //! start iterator\n    iterator begin() { return iterator(this, true); }\n    //! end iterator\n    iterator end() { return iterator(this, false); }\n     //! start const iterator\n    const_iterator begin() const { return const_iterator(this, true); }\n    //! end const iterator\n    const_iterator end() const { return const_iterator(this, false); }\n    //! start const iterator\n    const_iterator cbegin() const { return const_iterator(this, true); }\n    //! end const iterator\n    const_iterator cend() const { return const_iterator(this, false); }\n\n    //! return status of graph execution\n    bool is_cancelled() { return cancelled; }\n    bool exception_thrown() { return caught_exception; }\n\n    // thread-unsafe state reset.\n    void reset(__TBB_PFG_RESET_ARG(reset_flags f = rf_reset_protocol));\n\nprivate:\n    task *my_root_task;\n    task_group_context *my_context;\n    bool own_context;\n    bool cancelled;\n    bool caught_exception;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n    bool my_is_active;\n#endif\n\n\n    graph_node *my_nodes, *my_nodes_last;\n\n    spin_mutex nodelist_mutex;\n    void register_node(graph_node *n);\n    void remove_node(graph_node *n);\n\n};  // class graph\n\ntemplate <typename C, typename N>\ngraph_iterator<C,N>::graph_iterator(C *g, bool begin) : my_graph(g), current_node(NULL)\n{\n    if (begin) current_node = my_graph->my_nodes;\n    //else it is an end iterator by default\n}\n\ntemplate <typename C, typename N>\ntypename graph_iterator<C,N>::reference graph_iterator<C,N>::operator*() const {\n    __TBB_ASSERT(current_node, \"graph_iterator at end\");\n    return *operator->();\n}\n\ntemplate <typename C, typename N>\ntypename graph_iterator<C,N>::pointer graph_iterator<C,N>::operator->() const {\n    return current_node;\n}\n\n\ntemplate <typename C, typename N>\nvoid graph_iterator<C,N>::internal_forward() {\n    if (current_node) current_node = current_node->next;\n}\n\n//! The base of all graph nodes.\nclass graph_node : tbb::internal::no_assign {\n    friend class graph;\n    template<typename C, typename N>\n    friend class graph_iterator;\nprotected:\n    graph& my_graph;\n    graph_node *next, *prev;\npublic:\n    graph_node(graph& g) : my_graph(g) {\n        my_graph.register_node(this);\n    }\n    virtual ~graph_node() {\n        my_graph.remove_node(this);\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_TRACE\n    virtual void set_name( const char *name ) = 0;\n#endif\n\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n    virtual void extract( reset_flags f=rf_extract ) {\n        bool a = my_graph.is_active();\n        my_graph.set_active(false);\n        reset((reset_flags)(f|rf_extract));\n        my_graph.set_active(a);\n    }\n#endif\n\nprotected:\n    virtual void reset(__TBB_PFG_RESET_ARG(reset_flags f=rf_reset_protocol)) = 0;\n};\n\ninline void graph::register_node(graph_node *n) {\n    n->next = NULL;\n    {\n        spin_mutex::scoped_lock lock(nodelist_mutex);\n        n->prev = my_nodes_last;\n        if (my_nodes_last) my_nodes_last->next = n;\n        my_nodes_last = n;\n        if (!my_nodes) my_nodes = n;\n    }\n}\n\ninline void graph::remove_node(graph_node *n) {\n    {\n        spin_mutex::scoped_lock lock(nodelist_mutex);\n        __TBB_ASSERT(my_nodes && my_nodes_last, \"graph::remove_node: Error: no registered nodes\");\n        if (n->prev) n->prev->next = n->next;\n        if (n->next) n->next->prev = n->prev;\n        if (my_nodes_last == n) my_nodes_last = n->prev;\n        if (my_nodes == n) my_nodes = n->next;\n    }\n    n->prev = n->next = NULL;\n}\n\ninline void graph::reset( __TBB_PFG_RESET_ARG( reset_flags f )) {\n    // reset context\n    task *saved_my_root_task = my_root_task;\n    my_root_task = NULL;\n    if(my_context) my_context->reset();\n    cancelled = false;\n    caught_exception = false;\n    // reset all the nodes comprising the graph\n    for(iterator ii = begin(); ii != end(); ++ii) {\n        graph_node *my_p = &(*ii);\n        my_p->reset(__TBB_PFG_RESET_ARG(f));\n    }\n    my_root_task = saved_my_root_task;\n}\n\n\n#include \"internal/_flow_graph_node_impl.h\"\n\n//! An executable node that acts as a source, i.e. it has no predecessors\ntemplate < typename Output >\nclass source_node : public graph_node, public sender< Output > {\nprotected:\n    using graph_node::my_graph;\npublic:\n    //! The type of the output message, which is complete\n    typedef Output output_type;\n\n    //! The type of successors of this node\n    typedef receiver< Output > successor_type;\n\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n    typedef std::vector<successor_type *> successor_vector_type;\n#endif\n\n    //! Constructor for a node with a successor\n    template< typename Body >\n    source_node( graph &g, Body body, bool is_active = true )\n        : graph_node(g), my_active(is_active), init_my_active(is_active),\n        my_body( new internal::source_body_leaf< output_type, Body>(body) ),\n        my_reserved(false), my_has_cached_item(false)\n    {\n        my_successors.set_owner(this);\n        tbb::internal::fgt_node_with_body( tbb::internal::FLOW_SOURCE_NODE, &this->my_graph,\n                                           static_cast<sender<output_type> *>(this), this->my_body );\n    }\n\n    //! Copy constructor\n    source_node( const source_node& src ) :\n        graph_node(src.my_graph), sender<Output>(),\n        my_active(src.init_my_active),\n        init_my_active(src.init_my_active), my_body( src.my_body->clone() ),\n        my_reserved(false), my_has_cached_item(false)\n    {\n        my_successors.set_owner(this);\n        tbb::internal::fgt_node_with_body( tbb::internal::FLOW_SOURCE_NODE, &this->my_graph,\n                                           static_cast<sender<output_type> *>(this), this->my_body );\n    }\n\n    //! The destructor\n    ~source_node() { delete my_body; }\n\n#if TBB_PREVIEW_FLOW_GRAPH_TRACE\n    /* override */ void set_name( const char *name ) {\n        tbb::internal::fgt_node_desc( this, name );\n    }\n#endif\n\n    //! Add a new successor to this node\n    /* override */ bool register_successor( successor_type &r ) {\n        spin_mutex::scoped_lock lock(my_mutex);\n        my_successors.register_successor(r);\n        if ( my_active )\n            spawn_put();\n        return true;\n    }\n\n    //! Removes a successor from this node\n    /* override */ bool remove_successor( successor_type &r ) {\n        spin_mutex::scoped_lock lock(my_mutex);\n        my_successors.remove_successor(r);\n        return true;\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n    /*override*/void internal_add_built_successor( successor_type &r) {\n        spin_mutex::scoped_lock lock(my_mutex);\n        my_successors.internal_add_built_successor(r);\n    }\n\n    /*override*/void internal_delete_built_successor( successor_type &r) {\n        spin_mutex::scoped_lock lock(my_mutex);\n        my_successors.internal_delete_built_successor(r);\n    }\n\n    /*override*/size_t successor_count() {\n        spin_mutex::scoped_lock lock(my_mutex);\n        return my_successors.successor_count();\n    }\n\n    /*override*/void copy_successors(successor_vector_type &v) {\n        spin_mutex::scoped_lock l(my_mutex);\n        my_successors.copy_successors(v);\n    }\n#endif  /* TBB_PREVIEW_FLOW_GRAPH_FEATURES */\n\n    //! Request an item from the node\n    /*override */ bool try_get( output_type &v ) {\n        spin_mutex::scoped_lock lock(my_mutex);\n        if ( my_reserved )\n            return false;\n\n        if ( my_has_cached_item ) {\n            v = my_cached_item;\n            my_has_cached_item = false;\n            return true;\n        }\n        // we've been asked to provide an item, but we have none.  enqueue a task to\n        // provide one.\n        spawn_put();\n        return false;\n    }\n\n    //! Reserves an item.\n    /* override */ bool try_reserve( output_type &v ) {\n        spin_mutex::scoped_lock lock(my_mutex);\n        if ( my_reserved ) {\n            return false;\n        }\n\n        if ( my_has_cached_item ) {\n            v = my_cached_item;\n            my_reserved = true;\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    //! Release a reserved item.\n    /** true = item has been released and so remains in sender, dest must request or reserve future items */\n    /* override */ bool try_release( ) {\n        spin_mutex::scoped_lock lock(my_mutex);\n        __TBB_ASSERT( my_reserved && my_has_cached_item, \"releasing non-existent reservation\" );\n        my_reserved = false;\n        if(!my_successors.empty())\n            spawn_put();\n        return true;\n    }\n\n    //! Consumes a reserved item\n    /* override */ bool try_consume( ) {\n        spin_mutex::scoped_lock lock(my_mutex);\n        __TBB_ASSERT( my_reserved && my_has_cached_item, \"consuming non-existent reservation\" );\n        my_reserved = false;\n        my_has_cached_item = false;\n        if ( !my_successors.empty() ) {\n            spawn_put();\n        }\n        return true;\n    }\n\n    //! Activates a node that was created in the inactive state\n    void activate() {\n        spin_mutex::scoped_lock lock(my_mutex);\n        my_active = true;\n        if ( !my_successors.empty() )\n            spawn_put();\n    }\n\n    template<typename Body>\n    Body copy_function_object() {\n        internal::source_body<output_type> &body_ref = *this->my_body;\n        return dynamic_cast< internal::source_body_leaf<output_type, Body> & >(body_ref).get_body();\n    }\n\nprotected:\n\n    //! resets the source_node to its initial state\n    void reset( __TBB_PFG_RESET_ARG(reset_flags f)) {\n        my_active = init_my_active;\n        my_reserved =false;\n        if(my_has_cached_item) {\n            my_has_cached_item = false;\n        }\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        my_successors.reset(f);\n        if(f & rf_reset_bodies) my_body->reset_body();\n#endif\n    }\n\nprivate:\n    spin_mutex my_mutex;\n    bool my_active;\n    bool init_my_active;\n    internal::source_body<output_type> *my_body;\n    internal::broadcast_cache< output_type > my_successors;\n    bool my_reserved;\n    bool my_has_cached_item;\n    output_type my_cached_item;\n\n    // used by apply_body, can invoke body of node.\n    bool try_reserve_apply_body(output_type &v) {\n        spin_mutex::scoped_lock lock(my_mutex);\n        if ( my_reserved ) {\n            return false;\n        }\n        if ( !my_has_cached_item ) {\n            tbb::internal::fgt_begin_body( my_body );\n            bool r = (*my_body)(my_cached_item);\n            tbb::internal::fgt_end_body( my_body );\n            if (r) {\n                my_has_cached_item = true;\n            }\n        }\n        if ( my_has_cached_item ) {\n            v = my_cached_item;\n            my_reserved = true;\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    //! Spawns a task that applies the body\n    /* override */ void spawn_put( ) {\n        task* tp = this->my_graph.root_task();\n        if(tp) {\n            FLOW_SPAWN( (* new ( task::allocate_additional_child_of( *tp ) )\n                        internal:: source_task_bypass < source_node< output_type > >( *this ) ) );\n        }\n    }\n\n    friend class internal::source_task_bypass< source_node< output_type > >;\n    //! Applies the body.  Returning SUCCESSFULLY_ENQUEUED okay; forward_task_bypass will handle it.\n    /* override */ task * apply_body_bypass( ) {\n        output_type v;\n        if ( !try_reserve_apply_body(v) )\n            return NULL;\n\n        task *last_task = my_successors.try_put_task(v);\n        if ( last_task )\n            try_consume();\n        else\n            try_release();\n        return last_task;\n    }\n};  // source_node\n\n//! Implements a function node that supports Input -> Output\ntemplate < typename Input, typename Output = continue_msg, graph_buffer_policy = queueing, typename Allocator=cache_aligned_allocator<Input> >\nclass function_node : public graph_node, public internal::function_input<Input,Output,Allocator>, public internal::function_output<Output> {\nprotected:\n    using graph_node::my_graph;\npublic:\n    typedef Input input_type;\n    typedef Output output_type;\n    typedef sender< input_type > predecessor_type;\n    typedef receiver< output_type > successor_type;\n    typedef internal::function_input<input_type,output_type,Allocator> fInput_type;\n    typedef internal::function_output<output_type> fOutput_type;\n#if TBB_PREVIEW_FLOW_GRAPH_FEAURES\n    typedef std::vector<predecessor_type *> predecessor_vector_type;\n    typedef std::vector<successor_type *> successor_vector_type;\n#endif\n\n    //! Constructor\n    template< typename Body >\n    function_node( graph &g, size_t concurrency, Body body ) :\n        graph_node(g), internal::function_input<input_type,output_type,Allocator>(g, concurrency, body) {\n        tbb::internal::fgt_node_with_body( tbb::internal::FLOW_FUNCTION_NODE, &this->graph_node::my_graph, static_cast<receiver<input_type> *>(this),\n                                           static_cast<sender<output_type> *>(this), this->my_body );\n    }\n\n    //! Copy constructor\n    function_node( const function_node& src ) :\n        graph_node(src.my_graph), internal::function_input<input_type,output_type,Allocator>( src ),\n        fOutput_type() {\n        tbb::internal::fgt_node_with_body( tbb::internal::FLOW_FUNCTION_NODE, &this->my_graph, static_cast<receiver<input_type> *>(this),\n                                           static_cast<sender<output_type> *>(this), this->my_body );\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_TRACE\n    /* override */ void set_name( const char *name ) {\n        tbb::internal::fgt_node_desc( this, name );\n    }\n#endif\n\nprotected:\n    template< typename R, typename B > friend class run_and_put_task;\n    template<typename X, typename Y> friend class internal::broadcast_cache;\n    template<typename X, typename Y> friend class internal::round_robin_cache;\n    using fInput_type::try_put_task;\n\n    // override of graph_node's reset.\n    /*override*/void reset(__TBB_PFG_RESET_ARG(reset_flags f)) {\n        fInput_type::reset_function_input(__TBB_PFG_RESET_ARG(f));\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        successors().reset(f);\n        __TBB_ASSERT(!(f & rf_extract) || successors().empty(), \"function_node successors not empty\");\n        __TBB_ASSERT(this->my_predecessors.empty(), \"function_node predecessors not empty\");\n#endif\n    }\n\n    /* override */ internal::broadcast_cache<output_type> &successors () { return fOutput_type::my_successors; }\n};\n\n//! Implements a function node that supports Input -> Output\ntemplate < typename Input, typename Output, typename Allocator >\nclass function_node<Input,Output,queueing,Allocator> : public graph_node, public internal::function_input<Input,Output,Allocator>, public internal::function_output<Output> {\nprotected:\n    using graph_node::my_graph;\npublic:\n    typedef Input input_type;\n    typedef Output output_type;\n    typedef sender< input_type > predecessor_type;\n    typedef receiver< output_type > successor_type;\n    typedef internal::function_input<input_type,output_type,Allocator> fInput_type;\n    typedef internal::function_input_queue<input_type, Allocator> queue_type;\n    typedef internal::function_output<output_type> fOutput_type;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n    typedef std::vector<predecessor_type *> predecessor_vector_type;\n    typedef std::vector<successor_type *> successor_vector_type;\n#endif\n\n    //! Constructor\n    template< typename Body >\n    function_node( graph &g, size_t concurrency, Body body ) :\n        graph_node(g), fInput_type( g, concurrency, body, new queue_type() ) {\n        tbb::internal::fgt_node_with_body( tbb::internal::FLOW_FUNCTION_NODE, &this->graph_node::my_graph, static_cast<receiver<input_type> *>(this),\n                                           static_cast<sender<output_type> *>(this), this->my_body );\n    }\n\n    //! Copy constructor\n    function_node( const function_node& src ) :\n        graph_node(src.graph_node::my_graph), fInput_type( src, new queue_type() ), fOutput_type() {\n        tbb::internal::fgt_node_with_body( tbb::internal::FLOW_FUNCTION_NODE, &this->graph_node::my_graph, static_cast<receiver<input_type> *>(this),\n                                           static_cast<sender<output_type> *>(this), this->my_body );\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_TRACE\n    /* override */ void set_name( const char *name ) {\n        tbb::internal::fgt_node_desc( this, name );\n    }\n#endif\n\nprotected:\n    template< typename R, typename B > friend class run_and_put_task;\n    template<typename X, typename Y> friend class internal::broadcast_cache;\n    template<typename X, typename Y> friend class internal::round_robin_cache;\n    using fInput_type::try_put_task;\n\n    /*override*/void reset( __TBB_PFG_RESET_ARG(reset_flags f)) {\n        fInput_type::reset_function_input(__TBB_PFG_RESET_ARG(f));\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        successors().reset(f);\n        __TBB_ASSERT(!(f & rf_extract) || successors().empty(), \"function_node successors not empty\");\n        __TBB_ASSERT(!(f & rf_extract) || this->my_predecessors.empty(), \"function_node predecessors not empty\");\n#endif\n\n    }\n\n    /* override */ internal::broadcast_cache<output_type> &successors () { return fOutput_type::my_successors; }\n};\n\n//! implements a function node that supports Input -> (set of outputs)\n// Output is a tuple of output types.\ntemplate < typename Input, typename Output, graph_buffer_policy = queueing, typename Allocator=cache_aligned_allocator<Input> >\nclass multifunction_node :\n    public graph_node,\n    public internal::multifunction_input\n    <\n        Input,\n        typename internal::wrap_tuple_elements<\n            tbb::flow::tuple_size<Output>::value,  // #elements in tuple\n            internal::multifunction_output,  // wrap this around each element\n            Output // the tuple providing the types\n        >::type,\n        Allocator\n    > {\nprotected:\n    using graph_node::my_graph;\nprivate:\n    static const int N = tbb::flow::tuple_size<Output>::value;\npublic:\n    typedef Input input_type;\n    typedef typename internal::wrap_tuple_elements<N,internal::multifunction_output, Output>::type output_ports_type;\nprivate:\n    typedef typename internal::multifunction_input<input_type, output_ports_type, Allocator> base_type;\n    typedef typename internal::function_input_queue<input_type,Allocator> queue_type;\npublic:\n    template<typename Body>\n    multifunction_node( graph &g, size_t concurrency, Body body ) :\n        graph_node(g), base_type(g,concurrency, body) {\n        tbb::internal::fgt_multioutput_node_with_body<Output,N>( tbb::internal::FLOW_MULTIFUNCTION_NODE,\n                                                                 &this->graph_node::my_graph, static_cast<receiver<input_type> *>(this),\n                                                                 this->output_ports(), this->my_body );\n    }\n\n    multifunction_node( const multifunction_node &other) :\n        graph_node(other.graph_node::my_graph), base_type(other) {\n        tbb::internal::fgt_multioutput_node_with_body<Output,N>( tbb::internal::FLOW_MULTIFUNCTION_NODE,\n                                                                 &this->graph_node::my_graph, static_cast<receiver<input_type> *>(this),\n                                                                 this->output_ports(), this->my_body );\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_TRACE\n    /* override */ void set_name( const char *name ) {\n        tbb::internal::fgt_multioutput_node_desc( this, name );\n    }\n#endif\n\n    // all the guts are in multifunction_input...\nprotected:\n    /*override*/void reset(__TBB_PFG_RESET_ARG(reset_flags f)) { base_type::reset(__TBB_PFG_RESET_ARG(f)); }\n};  // multifunction_node\n\ntemplate < typename Input, typename Output, typename Allocator >\nclass multifunction_node<Input,Output,queueing,Allocator> : public graph_node, public internal::multifunction_input<Input,\n    typename internal::wrap_tuple_elements<tbb::flow::tuple_size<Output>::value, internal::multifunction_output, Output>::type, Allocator> {\nprotected:\n    using graph_node::my_graph;\n    static const int N = tbb::flow::tuple_size<Output>::value;\npublic:\n    typedef Input input_type;\n    typedef typename internal::wrap_tuple_elements<N, internal::multifunction_output, Output>::type output_ports_type;\nprivate:\n    typedef typename internal::multifunction_input<input_type, output_ports_type, Allocator> base_type;\n    typedef typename internal::function_input_queue<input_type,Allocator> queue_type;\npublic:\n    template<typename Body>\n    multifunction_node( graph &g, size_t concurrency, Body body) :\n        graph_node(g), base_type(g,concurrency, body, new queue_type()) {\n        tbb::internal::fgt_multioutput_node_with_body<Output,N>( tbb::internal::FLOW_MULTIFUNCTION_NODE,\n                                                                 &this->graph_node::my_graph, static_cast<receiver<input_type> *>(this),\n                                                                 this->output_ports(), this->my_body );\n    }\n\n    multifunction_node( const multifunction_node &other) :\n        graph_node(other.graph_node::my_graph), base_type(other, new queue_type()) {\n        tbb::internal::fgt_multioutput_node_with_body<Output,N>( tbb::internal::FLOW_MULTIFUNCTION_NODE,\n                                                                 &this->graph_node::my_graph, static_cast<receiver<input_type> *>(this),\n                                                                 this->output_ports(), this->my_body );\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_TRACE\n    /* override */ void set_name( const char *name ) {\n        tbb::internal::fgt_multioutput_node_desc( this, name );\n    }\n#endif\n\n    // all the guts are in multifunction_input...\nprotected:\n    /*override*/void reset(__TBB_PFG_RESET_ARG(reset_flags f)) { base_type::reset(__TBB_PFG_RESET_ARG(f)); }\n};  // multifunction_node\n\n//! split_node: accepts a tuple as input, forwards each element of the tuple to its\n//  successors.  The node has unlimited concurrency, so though it is marked as\n//  \"rejecting\" it does not reject inputs.\ntemplate<typename TupleType, typename Allocator=cache_aligned_allocator<TupleType> >\nclass split_node : public multifunction_node<TupleType, TupleType, rejecting, Allocator> {\n    static const int N = tbb::flow::tuple_size<TupleType>::value;\n    typedef multifunction_node<TupleType,TupleType,rejecting,Allocator> base_type;\npublic:\n    typedef typename base_type::output_ports_type output_ports_type;\nprivate:\n    struct splitting_body {\n        void operator()(const TupleType& t, output_ports_type &p) {\n            internal::emit_element<N>::emit_this(t, p);\n        }\n    };\npublic:\n    typedef TupleType input_type;\n    typedef Allocator allocator_type;\n    split_node(graph &g) : base_type(g, unlimited, splitting_body()) {\n        tbb::internal::fgt_multioutput_node<TupleType,N>( tbb::internal::FLOW_SPLIT_NODE, &this->graph_node::my_graph,\n                                                          static_cast<receiver<input_type> *>(this), this->output_ports() );\n    }\n\n    split_node( const split_node & other) : base_type(other) {\n        tbb::internal::fgt_multioutput_node<TupleType,N>( tbb::internal::FLOW_SPLIT_NODE, &this->graph_node::my_graph,\n                                                          static_cast<receiver<input_type> *>(this), this->output_ports() );\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_TRACE\n    /* override */ void set_name( const char *name ) {\n        tbb::internal::fgt_multioutput_node_desc( this, name );\n    }\n#endif\n\n};\n\n//! Implements an executable node that supports continue_msg -> Output\ntemplate <typename Output>\nclass continue_node : public graph_node, public internal::continue_input<Output>, public internal::function_output<Output> {\nprotected:\n    using graph_node::my_graph;\npublic:\n    typedef continue_msg input_type;\n    typedef Output output_type;\n    typedef sender< input_type > predecessor_type;\n    typedef receiver< output_type > successor_type;\n    typedef internal::continue_input<Output> fInput_type;\n    typedef internal::function_output<output_type> fOutput_type;\n\n    //! Constructor for executable node with continue_msg -> Output\n    template <typename Body >\n    continue_node( graph &g, Body body ) :\n        graph_node(g), internal::continue_input<output_type>( g, body ) {\n        tbb::internal::fgt_node_with_body( tbb::internal::FLOW_CONTINUE_NODE, &this->my_graph,\n                                           static_cast<receiver<input_type> *>(this),\n                                           static_cast<sender<output_type> *>(this), this->my_body );\n    }\n\n\n    //! Constructor for executable node with continue_msg -> Output\n    template <typename Body >\n    continue_node( graph &g, int number_of_predecessors, Body body ) :\n        graph_node(g), internal::continue_input<output_type>( g, number_of_predecessors, body ) {\n        tbb::internal::fgt_node_with_body( tbb::internal::FLOW_CONTINUE_NODE, &this->my_graph,\n                                           static_cast<receiver<input_type> *>(this),\n                                           static_cast<sender<output_type> *>(this), this->my_body );\n    }\n\n    //! Copy constructor\n    continue_node( const continue_node& src ) :\n        graph_node(src.graph_node::my_graph), internal::continue_input<output_type>(src),\n        internal::function_output<Output>() {\n        tbb::internal::fgt_node_with_body( tbb::internal::FLOW_CONTINUE_NODE, &this->my_graph,\n                                           static_cast<receiver<input_type> *>(this),\n                                           static_cast<sender<output_type> *>(this), this->my_body );\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_TRACE\n    /* override */ void set_name( const char *name ) {\n        tbb::internal::fgt_node_desc( this, name );\n    }\n#endif\n\nprotected:\n    template< typename R, typename B > friend class run_and_put_task;\n    template<typename X, typename Y> friend class internal::broadcast_cache;\n    template<typename X, typename Y> friend class internal::round_robin_cache;\n    using fInput_type::try_put_task;\n\n    /*override*/void reset(__TBB_PFG_RESET_ARG(reset_flags f)) {\n        fInput_type::reset_receiver(__TBB_PFG_RESET_ARG(f));\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        successors().reset(f);\n        __TBB_ASSERT(!(f & rf_extract) || successors().empty(), \"continue_node not reset\");\n#endif\n    }\n\n    /* override */ internal::broadcast_cache<output_type> &successors () { return fOutput_type::my_successors; }\n};  // continue_node\n\ntemplate< typename T >\nclass overwrite_node : public graph_node, public receiver<T>, public sender<T> {\nprotected:\n    using graph_node::my_graph;\npublic:\n    typedef T input_type;\n    typedef T output_type;\n    typedef sender< input_type > predecessor_type;\n    typedef receiver< output_type > successor_type;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n    typedef std::vector<predecessor_type *> predecessor_vector_type;\n    typedef std::vector<successor_type *> successor_vector_type;\n#endif\n\n    overwrite_node(graph &g) : graph_node(g), my_buffer_is_valid(false) {\n        my_successors.set_owner( this );\n        tbb::internal::fgt_node( tbb::internal::FLOW_OVERWRITE_NODE, &this->my_graph,\n                                 static_cast<receiver<input_type> *>(this), static_cast<sender<output_type> *>(this) );\n    }\n\n    // Copy constructor; doesn't take anything from src; default won't work\n    overwrite_node( const overwrite_node& src ) :\n        graph_node(src.my_graph), receiver<T>(), sender<T>(), my_buffer_is_valid(false)\n    {\n        my_successors.set_owner( this );\n        tbb::internal::fgt_node( tbb::internal::FLOW_OVERWRITE_NODE, &this->my_graph,\n                                 static_cast<receiver<input_type> *>(this), static_cast<sender<output_type> *>(this) );\n    }\n\n    ~overwrite_node() {}\n\n#if TBB_PREVIEW_FLOW_GRAPH_TRACE\n    /* override */ void set_name( const char *name ) {\n        tbb::internal::fgt_node_desc( this, name );\n    }\n#endif\n\n    /* override */ bool register_successor( successor_type &s ) {\n        spin_mutex::scoped_lock l( my_mutex );\n        task* tp = this->my_graph.root_task();  // just to test if we are resetting\n        if (my_buffer_is_valid && tp) {\n            // We have a valid value that must be forwarded immediately.\n            if ( s.try_put( my_buffer ) || !s.register_predecessor( *this  ) ) {\n                // We add the successor: it accepted our put or it rejected it but won't let us become a predecessor\n                my_successors.register_successor( s );\n            } else {\n                // We don't add the successor: it rejected our put and we became its predecessor instead\n                return false;\n            }\n        } else {\n            // No valid value yet, just add as successor\n            my_successors.register_successor( s );\n        }\n        return true;\n    }\n\n    /* override */ bool remove_successor( successor_type &s ) {\n        spin_mutex::scoped_lock l( my_mutex );\n        my_successors.remove_successor(s);\n        return true;\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n    /*override*/void internal_add_built_successor( successor_type &s) {\n        spin_mutex::scoped_lock l( my_mutex );\n        my_successors.internal_add_built_successor(s);\n    }\n\n    /*override*/void internal_delete_built_successor( successor_type &s) {\n        spin_mutex::scoped_lock l( my_mutex );\n        my_successors.internal_delete_built_successor(s);\n    }\n\n    /*override*/size_t successor_count() {\n        spin_mutex::scoped_lock l( my_mutex );\n        return my_successors.successor_count();\n    }\n\n    /*override*/ void copy_successors(successor_vector_type &v) {\n        spin_mutex::scoped_lock l( my_mutex );\n        my_successors.copy_successors(v);\n    }\n\n    /*override*/ void internal_add_built_predecessor( predecessor_type &p) {\n        spin_mutex::scoped_lock l( my_mutex );\n        my_built_predecessors.add_edge(p);\n    }\n\n    /*override*/ void internal_delete_built_predecessor( predecessor_type &p) {\n        spin_mutex::scoped_lock l( my_mutex );\n        my_built_predecessors.delete_edge(p);\n    }\n\n    /*override*/size_t predecessor_count() {\n        spin_mutex::scoped_lock l( my_mutex );\n        return my_built_predecessors.edge_count();\n    }\n\n    /*override*/void copy_predecessors(predecessor_vector_type &v) {\n        spin_mutex::scoped_lock l( my_mutex );\n        my_built_predecessors.copy_edges(v);\n    }\n#endif  /* TBB_PREVIEW_FLOW_GRAPH_FEATURES */\n\n    /* override */ bool try_get( input_type &v ) {\n        spin_mutex::scoped_lock l( my_mutex );\n        if ( my_buffer_is_valid ) {\n            v = my_buffer;\n            return true;\n        }\n        return false;\n    }\n\n    bool is_valid() {\n       spin_mutex::scoped_lock l( my_mutex );\n       return my_buffer_is_valid;\n    }\n\n    void clear() {\n       spin_mutex::scoped_lock l( my_mutex );\n       my_buffer_is_valid = false;\n    }\n\nprotected:\n    template< typename R, typename B > friend class run_and_put_task;\n    template<typename X, typename Y> friend class internal::broadcast_cache;\n    template<typename X, typename Y> friend class internal::round_robin_cache;\n    /* override */ task * try_put_task( const input_type &v ) {\n        spin_mutex::scoped_lock l( my_mutex );\n        my_buffer = v;\n        my_buffer_is_valid = true;\n        task * rtask = my_successors.try_put_task(v);\n        if(!rtask) rtask = SUCCESSFULLY_ENQUEUED;\n        return rtask;\n    }\n\n    /*override*/void reset( __TBB_PFG_RESET_ARG(reset_flags f)) {\n        my_buffer_is_valid = false;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        my_successors.reset(f);\n       if (f&rf_extract) {\n           my_built_predecessors.receiver_extract(*this);\n       }\n#endif\n    }\n\n    spin_mutex my_mutex;\n    internal::broadcast_cache< input_type, null_rw_mutex > my_successors;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n    edge_container<sender<input_type> > my_built_predecessors;\n#endif\n    input_type my_buffer;\n    bool my_buffer_is_valid;\n    /*override*/void reset_receiver(__TBB_PFG_RESET_ARG(reset_flags /*f*/)) {}\n};  // overwrite_node\n\ntemplate< typename T >\nclass write_once_node : public overwrite_node<T> {\npublic:\n    typedef T input_type;\n    typedef T output_type;\n    typedef sender< input_type > predecessor_type;\n    typedef receiver< output_type > successor_type;\n\n    //! Constructor\n    write_once_node(graph& g) : overwrite_node<T>(g) {\n        tbb::internal::fgt_node( tbb::internal::FLOW_WRITE_ONCE_NODE, &(this->my_graph),\n                                 static_cast<receiver<input_type> *>(this),\n                                 static_cast<sender<output_type> *>(this) );\n    }\n\n    //! Copy constructor: call base class copy constructor\n    write_once_node( const write_once_node& src ) : overwrite_node<T>(src) {\n        tbb::internal::fgt_node( tbb::internal::FLOW_WRITE_ONCE_NODE, &(this->my_graph),\n                                 static_cast<receiver<input_type> *>(this),\n                                 static_cast<sender<output_type> *>(this) );\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_TRACE\n    /* override */ void set_name( const char *name ) {\n        tbb::internal::fgt_node_desc( this, name );\n    }\n#endif\n\nprotected:\n    template< typename R, typename B > friend class run_and_put_task;\n    template<typename X, typename Y> friend class internal::broadcast_cache;\n    template<typename X, typename Y> friend class internal::round_robin_cache;\n    /* override */ task *try_put_task( const T &v ) {\n        spin_mutex::scoped_lock l( this->my_mutex );\n        if ( this->my_buffer_is_valid ) {\n            return NULL;\n        } else {\n            this->my_buffer = v;\n            this->my_buffer_is_valid = true;\n            task *res = this->my_successors.try_put_task(v);\n            if(!res) res = SUCCESSFULLY_ENQUEUED;\n            return res;\n        }\n    }\n};\n\n//! Forwards messages of type T to all successors\ntemplate <typename T>\nclass broadcast_node : public graph_node, public receiver<T>, public sender<T> {\nprotected:\n    using graph_node::my_graph;\npublic:\n    typedef T input_type;\n    typedef T output_type;\n    typedef sender< input_type > predecessor_type;\n    typedef receiver< output_type > successor_type;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n    typedef std::vector<predecessor_type *> predecessor_vector_type;\n    typedef std::vector<successor_type *> successor_vector_type;\n#endif\nprivate:\n    internal::broadcast_cache<input_type> my_successors;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n    edge_container<predecessor_type> my_built_predecessors;\n    spin_mutex pred_mutex;\n#endif\npublic:\n\n    broadcast_node(graph& g) : graph_node(g) {\n        my_successors.set_owner( this );\n        tbb::internal::fgt_node( tbb::internal::FLOW_BROADCAST_NODE, &this->my_graph,\n                                 static_cast<receiver<input_type> *>(this), static_cast<sender<output_type> *>(this) );\n    }\n\n    // Copy constructor\n    broadcast_node( const broadcast_node& src ) :\n        graph_node(src.my_graph), receiver<T>(), sender<T>()\n    {\n        my_successors.set_owner( this );\n        tbb::internal::fgt_node( tbb::internal::FLOW_BROADCAST_NODE, &this->my_graph,\n                                 static_cast<receiver<input_type> *>(this), static_cast<sender<output_type> *>(this) );\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_TRACE\n    /* override */ void set_name( const char *name ) {\n        tbb::internal::fgt_node_desc( this, name );\n    }\n#endif\n\n    //! Adds a successor\n    virtual bool register_successor( receiver<T> &r ) {\n        my_successors.register_successor( r );\n        return true;\n    }\n\n    //! Removes s as a successor\n    virtual bool remove_successor( receiver<T> &r ) {\n        my_successors.remove_successor( r );\n        return true;\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n    /*override*/ void internal_add_built_successor(successor_type &r) {\n        my_successors.internal_add_built_successor(r);\n    }\n\n    /*override*/ void internal_delete_built_successor(successor_type &r) {\n        my_successors.internal_delete_built_successor(r);\n    }\n\n    /*override*/ size_t successor_count() {\n        return my_successors.successor_count();\n    }\n\n    /*override*/ void copy_successors(successor_vector_type &v) {\n        my_successors.copy_successors(v);\n    }\n\n    /*override*/ void internal_add_built_predecessor( predecessor_type &p) {\n        my_built_predecessors.add_edge(p);\n    }\n\n    /*override*/ void internal_delete_built_predecessor( predecessor_type &p) {\n        my_built_predecessors.delete_edge(p);\n    }\n\n    /*override*/ size_t predecessor_count() {\n        return my_built_predecessors.edge_count();\n    }\n\n    /*override*/ void copy_predecessors(predecessor_vector_type &v) {\n        my_built_predecessors.copy_edges(v);\n    }\n#endif  /* TBB_PREVIEW_FLOW_GRAPH_FEATURES */\n\nprotected:\n    template< typename R, typename B > friend class run_and_put_task;\n    template<typename X, typename Y> friend class internal::broadcast_cache;\n    template<typename X, typename Y> friend class internal::round_robin_cache;\n    //! build a task to run the successor if possible.  Default is old behavior.\n    /*override*/ task *try_put_task(const T& t) {\n        task *new_task = my_successors.try_put_task(t);\n        if(!new_task) new_task = SUCCESSFULLY_ENQUEUED;\n        return new_task;\n    }\n\n    /*override*/void reset(__TBB_PFG_RESET_ARG(reset_flags f)) {\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        my_successors.reset(f);\n        if (f&rf_extract) {\n           my_built_predecessors.receiver_extract(*this);\n        }\n        __TBB_ASSERT(!(f & rf_extract) || my_successors.empty(), \"Error resetting broadcast_node\");\n#endif\n    }\n    /*override*/void reset_receiver(__TBB_PFG_RESET_ARG(reset_flags /*f*/)) {}\n};  // broadcast_node\n\n//! Forwards messages in arbitrary order\ntemplate <typename T, typename A=cache_aligned_allocator<T> >\nclass buffer_node : public graph_node, public internal::reservable_item_buffer<T, A>, public receiver<T>, public sender<T> {\nprotected:\n    using graph_node::my_graph;\npublic:\n    typedef T input_type;\n    typedef T output_type;\n    typedef sender< input_type > predecessor_type;\n    typedef receiver< output_type > successor_type;\n    typedef buffer_node<T, A> my_class;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n    typedef std::vector<predecessor_type *> predecessor_vector_type;\n    typedef std::vector<successor_type *> successor_vector_type;\n#endif\nprotected:\n    typedef size_t size_type;\n    internal::round_robin_cache< T, null_rw_mutex > my_successors;\n\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n    edge_container<predecessor_type> my_built_predecessors;\n#endif\n\n    friend class internal::forward_task_bypass< buffer_node< T, A > >;\n\n    enum op_type {reg_succ, rem_succ, req_item, res_item, rel_res, con_res, put_item, try_fwd_task\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        , add_blt_succ, del_blt_succ,\n        add_blt_pred, del_blt_pred,\n        blt_succ_cnt, blt_pred_cnt,\n        blt_succ_cpy, blt_pred_cpy   // create vector copies of preds and succs\n#endif\n    };\n    enum op_stat {WAIT=0, SUCCEEDED, FAILED};\n\n    // implements the aggregator_operation concept\n    class buffer_operation : public internal::aggregated_operation< buffer_operation > {\n    public:\n        char type;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        task * ltask;\n        union {\n            input_type *elem;\n            successor_type *r;\n            predecessor_type *p;\n            size_t cnt_val;\n            successor_vector_type *svec;\n            predecessor_vector_type *pvec;\n        };\n#else\n        T *elem;\n        task * ltask;\n        successor_type *r;\n#endif\n        buffer_operation(const T& e, op_type t) : type(char(t))\n\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n                                                  , ltask(NULL), elem(const_cast<T*>(&e))\n#else\n                                                  , elem(const_cast<T*>(&e)) , ltask(NULL)\n#endif\n        {}\n        buffer_operation(op_type t) : type(char(t)),  ltask(NULL) {}\n    };\n\n    bool forwarder_busy;\n    typedef internal::aggregating_functor<my_class, buffer_operation> my_handler;\n    friend class internal::aggregating_functor<my_class, buffer_operation>;\n    internal::aggregator< my_handler, buffer_operation> my_aggregator;\n\n    virtual void handle_operations(buffer_operation *op_list) {\n        buffer_operation *tmp = NULL;\n        bool try_forwarding=false;\n        while (op_list) {\n            tmp = op_list;\n            op_list = op_list->next;\n            switch (tmp->type) {\n            case reg_succ: internal_reg_succ(tmp);  try_forwarding = true; break;\n            case rem_succ: internal_rem_succ(tmp); break;\n            case req_item: internal_pop(tmp); break;\n            case res_item: internal_reserve(tmp); break;\n            case rel_res:  internal_release(tmp);  try_forwarding = true; break;\n            case con_res:  internal_consume(tmp);  try_forwarding = true; break;\n            case put_item: internal_push(tmp);  try_forwarding = (tmp->status == SUCCEEDED); break;\n            case try_fwd_task: internal_forward_task(tmp); break;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n            // edge recording\n            case add_blt_succ: internal_add_built_succ(tmp); break;\n            case del_blt_succ: internal_del_built_succ(tmp); break;\n            case add_blt_pred: internal_add_built_pred(tmp); break;\n            case del_blt_pred: internal_del_built_pred(tmp); break;\n            case blt_succ_cnt: internal_succ_cnt(tmp); break;\n            case blt_pred_cnt: internal_pred_cnt(tmp); break;\n            case blt_succ_cpy: internal_copy_succs(tmp); break;\n            case blt_pred_cpy: internal_copy_preds(tmp); break;\n#endif\n            }\n        }\n        if (try_forwarding && !forwarder_busy) {\n            task* tp = this->my_graph.root_task();\n            if(tp) {\n                forwarder_busy = true;\n                task *new_task = new(task::allocate_additional_child_of(*tp)) internal::\n                        forward_task_bypass\n                        < buffer_node<input_type, A> >(*this);\n                // tmp should point to the last item handled by the aggregator.  This is the operation\n                // the handling thread enqueued.  So modifying that record will be okay.\n                tbb::task *z = tmp->ltask;\n                tmp->ltask = combine_tasks(z, new_task);  // in case the op generated a task\n            }\n        }\n    }\n\n    inline task *grab_forwarding_task( buffer_operation &op_data) {\n        return op_data.ltask;\n    }\n\n    inline bool enqueue_forwarding_task(buffer_operation &op_data) {\n        task *ft = grab_forwarding_task(op_data);\n        if(ft) {\n            FLOW_SPAWN(*ft);\n            return true;\n        }\n        return false;\n    }\n\n    //! This is executed by an enqueued task, the \"forwarder\"\n    virtual task *forward_task() {\n        buffer_operation op_data(try_fwd_task);\n        task *last_task = NULL;\n        do {\n            op_data.status = WAIT;\n            op_data.ltask = NULL;\n            my_aggregator.execute(&op_data);\n            tbb::task *xtask = op_data.ltask;\n            last_task = combine_tasks(last_task, xtask);\n        } while (op_data.status == SUCCEEDED);\n        return last_task;\n    }\n\n    //! Register successor\n    virtual void internal_reg_succ(buffer_operation *op) {\n        my_successors.register_successor(*(op->r));\n        __TBB_store_with_release(op->status, SUCCEEDED);\n    }\n\n    //! Remove successor\n    virtual void internal_rem_succ(buffer_operation *op) {\n        my_successors.remove_successor(*(op->r));\n        __TBB_store_with_release(op->status, SUCCEEDED);\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n    virtual void internal_add_built_succ(buffer_operation *op) {\n        my_successors.internal_add_built_successor(*(op->r));\n        __TBB_store_with_release(op->status, SUCCEEDED);\n    }\n\n    virtual void internal_del_built_succ(buffer_operation *op) {\n        my_successors.internal_delete_built_successor(*(op->r));\n        __TBB_store_with_release(op->status, SUCCEEDED);\n    }\n\n    virtual void internal_add_built_pred(buffer_operation *op) {\n        my_built_predecessors.add_edge(*(op->p));\n        __TBB_store_with_release(op->status, SUCCEEDED);\n    }\n\n    virtual void internal_del_built_pred(buffer_operation *op) {\n        my_built_predecessors.delete_edge(*(op->p));\n        __TBB_store_with_release(op->status, SUCCEEDED);\n    }\n\n    virtual void internal_succ_cnt(buffer_operation *op) {\n        op->cnt_val = my_successors.successor_count();\n        __TBB_store_with_release(op->status, SUCCEEDED);\n    }\n\n    virtual void internal_pred_cnt(buffer_operation *op) {\n        op->cnt_val = my_built_predecessors.edge_count();\n        __TBB_store_with_release(op->status, SUCCEEDED);\n    }\n\n    virtual void internal_copy_succs(buffer_operation *op) {\n        my_successors.copy_successors(*(op->svec));\n        __TBB_store_with_release(op->status, SUCCEEDED);\n    }\n\n    virtual void internal_copy_preds(buffer_operation *op) {\n        my_built_predecessors.copy_edges(*(op->pvec));\n        __TBB_store_with_release(op->status, SUCCEEDED);\n    }\n#endif  /* TBB_PREVIEW_FLOW_GRAPH_FEATURES */\n\n    //! Tries to forward valid items to successors\n    virtual void internal_forward_task(buffer_operation *op) {\n        if (this->my_reserved || !this->my_item_valid(this->my_tail-1)) {\n            __TBB_store_with_release(op->status, FAILED);\n            this->forwarder_busy = false;\n            return;\n        }\n        T i_copy;\n        task * last_task = NULL;\n        size_type counter = my_successors.size();\n        // Try forwarding, giving each successor a chance\n        while (counter>0 && !this->buffer_empty() && this->my_item_valid(this->my_tail-1)) {\n            this->copy_back(i_copy);\n            task *new_task = my_successors.try_put_task(i_copy);\n            if(new_task) {\n                last_task = combine_tasks(last_task, new_task);\n                this->destroy_back();\n            }\n            --counter;\n        }\n        op->ltask = last_task;  // return task\n        if (last_task && !counter) {\n            __TBB_store_with_release(op->status, SUCCEEDED);\n        }\n        else {\n            __TBB_store_with_release(op->status, FAILED);\n            forwarder_busy = false;\n        }\n    }\n\n    virtual void internal_push(buffer_operation *op) {\n        this->push_back(*(op->elem));\n        __TBB_store_with_release(op->status, SUCCEEDED);\n    }\n\n    virtual void internal_pop(buffer_operation *op) {\n        if(this->pop_back(*(op->elem))) {\n            __TBB_store_with_release(op->status, SUCCEEDED);\n        }\n        else {\n            __TBB_store_with_release(op->status, FAILED);\n        }\n    }\n\n    virtual void internal_reserve(buffer_operation *op) {\n        if(this->reserve_front(*(op->elem))) {\n            __TBB_store_with_release(op->status, SUCCEEDED);\n        }\n        else {\n            __TBB_store_with_release(op->status, FAILED);\n        }\n    }\n\n    virtual void internal_consume(buffer_operation *op) {\n        this->consume_front();\n        __TBB_store_with_release(op->status, SUCCEEDED);\n    }\n\n    virtual void internal_release(buffer_operation *op) {\n        this->release_front();\n        __TBB_store_with_release(op->status, SUCCEEDED);\n    }\n\npublic:\n    //! Constructor\n    buffer_node( graph &g ) : graph_node(g), internal::reservable_item_buffer<T>(),\n        forwarder_busy(false) {\n        my_successors.set_owner(this);\n        my_aggregator.initialize_handler(my_handler(this));\n        tbb::internal::fgt_node( tbb::internal::FLOW_BUFFER_NODE, &this->my_graph,\n                                 static_cast<receiver<input_type> *>(this), static_cast<sender<output_type> *>(this) );\n    }\n\n    //! Copy constructor\n    buffer_node( const buffer_node& src ) : graph_node(src.my_graph),\n        internal::reservable_item_buffer<T>(), receiver<T>(), sender<T>() {\n        forwarder_busy = false;\n        my_successors.set_owner(this);\n        my_aggregator.initialize_handler(my_handler(this));\n        tbb::internal::fgt_node( tbb::internal::FLOW_BUFFER_NODE, &this->my_graph,\n                                 static_cast<receiver<input_type> *>(this), static_cast<sender<output_type> *>(this) );\n    }\n\n    virtual ~buffer_node() {}\n\n#if TBB_PREVIEW_FLOW_GRAPH_TRACE\n    /* override */ void set_name( const char *name ) {\n        tbb::internal::fgt_node_desc( this, name );\n    }\n#endif\n\n    //\n    // message sender implementation\n    //\n\n    //! Adds a new successor.\n    /** Adds successor r to the list of successors; may forward tasks.  */\n    /* override */ bool register_successor( successor_type &r ) {\n        buffer_operation op_data(reg_succ);\n        op_data.r = &r;\n        my_aggregator.execute(&op_data);\n        (void)enqueue_forwarding_task(op_data);\n        return true;\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n    /*override*/ void internal_add_built_successor( successor_type &r) {\n        buffer_operation op_data(add_blt_succ);\n        op_data.r = &r;\n        my_aggregator.execute(&op_data);\n    }\n\n    /*override*/ void internal_delete_built_successor( successor_type &r) {\n        buffer_operation op_data(del_blt_succ);\n        op_data.r = &r;\n        my_aggregator.execute(&op_data);\n    }\n\n    /*override*/ void internal_add_built_predecessor( predecessor_type &p) {\n        buffer_operation op_data(add_blt_pred);\n        op_data.p = &p;\n        my_aggregator.execute(&op_data);\n    }\n\n    /*override*/ void internal_delete_built_predecessor( predecessor_type &p) {\n        buffer_operation op_data(del_blt_pred);\n        op_data.p = &p;\n        my_aggregator.execute(&op_data);\n    }\n\n    /*override*/ size_t predecessor_count() {\n        buffer_operation op_data(blt_pred_cnt);\n        my_aggregator.execute(&op_data);\n        return op_data.cnt_val;\n    }\n\n    /*override*/ size_t successor_count() {\n        buffer_operation op_data(blt_succ_cnt);\n        my_aggregator.execute(&op_data);\n        return op_data.cnt_val;\n    }\n\n    /*override*/ void copy_predecessors( predecessor_vector_type &v ) {\n        buffer_operation op_data(blt_pred_cpy);\n        op_data.pvec = &v;\n        my_aggregator.execute(&op_data);\n    }\n\n    /*override*/ void copy_successors( successor_vector_type &v ) {\n        buffer_operation op_data(blt_succ_cpy);\n        op_data.svec = &v;\n        my_aggregator.execute(&op_data);\n    }\n#endif\n\n    //! Removes a successor.\n    /** Removes successor r from the list of successors.\n        It also calls r.remove_predecessor(*this) to remove this node as a predecessor. */\n    /* override */ bool remove_successor( successor_type &r ) {\n        r.remove_predecessor(*this);\n        buffer_operation op_data(rem_succ);\n        op_data.r = &r;\n        my_aggregator.execute(&op_data);\n        // even though this operation does not cause a forward, if we are the handler, and\n        // a forward is scheduled, we may be the first to reach this point after the aggregator,\n        // and so should check for the task.\n        (void)enqueue_forwarding_task(op_data);\n        return true;\n    }\n\n    //! Request an item from the buffer_node\n    /**  true = v contains the returned item<BR>\n         false = no item has been returned */\n    /* override */ bool try_get( T &v ) {\n        buffer_operation op_data(req_item);\n        op_data.elem = &v;\n        my_aggregator.execute(&op_data);\n        (void)enqueue_forwarding_task(op_data);\n        return (op_data.status==SUCCEEDED);\n    }\n\n    //! Reserves an item.\n    /**  false = no item can be reserved<BR>\n         true = an item is reserved */\n    /* override */ bool try_reserve( T &v ) {\n        buffer_operation op_data(res_item);\n        op_data.elem = &v;\n        my_aggregator.execute(&op_data);\n        (void)enqueue_forwarding_task(op_data);\n        return (op_data.status==SUCCEEDED);\n    }\n\n    //! Release a reserved item.\n    /**  true = item has been released and so remains in sender */\n    /* override */ bool try_release() {\n        buffer_operation op_data(rel_res);\n        my_aggregator.execute(&op_data);\n        (void)enqueue_forwarding_task(op_data);\n        return true;\n    }\n\n    //! Consumes a reserved item.\n    /** true = item is removed from sender and reservation removed */\n    /* override */ bool try_consume() {\n        buffer_operation op_data(con_res);\n        my_aggregator.execute(&op_data);\n        (void)enqueue_forwarding_task(op_data);\n        return true;\n    }\n\nprotected:\n\n    template< typename R, typename B > friend class run_and_put_task;\n    template<typename X, typename Y> friend class internal::broadcast_cache;\n    template<typename X, typename Y> friend class internal::round_robin_cache;\n    //! receive an item, return a task *if possible\n    /* override */ task *try_put_task(const T &t) {\n        buffer_operation op_data(t, put_item);\n        my_aggregator.execute(&op_data);\n        task *ft = grab_forwarding_task(op_data);\n        // sequencer_nodes can return failure (if an item has been previously inserted)\n        // We have to spawn the returned task if our own operation fails.\n\n        if(ft && op_data.status == FAILED) {\n            // we haven't succeeded queueing the item, but for some reason the\n            // call returned a task (if another request resulted in a successful\n            // forward this could happen.)  Queue the task and reset the pointer.\n            FLOW_SPAWN(*ft); ft = NULL;\n        }\n        else if(!ft && op_data.status == SUCCEEDED) {\n            ft = SUCCESSFULLY_ENQUEUED;\n        }\n        return ft;\n    }\n\n    /*override*/void reset( __TBB_PFG_RESET_ARG(reset_flags f)) {\n        internal::reservable_item_buffer<T, A>::reset();\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        my_successors.reset(f);\n        if (f&rf_extract) {\n            my_built_predecessors.receiver_extract(*this);\n        }\n#endif\n        forwarder_busy = false;\n    }\n\n    /*override*/void reset_receiver(__TBB_PFG_RESET_ARG(reset_flags /*f*/)) { }\n\n};  // buffer_node\n\n//! Forwards messages in FIFO order\ntemplate <typename T, typename A=cache_aligned_allocator<T> >\nclass queue_node : public buffer_node<T, A> {\nprotected:\n    typedef buffer_node<T, A> base_type;\n    typedef typename base_type::size_type size_type;\n    typedef typename base_type::buffer_operation queue_operation;\n\n    enum op_stat {WAIT=0, SUCCEEDED, FAILED};\n\n    /* override */ void internal_forward_task(queue_operation *op) {\n        if (this->my_reserved || !this->my_item_valid(this->my_head)) {\n            __TBB_store_with_release(op->status, FAILED);\n            this->forwarder_busy = false;\n            return;\n        }\n        T i_copy;\n        task *last_task = NULL;\n        size_type counter = this->my_successors.size();\n        // Keep trying to send items while there is at least one accepting successor\n        while (counter>0 && this->my_item_valid(this->my_head)) {\n            this->copy_front(i_copy);\n            task *new_task = this->my_successors.try_put_task(i_copy);\n            if(new_task) {\n                this->destroy_front();\n                last_task = combine_tasks(last_task, new_task);\n            }\n            --counter;\n        }\n        op->ltask = last_task;\n        if (last_task && !counter)\n            __TBB_store_with_release(op->status, SUCCEEDED);\n        else {\n            __TBB_store_with_release(op->status, FAILED);\n            this->forwarder_busy = false;\n        }\n    }\n\n    /* override */ void internal_pop(queue_operation *op) {\n        if ( this->my_reserved || !this->my_item_valid(this->my_head)){\n            __TBB_store_with_release(op->status, FAILED);\n        }\n        else {\n            this->pop_front(*(op->elem));\n            __TBB_store_with_release(op->status, SUCCEEDED);\n        }\n    }\n    /* override */ void internal_reserve(queue_operation *op) {\n        if (this->my_reserved || !this->my_item_valid(this->my_head)) {\n            __TBB_store_with_release(op->status, FAILED);\n        }\n        else {\n            this->reserve_front(*(op->elem));\n            __TBB_store_with_release(op->status, SUCCEEDED);\n        }\n    }\n    /* override */ void internal_consume(queue_operation *op) {\n        this->consume_front();\n        __TBB_store_with_release(op->status, SUCCEEDED);\n    }\n\npublic:\n    typedef T input_type;\n    typedef T output_type;\n    typedef sender< input_type > predecessor_type;\n    typedef receiver< output_type > successor_type;\n\n    //! Constructor\n    queue_node( graph &g ) : base_type(g) {\n        tbb::internal::fgt_node( tbb::internal::FLOW_QUEUE_NODE, &(this->my_graph),\n                                 static_cast<receiver<input_type> *>(this),\n                                 static_cast<sender<output_type> *>(this) );\n    }\n\n    //! Copy constructor\n    queue_node( const queue_node& src) : base_type(src) {\n        tbb::internal::fgt_node( tbb::internal::FLOW_QUEUE_NODE, &(this->my_graph),\n                                 static_cast<receiver<input_type> *>(this),\n                                 static_cast<sender<output_type> *>(this) );\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_TRACE\n    /* override */ void set_name( const char *name ) {\n        tbb::internal::fgt_node_desc( this, name );\n    }\n#endif\n\n    /*override*/void reset( __TBB_PFG_RESET_ARG(reset_flags f)) {\n        base_type::reset(__TBB_PFG_RESET_ARG(f));\n    }\n};  // queue_node\n\n//! Forwards messages in sequence order\ntemplate< typename T, typename A=cache_aligned_allocator<T> >\nclass sequencer_node : public queue_node<T, A> {\n    internal::function_body< T, size_t > *my_sequencer;\n    // my_sequencer should be a benign function and must be callable\n    // from a parallel context.  Does this mean it needn't be reset?\npublic:\n    typedef T input_type;\n    typedef T output_type;\n    typedef sender< input_type > predecessor_type;\n    typedef receiver< output_type > successor_type;\n\n    //! Constructor\n    template< typename Sequencer >\n    sequencer_node( graph &g, const Sequencer& s ) : queue_node<T, A>(g),\n        my_sequencer(new internal::function_body_leaf< T, size_t, Sequencer>(s) ) {\n        tbb::internal::fgt_node( tbb::internal::FLOW_SEQUENCER_NODE, &(this->my_graph),\n                                 static_cast<receiver<input_type> *>(this),\n                                 static_cast<sender<output_type> *>(this) );\n    }\n\n    //! Copy constructor\n    sequencer_node( const sequencer_node& src ) : queue_node<T, A>(src),\n        my_sequencer( src.my_sequencer->clone() ) {\n        tbb::internal::fgt_node( tbb::internal::FLOW_SEQUENCER_NODE, &(this->my_graph),\n                                 static_cast<receiver<input_type> *>(this),\n                                 static_cast<sender<output_type> *>(this) );\n    }\n\n    //! Destructor\n    ~sequencer_node() { delete my_sequencer; }\n\n#if TBB_PREVIEW_FLOW_GRAPH_TRACE\n    /* override */ void set_name( const char *name ) {\n        tbb::internal::fgt_node_desc( this, name );\n    }\n#endif\n\nprotected:\n    typedef typename buffer_node<T, A>::size_type size_type;\n    typedef typename buffer_node<T, A>::buffer_operation sequencer_operation;\n\n    enum op_stat {WAIT=0, SUCCEEDED, FAILED};\n\nprivate:\n    /* override */ void internal_push(sequencer_operation *op) {\n        size_type tag = (*my_sequencer)(*(op->elem));\n#if !TBB_DEPRECATED_SEQUENCER_DUPLICATES\n        if(tag < this->my_head) {\n            // have already emitted a message with this tag\n            __TBB_store_with_release(op->status, FAILED);\n            return;\n        }\n#endif\n        // cannot modify this->my_tail now; the buffer would be inconsistent.\n        size_t new_tail = (tag+1 > this->my_tail) ? tag+1 : this->my_tail;\n\n        if(this->size(new_tail) > this->capacity()) {\n            this->grow_my_array(this->size(new_tail));\n        }\n        this->my_tail = new_tail;\n        if(this->place_item(tag,*(op->elem))) {\n            __TBB_store_with_release(op->status, SUCCEEDED);\n        }\n        else {\n            // already have a message with this tag\n            __TBB_store_with_release(op->status, FAILED);\n        }\n    }\n};  // sequencer_node\n\n//! Forwards messages in priority order\ntemplate< typename T, typename Compare = std::less<T>, typename A=cache_aligned_allocator<T> >\nclass priority_queue_node : public buffer_node<T, A> {\npublic:\n    typedef T input_type;\n    typedef T output_type;\n    typedef buffer_node<T,A> base_type;\n    typedef sender< input_type > predecessor_type;\n    typedef receiver< output_type > successor_type;\n\n    //! Constructor\n    priority_queue_node( graph &g ) : buffer_node<T, A>(g), mark(0) {\n        tbb::internal::fgt_node( tbb::internal::FLOW_PRIORITY_QUEUE_NODE, &(this->my_graph),\n                                 static_cast<receiver<input_type> *>(this),\n                                 static_cast<sender<output_type> *>(this) );\n    }\n\n    //! Copy constructor\n    priority_queue_node( const priority_queue_node &src ) : buffer_node<T, A>(src), mark(0) {\n        tbb::internal::fgt_node( tbb::internal::FLOW_PRIORITY_QUEUE_NODE, &(this->my_graph),\n                                 static_cast<receiver<input_type> *>(this),\n                                 static_cast<sender<output_type> *>(this) );\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_TRACE\n    /* override */ void set_name( const char *name ) {\n        tbb::internal::fgt_node_desc( this, name );\n    }\n#endif\n\n\nprotected:\n\n    /*override*/void reset( __TBB_PFG_RESET_ARG(reset_flags f)) {\n        mark = 0;\n        base_type::reset(__TBB_PFG_RESET_ARG(f));\n    }\n\n    typedef typename buffer_node<T, A>::size_type size_type;\n    typedef typename buffer_node<T, A>::item_type item_type;\n    typedef typename buffer_node<T, A>::buffer_operation prio_operation;\n\n    enum op_stat {WAIT=0, SUCCEEDED, FAILED};\n\n    /* override */ void handle_operations(prio_operation *op_list) {\n        prio_operation *tmp = op_list /*, *pop_list*/ ;\n        bool try_forwarding=false;\n        while (op_list) {\n            tmp = op_list;\n            op_list = op_list->next;\n            switch (tmp->type) {\n            case buffer_node<T, A>::reg_succ: this->internal_reg_succ(tmp); try_forwarding = true; break;\n            case buffer_node<T, A>::rem_succ: this->internal_rem_succ(tmp); break;\n            case buffer_node<T, A>::put_item: internal_push(tmp); try_forwarding = true; break;\n            case buffer_node<T, A>::try_fwd_task: internal_forward_task(tmp); break;\n            case buffer_node<T, A>::rel_res: internal_release(tmp); try_forwarding = true; break;\n            case buffer_node<T, A>::con_res: internal_consume(tmp); try_forwarding = true; break;\n            case buffer_node<T, A>::req_item: internal_pop(tmp); break;\n            case buffer_node<T, A>::res_item: internal_reserve(tmp); break;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n            case buffer_node<T, A>::add_blt_succ: this->internal_add_built_succ(tmp); break;\n            case buffer_node<T, A>::del_blt_succ: this->internal_del_built_succ(tmp); break;\n            case buffer_node<T, A>::add_blt_pred: this->internal_add_built_pred(tmp); break;\n            case buffer_node<T, A>::del_blt_pred: this->internal_del_built_pred(tmp); break;\n            case buffer_node<T, A>::blt_succ_cnt: this->internal_succ_cnt(tmp); break;\n            case buffer_node<T, A>::blt_pred_cnt: this->internal_pred_cnt(tmp); break;\n            case buffer_node<T, A>::blt_succ_cpy: this->internal_copy_succs(tmp); break;\n            case buffer_node<T, A>::blt_pred_cpy: this->internal_copy_preds(tmp); break;\n#endif\n            }\n        }\n        // process pops!  for now, no special pop processing\n        if (mark<this->my_tail) heapify();\n        if (try_forwarding && !this->forwarder_busy) {\n            task* tp = this->my_graph.root_task();\n            if(tp) {\n                this->forwarder_busy = true;\n                task *new_task = new(task::allocate_additional_child_of(*tp)) internal::\n                        forward_task_bypass\n                        < buffer_node<input_type, A> >(*this);\n                // tmp should point to the last item handled by the aggregator.  This is the operation\n                // the handling thread enqueued.  So modifying that record will be okay.\n                tbb::task *tmp1 = tmp->ltask;\n                tmp->ltask = combine_tasks(tmp1, new_task);\n            }\n        }\n    }\n\n    //! Tries to forward valid items to successors\n    /* override */ void internal_forward_task(prio_operation *op) {\n        T i_copy;\n        task * last_task = NULL; // flagged when a successor accepts\n        size_type counter = this->my_successors.size();\n\n        if (this->my_reserved || this->my_tail == 0) {\n            __TBB_store_with_release(op->status, FAILED);\n            this->forwarder_busy = false;\n            return;\n        }\n        // Keep trying to send while there exists an accepting successor\n        while (counter>0 && this->my_tail > 0) {\n            i_copy = this->get_my_item(0);\n            task * new_task = this->my_successors.try_put_task(i_copy);\n            if ( new_task ) {\n                last_task = combine_tasks(last_task, new_task);\n                this->destroy_item(0);  // we've forwarded this item\n                if (mark == this->my_tail) --mark;\n                if(--(this->my_tail)) { // didn't consume last item on heap\n                    this->move_item(0,this->my_tail);\n                }\n                if (this->my_tail > 1) // don't reheap for heap of size 1\n                    reheap();\n            }\n            --counter;\n        }\n        op->ltask = last_task;\n        if (last_task && !counter)\n            __TBB_store_with_release(op->status, SUCCEEDED);\n        else {\n            __TBB_store_with_release(op->status, FAILED);\n            this->forwarder_busy = false;\n        }\n    }\n\n    /* override */ void internal_push(prio_operation *op) {\n        if ( this->my_tail >= this->my_array_size )\n            this->grow_my_array( this->my_tail + 1 );\n        (void) this->place_item(this->my_tail, *(op->elem));\n        ++(this->my_tail);\n        __TBB_store_with_release(op->status, SUCCEEDED);\n    }\n\n    /* override */ void internal_pop(prio_operation *op) {\n        // if empty or already reserved, don't pop\n        if ( this->my_reserved == true || this->my_tail == 0 ) {\n            __TBB_store_with_release(op->status, FAILED);\n            return;\n        }\n        if (mark<this->my_tail &&  // item pushed, no re-heap\n            compare(this->get_my_item(0),\n                    this->get_my_item(this->my_tail-1))) {\n            // there are newly pushed elems; last one higher than top\n            // copy the data\n            this->fetch_item(this->my_tail-1, *(op->elem));\n            __TBB_store_with_release(op->status, SUCCEEDED);\n            --(this->my_tail);\n            return;\n        }\n        // extract and push the last element down heap\n        *(op->elem) = this->get_my_item(0); // copy the data, item 0 still valid\n        __TBB_store_with_release(op->status, SUCCEEDED);\n        if (mark == this->my_tail) --mark;\n        __TBB_ASSERT(this->my_item_valid(this->my_tail - 1), NULL);\n        if(--(this->my_tail)) {\n            // there were two or more items in heap.  Move the\n            // last item to the top of the heap\n            this->set_my_item(0,this->get_my_item(this->my_tail));\n        }\n        this->destroy_item(this->my_tail);\n        if (this->my_tail > 1) // don't reheap for heap of size 1\n            reheap();\n    }\n\n    /* override */ void internal_reserve(prio_operation *op) {\n        if (this->my_reserved == true || this->my_tail == 0) {\n            __TBB_store_with_release(op->status, FAILED);\n            return;\n        }\n        this->my_reserved = true;\n        *(op->elem) = reserved_item = this->get_my_item(0);\n        if (mark == this->my_tail) --mark;\n        --(this->my_tail);\n        __TBB_store_with_release(op->status, SUCCEEDED);\n        this->set_my_item(0, this->get_my_item(this->my_tail));\n        this->destroy_item(this->my_tail);\n        if (this->my_tail > 1)\n            reheap();\n    }\n\n    /* override */ void internal_consume(prio_operation *op) {\n        this->my_reserved = false;\n        __TBB_store_with_release(op->status, SUCCEEDED);\n    }\n    /* override */ void internal_release(prio_operation *op) {\n        if (this->my_tail >= this->my_array_size)\n            this->grow_my_array( this->my_tail + 1 );\n        this->set_my_item(this->my_tail, reserved_item);\n        ++(this->my_tail);\n        this->my_reserved = false;\n        __TBB_store_with_release(op->status, SUCCEEDED);\n        heapify();\n    }\nprivate:\n    Compare compare;\n    size_type mark;\n    input_type reserved_item;\n\n    // turn array into heap\n    void heapify() {\n        if (!mark) mark = 1;\n        for (; mark<this->my_tail; ++mark) { // for each unheaped element\n            size_type cur_pos = mark;\n            input_type to_place;\n            this->fetch_item(mark,to_place);\n            do { // push to_place up the heap\n                size_type parent = (cur_pos-1)>>1;\n                if (!compare(this->get_my_item(parent), to_place))\n                    break;\n                this->move_item(cur_pos, parent);\n                cur_pos = parent;\n            } while( cur_pos );\n            (void) this->place_item(cur_pos, to_place);\n        }\n    }\n\n    // otherwise heapified array with new root element; rearrange to heap\n    void reheap() {\n        size_type cur_pos=0, child=1;\n        while (child < mark) {\n            size_type target = child;\n            if (child+1<mark &&\n                compare(this->get_my_item(child),\n                        this->get_my_item(child+1)))\n                ++target;\n            // target now has the higher priority child\n            if (compare(this->get_my_item(target),\n                        this->get_my_item(cur_pos)))\n                break;\n            // swap\n            this->swap_items(cur_pos, target);\n            cur_pos = target;\n            child = (cur_pos<<1)+1;\n        }\n    }\n};  // priority_queue_node\n\n//! Forwards messages only if the threshold has not been reached\n/** This node forwards items until its threshold is reached.\n    It contains no buffering.  If the downstream node rejects, the\n    message is dropped. */\ntemplate< typename T >\nclass limiter_node : public graph_node, public receiver< T >, public sender< T > {\nprotected:\n    using graph_node::my_graph;\npublic:\n    typedef T input_type;\n    typedef T output_type;\n    typedef sender< input_type > predecessor_type;\n    typedef receiver< output_type > successor_type;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n    typedef std::vector<successor_type *> successor_vector_type;\n    typedef std::vector<predecessor_type *> predecessor_vector_type;\n#endif\n\nprivate:\n    size_t my_threshold;\n    size_t my_count; //number of successful puts\n    size_t my_tries; //number of active put attempts\n    internal::reservable_predecessor_cache< T, spin_mutex > my_predecessors;\n    spin_mutex my_mutex;\n    internal::broadcast_cache< T > my_successors;\n    int init_decrement_predecessors;\n\n    friend class internal::forward_task_bypass< limiter_node<T> >;\n\n    // Let decrementer call decrement_counter()\n    friend class internal::decrementer< limiter_node<T> >;\n\n    bool check_conditions() {  // always called under lock\n        return ( my_count + my_tries < my_threshold && !my_predecessors.empty() && !my_successors.empty() );\n    }\n\n    // only returns a valid task pointer or NULL, never SUCCESSFULLY_ENQUEUED\n    task *forward_task() {\n        input_type v;\n        task *rval = NULL;\n        bool reserved = false;\n            {\n                spin_mutex::scoped_lock lock(my_mutex);\n                if ( check_conditions() )\n                    ++my_tries;\n                else\n                    return NULL;\n            }\n\n        //SUCCESS \n        // if we can reserve and can put, we consume the reservation \n        // we increment the count and decrement the tries\n        if ( (my_predecessors.try_reserve(v)) == true ){\n            reserved=true;\n            if ( (rval = my_successors.try_put_task(v)) != NULL ){\n                {\n                    spin_mutex::scoped_lock lock(my_mutex);\n                    ++my_count;\n                    --my_tries;\n                    my_predecessors.try_consume();\n                    if ( check_conditions() ) {\n                        task* tp = this->my_graph.root_task();\n                        if ( tp ) {\n                            task *rtask = new ( task::allocate_additional_child_of( *tp ) )\n                                internal::forward_task_bypass< limiter_node<T> >( *this );\n                            FLOW_SPAWN (*rtask);\n                        }\n                    }\n                }\n                return rval;\n            }\n        }\n        //FAILURE\n        //if we can't reserve, we decrement the tries\n        //if we can reserve but can't put, we decrement the tries and release the reservation\n        {\n            spin_mutex::scoped_lock lock(my_mutex);\n            --my_tries;\n            if (reserved) my_predecessors.try_release();\n            if ( check_conditions() ) {\n                task* tp = this->my_graph.root_task();\n                if ( tp ) {\n                    task *rtask = new ( task::allocate_additional_child_of( *tp ) )\n                        internal::forward_task_bypass< limiter_node<T> >( *this );\n                    __TBB_ASSERT(!rval, \"Have two tasks to handle\");\n                    return rtask;\n                }\n            }\n            return rval;\n        }\n    }\n\n    void forward() {\n        __TBB_ASSERT(false, \"Should never be called\");\n        return;\n    }\n\n    task * decrement_counter() {\n        {\n            spin_mutex::scoped_lock lock(my_mutex);\n            if(my_count) --my_count;\n        }\n        return forward_task();\n    }\n\npublic:\n    //! The internal receiver< continue_msg > that decrements the count\n    internal::decrementer< limiter_node<T> > decrement;\n\n    //! Constructor\n    limiter_node(graph &g, size_t threshold, int num_decrement_predecessors=0) :\n        graph_node(g), my_threshold(threshold), my_count(0), my_tries(0),\n        init_decrement_predecessors(num_decrement_predecessors),\n        decrement(num_decrement_predecessors)\n    {\n        my_predecessors.set_owner(this);\n        my_successors.set_owner(this);\n        decrement.set_owner(this);\n        tbb::internal::fgt_node( tbb::internal::FLOW_LIMITER_NODE, &this->my_graph,\n                                 static_cast<receiver<input_type> *>(this), static_cast<receiver<continue_msg> *>(&decrement),\n                                 static_cast<sender<output_type> *>(this) );\n    }\n\n    //! Copy constructor\n    limiter_node( const limiter_node& src ) :\n        graph_node(src.my_graph), receiver<T>(), sender<T>(),\n        my_threshold(src.my_threshold), my_count(0), my_tries(0),\n        init_decrement_predecessors(src.init_decrement_predecessors),\n        decrement(src.init_decrement_predecessors)\n    {\n        my_predecessors.set_owner(this);\n        my_successors.set_owner(this);\n        decrement.set_owner(this);\n        tbb::internal::fgt_node( tbb::internal::FLOW_LIMITER_NODE, &this->my_graph,\n                                 static_cast<receiver<input_type> *>(this), static_cast<receiver<continue_msg> *>(&decrement),\n                                 static_cast<sender<output_type> *>(this) );\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_TRACE\n    /* override */ void set_name( const char *name ) {\n        tbb::internal::fgt_node_desc( this, name );\n    }\n#endif\n\n    //! Replace the current successor with this new successor\n    /* override */ bool register_successor( receiver<output_type> &r ) {\n        spin_mutex::scoped_lock lock(my_mutex);\n        bool was_empty = my_successors.empty();\n        my_successors.register_successor(r);\n        //spawn a forward task if this is the only successor\n        if ( was_empty && !my_predecessors.empty() && my_count + my_tries < my_threshold ) {\n            task* tp = this->my_graph.root_task();\n            if ( tp ) {\n                FLOW_SPAWN( (* new ( task::allocate_additional_child_of( *tp ) )\n                            internal::forward_task_bypass < limiter_node<T> >( *this ) ) );\n            }\n        }\n        return true;\n    }\n\n    //! Removes a successor from this node\n    /** r.remove_predecessor(*this) is also called. */\n    /* override */ bool remove_successor( receiver<output_type> &r ) {\n        r.remove_predecessor(*this);\n        my_successors.remove_successor(r);\n        return true;\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n    /*override*/void internal_add_built_successor(receiver<output_type> &src) {\n        my_successors.internal_add_built_successor(src);\n    }\n\n    /*override*/void internal_delete_built_successor(receiver<output_type> &src) {\n        my_successors.internal_delete_built_successor(src);\n    }\n\n    /*override*/size_t successor_count() { return my_successors.successor_count(); }\n\n    /*override*/ void copy_successors(successor_vector_type &v) {\n        my_successors.copy_successors(v);\n    }\n\n    /*override*/void internal_add_built_predecessor(sender<output_type> &src) {\n        my_predecessors.internal_add_built_predecessor(src);\n    }\n\n    /*override*/void internal_delete_built_predecessor(sender<output_type> &src) {\n        my_predecessors.internal_delete_built_predecessor(src);\n    }\n\n    /*override*/size_t predecessor_count() { return my_predecessors.predecessor_count(); }\n\n    /*override*/ void copy_predecessors(predecessor_vector_type &v) {\n        my_predecessors.copy_predecessors(v);\n    }\n#endif  /* TBB_PREVIEW_FLOW_GRAPH_FEATURES */\n\n    //! Adds src to the list of cached predecessors.\n    /* override */ bool register_predecessor( predecessor_type &src ) {\n        spin_mutex::scoped_lock lock(my_mutex);\n        my_predecessors.add( src );\n        task* tp = this->my_graph.root_task();\n        if ( my_count + my_tries < my_threshold && !my_successors.empty() && tp ) {\n            FLOW_SPAWN( (* new ( task::allocate_additional_child_of( *tp ) )\n                        internal::forward_task_bypass < limiter_node<T> >( *this ) ) );\n        }\n        return true;\n    }\n\n    //! Removes src from the list of cached predecessors.\n    /* override */ bool remove_predecessor( predecessor_type &src ) {\n        my_predecessors.remove( src );\n        return true;\n    }\n\nprotected:\n\n    template< typename R, typename B > friend class run_and_put_task;\n    template<typename X, typename Y> friend class internal::broadcast_cache;\n    template<typename X, typename Y> friend class internal::round_robin_cache;\n    //! Puts an item to this receiver\n    /* override */ task *try_put_task( const T &t ) {\n        {\n            spin_mutex::scoped_lock lock(my_mutex);\n            if ( my_count + my_tries >= my_threshold )\n                return NULL;\n            else\n                ++my_tries;\n        }\n\n        task * rtask = my_successors.try_put_task(t);\n\n        if ( !rtask ) {  // try_put_task failed.\n            spin_mutex::scoped_lock lock(my_mutex);\n            --my_tries;\n            task* tp = this->my_graph.root_task();\n            if ( check_conditions() && tp ) {\n                rtask = new ( task::allocate_additional_child_of( *tp ) )\n                    internal::forward_task_bypass< limiter_node<T> >( *this );\n            }\n        }\n        else {\n            spin_mutex::scoped_lock lock(my_mutex);\n            ++my_count;\n            --my_tries;\n             }\n        return rtask;\n    }\n\n    /*override*/void reset( __TBB_PFG_RESET_ARG(reset_flags f)) {\n        my_count = 0;\n        my_predecessors.reset(__TBB_PFG_RESET_ARG(f));\n        decrement.reset_receiver(__TBB_PFG_RESET_ARG(f));\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        my_successors.reset(f);\n#endif\n    }\n\n    /*override*/void reset_receiver(__TBB_PFG_RESET_ARG(reset_flags f)) { my_predecessors.reset(__TBB_PFG_RESET_ARG(f)); }\n};  // limiter_node\n\n#include \"internal/_flow_graph_join_impl.h\"\n\nusing internal::reserving_port;\nusing internal::queueing_port;\nusing internal::tag_matching_port;\nusing internal::input_port;\nusing internal::tag_value;\nusing internal::NO_TAG;\n\ntemplate<typename OutputTuple, graph_buffer_policy JP=queueing> class join_node;\n\ntemplate<typename OutputTuple>\nclass join_node<OutputTuple,reserving>: public internal::unfolded_join_node<tbb::flow::tuple_size<OutputTuple>::value, reserving_port, OutputTuple, reserving> {\nprivate:\n    static const int N = tbb::flow::tuple_size<OutputTuple>::value;\n    typedef typename internal::unfolded_join_node<N, reserving_port, OutputTuple, reserving> unfolded_type;\npublic:\n    typedef OutputTuple output_type;\n    typedef typename unfolded_type::input_ports_type input_ports_type;\n    join_node(graph &g) : unfolded_type(g) {\n        tbb::internal::fgt_multiinput_node<OutputTuple,N>( tbb::internal::FLOW_JOIN_NODE_RESERVING, &this->my_graph,\n                                            this->input_ports(), static_cast< sender< output_type > *>(this) );\n    }\n    join_node(const join_node &other) : unfolded_type(other) {\n        tbb::internal::fgt_multiinput_node<OutputTuple,N>( tbb::internal::FLOW_JOIN_NODE_RESERVING, &this->my_graph,\n                                            this->input_ports(), static_cast< sender< output_type > *>(this) );\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_TRACE\n    /* override */ void set_name( const char *name ) {\n        tbb::internal::fgt_node_desc( this, name );\n    }\n#endif\n\n};\n\ntemplate<typename OutputTuple>\nclass join_node<OutputTuple,queueing>: public internal::unfolded_join_node<tbb::flow::tuple_size<OutputTuple>::value, queueing_port, OutputTuple, queueing> {\nprivate:\n    static const int N = tbb::flow::tuple_size<OutputTuple>::value;\n    typedef typename internal::unfolded_join_node<N, queueing_port, OutputTuple, queueing> unfolded_type;\npublic:\n    typedef OutputTuple output_type;\n    typedef typename unfolded_type::input_ports_type input_ports_type;\n    join_node(graph &g) : unfolded_type(g) {\n        tbb::internal::fgt_multiinput_node<OutputTuple,N>( tbb::internal::FLOW_JOIN_NODE_QUEUEING, &this->my_graph,\n                                            this->input_ports(), static_cast< sender< output_type > *>(this) );\n    }\n    join_node(const join_node &other) : unfolded_type(other) {\n        tbb::internal::fgt_multiinput_node<OutputTuple,N>( tbb::internal::FLOW_JOIN_NODE_QUEUEING, &this->my_graph,\n                                            this->input_ports(), static_cast< sender< output_type > *>(this) );\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_TRACE\n    /* override */ void set_name( const char *name ) {\n        tbb::internal::fgt_node_desc( this, name );\n    }\n#endif\n\n};\n\n// template for tag_matching join_node\ntemplate<typename OutputTuple>\nclass join_node<OutputTuple, tag_matching> : public internal::unfolded_join_node<tbb::flow::tuple_size<OutputTuple>::value,\n      tag_matching_port, OutputTuple, tag_matching> {\nprivate:\n    static const int N = tbb::flow::tuple_size<OutputTuple>::value;\n    typedef typename internal::unfolded_join_node<N, tag_matching_port, OutputTuple, tag_matching> unfolded_type;\npublic:\n    typedef OutputTuple output_type;\n    typedef typename unfolded_type::input_ports_type input_ports_type;\n\n    template<typename __TBB_B0, typename __TBB_B1>\n    join_node(graph &g, __TBB_B0 b0, __TBB_B1 b1) : unfolded_type(g, b0, b1) {\n        tbb::internal::fgt_multiinput_node<OutputTuple,N>( tbb::internal::FLOW_JOIN_NODE_TAG_MATCHING, &this->my_graph,\n                                                           this->input_ports(), static_cast< sender< output_type > *>(this) );\n    }\n    template<typename __TBB_B0, typename __TBB_B1, typename __TBB_B2>\n    join_node(graph &g, __TBB_B0 b0, __TBB_B1 b1, __TBB_B2 b2) : unfolded_type(g, b0, b1, b2) {\n        tbb::internal::fgt_multiinput_node<OutputTuple,N>( tbb::internal::FLOW_JOIN_NODE_TAG_MATCHING, &this->my_graph,\n                                                           this->input_ports(), static_cast< sender< output_type > *>(this) );\n    }\n    template<typename __TBB_B0, typename __TBB_B1, typename __TBB_B2, typename __TBB_B3>\n    join_node(graph &g, __TBB_B0 b0, __TBB_B1 b1, __TBB_B2 b2, __TBB_B3 b3) : unfolded_type(g, b0, b1, b2, b3) {\n        tbb::internal::fgt_multiinput_node<OutputTuple,N>( tbb::internal::FLOW_JOIN_NODE_TAG_MATCHING, &this->my_graph,\n                                                           this->input_ports(), static_cast< sender< output_type > *>(this) );\n    }\n    template<typename __TBB_B0, typename __TBB_B1, typename __TBB_B2, typename __TBB_B3, typename __TBB_B4>\n    join_node(graph &g, __TBB_B0 b0, __TBB_B1 b1, __TBB_B2 b2, __TBB_B3 b3, __TBB_B4 b4) :\n            unfolded_type(g, b0, b1, b2, b3, b4) {\n        tbb::internal::fgt_multiinput_node<OutputTuple,N>( tbb::internal::FLOW_JOIN_NODE_TAG_MATCHING, &this->my_graph,\n                                                           this->input_ports(), static_cast< sender< output_type > *>(this) );\n    }\n#if __TBB_VARIADIC_MAX >= 6\n    template<typename __TBB_B0, typename __TBB_B1, typename __TBB_B2, typename __TBB_B3, typename __TBB_B4,\n        typename __TBB_B5>\n    join_node(graph &g, __TBB_B0 b0, __TBB_B1 b1, __TBB_B2 b2, __TBB_B3 b3, __TBB_B4 b4, __TBB_B5 b5) :\n            unfolded_type(g, b0, b1, b2, b3, b4, b5) {\n        tbb::internal::fgt_multiinput_node<OutputTuple,N>( tbb::internal::FLOW_JOIN_NODE_TAG_MATCHING, &this->my_graph,\n                                                           this->input_ports(), static_cast< sender< output_type > *>(this) );\n    }\n#endif\n#if __TBB_VARIADIC_MAX >= 7\n    template<typename __TBB_B0, typename __TBB_B1, typename __TBB_B2, typename __TBB_B3, typename __TBB_B4,\n        typename __TBB_B5, typename __TBB_B6>\n    join_node(graph &g, __TBB_B0 b0, __TBB_B1 b1, __TBB_B2 b2, __TBB_B3 b3, __TBB_B4 b4, __TBB_B5 b5, __TBB_B6 b6) :\n            unfolded_type(g, b0, b1, b2, b3, b4, b5, b6) {\n        tbb::internal::fgt_multiinput_node<OutputTuple,N>( tbb::internal::FLOW_JOIN_NODE_TAG_MATCHING, &this->my_graph,\n                                                           this->input_ports(), static_cast< sender< output_type > *>(this) );\n    }\n#endif\n#if __TBB_VARIADIC_MAX >= 8\n    template<typename __TBB_B0, typename __TBB_B1, typename __TBB_B2, typename __TBB_B3, typename __TBB_B4,\n        typename __TBB_B5, typename __TBB_B6, typename __TBB_B7>\n    join_node(graph &g, __TBB_B0 b0, __TBB_B1 b1, __TBB_B2 b2, __TBB_B3 b3, __TBB_B4 b4, __TBB_B5 b5, __TBB_B6 b6,\n            __TBB_B7 b7) : unfolded_type(g, b0, b1, b2, b3, b4, b5, b6, b7) {\n        tbb::internal::fgt_multiinput_node<OutputTuple,N>( tbb::internal::FLOW_JOIN_NODE_TAG_MATCHING, &this->my_graph,\n                                                           this->input_ports(), static_cast< sender< output_type > *>(this) );\n    }\n#endif\n#if __TBB_VARIADIC_MAX >= 9\n    template<typename __TBB_B0, typename __TBB_B1, typename __TBB_B2, typename __TBB_B3, typename __TBB_B4,\n        typename __TBB_B5, typename __TBB_B6, typename __TBB_B7, typename __TBB_B8>\n    join_node(graph &g, __TBB_B0 b0, __TBB_B1 b1, __TBB_B2 b2, __TBB_B3 b3, __TBB_B4 b4, __TBB_B5 b5, __TBB_B6 b6,\n            __TBB_B7 b7, __TBB_B8 b8) : unfolded_type(g, b0, b1, b2, b3, b4, b5, b6, b7, b8) {\n        tbb::internal::fgt_multiinput_node<OutputTuple,N>( tbb::internal::FLOW_JOIN_NODE_TAG_MATCHING, &this->my_graph,\n                                                           this->input_ports(), static_cast< sender< output_type > *>(this) );\n    }\n#endif\n#if __TBB_VARIADIC_MAX >= 10\n    template<typename __TBB_B0, typename __TBB_B1, typename __TBB_B2, typename __TBB_B3, typename __TBB_B4,\n        typename __TBB_B5, typename __TBB_B6, typename __TBB_B7, typename __TBB_B8, typename __TBB_B9>\n    join_node(graph &g, __TBB_B0 b0, __TBB_B1 b1, __TBB_B2 b2, __TBB_B3 b3, __TBB_B4 b4, __TBB_B5 b5, __TBB_B6 b6,\n            __TBB_B7 b7, __TBB_B8 b8, __TBB_B9 b9) : unfolded_type(g, b0, b1, b2, b3, b4, b5, b6, b7, b8, b9) {\n        tbb::internal::fgt_multiinput_node<OutputTuple,N>( tbb::internal::FLOW_JOIN_NODE_TAG_MATCHING, &this->my_graph,\n                                                           this->input_ports(), static_cast< sender< output_type > *>(this) );\n    }\n#endif\n    join_node(const join_node &other) : unfolded_type(other) {\n        tbb::internal::fgt_multiinput_node<OutputTuple,N>( tbb::internal::FLOW_JOIN_NODE_TAG_MATCHING, &this->my_graph,\n                                                           this->input_ports(), static_cast< sender< output_type > *>(this) );\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_TRACE\n    /* override */ void set_name( const char *name ) {\n        tbb::internal::fgt_node_desc( this, name );\n    }\n#endif\n\n};\n\n// indexer node\n#include \"internal/_flow_graph_indexer_impl.h\"\n\nstruct indexer_null_type {};\n\ntemplate<typename T0, typename T1=indexer_null_type, typename T2=indexer_null_type, typename T3=indexer_null_type,\n                      typename T4=indexer_null_type, typename T5=indexer_null_type, typename T6=indexer_null_type,\n                      typename T7=indexer_null_type, typename T8=indexer_null_type, typename T9=indexer_null_type> class indexer_node;\n\n//indexer node specializations\ntemplate<typename T0>\nclass indexer_node<T0> : public internal::unfolded_indexer_node<tuple<T0> > {\nprivate:\n    static const int N = 1;\npublic:\n    typedef tuple<T0> InputTuple;\n    typedef typename internal::tagged_msg<size_t, T0> output_type;\n    typedef typename internal::unfolded_indexer_node<InputTuple> unfolded_type;\n    indexer_node(graph& g) : unfolded_type(g) {\n        tbb::internal::fgt_multiinput_node<InputTuple,N>( tbb::internal::FLOW_INDEXER_NODE, &this->my_graph,\n                                           this->input_ports(), static_cast< sender< output_type > *>(this) );\n    }\n    // Copy constructor\n    indexer_node( const indexer_node& other ) : unfolded_type(other) {\n        tbb::internal::fgt_multiinput_node<InputTuple,N>( tbb::internal::FLOW_INDEXER_NODE, &this->my_graph,\n                                           this->input_ports(), static_cast< sender< output_type > *>(this) );\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_TRACE\n     void set_name( const char *name ) {\n        tbb::internal::fgt_node_desc( this, name );\n    }\n#endif\n};\n\ntemplate<typename T0, typename T1>\nclass indexer_node<T0, T1> : public internal::unfolded_indexer_node<tuple<T0, T1> > {\nprivate:\n    static const int N = 2;\npublic:\n    typedef tuple<T0, T1> InputTuple;\n    typedef typename internal::tagged_msg<size_t, T0, T1> output_type;\n    typedef typename internal::unfolded_indexer_node<InputTuple> unfolded_type;\n    indexer_node(graph& g) : unfolded_type(g) {\n        tbb::internal::fgt_multiinput_node<InputTuple,N>( tbb::internal::FLOW_INDEXER_NODE, &this->my_graph,\n                                           this->input_ports(), static_cast< sender< output_type > *>(this) );\n    }\n    // Copy constructor\n    indexer_node( const indexer_node& other ) : unfolded_type(other) {\n        tbb::internal::fgt_multiinput_node<InputTuple,N>( tbb::internal::FLOW_INDEXER_NODE, &this->my_graph,\n                                           this->input_ports(), static_cast< sender< output_type > *>(this) );\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_TRACE\n     void set_name( const char *name ) {\n        tbb::internal::fgt_node_desc( this, name );\n    }\n#endif\n};\n\ntemplate<typename T0, typename T1, typename T2>\nclass indexer_node<T0, T1, T2> : public internal::unfolded_indexer_node<tuple<T0, T1, T2> > {\nprivate:\n    static const int N = 3;\npublic:\n    typedef tuple<T0, T1, T2> InputTuple;\n    typedef typename internal::tagged_msg<size_t, T0, T1, T2> output_type;\n    typedef typename internal::unfolded_indexer_node<InputTuple> unfolded_type;\n    indexer_node(graph& g) : unfolded_type(g) {\n        tbb::internal::fgt_multiinput_node<InputTuple,N>( tbb::internal::FLOW_INDEXER_NODE, &this->my_graph,\n                                           this->input_ports(), static_cast< sender< output_type > *>(this) );\n    }\n    // Copy constructor\n    indexer_node( const indexer_node& other ) : unfolded_type(other) {\n        tbb::internal::fgt_multiinput_node<InputTuple,N>( tbb::internal::FLOW_INDEXER_NODE, &this->my_graph,\n                                           this->input_ports(), static_cast< sender< output_type > *>(this) );\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_TRACE\n        void set_name( const char *name ) {\n        tbb::internal::fgt_node_desc( this, name );\n    }\n#endif\n};\n\ntemplate<typename T0, typename T1, typename T2, typename T3>\nclass indexer_node<T0, T1, T2, T3> : public internal::unfolded_indexer_node<tuple<T0, T1, T2, T3> > {\nprivate:\n    static const int N = 4;\npublic:\n    typedef tuple<T0, T1, T2, T3> InputTuple;\n    typedef typename internal::tagged_msg<size_t, T0, T1, T2, T3> output_type;\n    typedef typename internal::unfolded_indexer_node<InputTuple> unfolded_type;\n    indexer_node(graph& g) : unfolded_type(g) {\n        tbb::internal::fgt_multiinput_node<InputTuple,N>( tbb::internal::FLOW_INDEXER_NODE, &this->my_graph,\n                                           this->input_ports(), static_cast< sender< output_type > *>(this) );\n    }\n    // Copy constructor\n    indexer_node( const indexer_node& other ) : unfolded_type(other) {\n        tbb::internal::fgt_multiinput_node<InputTuple,N>( tbb::internal::FLOW_INDEXER_NODE, &this->my_graph,\n                                           this->input_ports(), static_cast< sender< output_type > *>(this) );\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_TRACE\n    /* override */ void set_name( const char *name ) {\n        tbb::internal::fgt_node_desc( this, name );\n    }\n#endif\n};\n\ntemplate<typename T0, typename T1, typename T2, typename T3, typename T4>\nclass indexer_node<T0, T1, T2, T3, T4> : public internal::unfolded_indexer_node<tuple<T0, T1, T2, T3, T4> > {\nprivate:\n    static const int N = 5;\npublic:\n    typedef tuple<T0, T1, T2, T3, T4> InputTuple;\n    typedef typename internal::tagged_msg<size_t, T0, T1, T2, T3, T4> output_type;\n    typedef typename internal::unfolded_indexer_node<InputTuple> unfolded_type;\n    indexer_node(graph& g) : unfolded_type(g) {\n        tbb::internal::fgt_multiinput_node<InputTuple,N>( tbb::internal::FLOW_INDEXER_NODE, &this->my_graph,\n                                           this->input_ports(), static_cast< sender< output_type > *>(this) );\n    }\n    // Copy constructor\n    indexer_node( const indexer_node& other ) : unfolded_type(other) {\n        tbb::internal::fgt_multiinput_node<InputTuple,N>( tbb::internal::FLOW_INDEXER_NODE, &this->my_graph,\n                                           this->input_ports(), static_cast< sender< output_type > *>(this) );\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_TRACE\n    /* override */ void set_name( const char *name ) {\n        tbb::internal::fgt_node_desc( this, name );\n    }\n#endif\n};\n\n#if __TBB_VARIADIC_MAX >= 6\ntemplate<typename T0, typename T1, typename T2, typename T3, typename T4, typename T5>\nclass indexer_node<T0, T1, T2, T3, T4, T5> : public internal::unfolded_indexer_node<tuple<T0, T1, T2, T3, T4, T5> > {\nprivate:\n    static const int N = 6;\npublic:\n    typedef tuple<T0, T1, T2, T3, T4, T5> InputTuple;\n    typedef typename internal::tagged_msg<size_t, T0, T1, T2, T3, T4, T5> output_type;\n    typedef typename internal::unfolded_indexer_node<InputTuple> unfolded_type;\n    indexer_node(graph& g) : unfolded_type(g) {\n        tbb::internal::fgt_multiinput_node<InputTuple,N>( tbb::internal::FLOW_INDEXER_NODE, &this->my_graph,\n                                           this->input_ports(), static_cast< sender< output_type > *>(this) );\n    }\n    // Copy constructor\n    indexer_node( const indexer_node& other ) : unfolded_type(other) {\n        tbb::internal::fgt_multiinput_node<InputTuple,N>( tbb::internal::FLOW_INDEXER_NODE, &this->my_graph,\n                                           this->input_ports(), static_cast< sender< output_type > *>(this) );\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_TRACE\n    /* override */ void set_name( const char *name ) {\n        tbb::internal::fgt_node_desc( this, name );\n    }\n#endif\n};\n#endif //variadic max 6\n\n#if __TBB_VARIADIC_MAX >= 7\ntemplate<typename T0, typename T1, typename T2, typename T3, typename T4, typename T5,\n         typename T6>\nclass indexer_node<T0, T1, T2, T3, T4, T5, T6> : public internal::unfolded_indexer_node<tuple<T0, T1, T2, T3, T4, T5, T6> > {\nprivate:\n    static const int N = 7;\npublic:\n    typedef tuple<T0, T1, T2, T3, T4, T5, T6> InputTuple;\n    typedef typename internal::tagged_msg<size_t, T0, T1, T2, T3, T4, T5, T6> output_type;\n    typedef typename internal::unfolded_indexer_node<InputTuple> unfolded_type;\n    indexer_node(graph& g) : unfolded_type(g) {\n        tbb::internal::fgt_multiinput_node<InputTuple,N>( tbb::internal::FLOW_INDEXER_NODE, &this->my_graph,\n                                           this->input_ports(), static_cast< sender< output_type > *>(this) );\n    }\n    // Copy constructor\n    indexer_node( const indexer_node& other ) : unfolded_type(other) {\n        tbb::internal::fgt_multiinput_node<InputTuple,N>( tbb::internal::FLOW_INDEXER_NODE, &this->my_graph,\n                                           this->input_ports(), static_cast< sender< output_type > *>(this) );\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_TRACE\n    /* override */ void set_name( const char *name ) {\n        tbb::internal::fgt_node_desc( this, name );\n    }\n#endif\n};\n#endif //variadic max 7\n\n#if __TBB_VARIADIC_MAX >= 8\ntemplate<typename T0, typename T1, typename T2, typename T3, typename T4, typename T5,\n         typename T6, typename T7>\nclass indexer_node<T0, T1, T2, T3, T4, T5, T6, T7> : public internal::unfolded_indexer_node<tuple<T0, T1, T2, T3, T4, T5, T6, T7> > {\nprivate:\n    static const int N = 8;\npublic:\n    typedef tuple<T0, T1, T2, T3, T4, T5, T6, T7> InputTuple;\n    typedef typename internal::tagged_msg<size_t, T0, T1, T2, T3, T4, T5, T6, T7> output_type;\n    typedef typename internal::unfolded_indexer_node<InputTuple> unfolded_type;\n    indexer_node(graph& g) : unfolded_type(g) {\n        tbb::internal::fgt_multiinput_node<InputTuple,N>( tbb::internal::FLOW_INDEXER_NODE, &this->my_graph,\n                                           this->input_ports(), static_cast< sender< output_type > *>(this) );\n    }\n    // Copy constructor\n    indexer_node( const indexer_node& other ) : unfolded_type(other) {\n        tbb::internal::fgt_multiinput_node<InputTuple,N>( tbb::internal::FLOW_INDEXER_NODE, &this->my_graph,\n                                           this->input_ports(), static_cast< sender< output_type > *>(this) );\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_TRACE\n    /* override */ void set_name( const char *name ) {\n        tbb::internal::fgt_node_desc( this, name );\n    }\n#endif\n};\n#endif //variadic max 8\n\n#if __TBB_VARIADIC_MAX >= 9\ntemplate<typename T0, typename T1, typename T2, typename T3, typename T4, typename T5,\n         typename T6, typename T7, typename T8>\nclass indexer_node<T0, T1, T2, T3, T4, T5, T6, T7, T8> : public internal::unfolded_indexer_node<tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8> > {\nprivate:\n    static const int N = 9;\npublic:\n    typedef tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8> InputTuple;\n    typedef typename internal::tagged_msg<size_t, T0, T1, T2, T3, T4, T5, T6, T7, T8> output_type;\n    typedef typename internal::unfolded_indexer_node<InputTuple> unfolded_type;\n    indexer_node(graph& g) : unfolded_type(g) {\n        tbb::internal::fgt_multiinput_node<InputTuple,N>( tbb::internal::FLOW_INDEXER_NODE, &this->my_graph,\n                                           this->input_ports(), static_cast< sender< output_type > *>(this) );\n    }\n    // Copy constructor\n    indexer_node( const indexer_node& other ) : unfolded_type(other) {\n        tbb::internal::fgt_multiinput_node<InputTuple,N>( tbb::internal::FLOW_INDEXER_NODE, &this->my_graph,\n                                           this->input_ports(), static_cast< sender< output_type > *>(this) );\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_TRACE\n    /* override */ void set_name( const char *name ) {\n        tbb::internal::fgt_node_desc( this, name );\n    }\n#endif\n};\n#endif //variadic max 9\n\n#if __TBB_VARIADIC_MAX >= 10\ntemplate<typename T0, typename T1, typename T2, typename T3, typename T4, typename T5,\n         typename T6, typename T7, typename T8, typename T9>\nclass indexer_node/*default*/ : public internal::unfolded_indexer_node<tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> > {\nprivate:\n    static const int N = 10;\npublic:\n    typedef tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> InputTuple;\n    typedef typename internal::tagged_msg<size_t, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> output_type;\n    typedef typename internal::unfolded_indexer_node<InputTuple> unfolded_type;\n    indexer_node(graph& g) : unfolded_type(g) {\n        tbb::internal::fgt_multiinput_node<InputTuple,N>( tbb::internal::FLOW_INDEXER_NODE, &this->my_graph,\n                                           this->input_ports(), static_cast< sender< output_type > *>(this) );\n    }\n    // Copy constructor\n    indexer_node( const indexer_node& other ) : unfolded_type(other) {\n        tbb::internal::fgt_multiinput_node<InputTuple,N>( tbb::internal::FLOW_INDEXER_NODE, &this->my_graph,\n                                           this->input_ports(), static_cast< sender< output_type > *>(this) );\n    }\n\n#if TBB_PREVIEW_FLOW_GRAPH_TRACE\n    /* override */ void set_name( const char *name ) {\n        tbb::internal::fgt_node_desc( this, name );\n    }\n#endif\n};\n#endif //variadic max 10\n\n//! Makes an edge between a single predecessor and a single successor\ntemplate< typename T >\ninline void make_edge( sender<T> &p, receiver<T> &s ) {\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n    s.internal_add_built_predecessor(p);\n    p.internal_add_built_successor(s);\n#endif\n    p.register_successor( s );\n    tbb::internal::fgt_make_edge( &p, &s );\n}\n\n//! Makes an edge between a single predecessor and a single successor\ntemplate< typename T >\ninline void remove_edge( sender<T> &p, receiver<T> &s ) {\n    p.remove_successor( s );\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n    // TODO: should we try to remove p from the predecessor list of s, in case the edge is reversed?\n    p.internal_delete_built_successor(s);\n    s.internal_delete_built_predecessor(p);\n#endif\n    tbb::internal::fgt_remove_edge( &p, &s );\n}\n\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\ntemplate<typename C >\ntemplate< typename S >\nvoid edge_container<C>::sender_extract( S &s ) {\n    edge_vector e = built_edges;\n    for ( typename edge_vector::iterator i = e.begin(); i != e.end(); ++i ) {\n        remove_edge(s, **i);\n    }\n}\n\ntemplate<typename C >\ntemplate< typename R >\nvoid edge_container<C>::receiver_extract( R &r ) {\n    edge_vector e = built_edges;\n    for ( typename edge_vector::iterator i = e.begin(); i != e.end(); ++i ) {\n        remove_edge(**i, r);\n    }\n}\n#endif\n\n//! Returns a copy of the body from a function or continue node\ntemplate< typename Body, typename Node >\nBody copy_body( Node &n ) {\n    return n.template copy_function_object<Body>();\n}\n\n} // interface7\n\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n    using interface7::reset_flags;\n    using interface7::rf_reset_protocol;\n    using interface7::rf_reset_bodies;\n    using interface7::rf_extract;\n#endif\n\n    using interface7::graph;\n    using interface7::graph_node;\n    using interface7::continue_msg;\n    using interface7::sender;\n    using interface7::receiver;\n    using interface7::continue_receiver;\n\n    using interface7::source_node;\n    using interface7::function_node;\n    using interface7::multifunction_node;\n    using interface7::split_node;\n    using interface7::internal::output_port;\n    using interface7::indexer_node;\n    using interface7::internal::tagged_msg;\n    using interface7::internal::cast_to;\n    using interface7::internal::is_a;\n    using interface7::continue_node;\n    using interface7::overwrite_node;\n    using interface7::write_once_node;\n    using interface7::broadcast_node;\n    using interface7::buffer_node;\n    using interface7::queue_node;\n    using interface7::sequencer_node;\n    using interface7::priority_queue_node;\n    using interface7::limiter_node;\n    using namespace interface7::internal::graph_policy_namespace;\n    using interface7::join_node;\n    using interface7::input_port;\n    using interface7::copy_body;\n    using interface7::make_edge;\n    using interface7::remove_edge;\n    using interface7::internal::NO_TAG;\n    using interface7::internal::tag_value;\n\n} // flow\n} // tbb\n\n#undef __TBB_PFG_RESET_ARG\n#undef __TBB_COMMA\n\n#endif // __TBB_flow_graph_H\n"
  },
  {
    "path": "benchmarks/tbb/governor.cpp",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#include <stdio.h>\n#include <stdlib.h>\n#include \"governor.h\"\n#include \"tbb_main.h\"\n#include \"scheduler.h\"\n#include \"market.h\"\n#include \"arena.h\"\n\n#include \"tbb/task_scheduler_init.h\"\n\n#include \"dynamic_link.h\"\n\nnamespace tbb {\nnamespace internal {\n\n//------------------------------------------------------------------------\n// governor\n//------------------------------------------------------------------------\n\n#if __TBB_SURVIVE_THREAD_SWITCH\n// Support for interoperability with Intel(R) Cilk(TM) Plus.\n\n#if _WIN32\n#define CILKLIB_NAME \"cilkrts20.dll\"\n#else\n#define CILKLIB_NAME \"libcilkrts.so\"\n#endif\n\n//! Handler for interoperation with cilkrts library.\nstatic __cilk_tbb_retcode (*watch_stack_handler)(struct __cilk_tbb_unwatch_thunk* u,\n                                                 struct __cilk_tbb_stack_op_thunk o);\n\n//! Table describing how to link the handlers.\nstatic const dynamic_link_descriptor CilkLinkTable[] = {\n    { \"__cilkrts_watch_stack\", (pointer_to_handler*)(void*)(&watch_stack_handler) }\n};\n\nstatic atomic<do_once_state> cilkrts_load_state;\n\nbool initialize_cilk_interop() {\n    // Pinning can fail. This is a normal situation, and means that the current\n    // thread does not use cilkrts and consequently does not need interop.\n    return dynamic_link( CILKLIB_NAME, CilkLinkTable, 1,  /*handle=*/0, DYNAMIC_LINK_GLOBAL );\n}\n#endif /* __TBB_SURVIVE_THREAD_SWITCH */\n\nnamespace rml {\n    tbb_server* make_private_server( tbb_client& client );\n}\n\nvoid governor::acquire_resources () {\n#if USE_PTHREAD\n    int status = theTLS.create(auto_terminate);\n#else\n    int status = theTLS.create();\n#endif\n    if( status )\n        handle_perror(status, \"TBB failed to initialize task scheduler TLS\\n\");\n    is_speculation_enabled = cpu_has_speculation();\n}\n\nvoid governor::release_resources () {\n    theRMLServerFactory.close();\n#if TBB_USE_ASSERT\n    if( __TBB_InitOnce::initialization_done() && theTLS.get() ) \n        runtime_warning( \"TBB is unloaded while tbb::task_scheduler_init object is alive?\" );\n#endif\n    int status = theTLS.destroy();\n    if( status )\n        runtime_warning(\"failed to destroy task scheduler TLS: %s\", strerror(status));\n    dynamic_unlink_all();\n}\n\nrml::tbb_server* governor::create_rml_server ( rml::tbb_client& client ) {\n    rml::tbb_server* server = NULL;\n    if( !UsePrivateRML ) {\n        ::rml::factory::status_type status = theRMLServerFactory.make_server( server, client );\n        if( status != ::rml::factory::st_success ) {\n            UsePrivateRML = true;\n            runtime_warning( \"rml::tbb_factory::make_server failed with status %x, falling back on private rml\", status );\n        }\n    }\n    if ( !server ) {\n        __TBB_ASSERT( UsePrivateRML, NULL );\n        server = rml::make_private_server( client );\n    }\n    __TBB_ASSERT( server, \"Failed to create RML server\" );\n    return server;\n}\n\nvoid governor::sign_on(generic_scheduler* s) {\n    __TBB_ASSERT( !theTLS.get(), NULL );\n    theTLS.set(s);\n#if __TBB_SURVIVE_THREAD_SWITCH\n    if( watch_stack_handler ) {\n        __cilk_tbb_stack_op_thunk o;\n        o.routine = &stack_op_handler;\n        o.data = s;\n        if( (*watch_stack_handler)(&s->my_cilk_unwatch_thunk, o) ) {\n            // Failed to register with cilkrts, make sure we are clean\n            s->my_cilk_unwatch_thunk.routine = NULL;\n        }\n#if TBB_USE_ASSERT\n        else\n            s->my_cilk_state = generic_scheduler::cs_running;\n#endif /* TBB_USE_ASSERT */\n    }\n#endif /* __TBB_SURVIVE_THREAD_SWITCH */\n}\n\nvoid governor::sign_off(generic_scheduler* s) {\n    suppress_unused_warning(s);\n    __TBB_ASSERT( theTLS.get()==s, \"attempt to unregister a wrong scheduler instance\" );\n    theTLS.set(NULL);\n#if __TBB_SURVIVE_THREAD_SWITCH\n    __cilk_tbb_unwatch_thunk &ut = s->my_cilk_unwatch_thunk;\n    if ( ut.routine )\n       (*ut.routine)(ut.data);\n#endif /* __TBB_SURVIVE_THREAD_SWITCH */\n}\n\nvoid governor::setBlockingTerminate(const task_scheduler_init *tsi) {\n    __TBB_ASSERT(!IsBlockingTerminationInProgress, \"It's impossible to create task_scheduler_init while blocking termination is in progress.\");\n    if (BlockingTSI)\n        throw_exception(eid_blocking_sch_init);\n    BlockingTSI = tsi;\n}\n\ngeneric_scheduler* governor::init_scheduler( unsigned num_threads, stack_size_type stack_size, bool auto_init ) {\n    if( !__TBB_InitOnce::initialization_done() )\n        DoOneTimeInitializations();\n    generic_scheduler* s = theTLS.get();\n    if( s ) {\n        s->my_ref_count += 1;\n        return s;\n    }\n#if __TBB_SURVIVE_THREAD_SWITCH\n    atomic_do_once( &initialize_cilk_interop, cilkrts_load_state );\n#endif /* __TBB_SURVIVE_THREAD_SWITCH */\n    if( (int)num_threads == task_scheduler_init::automatic )\n        num_threads = default_num_threads();\n    s = generic_scheduler::create_master( \n            market::create_arena( num_threads - 1, stack_size ? stack_size : ThreadStackSize ) );\n    __TBB_ASSERT(s, \"Somehow a local scheduler creation for a master thread failed\");\n    s->my_auto_initialized = auto_init;\n    return s;\n}\n\nvoid governor::terminate_scheduler( generic_scheduler* s, const task_scheduler_init* tsi_ptr ) {\n    __TBB_ASSERT( s == theTLS.get(), \"Attempt to terminate non-local scheduler instance\" );\n    if (--(s->my_ref_count)) {\n        if (BlockingTSI && BlockingTSI==tsi_ptr) {\n            // can't throw exception, because this is on dtor's call chain\n            fprintf(stderr, \"Attempt to terminate nested scheduler in blocking mode\\n\");\n            exit(1);\n        }\n    } else {\n#if TBB_USE_ASSERT\n        if (BlockingTSI) {\n            __TBB_ASSERT( BlockingTSI == tsi_ptr, \"For blocking termination last terminate_scheduler must be blocking.\" );\n            IsBlockingTerminationInProgress = true;\n        }\n#endif\n        s->cleanup_master();\n        BlockingTSI = NULL;\n#if TBB_USE_ASSERT\n        IsBlockingTerminationInProgress = false;\n#endif\n    }\n}\n\nvoid governor::auto_terminate(void* arg){\n    generic_scheduler* s = static_cast<generic_scheduler*>(arg);\n    if( s && s->my_auto_initialized ) {\n        if( !--(s->my_ref_count) ) {\n            __TBB_ASSERT( !BlockingTSI, \"Blocking auto-terminate is not supported.\" );\n            // If the TLS slot is already cleared by OS or underlying concurrency\n            // runtime, restore its value.\n            if ( !theTLS.get() )\n                theTLS.set(s);\n            else __TBB_ASSERT( s == theTLS.get(), NULL );\n            s->cleanup_master();\n            __TBB_ASSERT( !theTLS.get(), \"cleanup_master has not cleared its TLS slot\" );\n        }\n    }\n}\n\nvoid governor::print_version_info () {\n    if ( UsePrivateRML )\n        PrintExtraVersionInfo( \"RML\", \"private\" );\n    else {\n        PrintExtraVersionInfo( \"RML\", \"shared\" );\n        theRMLServerFactory.call_with_server_info( PrintRMLVersionInfo, (void*)\"\" );\n    }\n#if __TBB_SURVIVE_THREAD_SWITCH\n    if( watch_stack_handler )\n        PrintExtraVersionInfo( \"CILK\", CILKLIB_NAME );\n#endif /* __TBB_SURVIVE_THREAD_SWITCH */\n}\n\nvoid governor::initialize_rml_factory () {\n    ::rml::factory::status_type res = theRMLServerFactory.open(); \n    UsePrivateRML = res != ::rml::factory::st_success;\n}\n\n#if __TBB_SURVIVE_THREAD_SWITCH\n__cilk_tbb_retcode governor::stack_op_handler( __cilk_tbb_stack_op op, void* data ) {\n    __TBB_ASSERT(data,NULL);\n    generic_scheduler* s = static_cast<generic_scheduler*>(data);\n#if TBB_USE_ASSERT\n    void* current = theTLS.get();\n#if _WIN32||_WIN64\n    uintptr_t thread_id = GetCurrentThreadId();\n#else\n    uintptr_t thread_id = uintptr_t(pthread_self());\n#endif\n\n#endif /* TBB_USE_ASSERT */\n    switch( op ) {\n        default:\n            __TBB_ASSERT( 0, \"invalid op\" );\n        case CILK_TBB_STACK_ADOPT: {\n            __TBB_ASSERT( !current && s->my_cilk_state==generic_scheduler::cs_limbo || \n                          current==s && s->my_cilk_state==generic_scheduler::cs_running, \"invalid adoption\" );\n#if TBB_USE_ASSERT\n            if( current==s ) \n                runtime_warning( \"redundant adoption of %p by thread %p\\n\", s, (void*)thread_id );\n            s->my_cilk_state = generic_scheduler::cs_running;\n#endif /* TBB_USE_ASSERT */\n            theTLS.set(s);\n            break;\n        }\n        case CILK_TBB_STACK_ORPHAN: {\n            __TBB_ASSERT( current==s && s->my_cilk_state==generic_scheduler::cs_running, \"invalid orphaning\" ); \n#if TBB_USE_ASSERT\n            s->my_cilk_state = generic_scheduler::cs_limbo;\n#endif /* TBB_USE_ASSERT */\n            theTLS.set(NULL);\n            break;\n        }\n        case CILK_TBB_STACK_RELEASE: {\n            __TBB_ASSERT( !current && s->my_cilk_state==generic_scheduler::cs_limbo || \n                          current==s && s->my_cilk_state==generic_scheduler::cs_running, \"invalid release\" );\n#if TBB_USE_ASSERT\n            s->my_cilk_state = generic_scheduler::cs_freed;\n#endif /* TBB_USE_ASSERT */\n            s->my_cilk_unwatch_thunk.routine = NULL;\n            auto_terminate( s );\n        } \n    }\n    return 0;\n}\n#endif /* __TBB_SURVIVE_THREAD_SWITCH */\n\n} // namespace internal\n\n//------------------------------------------------------------------------\n// task_scheduler_init\n//------------------------------------------------------------------------\n\nusing namespace internal;\n\n/** Left out-of-line for the sake of the backward binary compatibility **/\nvoid task_scheduler_init::initialize( int number_of_threads ) {\n    initialize( number_of_threads, 0 );\n}\n\nvoid task_scheduler_init::initialize( int number_of_threads, stack_size_type thread_stack_size ) {\n#if __TBB_TASK_GROUP_CONTEXT && TBB_USE_EXCEPTIONS\n    uintptr_t new_mode = thread_stack_size & propagation_mode_mask;\n#endif\n    thread_stack_size &= ~(stack_size_type)propagation_mode_mask;\n    if( number_of_threads!=deferred ) {\n        bool blocking_terminate = false;\n        if (my_scheduler == (scheduler*)wait_workers_in_terminate_flag) {\n            blocking_terminate = true;\n            my_scheduler = NULL;\n        }\n        __TBB_ASSERT( !my_scheduler, \"task_scheduler_init already initialized\" );\n        __TBB_ASSERT( number_of_threads==-1 || number_of_threads>=1,\n                    \"number_of_threads for task_scheduler_init must be -1 or positive\" );\n        if (blocking_terminate)\n            governor::setBlockingTerminate(this);\n        internal::generic_scheduler *s = governor::init_scheduler( number_of_threads, thread_stack_size, /*auto_init=*/false );\n#if __TBB_TASK_GROUP_CONTEXT && TBB_USE_EXCEPTIONS\n        if ( s->master_outermost_level() ) {\n            uintptr_t &vt = s->default_context()->my_version_and_traits;\n            uintptr_t prev_mode = vt & task_group_context::exact_exception ? propagation_mode_exact : 0;\n            vt = new_mode & propagation_mode_exact ? vt | task_group_context::exact_exception\n                    : new_mode & propagation_mode_captured ? vt & ~task_group_context::exact_exception : vt;\n            // Use least significant bit of the scheduler pointer to store previous mode.\n            // This is necessary when components compiled with different compilers and/or\n            // TBB versions initialize the \n            my_scheduler = static_cast<scheduler*>((generic_scheduler*)((uintptr_t)s | prev_mode));\n        }\n        else\n#endif /* __TBB_TASK_GROUP_CONTEXT && TBB_USE_EXCEPTIONS */\n            my_scheduler = s;\n    } else {\n        __TBB_ASSERT( !thread_stack_size, \"deferred initialization ignores stack size setting\" );\n    }\n}\n\nvoid task_scheduler_init::terminate() {\n#if __TBB_TASK_GROUP_CONTEXT && TBB_USE_EXCEPTIONS\n    uintptr_t prev_mode = (uintptr_t)my_scheduler & propagation_mode_exact;\n    my_scheduler = (scheduler*)((uintptr_t)my_scheduler & ~(uintptr_t)propagation_mode_exact);\n#endif /* __TBB_TASK_GROUP_CONTEXT && TBB_USE_EXCEPTIONS */\n    generic_scheduler* s = static_cast<generic_scheduler*>(my_scheduler);\n    my_scheduler = NULL;\n    __TBB_ASSERT( s, \"task_scheduler_init::terminate without corresponding task_scheduler_init::initialize()\");\n#if __TBB_TASK_GROUP_CONTEXT && TBB_USE_EXCEPTIONS\n    if ( s->master_outermost_level() ) {\n        uintptr_t &vt = s->default_context()->my_version_and_traits;\n        vt = prev_mode & propagation_mode_exact ? vt | task_group_context::exact_exception\n                                        : vt & ~task_group_context::exact_exception;\n    }\n#endif /* __TBB_TASK_GROUP_CONTEXT && TBB_USE_EXCEPTIONS */\n    governor::terminate_scheduler(s, this);\n}\n\nint task_scheduler_init::default_num_threads() {\n    return governor::default_num_threads();\n}\n\n} // namespace tbb\n"
  },
  {
    "path": "benchmarks/tbb/governor.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef _TBB_governor_H\n#define _TBB_governor_H\n\n#include \"tbb/task_scheduler_init.h\"\n#include \"../rml/include/rml_tbb.h\"\n\n#include \"tbb_misc.h\" // for AvailableHwConcurrency and ThreadStackSize\n#include \"tls.h\"\n\n#if __TBB_SURVIVE_THREAD_SWITCH\n#include \"cilk-tbb-interop.h\"\n#endif /* __TBB_SURVIVE_THREAD_SWITCH */\n\nnamespace tbb {\nnamespace internal {\n\nclass market;\nclass generic_scheduler;\nclass __TBB_InitOnce;\n\n//------------------------------------------------------------------------\n// Class governor\n//------------------------------------------------------------------------\n\n//! The class handles access to the single instance of market, and to TLS to keep scheduler instances.\n/** It also supports automatic on-demand initialization of the TBB scheduler.\n    The class contains only static data members and methods.*/\nclass governor {\n    friend class __TBB_InitOnce;\n    friend class market;\n\n    //! TLS for scheduler instances associated with individual threads\n    static basic_tls<generic_scheduler*> theTLS;\n\n    //! Caches the maximal level of parallelism supported by the hardware\n    static unsigned DefaultNumberOfThreads;\n\n    static rml::tbb_factory theRMLServerFactory;\n\n    static bool UsePrivateRML;\n\n    //! Instance of task_scheduler_init that requested blocking termination.\n    static const task_scheduler_init *BlockingTSI;\n\n#if TBB_USE_ASSERT\n    static bool IsBlockingTerminationInProgress;\n#endif\n\n    static bool is_speculation_enabled;\n\n    //! Create key for thread-local storage and initialize RML.\n    static void acquire_resources ();\n\n    //! Destroy the thread-local storage key and deinitialize RML.\n    static void release_resources ();\n\n    static rml::tbb_server* create_rml_server ( rml::tbb_client& );\n\n    //! The internal routine to undo automatic initialization.\n    /** The signature is written with void* so that the routine\n        can be the destructor argument to pthread_key_create. */\n    static void auto_terminate(void* scheduler);\n\npublic:\n    static unsigned default_num_threads () {\n        // No memory fence required, because at worst each invoking thread calls AvailableHwConcurrency once.\n        return DefaultNumberOfThreads ? DefaultNumberOfThreads :\n                                        DefaultNumberOfThreads = AvailableHwConcurrency();\n    }\n    //! Processes scheduler initialization request (possibly nested) in a master thread\n    /** If necessary creates new instance of arena and/or local scheduler.\n        The auto_init argument specifies if the call is due to automatic initialization. **/\n    static generic_scheduler* init_scheduler( unsigned num_threads, stack_size_type stack_size, bool auto_init = false );\n\n    //! Processes scheduler termination request (possibly nested) in a master thread\n    static void terminate_scheduler( generic_scheduler* s, const task_scheduler_init *tsi_ptr );\n\n    //! Register TBB scheduler instance in thread-local storage.\n    static void sign_on(generic_scheduler* s);\n\n    //! Unregister TBB scheduler instance from thread-local storage.\n    static void sign_off(generic_scheduler* s);\n\n    //! Used to check validity of the local scheduler TLS contents.\n    static bool is_set ( generic_scheduler* s ) { return theTLS.get() == s; }\n\n    //! Temporarily set TLS slot to the given scheduler\n    static void assume_scheduler( generic_scheduler* s ) { theTLS.set( s ); }\n\n    //! Obtain the thread-local instance of the TBB scheduler.\n    /** If the scheduler has not been initialized yet, initialization is done automatically.\n        Note that auto-initialized scheduler instance is destroyed only when its thread terminates. **/\n    static generic_scheduler* local_scheduler () {\n        generic_scheduler* s = theTLS.get();\n        return s ? s : init_scheduler( (unsigned)task_scheduler_init::automatic, 0, true );\n    }\n\n    static generic_scheduler* local_scheduler_if_initialized () {\n        return theTLS.get();\n    }\n\n    //! Undo automatic initialization if necessary; call when a thread exits.\n    static void terminate_auto_initialized_scheduler() {\n        auto_terminate( theTLS.get() );\n    }\n\n    static void print_version_info ();\n\n    static void initialize_rml_factory ();\n\n    static bool needsWaitWorkers () { return BlockingTSI!=NULL; }\n\n    //! Must be called before init_scheduler\n    static void setBlockingTerminate(const task_scheduler_init *tsi);\n\n#if __TBB_SURVIVE_THREAD_SWITCH\n    static __cilk_tbb_retcode stack_op_handler( __cilk_tbb_stack_op op, void* );\n#endif /* __TBB_SURVIVE_THREAD_SWITCH */\n    static bool speculation_enabled() { return is_speculation_enabled; }\n\n}; // class governor\n\n} // namespace internal\n} // namespace tbb\n\n#endif /* _TBB_governor_H */\n"
  },
  {
    "path": "benchmarks/tbb/ia32-masm/atomic_support.asm",
    "content": "; Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n;\n; This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n; you can redistribute it and/or modify it under the terms of the GNU General Public License\n; version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n; distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n; implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n; See  the GNU General Public License for more details.   You should have received a copy of\n; the  GNU General Public License along with Threading Building Blocks; if not, write to the\n; Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n;\n; As a special exception,  you may use this file  as part of a free software library without\n; restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n; functions from this file, or you compile this file and link it with other files to produce\n; an executable,  this file does not by itself cause the resulting executable to be covered\n; by the GNU General Public License. This exception does not however invalidate any other\n; reasons why the executable file might be covered by the GNU General Public License.\n\n.686\n.model flat,c\n.code \n\tALIGN 4\n\tPUBLIC c __TBB_machine_fetchadd1\n__TBB_machine_fetchadd1:\n\tmov edx,4[esp]\n\tmov eax,8[esp]\n\tlock xadd [edx],al\n\tret\n.code \n\tALIGN 4\n\tPUBLIC c __TBB_machine_fetchstore1\n__TBB_machine_fetchstore1:\n\tmov edx,4[esp]\n\tmov eax,8[esp]\n\tlock xchg [edx],al\n\tret\n.code \n\tALIGN 4\n\tPUBLIC c __TBB_machine_cmpswp1\n__TBB_machine_cmpswp1:\n\tmov edx,4[esp]\n\tmov ecx,8[esp]\n\tmov eax,12[esp]\n\tlock cmpxchg [edx],cl\n\tret\n.code \n\tALIGN 4\n\tPUBLIC c __TBB_machine_fetchadd2\n__TBB_machine_fetchadd2:\n\tmov edx,4[esp]\n\tmov eax,8[esp]\n\tlock xadd [edx],ax\n\tret\n.code \n\tALIGN 4\n\tPUBLIC c __TBB_machine_fetchstore2\n__TBB_machine_fetchstore2:\n\tmov edx,4[esp]\n\tmov eax,8[esp]\n\tlock xchg [edx],ax\n\tret\n.code \n\tALIGN 4\n\tPUBLIC c __TBB_machine_cmpswp2\n__TBB_machine_cmpswp2:\n\tmov edx,4[esp]\n\tmov ecx,8[esp]\n\tmov eax,12[esp]\n\tlock cmpxchg [edx],cx\n\tret\n.code \n\tALIGN 4\n\tPUBLIC c __TBB_machine_fetchadd4\n__TBB_machine_fetchadd4:\n\tmov edx,4[esp]\n\tmov eax,8[esp]\n\tlock xadd [edx],eax\n\tret\n.code \n\tALIGN 4\n\tPUBLIC c __TBB_machine_fetchstore4\n__TBB_machine_fetchstore4:\n\tmov edx,4[esp]\n\tmov eax,8[esp]\n\tlock xchg [edx],eax\n\tret\n.code \n\tALIGN 4\n\tPUBLIC c __TBB_machine_cmpswp4\n__TBB_machine_cmpswp4:\n\tmov edx,4[esp]\n\tmov ecx,8[esp]\n\tmov eax,12[esp]\n\tlock cmpxchg [edx],ecx\n\tret\n.code \n\tALIGN 4\n\tPUBLIC c __TBB_machine_fetchadd8\n__TBB_machine_fetchadd8:\n\tpush ebx\n\tpush edi\n\tmov edi,12[esp]\n\tmov eax,[edi]\n\tmov edx,4[edi]\n__TBB_machine_fetchadd8_loop:\n\tmov ebx,16[esp]\n\tmov ecx,20[esp]\n\tadd ebx,eax\n\tadc ecx,edx\n\tlock cmpxchg8b qword ptr [edi]\n\tjnz __TBB_machine_fetchadd8_loop\n\tpop edi\n\tpop ebx\n\tret\n.code \n\tALIGN 4\n\tPUBLIC c __TBB_machine_fetchstore8\n__TBB_machine_fetchstore8:\n\tpush ebx\n\tpush edi\n\tmov edi,12[esp]\n\tmov ebx,16[esp]\n\tmov ecx,20[esp]\n\tmov eax,[edi]\n\tmov edx,4[edi]\n__TBB_machine_fetchstore8_loop:\n\tlock cmpxchg8b qword ptr [edi]\n\tjnz __TBB_machine_fetchstore8_loop\n\tpop edi\n\tpop ebx\n\tret\n.code \n\tALIGN 4\n\tPUBLIC c __TBB_machine_cmpswp8\n__TBB_machine_cmpswp8:\n\tpush ebx\n\tpush edi\n\tmov edi,12[esp]\n\tmov ebx,16[esp]\n\tmov ecx,20[esp]\n\tmov eax,24[esp]\n\tmov edx,28[esp]\n\tlock cmpxchg8b qword ptr [edi]\n\tpop edi\n\tpop ebx\n\tret\n.code \n\tALIGN 4\n\tPUBLIC c __TBB_machine_load8\n__TBB_machine_Load8:\n\t; If location is on stack, compiler may have failed to align it correctly, so we do dynamic check.\n\tmov ecx,4[esp]\n\ttest ecx,7\n\tjne load_slow\n\t; Load within a cache line\n\tsub esp,12\n\tfild qword ptr [ecx]\n\tfistp qword ptr [esp]\n\tmov eax,[esp]\n\tmov edx,4[esp]\n\tadd esp,12\n\tret\nload_slow:\n\t; Load is misaligned. Use cmpxchg8b.\n\tpush ebx\n\tpush edi\n\tmov edi,ecx\n\txor eax,eax\n\txor ebx,ebx\n\txor ecx,ecx\n\txor edx,edx\n\tlock cmpxchg8b qword ptr [edi]\n\tpop edi\n\tpop ebx\n\tret\nEXTRN __TBB_machine_store8_slow:PROC\n.code \n\tALIGN 4\n\tPUBLIC c __TBB_machine_store8\n__TBB_machine_Store8:\n\t; If location is on stack, compiler may have failed to align it correctly, so we do dynamic check.\n\tmov ecx,4[esp]\n\ttest ecx,7\n\tjne __TBB_machine_store8_slow ;; tail call to tbb_misc.cpp\n\tfild qword ptr 8[esp]\n\tfistp qword ptr [ecx]\n\tret\nend\n"
  },
  {
    "path": "benchmarks/tbb/ia32-masm/itsx.asm",
    "content": "; Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n;\n; This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n; you can redistribute it and/or modify it under the terms of the GNU General Public License\n; version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n; distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n; implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n; See  the GNU General Public License for more details.   You should have received a copy of\n; the  GNU General Public License along with Threading Building Blocks; if not, write to the\n; Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n;\n; As a special exception,  you may use this file  as part of a free software library without\n; restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n; functions from this file, or you compile this file and link it with other files to produce\n; an executable,  this file does not by itself cause the resulting executable to be covered\n; by the GNU General Public License. This exception does not however invalidate any other\n; reasons why the executable file might be covered by the GNU General Public License.\n\n.686\n.model flat,c\n.code\n        ALIGN 4\n        PUBLIC c __TBB_machine_try_lock_elided\n__TBB_machine_try_lock_elided:\n        mov ecx, 4[esp]\n        xor eax, eax\n        mov al, 1\n        BYTE 0F2H\n        xchg al, byte ptr [ecx]\n        xor  al, 1\n        ret\n.code\n        ALIGN 4\n        PUBLIC c __TBB_machine_unlock_elided\n__TBB_machine_unlock_elided:\n        mov ecx, 4[esp]\n        BYTE 0F3H\n        mov byte ptr [ecx], 0\n        ret\n.code \n\tALIGN 4\n\tPUBLIC c __TBB_machine_begin_transaction\n__TBB_machine_begin_transaction:\n        mov  eax, -1\n        BYTE 0C7H\n        BYTE 0F8H\n        BYTE 000H\n        BYTE 000H\n        BYTE 000H\n        BYTE 000H\n        ret\n.code \n\tALIGN 4\n\tPUBLIC c __TBB_machine_end_transaction\n__TBB_machine_end_transaction:\n        BYTE 00FH\n        BYTE 001H\n        BYTE 0D5H\n        ret\n.code \n\tALIGN 4\n\tPUBLIC c __TBB_machine_transaction_conflict_abort\n__TBB_machine_transaction_conflict_abort:\n        BYTE 0C6H\n        BYTE 0F8H\n        BYTE 0FFH  ; 12.4.5 Abort argument: lock not free when tested\n        ret\n.code \n        ALIGN 4\n\tPUBLIC c __TBB_machine_is_in_transaction\n__TBB_machine_is_in_transaction:\n        xor eax, eax\n        BYTE 00FH\n        BYTE 001H\n        BYTE 0D6H\n        JZ   rset\n        MOV  al,1\nrset:\n        RET\nend\n"
  },
  {
    "path": "benchmarks/tbb/ia32-masm/lock_byte.asm",
    "content": "; Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n;\n; This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n; you can redistribute it and/or modify it under the terms of the GNU General Public License\n; version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n; distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n; implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n; See  the GNU General Public License for more details.   You should have received a copy of\n; the  GNU General Public License along with Threading Building Blocks; if not, write to the\n; Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n;\n; As a special exception,  you may use this file  as part of a free software library without\n; restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n; functions from this file, or you compile this file and link it with other files to produce\n; an executable,  this file does not by itself cause the resulting executable to be covered\n; by the GNU General Public License. This exception does not however invalidate any other\n; reasons why the executable file might be covered by the GNU General Public License.\n\n; DO NOT EDIT - AUTOMATICALLY GENERATED FROM .s FILE\n.686\n.model flat,c\n.code \n\tALIGN 4\n\tPUBLIC c __TBB_machine_trylockbyte\n__TBB_machine_trylockbyte:\n\tmov edx,4[esp]\n\tmov al,[edx]\n\tmov cl,1\n\ttest al,1\n\tjnz __TBB_machine_trylockbyte_contended\n\tlock cmpxchg [edx],cl\n\tjne __TBB_machine_trylockbyte_contended\n\tmov eax,1\n\tret\n__TBB_machine_trylockbyte_contended:\n\txor eax,eax\n\tret\nend\n"
  },
  {
    "path": "benchmarks/tbb/ia64-gas/atomic_support.s",
    "content": "// Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n//\n// This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n// you can redistribute it and/or modify it under the terms of the GNU General Public License\n// version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n// distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n// implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n// See  the GNU General Public License for more details.   You should have received a copy of\n// the  GNU General Public License along with Threading Building Blocks; if not, write to the\n// Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n//\n// As a special exception,  you may use this file  as part of a free software library without\n// restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n// functions from this file, or you compile this file and link it with other files to produce\n// an executable,  this file does not by itself cause the resulting executable to be covered\n// by the GNU General Public License. This exception does not however invalidate any other\n// reasons why the executable file might be covered by the GNU General Public License.\n\n// DO NOT EDIT - AUTOMATICALLY GENERATED FROM tools/generate_atomic/ipf_generate.sh\n# 1 \"<stdin>\"\n# 1 \"<built-in>\"\n# 1 \"<command line>\"\n# 1 \"<stdin>\"\n\n\n\n\n\n        .section .text\n        .align 16\n\n\n        .proc __TBB_machine_fetchadd1__TBB_full_fence#\n        .global __TBB_machine_fetchadd1__TBB_full_fence#\n__TBB_machine_fetchadd1__TBB_full_fence:\n{\n        mf\n        br __TBB_machine_fetchadd1acquire\n}\n        .endp __TBB_machine_fetchadd1__TBB_full_fence#\n\n        .proc __TBB_machine_fetchadd1acquire#\n        .global __TBB_machine_fetchadd1acquire#\n__TBB_machine_fetchadd1acquire:\n\n\n\n\n\n\n\n        ld1 r9=[r32]\n;;\nRetry_1acquire:\n        mov ar.ccv=r9\n        mov r8=r9;\n        add r10=r9,r33\n;;\n        cmpxchg1.acq r9=[r32],r10,ar.ccv\n;;\n        cmp.ne p7,p0=r8,r9\n  (p7) br.cond.dpnt Retry_1acquire\n        br.ret.sptk.many b0\n# 49 \"<stdin>\"\n        .endp __TBB_machine_fetchadd1acquire#\n# 62 \"<stdin>\"\n        .section .text\n        .align 16\n        .proc __TBB_machine_fetchstore1__TBB_full_fence#\n        .global __TBB_machine_fetchstore1__TBB_full_fence#\n__TBB_machine_fetchstore1__TBB_full_fence:\n        mf\n;;\n        xchg1 r8=[r32],r33\n        br.ret.sptk.many b0\n        .endp __TBB_machine_fetchstore1__TBB_full_fence#\n\n\n        .proc __TBB_machine_fetchstore1acquire#\n        .global __TBB_machine_fetchstore1acquire#\n__TBB_machine_fetchstore1acquire:\n        xchg1 r8=[r32],r33\n        br.ret.sptk.many b0\n        .endp __TBB_machine_fetchstore1acquire#\n# 88 \"<stdin>\"\n        .section .text\n        .align 16\n\n\n        .proc __TBB_machine_cmpswp1__TBB_full_fence#\n        .global __TBB_machine_cmpswp1__TBB_full_fence#\n__TBB_machine_cmpswp1__TBB_full_fence:\n{\n        mf\n        br __TBB_machine_cmpswp1acquire\n}\n        .endp __TBB_machine_cmpswp1__TBB_full_fence#\n\n        .proc __TBB_machine_cmpswp1acquire#\n        .global __TBB_machine_cmpswp1acquire#\n__TBB_machine_cmpswp1acquire:\n\n        zxt1 r34=r34\n;;\n\n        mov ar.ccv=r34\n;;\n        cmpxchg1.acq r8=[r32],r33,ar.ccv\n        br.ret.sptk.many b0\n        .endp __TBB_machine_cmpswp1acquire#\n// DO NOT EDIT - AUTOMATICALLY GENERATED FROM tools/generate_atomic/ipf_generate.sh\n# 1 \"<stdin>\"\n# 1 \"<built-in>\"\n# 1 \"<command line>\"\n# 1 \"<stdin>\"\n\n\n\n\n\n        .section .text\n        .align 16\n\n\n        .proc __TBB_machine_fetchadd2__TBB_full_fence#\n        .global __TBB_machine_fetchadd2__TBB_full_fence#\n__TBB_machine_fetchadd2__TBB_full_fence:\n{\n        mf\n        br __TBB_machine_fetchadd2acquire\n}\n        .endp __TBB_machine_fetchadd2__TBB_full_fence#\n\n        .proc __TBB_machine_fetchadd2acquire#\n        .global __TBB_machine_fetchadd2acquire#\n__TBB_machine_fetchadd2acquire:\n\n\n\n\n\n\n\n        ld2 r9=[r32]\n;;\nRetry_2acquire:\n        mov ar.ccv=r9\n        mov r8=r9;\n        add r10=r9,r33\n;;\n        cmpxchg2.acq r9=[r32],r10,ar.ccv\n;;\n        cmp.ne p7,p0=r8,r9\n  (p7) br.cond.dpnt Retry_2acquire\n        br.ret.sptk.many b0\n# 49 \"<stdin>\"\n        .endp __TBB_machine_fetchadd2acquire#\n# 62 \"<stdin>\"\n        .section .text\n        .align 16\n        .proc __TBB_machine_fetchstore2__TBB_full_fence#\n        .global __TBB_machine_fetchstore2__TBB_full_fence#\n__TBB_machine_fetchstore2__TBB_full_fence:\n        mf\n;;\n        xchg2 r8=[r32],r33\n        br.ret.sptk.many b0\n        .endp __TBB_machine_fetchstore2__TBB_full_fence#\n\n\n        .proc __TBB_machine_fetchstore2acquire#\n        .global __TBB_machine_fetchstore2acquire#\n__TBB_machine_fetchstore2acquire:\n        xchg2 r8=[r32],r33\n        br.ret.sptk.many b0\n        .endp __TBB_machine_fetchstore2acquire#\n# 88 \"<stdin>\"\n        .section .text\n        .align 16\n\n\n        .proc __TBB_machine_cmpswp2__TBB_full_fence#\n        .global __TBB_machine_cmpswp2__TBB_full_fence#\n__TBB_machine_cmpswp2__TBB_full_fence:\n{\n        mf\n        br __TBB_machine_cmpswp2acquire\n}\n        .endp __TBB_machine_cmpswp2__TBB_full_fence#\n\n        .proc __TBB_machine_cmpswp2acquire#\n        .global __TBB_machine_cmpswp2acquire#\n__TBB_machine_cmpswp2acquire:\n\n        zxt2 r34=r34\n;;\n\n        mov ar.ccv=r34\n;;\n        cmpxchg2.acq r8=[r32],r33,ar.ccv\n        br.ret.sptk.many b0\n        .endp __TBB_machine_cmpswp2acquire#\n// DO NOT EDIT - AUTOMATICALLY GENERATED FROM tools/generate_atomic/ipf_generate.sh\n# 1 \"<stdin>\"\n# 1 \"<built-in>\"\n# 1 \"<command line>\"\n# 1 \"<stdin>\"\n\n\n\n\n\n        .section .text\n        .align 16\n\n\n        .proc __TBB_machine_fetchadd4__TBB_full_fence#\n        .global __TBB_machine_fetchadd4__TBB_full_fence#\n__TBB_machine_fetchadd4__TBB_full_fence:\n{\n        mf\n        br __TBB_machine_fetchadd4acquire\n}\n        .endp __TBB_machine_fetchadd4__TBB_full_fence#\n\n        .proc __TBB_machine_fetchadd4acquire#\n        .global __TBB_machine_fetchadd4acquire#\n__TBB_machine_fetchadd4acquire:\n\n        cmp.eq p6,p0=1,r33\n        cmp.eq p8,p0=-1,r33\n  (p6) br.cond.dptk Inc_4acquire\n  (p8) br.cond.dpnt Dec_4acquire\n;;\n\n        ld4 r9=[r32]\n;;\nRetry_4acquire:\n        mov ar.ccv=r9\n        mov r8=r9;\n        add r10=r9,r33\n;;\n        cmpxchg4.acq r9=[r32],r10,ar.ccv\n;;\n        cmp.ne p7,p0=r8,r9\n  (p7) br.cond.dpnt Retry_4acquire\n        br.ret.sptk.many b0\n\nInc_4acquire:\n        fetchadd4.acq r8=[r32],1\n        br.ret.sptk.many b0\nDec_4acquire:\n        fetchadd4.acq r8=[r32],-1\n        br.ret.sptk.many b0\n\n        .endp __TBB_machine_fetchadd4acquire#\n# 62 \"<stdin>\"\n        .section .text\n        .align 16\n        .proc __TBB_machine_fetchstore4__TBB_full_fence#\n        .global __TBB_machine_fetchstore4__TBB_full_fence#\n__TBB_machine_fetchstore4__TBB_full_fence:\n        mf\n;;\n        xchg4 r8=[r32],r33\n        br.ret.sptk.many b0\n        .endp __TBB_machine_fetchstore4__TBB_full_fence#\n\n\n        .proc __TBB_machine_fetchstore4acquire#\n        .global __TBB_machine_fetchstore4acquire#\n__TBB_machine_fetchstore4acquire:\n        xchg4 r8=[r32],r33\n        br.ret.sptk.many b0\n        .endp __TBB_machine_fetchstore4acquire#\n# 88 \"<stdin>\"\n        .section .text\n        .align 16\n\n\n        .proc __TBB_machine_cmpswp4__TBB_full_fence#\n        .global __TBB_machine_cmpswp4__TBB_full_fence#\n__TBB_machine_cmpswp4__TBB_full_fence:\n{\n        mf\n        br __TBB_machine_cmpswp4acquire\n}\n        .endp __TBB_machine_cmpswp4__TBB_full_fence#\n\n        .proc __TBB_machine_cmpswp4acquire#\n        .global __TBB_machine_cmpswp4acquire#\n__TBB_machine_cmpswp4acquire:\n\n        zxt4 r34=r34\n;;\n\n        mov ar.ccv=r34\n;;\n        cmpxchg4.acq r8=[r32],r33,ar.ccv\n        br.ret.sptk.many b0\n        .endp __TBB_machine_cmpswp4acquire#\n// DO NOT EDIT - AUTOMATICALLY GENERATED FROM tools/generate_atomic/ipf_generate.sh\n# 1 \"<stdin>\"\n# 1 \"<built-in>\"\n# 1 \"<command line>\"\n# 1 \"<stdin>\"\n\n\n\n\n\n        .section .text\n        .align 16\n\n\n        .proc __TBB_machine_fetchadd8__TBB_full_fence#\n        .global __TBB_machine_fetchadd8__TBB_full_fence#\n__TBB_machine_fetchadd8__TBB_full_fence:\n{\n        mf\n        br __TBB_machine_fetchadd8acquire\n}\n        .endp __TBB_machine_fetchadd8__TBB_full_fence#\n\n        .proc __TBB_machine_fetchadd8acquire#\n        .global __TBB_machine_fetchadd8acquire#\n__TBB_machine_fetchadd8acquire:\n\n        cmp.eq p6,p0=1,r33\n        cmp.eq p8,p0=-1,r33\n  (p6) br.cond.dptk Inc_8acquire\n  (p8) br.cond.dpnt Dec_8acquire\n;;\n\n        ld8 r9=[r32]\n;;\nRetry_8acquire:\n        mov ar.ccv=r9\n        mov r8=r9;\n        add r10=r9,r33\n;;\n        cmpxchg8.acq r9=[r32],r10,ar.ccv\n;;\n        cmp.ne p7,p0=r8,r9\n  (p7) br.cond.dpnt Retry_8acquire\n        br.ret.sptk.many b0\n\nInc_8acquire:\n        fetchadd8.acq r8=[r32],1\n        br.ret.sptk.many b0\nDec_8acquire:\n        fetchadd8.acq r8=[r32],-1\n        br.ret.sptk.many b0\n\n        .endp __TBB_machine_fetchadd8acquire#\n# 62 \"<stdin>\"\n        .section .text\n        .align 16\n        .proc __TBB_machine_fetchstore8__TBB_full_fence#\n        .global __TBB_machine_fetchstore8__TBB_full_fence#\n__TBB_machine_fetchstore8__TBB_full_fence:\n        mf\n;;\n        xchg8 r8=[r32],r33\n        br.ret.sptk.many b0\n        .endp __TBB_machine_fetchstore8__TBB_full_fence#\n\n\n        .proc __TBB_machine_fetchstore8acquire#\n        .global __TBB_machine_fetchstore8acquire#\n__TBB_machine_fetchstore8acquire:\n        xchg8 r8=[r32],r33\n        br.ret.sptk.many b0\n        .endp __TBB_machine_fetchstore8acquire#\n# 88 \"<stdin>\"\n        .section .text\n        .align 16\n\n\n        .proc __TBB_machine_cmpswp8__TBB_full_fence#\n        .global __TBB_machine_cmpswp8__TBB_full_fence#\n__TBB_machine_cmpswp8__TBB_full_fence:\n{\n        mf\n        br __TBB_machine_cmpswp8acquire\n}\n        .endp __TBB_machine_cmpswp8__TBB_full_fence#\n\n        .proc __TBB_machine_cmpswp8acquire#\n        .global __TBB_machine_cmpswp8acquire#\n__TBB_machine_cmpswp8acquire:\n\n\n\n\n        mov ar.ccv=r34\n;;\n        cmpxchg8.acq r8=[r32],r33,ar.ccv\n        br.ret.sptk.many b0\n        .endp __TBB_machine_cmpswp8acquire#\n// DO NOT EDIT - AUTOMATICALLY GENERATED FROM tools/generate_atomic/ipf_generate.sh\n# 1 \"<stdin>\"\n# 1 \"<built-in>\"\n# 1 \"<command line>\"\n# 1 \"<stdin>\"\n\n\n\n\n\n        .section .text\n        .align 16\n# 19 \"<stdin>\"\n        .proc __TBB_machine_fetchadd1release#\n        .global __TBB_machine_fetchadd1release#\n__TBB_machine_fetchadd1release:\n\n\n\n\n\n\n\n        ld1 r9=[r32]\n;;\nRetry_1release:\n        mov ar.ccv=r9\n        mov r8=r9;\n        add r10=r9,r33\n;;\n        cmpxchg1.rel r9=[r32],r10,ar.ccv\n;;\n        cmp.ne p7,p0=r8,r9\n  (p7) br.cond.dpnt Retry_1release\n        br.ret.sptk.many b0\n# 49 \"<stdin>\"\n        .endp __TBB_machine_fetchadd1release#\n# 62 \"<stdin>\"\n        .section .text\n        .align 16\n        .proc __TBB_machine_fetchstore1release#\n        .global __TBB_machine_fetchstore1release#\n__TBB_machine_fetchstore1release:\n        mf\n;;\n        xchg1 r8=[r32],r33\n        br.ret.sptk.many b0\n        .endp __TBB_machine_fetchstore1release#\n# 88 \"<stdin>\"\n        .section .text\n        .align 16\n# 101 \"<stdin>\"\n        .proc __TBB_machine_cmpswp1release#\n        .global __TBB_machine_cmpswp1release#\n__TBB_machine_cmpswp1release:\n\n        zxt1 r34=r34\n;;\n\n        mov ar.ccv=r34\n;;\n        cmpxchg1.rel r8=[r32],r33,ar.ccv\n        br.ret.sptk.many b0\n        .endp __TBB_machine_cmpswp1release#\n// DO NOT EDIT - AUTOMATICALLY GENERATED FROM tools/generate_atomic/ipf_generate.sh\n# 1 \"<stdin>\"\n# 1 \"<built-in>\"\n# 1 \"<command line>\"\n# 1 \"<stdin>\"\n\n\n\n\n\n        .section .text\n        .align 16\n# 19 \"<stdin>\"\n        .proc __TBB_machine_fetchadd2release#\n        .global __TBB_machine_fetchadd2release#\n__TBB_machine_fetchadd2release:\n\n\n\n\n\n\n\n        ld2 r9=[r32]\n;;\nRetry_2release:\n        mov ar.ccv=r9\n        mov r8=r9;\n        add r10=r9,r33\n;;\n        cmpxchg2.rel r9=[r32],r10,ar.ccv\n;;\n        cmp.ne p7,p0=r8,r9\n  (p7) br.cond.dpnt Retry_2release\n        br.ret.sptk.many b0\n# 49 \"<stdin>\"\n        .endp __TBB_machine_fetchadd2release#\n# 62 \"<stdin>\"\n        .section .text\n        .align 16\n        .proc __TBB_machine_fetchstore2release#\n        .global __TBB_machine_fetchstore2release#\n__TBB_machine_fetchstore2release:\n        mf\n;;\n        xchg2 r8=[r32],r33\n        br.ret.sptk.many b0\n        .endp __TBB_machine_fetchstore2release#\n# 88 \"<stdin>\"\n        .section .text\n        .align 16\n# 101 \"<stdin>\"\n        .proc __TBB_machine_cmpswp2release#\n        .global __TBB_machine_cmpswp2release#\n__TBB_machine_cmpswp2release:\n\n        zxt2 r34=r34\n;;\n\n        mov ar.ccv=r34\n;;\n        cmpxchg2.rel r8=[r32],r33,ar.ccv\n        br.ret.sptk.many b0\n        .endp __TBB_machine_cmpswp2release#\n// DO NOT EDIT - AUTOMATICALLY GENERATED FROM tools/generate_atomic/ipf_generate.sh\n# 1 \"<stdin>\"\n# 1 \"<built-in>\"\n# 1 \"<command line>\"\n# 1 \"<stdin>\"\n\n\n\n\n\n        .section .text\n        .align 16\n# 19 \"<stdin>\"\n        .proc __TBB_machine_fetchadd4release#\n        .global __TBB_machine_fetchadd4release#\n__TBB_machine_fetchadd4release:\n\n        cmp.eq p6,p0=1,r33\n        cmp.eq p8,p0=-1,r33\n  (p6) br.cond.dptk Inc_4release\n  (p8) br.cond.dpnt Dec_4release\n;;\n\n        ld4 r9=[r32]\n;;\nRetry_4release:\n        mov ar.ccv=r9\n        mov r8=r9;\n        add r10=r9,r33\n;;\n        cmpxchg4.rel r9=[r32],r10,ar.ccv\n;;\n        cmp.ne p7,p0=r8,r9\n  (p7) br.cond.dpnt Retry_4release\n        br.ret.sptk.many b0\n\nInc_4release:\n        fetchadd4.rel r8=[r32],1\n        br.ret.sptk.many b0\nDec_4release:\n        fetchadd4.rel r8=[r32],-1\n        br.ret.sptk.many b0\n\n        .endp __TBB_machine_fetchadd4release#\n# 62 \"<stdin>\"\n        .section .text\n        .align 16\n        .proc __TBB_machine_fetchstore4release#\n        .global __TBB_machine_fetchstore4release#\n__TBB_machine_fetchstore4release:\n        mf\n;;\n        xchg4 r8=[r32],r33\n        br.ret.sptk.many b0\n        .endp __TBB_machine_fetchstore4release#\n# 88 \"<stdin>\"\n        .section .text\n        .align 16\n# 101 \"<stdin>\"\n        .proc __TBB_machine_cmpswp4release#\n        .global __TBB_machine_cmpswp4release#\n__TBB_machine_cmpswp4release:\n\n        zxt4 r34=r34\n;;\n\n        mov ar.ccv=r34\n;;\n        cmpxchg4.rel r8=[r32],r33,ar.ccv\n        br.ret.sptk.many b0\n        .endp __TBB_machine_cmpswp4release#\n// DO NOT EDIT - AUTOMATICALLY GENERATED FROM tools/generate_atomic/ipf_generate.sh\n# 1 \"<stdin>\"\n# 1 \"<built-in>\"\n# 1 \"<command line>\"\n# 1 \"<stdin>\"\n\n\n\n\n\n        .section .text\n        .align 16\n# 19 \"<stdin>\"\n        .proc __TBB_machine_fetchadd8release#\n        .global __TBB_machine_fetchadd8release#\n__TBB_machine_fetchadd8release:\n\n        cmp.eq p6,p0=1,r33\n        cmp.eq p8,p0=-1,r33\n  (p6) br.cond.dptk Inc_8release\n  (p8) br.cond.dpnt Dec_8release\n;;\n\n        ld8 r9=[r32]\n;;\nRetry_8release:\n        mov ar.ccv=r9\n        mov r8=r9;\n        add r10=r9,r33\n;;\n        cmpxchg8.rel r9=[r32],r10,ar.ccv\n;;\n        cmp.ne p7,p0=r8,r9\n  (p7) br.cond.dpnt Retry_8release\n        br.ret.sptk.many b0\n\nInc_8release:\n        fetchadd8.rel r8=[r32],1\n        br.ret.sptk.many b0\nDec_8release:\n        fetchadd8.rel r8=[r32],-1\n        br.ret.sptk.many b0\n\n        .endp __TBB_machine_fetchadd8release#\n# 62 \"<stdin>\"\n        .section .text\n        .align 16\n        .proc __TBB_machine_fetchstore8release#\n        .global __TBB_machine_fetchstore8release#\n__TBB_machine_fetchstore8release:\n        mf\n;;\n        xchg8 r8=[r32],r33\n        br.ret.sptk.many b0\n        .endp __TBB_machine_fetchstore8release#\n# 88 \"<stdin>\"\n        .section .text\n        .align 16\n# 101 \"<stdin>\"\n        .proc __TBB_machine_cmpswp8release#\n        .global __TBB_machine_cmpswp8release#\n__TBB_machine_cmpswp8release:\n\n\n\n\n        mov ar.ccv=r34\n;;\n        cmpxchg8.rel r8=[r32],r33,ar.ccv\n        br.ret.sptk.many b0\n        .endp __TBB_machine_cmpswp8release#\n"
  },
  {
    "path": "benchmarks/tbb/ia64-gas/ia64_misc.s",
    "content": "// Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n//\n// This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n// you can redistribute it and/or modify it under the terms of the GNU General Public License\n// version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n// distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n// implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n// See  the GNU General Public License for more details.   You should have received a copy of\n// the  GNU General Public License along with Threading Building Blocks; if not, write to the\n// Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n//\n// As a special exception,  you may use this file  as part of a free software library without\n// restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n// functions from this file, or you compile this file and link it with other files to produce\n// an executable,  this file does not by itself cause the resulting executable to be covered\n// by the GNU General Public License. This exception does not however invalidate any other\n// reasons why the executable file might be covered by the GNU General Public License.\n\n\t// RSE backing store pointer retrieval\n    .section .text\n    .align 16\n    .proc __TBB_get_bsp#\n    .global __TBB_get_bsp#\n__TBB_get_bsp:\n        mov r8=ar.bsp\n        br.ret.sptk.many b0\n    .endp __TBB_get_bsp#\n\n    .section .text\n    .align 16\n    .proc __TBB_machine_load8_relaxed#\n    .global __TBB_machine_load8_relaxed#\n__TBB_machine_load8_relaxed:\n        ld8 r8=[r32]\n        br.ret.sptk.many b0\n    .endp __TBB_machine_load8_relaxed#\n\n    .section .text\n    .align 16\n    .proc __TBB_machine_store8_relaxed#\n    .global __TBB_machine_store8_relaxed#\n__TBB_machine_store8_relaxed:\n        st8 [r32]=r33\n        br.ret.sptk.many b0\n    .endp __TBB_machine_store8_relaxed#\n\n    .section .text\n    .align 16\n    .proc __TBB_machine_load4_relaxed#\n    .global __TBB_machine_load4_relaxed#\n__TBB_machine_load4_relaxed:\n        ld4 r8=[r32]\n        br.ret.sptk.many b0\n    .endp __TBB_machine_load4_relaxed#\n\n    .section .text\n    .align 16\n    .proc __TBB_machine_store4_relaxed#\n    .global __TBB_machine_store4_relaxed#\n__TBB_machine_store4_relaxed:\n        st4 [r32]=r33\n        br.ret.sptk.many b0\n    .endp __TBB_machine_store4_relaxed#\n\n    .section .text\n    .align 16\n    .proc __TBB_machine_load2_relaxed#\n    .global __TBB_machine_load2_relaxed#\n__TBB_machine_load2_relaxed:\n        ld2 r8=[r32]\n        br.ret.sptk.many b0\n    .endp __TBB_machine_load2_relaxed#\n\n    .section .text\n    .align 16\n    .proc __TBB_machine_store2_relaxed#\n    .global __TBB_machine_store2_relaxed#\n__TBB_machine_store2_relaxed:\n        st2 [r32]=r33\n        br.ret.sptk.many b0\n    .endp __TBB_machine_store2_relaxed#\n\n    .section .text\n    .align 16\n    .proc __TBB_machine_load1_relaxed#\n    .global __TBB_machine_load1_relaxed#\n__TBB_machine_load1_relaxed:\n        ld1 r8=[r32]\n        br.ret.sptk.many b0\n    .endp __TBB_machine_load1_relaxed#\n\n    .section .text\n    .align 16\n    .proc __TBB_machine_store1_relaxed#\n    .global __TBB_machine_store1_relaxed#\n__TBB_machine_store1_relaxed:\n        st1 [r32]=r33\n        br.ret.sptk.many b0\n    .endp __TBB_machine_store1_relaxed#\n"
  },
  {
    "path": "benchmarks/tbb/ia64-gas/lock_byte.s",
    "content": "// Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n//\n// This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n// you can redistribute it and/or modify it under the terms of the GNU General Public License\n// version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n// distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n// implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n// See  the GNU General Public License for more details.   You should have received a copy of\n// the  GNU General Public License along with Threading Building Blocks; if not, write to the\n// Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n//\n// As a special exception,  you may use this file  as part of a free software library without\n// restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n// functions from this file, or you compile this file and link it with other files to produce\n// an executable,  this file does not by itself cause the resulting executable to be covered\n// by the GNU General Public License. This exception does not however invalidate any other\n// reasons why the executable file might be covered by the GNU General Public License.\n\n\t// Support for class TinyLock\n\t.section .text\n\t.align 16\n\t// unsigned int __TBB_machine_trylockbyte( byte& flag );\n\t// r32 = address of flag \n\t.proc  __TBB_machine_trylockbyte#\n\t.global __TBB_machine_trylockbyte#\nADDRESS_OF_FLAG=r32\nRETCODE=r8\nFLAG=r9\nBUSY=r10\nSCRATCH=r11\n__TBB_machine_trylockbyte:\n        ld1.acq FLAG=[ADDRESS_OF_FLAG]\n        mov BUSY=1\n        mov RETCODE=0\n;;\n        cmp.ne p6,p0=0,FLAG\n        mov ar.ccv=r0\n(p6)    br.ret.sptk.many b0\n;;\n        cmpxchg1.acq SCRATCH=[ADDRESS_OF_FLAG],BUSY,ar.ccv  // Try to acquire lock\n;;\n        cmp.eq p6,p0=0,SCRATCH\n;;\n(p6)    mov RETCODE=1\n   \tbr.ret.sptk.many b0\t\n\t.endp __TBB_machine_trylockbyte#\n"
  },
  {
    "path": "benchmarks/tbb/ia64-gas/log2.s",
    "content": "// Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n//\n// This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n// you can redistribute it and/or modify it under the terms of the GNU General Public License\n// version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n// distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n// implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n// See  the GNU General Public License for more details.   You should have received a copy of\n// the  GNU General Public License along with Threading Building Blocks; if not, write to the\n// Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n//\n// As a special exception,  you may use this file  as part of a free software library without\n// restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n// functions from this file, or you compile this file and link it with other files to produce\n// an executable,  this file does not by itself cause the resulting executable to be covered\n// by the GNU General Public License. This exception does not however invalidate any other\n// reasons why the executable file might be covered by the GNU General Public License.\n\n\t.section .text\n\t.align 16\n\t// unsigned long __TBB_machine_lg( unsigned long x );\n\t// r32 = x\n\t.proc  __TBB_machine_lg#\n\t.global __TBB_machine_lg#\n__TBB_machine_lg:\n        shr r16=r32,1\t// .x\n;;\n        shr r17=r32,2\t// ..x\n\tor r32=r32,r16\t// xx\n;;\n\tshr r16=r32,3\t// ...xx\n\tor r32=r32,r17  // xxx\n;;\n\tshr r17=r32,5\t// .....xxx\n\tor r32=r32,r16  // xxxxx\n;;\n\tshr r16=r32,8\t// ........xxxxx\n\tor r32=r32,r17\t// xxxxxxxx\n;;\n\tshr r17=r32,13\n\tor r32=r32,r16\t// 13x\n;;\n\tshr r16=r32,21\n\tor r32=r32,r17\t// 21x\n;;\n\tshr r17=r32,34  \n\tor r32=r32,r16\t// 34x\n;;\n\tshr r16=r32,55\n\tor r32=r32,r17  // 55x\n;;\n\tor r32=r32,r16  // 64x\n;;\n\tpopcnt r8=r32\n;;\n\tadd r8=-1,r8\n   \tbr.ret.sptk.many b0\t\n\t.endp __TBB_machine_lg#\n"
  },
  {
    "path": "benchmarks/tbb/ia64-gas/pause.s",
    "content": "// Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n//\n// This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n// you can redistribute it and/or modify it under the terms of the GNU General Public License\n// version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n// distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n// implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n// See  the GNU General Public License for more details.   You should have received a copy of\n// the  GNU General Public License along with Threading Building Blocks; if not, write to the\n// Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n//\n// As a special exception,  you may use this file  as part of a free software library without\n// restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n// functions from this file, or you compile this file and link it with other files to produce\n// an executable,  this file does not by itself cause the resulting executable to be covered\n// by the GNU General Public License. This exception does not however invalidate any other\n// reasons why the executable file might be covered by the GNU General Public License.\n\n\t.section .text\n\t.align 16\n\t// void __TBB_machine_pause( long count );\n\t// r32 = count\n\t.proc  __TBB_machine_pause#\n\t.global __TBB_machine_pause#\ncount = r32\n__TBB_machine_pause:\n        hint.m 0\n\tadd count=-1,count\n;;\n\tcmp.eq p6,p7=0,count\n(p7)\tbr.cond.dpnt __TBB_machine_pause\n(p6)   \tbr.ret.sptk.many b0\t\n\t.endp __TBB_machine_pause#\n"
  },
  {
    "path": "benchmarks/tbb/ibm_aix51/atomic_support.c",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#include <stdint.h>\n#include <sys/atomic_op.h>\n\n/* This file must be compiled with gcc.  The IBM compiler doesn't seem to\n   support inline assembly statements (October 2007). */\n\n#ifdef __GNUC__\n\nint32_t __TBB_machine_cas_32 (volatile void* ptr, int32_t value, int32_t comparand) { \n    __asm__ __volatile__ (\"sync\\n\");  /* memory release operation */\n    compare_and_swap ((atomic_p) ptr, &comparand, value);\n    __asm__ __volatile__ (\"isync\\n\");  /* memory acquire operation */\n    return comparand;\n}\n\nint64_t __TBB_machine_cas_64 (volatile void* ptr, int64_t value, int64_t comparand) { \n    __asm__ __volatile__ (\"sync\\n\");  /* memory release operation */\n    compare_and_swaplp ((atomic_l) ptr, &comparand, value);\n    __asm__ __volatile__ (\"isync\\n\");  /* memory acquire operation */\n    return comparand;\n}\n\nvoid __TBB_machine_flush () { \n    __asm__ __volatile__ (\"sync\\n\");\n}\n\nvoid __TBB_machine_lwsync () { \n    __asm__ __volatile__ (\"lwsync\\n\");\n}\n\nvoid __TBB_machine_isync () { \n    __asm__ __volatile__ (\"isync\\n\");\n}\n\n#endif /* __GNUC__ */\n"
  },
  {
    "path": "benchmarks/tbb/intel64-masm/atomic_support.asm",
    "content": "; Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n;\n; This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n; you can redistribute it and/or modify it under the terms of the GNU General Public License\n; version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n; distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n; implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n; See  the GNU General Public License for more details.   You should have received a copy of\n; the  GNU General Public License along with Threading Building Blocks; if not, write to the\n; Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n;\n; As a special exception,  you may use this file  as part of a free software library without\n; restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n; functions from this file, or you compile this file and link it with other files to produce\n; an executable,  this file does not by itself cause the resulting executable to be covered\n; by the GNU General Public License. This exception does not however invalidate any other\n; reasons why the executable file might be covered by the GNU General Public License.\n\n; DO NOT EDIT - AUTOMATICALLY GENERATED FROM .s FILE\n.code \n\tALIGN 8\n\tPUBLIC __TBB_machine_fetchadd1\n__TBB_machine_fetchadd1:\n\tmov rax,rdx\n\tlock xadd [rcx],al\n\tret\n.code \n\tALIGN 8\n\tPUBLIC __TBB_machine_fetchstore1\n__TBB_machine_fetchstore1:\n\tmov rax,rdx\n\tlock xchg [rcx],al\n\tret\n.code \n\tALIGN 8\n\tPUBLIC __TBB_machine_cmpswp1\n__TBB_machine_cmpswp1:\n\tmov rax,r8\n\tlock cmpxchg [rcx],dl\n\tret\n.code \n\tALIGN 8\n\tPUBLIC __TBB_machine_fetchadd2\n__TBB_machine_fetchadd2:\n\tmov rax,rdx\n\tlock xadd [rcx],ax\n\tret\n.code \n\tALIGN 8\n\tPUBLIC __TBB_machine_fetchstore2\n__TBB_machine_fetchstore2:\n\tmov rax,rdx\n\tlock xchg [rcx],ax\n\tret\n.code \n\tALIGN 8\n\tPUBLIC __TBB_machine_cmpswp2\n__TBB_machine_cmpswp2:\n\tmov rax,r8\n\tlock cmpxchg [rcx],dx\n\tret\n.code\n        ALIGN 8\n        PUBLIC __TBB_machine_pause\n__TBB_machine_pause:\nL1:\n        dw 090f3H; pause\n        add ecx,-1\n        jne L1\n        ret\nend\n\n"
  },
  {
    "path": "benchmarks/tbb/intel64-masm/intel64_misc.asm",
    "content": "; Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n;\n; This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n; you can redistribute it and/or modify it under the terms of the GNU General Public License\n; version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n; distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n; implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n; See  the GNU General Public License for more details.   You should have received a copy of\n; the  GNU General Public License along with Threading Building Blocks; if not, write to the\n; Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n;\n; As a special exception,  you may use this file  as part of a free software library without\n; restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n; functions from this file, or you compile this file and link it with other files to produce\n; an executable,  this file does not by itself cause the resulting executable to be covered\n; by the GNU General Public License. This exception does not however invalidate any other\n; reasons why the executable file might be covered by the GNU General Public License.\n\n.code\n\tALIGN 8\n\tPUBLIC __TBB_get_cpu_ctl_env\n__TBB_get_cpu_ctl_env:\n    stmxcsr [rcx]\n    fstcw   [rcx+4]\n\tret\n.code\n\tALIGN 8\n\tPUBLIC __TBB_set_cpu_ctl_env\n__TBB_set_cpu_ctl_env:\n    ldmxcsr [rcx]\n    fldcw   [rcx+4]\n\tret\nend\n"
  },
  {
    "path": "benchmarks/tbb/intel64-masm/itsx.asm",
    "content": "; Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n;\n; This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n; you can redistribute it and/or modify it under the terms of the GNU General Public License\n; version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n; distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n; implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n; See  the GNU General Public License for more details.   You should have received a copy of\n; the  GNU General Public License along with Threading Building Blocks; if not, write to the\n; Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n;\n; As a special exception,  you may use this file  as part of a free software library without\n; restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n; functions from this file, or you compile this file and link it with other files to produce\n; an executable,  this file does not by itself cause the resulting executable to be covered\n; by the GNU General Public License. This exception does not however invalidate any other\n; reasons why the executable file might be covered by the GNU General Public License.\n\n.code\n        ALIGN 8\n        PUBLIC __TBB_machine_try_lock_elided\n__TBB_machine_try_lock_elided:\n        xor  rax, rax\n        mov  al, 1\n        BYTE 0F2H\n        xchg al, byte ptr [rcx]\n        xor  al, 1\n        ret\n.code\n        ALIGN 8\n        PUBLIC __TBB_machine_unlock_elided\n__TBB_machine_unlock_elided:\n        BYTE 0F3H\n        mov  byte ptr [rcx], 0\n        ret\n.code \n\tALIGN 8\n\tPUBLIC __TBB_machine_begin_transaction\n__TBB_machine_begin_transaction:\n        mov  eax, -1\n        BYTE 0C7H\n        BYTE 0F8H\n        BYTE 000H\n        BYTE 000H\n        BYTE 000H\n        BYTE 000H\n        ret\n.code \n\tALIGN 8\n\tPUBLIC __TBB_machine_end_transaction\n__TBB_machine_end_transaction:\n        BYTE 00FH\n        BYTE 001H\n        BYTE 0D5H\n        ret\n.code \n\tALIGN 8\n\tPUBLIC __TBB_machine_transaction_conflict_abort\n__TBB_machine_transaction_conflict_abort:\n        BYTE 0C6H\n        BYTE 0F8H\n        BYTE 0FFH  ; 12.4.5 Abort argument: lock not free when tested\n        ret\n.code \n        ALIGN 8\n\tPUBLIC __TBB_machine_is_in_transaction\n__TBB_machine_is_in_transaction:\n        xor eax, eax\n        BYTE 00FH  ; _xtest sets or clears ZF\n        BYTE 001H\n        BYTE 0D6H\n        jz   rset\n        mov  al,1\nrset:\n        ret\nend\n"
  },
  {
    "path": "benchmarks/tbb/internal/_aggregator_impl.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB__aggregator_impl_H\n#define __TBB__aggregator_impl_H\n\n#include \"../atomic.h\"\n#if !__TBBMALLOC_BUILD\n#include \"../tbb_profiling.h\"\n#endif\n\nnamespace tbb {\nnamespace interface6 {\nnamespace internal {\n\nusing namespace tbb::internal;\n\n//! aggregated_operation base class\ntemplate <typename Derived>\nclass aggregated_operation {\n public:\n    uintptr_t status;\n    Derived *next;\n    aggregated_operation() : status(0), next(NULL) {}\n};\n\n//! Aggregator base class\n/** An aggregator for collecting operations coming from multiple sources and executing\n    them serially on a single thread.  operation_type must be derived from\n    aggregated_operation. The parameter handler_type is a functor that will be passed the\n    list of operations and is expected to handle each operation appropriately, setting the\n    status of each operation to non-zero.*/\ntemplate < typename operation_type >\nclass aggregator_generic {\npublic:\n    aggregator_generic() : handler_busy(false) { pending_operations = NULL; }\n\n    //! Place operation in list\n    /** Place operation in list and either handle list or wait for operation to\n        complete.\n        long_life_time specifies life time of an operation inserting in an aggregator.\n        \"Long\" (long_life_time == true) life time operation can be accessed\n        even after executing it.\n        \"Short\" (long_life_time == false) life time operations can be destroyed\n        during executing so any access to it after executing is invalid.*/\n    template < typename handler_type >\n    void execute(operation_type *op, handler_type &handle_operations, bool long_life_time = true) {\n        operation_type *res;\n        // op->status should be read before inserting the operation in the\n        // aggregator queue since it can become invalid after executing a\n        // handler (if the operation has 'short' life time.)\n        const uintptr_t status = op->status;\n\n        // ITT note: &(op->status) tag is used to cover accesses to this op node. This\n        // thread has created the operation, and now releases it so that the handler\n        // thread may handle the associated operation w/o triggering a race condition;\n        // thus this tag will be acquired just before the operation is handled in the\n        // handle_operations functor.\n        call_itt_notify(releasing, &(op->status));\n        // insert the operation in the queue.\n        do {\n            // ITT may flag the following line as a race; it is a false positive:\n            // This is an atomic read; we don't provide itt_hide_load_word for atomics\n            op->next = res = pending_operations; // NOT A RACE\n        } while (pending_operations.compare_and_swap(op, res) != res);\n        if (!res) { // first in the list; handle the operations.\n            // ITT note: &pending_operations tag covers access to the handler_busy flag,\n            // which this waiting handler thread will try to set before entering\n            // handle_operations.\n            call_itt_notify(acquired, &pending_operations);\n            start_handle_operations(handle_operations);\n            // The operation with 'short' life time can already be destroyed.\n            if (long_life_time)\n                __TBB_ASSERT(op->status, NULL);\n        }\n        // not first; wait for op to be ready.\n        else if (!status) { // operation is blocking here.\n            __TBB_ASSERT(long_life_time, \"The blocking operation cannot have 'short' life time. Since it can already be destroyed.\");\n            call_itt_notify(prepare, &(op->status));\n            spin_wait_while_eq(op->status, uintptr_t(0));\n            itt_load_word_with_acquire(op->status);\n        }\n    }\n\n private:\n    //! An atomically updated list (aka mailbox) of pending operations\n    atomic<operation_type *> pending_operations;\n    //! Controls thread access to handle_operations\n    uintptr_t handler_busy;\n\n    //! Trigger the handling of operations when the handler is free\n    template < typename handler_type >\n    void start_handle_operations( handler_type &handle_operations ) {\n        operation_type *op_list;\n\n        // ITT note: &handler_busy tag covers access to pending_operations as it is passed\n        // between active and waiting handlers.  Below, the waiting handler waits until\n        // the active handler releases, and the waiting handler acquires &handler_busy as\n        // it becomes the active_handler. The release point is at the end of this\n        // function, when all operations in pending_operations have been handled by the\n        // owner of this aggregator.\n        call_itt_notify(prepare, &handler_busy);\n        // get the handler_busy:\n        // only one thread can possibly spin here at a time\n        spin_wait_until_eq(handler_busy, uintptr_t(0));\n        call_itt_notify(acquired, &handler_busy);\n        // acquire fence not necessary here due to causality rule and surrounding atomics\n        __TBB_store_with_release(handler_busy, uintptr_t(1));\n\n        // ITT note: &pending_operations tag covers access to the handler_busy flag\n        // itself. Capturing the state of the pending_operations signifies that\n        // handler_busy has been set and a new active handler will now process that list's\n        // operations.\n        call_itt_notify(releasing, &pending_operations);\n        // grab pending_operations\n        op_list = pending_operations.fetch_and_store(NULL);\n\n        // handle all the operations\n        handle_operations(op_list);\n\n        // release the handler\n        itt_store_word_with_release(handler_busy, uintptr_t(0));\n    }\n};\n\ntemplate < typename handler_type, typename operation_type >\nclass aggregator : public aggregator_generic<operation_type> {\n    handler_type handle_operations;\npublic:\n    aggregator() {}\n    explicit aggregator(handler_type h) : handle_operations(h) {}\n\n    void initialize_handler(handler_type h) { handle_operations = h; }\n\n    void execute(operation_type *op) {\n        aggregator_generic<operation_type>::execute(op, handle_operations);\n    }\n};\n\n// the most-compatible friend declaration (vs, gcc, icc) is\n//    template<class U, class V> friend class aggregating_functor;\ntemplate<typename aggregating_class, typename operation_list>\nclass aggregating_functor {\n    aggregating_class *fi;\npublic:\n    aggregating_functor() {}\n    aggregating_functor(aggregating_class *fi_) : fi(fi_) {}\n    void operator()(operation_list* op_list) { fi->handle_operations(op_list); }\n};\n\n} // namespace internal\n} // namespace interface6\n\nnamespace internal {\n    using interface6::internal::aggregated_operation;\n    using interface6::internal::aggregator_generic;\n    using interface6::internal::aggregator;\n    using interface6::internal::aggregating_functor;\n} // namespace internal\n\n} // namespace tbb\n\n#endif  // __TBB__aggregator_impl_H\n"
  },
  {
    "path": "benchmarks/tbb/internal/_concurrent_queue_impl.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB__concurrent_queue_impl_H\n#define __TBB__concurrent_queue_impl_H\n\n#ifndef __TBB_concurrent_queue_H\n#error Do not #include this internal file directly; use public TBB headers instead.\n#endif\n\n#include \"../tbb_stddef.h\"\n#include \"../tbb_machine.h\"\n#include \"../atomic.h\"\n#include \"../spin_mutex.h\"\n#include \"../cache_aligned_allocator.h\"\n#include \"../tbb_exception.h\"\n#include \"../tbb_profiling.h\"\n#include <new>\n#include <utility>\n\n#if !TBB_USE_EXCEPTIONS && _MSC_VER\n    // Suppress \"C++ exception handler used, but unwind semantics are not enabled\" warning in STL headers\n    #pragma warning (push)\n    #pragma warning (disable: 4530)\n#endif\n\n#include <iterator>\n\n#if !TBB_USE_EXCEPTIONS && _MSC_VER\n    #pragma warning (pop)\n#endif\n\nnamespace tbb {\n\n#if !__TBB_TEMPLATE_FRIENDS_BROKEN\n\n// forward declaration\nnamespace strict_ppl {\ntemplate<typename T, typename A> class concurrent_queue;\n}\n\ntemplate<typename T, typename A> class concurrent_bounded_queue;\n\n#endif\n\n//! For internal use only.\nnamespace strict_ppl {\n\n//! @cond INTERNAL\nnamespace internal {\n\nusing namespace tbb::internal;\n\ntypedef size_t ticket;\n\ntemplate<typename T> class micro_queue ;\ntemplate<typename T> class micro_queue_pop_finalizer ;\ntemplate<typename T> class concurrent_queue_base_v3;\ntemplate<typename T> struct concurrent_queue_rep;\n\n//! parts of concurrent_queue_rep that do not have references to micro_queue\n/**\n * For internal use only.\n */\nstruct concurrent_queue_rep_base : no_copy {\n    template<typename T> friend class micro_queue;\n    template<typename T> friend class concurrent_queue_base_v3;\n\nprotected:\n    //! Approximately n_queue/golden ratio\n    static const size_t phi = 3;\n\npublic:\n    // must be power of 2\n    static const size_t n_queue = 8;\n\n    //! Prefix on a page\n    struct page {\n        page* next;\n        uintptr_t mask;\n    };\n\n    atomic<ticket> head_counter;\n    char pad1[NFS_MaxLineSize-sizeof(atomic<ticket>)];\n    atomic<ticket> tail_counter;\n    char pad2[NFS_MaxLineSize-sizeof(atomic<ticket>)];\n\n    //! Always a power of 2\n    size_t items_per_page;\n\n    //! Size of an item\n    size_t item_size;\n\n    //! number of invalid entries in the queue\n    atomic<size_t> n_invalid_entries;\n\n    char pad3[NFS_MaxLineSize-sizeof(size_t)-sizeof(size_t)-sizeof(atomic<size_t>)];\n} ;\n\ninline bool is_valid_page(const concurrent_queue_rep_base::page* p) {\n    return uintptr_t(p)>1;\n}\n\n//! Abstract class to define interface for page allocation/deallocation\n/**\n * For internal use only.\n */\nclass concurrent_queue_page_allocator\n{\n    template<typename T> friend class micro_queue ;\n    template<typename T> friend class micro_queue_pop_finalizer ;\nprotected:\n    virtual ~concurrent_queue_page_allocator() {}\nprivate:\n    virtual concurrent_queue_rep_base::page* allocate_page() = 0;\n    virtual void deallocate_page( concurrent_queue_rep_base::page* p ) = 0;\n} ;\n\n#if _MSC_VER && !defined(__INTEL_COMPILER)\n// unary minus operator applied to unsigned type, result still unsigned\n#pragma warning( push )\n#pragma warning( disable: 4146 )\n#endif\n\n//! A queue using simple locking.\n/** For efficiency, this class has no constructor.\n    The caller is expected to zero-initialize it. */\ntemplate<typename T>\nclass micro_queue : no_copy {\npublic:\n    typedef void (*item_constructor_t)(T* location, const void* src);\nprivate:\n    typedef concurrent_queue_rep_base::page page;\n\n    //! Class used to ensure exception-safety of method \"pop\"\n    class destroyer: no_copy {\n        T& my_value;\n    public:\n        destroyer( T& value ) : my_value(value) {}\n        ~destroyer() {my_value.~T();}\n    };\n\n    void copy_item( page& dst, size_t dindex, const void* src, item_constructor_t construct_item ) {\n        construct_item( &get_ref(dst, dindex), src );\n    }\n\n    void copy_item( page& dst, size_t dindex, const page& src, size_t sindex,\n        item_constructor_t construct_item )\n    {\n        T& src_item = get_ref( const_cast<page&>(src), sindex );\n        construct_item( &get_ref(dst, dindex), static_cast<const void*>(&src_item) );\n    }\n\n    void assign_and_destroy_item( void* dst, page& src, size_t index ) {\n        T& from = get_ref(src,index);\n        destroyer d(from);\n        *static_cast<T*>(dst) = tbb::internal::move( from );\n    }\n\n    void spin_wait_until_my_turn( atomic<ticket>& counter, ticket k, concurrent_queue_rep_base& rb ) const ;\n\npublic:\n    friend class micro_queue_pop_finalizer<T>;\n\n    struct padded_page: page {\n        //! Not defined anywhere - exists to quiet warnings.\n        padded_page();\n        //! Not defined anywhere - exists to quiet warnings.\n        void operator=( const padded_page& );\n        //! Must be last field.\n        T last;\n    };\n\n    static T& get_ref( page& p, size_t index ) {\n        return (&static_cast<padded_page*>(static_cast<void*>(&p))->last)[index];\n    }\n\n    atomic<page*> head_page;\n    atomic<ticket> head_counter;\n\n    atomic<page*> tail_page;\n    atomic<ticket> tail_counter;\n\n    spin_mutex page_mutex;\n\n    void push( const void* item, ticket k, concurrent_queue_base_v3<T>& base,\n        item_constructor_t construct_item ) ;\n\n    bool pop( void* dst, ticket k, concurrent_queue_base_v3<T>& base ) ;\n\n    micro_queue& assign( const micro_queue& src, concurrent_queue_base_v3<T>& base,\n        item_constructor_t construct_item ) ;\n\n    page* make_copy( concurrent_queue_base_v3<T>& base, const page* src_page, size_t begin_in_page,\n        size_t end_in_page, ticket& g_index, item_constructor_t construct_item ) ;\n\n    void invalidate_page_and_rethrow( ticket k ) ;\n};\n\ntemplate<typename T>\nvoid micro_queue<T>::spin_wait_until_my_turn( atomic<ticket>& counter, ticket k, concurrent_queue_rep_base& rb ) const {\n    for( atomic_backoff b(true);;b.pause() ) {\n        ticket c = counter;\n        if( c==k ) return;\n        else if( c&1 ) {\n            ++rb.n_invalid_entries;\n            throw_exception( eid_bad_last_alloc );\n        }\n    }\n}\n\ntemplate<typename T>\nvoid micro_queue<T>::push( const void* item, ticket k, concurrent_queue_base_v3<T>& base,\n    item_constructor_t construct_item )\n{\n    k &= -concurrent_queue_rep_base::n_queue;\n    page* p = NULL;\n    size_t index = modulo_power_of_two( k/concurrent_queue_rep_base::n_queue, base.my_rep->items_per_page);\n    if( !index ) {\n        __TBB_TRY {\n            concurrent_queue_page_allocator& pa = base;\n            p = pa.allocate_page();\n        } __TBB_CATCH (...) {\n            ++base.my_rep->n_invalid_entries;\n            invalidate_page_and_rethrow( k );\n        }\n        p->mask = 0;\n        p->next = NULL;\n    }\n\n    if( tail_counter != k ) spin_wait_until_my_turn( tail_counter, k, *base.my_rep );\n    call_itt_notify(acquired, &tail_counter);\n\n    if( p ) {\n        spin_mutex::scoped_lock lock( page_mutex );\n        page* q = tail_page;\n        if( is_valid_page(q) )\n            q->next = p;\n        else\n            head_page = p;\n        tail_page = p;\n    } else {\n        p = tail_page;\n    }\n\n    __TBB_TRY {\n        copy_item( *p, index, item, construct_item );\n        // If no exception was thrown, mark item as present.\n        itt_hide_store_word(p->mask,  p->mask | uintptr_t(1)<<index);\n        call_itt_notify(releasing, &tail_counter);\n        tail_counter += concurrent_queue_rep_base::n_queue;\n    } __TBB_CATCH (...) {\n        ++base.my_rep->n_invalid_entries;\n        call_itt_notify(releasing, &tail_counter);\n        tail_counter += concurrent_queue_rep_base::n_queue;\n        __TBB_RETHROW();\n    }\n}\n\ntemplate<typename T>\nbool micro_queue<T>::pop( void* dst, ticket k, concurrent_queue_base_v3<T>& base ) {\n    k &= -concurrent_queue_rep_base::n_queue;\n    if( head_counter!=k ) spin_wait_until_eq( head_counter, k );\n    call_itt_notify(acquired, &head_counter);\n    if( tail_counter==k ) spin_wait_while_eq( tail_counter, k );\n    call_itt_notify(acquired, &tail_counter);\n    page& p = *head_page;\n    __TBB_ASSERT( &p, NULL );\n    size_t index = modulo_power_of_two( k/concurrent_queue_rep_base::n_queue, base.my_rep->items_per_page );\n    bool success = false;\n    {\n        micro_queue_pop_finalizer<T> finalizer( *this, base, k+concurrent_queue_rep_base::n_queue, index==base.my_rep->items_per_page-1 ? &p : NULL );\n        if( p.mask & uintptr_t(1)<<index ) {\n            success = true;\n            assign_and_destroy_item( dst, p, index );\n        } else {\n            --base.my_rep->n_invalid_entries;\n        }\n    }\n    return success;\n}\n\ntemplate<typename T>\nmicro_queue<T>& micro_queue<T>::assign( const micro_queue<T>& src, concurrent_queue_base_v3<T>& base,\n    item_constructor_t construct_item )\n{\n    head_counter = src.head_counter;\n    tail_counter = src.tail_counter;\n\n    const page* srcp = src.head_page;\n    if( is_valid_page(srcp) ) {\n        ticket g_index = head_counter;\n        __TBB_TRY {\n            size_t n_items  = (tail_counter-head_counter)/concurrent_queue_rep_base::n_queue;\n            size_t index = modulo_power_of_two( head_counter/concurrent_queue_rep_base::n_queue, base.my_rep->items_per_page );\n            size_t end_in_first_page = (index+n_items<base.my_rep->items_per_page)?(index+n_items):base.my_rep->items_per_page;\n\n            head_page = make_copy( base, srcp, index, end_in_first_page, g_index, construct_item );\n            page* cur_page = head_page;\n\n            if( srcp != src.tail_page ) {\n                for( srcp = srcp->next; srcp!=src.tail_page; srcp=srcp->next ) {\n                    cur_page->next = make_copy( base, srcp, 0, base.my_rep->items_per_page, g_index, construct_item );\n                    cur_page = cur_page->next;\n                }\n\n                __TBB_ASSERT( srcp==src.tail_page, NULL );\n                size_t last_index = modulo_power_of_two( tail_counter/concurrent_queue_rep_base::n_queue, base.my_rep->items_per_page );\n                if( last_index==0 ) last_index = base.my_rep->items_per_page;\n\n                cur_page->next = make_copy( base, srcp, 0, last_index, g_index, construct_item );\n                cur_page = cur_page->next;\n            }\n            tail_page = cur_page;\n        } __TBB_CATCH (...) {\n            invalidate_page_and_rethrow( g_index );\n        }\n    } else {\n        head_page = tail_page = NULL;\n    }\n    return *this;\n}\n\ntemplate<typename T>\nvoid micro_queue<T>::invalidate_page_and_rethrow( ticket k ) {\n    // Append an invalid page at address 1 so that no more pushes are allowed.\n    page* invalid_page = (page*)uintptr_t(1);\n    {\n        spin_mutex::scoped_lock lock( page_mutex );\n        itt_store_word_with_release(tail_counter, k+concurrent_queue_rep_base::n_queue+1);\n        page* q = tail_page;\n        if( is_valid_page(q) )\n            q->next = invalid_page;\n        else\n            head_page = invalid_page;\n        tail_page = invalid_page;\n    }\n    __TBB_RETHROW();\n}\n\ntemplate<typename T>\nconcurrent_queue_rep_base::page* micro_queue<T>::make_copy( concurrent_queue_base_v3<T>& base,\n    const concurrent_queue_rep_base::page* src_page, size_t begin_in_page, size_t end_in_page,\n    ticket& g_index, item_constructor_t construct_item )\n{\n    concurrent_queue_page_allocator& pa = base;\n    page* new_page = pa.allocate_page();\n    new_page->next = NULL;\n    new_page->mask = src_page->mask;\n    for( ; begin_in_page!=end_in_page; ++begin_in_page, ++g_index )\n        if( new_page->mask & uintptr_t(1)<<begin_in_page )\n            copy_item( *new_page, begin_in_page, *src_page, begin_in_page, construct_item );\n    return new_page;\n}\n\ntemplate<typename T>\nclass micro_queue_pop_finalizer: no_copy {\n    typedef concurrent_queue_rep_base::page page;\n    ticket my_ticket;\n    micro_queue<T>& my_queue;\n    page* my_page;\n    concurrent_queue_page_allocator& allocator;\npublic:\n    micro_queue_pop_finalizer( micro_queue<T>& queue, concurrent_queue_base_v3<T>& b, ticket k, page* p ) :\n        my_ticket(k), my_queue(queue), my_page(p), allocator(b)\n    {}\n    ~micro_queue_pop_finalizer() ;\n};\n\ntemplate<typename T>\nmicro_queue_pop_finalizer<T>::~micro_queue_pop_finalizer() {\n    page* p = my_page;\n    if( is_valid_page(p) ) {\n        spin_mutex::scoped_lock lock( my_queue.page_mutex );\n        page* q = p->next;\n        my_queue.head_page = q;\n        if( !is_valid_page(q) ) {\n            my_queue.tail_page = NULL;\n        }\n    }\n    itt_store_word_with_release(my_queue.head_counter, my_ticket);\n    if( is_valid_page(p) ) {\n        allocator.deallocate_page( p );\n    }\n}\n\n#if _MSC_VER && !defined(__INTEL_COMPILER)\n#pragma warning( pop )\n#endif // warning 4146 is back\n\ntemplate<typename T> class concurrent_queue_iterator_rep ;\ntemplate<typename T> class concurrent_queue_iterator_base_v3;\n\n//! representation of concurrent_queue_base\n/**\n * the class inherits from concurrent_queue_rep_base and defines an array of micro_queue<T>'s\n */\ntemplate<typename T>\nstruct concurrent_queue_rep : public concurrent_queue_rep_base {\n    micro_queue<T> array[n_queue];\n\n    //! Map ticket to an array index\n    static size_t index( ticket k ) {\n        return k*phi%n_queue;\n    }\n\n    micro_queue<T>& choose( ticket k ) {\n        // The formula here approximates LRU in a cache-oblivious way.\n        return array[index(k)];\n    }\n};\n\n//! base class of concurrent_queue\n/**\n * The class implements the interface defined by concurrent_queue_page_allocator\n * and has a pointer to an instance of concurrent_queue_rep.\n */\ntemplate<typename T>\nclass concurrent_queue_base_v3: public concurrent_queue_page_allocator {\n    //! Internal representation\n    concurrent_queue_rep<T>* my_rep;\n\n    friend struct concurrent_queue_rep<T>;\n    friend class micro_queue<T>;\n    friend class concurrent_queue_iterator_rep<T>;\n    friend class concurrent_queue_iterator_base_v3<T>;\n\nprotected:\n    typedef typename concurrent_queue_rep<T>::page page;\n\nprivate:\n    typedef typename micro_queue<T>::padded_page padded_page;\n    typedef typename micro_queue<T>::item_constructor_t item_constructor_t;\n\n    /* override */ virtual page *allocate_page() {\n        concurrent_queue_rep<T>& r = *my_rep;\n        size_t n = sizeof(padded_page) + (r.items_per_page-1)*sizeof(T);\n        return reinterpret_cast<page*>(allocate_block ( n ));\n    }\n\n    /* override */ virtual void deallocate_page( concurrent_queue_rep_base::page *p ) {\n        concurrent_queue_rep<T>& r = *my_rep;\n        size_t n = sizeof(padded_page) + (r.items_per_page-1)*sizeof(T);\n        deallocate_block( reinterpret_cast<void*>(p), n );\n    }\n\n    //! custom allocator\n    virtual void *allocate_block( size_t n ) = 0;\n\n    //! custom de-allocator\n    virtual void deallocate_block( void *p, size_t n ) = 0;\n\nprotected:\n    concurrent_queue_base_v3();\n\n    /* override */ virtual ~concurrent_queue_base_v3() {\n#if TBB_USE_ASSERT\n        size_t nq = my_rep->n_queue;\n        for( size_t i=0; i<nq; i++ )\n            __TBB_ASSERT( my_rep->array[i].tail_page==NULL, \"pages were not freed properly\" );\n#endif /* TBB_USE_ASSERT */\n        cache_aligned_allocator<concurrent_queue_rep<T> >().deallocate(my_rep,1);\n    }\n\n    //! Enqueue item at tail of queue\n    void internal_push( const void* src, item_constructor_t construct_item ) {\n         concurrent_queue_rep<T>& r = *my_rep;\n         ticket k = r.tail_counter++;\n         r.choose(k).push( src, k, *this, construct_item );\n    }\n\n    //! Attempt to dequeue item from queue.\n    /** NULL if there was no item to dequeue. */\n    bool internal_try_pop( void* dst ) ;\n\n    //! Get size of queue; result may be invalid if queue is modified concurrently\n    size_t internal_size() const ;\n\n    //! check if the queue is empty; thread safe\n    bool internal_empty() const ;\n\n    //! free any remaining pages\n    /* note that the name may be misleading, but it remains so due to a historical accident. */\n    void internal_finish_clear() ;\n\n    //! Obsolete\n    void internal_throw_exception() const {\n        throw_exception( eid_bad_alloc );\n    }\n\n    //! copy or move internal representation\n    void assign( const concurrent_queue_base_v3& src, item_constructor_t construct_item ) ;\n\n#if __TBB_CPP11_RVALUE_REF_PRESENT\n    //! swap internal representation\n    void internal_swap( concurrent_queue_base_v3& src ) {\n        std::swap( my_rep, src.my_rep );\n    }\n#endif /* __TBB_CPP11_RVALUE_REF_PRESENT */\n};\n\ntemplate<typename T>\nconcurrent_queue_base_v3<T>::concurrent_queue_base_v3() {\n    const size_t item_size = sizeof(T);\n    my_rep = cache_aligned_allocator<concurrent_queue_rep<T> >().allocate(1);\n    __TBB_ASSERT( (size_t)my_rep % NFS_GetLineSize()==0, \"alignment error\" );\n    __TBB_ASSERT( (size_t)&my_rep->head_counter % NFS_GetLineSize()==0, \"alignment error\" );\n    __TBB_ASSERT( (size_t)&my_rep->tail_counter % NFS_GetLineSize()==0, \"alignment error\" );\n    __TBB_ASSERT( (size_t)&my_rep->array % NFS_GetLineSize()==0, \"alignment error\" );\n    memset(my_rep,0,sizeof(concurrent_queue_rep<T>));\n    my_rep->item_size = item_size;\n    my_rep->items_per_page = item_size<=  8 ? 32 :\n                             item_size<= 16 ? 16 :\n                             item_size<= 32 ?  8 :\n                             item_size<= 64 ?  4 :\n                             item_size<=128 ?  2 :\n                             1;\n}\n\ntemplate<typename T>\nbool concurrent_queue_base_v3<T>::internal_try_pop( void* dst ) {\n    concurrent_queue_rep<T>& r = *my_rep;\n    ticket k;\n    do {\n        k = r.head_counter;\n        for(;;) {\n            if( (ptrdiff_t)(r.tail_counter-k)<=0 ) {\n                // Queue is empty\n                return false;\n            }\n            // Queue had item with ticket k when we looked.  Attempt to get that item.\n            ticket tk=k;\n#if defined(_MSC_VER) && defined(_Wp64)\n    #pragma warning (push)\n    #pragma warning (disable: 4267)\n#endif\n            k = r.head_counter.compare_and_swap( tk+1, tk );\n#if defined(_MSC_VER) && defined(_Wp64)\n    #pragma warning (pop)\n#endif\n            if( k==tk )\n                break;\n            // Another thread snatched the item, retry.\n        }\n    } while( !r.choose( k ).pop( dst, k, *this ) );\n    return true;\n}\n\ntemplate<typename T>\nsize_t concurrent_queue_base_v3<T>::internal_size() const {\n    concurrent_queue_rep<T>& r = *my_rep;\n    __TBB_ASSERT( sizeof(ptrdiff_t)<=sizeof(size_t), NULL );\n    ticket hc = r.head_counter;\n    size_t nie = r.n_invalid_entries;\n    ticket tc = r.tail_counter;\n    __TBB_ASSERT( hc!=tc || !nie, NULL );\n    ptrdiff_t sz = tc-hc-nie;\n    return sz<0 ? 0 :  size_t(sz);\n}\n\ntemplate<typename T>\nbool concurrent_queue_base_v3<T>::internal_empty() const {\n    concurrent_queue_rep<T>& r = *my_rep;\n    ticket tc = r.tail_counter;\n    ticket hc = r.head_counter;\n    // if tc!=r.tail_counter, the queue was not empty at some point between the two reads.\n    return tc==r.tail_counter && tc==hc+r.n_invalid_entries ;\n}\n\ntemplate<typename T>\nvoid concurrent_queue_base_v3<T>::internal_finish_clear() {\n    concurrent_queue_rep<T>& r = *my_rep;\n    size_t nq = r.n_queue;\n    for( size_t i=0; i<nq; ++i ) {\n        page* tp = r.array[i].tail_page;\n        if( is_valid_page(tp) ) {\n            __TBB_ASSERT( r.array[i].head_page==tp, \"at most one page should remain\" );\n            deallocate_page( tp );\n            r.array[i].tail_page = NULL;\n        } else\n            __TBB_ASSERT( !is_valid_page(r.array[i].head_page), \"head page pointer corrupt?\" );\n    }\n}\n\ntemplate<typename T>\nvoid concurrent_queue_base_v3<T>::assign( const concurrent_queue_base_v3& src,\n    item_constructor_t construct_item )\n{\n    concurrent_queue_rep<T>& r = *my_rep;\n    r.items_per_page = src.my_rep->items_per_page;\n\n    // copy concurrent_queue_rep data\n    r.head_counter = src.my_rep->head_counter;\n    r.tail_counter = src.my_rep->tail_counter;\n    r.n_invalid_entries = src.my_rep->n_invalid_entries;\n\n    // copy or move micro_queues\n    for( size_t i = 0; i < r.n_queue; ++i )\n        r.array[i].assign( src.my_rep->array[i], *this, construct_item);\n\n    __TBB_ASSERT( r.head_counter==src.my_rep->head_counter && r.tail_counter==src.my_rep->tail_counter,\n            \"the source concurrent queue should not be concurrently modified.\" );\n}\n\ntemplate<typename Container, typename Value> class concurrent_queue_iterator;\n\ntemplate<typename T>\nclass concurrent_queue_iterator_rep: no_assign {\n    typedef typename micro_queue<T>::padded_page padded_page;\npublic:\n    ticket head_counter;\n    const concurrent_queue_base_v3<T>& my_queue;\n    typename concurrent_queue_base_v3<T>::page* array[concurrent_queue_rep<T>::n_queue];\n    concurrent_queue_iterator_rep( const concurrent_queue_base_v3<T>& queue ) :\n        head_counter(queue.my_rep->head_counter),\n        my_queue(queue)\n    {\n        for( size_t k=0; k<concurrent_queue_rep<T>::n_queue; ++k )\n            array[k] = queue.my_rep->array[k].head_page;\n    }\n\n    //! Set item to point to kth element.  Return true if at end of queue or item is marked valid; false otherwise.\n    bool get_item( T*& item, size_t k ) ;\n};\n\ntemplate<typename T>\nbool concurrent_queue_iterator_rep<T>::get_item( T*& item, size_t k ) {\n    if( k==my_queue.my_rep->tail_counter ) {\n        item = NULL;\n        return true;\n    } else {\n        typename concurrent_queue_base_v3<T>::page* p = array[concurrent_queue_rep<T>::index(k)];\n        __TBB_ASSERT(p,NULL);\n        size_t i = modulo_power_of_two( k/concurrent_queue_rep<T>::n_queue, my_queue.my_rep->items_per_page );\n        item = &micro_queue<T>::get_ref(*p,i);\n        return (p->mask & uintptr_t(1)<<i)!=0;\n    }\n}\n\n//! Constness-independent portion of concurrent_queue_iterator.\n/** @ingroup containers */\ntemplate<typename Value>\nclass concurrent_queue_iterator_base_v3 : no_assign {\n    //! Represents concurrent_queue over which we are iterating.\n    /** NULL if one past last element in queue. */\n    concurrent_queue_iterator_rep<Value>* my_rep;\n\n    template<typename C, typename T, typename U>\n    friend bool operator==( const concurrent_queue_iterator<C,T>& i, const concurrent_queue_iterator<C,U>& j );\n\n    template<typename C, typename T, typename U>\n    friend bool operator!=( const concurrent_queue_iterator<C,T>& i, const concurrent_queue_iterator<C,U>& j );\nprotected:\n    //! Pointer to current item\n    Value* my_item;\n\n    //! Default constructor\n    concurrent_queue_iterator_base_v3() : my_rep(NULL), my_item(NULL) {\n#if __TBB_GCC_OPTIMIZER_ORDERING_BROKEN\n        __TBB_compiler_fence();\n#endif\n    }\n\n    //! Copy constructor\n    concurrent_queue_iterator_base_v3( const concurrent_queue_iterator_base_v3& i )\n    : no_assign(), my_rep(NULL), my_item(NULL) {\n        assign(i);\n    }\n\n    //! Construct iterator pointing to head of queue.\n    concurrent_queue_iterator_base_v3( const concurrent_queue_base_v3<Value>& queue ) ;\n\n    //! Assignment\n    void assign( const concurrent_queue_iterator_base_v3<Value>& other ) ;\n\n    //! Advance iterator one step towards tail of queue.\n    void advance() ;\n\n    //! Destructor\n    ~concurrent_queue_iterator_base_v3() {\n        cache_aligned_allocator<concurrent_queue_iterator_rep<Value> >().deallocate(my_rep, 1);\n        my_rep = NULL;\n    }\n};\n\ntemplate<typename Value>\nconcurrent_queue_iterator_base_v3<Value>::concurrent_queue_iterator_base_v3( const concurrent_queue_base_v3<Value>& queue ) {\n    my_rep = cache_aligned_allocator<concurrent_queue_iterator_rep<Value> >().allocate(1);\n    new( my_rep ) concurrent_queue_iterator_rep<Value>(queue);\n    size_t k = my_rep->head_counter;\n    if( !my_rep->get_item(my_item, k) ) advance();\n}\n\ntemplate<typename Value>\nvoid concurrent_queue_iterator_base_v3<Value>::assign( const concurrent_queue_iterator_base_v3<Value>& other ) {\n    if( my_rep!=other.my_rep ) {\n        if( my_rep ) {\n            cache_aligned_allocator<concurrent_queue_iterator_rep<Value> >().deallocate(my_rep, 1);\n            my_rep = NULL;\n        }\n        if( other.my_rep ) {\n            my_rep = cache_aligned_allocator<concurrent_queue_iterator_rep<Value> >().allocate(1);\n            new( my_rep ) concurrent_queue_iterator_rep<Value>( *other.my_rep );\n        }\n    }\n    my_item = other.my_item;\n}\n\ntemplate<typename Value>\nvoid concurrent_queue_iterator_base_v3<Value>::advance() {\n    __TBB_ASSERT( my_item, \"attempt to increment iterator past end of queue\" );\n    size_t k = my_rep->head_counter;\n    const concurrent_queue_base_v3<Value>& queue = my_rep->my_queue;\n#if TBB_USE_ASSERT\n    Value* tmp;\n    my_rep->get_item(tmp,k);\n    __TBB_ASSERT( my_item==tmp, NULL );\n#endif /* TBB_USE_ASSERT */\n    size_t i = modulo_power_of_two( k/concurrent_queue_rep<Value>::n_queue, queue.my_rep->items_per_page );\n    if( i==queue.my_rep->items_per_page-1 ) {\n        typename concurrent_queue_base_v3<Value>::page*& root = my_rep->array[concurrent_queue_rep<Value>::index(k)];\n        root = root->next;\n    }\n    // advance k\n    my_rep->head_counter = ++k;\n    if( !my_rep->get_item(my_item, k) ) advance();\n}\n\n//! Similar to C++0x std::remove_cv\n/** \"tbb_\" prefix added to avoid overload confusion with C++0x implementations. */\ntemplate<typename T> struct tbb_remove_cv {typedef T type;};\ntemplate<typename T> struct tbb_remove_cv<const T> {typedef T type;};\ntemplate<typename T> struct tbb_remove_cv<volatile T> {typedef T type;};\ntemplate<typename T> struct tbb_remove_cv<const volatile T> {typedef T type;};\n\n//! Meets requirements of a forward iterator for STL.\n/** Value is either the T or const T type of the container.\n    @ingroup containers */\ntemplate<typename Container, typename Value>\nclass concurrent_queue_iterator: public concurrent_queue_iterator_base_v3<typename tbb_remove_cv<Value>::type>,\n        public std::iterator<std::forward_iterator_tag,Value> {\n#if !__TBB_TEMPLATE_FRIENDS_BROKEN\n    template<typename T, class A>\n    friend class ::tbb::strict_ppl::concurrent_queue;\n#else\npublic: // workaround for MSVC\n#endif\n    //! Construct iterator pointing to head of queue.\n    concurrent_queue_iterator( const concurrent_queue_base_v3<Value>& queue ) :\n        concurrent_queue_iterator_base_v3<typename tbb_remove_cv<Value>::type>(queue)\n    {\n    }\n\npublic:\n    concurrent_queue_iterator() {}\n\n    concurrent_queue_iterator( const concurrent_queue_iterator<Container,typename Container::value_type>& other ) :\n        concurrent_queue_iterator_base_v3<typename tbb_remove_cv<Value>::type>(other)\n    {}\n\n    //! Iterator assignment\n    concurrent_queue_iterator& operator=( const concurrent_queue_iterator& other ) {\n        this->assign(other);\n        return *this;\n    }\n\n    //! Reference to current item\n    Value& operator*() const {\n        return *static_cast<Value*>(this->my_item);\n    }\n\n    Value* operator->() const {return &operator*();}\n\n    //! Advance to next item in queue\n    concurrent_queue_iterator& operator++() {\n        this->advance();\n        return *this;\n    }\n\n    //! Post increment\n    Value* operator++(int) {\n        Value* result = &operator*();\n        operator++();\n        return result;\n    }\n}; // concurrent_queue_iterator\n\n\ntemplate<typename C, typename T, typename U>\nbool operator==( const concurrent_queue_iterator<C,T>& i, const concurrent_queue_iterator<C,U>& j ) {\n    return i.my_item==j.my_item;\n}\n\ntemplate<typename C, typename T, typename U>\nbool operator!=( const concurrent_queue_iterator<C,T>& i, const concurrent_queue_iterator<C,U>& j ) {\n    return i.my_item!=j.my_item;\n}\n\n} // namespace internal\n\n//! @endcond\n\n} // namespace strict_ppl\n\n//! @cond INTERNAL\nnamespace internal {\n\nclass concurrent_queue_rep;\nclass concurrent_queue_iterator_rep;\nclass concurrent_queue_iterator_base_v3;\ntemplate<typename Container, typename Value> class concurrent_queue_iterator;\n\n//! For internal use only.\n/** Type-independent portion of concurrent_queue.\n    @ingroup containers */\nclass concurrent_queue_base_v3: no_copy {\n    //! Internal representation\n    concurrent_queue_rep* my_rep;\n\n    friend class concurrent_queue_rep;\n    friend struct micro_queue;\n    friend class micro_queue_pop_finalizer;\n    friend class concurrent_queue_iterator_rep;\n    friend class concurrent_queue_iterator_base_v3;\nprotected:\n    //! Prefix on a page\n    struct page {\n        page* next;\n        uintptr_t mask;\n    };\n\n    //! Capacity of the queue\n    ptrdiff_t my_capacity;\n\n    //! Always a power of 2\n    size_t items_per_page;\n\n    //! Size of an item\n    size_t item_size;\n\n    enum copy_specifics { copy, move };\n\n#if __TBB_PROTECTED_NESTED_CLASS_BROKEN\npublic:\n#endif\n    template<typename T>\n    struct padded_page: page {\n        //! Not defined anywhere - exists to quiet warnings.\n        padded_page();\n        //! Not defined anywhere - exists to quiet warnings.\n        void operator=( const padded_page& );\n        //! Must be last field.\n        T last;\n    };\n\nprivate:\n    virtual void copy_item( page& dst, size_t index, const void* src ) = 0;\n    virtual void assign_and_destroy_item( void* dst, page& src, size_t index ) = 0;\nprotected:\n    __TBB_EXPORTED_METHOD concurrent_queue_base_v3( size_t item_size );\n    virtual __TBB_EXPORTED_METHOD ~concurrent_queue_base_v3();\n\n    //! Enqueue item at tail of queue using copy operation\n    void __TBB_EXPORTED_METHOD internal_push( const void* src );\n\n    //! Dequeue item from head of queue\n    void __TBB_EXPORTED_METHOD internal_pop( void* dst );\n\n    //! Abort all pending queue operations\n    void __TBB_EXPORTED_METHOD internal_abort();\n\n    //! Attempt to enqueue item onto queue using copy operation\n    bool __TBB_EXPORTED_METHOD internal_push_if_not_full( const void* src );\n\n    //! Attempt to dequeue item from queue.\n    /** NULL if there was no item to dequeue. */\n    bool __TBB_EXPORTED_METHOD internal_pop_if_present( void* dst );\n\n    //! Get size of queue\n    ptrdiff_t __TBB_EXPORTED_METHOD internal_size() const;\n\n    //! Check if the queue is emtpy\n    bool __TBB_EXPORTED_METHOD internal_empty() const;\n\n    //! Set the queue capacity\n    void __TBB_EXPORTED_METHOD internal_set_capacity( ptrdiff_t capacity, size_t element_size );\n\n    //! custom allocator\n    virtual page *allocate_page() = 0;\n\n    //! custom de-allocator\n    virtual void deallocate_page( page *p ) = 0;\n\n    //! free any remaining pages\n    /* note that the name may be misleading, but it remains so due to a historical accident. */\n    void __TBB_EXPORTED_METHOD internal_finish_clear() ;\n\n    //! throw an exception\n    void __TBB_EXPORTED_METHOD internal_throw_exception() const;\n\n    //! copy internal representation\n    void __TBB_EXPORTED_METHOD assign( const concurrent_queue_base_v3& src ) ;\n\n#if __TBB_CPP11_RVALUE_REF_PRESENT\n    //! swap queues\n    void internal_swap( concurrent_queue_base_v3& src ) {\n        std::swap( my_capacity, src.my_capacity );\n        std::swap( items_per_page, src.items_per_page );\n        std::swap( item_size, src.item_size );\n        std::swap( my_rep, src.my_rep );\n    }\n#endif /* __TBB_CPP11_RVALUE_REF_PRESENT */\n\n    //! Enqueues item at tail of queue using specified operation (copy or move)\n    void internal_insert_item( const void* src, copy_specifics op_type );\n\n    //! Attempts to enqueue at tail of queue using specified operation (copy or move)\n    bool internal_insert_if_not_full( const void* src, copy_specifics op_type );\n\n    //! Assigns one queue to another using specified operation (copy or move)\n    void internal_assign( const concurrent_queue_base_v3& src, copy_specifics op_type );\nprivate:\n    virtual void copy_page_item( page& dst, size_t dindex, const page& src, size_t sindex ) = 0;\n};\n\n//! For internal use only.\n/** Backward compatible modification of concurrent_queue_base_v3\n    @ingroup containers */\nclass concurrent_queue_base_v8: public concurrent_queue_base_v3 {\nprotected:\n    concurrent_queue_base_v8( size_t item_sz ) : concurrent_queue_base_v3( item_sz ) {}\n\n    //! move items\n    void __TBB_EXPORTED_METHOD move_content( concurrent_queue_base_v8& src ) ;\n\n    //! Attempt to enqueue item onto queue using move operation\n    bool __TBB_EXPORTED_METHOD internal_push_move_if_not_full( const void* src );\n\n    //! Enqueue item at tail of queue using move operation\n    void __TBB_EXPORTED_METHOD internal_push_move( const void* src );\nprivate:\n    friend struct micro_queue;\n    virtual void move_page_item( page& dst, size_t dindex, const page& src, size_t sindex ) = 0;\n    virtual void move_item( page& dst, size_t index, const void* src ) = 0;\n};\n\n//! Type-independent portion of concurrent_queue_iterator.\n/** @ingroup containers */\nclass concurrent_queue_iterator_base_v3 {\n    //! concurrent_queue over which we are iterating.\n    /** NULL if one past last element in queue. */\n    concurrent_queue_iterator_rep* my_rep;\n\n    template<typename C, typename T, typename U>\n    friend bool operator==( const concurrent_queue_iterator<C,T>& i, const concurrent_queue_iterator<C,U>& j );\n\n    template<typename C, typename T, typename U>\n    friend bool operator!=( const concurrent_queue_iterator<C,T>& i, const concurrent_queue_iterator<C,U>& j );\n\n    void initialize( const concurrent_queue_base_v3& queue, size_t offset_of_data );\nprotected:\n    //! Pointer to current item\n    void* my_item;\n\n    //! Default constructor\n    concurrent_queue_iterator_base_v3() : my_rep(NULL), my_item(NULL) {}\n\n    //! Copy constructor\n    concurrent_queue_iterator_base_v3( const concurrent_queue_iterator_base_v3& i ) : my_rep(NULL), my_item(NULL) {\n        assign(i);\n    }\n\n    //! Obsolete entry point for constructing iterator pointing to head of queue.\n    /** Does not work correctly for SSE types. */\n    __TBB_EXPORTED_METHOD concurrent_queue_iterator_base_v3( const concurrent_queue_base_v3& queue );\n\n    //! Construct iterator pointing to head of queue.\n    __TBB_EXPORTED_METHOD concurrent_queue_iterator_base_v3( const concurrent_queue_base_v3& queue, size_t offset_of_data );\n\n    //! Assignment\n    void __TBB_EXPORTED_METHOD assign( const concurrent_queue_iterator_base_v3& i );\n\n    //! Advance iterator one step towards tail of queue.\n    void __TBB_EXPORTED_METHOD advance();\n\n    //! Destructor\n    __TBB_EXPORTED_METHOD ~concurrent_queue_iterator_base_v3();\n};\n\ntypedef concurrent_queue_iterator_base_v3 concurrent_queue_iterator_base;\n\n//! Meets requirements of a forward iterator for STL.\n/** Value is either the T or const T type of the container.\n    @ingroup containers */\ntemplate<typename Container, typename Value>\nclass concurrent_queue_iterator: public concurrent_queue_iterator_base,\n        public std::iterator<std::forward_iterator_tag,Value> {\n\n#if !defined(_MSC_VER) || defined(__INTEL_COMPILER)\n    template<typename T, class A>\n    friend class ::tbb::concurrent_bounded_queue;\n#else\npublic: // workaround for MSVC\n#endif\n\n    //! Construct iterator pointing to head of queue.\n    concurrent_queue_iterator( const concurrent_queue_base_v3& queue ) :\n        concurrent_queue_iterator_base_v3(queue,__TBB_offsetof(concurrent_queue_base_v3::padded_page<Value>,last))\n    {\n    }\n\npublic:\n    concurrent_queue_iterator() {}\n\n    /** If Value==Container::value_type, then this routine is the copy constructor.\n        If Value==const Container::value_type, then this routine is a conversion constructor. */\n    concurrent_queue_iterator( const concurrent_queue_iterator<Container,typename Container::value_type>& other ) :\n        concurrent_queue_iterator_base_v3(other)\n    {}\n\n    //! Iterator assignment\n    concurrent_queue_iterator& operator=( const concurrent_queue_iterator& other ) {\n        assign(other);\n        return *this;\n    }\n\n    //! Reference to current item\n    Value& operator*() const {\n        return *static_cast<Value*>(my_item);\n    }\n\n    Value* operator->() const {return &operator*();}\n\n    //! Advance to next item in queue\n    concurrent_queue_iterator& operator++() {\n        advance();\n        return *this;\n    }\n\n    //! Post increment\n    Value* operator++(int) {\n        Value* result = &operator*();\n        operator++();\n        return result;\n    }\n}; // concurrent_queue_iterator\n\n\ntemplate<typename C, typename T, typename U>\nbool operator==( const concurrent_queue_iterator<C,T>& i, const concurrent_queue_iterator<C,U>& j ) {\n    return i.my_item==j.my_item;\n}\n\ntemplate<typename C, typename T, typename U>\nbool operator!=( const concurrent_queue_iterator<C,T>& i, const concurrent_queue_iterator<C,U>& j ) {\n    return i.my_item!=j.my_item;\n}\n\n} // namespace internal;\n\n//! @endcond\n\n} // namespace tbb\n\n#endif /* __TBB__concurrent_queue_impl_H */\n"
  },
  {
    "path": "benchmarks/tbb/internal/_concurrent_unordered_impl.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n/* Container implementations in this header are based on PPL implementations \n   provided by Microsoft. */\n\n#ifndef __TBB__concurrent_unordered_impl_H\n#define __TBB__concurrent_unordered_impl_H\n#if !defined(__TBB_concurrent_unordered_map_H) && !defined(__TBB_concurrent_unordered_set_H) && !defined(__TBB_concurrent_hash_map_H)\n#error Do not #include this internal file directly; use public TBB headers instead.\n#endif\n\n#include \"../tbb_stddef.h\"\n\n#if !TBB_USE_EXCEPTIONS && _MSC_VER\n    // Suppress \"C++ exception handler used, but unwind semantics are not enabled\" warning in STL headers\n    #pragma warning (push)\n    #pragma warning (disable: 4530)\n#endif\n\n#include <iterator>\n#include <utility>      // Need std::pair\n#include <functional>   // Need std::equal_to (in ../concurrent_unordered_*.h)\n#include <string>       // For tbb_hasher\n#include <cstring>      // Need std::memset\n\n#if !TBB_USE_EXCEPTIONS && _MSC_VER\n    #pragma warning (pop)\n#endif\n\n#include \"../atomic.h\"\n#include \"../tbb_exception.h\"\n#include \"../tbb_allocator.h\"\n\n#if __TBB_INITIALIZER_LISTS_PRESENT\n    #include <initializer_list>\n#endif\n\nnamespace tbb {\nnamespace interface5 {\n//! @cond INTERNAL\nnamespace internal {\n\ntemplate <typename T, typename Allocator>\nclass split_ordered_list;\ntemplate <typename Traits>\nclass concurrent_unordered_base;\n\n// Forward list iterators (without skipping dummy elements)\ntemplate<class Solist, typename Value>\nclass flist_iterator : public std::iterator<std::forward_iterator_tag, Value>\n{\n    template <typename T, typename Allocator>\n    friend class split_ordered_list;\n    template <typename Traits>\n    friend class concurrent_unordered_base;\n    template<class M, typename V>\n    friend class flist_iterator;\n\n    typedef typename Solist::nodeptr_t nodeptr_t;\npublic:\n    typedef typename Solist::value_type value_type;\n    typedef typename Solist::difference_type difference_type;\n    typedef typename Solist::pointer pointer;\n    typedef typename Solist::reference reference;\n\n    flist_iterator() : my_node_ptr(0) {}\n    flist_iterator( const flist_iterator<Solist, typename Solist::value_type> &other )\n        : my_node_ptr(other.my_node_ptr) {}\n\n    reference operator*() const { return my_node_ptr->my_element; }\n    pointer operator->() const { return &**this; }\n\n    flist_iterator& operator++() {\n        my_node_ptr = my_node_ptr->my_next;\n        return *this;\n    }\n\n    flist_iterator operator++(int) {\n        flist_iterator tmp = *this;\n        ++*this;\n        return tmp;\n    }\n\nprotected:\n    flist_iterator(nodeptr_t pnode) : my_node_ptr(pnode) {}\n    nodeptr_t get_node_ptr() const { return my_node_ptr; }\n\n    nodeptr_t my_node_ptr;\n\n    template<typename M, typename T, typename U>\n    friend bool operator==( const flist_iterator<M,T> &i, const flist_iterator<M,U> &j );\n    template<typename M, typename T, typename U>\n    friend bool operator!=( const flist_iterator<M,T>& i, const flist_iterator<M,U>& j );\n};\n\ntemplate<typename Solist, typename T, typename U>\nbool operator==( const flist_iterator<Solist,T> &i, const flist_iterator<Solist,U> &j ) {\n    return i.my_node_ptr == j.my_node_ptr;\n}\ntemplate<typename Solist, typename T, typename U>\nbool operator!=( const flist_iterator<Solist,T>& i, const flist_iterator<Solist,U>& j ) {\n    return i.my_node_ptr != j.my_node_ptr;\n}\n\n// Split-order list iterators, needed to skip dummy elements\ntemplate<class Solist, typename Value>\nclass solist_iterator : public flist_iterator<Solist, Value>\n{\n    typedef flist_iterator<Solist, Value> base_type;\n    typedef typename Solist::nodeptr_t nodeptr_t;\n    using base_type::get_node_ptr;\n    template <typename T, typename Allocator>\n    friend class split_ordered_list;\n    template<class M, typename V>\n    friend class solist_iterator;\n    template<typename M, typename T, typename U>\n    friend bool operator==( const solist_iterator<M,T> &i, const solist_iterator<M,U> &j );\n    template<typename M, typename T, typename U>\n    friend bool operator!=( const solist_iterator<M,T>& i, const solist_iterator<M,U>& j );\n\n    const Solist *my_list_ptr;\n    solist_iterator(nodeptr_t pnode, const Solist *plist) : base_type(pnode), my_list_ptr(plist) {}\n\npublic:\n    typedef typename Solist::value_type value_type;\n    typedef typename Solist::difference_type difference_type;\n    typedef typename Solist::pointer pointer;\n    typedef typename Solist::reference reference;\n\n    solist_iterator() {}\n    solist_iterator(const solist_iterator<Solist, typename Solist::value_type> &other )\n        : base_type(other), my_list_ptr(other.my_list_ptr) {}\n\n    reference operator*() const {\n        return this->base_type::operator*();\n    }\n\n    pointer operator->() const {\n        return (&**this);\n    }\n\n    solist_iterator& operator++() {\n        do ++(*(base_type *)this);\n        while (get_node_ptr() != NULL && get_node_ptr()->is_dummy());\n\n        return (*this);\n    }\n\n    solist_iterator operator++(int) {\n        solist_iterator tmp = *this;\n        do ++*this;\n        while (get_node_ptr() != NULL && get_node_ptr()->is_dummy());\n\n        return (tmp);\n    }\n};\n\ntemplate<typename Solist, typename T, typename U>\nbool operator==( const solist_iterator<Solist,T> &i, const solist_iterator<Solist,U> &j ) {\n    return i.my_node_ptr == j.my_node_ptr && i.my_list_ptr == j.my_list_ptr;\n}\ntemplate<typename Solist, typename T, typename U>\nbool operator!=( const solist_iterator<Solist,T>& i, const solist_iterator<Solist,U>& j ) {\n    return i.my_node_ptr != j.my_node_ptr || i.my_list_ptr != j.my_list_ptr;\n}\n\n// Forward type and class definitions\ntypedef size_t sokey_t;\n\n\n// Forward list in which elements are sorted in a split-order\ntemplate <typename T, typename Allocator>\nclass split_ordered_list\n{\npublic:\n    typedef split_ordered_list<T, Allocator> self_type;\n    typedef typename Allocator::template rebind<T>::other allocator_type;\n    struct node;\n    typedef node *nodeptr_t;\n\n    typedef typename allocator_type::size_type size_type;\n    typedef typename allocator_type::difference_type difference_type;\n    typedef typename allocator_type::pointer pointer;\n    typedef typename allocator_type::const_pointer const_pointer;\n    typedef typename allocator_type::reference reference;\n    typedef typename allocator_type::const_reference const_reference;\n    typedef typename allocator_type::value_type value_type;\n\n    typedef solist_iterator<self_type, const value_type> const_iterator;\n    typedef solist_iterator<self_type, value_type> iterator;\n    typedef flist_iterator<self_type, const value_type> raw_const_iterator;\n    typedef flist_iterator<self_type, value_type> raw_iterator;\n\n    // Node that holds the element in a split-ordered list\n    struct node : tbb::internal::no_assign\n    {\n    private:\n        // for compilers that try to generate default constructors though they are not needed.\n        node();  // VS 2008, 2010, 2012\n    public:\n        // Initialize the node with the given order key\n        void init(sokey_t order_key) {\n            my_order_key = order_key;\n            my_next = NULL;\n        }\n\n        // Return the order key (needed for hashing)\n        sokey_t get_order_key() const { // TODO: remove\n            return my_order_key;\n        }\n\n        // Inserts the new element in the list in an atomic fashion\n        nodeptr_t atomic_set_next(nodeptr_t new_node, nodeptr_t current_node)\n        {\n            // Try to change the next pointer on the current element to a new element, only if it still points to the cached next\n            nodeptr_t exchange_node = tbb::internal::as_atomic(my_next).compare_and_swap(new_node, current_node);\n\n            if (exchange_node == current_node) // TODO: why this branch?\n            {\n                // Operation succeeded, return the new node\n                return new_node;\n            }\n            else\n            {\n                // Operation failed, return the \"interfering\" node\n                return exchange_node;\n            }\n        }\n\n        // Checks if this element in the list is a dummy, order enforcing node. Dummy nodes are used by buckets\n        // in the hash table to quickly index into the right subsection of the split-ordered list.\n        bool is_dummy() const {\n            return (my_order_key & 0x1) == 0;\n        }\n\n\n        nodeptr_t  my_next;      // Next element in the list\n        value_type my_element;   // Element storage\n        sokey_t    my_order_key; // Order key for this element\n    };\n\n    // Allocate a new node with the given order key and value\n    nodeptr_t create_node(sokey_t order_key, const T &value) {\n        nodeptr_t pnode = my_node_allocator.allocate(1);\n\n        __TBB_TRY {\n            new(static_cast<void*>(&pnode->my_element)) T(value);\n            pnode->init(order_key);\n        } __TBB_CATCH(...) {\n            my_node_allocator.deallocate(pnode, 1);\n            __TBB_RETHROW();\n        }\n\n        return (pnode);\n    }\n\n#if __TBB_CPP11_RVALUE_REF_PRESENT\n    //TODO: try to combine both implementations using poor man forward\n    //TODO: use RAII scoped guard instead of explicit catch\n    // Allocate a new node with the given order key and value\n    nodeptr_t create_node(sokey_t order_key, T &&value) {\n        nodeptr_t pnode = my_node_allocator.allocate(1);\n\n        __TBB_TRY {\n            new(static_cast<void*>(&pnode->my_element)) T(std::move(value));\n            pnode->init(order_key);\n        } __TBB_CATCH(...) {\n            my_node_allocator.deallocate(pnode, 1);\n            __TBB_RETHROW();\n        }\n\n        return (pnode);\n    }\n#endif //__TBB_CPP11_RVALUE_REF_PRESENT\n\n    // Allocate a new node with the given order key; used to allocate dummy nodes\n    nodeptr_t create_node(sokey_t order_key) {\n        nodeptr_t pnode = my_node_allocator.allocate(1);\n        pnode->init(order_key);\n        return (pnode);\n    }\n\n   split_ordered_list(allocator_type a = allocator_type())\n       : my_node_allocator(a), my_element_count(0)\n    {\n        // Immediately allocate a dummy node with order key of 0. This node\n        // will always be the head of the list.\n        my_head = create_node(0);\n    }\n\n    ~split_ordered_list()\n    {\n        // Clear the list\n        clear();\n\n        // Remove the head element which is not cleared by clear()\n        nodeptr_t pnode = my_head;\n        my_head = NULL;\n\n        __TBB_ASSERT(pnode != NULL && pnode->my_next == NULL, \"Invalid head list node\");\n\n        destroy_node(pnode);\n    }\n\n    // Common forward list functions\n\n    allocator_type get_allocator() const {\n        return (my_node_allocator);\n    }\n\n    void clear() {\n        nodeptr_t pnext;\n        nodeptr_t pnode = my_head;\n\n        __TBB_ASSERT(my_head != NULL, \"Invalid head list node\");\n        pnext = pnode->my_next;\n        pnode->my_next = NULL;\n        pnode = pnext;\n\n        while (pnode != NULL)\n        {\n            pnext = pnode->my_next;\n            destroy_node(pnode);\n            pnode = pnext;\n        }\n\n        my_element_count = 0;\n    }\n\n    // Returns a first non-dummy element in the SOL\n    iterator begin() {\n        return first_real_iterator(raw_begin());\n    }\n\n    // Returns a first non-dummy element in the SOL\n    const_iterator begin() const {\n        return first_real_iterator(raw_begin());\n    }\n\n    iterator end() {\n        return (iterator(0, this));\n    }\n\n    const_iterator end() const {\n        return (const_iterator(0, this));\n    }\n\n    const_iterator cbegin() const {\n        return (((const self_type *)this)->begin());\n    }\n\n    const_iterator cend() const {\n        return (((const self_type *)this)->end());\n    }\n\n    // Checks if the number of elements (non-dummy) is 0\n    bool empty() const {\n        return (my_element_count == 0);\n    }\n\n    // Returns the number of non-dummy elements in the list\n    size_type size() const {\n        return my_element_count;\n    }\n\n    // Returns the maximum size of the list, determined by the allocator\n    size_type max_size() const {\n        return my_node_allocator.max_size();\n    }\n\n    // Swaps 'this' list with the passed in one\n    void swap(self_type& other)\n    {\n        if (this == &other)\n        {\n            // Nothing to do\n            return;\n        }\n\n            std::swap(my_element_count, other.my_element_count);\n            std::swap(my_head, other.my_head);\n    }\n\n    // Split-order list functions\n\n    // Returns a first element in the SOL, which is always a dummy\n    raw_iterator raw_begin() {\n        return raw_iterator(my_head);\n    }\n\n    // Returns a first element in the SOL, which is always a dummy\n    raw_const_iterator raw_begin() const {\n        return raw_const_iterator(my_head);\n    }\n\n    raw_iterator raw_end() {\n        return raw_iterator(0);\n    }\n\n    raw_const_iterator raw_end() const {\n        return raw_const_iterator(0);\n    }\n\n    static sokey_t get_order_key(const raw_const_iterator& it) {\n        return it.get_node_ptr()->get_order_key();\n    }\n\n    static sokey_t get_safe_order_key(const raw_const_iterator& it) {\n        if( !it.get_node_ptr() )  return ~sokey_t(0);\n        return it.get_node_ptr()->get_order_key();\n    }\n\n    // Returns a public iterator version of the internal iterator. Public iterator must not\n    // be a dummy private iterator.\n    iterator get_iterator(raw_iterator it) {\n        __TBB_ASSERT(it.get_node_ptr() == NULL || !it.get_node_ptr()->is_dummy(), \"Invalid user node (dummy)\");\n        return iterator(it.get_node_ptr(), this);\n    }\n\n    // Returns a public iterator version of the internal iterator. Public iterator must not\n    // be a dummy private iterator.\n    const_iterator get_iterator(raw_const_iterator it) const {\n        __TBB_ASSERT(it.get_node_ptr() == NULL || !it.get_node_ptr()->is_dummy(), \"Invalid user node (dummy)\");\n        return const_iterator(it.get_node_ptr(), this);\n    }\n\n    // Returns a non-const version of the raw_iterator\n    raw_iterator get_iterator(raw_const_iterator it) {\n        return raw_iterator(it.get_node_ptr());\n    }\n\n    // Returns a non-const version of the iterator\n    static iterator get_iterator(const_iterator it) {\n        return iterator(it.my_node_ptr, it.my_list_ptr);\n    }\n\n    // Returns a public iterator version of a first non-dummy internal iterator at or after\n    // the passed in internal iterator.\n    iterator first_real_iterator(raw_iterator it)\n    {\n        // Skip all dummy, internal only iterators\n        while (it != raw_end() && it.get_node_ptr()->is_dummy())\n            ++it;\n\n        return iterator(it.get_node_ptr(), this);\n    }\n\n    // Returns a public iterator version of a first non-dummy internal iterator at or after\n    // the passed in internal iterator.\n    const_iterator first_real_iterator(raw_const_iterator it) const\n    {\n        // Skip all dummy, internal only iterators\n        while (it != raw_end() && it.get_node_ptr()->is_dummy())\n            ++it;\n\n        return const_iterator(it.get_node_ptr(), this);\n    }\n\n    // Erase an element using the allocator\n    void destroy_node(nodeptr_t pnode) {\n        if (!pnode->is_dummy()) my_node_allocator.destroy(pnode);\n        my_node_allocator.deallocate(pnode, 1);\n    }\n\n    // Try to insert a new element in the list. If insert fails, return the node that\n    // was inserted instead.\n    nodeptr_t try_insert(nodeptr_t previous, nodeptr_t new_node, nodeptr_t current_node) {\n        new_node->my_next = current_node;\n        return previous->atomic_set_next(new_node, current_node);\n    }\n\n    // Insert a new element between passed in iterators\n    std::pair<iterator, bool> try_insert(raw_iterator it, raw_iterator next, const value_type &value, sokey_t order_key, size_type *new_count)\n    {\n        nodeptr_t pnode = create_node(order_key, value);\n        nodeptr_t inserted_node = try_insert(it.get_node_ptr(), pnode, next.get_node_ptr());\n\n        if (inserted_node == pnode)\n        {\n            // If the insert succeeded, check that the order is correct and increment the element count\n            check_range();\n            *new_count = __TBB_FetchAndAddW((uintptr_t*)&my_element_count, uintptr_t(1));\n            return std::pair<iterator, bool>(iterator(pnode, this), true);\n        }\n        else\n        {\n            // If the insert failed (element already there), then delete the new one\n            destroy_node(pnode);\n            return std::pair<iterator, bool>(end(), false);\n        }\n    }\n\n    // Insert a new dummy element, starting search at a parent dummy element\n    raw_iterator insert_dummy(raw_iterator it, sokey_t order_key)\n    {\n        raw_iterator last = raw_end();\n        raw_iterator where = it;\n\n        __TBB_ASSERT(where != last, \"Invalid head node\");\n\n        ++where;\n\n        // Create a dummy element up front, even though it may be discarded (due to concurrent insertion)\n        nodeptr_t dummy_node = create_node(order_key);\n\n        for (;;)\n        {\n            __TBB_ASSERT(it != last, \"Invalid head list node\");\n\n            // If the head iterator is at the end of the list, or past the point where this dummy\n            // node needs to be inserted, then try to insert it.\n            if (where == last || get_order_key(where) > order_key)\n            {\n                __TBB_ASSERT(get_order_key(it) < order_key, \"Invalid node order in the list\");\n\n                // Try to insert it in the right place\n                nodeptr_t inserted_node = try_insert(it.get_node_ptr(), dummy_node, where.get_node_ptr());\n\n                if (inserted_node == dummy_node)\n                {\n                    // Insertion succeeded, check the list for order violations\n                    check_range();\n                    return raw_iterator(dummy_node);\n                }\n                else\n                {\n                    // Insertion failed: either dummy node was inserted by another thread, or\n                    // a real element was inserted at exactly the same place as dummy node.\n                    // Proceed with the search from the previous location where order key was\n                    // known to be larger (note: this is legal only because there is no safe\n                    // concurrent erase operation supported).\n                    where = it;\n                    ++where;\n                    continue;\n                }\n            }\n            else if (get_order_key(where) == order_key)\n            {\n                // Another dummy node with the same value found, discard the new one.\n                destroy_node(dummy_node);\n                return where;\n            }\n\n            // Move the iterator forward\n            it = where;\n            ++where;\n        }\n\n    }\n\n    // This erase function can handle both real and dummy nodes\n    void erase_node(raw_iterator previous, raw_const_iterator& where)\n    {\n        nodeptr_t pnode = (where++).get_node_ptr();\n        nodeptr_t prevnode = previous.get_node_ptr();\n        __TBB_ASSERT(prevnode->my_next == pnode, \"Erase must take consecutive iterators\");\n        prevnode->my_next = pnode->my_next;\n\n        destroy_node(pnode);\n    }\n\n    // Erase the element (previous node needs to be passed because this is a forward only list)\n    iterator erase_node(raw_iterator previous, const_iterator where)\n    {\n        raw_const_iterator it = where;\n        erase_node(previous, it);\n        my_element_count--;\n\n        return get_iterator(first_real_iterator(it));\n    }\n\n    // Move all elements from the passed in split-ordered list to this one\n    void move_all(self_type& source)\n    {\n        raw_const_iterator first = source.raw_begin();\n        raw_const_iterator last = source.raw_end();\n\n        if (first == last)\n            return;\n\n        nodeptr_t previous_node = my_head;\n        raw_const_iterator begin_iterator = first++;\n\n        // Move all elements one by one, including dummy ones\n        for (raw_const_iterator it = first; it != last;)\n        {\n            nodeptr_t pnode = it.get_node_ptr();\n\n            nodeptr_t dummy_node = pnode->is_dummy() ? create_node(pnode->get_order_key()) : create_node(pnode->get_order_key(), pnode->my_element);\n            previous_node = try_insert(previous_node, dummy_node, NULL);\n            __TBB_ASSERT(previous_node != NULL, \"Insertion must succeed\");\n            raw_const_iterator where = it++;\n            source.erase_node(get_iterator(begin_iterator), where);\n        }\n        check_range();\n    }\n\n\nprivate:\n    //Need to setup private fields of split_ordered_list in move constructor and assignment of concurrent_unordered_base\n    template <typename Traits>\n    friend class concurrent_unordered_base;\n\n    // Check the list for order violations\n    void check_range()\n    {\n#if TBB_USE_ASSERT\n        for (raw_iterator it = raw_begin(); it != raw_end(); ++it)\n        {\n            raw_iterator next_iterator = it;\n            ++next_iterator;\n\n            __TBB_ASSERT(next_iterator == end() || next_iterator.get_node_ptr()->get_order_key() >= it.get_node_ptr()->get_order_key(), \"!!! List order inconsistency !!!\");\n        }\n#endif\n    }\n\n    typename allocator_type::template rebind<node>::other my_node_allocator;  // allocator object for nodes\n    size_type                                             my_element_count;   // Total item count, not counting dummy nodes\n    nodeptr_t                                             my_head;            // pointer to head node\n};\n\n// Template class for hash compare\ntemplate<typename Key, typename Hasher, typename Key_equality>\nclass hash_compare\n{\npublic:\n    typedef Hasher hasher;\n    typedef Key_equality key_equal;\n\n    hash_compare() {}\n\n    hash_compare(Hasher a_hasher) : my_hash_object(a_hasher) {}\n\n    hash_compare(Hasher a_hasher, Key_equality a_keyeq) : my_hash_object(a_hasher), my_key_compare_object(a_keyeq) {}\n\n    size_t operator()(const Key& key) const {\n        return ((size_t)my_hash_object(key));\n    }\n\n    bool operator()(const Key& key1, const Key& key2) const {\n        return (!my_key_compare_object(key1, key2));\n    }\n\n    Hasher       my_hash_object;        // The hash object\n    Key_equality my_key_compare_object; // The equality comparator object\n};\n\n#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)\n#pragma warning(push)\n#pragma warning(disable: 4127) // warning C4127: conditional expression is constant\n#endif\n\ntemplate <typename Traits>\nclass concurrent_unordered_base : public Traits\n{\nprotected:\n    // Type definitions\n    typedef concurrent_unordered_base<Traits> self_type;\n    typedef typename Traits::value_type value_type;\n    typedef typename Traits::key_type key_type;\n    typedef typename Traits::hash_compare hash_compare;\n    typedef typename Traits::value_compare value_compare;\n    typedef typename Traits::allocator_type allocator_type;\n    typedef typename hash_compare::hasher hasher;\n    typedef typename hash_compare::key_equal key_equal;\n    typedef typename allocator_type::pointer pointer;\n    typedef typename allocator_type::const_pointer const_pointer;\n    typedef typename allocator_type::reference reference;\n    typedef typename allocator_type::const_reference const_reference;\n    typedef typename allocator_type::size_type size_type;\n    typedef typename allocator_type::difference_type difference_type;\n    typedef split_ordered_list<value_type, typename Traits::allocator_type> solist_t;\n    typedef typename solist_t::nodeptr_t nodeptr_t;\n    // Iterators that walk the entire split-order list, including dummy nodes\n    typedef typename solist_t::raw_iterator raw_iterator;\n    typedef typename solist_t::raw_const_iterator raw_const_iterator;\n    typedef typename solist_t::iterator iterator; // TODO: restore const iterator for unordered_sets\n    typedef typename solist_t::const_iterator const_iterator;\n    typedef iterator local_iterator;\n    typedef const_iterator const_local_iterator;\n    using Traits::my_hash_compare;\n    using Traits::get_key;\n    using Traits::allow_multimapping;\n\n    static const size_type initial_bucket_number = 8;                               // Initial number of buckets\nprivate:\n    typedef std::pair<iterator, iterator> pairii_t;\n    typedef std::pair<const_iterator, const_iterator> paircc_t;\n\n    static size_type const pointers_per_table = sizeof(size_type) * 8;              // One bucket segment per bit\n    static const size_type initial_bucket_load = 4;                                // Initial maximum number of elements per bucket\n\n    struct call_internal_clear_on_exit{\n        concurrent_unordered_base* my_instance;\n        call_internal_clear_on_exit(concurrent_unordered_base* instance) : my_instance(instance) {}\n        void dismiss(){ my_instance = NULL;}\n        ~call_internal_clear_on_exit(){\n            if (my_instance){\n                my_instance->internal_clear();\n            }\n        }\n    };\nprotected:\n    // Constructors/Destructors\n    concurrent_unordered_base(size_type n_of_buckets = initial_bucket_number,\n        const hash_compare& hc = hash_compare(), const allocator_type& a = allocator_type())\n        : Traits(hc), my_solist(a),\n          my_allocator(a), my_maximum_bucket_size((float) initial_bucket_load)\n    {\n        if( n_of_buckets == 0) ++n_of_buckets;\n        my_number_of_buckets = 1<<__TBB_Log2((uintptr_t)n_of_buckets*2-1); // round up to power of 2\n        internal_init();\n    }\n\n    concurrent_unordered_base(const concurrent_unordered_base& right, const allocator_type& a)\n        : Traits(right.my_hash_compare), my_solist(a), my_allocator(a)\n    {\n        internal_init();\n        internal_copy(right);\n    }\n\n    concurrent_unordered_base(const concurrent_unordered_base& right)\n        : Traits(right.my_hash_compare), my_solist(right.get_allocator()), my_allocator(right.get_allocator())\n    {\n        //FIXME:exception safety seems to be broken here\n        internal_init();\n        internal_copy(right);\n    }\n\n#if __TBB_CPP11_RVALUE_REF_PRESENT\n    concurrent_unordered_base(concurrent_unordered_base&& right)\n        : Traits(right.my_hash_compare), my_solist(right.get_allocator()), my_allocator(right.get_allocator())\n    {\n        internal_init();\n        swap(right);\n    }\n\n    concurrent_unordered_base(concurrent_unordered_base&& right, const allocator_type& a)\n        : Traits(right.my_hash_compare), my_solist(a), my_allocator(a)\n    {\n        call_internal_clear_on_exit clear_buckets_on_exception(this);\n\n        internal_init();\n        if (a == right.get_allocator()){\n            this->swap(right);\n        }else{\n            my_maximum_bucket_size = right.my_maximum_bucket_size;\n            my_number_of_buckets = right.my_number_of_buckets;\n            my_solist.my_element_count = right.my_solist.my_element_count;\n\n            if (! right.my_solist.empty()){\n                nodeptr_t previous_node = my_solist.my_head;\n\n                // Move all elements one by one, including dummy ones\n                for (raw_const_iterator it = ++(right.my_solist.raw_begin()), last = right.my_solist.raw_end(); it != last; ++it)\n                {\n                    const nodeptr_t pnode = it.get_node_ptr();\n                    nodeptr_t node;\n                    if (pnode->is_dummy()) {\n                        node = my_solist.create_node(pnode->get_order_key());\n                        size_type bucket = __TBB_ReverseBits(pnode->get_order_key()) % my_number_of_buckets;\n                        set_bucket(bucket, node);\n                    }else{\n                        node = my_solist.create_node(pnode->get_order_key(), std::move(pnode->my_element));\n                    }\n\n                    previous_node = my_solist.try_insert(previous_node, node, NULL);\n                    __TBB_ASSERT(previous_node != NULL, \"Insertion of node failed. Concurrent inserts in constructor ?\");\n                }\n                my_solist.check_range();\n            }\n        }\n\n        clear_buckets_on_exception.dismiss();\n    }\n\n#endif //__TBB_CPP11_RVALUE_REF_PRESENT\n\n    concurrent_unordered_base& operator=(const concurrent_unordered_base& right) {\n        if (this != &right)\n            internal_copy(right);\n        return (*this);\n    }\n\n#if __TBB_CPP11_RVALUE_REF_PRESENT\n    concurrent_unordered_base& operator=(concurrent_unordered_base&& other)\n    {\n        if(this != &other){\n            typedef typename tbb::internal::allocator_traits<allocator_type>::propagate_on_container_move_assignment pocma_t;\n            if(pocma_t::value || this->my_allocator == other.my_allocator) {\n                concurrent_unordered_base trash (std::move(*this));\n                swap(other);\n                if (pocma_t::value) {\n                    using std::swap;\n                    //TODO: swapping allocators here may be a problem, replace with single direction moving\n                    swap(this->my_solist.my_node_allocator, other.my_solist.my_node_allocator);\n                    swap(this->my_allocator, other.my_allocator);\n                }\n            } else {\n                concurrent_unordered_base moved_copy(std::move(other),this->my_allocator);\n                this->swap(moved_copy);\n            }\n        }\n        return *this;\n    }\n\n#endif //__TBB_CPP11_RVALUE_REF_PRESENT\n\n#if __TBB_INITIALIZER_LISTS_PRESENT\n    //! assignment operator from initializer_list\n    concurrent_unordered_base& operator=(std::initializer_list<value_type> il)\n    {\n        this->clear();\n        this->insert(il.begin(),il.end());\n        return (*this);\n    }\n#endif //# __TBB_INITIALIZER_LISTS_PRESENT\n\n\n    ~concurrent_unordered_base() {\n        // Delete all node segments\n        internal_clear();\n    }\n\npublic:\n    allocator_type get_allocator() const {\n        return my_solist.get_allocator();\n    }\n\n    // Size and capacity function\n    bool empty() const {\n        return my_solist.empty();\n    }\n\n    size_type size() const {\n        return my_solist.size();\n    }\n\n    size_type max_size() const {\n        return my_solist.max_size();\n    }\n\n    // Iterators \n    iterator begin() {\n        return my_solist.begin();\n    }\n\n    const_iterator begin() const {\n        return my_solist.begin();\n    }\n\n    iterator end() {\n        return my_solist.end();\n    }\n\n    const_iterator end() const {\n        return my_solist.end();\n    }\n\n    const_iterator cbegin() const {\n        return my_solist.cbegin();\n    }\n\n    const_iterator cend() const {\n        return my_solist.cend();\n    }\n\n    // Parallel traversal support\n    class const_range_type : tbb::internal::no_assign {\n        const concurrent_unordered_base &my_table;\n        raw_const_iterator my_begin_node;\n        raw_const_iterator my_end_node;\n        mutable raw_const_iterator my_midpoint_node;\n    public:\n        //! Type for size of a range\n        typedef typename concurrent_unordered_base::size_type size_type;\n        typedef typename concurrent_unordered_base::value_type value_type;\n        typedef typename concurrent_unordered_base::reference reference;\n        typedef typename concurrent_unordered_base::difference_type difference_type;\n        typedef typename concurrent_unordered_base::const_iterator iterator;\n\n        //! True if range is empty.\n        bool empty() const {return my_begin_node == my_end_node;}\n\n        //! True if range can be partitioned into two subranges.\n        bool is_divisible() const {\n            return my_midpoint_node != my_end_node;\n        }\n        //! Split range.\n        const_range_type( const_range_type &r, split ) : \n            my_table(r.my_table), my_end_node(r.my_end_node)\n        {\n            r.my_end_node = my_begin_node = r.my_midpoint_node;\n            __TBB_ASSERT( !empty(), \"Splitting despite the range is not divisible\" );\n            __TBB_ASSERT( !r.empty(), \"Splitting despite the range is not divisible\" );\n            set_midpoint();\n            r.set_midpoint();\n        }\n        //! Init range with container and grainsize specified\n        const_range_type( const concurrent_unordered_base &a_table ) : \n            my_table(a_table), my_begin_node(a_table.my_solist.begin()),\n            my_end_node(a_table.my_solist.end())\n        {\n            set_midpoint();\n        }\n        iterator begin() const { return my_table.my_solist.get_iterator(my_begin_node); }\n        iterator end() const { return my_table.my_solist.get_iterator(my_end_node); }\n        //! The grain size for this range.\n        size_type grainsize() const { return 1; }\n\n        //! Set my_midpoint_node to point approximately half way between my_begin_node and my_end_node.\n        void set_midpoint() const {\n            if( my_begin_node == my_end_node ) // not divisible\n                my_midpoint_node = my_end_node;\n            else {\n                sokey_t begin_key = solist_t::get_safe_order_key(my_begin_node);\n                sokey_t end_key = solist_t::get_safe_order_key(my_end_node);\n                size_t mid_bucket = __TBB_ReverseBits( begin_key + (end_key-begin_key)/2 ) % my_table.my_number_of_buckets;\n                while ( !my_table.is_initialized(mid_bucket) ) mid_bucket = my_table.get_parent(mid_bucket);\n                if(__TBB_ReverseBits(mid_bucket) > begin_key) {\n                    // found a dummy_node between begin and end\n                    my_midpoint_node = my_table.my_solist.first_real_iterator(my_table.get_bucket( mid_bucket ));\n                }\n                else {\n                    // didn't find a dummy node between begin and end.\n                    my_midpoint_node = my_end_node;\n                }\n#if TBB_USE_ASSERT\n                {\n                    sokey_t mid_key = solist_t::get_safe_order_key(my_midpoint_node);\n                    __TBB_ASSERT( begin_key < mid_key, \"my_begin_node is after my_midpoint_node\" );\n                    __TBB_ASSERT( mid_key <= end_key, \"my_midpoint_node is after my_end_node\" );\n                }\n#endif // TBB_USE_ASSERT\n            }\n        }\n    };\n\n    class range_type : public const_range_type {\n    public:\n        typedef typename concurrent_unordered_base::iterator iterator;\n        //! Split range.\n        range_type( range_type &r, split ) : const_range_type( r, split() ) {}\n        //! Init range with container and grainsize specified\n        range_type( const concurrent_unordered_base &a_table ) : const_range_type(a_table) {}\n\n        iterator begin() const { return solist_t::get_iterator( const_range_type::begin() ); }\n        iterator end() const { return solist_t::get_iterator( const_range_type::end() ); }\n    };\n\n    range_type range() {\n        return range_type( *this );\n    }\n\n    const_range_type range() const {\n        return const_range_type( *this );\n    }\n\n    // Modifiers\n    std::pair<iterator, bool> insert(const value_type& value) {\n        return internal_insert(value);\n    }\n\n    iterator insert(const_iterator, const value_type& value) {\n        // Ignore hint\n        return insert(value).first;\n    }\n\n    template<class Iterator>\n    void insert(Iterator first, Iterator last) {\n        for (Iterator it = first; it != last; ++it)\n            insert(*it);\n    }\n\n#if __TBB_INITIALIZER_LISTS_PRESENT\n    //! Insert initializer list\n    void insert(std::initializer_list<value_type> il) {\n        insert(il.begin(), il.end());\n    }\n#endif\n\n    iterator unsafe_erase(const_iterator where) {\n        return internal_erase(where);\n    }\n\n    iterator unsafe_erase(const_iterator first, const_iterator last) {\n        while (first != last)\n            unsafe_erase(first++);\n        return my_solist.get_iterator(first);\n    }\n\n    size_type unsafe_erase(const key_type& key) {\n        pairii_t where = equal_range(key);\n        size_type item_count = internal_distance(where.first, where.second);\n        unsafe_erase(where.first, where.second);\n        return item_count;\n    }\n\n    void swap(concurrent_unordered_base& right) {\n        if (this != &right) {\n            std::swap(my_hash_compare, right.my_hash_compare); // TODO: check what ADL meant here\n            my_solist.swap(right.my_solist);\n            internal_swap_buckets(right);\n            std::swap(my_number_of_buckets, right.my_number_of_buckets);\n            std::swap(my_maximum_bucket_size, right.my_maximum_bucket_size);\n        }\n    }\n\n    // Observers\n    hasher hash_function() const {\n        return my_hash_compare.my_hash_object;\n    }\n\n    key_equal key_eq() const {\n        return my_hash_compare.my_key_compare_object;\n    }\n\n    void clear() {\n        // Clear list\n        my_solist.clear();\n\n        // Clear buckets\n        internal_clear();\n\n        // Initialize bucket 0\n        __TBB_ASSERT(my_buckets[0] == NULL, NULL);\n        raw_iterator dummy_node = my_solist.raw_begin();\n        set_bucket(0, dummy_node);\n    }\n\n    // Lookup\n    iterator find(const key_type& key) {\n        return internal_find(key);\n    }\n\n    const_iterator find(const key_type& key) const {\n        return const_cast<self_type*>(this)->internal_find(key);\n    }\n\n    size_type count(const key_type& key) const {\n        if(allow_multimapping) {\n            paircc_t answer = equal_range(key);\n            size_type item_count = internal_distance(answer.first, answer.second);\n            return item_count;\n        } else {\n            return const_cast<self_type*>(this)->internal_find(key) == end()?0:1;\n        }\n    }\n\n    std::pair<iterator, iterator> equal_range(const key_type& key) {\n        return internal_equal_range(key);\n    }\n\n    std::pair<const_iterator, const_iterator> equal_range(const key_type& key) const {\n        return const_cast<self_type*>(this)->internal_equal_range(key);\n    }\n\n    // Bucket interface - for debugging \n    size_type unsafe_bucket_count() const {\n        return my_number_of_buckets;\n    }\n\n    size_type unsafe_max_bucket_count() const {\n        return segment_size(pointers_per_table-1);\n    }\n\n    size_type unsafe_bucket_size(size_type bucket) {\n        size_type item_count = 0;\n        if (is_initialized(bucket)) {\n            raw_iterator it = get_bucket(bucket);\n            ++it;\n            for (; it != my_solist.raw_end() && !it.get_node_ptr()->is_dummy(); ++it)\n                ++item_count;\n        }\n        return item_count;\n    }\n\n    size_type unsafe_bucket(const key_type& key) const {\n        sokey_t order_key = (sokey_t) my_hash_compare(key);\n        size_type bucket = order_key % my_number_of_buckets;\n        return bucket;\n    }\n\n    // If the bucket is initialized, return a first non-dummy element in it\n    local_iterator unsafe_begin(size_type bucket) {\n        if (!is_initialized(bucket))\n            return end();\n\n        raw_iterator it = get_bucket(bucket);\n        return my_solist.first_real_iterator(it);\n    }\n\n    // If the bucket is initialized, return a first non-dummy element in it\n    const_local_iterator unsafe_begin(size_type bucket) const\n    {\n        if (!is_initialized(bucket))\n            return end();\n\n        raw_const_iterator it = get_bucket(bucket);\n        return my_solist.first_real_iterator(it);\n    }\n\n    // @REVIEW: Takes O(n)\n    // Returns the iterator after the last non-dummy element in the bucket\n    local_iterator unsafe_end(size_type bucket)\n    {\n        if (!is_initialized(bucket))\n            return end();\n\n        raw_iterator it = get_bucket(bucket);\n    \n        // Find the end of the bucket, denoted by the dummy element\n        do ++it;\n        while(it != my_solist.raw_end() && !it.get_node_ptr()->is_dummy());\n\n        // Return the first real element past the end of the bucket\n        return my_solist.first_real_iterator(it);\n    }\n\n    // @REVIEW: Takes O(n)\n    // Returns the iterator after the last non-dummy element in the bucket\n    const_local_iterator unsafe_end(size_type bucket) const\n    {\n        if (!is_initialized(bucket))\n            return end();\n\n        raw_const_iterator it = get_bucket(bucket);\n    \n        // Find the end of the bucket, denoted by the dummy element\n        do ++it;\n        while(it != my_solist.raw_end() && !it.get_node_ptr()->is_dummy());\n\n        // Return the first real element past the end of the bucket\n        return my_solist.first_real_iterator(it);\n    }\n\n    const_local_iterator unsafe_cbegin(size_type bucket) const {\n        return ((const self_type *) this)->unsafe_begin(bucket);\n    }\n\n    const_local_iterator unsafe_cend(size_type bucket) const {\n        return ((const self_type *) this)->unsafe_end(bucket);\n    }\n\n    // Hash policy\n    float load_factor() const {\n        return (float) size() / (float) unsafe_bucket_count();\n    }\n\n    float max_load_factor() const {\n        return my_maximum_bucket_size;\n    }\n\n    void max_load_factor(float newmax) {\n        if (newmax != newmax || newmax < 0)\n            tbb::internal::throw_exception(tbb::internal::eid_invalid_load_factor);\n        my_maximum_bucket_size = newmax;\n    }\n\n    // This function is a noop, because the underlying split-ordered list\n    // is already sorted, so an increase in the bucket number will be\n    // reflected next time this bucket is touched.\n    void rehash(size_type buckets) {\n        size_type current_buckets = my_number_of_buckets;\n        if (current_buckets >= buckets)\n            return;\n        my_number_of_buckets = 1<<__TBB_Log2((uintptr_t)buckets*2-1); // round up to power of 2\n    }\n\nprivate:\n\n    // Initialize the hash and keep the first bucket open\n    void internal_init() {\n        // Allocate an array of segment pointers\n        memset(my_buckets, 0, pointers_per_table * sizeof(void *));\n\n        // Initialize bucket 0\n        raw_iterator dummy_node = my_solist.raw_begin();\n        set_bucket(0, dummy_node);\n    }\n\n    void internal_clear() {\n        for (size_type index = 0; index < pointers_per_table; ++index) {\n            if (my_buckets[index] != NULL) {\n                size_type sz = segment_size(index);\n                for (size_type index2 = 0; index2 < sz; ++index2)\n                    my_allocator.destroy(&my_buckets[index][index2]);\n                my_allocator.deallocate(my_buckets[index], sz);\n                my_buckets[index] = 0;\n            }\n        }\n    }\n\n    void internal_copy(const self_type& right) {\n        clear();\n\n        my_maximum_bucket_size = right.my_maximum_bucket_size;\n        my_number_of_buckets = right.my_number_of_buckets;\n\n        __TBB_TRY {\n            insert(right.begin(), right.end());\n            my_hash_compare = right.my_hash_compare;\n        } __TBB_CATCH(...) {\n            my_solist.clear();\n            __TBB_RETHROW();\n        }\n    }\n\n    void internal_swap_buckets(concurrent_unordered_base& right)\n    {\n        // Swap all node segments\n        for (size_type index = 0; index < pointers_per_table; ++index)\n        {\n            raw_iterator * iterator_pointer = my_buckets[index];\n            my_buckets[index] = right.my_buckets[index];\n            right.my_buckets[index] = iterator_pointer;\n        }\n    }\n\n    //TODO: why not use std::distance?\n    // Hash APIs\n    size_type internal_distance(const_iterator first, const_iterator last) const\n    {\n        size_type num = 0;\n\n        for (const_iterator it = first; it != last; ++it)\n            ++num;\n\n        return num;\n    }\n\n    // Insert an element in the hash given its value\n    std::pair<iterator, bool> internal_insert(const value_type& value)\n    {\n        sokey_t order_key = (sokey_t) my_hash_compare(get_key(value));\n        size_type bucket = order_key % my_number_of_buckets;\n\n        // If bucket is empty, initialize it first\n        if (!is_initialized(bucket))\n            init_bucket(bucket);\n\n        size_type new_count = 0;\n        order_key = split_order_key_regular(order_key);\n        raw_iterator it = get_bucket(bucket);\n        raw_iterator last = my_solist.raw_end();\n        raw_iterator where = it;\n\n        __TBB_ASSERT(where != last, \"Invalid head node\");\n\n        // First node is a dummy node\n        ++where;\n\n        for (;;)\n        {\n            if (where == last || solist_t::get_order_key(where) > order_key)\n            {\n                // Try to insert it in the right place\n                std::pair<iterator, bool> result = my_solist.try_insert(it, where, value, order_key, &new_count);\n                \n                if (result.second)\n                {\n                    // Insertion succeeded, adjust the table size, if needed\n                    adjust_table_size(new_count, my_number_of_buckets);\n                    return result;\n                }\n                else\n                {\n                    // Insertion failed: either the same node was inserted by another thread, or\n                    // another element was inserted at exactly the same place as this node.\n                    // Proceed with the search from the previous location where order key was\n                    // known to be larger (note: this is legal only because there is no safe\n                    // concurrent erase operation supported).\n                    where = it;\n                    ++where;\n                    continue;\n                }\n            }\n            else if (!allow_multimapping && solist_t::get_order_key(where) == order_key && my_hash_compare(get_key(*where), get_key(value)) == 0)\n            {\n                // Element already in the list, return it\n                return std::pair<iterator, bool>(my_solist.get_iterator(where), false);\n            }\n\n            // Move the iterator forward\n            it = where;\n            ++where;\n        }\n    }\n\n    // Find the element in the split-ordered list\n    iterator internal_find(const key_type& key)\n    {\n        sokey_t order_key = (sokey_t) my_hash_compare(key);\n        size_type bucket = order_key % my_number_of_buckets;\n\n        // If bucket is empty, initialize it first\n        if (!is_initialized(bucket))\n            init_bucket(bucket);\n\n        order_key = split_order_key_regular(order_key);\n        raw_iterator last = my_solist.raw_end();\n\n        for (raw_iterator it = get_bucket(bucket); it != last; ++it)\n        {\n            if (solist_t::get_order_key(it) > order_key)\n            {\n                // If the order key is smaller than the current order key, the element\n                // is not in the hash.\n                return end();\n            }\n            else if (solist_t::get_order_key(it) == order_key)\n            {\n                // The fact that order keys match does not mean that the element is found.\n                // Key function comparison has to be performed to check whether this is the\n                // right element. If not, keep searching while order key is the same.\n                if (!my_hash_compare(get_key(*it), key))\n                    return my_solist.get_iterator(it);\n            }\n        }\n\n        return end();\n    }\n\n    // Erase an element from the list. This is not a concurrency safe function.\n    iterator internal_erase(const_iterator it)\n    {\n        key_type key = get_key(*it);\n        sokey_t order_key = (sokey_t) my_hash_compare(key);\n        size_type bucket = order_key % my_number_of_buckets;\n\n        // If bucket is empty, initialize it first\n        if (!is_initialized(bucket))\n            init_bucket(bucket);\n\n        order_key = split_order_key_regular(order_key);\n\n        raw_iterator previous = get_bucket(bucket);\n        raw_iterator last = my_solist.raw_end();\n        raw_iterator where = previous;\n\n        __TBB_ASSERT(where != last, \"Invalid head node\");\n\n        // First node is a dummy node\n        ++where;\n\n        for (;;) {\n            if (where == last)\n                return end();\n            else if (my_solist.get_iterator(where) == it)\n                return my_solist.erase_node(previous, it);\n\n            // Move the iterator forward\n            previous = where;\n            ++where;\n        }\n    }\n\n    // Return the [begin, end) pair of iterators with the same key values.\n    // This operation makes sense only if mapping is many-to-one.\n    pairii_t internal_equal_range(const key_type& key)\n    {\n        sokey_t order_key = (sokey_t) my_hash_compare(key);\n        size_type bucket = order_key % my_number_of_buckets;\n\n        // If bucket is empty, initialize it first\n        if (!is_initialized(bucket))\n            init_bucket(bucket);\n\n        order_key = split_order_key_regular(order_key);\n        raw_iterator end_it = my_solist.raw_end();\n\n        for (raw_iterator it = get_bucket(bucket); it != end_it; ++it)\n        {\n            if (solist_t::get_order_key(it) > order_key)\n            {\n                // There is no element with the given key\n                return pairii_t(end(), end());\n            }\n            else if (solist_t::get_order_key(it) == order_key && !my_hash_compare(get_key(*it), key))\n            {\n                iterator first = my_solist.get_iterator(it);\n                iterator last = first;\n                do ++last; while( allow_multimapping && last != end() && !my_hash_compare(get_key(*last), key) );\n                return pairii_t(first, last);\n            }\n        }\n\n        return pairii_t(end(), end());\n    }\n\n    // Bucket APIs\n    void init_bucket(size_type bucket)\n    {\n        // Bucket 0 has no parent.\n        __TBB_ASSERT( bucket != 0, \"The first bucket must always be initialized\");\n\n        size_type parent_bucket = get_parent(bucket);\n\n        // All parent_bucket buckets have to be initialized before this bucket is\n        if (!is_initialized(parent_bucket))\n            init_bucket(parent_bucket);\n\n        raw_iterator parent = get_bucket(parent_bucket);\n\n        // Create a dummy first node in this bucket\n        raw_iterator dummy_node = my_solist.insert_dummy(parent, split_order_key_dummy(bucket));\n        set_bucket(bucket, dummy_node);\n    }\n\n    void adjust_table_size(size_type total_elements, size_type current_size)\n    {\n        // Grow the table by a factor of 2 if possible and needed\n        if ( ((float) total_elements / (float) current_size) > my_maximum_bucket_size )\n        {\n            // Double the size of the hash only if size has not changed in between loads\n            my_number_of_buckets.compare_and_swap(2u*current_size, current_size);\n            //Simple \"my_number_of_buckets.compare_and_swap( current_size<<1, current_size );\" does not work for VC8\n            //due to overzealous compiler warnings in /Wp64 mode\n        }\n    }\n\n    size_type get_parent(size_type bucket) const\n    {\n        // Unsets bucket's most significant turned-on bit\n        size_type msb = __TBB_Log2((uintptr_t)bucket);\n        return bucket & ~(size_type(1) << msb);\n    }\n\n\n    // Dynamic sized array (segments)\n    //! @return segment index of given index in the array\n    static size_type segment_index_of( size_type index ) {\n        return size_type( __TBB_Log2( uintptr_t(index|1) ) );\n    }\n\n    //! @return the first array index of given segment\n    static size_type segment_base( size_type k ) {\n        return (size_type(1)<<k & ~size_type(1));\n    }\n\n    //! @return segment size\n    static size_type segment_size( size_type k ) {\n        return k? size_type(1)<<k : 2;\n    }\n\n    raw_iterator get_bucket(size_type bucket) const {\n        size_type segment = segment_index_of(bucket);\n        bucket -= segment_base(segment);\n        __TBB_ASSERT( my_buckets[segment], \"bucket must be in an allocated segment\" );\n        return my_buckets[segment][bucket];\n    }\n\n    void set_bucket(size_type bucket, raw_iterator dummy_head) {\n        size_type segment = segment_index_of(bucket);\n        bucket -= segment_base(segment);\n\n        if (my_buckets[segment] == NULL) {\n            size_type sz = segment_size(segment);\n            raw_iterator * new_segment = my_allocator.allocate(sz);\n            std::memset(new_segment, 0, sz*sizeof(raw_iterator));\n\n            if (my_buckets[segment].compare_and_swap( new_segment, NULL) != NULL)\n                my_allocator.deallocate(new_segment, sz);\n        }\n\n        my_buckets[segment][bucket] = dummy_head;\n    }\n\n    bool is_initialized(size_type bucket) const {\n        size_type segment = segment_index_of(bucket);\n        bucket -= segment_base(segment);\n\n        if (my_buckets[segment] == NULL)\n            return false;\n\n        raw_iterator it = my_buckets[segment][bucket];\n        return (it.get_node_ptr() != NULL);\n    }\n\n    // Utilities for keys\n\n    // A regular order key has its original hash value reversed and the last bit set\n    sokey_t split_order_key_regular(sokey_t order_key) const {\n        return __TBB_ReverseBits(order_key) | 0x1;\n    }\n\n    // A dummy order key has its original hash value reversed and the last bit unset\n    sokey_t split_order_key_dummy(sokey_t order_key) const {\n        return __TBB_ReverseBits(order_key) & ~sokey_t(0x1);\n    }\n\n    // Shared variables\n    atomic<size_type>                                             my_number_of_buckets;       // Current table size\n    solist_t                                                      my_solist;                  // List where all the elements are kept\n    typename allocator_type::template rebind<raw_iterator>::other my_allocator;               // Allocator object for segments\n    float                                                         my_maximum_bucket_size;     // Maximum size of the bucket\n    atomic<raw_iterator*>                                         my_buckets[pointers_per_table]; // The segment table\n};\n#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)\n#pragma warning(pop) // warning 4127 is back\n#endif\n\n//! Hash multiplier\nstatic const size_t hash_multiplier = tbb::internal::select_size_t_constant<2654435769U, 11400714819323198485ULL>::value;\n} // namespace internal\n//! @endcond\n//! Hasher functions\ntemplate<typename T>\ninline size_t tbb_hasher( const T& t ) {\n    return static_cast<size_t>( t ) * internal::hash_multiplier;\n}\ntemplate<typename P>\ninline size_t tbb_hasher( P* ptr ) {\n    size_t const h = reinterpret_cast<size_t>( ptr );\n    return (h >> 3) ^ h;\n}\ntemplate<typename E, typename S, typename A>\ninline size_t tbb_hasher( const std::basic_string<E,S,A>& s ) {\n    size_t h = 0;\n    for( const E* c = s.c_str(); *c; ++c )\n        h = static_cast<size_t>(*c) ^ (h * internal::hash_multiplier);\n    return h;\n}\ntemplate<typename F, typename S>\ninline size_t tbb_hasher( const std::pair<F,S>& p ) {\n    return tbb_hasher(p.first) ^ tbb_hasher(p.second);\n}\n} // namespace interface5\nusing interface5::tbb_hasher;\n\n\n// Template class for hash compare\ntemplate<typename Key>\nclass tbb_hash\n{\npublic:\n    tbb_hash() {}\n\n    size_t operator()(const Key& key) const\n    {\n        return tbb_hasher(key);\n    }\n};\n\n} // namespace tbb\n#endif// __TBB__concurrent_unordered_impl_H\n"
  },
  {
    "path": "benchmarks/tbb/internal/_flow_graph_impl.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB__flow_graph_impl_H\n#define __TBB__flow_graph_impl_H\n\n#ifndef __TBB_flow_graph_H\n#error Do not #include this internal file directly; use public TBB headers instead.\n#endif\n\nnamespace internal {\n\n    namespace graph_policy_namespace {\n        enum graph_buffer_policy { rejecting, reserving, queueing, tag_matching };\n    }\n\n// -------------- function_body containers ----------------------\n\n    //! A functor that takes no input and generates a value of type Output\n    template< typename Output >\n    class source_body : tbb::internal::no_assign {\n    public:\n        virtual ~source_body() {}\n        virtual bool operator()(Output &output) = 0;\n        virtual source_body* clone() = 0;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        virtual void reset_body() = 0;\n#endif\n    };\n\n    //! The leaf for source_body\n    template< typename Output, typename Body>\n    class source_body_leaf : public source_body<Output> {\n    public:\n        source_body_leaf( const Body &_body ) : body(_body), init_body(_body) { }\n        /*override*/ bool operator()(Output &output) { return body( output ); }\n        /*override*/ source_body_leaf* clone() {\n            return new source_body_leaf< Output, Body >(init_body);\n        }\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        /*override*/ void reset_body() {\n            body = init_body;\n        }\n#endif\n        Body get_body() { return body; }\n    private:\n        Body body;\n        Body init_body;\n    };\n\n    //! A functor that takes an Input and generates an Output\n    template< typename Input, typename Output >\n    class function_body : tbb::internal::no_assign {\n    public:\n        virtual ~function_body() {}\n        virtual Output operator()(const Input &input) = 0;\n        virtual function_body* clone() = 0;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        virtual void reset_body() = 0;\n#endif\n    };\n\n    //! the leaf for function_body\n    template <typename Input, typename Output, typename B>\n    class function_body_leaf : public function_body< Input, Output > {\n    public:\n        function_body_leaf( const B &_body ) : body(_body), init_body(_body) { }\n        Output operator()(const Input &i) { return body(i); }\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        /*override*/ void reset_body() {\n            body = init_body;\n        }\n#endif\n        B get_body() { return body; }\n        /*override*/ function_body_leaf* clone() {\n            return new function_body_leaf< Input, Output, B >(init_body);\n        }\n    private:\n        B body;\n        B init_body;\n    };\n\n    //! the leaf for function_body specialized for Input and output of continue_msg\n    template <typename B>\n    class function_body_leaf< continue_msg, continue_msg, B> : public function_body< continue_msg, continue_msg > {\n    public:\n        function_body_leaf( const B &_body ) : body(_body), init_body(_body) { }\n        continue_msg operator()( const continue_msg &i ) {\n            body(i);\n            return i;\n        }\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        /*override*/ void reset_body() {\n            body = init_body;\n        }\n#endif\n        B get_body() { return body; }\n        /*override*/ function_body_leaf* clone() {\n           return new function_body_leaf< continue_msg, continue_msg, B >(init_body);\n        }\n    private:\n        B body;\n        B init_body;\n    };\n\n    //! the leaf for function_body specialized for Output of continue_msg\n    template <typename Input, typename B>\n    class function_body_leaf< Input, continue_msg, B> : public function_body< Input, continue_msg > {\n    public:\n        function_body_leaf( const B &_body ) : body(_body), init_body(_body) { }\n        continue_msg operator()(const Input &i) {\n            body(i);\n            return continue_msg();\n        }\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        /*override*/ void reset_body() {\n            body = init_body;\n        }\n#endif\n        B get_body() { return body; }\n        /*override*/ function_body_leaf* clone() {\n            return new function_body_leaf< Input, continue_msg, B >(init_body);\n        }\n    private:\n        B body;\n        B init_body;\n    };\n\n    //! the leaf for function_body specialized for Input of continue_msg\n    template <typename Output, typename B>\n    class function_body_leaf< continue_msg, Output, B > : public function_body< continue_msg, Output > {\n    public:\n        function_body_leaf( const B &_body ) : body(_body), init_body(_body) { }\n        Output operator()(const continue_msg &i) {\n            return body(i);\n        }\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        /*override*/ void reset_body() {\n            body = init_body;\n        }\n#endif\n        B get_body() { return body; }\n        /*override*/ function_body_leaf* clone() {\n            return new function_body_leaf< continue_msg, Output, B >(init_body);\n        }\n    private:\n        B body;\n        B init_body;\n    };\n\n    //! function_body that takes an Input and a set of output ports\n    template<typename Input, typename OutputSet>\n    class multifunction_body : tbb::internal::no_assign {\n    public:\n        virtual ~multifunction_body () {}\n        virtual void operator()(const Input &/* input*/, OutputSet &/*oset*/) = 0;\n        virtual multifunction_body* clone() = 0;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        virtual void reset_body() = 0;\n#endif\n    };\n\n    //! leaf for multifunction.  OutputSet can be a std::tuple or a vector.\n    template<typename Input, typename OutputSet, typename B>\n    class multifunction_body_leaf : public multifunction_body<Input, OutputSet> {\n    public:\n        multifunction_body_leaf(const B &_body) : body(_body), init_body(_body) { }\n        void operator()(const Input &input, OutputSet &oset) {\n            body(input, oset); // body may explicitly put() to one or more of oset.\n        }\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        /*override*/ void reset_body() {\n            body = init_body;\n        }\n#endif\n        B get_body() { return body; }\n        /*override*/ multifunction_body_leaf* clone() {\n            return new multifunction_body_leaf<Input, OutputSet,B>(init_body);\n        }\n    private:\n        B body;\n        B init_body;\n    };\n\n// --------------------------- end of function_body containers ------------------------\n\n// --------------------------- node task bodies ---------------------------------------\n\n    //! A task that calls a node's forward_task function\n    template< typename NodeType >\n    class forward_task_bypass : public task {\n\n        NodeType &my_node;\n\n    public:\n\n        forward_task_bypass( NodeType &n ) : my_node(n) {}\n\n        task *execute() {\n            task * new_task = my_node.forward_task();\n            if (new_task == SUCCESSFULLY_ENQUEUED) new_task = NULL;\n            return new_task;\n        }\n    };\n\n    //! A task that calls a node's apply_body_bypass function, passing in an input of type Input\n    //  return the task* unless it is SUCCESSFULLY_ENQUEUED, in which case return NULL\n    template< typename NodeType, typename Input >\n    class apply_body_task_bypass : public task {\n\n        NodeType &my_node;\n        Input my_input;\n\n    public:\n\n        apply_body_task_bypass( NodeType &n, const Input &i ) : my_node(n), my_input(i) {}\n\n        task *execute() {\n            task * next_task = my_node.apply_body_bypass( my_input );\n            if(next_task == SUCCESSFULLY_ENQUEUED) next_task = NULL;\n            return next_task;\n        }\n    };\n\n    //! A task that calls a node's apply_body function with no input\n    template< typename NodeType >\n    class source_task_bypass : public task {\n\n        NodeType &my_node;\n\n    public:\n\n        source_task_bypass( NodeType &n ) : my_node(n) {}\n\n        task *execute() {\n            task *new_task = my_node.apply_body_bypass( );\n            if(new_task == SUCCESSFULLY_ENQUEUED) return NULL;\n            return new_task;\n        }\n    };\n\n// ------------------------ end of node task bodies -----------------------------------\n\n    //! An empty functor that takes an Input and returns a default constructed Output\n    template< typename Input, typename Output >\n    struct empty_body {\n       Output operator()( const Input & ) const { return Output(); }\n    };\n\n    //! A node_cache maintains a std::queue of elements of type T.  Each operation is protected by a lock.\n    template< typename T, typename M=spin_mutex >\n    class node_cache {\n        public:\n\n        typedef size_t size_type;\n\n        bool empty() {\n            typename my_mutex_type::scoped_lock lock( my_mutex );\n            return internal_empty();\n        }\n\n        void add( T &n ) {\n            typename my_mutex_type::scoped_lock lock( my_mutex );\n            internal_push(n);\n        }\n\n        void remove( T &n ) {\n            typename my_mutex_type::scoped_lock lock( my_mutex );\n            for ( size_t i = internal_size(); i != 0; --i ) {\n                T &s = internal_pop();\n                if ( &s == &n )  return;  // only remove one predecessor per request\n                internal_push(s);\n            }\n        }\n\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        typedef std::vector<T *> predecessor_vector_type;\n        void internal_add_built_predecessor( T &n ) {\n            typename my_mutex_type::scoped_lock lock( my_mutex );\n            my_built_predecessors.add_edge(n);\n        }\n\n        void internal_delete_built_predecessor( T &n ) {\n            typename my_mutex_type::scoped_lock lock( my_mutex );\n            my_built_predecessors.delete_edge(n);\n        }\n\n        void copy_predecessors( predecessor_vector_type &v) {\n            typename my_mutex_type::scoped_lock lock( my_mutex );\n            my_built_predecessors.copy_edges(v);\n        }\n\n        size_t predecessor_count() {\n            typename my_mutex_type::scoped_lock lock(my_mutex);\n            return (size_t)(my_built_predecessors.edge_count());\n        }\n#endif  /* TBB_PREVIEW_FLOW_GRAPH_FEATURES */ \n\n    protected:\n\n        typedef M my_mutex_type;\n        my_mutex_type my_mutex;\n        std::queue< T * > my_q;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        edge_container<T> my_built_predecessors;\n#endif\n\n        // Assumes lock is held\n        inline bool internal_empty( )  {\n            return my_q.empty();\n        }\n\n        // Assumes lock is held\n        inline size_type internal_size( )  {\n            return my_q.size();\n        }\n\n        // Assumes lock is held\n        inline void internal_push( T &n )  {\n            my_q.push(&n);\n        }\n\n        // Assumes lock is held\n        inline T &internal_pop() {\n            T *v = my_q.front();\n            my_q.pop();\n            return *v;\n        }\n\n    };\n\n    //! A cache of predecessors that only supports try_get\n    template< typename T, typename M=spin_mutex >\n    class predecessor_cache : public node_cache< sender<T>, M > {\n    public:\n        typedef M my_mutex_type;\n        typedef T output_type;\n        typedef sender<output_type> predecessor_type;\n        typedef receiver<output_type> successor_type;\n\n        predecessor_cache( ) : my_owner( NULL ) { }\n\n        void set_owner( successor_type *owner ) { my_owner = owner; }\n\n        bool get_item( output_type &v ) {\n\n            bool msg = false;\n\n            do {\n                predecessor_type *src;\n                {\n                    typename my_mutex_type::scoped_lock lock(this->my_mutex);\n                    if ( this->internal_empty() ) {\n                        break;\n                    }\n                    src = &this->internal_pop();\n                }\n\n                // Try to get from this sender\n                msg = src->try_get( v );\n\n                if (msg == false) {\n                    // Relinquish ownership of the edge\n                    if ( my_owner)\n                        src->register_successor( *my_owner );\n                } else {\n                    // Retain ownership of the edge\n                    this->add(*src);\n                }\n            } while ( msg == false );\n            return msg;\n        }\n\n        void reset( __TBB_PFG_RESET_ARG(reset_flags f)) {\n            if(my_owner) {\n                for(;;) {\n                    predecessor_type *src;\n                    {\n                        if(this->internal_empty()) break;\n                        src = &this->internal_pop();\n                    }\n                        src->register_successor( *my_owner);\n                }\n            }\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n            if (f&rf_extract && my_owner) \n                my_built_predecessors.receiver_extract(*my_owner);\n            __TBB_ASSERT(!(f&rf_extract) || this->internal_empty(), \"predecessor cache not empty\");\n#endif\n        }\n\n    protected:\n\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        using node_cache< sender<T>, M >::my_built_predecessors;\n#endif\n        successor_type *my_owner;\n    };\n\n    //! An cache of predecessors that supports requests and reservations\n    template< typename T, typename M=spin_mutex >\n    class reservable_predecessor_cache : public predecessor_cache< T, M > {\n    public:\n        typedef M my_mutex_type;\n        typedef T output_type;\n        typedef sender<T> predecessor_type;\n        typedef receiver<T> successor_type;\n\n        reservable_predecessor_cache( ) : reserved_src(NULL) { }\n\n        bool\n        try_reserve( output_type &v ) {\n            bool msg = false;\n\n            do {\n                {\n                    typename my_mutex_type::scoped_lock lock(this->my_mutex);\n                    if ( reserved_src || this->internal_empty() )\n                        return false;\n\n                    reserved_src = &this->internal_pop();\n                }\n\n                // Try to get from this sender\n                msg = reserved_src->try_reserve( v );\n\n                if (msg == false) {\n                    typename my_mutex_type::scoped_lock lock(this->my_mutex);\n                    // Relinquish ownership of the edge\n                    reserved_src->register_successor( *this->my_owner );\n                    reserved_src = NULL;\n                } else {\n                    // Retain ownership of the edge\n                    this->add( *reserved_src );\n                }\n            } while ( msg == false );\n\n            return msg;\n        }\n\n        bool\n        try_release( ) {\n            reserved_src->try_release( );\n            reserved_src = NULL;\n            return true;\n        }\n\n        bool\n        try_consume( ) {\n            reserved_src->try_consume( );\n            reserved_src = NULL;\n            return true;\n        }\n\n        void reset( __TBB_PFG_RESET_ARG(reset_flags f)) {\n            reserved_src = NULL;\n            predecessor_cache<T,M>::reset(__TBB_PFG_RESET_ARG(f));\n        }\n\n    private:\n        predecessor_type *reserved_src;\n    };\n\n\n    //! An abstract cache of successors\n    template<typename T, typename M=spin_rw_mutex >\n    class successor_cache : tbb::internal::no_copy {\n    protected:\n\n        typedef M my_mutex_type;\n        my_mutex_type my_mutex;\n\n        typedef receiver<T> *pointer_type;\n        typedef std::list< pointer_type > my_successors_type;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        edge_container<receiver<T> > my_built_successors;\n#endif\n        my_successors_type my_successors;\n\n        sender<T> *my_owner;\n\n    public:\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        typedef std::vector<pointer_type> successor_vector_type;\n        void internal_add_built_successor( receiver<T> &r) {\n            typename my_mutex_type::scoped_lock l(my_mutex, true);\n            my_built_successors.add_edge( r );\n        }\n\n        void internal_delete_built_successor( receiver<T> &r) {\n            typename my_mutex_type::scoped_lock l(my_mutex, true);\n            my_built_successors.delete_edge(r);\n        }\n\n        void copy_successors( successor_vector_type &v) {\n            typename my_mutex_type::scoped_lock l(my_mutex, false);\n            my_built_successors.copy_edges(v);\n        }\n\n        size_t successor_count() {\n            typename my_mutex_type::scoped_lock l(my_mutex,false);\n            return my_built_successors.edge_count();\n        }\n\n        void reset( __TBB_PFG_RESET_ARG(reset_flags f)) {\n            if (f&rf_extract && my_owner) \n                my_built_successors.sender_extract(*my_owner);\n        }\n#endif /* TBB_PREVIEW_FLOW_GRAPH_FEATURES */\n\n        successor_cache( ) : my_owner(NULL) {}\n\n        void set_owner( sender<T> *owner ) { my_owner = owner; }\n\n        virtual ~successor_cache() {}\n\n        void register_successor( receiver<T> &r ) {\n            typename my_mutex_type::scoped_lock l(my_mutex, true);\n            my_successors.push_back( &r );\n        }\n\n        void remove_successor( receiver<T> &r ) {\n            typename my_mutex_type::scoped_lock l(my_mutex, true);\n            for ( typename my_successors_type::iterator i = my_successors.begin();\n                  i != my_successors.end(); ++i ) {\n                if ( *i == & r ) {\n                    my_successors.erase(i);\n                    break;\n                }\n            }\n        }\n\n        bool empty() {\n            typename my_mutex_type::scoped_lock l(my_mutex, false);\n            return my_successors.empty();\n        }\n\n        void clear() {\n            my_successors.clear();\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n            my_built_successors.clear();\n#endif\n        }\n\n        virtual task * try_put_task( const T &t ) = 0;\n     };\n\n    //! An abstract cache of successors, specialized to continue_msg\n    template<>\n    class successor_cache< continue_msg > : tbb::internal::no_copy {\n    protected:\n\n        typedef spin_rw_mutex my_mutex_type;\n        my_mutex_type my_mutex;\n\n        typedef receiver<continue_msg> *pointer_type;\n        typedef std::list< pointer_type > my_successors_type;\n        my_successors_type my_successors;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        edge_container<receiver<continue_msg> > my_built_successors;\n#endif\n\n        sender<continue_msg> *my_owner;\n\n    public:\n\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        typedef std::vector<pointer_type> successor_vector_type;\n        void internal_add_built_successor( receiver<continue_msg> &r) {\n            my_mutex_type::scoped_lock l(my_mutex, true);\n            my_built_successors.add_edge( r );\n        }\n\n        void internal_delete_built_successor( receiver<continue_msg> &r) {\n            my_mutex_type::scoped_lock l(my_mutex, true);\n            my_built_successors.delete_edge(r);\n        }\n\n        void copy_successors( successor_vector_type &v) {\n            my_mutex_type::scoped_lock l(my_mutex, false);\n            my_built_successors.copy_edges(v);\n        }\n\n        size_t successor_count() {\n            my_mutex_type::scoped_lock l(my_mutex,false);\n            return my_built_successors.edge_count();\n        }\n\n        void reset( __TBB_PFG_RESET_ARG(reset_flags f)) {\n            if (f&rf_extract && my_owner) \n                my_built_successors.sender_extract(*my_owner);\n        }\n#endif  /* TBB_PREVIEW_FLOW_GRAPH_FEATURES */\n\n        successor_cache( ) : my_owner(NULL) {}\n\n        void set_owner( sender<continue_msg> *owner ) { my_owner = owner; }\n\n        virtual ~successor_cache() {}\n\n        void register_successor( receiver<continue_msg> &r ) {\n            my_mutex_type::scoped_lock l(my_mutex, true);\n            my_successors.push_back( &r );\n            if ( my_owner && r.is_continue_receiver() ) {\n                r.register_predecessor( *my_owner );\n            }\n        }\n\n        void remove_successor( receiver<continue_msg> &r ) {\n            my_mutex_type::scoped_lock l(my_mutex, true);\n            for ( my_successors_type::iterator i = my_successors.begin();\n                  i != my_successors.end(); ++i ) {\n                if ( *i == & r ) {\n                    // TODO: Check if we need to test for continue_receiver before\n                    // removing from r.\n                    if ( my_owner )\n                        r.remove_predecessor( *my_owner );\n                    my_successors.erase(i);\n                    break;\n                }\n            }\n        }\n\n        bool empty() {\n            my_mutex_type::scoped_lock l(my_mutex, false);\n            return my_successors.empty();\n        }\n\n        void clear() {\n            my_successors.clear();\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n            my_built_successors.clear();\n#endif\n        }\n\n        virtual task * try_put_task( const continue_msg &t ) = 0;\n\n     };\n\n    //! A cache of successors that are broadcast to\n    template<typename T, typename M=spin_rw_mutex>\n    class broadcast_cache : public successor_cache<T, M> {\n        typedef M my_mutex_type;\n        typedef std::list< receiver<T> * > my_successors_type;\n\n    public:\n\n        broadcast_cache( ) {}\n\n        // as above, but call try_put_task instead, and return the last task we received (if any)\n        /*override*/ task * try_put_task( const T &t ) {\n            task * last_task = NULL;\n            bool upgraded = true;\n            typename my_mutex_type::scoped_lock l(this->my_mutex, upgraded);\n            typename my_successors_type::iterator i = this->my_successors.begin();\n            while ( i != this->my_successors.end() ) {\n                task *new_task = (*i)->try_put_task(t);\n                last_task = combine_tasks(last_task, new_task);  // enqueue if necessary\n                if(new_task) {\n                    ++i;\n                }\n                else {  // failed\n                    if ( (*i)->register_predecessor(*this->my_owner) ) {\n                        if (!upgraded) {\n                            l.upgrade_to_writer();\n                            upgraded = true;\n                        }\n                        i = this->my_successors.erase(i);\n                    } else {\n                        ++i;\n                    }\n                }\n            }\n            return last_task;\n        }\n\n    };\n\n    //! A cache of successors that are put in a round-robin fashion\n    template<typename T, typename M=spin_rw_mutex >\n    class round_robin_cache : public successor_cache<T, M> {\n        typedef size_t size_type;\n        typedef M my_mutex_type;\n        typedef std::list< receiver<T> * > my_successors_type;\n\n    public:\n\n        round_robin_cache( ) {}\n\n        size_type size() {\n            typename my_mutex_type::scoped_lock l(this->my_mutex, false);\n            return this->my_successors.size();\n        }\n\n        /*override*/task *try_put_task( const T &t ) {\n            bool upgraded = true;\n            typename my_mutex_type::scoped_lock l(this->my_mutex, upgraded);\n            typename my_successors_type::iterator i = this->my_successors.begin();\n            while ( i != this->my_successors.end() ) {\n                task *new_task = (*i)->try_put_task(t);\n                if ( new_task ) {\n                    return new_task;\n                } else {\n                   if ( (*i)->register_predecessor(*this->my_owner) ) {\n                       if (!upgraded) {\n                           l.upgrade_to_writer();\n                           upgraded = true;\n                       }\n                       i = this->my_successors.erase(i);\n                   }\n                   else {\n                       ++i;\n                   }\n                }\n            }\n            return NULL;\n        }\n    };\n\n    template<typename T>\n    class decrementer : public continue_receiver, tbb::internal::no_copy {\n\n        T *my_node;\n\n        task *execute() {\n            return my_node->decrement_counter();\n        }\n\n    public:\n\n        typedef continue_msg input_type;\n        typedef continue_msg output_type;\n        decrementer( int number_of_predecessors = 0 ) : continue_receiver( number_of_predecessors ) { }\n        void set_owner( T *node ) { my_node = node; }\n    };\n\n}\n\n#endif // __TBB__flow_graph_impl_H\n\n"
  },
  {
    "path": "benchmarks/tbb/internal/_flow_graph_indexer_impl.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB__flow_graph_indexer_impl_H\n#define __TBB__flow_graph_indexer_impl_H\n\n#ifndef __TBB_flow_graph_H\n#error Do not #include this internal file directly; use public TBB headers instead.\n#endif\n\n#include \"tbb/internal/_flow_graph_types_impl.h\"\n\nnamespace internal {\n\n    // Output of the indexer_node is a tbb::flow::tagged_msg, and will be of\n    // the form  tagged_msg<tag, result>\n    // where the value of tag will indicate which result was put to the\n    // successor.  \n    \n    template<typename IndexerNodeBaseType, typename T, size_t K>\n    task* do_try_put(const T &v, void *p) {\n        typename IndexerNodeBaseType::output_type o(K, v);\n        return reinterpret_cast<IndexerNodeBaseType *>(p)->try_put_task(&o);\n    }\n\n    template<typename TupleTypes,int N>\n    struct indexer_helper {\n        template<typename IndexerNodeBaseType, typename PortTuple>\n        static inline void set_indexer_node_pointer(PortTuple &my_input, IndexerNodeBaseType *p) {\n            typedef typename tuple_element<N-1, TupleTypes>::type T;\n            task *(*indexer_node_put_task)(const T&, void *) = do_try_put<IndexerNodeBaseType, T, N-1>;\n            tbb::flow::get<N-1>(my_input).set_up(p, indexer_node_put_task);\n            indexer_helper<TupleTypes,N-1>::template set_indexer_node_pointer<IndexerNodeBaseType,PortTuple>(my_input, p);\n        }\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        template<typename InputTuple>\n        static inline void reset_inputs(InputTuple &my_input, reset_flags f) {\n            join_helper<N-1>::reset_inputs(my_input, f);\n            tbb::flow::get<N-1>(my_input).reset_receiver(f);\n        }\n#endif\n    };\n\n    template<typename TupleTypes>\n    struct indexer_helper<TupleTypes,1> {\n        template<typename IndexerNodeBaseType, typename PortTuple>\n        static inline void set_indexer_node_pointer(PortTuple &my_input, IndexerNodeBaseType *p) {\n            typedef typename tuple_element<0, TupleTypes>::type T;\n            task *(*indexer_node_put_task)(const T&, void *) = do_try_put<IndexerNodeBaseType, T, 0>;\n            tbb::flow::get<0>(my_input).set_up(p, indexer_node_put_task);\n        }\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        template<typename InputTuple>\n        static inline void reset_inputs(InputTuple &my_input, reset_flags f) {\n            tbb::flow::get<0>(my_input).reset_receiver(f);\n        }\n#endif\n    };\n\n    template<typename T>\n    class indexer_input_port : public receiver<T> {\n    private:\n        void* my_indexer_ptr;\n        typedef task* (* forward_function_ptr)(T const &, void* );\n        forward_function_ptr my_try_put_task;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        spin_mutex my_pred_mutex;\n        edge_container<sender<T> > my_built_predecessors;\n#endif  /* TBB_PREVIEW_FLOW_GRAPH_FEATURES */\n    public:\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        indexer_input_port() : my_pred_mutex() {}\n        indexer_input_port( const indexer_input_port & /*other*/ ) : receiver<T>(), my_pred_mutex() {\n        }\n#endif  /* TBB_PREVIEW_FLOW_GRAPH_FEATURES */\n        void set_up(void *p, forward_function_ptr f) {\n                my_indexer_ptr = p;\n                my_try_put_task = f;\n            }\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        typedef std::vector<sender<T> *> predecessor_vector_type;\n        /*override*/size_t predecessor_count() {\n            spin_mutex::scoped_lock l(my_pred_mutex);\n            return my_built_predecessors.edge_count();\n        }\n        /*override*/void internal_add_built_predecessor(sender<T> &p) {\n            spin_mutex::scoped_lock l(my_pred_mutex);\n            my_built_predecessors.add_edge(p);\n        }\n        /*override*/void internal_delete_built_predecessor(sender<T> &p) {\n            spin_mutex::scoped_lock l(my_pred_mutex);\n            my_built_predecessors.delete_edge(p);\n        }\n        /*override*/void copy_predecessors( predecessor_vector_type &v) {\n            spin_mutex::scoped_lock l(my_pred_mutex);\n            return my_built_predecessors.copy_edges(v);\n        }\n#endif  /* TBB_PREVIEW_FLOW_GRAPH_FEATURES */\n    protected:\n        template< typename R, typename B > friend class run_and_put_task;\n        template<typename X, typename Y> friend class internal::broadcast_cache;\n        template<typename X, typename Y> friend class internal::round_robin_cache;\n        task *try_put_task(const T &v) {\n            return my_try_put_task(v, my_indexer_ptr);\n        }\n\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n    public:\n        /*override*/void reset_receiver(__TBB_PFG_RESET_ARG(reset_flags f)) {\n            if(f&rf_extract) my_built_predecessors.receiver_extract(*this);\n        }\n#else\n        /*override*/void reset_receiver(__TBB_PFG_RESET_ARG(reset_flags /*f*/)) { }\n#endif\n\n    };\n\n    template<typename InputTuple, typename OutputType, typename StructTypes>\n    class indexer_node_FE {\n    public:\n        static const int N = tbb::flow::tuple_size<InputTuple>::value;\n        typedef OutputType output_type;\n        typedef InputTuple input_type;\n\n        input_type &input_ports() { return my_inputs; }\n    protected:\n        input_type my_inputs;\n    };\n\n    //! indexer_node_base\n    template<typename InputTuple, typename OutputType, typename StructTypes>\n    class indexer_node_base : public graph_node, public indexer_node_FE<InputTuple, OutputType,StructTypes>,\n                           public sender<OutputType> {\n    protected:\n       using graph_node::my_graph;\n    public:\n        static const size_t N = tbb::flow::tuple_size<InputTuple>::value;\n        typedef OutputType output_type;\n        typedef StructTypes tuple_types;\n        typedef receiver<output_type> successor_type;\n        typedef indexer_node_FE<InputTuple, output_type,StructTypes> input_ports_type;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        typedef std::vector<successor_type *> successor_vector_type;\n#endif\n\n    private:\n        // ----------- Aggregator ------------\n        enum op_type { reg_succ, rem_succ, try__put_task\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n            , add_blt_succ, del_blt_succ,\n             blt_succ_cnt, blt_succ_cpy\n#endif\n        };\n        enum op_stat {WAIT=0, SUCCEEDED, FAILED};\n        typedef indexer_node_base<InputTuple,output_type,StructTypes> my_class;\n\n        class indexer_node_base_operation : public aggregated_operation<indexer_node_base_operation> {\n        public:\n            char type;\n            union {\n                output_type const *my_arg;\n                successor_type *my_succ;\n                task *bypass_t;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n                size_t cnt_val;\n                successor_vector_type *succv;\n#endif\n            };\n            indexer_node_base_operation(const output_type* e, op_type t) :\n                type(char(t)), my_arg(e) {}\n            indexer_node_base_operation(const successor_type &s, op_type t) : type(char(t)), \n                my_succ(const_cast<successor_type *>(&s)) {}\n            indexer_node_base_operation(op_type t) : type(char(t)) {}\n        };\n\n        typedef internal::aggregating_functor<my_class, indexer_node_base_operation> my_handler;\n        friend class internal::aggregating_functor<my_class, indexer_node_base_operation>;\n        aggregator<my_handler, indexer_node_base_operation> my_aggregator;\n\n        void handle_operations(indexer_node_base_operation* op_list) {\n            indexer_node_base_operation *current;\n            while(op_list) {\n                current = op_list;\n                op_list = op_list->next;\n                switch(current->type) {\n\n                case reg_succ:\n                    my_successors.register_successor(*(current->my_succ));\n                    __TBB_store_with_release(current->status, SUCCEEDED);\n                    break;\n\n                case rem_succ:\n                    my_successors.remove_successor(*(current->my_succ));\n                    __TBB_store_with_release(current->status, SUCCEEDED);\n                    break;\n                case try__put_task: {\n                        current->bypass_t = my_successors.try_put_task(*(current->my_arg));\n                        __TBB_store_with_release(current->status, SUCCEEDED);  // return of try_put_task actual return value\n                    }\n                    break;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n                case add_blt_succ:\n                    my_successors.internal_add_built_successor(*(current->my_succ));\n                    __TBB_store_with_release(current->status, SUCCEEDED);\n                    break;\n                case del_blt_succ:\n                    my_successors.internal_delete_built_successor(*(current->my_succ));\n                    __TBB_store_with_release(current->status, SUCCEEDED);\n                    break;\n                case blt_succ_cnt:\n                    current->cnt_val = my_successors.successor_count();\n                    __TBB_store_with_release(current->status, SUCCEEDED);\n                    break;\n                case blt_succ_cpy:\n                    my_successors.copy_successors(*(current->succv));\n                    __TBB_store_with_release(current->status, SUCCEEDED);\n                    break;\n#endif  /* TBB_PREVIEW_FLOW_GRAPH_FEATURES */\n                }\n            }\n        }\n        // ---------- end aggregator -----------\n    public:\n        indexer_node_base(graph& g) : graph_node(g), input_ports_type() {\n            indexer_helper<StructTypes,N>::set_indexer_node_pointer(this->my_inputs, this);\n            my_successors.set_owner(this);\n            my_aggregator.initialize_handler(my_handler(this));\n        }\n\n        indexer_node_base(const indexer_node_base& other) : graph_node(other.my_graph), input_ports_type(), sender<output_type>() {\n            indexer_helper<StructTypes,N>::set_indexer_node_pointer(this->my_inputs, this);\n            my_successors.set_owner(this);\n            my_aggregator.initialize_handler(my_handler(this));\n        }\n\n        bool register_successor(successor_type &r) {\n            indexer_node_base_operation op_data(r, reg_succ);\n            my_aggregator.execute(&op_data);\n            return op_data.status == SUCCEEDED;\n        }\n\n        bool remove_successor( successor_type &r) {\n            indexer_node_base_operation op_data(r, rem_succ);\n            my_aggregator.execute(&op_data);\n            return op_data.status == SUCCEEDED;\n        }\n\n        task * try_put_task(output_type const *v) {\n            indexer_node_base_operation op_data(v, try__put_task);\n            my_aggregator.execute(&op_data);\n            return op_data.bypass_t;\n        }\n\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        void internal_add_built_successor( successor_type &r) {\n            indexer_node_base_operation op_data(r, add_blt_succ);\n            my_aggregator.execute(&op_data);\n        }\n\n        void internal_delete_built_successor( successor_type &r) {\n            indexer_node_base_operation op_data(r, del_blt_succ);\n            my_aggregator.execute(&op_data);\n        }\n\n        size_t successor_count() {\n            indexer_node_base_operation op_data(blt_succ_cnt);\n            my_aggregator.execute(&op_data);\n            return op_data.cnt_val;\n        }\n\n        void copy_successors( successor_vector_type &v) {\n            indexer_node_base_operation op_data(blt_succ_cpy);\n            op_data.succv = &v;\n            my_aggregator.execute(&op_data);\n        } \n#endif /* TBB_PREVIEW_FLOW_GRAPH_FEATURES */\n    protected:\n        /*override*/void reset(__TBB_PFG_RESET_ARG(reset_flags f)) {\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n            my_successors.reset(f);\n            indexer_helper<StructTypes,N>::reset_inputs(this->my_inputs, f);\n#endif\n        }\n\n    private:\n        broadcast_cache<output_type, null_rw_mutex> my_successors;\n    };  //indexer_node_base\n\n\n    template<int N, typename InputTuple> struct input_types;\n\n    template<typename InputTuple>\n    struct input_types<1, InputTuple> {\n        typedef typename tuple_element<0, InputTuple>::type first_type;\n        typedef typename internal::tagged_msg<size_t, first_type > type;\n    };\n\n    template<typename InputTuple>\n    struct input_types<2, InputTuple> {\n        typedef typename tuple_element<0, InputTuple>::type first_type;\n        typedef typename tuple_element<1, InputTuple>::type second_type;\n        typedef typename internal::tagged_msg<size_t, first_type, second_type> type;\n    };\n\n    template<typename InputTuple>\n    struct input_types<3, InputTuple> {\n        typedef typename tuple_element<0, InputTuple>::type first_type;\n        typedef typename tuple_element<1, InputTuple>::type second_type;\n        typedef typename tuple_element<2, InputTuple>::type third_type;\n        typedef typename internal::tagged_msg<size_t, first_type, second_type, third_type> type;\n    };\n    \n    template<typename InputTuple>\n    struct input_types<4, InputTuple> {\n        typedef typename tuple_element<0, InputTuple>::type first_type;\n        typedef typename tuple_element<1, InputTuple>::type second_type;\n        typedef typename tuple_element<2, InputTuple>::type third_type;\n        typedef typename tuple_element<3, InputTuple>::type fourth_type;\n        typedef typename internal::tagged_msg<size_t, first_type, second_type, third_type,\n                                                      fourth_type> type;\n    };\n    \n    template<typename InputTuple>\n    struct input_types<5, InputTuple> {\n        typedef typename tuple_element<0, InputTuple>::type first_type;\n        typedef typename tuple_element<1, InputTuple>::type second_type;\n        typedef typename tuple_element<2, InputTuple>::type third_type;\n        typedef typename tuple_element<3, InputTuple>::type fourth_type;\n        typedef typename tuple_element<4, InputTuple>::type fifth_type;\n        typedef typename internal::tagged_msg<size_t, first_type, second_type, third_type,\n                                                      fourth_type, fifth_type> type;\n    };\n    \n    template<typename InputTuple>\n    struct input_types<6, InputTuple> {\n        typedef typename tuple_element<0, InputTuple>::type first_type;\n        typedef typename tuple_element<1, InputTuple>::type second_type;\n        typedef typename tuple_element<2, InputTuple>::type third_type;\n        typedef typename tuple_element<3, InputTuple>::type fourth_type;\n        typedef typename tuple_element<4, InputTuple>::type fifth_type;\n        typedef typename tuple_element<5, InputTuple>::type sixth_type;\n        typedef typename internal::tagged_msg<size_t, first_type, second_type, third_type,\n                                                      fourth_type, fifth_type, sixth_type> type;\n    };\n    \n    template<typename InputTuple>\n    struct input_types<7, InputTuple> {\n        typedef typename tuple_element<0, InputTuple>::type first_type;\n        typedef typename tuple_element<1, InputTuple>::type second_type;\n        typedef typename tuple_element<2, InputTuple>::type third_type;\n        typedef typename tuple_element<3, InputTuple>::type fourth_type;\n        typedef typename tuple_element<4, InputTuple>::type fifth_type;\n        typedef typename tuple_element<5, InputTuple>::type sixth_type;\n        typedef typename tuple_element<6, InputTuple>::type seventh_type;\n        typedef typename internal::tagged_msg<size_t, first_type, second_type, third_type,\n                                                      fourth_type, fifth_type, sixth_type,\n                                                      seventh_type> type;\n    };\n\n\n    template<typename InputTuple>\n    struct input_types<8, InputTuple> {\n        typedef typename tuple_element<0, InputTuple>::type first_type;\n        typedef typename tuple_element<1, InputTuple>::type second_type;\n        typedef typename tuple_element<2, InputTuple>::type third_type;\n        typedef typename tuple_element<3, InputTuple>::type fourth_type;\n        typedef typename tuple_element<4, InputTuple>::type fifth_type;\n        typedef typename tuple_element<5, InputTuple>::type sixth_type;\n        typedef typename tuple_element<6, InputTuple>::type seventh_type;\n        typedef typename tuple_element<7, InputTuple>::type eighth_type;\n        typedef typename internal::tagged_msg<size_t, first_type, second_type, third_type,\n                                                      fourth_type, fifth_type, sixth_type,\n                                                      seventh_type, eighth_type> type;\n    };\n\n \n    template<typename InputTuple>\n    struct input_types<9, InputTuple> {\n        typedef typename tuple_element<0, InputTuple>::type first_type;\n        typedef typename tuple_element<1, InputTuple>::type second_type;\n        typedef typename tuple_element<2, InputTuple>::type third_type;\n        typedef typename tuple_element<3, InputTuple>::type fourth_type;\n        typedef typename tuple_element<4, InputTuple>::type fifth_type;\n        typedef typename tuple_element<5, InputTuple>::type sixth_type;\n        typedef typename tuple_element<6, InputTuple>::type seventh_type;\n        typedef typename tuple_element<7, InputTuple>::type eighth_type;\n        typedef typename tuple_element<8, InputTuple>::type nineth_type;\n        typedef typename internal::tagged_msg<size_t, first_type, second_type, third_type,\n                                                      fourth_type, fifth_type, sixth_type,\n                                                      seventh_type, eighth_type, nineth_type> type;\n    };\n\n    template<typename InputTuple>\n    struct input_types<10, InputTuple> {\n        typedef typename tuple_element<0, InputTuple>::type first_type;\n        typedef typename tuple_element<1, InputTuple>::type second_type;\n        typedef typename tuple_element<2, InputTuple>::type third_type;\n        typedef typename tuple_element<3, InputTuple>::type fourth_type;\n        typedef typename tuple_element<4, InputTuple>::type fifth_type;\n        typedef typename tuple_element<5, InputTuple>::type sixth_type;\n        typedef typename tuple_element<6, InputTuple>::type seventh_type;\n        typedef typename tuple_element<7, InputTuple>::type eighth_type;\n        typedef typename tuple_element<8, InputTuple>::type nineth_type;\n        typedef typename tuple_element<9, InputTuple>::type tenth_type;\n        typedef typename internal::tagged_msg<size_t, first_type, second_type, third_type,\n                                                      fourth_type, fifth_type, sixth_type,\n                                                      seventh_type, eighth_type, nineth_type,\n                                                      tenth_type> type;\n    };\n\n    // type generators\n    template<typename OutputTuple>\n    struct indexer_types : public input_types<tuple_size<OutputTuple>::value, OutputTuple> {\n        static const int N = tbb::flow::tuple_size<OutputTuple>::value;\n        typedef typename input_types<N, OutputTuple>::type output_type;\n        typedef typename wrap_tuple_elements<N,indexer_input_port,OutputTuple>::type input_ports_type;\n        typedef internal::indexer_node_FE<input_ports_type,output_type,OutputTuple> indexer_FE_type;\n        typedef internal::indexer_node_base<input_ports_type, output_type, OutputTuple> indexer_base_type;\n    };\n\n    template<class OutputTuple>\n    class unfolded_indexer_node : public indexer_types<OutputTuple>::indexer_base_type {\n    public:\n        typedef typename indexer_types<OutputTuple>::input_ports_type input_ports_type;\n        typedef OutputTuple tuple_types;\n        typedef typename indexer_types<OutputTuple>::output_type output_type;\n    private:\n        typedef typename indexer_types<OutputTuple>::indexer_base_type base_type;\n    public:\n        unfolded_indexer_node(graph& g) : base_type(g) {}\n        unfolded_indexer_node(const unfolded_indexer_node &other) : base_type(other) {}\n    };\n\n} /* namespace internal */\n\n#endif  /* __TBB__flow_graph_indexer_impl_H */\n"
  },
  {
    "path": "benchmarks/tbb/internal/_flow_graph_item_buffer_impl.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB__flow_graph_item_buffer_impl_H\n#define __TBB__flow_graph_item_buffer_impl_H\n\n#ifndef __TBB_flow_graph_H\n#error Do not #include this internal file directly; use public TBB headers instead.\n#endif\n\n#include \"tbb/internal/_flow_graph_types_impl.h\"  // for aligned_pair\n\n// in namespace tbb::flow::interface7 (included in _flow_graph_node_impl.h)\n\n    //! Expandable buffer of items.  The possible operations are push, pop,\n    //* tests for empty and so forth.  No mutual exclusion is built in.\n    //* objects are constructed into and explicitly-destroyed.  get_my_item gives\n    // a read-only reference to the item in the buffer.  set_my_item may be called\n    // with either an empty or occupied slot.\n\n    using internal::aligned_pair;\n    using internal::alignment_of;\n\nnamespace internal {\n\n    template <typename T, typename A=cache_aligned_allocator<T> >\n    class item_buffer {\n    public:\n        typedef T item_type;\n        enum buffer_item_state { no_item=0, has_item=1, reserved_item=2 };\n    protected:\n        typedef size_t size_type;\n        typedef typename aligned_pair<item_type, buffer_item_state>::type buffer_item_type;\n        typedef typename A::template rebind<buffer_item_type>::other allocator_type;\n\n        buffer_item_type *my_array;\n        size_type my_array_size;\n        static const size_type initial_buffer_size = 4;\n        size_type my_head;\n        size_type my_tail;\n\n        bool buffer_empty() { return my_head == my_tail; }\n\n        buffer_item_type &item(size_type i) {\n            __TBB_ASSERT(!(size_type(&(my_array[i&(my_array_size-1)].second))%alignment_of<buffer_item_state>::value),NULL);\n            __TBB_ASSERT(!(size_type(&(my_array[i&(my_array_size-1)].first))%alignment_of<item_type>::value), NULL);\n            return my_array[i & (my_array_size - 1) ];\n        }\n\n        bool my_item_valid(size_type i) { return item(i).second != no_item; }\n        bool my_item_reserved(size_type i) { return item(i).second == reserved_item; }\n\n        // object management in buffer\n        const item_type &get_my_item(size_t i) {\n            __TBB_ASSERT(my_item_valid(i),\"attempt to get invalid item\");\n            item_type *itm = (tbb::internal::punned_cast<item_type *>(&(item(i).first)));\n            return *(const item_type *)itm;\n        }\n\n        // may be called with an empty slot or a slot that has already been constructed into.\n        void set_my_item(size_t i, const item_type &o) { \n            if(item(i).second != no_item) {\n                destroy_item(i);\n            }\n            new(&(item(i).first)) item_type(o);\n            item(i).second = has_item;\n        }\n\n        // destructively-fetch an object from the buffer\n        void fetch_item(size_t i, item_type &o) {\n            __TBB_ASSERT(my_item_valid(i), \"Trying to fetch an empty slot\");\n            o = get_my_item(i);  // could have std::move assign semantics\n            destroy_item(i);\n        }\n\n        // move an existing item from one slot to another.  The moved-to slot must be unoccupied,\n        // the moved-from slot must exist and not be reserved.  The after, from will be empty,\n        // to will be occupied but not reserved\n        void move_item(size_t to, size_t from) {\n            __TBB_ASSERT(!my_item_valid(to), \"Trying to move to a non-empty slot\");\n            __TBB_ASSERT(my_item_valid(from), \"Trying to move from an empty slot\");\n            set_my_item(to, get_my_item(from));   // could have std::move semantics\n            destroy_item(from);\n\n        }\n\n        // put an item in an empty slot.  Return true if successful, else false\n        bool place_item(size_t here, const item_type &me) {\n#if !TBB_DEPRECATED_SEQUENCER_DUPLICATES\n            if(my_item_valid(here)) return false;\n#endif\n            set_my_item(here, me);\n            return true;\n        }\n\n        // could be implemented with std::move semantics\n        void swap_items(size_t i, size_t j) {\n            __TBB_ASSERT(my_item_valid(i) && my_item_valid(j), \"attempt to swap invalid item(s)\");\n            item_type temp = get_my_item(i);\n            set_my_item(i, get_my_item(j));\n            set_my_item(j, temp);\n        }\n\n        void destroy_item(size_type i) {\n            __TBB_ASSERT(my_item_valid(i), \"destruction of invalid item\");\n            (tbb::internal::punned_cast<item_type *>(&(item(i).first)))->~item_type();\n            item(i).second = no_item;\n        }\n\n        // returns a copy of the front\n        void copy_front(item_type &v) {\n            __TBB_ASSERT(my_item_valid(my_head), \"attempt to fetch head non-item\");\n            v = get_my_item(my_head);\n        }\n        // returns a copy of the back\n        void copy_back(item_type &v) {\n            __TBB_ASSERT(my_item_valid(my_tail-1), \"attempt to fetch head non-item\");\n            v = get_my_item(my_tail-1);\n        }\n\n        // following methods are for reservation of the front of a bufffer. \n        void reserve_item(size_type i) { __TBB_ASSERT(my_item_valid(i) && !my_item_reserved(i), \"item cannot be reserved\"); item(i).second = reserved_item; }\n        void release_item(size_type i) { __TBB_ASSERT(my_item_reserved(i), \"item is not reserved\"); item(i).second = has_item; }\n\n        void destroy_front() { destroy_item(my_head); ++my_head; }\n        void destroy_back() { destroy_item(my_tail-1); --my_tail; }\n\n        // we have to be able to test against a new tail value without changing my_tail\n        // grow_array doesn't work if we change my_tail when the old array is too small\n        size_type size(size_t new_tail = 0) { return (new_tail ? new_tail : my_tail) - my_head; }\n        size_type capacity() { return my_array_size; }\n        // sequencer_node does not use this method, so we don't \n        // need a version that passes in the new_tail value.\n        bool buffer_full() { return size() >= capacity(); }\n\n        //! Grows the internal array.\n        void grow_my_array( size_t minimum_size ) {\n            // test that we haven't made the structure inconsistent.\n            __TBB_ASSERT(capacity() >= my_tail - my_head, \"total items exceed capacity\");\n            size_type new_size = my_array_size ? 2*my_array_size : initial_buffer_size;\n            while( new_size<minimum_size )\n                new_size*=2;\n\n            buffer_item_type* new_array = allocator_type().allocate(new_size);\n\n            // initialize validity to \"no\"\n            for( size_type i=0; i<new_size; ++i ) { new_array[i].second = no_item; }\n\n            for( size_type i=my_head; i<my_tail; ++i) {\n                if(my_item_valid(i)) {  // sequencer_node may have empty slots\n                    // placement-new copy-construct; could be std::move\n                    char *new_space = (char *)&(new_array[i&(new_size-1)].first);\n                    (void)new(new_space) item_type(get_my_item(i));\n                    new_array[i&(new_size-1)].second = item(i).second;\n                }\n            }\n\n            clean_up_buffer(/*reset_pointers*/false);\n\n            my_array = new_array;\n            my_array_size = new_size;\n        }\n\n        bool push_back(item_type &v) {\n            if(buffer_full()) {\n                grow_my_array(size() + 1);\n            }\n            set_my_item(my_tail, v);\n            ++my_tail;\n            return true;\n        }\n\n        bool pop_back(item_type &v) {\n            if (!my_item_valid(my_tail-1)) {\n                return false;\n            }\n            copy_back(v);\n            destroy_back();\n            return true;\n        }\n\n        bool pop_front(item_type &v) {\n            if(!my_item_valid(my_head)) {\n                return false;\n            }\n            copy_front(v);\n            destroy_front();\n            return true;\n        }\n\n        // This is used both for reset and for grow_my_array.  In the case of grow_my_array\n        // we want to retain the values of the head and tail.\n        void clean_up_buffer(bool reset_pointers) {\n            if (my_array) {\n                for( size_type i=0; i<my_array_size; ++i ) {\n                    if(my_item_valid(i))\n                        destroy_item(i);\n                }\n                allocator_type().deallocate(my_array,my_array_size); \n            }\n            my_array = NULL;\n            if(reset_pointers) {\n                my_head = my_tail = my_array_size = 0;\n            }\n        }\n\n    public:\n        //! Constructor\n        item_buffer( ) : my_array(NULL), my_array_size(0),\n            my_head(0), my_tail(0) {\n            grow_my_array(initial_buffer_size);\n        }\n\n        ~item_buffer() {\n            clean_up_buffer(/*reset_pointers*/true);\n        }\n\n        void reset() { clean_up_buffer(/*reset_pointers*/true); grow_my_array(initial_buffer_size); }\n\n    };\n\n    //! item_buffer with reservable front-end.  NOTE: if reserving, do not\n    //* complete operation with pop_front(); use consume_front().  \n    //* No synchronization built-in.\n    template<typename T, typename A=cache_aligned_allocator<T> >\n    class reservable_item_buffer : public item_buffer<T, A> {\n    protected:\n        using item_buffer<T, A>::my_item_valid;\n        using item_buffer<T, A>::my_head;\n\n    public:\n        reservable_item_buffer() : item_buffer<T, A>(), my_reserved(false) {}\n        void reset() {my_reserved = false; item_buffer<T,A>::reset(); }\n    protected:\n\n        bool reserve_front(T &v) {\n            if(my_reserved || !my_item_valid(my_head)) return false;\n            my_reserved = true;\n            // reserving the head\n            this->copy_front(v);\n            this->reserve_item(this->my_head);\n            return true;\n        }\n\n        void consume_front() {\n            __TBB_ASSERT(my_reserved, \"Attempt to consume a non-reserved item\");\n            this->destroy_front();\n            my_reserved = false;\n        }\n\n        void release_front() {\n            __TBB_ASSERT(my_reserved, \"Attempt to release a non-reserved item\");\n            this->release_item(this->my_head);\n            my_reserved = false;\n        }\n\n        bool my_reserved;\n    };\n\n}  // namespace internal\n\n#endif // __TBB__flow_graph_item_buffer_impl_H\n"
  },
  {
    "path": "benchmarks/tbb/internal/_flow_graph_join_impl.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB__flow_graph_join_impl_H\n#define __TBB__flow_graph_join_impl_H\n\n#ifndef __TBB_flow_graph_H\n#error Do not #include this internal file directly; use public TBB headers instead.\n#endif\n\n#include \"_flow_graph_types_impl.h\"\n\nnamespace internal {\n\n    typedef size_t tag_value;\n    static const tag_value NO_TAG = tag_value(-1);\n\n    struct forwarding_base {\n        forwarding_base(graph &g) : my_graph_ptr(&g), current_tag(NO_TAG) {}\n        virtual ~forwarding_base() {}\n        // decrement_port_count may create a forwarding task.  If we cannot handle the task\n        // ourselves, ask decrement_port_count to deal with it.\n        virtual task * decrement_port_count(bool handle_task) = 0;\n        virtual void increment_port_count() = 0;\n        virtual task * increment_tag_count(tag_value /*t*/, bool /*handle_task*/) {return NULL;}\n        // moved here so input ports can queue tasks\n        graph* my_graph_ptr;\n        tag_value current_tag; // so ports can refer to FE's desired items\n    };\n\n    template< int N >\n    struct join_helper {\n\n        template< typename TupleType, typename PortType >\n        static inline void set_join_node_pointer(TupleType &my_input, PortType *port) {\n            tbb::flow::get<N-1>( my_input ).set_join_node_pointer(port);\n            join_helper<N-1>::set_join_node_pointer( my_input, port );\n        }\n        template< typename TupleType >\n        static inline void consume_reservations( TupleType &my_input ) {\n            tbb::flow::get<N-1>( my_input ).consume();\n            join_helper<N-1>::consume_reservations( my_input );\n        }\n\n        template< typename TupleType >\n        static inline void release_my_reservation( TupleType &my_input ) {\n            tbb::flow::get<N-1>( my_input ).release();\n        }\n\n        template <typename TupleType>\n        static inline void release_reservations( TupleType &my_input) {\n            join_helper<N-1>::release_reservations(my_input);\n            release_my_reservation(my_input);\n        }\n\n        template< typename InputTuple, typename OutputTuple >\n        static inline bool reserve( InputTuple &my_input, OutputTuple &out) {\n            if ( !tbb::flow::get<N-1>( my_input ).reserve( tbb::flow::get<N-1>( out ) ) ) return false;\n            if ( !join_helper<N-1>::reserve( my_input, out ) ) {\n                release_my_reservation( my_input );\n                return false;\n            }\n            return true;\n        }\n\n        template<typename InputTuple, typename OutputTuple>\n        static inline bool get_my_item( InputTuple &my_input, OutputTuple &out) {\n            bool res = tbb::flow::get<N-1>(my_input).get_item(tbb::flow::get<N-1>(out) ); // may fail\n            return join_helper<N-1>::get_my_item(my_input, out) && res;       // do get on other inputs before returning\n        }\n\n        template<typename InputTuple, typename OutputTuple>\n        static inline bool get_items(InputTuple &my_input, OutputTuple &out) {\n            return get_my_item(my_input, out);\n        }\n\n        template<typename InputTuple>\n        static inline void reset_my_port(InputTuple &my_input) {\n            join_helper<N-1>::reset_my_port(my_input);\n            tbb::flow::get<N-1>(my_input).reset_port();\n        }\n\n        template<typename InputTuple>\n        static inline void reset_ports(InputTuple& my_input) {\n            reset_my_port(my_input);\n        }\n\n        template<typename InputTuple, typename TagFuncTuple>\n        static inline void set_tag_func(InputTuple &my_input, TagFuncTuple &my_tag_funcs) {\n            tbb::flow::get<N-1>(my_input).set_my_original_tag_func(tbb::flow::get<N-1>(my_tag_funcs));\n            tbb::flow::get<N-1>(my_input).set_my_tag_func(tbb::flow::get<N-1>(my_input).my_original_func()->clone());\n            tbb::flow::get<N-1>(my_tag_funcs) = NULL;\n            join_helper<N-1>::set_tag_func(my_input, my_tag_funcs);\n        }\n\n        template< typename TagFuncTuple1, typename TagFuncTuple2>\n        static inline void copy_tag_functors(TagFuncTuple1 &my_inputs, TagFuncTuple2 &other_inputs) {\n            if(tbb::flow::get<N-1>(other_inputs).my_original_func()) {\n                tbb::flow::get<N-1>(my_inputs).set_my_tag_func(tbb::flow::get<N-1>(other_inputs).my_original_func()->clone());\n                tbb::flow::get<N-1>(my_inputs).set_my_original_tag_func(tbb::flow::get<N-1>(other_inputs).my_original_func()->clone());\n            }\n            join_helper<N-1>::copy_tag_functors(my_inputs, other_inputs);\n        }\n\n        template<typename InputTuple>\n        static inline void reset_inputs(InputTuple &my_input __TBB_PFG_RESET_ARG(__TBB_COMMA reset_flags f)) {\n            join_helper<N-1>::reset_inputs(my_input __TBB_PFG_RESET_ARG(__TBB_COMMA f));\n            tbb::flow::get<N-1>(my_input).reset_receiver(__TBB_PFG_RESET_ARG(f));\n        }\n    };\n\n    template< >\n    struct join_helper<1> {\n\n        template< typename TupleType, typename PortType >\n        static inline void set_join_node_pointer(TupleType &my_input, PortType *port) {\n            tbb::flow::get<0>( my_input ).set_join_node_pointer(port);\n        }\n\n        template< typename TupleType >\n        static inline void consume_reservations( TupleType &my_input ) {\n            tbb::flow::get<0>( my_input ).consume();\n        }\n\n        template< typename TupleType >\n        static inline void release_my_reservation( TupleType &my_input ) {\n            tbb::flow::get<0>( my_input ).release();\n        }\n\n        template<typename TupleType>\n        static inline void release_reservations( TupleType &my_input) {\n            release_my_reservation(my_input);\n        }\n\n        template< typename InputTuple, typename OutputTuple >\n        static inline bool reserve( InputTuple &my_input, OutputTuple &out) {\n            return tbb::flow::get<0>( my_input ).reserve( tbb::flow::get<0>( out ) );\n        }\n\n        template<typename InputTuple, typename OutputTuple>\n        static inline bool get_my_item( InputTuple &my_input, OutputTuple &out) {\n            return tbb::flow::get<0>(my_input).get_item(tbb::flow::get<0>(out));\n        }\n\n        template<typename InputTuple, typename OutputTuple>\n        static inline bool get_items(InputTuple &my_input, OutputTuple &out) {\n            return get_my_item(my_input, out);\n        }\n\n        template<typename InputTuple>\n        static inline void reset_my_port(InputTuple &my_input) {\n            tbb::flow::get<0>(my_input).reset_port();\n        }\n\n        template<typename InputTuple>\n        static inline void reset_ports(InputTuple& my_input) {\n            reset_my_port(my_input);\n        }\n\n        template<typename InputTuple, typename TagFuncTuple>\n        static inline void set_tag_func(InputTuple &my_input, TagFuncTuple &my_tag_funcs) {\n            tbb::flow::get<0>(my_input).set_my_original_tag_func(tbb::flow::get<0>(my_tag_funcs));\n            tbb::flow::get<0>(my_input).set_my_tag_func(tbb::flow::get<0>(my_input).my_original_func()->clone());\n            tbb::flow::get<0>(my_tag_funcs) = NULL;\n        }\n\n        template< typename TagFuncTuple1, typename TagFuncTuple2>\n        static inline void copy_tag_functors(TagFuncTuple1 &my_inputs, TagFuncTuple2 &other_inputs) {\n            if(tbb::flow::get<0>(other_inputs).my_original_func()) {\n                tbb::flow::get<0>(my_inputs).set_my_tag_func(tbb::flow::get<0>(other_inputs).my_original_func()->clone());\n                tbb::flow::get<0>(my_inputs).set_my_original_tag_func(tbb::flow::get<0>(other_inputs).my_original_func()->clone());\n            }\n        }\n        template<typename InputTuple>\n        static inline void reset_inputs(InputTuple &my_input __TBB_PFG_RESET_ARG(__TBB_COMMA reset_flags f)) {\n            tbb::flow::get<0>(my_input).reset_receiver(__TBB_PFG_RESET_ARG(f));\n        }\n    };\n\n    //! The two-phase join port\n    template< typename T >\n    class reserving_port : public receiver<T> {\n    public:\n        typedef T input_type;\n        typedef sender<T> predecessor_type;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        typedef std::vector<predecessor_type *> predecessor_vector_type;\n#endif\n    private:\n        // ----------- Aggregator ------------\n        enum op_type { reg_pred, rem_pred, res_item, rel_res, con_res\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n            , add_blt_pred, del_blt_pred, blt_pred_cnt, blt_pred_cpy\n#endif\n        };\n        enum op_stat {WAIT=0, SUCCEEDED, FAILED};\n        typedef reserving_port<T> my_class;\n\n        class reserving_port_operation : public aggregated_operation<reserving_port_operation> {\n        public:\n            char type;\n            union {\n                T *my_arg;\n                predecessor_type *my_pred;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n                size_t cnt_val;\n                predecessor_vector_type *pvec;\n#endif\n            };\n            reserving_port_operation(const T& e, op_type t) :\n                type(char(t)), my_arg(const_cast<T*>(&e)) {}\n            reserving_port_operation(const predecessor_type &s, op_type t) : type(char(t)),\n                my_pred(const_cast<predecessor_type *>(&s)) {}\n            reserving_port_operation(op_type t) : type(char(t)) {}\n        };\n\n        typedef internal::aggregating_functor<my_class, reserving_port_operation> my_handler;\n        friend class internal::aggregating_functor<my_class, reserving_port_operation>;\n        aggregator<my_handler, reserving_port_operation> my_aggregator;\n\n        void handle_operations(reserving_port_operation* op_list) {\n            reserving_port_operation *current;\n            bool no_predecessors;\n            while(op_list) {\n                current = op_list;\n                op_list = op_list->next;\n                switch(current->type) {\n                case reg_pred:\n                    no_predecessors = my_predecessors.empty();\n                    my_predecessors.add(*(current->my_pred));\n                    if ( no_predecessors ) {\n                        (void) my_join->decrement_port_count(true); // may try to forward\n                    }\n                    __TBB_store_with_release(current->status, SUCCEEDED);\n                    break;\n                case rem_pred:\n                    my_predecessors.remove(*(current->my_pred));\n                    if(my_predecessors.empty()) my_join->increment_port_count();\n                    __TBB_store_with_release(current->status, SUCCEEDED);\n                    break;\n                case res_item:\n                    if ( reserved ) {\n                        __TBB_store_with_release(current->status, FAILED);\n                    }\n                    else if ( my_predecessors.try_reserve( *(current->my_arg) ) ) {\n                        reserved = true;\n                        __TBB_store_with_release(current->status, SUCCEEDED);\n                    } else {\n                        if ( my_predecessors.empty() ) {\n                            my_join->increment_port_count();\n                        }\n                        __TBB_store_with_release(current->status, FAILED);\n                    }\n                    break;\n                case rel_res:\n                    reserved = false;\n                    my_predecessors.try_release( );\n                    __TBB_store_with_release(current->status, SUCCEEDED);\n                    break;\n                case con_res:\n                    reserved = false;\n                    my_predecessors.try_consume( );\n                    __TBB_store_with_release(current->status, SUCCEEDED);\n                    break;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n                case add_blt_pred:\n                    my_predecessors.internal_add_built_predecessor(*(current->my_pred));\n                    __TBB_store_with_release(current->status, SUCCEEDED);\n                    break;\n                case del_blt_pred:\n                    my_predecessors.internal_delete_built_predecessor(*(current->my_pred));\n                    __TBB_store_with_release(current->status, SUCCEEDED);\n                    break;\n                case blt_pred_cnt:\n                    current->cnt_val = my_predecessors.predecessor_count();\n                    __TBB_store_with_release(current->status, SUCCEEDED);\n                    break;\n                case blt_pred_cpy:\n                    my_predecessors.copy_predecessors(*(current->pvec));\n                    __TBB_store_with_release(current->status, SUCCEEDED);\n                    break;\n#endif  /* TBB_PREVIEW_FLOW_GRAPH_FEATURES */\n                }\n            }\n        }\n\n    protected:\n        template< typename R, typename B > friend class run_and_put_task;\n        template<typename X, typename Y> friend class internal::broadcast_cache;\n        template<typename X, typename Y> friend class internal::round_robin_cache;\n        task *try_put_task( const T & ) {\n            return NULL;\n        }\n\n    public:\n\n        //! Constructor\n        reserving_port() : reserved(false) {\n            my_join = NULL;\n            my_predecessors.set_owner( this );\n            my_aggregator.initialize_handler(my_handler(this));\n        }\n\n        // copy constructor\n        reserving_port(const reserving_port& /* other */) : receiver<T>() {\n            reserved = false;\n            my_join = NULL;\n            my_predecessors.set_owner( this );\n            my_aggregator.initialize_handler(my_handler(this));\n        }\n\n        void set_join_node_pointer(forwarding_base *join) {\n            my_join = join;\n        }\n\n        //! Add a predecessor\n        bool register_predecessor( sender<T> &src ) {\n            reserving_port_operation op_data(src, reg_pred);\n            my_aggregator.execute(&op_data);\n            return op_data.status == SUCCEEDED;\n        }\n\n        //! Remove a predecessor\n        bool remove_predecessor( sender<T> &src ) {\n            reserving_port_operation op_data(src, rem_pred);\n            my_aggregator.execute(&op_data);\n            return op_data.status == SUCCEEDED;\n        }\n\n        //! Reserve an item from the port\n        bool reserve( T &v ) {\n            reserving_port_operation op_data(v, res_item);\n            my_aggregator.execute(&op_data);\n            return op_data.status == SUCCEEDED;\n        }\n\n        //! Release the port\n        void release( ) {\n            reserving_port_operation op_data(rel_res);\n            my_aggregator.execute(&op_data);\n        }\n\n        //! Complete use of the port\n        void consume( ) {\n            reserving_port_operation op_data(con_res);\n            my_aggregator.execute(&op_data);\n        }\n\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        /*override*/void internal_add_built_predecessor(predecessor_type &src) {\n            reserving_port_operation op_data(src, add_blt_pred);\n            my_aggregator.execute(&op_data);\n        }\n\n        /*override*/void internal_delete_built_predecessor(predecessor_type &src) {\n            reserving_port_operation op_data(src, del_blt_pred);\n            my_aggregator.execute(&op_data);\n        }\n\n        /*override*/size_t predecessor_count() {\n            reserving_port_operation op_data(blt_pred_cnt);\n            my_aggregator.execute(&op_data);\n            return op_data.cnt_val;\n        }\n\n        /*override*/void copy_predecessors(predecessor_vector_type &v) {\n            reserving_port_operation op_data(blt_pred_cpy);\n            op_data.pvec = &v;\n            my_aggregator.execute(&op_data);\n        }\n#endif  /* TBB_PREVIEW_FLOW_GRAPH_FEATURES */\n\n        /*override*/void reset_receiver( __TBB_PFG_RESET_ARG(reset_flags f)) {\n            my_predecessors.reset(__TBB_PFG_RESET_ARG(f));\n            reserved = false;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n            __TBB_ASSERT(!(f&rf_extract) || my_predecessors.empty(), \"port edges not removed\");\n#endif\n        }\n\n    private:\n        forwarding_base *my_join;\n        reservable_predecessor_cache< T, null_mutex > my_predecessors;\n        bool reserved;\n    };\n\n    //! queueing join_port\n    template<typename T>\n    class queueing_port : public receiver<T>, public item_buffer<T> {\n    public:\n        typedef T input_type;\n        typedef sender<T> predecessor_type;\n        typedef queueing_port<T> my_node_type;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        typedef std::vector<predecessor_type *> predecessor_vector_type;\n#endif\n\n    // ----------- Aggregator ------------\n    private:\n        enum op_type { get__item, res_port, try__put_task\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n            , add_blt_pred, del_blt_pred, blt_pred_cnt, blt_pred_cpy \n#endif\n        };\n        enum op_stat {WAIT=0, SUCCEEDED, FAILED};\n        typedef queueing_port<T> my_class;\n\n        class queueing_port_operation : public aggregated_operation<queueing_port_operation> {\n        public:\n            char type;\n            T my_val;\n            T *my_arg;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n            sender<T> *pred;\n            size_t cnt_val;\n            predecessor_vector_type *pvec;\n#endif\n            task * bypass_t;\n            // constructor for value parameter\n            queueing_port_operation(const T& e, op_type t) :\n                type(char(t)), my_val(e)\n                , bypass_t(NULL)\n            {}\n            // constructor for pointer parameter\n            queueing_port_operation(const T* p, op_type t) :\n                type(char(t)), my_arg(const_cast<T*>(p))\n                , bypass_t(NULL)\n            {}\n            // constructor with no parameter\n            queueing_port_operation(op_type t) : type(char(t))\n                , bypass_t(NULL)\n            {}\n        };\n\n        typedef internal::aggregating_functor<my_class, queueing_port_operation> my_handler;\n        friend class internal::aggregating_functor<my_class, queueing_port_operation>;\n        aggregator<my_handler, queueing_port_operation> my_aggregator;\n\n        void handle_operations(queueing_port_operation* op_list) {\n            queueing_port_operation *current;\n            bool was_empty;\n            while(op_list) {\n                current = op_list;\n                op_list = op_list->next;\n                switch(current->type) {\n                case try__put_task: {\n                        task *rtask = NULL;\n                        was_empty = this->buffer_empty();\n                        this->push_back(current->my_val);\n                        if (was_empty) rtask = my_join->decrement_port_count(false);\n                        else\n                            rtask = SUCCESSFULLY_ENQUEUED;\n                        current->bypass_t = rtask;\n                        __TBB_store_with_release(current->status, SUCCEEDED);\n                    }\n                    break;\n                case get__item:\n                    if(!this->buffer_empty()) {\n                        this->copy_front(*(current->my_arg));\n                        __TBB_store_with_release(current->status, SUCCEEDED);\n                    }\n                    else {\n                        __TBB_store_with_release(current->status, FAILED);\n                    }\n                    break;\n                case res_port:\n                    __TBB_ASSERT(this->my_item_valid(this->my_head), \"No item to reset\");\n                    this->destroy_front();\n                    if(this->my_item_valid(this->my_head)) {\n                        (void)my_join->decrement_port_count(true);\n                    }\n                    __TBB_store_with_release(current->status, SUCCEEDED);\n                    break;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n                case add_blt_pred:\n                    my_built_predecessors.add_edge(*(current->pred));\n                    __TBB_store_with_release(current->status, SUCCEEDED);\n                    break;\n                case del_blt_pred:\n                    my_built_predecessors.delete_edge(*(current->pred));\n                    __TBB_store_with_release(current->status, SUCCEEDED);\n                    break;\n                case blt_pred_cnt:\n                    current->cnt_val = my_built_predecessors.edge_count();\n                    __TBB_store_with_release(current->status, SUCCEEDED);\n                    break;\n                case blt_pred_cpy:\n                    my_built_predecessors.copy_edges(*(current->pvec));\n                    __TBB_store_with_release(current->status, SUCCEEDED);\n                    break;\n#endif  /* TBB_PREVIEW_FLOW_GRAPH_FEATURES */\n                }\n            }\n        }\n    // ------------ End Aggregator ---------------\n\n    protected:\n        template< typename R, typename B > friend class run_and_put_task;\n        template<typename X, typename Y> friend class internal::broadcast_cache;\n        template<typename X, typename Y> friend class internal::round_robin_cache;\n        /*override*/task *try_put_task(const T &v) {\n            queueing_port_operation op_data(v, try__put_task);\n            my_aggregator.execute(&op_data);\n            __TBB_ASSERT(op_data.status == SUCCEEDED || !op_data.bypass_t, \"inconsistent return from aggregator\");\n            if(!op_data.bypass_t) return SUCCESSFULLY_ENQUEUED;\n            return op_data.bypass_t;\n        }\n\n    public:\n\n        //! Constructor\n        queueing_port() : item_buffer<T>() {\n            my_join = NULL;\n            my_aggregator.initialize_handler(my_handler(this));\n        }\n\n        //! copy constructor\n        queueing_port(const queueing_port& /* other */) : receiver<T>(), item_buffer<T>() {\n            my_join = NULL;\n            my_aggregator.initialize_handler(my_handler(this));\n        }\n\n        //! record parent for tallying available items\n        void set_join_node_pointer(forwarding_base *join) {\n            my_join = join;\n        }\n\n        bool get_item( T &v ) {\n            queueing_port_operation op_data(&v, get__item);\n            my_aggregator.execute(&op_data);\n            return op_data.status == SUCCEEDED;\n        }\n\n        // reset_port is called when item is accepted by successor, but\n        // is initiated by join_node.\n        void reset_port() {\n            queueing_port_operation op_data(res_port);\n            my_aggregator.execute(&op_data);\n            return;\n        }\n\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        /*override*/void internal_add_built_predecessor(sender<T> &p) {\n            queueing_port_operation op_data(add_blt_pred);\n            op_data.pred = &p;\n            my_aggregator.execute(&op_data);\n        }\n\n        /*override*/void internal_delete_built_predecessor(sender<T> &p) {\n            queueing_port_operation op_data(del_blt_pred);\n            op_data.pred = &p;\n            my_aggregator.execute(&op_data);\n        }\n\n        /*override*/size_t predecessor_count() {\n            queueing_port_operation op_data(blt_pred_cnt);\n            my_aggregator.execute(&op_data);\n            return op_data.cnt_val;\n        }\n\n        /*override*/void copy_predecessors(predecessor_vector_type &v) {\n            queueing_port_operation op_data(blt_pred_cpy);\n            op_data.pvec = &v;\n            my_aggregator.execute(&op_data);\n        }\n\n        /*override*/void reset_receiver(__TBB_PFG_RESET_ARG(reset_flags f)) { \n            item_buffer<T>::reset(); \n            if (f & rf_extract)\n                my_built_predecessors.receiver_extract(*this);\n        }\n#else\n        /*override*/void reset_receiver(__TBB_PFG_RESET_ARG(reset_flags /*f*/)) { item_buffer<T>::reset(); }\n#endif  /* TBB_PREVIEW_FLOW_GRAPH_FEATURES */\n\n    private:\n        forwarding_base *my_join;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        edge_container<sender<T> > my_built_predecessors;\n#endif\n    };\n\n#include \"_flow_graph_tagged_buffer_impl.h\"\n\n    template< typename T >\n    class tag_matching_port : public receiver<T>, public tagged_buffer< tag_value, T, NO_TAG > {\n    public:\n        typedef T input_type;\n        typedef sender<T> predecessor_type;\n        typedef tag_matching_port<T> my_node_type;  // for forwarding, if needed\n        typedef function_body<input_type, tag_value> my_tag_func_type;\n        typedef tagged_buffer<tag_value,T,NO_TAG> my_buffer_type;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        typedef std::vector<predecessor_type *> predecessor_vector_type;\n#endif\n    private:\n// ----------- Aggregator ------------\n    private:\n        enum op_type { try__put, get__item, res_port,\n            add_blt_pred, del_blt_pred, blt_pred_cnt, blt_pred_cpy\n        };\n        enum op_stat {WAIT=0, SUCCEEDED, FAILED};\n        typedef tag_matching_port<T> my_class;\n\n        class tag_matching_port_operation : public aggregated_operation<tag_matching_port_operation> {\n        public:\n            char type;\n            T my_val;\n            T *my_arg;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n            predecessor_type *pred;\n            size_t cnt_val;\n            predecessor_vector_type *pvec;\n#endif\n            tag_value my_tag_value;\n            // constructor for value parameter\n            tag_matching_port_operation(const T& e, op_type t) :\n                type(char(t)), my_val(e) {}\n            // constructor for pointer parameter\n            tag_matching_port_operation(const T* p, op_type t) :\n                type(char(t)), my_arg(const_cast<T*>(p)) {}\n            // constructor with no parameter\n            tag_matching_port_operation(op_type t) : type(char(t)) {}\n        };\n\n        typedef internal::aggregating_functor<my_class, tag_matching_port_operation> my_handler;\n        friend class internal::aggregating_functor<my_class, tag_matching_port_operation>;\n        aggregator<my_handler, tag_matching_port_operation> my_aggregator;\n\n        void handle_operations(tag_matching_port_operation* op_list) {\n            tag_matching_port_operation *current;\n            while(op_list) {\n                current = op_list;\n                op_list = op_list->next;\n                switch(current->type) {\n                case try__put: {\n                        bool was_inserted = this->tagged_insert(current->my_tag_value, current->my_val);\n                        // return failure if a duplicate insertion occurs\n                        __TBB_store_with_release(current->status, was_inserted ? SUCCEEDED : FAILED);\n                    }\n                    break;\n                case get__item:\n                    // use current_tag from FE for item\n                    if(!this->tagged_find(my_join->current_tag, *(current->my_arg))) {\n                        __TBB_ASSERT(false, \"Failed to find item corresponding to current_tag.\");\n                    }\n                    __TBB_store_with_release(current->status, SUCCEEDED);\n                    break;\n                case res_port:\n                    // use current_tag from FE for item\n                    this->tagged_delete(my_join->current_tag);\n                    __TBB_store_with_release(current->status, SUCCEEDED);\n                    break;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n                case add_blt_pred:\n                    my_built_predecessors.add_edge(*(current->pred));\n                    __TBB_store_with_release(current->status, SUCCEEDED);\n                    break;\n                case del_blt_pred:\n                    my_built_predecessors.delete_edge(*(current->pred));\n                    __TBB_store_with_release(current->status, SUCCEEDED);\n                    break;\n                case blt_pred_cnt:\n                    current->cnt_val = my_built_predecessors.edge_count();\n                    __TBB_store_with_release(current->status, SUCCEEDED);\n                    break;\n                case blt_pred_cpy:\n                    my_built_predecessors.copy_edges(*(current->pvec));\n                    __TBB_store_with_release(current->status, SUCCEEDED);\n                    break;\n#endif\n                }\n            }\n        }\n// ------------ End Aggregator ---------------\n    protected:\n        template< typename R, typename B > friend class run_and_put_task;\n        template<typename X, typename Y> friend class internal::broadcast_cache;\n        template<typename X, typename Y> friend class internal::round_robin_cache;\n        /*override*/task *try_put_task(const T& v) {\n            tag_matching_port_operation op_data(v, try__put);\n            op_data.my_tag_value = (*my_tag_func)(v);\n            task *rtask = NULL;\n            my_aggregator.execute(&op_data);\n            if(op_data.status == SUCCEEDED) {\n                rtask = my_join->increment_tag_count(op_data.my_tag_value, false);  // may spawn\n                // rtask has to reflect the return status of the try_put\n                if(!rtask) rtask = SUCCESSFULLY_ENQUEUED;\n            }\n            return rtask;\n        }\n\n    public:\n\n        tag_matching_port() : receiver<T>(), tagged_buffer<tag_value, T, NO_TAG>() {\n            my_join = NULL;\n            my_tag_func = NULL;\n            my_original_tag_func = NULL;\n            my_aggregator.initialize_handler(my_handler(this));\n        }\n\n        // copy constructor\n        tag_matching_port(const tag_matching_port& /*other*/) : receiver<T>(), tagged_buffer<tag_value,T, NO_TAG>() {\n            my_join = NULL;\n            // setting the tag methods is done in the copy-constructor for the front-end.\n            my_tag_func = NULL;\n            my_original_tag_func = NULL;\n            my_aggregator.initialize_handler(my_handler(this));\n        }\n\n        ~tag_matching_port() {\n            if (my_tag_func) delete my_tag_func;\n            if (my_original_tag_func) delete my_original_tag_func;\n        }\n\n        void set_join_node_pointer(forwarding_base *join) {\n            my_join = join;\n        }\n\n        void set_my_original_tag_func(my_tag_func_type *f) {\n            my_original_tag_func = f;\n        }\n\n        void set_my_tag_func(my_tag_func_type *f) {\n            my_tag_func = f;\n        }\n\n        bool get_item( T &v ) {\n            tag_matching_port_operation op_data(&v, get__item);\n            my_aggregator.execute(&op_data);\n            return op_data.status == SUCCEEDED;\n        }\n\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        /*override*/void internal_add_built_predecessor(sender<T> &p) {\n            tag_matching_port_operation op_data(add_blt_pred);\n            op_data.pred = &p;\n            my_aggregator.execute(&op_data);\n        }\n\n        /*override*/void internal_delete_built_predecessor(sender<T> &p) {\n            tag_matching_port_operation op_data(del_blt_pred);\n            op_data.pred = &p;\n            my_aggregator.execute(&op_data);\n        }\n\n        /*override*/size_t predecessor_count() {\n            tag_matching_port_operation op_data(blt_pred_cnt);\n            my_aggregator.execute(&op_data);\n            return op_data.cnt_val;\n        }\n\n        /*override*/void copy_predecessors(predecessor_vector_type &v) {\n            tag_matching_port_operation op_data(blt_pred_cpy);\n            op_data.pvec = &v;\n            my_aggregator.execute(&op_data);\n        }\n#endif\n\n        // reset_port is called when item is accepted by successor, but\n        // is initiated by join_node.\n        void reset_port() {\n            tag_matching_port_operation op_data(res_port);\n            my_aggregator.execute(&op_data);\n            return;\n        }\n\n        my_tag_func_type *my_func() { return my_tag_func; }\n        my_tag_func_type *my_original_func() { return my_original_tag_func; }\n\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        /*override*/void reset_receiver(__TBB_PFG_RESET_ARG(reset_flags f)) { \n            my_buffer_type::reset(); \n           if (f & rf_extract)\n              my_built_predecessors.receiver_extract(*this);\n        }\n#else\n        /*override*/void reset_receiver(__TBB_PFG_RESET_ARG(reset_flags /*f*/)) { my_buffer_type::reset(); }\n#endif\n\n    private:\n        // need map of tags to values\n        forwarding_base *my_join;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        edge_container<predecessor_type> my_built_predecessors;\n#endif\n        my_tag_func_type *my_tag_func;\n        my_tag_func_type *my_original_tag_func;\n    };  // tag_matching_port\n\n    using namespace graph_policy_namespace;\n\n    template<graph_buffer_policy JP, typename InputTuple, typename OutputTuple>\n    class join_node_base;\n\n    //! join_node_FE : implements input port policy\n    template<graph_buffer_policy JP, typename InputTuple, typename OutputTuple>\n    class join_node_FE;\n\n    template<typename InputTuple, typename OutputTuple>\n    class join_node_FE<reserving, InputTuple, OutputTuple> : public forwarding_base {\n    public:\n        static const int N = tbb::flow::tuple_size<OutputTuple>::value;\n        typedef OutputTuple output_type;\n        typedef InputTuple input_type;\n        typedef join_node_base<reserving, InputTuple, OutputTuple> my_node_type; // for forwarding\n\n        join_node_FE(graph &g) : forwarding_base(g), my_node(NULL) {\n            ports_with_no_inputs = N;\n            join_helper<N>::set_join_node_pointer(my_inputs, this);\n        }\n\n        join_node_FE(const join_node_FE& other) : forwarding_base(*(other.forwarding_base::my_graph_ptr)), my_node(NULL) {\n            ports_with_no_inputs = N;\n            join_helper<N>::set_join_node_pointer(my_inputs, this);\n        }\n\n        void set_my_node(my_node_type *new_my_node) { my_node = new_my_node; }\n\n       void increment_port_count() {\n            ++ports_with_no_inputs;\n        }\n\n        // if all input_ports have predecessors, spawn forward to try and consume tuples\n        task * decrement_port_count(bool handle_task) {\n            if(ports_with_no_inputs.fetch_and_decrement() == 1) {\n                task* tp = this->my_graph_ptr->root_task();\n                if(tp) {\n                    task *rtask = new ( task::allocate_additional_child_of( *tp ) )\n                        forward_task_bypass<my_node_type>(*my_node);\n                    if(!handle_task) return rtask;\n                    FLOW_SPAWN(*rtask);\n                }\n            }\n            return NULL;\n        }\n\n        input_type &input_ports() { return my_inputs; }\n\n    protected:\n\n        void reset( __TBB_PFG_RESET_ARG( reset_flags f)) {\n            // called outside of parallel contexts\n            ports_with_no_inputs = N;\n            join_helper<N>::reset_inputs(my_inputs __TBB_PFG_RESET_ARG( __TBB_COMMA f));\n        }\n\n        // all methods on input ports should be called under mutual exclusion from join_node_base.\n\n        bool tuple_build_may_succeed() {\n            return !ports_with_no_inputs;\n        }\n\n        bool try_to_make_tuple(output_type &out) {\n            if(ports_with_no_inputs) return false;\n            return join_helper<N>::reserve(my_inputs, out);\n        }\n\n        void tuple_accepted() {\n            join_helper<N>::consume_reservations(my_inputs);\n        }\n        void tuple_rejected() {\n            join_helper<N>::release_reservations(my_inputs);\n        }\n\n        input_type my_inputs;\n        my_node_type *my_node;\n        atomic<size_t> ports_with_no_inputs;\n    };\n\n    template<typename InputTuple, typename OutputTuple>\n    class join_node_FE<queueing, InputTuple, OutputTuple> : public forwarding_base {\n    public:\n        static const int N = tbb::flow::tuple_size<OutputTuple>::value;\n        typedef OutputTuple output_type;\n        typedef InputTuple input_type;\n        typedef join_node_base<queueing, InputTuple, OutputTuple> my_node_type; // for forwarding\n\n        join_node_FE(graph &g) : forwarding_base(g), my_node(NULL) {\n            ports_with_no_items = N;\n            join_helper<N>::set_join_node_pointer(my_inputs, this);\n        }\n\n        join_node_FE(const join_node_FE& other) : forwarding_base(*(other.forwarding_base::my_graph_ptr)), my_node(NULL) {\n            ports_with_no_items = N;\n            join_helper<N>::set_join_node_pointer(my_inputs, this);\n        }\n\n        // needed for forwarding\n        void set_my_node(my_node_type *new_my_node) { my_node = new_my_node; }\n\n        void reset_port_count() {\n            ports_with_no_items = N;\n        }\n\n        // if all input_ports have items, spawn forward to try and consume tuples\n        task * decrement_port_count(bool handle_task)\n        {\n            if(ports_with_no_items.fetch_and_decrement() == 1) {\n                task* tp = this->my_graph_ptr->root_task();\n                if(tp) {\n                    task *rtask = new ( task::allocate_additional_child_of( *tp ) )\n                        forward_task_bypass <my_node_type>(*my_node);\n                    if(!handle_task) return rtask;\n                    FLOW_SPAWN( *rtask);\n                }\n            }\n            return NULL;\n        }\n\n        void increment_port_count() { __TBB_ASSERT(false, NULL); }  // should never be called\n\n        input_type &input_ports() { return my_inputs; }\n\n    protected:\n\n        void reset( __TBB_PFG_RESET_ARG( reset_flags f)) {\n            reset_port_count();\n            join_helper<N>::reset_inputs(my_inputs __TBB_PFG_RESET_ARG( __TBB_COMMA f) );\n        }\n\n        // all methods on input ports should be called under mutual exclusion from join_node_base.\n\n        bool tuple_build_may_succeed() {\n            return !ports_with_no_items;\n        }\n\n        bool try_to_make_tuple(output_type &out) {\n            if(ports_with_no_items) return false;\n            return join_helper<N>::get_items(my_inputs, out);\n        }\n\n        void tuple_accepted() {\n            reset_port_count();\n            join_helper<N>::reset_ports(my_inputs);\n        }\n        void tuple_rejected() {\n            // nothing to do.\n        }\n\n        input_type my_inputs;\n        my_node_type *my_node;\n        atomic<size_t> ports_with_no_items;\n    };\n\n    // tag_matching join input port.\n    template<typename InputTuple, typename OutputTuple>\n    class join_node_FE<tag_matching, InputTuple, OutputTuple> : public forwarding_base,\n             //     buffer of tag value counts                       buffer of output items\n             public tagged_buffer<tag_value, size_t, NO_TAG>, public item_buffer<OutputTuple> {\n    public:\n        static const int N = tbb::flow::tuple_size<OutputTuple>::value;\n        typedef OutputTuple output_type;\n        typedef InputTuple input_type;\n        typedef tagged_buffer<tag_value, size_t, NO_TAG> my_tag_buffer;\n        typedef item_buffer<output_type> output_buffer_type;\n        typedef join_node_base<tag_matching, InputTuple, OutputTuple> my_node_type; // for forwarding\n\n// ----------- Aggregator ------------\n        // the aggregator is only needed to serialize the access to the hash table.\n        // and the output_buffer_type base class\n    private:\n        enum op_type { res_count, inc_count, may_succeed, try_make };\n        enum op_stat {WAIT=0, SUCCEEDED, FAILED};\n        typedef join_node_FE<tag_matching, InputTuple, OutputTuple> my_class;\n\n        class tag_matching_FE_operation : public aggregated_operation<tag_matching_FE_operation> {\n        public:\n            char type;\n            union {\n                tag_value my_val;\n                output_type* my_output;\n            };\n            task *bypass_t;\n            bool enqueue_task;\n            // constructor for value parameter\n            tag_matching_FE_operation(const tag_value& e , bool q_task , op_type t) : type(char(t)), my_val(e),\n                 bypass_t(NULL), enqueue_task(q_task) {}\n            tag_matching_FE_operation(output_type *p, op_type t) : type(char(t)), my_output(p), bypass_t(NULL),\n                 enqueue_task(true) {}\n            // constructor with no parameter\n            tag_matching_FE_operation(op_type t) : type(char(t)), bypass_t(NULL), enqueue_task(true) {}\n        };\n\n        typedef internal::aggregating_functor<my_class, tag_matching_FE_operation> my_handler;\n        friend class internal::aggregating_functor<my_class, tag_matching_FE_operation>;\n        aggregator<my_handler, tag_matching_FE_operation> my_aggregator;\n\n        // called from aggregator, so serialized\n        // construct as many output objects as possible.\n        // returns a task pointer if the a task would have been enqueued but we asked that\n        // it be returned.  Otherwise returns NULL.\n        task * fill_output_buffer(tag_value t, bool should_enqueue, bool handle_task) {\n            output_type l_out;\n            task *rtask = NULL;\n            task* tp = this->my_graph_ptr->root_task();\n            bool do_fwd = should_enqueue && this->buffer_empty() && tp;\n            this->current_tag = t;\n            this->tagged_delete(this->current_tag);   // remove the tag\n            if(join_helper<N>::get_items(my_inputs, l_out)) {  //  <== call back\n                this->push_back(l_out);\n                if(do_fwd) {  // we enqueue if receiving an item from predecessor, not if successor asks for item\n                    rtask = new ( task::allocate_additional_child_of( *tp ) )\n                        forward_task_bypass<my_node_type>(*my_node);\n                    if(handle_task) {\n                        FLOW_SPAWN(*rtask);\n                        rtask = NULL;\n                    }\n                    do_fwd = false;\n                }\n                // retire the input values\n                join_helper<N>::reset_ports(my_inputs);  //  <== call back\n                this->current_tag = NO_TAG;\n            }\n            else {\n                __TBB_ASSERT(false, \"should have had something to push\");\n            }\n            return rtask;\n        }\n\n        void handle_operations(tag_matching_FE_operation* op_list) {\n            tag_matching_FE_operation *current;\n            while(op_list) {\n                current = op_list;\n                op_list = op_list->next;\n                switch(current->type) {\n                case res_count:  // called from BE\n                    {\n                        this->destroy_front();\n                        __TBB_store_with_release(current->status, SUCCEEDED);\n                    }\n                    break;\n                case inc_count: {  // called from input ports\n                        size_t *p = 0;\n                        tag_value t = current->my_val;\n                        bool do_enqueue = current->enqueue_task;\n                        if(!(this->tagged_find_ref(t,p))) {\n                            this->tagged_insert(t, 0);\n                            if(!(this->tagged_find_ref(t,p))) {\n                                __TBB_ASSERT(false, \"should find tag after inserting it\");\n                            }\n                        }\n                        if(++(*p) == size_t(N)) {\n                            task *rtask = fill_output_buffer(t, true, do_enqueue);\n                            __TBB_ASSERT(!rtask || !do_enqueue, \"task should not be returned\");\n                            current->bypass_t = rtask;\n                        }\n                    }\n                    __TBB_store_with_release(current->status, SUCCEEDED);\n                    break;\n                case may_succeed:  // called from BE\n                    __TBB_store_with_release(current->status, this->buffer_empty() ? FAILED : SUCCEEDED);\n                    break;\n                case try_make:  // called from BE\n                    if(this->buffer_empty()) {\n                        __TBB_store_with_release(current->status, FAILED);\n                    }\n                    else {\n                        this->copy_front(*(current->my_output));\n                        __TBB_store_with_release(current->status, SUCCEEDED);\n                    }\n                    break;\n                }\n            }\n        }\n// ------------ End Aggregator ---------------\n\n    public:\n        template<typename FunctionTuple>\n        join_node_FE(graph &g, FunctionTuple tag_funcs) : forwarding_base(g), my_node(NULL) {\n            join_helper<N>::set_join_node_pointer(my_inputs, this);\n            join_helper<N>::set_tag_func(my_inputs, tag_funcs);\n            my_aggregator.initialize_handler(my_handler(this));\n        }\n\n        join_node_FE(const join_node_FE& other) : forwarding_base(*(other.forwarding_base::my_graph_ptr)), my_tag_buffer(),\n        output_buffer_type() {\n            my_node = NULL;\n            join_helper<N>::set_join_node_pointer(my_inputs, this);\n            join_helper<N>::copy_tag_functors(my_inputs, const_cast<input_type &>(other.my_inputs));\n            my_aggregator.initialize_handler(my_handler(this));\n        }\n\n        // needed for forwarding\n        void set_my_node(my_node_type *new_my_node) { my_node = new_my_node; }\n\n        void reset_port_count() {  // called from BE\n            tag_matching_FE_operation op_data(res_count);\n            my_aggregator.execute(&op_data);\n            return;\n        }\n\n        // if all input_ports have items, spawn forward to try and consume tuples\n        // return a task if we are asked and did create one.\n        task *increment_tag_count(tag_value t, bool handle_task) {  // called from input_ports\n            tag_matching_FE_operation op_data(t, handle_task, inc_count);\n            my_aggregator.execute(&op_data);\n            return op_data.bypass_t;\n        }\n\n        /*override*/ task *decrement_port_count(bool /*handle_task*/) { __TBB_ASSERT(false, NULL); return NULL; }\n\n        void increment_port_count() { __TBB_ASSERT(false, NULL); }  // should never be called\n\n        input_type &input_ports() { return my_inputs; }\n\n    protected:\n\n        void reset( __TBB_PFG_RESET_ARG( reset_flags f )) {\n            // called outside of parallel contexts\n            join_helper<N>::reset_inputs(my_inputs __TBB_PFG_RESET_ARG( __TBB_COMMA f));\n\n            my_tag_buffer::reset();  // have to reset the tag counts\n            output_buffer_type::reset();  // also the queue of outputs\n            my_node->current_tag = NO_TAG;\n        }\n\n        // all methods on input ports should be called under mutual exclusion from join_node_base.\n\n        bool tuple_build_may_succeed() {  // called from back-end\n            tag_matching_FE_operation op_data(may_succeed);\n            my_aggregator.execute(&op_data);\n            return op_data.status == SUCCEEDED;\n        }\n\n        // cannot lock while calling back to input_ports.  current_tag will only be set\n        // and reset under the aggregator, so it will remain consistent.\n        bool try_to_make_tuple(output_type &out) {\n            tag_matching_FE_operation op_data(&out,try_make);\n            my_aggregator.execute(&op_data);\n            return op_data.status == SUCCEEDED;\n        }\n\n        void tuple_accepted() {\n            reset_port_count();  // reset current_tag after ports reset.\n        }\n\n        void tuple_rejected() {\n            // nothing to do.\n        }\n\n        input_type my_inputs;  // input ports\n        my_node_type *my_node;\n    }; // join_node_FE<tag_matching, InputTuple, OutputTuple>\n\n    //! join_node_base\n    template<graph_buffer_policy JP, typename InputTuple, typename OutputTuple>\n    class join_node_base : public graph_node, public join_node_FE<JP, InputTuple, OutputTuple>,\n                           public sender<OutputTuple> {\n    protected:\n        using graph_node::my_graph;\n    public:\n        typedef OutputTuple output_type;\n\n        typedef receiver<output_type> successor_type;\n        typedef join_node_FE<JP, InputTuple, OutputTuple> input_ports_type;\n        using input_ports_type::tuple_build_may_succeed;\n        using input_ports_type::try_to_make_tuple;\n        using input_ports_type::tuple_accepted;\n        using input_ports_type::tuple_rejected;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        typedef std::vector<successor_type *> successor_vector_type;\n#endif\n\n    private:\n        // ----------- Aggregator ------------\n        enum op_type { reg_succ, rem_succ, try__get, do_fwrd, do_fwrd_bypass\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n            , add_blt_succ, del_blt_succ, blt_succ_cnt, blt_succ_cpy\n#endif\n        };\n        enum op_stat {WAIT=0, SUCCEEDED, FAILED};\n        typedef join_node_base<JP,InputTuple,OutputTuple> my_class;\n\n        class join_node_base_operation : public aggregated_operation<join_node_base_operation> {\n        public:\n            char type;\n            union {\n                output_type *my_arg;\n                successor_type *my_succ;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n                size_t cnt_val;\n                successor_vector_type *svec;\n#endif\n            };\n            task *bypass_t;\n            join_node_base_operation(const output_type& e, op_type t) : type(char(t)),\n                my_arg(const_cast<output_type*>(&e)), bypass_t(NULL) {}\n            join_node_base_operation(const successor_type &s, op_type t) : type(char(t)),\n                my_succ(const_cast<successor_type *>(&s)), bypass_t(NULL) {}\n            join_node_base_operation(op_type t) : type(char(t)), bypass_t(NULL) {}\n        };\n\n        typedef internal::aggregating_functor<my_class, join_node_base_operation> my_handler;\n        friend class internal::aggregating_functor<my_class, join_node_base_operation>;\n        bool forwarder_busy;\n        aggregator<my_handler, join_node_base_operation> my_aggregator;\n\n        void handle_operations(join_node_base_operation* op_list) {\n            join_node_base_operation *current;\n            while(op_list) {\n                current = op_list;\n                op_list = op_list->next;\n                switch(current->type) {\n                case reg_succ: {\n                        my_successors.register_successor(*(current->my_succ));\n                        task* tp = this->graph_node::my_graph.root_task();\n                        if(tuple_build_may_succeed() && !forwarder_busy && tp) {\n                            task *rtask = new ( task::allocate_additional_child_of(*tp) )\n                                    forward_task_bypass\n                                    <join_node_base<JP,InputTuple,OutputTuple> >(*this);\n                            FLOW_SPAWN(*rtask);\n                            forwarder_busy = true;\n                        }\n                        __TBB_store_with_release(current->status, SUCCEEDED);\n                    }\n                    break;\n                case rem_succ:\n                    my_successors.remove_successor(*(current->my_succ));\n                    __TBB_store_with_release(current->status, SUCCEEDED);\n                    break;\n                case try__get:\n                    if(tuple_build_may_succeed()) {\n                        if(try_to_make_tuple(*(current->my_arg))) {\n                            tuple_accepted();\n                            __TBB_store_with_release(current->status, SUCCEEDED);\n                        }\n                        else __TBB_store_with_release(current->status, FAILED);\n                    }\n                    else __TBB_store_with_release(current->status, FAILED);\n                    break;\n                case do_fwrd_bypass: {\n                        bool build_succeeded;\n                        task *last_task = NULL;\n                        output_type out;\n                        if(tuple_build_may_succeed()) {\n                            do {\n                                build_succeeded = try_to_make_tuple(out);\n                                if(build_succeeded) {\n                                    task *new_task = my_successors.try_put_task(out);\n                                    last_task = combine_tasks(last_task, new_task);\n                                    if(new_task) {\n                                        tuple_accepted();\n                                    }\n                                    else {\n                                        tuple_rejected();\n                                        build_succeeded = false;\n                                    }\n                                }\n                            } while(build_succeeded);\n                        }\n                        current->bypass_t = last_task;\n                        __TBB_store_with_release(current->status, SUCCEEDED);\n                        forwarder_busy = false;\n                    }\n                    break;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n                case add_blt_succ:\n                    my_successors.internal_add_built_successor(*(current->my_succ));\n                    __TBB_store_with_release(current->status, SUCCEEDED);\n                    break;\n                case del_blt_succ:\n                    my_successors.internal_delete_built_successor(*(current->my_succ));\n                    __TBB_store_with_release(current->status, SUCCEEDED);\n                    break;\n                case blt_succ_cnt:\n                    current->cnt_val = my_successors.successor_count();\n                    __TBB_store_with_release(current->status, SUCCEEDED);\n                    break;\n                case blt_succ_cpy:\n                    my_successors.copy_successors(*(current->svec));\n                    __TBB_store_with_release(current->status, SUCCEEDED);\n                    break;\n#endif  /* TBB_PREVIEW_FLOW_GRAPH_FEATURES */\n                }\n            }\n        }\n        // ---------- end aggregator -----------\n    public:\n        join_node_base(graph &g) : graph_node(g), input_ports_type(g), forwarder_busy(false) {\n            my_successors.set_owner(this);\n            input_ports_type::set_my_node(this);\n            my_aggregator.initialize_handler(my_handler(this));\n        }\n\n        join_node_base(const join_node_base& other) :\n            graph_node(other.graph_node::my_graph), input_ports_type(other),\n            sender<OutputTuple>(), forwarder_busy(false), my_successors() {\n            my_successors.set_owner(this);\n            input_ports_type::set_my_node(this);\n            my_aggregator.initialize_handler(my_handler(this));\n        }\n\n        template<typename FunctionTuple>\n        join_node_base(graph &g, FunctionTuple f) : graph_node(g), input_ports_type(g, f), forwarder_busy(false) {\n            my_successors.set_owner(this);\n            input_ports_type::set_my_node(this);\n            my_aggregator.initialize_handler(my_handler(this));\n        }\n\n        bool register_successor(successor_type &r) {\n            join_node_base_operation op_data(r, reg_succ);\n            my_aggregator.execute(&op_data);\n            return op_data.status == SUCCEEDED;\n        }\n\n        bool remove_successor( successor_type &r) {\n            join_node_base_operation op_data(r, rem_succ);\n            my_aggregator.execute(&op_data);\n            return op_data.status == SUCCEEDED;\n        }\n\n        bool try_get( output_type &v) {\n            join_node_base_operation op_data(v, try__get);\n            my_aggregator.execute(&op_data);\n            return op_data.status == SUCCEEDED;\n        }\n\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        /*override*/void internal_add_built_successor( successor_type &r) {\n            join_node_base_operation op_data(r, add_blt_succ);\n            my_aggregator.execute(&op_data);\n        }\n\n        /*override*/void internal_delete_built_successor( successor_type &r) {\n            join_node_base_operation op_data(r, del_blt_succ);\n            my_aggregator.execute(&op_data);\n        }\n\n        /*override*/size_t successor_count() {\n            join_node_base_operation op_data(blt_succ_cnt);\n            my_aggregator.execute(&op_data);\n            return op_data.cnt_val;\n        }\n\n        /*override*/ void copy_successors(successor_vector_type &v) {\n            join_node_base_operation op_data(blt_succ_cpy);\n            op_data.svec = &v;\n            my_aggregator.execute(&op_data);\n        }\n#endif  /* TBB_PREVIEW_FLOW_GRAPH_FEATURES */\n\n    protected:\n\n        /*override*/void reset(__TBB_PFG_RESET_ARG(reset_flags f)) {\n            input_ports_type::reset(__TBB_PFG_RESET_ARG(f));\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n            my_successors.reset(f);\n#endif\n        }\n\n    private:\n        broadcast_cache<output_type, null_rw_mutex> my_successors;\n\n        friend class forward_task_bypass< join_node_base<JP, InputTuple, OutputTuple> >;\n        task *forward_task() {\n            join_node_base_operation op_data(do_fwrd_bypass);\n            my_aggregator.execute(&op_data);\n            return op_data.bypass_t;\n        }\n\n    };\n\n    // join base class type generator\n    template<int N, template<class> class PT, typename OutputTuple, graph_buffer_policy JP>\n    struct join_base {\n        typedef typename internal::join_node_base<JP, typename wrap_tuple_elements<N,PT,OutputTuple>::type, OutputTuple> type;\n    };\n\n    //! unfolded_join_node : passes input_ports_type to join_node_base.  We build the input port type\n    //  using tuple_element.  The class PT is the port type (reserving_port, queueing_port, tag_matching_port)\n    //  and should match the graph_buffer_policy.\n\n    template<int N, template<class> class PT, typename OutputTuple, graph_buffer_policy JP>\n    class unfolded_join_node : public join_base<N,PT,OutputTuple,JP>::type {\n    public:\n        typedef typename wrap_tuple_elements<N, PT, OutputTuple>::type input_ports_type;\n        typedef OutputTuple output_type;\n    private:\n        typedef join_node_base<JP, input_ports_type, output_type > base_type;\n    public:\n        unfolded_join_node(graph &g) : base_type(g) {}\n        unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}\n    };\n\n    // tag_matching unfolded_join_node.  This must be a separate specialization because the constructors\n    // differ.\n\n    template<typename OutputTuple>\n    class unfolded_join_node<2,tag_matching_port,OutputTuple,tag_matching> : public\n            join_base<2,tag_matching_port,OutputTuple,tag_matching>::type {\n        typedef typename tbb::flow::tuple_element<0, OutputTuple>::type T0;\n        typedef typename tbb::flow::tuple_element<1, OutputTuple>::type T1;\n    public:\n        typedef typename wrap_tuple_elements<2,tag_matching_port,OutputTuple>::type input_ports_type;\n        typedef OutputTuple output_type;\n    private:\n        typedef join_node_base<tag_matching, input_ports_type, output_type > base_type;\n        typedef typename internal::function_body<T0, tag_value> *f0_p;\n        typedef typename internal::function_body<T1, tag_value> *f1_p;\n        typedef typename tbb::flow::tuple< f0_p, f1_p > func_initializer_type;\n    public:\n        template<typename B0, typename B1>\n        unfolded_join_node(graph &g, B0 b0, B1 b1) : base_type(g,\n                func_initializer_type(\n                    new internal::function_body_leaf<T0, tag_value, B0>(b0),\n                    new internal::function_body_leaf<T1, tag_value, B1>(b1)\n                    ) ) {}\n        unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}\n    };\n\n    template<typename OutputTuple>\n    class unfolded_join_node<3,tag_matching_port,OutputTuple,tag_matching> : public\n            join_base<3,tag_matching_port,OutputTuple,tag_matching>::type {\n        typedef typename tbb::flow::tuple_element<0, OutputTuple>::type T0;\n        typedef typename tbb::flow::tuple_element<1, OutputTuple>::type T1;\n        typedef typename tbb::flow::tuple_element<2, OutputTuple>::type T2;\n    public:\n        typedef typename wrap_tuple_elements<3, tag_matching_port, OutputTuple>::type input_ports_type;\n        typedef OutputTuple output_type;\n    private:\n        typedef join_node_base<tag_matching, input_ports_type, output_type > base_type;\n        typedef typename internal::function_body<T0, tag_value> *f0_p;\n        typedef typename internal::function_body<T1, tag_value> *f1_p;\n        typedef typename internal::function_body<T2, tag_value> *f2_p;\n        typedef typename tbb::flow::tuple< f0_p, f1_p, f2_p > func_initializer_type;\n    public:\n        template<typename B0, typename B1, typename B2>\n        unfolded_join_node(graph &g, B0 b0, B1 b1, B2 b2) : base_type(g,\n                func_initializer_type(\n                    new internal::function_body_leaf<T0, tag_value, B0>(b0),\n                    new internal::function_body_leaf<T1, tag_value, B1>(b1),\n                    new internal::function_body_leaf<T2, tag_value, B2>(b2)\n                    ) ) {}\n        unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}\n    };\n\n    template<typename OutputTuple>\n    class unfolded_join_node<4,tag_matching_port,OutputTuple,tag_matching> : public\n            join_base<4,tag_matching_port,OutputTuple,tag_matching>::type {\n        typedef typename tbb::flow::tuple_element<0, OutputTuple>::type T0;\n        typedef typename tbb::flow::tuple_element<1, OutputTuple>::type T1;\n        typedef typename tbb::flow::tuple_element<2, OutputTuple>::type T2;\n        typedef typename tbb::flow::tuple_element<3, OutputTuple>::type T3;\n    public:\n        typedef typename wrap_tuple_elements<4, tag_matching_port, OutputTuple>::type input_ports_type;\n        typedef OutputTuple output_type;\n    private:\n        typedef join_node_base<tag_matching, input_ports_type, output_type > base_type;\n        typedef typename internal::function_body<T0, tag_value> *f0_p;\n        typedef typename internal::function_body<T1, tag_value> *f1_p;\n        typedef typename internal::function_body<T2, tag_value> *f2_p;\n        typedef typename internal::function_body<T3, tag_value> *f3_p;\n        typedef typename tbb::flow::tuple< f0_p, f1_p, f2_p, f3_p > func_initializer_type;\n    public:\n        template<typename B0, typename B1, typename B2, typename B3>\n        unfolded_join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3) : base_type(g,\n                func_initializer_type(\n                    new internal::function_body_leaf<T0, tag_value, B0>(b0),\n                    new internal::function_body_leaf<T1, tag_value, B1>(b1),\n                    new internal::function_body_leaf<T2, tag_value, B2>(b2),\n                    new internal::function_body_leaf<T3, tag_value, B3>(b3)\n                    ) ) {}\n        unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}\n    };\n\n    template<typename OutputTuple>\n    class unfolded_join_node<5,tag_matching_port,OutputTuple,tag_matching> : public\n            join_base<5,tag_matching_port,OutputTuple,tag_matching>::type {\n        typedef typename tbb::flow::tuple_element<0, OutputTuple>::type T0;\n        typedef typename tbb::flow::tuple_element<1, OutputTuple>::type T1;\n        typedef typename tbb::flow::tuple_element<2, OutputTuple>::type T2;\n        typedef typename tbb::flow::tuple_element<3, OutputTuple>::type T3;\n        typedef typename tbb::flow::tuple_element<4, OutputTuple>::type T4;\n    public:\n        typedef typename wrap_tuple_elements<5, tag_matching_port, OutputTuple>::type input_ports_type;\n        typedef OutputTuple output_type;\n    private:\n        typedef join_node_base<tag_matching, input_ports_type, output_type > base_type;\n        typedef typename internal::function_body<T0, tag_value> *f0_p;\n        typedef typename internal::function_body<T1, tag_value> *f1_p;\n        typedef typename internal::function_body<T2, tag_value> *f2_p;\n        typedef typename internal::function_body<T3, tag_value> *f3_p;\n        typedef typename internal::function_body<T4, tag_value> *f4_p;\n        typedef typename tbb::flow::tuple< f0_p, f1_p, f2_p, f3_p, f4_p > func_initializer_type;\n    public:\n        template<typename B0, typename B1, typename B2, typename B3, typename B4>\n        unfolded_join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) : base_type(g,\n                func_initializer_type(\n                    new internal::function_body_leaf<T0, tag_value, B0>(b0),\n                    new internal::function_body_leaf<T1, tag_value, B1>(b1),\n                    new internal::function_body_leaf<T2, tag_value, B2>(b2),\n                    new internal::function_body_leaf<T3, tag_value, B3>(b3),\n                    new internal::function_body_leaf<T4, tag_value, B4>(b4)\n                    ) ) {}\n        unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}\n    };\n\n#if __TBB_VARIADIC_MAX >= 6\n    template<typename OutputTuple>\n    class unfolded_join_node<6,tag_matching_port,OutputTuple,tag_matching> : public\n            join_base<6,tag_matching_port,OutputTuple,tag_matching>::type {\n        typedef typename tbb::flow::tuple_element<0, OutputTuple>::type T0;\n        typedef typename tbb::flow::tuple_element<1, OutputTuple>::type T1;\n        typedef typename tbb::flow::tuple_element<2, OutputTuple>::type T2;\n        typedef typename tbb::flow::tuple_element<3, OutputTuple>::type T3;\n        typedef typename tbb::flow::tuple_element<4, OutputTuple>::type T4;\n        typedef typename tbb::flow::tuple_element<5, OutputTuple>::type T5;\n    public:\n        typedef typename wrap_tuple_elements<6, tag_matching_port, OutputTuple>::type input_ports_type;\n        typedef OutputTuple output_type;\n    private:\n        typedef join_node_base<tag_matching, input_ports_type, output_type > base_type;\n        typedef typename internal::function_body<T0, tag_value> *f0_p;\n        typedef typename internal::function_body<T1, tag_value> *f1_p;\n        typedef typename internal::function_body<T2, tag_value> *f2_p;\n        typedef typename internal::function_body<T3, tag_value> *f3_p;\n        typedef typename internal::function_body<T4, tag_value> *f4_p;\n        typedef typename internal::function_body<T5, tag_value> *f5_p;\n        typedef typename tbb::flow::tuple< f0_p, f1_p, f2_p, f3_p, f4_p, f5_p > func_initializer_type;\n    public:\n        template<typename B0, typename B1, typename B2, typename B3, typename B4, typename B5>\n        unfolded_join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4, B5 b5) : base_type(g,\n                func_initializer_type(\n                    new internal::function_body_leaf<T0, tag_value, B0>(b0),\n                    new internal::function_body_leaf<T1, tag_value, B1>(b1),\n                    new internal::function_body_leaf<T2, tag_value, B2>(b2),\n                    new internal::function_body_leaf<T3, tag_value, B3>(b3),\n                    new internal::function_body_leaf<T4, tag_value, B4>(b4),\n                    new internal::function_body_leaf<T5, tag_value, B5>(b5)\n                    ) ) {}\n        unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}\n    };\n#endif\n\n#if __TBB_VARIADIC_MAX >= 7\n    template<typename OutputTuple>\n    class unfolded_join_node<7,tag_matching_port,OutputTuple,tag_matching> : public\n            join_base<7,tag_matching_port,OutputTuple,tag_matching>::type {\n        typedef typename tbb::flow::tuple_element<0, OutputTuple>::type T0;\n        typedef typename tbb::flow::tuple_element<1, OutputTuple>::type T1;\n        typedef typename tbb::flow::tuple_element<2, OutputTuple>::type T2;\n        typedef typename tbb::flow::tuple_element<3, OutputTuple>::type T3;\n        typedef typename tbb::flow::tuple_element<4, OutputTuple>::type T4;\n        typedef typename tbb::flow::tuple_element<5, OutputTuple>::type T5;\n        typedef typename tbb::flow::tuple_element<6, OutputTuple>::type T6;\n    public:\n        typedef typename wrap_tuple_elements<7, tag_matching_port, OutputTuple>::type input_ports_type;\n        typedef OutputTuple output_type;\n    private:\n        typedef join_node_base<tag_matching, input_ports_type, output_type > base_type;\n        typedef typename internal::function_body<T0, tag_value> *f0_p;\n        typedef typename internal::function_body<T1, tag_value> *f1_p;\n        typedef typename internal::function_body<T2, tag_value> *f2_p;\n        typedef typename internal::function_body<T3, tag_value> *f3_p;\n        typedef typename internal::function_body<T4, tag_value> *f4_p;\n        typedef typename internal::function_body<T5, tag_value> *f5_p;\n        typedef typename internal::function_body<T6, tag_value> *f6_p;\n        typedef typename tbb::flow::tuple< f0_p, f1_p, f2_p, f3_p, f4_p, f5_p, f6_p > func_initializer_type;\n    public:\n        template<typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6>\n        unfolded_join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4, B5 b5, B6 b6) : base_type(g,\n                func_initializer_type(\n                    new internal::function_body_leaf<T0, tag_value, B0>(b0),\n                    new internal::function_body_leaf<T1, tag_value, B1>(b1),\n                    new internal::function_body_leaf<T2, tag_value, B2>(b2),\n                    new internal::function_body_leaf<T3, tag_value, B3>(b3),\n                    new internal::function_body_leaf<T4, tag_value, B4>(b4),\n                    new internal::function_body_leaf<T5, tag_value, B5>(b5),\n                    new internal::function_body_leaf<T6, tag_value, B6>(b6)\n                    ) ) {}\n        unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}\n    };\n#endif\n\n#if __TBB_VARIADIC_MAX >= 8\n    template<typename OutputTuple>\n    class unfolded_join_node<8,tag_matching_port,OutputTuple,tag_matching> : public\n            join_base<8,tag_matching_port,OutputTuple,tag_matching>::type {\n        typedef typename tbb::flow::tuple_element<0, OutputTuple>::type T0;\n        typedef typename tbb::flow::tuple_element<1, OutputTuple>::type T1;\n        typedef typename tbb::flow::tuple_element<2, OutputTuple>::type T2;\n        typedef typename tbb::flow::tuple_element<3, OutputTuple>::type T3;\n        typedef typename tbb::flow::tuple_element<4, OutputTuple>::type T4;\n        typedef typename tbb::flow::tuple_element<5, OutputTuple>::type T5;\n        typedef typename tbb::flow::tuple_element<6, OutputTuple>::type T6;\n        typedef typename tbb::flow::tuple_element<7, OutputTuple>::type T7;\n    public:\n        typedef typename wrap_tuple_elements<8, tag_matching_port, OutputTuple>::type input_ports_type;\n        typedef OutputTuple output_type;\n    private:\n        typedef join_node_base<tag_matching, input_ports_type, output_type > base_type;\n        typedef typename internal::function_body<T0, tag_value> *f0_p;\n        typedef typename internal::function_body<T1, tag_value> *f1_p;\n        typedef typename internal::function_body<T2, tag_value> *f2_p;\n        typedef typename internal::function_body<T3, tag_value> *f3_p;\n        typedef typename internal::function_body<T4, tag_value> *f4_p;\n        typedef typename internal::function_body<T5, tag_value> *f5_p;\n        typedef typename internal::function_body<T6, tag_value> *f6_p;\n        typedef typename internal::function_body<T7, tag_value> *f7_p;\n        typedef typename tbb::flow::tuple< f0_p, f1_p, f2_p, f3_p, f4_p, f5_p, f6_p, f7_p > func_initializer_type;\n    public:\n        template<typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6, typename B7>\n        unfolded_join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4, B5 b5, B6 b6, B7 b7) : base_type(g,\n                func_initializer_type(\n                    new internal::function_body_leaf<T0, tag_value, B0>(b0),\n                    new internal::function_body_leaf<T1, tag_value, B1>(b1),\n                    new internal::function_body_leaf<T2, tag_value, B2>(b2),\n                    new internal::function_body_leaf<T3, tag_value, B3>(b3),\n                    new internal::function_body_leaf<T4, tag_value, B4>(b4),\n                    new internal::function_body_leaf<T5, tag_value, B5>(b5),\n                    new internal::function_body_leaf<T6, tag_value, B6>(b6),\n                    new internal::function_body_leaf<T7, tag_value, B7>(b7)\n                    ) ) {}\n        unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}\n    };\n#endif\n\n#if __TBB_VARIADIC_MAX >= 9\n    template<typename OutputTuple>\n    class unfolded_join_node<9,tag_matching_port,OutputTuple,tag_matching> : public\n            join_base<9,tag_matching_port,OutputTuple,tag_matching>::type {\n        typedef typename tbb::flow::tuple_element<0, OutputTuple>::type T0;\n        typedef typename tbb::flow::tuple_element<1, OutputTuple>::type T1;\n        typedef typename tbb::flow::tuple_element<2, OutputTuple>::type T2;\n        typedef typename tbb::flow::tuple_element<3, OutputTuple>::type T3;\n        typedef typename tbb::flow::tuple_element<4, OutputTuple>::type T4;\n        typedef typename tbb::flow::tuple_element<5, OutputTuple>::type T5;\n        typedef typename tbb::flow::tuple_element<6, OutputTuple>::type T6;\n        typedef typename tbb::flow::tuple_element<7, OutputTuple>::type T7;\n        typedef typename tbb::flow::tuple_element<8, OutputTuple>::type T8;\n    public:\n        typedef typename wrap_tuple_elements<9, tag_matching_port, OutputTuple>::type input_ports_type;\n        typedef OutputTuple output_type;\n    private:\n        typedef join_node_base<tag_matching, input_ports_type, output_type > base_type;\n        typedef typename internal::function_body<T0, tag_value> *f0_p;\n        typedef typename internal::function_body<T1, tag_value> *f1_p;\n        typedef typename internal::function_body<T2, tag_value> *f2_p;\n        typedef typename internal::function_body<T3, tag_value> *f3_p;\n        typedef typename internal::function_body<T4, tag_value> *f4_p;\n        typedef typename internal::function_body<T5, tag_value> *f5_p;\n        typedef typename internal::function_body<T6, tag_value> *f6_p;\n        typedef typename internal::function_body<T7, tag_value> *f7_p;\n        typedef typename internal::function_body<T8, tag_value> *f8_p;\n        typedef typename tbb::flow::tuple< f0_p, f1_p, f2_p, f3_p, f4_p, f5_p, f6_p, f7_p, f8_p > func_initializer_type;\n    public:\n        template<typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6, typename B7, typename B8>\n        unfolded_join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4, B5 b5, B6 b6, B7 b7, B8 b8) : base_type(g,\n                func_initializer_type(\n                    new internal::function_body_leaf<T0, tag_value, B0>(b0),\n                    new internal::function_body_leaf<T1, tag_value, B1>(b1),\n                    new internal::function_body_leaf<T2, tag_value, B2>(b2),\n                    new internal::function_body_leaf<T3, tag_value, B3>(b3),\n                    new internal::function_body_leaf<T4, tag_value, B4>(b4),\n                    new internal::function_body_leaf<T5, tag_value, B5>(b5),\n                    new internal::function_body_leaf<T6, tag_value, B6>(b6),\n                    new internal::function_body_leaf<T7, tag_value, B7>(b7),\n                    new internal::function_body_leaf<T8, tag_value, B8>(b8)\n                    ) ) {}\n        unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}\n    };\n#endif\n\n#if __TBB_VARIADIC_MAX >= 10\n    template<typename OutputTuple>\n    class unfolded_join_node<10,tag_matching_port,OutputTuple,tag_matching> : public\n            join_base<10,tag_matching_port,OutputTuple,tag_matching>::type {\n        typedef typename tbb::flow::tuple_element<0, OutputTuple>::type T0;\n        typedef typename tbb::flow::tuple_element<1, OutputTuple>::type T1;\n        typedef typename tbb::flow::tuple_element<2, OutputTuple>::type T2;\n        typedef typename tbb::flow::tuple_element<3, OutputTuple>::type T3;\n        typedef typename tbb::flow::tuple_element<4, OutputTuple>::type T4;\n        typedef typename tbb::flow::tuple_element<5, OutputTuple>::type T5;\n        typedef typename tbb::flow::tuple_element<6, OutputTuple>::type T6;\n        typedef typename tbb::flow::tuple_element<7, OutputTuple>::type T7;\n        typedef typename tbb::flow::tuple_element<8, OutputTuple>::type T8;\n        typedef typename tbb::flow::tuple_element<9, OutputTuple>::type T9;\n    public:\n        typedef typename wrap_tuple_elements<10, tag_matching_port, OutputTuple>::type input_ports_type;\n        typedef OutputTuple output_type;\n    private:\n        typedef join_node_base<tag_matching, input_ports_type, output_type > base_type;\n        typedef typename internal::function_body<T0, tag_value> *f0_p;\n        typedef typename internal::function_body<T1, tag_value> *f1_p;\n        typedef typename internal::function_body<T2, tag_value> *f2_p;\n        typedef typename internal::function_body<T3, tag_value> *f3_p;\n        typedef typename internal::function_body<T4, tag_value> *f4_p;\n        typedef typename internal::function_body<T5, tag_value> *f5_p;\n        typedef typename internal::function_body<T6, tag_value> *f6_p;\n        typedef typename internal::function_body<T7, tag_value> *f7_p;\n        typedef typename internal::function_body<T8, tag_value> *f8_p;\n        typedef typename internal::function_body<T9, tag_value> *f9_p;\n        typedef typename tbb::flow::tuple< f0_p, f1_p, f2_p, f3_p, f4_p, f5_p, f6_p, f7_p, f8_p, f9_p > func_initializer_type;\n    public:\n        template<typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6, typename B7, typename B8, typename B9>\n        unfolded_join_node(graph &g, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4, B5 b5, B6 b6, B7 b7, B8 b8, B9 b9) : base_type(g,\n                func_initializer_type(\n                    new internal::function_body_leaf<T0, tag_value, B0>(b0),\n                    new internal::function_body_leaf<T1, tag_value, B1>(b1),\n                    new internal::function_body_leaf<T2, tag_value, B2>(b2),\n                    new internal::function_body_leaf<T3, tag_value, B3>(b3),\n                    new internal::function_body_leaf<T4, tag_value, B4>(b4),\n                    new internal::function_body_leaf<T5, tag_value, B5>(b5),\n                    new internal::function_body_leaf<T6, tag_value, B6>(b6),\n                    new internal::function_body_leaf<T7, tag_value, B7>(b7),\n                    new internal::function_body_leaf<T8, tag_value, B8>(b8),\n                    new internal::function_body_leaf<T9, tag_value, B9>(b9)\n                    ) ) {}\n        unfolded_join_node(const unfolded_join_node &other) : base_type(other) {}\n    };\n#endif\n\n    //! templated function to refer to input ports of the join node\n    template<size_t N, typename JNT>\n    typename tbb::flow::tuple_element<N, typename JNT::input_ports_type>::type &input_port(JNT &jn) {\n        return tbb::flow::get<N>(jn.input_ports());\n    }\n\n}\n#endif // __TBB__flow_graph_join_impl_H\n\n"
  },
  {
    "path": "benchmarks/tbb/internal/_flow_graph_node_impl.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB__flow_graph_node_impl_H\n#define __TBB__flow_graph_node_impl_H\n\n#ifndef __TBB_flow_graph_H\n#error Do not #include this internal file directly; use public TBB headers instead.\n#endif\n\n#include \"_flow_graph_item_buffer_impl.h\"\n\n//! @cond INTERNAL\nnamespace internal {\n\n    using tbb::internal::aggregated_operation;\n    using tbb::internal::aggregating_functor;\n    using tbb::internal::aggregator;\n\n     template< typename T, typename A >\n     class function_input_queue : public item_buffer<T,A> {\n     public:\n         bool pop( T& t ) {\n             return this->pop_front( t );\n         }\n\n         bool push( T& t ) {\n             return this->push_back( t );\n         }\n     };\n\n    //! Input and scheduling for a function node that takes a type Input as input\n    //  The only up-ref is apply_body_impl, which should implement the function \n    //  call and any handling of the result.\n    template< typename Input, typename A, typename ImplType >\n    class function_input_base : public receiver<Input>, tbb::internal::no_assign {\n        enum op_stat {WAIT=0, SUCCEEDED, FAILED};\n        enum op_type {reg_pred, rem_pred, app_body, try_fwd, tryput_bypass, app_body_bypass\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n            , add_blt_pred, del_blt_pred,\n            blt_pred_cnt, blt_pred_cpy   // create vector copies of preds and succs\n#endif \n        };\n        typedef function_input_base<Input, A, ImplType> my_class;\n        \n    public:\n\n        //! The input type of this receiver\n        typedef Input input_type;\n        typedef sender<Input> predecessor_type;\n\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        typedef std::vector<predecessor_type *> predecessor_vector_type;\n#endif\n\n        //! Constructor for function_input_base\n        function_input_base( graph &g, size_t max_concurrency, function_input_queue<input_type,A> *q = NULL )\n            : my_graph(g), my_max_concurrency(max_concurrency), my_concurrency(0),\n              my_queue(q), forwarder_busy(false) {\n            my_predecessors.set_owner(this);\n            my_aggregator.initialize_handler(my_handler(this));\n        }\n        \n        //! Copy constructor\n        function_input_base( const function_input_base& src, function_input_queue<input_type,A> *q = NULL ) :\n            receiver<Input>(), tbb::internal::no_assign(),\n            my_graph(src.my_graph), my_max_concurrency(src.my_max_concurrency),\n            my_concurrency(0), my_queue(q), forwarder_busy(false)\n        {\n            my_predecessors.set_owner(this);\n            my_aggregator.initialize_handler(my_handler(this));\n        }\n\n        //! Destructor\n        virtual ~function_input_base() { \n            if ( my_queue ) delete my_queue;\n        }\n        \n        //! Put to the node, returning a task if available\n        virtual task * try_put_task( const input_type &t ) {\n           if ( my_max_concurrency == 0 ) {\n               return create_body_task( t );\n           } else {\n               my_operation op_data(t, tryput_bypass);\n               my_aggregator.execute(&op_data);\n               if(op_data.status == SUCCEEDED ) {\n                   return op_data.bypass_t;\n               }\n               return NULL;\n           }\n        }\n\n        //! Adds src to the list of cached predecessors.\n        /* override */ bool register_predecessor( predecessor_type &src ) {\n            my_operation op_data(reg_pred);\n            op_data.r = &src;\n            my_aggregator.execute(&op_data);\n            return true;\n        }\n        \n        //! Removes src from the list of cached predecessors.\n        /* override */ bool remove_predecessor( predecessor_type &src ) {\n            my_operation op_data(rem_pred);\n            op_data.r = &src;\n            my_aggregator.execute(&op_data);\n            return true;\n        }\n\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        //! Adds to list of predecessors added by make_edge\n        /*override*/ void internal_add_built_predecessor( predecessor_type &src) {\n            my_operation op_data(add_blt_pred);\n            op_data.r = &src;\n            my_aggregator.execute(&op_data);\n        }\n\n        //! removes from to list of predecessors (used by remove_edge)\n        /*override*/ void internal_delete_built_predecessor( predecessor_type &src) {\n            my_operation op_data(del_blt_pred);\n            op_data.r = &src;\n            my_aggregator.execute(&op_data);\n        }\n\n        /*override*/ size_t predecessor_count() {\n            my_operation op_data(blt_pred_cnt);\n            my_aggregator.execute(&op_data);\n            return op_data.cnt_val;\n        }\n\n        /*override*/ void copy_predecessors(predecessor_vector_type &v) {\n            my_operation op_data(blt_pred_cpy);\n            op_data.predv = &v;\n            my_aggregator.execute(&op_data);\n        }\n#endif  /* TBB_PREVIEW_FLOW_GRAPH_FEATURES */\n\n    protected:\n\n        void reset_function_input_base( __TBB_PFG_RESET_ARG(reset_flags f)) {\n            my_concurrency = 0;\n            if(my_queue) {\n                my_queue->reset();\n            }\n            reset_receiver(__TBB_PFG_RESET_ARG(f));\n            forwarder_busy = false;\n        }\n\n        graph& my_graph;\n        const size_t my_max_concurrency;\n        size_t my_concurrency;\n        function_input_queue<input_type, A> *my_queue;\n        predecessor_cache<input_type, null_mutex > my_predecessors;\n        \n        /*override*/void reset_receiver( __TBB_PFG_RESET_ARG(reset_flags f)) {\n            my_predecessors.reset(__TBB_PFG_RESET_ARG(f));\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n            __TBB_ASSERT(!(f & rf_extract) || my_predecessors.empty(), \"function_input_base reset failed\");\n#endif\n        }\n\n    private:\n\n        friend class apply_body_task_bypass< my_class, input_type >;\n        friend class forward_task_bypass< my_class >;\n        \n        class my_operation : public aggregated_operation< my_operation > {\n        public:\n            char type;\n            union {\n                input_type *elem;\n                predecessor_type *r;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n                size_t cnt_val;\n                predecessor_vector_type *predv;\n#endif  /* TBB_PREVIEW_FLOW_GRAPH_FEATURES */\n            };\n            tbb::task *bypass_t;\n            my_operation(const input_type& e, op_type t) :\n                type(char(t)), elem(const_cast<input_type*>(&e)) {}\n            my_operation(op_type t) : type(char(t)), r(NULL) {}\n        };\n        \n        bool forwarder_busy;\n        typedef internal::aggregating_functor<my_class, my_operation> my_handler;\n        friend class internal::aggregating_functor<my_class, my_operation>;\n        aggregator< my_handler, my_operation > my_aggregator;\n        \n        void handle_operations(my_operation *op_list) {\n            my_operation *tmp;\n            while (op_list) {\n                tmp = op_list;\n                op_list = op_list->next;\n                switch (tmp->type) {\n                case reg_pred:\n                    my_predecessors.add(*(tmp->r));\n                    __TBB_store_with_release(tmp->status, SUCCEEDED);\n                    if (!forwarder_busy) {\n                        forwarder_busy = true;\n                        spawn_forward_task();\n                    }\n                    break;\n                case rem_pred:\n                    my_predecessors.remove(*(tmp->r));\n                    __TBB_store_with_release(tmp->status, SUCCEEDED);\n                    break;\n                case app_body:\n                    __TBB_ASSERT(my_max_concurrency != 0, NULL);\n                    --my_concurrency;\n                    __TBB_store_with_release(tmp->status, SUCCEEDED);\n                    if (my_concurrency<my_max_concurrency) {\n                        input_type i;\n                        bool item_was_retrieved = false;\n                        if ( my_queue )\n                            item_was_retrieved = my_queue->pop(i);\n                        else\n                            item_was_retrieved = my_predecessors.get_item(i);\n                        if (item_was_retrieved) {\n                            ++my_concurrency;\n                            spawn_body_task(i);\n                        }\n                    }\n                    break;\n                case app_body_bypass: {\n                        task * new_task = NULL;\n                        __TBB_ASSERT(my_max_concurrency != 0, NULL);\n                        --my_concurrency;\n                        if (my_concurrency<my_max_concurrency) {\n                            input_type i;\n                            bool item_was_retrieved = false;\n                            if ( my_queue )\n                                item_was_retrieved = my_queue->pop(i);\n                            else \n                                item_was_retrieved = my_predecessors.get_item(i);\n                            if (item_was_retrieved) {\n                                ++my_concurrency;\n                                new_task = create_body_task(i);\n                            }\n                        }\n                        tmp->bypass_t = new_task;\n                        __TBB_store_with_release(tmp->status, SUCCEEDED);\n                    }\n                    break;\n                case tryput_bypass: internal_try_put_task(tmp);  break;\n                case try_fwd: internal_forward(tmp);  break;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n                case add_blt_pred: {\n                         my_predecessors.internal_add_built_predecessor(*(tmp->r));\n                        __TBB_store_with_release(tmp->status, SUCCEEDED);\n                    }\n                    break;\n                case del_blt_pred:\n                    my_predecessors.internal_delete_built_predecessor(*(tmp->r));\n                    __TBB_store_with_release(tmp->status, SUCCEEDED);\n                    break;\n                case blt_pred_cnt:\n                    tmp->cnt_val = my_predecessors.predecessor_count();\n                    __TBB_store_with_release(tmp->status, SUCCEEDED);\n                    break;\n                case blt_pred_cpy:\n                    my_predecessors.copy_predecessors( *(tmp->predv) );\n                    __TBB_store_with_release(tmp->status, SUCCEEDED);\n                    break;\n#endif  /* TBB_PREVIEW_FLOW_GRAPH_FEATURES */\n                }\n            }\n        }\n        \n        //! Put to the node, but return the task instead of enqueueing it\n        void internal_try_put_task(my_operation *op) {\n            __TBB_ASSERT(my_max_concurrency != 0, NULL);\n            if (my_concurrency < my_max_concurrency) {\n               ++my_concurrency;\n               task * new_task = create_body_task(*(op->elem));\n               op->bypass_t = new_task;\n               __TBB_store_with_release(op->status, SUCCEEDED);\n           } else if ( my_queue && my_queue->push(*(op->elem)) ) { \n               op->bypass_t = SUCCESSFULLY_ENQUEUED;\n               __TBB_store_with_release(op->status, SUCCEEDED);\n           } else {\n               op->bypass_t = NULL;\n               __TBB_store_with_release(op->status, FAILED);\n           }\n        }\n        \n        //! Tries to spawn bodies if available and if concurrency allows\n        void internal_forward(my_operation *op) {\n            op->bypass_t = NULL;\n            if (my_concurrency<my_max_concurrency || !my_max_concurrency) {\n                input_type i;\n                bool item_was_retrieved = false;\n                if ( my_queue )\n                    item_was_retrieved = my_queue->pop(i);\n                else\n                    item_was_retrieved = my_predecessors.get_item(i);\n                if (item_was_retrieved) {\n                    ++my_concurrency;\n                    op->bypass_t = create_body_task(i);\n                    __TBB_store_with_release(op->status, SUCCEEDED);\n                    return;\n                }\n            }\n            __TBB_store_with_release(op->status, FAILED);\n            forwarder_busy = false;\n        }\n        \n        //! Applies the body to the provided input\n        //  then decides if more work is available \n        void apply_body( input_type &i ) {\n            task *new_task = apply_body_bypass(i);\n            if(!new_task) return;\n            if(new_task == SUCCESSFULLY_ENQUEUED) return;\n            FLOW_SPAWN(*new_task);\n            return;\n        }\n        \n        //! Applies the body to the provided input\n        //  then decides if more work is available \n        task * apply_body_bypass( input_type &i ) {\n            task * new_task = static_cast<ImplType *>(this)->apply_body_impl_bypass(i);\n            if ( my_max_concurrency != 0 ) {\n                my_operation op_data(app_body_bypass);  // tries to pop an item or get_item, enqueues another apply_body\n                my_aggregator.execute(&op_data);\n                tbb::task *ttask = op_data.bypass_t;\n                new_task = combine_tasks(new_task, ttask);\n            }\n            return new_task;\n        }\n        \n        //! allocates a task to call apply_body( input )\n        inline task * create_body_task( const input_type &input ) {\n            \n            task* tp = my_graph.root_task();\n            return (tp) ?\n                new(task::allocate_additional_child_of(*tp))\n                    apply_body_task_bypass < my_class, input_type >(*this, input) :\n                NULL;\n        }\n\n       //! Spawns a task that calls apply_body( input )\n       inline void spawn_body_task( const input_type &input ) {\n           task* tp = create_body_task(input);\n           // tp == NULL => g.reset(), which shouldn't occur in concurrent context\n           if(tp) {\n               FLOW_SPAWN(*tp);\n           }\n       }\n        \n       //! This is executed by an enqueued task, the \"forwarder\"\n       task *forward_task() {\n           my_operation op_data(try_fwd);\n           task *rval = NULL;\n           do {\n               op_data.status = WAIT;\n               my_aggregator.execute(&op_data);\n               if(op_data.status == SUCCEEDED) {\n                   tbb::task *ttask = op_data.bypass_t;\n                   rval = combine_tasks(rval, ttask);\n               }\n           } while (op_data.status == SUCCEEDED);\n           return rval;\n       }\n        \n       inline task *create_forward_task() {\n           task* tp = my_graph.root_task();\n           return (tp) ?\n               new(task::allocate_additional_child_of(*tp)) forward_task_bypass< my_class >(*this) :\n               NULL;\n       }\n\n       //! Spawns a task that calls forward()\n       inline void spawn_forward_task() {\n           task* tp = create_forward_task();\n           if(tp) {\n               FLOW_SPAWN(*tp);\n           }\n       }\n    };  // function_input_base\n\n    //! Implements methods for a function node that takes a type Input as input and sends\n    //  a type Output to its successors.\n    template< typename Input, typename Output, typename A>\n    class function_input : public function_input_base<Input, A, function_input<Input,Output,A> > {\n    public:\n        typedef Input input_type;\n        typedef Output output_type;\n        typedef function_input<Input,Output,A> my_class;\n        typedef function_input_base<Input, A, my_class> base_type;\n        typedef function_input_queue<input_type, A> input_queue_type;\n\n\n        // constructor\n        template<typename Body>\n        function_input( graph &g, size_t max_concurrency, Body& body, function_input_queue<input_type,A> *q = NULL ) :\n            base_type(g, max_concurrency, q),\n            my_body( new internal::function_body_leaf< input_type, output_type, Body>(body) ) {\n        }\n\n        //! Copy constructor\n        function_input( const function_input& src, input_queue_type *q = NULL ) : \n                base_type(src, q),\n                my_body( src.my_body->clone() ) {\n        }\n\n        ~function_input() {\n            delete my_body;\n        }\n\n        template< typename Body >\n        Body copy_function_object() {\n            internal::function_body<input_type, output_type> &body_ref = *this->my_body;\n            return dynamic_cast< internal::function_body_leaf<input_type, output_type, Body> & >(body_ref).get_body(); \n        } \n\n        task * apply_body_impl_bypass( const input_type &i) {\n#if TBB_PREVIEW_FLOW_GRAPH_TRACE\n            // There is an extra copied needed to capture the\n            // body execution without the try_put\n            tbb::internal::fgt_begin_body( my_body );\n            output_type v = (*my_body)(i);\n            tbb::internal::fgt_end_body( my_body );\n            task * new_task = successors().try_put_task( v );\n#else       \n            task * new_task = successors().try_put_task( (*my_body)(i) );\n#endif\n            return new_task;\n        }\n\n    protected:\n\n        void reset_function_input(__TBB_PFG_RESET_ARG(reset_flags f)) {\n            base_type::reset_function_input_base(__TBB_PFG_RESET_ARG(f));\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n            if(f & rf_reset_bodies) my_body->reset_body();\n#endif\n        }\n\n        function_body<input_type, output_type> *my_body;\n        virtual broadcast_cache<output_type > &successors() = 0;\n\n    };  // function_input\n\n\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n    // helper templates to reset the successor edges of the output ports of an multifunction_node\n    template<int N>\n    struct reset_element {\n        template<typename P>\n        static void reset_this(P &p, reset_flags f) {\n            (void)tbb::flow::get<N-1>(p).successors().reset(f);\n            reset_element<N-1>::reset_this(p, f);\n        }\n        template<typename P>\n        static bool this_empty(P &p) {\n            if(tbb::flow::get<N-1>(p).successors().empty()) \n                return reset_element<N-1>::this_empty(p);\n            return false;\n        }\n    };\n\n    template<>\n    struct reset_element<1> {\n        template<typename P>\n        static void reset_this(P &p, reset_flags f) {\n            (void)tbb::flow::get<0>(p).successors().reset(f);\n        }\n        template<typename P>\n        static bool this_empty(P &p) {\n            return tbb::flow::get<0>(p).successors().empty();\n        }\n    };\n#endif\n\n    //! Implements methods for a function node that takes a type Input as input\n    //  and has a tuple of output ports specified.  \n    template< typename Input, typename OutputPortSet, typename A>\n    class multifunction_input : public function_input_base<Input, A, multifunction_input<Input,OutputPortSet,A> > {\n    public:\n        static const int N = tbb::flow::tuple_size<OutputPortSet>::value;\n        typedef Input input_type;\n        typedef OutputPortSet output_ports_type;\n        typedef multifunction_input<Input,OutputPortSet,A> my_class;\n        typedef function_input_base<Input, A, my_class> base_type;\n        typedef function_input_queue<input_type, A> input_queue_type;\n\n\n        // constructor\n        template<typename Body>\n        multifunction_input( \n                graph &g, \n                size_t max_concurrency, \n                Body& body,\n                function_input_queue<input_type,A> *q = NULL ) :\n            base_type(g, max_concurrency, q),\n            my_body( new internal::multifunction_body_leaf<input_type, output_ports_type, Body>(body) ) {\n        }\n\n        //! Copy constructor\n        multifunction_input( const multifunction_input& src, input_queue_type *q = NULL ) : \n                base_type(src, q),\n                my_body( src.my_body->clone() ) {\n        }\n\n        ~multifunction_input() {\n            delete my_body;\n        }\n\n        template< typename Body >\n        Body copy_function_object() {\n            internal::multifunction_body<input_type, output_ports_type> &body_ref = *this->my_body;\n            return dynamic_cast< internal::multifunction_body_leaf<input_type, output_ports_type, Body> & >(body_ref).get_body(); \n        } \n\n        // for multifunction nodes we do not have a single successor as such.  So we just tell\n        // the task we were successful.\n        task * apply_body_impl_bypass( const input_type &i) {\n            tbb::internal::fgt_begin_body( my_body );\n            (*my_body)(i, my_output_ports);\n            tbb::internal::fgt_end_body( my_body );\n            task * new_task = SUCCESSFULLY_ENQUEUED;\n            return new_task;\n        }\n\n        output_ports_type &output_ports(){ return my_output_ports; }\n\n    protected:\n\n        /*override*/void reset(__TBB_PFG_RESET_ARG(reset_flags f)) { \n            base_type::reset_function_input_base(__TBB_PFG_RESET_ARG(f));\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n            reset_element<N>::reset_this(my_output_ports, f);\n            if(f & rf_reset_bodies) my_body->reset_body();\n            __TBB_ASSERT(!(f & rf_extract) || reset_element<N>::this_empty(my_output_ports), \"multifunction_node reset failed\");\n#endif\n        }\n\n        multifunction_body<input_type, output_ports_type> *my_body;\n        output_ports_type my_output_ports;\n\n    };  // multifunction_input\n\n    // template to refer to an output port of a multifunction_node\n    template<size_t N, typename MOP>\n    typename tbb::flow::tuple_element<N, typename MOP::output_ports_type>::type &output_port(MOP &op) {\n        return tbb::flow::get<N>(op.output_ports()); \n    }\n\n// helper structs for split_node\n    template<int N>\n    struct emit_element {\n        template<typename T, typename P>\n        static void emit_this(const T &t, P &p) {\n            (void)tbb::flow::get<N-1>(p).try_put(tbb::flow::get<N-1>(t));\n            emit_element<N-1>::emit_this(t,p);\n        }\n    };\n\n    template<>\n    struct emit_element<1> {\n        template<typename T, typename P>\n        static void emit_this(const T &t, P &p) {\n            (void)tbb::flow::get<0>(p).try_put(tbb::flow::get<0>(t));\n        }\n    };\n\n    //! Implements methods for an executable node that takes continue_msg as input\n    template< typename Output >\n    class continue_input : public continue_receiver {\n    public:\n        \n        //! The input type of this receiver\n        typedef continue_msg input_type;\n            \n        //! The output type of this receiver\n        typedef Output output_type;\n        \n        template< typename Body >\n        continue_input( graph &g, Body& body )\n            : my_graph_ptr(&g), \n             my_body( new internal::function_body_leaf< input_type, output_type, Body>(body) ) { }\n        \n        template< typename Body >\n        continue_input( graph &g, int number_of_predecessors, Body& body )\n            : continue_receiver( number_of_predecessors ), my_graph_ptr(&g), \n             my_body( new internal::function_body_leaf< input_type, output_type, Body>(body) ) { }\n\n        continue_input( const continue_input& src ) : continue_receiver(src), \n            my_graph_ptr(src.my_graph_ptr), my_body( src.my_body->clone() ) {}\n\n        ~continue_input() {\n            delete my_body;\n        }\n\n        template< typename Body >\n        Body copy_function_object() {\n            internal::function_body<input_type, output_type> &body_ref = *my_body;\n            return dynamic_cast< internal::function_body_leaf<input_type, output_type, Body> & >(body_ref).get_body(); \n        } \n\n        /*override*/void reset_receiver( __TBB_PFG_RESET_ARG(reset_flags f)) {\n            continue_receiver::reset_receiver(__TBB_PFG_RESET_ARG(f));\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n            if(f & rf_reset_bodies) my_body->reset_body();\n#endif\n        }\n\n    protected:\n        \n        graph* my_graph_ptr;\n        function_body<input_type, output_type> *my_body;\n        \n        virtual broadcast_cache<output_type > &successors() = 0; \n        \n        friend class apply_body_task_bypass< continue_input< Output >, continue_msg >;\n        \n        //! Applies the body to the provided input\n        /* override */ task *apply_body_bypass( input_type ) {\n#if TBB_PREVIEW_FLOW_GRAPH_TRACE\n            // There is an extra copied needed to capture the\n            // body execution without the try_put\n            tbb::internal::fgt_begin_body( my_body );\n            output_type v = (*my_body)( continue_msg() );\n            tbb::internal::fgt_end_body( my_body );\n            return successors().try_put_task( v );\n#else   \n            return successors().try_put_task( (*my_body)( continue_msg() ) );\n#endif\n        }\n        \n        //! Spawns a task that applies the body\n        /* override */ task *execute( ) {\n            task* tp = my_graph_ptr->root_task();\n            return (tp) ?\n                new ( task::allocate_additional_child_of( *tp ) ) \n                    apply_body_task_bypass< continue_input< Output >, continue_msg >( *this, continue_msg() ) :\n                NULL;\n        }\n\n    };  // continue_input\n        \n    //! Implements methods for both executable and function nodes that puts Output to its successors\n    template< typename Output >\n    class function_output : public sender<Output> {\n    public:\n        \n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        template<int N> friend struct reset_element;\n#endif\n        typedef Output output_type;\n        typedef receiver<output_type> successor_type;\n        typedef broadcast_cache<output_type> broadcast_cache_type;\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        typedef std::vector<successor_type *> successor_vector_type;\n#endif\n        \n        function_output() { my_successors.set_owner(this); }\n        function_output(const function_output & /*other*/) : sender<output_type>() {\n            my_successors.set_owner(this);\n        }\n        \n        //! Adds a new successor to this node\n        /* override */ bool register_successor( receiver<output_type> &r ) {\n            successors().register_successor( r );\n            return true;\n        }\n        \n        //! Removes a successor from this node\n        /* override */ bool remove_successor( receiver<output_type> &r ) {\n            successors().remove_successor( r );\n            return true;\n        }\n\n#if TBB_PREVIEW_FLOW_GRAPH_FEATURES\n        /*override*/ void internal_add_built_successor( receiver<output_type> &r) {\n            successors().internal_add_built_successor( r );\n        }\n\n        /*override*/ void internal_delete_built_successor( receiver<output_type> &r) {\n            successors().internal_delete_built_successor( r );\n        }\n\n        /*override*/ size_t successor_count() {\n            return successors().successor_count();\n        }\n\n        /*override*/ void  copy_successors( successor_vector_type &v) {\n            successors().copy_successors(v);\n        }\n#endif  /* TBB_PREVIEW_FLOW_GRAPH_FEATURES */\n\n        // for multifunction_node.  The function_body that implements\n        // the node will have an input and an output tuple of ports.  To put\n        // an item to a successor, the body should\n        //\n        //    get<I>(output_ports).try_put(output_value);\n        //\n        // return value will be bool returned from successors.try_put.\n        task *try_put_task(const output_type &i) { return my_successors.try_put_task(i); }\n          \n    protected:\n        broadcast_cache_type my_successors;\n        broadcast_cache_type &successors() { return my_successors; } \n        \n    };  // function_output\n\n    template< typename Output >\n    class multifunction_output : public function_output<Output> {\n    public:\n        typedef Output output_type;\n        typedef function_output<output_type> base_type;\n        using base_type::my_successors;\n        \n        multifunction_output() : base_type() {my_successors.set_owner(this);}\n        multifunction_output( const multifunction_output &/*other*/) : base_type() { my_successors.set_owner(this); }\n\n        bool try_put(const output_type &i) {\n            task *res = my_successors.try_put_task(i);\n            if(!res) return false;\n            if(res != SUCCESSFULLY_ENQUEUED) FLOW_SPAWN(*res);\n            return true;\n        }\n    };  // multifunction_output\n\n}  // internal\n\n#endif // __TBB__flow_graph_node_impl_H\n"
  },
  {
    "path": "benchmarks/tbb/internal/_flow_graph_tagged_buffer_impl.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n// tagged buffer that can expand, and can support as many deletions as additions\n// list-based, with elements of list held in array (for destruction management),\n// multiplicative hashing (like ets).  No synchronization built-in.\n//\n\n#ifndef __TBB__flow_graph_tagged_buffer_impl_H\n#define __TBB__flow_graph_tagged_buffer_impl_H\n\n#ifndef __TBB_flow_graph_H\n#error Do not #include this internal file directly; use public TBB headers instead.\n#endif\n\n// included in namespace tbb::flow::interface7::internal\n\ntemplate<typename T, typename U, size_t NoTagMark>\nstruct otherData {\n    T t;\n    U next;\n    otherData() : t(NoTagMark), next(NULL) {}\n};\n\ntemplate<typename TagType, typename ValueType, size_t NoTagMark>\nstruct buffer_element_type {\n    // the second parameter below is void * because we can't forward-declare the type\n    // itself, so we just reinterpret_cast below.\n    typedef typename aligned_pair<ValueType, otherData<TagType, void *, NoTagMark> >::type type;\n};\n\ntemplate\n    <\n     typename TagType, \n     typename ValueType, \n     size_t   NoTagMark = 0,\n     typename Allocator=tbb::cache_aligned_allocator< typename buffer_element_type<TagType, ValueType, NoTagMark>::type >\n    >\nclass tagged_buffer {\npublic:\n    static const size_t INITIAL_SIZE = 8;  // initial size of the hash pointer table\n    static const TagType NO_TAG = TagType(NoTagMark);\n    typedef ValueType value_type;\n    typedef typename buffer_element_type<TagType, ValueType, NO_TAG>::type element_type;\n    typedef value_type *pointer_type;\n    typedef element_type *list_array_type;  // array we manage manually\n    typedef list_array_type *pointer_array_type;\n    typedef typename Allocator::template rebind<list_array_type>::other pointer_array_allocator_type;\n    typedef typename Allocator::template rebind<element_type>::other elements_array_allocator;\nprivate:\n    size_t my_size;\n    size_t nelements;\n    pointer_array_type pointer_array;    // pointer_array[my_size]\n    list_array_type elements_array;      // elements_array[my_size / 2]\n    element_type* free_list;\n\n    size_t mask() { return my_size - 1; }\n\n    static size_t hash(TagType t) {\n        return uintptr_t(t)*tbb::internal::select_size_t_constant<0x9E3779B9,0x9E3779B97F4A7C15ULL>::value;\n    }\n\n    void set_up_free_list( element_type **p_free_list, list_array_type la, size_t sz) {\n        for(size_t i=0; i < sz - 1; ++i ) {  // construct free list\n            la[i].second.next = &(la[i+1]);\n            la[i].second.t = NO_TAG;\n        }\n        la[sz-1].second.next = NULL;\n        *p_free_list = &(la[0]);\n    }\n\n    // cleanup for exceptions\n    struct DoCleanup {\n        pointer_array_type *my_pa;\n        list_array_type *my_elements;\n        size_t my_size;\n\n        DoCleanup(pointer_array_type &pa, list_array_type &my_els, size_t sz) :\n            my_pa(&pa), my_elements(&my_els), my_size(sz) {  }\n        ~DoCleanup() {\n            if(my_pa) {\n                size_t dont_care = 0;\n                internal_free_buffer(*my_pa, *my_elements, my_size, dont_care);\n            }\n        }\n    };\n\n    // exception-safety requires we do all the potentially-throwing operations first\n    void grow_array() {\n        size_t new_size = my_size*2;\n        size_t new_nelements = nelements;  // internal_free_buffer zeroes this\n        list_array_type new_elements_array = NULL;\n        pointer_array_type new_pointer_array = NULL;\n        list_array_type new_free_list = NULL;\n        {\n            DoCleanup my_cleanup(new_pointer_array, new_elements_array, new_size);\n            new_elements_array = elements_array_allocator().allocate(my_size);\n            new_pointer_array = pointer_array_allocator_type().allocate(new_size);\n            for(size_t i=0; i < new_size; ++i) new_pointer_array[i] = NULL;\n            set_up_free_list(&new_free_list, new_elements_array, my_size );\n\n            for(size_t i=0; i < my_size; ++i) {\n                for( element_type* op = pointer_array[i]; op; op = (element_type *)(op->second.next)) {\n                    value_type *ov = reinterpret_cast<value_type *>(&(op->first));\n                    // could have std::move semantics\n                    internal_tagged_insert(new_pointer_array, new_size, new_free_list, op->second.t, *ov);\n                }\n            }\n            my_cleanup.my_pa = NULL;\n            my_cleanup.my_elements = NULL;\n        }\n\n        internal_free_buffer(pointer_array, elements_array, my_size, nelements);\n        free_list = new_free_list;\n        pointer_array = new_pointer_array;\n        elements_array = new_elements_array;\n        my_size = new_size;\n        nelements = new_nelements;\n    }\n\n    // v should have perfect forwarding if std::move implemented.\n    // we use this method to move elements in grow_array, so can't use class fields\n    void internal_tagged_insert( element_type **p_pointer_array, size_t p_sz, list_array_type &p_free_list,\n            const TagType t, const value_type &v) {\n        size_t l_mask = p_sz-1;\n        size_t h = hash(t) & l_mask;\n        __TBB_ASSERT(p_free_list, \"Error: free list not set up.\");\n        element_type* my_elem = p_free_list; p_free_list = (element_type *)(p_free_list->second.next);\n        my_elem->second.t = t;\n        (void) new(&(my_elem->first)) value_type(v);\n        my_elem->second.next = p_pointer_array[h];\n        p_pointer_array[h] = my_elem;\n    }\n\n    void internal_initialize_buffer() {\n        pointer_array = pointer_array_allocator_type().allocate(my_size);\n        for(size_t i = 0; i < my_size; ++i) pointer_array[i] = NULL;\n        elements_array = elements_array_allocator().allocate(my_size / 2);\n        set_up_free_list(&free_list, elements_array, my_size / 2);\n    }\n\n    // made static so an enclosed class can use to properly dispose of the internals\n    static void internal_free_buffer( pointer_array_type &pa, list_array_type &el, size_t &sz, size_t &ne ) {\n        if(pa) {\n            for(size_t i = 0; i < sz; ++i ) {\n                element_type *p_next;\n                for( element_type *p = pa[i]; p; p = p_next) {\n                    p_next = (element_type *)p->second.next;\n                    value_type *vp = reinterpret_cast<value_type *>(&(p->first));\n                    vp->~value_type();\n                }\n            }\n            pointer_array_allocator_type().deallocate(pa, sz); \n            pa = NULL;\n        }\n        // Separate test (if allocation of pa throws, el may be allocated.\n        // but no elements will be constructed.)\n        if(el) {\n            elements_array_allocator().deallocate(el, sz / 2);\n            el = NULL;\n        }\n        sz = INITIAL_SIZE;\n        ne = 0;\n    }\n\npublic:\n    tagged_buffer() : my_size(INITIAL_SIZE), nelements(0) {\n        internal_initialize_buffer();\n    }\n\n    ~tagged_buffer() {\n        internal_free_buffer(pointer_array, elements_array, my_size, nelements);\n    }\n\n    void reset() {\n        internal_free_buffer(pointer_array, elements_array, my_size, nelements);\n        internal_initialize_buffer();\n    }\n\n    bool tagged_insert(const TagType t, const value_type &v) {\n        pointer_type p;\n        if(tagged_find_ref(t, p)) {\n            p->~value_type();\n            (void) new(p) value_type(v);  // copy-construct into the space\n            return false;\n        }\n        ++nelements;\n        if(nelements*2 > my_size) grow_array();\n        internal_tagged_insert(pointer_array, my_size, free_list, t, v);\n        return true;\n    }\n\n    // returns reference to array element.v\n    bool tagged_find_ref(const TagType t, pointer_type &v) {\n        size_t i = hash(t) & mask();\n        for(element_type* p = pointer_array[i]; p; p = (element_type *)(p->second.next)) {\n            if(p->second.t == t) {\n                v = reinterpret_cast<pointer_type>(&(p->first));\n                return true;\n            }\n        }\n        return false;\n    }\n\n    bool tagged_find( const TagType t, value_type &v) {\n        value_type *p;\n        if(tagged_find_ref(t, p)) {\n            v = *p;\n            return true;\n        }\n        else\n            return false;\n    }\n\n    void tagged_delete(const TagType t) {\n        size_t h = hash(t) & mask();\n        element_type* prev = NULL;\n        for(element_type* p = pointer_array[h]; p; prev = p, p = (element_type *)(p->second.next)) {\n            if(p->second.t == t) {\n                value_type *vp = reinterpret_cast<value_type *>(&(p->first));\n                vp->~value_type();\n                p->second.t = NO_TAG;\n                if(prev) prev->second.next = p->second.next;\n                else pointer_array[h] = (element_type *)(p->second.next);\n                p->second.next = free_list;\n                free_list = p;\n                --nelements;\n                return;\n            }\n        }\n        __TBB_ASSERT(false, \"tag not found for delete\");\n    }\n};\n#endif // __TBB__flow_graph_tagged_buffer_impl_H\n"
  },
  {
    "path": "benchmarks/tbb/internal/_flow_graph_trace_impl.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef _FGT_GRAPH_TRACE_IMPL_H\n#define _FGT_GRAPH_TRACE_IMPL_H\n\n#include \"../tbb_profiling.h\"\n\nnamespace tbb {\n    namespace internal {\n\n#if TBB_PREVIEW_FLOW_GRAPH_TRACE\n\nstatic inline void fgt_internal_create_input_port( void *node, void *p, string_index name_index ) {\n    itt_make_task_group( ITT_DOMAIN_FLOW, p, FLOW_INPUT_PORT, node, FLOW_NODE, name_index );\n}\n\nstatic inline void fgt_internal_create_output_port( void *node, void *p, string_index name_index ) {\n    itt_make_task_group( ITT_DOMAIN_FLOW, p, FLOW_OUTPUT_PORT, node, FLOW_NODE, name_index );\n}\n\ntemplate < typename TypesTuple, typename PortsTuple, int N >\nstruct fgt_internal_input_helper {\n    static void register_port( void *node, PortsTuple &ports ) {\n        fgt_internal_create_input_port( node, (void*)static_cast< tbb::flow::interface7::receiver< typename tbb::flow::tuple_element<N-1,TypesTuple>::type > * >(&(tbb::flow::get<N-1>(ports))),\n                                        static_cast<tbb::internal::string_index>(FLOW_INPUT_PORT_0 + N - 1) );\n        fgt_internal_input_helper<TypesTuple, PortsTuple, N-1>::register_port( node, ports );\n    } \n};\n\ntemplate < typename TypesTuple, typename PortsTuple >\nstruct fgt_internal_input_helper<TypesTuple,PortsTuple,1> {\n    static void register_port( void *node, PortsTuple &ports ) {\n        fgt_internal_create_input_port( node, (void*)static_cast< tbb::flow::interface7::receiver< typename tbb::flow::tuple_element<0,TypesTuple>::type > * >(&(tbb::flow::get<0>(ports))),\n                                        FLOW_INPUT_PORT_0 );\n    } \n};\n\ntemplate < typename TypesTuple, typename PortsTuple, int N >\nstruct fgt_internal_output_helper {\n    static void register_port( void *node, PortsTuple &ports ) {\n        fgt_internal_create_output_port( node, (void*)static_cast< tbb::flow::interface7::sender< typename tbb::flow::tuple_element<N-1,TypesTuple>::type > * >(&(tbb::flow::get<N-1>(ports))),\n                                         static_cast<tbb::internal::string_index>(FLOW_OUTPUT_PORT_0 + N - 1) ); \n        fgt_internal_output_helper<TypesTuple, PortsTuple, N-1>::register_port( node, ports );\n    } \n};\n\ntemplate < typename TypesTuple, typename PortsTuple >\nstruct fgt_internal_output_helper<TypesTuple,PortsTuple,1> {\n    static void register_port( void *node, PortsTuple &ports ) {\n        fgt_internal_create_output_port( node, (void*)static_cast< tbb::flow::interface7::sender< typename tbb::flow::tuple_element<0,TypesTuple>::type > * >(&(tbb::flow::get<0>(ports))),\n                                         FLOW_OUTPUT_PORT_0 ); \n    } \n};\n\ntemplate< typename NodeType >\nvoid fgt_multioutput_node_desc( const NodeType *node, const char *desc ) {\n    void *addr =  (void *)( static_cast< tbb::flow::interface7::receiver< typename NodeType::input_type > * >(const_cast< NodeType *>(node)) ); \n    itt_metadata_str_add( ITT_DOMAIN_FLOW, addr, FLOW_NODE, FLOW_OBJECT_NAME, desc ); \n}\n\ntemplate< typename NodeType >\nstatic inline void fgt_node_desc( const NodeType *node, const char *desc ) {\n    void *addr =  (void *)( static_cast< tbb::flow::interface7::sender< typename NodeType::output_type > * >(const_cast< NodeType *>(node)) ); \n    itt_metadata_str_add( ITT_DOMAIN_FLOW, addr, FLOW_NODE, FLOW_OBJECT_NAME, desc ); \n}\n\nstatic inline void fgt_graph_desc( void *g, const char *desc ) {\n    itt_metadata_str_add( ITT_DOMAIN_FLOW, g, FLOW_GRAPH, FLOW_OBJECT_NAME, desc ); \n}\n\nstatic inline void fgt_body( void *node, void *body ) {\n    itt_relation_add( ITT_DOMAIN_FLOW, body, FLOW_BODY, __itt_relation_is_child_of, node, FLOW_NODE );\n}\n\ntemplate< typename OutputTuple, int N, typename PortsTuple >\nstatic inline void fgt_multioutput_node( string_index t, void *g, void *input_port, PortsTuple &ports ) {\n    itt_make_task_group( ITT_DOMAIN_FLOW, input_port, FLOW_NODE, g, FLOW_GRAPH, t ); \n    fgt_internal_create_input_port( input_port, input_port, FLOW_INPUT_PORT_0 ); \n    fgt_internal_output_helper<OutputTuple, PortsTuple, N>::register_port( input_port, ports ); \n}\n\ntemplate< typename OutputTuple, int N, typename PortsTuple >\nstatic inline void fgt_multioutput_node_with_body( string_index t, void *g, void *input_port, PortsTuple &ports, void *body ) {\n    itt_make_task_group( ITT_DOMAIN_FLOW, input_port, FLOW_NODE, g, FLOW_GRAPH, t ); \n    fgt_internal_create_input_port( input_port, input_port, FLOW_INPUT_PORT_0 ); \n    fgt_internal_output_helper<OutputTuple, PortsTuple, N>::register_port( input_port, ports ); \n    fgt_body( input_port, body );\n}\n\n\ntemplate< typename InputTuple, int N, typename PortsTuple >\nstatic inline void fgt_multiinput_node( string_index t, void *g, PortsTuple &ports, void *output_port) {\n    itt_make_task_group( ITT_DOMAIN_FLOW, output_port, FLOW_NODE, g, FLOW_GRAPH, t ); \n    fgt_internal_create_output_port( output_port, output_port, FLOW_OUTPUT_PORT_0 ); \n    fgt_internal_input_helper<InputTuple, PortsTuple, N>::register_port( output_port, ports ); \n}\n\nstatic inline void fgt_node( string_index t, void *g, void *output_port ) {\n    itt_make_task_group( ITT_DOMAIN_FLOW, output_port, FLOW_NODE, g, FLOW_GRAPH, t ); \n    fgt_internal_create_output_port( output_port, output_port, FLOW_OUTPUT_PORT_0 ); \n}\n\nstatic inline void fgt_node_with_body( string_index t, void *g, void *output_port, void *body ) {\n    itt_make_task_group( ITT_DOMAIN_FLOW, output_port, FLOW_NODE, g, FLOW_GRAPH, t ); \n    fgt_internal_create_output_port( output_port, output_port, FLOW_OUTPUT_PORT_0 ); \n    fgt_body( output_port, body );\n}\n\n\nstatic inline void fgt_node( string_index t, void *g, void *input_port, void *output_port ) {\n    fgt_node( t, g, output_port );\n    fgt_internal_create_input_port( output_port, input_port, FLOW_INPUT_PORT_0 );\n}\n\nstatic inline void fgt_node_with_body( string_index t, void *g, void *input_port, void *output_port, void *body ) {\n    fgt_node_with_body( t, g, output_port, body );\n    fgt_internal_create_input_port( output_port, input_port, FLOW_INPUT_PORT_0 ); \n}\n\n\nstatic inline void  fgt_node( string_index t, void *g, void *input_port, void *decrement_port, void *output_port ) {\n    fgt_node( t, g, input_port, output_port );\n    fgt_internal_create_input_port( output_port, decrement_port, FLOW_INPUT_PORT_1 ); \n}\n\nstatic inline void fgt_make_edge( void *output_port, void *input_port ) {\n    itt_relation_add( ITT_DOMAIN_FLOW, output_port, FLOW_OUTPUT_PORT, __itt_relation_is_predecessor_to, input_port, FLOW_INPUT_PORT);\n}\n\nstatic inline void fgt_remove_edge( void *output_port, void *input_port ) {\n    itt_relation_add( ITT_DOMAIN_FLOW, output_port, FLOW_OUTPUT_PORT, __itt_relation_is_sibling_of, input_port, FLOW_INPUT_PORT);\n}\n\nstatic inline void fgt_graph( void *g ) {\n    itt_make_task_group( ITT_DOMAIN_FLOW, g, FLOW_GRAPH, NULL, FLOW_NULL, FLOW_GRAPH ); \n}\n\nstatic inline void fgt_begin_body( void *body ) {\n    itt_task_begin( ITT_DOMAIN_FLOW, body, FLOW_BODY, NULL, FLOW_NULL, FLOW_NULL );\n}\n\nstatic inline void fgt_end_body( void * ) {\n    itt_task_end( ITT_DOMAIN_FLOW );\n}\n\n#else // TBB_PREVIEW_FLOW_GRAPH_TRACE\n\nstatic inline void fgt_graph( void * /*g*/ ) { }\n\ntemplate< typename NodeType >\nstatic inline void fgt_multioutput_node_desc( const NodeType * /*node*/, const char * /*desc*/ ) { }\n\ntemplate< typename NodeType >\nstatic inline void fgt_node_desc( const NodeType * /*node*/, const char * /*desc*/ ) { }\n\nstatic inline void fgt_graph_desc( void * /*g*/, const char * /*desc*/ ) { }\n\nstatic inline void fgt_body( void * /*node*/, void * /*body*/ ) { }\n\ntemplate< typename OutputTuple, int N, typename PortsTuple > \nstatic inline void fgt_multioutput_node( string_index /*t*/, void * /*g*/, void * /*input_port*/, PortsTuple & /*ports*/ ) { }\n\ntemplate< typename OutputTuple, int N, typename PortsTuple >\nstatic inline void fgt_multioutput_node_with_body( string_index /*t*/, void * /*g*/, void * /*input_port*/, PortsTuple & /*ports*/, void * /*body*/ ) { }\n\ntemplate< typename InputTuple, int N, typename PortsTuple >\nstatic inline void fgt_multiinput_node( string_index /*t*/, void * /*g*/, PortsTuple & /*ports*/, void * /*output_port*/ ) { }\n\nstatic inline void fgt_node( string_index /*t*/, void * /*g*/, void * /*output_port*/ ) { } \nstatic inline void fgt_node( string_index /*t*/, void * /*g*/, void * /*input_port*/, void * /*output_port*/ ) { } \nstatic inline void  fgt_node( string_index /*t*/, void * /*g*/, void * /*input_port*/, void * /*decrement_port*/, void * /*output_port*/ ) { }\n\nstatic inline void fgt_node_with_body( string_index /*t*/, void * /*g*/, void * /*output_port*/, void * /*body*/ ) { }\nstatic inline void fgt_node_with_body( string_index /*t*/, void * /*g*/, void * /*input_port*/, void * /*output_port*/, void * /*body*/ ) { }\n\nstatic inline void fgt_make_edge( void * /*output_port*/, void * /*input_port*/ ) { }\nstatic inline void fgt_remove_edge( void * /*output_port*/, void * /*input_port*/ ) { }\n\nstatic inline void fgt_begin_body( void * /*body*/ ) { }\nstatic inline void fgt_end_body( void *  /*body*/) { }\n\n#endif // TBB_PREVIEW_FLOW_GRAPH_TRACE\n\n    } // namespace internal\n} // namespace tbb\n\n#endif\n"
  },
  {
    "path": "benchmarks/tbb/internal/_flow_graph_types_impl.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB__flow_graph_types_impl_H\n#define __TBB__flow_graph_types_impl_H\n\n#ifndef __TBB_flow_graph_H\n#error Do not #include this internal file directly; use public TBB headers instead.\n#endif\n\n// included in namespace tbb::flow::interface7\n\nnamespace internal {\n// wrap each element of a tuple in a template, and make a tuple of the result.\n\n    template<int N, template<class> class PT, typename TypeTuple>\n    struct wrap_tuple_elements;\n\n    template<template<class> class PT, typename TypeTuple>\n    struct wrap_tuple_elements<1, PT, TypeTuple> {\n        typedef typename tbb::flow::tuple<\n                PT<typename tbb::flow::tuple_element<0,TypeTuple>::type> >\n            type;\n    };\n\n    template<template<class> class PT, typename TypeTuple>\n    struct wrap_tuple_elements<2, PT, TypeTuple> {\n        typedef typename tbb::flow::tuple<\n                PT<typename tbb::flow::tuple_element<0,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<1,TypeTuple>::type> >\n            type;\n    };\n\n    template<template<class> class PT, typename TypeTuple>\n    struct wrap_tuple_elements<3, PT, TypeTuple> {\n        typedef typename tbb::flow::tuple<\n                PT<typename tbb::flow::tuple_element<0,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<1,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<2,TypeTuple>::type> >\n            type;\n    };\n\n    template<template<class> class PT, typename TypeTuple>\n    struct wrap_tuple_elements<4, PT, TypeTuple> {\n        typedef typename tbb::flow::tuple<\n                PT<typename tbb::flow::tuple_element<0,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<1,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<2,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<3,TypeTuple>::type> >\n            type;\n    };\n\n    template<template<class> class PT, typename TypeTuple>\n    struct wrap_tuple_elements<5, PT, TypeTuple> {\n        typedef typename tbb::flow::tuple<\n                PT<typename tbb::flow::tuple_element<0,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<1,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<2,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<3,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<4,TypeTuple>::type> >\n            type;\n    };\n\n#if __TBB_VARIADIC_MAX >= 6\n    template<template<class> class PT, typename TypeTuple>\n    struct wrap_tuple_elements<6, PT, TypeTuple> {\n        typedef typename tbb::flow::tuple<\n                PT<typename tbb::flow::tuple_element<0,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<1,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<2,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<3,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<4,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<5,TypeTuple>::type> >\n            type;\n    };\n#endif\n\n#if __TBB_VARIADIC_MAX >= 7\n    template<template<class> class PT, typename TypeTuple>\n    struct wrap_tuple_elements<7, PT, TypeTuple> {\n        typedef typename tbb::flow::tuple<\n                PT<typename tbb::flow::tuple_element<0,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<1,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<2,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<3,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<4,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<5,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<6,TypeTuple>::type> >\n            type;\n    };\n#endif\n\n#if __TBB_VARIADIC_MAX >= 8\n    template<template<class> class PT, typename TypeTuple>\n    struct wrap_tuple_elements<8, PT, TypeTuple> {\n        typedef typename tbb::flow::tuple<\n                PT<typename tbb::flow::tuple_element<0,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<1,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<2,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<3,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<4,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<5,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<6,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<7,TypeTuple>::type> >\n            type;\n    };\n#endif\n\n#if __TBB_VARIADIC_MAX >= 9\n    template<template<class> class PT, typename TypeTuple>\n    struct wrap_tuple_elements<9, PT, TypeTuple> {\n        typedef typename tbb::flow::tuple<\n                PT<typename tbb::flow::tuple_element<0,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<1,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<2,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<3,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<4,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<5,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<6,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<7,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<8,TypeTuple>::type> >\n            type;\n    };\n#endif\n\n#if __TBB_VARIADIC_MAX >= 10\n    template<template<class> class PT, typename TypeTuple>\n    struct wrap_tuple_elements<10, PT, TypeTuple> {\n        typedef typename tbb::flow::tuple<\n                PT<typename tbb::flow::tuple_element<0,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<1,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<2,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<3,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<4,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<5,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<6,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<7,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<8,TypeTuple>::type>,\n                PT<typename tbb::flow::tuple_element<9,TypeTuple>::type> >\n            type;\n    };\n#endif\n\n//! type mimicking std::pair but with trailing fill to ensure each element of an array\n//* will have the correct alignment\n    template<typename T1, typename T2, size_t REM>\n    struct type_plus_align {\n        char first[sizeof(T1)];\n        T2 second;\n        char fill1[REM];\n    };\n\n    template<typename T1, typename T2>\n    struct type_plus_align<T1,T2,0> {\n        char first[sizeof(T1)];\n        T2 second;\n    };\n\n    template<class U> struct alignment_of {\n        typedef struct { char t; U    padded; } test_alignment;\n        static const size_t value = sizeof(test_alignment) - sizeof(U);\n    };\n\n    // T1, T2 are actual types stored.  The space defined for T1 in the type returned\n    // is a char array of the correct size.  Type T2 should be trivially-constructible,\n    // T1 must be explicitly managed.\n    template<typename T1, typename T2>\n    struct aligned_pair {\n        static const size_t t1_align = alignment_of<T1>::value;\n        static const size_t t2_align = alignment_of<T2>::value;\n        typedef type_plus_align<T1, T2, 0 > just_pair;\n        static const size_t max_align = t1_align < t2_align ? t2_align : t1_align;\n        static const size_t extra_bytes = sizeof(just_pair) % max_align;\n        static const size_t remainder = extra_bytes ? max_align - extra_bytes : 0;\n    public:\n        typedef type_plus_align<T1,T2,remainder> type;\n    };  // aligned_pair\n\n// support for variant type\n// type we use when we're not storing a value\nstruct default_constructed { };\n\n// type which contains another type, tests for what type is contained, and references to it.\n// internal::Wrapper<T>\n//     void CopyTo( void *newSpace) : builds a Wrapper<T> copy of itself in newSpace\n\n// struct to allow us to copy and test the type of objects\nstruct WrapperBase {\n    virtual ~WrapperBase() {}\n    virtual void CopyTo(void* /*newSpace*/) const {  }\n};\n\n// Wrapper<T> contains a T, with the ability to test what T is.  The Wrapper<T> can be\n// constructed from a T, can be copy-constructed from another Wrapper<T>, and can be\n// examined via value(), but not modified.\ntemplate<typename T>\nstruct Wrapper: public WrapperBase {\n    typedef T value_type;\n    typedef T* pointer_type;\nprivate:\n    T value_space;\npublic:\n    const value_type &value() const { return value_space; }\n\nprivate:\n    Wrapper();\n\n    // on exception will ensure the Wrapper will contain only a trivially-constructed object\n    struct _unwind_space {\n        pointer_type space;\n        _unwind_space(pointer_type p) : space(p) {}\n        ~_unwind_space() {\n            if(space) (void) new (space) Wrapper<default_constructed>(default_constructed());\n        }\n    };\npublic:\n    explicit Wrapper( const T& other ) : value_space(other) { }\n    explicit Wrapper(const Wrapper& other) : value_space(other.value_space) { }\n\n    /*override*/void CopyTo(void* newSpace) const {\n        _unwind_space guard((pointer_type)newSpace);\n        (void) new(newSpace) Wrapper(value_space);\n        guard.space = NULL;\n    }\n    /*override*/~Wrapper() { }\n};\n\n// specialization for array objects\ntemplate<typename T, size_t N>\nstruct Wrapper<T[N]> : public WrapperBase {\n    typedef T value_type;\n    typedef T* pointer_type;\n    // space must be untyped.\n    typedef T ArrayType[N];\nprivate:\n    // The space is not of type T[N] because when copy-constructing, it would be\n    // default-initialized and then copied to in some fashion, resulting in two\n    // constructions and one destruction per element.  If the type is char[ ], we\n    // placement new into each element, resulting in one construction per element.\n    static const size_t space_size = sizeof(ArrayType) / sizeof(char);\n    char value_space[space_size];\n\n\n    // on exception will ensure the already-built objects will be destructed\n    // (the value_space is a char array, so it is already trivially-destructible.)\n    struct _unwind_class {\n        pointer_type space;\n        int    already_built;\n        _unwind_class(pointer_type p) : space(p), already_built(0) {}\n        ~_unwind_class() {\n            if(space) {\n                for(size_t i = already_built; i > 0 ; --i ) space[i-1].~value_type();\n                (void) new(space) Wrapper<default_constructed>(default_constructed());\n            }\n        }\n    };\npublic:\n    const ArrayType &value() const {\n        char *vp = const_cast<char *>(value_space);\n        return reinterpret_cast<ArrayType &>(*vp);\n    }\n\nprivate:\n    Wrapper();\npublic:\n    // have to explicitly construct because other decays to a const value_type*\n    explicit Wrapper(const ArrayType& other) {\n        _unwind_class guard((pointer_type)value_space);\n        pointer_type vp = reinterpret_cast<pointer_type>(&value_space);\n        for(size_t i = 0; i < N; ++i ) {\n            (void) new(vp++) value_type(other[i]);\n            ++(guard.already_built);\n        }\n        guard.space = NULL;\n    }\n    explicit Wrapper(const Wrapper& other) : WrapperBase() {\n        // we have to do the heavy lifting to copy contents\n        _unwind_class guard((pointer_type)value_space);\n        pointer_type dp = reinterpret_cast<pointer_type>(value_space);\n        pointer_type sp = reinterpret_cast<pointer_type>(const_cast<char *>(other.value_space));\n        for(size_t i = 0; i < N; ++i, ++dp, ++sp) {\n            (void) new(dp) value_type(*sp);\n            ++(guard.already_built);\n        }\n        guard.space = NULL;\n    }\n\n    /*override*/void CopyTo(void* newSpace) const {\n        (void) new(newSpace) Wrapper(*this);  // exceptions handled in copy constructor\n    }\n\n    /*override*/~Wrapper() {\n        // have to destroy explicitly in reverse order\n        pointer_type vp = reinterpret_cast<pointer_type>(&value_space);\n        for(size_t i = N; i > 0 ; --i ) vp[i-1].~value_type();\n    }\n};\n\n// given a tuple, return the type of the element that has the maximum alignment requirement.\n// Given a tuple and that type, return the number of elements of the object with the max\n// alignment requirement that is at least as big as the largest object in the tuple.\n\ntemplate<bool, class T1, class T2> struct pick_one;\ntemplate<class T1, class T2> struct pick_one<true , T1, T2> { typedef T1 type; };\ntemplate<class T1, class T2> struct pick_one<false, T1, T2> { typedef T2 type; };\n\ntemplate< template<class> class Selector, typename T1, typename T2 >\nstruct pick_max {\n    typedef typename pick_one< (Selector<T1>::value > Selector<T2>::value), T1, T2 >::type type;\n};\n\ntemplate<typename T> struct size_of { static const int value = sizeof(T); };\n\ntemplate< size_t N, class Tuple, template<class> class Selector > struct pick_tuple_max {\n    typedef typename pick_tuple_max<N-1, Tuple, Selector>::type LeftMaxType;\n    typedef typename tbb::flow::tuple_element<N-1, Tuple>::type ThisType;\n    typedef typename pick_max<Selector, LeftMaxType, ThisType>::type type;\n};\n\ntemplate< class Tuple, template<class> class Selector > struct pick_tuple_max<0, Tuple, Selector> {\n    typedef typename tbb::flow::tuple_element<0, Tuple>::type type;\n};\n\n// is the specified type included in a tuple?\n\ntemplate<class U, class V> struct is_same_type      { static const bool value = false; };\ntemplate<class W>          struct is_same_type<W,W> { static const bool value = true; };\n\ntemplate<class Q, size_t N, class Tuple>\nstruct is_element_of {\n    typedef typename tbb::flow::tuple_element<N-1, Tuple>::type T_i;\n    static const bool value = is_same_type<Q,T_i>::value || is_element_of<Q,N-1,Tuple>::value;\n};\n\ntemplate<class Q, class Tuple>\nstruct is_element_of<Q,0,Tuple> {\n    typedef typename tbb::flow::tuple_element<0, Tuple>::type T_i;\n    static const bool value = is_same_type<Q,T_i>::value;\n};\n\n// allow the construction of types that are listed tuple.  If a disallowed type\n// construction is written, a method involving this type is created.  The\n// type has no definition, so a syntax error is generated.\ntemplate<typename T> struct ERROR_Type_Not_allowed_In_Tagged_Msg_Not_Member_Of_Tuple;\n\ntemplate<typename T, bool BUILD_IT> struct do_if;\ntemplate<typename T>\nstruct do_if<T, true> {\n    static void construct(void *mySpace, const T& x) {\n        (void) new(mySpace) Wrapper<T>(x);\n    }\n};\ntemplate<typename T>\nstruct do_if<T, false> {\n    static void construct(void * /*mySpace*/, const T& x) {\n        // This method is instantiated when the type T does not match any of the\n        // element types in the Tuple in variant<Tuple>.\n        ERROR_Type_Not_allowed_In_Tagged_Msg_Not_Member_Of_Tuple<T>::bad_type(x);\n    }\n};\n\n// Tuple tells us the allowed types that variant can hold.  It determines the alignment of the space in\n// Wrapper, and how big Wrapper is.\n//\n// the object can only be tested for type, and a read-only reference can be fetched by cast_to<T>().\n\nusing tbb::internal::punned_cast;\nstruct tagged_null_type {};\ntemplate<typename TagType, typename T0, typename T1=tagged_null_type, typename T2=tagged_null_type, typename T3=tagged_null_type, \n                           typename T4=tagged_null_type, typename T5=tagged_null_type, typename T6=tagged_null_type,\n                           typename T7=tagged_null_type, typename T8=tagged_null_type, typename T9=tagged_null_type>\nclass tagged_msg {\n    typedef tbb::flow::tuple<T0, T1, T2, T3, T4\n                  #if __TBB_VARIADIC_MAX >= 6\n                  , T5\n                  #endif\n                  #if __TBB_VARIADIC_MAX >= 7\n                  , T6\n                  #endif\n                  #if __TBB_VARIADIC_MAX >= 8\n                  , T7\n                  #endif\n                  #if __TBB_VARIADIC_MAX >= 9\n                  , T8\n                  #endif\n                  #if __TBB_VARIADIC_MAX >= 10\n                  , T9\n                  #endif\n                  > Tuple;   \n\nprivate:\n    class variant {\n        static const size_t N = tbb::flow::tuple_size<Tuple>::value;\n        typedef typename pick_tuple_max<N, Tuple, alignment_of>::type AlignType;\n        typedef typename pick_tuple_max<N, Tuple, size_of>::type MaxSizeType;\n        static const size_t MaxNBytes = (sizeof(Wrapper<MaxSizeType>)+sizeof(AlignType)-1);\n        static const size_t MaxNElements = MaxNBytes/sizeof(AlignType);\n        typedef typename tbb::aligned_space<AlignType, MaxNElements> SpaceType;\n        SpaceType my_space;\n        static const size_t MaxSize = sizeof(SpaceType);\n\n    public:\n        variant() { (void) new(&my_space) Wrapper<default_constructed>(default_constructed()); }\n\n        template<typename T>\n        variant( const T& x ) {\n            do_if<T, is_element_of<T, N, Tuple>::value>::construct(&my_space,x);\n        }\n\n        variant(const variant& other) {\n            const WrapperBase * h = punned_cast<const WrapperBase *>(&(other.my_space));\n            h->CopyTo(&my_space);\n        }\n\n        // assignment must destroy and re-create the Wrapper type, as there is no way\n        // to create a Wrapper-to-Wrapper assign even if we find they agree in type.\n        void operator=( const variant& rhs ) {\n            if(&rhs != this) {\n                WrapperBase *h = punned_cast<WrapperBase *>(&my_space);\n                h->~WrapperBase();\n                const WrapperBase *ch = punned_cast<const WrapperBase *>(&(rhs.my_space));\n                ch->CopyTo(&my_space);\n            }\n        }\n\n        template<typename U>\n        const U& variant_cast_to() const {\n            const Wrapper<U> *h = dynamic_cast<const Wrapper<U>*>(punned_cast<const WrapperBase *>(&my_space));\n            if(!h) {\n                tbb::internal::throw_exception(tbb::internal::eid_bad_tagged_msg_cast);\n            }\n            return h->value();\n        }\n        template<typename U>\n        bool variant_is_a() const { return dynamic_cast<const Wrapper<U>*>(punned_cast<const WrapperBase *>(&my_space)) != NULL; }\n\n        bool variant_is_default_constructed() const {return variant_is_a<default_constructed>();}\n\n        ~variant() {\n            WrapperBase *h = punned_cast<WrapperBase *>(&my_space);\n            h->~WrapperBase();\n        }\n    }; //class variant\n\n    TagType my_tag;\n    variant my_msg;\n\npublic:\n    tagged_msg(): my_tag(TagType(~0)), my_msg(){} \n\n    template<typename T, typename R>\n    tagged_msg(T const &index, R const &value) : my_tag(index), my_msg(value) {}\n    \n    #if __TBB_CONST_REF_TO_ARRAY_TEMPLATE_PARAM_BROKEN\n    template<typename T, typename R, size_t N>\n    tagged_msg(T const &index,  R (&value)[N]) : my_tag(index), my_msg(value) {}\n    #endif\n\n    void set_tag(TagType const &index) {my_tag = index;}\n    TagType tag() const {return my_tag;}\n\n    template<typename V>\n    const V& cast_to() const {return my_msg.template variant_cast_to<V>();}\n\n    template<typename V>\n    bool is_a() const {return my_msg.template variant_is_a<V>();}\n\n    bool is_default_constructed() const {return my_msg.variant_is_default_constructed();}\n}; //class tagged_msg\n\n// template to simplify cast and test for tagged_msg in template contexts\ntemplate<typename T, typename V>\nconst T& cast_to(V const &v) { return v.template cast_to<T>(); }\n\ntemplate<typename T, typename V>\nbool is_a(V const &v) { return v.template is_a<T>(); }\n\n}  // namespace internal\n\n#endif  /* __TBB__flow_graph_types_impl_H */\n"
  },
  {
    "path": "benchmarks/tbb/internal/_mutex_padding.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_mutex_padding_H\n#define __TBB_mutex_padding_H\n\n// wrapper for padding mutexes to be alone on a cache line, without requiring they be allocated\n// from a pool.  Because we allow them to be defined anywhere they must be two cache lines in size.\n\n\nnamespace tbb {\nnamespace interface7 {\nnamespace internal {\n\nstatic const size_t cache_line_size = 64;\n\n// Pad a mutex to occupy a number of full cache lines sufficient to avoid false sharing\n// with other data; space overhead is up to 2*cache_line_size-1.\ntemplate<typename Mutex, bool is_rw> class padded_mutex;\n\ntemplate<typename Mutex>\nclass padded_mutex<Mutex,false> : tbb::internal::mutex_copy_deprecated_and_disabled {\n    typedef long pad_type;\n    pad_type my_pad[((sizeof(Mutex)+cache_line_size-1)/cache_line_size+1)*cache_line_size/sizeof(pad_type)];\n\n    Mutex *impl() { return (Mutex *)((uintptr_t(this)|(cache_line_size-1))+1);}\n\npublic:\n    static const bool is_rw_mutex = Mutex::is_rw_mutex;\n    static const bool is_recursive_mutex = Mutex::is_recursive_mutex;\n    static const bool is_fair_mutex = Mutex::is_fair_mutex;\n\n    padded_mutex() { new(impl()) Mutex(); }\n    ~padded_mutex() { impl()->~Mutex(); }\n\n    //! Represents acquisition of a mutex.\n    class scoped_lock :  tbb::internal::no_copy {\n        typename Mutex::scoped_lock my_scoped_lock;\n    public:\n        scoped_lock() : my_scoped_lock() {}\n        scoped_lock( padded_mutex& m ) : my_scoped_lock(*m.impl()) { }\n        ~scoped_lock() {  }\n\n        void acquire( padded_mutex& m ) { my_scoped_lock.acquire(*m.impl()); }\n        bool try_acquire( padded_mutex& m ) { return my_scoped_lock.try_acquire(*m.impl()); }\n        void release() { my_scoped_lock.release(); }\n    };\n};\n\ntemplate<typename Mutex>\nclass padded_mutex<Mutex,true> : tbb::internal::mutex_copy_deprecated_and_disabled {\n    typedef long pad_type;\n    pad_type my_pad[((sizeof(Mutex)+cache_line_size-1)/cache_line_size+1)*cache_line_size/sizeof(pad_type)];\n\n    Mutex *impl() { return (Mutex *)((uintptr_t(this)|(cache_line_size-1))+1);}\n\npublic:\n    static const bool is_rw_mutex = Mutex::is_rw_mutex;\n    static const bool is_recursive_mutex = Mutex::is_recursive_mutex;\n    static const bool is_fair_mutex = Mutex::is_fair_mutex;\n\n    padded_mutex() { new(impl()) Mutex(); }\n    ~padded_mutex() { impl()->~Mutex(); }\n\n    //! Represents acquisition of a mutex.\n    class scoped_lock :  tbb::internal::no_copy {\n        typename Mutex::scoped_lock my_scoped_lock;\n    public:\n        scoped_lock() : my_scoped_lock() {}\n        scoped_lock( padded_mutex& m, bool write = true ) : my_scoped_lock(*m.impl(),write) { }\n        ~scoped_lock() {  }\n\n        void acquire( padded_mutex& m, bool write = true ) { my_scoped_lock.acquire(*m.impl(),write); }\n        bool try_acquire( padded_mutex& m, bool write = true ) { return my_scoped_lock.try_acquire(*m.impl(),write); }\n        bool upgrade_to_writer() { return my_scoped_lock.upgrade_to_writer(); }\n        bool downgrade_to_reader() { return my_scoped_lock.downgrade_to_reader(); }\n        void release() { my_scoped_lock.release(); }\n    };\n};\n\n} // namespace internal\n} // namespace interface7\n} // namespace tbb\n\n#endif /* __TBB_mutex_padding_H */\n"
  },
  {
    "path": "benchmarks/tbb/internal/_range_iterator.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_range_iterator_H\n#define __TBB_range_iterator_H\n\n#include \"../tbb_stddef.h\"\n\n#if __TBB_CPP11_STD_BEGIN_END_PRESENT && __TBB_CPP11_AUTO_PRESENT && __TBB_CPP11_DECLTYPE_PRESENT\n    #include <iterator>\n#endif\n\nnamespace tbb {\n    // iterators to first and last elements of container\n    namespace internal {\n\n#if __TBB_CPP11_STD_BEGIN_END_PRESENT && __TBB_CPP11_AUTO_PRESENT && __TBB_CPP11_DECLTYPE_PRESENT\n        using std::begin;\n        using std::end;\n        template<typename Container>\n        auto first(Container& c)-> decltype(begin(c))  {return begin(c);}\n\n        template<typename Container>\n        auto first(const Container& c)-> decltype(begin(c))  {return begin(c);}\n\n        template<typename Container>\n        auto last(Container& c)-> decltype(begin(c))  {return end(c);}\n\n        template<typename Container>\n        auto last(const Container& c)-> decltype(begin(c)) {return end(c);}\n#else\n        template<typename Container>\n        typename Container::iterator first(Container& c) {return c.begin();}\n\n        template<typename Container>\n        typename Container::const_iterator first(const Container& c) {return c.begin();}\n\n        template<typename Container>\n        typename Container::iterator last(Container& c) {return c.end();}\n\n        template<typename Container>\n        typename Container::const_iterator last(const Container& c) {return c.end();}\n#endif\n\n        template<typename T, size_t size>\n        T* first(T (&arr) [size]) {return arr;}\n\n        template<typename T, size_t size>\n        T* last(T (&arr) [size]) {return arr + size;}\n    } //namespace internal\n}  //namespace tbb\n\n#endif // __TBB_range_iterator_H\n"
  },
  {
    "path": "benchmarks/tbb/internal/_tbb_strings.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\nTBB_STRING_RESOURCE(FLOW_BROADCAST_NODE, \"broadcast_node\")\nTBB_STRING_RESOURCE(FLOW_BUFFER_NODE, \"buffer_node\")\nTBB_STRING_RESOURCE(FLOW_CONTINUE_NODE, \"continue_node\")\nTBB_STRING_RESOURCE(FLOW_FUNCTION_NODE, \"function_node\")\nTBB_STRING_RESOURCE(FLOW_JOIN_NODE_QUEUEING, \"join_node (queueing)\")\nTBB_STRING_RESOURCE(FLOW_JOIN_NODE_RESERVING, \"join_node (reserving)\")\nTBB_STRING_RESOURCE(FLOW_JOIN_NODE_TAG_MATCHING, \"join_node (tag_matching)\")\nTBB_STRING_RESOURCE(FLOW_LIMITER_NODE, \"limiter_node\")\nTBB_STRING_RESOURCE(FLOW_MULTIFUNCTION_NODE, \"multifunction_node\")\nTBB_STRING_RESOURCE(FLOW_OR_NODE, \"or_node\") //no longer in use, kept for backward compatibilty\nTBB_STRING_RESOURCE(FLOW_OVERWRITE_NODE, \"overwrite_node\")\nTBB_STRING_RESOURCE(FLOW_PRIORITY_QUEUE_NODE, \"priority_queue_node\")\nTBB_STRING_RESOURCE(FLOW_QUEUE_NODE, \"queue_node\")\nTBB_STRING_RESOURCE(FLOW_SEQUENCER_NODE, \"sequencer_node\")\nTBB_STRING_RESOURCE(FLOW_SOURCE_NODE, \"source_node\")\nTBB_STRING_RESOURCE(FLOW_SPLIT_NODE, \"split_node\")\nTBB_STRING_RESOURCE(FLOW_WRITE_ONCE_NODE, \"write_once_node\")\nTBB_STRING_RESOURCE(FLOW_BODY, \"body\")\nTBB_STRING_RESOURCE(FLOW_GRAPH, \"graph\")\nTBB_STRING_RESOURCE(FLOW_NODE, \"node\")\nTBB_STRING_RESOURCE(FLOW_INPUT_PORT, \"input_port\")\nTBB_STRING_RESOURCE(FLOW_INPUT_PORT_0, \"input_port_0\")\nTBB_STRING_RESOURCE(FLOW_INPUT_PORT_1, \"input_port_1\")\nTBB_STRING_RESOURCE(FLOW_INPUT_PORT_2, \"input_port_2\")\nTBB_STRING_RESOURCE(FLOW_INPUT_PORT_3, \"input_port_3\")\nTBB_STRING_RESOURCE(FLOW_INPUT_PORT_4, \"input_port_4\")\nTBB_STRING_RESOURCE(FLOW_INPUT_PORT_5, \"input_port_5\")\nTBB_STRING_RESOURCE(FLOW_INPUT_PORT_6, \"input_port_6\")\nTBB_STRING_RESOURCE(FLOW_INPUT_PORT_7, \"input_port_7\")\nTBB_STRING_RESOURCE(FLOW_INPUT_PORT_8, \"input_port_8\")\nTBB_STRING_RESOURCE(FLOW_INPUT_PORT_9, \"input_port_9\")\nTBB_STRING_RESOURCE(FLOW_OUTPUT_PORT, \"output_port\")\nTBB_STRING_RESOURCE(FLOW_OUTPUT_PORT_0, \"output_port_0\")\nTBB_STRING_RESOURCE(FLOW_OUTPUT_PORT_1, \"output_port_1\")\nTBB_STRING_RESOURCE(FLOW_OUTPUT_PORT_2, \"output_port_2\")\nTBB_STRING_RESOURCE(FLOW_OUTPUT_PORT_3, \"output_port_3\")\nTBB_STRING_RESOURCE(FLOW_OUTPUT_PORT_4, \"output_port_4\")\nTBB_STRING_RESOURCE(FLOW_OUTPUT_PORT_5, \"output_port_5\")\nTBB_STRING_RESOURCE(FLOW_OUTPUT_PORT_6, \"output_port_6\")\nTBB_STRING_RESOURCE(FLOW_OUTPUT_PORT_7, \"output_port_7\")\nTBB_STRING_RESOURCE(FLOW_OUTPUT_PORT_8, \"output_port_8\")\nTBB_STRING_RESOURCE(FLOW_OUTPUT_PORT_9, \"output_port_9\")\nTBB_STRING_RESOURCE(FLOW_OBJECT_NAME, \"object_name\")\nTBB_STRING_RESOURCE(FLOW_NULL, \"null\")\nTBB_STRING_RESOURCE(FLOW_INDEXER_NODE, \"indexer_node\")\n"
  },
  {
    "path": "benchmarks/tbb/internal/_tbb_windef.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_tbb_windef_H\n#error Do not #include this internal file directly; use public TBB headers instead.\n#endif /* __TBB_tbb_windef_H */\n\n// Check that the target Windows version has all API calls requried for TBB.\n// Do not increase the version in condition beyond 0x0500 without prior discussion!\n#if defined(_WIN32_WINNT) && _WIN32_WINNT<0x0501\n#error TBB is unable to run on old Windows versions; _WIN32_WINNT must be 0x0501 or greater.\n#endif\n\n#if !defined(_MT)\n#error TBB requires linkage with multithreaded C/C++ runtime library. \\\n       Choose multithreaded DLL runtime in project settings, or use /MD[d] compiler switch.\n#endif\n\n// Workaround for the problem with MVSC headers failing to define namespace std\nnamespace std {\n  using ::size_t; using ::ptrdiff_t;\n}\n\n#define __TBB_STRING_AUX(x) #x\n#define __TBB_STRING(x) __TBB_STRING_AUX(x)\n\n// Default setting of TBB_USE_DEBUG\n#ifdef TBB_USE_DEBUG\n#    if TBB_USE_DEBUG \n#        if !defined(_DEBUG)\n#            pragma message(__FILE__ \"(\" __TBB_STRING(__LINE__) \") : Warning: Recommend using /MDd if compiling with TBB_USE_DEBUG!=0\")\n#        endif\n#    else\n#        if defined(_DEBUG)\n#            pragma message(__FILE__ \"(\" __TBB_STRING(__LINE__) \") : Warning: Recommend using /MD if compiling with TBB_USE_DEBUG==0\")\n#        endif\n#    endif\n#endif\n\n#if (__TBB_BUILD || __TBBMALLOC_BUILD) && !defined(__TBB_NO_IMPLICIT_LINKAGE)\n#define __TBB_NO_IMPLICIT_LINKAGE 1\n#endif\n\n#if _MSC_VER\n    #if !__TBB_NO_IMPLICIT_LINKAGE\n        #ifdef __TBB_LIB_NAME\n\t        #pragma comment(lib, __TBB_STRING(__TBB_LIB_NAME))\n        #else\n\t\t\t#ifdef _DEBUG\n\t\t\t\t#pragma comment(lib, \"tbb_debug.lib\")\n\t\t\t#else\n\t\t\t\t#pragma comment(lib, \"tbb.lib\")\n\t\t\t#endif\n        #endif\n    #endif\n#endif\n"
  },
  {
    "path": "benchmarks/tbb/internal/_x86_eliding_mutex_impl.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB__x86_eliding_mutex_impl_H\n#define __TBB__x86_eliding_mutex_impl_H\n\n#ifndef __TBB_spin_mutex_H\n#error Do not #include this internal file directly; use public TBB headers instead.\n#endif\n\n#if ( __TBB_x86_32 || __TBB_x86_64 )\n\nnamespace tbb {\nnamespace interface7 {\nnamespace internal {\n\ntemplate<typename Mutex, bool is_rw>\nclass padded_mutex;\n\n//! An eliding lock that occupies a single byte.\n/** A x86_eliding_mutex is an HLE-enabled spin mutex. It is recommended to\n    put the mutex on a cache line that is not shared by the data it protects.\n    It should be used for locking short critical sections where the lock is\n    contended but the data it protects are not.  If zero-initialized, the\n    mutex is considered unheld.\n    @ingroup synchronization */\nclass x86_eliding_mutex : tbb::internal::mutex_copy_deprecated_and_disabled {\n    //! 0 if lock is released, 1 if lock is acquired.\n    __TBB_atomic_flag flag;\n\n    friend class padded_mutex<x86_eliding_mutex, false>;\n\npublic:\n    //! Construct unacquired lock.\n    /** Equivalent to zero-initialization of *this. */\n    x86_eliding_mutex() : flag(0) {}\n\n// bug in gcc 3.x.x causes syntax error in spite of the friend declaration above.\n// Make the scoped_lock public in that case.\n#if __TBB_USE_X86_ELIDING_MUTEX || __TBB_GCC_VERSION < 40000\n#else\n    // by default we will not provide the scoped_lock interface.  The user\n    // should use the padded version of the mutex.  scoped_lock is used in\n    // padded_mutex template.\nprivate:\n#endif\n    // scoped_lock in padded_mutex<> is the interface to use.\n    //! Represents acquisition of a mutex.\n    class scoped_lock : tbb::internal::no_copy {\n    private:\n        //! Points to currently held mutex, or NULL if no lock is held.\n        x86_eliding_mutex* my_mutex;\n\n    public:\n        //! Construct without acquiring a mutex.\n        scoped_lock() : my_mutex(NULL) {}\n\n        //! Construct and acquire lock on a mutex.\n        scoped_lock( x86_eliding_mutex& m ) : my_mutex(NULL) { acquire(m); }\n\n        //! Acquire lock.\n        void acquire( x86_eliding_mutex& m ) {\n            __TBB_ASSERT( !my_mutex, \"already holding a lock\" );\n\n            my_mutex=&m;\n            my_mutex->lock();\n        }\n\n        //! Try acquiring lock (non-blocking)\n        /** Return true if lock acquired; false otherwise. */\n        bool try_acquire( x86_eliding_mutex& m ) {\n            __TBB_ASSERT( !my_mutex, \"already holding a lock\" );\n\n            bool result = m.try_lock();\n            if( result ) {\n                my_mutex = &m;\n            }\n            return result;\n        }\n\n        //! Release lock\n        void release() {\n            __TBB_ASSERT( my_mutex, \"release on scoped_lock that is not holding a lock\" );\n\n            my_mutex->unlock();\n            my_mutex = NULL;\n        }\n\n        //! Destroy lock.  If holding a lock, releases the lock first.\n        ~scoped_lock() {\n            if( my_mutex ) {\n                release();\n            }\n        }\n    };\n#if __TBB_USE_X86_ELIDING_MUTEX || __TBB_GCC_VERSION < 40000\n#else\npublic:\n#endif  /* __TBB_USE_X86_ELIDING_MUTEX */\n\n    // Mutex traits\n    static const bool is_rw_mutex = false;\n    static const bool is_recursive_mutex = false;\n    static const bool is_fair_mutex = false;\n\n    // ISO C++0x compatibility methods\n\n    //! Acquire lock\n    void lock() {\n        __TBB_LockByteElided(flag);\n    }\n\n    //! Try acquiring lock (non-blocking)\n    /** Return true if lock acquired; false otherwise. */\n    bool try_lock() {\n        return __TBB_TryLockByteElided(flag);\n    }\n\n    //! Release lock\n    void unlock() {\n        __TBB_UnlockByteElided( flag );\n    }\n}; // end of x86_eliding_mutex\n\n} // namespace internal\n} // namespace interface7\n} // namespace tbb\n\n#endif /* ( __TBB_x86_32 || __TBB_x86_64 ) */\n\n#endif /* __TBB__x86_eliding_mutex_impl_H */\n"
  },
  {
    "path": "benchmarks/tbb/internal/_x86_rtm_rw_mutex_impl.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB__x86_rtm_rw_mutex_impl_H\n#define __TBB__x86_rtm_rw_mutex_impl_H\n\n#ifndef __TBB_spin_rw_mutex_H\n#error Do not #include this internal file directly; use public TBB headers instead.\n#endif\n\n#if __TBB_TSX_AVAILABLE\n\n#include \"../tbb_stddef.h\"\n#include \"../tbb_machine.h\"\n#include \"../tbb_profiling.h\"\n#include \"../spin_rw_mutex.h\"\n\nnamespace tbb {\nnamespace interface8 {\nnamespace internal {\n\nenum RTM_type {\n    RTM_not_in_mutex,\n    RTM_transacting_reader,\n    RTM_transacting_writer,\n    RTM_real_reader,\n    RTM_real_writer\n};\n\nstatic const unsigned long speculation_granularity = 64;\n\n//! Fast, unfair, spinning speculation-enabled reader-writer lock with backoff and\n//  writer-preference\n/** @ingroup synchronization */\nclass x86_rtm_rw_mutex: private spin_rw_mutex {\n#if __TBB_USE_X86_RTM_RW_MUTEX || __TBB_GCC_VERSION < 40000\n// bug in gcc 3.x.x causes syntax error in spite of the friend declaration below.\n// Make the scoped_lock public in that case.\npublic:\n#else\nprivate:\n#endif\n    friend class interface7::internal::padded_mutex<x86_rtm_rw_mutex,true>;\n    class scoped_lock;   // should be private \n    friend class scoped_lock;\nprivate:\n    //! @cond INTERNAL\n\n    //! Internal construct unacquired mutex.\n    void __TBB_EXPORTED_METHOD internal_construct();\n\n    //! Internal acquire write lock.\n    // only_speculate == true if we're doing a try_lock, else false.\n    void __TBB_EXPORTED_METHOD internal_acquire_writer(x86_rtm_rw_mutex::scoped_lock&, bool only_speculate=false);\n\n    //! Internal acquire read lock.\n    // only_speculate == true if we're doing a try_lock, else false.\n    void __TBB_EXPORTED_METHOD internal_acquire_reader(x86_rtm_rw_mutex::scoped_lock&, bool only_speculate=false);\n\n    //! Internal upgrade reader to become a writer.\n    bool __TBB_EXPORTED_METHOD internal_upgrade( x86_rtm_rw_mutex::scoped_lock& );\n\n    //! Out of line code for downgrading a writer to a reader.\n    bool __TBB_EXPORTED_METHOD internal_downgrade( x86_rtm_rw_mutex::scoped_lock& );\n\n    //! Internal try_acquire write lock.\n    bool __TBB_EXPORTED_METHOD internal_try_acquire_writer( x86_rtm_rw_mutex::scoped_lock& );\n\n    //! Internal release lock.\n    void __TBB_EXPORTED_METHOD internal_release( x86_rtm_rw_mutex::scoped_lock& );\n\n    static x86_rtm_rw_mutex* internal_get_mutex( const spin_rw_mutex::scoped_lock& lock )\n    {\n        return static_cast<x86_rtm_rw_mutex*>( lock.internal_get_mutex() );\n    }\n    static void internal_set_mutex( spin_rw_mutex::scoped_lock& lock, spin_rw_mutex* mtx )\n    {\n        lock.internal_set_mutex( mtx );\n    }\n    //! @endcond\npublic:\n    //! Construct unacquired mutex.\n    x86_rtm_rw_mutex() {\n        w_flag = false;\n#if TBB_USE_THREADING_TOOLS\n        internal_construct();\n#endif\n    }\n\n#if TBB_USE_ASSERT\n    //! Empty destructor.\n    ~x86_rtm_rw_mutex() {}\n#endif /* TBB_USE_ASSERT */\n\n    // Mutex traits\n    static const bool is_rw_mutex = true;\n    static const bool is_recursive_mutex = false;\n    static const bool is_fair_mutex = false;\n\n#if __TBB_USE_X86_RTM_RW_MUTEX || __TBB_GCC_VERSION < 40000\n#else\n    // by default we will not provide the scoped_lock interface.  The user\n    // should use the padded version of the mutex.  scoped_lock is used in\n    // padded_mutex template.\nprivate:\n#endif\n    //! The scoped locking pattern\n    /** It helps to avoid the common problem of forgetting to release lock.\n        It also nicely provides the \"node\" for queuing locks. */\n    // Speculation-enabled scoped lock for spin_rw_mutex\n    // The idea is to be able to reuse the acquire/release methods of spin_rw_mutex\n    // and its scoped lock wherever possible.  The only way to use a speculative lock is to use\n    // a scoped_lock. (because transaction_state must be local)\n\n    class scoped_lock : tbb::internal::no_copy {\n        friend class x86_rtm_rw_mutex;\n        spin_rw_mutex::scoped_lock my_scoped_lock;\n\n        RTM_type transaction_state;\n\n    public:\n        //! Construct lock that has not acquired a mutex.\n        /** Equivalent to zero-initialization of *this. */\n        scoped_lock() : my_scoped_lock(), transaction_state(RTM_not_in_mutex) {\n        }\n\n        //! Acquire lock on given mutex.\n        scoped_lock( x86_rtm_rw_mutex& m, bool write = true ) : my_scoped_lock(),\n            transaction_state(RTM_not_in_mutex) {\n            acquire(m, write);\n        }\n\n        //! Release lock (if lock is held).\n        ~scoped_lock() {\n            if(transaction_state != RTM_not_in_mutex) release();\n        }\n\n        //! Acquire lock on given mutex.\n        void acquire( x86_rtm_rw_mutex& m, bool write = true ) {\n            if( write ) m.internal_acquire_writer(*this);\n            else        m.internal_acquire_reader(*this);\n        }\n\n        //! Release lock\n        void release() {\n            x86_rtm_rw_mutex* mutex = x86_rtm_rw_mutex::internal_get_mutex(my_scoped_lock);\n            __TBB_ASSERT( mutex, \"lock is not acquired\" );\n            __TBB_ASSERT( transaction_state!=RTM_not_in_mutex, \"lock is not acquired\" );\n            return mutex->internal_release(*this);\n        }\n\n        //! Upgrade reader to become a writer.\n        /** Returns whether the upgrade happened without releasing and re-acquiring the lock */\n        bool upgrade_to_writer() {\n            x86_rtm_rw_mutex* mutex = x86_rtm_rw_mutex::internal_get_mutex(my_scoped_lock);\n            __TBB_ASSERT( mutex, \"lock is not acquired\" );\n            __TBB_ASSERT( transaction_state==RTM_transacting_reader || transaction_state==RTM_real_reader, \"Invalid state for upgrade\" );\n            return mutex->internal_upgrade(*this);\n        }\n\n        //! Downgrade writer to become a reader.\n        /** Returns whether the downgrade happened without releasing and re-acquiring the lock */\n        bool downgrade_to_reader() {\n            x86_rtm_rw_mutex* mutex = x86_rtm_rw_mutex::internal_get_mutex(my_scoped_lock);\n            __TBB_ASSERT( mutex, \"lock is not acquired\" );\n            __TBB_ASSERT( transaction_state==RTM_transacting_writer || transaction_state==RTM_real_writer, \"Invalid state for downgrade\" );\n            return mutex->internal_downgrade(*this);\n        }\n\n        //! Attempt to acquire mutex.\n        /** returns true if successful.  */\n        bool try_acquire( x86_rtm_rw_mutex& m, bool write = true ) {\n#if TBB_USE_ASSERT\n            x86_rtm_rw_mutex* mutex = x86_rtm_rw_mutex::internal_get_mutex(my_scoped_lock);\n            __TBB_ASSERT( !mutex, \"lock is already acquired\" );\n#endif\n            // have to assign m to our mutex.\n            // cannot set the mutex, because try_acquire in spin_rw_mutex depends on it being NULL.\n            if(write) return m.internal_try_acquire_writer(*this);\n            // speculatively acquire the lock.  If this fails, do try_acquire on the spin_rw_mutex.\n            m.internal_acquire_reader(*this, /*only_speculate=*/true);\n            if(transaction_state == RTM_transacting_reader) return true;\n            if( my_scoped_lock.try_acquire(m, false)) {\n                transaction_state = RTM_real_reader;\n                return true;\n            }\n            return false;\n        }\n\n        };  // class x86_rtm_rw_mutex::scoped_lock\n\n    // ISO C++0x compatibility methods not provided because we cannot maintain\n    // state about whether a thread is in a transaction.\n\nprivate:\n    char pad[speculation_granularity-sizeof(spin_rw_mutex)]; // padding\n\n    // If true, writer holds the spin_rw_mutex.\n    tbb::atomic<bool> w_flag;  // want this on a separate cache line\n\n};  // x86_rtm_rw_mutex\n\n}  // namespace internal\n}  // namespace interface8\n}  // namespace tbb\n\n#endif  /* __TBB_TSX_AVAILABLE */\n#endif /* __TBB__x86_rtm_rw_mutex_impl_H */\n"
  },
  {
    "path": "benchmarks/tbb/intrusive_list.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef _TBB_intrusive_list_H\n#define _TBB_intrusive_list_H\n\n#include \"tbb/tbb_stddef.h\"\n\nnamespace tbb {\nnamespace internal {\n\n//! Data structure to be inherited by the types that can form intrusive lists.\n/** Intrusive list is formed by means of the member_intrusive_list<T> template class.\n    Note that type T must derive from intrusive_list_node either publicly or \n    declare instantiation member_intrusive_list<T> as a friend.\n    This class implements a limited subset of std::list interface. **/\nstruct intrusive_list_node {\n    intrusive_list_node *my_prev_node,\n                        *my_next_node;\n#if TBB_USE_ASSERT\n    intrusive_list_node () { my_prev_node = my_next_node = this; }\n#endif /* TBB_USE_ASSERT */\n};\n\n//! List of element of type T, where T is derived from intrusive_list_node\n/** The class is not thread safe. **/\ntemplate <class List, class T>\nclass intrusive_list_base {\n    //! Pointer to the head node\n    intrusive_list_node my_head;\n\n    //! Number of list elements\n    size_t my_size;\n\n    static intrusive_list_node& node ( T& item ) { return List::node(item); }\n\n    static T& item ( intrusive_list_node* node ) { return List::item(node); }\n\n    template<class Iterator>\n    class iterator_impl {\n        Iterator& self () { return *static_cast<Iterator*>(this); }\n\n        //! Node the iterator points to at the moment\n        intrusive_list_node *my_pos;\n\n    protected:\n        iterator_impl (intrusive_list_node* pos )\n            :  my_pos(pos)\n        {}\n\n        T& item () const {\n            return intrusive_list_base::item(my_pos);\n        }\n\n    public:\n        iterator_impl () :  my_pos(NULL) {}\n\n        Iterator& operator = ( const Iterator& it ) {\n            return my_pos = it.my_pos;\n        }\n\n        Iterator& operator = ( const T& val ) {\n            return my_pos = &node(val);\n        }\n\n        bool operator == ( const Iterator& it ) const {\n            return my_pos == it.my_pos;\n        }\n\n        bool operator != ( const Iterator& it ) const {\n            return my_pos != it.my_pos;\n        }\n\n        Iterator& operator++ () {\n            my_pos = my_pos->my_next_node;\n            return self();\n        }\n\n        Iterator& operator-- () {\n            my_pos = my_pos->my_prev_node;\n            return self();\n        }\n\n        Iterator operator++ ( int ) {\n            Iterator result = self();\n            ++(*this);\n            return result;\n        }\n\n        Iterator operator-- ( int ) {\n            Iterator result = self();\n            --(*this);\n            return result;\n        }\n    }; // intrusive_list_base::iterator_impl\n\n    void assert_ok () const {\n        __TBB_ASSERT( (my_head.my_prev_node == &my_head && !my_size) || \n                      (my_head.my_next_node != &my_head && my_size >0), \"intrusive_list_base corrupted\" );\n#if TBB_USE_ASSERT >= 2\n        size_t i = 0;\n        for ( intrusive_list_node *n = my_head.my_next_node; n != &my_head; n = n->my_next_node )\n            ++i;\n        __TBB_ASSERT( my_size == i, \"Wrong size\" );\n#endif /* TBB_USE_ASSERT >= 2 */\n    }\n\npublic:\n    class iterator : public iterator_impl<iterator> {\n        template <class U, class V> friend class intrusive_list_base;\n    public:\n        iterator (intrusive_list_node* pos )\n            : iterator_impl<iterator>(pos )\n        {}\n        iterator () {}\n\n        T* operator-> () const { return &this->item(); }\n\n        T& operator* () const { return this->item(); }\n    }; // class iterator\n\n    class const_iterator : public iterator_impl<const_iterator> {\n        template <class U, class V> friend class intrusive_list_base;\n    public:\n        const_iterator (const intrusive_list_node* pos )\n            : iterator_impl<const_iterator>(const_cast<intrusive_list_node*>(pos) )\n        {}\n        const_iterator () {}\n\n        const T* operator-> () const { return &this->item(); }\n\n        const T& operator* () const { return this->item(); }\n    }; // class iterator\n\n    intrusive_list_base () : my_size(0) {\n        my_head.my_prev_node = &my_head;\n        my_head.my_next_node = &my_head;\n    }\n\n    bool empty () const { return my_head.my_next_node == &my_head; }\n\n    size_t size () const { return my_size; }\n\n    iterator begin () { return iterator(my_head.my_next_node); }\n\n    iterator end () { return iterator(&my_head); }\n\n    const_iterator begin () const { return const_iterator(my_head.my_next_node); }\n\n    const_iterator end () const { return const_iterator(&my_head); }\n\n    void push_front ( T& val ) {\n        __TBB_ASSERT( node(val).my_prev_node == &node(val) && node(val).my_next_node == &node(val), \n                    \"Object with intrusive list node can be part of only one intrusive list simultaneously\" );\n        // An object can be part of only one intrusive list at the given moment via the given node member \n        node(val).my_prev_node = &my_head;\n        node(val).my_next_node = my_head.my_next_node;\n        my_head.my_next_node->my_prev_node = &node(val);\n        my_head.my_next_node = &node(val);\n        ++my_size;\n        assert_ok();\n    }\n\n    void remove( T& val ) {\n        __TBB_ASSERT( node(val).my_prev_node != &node(val) && node(val).my_next_node != &node(val), \"Element to remove is not in the list\" );\n        __TBB_ASSERT( node(val).my_prev_node->my_next_node == &node(val) && node(val).my_next_node->my_prev_node == &node(val), \"Element to remove is not in the list\" );\n        --my_size;\n        node(val).my_next_node->my_prev_node = node(val).my_prev_node;\n        node(val).my_prev_node->my_next_node = node(val).my_next_node;\n#if TBB_USE_ASSERT\n        node(val).my_prev_node = node(val).my_next_node = &node(val);\n#endif\n        assert_ok();\n    }\n\n    iterator erase ( iterator it ) {\n        T& val = *it;\n        ++it;\n        remove( val );\n        return it;\n    }\n\n}; // intrusive_list_base\n\n\n//! Double linked list of items of type T containing a member of type intrusive_list_node.\n/** NodePtr is a member pointer to the node data field. Class U is either T or \n    a base class of T containing the node member. Default values exist for the sake\n    of a partial specialization working with inheritance case.\n\n    The list does not have ownership of its items. Its purpose is to avoid dynamic \n    memory allocation when forming lists of existing objects.\n\n    The class is not thread safe. **/\ntemplate <class T, class U, intrusive_list_node U::*NodePtr>\nclass memptr_intrusive_list : public intrusive_list_base<memptr_intrusive_list<T, U, NodePtr>, T>\n{\n    friend class intrusive_list_base<memptr_intrusive_list<T, U, NodePtr>, T>;\n\n    static intrusive_list_node& node ( T& val ) { return val.*NodePtr; }\n\n    static T& item ( intrusive_list_node* node ) {\n        // Cannot use __TBB_offsetof (and consequently __TBB_get_object_ref) macro \n        // with *NodePtr argument because gcc refuses to interpret pasted \"->\" and \"*\"\n        // as member pointer dereferencing operator, and explicit usage of ## in \n        // __TBB_offsetof implementation breaks operations with normal member names.\n        return *reinterpret_cast<T*>((char*)node - ((ptrdiff_t)&(reinterpret_cast<T*>(0x1000)->*NodePtr) - 0x1000));\n    }\n}; // intrusive_list<T, U, NodePtr>\n\n//! Double linked list of items of type T that is derived from intrusive_list_node class.\n/** The list does not have ownership of its items. Its purpose is to avoid dynamic \n    memory allocation when forming lists of existing objects.\n\n    The class is not thread safe. **/\ntemplate <class T>\nclass intrusive_list : public intrusive_list_base<intrusive_list<T>, T>\n{\n    friend class intrusive_list_base<intrusive_list<T>, T>;\n\n    static intrusive_list_node& node ( T& val ) { return val; }\n\n    static T& item ( intrusive_list_node* node ) { return *static_cast<T*>(node); }\n}; // intrusive_list<T>\n\n} // namespace internal\n} // namespace tbb\n\n#endif /* _TBB_intrusive_list_H */\n"
  },
  {
    "path": "benchmarks/tbb/itt_notify.cpp",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#if DO_ITT_NOTIFY\n\n#if _WIN32||_WIN64\n    #ifndef UNICODE\n        #define UNICODE\n    #endif\n#else\n    #pragma weak dlopen\n    #pragma weak dlsym\n    #pragma weak dlerror\n#endif /* WIN */\n\n#if __TBB_BUILD\n\nextern \"C\" void ITT_DoOneTimeInitialization();\n#define __itt_init_ittlib_name(x,y) (ITT_DoOneTimeInitialization(), true)\n\n#elif __TBBMALLOC_BUILD\n\nextern \"C\" void MallocInitializeITT();\n#define __itt_init_ittlib_name(x,y) (MallocInitializeITT(), true)\n\n#else\n#error This file is expected to be used for either TBB or TBB allocator build.\n#endif // __TBB_BUILD\n\n#include \"tools_api/ittnotify_static.c\"\n\nnamespace tbb {\nnamespace internal {\nint __TBB_load_ittnotify() {\n    return __itt_init_ittlib(NULL,          // groups for:\n      (__itt_group_id)(__itt_group_sync     // prepare/cancel/acquired/releasing\n                       | __itt_group_thread // name threads\n                       | __itt_group_stitch // stack stitching\n#if __TBB_CPF_BUILD\n                       | __itt_group_structure\n#endif\n                           ));\n}\n\n}} // namespaces\n\n#endif /* DO_ITT_NOTIFY */\n\n#define __TBB_NO_IMPLICIT_LINKAGE 1\n#include \"itt_notify.h\"\n\nnamespace tbb {\n\n#if DO_ITT_NOTIFY\n    const tchar \n            *SyncType_GlobalLock = _T(\"TbbGlobalLock\"),\n            *SyncType_Scheduler = _T(\"%Constant\")\n            ;\n    const tchar \n            *SyncObj_SchedulerInitialization = _T(\"TbbSchedulerInitialization\"),\n            *SyncObj_SchedulersList = _T(\"TbbSchedulersList\"),\n            *SyncObj_WorkerLifeCycleMgmt = _T(\"TBB Scheduler\"),\n            *SyncObj_TaskStealingLoop = _T(\"TBB Scheduler\"),\n            *SyncObj_WorkerTaskPool = _T(\"TBB Scheduler\"),\n            *SyncObj_MasterTaskPool = _T(\"TBB Scheduler\"),\n            *SyncObj_TaskPoolSpinning = _T(\"TBB Scheduler\"),\n            *SyncObj_Mailbox = _T(\"TBB Scheduler\"),\n            *SyncObj_TaskReturnList = _T(\"TBB Scheduler\"),\n            *SyncObj_TaskStream = _T(\"TBB Scheduler\"),\n            *SyncObj_ContextsList = _T(\"TBB Scheduler\")\n            ;\n#endif /* DO_ITT_NOTIFY */\n\n} // namespace tbb\n\n"
  },
  {
    "path": "benchmarks/tbb/itt_notify.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef _TBB_ITT_NOTIFY\n#define _TBB_ITT_NOTIFY\n\n#include \"tbb/tbb_stddef.h\"\n\n#if DO_ITT_NOTIFY\n\n#if _WIN32||_WIN64\n    #ifndef UNICODE\n        #define UNICODE\n    #endif\n#endif /* WIN */\n\n#ifndef INTEL_ITTNOTIFY_API_PRIVATE\n#define INTEL_ITTNOTIFY_API_PRIVATE\n#endif\n\n#include \"tools_api/ittnotify.h\"\n#include \"tools_api/legacy/ittnotify.h\"\nextern \"C\" void __itt_fini_ittlib(void);\n\n#if _WIN32||_WIN64\n    #undef _T\n    #undef __itt_event_create\n    #define __itt_event_create __itt_event_createA\n#endif /* WIN */\n\n\n#endif /* DO_ITT_NOTIFY */\n\n#if !ITT_CALLER_NULL\n#define ITT_CALLER_NULL ((__itt_caller)0)\n#endif\n\nnamespace tbb {\n//! Unicode support\n#if (_WIN32||_WIN64) && !__MINGW32__\n    //! Unicode character type. Always wchar_t on Windows.\n    /** We do not use typedefs from Windows TCHAR family to keep consistence of TBB coding style. **/\n    typedef wchar_t tchar;\n    //! Standard Windows macro to markup the string literals. \n    #define _T(string_literal) L ## string_literal\n#else /* !WIN */\n    typedef char tchar;\n    //! Standard Windows style macro to markup the string literals.\n    #define _T(string_literal) string_literal\n#endif /* !WIN */\n} // namespace tbb\n\n#if DO_ITT_NOTIFY\nnamespace tbb {\n    //! Display names of internal synchronization types\n    extern const tchar \n            *SyncType_GlobalLock,\n            *SyncType_Scheduler;\n    //! Display names of internal synchronization components/scenarios\n    extern const tchar \n            *SyncObj_SchedulerInitialization,\n            *SyncObj_SchedulersList,\n            *SyncObj_WorkerLifeCycleMgmt,\n            *SyncObj_TaskStealingLoop,\n            *SyncObj_WorkerTaskPool,\n            *SyncObj_MasterTaskPool,\n            *SyncObj_TaskPoolSpinning,\n            *SyncObj_Mailbox,\n            *SyncObj_TaskReturnList,\n            *SyncObj_TaskStream,\n            *SyncObj_ContextsList\n            ;\n\n    namespace internal {\n        void __TBB_EXPORTED_FUNC itt_set_sync_name_v3( void* obj, const tchar* name); \n\n    } // namespace internal\n\n} // namespace tbb\n\n// const_cast<void*>() is necessary to cast off volatility\n#define ITT_NOTIFY(name,obj)            __itt_notify_##name(const_cast<void*>(static_cast<volatile void*>(obj)))\n#define ITT_THREAD_SET_NAME(name)       __itt_thread_set_name(name)\n#define ITT_FINI_ITTLIB()               __itt_fini_ittlib()\n#define ITT_SYNC_CREATE(obj, type, name) __itt_sync_create((void*)(obj), type, name, 2)\n#define ITT_SYNC_RENAME(obj, name)      __itt_sync_rename(obj, name)\n#define ITT_STACK_CREATE(obj)           obj = __itt_stack_caller_create()\n#if __TBB_TASK_GROUP_CONTEXT\n#define ITT_STACK(precond, name, obj)   (precond) ? __itt_stack_##name(obj) : ((void)0);\n#else\n#define ITT_STACK(precond, name, obj)      ((void)0)\n#endif /* !__TBB_TASK_GROUP_CONTEXT */\n\n#else /* !DO_ITT_NOTIFY */\n\n#define ITT_NOTIFY(name,obj)            ((void)0)\n#define ITT_THREAD_SET_NAME(name)       ((void)0)\n#define ITT_FINI_ITTLIB()               ((void)0)\n#define ITT_SYNC_CREATE(obj, type, name) ((void)0)\n#define ITT_SYNC_RENAME(obj, name)      ((void)0)\n#define ITT_STACK_CREATE(obj)           ((void)0)\n#define ITT_STACK(precond, name, obj)   ((void)0)\n\n#endif /* !DO_ITT_NOTIFY */\n\nnamespace tbb {\nnamespace internal {\nint __TBB_load_ittnotify();\n}}\n\n#endif /* _TBB_ITT_NOTIFY */\n"
  },
  {
    "path": "benchmarks/tbb/lin32-tbb-export.def",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n{\nglobal:\n\n#define __TBB_SYMBOL( sym ) sym;\n#include \"lin32-tbb-export.lst\"\n\nlocal:\n\n/* TBB symbols */\n*3tbb*;\n*__TBB*;\n\n/* ITT symbols */\n__itt_*;\n\n/* Intel Compiler (libirc) symbols */\n__intel_*;\n_intel_*;\nget_memcpy_largest_cachelinesize;\nget_memcpy_largest_cache_size;\nget_mem_ops_method;\ninit_mem_ops_method;\nirc__get_msg;\nirc__print;\noverride_mem_ops_method;\nset_memcpy_largest_cachelinesize;\nset_memcpy_largest_cache_size;\n\n};\n"
  },
  {
    "path": "benchmarks/tbb/lin32-tbb-export.lst",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#include \"tbb/tbb_config.h\"\n\n/* cache_aligned_allocator.cpp */\n__TBB_SYMBOL( _ZN3tbb8internal12NFS_AllocateEjjPv )\n__TBB_SYMBOL( _ZN3tbb8internal15NFS_GetLineSizeEv )\n__TBB_SYMBOL( _ZN3tbb8internal8NFS_FreeEPv )\n__TBB_SYMBOL( _ZN3tbb8internal23allocate_via_handler_v3Ej )\n__TBB_SYMBOL( _ZN3tbb8internal25deallocate_via_handler_v3EPv )\n__TBB_SYMBOL( _ZN3tbb8internal17is_malloc_used_v3Ev )\n\n/* task.cpp v3 */\n__TBB_SYMBOL( _ZN3tbb4task13note_affinityEt )\n__TBB_SYMBOL( _ZN3tbb4task22internal_set_ref_countEi )\n__TBB_SYMBOL( _ZN3tbb4task28internal_decrement_ref_countEv )\n__TBB_SYMBOL( _ZN3tbb4task22spawn_and_wait_for_allERNS_9task_listE )\n__TBB_SYMBOL( _ZN3tbb4task4selfEv )\n__TBB_SYMBOL( _ZN3tbb10interface58internal9task_base7destroyERNS_4taskE )\n__TBB_SYMBOL( _ZNK3tbb4task26is_owned_by_current_threadEv )\n__TBB_SYMBOL( _ZN3tbb8internal19allocate_root_proxy4freeERNS_4taskE )\n__TBB_SYMBOL( _ZN3tbb8internal19allocate_root_proxy8allocateEj )\n__TBB_SYMBOL( _ZN3tbb8internal28affinity_partitioner_base_v36resizeEj )\n__TBB_SYMBOL( _ZNK3tbb8internal20allocate_child_proxy4freeERNS_4taskE )\n__TBB_SYMBOL( _ZNK3tbb8internal20allocate_child_proxy8allocateEj )\n__TBB_SYMBOL( _ZNK3tbb8internal27allocate_continuation_proxy4freeERNS_4taskE )\n__TBB_SYMBOL( _ZNK3tbb8internal27allocate_continuation_proxy8allocateEj )\n__TBB_SYMBOL( _ZNK3tbb8internal34allocate_additional_child_of_proxy4freeERNS_4taskE )\n__TBB_SYMBOL( _ZNK3tbb8internal34allocate_additional_child_of_proxy8allocateEj )\n__TBB_SYMBOL( _ZTIN3tbb4taskE )\n__TBB_SYMBOL( _ZTSN3tbb4taskE )\n__TBB_SYMBOL( _ZTVN3tbb4taskE )\n__TBB_SYMBOL( _ZN3tbb19task_scheduler_init19default_num_threadsEv )\n__TBB_SYMBOL( _ZN3tbb19task_scheduler_init10initializeEij )\n__TBB_SYMBOL( _ZN3tbb19task_scheduler_init10initializeEi )\n__TBB_SYMBOL( _ZN3tbb19task_scheduler_init9terminateEv )\n#if __TBB_SCHEDULER_OBSERVER\n__TBB_SYMBOL( _ZN3tbb8internal26task_scheduler_observer_v37observeEb )\n#endif /* __TBB_SCHEDULER_OBSERVER */\n__TBB_SYMBOL( _ZN3tbb10empty_task7executeEv )\n__TBB_SYMBOL( _ZN3tbb10empty_taskD0Ev )\n__TBB_SYMBOL( _ZN3tbb10empty_taskD1Ev )\n__TBB_SYMBOL( _ZTIN3tbb10empty_taskE )\n__TBB_SYMBOL( _ZTSN3tbb10empty_taskE )\n__TBB_SYMBOL( _ZTVN3tbb10empty_taskE )\n\n#if __TBB_TASK_ARENA\n/* arena.cpp */\n__TBB_SYMBOL( _ZN3tbb10interface78internal15task_arena_base19internal_initializeEv )\n__TBB_SYMBOL( _ZN3tbb10interface78internal15task_arena_base18internal_terminateEv )\n__TBB_SYMBOL( _ZNK3tbb10interface78internal15task_arena_base16internal_enqueueERNS_4taskEi )\n__TBB_SYMBOL( _ZNK3tbb10interface78internal15task_arena_base16internal_executeERNS1_13delegate_baseE )\n__TBB_SYMBOL( _ZNK3tbb10interface78internal15task_arena_base13internal_waitEv )\n__TBB_SYMBOL( _ZN3tbb10interface78internal15task_arena_base21internal_current_slotEv )\n#endif /* __TBB_TASK_ARENA */\n\n#if !TBB_NO_LEGACY\n/* task_v2.cpp */\n__TBB_SYMBOL( _ZN3tbb4task7destroyERS0_ )\n#endif /* !TBB_NO_LEGACY */\n\n/* Exception handling in task scheduler */\n#if __TBB_TASK_GROUP_CONTEXT\n__TBB_SYMBOL( _ZNK3tbb8internal32allocate_root_with_context_proxy8allocateEj )\n__TBB_SYMBOL( _ZNK3tbb8internal32allocate_root_with_context_proxy4freeERNS_4taskE )\n__TBB_SYMBOL( _ZN3tbb4task12change_groupERNS_18task_group_contextE )\n__TBB_SYMBOL( _ZNK3tbb18task_group_context28is_group_execution_cancelledEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_context22cancel_group_executionEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_context26register_pending_exceptionEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_context5resetEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_context19capture_fp_settingsEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_context4initEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_contextD1Ev )\n__TBB_SYMBOL( _ZN3tbb18task_group_contextD2Ev )\n#if __TBB_TASK_PRIORITY\n__TBB_SYMBOL( _ZN3tbb18task_group_context12set_priorityENS_10priority_tE )\n__TBB_SYMBOL( _ZNK3tbb18task_group_context8priorityEv )\n#endif /* __TBB_TASK_PRIORITY */\n__TBB_SYMBOL( _ZNK3tbb18captured_exception4nameEv )\n__TBB_SYMBOL( _ZNK3tbb18captured_exception4whatEv )\n__TBB_SYMBOL( _ZN3tbb18captured_exception10throw_selfEv )\n__TBB_SYMBOL( _ZN3tbb18captured_exception3setEPKcS2_ )\n__TBB_SYMBOL( _ZN3tbb18captured_exception4moveEv )\n__TBB_SYMBOL( _ZN3tbb18captured_exception5clearEv )\n__TBB_SYMBOL( _ZN3tbb18captured_exception7destroyEv )\n__TBB_SYMBOL( _ZN3tbb18captured_exception8allocateEPKcS2_ )\n__TBB_SYMBOL( _ZN3tbb18captured_exceptionD0Ev )\n__TBB_SYMBOL( _ZN3tbb18captured_exceptionD1Ev )\n__TBB_SYMBOL( _ZN3tbb18captured_exceptionD2Ev )\n__TBB_SYMBOL( _ZTIN3tbb18captured_exceptionE )\n__TBB_SYMBOL( _ZTSN3tbb18captured_exceptionE )\n__TBB_SYMBOL( _ZTVN3tbb18captured_exceptionE )\n__TBB_SYMBOL( _ZN3tbb13tbb_exceptionD2Ev )\n__TBB_SYMBOL( _ZTIN3tbb13tbb_exceptionE )\n__TBB_SYMBOL( _ZTSN3tbb13tbb_exceptionE )\n__TBB_SYMBOL( _ZTVN3tbb13tbb_exceptionE )\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n/* Symbols for exceptions thrown from TBB */\n__TBB_SYMBOL( _ZN3tbb8internal33throw_bad_last_alloc_exception_v4Ev )\n__TBB_SYMBOL( _ZN3tbb8internal18throw_exception_v4ENS0_12exception_idE )\n__TBB_SYMBOL( _ZN3tbb14bad_last_allocD0Ev )\n__TBB_SYMBOL( _ZN3tbb14bad_last_allocD1Ev )\n__TBB_SYMBOL( _ZNK3tbb14bad_last_alloc4whatEv )\n__TBB_SYMBOL( _ZTIN3tbb14bad_last_allocE )\n__TBB_SYMBOL( _ZTSN3tbb14bad_last_allocE )\n__TBB_SYMBOL( _ZTVN3tbb14bad_last_allocE )\n__TBB_SYMBOL( _ZN3tbb12missing_waitD0Ev )\n__TBB_SYMBOL( _ZN3tbb12missing_waitD1Ev )\n__TBB_SYMBOL( _ZNK3tbb12missing_wait4whatEv )\n__TBB_SYMBOL( _ZTIN3tbb12missing_waitE )\n__TBB_SYMBOL( _ZTSN3tbb12missing_waitE )\n__TBB_SYMBOL( _ZTVN3tbb12missing_waitE )\n__TBB_SYMBOL( _ZN3tbb27invalid_multiple_schedulingD0Ev )\n__TBB_SYMBOL( _ZN3tbb27invalid_multiple_schedulingD1Ev )\n__TBB_SYMBOL( _ZNK3tbb27invalid_multiple_scheduling4whatEv )\n__TBB_SYMBOL( _ZTIN3tbb27invalid_multiple_schedulingE )\n__TBB_SYMBOL( _ZTSN3tbb27invalid_multiple_schedulingE )\n__TBB_SYMBOL( _ZTVN3tbb27invalid_multiple_schedulingE )\n__TBB_SYMBOL( _ZN3tbb13improper_lockD0Ev )\n__TBB_SYMBOL( _ZN3tbb13improper_lockD1Ev )\n__TBB_SYMBOL( _ZNK3tbb13improper_lock4whatEv )\n__TBB_SYMBOL( _ZTIN3tbb13improper_lockE )\n__TBB_SYMBOL( _ZTSN3tbb13improper_lockE )\n__TBB_SYMBOL( _ZTVN3tbb13improper_lockE )\n__TBB_SYMBOL( _ZN3tbb10user_abortD0Ev )\n__TBB_SYMBOL( _ZN3tbb10user_abortD1Ev )\n__TBB_SYMBOL( _ZNK3tbb10user_abort4whatEv )\n__TBB_SYMBOL( _ZTIN3tbb10user_abortE )\n__TBB_SYMBOL( _ZTSN3tbb10user_abortE )\n__TBB_SYMBOL( _ZTVN3tbb10user_abortE )\n\n/* tbb_misc.cpp */\n__TBB_SYMBOL( _ZN3tbb17assertion_failureEPKciS1_S1_ )\n__TBB_SYMBOL( _ZN3tbb21set_assertion_handlerEPFvPKciS1_S1_E )\n__TBB_SYMBOL( _ZN3tbb8internal36get_initial_auto_partitioner_divisorEv )\n__TBB_SYMBOL( _ZN3tbb8internal13handle_perrorEiPKc )\n__TBB_SYMBOL( _ZN3tbb8internal15runtime_warningEPKcz )\n#if __TBB_x86_32\n__TBB_SYMBOL( __TBB_machine_store8_slow_perf_warning )\n__TBB_SYMBOL( __TBB_machine_store8_slow )\n#endif\n__TBB_SYMBOL( TBB_runtime_interface_version )\n\n/* tbb_main.cpp */\n__TBB_SYMBOL( _ZN3tbb8internal32itt_load_pointer_with_acquire_v3EPKv )\n__TBB_SYMBOL( _ZN3tbb8internal33itt_store_pointer_with_release_v3EPvS1_ )\n__TBB_SYMBOL( _ZN3tbb8internal18call_itt_notify_v5EiPv )\n__TBB_SYMBOL( _ZN3tbb8internal20itt_set_sync_name_v3EPvPKc )\n__TBB_SYMBOL( _ZN3tbb8internal19itt_load_pointer_v3EPKv )\n#if __TBB_ITT_STRUCTURE_API\n__TBB_SYMBOL( _ZN3tbb8internal22itt_make_task_group_v7ENS0_15itt_domain_enumEPvyS2_yNS0_12string_indexE )\n__TBB_SYMBOL( _ZN3tbb8internal23itt_metadata_str_add_v7ENS0_15itt_domain_enumEPvyNS0_12string_indexEPKc )\n__TBB_SYMBOL( _ZN3tbb8internal19itt_relation_add_v7ENS0_15itt_domain_enumEPvyNS0_12itt_relationES2_y )\n__TBB_SYMBOL( _ZN3tbb8internal17itt_task_begin_v7ENS0_15itt_domain_enumEPvyS2_yNS0_12string_indexE )\n__TBB_SYMBOL( _ZN3tbb8internal15itt_task_end_v7ENS0_15itt_domain_enumE )\n#endif\n\n/* pipeline.cpp */\n__TBB_SYMBOL( _ZTIN3tbb6filterE )\n__TBB_SYMBOL( _ZTSN3tbb6filterE )\n__TBB_SYMBOL( _ZTVN3tbb6filterE )\n__TBB_SYMBOL( _ZN3tbb6filterD2Ev )\n__TBB_SYMBOL( _ZN3tbb8pipeline10add_filterERNS_6filterE )\n__TBB_SYMBOL( _ZN3tbb8pipeline12inject_tokenERNS_4taskE )\n__TBB_SYMBOL( _ZN3tbb8pipeline13remove_filterERNS_6filterE )\n__TBB_SYMBOL( _ZN3tbb8pipeline3runEj )\n#if __TBB_TASK_GROUP_CONTEXT\n__TBB_SYMBOL( _ZN3tbb8pipeline3runEjRNS_18task_group_contextE )\n#endif\n__TBB_SYMBOL( _ZN3tbb8pipeline5clearEv )\n__TBB_SYMBOL( _ZN3tbb19thread_bound_filter12process_itemEv )\n__TBB_SYMBOL( _ZN3tbb19thread_bound_filter16try_process_itemEv )\n__TBB_SYMBOL( _ZTIN3tbb8pipelineE )\n__TBB_SYMBOL( _ZTSN3tbb8pipelineE )\n__TBB_SYMBOL( _ZTVN3tbb8pipelineE )\n__TBB_SYMBOL( _ZN3tbb8pipelineC1Ev )\n__TBB_SYMBOL( _ZN3tbb8pipelineC2Ev )\n__TBB_SYMBOL( _ZN3tbb8pipelineD0Ev )\n__TBB_SYMBOL( _ZN3tbb8pipelineD1Ev )\n__TBB_SYMBOL( _ZN3tbb8pipelineD2Ev )\n__TBB_SYMBOL( _ZN3tbb6filter16set_end_of_inputEv )\n\n/* queuing_rw_mutex.cpp */\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex18internal_constructEv )\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex11scoped_lock17upgrade_to_writerEv )\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex11scoped_lock19downgrade_to_readerEv )\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex11scoped_lock7acquireERS0_b )\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex11scoped_lock7releaseEv )\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex11scoped_lock11try_acquireERS0_b )\n\n/* reader_writer_lock.cpp */\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock11scoped_lock16internal_destroyEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock11scoped_lock18internal_constructERS1_ )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock13try_lock_readEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock16scoped_lock_read16internal_destroyEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock16scoped_lock_read18internal_constructERS1_ )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock16internal_destroyEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock18internal_constructEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock4lockEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock6unlockEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock8try_lockEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock9lock_readEv )\n\n#if !TBB_NO_LEGACY\n/* spin_rw_mutex.cpp v2 */\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex16internal_upgradeEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex22internal_itt_releasingEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex23internal_acquire_readerEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex23internal_acquire_writerEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex18internal_downgradeEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex23internal_release_readerEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex23internal_release_writerEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex27internal_try_acquire_readerEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex27internal_try_acquire_writerEPS0_ )\n#endif\n\n/* spin_rw_mutex v3 */\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v318internal_constructEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v316internal_upgradeEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v318internal_downgradeEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v323internal_acquire_readerEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v323internal_acquire_writerEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v323internal_release_readerEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v323internal_release_writerEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v327internal_try_acquire_readerEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v327internal_try_acquire_writerEv )\n\n// x86_rtm_rw_mutex.cpp\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex16internal_releaseERNS2_11scoped_lockE )\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex18internal_constructEv )\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex23internal_acquire_readerERNS2_11scoped_lockEb )\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex23internal_acquire_writerERNS2_11scoped_lockEb )\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex16internal_upgradeERNS2_11scoped_lockE )\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex18internal_downgradeERNS2_11scoped_lockE )\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex27internal_try_acquire_writerERNS2_11scoped_lockE )\n\n/* spin_mutex.cpp */\n__TBB_SYMBOL( _ZN3tbb10spin_mutex18internal_constructEv )\n__TBB_SYMBOL( _ZN3tbb10spin_mutex11scoped_lock16internal_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb10spin_mutex11scoped_lock16internal_releaseEv )\n__TBB_SYMBOL( _ZN3tbb10spin_mutex11scoped_lock20internal_try_acquireERS0_ )\n\n/* mutex.cpp */\n__TBB_SYMBOL( _ZN3tbb5mutex11scoped_lock16internal_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb5mutex11scoped_lock16internal_releaseEv )\n__TBB_SYMBOL( _ZN3tbb5mutex11scoped_lock20internal_try_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb5mutex16internal_destroyEv )\n__TBB_SYMBOL( _ZN3tbb5mutex18internal_constructEv )\n\n/* recursive_mutex.cpp */\n__TBB_SYMBOL( _ZN3tbb15recursive_mutex11scoped_lock16internal_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb15recursive_mutex11scoped_lock16internal_releaseEv )\n__TBB_SYMBOL( _ZN3tbb15recursive_mutex11scoped_lock20internal_try_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb15recursive_mutex16internal_destroyEv )\n__TBB_SYMBOL( _ZN3tbb15recursive_mutex18internal_constructEv )\n\n/* QueuingMutex.cpp */\n__TBB_SYMBOL( _ZN3tbb13queuing_mutex18internal_constructEv )\n__TBB_SYMBOL( _ZN3tbb13queuing_mutex11scoped_lock7acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb13queuing_mutex11scoped_lock7releaseEv )\n__TBB_SYMBOL( _ZN3tbb13queuing_mutex11scoped_lock11try_acquireERS0_ )\n\n/* critical_section.cpp */\n__TBB_SYMBOL( _ZN3tbb8internal19critical_section_v418internal_constructEv )\n\n#if !TBB_NO_LEGACY\n/* concurrent_hash_map */\n__TBB_SYMBOL( _ZNK3tbb8internal21hash_map_segment_base23internal_grow_predicateEv )\n\n/* concurrent_queue.cpp v2 */\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_base12internal_popEPv )\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_base13internal_pushEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_base21internal_set_capacityEij )\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_base23internal_pop_if_presentEPv )\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_base25internal_push_if_not_fullEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_baseC2Ej )\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_baseD2Ev )\n__TBB_SYMBOL( _ZTIN3tbb8internal21concurrent_queue_baseE )\n__TBB_SYMBOL( _ZTSN3tbb8internal21concurrent_queue_baseE )\n__TBB_SYMBOL( _ZTVN3tbb8internal21concurrent_queue_baseE )\n__TBB_SYMBOL( _ZN3tbb8internal30concurrent_queue_iterator_base6assignERKS1_ )\n__TBB_SYMBOL( _ZN3tbb8internal30concurrent_queue_iterator_base7advanceEv )\n__TBB_SYMBOL( _ZN3tbb8internal30concurrent_queue_iterator_baseC2ERKNS0_21concurrent_queue_baseE )\n__TBB_SYMBOL( _ZN3tbb8internal30concurrent_queue_iterator_baseD2Ev )\n__TBB_SYMBOL( _ZNK3tbb8internal21concurrent_queue_base13internal_sizeEv )\n#endif\n\n/* concurrent_queue v3 */\n/* constructors */\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v3C2Ej )\n__TBB_SYMBOL( _ZN3tbb8internal33concurrent_queue_iterator_base_v3C2ERKNS0_24concurrent_queue_base_v3E )\n__TBB_SYMBOL( _ZN3tbb8internal33concurrent_queue_iterator_base_v3C2ERKNS0_24concurrent_queue_base_v3Ej )\n/* destructors */\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v3D2Ev )\n__TBB_SYMBOL( _ZN3tbb8internal33concurrent_queue_iterator_base_v3D2Ev )\n/* typeinfo */\n__TBB_SYMBOL( _ZTIN3tbb8internal24concurrent_queue_base_v3E )\n__TBB_SYMBOL( _ZTSN3tbb8internal24concurrent_queue_base_v3E )\n/* vtable */\n__TBB_SYMBOL( _ZTVN3tbb8internal24concurrent_queue_base_v3E )\n/* methods */\n__TBB_SYMBOL( _ZN3tbb8internal33concurrent_queue_iterator_base_v37advanceEv )\n__TBB_SYMBOL( _ZN3tbb8internal33concurrent_queue_iterator_base_v36assignERKS1_ )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v313internal_pushEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v818internal_push_moveEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v325internal_push_if_not_fullEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v830internal_push_move_if_not_fullEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v312internal_popEPv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v323internal_pop_if_presentEPv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v314internal_abortEv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v321internal_set_capacityEij )\n__TBB_SYMBOL( _ZNK3tbb8internal24concurrent_queue_base_v313internal_sizeEv )\n__TBB_SYMBOL( _ZNK3tbb8internal24concurrent_queue_base_v314internal_emptyEv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v321internal_finish_clearEv )\n__TBB_SYMBOL( _ZNK3tbb8internal24concurrent_queue_base_v324internal_throw_exceptionEv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v36assignERKS1_ )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v812move_contentERS1_ )\n\n#if !TBB_NO_LEGACY\n/* concurrent_vector.cpp v2 */\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base13internal_copyERKS1_jPFvPvPKvjE )\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base14internal_clearEPFvPvjEb )\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base15internal_assignERKS1_jPFvPvjEPFvS4_PKvjESA_ )\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base16internal_grow_byEjjPFvPvjE )\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base16internal_reserveEjjj )\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base18internal_push_backEjRj )\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base25internal_grow_to_at_leastEjjPFvPvjE )\n__TBB_SYMBOL( _ZNK3tbb8internal22concurrent_vector_base17internal_capacityEv )\n#endif\n\n/* concurrent_vector v3 */\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v313internal_copyERKS1_jPFvPvPKvjE )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v314internal_clearEPFvPvjE )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v315internal_assignERKS1_jPFvPvjEPFvS4_PKvjESA_ )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v316internal_grow_byEjjPFvPvPKvjES4_ )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v316internal_reserveEjjj )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v318internal_push_backEjRj )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v325internal_grow_to_at_leastEjjPFvPvPKvjES4_ )\n__TBB_SYMBOL( _ZNK3tbb8internal25concurrent_vector_base_v317internal_capacityEv )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v316internal_compactEjPvPFvS2_jEPFvS2_PKvjE )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v313internal_swapERS1_ )\n__TBB_SYMBOL( _ZNK3tbb8internal25concurrent_vector_base_v324internal_throw_exceptionEj )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v3D2Ev )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v315internal_resizeEjjjPKvPFvPvjEPFvS4_S3_jE )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v337internal_grow_to_at_least_with_resultEjjPFvPvPKvjES4_ )\n\n/* tbb_thread */\n#if __MINGW32__\n__TBB_SYMBOL( _ZN3tbb8internal13tbb_thread_v314internal_startEPFjPvES2_ )\n#else\n__TBB_SYMBOL( _ZN3tbb8internal13tbb_thread_v314internal_startEPFPvS2_ES2_ )\n#endif\n__TBB_SYMBOL( _ZN3tbb8internal13tbb_thread_v320hardware_concurrencyEv )\n__TBB_SYMBOL( _ZN3tbb8internal13tbb_thread_v34joinEv )\n__TBB_SYMBOL( _ZN3tbb8internal13tbb_thread_v36detachEv )\n__TBB_SYMBOL( _ZN3tbb8internal15free_closure_v3EPv )\n__TBB_SYMBOL( _ZN3tbb8internal15thread_sleep_v3ERKNS_10tick_count10interval_tE )\n__TBB_SYMBOL( _ZN3tbb8internal15thread_yield_v3Ev )\n__TBB_SYMBOL( _ZN3tbb8internal16thread_get_id_v3Ev )\n__TBB_SYMBOL( _ZN3tbb8internal19allocate_closure_v3Ej )\n__TBB_SYMBOL( _ZN3tbb8internal7move_v3ERNS0_13tbb_thread_v3ES2_ )\n\n#if __MINGW32__\n/* condition_variable */\n__TBB_SYMBOL( _ZN3tbb10interface58internal32internal_condition_variable_waitERNS1_14condvar_impl_tEPNS_5mutexEPKNS_10tick_count10interval_tE )\n__TBB_SYMBOL( _ZN3tbb10interface58internal35internal_destroy_condition_variableERNS1_14condvar_impl_tE )\n__TBB_SYMBOL( _ZN3tbb10interface58internal38internal_condition_variable_notify_allERNS1_14condvar_impl_tE )\n__TBB_SYMBOL( _ZN3tbb10interface58internal38internal_condition_variable_notify_oneERNS1_14condvar_impl_tE )\n__TBB_SYMBOL( _ZN3tbb10interface58internal38internal_initialize_condition_variableERNS1_14condvar_impl_tE )\n#endif\n\n#undef __TBB_SYMBOL\n"
  },
  {
    "path": "benchmarks/tbb/lin64-tbb-export.def",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n{\nglobal:\n\n#define __TBB_SYMBOL( sym ) sym;\n#include \"lin64-tbb-export.lst\"\n\nlocal:\n\n/* TBB symbols */\n*3tbb*;\n*__TBB*;\n\n/* ITT symbols */\n__itt_*;\n\n/* Intel Compiler (libirc) symbols */\n__intel_*;\n_intel_*;\nget_msg_buf;\nget_text_buf;\nmessage_catalog;\nprint_buf;\nirc__get_msg;\nirc__print;\n\n};\n"
  },
  {
    "path": "benchmarks/tbb/lin64-tbb-export.lst",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#include \"tbb/tbb_config.h\"\n\n/* cache_aligned_allocator.cpp */\n__TBB_SYMBOL( _ZN3tbb8internal12NFS_AllocateEmmPv )\n__TBB_SYMBOL( _ZN3tbb8internal15NFS_GetLineSizeEv )\n__TBB_SYMBOL( _ZN3tbb8internal8NFS_FreeEPv )\n__TBB_SYMBOL( _ZN3tbb8internal23allocate_via_handler_v3Em )\n__TBB_SYMBOL( _ZN3tbb8internal25deallocate_via_handler_v3EPv )\n__TBB_SYMBOL( _ZN3tbb8internal17is_malloc_used_v3Ev )\n\n/* task.cpp v3 */\n__TBB_SYMBOL( _ZN3tbb4task13note_affinityEt )\n__TBB_SYMBOL( _ZN3tbb4task22internal_set_ref_countEi )\n__TBB_SYMBOL( _ZN3tbb4task28internal_decrement_ref_countEv )\n__TBB_SYMBOL( _ZN3tbb4task22spawn_and_wait_for_allERNS_9task_listE )\n__TBB_SYMBOL( _ZN3tbb4task4selfEv )\n__TBB_SYMBOL( _ZN3tbb10interface58internal9task_base7destroyERNS_4taskE )\n__TBB_SYMBOL( _ZNK3tbb4task26is_owned_by_current_threadEv )\n__TBB_SYMBOL( _ZN3tbb8internal19allocate_root_proxy4freeERNS_4taskE )\n__TBB_SYMBOL( _ZN3tbb8internal19allocate_root_proxy8allocateEm )\n__TBB_SYMBOL( _ZN3tbb8internal28affinity_partitioner_base_v36resizeEj )\n__TBB_SYMBOL( _ZNK3tbb8internal20allocate_child_proxy4freeERNS_4taskE )\n__TBB_SYMBOL( _ZNK3tbb8internal20allocate_child_proxy8allocateEm )\n__TBB_SYMBOL( _ZNK3tbb8internal27allocate_continuation_proxy4freeERNS_4taskE )\n__TBB_SYMBOL( _ZNK3tbb8internal27allocate_continuation_proxy8allocateEm )\n__TBB_SYMBOL( _ZNK3tbb8internal34allocate_additional_child_of_proxy4freeERNS_4taskE )\n__TBB_SYMBOL( _ZNK3tbb8internal34allocate_additional_child_of_proxy8allocateEm )\n__TBB_SYMBOL( _ZTIN3tbb4taskE )\n__TBB_SYMBOL( _ZTSN3tbb4taskE )\n__TBB_SYMBOL( _ZTVN3tbb4taskE )\n__TBB_SYMBOL( _ZN3tbb19task_scheduler_init19default_num_threadsEv )\n__TBB_SYMBOL( _ZN3tbb19task_scheduler_init10initializeEim )\n__TBB_SYMBOL( _ZN3tbb19task_scheduler_init10initializeEi )\n__TBB_SYMBOL( _ZN3tbb19task_scheduler_init9terminateEv )\n#if __TBB_SCHEDULER_OBSERVER\n__TBB_SYMBOL( _ZN3tbb8internal26task_scheduler_observer_v37observeEb )\n#endif /* __TBB_SCHEDULER_OBSERVER */\n__TBB_SYMBOL( _ZN3tbb10empty_task7executeEv )\n__TBB_SYMBOL( _ZN3tbb10empty_taskD0Ev )\n__TBB_SYMBOL( _ZN3tbb10empty_taskD1Ev )\n__TBB_SYMBOL( _ZTIN3tbb10empty_taskE )\n__TBB_SYMBOL( _ZTSN3tbb10empty_taskE )\n__TBB_SYMBOL( _ZTVN3tbb10empty_taskE )\n\n#if __TBB_TASK_ARENA\n/* arena.cpp */\n__TBB_SYMBOL( _ZN3tbb10interface78internal15task_arena_base19internal_initializeEv )\n__TBB_SYMBOL( _ZN3tbb10interface78internal15task_arena_base18internal_terminateEv )\n__TBB_SYMBOL( _ZNK3tbb10interface78internal15task_arena_base16internal_enqueueERNS_4taskEl )\n__TBB_SYMBOL( _ZNK3tbb10interface78internal15task_arena_base16internal_executeERNS1_13delegate_baseE )\n__TBB_SYMBOL( _ZNK3tbb10interface78internal15task_arena_base13internal_waitEv )\n__TBB_SYMBOL( _ZN3tbb10interface78internal15task_arena_base21internal_current_slotEv )\n#endif /* __TBB_TASK_ARENA */\n\n#if !TBB_NO_LEGACY\n/* task_v2.cpp */\n__TBB_SYMBOL( _ZN3tbb4task7destroyERS0_ )\n#endif /* !TBB_NO_LEGACY */\n\n/* Exception handling in task scheduler */\n#if __TBB_TASK_GROUP_CONTEXT\n__TBB_SYMBOL( _ZNK3tbb8internal32allocate_root_with_context_proxy8allocateEm )\n__TBB_SYMBOL( _ZNK3tbb8internal32allocate_root_with_context_proxy4freeERNS_4taskE )\n__TBB_SYMBOL( _ZN3tbb4task12change_groupERNS_18task_group_contextE )\n__TBB_SYMBOL( _ZNK3tbb18task_group_context28is_group_execution_cancelledEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_context22cancel_group_executionEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_context26register_pending_exceptionEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_context5resetEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_context19capture_fp_settingsEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_context4initEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_contextD1Ev )\n__TBB_SYMBOL( _ZN3tbb18task_group_contextD2Ev )\n#if __TBB_TASK_PRIORITY\n__TBB_SYMBOL( _ZN3tbb18task_group_context12set_priorityENS_10priority_tE )\n__TBB_SYMBOL( _ZNK3tbb18task_group_context8priorityEv )\n#endif /* __TBB_TASK_PRIORITY */\n__TBB_SYMBOL( _ZNK3tbb18captured_exception4nameEv )\n__TBB_SYMBOL( _ZNK3tbb18captured_exception4whatEv )\n__TBB_SYMBOL( _ZN3tbb18captured_exception10throw_selfEv )\n__TBB_SYMBOL( _ZN3tbb18captured_exception3setEPKcS2_ )\n__TBB_SYMBOL( _ZN3tbb18captured_exception4moveEv )\n__TBB_SYMBOL( _ZN3tbb18captured_exception5clearEv )\n__TBB_SYMBOL( _ZN3tbb18captured_exception7destroyEv )\n__TBB_SYMBOL( _ZN3tbb18captured_exception8allocateEPKcS2_ )\n__TBB_SYMBOL( _ZN3tbb18captured_exceptionD0Ev )\n__TBB_SYMBOL( _ZN3tbb18captured_exceptionD1Ev )\n__TBB_SYMBOL( _ZN3tbb18captured_exceptionD2Ev )\n__TBB_SYMBOL( _ZTIN3tbb18captured_exceptionE )\n__TBB_SYMBOL( _ZTSN3tbb18captured_exceptionE )\n__TBB_SYMBOL( _ZTVN3tbb18captured_exceptionE )\n__TBB_SYMBOL( _ZN3tbb13tbb_exceptionD2Ev )\n__TBB_SYMBOL( _ZTIN3tbb13tbb_exceptionE )\n__TBB_SYMBOL( _ZTSN3tbb13tbb_exceptionE )\n__TBB_SYMBOL( _ZTVN3tbb13tbb_exceptionE )\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n/* Symbols for exceptions thrown from TBB */\n__TBB_SYMBOL( _ZN3tbb8internal33throw_bad_last_alloc_exception_v4Ev )\n__TBB_SYMBOL( _ZN3tbb8internal18throw_exception_v4ENS0_12exception_idE )\n__TBB_SYMBOL( _ZN3tbb14bad_last_allocD0Ev )\n__TBB_SYMBOL( _ZN3tbb14bad_last_allocD1Ev )\n__TBB_SYMBOL( _ZNK3tbb14bad_last_alloc4whatEv )\n__TBB_SYMBOL( _ZTIN3tbb14bad_last_allocE )\n__TBB_SYMBOL( _ZTSN3tbb14bad_last_allocE )\n__TBB_SYMBOL( _ZTVN3tbb14bad_last_allocE )\n__TBB_SYMBOL( _ZN3tbb12missing_waitD0Ev )\n__TBB_SYMBOL( _ZN3tbb12missing_waitD1Ev )\n__TBB_SYMBOL( _ZNK3tbb12missing_wait4whatEv )\n__TBB_SYMBOL( _ZTIN3tbb12missing_waitE )\n__TBB_SYMBOL( _ZTSN3tbb12missing_waitE )\n__TBB_SYMBOL( _ZTVN3tbb12missing_waitE )\n__TBB_SYMBOL( _ZN3tbb27invalid_multiple_schedulingD0Ev )\n__TBB_SYMBOL( _ZN3tbb27invalid_multiple_schedulingD1Ev )\n__TBB_SYMBOL( _ZNK3tbb27invalid_multiple_scheduling4whatEv )\n__TBB_SYMBOL( _ZTIN3tbb27invalid_multiple_schedulingE )\n__TBB_SYMBOL( _ZTSN3tbb27invalid_multiple_schedulingE )\n__TBB_SYMBOL( _ZTVN3tbb27invalid_multiple_schedulingE )\n__TBB_SYMBOL( _ZN3tbb13improper_lockD0Ev )\n__TBB_SYMBOL( _ZN3tbb13improper_lockD1Ev )\n__TBB_SYMBOL( _ZNK3tbb13improper_lock4whatEv )\n__TBB_SYMBOL( _ZTIN3tbb13improper_lockE )\n__TBB_SYMBOL( _ZTSN3tbb13improper_lockE )\n__TBB_SYMBOL( _ZTVN3tbb13improper_lockE )\n__TBB_SYMBOL( _ZN3tbb10user_abortD0Ev )\n__TBB_SYMBOL( _ZN3tbb10user_abortD1Ev )\n__TBB_SYMBOL( _ZNK3tbb10user_abort4whatEv )\n__TBB_SYMBOL( _ZTIN3tbb10user_abortE )\n__TBB_SYMBOL( _ZTSN3tbb10user_abortE )\n__TBB_SYMBOL( _ZTVN3tbb10user_abortE )\n/* tbb_misc.cpp */\n__TBB_SYMBOL( _ZN3tbb17assertion_failureEPKciS1_S1_ )\n__TBB_SYMBOL( _ZN3tbb21set_assertion_handlerEPFvPKciS1_S1_E )\n__TBB_SYMBOL( _ZN3tbb8internal36get_initial_auto_partitioner_divisorEv )\n__TBB_SYMBOL( _ZN3tbb8internal13handle_perrorEiPKc )\n__TBB_SYMBOL( _ZN3tbb8internal15runtime_warningEPKcz )\n__TBB_SYMBOL( TBB_runtime_interface_version )\n\n/* tbb_main.cpp */\n__TBB_SYMBOL( _ZN3tbb8internal32itt_load_pointer_with_acquire_v3EPKv )\n__TBB_SYMBOL( _ZN3tbb8internal33itt_store_pointer_with_release_v3EPvS1_ )\n__TBB_SYMBOL( _ZN3tbb8internal18call_itt_notify_v5EiPv )\n__TBB_SYMBOL( _ZN3tbb8internal20itt_set_sync_name_v3EPvPKc )\n__TBB_SYMBOL( _ZN3tbb8internal19itt_load_pointer_v3EPKv )\n#if __TBB_ITT_STRUCTURE_API\n__TBB_SYMBOL( _ZN3tbb8internal23itt_metadata_str_add_v7ENS0_15itt_domain_enumEPvyNS0_12string_indexEPKc )\n__TBB_SYMBOL( _ZN3tbb8internal22itt_make_task_group_v7ENS0_15itt_domain_enumEPvyS2_yNS0_12string_indexE )\n__TBB_SYMBOL( _ZN3tbb8internal17itt_task_begin_v7ENS0_15itt_domain_enumEPvyS2_yNS0_12string_indexE )\n__TBB_SYMBOL( _ZN3tbb8internal19itt_relation_add_v7ENS0_15itt_domain_enumEPvyNS0_12itt_relationES2_y )\n__TBB_SYMBOL( _ZN3tbb8internal15itt_task_end_v7ENS0_15itt_domain_enumE )\n#endif\n\n/* pipeline.cpp */\n__TBB_SYMBOL( _ZTIN3tbb6filterE )\n__TBB_SYMBOL( _ZTSN3tbb6filterE )\n__TBB_SYMBOL( _ZTVN3tbb6filterE )\n__TBB_SYMBOL( _ZN3tbb6filterD2Ev )\n__TBB_SYMBOL( _ZN3tbb8pipeline10add_filterERNS_6filterE )\n__TBB_SYMBOL( _ZN3tbb8pipeline12inject_tokenERNS_4taskE )\n__TBB_SYMBOL( _ZN3tbb8pipeline13remove_filterERNS_6filterE )\n__TBB_SYMBOL( _ZN3tbb8pipeline3runEm )\n#if __TBB_TASK_GROUP_CONTEXT\n__TBB_SYMBOL( _ZN3tbb8pipeline3runEmRNS_18task_group_contextE )\n#endif\n__TBB_SYMBOL( _ZN3tbb8pipeline5clearEv )\n__TBB_SYMBOL( _ZN3tbb19thread_bound_filter12process_itemEv )\n__TBB_SYMBOL( _ZN3tbb19thread_bound_filter16try_process_itemEv )\n__TBB_SYMBOL( _ZTIN3tbb8pipelineE )\n__TBB_SYMBOL( _ZTSN3tbb8pipelineE )\n__TBB_SYMBOL( _ZTVN3tbb8pipelineE )\n__TBB_SYMBOL( _ZN3tbb8pipelineC1Ev )\n__TBB_SYMBOL( _ZN3tbb8pipelineC2Ev )\n__TBB_SYMBOL( _ZN3tbb8pipelineD0Ev )\n__TBB_SYMBOL( _ZN3tbb8pipelineD1Ev )\n__TBB_SYMBOL( _ZN3tbb8pipelineD2Ev )\n__TBB_SYMBOL( _ZN3tbb6filter16set_end_of_inputEv )\n\n/* queuing_rw_mutex.cpp */\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex18internal_constructEv )\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex11scoped_lock17upgrade_to_writerEv )\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex11scoped_lock19downgrade_to_readerEv )\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex11scoped_lock7acquireERS0_b )\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex11scoped_lock7releaseEv )\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex11scoped_lock11try_acquireERS0_b )\n\n/* reader_writer_lock.cpp */\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock11scoped_lock16internal_destroyEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock11scoped_lock18internal_constructERS1_ )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock13try_lock_readEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock16scoped_lock_read16internal_destroyEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock16scoped_lock_read18internal_constructERS1_ )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock16internal_destroyEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock18internal_constructEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock4lockEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock6unlockEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock8try_lockEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock9lock_readEv )\n\n#if !TBB_NO_LEGACY\n/* spin_rw_mutex.cpp v2 */\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex16internal_upgradeEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex22internal_itt_releasingEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex23internal_acquire_readerEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex23internal_acquire_writerEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex18internal_downgradeEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex23internal_release_readerEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex23internal_release_writerEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex27internal_try_acquire_readerEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex27internal_try_acquire_writerEPS0_ )\n#endif\n\n// x86_rtm_rw_mutex.cpp\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex18internal_constructEv )\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex23internal_acquire_writerERNS2_11scoped_lockEb )\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex27internal_try_acquire_writerERNS2_11scoped_lockE )\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex23internal_acquire_readerERNS2_11scoped_lockEb )\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex16internal_releaseERNS2_11scoped_lockE )\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex16internal_upgradeERNS2_11scoped_lockE )\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex18internal_downgradeERNS2_11scoped_lockE )\n\n/* spin_rw_mutex v3 */\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v318internal_constructEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v316internal_upgradeEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v318internal_downgradeEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v323internal_acquire_readerEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v323internal_acquire_writerEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v323internal_release_readerEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v323internal_release_writerEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v327internal_try_acquire_readerEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v327internal_try_acquire_writerEv )\n\n/* spin_mutex.cpp */\n__TBB_SYMBOL( _ZN3tbb10spin_mutex11scoped_lock16internal_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb10spin_mutex11scoped_lock16internal_releaseEv )\n__TBB_SYMBOL( _ZN3tbb10spin_mutex11scoped_lock20internal_try_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb10spin_mutex18internal_constructEv )\n\n/* mutex.cpp */\n__TBB_SYMBOL( _ZN3tbb5mutex11scoped_lock16internal_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb5mutex11scoped_lock16internal_releaseEv )\n__TBB_SYMBOL( _ZN3tbb5mutex11scoped_lock20internal_try_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb5mutex16internal_destroyEv )\n__TBB_SYMBOL( _ZN3tbb5mutex18internal_constructEv )\n\n/* recursive_mutex.cpp */\n__TBB_SYMBOL( _ZN3tbb15recursive_mutex11scoped_lock16internal_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb15recursive_mutex11scoped_lock16internal_releaseEv )\n__TBB_SYMBOL( _ZN3tbb15recursive_mutex11scoped_lock20internal_try_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb15recursive_mutex16internal_destroyEv )\n__TBB_SYMBOL( _ZN3tbb15recursive_mutex18internal_constructEv )\n\n/* QueuingMutex.cpp */\n__TBB_SYMBOL( _ZN3tbb13queuing_mutex18internal_constructEv )\n__TBB_SYMBOL( _ZN3tbb13queuing_mutex11scoped_lock7acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb13queuing_mutex11scoped_lock7releaseEv )\n__TBB_SYMBOL( _ZN3tbb13queuing_mutex11scoped_lock11try_acquireERS0_ )\n\n/* critical_section.cpp */\n__TBB_SYMBOL( _ZN3tbb8internal19critical_section_v418internal_constructEv )\n\n#if !TBB_NO_LEGACY\n/* concurrent_hash_map */\n__TBB_SYMBOL( _ZNK3tbb8internal21hash_map_segment_base23internal_grow_predicateEv )\n\n/* concurrent_queue.cpp v2 */\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_base12internal_popEPv )\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_base13internal_pushEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_base21internal_set_capacityElm )\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_base23internal_pop_if_presentEPv )\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_base25internal_push_if_not_fullEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_baseC2Em )\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_baseD2Ev )\n__TBB_SYMBOL( _ZTIN3tbb8internal21concurrent_queue_baseE )\n__TBB_SYMBOL( _ZTSN3tbb8internal21concurrent_queue_baseE )\n__TBB_SYMBOL( _ZTVN3tbb8internal21concurrent_queue_baseE )\n__TBB_SYMBOL( _ZN3tbb8internal30concurrent_queue_iterator_base6assignERKS1_ )\n__TBB_SYMBOL( _ZN3tbb8internal30concurrent_queue_iterator_base7advanceEv )\n__TBB_SYMBOL( _ZN3tbb8internal30concurrent_queue_iterator_baseC2ERKNS0_21concurrent_queue_baseE )\n__TBB_SYMBOL( _ZN3tbb8internal30concurrent_queue_iterator_baseD2Ev )\n__TBB_SYMBOL( _ZNK3tbb8internal21concurrent_queue_base13internal_sizeEv )\n#endif\n\n/* concurrent_queue v3 */\n/* constructors */\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v3C2Em )\n__TBB_SYMBOL( _ZN3tbb8internal33concurrent_queue_iterator_base_v3C2ERKNS0_24concurrent_queue_base_v3E )\n__TBB_SYMBOL( _ZN3tbb8internal33concurrent_queue_iterator_base_v3C2ERKNS0_24concurrent_queue_base_v3Em )\n/* destructors */\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v3D2Ev )\n__TBB_SYMBOL( _ZN3tbb8internal33concurrent_queue_iterator_base_v3D2Ev )\n/* typeinfo */\n__TBB_SYMBOL( _ZTIN3tbb8internal24concurrent_queue_base_v3E )\n__TBB_SYMBOL( _ZTSN3tbb8internal24concurrent_queue_base_v3E )\n/* vtable */\n__TBB_SYMBOL( _ZTVN3tbb8internal24concurrent_queue_base_v3E )\n/* methods */\n__TBB_SYMBOL( _ZN3tbb8internal33concurrent_queue_iterator_base_v36assignERKS1_ )\n__TBB_SYMBOL( _ZN3tbb8internal33concurrent_queue_iterator_base_v37advanceEv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v313internal_pushEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v818internal_push_moveEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v325internal_push_if_not_fullEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v830internal_push_move_if_not_fullEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v312internal_popEPv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v323internal_pop_if_presentEPv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v314internal_abortEv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v321internal_finish_clearEv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v321internal_set_capacityElm )\n__TBB_SYMBOL( _ZNK3tbb8internal24concurrent_queue_base_v313internal_sizeEv )\n__TBB_SYMBOL( _ZNK3tbb8internal24concurrent_queue_base_v314internal_emptyEv )\n__TBB_SYMBOL( _ZNK3tbb8internal24concurrent_queue_base_v324internal_throw_exceptionEv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v36assignERKS1_ )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v812move_contentERS1_ )\n\n#if !TBB_NO_LEGACY\n/* concurrent_vector.cpp v2 */\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base13internal_copyERKS1_mPFvPvPKvmE )\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base14internal_clearEPFvPvmEb )\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base15internal_assignERKS1_mPFvPvmEPFvS4_PKvmESA_ )\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base16internal_grow_byEmmPFvPvmE )\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base16internal_reserveEmmm )\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base18internal_push_backEmRm )\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base25internal_grow_to_at_leastEmmPFvPvmE )\n__TBB_SYMBOL( _ZNK3tbb8internal22concurrent_vector_base17internal_capacityEv )\n#endif\n\n/* concurrent_vector v3 */\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v313internal_copyERKS1_mPFvPvPKvmE )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v314internal_clearEPFvPvmE )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v315internal_assignERKS1_mPFvPvmEPFvS4_PKvmESA_ )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v316internal_grow_byEmmPFvPvPKvmES4_ )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v316internal_reserveEmmm )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v318internal_push_backEmRm )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v325internal_grow_to_at_leastEmmPFvPvPKvmES4_ )\n__TBB_SYMBOL( _ZNK3tbb8internal25concurrent_vector_base_v317internal_capacityEv )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v316internal_compactEmPvPFvS2_mEPFvS2_PKvmE )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v313internal_swapERS1_ )\n__TBB_SYMBOL( _ZNK3tbb8internal25concurrent_vector_base_v324internal_throw_exceptionEm )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v3D2Ev )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v315internal_resizeEmmmPKvPFvPvmEPFvS4_S3_mE )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v337internal_grow_to_at_least_with_resultEmmPFvPvPKvmES4_ )\n\n/* tbb_thread */\n__TBB_SYMBOL( _ZN3tbb8internal13tbb_thread_v320hardware_concurrencyEv )\n__TBB_SYMBOL( _ZN3tbb8internal13tbb_thread_v36detachEv )\n__TBB_SYMBOL( _ZN3tbb8internal16thread_get_id_v3Ev )\n__TBB_SYMBOL( _ZN3tbb8internal15free_closure_v3EPv )\n__TBB_SYMBOL( _ZN3tbb8internal13tbb_thread_v34joinEv )\n__TBB_SYMBOL( _ZN3tbb8internal13tbb_thread_v314internal_startEPFPvS2_ES2_ )\n__TBB_SYMBOL( _ZN3tbb8internal19allocate_closure_v3Em )\n__TBB_SYMBOL( _ZN3tbb8internal7move_v3ERNS0_13tbb_thread_v3ES2_ )\n__TBB_SYMBOL( _ZN3tbb8internal15thread_yield_v3Ev )\n__TBB_SYMBOL( _ZN3tbb8internal15thread_sleep_v3ERKNS_10tick_count10interval_tE )\n\n#undef __TBB_SYMBOL\n"
  },
  {
    "path": "benchmarks/tbb/lin64ipf-tbb-export.def",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n{\nglobal:\n\n#define __TBB_SYMBOL( sym ) sym;\n#include \"lin64ipf-tbb-export.lst\"\n\nlocal:\n\n/* TBB symbols */\n*3tbb*;\n*__TBB*;\n\n/* ITT symbols */\n__itt_*;\n\n/* Intel Compiler (libirc) symbols */\n__intel_*;\n_intel_*;\n?0_memcopyA;\n?0_memcopyDu;\n?0_memcpyD;\n?1__memcpy;\n?1__memmove;\n?1__serial_memmove;\nmemcpy;\nmemset;\n\n};\n"
  },
  {
    "path": "benchmarks/tbb/lin64ipf-tbb-export.lst",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#include \"tbb/tbb_config.h\"\n\n/* cache_aligned_allocator.cpp */\n__TBB_SYMBOL( _ZN3tbb8internal12NFS_AllocateEmmPv )\n__TBB_SYMBOL( _ZN3tbb8internal15NFS_GetLineSizeEv )\n__TBB_SYMBOL( _ZN3tbb8internal8NFS_FreeEPv )\n__TBB_SYMBOL( _ZN3tbb8internal23allocate_via_handler_v3Em )\n__TBB_SYMBOL( _ZN3tbb8internal25deallocate_via_handler_v3EPv )\n__TBB_SYMBOL( _ZN3tbb8internal17is_malloc_used_v3Ev )\n\n/* task.cpp v3 */\n__TBB_SYMBOL( _ZN3tbb4task13note_affinityEt )\n__TBB_SYMBOL( _ZN3tbb4task22internal_set_ref_countEi )\n__TBB_SYMBOL( _ZN3tbb4task28internal_decrement_ref_countEv )\n__TBB_SYMBOL( _ZN3tbb4task22spawn_and_wait_for_allERNS_9task_listE )\n__TBB_SYMBOL( _ZN3tbb4task4selfEv )\n__TBB_SYMBOL( _ZN3tbb10interface58internal9task_base7destroyERNS_4taskE )\n__TBB_SYMBOL( _ZNK3tbb4task26is_owned_by_current_threadEv )\n__TBB_SYMBOL( _ZN3tbb8internal19allocate_root_proxy4freeERNS_4taskE )\n__TBB_SYMBOL( _ZN3tbb8internal19allocate_root_proxy8allocateEm )\n__TBB_SYMBOL( _ZN3tbb8internal28affinity_partitioner_base_v36resizeEj )\n__TBB_SYMBOL( _ZNK3tbb8internal20allocate_child_proxy4freeERNS_4taskE )\n__TBB_SYMBOL( _ZNK3tbb8internal20allocate_child_proxy8allocateEm )\n__TBB_SYMBOL( _ZNK3tbb8internal27allocate_continuation_proxy4freeERNS_4taskE )\n__TBB_SYMBOL( _ZNK3tbb8internal27allocate_continuation_proxy8allocateEm )\n__TBB_SYMBOL( _ZNK3tbb8internal34allocate_additional_child_of_proxy4freeERNS_4taskE )\n__TBB_SYMBOL( _ZNK3tbb8internal34allocate_additional_child_of_proxy8allocateEm )\n__TBB_SYMBOL( _ZTIN3tbb4taskE )\n__TBB_SYMBOL( _ZTSN3tbb4taskE )\n__TBB_SYMBOL( _ZTVN3tbb4taskE )\n__TBB_SYMBOL( _ZN3tbb19task_scheduler_init19default_num_threadsEv )\n__TBB_SYMBOL( _ZN3tbb19task_scheduler_init10initializeEim )\n__TBB_SYMBOL( _ZN3tbb19task_scheduler_init10initializeEi )\n__TBB_SYMBOL( _ZN3tbb19task_scheduler_init9terminateEv )\n#if __TBB_SCHEDULER_OBSERVER\n__TBB_SYMBOL( _ZN3tbb8internal26task_scheduler_observer_v37observeEb )\n#endif /* __TBB_SCHEDULER_OBSERVER */\n__TBB_SYMBOL( _ZN3tbb10empty_task7executeEv )\n__TBB_SYMBOL( _ZN3tbb10empty_taskD0Ev )\n__TBB_SYMBOL( _ZN3tbb10empty_taskD1Ev )\n__TBB_SYMBOL( _ZTIN3tbb10empty_taskE )\n__TBB_SYMBOL( _ZTSN3tbb10empty_taskE )\n__TBB_SYMBOL( _ZTVN3tbb10empty_taskE )\n\n#if __TBB_TASK_ARENA\n/* arena.cpp */\n__TBB_SYMBOL( _ZN3tbb10interface78internal15task_arena_base19internal_initializeEv )\n__TBB_SYMBOL( _ZN3tbb10interface78internal15task_arena_base18internal_terminateEv )\n__TBB_SYMBOL( _ZNK3tbb10interface78internal15task_arena_base16internal_enqueueERNS_4taskEl )\n__TBB_SYMBOL( _ZNK3tbb10interface78internal15task_arena_base16internal_executeERNS1_13delegate_baseE )\n__TBB_SYMBOL( _ZNK3tbb10interface78internal15task_arena_base13internal_waitEv )\n__TBB_SYMBOL( _ZN3tbb10interface78internal15task_arena_base21internal_current_slotEv )\n#endif /* __TBB_TASK_ARENA */\n\n#if !TBB_NO_LEGACY\n/* task_v2.cpp */\n__TBB_SYMBOL( _ZN3tbb4task7destroyERS0_ )\n#endif /* !TBB_NO_LEGACY */\n\n/* Exception handling in task scheduler */\n#if __TBB_TASK_GROUP_CONTEXT\n__TBB_SYMBOL( _ZNK3tbb8internal32allocate_root_with_context_proxy8allocateEm )\n__TBB_SYMBOL( _ZNK3tbb8internal32allocate_root_with_context_proxy4freeERNS_4taskE )\n__TBB_SYMBOL( _ZN3tbb4task12change_groupERNS_18task_group_contextE )\n__TBB_SYMBOL( _ZNK3tbb18task_group_context28is_group_execution_cancelledEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_context22cancel_group_executionEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_context26register_pending_exceptionEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_context5resetEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_context19capture_fp_settingsEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_context4initEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_contextD1Ev )\n__TBB_SYMBOL( _ZN3tbb18task_group_contextD2Ev )\n#if __TBB_TASK_PRIORITY\n__TBB_SYMBOL( _ZN3tbb18task_group_context12set_priorityENS_10priority_tE )\n__TBB_SYMBOL( _ZNK3tbb18task_group_context8priorityEv )\n#endif /* __TBB_TASK_PRIORITY */\n__TBB_SYMBOL( _ZNK3tbb18captured_exception4nameEv )\n__TBB_SYMBOL( _ZNK3tbb18captured_exception4whatEv )\n__TBB_SYMBOL( _ZN3tbb18captured_exception10throw_selfEv )\n__TBB_SYMBOL( _ZN3tbb18captured_exception3setEPKcS2_ )\n__TBB_SYMBOL( _ZN3tbb18captured_exception4moveEv )\n__TBB_SYMBOL( _ZN3tbb18captured_exception5clearEv )\n__TBB_SYMBOL( _ZN3tbb18captured_exception7destroyEv )\n__TBB_SYMBOL( _ZN3tbb18captured_exception8allocateEPKcS2_ )\n__TBB_SYMBOL( _ZN3tbb18captured_exceptionD0Ev )\n__TBB_SYMBOL( _ZN3tbb18captured_exceptionD1Ev )\n__TBB_SYMBOL( _ZN3tbb18captured_exceptionD2Ev )\n__TBB_SYMBOL( _ZTIN3tbb18captured_exceptionE )\n__TBB_SYMBOL( _ZTSN3tbb18captured_exceptionE )\n__TBB_SYMBOL( _ZTVN3tbb18captured_exceptionE )\n__TBB_SYMBOL( _ZN3tbb13tbb_exceptionD2Ev )\n__TBB_SYMBOL( _ZTIN3tbb13tbb_exceptionE )\n__TBB_SYMBOL( _ZTSN3tbb13tbb_exceptionE )\n__TBB_SYMBOL( _ZTVN3tbb13tbb_exceptionE )\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n/* Symbols for exceptions thrown from TBB */\n__TBB_SYMBOL( _ZN3tbb8internal33throw_bad_last_alloc_exception_v4Ev )\n__TBB_SYMBOL( _ZN3tbb8internal18throw_exception_v4ENS0_12exception_idE )\n__TBB_SYMBOL( _ZN3tbb14bad_last_allocD0Ev )\n__TBB_SYMBOL( _ZN3tbb14bad_last_allocD1Ev )\n__TBB_SYMBOL( _ZNK3tbb14bad_last_alloc4whatEv )\n__TBB_SYMBOL( _ZTIN3tbb14bad_last_allocE )\n__TBB_SYMBOL( _ZTSN3tbb14bad_last_allocE )\n__TBB_SYMBOL( _ZTVN3tbb14bad_last_allocE )\n__TBB_SYMBOL( _ZN3tbb12missing_waitD0Ev )\n__TBB_SYMBOL( _ZN3tbb12missing_waitD1Ev )\n__TBB_SYMBOL( _ZNK3tbb12missing_wait4whatEv )\n__TBB_SYMBOL( _ZTIN3tbb12missing_waitE )\n__TBB_SYMBOL( _ZTSN3tbb12missing_waitE )\n__TBB_SYMBOL( _ZTVN3tbb12missing_waitE )\n__TBB_SYMBOL( _ZN3tbb27invalid_multiple_schedulingD0Ev )\n__TBB_SYMBOL( _ZN3tbb27invalid_multiple_schedulingD1Ev )\n__TBB_SYMBOL( _ZNK3tbb27invalid_multiple_scheduling4whatEv )\n__TBB_SYMBOL( _ZTIN3tbb27invalid_multiple_schedulingE )\n__TBB_SYMBOL( _ZTSN3tbb27invalid_multiple_schedulingE )\n__TBB_SYMBOL( _ZTVN3tbb27invalid_multiple_schedulingE )\n__TBB_SYMBOL( _ZN3tbb13improper_lockD0Ev )\n__TBB_SYMBOL( _ZN3tbb13improper_lockD1Ev )\n__TBB_SYMBOL( _ZNK3tbb13improper_lock4whatEv )\n__TBB_SYMBOL( _ZTIN3tbb13improper_lockE )\n__TBB_SYMBOL( _ZTSN3tbb13improper_lockE )\n__TBB_SYMBOL( _ZTVN3tbb13improper_lockE )\n__TBB_SYMBOL( _ZN3tbb10user_abortD0Ev )\n__TBB_SYMBOL( _ZN3tbb10user_abortD1Ev )\n__TBB_SYMBOL( _ZNK3tbb10user_abort4whatEv )\n__TBB_SYMBOL( _ZTIN3tbb10user_abortE )\n__TBB_SYMBOL( _ZTSN3tbb10user_abortE )\n__TBB_SYMBOL( _ZTVN3tbb10user_abortE )\n\n/* tbb_misc.cpp */\n__TBB_SYMBOL( _ZN3tbb17assertion_failureEPKciS1_S1_ )\n__TBB_SYMBOL( _ZN3tbb21set_assertion_handlerEPFvPKciS1_S1_E )\n__TBB_SYMBOL( _ZN3tbb8internal36get_initial_auto_partitioner_divisorEv )\n__TBB_SYMBOL( _ZN3tbb8internal13handle_perrorEiPKc )\n__TBB_SYMBOL( _ZN3tbb8internal15runtime_warningEPKcz )\n__TBB_SYMBOL( TBB_runtime_interface_version )\n\n/* tbb_main.cpp */\n__TBB_SYMBOL( _ZN3tbb8internal32itt_load_pointer_with_acquire_v3EPKv )\n__TBB_SYMBOL( _ZN3tbb8internal33itt_store_pointer_with_release_v3EPvS1_ )\n__TBB_SYMBOL( _ZN3tbb8internal18call_itt_notify_v5EiPv )\n__TBB_SYMBOL( _ZN3tbb8internal20itt_set_sync_name_v3EPvPKc )\n__TBB_SYMBOL( _ZN3tbb8internal19itt_load_pointer_v3EPKv )\n\n/* pipeline.cpp */\n__TBB_SYMBOL( _ZTIN3tbb6filterE )\n__TBB_SYMBOL( _ZTSN3tbb6filterE )\n__TBB_SYMBOL( _ZTVN3tbb6filterE )\n__TBB_SYMBOL( _ZN3tbb6filterD2Ev )\n__TBB_SYMBOL( _ZN3tbb8pipeline10add_filterERNS_6filterE )\n__TBB_SYMBOL( _ZN3tbb8pipeline12inject_tokenERNS_4taskE )\n__TBB_SYMBOL( _ZN3tbb8pipeline13remove_filterERNS_6filterE )\n__TBB_SYMBOL( _ZN3tbb8pipeline3runEm )\n#if __TBB_TASK_GROUP_CONTEXT\n__TBB_SYMBOL( _ZN3tbb8pipeline3runEmRNS_18task_group_contextE )\n#endif\n__TBB_SYMBOL( _ZN3tbb8pipeline5clearEv )\n__TBB_SYMBOL( _ZN3tbb19thread_bound_filter12process_itemEv )\n__TBB_SYMBOL( _ZN3tbb19thread_bound_filter16try_process_itemEv )\n__TBB_SYMBOL( _ZTIN3tbb8pipelineE )\n__TBB_SYMBOL( _ZTSN3tbb8pipelineE )\n__TBB_SYMBOL( _ZTVN3tbb8pipelineE )\n__TBB_SYMBOL( _ZN3tbb8pipelineC1Ev )\n__TBB_SYMBOL( _ZN3tbb8pipelineC2Ev )\n__TBB_SYMBOL( _ZN3tbb8pipelineD0Ev )\n__TBB_SYMBOL( _ZN3tbb8pipelineD1Ev )\n__TBB_SYMBOL( _ZN3tbb8pipelineD2Ev )\n__TBB_SYMBOL( _ZN3tbb6filter16set_end_of_inputEv )\n\n/* queuing_rw_mutex.cpp */\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex18internal_constructEv )\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex11scoped_lock17upgrade_to_writerEv )\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex11scoped_lock19downgrade_to_readerEv )\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex11scoped_lock7acquireERS0_b )\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex11scoped_lock7releaseEv )\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex11scoped_lock11try_acquireERS0_b )\n\n/* reader_writer_lock.cpp */\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock11scoped_lock16internal_destroyEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock11scoped_lock18internal_constructERS1_ )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock13try_lock_readEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock16scoped_lock_read16internal_destroyEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock16scoped_lock_read18internal_constructERS1_ )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock16internal_destroyEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock18internal_constructEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock4lockEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock6unlockEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock8try_lockEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock9lock_readEv )\n\n#if !TBB_NO_LEGACY\n/* spin_rw_mutex.cpp v2 */\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex16internal_upgradeEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex22internal_itt_releasingEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex23internal_acquire_readerEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex23internal_acquire_writerEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex18internal_downgradeEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex23internal_release_readerEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex23internal_release_writerEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex27internal_try_acquire_readerEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex27internal_try_acquire_writerEPS0_ )\n#endif\n\n/* spin_rw_mutex v3 */\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v318internal_constructEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v316internal_upgradeEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v318internal_downgradeEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v323internal_acquire_readerEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v323internal_acquire_writerEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v323internal_release_readerEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v323internal_release_writerEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v327internal_try_acquire_readerEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v327internal_try_acquire_writerEv )\n\n/* spin_mutex.cpp */\n__TBB_SYMBOL( _ZN3tbb10spin_mutex18internal_constructEv )\n__TBB_SYMBOL( _ZN3tbb10spin_mutex11scoped_lock16internal_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb10spin_mutex11scoped_lock16internal_releaseEv )\n__TBB_SYMBOL( _ZN3tbb10spin_mutex11scoped_lock20internal_try_acquireERS0_ )\n\n/* mutex.cpp */\n__TBB_SYMBOL( _ZN3tbb5mutex11scoped_lock16internal_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb5mutex11scoped_lock16internal_releaseEv )\n__TBB_SYMBOL( _ZN3tbb5mutex11scoped_lock20internal_try_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb5mutex16internal_destroyEv )\n__TBB_SYMBOL( _ZN3tbb5mutex18internal_constructEv )\n\n/* recursive_mutex.cpp */\n__TBB_SYMBOL( _ZN3tbb15recursive_mutex11scoped_lock16internal_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb15recursive_mutex11scoped_lock16internal_releaseEv )\n__TBB_SYMBOL( _ZN3tbb15recursive_mutex11scoped_lock20internal_try_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb15recursive_mutex16internal_destroyEv )\n__TBB_SYMBOL( _ZN3tbb15recursive_mutex18internal_constructEv )\n\n/* QueuingMutex.cpp */\n__TBB_SYMBOL( _ZN3tbb13queuing_mutex18internal_constructEv )\n__TBB_SYMBOL( _ZN3tbb13queuing_mutex11scoped_lock7acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb13queuing_mutex11scoped_lock7releaseEv )\n__TBB_SYMBOL( _ZN3tbb13queuing_mutex11scoped_lock11try_acquireERS0_ )\n\n/* critical_section.cpp */\n__TBB_SYMBOL( _ZN3tbb8internal19critical_section_v418internal_constructEv )\n\n#if !TBB_NO_LEGACY\n/* concurrent_hash_map */\n__TBB_SYMBOL( _ZNK3tbb8internal21hash_map_segment_base23internal_grow_predicateEv )\n\n/* concurrent_queue.cpp v2 */\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_base12internal_popEPv )\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_base13internal_pushEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_base21internal_set_capacityElm )\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_base23internal_pop_if_presentEPv )\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_base25internal_push_if_not_fullEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_baseC2Em )\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_baseD2Ev )\n__TBB_SYMBOL( _ZTIN3tbb8internal21concurrent_queue_baseE )\n__TBB_SYMBOL( _ZTSN3tbb8internal21concurrent_queue_baseE )\n__TBB_SYMBOL( _ZTVN3tbb8internal21concurrent_queue_baseE )\n__TBB_SYMBOL( _ZN3tbb8internal30concurrent_queue_iterator_base6assignERKS1_ )\n__TBB_SYMBOL( _ZN3tbb8internal30concurrent_queue_iterator_base7advanceEv )\n__TBB_SYMBOL( _ZN3tbb8internal30concurrent_queue_iterator_baseC2ERKNS0_21concurrent_queue_baseE )\n__TBB_SYMBOL( _ZN3tbb8internal30concurrent_queue_iterator_baseD2Ev )\n__TBB_SYMBOL( _ZNK3tbb8internal21concurrent_queue_base13internal_sizeEv )\n#endif\n\n/* concurrent_queue v3 */\n/* constructors */\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v3C2Em )\n__TBB_SYMBOL( _ZN3tbb8internal33concurrent_queue_iterator_base_v3C2ERKNS0_24concurrent_queue_base_v3E )\n__TBB_SYMBOL( _ZN3tbb8internal33concurrent_queue_iterator_base_v3C2ERKNS0_24concurrent_queue_base_v3Em )\n/* destructors */\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v3D2Ev )\n__TBB_SYMBOL( _ZN3tbb8internal33concurrent_queue_iterator_base_v3D2Ev )\n/* typeinfo */\n__TBB_SYMBOL( _ZTIN3tbb8internal24concurrent_queue_base_v3E )\n__TBB_SYMBOL( _ZTSN3tbb8internal24concurrent_queue_base_v3E )\n/* vtable */\n__TBB_SYMBOL( _ZTVN3tbb8internal24concurrent_queue_base_v3E )\n/* methods */\n__TBB_SYMBOL( _ZN3tbb8internal33concurrent_queue_iterator_base_v36assignERKS1_ )\n__TBB_SYMBOL( _ZN3tbb8internal33concurrent_queue_iterator_base_v37advanceEv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v313internal_pushEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v818internal_push_moveEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v325internal_push_if_not_fullEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v830internal_push_move_if_not_fullEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v312internal_popEPv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v323internal_pop_if_presentEPv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v314internal_abortEv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v321internal_finish_clearEv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v321internal_set_capacityElm )\n__TBB_SYMBOL( _ZNK3tbb8internal24concurrent_queue_base_v313internal_sizeEv )\n__TBB_SYMBOL( _ZNK3tbb8internal24concurrent_queue_base_v314internal_emptyEv )\n__TBB_SYMBOL( _ZNK3tbb8internal24concurrent_queue_base_v324internal_throw_exceptionEv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v36assignERKS1_ )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v812move_contentERS1_ )\n\n#if !TBB_NO_LEGACY\n/* concurrent_vector.cpp v2 */\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base13internal_copyERKS1_mPFvPvPKvmE )\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base14internal_clearEPFvPvmEb )\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base15internal_assignERKS1_mPFvPvmEPFvS4_PKvmESA_ )\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base16internal_grow_byEmmPFvPvmE )\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base16internal_reserveEmmm )\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base18internal_push_backEmRm )\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base25internal_grow_to_at_leastEmmPFvPvmE )\n__TBB_SYMBOL( _ZNK3tbb8internal22concurrent_vector_base17internal_capacityEv )\n#endif\n\n/* concurrent_vector v3 */\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v313internal_copyERKS1_mPFvPvPKvmE )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v314internal_clearEPFvPvmE )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v315internal_assignERKS1_mPFvPvmEPFvS4_PKvmESA_ )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v316internal_grow_byEmmPFvPvPKvmES4_ )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v316internal_reserveEmmm )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v318internal_push_backEmRm )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v325internal_grow_to_at_leastEmmPFvPvPKvmES4_ )\n__TBB_SYMBOL( _ZNK3tbb8internal25concurrent_vector_base_v317internal_capacityEv )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v316internal_compactEmPvPFvS2_mEPFvS2_PKvmE )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v313internal_swapERS1_ )\n__TBB_SYMBOL( _ZNK3tbb8internal25concurrent_vector_base_v324internal_throw_exceptionEm )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v3D2Ev )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v315internal_resizeEmmmPKvPFvPvmEPFvS4_S3_mE )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v337internal_grow_to_at_least_with_resultEmmPFvPvPKvmES4_ )\n\n/* tbb_thread */\n__TBB_SYMBOL( _ZN3tbb8internal13tbb_thread_v320hardware_concurrencyEv )\n__TBB_SYMBOL( _ZN3tbb8internal13tbb_thread_v36detachEv )\n__TBB_SYMBOL( _ZN3tbb8internal16thread_get_id_v3Ev )\n__TBB_SYMBOL( _ZN3tbb8internal15free_closure_v3EPv )\n__TBB_SYMBOL( _ZN3tbb8internal13tbb_thread_v34joinEv )\n__TBB_SYMBOL( _ZN3tbb8internal13tbb_thread_v314internal_startEPFPvS2_ES2_ )\n__TBB_SYMBOL( _ZN3tbb8internal19allocate_closure_v3Em )\n__TBB_SYMBOL( _ZN3tbb8internal7move_v3ERNS0_13tbb_thread_v3ES2_ )\n__TBB_SYMBOL( _ZN3tbb8internal15thread_yield_v3Ev )\n__TBB_SYMBOL( _ZN3tbb8internal15thread_sleep_v3ERKNS_10tick_count10interval_tE )\n\n/* asm functions */\n__TBB_SYMBOL( __TBB_machine_fetchadd1__TBB_full_fence )\n__TBB_SYMBOL( __TBB_machine_fetchadd2__TBB_full_fence )\n__TBB_SYMBOL( __TBB_machine_fetchadd4__TBB_full_fence )\n__TBB_SYMBOL( __TBB_machine_fetchadd8__TBB_full_fence )\n__TBB_SYMBOL( __TBB_machine_fetchstore1__TBB_full_fence )\n__TBB_SYMBOL( __TBB_machine_fetchstore2__TBB_full_fence )\n__TBB_SYMBOL( __TBB_machine_fetchstore4__TBB_full_fence )\n__TBB_SYMBOL( __TBB_machine_fetchstore8__TBB_full_fence )\n__TBB_SYMBOL( __TBB_machine_fetchadd1acquire )\n__TBB_SYMBOL( __TBB_machine_fetchadd1release )\n__TBB_SYMBOL( __TBB_machine_fetchadd2acquire )\n__TBB_SYMBOL( __TBB_machine_fetchadd2release )\n__TBB_SYMBOL( __TBB_machine_fetchadd4acquire )\n__TBB_SYMBOL( __TBB_machine_fetchadd4release )\n__TBB_SYMBOL( __TBB_machine_fetchadd8acquire )\n__TBB_SYMBOL( __TBB_machine_fetchadd8release )\n__TBB_SYMBOL( __TBB_machine_fetchstore1acquire )\n__TBB_SYMBOL( __TBB_machine_fetchstore1release )\n__TBB_SYMBOL( __TBB_machine_fetchstore2acquire )\n__TBB_SYMBOL( __TBB_machine_fetchstore2release )\n__TBB_SYMBOL( __TBB_machine_fetchstore4acquire )\n__TBB_SYMBOL( __TBB_machine_fetchstore4release )\n__TBB_SYMBOL( __TBB_machine_fetchstore8acquire )\n__TBB_SYMBOL( __TBB_machine_fetchstore8release )\n__TBB_SYMBOL( __TBB_machine_cmpswp1acquire )\n__TBB_SYMBOL( __TBB_machine_cmpswp1release )\n__TBB_SYMBOL( __TBB_machine_cmpswp1__TBB_full_fence )\n__TBB_SYMBOL( __TBB_machine_cmpswp2acquire )\n__TBB_SYMBOL( __TBB_machine_cmpswp2release )\n__TBB_SYMBOL( __TBB_machine_cmpswp2__TBB_full_fence )\n__TBB_SYMBOL( __TBB_machine_cmpswp4acquire )\n__TBB_SYMBOL( __TBB_machine_cmpswp4release )\n__TBB_SYMBOL( __TBB_machine_cmpswp4__TBB_full_fence )\n__TBB_SYMBOL( __TBB_machine_cmpswp8acquire )\n__TBB_SYMBOL( __TBB_machine_cmpswp8release )\n__TBB_SYMBOL( __TBB_machine_cmpswp8__TBB_full_fence )\n__TBB_SYMBOL( __TBB_machine_lg )\n__TBB_SYMBOL( __TBB_machine_lockbyte )\n__TBB_SYMBOL( __TBB_machine_pause )\n__TBB_SYMBOL( __TBB_machine_trylockbyte )\n__TBB_SYMBOL( __TBB_machine_load8_relaxed )\n__TBB_SYMBOL( __TBB_machine_store8_relaxed )\n__TBB_SYMBOL( __TBB_machine_load4_relaxed )\n__TBB_SYMBOL( __TBB_machine_store4_relaxed )\n__TBB_SYMBOL( __TBB_machine_load2_relaxed )\n__TBB_SYMBOL( __TBB_machine_store2_relaxed )\n__TBB_SYMBOL( __TBB_machine_load1_relaxed )\n__TBB_SYMBOL( __TBB_machine_store1_relaxed )\n\n#undef __TBB_SYMBOL\n"
  },
  {
    "path": "benchmarks/tbb/mac32-tbb-export.def",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#define __TBB_SYMBOL( sym ) _##sym\n#include \"mac32-tbb-export.lst\"\n\n"
  },
  {
    "path": "benchmarks/tbb/mac32-tbb-export.lst",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#include \"tbb/tbb_config.h\"\n\n/*\n    Sometimes OS X* requires leading underscore (e. g. in export list file), but sometimes not\n    (e. g. when searching symbol in a dynamic library via dlsym()). Symbols in this file SHOULD\n    be listed WITHOUT one leading underscore. __TBB_SYMBOL macro should add underscore when\n    necessary, depending on the indended usage.\n*/\n\n// cache_aligned_allocator.cpp\n__TBB_SYMBOL( _ZN3tbb8internal12NFS_AllocateEmmPv )\n__TBB_SYMBOL( _ZN3tbb8internal15NFS_GetLineSizeEv )\n__TBB_SYMBOL( _ZN3tbb8internal8NFS_FreeEPv )\n__TBB_SYMBOL( _ZN3tbb8internal23allocate_via_handler_v3Em )\n__TBB_SYMBOL( _ZN3tbb8internal25deallocate_via_handler_v3EPv )\n__TBB_SYMBOL( _ZN3tbb8internal17is_malloc_used_v3Ev )\n\n// task.cpp v3\n__TBB_SYMBOL( _ZN3tbb4task13note_affinityEt )\n__TBB_SYMBOL( _ZN3tbb4task22internal_set_ref_countEi )\n__TBB_SYMBOL( _ZN3tbb4task28internal_decrement_ref_countEv )\n__TBB_SYMBOL( _ZN3tbb4task22spawn_and_wait_for_allERNS_9task_listE )\n__TBB_SYMBOL( _ZN3tbb4task4selfEv )\n__TBB_SYMBOL( _ZN3tbb10interface58internal9task_base7destroyERNS_4taskE )\n__TBB_SYMBOL( _ZNK3tbb4task26is_owned_by_current_threadEv )\n__TBB_SYMBOL( _ZN3tbb8internal19allocate_root_proxy4freeERNS_4taskE )\n__TBB_SYMBOL( _ZN3tbb8internal19allocate_root_proxy8allocateEm )\n__TBB_SYMBOL( _ZN3tbb8internal28affinity_partitioner_base_v36resizeEj )\n__TBB_SYMBOL( _ZN3tbb8internal36get_initial_auto_partitioner_divisorEv )\n__TBB_SYMBOL( _ZNK3tbb8internal20allocate_child_proxy4freeERNS_4taskE )\n__TBB_SYMBOL( _ZNK3tbb8internal20allocate_child_proxy8allocateEm )\n__TBB_SYMBOL( _ZNK3tbb8internal27allocate_continuation_proxy4freeERNS_4taskE )\n__TBB_SYMBOL( _ZNK3tbb8internal27allocate_continuation_proxy8allocateEm )\n__TBB_SYMBOL( _ZNK3tbb8internal34allocate_additional_child_of_proxy4freeERNS_4taskE )\n__TBB_SYMBOL( _ZNK3tbb8internal34allocate_additional_child_of_proxy8allocateEm )\n__TBB_SYMBOL( _ZTIN3tbb4taskE )\n__TBB_SYMBOL( _ZTSN3tbb4taskE )\n__TBB_SYMBOL( _ZTVN3tbb4taskE )\n__TBB_SYMBOL( _ZN3tbb19task_scheduler_init19default_num_threadsEv )\n__TBB_SYMBOL( _ZN3tbb19task_scheduler_init10initializeEim )\n__TBB_SYMBOL( _ZN3tbb19task_scheduler_init10initializeEi )\n__TBB_SYMBOL( _ZN3tbb19task_scheduler_init9terminateEv )\n#if __TBB_SCHEDULER_OBSERVER\n__TBB_SYMBOL( _ZN3tbb8internal26task_scheduler_observer_v37observeEb )\n#endif /* __TBB_SCHEDULER_OBSERVER */\n__TBB_SYMBOL( _ZN3tbb10empty_task7executeEv )\n__TBB_SYMBOL( _ZN3tbb10empty_taskD0Ev )\n__TBB_SYMBOL( _ZN3tbb10empty_taskD1Ev )\n__TBB_SYMBOL( _ZTIN3tbb10empty_taskE )\n__TBB_SYMBOL( _ZTSN3tbb10empty_taskE )\n__TBB_SYMBOL( _ZTVN3tbb10empty_taskE )\n\n#if __TBB_TASK_ARENA\n/* arena.cpp */\n__TBB_SYMBOL( _ZN3tbb10interface78internal15task_arena_base19internal_initializeEv )\n__TBB_SYMBOL( _ZN3tbb10interface78internal15task_arena_base18internal_terminateEv )\n__TBB_SYMBOL( _ZNK3tbb10interface78internal15task_arena_base16internal_enqueueERNS_4taskEl )\n__TBB_SYMBOL( _ZNK3tbb10interface78internal15task_arena_base16internal_executeERNS1_13delegate_baseE )\n__TBB_SYMBOL( _ZNK3tbb10interface78internal15task_arena_base13internal_waitEv )\n__TBB_SYMBOL( _ZN3tbb10interface78internal15task_arena_base21internal_current_slotEv )\n#endif /* __TBB_TASK_ARENA */\n\n#if !TBB_NO_LEGACY\n// task_v2.cpp\n__TBB_SYMBOL( _ZN3tbb4task7destroyERS0_ )\n#endif\n\n// Exception handling in task scheduler\n#if __TBB_TASK_GROUP_CONTEXT\n__TBB_SYMBOL( _ZNK3tbb8internal32allocate_root_with_context_proxy8allocateEm )\n__TBB_SYMBOL( _ZNK3tbb8internal32allocate_root_with_context_proxy4freeERNS_4taskE )\n__TBB_SYMBOL( _ZN3tbb4task12change_groupERNS_18task_group_contextE )\n__TBB_SYMBOL( _ZNK3tbb18task_group_context28is_group_execution_cancelledEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_context22cancel_group_executionEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_context26register_pending_exceptionEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_context5resetEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_context19capture_fp_settingsEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_context4initEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_contextD1Ev )\n__TBB_SYMBOL( _ZN3tbb18task_group_contextD2Ev )\n#if __TBB_TASK_PRIORITY\n__TBB_SYMBOL( _ZN3tbb18task_group_context12set_priorityENS_10priority_tE )\n__TBB_SYMBOL( _ZNK3tbb18task_group_context8priorityEv )\n#endif /* __TBB_TASK_PRIORITY */\n__TBB_SYMBOL( _ZNK3tbb18captured_exception4nameEv )\n__TBB_SYMBOL( _ZNK3tbb18captured_exception4whatEv )\n__TBB_SYMBOL( _ZN3tbb18captured_exception10throw_selfEv )\n__TBB_SYMBOL( _ZN3tbb18captured_exception3setEPKcS2_ )\n__TBB_SYMBOL( _ZN3tbb18captured_exception4moveEv )\n__TBB_SYMBOL( _ZN3tbb18captured_exception5clearEv )\n__TBB_SYMBOL( _ZN3tbb18captured_exception7destroyEv )\n__TBB_SYMBOL( _ZN3tbb18captured_exception8allocateEPKcS2_ )\n__TBB_SYMBOL( _ZN3tbb18captured_exceptionD0Ev )\n__TBB_SYMBOL( _ZN3tbb18captured_exceptionD1Ev )\n__TBB_SYMBOL( _ZN3tbb18captured_exceptionD2Ev )\n__TBB_SYMBOL( _ZTIN3tbb18captured_exceptionE )\n__TBB_SYMBOL( _ZTSN3tbb18captured_exceptionE )\n__TBB_SYMBOL( _ZTVN3tbb18captured_exceptionE )\n__TBB_SYMBOL( _ZTIN3tbb13tbb_exceptionE )\n__TBB_SYMBOL( _ZTSN3tbb13tbb_exceptionE )\n__TBB_SYMBOL( _ZTVN3tbb13tbb_exceptionE )\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n// Symbols for exceptions thrown from TBB\n__TBB_SYMBOL( _ZN3tbb8internal33throw_bad_last_alloc_exception_v4Ev )\n__TBB_SYMBOL( _ZN3tbb8internal18throw_exception_v4ENS0_12exception_idE )\n__TBB_SYMBOL( _ZNSt13runtime_errorD1Ev )\n__TBB_SYMBOL( _ZTISt13runtime_error )\n__TBB_SYMBOL( _ZTSSt13runtime_error )\n__TBB_SYMBOL( _ZNSt16invalid_argumentD1Ev )\n__TBB_SYMBOL( _ZTISt16invalid_argument )\n__TBB_SYMBOL( _ZTSSt16invalid_argument )\n__TBB_SYMBOL( _ZNSt11range_errorD1Ev )\n__TBB_SYMBOL( _ZTISt11range_error )\n__TBB_SYMBOL( _ZTSSt11range_error )\n__TBB_SYMBOL( _ZNSt12length_errorD1Ev )\n__TBB_SYMBOL( _ZTISt12length_error )\n__TBB_SYMBOL( _ZTSSt12length_error )\n__TBB_SYMBOL( _ZNSt12out_of_rangeD1Ev )\n__TBB_SYMBOL( _ZTISt12out_of_range )\n__TBB_SYMBOL( _ZTSSt12out_of_range )\n__TBB_SYMBOL( _ZN3tbb14bad_last_allocD0Ev )\n__TBB_SYMBOL( _ZN3tbb14bad_last_allocD1Ev )\n__TBB_SYMBOL( _ZNK3tbb14bad_last_alloc4whatEv )\n__TBB_SYMBOL( _ZTIN3tbb14bad_last_allocE )\n__TBB_SYMBOL( _ZTSN3tbb14bad_last_allocE )\n__TBB_SYMBOL( _ZTVN3tbb14bad_last_allocE )\n__TBB_SYMBOL( _ZN3tbb12missing_waitD0Ev )\n__TBB_SYMBOL( _ZN3tbb12missing_waitD1Ev )\n__TBB_SYMBOL( _ZNK3tbb12missing_wait4whatEv )\n__TBB_SYMBOL( _ZTIN3tbb12missing_waitE )\n__TBB_SYMBOL( _ZTSN3tbb12missing_waitE )\n__TBB_SYMBOL( _ZTVN3tbb12missing_waitE )\n__TBB_SYMBOL( _ZN3tbb27invalid_multiple_schedulingD0Ev )\n__TBB_SYMBOL( _ZN3tbb27invalid_multiple_schedulingD1Ev )\n__TBB_SYMBOL( _ZNK3tbb27invalid_multiple_scheduling4whatEv )\n__TBB_SYMBOL( _ZTIN3tbb27invalid_multiple_schedulingE )\n__TBB_SYMBOL( _ZTSN3tbb27invalid_multiple_schedulingE )\n__TBB_SYMBOL( _ZTVN3tbb27invalid_multiple_schedulingE )\n__TBB_SYMBOL( _ZN3tbb13improper_lockD0Ev )\n__TBB_SYMBOL( _ZN3tbb13improper_lockD1Ev )\n__TBB_SYMBOL( _ZNK3tbb13improper_lock4whatEv )\n__TBB_SYMBOL( _ZTIN3tbb13improper_lockE )\n__TBB_SYMBOL( _ZTSN3tbb13improper_lockE )\n__TBB_SYMBOL( _ZTVN3tbb13improper_lockE )\n__TBB_SYMBOL( _ZN3tbb10user_abortD0Ev )\n__TBB_SYMBOL( _ZN3tbb10user_abortD1Ev )\n__TBB_SYMBOL( _ZNK3tbb10user_abort4whatEv )\n__TBB_SYMBOL( _ZTIN3tbb10user_abortE )\n__TBB_SYMBOL( _ZTSN3tbb10user_abortE )\n__TBB_SYMBOL( _ZTVN3tbb10user_abortE )\n\n// tbb_misc.cpp\n__TBB_SYMBOL( _ZN3tbb17assertion_failureEPKciS1_S1_ )\n__TBB_SYMBOL( _ZN3tbb21set_assertion_handlerEPFvPKciS1_S1_E )\n__TBB_SYMBOL( _ZN3tbb8internal13handle_perrorEiPKc )\n__TBB_SYMBOL( _ZN3tbb8internal15runtime_warningEPKcz )\n#if __TBB_x86_32\n__TBB_SYMBOL( __TBB_machine_store8_slow_perf_warning )\n__TBB_SYMBOL( __TBB_machine_store8_slow )\n#endif\n__TBB_SYMBOL( TBB_runtime_interface_version )\n\n// tbb_main.cpp\n__TBB_SYMBOL( _ZN3tbb8internal32itt_load_pointer_with_acquire_v3EPKv )\n__TBB_SYMBOL( _ZN3tbb8internal33itt_store_pointer_with_release_v3EPvS1_ )\n__TBB_SYMBOL( _ZN3tbb8internal18call_itt_notify_v5EiPv )\n__TBB_SYMBOL( _ZN3tbb8internal19itt_load_pointer_v3EPKv )\n__TBB_SYMBOL( _ZN3tbb8internal20itt_set_sync_name_v3EPvPKc )\n\n// pipeline.cpp\n__TBB_SYMBOL( _ZTIN3tbb6filterE )\n__TBB_SYMBOL( _ZTSN3tbb6filterE )\n__TBB_SYMBOL( _ZTVN3tbb6filterE )\n__TBB_SYMBOL( _ZN3tbb6filterD2Ev )\n__TBB_SYMBOL( _ZN3tbb8pipeline10add_filterERNS_6filterE )\n__TBB_SYMBOL( _ZN3tbb8pipeline12inject_tokenERNS_4taskE )\n__TBB_SYMBOL( _ZN3tbb8pipeline13remove_filterERNS_6filterE )\n__TBB_SYMBOL( _ZN3tbb8pipeline3runEm )\n#if __TBB_TASK_GROUP_CONTEXT\n__TBB_SYMBOL( _ZN3tbb8pipeline3runEmRNS_18task_group_contextE )\n#endif\n__TBB_SYMBOL( _ZN3tbb8pipeline5clearEv )\n__TBB_SYMBOL( _ZN3tbb19thread_bound_filter12process_itemEv )\n__TBB_SYMBOL( _ZN3tbb19thread_bound_filter16try_process_itemEv )\n__TBB_SYMBOL( _ZN3tbb8pipelineC1Ev )\n__TBB_SYMBOL( _ZN3tbb8pipelineC2Ev )\n__TBB_SYMBOL( _ZN3tbb8pipelineD0Ev )\n__TBB_SYMBOL( _ZN3tbb8pipelineD1Ev )\n__TBB_SYMBOL( _ZN3tbb8pipelineD2Ev )\n__TBB_SYMBOL( _ZTIN3tbb8pipelineE )\n__TBB_SYMBOL( _ZTSN3tbb8pipelineE )\n__TBB_SYMBOL( _ZTVN3tbb8pipelineE )\n__TBB_SYMBOL( _ZN3tbb6filter16set_end_of_inputEv )\n\n// queuing_rw_mutex.cpp\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex11scoped_lock17upgrade_to_writerEv )\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex11scoped_lock19downgrade_to_readerEv )\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex11scoped_lock7acquireERS0_b )\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex11scoped_lock7releaseEv )\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex11scoped_lock11try_acquireERS0_b )\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex18internal_constructEv )\n\n// reader_writer_lock.cpp\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock11scoped_lock16internal_destroyEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock11scoped_lock18internal_constructERS1_ )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock13try_lock_readEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock16scoped_lock_read16internal_destroyEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock16scoped_lock_read18internal_constructERS1_ )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock16internal_destroyEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock18internal_constructEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock4lockEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock6unlockEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock8try_lockEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock9lock_readEv )\n\n#if !TBB_NO_LEGACY\n// spin_rw_mutex.cpp v2\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex16internal_upgradeEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex22internal_itt_releasingEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex23internal_acquire_readerEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex23internal_acquire_writerEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex18internal_downgradeEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex23internal_release_readerEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex23internal_release_writerEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex27internal_try_acquire_readerEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex27internal_try_acquire_writerEPS0_ )\n#endif\n\n// spin_rw_mutex v3\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v316internal_upgradeEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v318internal_downgradeEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v323internal_acquire_readerEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v323internal_acquire_writerEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v323internal_release_readerEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v323internal_release_writerEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v327internal_try_acquire_readerEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v327internal_try_acquire_writerEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v318internal_constructEv )\n\n// x86_rtm_rw_mutex.cpp\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex16internal_releaseERNS2_11scoped_lockE )\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex16internal_upgradeERNS2_11scoped_lockE )\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex18internal_constructEv )\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex18internal_downgradeERNS2_11scoped_lockE )\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex23internal_acquire_readerERNS2_11scoped_lockEb )\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex23internal_acquire_writerERNS2_11scoped_lockEb )\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex27internal_try_acquire_writerERNS2_11scoped_lockE )\n\n// spin_mutex.cpp\n__TBB_SYMBOL( _ZN3tbb10spin_mutex11scoped_lock16internal_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb10spin_mutex11scoped_lock16internal_releaseEv )\n__TBB_SYMBOL( _ZN3tbb10spin_mutex11scoped_lock20internal_try_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb10spin_mutex18internal_constructEv )\n\n// mutex.cpp\n__TBB_SYMBOL( _ZN3tbb5mutex11scoped_lock16internal_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb5mutex11scoped_lock16internal_releaseEv )\n__TBB_SYMBOL( _ZN3tbb5mutex11scoped_lock20internal_try_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb5mutex16internal_destroyEv )\n__TBB_SYMBOL( _ZN3tbb5mutex18internal_constructEv )\n\n// recursive_mutex.cpp\n__TBB_SYMBOL( _ZN3tbb15recursive_mutex11scoped_lock16internal_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb15recursive_mutex11scoped_lock16internal_releaseEv )\n__TBB_SYMBOL( _ZN3tbb15recursive_mutex11scoped_lock20internal_try_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb15recursive_mutex16internal_destroyEv )\n__TBB_SYMBOL( _ZN3tbb15recursive_mutex18internal_constructEv )\n\n// queuing_mutex.cpp\n__TBB_SYMBOL( _ZN3tbb13queuing_mutex11scoped_lock7acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb13queuing_mutex11scoped_lock7releaseEv )\n__TBB_SYMBOL( _ZN3tbb13queuing_mutex11scoped_lock11try_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb13queuing_mutex18internal_constructEv )\n\n// critical_section.cpp\n__TBB_SYMBOL( _ZN3tbb8internal19critical_section_v418internal_constructEv )\n\n#if !TBB_NO_LEGACY\n// concurrent_hash_map\n__TBB_SYMBOL( _ZNK3tbb8internal21hash_map_segment_base23internal_grow_predicateEv )\n\n// concurrent_queue.cpp v2\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_base12internal_popEPv )\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_base13internal_pushEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_base21internal_set_capacityEim )\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_base23internal_pop_if_presentEPv )\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_base25internal_push_if_not_fullEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_baseC2Em )\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_baseD2Ev )\n__TBB_SYMBOL( _ZTIN3tbb8internal21concurrent_queue_baseE )\n__TBB_SYMBOL( _ZTSN3tbb8internal21concurrent_queue_baseE )\n__TBB_SYMBOL( _ZTVN3tbb8internal21concurrent_queue_baseE )\n__TBB_SYMBOL( _ZN3tbb8internal30concurrent_queue_iterator_base6assignERKS1_ )\n__TBB_SYMBOL( _ZN3tbb8internal30concurrent_queue_iterator_base7advanceEv )\n__TBB_SYMBOL( _ZN3tbb8internal30concurrent_queue_iterator_baseC2ERKNS0_21concurrent_queue_baseE )\n__TBB_SYMBOL( _ZN3tbb8internal30concurrent_queue_iterator_baseD2Ev )\n__TBB_SYMBOL( _ZNK3tbb8internal21concurrent_queue_base13internal_sizeEv )\n#endif\n\n// concurrent_queue v3\n// constructors\n__TBB_SYMBOL( _ZN3tbb8internal33concurrent_queue_iterator_base_v3C2ERKNS0_24concurrent_queue_base_v3E )\n__TBB_SYMBOL( _ZN3tbb8internal33concurrent_queue_iterator_base_v3C2ERKNS0_24concurrent_queue_base_v3Em )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v3C2Em )\n// destructors\n__TBB_SYMBOL( _ZN3tbb8internal33concurrent_queue_iterator_base_v3D2Ev )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v3D2Ev )\n// typeinfo\n__TBB_SYMBOL( _ZTIN3tbb8internal24concurrent_queue_base_v3E )\n__TBB_SYMBOL( _ZTSN3tbb8internal24concurrent_queue_base_v3E )\n// vtable\n__TBB_SYMBOL( _ZTVN3tbb8internal24concurrent_queue_base_v3E )\n// methods\n__TBB_SYMBOL( _ZN3tbb8internal33concurrent_queue_iterator_base_v37advanceEv )\n__TBB_SYMBOL( _ZN3tbb8internal33concurrent_queue_iterator_base_v36assignERKS1_ )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v313internal_pushEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v818internal_push_moveEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v325internal_push_if_not_fullEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v830internal_push_move_if_not_fullEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v312internal_popEPv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v323internal_pop_if_presentEPv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v314internal_abortEv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v321internal_set_capacityEim )\n__TBB_SYMBOL( _ZNK3tbb8internal24concurrent_queue_base_v313internal_sizeEv )\n__TBB_SYMBOL( _ZNK3tbb8internal24concurrent_queue_base_v314internal_emptyEv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v321internal_finish_clearEv )\n__TBB_SYMBOL( _ZNK3tbb8internal24concurrent_queue_base_v324internal_throw_exceptionEv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v36assignERKS1_ )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v812move_contentERS1_ )\n\n#if !TBB_NO_LEGACY\n// concurrent_vector.cpp v2\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base13internal_copyERKS1_mPFvPvPKvmE )\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base14internal_clearEPFvPvmEb )\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base15internal_assignERKS1_mPFvPvmEPFvS4_PKvmESA_ )\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base16internal_grow_byEmmPFvPvmE )\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base16internal_reserveEmmm )\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base18internal_push_backEmRm )\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base25internal_grow_to_at_leastEmmPFvPvmE )\n__TBB_SYMBOL( _ZNK3tbb8internal22concurrent_vector_base17internal_capacityEv )\n#endif\n\n// concurrent_vector v3\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v313internal_copyERKS1_mPFvPvPKvmE )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v314internal_clearEPFvPvmE )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v315internal_assignERKS1_mPFvPvmEPFvS4_PKvmESA_ )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v316internal_grow_byEmmPFvPvPKvmES4_ )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v316internal_reserveEmmm )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v318internal_push_backEmRm )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v325internal_grow_to_at_leastEmmPFvPvPKvmES4_ )\n__TBB_SYMBOL( _ZNK3tbb8internal25concurrent_vector_base_v317internal_capacityEv )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v316internal_compactEmPvPFvS2_mEPFvS2_PKvmE )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v313internal_swapERS1_ )\n__TBB_SYMBOL( _ZNK3tbb8internal25concurrent_vector_base_v324internal_throw_exceptionEm )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v3D2Ev )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v315internal_resizeEmmmPKvPFvPvmEPFvS4_S3_mE )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v337internal_grow_to_at_least_with_resultEmmPFvPvPKvmES4_ )\n\n// tbb_thread\n__TBB_SYMBOL( _ZN3tbb8internal13tbb_thread_v314internal_startEPFPvS2_ES2_ )\n__TBB_SYMBOL( _ZN3tbb8internal13tbb_thread_v320hardware_concurrencyEv )\n__TBB_SYMBOL( _ZN3tbb8internal13tbb_thread_v34joinEv )\n__TBB_SYMBOL( _ZN3tbb8internal13tbb_thread_v36detachEv )\n__TBB_SYMBOL( _ZN3tbb8internal15free_closure_v3EPv )\n__TBB_SYMBOL( _ZN3tbb8internal15thread_sleep_v3ERKNS_10tick_count10interval_tE )\n__TBB_SYMBOL( _ZN3tbb8internal15thread_yield_v3Ev )\n__TBB_SYMBOL( _ZN3tbb8internal16thread_get_id_v3Ev )\n__TBB_SYMBOL( _ZN3tbb8internal19allocate_closure_v3Em )\n__TBB_SYMBOL( _ZN3tbb8internal7move_v3ERNS0_13tbb_thread_v3ES2_ )\n\n#undef __TBB_SYMBOL\n"
  },
  {
    "path": "benchmarks/tbb/mac64-tbb-export.def",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#define __TBB_SYMBOL( sym ) _##sym\n#include \"mac64-tbb-export.lst\"\n\n"
  },
  {
    "path": "benchmarks/tbb/mac64-tbb-export.lst",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#include \"tbb/tbb_config.h\"\n\n/*\n    Sometimes OS X* requires leading underscore (e. g. in export list file), but sometimes not\n    (e. g. when searching symbol in a dynamic library via dlsym()). Symbols in this file SHOULD\n    be listed WITHOUT one leading underscore. __TBB_SYMBOL macro should add underscore when\n    necessary, depending on the indended usage.\n*/\n\n// cache_aligned_allocator.cpp\n__TBB_SYMBOL( _ZN3tbb8internal12NFS_AllocateEmmPv )\n__TBB_SYMBOL( _ZN3tbb8internal15NFS_GetLineSizeEv )\n__TBB_SYMBOL( _ZN3tbb8internal8NFS_FreeEPv )\n__TBB_SYMBOL( _ZN3tbb8internal23allocate_via_handler_v3Em )\n__TBB_SYMBOL( _ZN3tbb8internal25deallocate_via_handler_v3EPv )\n__TBB_SYMBOL( _ZN3tbb8internal17is_malloc_used_v3Ev )\n\n// task.cpp v3\n__TBB_SYMBOL( _ZN3tbb4task13note_affinityEt )\n__TBB_SYMBOL( _ZN3tbb4task22internal_set_ref_countEi )\n__TBB_SYMBOL( _ZN3tbb4task28internal_decrement_ref_countEv )\n__TBB_SYMBOL( _ZN3tbb4task22spawn_and_wait_for_allERNS_9task_listE )\n__TBB_SYMBOL( _ZN3tbb4task4selfEv )\n__TBB_SYMBOL( _ZN3tbb10interface58internal9task_base7destroyERNS_4taskE )\n__TBB_SYMBOL( _ZNK3tbb4task26is_owned_by_current_threadEv )\n__TBB_SYMBOL( _ZN3tbb8internal19allocate_root_proxy4freeERNS_4taskE )\n__TBB_SYMBOL( _ZN3tbb8internal19allocate_root_proxy8allocateEm )\n__TBB_SYMBOL( _ZN3tbb8internal28affinity_partitioner_base_v36resizeEj )\n__TBB_SYMBOL( _ZN3tbb8internal36get_initial_auto_partitioner_divisorEv )\n__TBB_SYMBOL( _ZNK3tbb8internal20allocate_child_proxy4freeERNS_4taskE )\n__TBB_SYMBOL( _ZNK3tbb8internal20allocate_child_proxy8allocateEm )\n__TBB_SYMBOL( _ZNK3tbb8internal27allocate_continuation_proxy4freeERNS_4taskE )\n__TBB_SYMBOL( _ZNK3tbb8internal27allocate_continuation_proxy8allocateEm )\n__TBB_SYMBOL( _ZNK3tbb8internal34allocate_additional_child_of_proxy4freeERNS_4taskE )\n__TBB_SYMBOL( _ZNK3tbb8internal34allocate_additional_child_of_proxy8allocateEm )\n__TBB_SYMBOL( _ZTIN3tbb4taskE )\n__TBB_SYMBOL( _ZTSN3tbb4taskE )\n__TBB_SYMBOL( _ZTVN3tbb4taskE )\n__TBB_SYMBOL( _ZN3tbb19task_scheduler_init19default_num_threadsEv )\n__TBB_SYMBOL( _ZN3tbb19task_scheduler_init10initializeEim )\n__TBB_SYMBOL( _ZN3tbb19task_scheduler_init10initializeEi )\n__TBB_SYMBOL( _ZN3tbb19task_scheduler_init9terminateEv )\n#if __TBB_SCHEDULER_OBSERVER\n__TBB_SYMBOL( _ZN3tbb8internal26task_scheduler_observer_v37observeEb )\n#endif /* __TBB_SCHEDULER_OBSERVER */\n__TBB_SYMBOL( _ZN3tbb10empty_task7executeEv )\n__TBB_SYMBOL( _ZN3tbb10empty_taskD0Ev )\n__TBB_SYMBOL( _ZN3tbb10empty_taskD1Ev )\n__TBB_SYMBOL( _ZTIN3tbb10empty_taskE )\n__TBB_SYMBOL( _ZTSN3tbb10empty_taskE )\n__TBB_SYMBOL( _ZTVN3tbb10empty_taskE )\n\n#if __TBB_TASK_ARENA\n/* arena.cpp */\n__TBB_SYMBOL( _ZN3tbb10interface78internal15task_arena_base19internal_initializeEv )\n__TBB_SYMBOL( _ZN3tbb10interface78internal15task_arena_base18internal_terminateEv )\n__TBB_SYMBOL( _ZNK3tbb10interface78internal15task_arena_base16internal_enqueueERNS_4taskEl )\n__TBB_SYMBOL( _ZNK3tbb10interface78internal15task_arena_base16internal_executeERNS1_13delegate_baseE )\n__TBB_SYMBOL( _ZNK3tbb10interface78internal15task_arena_base13internal_waitEv )\n__TBB_SYMBOL( _ZN3tbb10interface78internal15task_arena_base21internal_current_slotEv )\n#endif /* __TBB_TASK_ARENA */\n\n#if !TBB_NO_LEGACY\n// task_v2.cpp\n__TBB_SYMBOL( _ZN3tbb4task7destroyERS0_ )\n#endif\n\n// Exception handling in task scheduler\n#if __TBB_TASK_GROUP_CONTEXT\n__TBB_SYMBOL( _ZNK3tbb8internal32allocate_root_with_context_proxy8allocateEm )\n__TBB_SYMBOL( _ZNK3tbb8internal32allocate_root_with_context_proxy4freeERNS_4taskE )\n__TBB_SYMBOL( _ZN3tbb4task12change_groupERNS_18task_group_contextE )\n__TBB_SYMBOL( _ZNK3tbb18task_group_context28is_group_execution_cancelledEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_context22cancel_group_executionEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_context26register_pending_exceptionEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_context5resetEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_context19capture_fp_settingsEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_context4initEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_contextD1Ev )\n__TBB_SYMBOL( _ZN3tbb18task_group_contextD2Ev )\n#if __TBB_TASK_PRIORITY\n__TBB_SYMBOL( _ZN3tbb18task_group_context12set_priorityENS_10priority_tE )\n__TBB_SYMBOL( _ZNK3tbb18task_group_context8priorityEv )\n#endif /* __TBB_TASK_PRIORITY */\n__TBB_SYMBOL( _ZNK3tbb18captured_exception4nameEv )\n__TBB_SYMBOL( _ZNK3tbb18captured_exception4whatEv )\n__TBB_SYMBOL( _ZN3tbb18captured_exception10throw_selfEv )\n__TBB_SYMBOL( _ZN3tbb18captured_exception3setEPKcS2_ )\n__TBB_SYMBOL( _ZN3tbb18captured_exception4moveEv )\n__TBB_SYMBOL( _ZN3tbb18captured_exception5clearEv )\n__TBB_SYMBOL( _ZN3tbb18captured_exception7destroyEv )\n__TBB_SYMBOL( _ZN3tbb18captured_exception8allocateEPKcS2_ )\n__TBB_SYMBOL( _ZN3tbb18captured_exceptionD0Ev )\n__TBB_SYMBOL( _ZN3tbb18captured_exceptionD1Ev )\n__TBB_SYMBOL( _ZN3tbb18captured_exceptionD2Ev )\n__TBB_SYMBOL( _ZTIN3tbb18captured_exceptionE )\n__TBB_SYMBOL( _ZTSN3tbb18captured_exceptionE )\n__TBB_SYMBOL( _ZTVN3tbb18captured_exceptionE )\n__TBB_SYMBOL( _ZTIN3tbb13tbb_exceptionE )\n__TBB_SYMBOL( _ZTSN3tbb13tbb_exceptionE )\n__TBB_SYMBOL( _ZTVN3tbb13tbb_exceptionE )\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n// Symbols for exceptions thrown from TBB\n__TBB_SYMBOL( _ZN3tbb8internal33throw_bad_last_alloc_exception_v4Ev )\n__TBB_SYMBOL( _ZN3tbb8internal18throw_exception_v4ENS0_12exception_idE )\n__TBB_SYMBOL( _ZNSt13runtime_errorD1Ev )\n__TBB_SYMBOL( _ZTISt13runtime_error )\n__TBB_SYMBOL( _ZTSSt13runtime_error )\n__TBB_SYMBOL( _ZNSt16invalid_argumentD1Ev )\n__TBB_SYMBOL( _ZTISt16invalid_argument )\n__TBB_SYMBOL( _ZTSSt16invalid_argument )\n__TBB_SYMBOL( _ZNSt11range_errorD1Ev )\n__TBB_SYMBOL( _ZTISt11range_error )\n__TBB_SYMBOL( _ZTSSt11range_error )\n__TBB_SYMBOL( _ZNSt12length_errorD1Ev )\n__TBB_SYMBOL( _ZTISt12length_error )\n__TBB_SYMBOL( _ZTSSt12length_error )\n__TBB_SYMBOL( _ZNSt12out_of_rangeD1Ev )\n__TBB_SYMBOL( _ZTISt12out_of_range )\n__TBB_SYMBOL( _ZTSSt12out_of_range )\n__TBB_SYMBOL( _ZN3tbb14bad_last_allocD0Ev )\n__TBB_SYMBOL( _ZN3tbb14bad_last_allocD1Ev )\n__TBB_SYMBOL( _ZNK3tbb14bad_last_alloc4whatEv )\n__TBB_SYMBOL( _ZTIN3tbb14bad_last_allocE )\n__TBB_SYMBOL( _ZTSN3tbb14bad_last_allocE )\n__TBB_SYMBOL( _ZTVN3tbb14bad_last_allocE )\n__TBB_SYMBOL( _ZN3tbb12missing_waitD0Ev )\n__TBB_SYMBOL( _ZN3tbb12missing_waitD1Ev )\n__TBB_SYMBOL( _ZNK3tbb12missing_wait4whatEv )\n__TBB_SYMBOL( _ZTIN3tbb12missing_waitE )\n__TBB_SYMBOL( _ZTSN3tbb12missing_waitE )\n__TBB_SYMBOL( _ZTVN3tbb12missing_waitE )\n__TBB_SYMBOL( _ZN3tbb27invalid_multiple_schedulingD0Ev )\n__TBB_SYMBOL( _ZN3tbb27invalid_multiple_schedulingD1Ev )\n__TBB_SYMBOL( _ZNK3tbb27invalid_multiple_scheduling4whatEv )\n__TBB_SYMBOL( _ZTIN3tbb27invalid_multiple_schedulingE )\n__TBB_SYMBOL( _ZTSN3tbb27invalid_multiple_schedulingE )\n__TBB_SYMBOL( _ZTVN3tbb27invalid_multiple_schedulingE )\n__TBB_SYMBOL( _ZN3tbb13improper_lockD0Ev )\n__TBB_SYMBOL( _ZN3tbb13improper_lockD1Ev )\n__TBB_SYMBOL( _ZNK3tbb13improper_lock4whatEv )\n__TBB_SYMBOL( _ZTIN3tbb13improper_lockE )\n__TBB_SYMBOL( _ZTSN3tbb13improper_lockE )\n__TBB_SYMBOL( _ZTVN3tbb13improper_lockE )\n__TBB_SYMBOL( _ZN3tbb10user_abortD0Ev )\n__TBB_SYMBOL( _ZN3tbb10user_abortD1Ev )\n__TBB_SYMBOL( _ZNK3tbb10user_abort4whatEv )\n__TBB_SYMBOL( _ZTIN3tbb10user_abortE )\n__TBB_SYMBOL( _ZTSN3tbb10user_abortE )\n__TBB_SYMBOL( _ZTVN3tbb10user_abortE )\n\n\n// tbb_misc.cpp\n__TBB_SYMBOL( _ZN3tbb17assertion_failureEPKciS1_S1_ )\n__TBB_SYMBOL( _ZN3tbb21set_assertion_handlerEPFvPKciS1_S1_E )\n__TBB_SYMBOL( _ZN3tbb8internal13handle_perrorEiPKc )\n__TBB_SYMBOL( _ZN3tbb8internal15runtime_warningEPKcz )\n__TBB_SYMBOL( TBB_runtime_interface_version )\n\n// tbb_main.cpp\n__TBB_SYMBOL( _ZN3tbb8internal32itt_load_pointer_with_acquire_v3EPKv )\n__TBB_SYMBOL( _ZN3tbb8internal33itt_store_pointer_with_release_v3EPvS1_ )\n__TBB_SYMBOL( _ZN3tbb8internal18call_itt_notify_v5EiPv )\n__TBB_SYMBOL( _ZN3tbb8internal19itt_load_pointer_v3EPKv )\n__TBB_SYMBOL( _ZN3tbb8internal20itt_set_sync_name_v3EPvPKc )\n\n// pipeline.cpp\n__TBB_SYMBOL( _ZTIN3tbb6filterE )\n__TBB_SYMBOL( _ZTSN3tbb6filterE )\n__TBB_SYMBOL( _ZTVN3tbb6filterE )\n__TBB_SYMBOL( _ZN3tbb6filterD2Ev )\n__TBB_SYMBOL( _ZN3tbb8pipeline10add_filterERNS_6filterE )\n__TBB_SYMBOL( _ZN3tbb8pipeline12inject_tokenERNS_4taskE )\n__TBB_SYMBOL( _ZN3tbb8pipeline13remove_filterERNS_6filterE )\n__TBB_SYMBOL( _ZN3tbb8pipeline3runEm )\n#if __TBB_TASK_GROUP_CONTEXT\n__TBB_SYMBOL( _ZN3tbb8pipeline3runEmRNS_18task_group_contextE )\n#endif\n__TBB_SYMBOL( _ZN3tbb8pipeline5clearEv )\n__TBB_SYMBOL( _ZN3tbb19thread_bound_filter12process_itemEv )\n__TBB_SYMBOL( _ZN3tbb19thread_bound_filter16try_process_itemEv )\n__TBB_SYMBOL( _ZN3tbb8pipelineC1Ev )\n__TBB_SYMBOL( _ZN3tbb8pipelineC2Ev )\n__TBB_SYMBOL( _ZN3tbb8pipelineD0Ev )\n__TBB_SYMBOL( _ZN3tbb8pipelineD1Ev )\n__TBB_SYMBOL( _ZN3tbb8pipelineD2Ev )\n__TBB_SYMBOL( _ZTIN3tbb8pipelineE )\n__TBB_SYMBOL( _ZTSN3tbb8pipelineE )\n__TBB_SYMBOL( _ZTVN3tbb8pipelineE )\n__TBB_SYMBOL( _ZN3tbb6filter16set_end_of_inputEv )\n\n// queuing_rw_mutex.cpp\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex11scoped_lock17upgrade_to_writerEv )\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex11scoped_lock19downgrade_to_readerEv )\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex11scoped_lock7acquireERS0_b )\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex11scoped_lock7releaseEv )\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex11scoped_lock11try_acquireERS0_b )\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex18internal_constructEv )\n\n// reader_writer_lock.cpp\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock11scoped_lock16internal_destroyEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock11scoped_lock18internal_constructERS1_ )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock13try_lock_readEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock16scoped_lock_read16internal_destroyEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock16scoped_lock_read18internal_constructERS1_ )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock16internal_destroyEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock18internal_constructEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock4lockEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock6unlockEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock8try_lockEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock9lock_readEv )\n\n#if !TBB_NO_LEGACY\n// spin_rw_mutex.cpp v2\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex16internal_upgradeEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex22internal_itt_releasingEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex23internal_acquire_readerEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex23internal_acquire_writerEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex18internal_downgradeEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex23internal_release_readerEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex23internal_release_writerEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex27internal_try_acquire_readerEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex27internal_try_acquire_writerEPS0_ )\n#endif\n\n// spin_rw_mutex v3\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v316internal_upgradeEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v318internal_downgradeEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v323internal_acquire_readerEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v323internal_acquire_writerEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v323internal_release_readerEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v323internal_release_writerEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v327internal_try_acquire_readerEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v327internal_try_acquire_writerEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v318internal_constructEv )\n\n// x86_rtm_rw_mutex.cpp\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex16internal_releaseERNS2_11scoped_lockE )\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex16internal_upgradeERNS2_11scoped_lockE )\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex18internal_constructEv )\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex18internal_downgradeERNS2_11scoped_lockE )\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex23internal_acquire_readerERNS2_11scoped_lockEb )\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex23internal_acquire_writerERNS2_11scoped_lockEb )\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex27internal_try_acquire_writerERNS2_11scoped_lockE )\n\n// spin_mutex.cpp\n__TBB_SYMBOL( _ZN3tbb10spin_mutex11scoped_lock16internal_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb10spin_mutex11scoped_lock16internal_releaseEv )\n__TBB_SYMBOL( _ZN3tbb10spin_mutex11scoped_lock20internal_try_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb10spin_mutex18internal_constructEv )\n\n// mutex.cpp\n__TBB_SYMBOL( _ZN3tbb5mutex11scoped_lock16internal_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb5mutex11scoped_lock16internal_releaseEv )\n__TBB_SYMBOL( _ZN3tbb5mutex11scoped_lock20internal_try_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb5mutex16internal_destroyEv )\n__TBB_SYMBOL( _ZN3tbb5mutex18internal_constructEv )\n\n// recursive_mutex.cpp\n__TBB_SYMBOL( _ZN3tbb15recursive_mutex11scoped_lock16internal_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb15recursive_mutex11scoped_lock16internal_releaseEv )\n__TBB_SYMBOL( _ZN3tbb15recursive_mutex11scoped_lock20internal_try_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb15recursive_mutex16internal_destroyEv )\n__TBB_SYMBOL( _ZN3tbb15recursive_mutex18internal_constructEv )\n\n// queuing_mutex.cpp\n__TBB_SYMBOL( _ZN3tbb13queuing_mutex11scoped_lock7acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb13queuing_mutex11scoped_lock7releaseEv )\n__TBB_SYMBOL( _ZN3tbb13queuing_mutex11scoped_lock11try_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb13queuing_mutex18internal_constructEv )\n\n// critical_section.cpp\n__TBB_SYMBOL( _ZN3tbb8internal19critical_section_v418internal_constructEv )\n\n#if !TBB_NO_LEGACY\n// concurrent_hash_map\n__TBB_SYMBOL( _ZNK3tbb8internal21hash_map_segment_base23internal_grow_predicateEv )\n\n// concurrent_queue.cpp v2\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_base12internal_popEPv )\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_base13internal_pushEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_base21internal_set_capacityElm )\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_base23internal_pop_if_presentEPv )\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_base25internal_push_if_not_fullEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_baseC2Em )\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_baseD2Ev )\n__TBB_SYMBOL( _ZTIN3tbb8internal21concurrent_queue_baseE )\n__TBB_SYMBOL( _ZTSN3tbb8internal21concurrent_queue_baseE )\n__TBB_SYMBOL( _ZTVN3tbb8internal21concurrent_queue_baseE )\n__TBB_SYMBOL( _ZN3tbb8internal30concurrent_queue_iterator_base6assignERKS1_ )\n__TBB_SYMBOL( _ZN3tbb8internal30concurrent_queue_iterator_base7advanceEv )\n__TBB_SYMBOL( _ZN3tbb8internal30concurrent_queue_iterator_baseC2ERKNS0_21concurrent_queue_baseE )\n__TBB_SYMBOL( _ZN3tbb8internal30concurrent_queue_iterator_baseD2Ev )\n__TBB_SYMBOL( _ZNK3tbb8internal21concurrent_queue_base13internal_sizeEv )\n#endif\n\n// concurrent_queue v3\n// constructors\n__TBB_SYMBOL( _ZN3tbb8internal33concurrent_queue_iterator_base_v3C2ERKNS0_24concurrent_queue_base_v3E )\n__TBB_SYMBOL( _ZN3tbb8internal33concurrent_queue_iterator_base_v3C2ERKNS0_24concurrent_queue_base_v3Em )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v3C2Em )\n// destructors\n__TBB_SYMBOL( _ZN3tbb8internal33concurrent_queue_iterator_base_v3D2Ev )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v3D2Ev )\n// typeinfo\n__TBB_SYMBOL( _ZTIN3tbb8internal24concurrent_queue_base_v3E )\n__TBB_SYMBOL( _ZTSN3tbb8internal24concurrent_queue_base_v3E )\n// vtable\n__TBB_SYMBOL( _ZTVN3tbb8internal24concurrent_queue_base_v3E )\n// methods\n__TBB_SYMBOL( _ZN3tbb8internal33concurrent_queue_iterator_base_v36assignERKS1_ )\n__TBB_SYMBOL( _ZN3tbb8internal33concurrent_queue_iterator_base_v37advanceEv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v313internal_pushEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v818internal_push_moveEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v325internal_push_if_not_fullEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v830internal_push_move_if_not_fullEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v312internal_popEPv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v323internal_pop_if_presentEPv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v314internal_abortEv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v321internal_finish_clearEv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v321internal_set_capacityElm )\n__TBB_SYMBOL( _ZNK3tbb8internal24concurrent_queue_base_v313internal_sizeEv )\n__TBB_SYMBOL( _ZNK3tbb8internal24concurrent_queue_base_v314internal_emptyEv )\n__TBB_SYMBOL( _ZNK3tbb8internal24concurrent_queue_base_v324internal_throw_exceptionEv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v36assignERKS1_ )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v812move_contentERS1_ )\n\n#if !TBB_NO_LEGACY\n// concurrent_vector.cpp v2\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base13internal_copyERKS1_mPFvPvPKvmE )\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base14internal_clearEPFvPvmEb )\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base15internal_assignERKS1_mPFvPvmEPFvS4_PKvmESA_ )\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base16internal_grow_byEmmPFvPvmE )\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base16internal_reserveEmmm )\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base18internal_push_backEmRm )\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base25internal_grow_to_at_leastEmmPFvPvmE )\n__TBB_SYMBOL( _ZNK3tbb8internal22concurrent_vector_base17internal_capacityEv )\n#endif\n\n// concurrent_vector v3\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v313internal_copyERKS1_mPFvPvPKvmE )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v314internal_clearEPFvPvmE )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v315internal_assignERKS1_mPFvPvmEPFvS4_PKvmESA_ )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v316internal_grow_byEmmPFvPvPKvmES4_ )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v316internal_reserveEmmm )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v318internal_push_backEmRm )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v325internal_grow_to_at_leastEmmPFvPvPKvmES4_ )\n__TBB_SYMBOL( _ZNK3tbb8internal25concurrent_vector_base_v317internal_capacityEv )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v316internal_compactEmPvPFvS2_mEPFvS2_PKvmE )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v313internal_swapERS1_ )\n__TBB_SYMBOL( _ZNK3tbb8internal25concurrent_vector_base_v324internal_throw_exceptionEm )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v3D2Ev )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v315internal_resizeEmmmPKvPFvPvmEPFvS4_S3_mE )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v337internal_grow_to_at_least_with_resultEmmPFvPvPKvmES4_ )\n\n// tbb_thread\n__TBB_SYMBOL( _ZN3tbb8internal13tbb_thread_v320hardware_concurrencyEv )\n__TBB_SYMBOL( _ZN3tbb8internal13tbb_thread_v36detachEv )\n__TBB_SYMBOL( _ZN3tbb8internal16thread_get_id_v3Ev )\n__TBB_SYMBOL( _ZN3tbb8internal15free_closure_v3EPv )\n__TBB_SYMBOL( _ZN3tbb8internal13tbb_thread_v34joinEv )\n__TBB_SYMBOL( _ZN3tbb8internal13tbb_thread_v314internal_startEPFPvS2_ES2_ )\n__TBB_SYMBOL( _ZN3tbb8internal19allocate_closure_v3Em )\n__TBB_SYMBOL( _ZN3tbb8internal7move_v3ERNS0_13tbb_thread_v3ES2_ )\n__TBB_SYMBOL( _ZN3tbb8internal15thread_yield_v3Ev )\n__TBB_SYMBOL( _ZN3tbb8internal15thread_sleep_v3ERKNS_10tick_count10interval_tE )\n\n#undef __TBB_SYMBOL\n"
  },
  {
    "path": "benchmarks/tbb/machine/gcc_armv7.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n/*\n    Platform isolation layer for the ARMv7-a architecture.\n*/\n\n#ifndef __TBB_machine_H\n#error Do not include this file directly; include tbb_machine.h instead\n#endif\n\n//TODO: is ARMv7 is the only version ever to support?\n#if !(__ARM_ARCH_7A__)\n#error compilation requires an ARMv7-a architecture.\n#endif\n\n#include <sys/param.h>\n#include <unistd.h>\n\n#define __TBB_WORDSIZE 4\n\n// Traditionally ARM is little-endian.\n// Note that, since only the layout of aligned 32-bit words is of interest,\n// any apparent PDP-endianness of 32-bit words at half-word alignment or\n// any little-endian ordering of big-endian 32-bit words in 64-bit quantities\n// may be disregarded for this setting.\n#if __BIG_ENDIAN__ || (defined(__BYTE_ORDER__) && __BYTE_ORDER__==__ORDER_BIG_ENDIAN__)\n    #define __TBB_ENDIANNESS __TBB_ENDIAN_BIG\n#elif __LITTLE_ENDIAN__ || (defined(__BYTE_ORDER__) && __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__)\n    #define __TBB_ENDIANNESS __TBB_ENDIAN_LITTLE\n#elif defined(__BYTE_ORDER__)\n    #define __TBB_ENDIANNESS __TBB_ENDIAN_UNSUPPORTED\n#else\n    #define __TBB_ENDIANNESS __TBB_ENDIAN_DETECT\n#endif\n\n\n#define __TBB_compiler_fence()    __asm__ __volatile__(\"\": : :\"memory\")\n#define __TBB_full_memory_fence() __asm__ __volatile__(\"dmb ish\": : :\"memory\")\n#define __TBB_control_consistency_helper() __TBB_full_memory_fence()\n#define __TBB_acquire_consistency_helper() __TBB_full_memory_fence()\n#define __TBB_release_consistency_helper() __TBB_full_memory_fence()\n\n//--------------------------------------------------\n// Compare and swap\n//--------------------------------------------------\n\n/**\n * Atomic CAS for 32 bit values, if *ptr==comparand, then *ptr=value, returns *ptr\n * @param ptr pointer to value in memory to be swapped with value if *ptr==comparand\n * @param value value to assign *ptr to if *ptr==comparand\n * @param comparand value to compare with *ptr\n * @return value originally in memory at ptr, regardless of success\n*/\nstatic inline int32_t __TBB_machine_cmpswp4(volatile void *ptr, int32_t value, int32_t comparand )\n{\n    int32_t oldval, res;\n\n    __TBB_full_memory_fence();\n\n    do {\n    __asm__ __volatile__(\n        \"ldrex      %1, [%3]\\n\"\n        \"mov        %0, #0\\n\"\n        \"cmp        %1, %4\\n\"\n        \"it         eq\\n\"\n        \"strexeq    %0, %5, [%3]\\n\"\n        : \"=&r\" (res), \"=&r\" (oldval), \"+Qo\" (*(volatile int32_t*)ptr)\n        : \"r\" ((int32_t *)ptr), \"Ir\" (comparand), \"r\" (value)\n        : \"cc\");\n    } while (res);\n\n    __TBB_full_memory_fence();\n\n    return oldval;\n}\n\n/**\n * Atomic CAS for 64 bit values, if *ptr==comparand, then *ptr=value, returns *ptr\n * @param ptr pointer to value in memory to be swapped with value if *ptr==comparand\n * @param value value to assign *ptr to if *ptr==comparand\n * @param comparand value to compare with *ptr\n * @return value originally in memory at ptr, regardless of success\n */\nstatic inline int64_t __TBB_machine_cmpswp8(volatile void *ptr, int64_t value, int64_t comparand )\n{\n    int64_t oldval;\n    int32_t res;\n\n    __TBB_full_memory_fence();\n\n    do {\n        __asm__ __volatile__(\n            \"mov        %0, #0\\n\"\n            \"ldrexd     %1, %H1, [%3]\\n\"\n            \"cmp        %1, %4\\n\"\n            \"it         eq\\n\"\n            \"cmpeq      %H1, %H4\\n\"\n            \"it         eq\\n\"\n            \"strexdeq   %0, %5, %H5, [%3]\"\n        : \"=&r\" (res), \"=&r\" (oldval), \"+Qo\" (*(volatile int64_t*)ptr)\n        : \"r\" ((int64_t *)ptr), \"r\" (comparand), \"r\" (value)\n        : \"cc\");\n    } while (res);\n\n    __TBB_full_memory_fence();\n\n    return oldval;\n}\n\nstatic inline int32_t __TBB_machine_fetchadd4(volatile void* ptr, int32_t addend)\n{\n    unsigned long tmp;\n    int32_t result, tmp2;\n\n    __TBB_full_memory_fence();\n\n    __asm__ __volatile__(\n\"1:     ldrex   %0, [%4]\\n\"\n\"       add     %3, %0, %5\\n\"\n\"       strex   %1, %3, [%4]\\n\"\n\"       cmp     %1, #0\\n\"\n\"       bne     1b\\n\"\n    : \"=&r\" (result), \"=&r\" (tmp), \"+Qo\" (*(volatile int32_t*)ptr), \"=&r\"(tmp2)\n    : \"r\" ((int32_t *)ptr), \"Ir\" (addend)\n    : \"cc\");\n\n    __TBB_full_memory_fence();\n\n    return result;\n}\n\nstatic inline int64_t __TBB_machine_fetchadd8(volatile void *ptr, int64_t addend)\n{\n    unsigned long tmp;\n    int64_t result, tmp2;\n\n    __TBB_full_memory_fence();\n\n    __asm__ __volatile__(\n\"1:     ldrexd  %0, %H0, [%4]\\n\"\n\"       adds    %3, %0, %5\\n\"\n\"       adc     %H3, %H0, %H5\\n\"\n\"       strexd  %1, %3, %H3, [%4]\\n\"\n\"       cmp     %1, #0\\n\"\n\"       bne     1b\"\n    : \"=&r\" (result), \"=&r\" (tmp), \"+Qo\" (*(volatile int64_t*)ptr), \"=&r\"(tmp2)\n    : \"r\" ((int64_t *)ptr), \"r\" (addend)\n    : \"cc\");\n\n\n    __TBB_full_memory_fence();\n\n    return result;\n}\n\ninline void __TBB_machine_pause (int32_t delay )\n{\n    while(delay>0)\n    {\n\t__TBB_compiler_fence();\n        delay--;\n    }\n}\n\nnamespace tbb {\nnamespace internal {\n    template <typename T, size_t S>\n    struct machine_load_store_relaxed {\n        static inline T load ( const volatile T& location ) {\n            const T value = location;\n\n            /*\n            * An extra memory barrier is required for errata #761319\n            * Please see http://infocenter.arm.com/help/topic/com.arm.doc.uan0004a\n            */\n            __TBB_acquire_consistency_helper();\n            return value;\n        }\n\n        static inline void store ( volatile T& location, T value ) {\n            location = value;\n        }\n    };\n}} // namespaces internal, tbb\n\n// Machine specific atomic operations\n\n#define __TBB_CompareAndSwap4(P,V,C) __TBB_machine_cmpswp4(P,V,C)\n#define __TBB_CompareAndSwap8(P,V,C) __TBB_machine_cmpswp8(P,V,C)\n#define __TBB_Pause(V) __TBB_machine_pause(V)\n\n// Use generics for some things\n#define __TBB_USE_GENERIC_PART_WORD_CAS                         1\n#define __TBB_USE_GENERIC_PART_WORD_FETCH_ADD                   1\n#define __TBB_USE_GENERIC_PART_WORD_FETCH_STORE                 1\n#define __TBB_USE_GENERIC_FETCH_STORE                           1\n#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE                1\n#define __TBB_USE_GENERIC_DWORD_LOAD_STORE                      1\n#define __TBB_USE_GENERIC_SEQUENTIAL_CONSISTENCY_LOAD_STORE     1\n"
  },
  {
    "path": "benchmarks/tbb/machine/gcc_generic.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#if !defined(__TBB_machine_H) || defined(__TBB_machine_gcc_generic_H)\n#error Do not #include this internal file directly; use public TBB headers instead.\n#endif\n\n#define __TBB_machine_gcc_generic_H\n\n#include <stdint.h>\n#include <unistd.h>\n\n#define __TBB_WORDSIZE      __SIZEOF_POINTER__\n\n#if __TBB_GCC_64BIT_ATOMIC_BUILTINS_BROKEN\n    #define __TBB_64BIT_ATOMICS 0\n#endif\n\n/** FPU control setting not available for non-Intel architectures on Android **/\n#if __ANDROID__ && __TBB_generic_arch \n    #define __TBB_CPU_CTL_ENV_PRESENT 0\n#endif\n\n// __BYTE_ORDER__ is used in accordance with http://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html,\n// but __BIG_ENDIAN__ or __LITTLE_ENDIAN__ may be more commonly found instead.\n#if __BIG_ENDIAN__ || (defined(__BYTE_ORDER__) && __BYTE_ORDER__==__ORDER_BIG_ENDIAN__)\n    #define __TBB_ENDIANNESS __TBB_ENDIAN_BIG\n#elif __LITTLE_ENDIAN__ || (defined(__BYTE_ORDER__) && __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__)\n    #define __TBB_ENDIANNESS __TBB_ENDIAN_LITTLE\n#elif defined(__BYTE_ORDER__)\n    #define __TBB_ENDIANNESS __TBB_ENDIAN_UNSUPPORTED\n#else\n    #define __TBB_ENDIANNESS __TBB_ENDIAN_DETECT\n#endif\n\n/** As this generic implementation has absolutely no information about underlying\n    hardware, its performance most likely will be sub-optimal because of full memory\n    fence usages where a more lightweight synchronization means (or none at all)\n    could suffice. Thus if you use this header to enable TBB on a new platform,\n    consider forking it and relaxing below helpers as appropriate. **/\n#define __TBB_acquire_consistency_helper()  __sync_synchronize()\n#define __TBB_release_consistency_helper()  __sync_synchronize()\n#define __TBB_full_memory_fence()           __sync_synchronize()\n#define __TBB_control_consistency_helper()  __sync_synchronize()\n\n#define __TBB_MACHINE_DEFINE_ATOMICS(S,T)                                                         \\\ninline T __TBB_machine_cmpswp##S( volatile void *ptr, T value, T comparand ) {                    \\\n    return __sync_val_compare_and_swap(reinterpret_cast<volatile T *>(ptr),comparand,value);      \\\n}                                                                                                 \\\n                                                                                                  \\\ninline T __TBB_machine_fetchadd##S( volatile void *ptr, T value ) {                               \\\n    return __sync_fetch_and_add(reinterpret_cast<volatile T *>(ptr),value);                       \\\n}                                                                                                 \\\n\n__TBB_MACHINE_DEFINE_ATOMICS(1,int8_t)\n__TBB_MACHINE_DEFINE_ATOMICS(2,int16_t)\n__TBB_MACHINE_DEFINE_ATOMICS(4,int32_t)\n__TBB_MACHINE_DEFINE_ATOMICS(8,int64_t)\n\n#undef __TBB_MACHINE_DEFINE_ATOMICS\n\nnamespace tbb{ namespace internal { namespace gcc_builtins {\n    inline int clz(unsigned int x){ return __builtin_clz(x);}\n    inline int clz(unsigned long int x){ return __builtin_clzl(x);}\n    inline int clz(unsigned long long int x){ return __builtin_clzll(x);}\n}}}\n//gcc __builtin_clz builtin count _number_ of leading zeroes\nstatic inline intptr_t __TBB_machine_lg( uintptr_t x ) {\n    return sizeof(x)*8 - tbb::internal::gcc_builtins::clz(x) -1 ;\n}\n\nstatic inline void __TBB_machine_or( volatile void *ptr, uintptr_t addend ) {\n    __sync_fetch_and_or(reinterpret_cast<volatile uintptr_t *>(ptr),addend);\n}\n\nstatic inline void __TBB_machine_and( volatile void *ptr, uintptr_t addend ) {\n    __sync_fetch_and_and(reinterpret_cast<volatile uintptr_t *>(ptr),addend);\n}\n\n\ntypedef unsigned char __TBB_Flag;\n\ntypedef __TBB_atomic __TBB_Flag __TBB_atomic_flag;\n\ninline bool __TBB_machine_try_lock_byte( __TBB_atomic_flag &flag ) {\n    return __sync_lock_test_and_set(&flag,1)==0;\n}\n\ninline void __TBB_machine_unlock_byte( __TBB_atomic_flag &flag ) {\n    __sync_lock_release(&flag);\n}\n\n// Machine specific atomic operations\n#define __TBB_AtomicOR(P,V)     __TBB_machine_or(P,V)\n#define __TBB_AtomicAND(P,V)    __TBB_machine_and(P,V)\n\n#define __TBB_TryLockByte   __TBB_machine_try_lock_byte\n#define __TBB_UnlockByte    __TBB_machine_unlock_byte\n\n// Definition of other functions\n#define __TBB_Log2(V)           __TBB_machine_lg(V)\n\n#define __TBB_USE_GENERIC_FETCH_STORE                       1\n#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE            1\n#define __TBB_USE_GENERIC_RELAXED_LOAD_STORE                1\n#define __TBB_USE_GENERIC_SEQUENTIAL_CONSISTENCY_LOAD_STORE 1\n\n#if __TBB_WORDSIZE==4\n    #define __TBB_USE_GENERIC_DWORD_LOAD_STORE              1\n#endif\n\n#if __TBB_x86_32 || __TBB_x86_64\n#include \"gcc_itsx.h\"\n#endif\n"
  },
  {
    "path": "benchmarks/tbb/machine/gcc_ia32_common.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_machine_gcc_ia32_common_H\n#define __TBB_machine_gcc_ia32_common_H\n\n//TODO: Add a higher-level function, e.g. tbb::interal::log2(), into tbb_stddef.h, which\n//uses __TBB_Log2 and contains the assert and remove the assert from here and all other\n//platform-specific headers.\n//TODO: Check if use of gcc intrinsic gives a better chance for cross call optimizations\ntemplate <typename T>\nstatic inline intptr_t __TBB_machine_lg( T x ) {\n    __TBB_ASSERT(x>0, \"The logarithm of a non-positive value is undefined.\");\n    uintptr_t j;\n    __asm__(\"bsr %1,%0\" : \"=r\"(j) : \"r\"((uintptr_t)x));\n    return j;\n}\n#define __TBB_Log2(V)  __TBB_machine_lg(V)\n\n#ifndef __TBB_Pause\n//TODO: check if raising a ratio of pause instructions to loop control instructions\n//(via e.g. loop unrolling) gives any benefit for HT.  E.g, the current implementation\n//does about 2 CPU-consuming instructions for every pause instruction.  Perhaps for\n//high pause counts it should use an unrolled loop to raise the ratio, and thus free\n//up more integer cycles for the other hyperthread.  On the other hand, if the loop is\n//unrolled too far, it won't fit in the core's loop cache, and thus take away\n//instruction decode slots from the other hyperthread.\n\n//TODO: check if use of gcc __builtin_ia32_pause intrinsic gives a \"some how\" better performing code\nstatic inline void __TBB_machine_pause( int32_t delay ) {\n    for (int32_t i = 0; i < delay; i++) {\n       __asm__ __volatile__(\"pause;\");\n    }\n    return;\n}\n#define __TBB_Pause(V) __TBB_machine_pause(V)\n#endif /* !__TBB_Pause */\n\n// API to retrieve/update FPU control setting\n#ifndef __TBB_CPU_CTL_ENV_PRESENT\n#define __TBB_CPU_CTL_ENV_PRESENT 1\nnamespace tbb {\nnamespace internal {\nclass cpu_ctl_env {\nprivate:\n    int     mxcsr;\n    short   x87cw;\n    static const int MXCSR_CONTROL_MASK = ~0x3f; /* all except last six status bits */\npublic:\n    bool operator!=( const cpu_ctl_env& ctl ) const { return mxcsr != ctl.mxcsr || x87cw != ctl.x87cw; }\n    void get_env() {\n    #if __TBB_ICC_12_0_INL_ASM_FSTCW_BROKEN\n        cpu_ctl_env loc_ctl;\n        __asm__ __volatile__ (\n                \"stmxcsr %0\\n\\t\"\n                \"fstcw %1\"\n                : \"=m\"(loc_ctl.mxcsr), \"=m\"(loc_ctl.x87cw)\n        );\n        *this = loc_ctl;\n    #else\n        __asm__ __volatile__ (\n                \"stmxcsr %0\\n\\t\"\n                \"fstcw %1\"\n                : \"=m\"(mxcsr), \"=m\"(x87cw)\n        );\n    #endif\n        mxcsr &= MXCSR_CONTROL_MASK;\n    }\n    void set_env() const {\n        __asm__ __volatile__ (\n                \"ldmxcsr %0\\n\\t\"\n                \"fldcw %1\"\n                : : \"m\"(mxcsr), \"m\"(x87cw)\n        );\n    }\n};\n} // namespace internal\n} // namespace tbb\n#endif /* !__TBB_CPU_CTL_ENV_PRESENT */\n\n#include \"gcc_itsx.h\"\n\n#endif /* __TBB_machine_gcc_ia32_common_H */\n"
  },
  {
    "path": "benchmarks/tbb/machine/gcc_itsx.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#if !defined(__TBB_machine_H) || defined(__TBB_machine_gcc_itsx_H)\n#error Do not #include this internal file directly; use public TBB headers instead.\n#endif\n\n#define __TBB_machine_gcc_itsx_H\n\n#define __TBB_OP_XACQUIRE 0xF2\n#define __TBB_OP_XRELEASE 0xF3\n#define __TBB_OP_LOCK     0xF0\n\n#define __TBB_STRINGIZE_INTERNAL(arg) #arg\n#define __TBB_STRINGIZE(arg) __TBB_STRINGIZE_INTERNAL(arg)\n\n#ifdef __TBB_x86_64\n#define __TBB_r_out \"=r\"\n#else\n#define __TBB_r_out \"=q\"\n#endif\n\ninline static uint8_t __TBB_machine_try_lock_elided( volatile uint8_t* lk )\n{\n    uint8_t value = 1;\n    __asm__ volatile (\".byte \" __TBB_STRINGIZE(__TBB_OP_XACQUIRE)\"; lock; xchgb %0, %1;\"\n                      : __TBB_r_out(value), \"=m\"(*lk)  : \"0\"(value), \"m\"(*lk) : \"memory\" );\n    return uint8_t(value^1);\n}\n\ninline static void __TBB_machine_try_lock_elided_cancel()\n{\n    // 'pause' instruction aborts HLE/RTM transactions\n    __asm__ volatile (\"pause\\n\" : : : \"memory\" );\n}\n\ninline static void __TBB_machine_unlock_elided( volatile uint8_t* lk )\n{\n    __asm__ volatile (\".byte \" __TBB_STRINGIZE(__TBB_OP_XRELEASE)\"; movb $0, %0\" \n                      : \"=m\"(*lk) : \"m\"(*lk) : \"memory\" );\n}\n\n#if __TBB_TSX_INTRINSICS_PRESENT\n#include <immintrin.h>\n\n#define __TBB_machine_is_in_transaction _xtest\n#define __TBB_machine_begin_transaction _xbegin\n#define __TBB_machine_end_transaction   _xend\n#define __TBB_machine_transaction_conflict_abort() _xabort(0xff)\n\n#else\n\n/*!\n * Check if the instruction is executed in a transaction or not\n */\ninline static bool __TBB_machine_is_in_transaction()\n{\n    int8_t res = 0;\n#if __TBB_x86_32\n    __asm__ volatile (\".byte 0x0F; .byte 0x01; .byte 0xD6;\\n\"\n                      \"setz %0\" : \"=q\"(res) : : \"memory\" );\n#else\n    __asm__ volatile (\".byte 0x0F; .byte 0x01; .byte 0xD6;\\n\"\n                      \"setz %0\" : \"=r\"(res) : : \"memory\" );\n#endif\n    return res==0;\n}\n\n/*!\n * Enter speculative execution mode.\n * @return -1 on success\n *         abort cause ( or 0 ) on abort\n */\ninline static uint32_t __TBB_machine_begin_transaction()\n{\n    uint32_t res = ~uint32_t(0);   // success value\n    __asm__ volatile (\"1: .byte  0xC7; .byte 0xF8;\\n\"           //  XBEGIN <abort-offset>\n                      \"   .long  2f-1b-6\\n\"                     //  2f-1b == difference in addresses of start \n                                                                //  of XBEGIN and the MOVL\n                                                                //  2f - 1b - 6 == that difference minus the size of the\n                                                                //  XBEGIN instruction.  This is the abort offset to\n                                                                //  2: below.\n                      \"    jmp   3f\\n\"                          //  success (leave -1 in res)\n                      \"2:  movl  %%eax,%0\\n\"                    //  store failure code in res\n                      \"3:\"\n                      :\"=r\"(res):\"0\"(res):\"memory\",\"%eax\");\n    return res;\n}\n\n/*!\n * Attempt to commit/end transaction \n */\ninline static void __TBB_machine_end_transaction()\n{\n    __asm__ volatile (\".byte 0x0F; .byte 0x01; .byte 0xD5\" :::\"memory\");   // XEND\n}\n\n/*\n * aborts with code 0xFF (lock already held)\n */\ninline static void __TBB_machine_transaction_conflict_abort()\n{\n    __asm__ volatile (\".byte 0xC6; .byte 0xF8; .byte 0xFF\" :::\"memory\");\n}\n\n#endif /* __TBB_TSX_INTRINSICS_PRESENT */\n"
  },
  {
    "path": "benchmarks/tbb/machine/ibm_aix51.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n// TODO: revise by comparing with mac_ppc.h\n\n#if !defined(__TBB_machine_H) || defined(__TBB_machine_ibm_aix51_H)\n#error Do not #include this internal file directly; use public TBB headers instead.\n#endif\n\n#define __TBB_machine_ibm_aix51_H\n\n#define __TBB_WORDSIZE 8\n#define __TBB_ENDIANNESS __TBB_ENDIAN_BIG // assumption based on operating system\n\n#include <stdint.h>\n#include <unistd.h>\n#include <sched.h>\n\nextern \"C\" {\nint32_t __TBB_machine_cas_32 (volatile void* ptr, int32_t value, int32_t comparand);\nint64_t __TBB_machine_cas_64 (volatile void* ptr, int64_t value, int64_t comparand);\nvoid __TBB_machine_flush ();\nvoid __TBB_machine_lwsync ();\nvoid __TBB_machine_isync ();\n}\n\n// Mapping of old entry point names retained for the sake of backward binary compatibility\n#define __TBB_machine_cmpswp4 __TBB_machine_cas_32\n#define __TBB_machine_cmpswp8 __TBB_machine_cas_64\n\n#define __TBB_Yield() sched_yield()\n\n#define __TBB_USE_GENERIC_PART_WORD_CAS                     1\n#define __TBB_USE_GENERIC_FETCH_ADD                         1\n#define __TBB_USE_GENERIC_FETCH_STORE                       1\n#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE            1\n#define __TBB_USE_GENERIC_RELAXED_LOAD_STORE                1\n#define __TBB_USE_GENERIC_SEQUENTIAL_CONSISTENCY_LOAD_STORE 1\n\n#if __GNUC__\n    #define __TBB_control_consistency_helper() __asm__ __volatile__( \"isync\": : :\"memory\")\n    #define __TBB_acquire_consistency_helper() __asm__ __volatile__(\"lwsync\": : :\"memory\")\n    #define __TBB_release_consistency_helper() __asm__ __volatile__(\"lwsync\": : :\"memory\")\n    #define __TBB_full_memory_fence()          __asm__ __volatile__(  \"sync\": : :\"memory\")\n#else\n    // IBM C++ Compiler does not support inline assembly\n    // TODO: Since XL 9.0 or earlier GCC syntax is supported. Replace with more\n    //       lightweight implementation (like in mac_ppc.h)\n    #define __TBB_control_consistency_helper() __TBB_machine_isync ()\n    #define __TBB_acquire_consistency_helper() __TBB_machine_lwsync ()\n    #define __TBB_release_consistency_helper() __TBB_machine_lwsync ()\n    #define __TBB_full_memory_fence()          __TBB_machine_flush ()\n#endif\n"
  },
  {
    "path": "benchmarks/tbb/machine/icc_generic.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#if !defined(__TBB_machine_H) || defined(__TBB_machine_icc_generic_H)\n#error Do not #include this internal file directly; use public TBB headers instead.\n#endif\n\n#if ! __TBB_ICC_BUILTIN_ATOMICS_PRESENT\n    #error \"Intel C++ Compiler of at least 12.0 version is needed to use ICC intrinsics port\"\n#endif\n\n#define __TBB_machine_icc_generic_H\n\n//ICC mimics the \"native\" target compiler\n#if _MSC_VER\n    #include \"msvc_ia32_common.h\"\n#else\n    #include \"gcc_ia32_common.h\"\n#endif\n\n//TODO: Make __TBB_WORDSIZE macro optional for ICC intrinsics port.\n//As compiler intrinsics are used for all the operations it is possible to do.\n\n#if __TBB_x86_32\n    #define __TBB_WORDSIZE 4\n#else\n    #define __TBB_WORDSIZE 8\n#endif\n#define __TBB_ENDIANNESS __TBB_ENDIAN_LITTLE\n\n//__TBB_compiler_fence() defined just in case, as it seems not to be used on its own anywhere else\n#if _MSC_VER\n    //TODO: any way to use same intrinsics on windows and linux?\n    #pragma intrinsic(_ReadWriteBarrier)\n    #define __TBB_compiler_fence()    _ReadWriteBarrier()\n#else\n    #define __TBB_compiler_fence()    __asm__ __volatile__(\"\": : :\"memory\")\n#endif\n\n#ifndef __TBB_full_memory_fence\n#if _MSC_VER \n    //TODO: any way to use same intrinsics on windows and linux?\n    #pragma intrinsic(_mm_mfence)\n    #define __TBB_full_memory_fence() _mm_mfence()\n#else\n    #define __TBB_full_memory_fence() __asm__ __volatile__(\"mfence\": : :\"memory\")\n#endif\n#endif\n\n#define __TBB_control_consistency_helper() __TBB_compiler_fence()\n\nnamespace tbb { namespace internal {\n//TODO: is there any way to reuse definition of memory_order enum from ICC instead of copy paste.\n//however it seems unlikely that ICC will silently change exact enum values, as they are defined\n//in the ISO exactly like this.\n//TODO: add test that exact values of the enum are same as in the ISO C++11\ntypedef enum memory_order {\n    memory_order_relaxed, memory_order_consume, memory_order_acquire,\n    memory_order_release, memory_order_acq_rel, memory_order_seq_cst\n} memory_order;\n\nnamespace icc_intrinsics_port {\n    template <typename T>\n    T convert_argument(T value){\n        return value;\n    }\n    //The overload below is needed to have explicit conversion of pointer to void* in argument list.\n    //compiler bug?\n    //TODO: add according broken macro and recheck with ICC 13.0 if the overload is still needed\n    template <typename T>\n    void* convert_argument(T* value){\n        return (void*)value;\n    }\n}\n//TODO: code below is a bit repetitive, consider simplifying it\ntemplate <typename T, size_t S>\nstruct machine_load_store {\n    static T load_with_acquire ( const volatile T& location ) {\n        return __atomic_load_explicit(&location, memory_order_acquire);\n    }\n    static void store_with_release ( volatile T &location, T value ) {\n        __atomic_store_explicit(&location, icc_intrinsics_port::convert_argument(value), memory_order_release);\n    }\n};\n\ntemplate <typename T, size_t S>\nstruct machine_load_store_relaxed {\n    static inline T load ( const T& location ) {\n        return __atomic_load_explicit(&location, memory_order_relaxed);\n    }\n    static inline void store (  T& location, T value ) {\n        __atomic_store_explicit(&location, icc_intrinsics_port::convert_argument(value), memory_order_relaxed);\n    }\n};\n\ntemplate <typename T, size_t S>\nstruct machine_load_store_seq_cst {\n    static T load ( const volatile T& location ) {\n        return __atomic_load_explicit(&location, memory_order_seq_cst);\n    }\n\n    static void store ( volatile T &location, T value ) {\n        __atomic_store_explicit(&location, value, memory_order_seq_cst);\n    }\n};\n\n}} // namespace tbb::internal\n\nnamespace tbb{ namespace internal { namespace icc_intrinsics_port{\n    typedef enum memory_order_map {\n        relaxed = memory_order_relaxed,\n        acquire = memory_order_acquire,\n        release = memory_order_release,\n        full_fence=  memory_order_seq_cst\n    } memory_order_map;\n}}}// namespace tbb::internal\n\n#define __TBB_MACHINE_DEFINE_ATOMICS(S,T,M)                                                     \\\ninline T __TBB_machine_cmpswp##S##M( volatile void *ptr, T value, T comparand ) {               \\\n    __atomic_compare_exchange_strong_explicit(                                                  \\\n            (T*)ptr                                                                             \\\n            ,&comparand                                                                         \\\n            ,value                                                                              \\\n            , tbb::internal::icc_intrinsics_port::M                                             \\\n            , tbb::internal::icc_intrinsics_port::M);                                           \\\n    return comparand;                                                                           \\\n}                                                                                               \\\n                                                                                                \\\ninline T __TBB_machine_fetchstore##S##M(volatile void *ptr, T value) {                          \\\n    return __atomic_exchange_explicit((T*)ptr, value, tbb::internal::icc_intrinsics_port::M);   \\\n}                                                                                               \\\n                                                                                                \\\ninline T __TBB_machine_fetchadd##S##M(volatile void *ptr, T value) {                            \\\n    return __atomic_fetch_add_explicit((T*)ptr, value, tbb::internal::icc_intrinsics_port::M);  \\\n}                                                                                               \\\n\n__TBB_MACHINE_DEFINE_ATOMICS(1,tbb::internal::int8_t, full_fence)\n__TBB_MACHINE_DEFINE_ATOMICS(1,tbb::internal::int8_t, acquire)\n__TBB_MACHINE_DEFINE_ATOMICS(1,tbb::internal::int8_t, release)\n__TBB_MACHINE_DEFINE_ATOMICS(1,tbb::internal::int8_t, relaxed)\n\n__TBB_MACHINE_DEFINE_ATOMICS(2,tbb::internal::int16_t, full_fence)\n__TBB_MACHINE_DEFINE_ATOMICS(2,tbb::internal::int16_t, acquire)\n__TBB_MACHINE_DEFINE_ATOMICS(2,tbb::internal::int16_t, release)\n__TBB_MACHINE_DEFINE_ATOMICS(2,tbb::internal::int16_t, relaxed)\n\n__TBB_MACHINE_DEFINE_ATOMICS(4,tbb::internal::int32_t, full_fence)\n__TBB_MACHINE_DEFINE_ATOMICS(4,tbb::internal::int32_t, acquire)\n__TBB_MACHINE_DEFINE_ATOMICS(4,tbb::internal::int32_t, release)\n__TBB_MACHINE_DEFINE_ATOMICS(4,tbb::internal::int32_t, relaxed)\n\n__TBB_MACHINE_DEFINE_ATOMICS(8,tbb::internal::int64_t, full_fence)\n__TBB_MACHINE_DEFINE_ATOMICS(8,tbb::internal::int64_t, acquire)\n__TBB_MACHINE_DEFINE_ATOMICS(8,tbb::internal::int64_t, release)\n__TBB_MACHINE_DEFINE_ATOMICS(8,tbb::internal::int64_t, relaxed)\n\n\n#undef __TBB_MACHINE_DEFINE_ATOMICS\n\n#define __TBB_USE_FENCED_ATOMICS                            1\n\nnamespace tbb { namespace internal {\n#if __TBB_FORCE_64BIT_ALIGNMENT_BROKEN\n__TBB_MACHINE_DEFINE_LOAD8_GENERIC_FENCED(full_fence)\n__TBB_MACHINE_DEFINE_STORE8_GENERIC_FENCED(full_fence)\n\n__TBB_MACHINE_DEFINE_LOAD8_GENERIC_FENCED(acquire)\n__TBB_MACHINE_DEFINE_STORE8_GENERIC_FENCED(release)\n\n__TBB_MACHINE_DEFINE_LOAD8_GENERIC_FENCED(relaxed)\n__TBB_MACHINE_DEFINE_STORE8_GENERIC_FENCED(relaxed)\n\ntemplate <typename T>\nstruct machine_load_store<T,8> {\n    static T load_with_acquire ( const volatile T& location ) {\n        if( tbb::internal::is_aligned(&location,8)) {\n            return __atomic_load_explicit(&location, memory_order_acquire);\n        } else {\n            return __TBB_machine_generic_load8acquire(&location);\n        }\n    }\n    static void store_with_release ( volatile T &location, T value ) {\n        if( tbb::internal::is_aligned(&location,8)) {\n            __atomic_store_explicit(&location, icc_intrinsics_port::convert_argument(value), memory_order_release);\n        } else {\n            return __TBB_machine_generic_store8release(&location,value);\n        }\n    }\n};\n\ntemplate <typename T>\nstruct machine_load_store_relaxed<T,8> {\n    static T load( const volatile T& location ) {\n        if( tbb::internal::is_aligned(&location,8)) {\n            return __atomic_load_explicit(&location, memory_order_relaxed);\n        } else {\n            return __TBB_machine_generic_load8relaxed(&location);\n        }\n    }\n    static void store( volatile T &location, T value ) {\n        if( tbb::internal::is_aligned(&location,8)) {\n            __atomic_store_explicit(&location, icc_intrinsics_port::convert_argument(value), memory_order_relaxed);\n        } else {\n            return __TBB_machine_generic_store8relaxed(&location,value);\n        }\n    }\n};\n\ntemplate <typename T >\nstruct machine_load_store_seq_cst<T,8> {\n    static T load ( const volatile T& location ) {\n        if( tbb::internal::is_aligned(&location,8)) {\n            return __atomic_load_explicit(&location, memory_order_seq_cst);\n        } else {\n            return __TBB_machine_generic_load8full_fence(&location);\n        }\n\n    }\n\n    static void store ( volatile T &location, T value ) {\n        if( tbb::internal::is_aligned(&location,8)) {\n            __atomic_store_explicit(&location, value, memory_order_seq_cst);\n        } else {\n            return __TBB_machine_generic_store8full_fence(&location,value);\n        }\n\n    }\n};\n\n#endif\n}} // namespace tbb::internal\ntemplate <typename T>\ninline void __TBB_machine_OR( T *operand, T addend ) {\n    __atomic_fetch_or_explicit(operand, addend, tbb::internal::memory_order_seq_cst);\n}\n\ntemplate <typename T>\ninline void __TBB_machine_AND( T *operand, T addend ) {\n    __atomic_fetch_and_explicit(operand, addend, tbb::internal::memory_order_seq_cst);\n}\n\n"
  },
  {
    "path": "benchmarks/tbb/machine/linux_common.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_machine_H\n#error Do not #include this internal file directly; use public TBB headers instead.\n#endif\n\n#include <sched.h>\n#define __TBB_Yield()  sched_yield()\n\n#include <unistd.h>\n/* Futex definitions */\n#include <sys/syscall.h>\n\n#if defined(SYS_futex)\n\n#define __TBB_USE_FUTEX 1\n#include <limits.h>\n#include <errno.h>\n// Unfortunately, some versions of Linux do not have a header that defines FUTEX_WAIT and FUTEX_WAKE.\n\n#ifdef FUTEX_WAIT\n#define __TBB_FUTEX_WAIT FUTEX_WAIT\n#else\n#define __TBB_FUTEX_WAIT 0\n#endif\n\n#ifdef FUTEX_WAKE\n#define __TBB_FUTEX_WAKE FUTEX_WAKE\n#else\n#define __TBB_FUTEX_WAKE 1\n#endif\n\n#ifndef __TBB_ASSERT\n#error machine specific headers must be included after tbb_stddef.h\n#endif\n\nnamespace tbb {\n\nnamespace internal {\n\ninline int futex_wait( void *futex, int comparand ) {\n    int r = syscall( SYS_futex,futex,__TBB_FUTEX_WAIT,comparand,NULL,NULL,0 );\n#if TBB_USE_ASSERT\n    int e = errno;\n    __TBB_ASSERT( r==0||r==EWOULDBLOCK||(r==-1&&(e==EAGAIN||e==EINTR)), \"futex_wait failed.\" );\n#endif /* TBB_USE_ASSERT */\n    return r;\n}\n\ninline int futex_wakeup_one( void *futex ) {\n    int r = ::syscall( SYS_futex,futex,__TBB_FUTEX_WAKE,1,NULL,NULL,0 );\n    __TBB_ASSERT( r==0||r==1, \"futex_wakeup_one: more than one thread woken up?\" );\n    return r;\n}\n\ninline int futex_wakeup_all( void *futex ) {\n    int r = ::syscall( SYS_futex,futex,__TBB_FUTEX_WAKE,INT_MAX,NULL,NULL,0 );\n    __TBB_ASSERT( r>=0, \"futex_wakeup_all: error in waking up threads\" );\n    return r;\n}\n\n} /* namespace internal */\n\n} /* namespace tbb */\n\n#endif /* SYS_futex */\n"
  },
  {
    "path": "benchmarks/tbb/machine/linux_ia32.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#if !defined(__TBB_machine_H) || defined(__TBB_machine_linux_ia32_H)\n#error Do not #include this internal file directly; use public TBB headers instead.\n#endif\n\n#define __TBB_machine_linux_ia32_H\n\n#include <stdint.h>\n#include \"gcc_ia32_common.h\"\n\n#define __TBB_WORDSIZE 4\n#define __TBB_ENDIANNESS __TBB_ENDIAN_LITTLE\n\n#define __TBB_compiler_fence() __asm__ __volatile__(\"\": : :\"memory\")\n#define __TBB_control_consistency_helper() __TBB_compiler_fence()\n#define __TBB_acquire_consistency_helper() __TBB_compiler_fence()\n#define __TBB_release_consistency_helper() __TBB_compiler_fence()\n#define __TBB_full_memory_fence()          __asm__ __volatile__(\"mfence\": : :\"memory\")\n\n#if __TBB_ICC_ASM_VOLATILE_BROKEN\n#define __TBB_VOLATILE\n#else\n#define __TBB_VOLATILE volatile\n#endif\n\n#define __TBB_MACHINE_DEFINE_ATOMICS(S,T,X,R)                                        \\\nstatic inline T __TBB_machine_cmpswp##S (volatile void *ptr, T value, T comparand )  \\\n{                                                                                    \\\n    T result;                                                                        \\\n                                                                                     \\\n    __asm__ __volatile__(\"lock\\ncmpxchg\" X \" %2,%1\"                                  \\\n                          : \"=a\"(result), \"=m\"(*(__TBB_VOLATILE T*)ptr)              \\\n                          : \"q\"(value), \"0\"(comparand), \"m\"(*(__TBB_VOLATILE T*)ptr) \\\n                          : \"memory\");                                               \\\n    return result;                                                                   \\\n}                                                                                    \\\n                                                                                     \\\nstatic inline T __TBB_machine_fetchadd##S(volatile void *ptr, T addend)              \\\n{                                                                                    \\\n    T result;                                                                        \\\n    __asm__ __volatile__(\"lock\\nxadd\" X \" %0,%1\"                                     \\\n                          : R (result), \"=m\"(*(__TBB_VOLATILE T*)ptr)                \\\n                          : \"0\"(addend), \"m\"(*(__TBB_VOLATILE T*)ptr)                \\\n                          : \"memory\");                                               \\\n    return result;                                                                   \\\n}                                                                                    \\\n                                                                                     \\\nstatic inline  T __TBB_machine_fetchstore##S(volatile void *ptr, T value)            \\\n{                                                                                    \\\n    T result;                                                                        \\\n    __asm__ __volatile__(\"lock\\nxchg\" X \" %0,%1\"                                     \\\n                          : R (result), \"=m\"(*(__TBB_VOLATILE T*)ptr)                \\\n                          : \"0\"(value), \"m\"(*(__TBB_VOLATILE T*)ptr)                 \\\n                          : \"memory\");                                               \\\n    return result;                                                                   \\\n}                                                                                    \\\n                                                                                     \n__TBB_MACHINE_DEFINE_ATOMICS(1,int8_t,\"\",\"=q\")\n__TBB_MACHINE_DEFINE_ATOMICS(2,int16_t,\"\",\"=r\")\n__TBB_MACHINE_DEFINE_ATOMICS(4,int32_t,\"l\",\"=r\")\n\n#if __INTEL_COMPILER\n#pragma warning( push )\n// reference to EBX in a function requiring stack alignment\n#pragma warning( disable: 998 )\n#endif\n\n#if __TBB_GCC_CAS8_BUILTIN_INLINING_BROKEN\n#define  __TBB_IA32_CAS8_NOINLINE  __attribute__ ((noinline))\n#else\n#define  __TBB_IA32_CAS8_NOINLINE\n#endif\n\nstatic inline __TBB_IA32_CAS8_NOINLINE int64_t __TBB_machine_cmpswp8 (volatile void *ptr, int64_t value, int64_t comparand )  {\n//TODO: remove the extra part of condition once __TBB_GCC_BUILTIN_ATOMICS_PRESENT is lowered to gcc version 4.1.2\n#if (__TBB_GCC_BUILTIN_ATOMICS_PRESENT || (__TBB_GCC_VERSION >= 40102)) && !__TBB_GCC_64BIT_ATOMIC_BUILTINS_BROKEN\n    return __sync_val_compare_and_swap( reinterpret_cast<volatile int64_t*>(ptr), comparand, value );\n#else /* !__TBB_GCC_BUILTIN_ATOMICS_PRESENT */\n    //TODO: look like ICC 13.0 has some issues with this code, investigate it more deeply\n    int64_t result;\n    union {\n        int64_t i64;\n        int32_t i32[2];\n    };\n    i64 = value;\n#if __PIC__ \n    /* compiling position-independent code */\n    // EBX register preserved for compliance with position-independent code rules on IA32\n    int32_t tmp;\n    __asm__ __volatile__ (\n            \"movl  %%ebx,%2\\n\\t\"\n            \"movl  %5,%%ebx\\n\\t\"\n#if __GNUC__==3\n            \"lock\\n\\t cmpxchg8b %1\\n\\t\"\n#else\n            \"lock\\n\\t cmpxchg8b (%3)\\n\\t\"\n#endif\n            \"movl  %2,%%ebx\"\n             : \"=A\"(result)\n             , \"=m\"(*(__TBB_VOLATILE int64_t *)ptr)\n             , \"=m\"(tmp)\n#if __GNUC__==3\n             : \"m\"(*(__TBB_VOLATILE int64_t *)ptr)\n#else\n             : \"SD\"(ptr)\n#endif\n             , \"0\"(comparand)\n             , \"m\"(i32[0]), \"c\"(i32[1])\n             : \"memory\"\n#if __INTEL_COMPILER\n             ,\"ebx\"\n#endif\n    );\n#else /* !__PIC__ */\n    __asm__ __volatile__ (\n            \"lock\\n\\t cmpxchg8b %1\\n\\t\"\n             : \"=A\"(result), \"=m\"(*(__TBB_VOLATILE int64_t *)ptr)\n             : \"m\"(*(__TBB_VOLATILE int64_t *)ptr)\n             , \"0\"(comparand)\n             , \"b\"(i32[0]), \"c\"(i32[1])\n             : \"memory\"\n    );\n#endif /* __PIC__ */\n    return result;\n#endif /* !__TBB_GCC_BUILTIN_ATOMICS_PRESENT */\n}\n\n#undef __TBB_IA32_CAS8_NOINLINE\n\n#if __INTEL_COMPILER\n#pragma warning( pop )\n#endif // warning 998 is back\n\nstatic inline void __TBB_machine_or( volatile void *ptr, uint32_t addend ) {\n    __asm__ __volatile__(\"lock\\norl %1,%0\" : \"=m\"(*(__TBB_VOLATILE uint32_t *)ptr) : \"r\"(addend), \"m\"(*(__TBB_VOLATILE uint32_t *)ptr) : \"memory\");\n}\n\nstatic inline void __TBB_machine_and( volatile void *ptr, uint32_t addend ) {\n    __asm__ __volatile__(\"lock\\nandl %1,%0\" : \"=m\"(*(__TBB_VOLATILE uint32_t *)ptr) : \"r\"(addend), \"m\"(*(__TBB_VOLATILE uint32_t *)ptr) : \"memory\");\n}\n\n//TODO: Check if it possible and profitable for IA-32 architecture on (Linux* and Windows*)\n//to use of 64-bit load/store via floating point registers together with full fence\n//for sequentially consistent load/store, instead of CAS.\n\n#if __clang__\n#define __TBB_fildq  \"fildll\"\n#define __TBB_fistpq \"fistpll\"\n#else\n#define __TBB_fildq  \"fildq\"\n#define __TBB_fistpq \"fistpq\"\n#endif\n\nstatic inline int64_t __TBB_machine_aligned_load8 (const volatile void *ptr) {\n    __TBB_ASSERT(tbb::internal::is_aligned(ptr,8),\"__TBB_machine_aligned_load8 should be used with 8 byte aligned locations only \\n\");\n    int64_t result;\n    __asm__ __volatile__ ( __TBB_fildq  \" %1\\n\\t\"\n                           __TBB_fistpq \" %0\" :  \"=m\"(result) : \"m\"(*(const __TBB_VOLATILE uint64_t*)ptr) : \"memory\" );\n    return result;\n}\n\nstatic inline void __TBB_machine_aligned_store8 (volatile void *ptr, int64_t value ) {\n    __TBB_ASSERT(tbb::internal::is_aligned(ptr,8),\"__TBB_machine_aligned_store8 should be used with 8 byte aligned locations only \\n\");\n    // Aligned store\n    __asm__ __volatile__ ( __TBB_fildq  \" %1\\n\\t\"\n                           __TBB_fistpq \" %0\" :  \"=m\"(*(__TBB_VOLATILE int64_t*)ptr) : \"m\"(value) : \"memory\" );\n}\n\nstatic inline int64_t __TBB_machine_load8 (const volatile void *ptr) {\n#if __TBB_FORCE_64BIT_ALIGNMENT_BROKEN\n    if( tbb::internal::is_aligned(ptr,8)) {\n#endif\n        return __TBB_machine_aligned_load8(ptr);\n#if __TBB_FORCE_64BIT_ALIGNMENT_BROKEN\n    } else {\n        // Unaligned load\n        return __TBB_machine_cmpswp8(const_cast<void*>(ptr),0,0);\n    }\n#endif\n}\n\n//! Handles misaligned 8-byte store\n/** Defined in tbb_misc.cpp */\nextern \"C\" void __TBB_machine_store8_slow( volatile void *ptr, int64_t value );\nextern \"C\" void __TBB_machine_store8_slow_perf_warning( volatile void *ptr );\n\nstatic inline void __TBB_machine_store8(volatile void *ptr, int64_t value) {\n#if __TBB_FORCE_64BIT_ALIGNMENT_BROKEN\n    if( tbb::internal::is_aligned(ptr,8)) {\n#endif\n        __TBB_machine_aligned_store8(ptr,value);\n#if __TBB_FORCE_64BIT_ALIGNMENT_BROKEN\n    } else {\n        // Unaligned store\n#if TBB_USE_PERFORMANCE_WARNINGS\n        __TBB_machine_store8_slow_perf_warning(ptr);\n#endif /* TBB_USE_PERFORMANCE_WARNINGS */\n        __TBB_machine_store8_slow(ptr,value);\n    }\n#endif\n}\n \n// Machine specific atomic operations\n#define __TBB_AtomicOR(P,V) __TBB_machine_or(P,V)\n#define __TBB_AtomicAND(P,V) __TBB_machine_and(P,V)\n\n#define __TBB_USE_GENERIC_DWORD_FETCH_ADD                   1\n#define __TBB_USE_GENERIC_DWORD_FETCH_STORE                 1\n#define __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE           1\n#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE            1\n#define __TBB_USE_GENERIC_RELAXED_LOAD_STORE                1\n#define __TBB_USE_GENERIC_SEQUENTIAL_CONSISTENCY_LOAD_STORE 1\n\n"
  },
  {
    "path": "benchmarks/tbb/machine/linux_ia64.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#if !defined(__TBB_machine_H) || defined(__TBB_machine_linux_ia64_H)\n#error Do not #include this internal file directly; use public TBB headers instead.\n#endif\n\n#define __TBB_machine_linux_ia64_H\n\n#include <stdint.h>\n#include <ia64intrin.h>\n\n#define __TBB_WORDSIZE 8\n#define __TBB_ENDIANNESS __TBB_ENDIAN_LITTLE\n\n#if __INTEL_COMPILER\n    #define __TBB_compiler_fence()\n    #define __TBB_control_consistency_helper() __TBB_compiler_fence()\n    #define __TBB_acquire_consistency_helper()\n    #define __TBB_release_consistency_helper()\n    #define __TBB_full_memory_fence()          __mf()\n#else\n    #define __TBB_compiler_fence() __asm__ __volatile__(\"\": : :\"memory\")\n    #define __TBB_control_consistency_helper() __TBB_compiler_fence()\n    // Even though GCC imbues volatile loads with acquire semantics, it sometimes moves \n    // loads over the acquire fence. The following helpers stop such incorrect code motion.\n    #define __TBB_acquire_consistency_helper() __TBB_compiler_fence()\n    #define __TBB_release_consistency_helper() __TBB_compiler_fence()\n    #define __TBB_full_memory_fence()          __asm__ __volatile__(\"mf\": : :\"memory\")\n#endif /* !__INTEL_COMPILER */\n\n// Most of the functions will be in a .s file\n// TODO: revise dynamic_link, memory pools and etc. if the library dependency is removed.\n\nextern \"C\" {\n    int8_t __TBB_machine_fetchadd1__TBB_full_fence (volatile void *ptr, int8_t addend);\n    int8_t __TBB_machine_fetchadd1acquire(volatile void *ptr, int8_t addend);\n    int8_t __TBB_machine_fetchadd1release(volatile void *ptr, int8_t addend);\n\n    int16_t __TBB_machine_fetchadd2__TBB_full_fence (volatile void *ptr, int16_t addend);\n    int16_t __TBB_machine_fetchadd2acquire(volatile void *ptr, int16_t addend);\n    int16_t __TBB_machine_fetchadd2release(volatile void *ptr, int16_t addend);\n\n    int32_t __TBB_machine_fetchadd4__TBB_full_fence (volatile void *ptr, int32_t value);\n    int32_t __TBB_machine_fetchadd4acquire(volatile void *ptr, int32_t addend);\n    int32_t __TBB_machine_fetchadd4release(volatile void *ptr, int32_t addend);\n\n    int64_t __TBB_machine_fetchadd8__TBB_full_fence (volatile void *ptr, int64_t value);\n    int64_t __TBB_machine_fetchadd8acquire(volatile void *ptr, int64_t addend);\n    int64_t __TBB_machine_fetchadd8release(volatile void *ptr, int64_t addend);\n\n    int8_t __TBB_machine_fetchstore1__TBB_full_fence (volatile void *ptr, int8_t value);\n    int8_t __TBB_machine_fetchstore1acquire(volatile void *ptr, int8_t value);\n    int8_t __TBB_machine_fetchstore1release(volatile void *ptr, int8_t value);\n\n    int16_t __TBB_machine_fetchstore2__TBB_full_fence (volatile void *ptr, int16_t value);\n    int16_t __TBB_machine_fetchstore2acquire(volatile void *ptr, int16_t value);\n    int16_t __TBB_machine_fetchstore2release(volatile void *ptr, int16_t value);\n\n    int32_t __TBB_machine_fetchstore4__TBB_full_fence (volatile void *ptr, int32_t value);\n    int32_t __TBB_machine_fetchstore4acquire(volatile void *ptr, int32_t value);\n    int32_t __TBB_machine_fetchstore4release(volatile void *ptr, int32_t value);\n\n    int64_t __TBB_machine_fetchstore8__TBB_full_fence (volatile void *ptr, int64_t value);\n    int64_t __TBB_machine_fetchstore8acquire(volatile void *ptr, int64_t value);\n    int64_t __TBB_machine_fetchstore8release(volatile void *ptr, int64_t value);\n\n    int8_t __TBB_machine_cmpswp1__TBB_full_fence (volatile void *ptr, int8_t value, int8_t comparand); \n    int8_t __TBB_machine_cmpswp1acquire(volatile void *ptr, int8_t value, int8_t comparand); \n    int8_t __TBB_machine_cmpswp1release(volatile void *ptr, int8_t value, int8_t comparand); \n\n    int16_t __TBB_machine_cmpswp2__TBB_full_fence (volatile void *ptr, int16_t value, int16_t comparand);\n    int16_t __TBB_machine_cmpswp2acquire(volatile void *ptr, int16_t value, int16_t comparand); \n    int16_t __TBB_machine_cmpswp2release(volatile void *ptr, int16_t value, int16_t comparand); \n\n    int32_t __TBB_machine_cmpswp4__TBB_full_fence (volatile void *ptr, int32_t value, int32_t comparand);\n    int32_t __TBB_machine_cmpswp4acquire(volatile void *ptr, int32_t value, int32_t comparand); \n    int32_t __TBB_machine_cmpswp4release(volatile void *ptr, int32_t value, int32_t comparand); \n\n    int64_t __TBB_machine_cmpswp8__TBB_full_fence (volatile void *ptr, int64_t value, int64_t comparand);\n    int64_t __TBB_machine_cmpswp8acquire(volatile void *ptr, int64_t value, int64_t comparand); \n    int64_t __TBB_machine_cmpswp8release(volatile void *ptr, int64_t value, int64_t comparand); \n\n    int64_t __TBB_machine_lg(uint64_t value);\n    void __TBB_machine_pause(int32_t delay);\n    bool __TBB_machine_trylockbyte( volatile unsigned char &ptr );\n    int64_t __TBB_machine_lockbyte( volatile unsigned char &ptr );\n\n    //! Retrieves the current RSE backing store pointer. IA64 specific.\n    void* __TBB_get_bsp();\n\n    int32_t __TBB_machine_load1_relaxed(const void *ptr);\n    int32_t __TBB_machine_load2_relaxed(const void *ptr);\n    int32_t __TBB_machine_load4_relaxed(const void *ptr);\n    int64_t __TBB_machine_load8_relaxed(const void *ptr);\n\n    void __TBB_machine_store1_relaxed(void *ptr, int32_t value);\n    void __TBB_machine_store2_relaxed(void *ptr, int32_t value);\n    void __TBB_machine_store4_relaxed(void *ptr, int32_t value);\n    void __TBB_machine_store8_relaxed(void *ptr, int64_t value);\n} // extern \"C\"\n\n// Mapping old entry points to the names corresponding to the new full_fence identifier.\n#define __TBB_machine_fetchadd1full_fence   __TBB_machine_fetchadd1__TBB_full_fence\n#define __TBB_machine_fetchadd2full_fence   __TBB_machine_fetchadd2__TBB_full_fence\n#define __TBB_machine_fetchadd4full_fence   __TBB_machine_fetchadd4__TBB_full_fence\n#define __TBB_machine_fetchadd8full_fence   __TBB_machine_fetchadd8__TBB_full_fence\n#define __TBB_machine_fetchstore1full_fence __TBB_machine_fetchstore1__TBB_full_fence\n#define __TBB_machine_fetchstore2full_fence __TBB_machine_fetchstore2__TBB_full_fence\n#define __TBB_machine_fetchstore4full_fence __TBB_machine_fetchstore4__TBB_full_fence\n#define __TBB_machine_fetchstore8full_fence __TBB_machine_fetchstore8__TBB_full_fence\n#define __TBB_machine_cmpswp1full_fence     __TBB_machine_cmpswp1__TBB_full_fence\n#define __TBB_machine_cmpswp2full_fence     __TBB_machine_cmpswp2__TBB_full_fence \n#define __TBB_machine_cmpswp4full_fence     __TBB_machine_cmpswp4__TBB_full_fence\n#define __TBB_machine_cmpswp8full_fence     __TBB_machine_cmpswp8__TBB_full_fence\n\n// Mapping relaxed operations to the entry points implementing them.\n/** On IA64 RMW operations implicitly have acquire semantics. Thus one cannot\n    actually have completely relaxed RMW operation here. **/\n#define __TBB_machine_fetchadd1relaxed      __TBB_machine_fetchadd1acquire\n#define __TBB_machine_fetchadd2relaxed      __TBB_machine_fetchadd2acquire\n#define __TBB_machine_fetchadd4relaxed      __TBB_machine_fetchadd4acquire\n#define __TBB_machine_fetchadd8relaxed      __TBB_machine_fetchadd8acquire\n#define __TBB_machine_fetchstore1relaxed    __TBB_machine_fetchstore1acquire\n#define __TBB_machine_fetchstore2relaxed    __TBB_machine_fetchstore2acquire\n#define __TBB_machine_fetchstore4relaxed    __TBB_machine_fetchstore4acquire\n#define __TBB_machine_fetchstore8relaxed    __TBB_machine_fetchstore8acquire\n#define __TBB_machine_cmpswp1relaxed        __TBB_machine_cmpswp1acquire\n#define __TBB_machine_cmpswp2relaxed        __TBB_machine_cmpswp2acquire \n#define __TBB_machine_cmpswp4relaxed        __TBB_machine_cmpswp4acquire\n#define __TBB_machine_cmpswp8relaxed        __TBB_machine_cmpswp8acquire\n\n#define __TBB_MACHINE_DEFINE_ATOMICS(S,V)                               \\\n    template <typename T>                                               \\\n    struct machine_load_store_relaxed<T,S> {                      \\\n        static inline T load ( const T& location ) {                    \\\n            return (T)__TBB_machine_load##S##_relaxed(&location);       \\\n        }                                                               \\\n        static inline void store ( T& location, T value ) {             \\\n            __TBB_machine_store##S##_relaxed(&location, (V)value);      \\\n        }                                                               \\\n    }\n\nnamespace tbb {\nnamespace internal {\n    __TBB_MACHINE_DEFINE_ATOMICS(1,int8_t);\n    __TBB_MACHINE_DEFINE_ATOMICS(2,int16_t);\n    __TBB_MACHINE_DEFINE_ATOMICS(4,int32_t);\n    __TBB_MACHINE_DEFINE_ATOMICS(8,int64_t);\n}} // namespaces internal, tbb\n\n#undef __TBB_MACHINE_DEFINE_ATOMICS\n\n#define __TBB_USE_FENCED_ATOMICS                            1\n#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE            1\n#define __TBB_USE_GENERIC_SEQUENTIAL_CONSISTENCY_LOAD_STORE 1\n\n// Definition of Lock functions\n#define __TBB_TryLockByte(P) __TBB_machine_trylockbyte(P)\n#define __TBB_LockByte(P)    __TBB_machine_lockbyte(P)\n\n// Definition of other utility functions\n#define __TBB_Pause(V) __TBB_machine_pause(V)\n#define __TBB_Log2(V)  __TBB_machine_lg(V)\n"
  },
  {
    "path": "benchmarks/tbb/machine/linux_intel64.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#if !defined(__TBB_machine_H) || defined(__TBB_machine_linux_intel64_H)\n#error Do not #include this internal file directly; use public TBB headers instead.\n#endif\n\n#define __TBB_machine_linux_intel64_H\n\n#include <stdint.h>\n#include \"gcc_ia32_common.h\"\n\n#define __TBB_WORDSIZE 8\n#define __TBB_ENDIANNESS __TBB_ENDIAN_LITTLE\n\n#define __TBB_compiler_fence() __asm__ __volatile__(\"\": : :\"memory\")\n#define __TBB_control_consistency_helper() __TBB_compiler_fence()\n#define __TBB_acquire_consistency_helper() __TBB_compiler_fence()\n#define __TBB_release_consistency_helper() __TBB_compiler_fence()\n\n#ifndef __TBB_full_memory_fence\n#define __TBB_full_memory_fence() __asm__ __volatile__(\"mfence\": : :\"memory\")\n#endif\n\n#define __TBB_MACHINE_DEFINE_ATOMICS(S,T,X)                                          \\\nstatic inline T __TBB_machine_cmpswp##S (volatile void *ptr, T value, T comparand )  \\\n{                                                                                    \\\n    T result;                                                                        \\\n                                                                                     \\\n    __asm__ __volatile__(\"lock\\ncmpxchg\" X \" %2,%1\"                                  \\\n                          : \"=a\"(result), \"=m\"(*(volatile T*)ptr)                    \\\n                          : \"q\"(value), \"0\"(comparand), \"m\"(*(volatile T*)ptr)       \\\n                          : \"memory\");                                               \\\n    return result;                                                                   \\\n}                                                                                    \\\n                                                                                     \\\nstatic inline T __TBB_machine_fetchadd##S(volatile void *ptr, T addend)              \\\n{                                                                                    \\\n    T result;                                                                        \\\n    __asm__ __volatile__(\"lock\\nxadd\" X \" %0,%1\"                                     \\\n                          : \"=r\"(result),\"=m\"(*(volatile T*)ptr)                     \\\n                          : \"0\"(addend), \"m\"(*(volatile T*)ptr)                      \\\n                          : \"memory\");                                               \\\n    return result;                                                                   \\\n}                                                                                    \\\n                                                                                     \\\nstatic inline  T __TBB_machine_fetchstore##S(volatile void *ptr, T value)            \\\n{                                                                                    \\\n    T result;                                                                        \\\n    __asm__ __volatile__(\"lock\\nxchg\" X \" %0,%1\"                                     \\\n                          : \"=r\"(result),\"=m\"(*(volatile T*)ptr)                     \\\n                          : \"0\"(value), \"m\"(*(volatile T*)ptr)                       \\\n                          : \"memory\");                                               \\\n    return result;                                                                   \\\n}                                                                                    \\\n\n__TBB_MACHINE_DEFINE_ATOMICS(1,int8_t,\"\")\n__TBB_MACHINE_DEFINE_ATOMICS(2,int16_t,\"\")\n__TBB_MACHINE_DEFINE_ATOMICS(4,int32_t,\"\")\n__TBB_MACHINE_DEFINE_ATOMICS(8,int64_t,\"q\")\n\n#undef __TBB_MACHINE_DEFINE_ATOMICS\n\nstatic inline void __TBB_machine_or( volatile void *ptr, uint64_t value ) {\n    __asm__ __volatile__(\"lock\\norq %1,%0\" : \"=m\"(*(volatile uint64_t*)ptr) : \"r\"(value), \"m\"(*(volatile uint64_t*)ptr) : \"memory\");\n}\n\nstatic inline void __TBB_machine_and( volatile void *ptr, uint64_t value ) {\n    __asm__ __volatile__(\"lock\\nandq %1,%0\" : \"=m\"(*(volatile uint64_t*)ptr) : \"r\"(value), \"m\"(*(volatile uint64_t*)ptr) : \"memory\");\n}\n\n#define __TBB_AtomicOR(P,V) __TBB_machine_or(P,V)\n#define __TBB_AtomicAND(P,V) __TBB_machine_and(P,V)\n\n#define __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE           1\n#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE            1\n#define __TBB_USE_GENERIC_RELAXED_LOAD_STORE                1\n#define __TBB_USE_GENERIC_SEQUENTIAL_CONSISTENCY_LOAD_STORE 1\n\n"
  },
  {
    "path": "benchmarks/tbb/machine/mac_ppc.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#if !defined(__TBB_machine_H) || defined(__TBB_machine_gcc_power_H)\n#error Do not #include this internal file directly; use public TBB headers instead.\n#endif\n\n#define __TBB_machine_gcc_power_H\n\n#include <stdint.h>\n#include <unistd.h>\n\n// TODO: rename to gcc_power.h?\n// This file is for Power Architecture with compilers supporting GNU inline-assembler syntax (currently GNU g++ and IBM XL).\n// Note that XL V9.0 (sometimes?) has trouble dealing with empty input and/or clobber lists, so they should be avoided.\n\n#if __powerpc64__ || __ppc64__\n    // IBM XL documents __powerpc64__ (and __PPC64__).\n    // Apple documents __ppc64__ (with __ppc__ only on 32-bit).\n    #define __TBB_WORDSIZE 8\n#else\n    #define __TBB_WORDSIZE 4\n#endif\n\n// Traditionally Power Architecture is big-endian.\n// Little-endian could be just an address manipulation (compatibility with TBB not verified),\n// or normal little-endian (on more recent systems). Embedded PowerPC systems may support\n// page-specific endianness, but then one endianness must be hidden from TBB so that it still sees only one.\n#if __BIG_ENDIAN__ || (defined(__BYTE_ORDER__) && __BYTE_ORDER__==__ORDER_BIG_ENDIAN__)\n    #define __TBB_ENDIANNESS __TBB_ENDIAN_BIG\n#elif __LITTLE_ENDIAN__ || (defined(__BYTE_ORDER__) && __BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__)\n    #define __TBB_ENDIANNESS __TBB_ENDIAN_LITTLE\n#elif defined(__BYTE_ORDER__)\n    #define __TBB_ENDIANNESS __TBB_ENDIAN_UNSUPPORTED\n#else\n    #define __TBB_ENDIANNESS __TBB_ENDIAN_DETECT\n#endif\n\n// On Power Architecture, (lock-free) 64-bit atomics require 64-bit hardware:\n#if __TBB_WORDSIZE==8\n    // Do not change the following definition, because TBB itself will use 64-bit atomics in 64-bit builds.\n    #define __TBB_64BIT_ATOMICS 1\n#elif __bgp__\n    // Do not change the following definition, because this is known 32-bit hardware.\n    #define __TBB_64BIT_ATOMICS 0\n#else\n    // To enable 64-bit atomics in 32-bit builds, set the value below to 1 instead of 0.\n    // You must make certain that the program will only use them on actual 64-bit hardware\n    // (which typically means that the entire program is only executed on such hardware),\n    // because their implementation involves machine instructions that are illegal elsewhere.\n    // The setting can be chosen independently per compilation unit,\n    // which also means that TBB itself does not need to be rebuilt.\n    // Alternatively (but only for the current architecture and TBB version),\n    // override the default as a predefined macro when invoking the compiler.\n    #ifndef __TBB_64BIT_ATOMICS\n    #define __TBB_64BIT_ATOMICS 0\n    #endif\n#endif\n\ninline int32_t __TBB_machine_cmpswp4 (volatile void *ptr, int32_t value, int32_t comparand )\n{\n    int32_t result;\n\n    __asm__ __volatile__(\"sync\\n\"\n                         \"0:\\n\\t\"\n                         \"lwarx %[res],0,%[ptr]\\n\\t\"     /* load w/ reservation */\n                         \"cmpw %[res],%[cmp]\\n\\t\"        /* compare against comparand */\n                         \"bne- 1f\\n\\t\"                   /* exit if not same */\n                         \"stwcx. %[val],0,%[ptr]\\n\\t\"    /* store new value */\n                         \"bne- 0b\\n\"                     /* retry if reservation lost */\n                         \"1:\\n\\t\"                        /* the exit */\n                         \"isync\"\n                         : [res]\"=&r\"(result)\n                         , \"+m\"(* (int32_t*) ptr)        /* redundant with \"memory\" */\n                         : [ptr]\"r\"(ptr)\n                         , [val]\"r\"(value)\n                         , [cmp]\"r\"(comparand)\n                         : \"memory\"                      /* compiler full fence */\n                         , \"cr0\"                         /* clobbered by cmp and/or stwcx. */\n                         );\n    return result;\n}\n\n#if __TBB_WORDSIZE==8\n\ninline int64_t __TBB_machine_cmpswp8 (volatile void *ptr, int64_t value, int64_t comparand )\n{\n    int64_t result;\n    __asm__ __volatile__(\"sync\\n\"\n                         \"0:\\n\\t\"\n                         \"ldarx %[res],0,%[ptr]\\n\\t\"     /* load w/ reservation */\n                         \"cmpd %[res],%[cmp]\\n\\t\"        /* compare against comparand */\n                         \"bne- 1f\\n\\t\"                   /* exit if not same */\n                         \"stdcx. %[val],0,%[ptr]\\n\\t\"    /* store new value */\n                         \"bne- 0b\\n\"                     /* retry if reservation lost */\n                         \"1:\\n\\t\"                        /* the exit */\n                         \"isync\"\n                         : [res]\"=&r\"(result)\n                         , \"+m\"(* (int64_t*) ptr)        /* redundant with \"memory\" */\n                         : [ptr]\"r\"(ptr)\n                         , [val]\"r\"(value)\n                         , [cmp]\"r\"(comparand)\n                         : \"memory\"                      /* compiler full fence */\n                         , \"cr0\"                         /* clobbered by cmp and/or stdcx. */\n                         );\n    return result;\n}\n\n#elif __TBB_64BIT_ATOMICS /* && __TBB_WORDSIZE==4 */\n\ninline int64_t __TBB_machine_cmpswp8 (volatile void *ptr, int64_t value, int64_t comparand )\n{\n    int64_t result;\n    int64_t value_register, comparand_register, result_register; // dummy variables to allocate registers\n    __asm__ __volatile__(\"sync\\n\\t\"\n                         \"ld %[val],%[valm]\\n\\t\"\n                         \"ld %[cmp],%[cmpm]\\n\"\n                         \"0:\\n\\t\"\n                         \"ldarx %[res],0,%[ptr]\\n\\t\"     /* load w/ reservation */\n                         \"cmpd %[res],%[cmp]\\n\\t\"        /* compare against comparand */\n                         \"bne- 1f\\n\\t\"                   /* exit if not same */\n                         \"stdcx. %[val],0,%[ptr]\\n\\t\"    /* store new value */\n                         \"bne- 0b\\n\"                     /* retry if reservation lost */\n                         \"1:\\n\\t\"                        /* the exit */\n                         \"std %[res],%[resm]\\n\\t\"\n                         \"isync\"\n                         : [resm]\"=m\"(result)\n                         , [res] \"=&r\"(   result_register)\n                         , [val] \"=&r\"(    value_register)\n                         , [cmp] \"=&r\"(comparand_register)\n                         , \"+m\"(* (int64_t*) ptr)        /* redundant with \"memory\" */\n                         : [ptr] \"r\"(ptr)\n                         , [valm]\"m\"(value)\n                         , [cmpm]\"m\"(comparand)\n                         : \"memory\"                      /* compiler full fence */\n                         , \"cr0\"                         /* clobbered by cmpd and/or stdcx. */\n                         );\n    return result;\n}\n\n#endif /* __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS */\n\n#define __TBB_MACHINE_DEFINE_LOAD_STORE(S,ldx,stx,cmpx)                                                       \\\n    template <typename T>                                                                                     \\\n    struct machine_load_store<T,S> {                                                                          \\\n        static inline T load_with_acquire(const volatile T& location) {                                       \\\n            T result;                                                                                         \\\n            __asm__ __volatile__(ldx \" %[res],0(%[ptr])\\n\"                                                    \\\n                                 \"0:\\n\\t\"                                                                     \\\n                                 cmpx \" %[res],%[res]\\n\\t\"                                                    \\\n                                 \"bne- 0b\\n\\t\"                                                                \\\n                                 \"isync\"                                                                      \\\n                                 : [res]\"=r\"(result)                                                          \\\n                                 : [ptr]\"b\"(&location) /* cannot use register 0 here */                       \\\n                                 , \"m\"(location)       /* redundant with \"memory\" */                          \\\n                                 : \"memory\"            /* compiler acquire fence */                           \\\n                                 , \"cr0\"               /* clobbered by cmpw/cmpd */);                         \\\n            return result;                                                                                    \\\n        }                                                                                                     \\\n        static inline void store_with_release(volatile T &location, T value) {                                \\\n            __asm__ __volatile__(\"lwsync\\n\\t\"                                                                 \\\n                                 stx \" %[val],0(%[ptr])\"                                                      \\\n                                 : \"=m\"(location)      /* redundant with \"memory\" */                          \\\n                                 : [ptr]\"b\"(&location) /* cannot use register 0 here */                       \\\n                                 , [val]\"r\"(value)                                                            \\\n                                 : \"memory\"/*compiler release fence*/ /*(cr0 not affected)*/);                \\\n        }                                                                                                     \\\n    };                                                                                                        \\\n                                                                                                              \\\n    template <typename T>                                                                                     \\\n    struct machine_load_store_relaxed<T,S> {                                                                  \\\n        static inline T load (const __TBB_atomic T& location) {                                               \\\n            T result;                                                                                         \\\n            __asm__ __volatile__(ldx \" %[res],0(%[ptr])\"                                                      \\\n                                 : [res]\"=r\"(result)                                                          \\\n                                 : [ptr]\"b\"(&location) /* cannot use register 0 here */                       \\\n                                 , \"m\"(location)                                                              \\\n                                 ); /*(no compiler fence)*/ /*(cr0 not affected)*/                            \\\n            return result;                                                                                    \\\n        }                                                                                                     \\\n        static inline void store (__TBB_atomic T &location, T value) {                                        \\\n            __asm__ __volatile__(stx \" %[val],0(%[ptr])\"                                                      \\\n                                 : \"=m\"(location)                                                             \\\n                                 : [ptr]\"b\"(&location) /* cannot use register 0 here */                       \\\n                                 , [val]\"r\"(value)                                                            \\\n                                 ); /*(no compiler fence)*/ /*(cr0 not affected)*/                            \\\n        }                                                                                                     \\\n    };\n\nnamespace tbb {\nnamespace internal {\n    __TBB_MACHINE_DEFINE_LOAD_STORE(1,\"lbz\",\"stb\",\"cmpw\")\n    __TBB_MACHINE_DEFINE_LOAD_STORE(2,\"lhz\",\"sth\",\"cmpw\")\n    __TBB_MACHINE_DEFINE_LOAD_STORE(4,\"lwz\",\"stw\",\"cmpw\")\n\n#if __TBB_WORDSIZE==8\n\n    __TBB_MACHINE_DEFINE_LOAD_STORE(8,\"ld\" ,\"std\",\"cmpd\")\n\n#elif __TBB_64BIT_ATOMICS /* && __TBB_WORDSIZE==4 */\n\n    template <typename T>\n    struct machine_load_store<T,8> {\n        static inline T load_with_acquire(const volatile T& location) {\n            T result;\n            T result_register; // dummy variable to allocate a register\n            __asm__ __volatile__(\"ld %[res],0(%[ptr])\\n\\t\"\n                                 \"std %[res],%[resm]\\n\"\n                                 \"0:\\n\\t\"\n                                 \"cmpd %[res],%[res]\\n\\t\"\n                                 \"bne- 0b\\n\\t\"\n                                 \"isync\"\n                                 : [resm]\"=m\"(result)\n                                 , [res]\"=&r\"(result_register)\n                                 : [ptr]\"b\"(&location) /* cannot use register 0 here */\n                                 , \"m\"(location)       /* redundant with \"memory\" */\n                                 : \"memory\"            /* compiler acquire fence */\n                                 , \"cr0\"               /* clobbered by cmpd */);\n            return result;\n        }\n\n        static inline void store_with_release(volatile T &location, T value) {\n            T value_register; // dummy variable to allocate a register\n            __asm__ __volatile__(\"lwsync\\n\\t\"\n                                 \"ld %[val],%[valm]\\n\\t\"\n                                 \"std %[val],0(%[ptr])\"\n                                 : \"=m\"(location)      /* redundant with \"memory\" */\n                                 , [val]\"=&r\"(value_register)\n                                 : [ptr]\"b\"(&location) /* cannot use register 0 here */\n                                 , [valm]\"m\"(value)\n                                 : \"memory\"/*compiler release fence*/ /*(cr0 not affected)*/);\n        }\n    };\n\n    struct machine_load_store_relaxed<T,8> {\n        static inline T load (const volatile T& location) {\n            T result;\n            T result_register; // dummy variable to allocate a register\n            __asm__ __volatile__(\"ld %[res],0(%[ptr])\\n\\t\"\n                                 \"std %[res],%[resm]\"\n                                 : [resm]\"=m\"(result)\n                                 , [res]\"=&r\"(result_register)\n                                 : [ptr]\"b\"(&location) /* cannot use register 0 here */\n                                 , \"m\"(location)\n                                 ); /*(no compiler fence)*/ /*(cr0 not affected)*/\n            return result;\n        }\n\n        static inline void store (volatile T &location, T value) {\n            T value_register; // dummy variable to allocate a register\n            __asm__ __volatile__(\"ld %[val],%[valm]\\n\\t\"\n                                 \"std %[val],0(%[ptr])\"\n                                 : \"=m\"(location)\n                                 , [val]\"=&r\"(value_register)\n                                 : [ptr]\"b\"(&location) /* cannot use register 0 here */\n                                 , [valm]\"m\"(value)\n                                 ); /*(no compiler fence)*/ /*(cr0 not affected)*/\n        }\n    };\n    #define __TBB_machine_load_store_relaxed_8\n\n#endif /* __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS */\n\n}} // namespaces internal, tbb\n\n#undef __TBB_MACHINE_DEFINE_LOAD_STORE\n\n#define __TBB_USE_GENERIC_PART_WORD_CAS                     1\n#define __TBB_USE_GENERIC_FETCH_ADD                         1\n#define __TBB_USE_GENERIC_FETCH_STORE                       1\n#define __TBB_USE_GENERIC_SEQUENTIAL_CONSISTENCY_LOAD_STORE 1\n\n#define __TBB_control_consistency_helper() __asm__ __volatile__(\"isync\": : :\"memory\")\n#define __TBB_full_memory_fence()          __asm__ __volatile__( \"sync\": : :\"memory\")\n\nstatic inline intptr_t __TBB_machine_lg( uintptr_t x ) {\n    __TBB_ASSERT(x, \"__TBB_Log2(0) undefined\");\n    // cntlzd/cntlzw starts counting at 2^63/2^31 (ignoring any higher-order bits), and does not affect cr0\n#if __TBB_WORDSIZE==8\n    __asm__ __volatile__ (\"cntlzd %0,%0\" : \"+r\"(x));\n    return 63-static_cast<intptr_t>(x);\n#else\n    __asm__ __volatile__ (\"cntlzw %0,%0\" : \"+r\"(x));\n    return 31-static_cast<intptr_t>(x);\n#endif\n}\n#define __TBB_Log2(V) __TBB_machine_lg(V)\n\n// Assumes implicit alignment for any 32-bit value\ntypedef uint32_t __TBB_Flag;\n#define __TBB_Flag __TBB_Flag\n\ninline bool __TBB_machine_trylockbyte( __TBB_atomic __TBB_Flag &flag ) {\n    return __TBB_machine_cmpswp4(&flag,1,0)==0;\n}\n#define __TBB_TryLockByte(P) __TBB_machine_trylockbyte(P)\n"
  },
  {
    "path": "benchmarks/tbb/machine/macos_common.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#if !defined(__TBB_machine_H) || defined(__TBB_machine_macos_common_H)\n#error Do not #include this internal file directly; use public TBB headers instead.\n#endif\n\n#define __TBB_machine_macos_common_H\n\n#include <sched.h>\n#define __TBB_Yield()  sched_yield()\n\n// __TBB_HardwareConcurrency\n\n#include <sys/types.h>\n#include <sys/sysctl.h>\n\nstatic inline int __TBB_macos_available_cpu() {\n    int name[2] = {CTL_HW, HW_AVAILCPU};\n    int ncpu;\n    size_t size = sizeof(ncpu);\n    sysctl( name, 2, &ncpu, &size, NULL, 0 );\n    return ncpu;\n}\n\n#define __TBB_HardwareConcurrency() __TBB_macos_available_cpu()\n\n#ifndef __TBB_full_memory_fence\n    // TBB has not recognized the architecture (none of the architecture abstraction\n    // headers was included).\n    #define __TBB_UnknownArchitecture 1\n#endif\n\n#if __TBB_UnknownArchitecture\n// Implementation of atomic operations based on OS provided primitives\n#include <libkern/OSAtomic.h>\n\nstatic inline int64_t __TBB_machine_cmpswp8_OsX(volatile void *ptr, int64_t value, int64_t comparand)\n{\n    __TBB_ASSERT( tbb::internal::is_aligned(ptr,8), \"address not properly aligned for OS X* atomics\");\n    int64_t* address = (int64_t*)ptr;\n    while( !OSAtomicCompareAndSwap64Barrier(comparand, value, address) ){\n#if __TBB_WORDSIZE==8\n        int64_t snapshot = *address;\n#else\n        int64_t snapshot = OSAtomicAdd64( 0, address );\n#endif\n        if( snapshot!=comparand ) return snapshot;\n    }\n    return comparand;\n}\n\n#define __TBB_machine_cmpswp8 __TBB_machine_cmpswp8_OsX\n\n#endif /* __TBB_UnknownArchitecture */\n\n#if __TBB_UnknownArchitecture\n\n#ifndef __TBB_WORDSIZE\n#define __TBB_WORDSIZE 4\n#endif\n\n#ifdef __TBB_ENDIANNESS\n    // Already determined based on hardware architecture.\n#elif __BIG_ENDIAN__\n    #define __TBB_ENDIANNESS __TBB_ENDIAN_BIG\n#elif __LITTLE_ENDIAN__\n    #define __TBB_ENDIANNESS __TBB_ENDIAN_LITTLE\n#else\n    #define __TBB_ENDIANNESS __TBB_ENDIAN_UNSUPPORTED\n#endif\n\n/** As this generic implementation has absolutely no information about underlying\n    hardware, its performance most likely will be sub-optimal because of full memory\n    fence usages where a more lightweight synchronization means (or none at all)\n    could suffice. Thus if you use this header to enable TBB on a new platform,\n    consider forking it and relaxing below helpers as appropriate. **/\n#define __TBB_control_consistency_helper() OSMemoryBarrier()\n#define __TBB_acquire_consistency_helper() OSMemoryBarrier()\n#define __TBB_release_consistency_helper() OSMemoryBarrier()\n#define __TBB_full_memory_fence()          OSMemoryBarrier()\n\nstatic inline int32_t __TBB_machine_cmpswp4(volatile void *ptr, int32_t value, int32_t comparand)\n{\n    __TBB_ASSERT( tbb::internal::is_aligned(ptr,4), \"address not properly aligned for OS X* atomics\");\n    int32_t* address = (int32_t*)ptr;\n    while( !OSAtomicCompareAndSwap32Barrier(comparand, value, address) ){\n        int32_t snapshot = *address;\n        if( snapshot!=comparand ) return snapshot;\n    }\n    return comparand;\n}\n\nstatic inline int32_t __TBB_machine_fetchadd4(volatile void *ptr, int32_t addend)\n{\n    __TBB_ASSERT( tbb::internal::is_aligned(ptr,4), \"address not properly aligned for OS X* atomics\");\n    return OSAtomicAdd32Barrier(addend, (int32_t*)ptr) - addend;\n}\n\nstatic inline int64_t __TBB_machine_fetchadd8(volatile void *ptr, int64_t addend)\n{\n    __TBB_ASSERT( tbb::internal::is_aligned(ptr,8), \"address not properly aligned for OS X* atomics\");\n    return OSAtomicAdd64Barrier(addend, (int64_t*)ptr) - addend;\n}\n\n#define __TBB_USE_GENERIC_PART_WORD_CAS                     1\n#define __TBB_USE_GENERIC_PART_WORD_FETCH_ADD               1\n#define __TBB_USE_GENERIC_FETCH_STORE                       1\n#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE            1\n#define __TBB_USE_GENERIC_RELAXED_LOAD_STORE                1\n#if __TBB_WORDSIZE == 4\n    #define __TBB_USE_GENERIC_DWORD_LOAD_STORE              1\n#endif\n#define __TBB_USE_GENERIC_SEQUENTIAL_CONSISTENCY_LOAD_STORE 1\n\n#endif /* __TBB_UnknownArchitecture */\n"
  },
  {
    "path": "benchmarks/tbb/machine/mic_common.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_mic_common_H\n#define __TBB_mic_common_H\n\n#ifndef __TBB_machine_H\n#error Do not #include this internal file directly; use public TBB headers instead.\n#endif\n\n#if ! __TBB_DEFINE_MIC\n    #error mic_common.h should be included only when building for Intel(R) Many Integrated Core Architecture\n#endif\n\n#ifndef __TBB_PREFETCHING\n#define __TBB_PREFETCHING 1\n#endif\n#if __TBB_PREFETCHING\n#include <immintrin.h>\n#define __TBB_cl_prefetch(p) _mm_prefetch((const char*)p, _MM_HINT_T1)\n#define __TBB_cl_evict(p) _mm_clevict(p, _MM_HINT_T1)\n#endif\n\n/** Intel(R) Many Integrated Core Architecture does not support mfence and pause instructions **/\n#define __TBB_full_memory_fence() __asm__ __volatile__(\"lock; addl $0,(%%rsp)\":::\"memory\")\n#define __TBB_Pause(x) _mm_delay_32(16*(x))\n#define __TBB_STEALING_PAUSE 1500/16\n#include <sched.h>\n#define __TBB_Yield() sched_yield()\n\n// low-level timing intrinsic and its type\n#define __TBB_machine_time_stamp() _rdtsc()\ntypedef uint64_t machine_tsc_t;\n\n/** Specifics **/\n#define __TBB_STEALING_ABORT_ON_CONTENTION 1\n#define __TBB_YIELD2P 1\n#define __TBB_HOARD_NONLOCAL_TASKS 1\n\n#if ! ( __FreeBSD__ || __linux__ )\n    #error Intel(R) Many Integrated Core Compiler does not define __FreeBSD__ or __linux__ anymore. Check for the __TBB_XXX_BROKEN defined under __FreeBSD__ or __linux__.\n#endif /* ! ( __FreeBSD__ || __linux__ ) */\n\n#endif /* __TBB_mic_common_H */\n"
  },
  {
    "path": "benchmarks/tbb/machine/msvc_armv7.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#if !defined(__TBB_machine_H) || defined(__TBB_msvc_armv7_H)\n#error Do not #include this internal file directly; use public TBB headers instead.\n#endif\n\n#define __TBB_msvc_armv7_H\n\n#include <intrin.h>\n#include <float.h>\n\n#define __TBB_WORDSIZE 4\n\n#define __TBB_ENDIANNESS __TBB_ENDIAN_UNSUPPORTED\n\n#if defined(TBB_WIN32_USE_CL_BUILTINS)\n// We can test this on _M_IX86\n#pragma intrinsic(_ReadWriteBarrier)\n#pragma intrinsic(_mm_mfence)\n#define __TBB_compiler_fence()    _ReadWriteBarrier()\n#define __TBB_full_memory_fence() _mm_mfence()\n#define __TBB_control_consistency_helper() __TBB_compiler_fence()\n#define __TBB_acquire_consistency_helper() __TBB_compiler_fence()\n#define __TBB_release_consistency_helper() __TBB_compiler_fence()\n#else\n//Now __dmb(_ARM_BARRIER_SY) is used for both compiler and memory fences\n//This might be changed later after testing\n#define __TBB_compiler_fence()    __dmb(_ARM_BARRIER_SY)\n#define __TBB_full_memory_fence() __dmb(_ARM_BARRIER_SY)\n#define __TBB_control_consistency_helper() __TBB_compiler_fence()\n#define __TBB_acquire_consistency_helper() __TBB_full_memory_fence()\n#define __TBB_release_consistency_helper() __TBB_full_memory_fence()\n#endif\n\n//--------------------------------------------------\n// Compare and swap\n//--------------------------------------------------\n\n/**\n * Atomic CAS for 32 bit values, if *ptr==comparand, then *ptr=value, returns *ptr\n * @param ptr pointer to value in memory to be swapped with value if *ptr==comparand\n * @param value value to assign *ptr to if *ptr==comparand\n * @param comparand value to compare with *ptr\n * @return value originally in memory at ptr, regardless of success\n*/\n\n#define __TBB_MACHINE_DEFINE_ATOMICS_CMPSWP(S,T,F)                                               \\\ninline T __TBB_machine_cmpswp##S( volatile void *ptr, T value, T comparand ) {                   \\\n    return _InterlockedCompareExchange##F(reinterpret_cast<volatile T *>(ptr),value,comparand);  \\\n}                                                                                                \\\n\n#define __TBB_MACHINE_DEFINE_ATOMICS_FETCHADD(S,T,F)                                             \\\ninline T __TBB_machine_fetchadd##S( volatile void *ptr, T value ) {                              \\\n    return _InterlockedExchangeAdd##F(reinterpret_cast<volatile T *>(ptr),value);                \\\n}                                                                                                \\\n\n__TBB_MACHINE_DEFINE_ATOMICS_CMPSWP(1,char,8)\n__TBB_MACHINE_DEFINE_ATOMICS_CMPSWP(2,short,16)\n__TBB_MACHINE_DEFINE_ATOMICS_CMPSWP(4,long,)\n__TBB_MACHINE_DEFINE_ATOMICS_CMPSWP(8,__int64,64)\n__TBB_MACHINE_DEFINE_ATOMICS_FETCHADD(4,long,)\n#if defined(TBB_WIN32_USE_CL_BUILTINS)\n// No _InterlockedExchangeAdd64 intrinsic on _M_IX86\n#define __TBB_64BIT_ATOMICS 0\n#else\n__TBB_MACHINE_DEFINE_ATOMICS_FETCHADD(8,__int64,64)\n#endif\n\ninline void __TBB_machine_pause (int32_t delay )\n{\n    while(delay>0)\n    {\n        __TBB_compiler_fence();\n        delay--;\n    }\n}\n\n// API to retrieve/update FPU control setting\n#define __TBB_CPU_CTL_ENV_PRESENT 1\n\nnamespace tbb {\nnamespace internal {\n\ntemplate <typename T, size_t S>\nstruct machine_load_store_relaxed {\n    static inline T load ( const volatile T& location ) {\n        const T value = location;\n\n        /*\n        * An extra memory barrier is required for errata #761319\n        * Please see http://infocenter.arm.com/help/topic/com.arm.doc.uan0004a\n        */\n        __TBB_acquire_consistency_helper();\n        return value;\n    }\n\n    static inline void store ( volatile T& location, T value ) {\n        location = value;\n    }\n};\n\nclass cpu_ctl_env {\nprivate:\n    unsigned int my_ctl;\npublic:\n    bool operator!=( const cpu_ctl_env& ctl ) const { return my_ctl != ctl.my_ctl; }\n    void get_env() { my_ctl = _control87(0, 0); }\n    void set_env() const { _control87( my_ctl, ~0U ); }\n};\n\n} // namespace internal\n} // namespaces tbb\n\n// Machine specific atomic operations\n#define __TBB_CompareAndSwap4(P,V,C) __TBB_machine_cmpswp4(P,V,C)\n#define __TBB_CompareAndSwap8(P,V,C) __TBB_machine_cmpswp8(P,V,C)\n#define __TBB_Pause(V) __TBB_machine_pause(V)\n\n// Use generics for some things\n#define __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE               1\n#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE                1\n#define __TBB_USE_GENERIC_PART_WORD_FETCH_ADD                   1\n#define __TBB_USE_GENERIC_PART_WORD_FETCH_STORE                 1\n#define __TBB_USE_GENERIC_FETCH_STORE                           1\n#define __TBB_USE_GENERIC_DWORD_LOAD_STORE                      1\n#define __TBB_USE_GENERIC_SEQUENTIAL_CONSISTENCY_LOAD_STORE     1\n\n#if defined(TBB_WIN32_USE_CL_BUILTINS)\n#if !__TBB_WIN8UI_SUPPORT\nextern \"C\" __declspec(dllimport) int __stdcall SwitchToThread( void );\n#define __TBB_Yield()  SwitchToThread()\n#else\n#include<thread>\n#define __TBB_Yield()  std::this_thread::yield()\n#endif\n#else\n#define __TBB_Yield() __yield()\n#endif\n\n// Machine specific atomic operations\n#define __TBB_AtomicOR(P,V)     __TBB_machine_OR(P,V)\n#define __TBB_AtomicAND(P,V)    __TBB_machine_AND(P,V)\n\ntemplate <typename T1,typename T2>\ninline void __TBB_machine_OR( T1 *operand, T2 addend ) {\n    _InterlockedOr((long volatile *)operand, (long)addend);\n}\n\ntemplate <typename T1,typename T2>\ninline void __TBB_machine_AND( T1 *operand, T2 addend ) {\n    _InterlockedAnd((long volatile *)operand, (long)addend);\n}\n\n"
  },
  {
    "path": "benchmarks/tbb/machine/msvc_ia32_common.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_machine_msvc_ia32_common_H\n#define __TBB_machine_msvc_ia32_common_H\n\n#include <intrin.h>\n\n//TODO: consider moving this macro to tbb_config.h and used there MSVC asm is used\n#if  !_M_X64 || __INTEL_COMPILER\n    #define __TBB_X86_MSVC_INLINE_ASM_AVAILABLE 1\n\n    #if _M_X64\n        #define __TBB_r(reg_name) r##reg_name\n    #else\n        #define __TBB_r(reg_name) e##reg_name\n    #endif\n#else\n    //MSVC in x64 mode does not accept inline assembler\n    #define __TBB_X86_MSVC_INLINE_ASM_AVAILABLE 0\n#endif\n\n#define __TBB_NO_X86_MSVC_INLINE_ASM_MSG \"The compiler being used is not supported (outdated?)\"\n\n#if (_MSC_VER >= 1300) || (__INTEL_COMPILER) //Use compiler intrinsic when available\n    #define __TBB_PAUSE_USE_INTRINSIC 1\n    #pragma intrinsic(_mm_pause)\n    namespace tbb { namespace internal { namespace intrinsics { namespace msvc {\n        static inline void __TBB_machine_pause (uintptr_t delay ) {\n            for (;delay>0; --delay )\n                _mm_pause();\n        }\n    }}}}\n#else\n    #if !__TBB_X86_MSVC_INLINE_ASM_AVAILABLE\n        #error __TBB_NO_X86_MSVC_INLINE_ASM_MSG\n    #endif\n\n    namespace tbb { namespace internal { namespace inline_asm { namespace msvc {\n        static inline void __TBB_machine_pause (uintptr_t delay ) {\n            _asm\n            {\n                mov __TBB_r(ax), delay\n              __TBB_L1:\n                pause\n                add __TBB_r(ax), -1\n                jne __TBB_L1\n            }\n            return;\n        }\n    }}}}\n#endif\n\nstatic inline void __TBB_machine_pause (uintptr_t delay ){\n    #if __TBB_PAUSE_USE_INTRINSIC\n        tbb::internal::intrinsics::msvc::__TBB_machine_pause(delay);\n    #else\n        tbb::internal::inline_asm::msvc::__TBB_machine_pause(delay);\n    #endif\n}\n\n//TODO: move this function to windows_api.h or to place where it is used\n#if (_MSC_VER<1400) && (!_WIN64) && (__TBB_X86_MSVC_INLINE_ASM_AVAILABLE)\n    static inline void* __TBB_machine_get_current_teb () {\n        void* pteb;\n        __asm mov eax, fs:[0x18]\n        __asm mov pteb, eax\n        return pteb;\n    }\n#endif\n\n#if ( _MSC_VER>=1400 && !defined(__INTEL_COMPILER) ) ||  (__INTEL_COMPILER>=1200)\n// MSVC did not have this intrinsic prior to VC8.\n// ICL 11.1 fails to compile a TBB example if __TBB_Log2 uses the intrinsic.\n    #define __TBB_LOG2_USE_BSR_INTRINSIC 1\n    #if _M_X64\n        #define __TBB_BSR_INTRINSIC _BitScanReverse64\n    #else\n        #define __TBB_BSR_INTRINSIC _BitScanReverse\n    #endif\n    #pragma intrinsic(__TBB_BSR_INTRINSIC)\n\n    namespace tbb { namespace internal { namespace intrinsics { namespace msvc {\n        inline uintptr_t __TBB_machine_lg( uintptr_t i ){\n            unsigned long j;\n            __TBB_BSR_INTRINSIC( &j, i );\n            return j;\n        }\n    }}}}\n#else\n    #if !__TBB_X86_MSVC_INLINE_ASM_AVAILABLE\n        #error __TBB_NO_X86_MSVC_INLINE_ASM_MSG\n    #endif\n\n    namespace tbb { namespace internal { namespace inline_asm { namespace msvc {\n        inline uintptr_t __TBB_machine_lg( uintptr_t i ){\n            uintptr_t j;\n            __asm\n            {\n                bsr __TBB_r(ax), i\n                mov j, __TBB_r(ax)\n            }\n            return j;\n        }\n    }}}}\n#endif\n\nstatic inline intptr_t __TBB_machine_lg( uintptr_t i ) {\n#if __TBB_LOG2_USE_BSR_INTRINSIC\n    return tbb::internal::intrinsics::msvc::__TBB_machine_lg(i);\n#else\n    return tbb::internal::inline_asm::msvc::__TBB_machine_lg(i);\n#endif\n}\n\n// API to retrieve/update FPU control setting\n#define __TBB_CPU_CTL_ENV_PRESENT 1\n\nnamespace tbb { namespace internal { class cpu_ctl_env; } }\n#if __TBB_X86_MSVC_INLINE_ASM_AVAILABLE\n    inline void __TBB_get_cpu_ctl_env ( tbb::internal::cpu_ctl_env* ctl ) {\n        __asm {\n            __asm mov     __TBB_r(ax), ctl\n            __asm stmxcsr [__TBB_r(ax)]\n            __asm fstcw   [__TBB_r(ax)+4]\n        }\n    }\n    inline void __TBB_set_cpu_ctl_env ( const tbb::internal::cpu_ctl_env* ctl ) {\n        __asm {\n            __asm mov     __TBB_r(ax), ctl\n            __asm ldmxcsr [__TBB_r(ax)]\n            __asm fldcw   [__TBB_r(ax)+4]\n        }\n    }\n#else\n    extern \"C\" {\n        void __TBB_EXPORTED_FUNC __TBB_get_cpu_ctl_env ( tbb::internal::cpu_ctl_env* );\n        void __TBB_EXPORTED_FUNC __TBB_set_cpu_ctl_env ( const tbb::internal::cpu_ctl_env* );\n    }\n#endif\n\nnamespace tbb {\nnamespace internal {\nclass cpu_ctl_env {\nprivate:\n    int         mxcsr;\n    short       x87cw;\n    static const int MXCSR_CONTROL_MASK = ~0x3f; /* all except last six status bits */\npublic:\n    bool operator!=( const cpu_ctl_env& ctl ) const { return mxcsr != ctl.mxcsr || x87cw != ctl.x87cw; }\n    void get_env() {\n        __TBB_get_cpu_ctl_env( this );\n        mxcsr &= MXCSR_CONTROL_MASK;\n    }\n    void set_env() const { __TBB_set_cpu_ctl_env( this ); }\n};\n} // namespace internal\n} // namespace tbb\n\n#if !__TBB_WIN8UI_SUPPORT\nextern \"C\" __declspec(dllimport) int __stdcall SwitchToThread( void );\n#define __TBB_Yield()  SwitchToThread()\n#else\n#include<thread>\n#define __TBB_Yield()  std::this_thread::yield()\n#endif\n\n#define __TBB_Pause(V) __TBB_machine_pause(V)\n#define __TBB_Log2(V)  __TBB_machine_lg(V)\n\n#undef __TBB_r\n\nextern \"C\" {\n    __int8 __TBB_EXPORTED_FUNC __TBB_machine_try_lock_elided (volatile void* ptr);\n    void   __TBB_EXPORTED_FUNC __TBB_machine_unlock_elided (volatile void* ptr);\n\n    // 'pause' instruction aborts HLE/RTM transactions\n#if __TBB_PAUSE_USE_INTRINSIC\n    inline static void __TBB_machine_try_lock_elided_cancel() { _mm_pause(); }\n#else\n    inline static void __TBB_machine_try_lock_elided_cancel() { _asm pause; }\n#endif\n\n#if __TBB_TSX_INTRINSICS_PRESENT\n    #define __TBB_machine_is_in_transaction _xtest\n    #define __TBB_machine_begin_transaction _xbegin\n    #define __TBB_machine_end_transaction   _xend\n    // The value (0xFF) below comes from the\n    // Intel(R) 64 and IA-32 Architectures Optimization Reference Manual 12.4.5 lock not free\n    #define __TBB_machine_transaction_conflict_abort() _xabort(0xFF)\n#else\n    __int8           __TBB_EXPORTED_FUNC __TBB_machine_is_in_transaction();\n    unsigned __int32 __TBB_EXPORTED_FUNC __TBB_machine_begin_transaction();\n    void             __TBB_EXPORTED_FUNC __TBB_machine_end_transaction();\n    void             __TBB_EXPORTED_FUNC __TBB_machine_transaction_conflict_abort();\n#endif /* __TBB_TSX_INTRINSICS_PRESENT */\n}\n\n#endif /* __TBB_machine_msvc_ia32_common_H */\n"
  },
  {
    "path": "benchmarks/tbb/machine/sunos_sparc.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n\n#if !defined(__TBB_machine_H) || defined(__TBB_machine_sunos_sparc_H)\n#error Do not #include this internal file directly; use public TBB headers instead.\n#endif\n\n#define __TBB_machine_sunos_sparc_H\n\n#include <stdint.h>\n#include <unistd.h>\n\n#define __TBB_WORDSIZE 8\n// Big endian is assumed for SPARC.\n// While hardware may support page-specific bi-endianness, only big endian pages may be exposed to TBB  \n#define __TBB_ENDIANNESS __TBB_ENDIAN_BIG\n\n/** To those working on SPARC hardware. Consider relaxing acquire and release\n    consistency helpers to no-op (as this port covers TSO mode only). **/\n#define __TBB_compiler_fence()             __asm__ __volatile__ (\"\": : :\"memory\")\n#define __TBB_control_consistency_helper() __TBB_compiler_fence()\n#define __TBB_acquire_consistency_helper() __TBB_compiler_fence()\n#define __TBB_release_consistency_helper() __TBB_compiler_fence()\n#define __TBB_full_memory_fence()          __asm__ __volatile__(\"membar #LoadLoad|#LoadStore|#StoreStore|#StoreLoad\": : : \"memory\")\n\n//--------------------------------------------------\n// Compare and swap\n//--------------------------------------------------\n\n/**\n * Atomic CAS for 32 bit values, if *ptr==comparand, then *ptr=value, returns *ptr\n * @param ptr pointer to value in memory to be swapped with value if *ptr==comparand\n * @param value value to assign *ptr to if *ptr==comparand\n * @param comparand value to compare with *ptr\n ( @return value originally in memory at ptr, regardless of success\n*/\nstatic inline int32_t __TBB_machine_cmpswp4(volatile void *ptr, int32_t value, int32_t comparand ){\n  int32_t result;\n  __asm__ __volatile__(\n                       \"cas\\t[%5],%4,%1\"\n                       : \"=m\"(*(int32_t *)ptr), \"=r\"(result)\n                       : \"m\"(*(int32_t *)ptr), \"1\"(value), \"r\"(comparand), \"r\"(ptr)\n                       : \"memory\");\n  return result;\n}\n\n/**\n * Atomic CAS for 64 bit values, if *ptr==comparand, then *ptr=value, returns *ptr\n * @param ptr pointer to value in memory to be swapped with value if *ptr==comparand\n * @param value value to assign *ptr to if *ptr==comparand\n * @param comparand value to compare with *ptr\n ( @return value originally in memory at ptr, regardless of success\n */\nstatic inline int64_t __TBB_machine_cmpswp8(volatile void *ptr, int64_t value, int64_t comparand ){\n  int64_t result;\n  __asm__ __volatile__(\n                       \"casx\\t[%5],%4,%1\"\n               : \"=m\"(*(int64_t *)ptr), \"=r\"(result)\n               : \"m\"(*(int64_t *)ptr), \"1\"(value), \"r\"(comparand), \"r\"(ptr)\n               : \"memory\");\n  return result;\n}\n\n//---------------------------------------------------\n// Fetch and add\n//---------------------------------------------------\n\n/**\n * Atomic fetch and add for 32 bit values, in this case implemented by continuously checking success of atomicity\n * @param ptr pointer to value to add addend to\n * @param addened value to add to *ptr\n * @return value at ptr before addened was added\n */\nstatic inline int32_t __TBB_machine_fetchadd4(volatile void *ptr, int32_t addend){\n  int32_t result;\n  __asm__ __volatile__ (\n                        \"0:\\t add\\t %3, %4, %0\\n\"           // do addition\n                        \"\\t cas\\t [%2], %3, %0\\n\"           // cas to store result in memory\n                        \"\\t cmp\\t %3, %0\\n\"                 // check if value from memory is original\n                        \"\\t bne,a,pn\\t %%icc, 0b\\n\"         // if not try again\n                        \"\\t mov %0, %3\\n\"                   // use branch delay slot to move new value in memory to be added\n               : \"=&r\"(result), \"=m\"(*(int32_t *)ptr)\n               : \"r\"(ptr), \"r\"(*(int32_t *)ptr), \"r\"(addend), \"m\"(*(int32_t *)ptr)\n               : \"ccr\", \"memory\");\n  return result;\n}\n\n/**\n * Atomic fetch and add for 64 bit values, in this case implemented by continuously checking success of atomicity\n * @param ptr pointer to value to add addend to\n * @param addened value to add to *ptr\n * @return value at ptr before addened was added\n */\nstatic inline int64_t __TBB_machine_fetchadd8(volatile void *ptr, int64_t addend){\n  int64_t result;\n  __asm__ __volatile__ (\n                        \"0:\\t add\\t %3, %4, %0\\n\"           // do addition\n                        \"\\t casx\\t [%2], %3, %0\\n\"          // cas to store result in memory\n                        \"\\t cmp\\t %3, %0\\n\"                 // check if value from memory is original\n                        \"\\t bne,a,pn\\t %%xcc, 0b\\n\"         // if not try again\n                        \"\\t mov %0, %3\\n\"                   // use branch delay slot to move new value in memory to be added\n                : \"=&r\"(result), \"=m\"(*(int64_t *)ptr)\n                : \"r\"(ptr), \"r\"(*(int64_t *)ptr), \"r\"(addend), \"m\"(*(int64_t *)ptr)\n                : \"ccr\", \"memory\");\n  return result;\n}\n\n//--------------------------------------------------------\n// Logarithm (base two, integer)\n//--------------------------------------------------------\n\nstatic inline int64_t __TBB_machine_lg( uint64_t x ) {\n    __TBB_ASSERT(x, \"__TBB_Log2(0) undefined\");\n    uint64_t count;\n    // one hot encode\n    x |= (x >> 1);\n    x |= (x >> 2);\n    x |= (x >> 4);\n    x |= (x >> 8);\n    x |= (x >> 16);\n    x |= (x >> 32);\n    // count 1's\n    __asm__ (\"popc %1, %0\" : \"=r\"(count) : \"r\"(x) );\n    return count-1;\n}\n\n//--------------------------------------------------------\n\nstatic inline void __TBB_machine_or( volatile void *ptr, uint64_t value ) {\n  __asm__ __volatile__ (\n                        \"0:\\t or\\t %2, %3, %%g1\\n\"          // do operation\n                        \"\\t casx\\t [%1], %2, %%g1\\n\"        // cas to store result in memory\n                        \"\\t cmp\\t %2, %%g1\\n\"               // check if value from memory is original\n                        \"\\t bne,a,pn\\t %%xcc, 0b\\n\"         // if not try again\n                        \"\\t mov %%g1, %2\\n\"                 // use branch delay slot to move new value in memory to be added\n                : \"=m\"(*(int64_t *)ptr)\n                : \"r\"(ptr), \"r\"(*(int64_t *)ptr), \"r\"(value), \"m\"(*(int64_t *)ptr)\n                : \"ccr\", \"g1\", \"memory\");\n}\n\nstatic inline void __TBB_machine_and( volatile void *ptr, uint64_t value ) {\n  __asm__ __volatile__ (\n                        \"0:\\t and\\t %2, %3, %%g1\\n\"         // do operation\n                        \"\\t casx\\t [%1], %2, %%g1\\n\"        // cas to store result in memory\n                        \"\\t cmp\\t %2, %%g1\\n\"               // check if value from memory is original\n                        \"\\t bne,a,pn\\t %%xcc, 0b\\n\"         // if not try again\n                        \"\\t mov %%g1, %2\\n\"                 // use branch delay slot to move new value in memory to be added\n                : \"=m\"(*(int64_t *)ptr)\n                : \"r\"(ptr), \"r\"(*(int64_t *)ptr), \"r\"(value), \"m\"(*(int64_t *)ptr)\n                : \"ccr\", \"g1\", \"memory\");\n}\n\n\nstatic inline void __TBB_machine_pause( int32_t delay ) {\n    // do nothing, inlined, doesn't matter\n}\n\n// put 0xff in memory location, return memory value,\n//  generic trylockbyte puts 0x01, however this is fine\n//  because all that matters is that 0 is unlocked\nstatic inline bool __TBB_machine_trylockbyte(unsigned char &flag){\n    unsigned char result;\n    __asm__ __volatile__ (\n            \"ldstub\\t [%2], %0\\n\"\n        : \"=r\"(result), \"=m\"(flag)\n        : \"r\"(&flag), \"m\"(flag)\n        : \"memory\");\n    return result == 0;\n}\n\n#define __TBB_USE_GENERIC_PART_WORD_CAS                     1\n#define __TBB_USE_GENERIC_PART_WORD_FETCH_ADD               1\n#define __TBB_USE_GENERIC_FETCH_STORE                       1\n#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE            1\n#define __TBB_USE_GENERIC_RELAXED_LOAD_STORE                1\n#define __TBB_USE_GENERIC_SEQUENTIAL_CONSISTENCY_LOAD_STORE 1\n\n#define __TBB_AtomicOR(P,V) __TBB_machine_or(P,V)\n#define __TBB_AtomicAND(P,V) __TBB_machine_and(P,V)\n\n// Definition of other functions\n#define __TBB_Pause(V) __TBB_machine_pause(V)\n#define __TBB_Log2(V)  __TBB_machine_lg(V)\n\n#define __TBB_TryLockByte(P) __TBB_machine_trylockbyte(P)\n"
  },
  {
    "path": "benchmarks/tbb/machine/windows_api.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_machine_windows_api_H\n#define __TBB_machine_windows_api_H\n\n#if _WIN32 || _WIN64\n\n#if _XBOX\n\n#define NONET\n#define NOD3D\n#include <xtl.h>\n\n#else // Assume \"usual\" Windows\n\n#include <windows.h>\n\n#endif // _XBOX\n\n#if _WIN32_WINNT < 0x0600\n// The following Windows API function is declared explicitly;\n// otherwise it fails to compile by VS2005.\n#if !defined(WINBASEAPI) || (_WIN32_WINNT < 0x0501 && _MSC_VER == 1400)\n#define __TBB_WINBASEAPI extern \"C\"\n#else\n#define __TBB_WINBASEAPI WINBASEAPI\n#endif\n__TBB_WINBASEAPI BOOL WINAPI TryEnterCriticalSection( LPCRITICAL_SECTION );\n__TBB_WINBASEAPI BOOL WINAPI InitializeCriticalSectionAndSpinCount( LPCRITICAL_SECTION, DWORD );\n// Overloading WINBASEAPI macro and using local functions missing in Windows XP/2003\n#define InitializeCriticalSectionEx inlineInitializeCriticalSectionEx\n#define CreateSemaphoreEx inlineCreateSemaphoreEx\n#define CreateEventEx inlineCreateEventEx\ninline BOOL WINAPI inlineInitializeCriticalSectionEx( LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount, DWORD )\n{\n    return InitializeCriticalSectionAndSpinCount( lpCriticalSection, dwSpinCount );\n}\ninline HANDLE WINAPI inlineCreateSemaphoreEx( LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, LPCTSTR lpName, DWORD, DWORD )\n{\n    return CreateSemaphore( lpSemaphoreAttributes, lInitialCount, lMaximumCount, lpName );\n}\ninline HANDLE WINAPI inlineCreateEventEx( LPSECURITY_ATTRIBUTES lpEventAttributes, LPCTSTR lpName, DWORD dwFlags, DWORD )\n{\n    BOOL manual_reset = dwFlags&0x00000001 ? TRUE : FALSE; // CREATE_EVENT_MANUAL_RESET\n    BOOL initial_set  = dwFlags&0x00000002 ? TRUE : FALSE; // CREATE_EVENT_INITIAL_SET\n    return CreateEvent( lpEventAttributes, manual_reset, initial_set, lpName );\n}\n#endif\n\n#if defined(RTL_SRWLOCK_INIT)\n#ifndef __TBB_USE_SRWLOCK\n// TODO: turn it on when bug 1952 will be fixed\n#define __TBB_USE_SRWLOCK 0\n#endif\n#endif\n\n#else\n#error tbb/machine/windows_api.h should only be used for Windows based platforms\n#endif // _WIN32 || _WIN64\n\n#endif // __TBB_machine_windows_api_H\n"
  },
  {
    "path": "benchmarks/tbb/machine/windows_ia32.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#if !defined(__TBB_machine_H) || defined(__TBB_machine_windows_ia32_H)\n#error Do not #include this internal file directly; use public TBB headers instead.\n#endif\n\n#define __TBB_machine_windows_ia32_H\n\n#include \"msvc_ia32_common.h\"\n\n#define __TBB_WORDSIZE 4\n#define __TBB_ENDIANNESS __TBB_ENDIAN_LITTLE\n\n#if __INTEL_COMPILER && (__INTEL_COMPILER < 1100)\n    #define __TBB_compiler_fence()    __asm { __asm nop }\n    #define __TBB_full_memory_fence() __asm { __asm mfence }\n#elif _MSC_VER >= 1300 || __INTEL_COMPILER\n    #pragma intrinsic(_ReadWriteBarrier)\n    #pragma intrinsic(_mm_mfence)\n    #define __TBB_compiler_fence()    _ReadWriteBarrier()\n    #define __TBB_full_memory_fence() _mm_mfence()\n#else\n    #error Unsupported compiler - need to define __TBB_{control,acquire,release}_consistency_helper to support it\n#endif\n\n#define __TBB_control_consistency_helper() __TBB_compiler_fence()\n#define __TBB_acquire_consistency_helper() __TBB_compiler_fence()\n#define __TBB_release_consistency_helper() __TBB_compiler_fence()\n\n#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)\n    // Workaround for overzealous compiler warnings in /Wp64 mode\n    #pragma warning (push)\n    #pragma warning (disable: 4244 4267)\n#endif\n\nextern \"C\" {\n    __int64 __TBB_EXPORTED_FUNC __TBB_machine_cmpswp8 (volatile void *ptr, __int64 value, __int64 comparand );\n    __int64 __TBB_EXPORTED_FUNC __TBB_machine_fetchadd8 (volatile void *ptr, __int64 addend );\n    __int64 __TBB_EXPORTED_FUNC __TBB_machine_fetchstore8 (volatile void *ptr, __int64 value );\n    void __TBB_EXPORTED_FUNC __TBB_machine_store8 (volatile void *ptr, __int64 value );\n    __int64 __TBB_EXPORTED_FUNC __TBB_machine_load8 (const volatile void *ptr);\n}\n\n//TODO: use _InterlockedXXX intrinsics as they available since VC 2005\n#define __TBB_MACHINE_DEFINE_ATOMICS(S,T,U,A,C) \\\nstatic inline T __TBB_machine_cmpswp##S ( volatile void * ptr, U value, U comparand ) { \\\n    T result; \\\n    volatile T *p = (T *)ptr; \\\n    __asm \\\n    { \\\n       __asm mov edx, p \\\n       __asm mov C , value \\\n       __asm mov A , comparand \\\n       __asm lock cmpxchg [edx], C \\\n       __asm mov result, A \\\n    } \\\n    return result; \\\n} \\\n\\\nstatic inline T __TBB_machine_fetchadd##S ( volatile void * ptr, U addend ) { \\\n    T result; \\\n    volatile T *p = (T *)ptr; \\\n    __asm \\\n    { \\\n        __asm mov edx, p \\\n        __asm mov A, addend \\\n        __asm lock xadd [edx], A \\\n        __asm mov result, A \\\n    } \\\n    return result; \\\n}\\\n\\\nstatic inline T __TBB_machine_fetchstore##S ( volatile void * ptr, U value ) { \\\n    T result; \\\n    volatile T *p = (T *)ptr; \\\n    __asm \\\n    { \\\n        __asm mov edx, p \\\n        __asm mov A, value \\\n        __asm lock xchg [edx], A \\\n        __asm mov result, A \\\n    } \\\n    return result; \\\n}\n\n\n__TBB_MACHINE_DEFINE_ATOMICS(1, __int8, __int8, al, cl)\n__TBB_MACHINE_DEFINE_ATOMICS(2, __int16, __int16, ax, cx)\n__TBB_MACHINE_DEFINE_ATOMICS(4, ptrdiff_t, ptrdiff_t, eax, ecx)\n\n#undef __TBB_MACHINE_DEFINE_ATOMICS\n\nstatic inline void __TBB_machine_OR( volatile void *operand, __int32 addend ) {\n   __asm \n   {\n       mov eax, addend\n       mov edx, [operand]\n       lock or [edx], eax\n   }\n}\n\nstatic inline void __TBB_machine_AND( volatile void *operand, __int32 addend ) {\n   __asm \n   {\n       mov eax, addend\n       mov edx, [operand]\n       lock and [edx], eax\n   }\n}\n\n#define __TBB_AtomicOR(P,V) __TBB_machine_OR(P,V)\n#define __TBB_AtomicAND(P,V) __TBB_machine_AND(P,V)\n\n//TODO: Check if it possible and profitable for IA-32 architecture on (Linux and Windows)\n//to use of 64-bit load/store via floating point registers together with full fence\n//for sequentially consistent load/store, instead of CAS.\n#define __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE           1\n#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE            1\n#define __TBB_USE_GENERIC_RELAXED_LOAD_STORE                1\n#define __TBB_USE_GENERIC_SEQUENTIAL_CONSISTENCY_LOAD_STORE 1\n\n\n#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)\n    #pragma warning (pop)\n#endif // warnings 4244, 4267 are back\n\n"
  },
  {
    "path": "benchmarks/tbb/machine/windows_intel64.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#if !defined(__TBB_machine_H) || defined(__TBB_machine_windows_intel64_H)\n#error Do not #include this internal file directly; use public TBB headers instead.\n#endif\n\n#define __TBB_machine_windows_intel64_H\n\n#define __TBB_WORDSIZE 8\n#define __TBB_ENDIANNESS __TBB_ENDIAN_LITTLE\n\n#include <intrin.h>\n#include \"msvc_ia32_common.h\"\n\n//TODO: Use _InterlockedXXX16 intrinsics for 2 byte operations\n#if !__INTEL_COMPILER\n    #pragma intrinsic(_InterlockedOr64)\n    #pragma intrinsic(_InterlockedAnd64)\n    #pragma intrinsic(_InterlockedCompareExchange)\n    #pragma intrinsic(_InterlockedCompareExchange64)\n    #pragma intrinsic(_InterlockedExchangeAdd)\n    #pragma intrinsic(_InterlockedExchangeAdd64)\n    #pragma intrinsic(_InterlockedExchange)\n    #pragma intrinsic(_InterlockedExchange64)\n#endif /* !(__INTEL_COMPILER) */\n\n#if __INTEL_COMPILER && (__INTEL_COMPILER < 1100)\n    #define __TBB_compiler_fence()    __asm { __asm nop }\n    #define __TBB_full_memory_fence() __asm { __asm mfence }\n#elif _MSC_VER >= 1300 || __INTEL_COMPILER\n    #pragma intrinsic(_ReadWriteBarrier)\n    #pragma intrinsic(_mm_mfence)\n    #define __TBB_compiler_fence()    _ReadWriteBarrier()\n    #define __TBB_full_memory_fence() _mm_mfence()\n#endif\n\n#define __TBB_control_consistency_helper() __TBB_compiler_fence()\n#define __TBB_acquire_consistency_helper() __TBB_compiler_fence()\n#define __TBB_release_consistency_helper() __TBB_compiler_fence()\n\n// ATTENTION: if you ever change argument types in machine-specific primitives,\n// please take care of atomic_word<> specializations in tbb/atomic.h\nextern \"C\" {\n    __int8 __TBB_EXPORTED_FUNC __TBB_machine_cmpswp1 (volatile void *ptr, __int8 value, __int8 comparand );\n    __int8 __TBB_EXPORTED_FUNC __TBB_machine_fetchadd1 (volatile void *ptr, __int8 addend );\n    __int8 __TBB_EXPORTED_FUNC __TBB_machine_fetchstore1 (volatile void *ptr, __int8 value );\n    __int16 __TBB_EXPORTED_FUNC __TBB_machine_cmpswp2 (volatile void *ptr, __int16 value, __int16 comparand );\n    __int16 __TBB_EXPORTED_FUNC __TBB_machine_fetchadd2 (volatile void *ptr, __int16 addend );\n    __int16 __TBB_EXPORTED_FUNC __TBB_machine_fetchstore2 (volatile void *ptr, __int16 value );\n}\n\ninline long __TBB_machine_cmpswp4 (volatile void *ptr, __int32 value, __int32 comparand ) {\n    return _InterlockedCompareExchange( (long*)ptr, value, comparand );\n}\ninline long __TBB_machine_fetchadd4 (volatile void *ptr, __int32 addend ) {\n    return _InterlockedExchangeAdd( (long*)ptr, addend );\n}\ninline long __TBB_machine_fetchstore4 (volatile void *ptr, __int32 value ) {\n    return _InterlockedExchange( (long*)ptr, value );\n}\n\ninline __int64 __TBB_machine_cmpswp8 (volatile void *ptr, __int64 value, __int64 comparand ) {\n    return _InterlockedCompareExchange64( (__int64*)ptr, value, comparand );\n}\ninline __int64 __TBB_machine_fetchadd8 (volatile void *ptr, __int64 addend ) {\n    return _InterlockedExchangeAdd64( (__int64*)ptr, addend );\n}\ninline __int64 __TBB_machine_fetchstore8 (volatile void *ptr, __int64 value ) {\n    return _InterlockedExchange64( (__int64*)ptr, value );\n}\n\n#define __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE           1\n#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE            1\n#define __TBB_USE_GENERIC_RELAXED_LOAD_STORE                1\n#define __TBB_USE_GENERIC_SEQUENTIAL_CONSISTENCY_LOAD_STORE 1\n\ninline void __TBB_machine_OR( volatile void *operand, intptr_t addend ) {\n    _InterlockedOr64((__int64*)operand, addend); \n}\n\ninline void __TBB_machine_AND( volatile void *operand, intptr_t addend ) {\n    _InterlockedAnd64((__int64*)operand, addend); \n}\n\n#define __TBB_AtomicOR(P,V) __TBB_machine_OR(P,V)\n#define __TBB_AtomicAND(P,V) __TBB_machine_AND(P,V)\n\n"
  },
  {
    "path": "benchmarks/tbb/machine/xbox360_ppc.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n// TODO: revise by comparing with mac_ppc.h\n\n#if !defined(__TBB_machine_H) || defined(__TBB_machine_xbox360_ppc_H)\n#error Do not #include this internal file directly; use public TBB headers instead.\n#endif\n\n#define __TBB_machine_xbox360_ppc_H\n\n#define NONET\n#define NOD3D\n#include \"xtl.h\"    \n#include \"ppcintrinsics.h\"\n\n#if _MSC_VER >= 1300\nextern \"C\" void _MemoryBarrier();\n#pragma intrinsic(_MemoryBarrier)\n#define __TBB_control_consistency_helper() __isync()\n#define __TBB_acquire_consistency_helper() _MemoryBarrier()\n#define __TBB_release_consistency_helper() _MemoryBarrier()\n#endif\n\n#define __TBB_full_memory_fence() __sync()\n\n#define __TBB_WORDSIZE 4\n#define __TBB_ENDIANNESS __TBB_ENDIAN_BIG\n\n//todo: define __TBB_USE_FENCED_ATOMICS and define acquire/release primitives to maximize performance\n\ninline __int32 __TBB_machine_cmpswp4(volatile void *ptr, __int32 value, __int32 comparand ) {                               \n __sync();\n __int32 result = InterlockedCompareExchange((volatile LONG*)ptr, value, comparand);\n __isync();\n return result;\n}\n\ninline __int64 __TBB_machine_cmpswp8(volatile void *ptr, __int64 value, __int64 comparand )\n{\n __sync();\n __int64 result = InterlockedCompareExchange64((volatile LONG64*)ptr, value, comparand);\n __isync();\n return result;\n}\n\n#define __TBB_USE_GENERIC_PART_WORD_CAS                     1\n#define __TBB_USE_GENERIC_FETCH_ADD                         1\n#define __TBB_USE_GENERIC_FETCH_STORE                       1\n#define __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE            1\n#define __TBB_USE_GENERIC_RELAXED_LOAD_STORE                1\n#define __TBB_USE_GENERIC_DWORD_LOAD_STORE                  1\n#define __TBB_USE_GENERIC_SEQUENTIAL_CONSISTENCY_LOAD_STORE 1\n\n#pragma optimize( \"\", off )\ninline void __TBB_machine_pause (__int32 delay ) \n{\n for (__int32 i=0; i<delay; i++) {;};\n}\n#pragma optimize( \"\", on ) \n\n#define __TBB_Yield()  Sleep(0)\n#define __TBB_Pause(V) __TBB_machine_pause(V)\n\n// This port uses only 2 hardware threads for TBB on XBOX 360. \n// Others are left to sound etc.\n// Change the following mask to allow TBB use more HW threads.\nstatic const int __TBB_XBOX360_HARDWARE_THREAD_MASK = 0x0C;\n\nstatic inline int __TBB_XBOX360_DetectNumberOfWorkers() \n{\n     char a[__TBB_XBOX360_HARDWARE_THREAD_MASK];  //compile time assert - at least one bit should be set always\n     a[0]=0;\n\n     return ((__TBB_XBOX360_HARDWARE_THREAD_MASK >> 0) & 1) +\n            ((__TBB_XBOX360_HARDWARE_THREAD_MASK >> 1) & 1) +\n            ((__TBB_XBOX360_HARDWARE_THREAD_MASK >> 2) & 1) +\n            ((__TBB_XBOX360_HARDWARE_THREAD_MASK >> 3) & 1) +\n            ((__TBB_XBOX360_HARDWARE_THREAD_MASK >> 4) & 1) +\n            ((__TBB_XBOX360_HARDWARE_THREAD_MASK >> 5) & 1) + 1;  // +1 accomodates for the master thread\n}\n\nstatic inline int __TBB_XBOX360_GetHardwareThreadIndex(int workerThreadIndex)\n{\n    workerThreadIndex %= __TBB_XBOX360_DetectNumberOfWorkers()-1;\n    int m = __TBB_XBOX360_HARDWARE_THREAD_MASK;\n    int index = 0;\n    int skipcount = workerThreadIndex;\n    while (true)\n    {\n        if ((m & 1)!=0) \n        {\n            if (skipcount==0) break;\n            skipcount--;\n        }\n        m >>= 1;\n       index++;\n    }\n    return index; \n}\n\n#define __TBB_HardwareConcurrency() __TBB_XBOX360_DetectNumberOfWorkers()\n"
  },
  {
    "path": "benchmarks/tbb/mailbox.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef _TBB_mailbox_H\n#define _TBB_mailbox_H\n\n#include \"tbb/tbb_stddef.h\"\n#include \"tbb/cache_aligned_allocator.h\"\n\n#include \"scheduler_common.h\"\n#include \"tbb/atomic.h\"\n\nnamespace tbb {\nnamespace internal {\n\nstruct task_proxy : public task {\n    static const intptr_t      pool_bit = 1<<0;\n    static const intptr_t   mailbox_bit = 1<<1;\n    static const intptr_t location_mask = pool_bit | mailbox_bit;\n    /* All but two low-order bits represent a (task*).\n       Two low-order bits mean:\n       1 = proxy is/was/will be in task pool\n       2 = proxy is/was/will be in mailbox */\n    intptr_t task_and_tag;\n\n    //! Pointer to next task_proxy in a mailbox\n    task_proxy *__TBB_atomic next_in_mailbox;\n\n    //! Mailbox to which this was mailed.\n    mail_outbox* outbox;\n\n    //! True if the proxy is stored both in its sender's pool and in the destination mailbox.\n    static bool is_shared ( intptr_t tat ) {\n        return (tat & location_mask) == location_mask;\n    }\n\n    //! Returns a pointer to the encapsulated task or NULL.\n    static task* task_ptr ( intptr_t tat ) {\n        return (task*)(tat & ~location_mask);\n    }\n\n    //! Returns a pointer to the encapsulated task or NULL, and frees proxy if necessary.\n    template<intptr_t from_bit>\n    inline task* extract_task () {\n        __TBB_ASSERT( prefix().extra_state == es_task_proxy, \"Normal task misinterpreted as a proxy?\" );\n        intptr_t tat = __TBB_load_with_acquire(task_and_tag);\n        __TBB_ASSERT( tat == from_bit || (is_shared(tat) && task_ptr(tat)),\n            \"Proxy's tag cannot specify both locations if the proxy \"\n            \"was retrieved from one of its original locations\" );\n        if ( tat != from_bit ) {\n            const intptr_t cleaner_bit = location_mask & ~from_bit;\n            // Attempt to transition the proxy to the \"empty\" state with\n            // cleaner_bit specifying entity responsible for its eventual freeing.\n            // Explicit cast to void* is to work around a seeming ICC 11.1 bug.\n            if ( as_atomic(task_and_tag).compare_and_swap(cleaner_bit, tat) == tat ) {\n                // Successfully grabbed the task, and left new owner with the job of freeing the proxy\n                return task_ptr(tat);\n            }\n        }\n        // Proxied task has already been claimed from another proxy location.\n        __TBB_ASSERT( task_and_tag == from_bit, \"Empty proxy cannot contain non-zero task pointer\" );\n        poison_pointer(outbox);\n        poison_pointer(next_in_mailbox);\n        poison_value(task_and_tag);\n        return NULL;\n    }\n}; // struct task_proxy\n\n//! Internal representation of mail_outbox, without padding.\nclass unpadded_mail_outbox {\nprotected:\n    typedef task_proxy*__TBB_atomic proxy_ptr;\n\n    //! Pointer to first task_proxy in mailbox, or NULL if box is empty. \n    proxy_ptr my_first;\n\n    //! Pointer to pointer that will point to next item in the queue.  Never NULL.\n    proxy_ptr* __TBB_atomic my_last;\n\n    //! Owner of mailbox is not executing a task, and has drained its own task pool.\n    bool my_is_idle;\n};\n\n//! Class representing where mail is put.\n/** Padded to occupy a cache line. */\nclass mail_outbox : padded<unpadded_mail_outbox> {\n\n    task_proxy* internal_pop() {\n        task_proxy* const first = __TBB_load_relaxed(my_first);\n        if( !first )\n            return NULL;\n        __TBB_control_consistency_helper(); // on my_first\n        // There is a first item in the mailbox.  See if there is a second.\n        if( task_proxy* second = first->next_in_mailbox ) {\n            // There are at least two items, so first item can be popped easily.\n            my_first = second;\n        } else {\n            // There is only one item.  Some care is required to pop it.\n            my_first = NULL;\n            if( as_atomic(my_last).compare_and_swap(&my_first,&first->next_in_mailbox) == &first->next_in_mailbox )\n            {\n                // Successfully transitioned mailbox from having one item to having none.\n                __TBB_ASSERT(!first->next_in_mailbox,NULL);\n            } else {\n                // Some other thread updated my_last but has not filled in first->next_in_mailbox\n                // Wait until first item points to second item.\n                atomic_backoff backoff;\n                while( !(second = first->next_in_mailbox) ) backoff.pause();\n                my_first = second;\n            }\n        }\n        return first;\n    }\npublic:\n    friend class mail_inbox;\n\n    //! Push task_proxy onto the mailbox queue of another thread.\n    /** Implementation is wait-free. */\n    void push( task_proxy& t ) {\n        __TBB_ASSERT(&t, NULL);\n        t.next_in_mailbox = NULL; \n        proxy_ptr * const link = (proxy_ptr *)__TBB_FetchAndStoreW(&my_last,(intptr_t)&t.next_in_mailbox);\n        // No release fence required for the next store, because there are no memory operations \n        // between the previous fully fenced atomic operation and the store.\n        __TBB_store_relaxed(*link, &t);\n    }\n\n    //! Return true if mailbox is empty\n    bool empty() {\n        return __TBB_load_relaxed(my_first) == NULL;\n    }\n\n    //! Construct *this as a mailbox from zeroed memory.\n    /** Raise assertion if *this is not previously zeroed, or sizeof(this) is wrong.\n        This method is provided instead of a full constructor since we know the object\n        will be constructed in zeroed memory. */\n    void construct() {\n        __TBB_ASSERT( sizeof(*this)==NFS_MaxLineSize, NULL );\n        __TBB_ASSERT( !my_first, NULL );\n        __TBB_ASSERT( !my_last, NULL );\n        __TBB_ASSERT( !my_is_idle, NULL );\n        my_last=&my_first;\n        suppress_unused_warning(pad);\n    }\n\n    //! Drain the mailbox \n    intptr_t drain() {\n        intptr_t k = 0;\n        // No fences here because other threads have already quit.\n        for( ; task_proxy* t = my_first; ++k ) {\n            my_first = t->next_in_mailbox;\n            NFS_Free((char*)t - task_prefix_reservation_size);\n        }\n        return k;  \n    }\n\n    //! True if thread that owns this mailbox is looking for work.\n    bool recipient_is_idle() {\n        return my_is_idle;\n    }\n}; // class mail_outbox\n\n//! Class representing source of mail.\nclass mail_inbox {\n    //! Corresponding sink where mail that we receive will be put.\n    mail_outbox* my_putter;\npublic:\n    //! Construct unattached inbox\n    mail_inbox() : my_putter(NULL) {}\n\n    //! Attach inbox to a corresponding outbox. \n    void attach( mail_outbox& putter ) {\n        __TBB_ASSERT(!my_putter,\"already attached\");\n        my_putter = &putter;\n    }\n    //! Detach inbox from its outbox\n    void detach() {\n        __TBB_ASSERT(my_putter,\"not attached\");\n        my_putter = NULL;\n    }\n    //! Get next piece of mail, or NULL if mailbox is empty.\n    task_proxy* pop() {\n        return my_putter->internal_pop();\n    }\n    //! Return true if mailbox is empty\n    bool empty() {\n        return my_putter->empty();\n    }\n    //! Indicate whether thread that reads this mailbox is idle.\n    /** Raises assertion failure if mailbox is redundantly marked as not idle. */\n    void set_is_idle( bool value ) {\n        if( my_putter ) {\n            __TBB_ASSERT( my_putter->my_is_idle || value, \"attempt to redundantly mark mailbox as not idle\" );\n            my_putter->my_is_idle = value;\n        }\n    }\n    //! Indicate whether thread that reads this mailbox is idle.\n    bool is_idle_state ( bool value ) const {\n        return !my_putter || my_putter->my_is_idle == value;\n    }\n\n#if DO_ITT_NOTIFY\n    //! Get pointer to corresponding outbox used for ITT_NOTIFY calls.\n    void* outbox() const {return my_putter;}\n#endif /* DO_ITT_NOTIFY */ \n}; // class mail_inbox\n\n} // namespace internal\n} // namespace tbb\n\n#endif /* _TBB_mailbox_H */\n"
  },
  {
    "path": "benchmarks/tbb/market.cpp",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#include \"tbb/tbb_stddef.h\"\n\n#include \"market.h\"\n#include \"tbb_main.h\"\n#include \"governor.h\"\n#include \"scheduler.h\"\n#include \"itt_notify.h\"\n\nnamespace tbb {\nnamespace internal {\n\nvoid market::insert_arena_into_list ( arena& a ) {\n#if __TBB_TASK_PRIORITY\n    arena_list_type &arenas = my_priority_levels[a.my_top_priority].arenas;\n    arena *&next = my_priority_levels[a.my_top_priority].next_arena;\n#else /* !__TBB_TASK_PRIORITY */\n    arena_list_type &arenas = my_arenas;\n    arena *&next = my_next_arena;\n#endif /* !__TBB_TASK_PRIORITY */\n    arenas.push_front( a );\n    if ( arenas.size() == 1 )\n        next = &*arenas.begin();\n}\n\nvoid market::remove_arena_from_list ( arena& a ) {\n#if __TBB_TASK_PRIORITY\n    arena_list_type &arenas = my_priority_levels[a.my_top_priority].arenas;\n    arena *&next = my_priority_levels[a.my_top_priority].next_arena;\n#else /* !__TBB_TASK_PRIORITY */\n    arena_list_type &arenas = my_arenas;\n    arena *&next = my_next_arena;\n#endif /* !__TBB_TASK_PRIORITY */\n    arena_list_type::iterator it = next;\n    __TBB_ASSERT( it != arenas.end(), NULL );\n    if ( next == &a ) {\n        if ( ++it == arenas.end() && arenas.size() > 1 )\n            it = arenas.begin();\n        next = &*it;\n    }\n    arenas.remove( a );\n}\n\n//------------------------------------------------------------------------\n// market\n//------------------------------------------------------------------------\n\nmarket::market ( unsigned max_num_workers, size_t stack_size )\n    : my_ref_count(1)\n    , my_stack_size(stack_size)\n    , my_max_num_workers(max_num_workers)\n#if __TBB_TASK_PRIORITY\n    , my_global_top_priority(normalized_normal_priority)\n    , my_global_bottom_priority(normalized_normal_priority)\n#if __TBB_TRACK_PRIORITY_LEVEL_SATURATION\n    , my_lowest_populated_level(normalized_normal_priority)\n#endif /* __TBB_TRACK_PRIORITY_LEVEL_SATURATION */\n#endif /* __TBB_TASK_PRIORITY */\n{\n#if __TBB_TASK_PRIORITY\n    __TBB_ASSERT( my_global_reload_epoch == 0, NULL );\n    my_priority_levels[normalized_normal_priority].workers_available = max_num_workers;\n#endif /* __TBB_TASK_PRIORITY */\n\n    // Once created RML server will start initializing workers that will need \n    // global market instance to get worker stack size\n    my_server = governor::create_rml_server( *this );\n    __TBB_ASSERT( my_server, \"Failed to create RML server\" );\n}\n\n\nmarket& market::global_market ( unsigned max_num_workers, size_t stack_size ) {\n    global_market_mutex_type::scoped_lock lock( theMarketMutex );\n    market *m = theMarket;\n    if ( m ) {\n        ++m->my_ref_count;\n        if ( m->my_stack_size < stack_size )\n            runtime_warning( \"Newer master request for larger stack cannot be satisfied\\n\" );\n    }\n    else {\n        max_num_workers = max( governor::default_num_threads() - 1, max_num_workers );\n        // at least 1 worker is required to support starvation resistant tasks\n        if( max_num_workers==0 ) max_num_workers = 1;\n        // Create the global market instance\n        size_t size = sizeof(market);\n#if __TBB_TASK_GROUP_CONTEXT\n        __TBB_ASSERT( __TBB_offsetof(market, my_workers) + sizeof(generic_scheduler*) == sizeof(market),\n                      \"my_workers must be the last data field of the market class\");\n        size += sizeof(generic_scheduler*) * (max_num_workers - 1);\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n        __TBB_InitOnce::add_ref();\n        void* storage = NFS_Allocate(1, size, NULL);\n        memset( storage, 0, size );\n        // Initialize and publish global market\n        m = new (storage) market( max_num_workers, stack_size );\n        theMarket = m;\n    }\n    return *m;\n}\n\nvoid market::destroy () {\n#if __TBB_COUNT_TASK_NODES\n    if ( my_task_node_count )\n        runtime_warning( \"Leaked %ld task objects\\n\", (long)my_task_node_count );\n#endif /* __TBB_COUNT_TASK_NODES */\n    this->~market();\n    NFS_Free( this );\n    __TBB_InitOnce::remove_ref();\n}\n\nvoid market::release () {\n    __TBB_ASSERT( theMarket == this, \"Global market instance was destroyed prematurely?\" );\n    bool do_release = false;\n    {\n        global_market_mutex_type::scoped_lock lock(theMarketMutex);\n        if ( --my_ref_count == 0 ) {\n            do_release = true;\n            theMarket = NULL;\n        }\n    }\n    if( do_release )\n        my_server->request_close_connection();\n}\n\nvoid market::wait_workers () {\n    // usable for this kind of scheduler only\n    __TBB_ASSERT(governor::needsWaitWorkers(), NULL);\n    // wait till terminating last worker decresed my_ref_count\n    while (__TBB_load_with_acquire(my_ref_count) > 1)\n        __TBB_Yield();\n    __TBB_ASSERT(1 == my_ref_count, NULL);\n    release();\n}\n\narena& market::create_arena ( unsigned max_num_workers, size_t stack_size ) {\n    market &m = global_market( max_num_workers, stack_size ); // increases market's ref count\n#if __TBB_TASK_ARENA\n    // Prevent cutting an extra slot for task_arena(p,0) with default market (p-1 workers).\n    // This is a temporary workaround for 1968 until (TODO:) master slot reservation is reworked\n    arena& a = arena::allocate_arena( m, min(max_num_workers, m.my_max_num_workers+1) );\n#else\n    arena& a = arena::allocate_arena( m, min(max_num_workers, m.my_max_num_workers) );\n#endif\n    // Add newly created arena into the existing market's list.\n    arenas_list_mutex_type::scoped_lock lock(m.my_arenas_list_mutex);\n    m.insert_arena_into_list(a);\n    return a;\n}\n\n/** This method must be invoked under my_arenas_list_mutex. **/\nvoid market::detach_arena ( arena& a ) {\n    __TBB_ASSERT( theMarket == this, \"Global market instance was destroyed prematurely?\" );\n#if __TBB_TRACK_PRIORITY_LEVEL_SATURATION\n    __TBB_ASSERT( !a.my_num_workers_present, NULL );\n#endif /* __TBB_TRACK_PRIORITY_LEVEL_SATURATION */\n    __TBB_ASSERT( !a.my_slots[0].my_scheduler, NULL );\n    remove_arena_from_list(a);\n    if ( a.my_aba_epoch == my_arenas_aba_epoch )\n        ++my_arenas_aba_epoch;\n}\n\nvoid market::try_destroy_arena ( arena* a, uintptr_t aba_epoch ) {\n    __TBB_ASSERT ( a, NULL );\n    arenas_list_mutex_type::scoped_lock lock(my_arenas_list_mutex);\n    assert_market_valid();\n#if __TBB_TASK_PRIORITY\n    for ( int p = my_global_top_priority; p >= my_global_bottom_priority; --p ) {\n        priority_level_info &pl = my_priority_levels[p];\n        arena_list_type &my_arenas = pl.arenas;\n#endif /* __TBB_TASK_PRIORITY */\n        arena_list_type::iterator it = my_arenas.begin();\n        for ( ; it != my_arenas.end(); ++it ) {\n            if ( a == &*it ) {\n                if ( it->my_aba_epoch == aba_epoch ) {\n                    // Arena is alive\n                    if ( !a->my_num_workers_requested && !a->my_references ) {\n                        __TBB_ASSERT( !a->my_num_workers_allotted && (a->my_pool_state == arena::SNAPSHOT_EMPTY || !a->my_max_num_workers), \"Inconsistent arena state\" );\n                        // Arena is abandoned. Destroy it.\n                        detach_arena( *a );\n                        lock.release();\n                        a->free_arena();\n                    }\n                }\n                return;\n            }\n        }\n#if __TBB_TASK_PRIORITY\n    }\n#endif /* __TBB_TASK_PRIORITY */\n}\n\nvoid market::try_destroy_arena ( market* m, arena* a, uintptr_t aba_epoch, bool master ) {\n    // Arena may have been orphaned. Or it may have been destroyed.\n    // Thus we cannot dereference the pointer to it until its liveness is verified.\n    // Arena is alive if it is found in the market's list.\n\n    if ( m != theMarket ) {\n        // The market has already been emptied.\n        return;\n    }\n    else if ( master ) {\n        // If this is a master thread, market can be destroyed at any moment.\n        // So protect it with an extra refcount.\n        global_market_mutex_type::scoped_lock lock(theMarketMutex);\n        if ( m != theMarket )\n            return;\n        ++m->my_ref_count;\n    }\n    m->try_destroy_arena( a, aba_epoch );\n    if ( master )\n        m->release();\n}\n\n/** This method must be invoked under my_arenas_list_mutex. **/\narena* market::arena_in_need ( arena_list_type &arenas, arena *&next ) {\n    if ( arenas.empty() )\n        return NULL;\n    arena_list_type::iterator it = next;\n    __TBB_ASSERT( it != arenas.end(), NULL );\n    do {\n        arena& a = *it;\n        if ( ++it == arenas.end() )\n            it = arenas.begin();\n        if ( a.num_workers_active() < a.my_num_workers_allotted ) {\n            a.my_references += 2; // add a worker\n#if __TBB_TRACK_PRIORITY_LEVEL_SATURATION\n            ++a.my_num_workers_present;\n            ++my_priority_levels[a.my_top_priority].workers_present;\n#endif /* __TBB_TRACK_PRIORITY_LEVEL_SATURATION */\n            as_atomic(next) = &*it; // a subject for innocent data race under the reader lock\n            // TODO: rework global round robin policy to local or random to avoid this write\n            return &a;\n        }\n    } while ( it != next );\n    return NULL;\n}\n\nvoid market::update_allotment ( arena_list_type& arenas, int workers_demand, int max_workers ) {\n    __TBB_ASSERT( workers_demand, NULL );\n    max_workers = min(workers_demand, max_workers);\n    int carry = 0;\n#if TBB_USE_ASSERT\n    int assigned = 0;\n#endif /* TBB_USE_ASSERT */\n    arena_list_type::iterator it = arenas.begin();\n    for ( ; it != arenas.end(); ++it ) {\n        arena& a = *it;\n        if ( a.my_num_workers_requested <= 0 ) {\n            __TBB_ASSERT( !a.my_num_workers_allotted, NULL );\n            continue;\n        }\n        int tmp = a.my_num_workers_requested * max_workers + carry;\n        int allotted = tmp / workers_demand;\n        carry = tmp % workers_demand;\n        // a.my_num_workers_requested may temporarily exceed a.my_max_num_workers\n        a.my_num_workers_allotted = min( allotted, (int)a.my_max_num_workers );\n#if TBB_USE_ASSERT\n        assigned += a.my_num_workers_allotted;\n#endif /* TBB_USE_ASSERT */\n    }\n    __TBB_ASSERT( assigned <= workers_demand, NULL );\n}\n\n#if __TBB_TASK_PRIORITY\ninline void market::update_global_top_priority ( intptr_t newPriority ) {\n    GATHER_STATISTIC( ++governor::local_scheduler_if_initialized()->my_counters.market_prio_switches );\n    my_global_top_priority = newPriority;\n    my_priority_levels[newPriority].workers_available = my_max_num_workers;\n    advance_global_reload_epoch();\n}\n\ninline void market::reset_global_priority () {\n    my_global_bottom_priority = normalized_normal_priority;\n    update_global_top_priority(normalized_normal_priority);\n#if __TBB_TRACK_PRIORITY_LEVEL_SATURATION\n    my_lowest_populated_level = normalized_normal_priority;\n#endif /* __TBB_TRACK_PRIORITY_LEVEL_SATURATION */\n}\n\narena* market::arena_in_need ( arena* prev_arena )\n{\n    if( !has_any_demand() )\n        return NULL;\n    arenas_list_mutex_type::scoped_lock lock(my_arenas_list_mutex, /*is_writer=*/false);\n    assert_market_valid();\n#if __TBB_TRACK_PRIORITY_LEVEL_SATURATION\n    if ( prev_arena ) {\n        priority_level_info &pl = my_priority_levels[prev_arena->my_top_priority];\n        --prev_arena->my_num_workers_present;\n        --pl.workers_present;\n        if ( !--prev_arena->my_references && !prev_arena->my_num_workers_requested ) {\n            detach_arena( *a );\n            lock.release();\n            a->free_arena();\n            lock.acquire();\n        }\n    }\n#else\n    suppress_unused_warning(prev_arena);\n#endif /* __TBB_TRACK_PRIORITY_LEVEL_SATURATION */\n    int p = my_global_top_priority;\n    arena *a = NULL;\n    do {\n        priority_level_info &pl = my_priority_levels[p];\n#if __TBB_TRACK_PRIORITY_LEVEL_SATURATION\n        __TBB_ASSERT( p >= my_lowest_populated_level, NULL );\n        if ( pl.workers_present >= pl.workers_requested )\n            continue;\n#endif /* __TBB_TRACK_PRIORITY_LEVEL_SATURATION */\n        a = arena_in_need( pl.arenas, pl.next_arena );\n    } while ( !a && --p >= my_global_bottom_priority );\n    return a;\n}\n\nvoid market::update_allotment ( intptr_t highest_affected_priority ) {\n    intptr_t i = highest_affected_priority;\n    int available = my_priority_levels[i].workers_available;\n#if __TBB_TRACK_PRIORITY_LEVEL_SATURATION\n    my_lowest_populated_level = my_global_bottom_priority;\n#endif /* __TBB_TRACK_PRIORITY_LEVEL_SATURATION */\n    for ( ; i >= my_global_bottom_priority; --i ) {\n        priority_level_info &pl = my_priority_levels[i];\n        pl.workers_available = available;\n        if ( pl.workers_requested ) {\n            update_allotment( pl.arenas, pl.workers_requested, available );\n            available -= pl.workers_requested;\n            if ( available < 0 ) {\n                available = 0;\n#if __TBB_TRACK_PRIORITY_LEVEL_SATURATION\n                my_lowest_populated_level = i;\n#endif /* __TBB_TRACK_PRIORITY_LEVEL_SATURATION */\n                break;\n            }\n        }\n    }\n    __TBB_ASSERT( i <= my_global_bottom_priority || !available, NULL );\n    for ( --i; i >= my_global_bottom_priority; --i ) {\n        priority_level_info &pl = my_priority_levels[i];\n        pl.workers_available = 0;\n        arena_list_type::iterator it = pl.arenas.begin();\n        for ( ; it != pl.arenas.end(); ++it ) {\n            __TBB_ASSERT( it->my_num_workers_requested || !it->my_num_workers_allotted, NULL );\n            it->my_num_workers_allotted = 0;\n        }\n    }\n}\n#endif /* __TBB_TASK_PRIORITY */\n\nvoid market::adjust_demand ( arena& a, int delta ) {\n    __TBB_ASSERT( theMarket, \"market instance was destroyed prematurely?\" );\n    if ( !delta )\n        return;\n    my_arenas_list_mutex.lock();\n    int prev_req = a.my_num_workers_requested;\n    a.my_num_workers_requested += delta;\n    if ( a.my_num_workers_requested <= 0 ) {\n        a.my_num_workers_allotted = 0;\n        if ( prev_req <= 0 ) {\n            my_arenas_list_mutex.unlock();\n            return;\n        }\n        delta = -prev_req;\n    }\n#if __TBB_TASK_ARENA\n    else if ( prev_req < 0 ) {\n        delta = a.my_num_workers_requested;\n    }\n#else  /* __TBB_TASK_ARENA */\n    __TBB_ASSERT( prev_req >= 0, \"Part-size request to RML?\" );\n#endif /* __TBB_TASK_ARENA */\n#if __TBB_TASK_PRIORITY\n    intptr_t p = a.my_top_priority;\n    priority_level_info &pl = my_priority_levels[p];\n    pl.workers_requested += delta;\n    __TBB_ASSERT( pl.workers_requested >= 0, NULL );\n#if !__TBB_TASK_ARENA\n    __TBB_ASSERT( a.my_num_workers_requested >= 0, NULL );\n#else\n    //TODO: understand the assertion and modify\n#endif\n    if ( a.my_num_workers_requested <= 0 ) {\n        if ( a.my_top_priority != normalized_normal_priority ) {\n            GATHER_STATISTIC( ++governor::local_scheduler_if_initialized()->my_counters.arena_prio_resets );\n            update_arena_top_priority( a, normalized_normal_priority );\n        }\n        a.my_bottom_priority = normalized_normal_priority;\n    }\n    if ( p == my_global_top_priority ) {\n        if ( !pl.workers_requested ) {\n            while ( --p >= my_global_bottom_priority && !my_priority_levels[p].workers_requested )\n                continue;\n            if ( p < my_global_bottom_priority )\n                reset_global_priority();\n            else\n                update_global_top_priority(p);\n        }\n        update_allotment( my_global_top_priority );\n    }\n    else if ( p > my_global_top_priority ) {\n#if !__TBB_TASK_ARENA\n        __TBB_ASSERT( pl.workers_requested > 0, NULL );\n#else\n        //TODO: understand the assertion and modify\n#endif\n        update_global_top_priority(p);\n        a.my_num_workers_allotted = min( (int)my_max_num_workers, a.my_num_workers_requested );\n        my_priority_levels[p - 1].workers_available = my_max_num_workers - a.my_num_workers_allotted;\n        update_allotment( p - 1 );\n    }\n    else if ( p == my_global_bottom_priority ) {\n        if ( !pl.workers_requested ) {\n            while ( ++p <= my_global_top_priority && !my_priority_levels[p].workers_requested )\n                continue;\n            if ( p > my_global_top_priority )\n                reset_global_priority();\n            else {\n                my_global_bottom_priority = p;\n#if __TBB_TRACK_PRIORITY_LEVEL_SATURATION\n                my_lowest_populated_level = max( my_lowest_populated_level, p );\n#endif /* __TBB_TRACK_PRIORITY_LEVEL_SATURATION */\n            }\n        }\n        else\n            update_allotment( p );\n    }\n    else if ( p < my_global_bottom_priority ) {\n        __TBB_ASSERT( a.my_num_workers_requested > 0, NULL );\n        int prev_bottom = my_global_bottom_priority;\n        my_global_bottom_priority = p;\n        update_allotment( prev_bottom );\n    }\n    else {\n        __TBB_ASSERT( my_global_bottom_priority < p && p < my_global_top_priority, NULL );\n        update_allotment( p );\n    }\n    __TBB_ASSERT( my_global_top_priority >= a.my_top_priority || a.my_num_workers_requested<=0, NULL );\n    assert_market_valid();\n#else /* !__TBB_TASK_PRIORITY */\n    my_total_demand += delta;\n    update_allotment();\n#endif /* !__TBB_TASK_PRIORITY */\n    my_arenas_list_mutex.unlock();\n    // Must be called outside of any locks\n    my_server->adjust_job_count_estimate( delta );\n    GATHER_STATISTIC( governor::local_scheduler_if_initialized() ? ++governor::local_scheduler_if_initialized()->my_counters.gate_switches : 0 );\n}\n\nvoid market::process( job& j ) {\n    generic_scheduler& s = static_cast<generic_scheduler&>(j);\n    arena *a = NULL;\n    __TBB_ASSERT( governor::is_set(&s), NULL );\n#if !__TBB_SLEEP_PERMISSION\n    while ( (a = arena_in_need(a)) )\n        a->process(s);\n#else//__TBB_SLEEP_PERMISSION\n    enum {\n        query_interval = 1000,\n        first_interval = 1,\n        pause_time = 100 // similar to PauseTime used for the stealing loop\n    };\n    for(int i = first_interval; ; i--) {\n        while ( (a = arena_in_need(a)) )\n        {\n            a->process(s);\n            i = first_interval;\n        }\n        if( i == 0 ) {\n#if __TBB_TASK_PRIORITY\n            arena_list_type &al = my_priority_levels[my_global_top_priority].arenas;\n#else /* __TBB_TASK_PRIORITY */\n            arena_list_type &al = my_arenas;\n#endif /* __TBB_TASK_PRIORITY */\n            if( al.empty() ) // races if any are innocent TODO: replace by an RML query interface\n                break; // no arenas left, perhaps going to shut down\n            if( the_global_observer_list.ask_permission_to_leave() )\n                break; // go sleep\n            __TBB_Yield();\n            i = query_interval;\n        } else __TBB_Pause(pause_time);\n    }\n#endif//__TBB_SLEEP_PERMISSION\n    GATHER_STATISTIC( ++s.my_counters.market_roundtrips );\n}\n\nvoid market::cleanup( job& j ) {\n    __TBB_ASSERT( theMarket != this, NULL );\n    generic_scheduler& s = static_cast<generic_scheduler&>(j);\n    generic_scheduler* mine = governor::local_scheduler_if_initialized();\n    __TBB_ASSERT( !mine || mine->my_arena_index!=0, NULL );\n    if( mine!=&s ) {\n        governor::assume_scheduler( &s );\n        generic_scheduler::cleanup_worker( &s, mine!=NULL );\n        governor::assume_scheduler( mine );\n    } else {\n        generic_scheduler::cleanup_worker( &s, true );\n    }\n}\n\nvoid market::acknowledge_close_connection() {\n    destroy();\n}\n\n::rml::job* market::create_one_job() {\n    unsigned index = ++my_num_workers;\n    __TBB_ASSERT( index > 0, NULL );\n    ITT_THREAD_SET_NAME(_T(\"TBB Worker Thread\"));\n    // index serves as a hint decreasing conflicts between workers when they migrate between arenas\n    generic_scheduler* s = generic_scheduler::create_worker( *this, index );\n#if __TBB_TASK_GROUP_CONTEXT\n    __TBB_ASSERT( index <= my_max_num_workers, NULL );\n    __TBB_ASSERT( !my_workers[index - 1], NULL );\n    my_workers[index - 1] = s;\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n    governor::sign_on(s);\n    return s;\n}\n\n#if __TBB_TASK_PRIORITY\nvoid market::update_arena_top_priority ( arena& a, intptr_t new_priority ) {\n    GATHER_STATISTIC( ++governor::local_scheduler_if_initialized()->my_counters.arena_prio_switches );\n    __TBB_ASSERT( a.my_top_priority != new_priority, NULL );\n    priority_level_info &prev_level = my_priority_levels[a.my_top_priority],\n                        &new_level = my_priority_levels[new_priority];\n    remove_arena_from_list(a);\n    a.my_top_priority = new_priority;\n    insert_arena_into_list(a);\n    ++a.my_reload_epoch; // TODO: synch with global reload epoch in order to optimize usage of local reload epoch\n#if __TBB_TRACK_PRIORITY_LEVEL_SATURATION\n    // Arena's my_num_workers_present may remain positive for some time after its\n    // my_num_workers_requested becomes zero. Thus the following two lines are\n    // executed unconditionally.\n    prev_level.workers_present -= a.my_num_workers_present;\n    new_level.workers_present += a.my_num_workers_present;\n#endif /* __TBB_TRACK_PRIORITY_LEVEL_SATURATION */\n    prev_level.workers_requested -= a.my_num_workers_requested;\n    new_level.workers_requested += a.my_num_workers_requested;\n    __TBB_ASSERT( prev_level.workers_requested >= 0 && new_level.workers_requested >= 0, NULL );\n}\n\nbool market::lower_arena_priority ( arena& a, intptr_t new_priority, uintptr_t old_reload_epoch ) {\n    // TODO: replace the lock with a try_lock loop which performs a double check of the epoch\n    arenas_list_mutex_type::scoped_lock lock(my_arenas_list_mutex);\n    if ( a.my_reload_epoch != old_reload_epoch ) {\n        assert_market_valid();\n        return false;\n    }\n    __TBB_ASSERT( a.my_top_priority > new_priority, NULL );\n    __TBB_ASSERT( my_global_top_priority >= a.my_top_priority, NULL );\n\n    intptr_t p = a.my_top_priority;\n    update_arena_top_priority( a, new_priority );\n    if ( a.my_num_workers_requested > 0 ) {\n        if ( my_global_bottom_priority > new_priority ) {\n            my_global_bottom_priority = new_priority;\n        }\n        if ( p == my_global_top_priority && !my_priority_levels[p].workers_requested ) {\n            // Global top level became empty\n            for ( --p; !my_priority_levels[p].workers_requested; --p ) continue;\n            __TBB_ASSERT( p >= my_global_bottom_priority, NULL );\n            update_global_top_priority(p);\n        }\n        update_allotment( p );\n    }\n\n    __TBB_ASSERT( my_global_top_priority >= a.my_top_priority, NULL );\n    assert_market_valid();\n    return true;\n}\n\nbool market::update_arena_priority ( arena& a, intptr_t new_priority ) {\n    arenas_list_mutex_type::scoped_lock lock(my_arenas_list_mutex);\n\n    __TBB_ASSERT( my_global_top_priority >= a.my_top_priority || a.my_num_workers_requested <= 0, NULL );\n    assert_market_valid();\n    if ( a.my_top_priority == new_priority ) {\n        return false;\n    }\n    else if ( a.my_top_priority > new_priority ) {\n        if ( a.my_bottom_priority > new_priority )\n            a.my_bottom_priority = new_priority;\n        return false;\n    }\n    else if ( a.my_num_workers_requested <= 0 ) {\n        return false;\n    }\n\n    __TBB_ASSERT( my_global_top_priority >= a.my_top_priority, NULL );\n\n    intptr_t p = a.my_top_priority;\n    intptr_t highest_affected_level = max(p, new_priority);\n    update_arena_top_priority( a, new_priority );\n\n    if ( my_global_top_priority < new_priority ) {\n        update_global_top_priority(new_priority);\n    }\n    else if ( my_global_top_priority == new_priority ) {\n        advance_global_reload_epoch();\n    }\n    else {\n        __TBB_ASSERT( new_priority < my_global_top_priority, NULL );\n        __TBB_ASSERT( new_priority > my_global_bottom_priority, NULL );\n        if ( p == my_global_top_priority && !my_priority_levels[p].workers_requested ) {\n            // Global top level became empty\n            __TBB_ASSERT( my_global_bottom_priority < p, NULL );\n            for ( --p; !my_priority_levels[p].workers_requested; --p ) continue;\n            __TBB_ASSERT( p >= new_priority, NULL );\n            update_global_top_priority(p);\n            highest_affected_level = p;\n        }\n    }\n    if ( p == my_global_bottom_priority ) {\n        // Arena priority was increased from the global bottom level.\n        __TBB_ASSERT( p < new_priority, NULL );                     // n\n        __TBB_ASSERT( new_priority <= my_global_top_priority, NULL );\n        while ( !my_priority_levels[my_global_bottom_priority].workers_requested )\n            ++my_global_bottom_priority;\n        __TBB_ASSERT( my_global_bottom_priority <= new_priority, NULL );\n        __TBB_ASSERT( my_priority_levels[my_global_bottom_priority].workers_requested > 0, NULL );\n    }\n    update_allotment( highest_affected_level );\n\n    __TBB_ASSERT( my_global_top_priority >= a.my_top_priority, NULL );\n    assert_market_valid();\n    return true;\n}\n#endif /* __TBB_TASK_PRIORITY */\n\n#if __TBB_COUNT_TASK_NODES \nintptr_t market::workers_task_node_count() {\n    intptr_t result = 0;\n    ForEachArena(a) {\n        result += a.workers_task_node_count();\n    } EndForEach();\n    return result;\n}\n#endif /* __TBB_COUNT_TASK_NODES */\n\n} // namespace internal\n} // namespace tbb\n"
  },
  {
    "path": "benchmarks/tbb/market.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef _TBB_market_H\n#define _TBB_market_H\n\n#include \"tbb/tbb_stddef.h\"\n\n#include \"scheduler_common.h\"\n#include \"tbb/atomic.h\"\n#include \"tbb/spin_rw_mutex.h\"\n#include \"../rml/include/rml_tbb.h\"\n\n#include \"intrusive_list.h\"\n\n#if defined(_MSC_VER) && defined(_Wp64)\n    // Workaround for overzealous compiler warnings in /Wp64 mode\n    #pragma warning (push)\n    #pragma warning (disable: 4244)\n#endif\n\nnamespace tbb {\n\nclass task_group_context;\n\nnamespace internal {\n\n//------------------------------------------------------------------------\n// Class market\n//------------------------------------------------------------------------\n\nclass market : no_copy, rml::tbb_client {\n    friend class generic_scheduler;\n    friend class arena;\n    template<typename SchedulerTraits> friend class custom_scheduler;\n    friend class tbb::task_group_context;\nprivate:\n    friend void ITT_DoUnsafeOneTimeInitialization ();\n\n    typedef intrusive_list<arena> arena_list_type;\n\n    //! Currently active global market\n    static market* theMarket;\n\n    typedef scheduler_mutex_type global_market_mutex_type;\n\n    //! Mutex guarding creation/destruction of theMarket, insertions/deletions in my_arenas, and cancellation propagation\n    static global_market_mutex_type  theMarketMutex;\n\n    //! Reference count controlling market object lifetime\n    intptr_t my_ref_count;\n\n    //! Lightweight mutex guarding accounting operations with arenas list\n    typedef spin_rw_mutex arenas_list_mutex_type;\n    arenas_list_mutex_type my_arenas_list_mutex;\n\n    //! Pointer to the RML server object that services this TBB instance.\n    rml::tbb_server* my_server;\n\n    //! Stack size of worker threads\n    size_t my_stack_size;\n\n    //! Number of workers requested from the underlying resource manager\n    unsigned my_max_num_workers;\n\n    //! Number of workers that have been delivered by RML\n    /** Used to assign indices to the new workers coming from RML, and busy part\n        of my_workers array. **/\n    atomic<unsigned> my_num_workers;\n\n#if __TBB_TASK_PRIORITY\n    //! Highest priority among active arenas in the market.\n    /** Arena priority level is its tasks highest priority (specified by arena's\n        my_top_priority member).\n        Arena is active when it has outstanding request for workers. Note that \n        inactive arena may have workers lingering there for some time. **/\n    intptr_t my_global_top_priority;\n\n    //! Lowest priority among active arenas in the market.\n    /** See also my_global_top_priority **/\n    intptr_t my_global_bottom_priority;\n\n    //! Tracks events that may bring tasks in offload areas to the top priority level.\n    /** Incremented when global top priority is decremented or a task group priority\n        is elevated to the current top level. **/\n    uintptr_t my_global_reload_epoch;\n\n    //! Information about arenas at a particular priority level\n    struct priority_level_info {\n        //! List of arenas at this priority level\n        arena_list_type arenas;\n\n        //! The first arena to be checked when idle worker seeks for an arena to enter\n        /** The check happens in round-robin fashion. **/\n        arena *next_arena;\n\n        //! Total amount of workers requested by arenas at this priority level.\n        int workers_requested;\n\n        //! Maximal amount of workers the market can tell off to this priority level.\n        int workers_available;\n\n#if __TBB_TRACK_PRIORITY_LEVEL_SATURATION\n        //! Total amount of workers that are in arenas at this priority level.\n        int workers_present;\n#endif /* __TBB_TRACK_PRIORITY_LEVEL_SATURATION */\n    }; // struct priority_level_info\n\n    //! Information about arenas at different priority levels\n    priority_level_info my_priority_levels[num_priority_levels];\n\n#if __TBB_TRACK_PRIORITY_LEVEL_SATURATION\n    //! Lowest priority level having workers available.\n    intptr_t my_lowest_populated_level;\n#endif /* __TBB_TRACK_PRIORITY_LEVEL_SATURATION */\n\n#else /* !__TBB_TASK_PRIORITY */\n\n    //! List of registered arenas\n    arena_list_type my_arenas;\n\n    //! The first arena to be checked when idle worker seeks for an arena to enter\n    /** The check happens in round-robin fashion. **/\n    arena *my_next_arena;\n\n    //! Number of workers that were requested by all arenas\n    int my_total_demand;\n#endif /* !__TBB_TASK_PRIORITY */\n\n    //! ABA prevention marker to assign to newly created arenas\n    uintptr_t my_arenas_aba_epoch;\n\n#if __TBB_COUNT_TASK_NODES\n    //! Net number of nodes that have been allocated from heap.\n    /** Updated each time a scheduler or arena is destroyed. */\n    atomic<intptr_t> my_task_node_count;\n#endif /* __TBB_COUNT_TASK_NODES */\n\n    //! Constructor\n    market ( unsigned max_num_workers, size_t stack_size );\n\n    //! Factory method creating new market object\n    static market& global_market ( unsigned max_num_workers, size_t stack_size );\n\n    //! Destroys and deallocates market object created by market::create()\n    void destroy ();\n\n    void try_destroy_arena ( arena*, uintptr_t aba_epoch );\n\n#if __TBB_TASK_PRIORITY\n    //! Returns next arena that needs more workers, or NULL.\n    arena* arena_in_need ( arena* prev_arena );\n\n    //! Recalculates the number of workers assigned to each arena at and below the specified priority.\n    /** The actual number of workers servicing a particular arena may temporarily \n        deviate from the calculated value. **/\n    void update_allotment ( intptr_t highest_affected_priority );\n\n    //! Changes arena's top priority and updates affected priority levels info in the market.\n    void update_arena_top_priority ( arena& a, intptr_t newPriority );\n\n    //! Changes market's global top priority and related settings.\n    inline void update_global_top_priority ( intptr_t newPriority );\n\n    //! Resets empty market's global top and bottom priority to the normal level.\n    inline void reset_global_priority ();\n\n    inline void advance_global_reload_epoch () {\n        __TBB_store_with_release( my_global_reload_epoch, my_global_reload_epoch + 1 );\n    }\n\n    void assert_market_valid () const {\n        __TBB_ASSERT( (my_priority_levels[my_global_top_priority].workers_requested > 0\n                           && !my_priority_levels[my_global_top_priority].arenas.empty())\n                       || (my_global_top_priority == my_global_bottom_priority &&\n                           my_global_top_priority == normalized_normal_priority), NULL );\n    }\n\n    bool has_any_demand() const {\n        for(int p = 0; p < num_priority_levels; p++)\n            if( __TBB_load_with_acquire(my_priority_levels[p].workers_requested) > 0 ) // TODO: use as_atomic here and below\n                return true;\n        return false;\n    }\n\n#else /* !__TBB_TASK_PRIORITY */\n\n    //! Recalculates the number of workers assigned to each arena in the list.\n    /** The actual number of workers servicing a particular arena may temporarily \n        deviate from the calculated value. **/\n    void update_allotment () {\n        if ( my_total_demand )\n            update_allotment( my_arenas, my_total_demand, (int)my_max_num_workers );\n    }\n\n    //! Returns next arena that needs more workers, or NULL.\n    arena* arena_in_need (arena*) {\n        if(__TBB_load_with_acquire(my_total_demand) <= 0)\n            return NULL;\n        arenas_list_mutex_type::scoped_lock lock(my_arenas_list_mutex, /*is_writer=*/false);\n        return arena_in_need(my_arenas, my_next_arena);\n    }\n    void assert_market_valid () const {}\n#endif /* !__TBB_TASK_PRIORITY */\n\n    //! Returns number of masters doing computational (CPU-intensive) work\n    int num_active_masters () { return 1; }  // APM TODO: replace with a real mechanism\n\n\n    ////////////////////////////////////////////////////////////////////////////////\n    // Helpers to unify code branches dependent on priority feature presence\n\n    void insert_arena_into_list ( arena& a );\n\n    void remove_arena_from_list ( arena& a );\n\n    arena* arena_in_need ( arena_list_type &arenas, arena *&next );\n\n    static void update_allotment ( arena_list_type& arenas, int total_demand, int max_workers );\n\n\n    ////////////////////////////////////////////////////////////////////////////////\n    // Implementation of rml::tbb_client interface methods\n\n    /*override*/ version_type version () const { return 0; }\n\n    /*override*/ unsigned max_job_count () const { return my_max_num_workers; }\n\n    /*override*/ size_t min_stack_size () const { return worker_stack_size(); }\n\n    /*override*/ policy_type policy () const { return throughput; }\n\n    /*override*/ job* create_one_job ();\n\n    /*override*/ void cleanup( job& j );\n\n    /*override*/ void acknowledge_close_connection ();\n\n    /*override*/ void process( job& j );\n\npublic:\n    //! Creates an arena object\n    /** If necessary, also creates global market instance, and boosts its ref count.\n        Each call to create_arena() must be matched by the call to arena::free_arena(). **/\n    static arena& create_arena ( unsigned max_num_workers, size_t stack_size );\n\n    //! Removes the arena from the market's list\n    static void try_destroy_arena ( market*, arena*, uintptr_t aba_epoch, bool master );\n\n    //! Removes the arena from the market's list\n    void detach_arena ( arena& );\n\n    //! Decrements market's refcount and destroys it in the end\n    void release ();\n\n    //! Request that arena's need in workers should be adjusted.\n    /** Concurrent invocations are possible only on behalf of different arenas. **/\n    void adjust_demand ( arena&, int delta );\n\n    //! Guarantee that request_close_connection() is called by master, not some worker\n    /** Must be called before arena::on_thread_leaving() **/\n    void prepare_wait_workers() { ++my_ref_count; }\n\n    //! Wait workers termination\n    void wait_workers ();\n\n    //! Returns the requested stack size of worker threads.\n    size_t worker_stack_size () const { return my_stack_size; }\n\n#if _WIN32||_WIN64\n    //! register master with the resource manager\n    void register_master( ::rml::server::execution_resource_t& rsc_handle ) {\n        __TBB_ASSERT( my_server, \"RML server not defined?\" );\n        // the server may ignore registration and set master_exec_resource to NULL.\n        my_server->register_master( rsc_handle );\n    }\n\n    //! unregister master with the resource manager\n    void unregister_master( ::rml::server::execution_resource_t& rsc_handle ) const {\n        my_server->unregister_master( rsc_handle );\n    }\n#endif /* WIN */\n\n#if __TBB_TASK_GROUP_CONTEXT\n    //! Finds all contexts affected by the state change and propagates the new state to them.\n    template <typename T>\n    bool propagate_task_group_state ( T task_group_context::*mptr_state, task_group_context& src, T new_state );\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n#if __TBB_TASK_PRIORITY\n    //! Lowers arena's priority is not higher than newPriority \n    /** Returns true if arena priority was actually elevated. **/ \n    bool lower_arena_priority ( arena& a, intptr_t new_priority, uintptr_t old_reload_epoch );\n\n    //! Makes sure arena's priority is not lower than newPriority \n    /** Returns true if arena priority was elevated. Also updates arena's bottom\n        priority boundary if necessary.\n\n        This method is called whenever a user changes priority, because whether\n        it was hiked or sunk can be determined for sure only under the lock used\n        by this function. **/\n    bool update_arena_priority ( arena& a, intptr_t new_priority );\n#endif /* __TBB_TASK_PRIORITY */\n\n#if __TBB_COUNT_TASK_NODES\n    //! Returns the number of task objects \"living\" in worker threads\n    intptr_t workers_task_node_count();\n\n    //! Net number of nodes that have been allocated from heap.\n    /** Updated each time a scheduler or arena is destroyed. */\n    void update_task_node_count( intptr_t delta ) { my_task_node_count += delta; }\n#endif /* __TBB_COUNT_TASK_NODES */\n\n#if __TBB_TASK_GROUP_CONTEXT\n    //! Array of pointers to the registered workers\n    /** Used by cancellation propagation mechanism.\n        Must be the last data member of the class market. **/\n    generic_scheduler* my_workers[1];\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n}; // class market\n\n#if __TBB_TASK_PRIORITY\n    #define BeginForEachArena(a)    \\\n        arenas_list_mutex_type::scoped_lock arena_list_lock(my_arenas_list_mutex);  \\\n        for ( intptr_t i = my_global_top_priority; i >= my_global_bottom_priority; --i ) {  \\\n            /*arenas_list_mutex_type::scoped_lock arena_list_lock(my_priority_levels[i].my_arenas_list_mutex);*/ \\\n            arena_list_type &arenas = my_priority_levels[i].arenas;\n#else /* !__TBB_TASK_PRIORITY */\n    #define BeginForEachArena(a)    \\\n        arena_list_type &arenas = my_arenas; {\n#endif /* !__TBB_TASK_PRIORITY */\n\n#define ForEachArena(a)     \\\n    BeginForEachArena(a)    \\\n        arena_list_type::iterator it = arenas.begin();  \\\n        for ( ; it != arenas.end(); ++it ) {            \\\n            arena &a = *it;\n\n#define EndForEach() }}\n\n\n} // namespace internal\n} // namespace tbb\n\n#if defined(_MSC_VER) && defined(_Wp64)\n    // Workaround for overzealous compiler warnings in /Wp64 mode\n    #pragma warning (pop)\n#endif // warning 4244 is back\n\n#endif /* _TBB_market_H */\n"
  },
  {
    "path": "benchmarks/tbb/memory_pool.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_memory_pool_H\n#define __TBB_memory_pool_H\n\n#if !TBB_PREVIEW_MEMORY_POOL\n#error Set TBB_PREVIEW_MEMORY_POOL to include memory_pool.h\n#endif\n/** @file */\n\n#include \"scalable_allocator.h\"\n#include <new> // std::bad_alloc\n#if __TBB_ALLOCATOR_CONSTRUCT_VARIADIC\n#include <utility> // std::forward\n#endif\n\n#if __TBB_EXTRA_DEBUG\n#define __TBBMALLOC_ASSERT ASSERT\n#else\n#define __TBBMALLOC_ASSERT(a,b) ((void)0)\n#endif\n\nnamespace tbb {\nnamespace interface6 {\n//! @cond INTERNAL\nnamespace internal {\n\n//! Base of thread-safe pool allocator for variable-size requests\nclass pool_base : tbb::internal::no_copy {\n    // Pool interface is separate from standard allocator classes because it has\n    // to maintain internal state, no copy or assignment. Move and swap are possible.\npublic:\n    //! Reset pool to reuse its memory (free all objects at once)\n    void recycle() { rml::pool_reset(my_pool); }\n\n    //! The \"malloc\" analogue to allocate block of memory of size bytes\n    void *malloc(size_t size) { return rml::pool_malloc(my_pool, size); }\n\n    //! The \"free\" analogue to discard a previously allocated piece of memory.\n    void free(void* ptr) { rml::pool_free(my_pool, ptr); }\n\n    //! The \"realloc\" analogue complementing pool_malloc.\n    // Enables some low-level optimization possibilities\n    void *realloc(void* ptr, size_t size) {\n        return rml::pool_realloc(my_pool, ptr, size);\n    }\n\nprotected:\n    //! destroy pool - must be called in a child class\n    void destroy() { rml::pool_destroy(my_pool); }\n\n    rml::MemoryPool *my_pool;\n};\n\n} // namespace internal\n//! @endcond\n\n#if _MSC_VER && !defined(__INTEL_COMPILER)\n    // Workaround for erroneous \"unreferenced parameter\" warning in method destroy.\n    #pragma warning (push)\n    #pragma warning (disable: 4100)\n#endif\n\n//! Meets \"allocator\" requirements of ISO C++ Standard, Section 20.1.5\n/** @ingroup memory_allocation */\ntemplate<typename T, typename P = internal::pool_base>\nclass memory_pool_allocator {\nprotected:\n    typedef P pool_type;\n    pool_type *my_pool;\n    template<typename U, typename R>\n    friend class memory_pool_allocator;\n    template<typename V, typename U, typename R>\n    friend bool operator==( const memory_pool_allocator<V,R>& a, const memory_pool_allocator<U,R>& b);\n    template<typename V, typename U, typename R>\n    friend bool operator!=( const memory_pool_allocator<V,R>& a, const memory_pool_allocator<U,R>& b);\npublic:\n    typedef typename tbb::internal::allocator_type<T>::value_type value_type;\n    typedef value_type* pointer;\n    typedef const value_type* const_pointer;\n    typedef value_type& reference;\n    typedef const value_type& const_reference;\n    typedef size_t size_type;\n    typedef ptrdiff_t difference_type;\n    template<typename U> struct rebind {\n        typedef memory_pool_allocator<U, P> other;\n    };\n\n    memory_pool_allocator(pool_type &pool) throw() : my_pool(&pool) {}\n    memory_pool_allocator(const memory_pool_allocator& src) throw() : my_pool(src.my_pool) {}\n    template<typename U>\n    memory_pool_allocator(const memory_pool_allocator<U,P>& src) throw() : my_pool(src.my_pool) {}\n\n    pointer address(reference x) const { return &x; }\n    const_pointer address(const_reference x) const { return &x; }\n    \n    //! Allocate space for n objects.\n    pointer allocate( size_type n, const void* /*hint*/ = 0) {\n        return static_cast<pointer>( my_pool->malloc( n*sizeof(value_type) ) );\n    }\n    //! Free previously allocated block of memory.\n    void deallocate( pointer p, size_type ) {\n        my_pool->free(p);\n    }\n    //! Largest value for which method allocate might succeed.\n    size_type max_size() const throw() {\n        size_type max = static_cast<size_type>(-1) / sizeof (value_type);\n        return (max > 0 ? max : 1);\n    }\n    //! Copy-construct value at location pointed to by p.\n#if __TBB_ALLOCATOR_CONSTRUCT_VARIADIC\n    template<typename U, typename... Args>\n    void construct(U *p, Args&&... args)\n        { ::new((void *)p) U(std::forward<Args>(args)...); }\n#else // __TBB_ALLOCATOR_CONSTRUCT_VARIADIC\n#if __TBB_CPP11_RVALUE_REF_PRESENT\n    void construct( pointer p, value_type&& value ) {::new((void*)(p)) value_type(std::move(value));}\n#endif\n    void construct( pointer p, const value_type& value ) { ::new((void*)(p)) value_type(value); }\n#endif // __TBB_ALLOCATOR_CONSTRUCT_VARIADIC\n\n    //! Destroy value at location pointed to by p.\n    void destroy( pointer p ) { p->~value_type(); }\n\n};\n\n#if _MSC_VER && !defined(__INTEL_COMPILER)\n    #pragma warning (pop)\n#endif // warning 4100 is back\n\n//! Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1\n/** @ingroup memory_allocation */\ntemplate<typename P> \nclass memory_pool_allocator<void, P> {\npublic:\n    typedef P pool_type;\n    typedef void* pointer;\n    typedef const void* const_pointer;\n    typedef void value_type;\n    template<typename U> struct rebind {\n        typedef memory_pool_allocator<U, P> other;\n    };\n\n    memory_pool_allocator( pool_type &pool) throw() : my_pool(&pool) {}\n    memory_pool_allocator( const memory_pool_allocator& src) throw() : my_pool(src.my_pool) {}\n    template<typename U>\n    memory_pool_allocator(const memory_pool_allocator<U,P>& src) throw() : my_pool(src.my_pool) {}\n\nprotected:\n    pool_type *my_pool;\n    template<typename U, typename R>\n    friend class memory_pool_allocator;\n    template<typename V, typename U, typename R>\n    friend bool operator==( const memory_pool_allocator<V,R>& a, const memory_pool_allocator<U,R>& b);\n    template<typename V, typename U, typename R>\n    friend bool operator!=( const memory_pool_allocator<V,R>& a, const memory_pool_allocator<U,R>& b);\n};\n\ntemplate<typename T, typename U, typename P>\ninline bool operator==( const memory_pool_allocator<T,P>& a, const memory_pool_allocator<U,P>& b) {return a.my_pool==b.my_pool;}\n\ntemplate<typename T, typename U, typename P>\ninline bool operator!=( const memory_pool_allocator<T,P>& a, const memory_pool_allocator<U,P>& b) {return a.my_pool!=b.my_pool;}\n\n\n//! Thread-safe growable pool allocator for variable-size requests\ntemplate <typename Alloc>\nclass memory_pool : public internal::pool_base {\n    Alloc my_alloc; // TODO: base-class optimization\n    static void *allocate_request(intptr_t pool_id, size_t & bytes);\n    static int deallocate_request(intptr_t pool_id, void*, size_t raw_bytes);\n\npublic:\n    //! construct pool with underlying allocator\n    memory_pool(const Alloc &src = Alloc());\n\n    //! destroy pool\n    ~memory_pool() { destroy(); } // call the callbacks first and destroy my_alloc latter\n\n};\n\nclass fixed_pool : public internal::pool_base {\n    void *my_buffer;\n    size_t my_size;\n    inline static void *allocate_request(intptr_t pool_id, size_t & bytes);\n\npublic:\n    //! construct pool with underlying allocator\n    inline fixed_pool(void *buf, size_t size);\n    //! destroy pool\n    ~fixed_pool() { destroy(); }\n};\n\n//////////////// Implementation ///////////////\n\ntemplate <typename Alloc>\nmemory_pool<Alloc>::memory_pool(const Alloc &src) : my_alloc(src) {\n    rml::MemPoolPolicy args(allocate_request, deallocate_request,\n                            sizeof(typename Alloc::value_type));\n    rml::MemPoolError res = rml::pool_create_v1(intptr_t(this), &args, &my_pool);\n    if( res!=rml::POOL_OK ) __TBB_THROW(std::bad_alloc());\n}\ntemplate <typename Alloc>\nvoid *memory_pool<Alloc>::allocate_request(intptr_t pool_id, size_t & bytes) {\n    memory_pool<Alloc> &self = *reinterpret_cast<memory_pool<Alloc>*>(pool_id);\n    const size_t unit_size = sizeof(typename Alloc::value_type);\n    __TBBMALLOC_ASSERT( 0 == bytes%unit_size, NULL);\n    void *ptr;\n    __TBB_TRY { ptr = self.my_alloc.allocate( bytes/unit_size ); }\n    __TBB_CATCH(...) { return 0; }\n    return ptr;\n}\n#if __TBB_MSVC_UNREACHABLE_CODE_IGNORED\n    // Workaround for erroneous \"unreachable code\" warning in the template below.\n    // Specific for VC++ 17-18 compiler\n    #pragma warning (push)\n    #pragma warning (disable: 4702)\n#endif\ntemplate <typename Alloc>\nint memory_pool<Alloc>::deallocate_request(intptr_t pool_id, void* raw_ptr, size_t raw_bytes) {\n    memory_pool<Alloc> &self = *reinterpret_cast<memory_pool<Alloc>*>(pool_id);\n    const size_t unit_size = sizeof(typename Alloc::value_type);\n    __TBBMALLOC_ASSERT( 0 == raw_bytes%unit_size, NULL);\n    self.my_alloc.deallocate( static_cast<typename Alloc::value_type*>(raw_ptr), raw_bytes/unit_size );\n    return 0;\n}\n#if __TBB_MSVC_UNREACHABLE_CODE_IGNORED\n    #pragma warning (pop)\n#endif\ninline fixed_pool::fixed_pool(void *buf, size_t size) : my_buffer(buf), my_size(size) {\n    if( !buf || !size ) __TBB_THROW(std::bad_alloc());\n    rml::MemPoolPolicy args(allocate_request, 0, size, /*fixedPool=*/true);\n    rml::MemPoolError res = rml::pool_create_v1(intptr_t(this), &args, &my_pool);\n    if( res!=rml::POOL_OK ) __TBB_THROW(std::bad_alloc());\n}\ninline void *fixed_pool::allocate_request(intptr_t pool_id, size_t & bytes) {\n    fixed_pool &self = *reinterpret_cast<fixed_pool*>(pool_id);\n    __TBBMALLOC_ASSERT(0 != self.my_size, \"The buffer must not be used twice.\");\n    bytes = self.my_size;\n    self.my_size = 0; // remember that buffer has been used\n    return self.my_buffer;\n}\n\n} //namespace interface6\nusing interface6::memory_pool_allocator;\nusing interface6::memory_pool;\nusing interface6::fixed_pool;\n} //namespace tbb\n\n#undef __TBBMALLOC_ASSERT\n#endif// __TBB_memory_pool_H\n"
  },
  {
    "path": "benchmarks/tbb/mutex.cpp",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#if _WIN32||_WIN64\n#include <errno.h> // EDEADLK\n#endif\n#include \"tbb/mutex.h\"\n#include \"itt_notify.h\"\n\nnamespace tbb {\n    void mutex::scoped_lock::internal_acquire( mutex& m ) {\n\n#if _WIN32||_WIN64\n        switch( m.state ) {\n        case INITIALIZED: \n        case HELD:\n            EnterCriticalSection( &m.impl );\n            // If a thread comes here, and another thread holds the lock, it will block\n            // in EnterCriticalSection.  When it returns from EnterCriticalSection,\n            // m.state must be set to INITIALIZED.  If the same thread tries to acquire a lock it\n            // aleady holds, the lock is in HELD state, thus will cause throwing the exception.\n            if (m.state==HELD)\n                tbb::internal::handle_perror(EDEADLK,\"mutex::scoped_lock: deadlock caused by attempt to reacquire held mutex\");\n            m.state = HELD;\n            break;\n        case DESTROYED:\n            __TBB_ASSERT(false,\"mutex::scoped_lock: mutex already destroyed\");\n            break;\n        default:\n            __TBB_ASSERT(false,\"mutex::scoped_lock: illegal mutex state\");\n            break;\n        }\n#else\n        int error_code = pthread_mutex_lock(&m.impl);\n        if( error_code )\n            tbb::internal::handle_perror(error_code,\"mutex::scoped_lock: pthread_mutex_lock failed\");\n#endif /* _WIN32||_WIN64 */\n        my_mutex = &m;\n    }\n\nvoid mutex::scoped_lock::internal_release() {\n    __TBB_ASSERT( my_mutex, \"mutex::scoped_lock: not holding a mutex\" );\n#if _WIN32||_WIN64    \n     switch( my_mutex->state ) {\n        case INITIALIZED: \n            __TBB_ASSERT(false,\"mutex::scoped_lock: try to release the lock without acquisition\");\n            break;\n        case HELD:\n            my_mutex->state = INITIALIZED;\n            LeaveCriticalSection(&my_mutex->impl);\n            break;\n        case DESTROYED: \n            __TBB_ASSERT(false,\"mutex::scoped_lock: mutex already destroyed\"); \n            break;\n        default: \n            __TBB_ASSERT(false,\"mutex::scoped_lock: illegal mutex state\");\n            break;\n    }\n#else\n     int error_code = pthread_mutex_unlock(&my_mutex->impl);\n     __TBB_ASSERT_EX(!error_code, \"mutex::scoped_lock: pthread_mutex_unlock failed\");\n#endif /* _WIN32||_WIN64 */\n     my_mutex = NULL;\n}\n\nbool mutex::scoped_lock::internal_try_acquire( mutex& m ) {\n#if _WIN32||_WIN64\n    switch( m.state ) {\n        case INITIALIZED: \n        case HELD:\n            break;\n        case DESTROYED: \n            __TBB_ASSERT(false,\"mutex::scoped_lock: mutex already destroyed\"); \n            break;\n        default: \n            __TBB_ASSERT(false,\"mutex::scoped_lock: illegal mutex state\");\n            break;\n    }\n#endif /* _WIN32||_WIN64 */\n\n    bool result;\n#if _WIN32||_WIN64\n    result = TryEnterCriticalSection(&m.impl)!=0;\n    if( result ) {\n        __TBB_ASSERT(m.state!=HELD, \"mutex::scoped_lock: deadlock caused by attempt to reacquire held mutex\");\n        m.state = HELD;\n    }\n#else\n    result = pthread_mutex_trylock(&m.impl)==0;\n#endif /* _WIN32||_WIN64 */\n    if( result ) \n        my_mutex = &m;\n    return result;\n}\n\nvoid mutex::internal_construct() {\n#if _WIN32||_WIN64\n    InitializeCriticalSectionEx(&impl, 4000, 0);\n    state = INITIALIZED;  \n#else\n    int error_code = pthread_mutex_init(&impl,NULL);\n    if( error_code )\n        tbb::internal::handle_perror(error_code,\"mutex: pthread_mutex_init failed\");\n#endif /* _WIN32||_WIN64*/    \n    ITT_SYNC_CREATE(&impl, _T(\"tbb::mutex\"), _T(\"\"));\n}\n\nvoid mutex::internal_destroy() {\n#if _WIN32||_WIN64\n    switch( state ) {\n      case INITIALIZED:\n        DeleteCriticalSection(&impl);\n       break;\n      case DESTROYED: \n        __TBB_ASSERT(false,\"mutex: already destroyed\");\n        break;\n      default: \n        __TBB_ASSERT(false,\"mutex: illegal state for destruction\");\n        break;\n    }\n    state = DESTROYED;\n#else\n    int error_code = pthread_mutex_destroy(&impl); \n    __TBB_ASSERT_EX(!error_code,\"mutex: pthread_mutex_destroy failed\");\n#endif /* _WIN32||_WIN64 */\n}\n\n} // namespace tbb\n"
  },
  {
    "path": "benchmarks/tbb/mutex.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_mutex_H\n#define __TBB_mutex_H\n\n#if _WIN32||_WIN64\n#include \"machine/windows_api.h\"\n#else\n#include <pthread.h>\n#endif /* _WIN32||_WIN64 */\n\n#include <new>\n#include \"aligned_space.h\"\n#include \"tbb_stddef.h\"\n#include \"tbb_profiling.h\"\n\nnamespace tbb {\n\n//! Wrapper around the platform's native reader-writer lock.\n/** For testing purposes only.\n    @ingroup synchronization */\nclass mutex : internal::mutex_copy_deprecated_and_disabled {\npublic:\n    //! Construct unacquired mutex.\n    mutex() {\n#if TBB_USE_ASSERT || TBB_USE_THREADING_TOOLS\n    internal_construct();\n#else\n  #if _WIN32||_WIN64\n        InitializeCriticalSectionEx(&impl, 4000, 0);\n  #else\n        int error_code = pthread_mutex_init(&impl,NULL);\n        if( error_code )\n            tbb::internal::handle_perror(error_code,\"mutex: pthread_mutex_init failed\");\n  #endif /* _WIN32||_WIN64*/\n#endif /* TBB_USE_ASSERT */\n    };\n\n    ~mutex() {\n#if TBB_USE_ASSERT\n        internal_destroy();\n#else\n  #if _WIN32||_WIN64\n        DeleteCriticalSection(&impl);\n  #else\n        pthread_mutex_destroy(&impl); \n\n  #endif /* _WIN32||_WIN64 */\n#endif /* TBB_USE_ASSERT */\n    };\n\n    class scoped_lock;\n    friend class scoped_lock;\n\n    //! The scoped locking pattern\n    /** It helps to avoid the common problem of forgetting to release lock.\n        It also nicely provides the \"node\" for queuing locks. */\n    class scoped_lock : internal::no_copy {\n    public:\n        //! Construct lock that has not acquired a mutex. \n        scoped_lock() : my_mutex(NULL) {};\n\n        //! Acquire lock on given mutex.\n        scoped_lock( mutex& mutex ) {\n            acquire( mutex );\n        }\n\n        //! Release lock (if lock is held).\n        ~scoped_lock() {\n            if( my_mutex ) \n                release();\n        }\n\n        //! Acquire lock on given mutex.\n        void acquire( mutex& mutex ) {\n#if TBB_USE_ASSERT\n            internal_acquire(mutex);\n#else\n            mutex.lock();\n            my_mutex = &mutex;\n#endif /* TBB_USE_ASSERT */\n        }\n\n        //! Try acquire lock on given mutex.\n        bool try_acquire( mutex& mutex ) {\n#if TBB_USE_ASSERT\n            return internal_try_acquire (mutex);\n#else\n            bool result = mutex.try_lock();\n            if( result )\n                my_mutex = &mutex;\n            return result;\n#endif /* TBB_USE_ASSERT */\n        }\n\n        //! Release lock\n        void release() {\n#if TBB_USE_ASSERT\n            internal_release ();\n#else\n            my_mutex->unlock();\n            my_mutex = NULL;\n#endif /* TBB_USE_ASSERT */\n        }\n\n    private:\n        //! The pointer to the current mutex to work\n        mutex* my_mutex;\n\n        //! All checks from acquire using mutex.state were moved here\n        void __TBB_EXPORTED_METHOD internal_acquire( mutex& m );\n\n        //! All checks from try_acquire using mutex.state were moved here\n        bool __TBB_EXPORTED_METHOD internal_try_acquire( mutex& m );\n\n        //! All checks from release using mutex.state were moved here\n        void __TBB_EXPORTED_METHOD internal_release();\n\n        friend class mutex;\n    };\n\n    // Mutex traits\n    static const bool is_rw_mutex = false;\n    static const bool is_recursive_mutex = false;\n    static const bool is_fair_mutex = false;\n\n    // ISO C++0x compatibility methods\n\n    //! Acquire lock\n    void lock() {\n#if TBB_USE_ASSERT\n        aligned_space<scoped_lock> tmp;\n        new(tmp.begin()) scoped_lock(*this);\n#else\n  #if _WIN32||_WIN64\n        EnterCriticalSection(&impl);\n  #else\n        int error_code = pthread_mutex_lock(&impl);\n        if( error_code )\n            tbb::internal::handle_perror(error_code,\"mutex: pthread_mutex_lock failed\");\n  #endif /* _WIN32||_WIN64 */\n#endif /* TBB_USE_ASSERT */\n    }\n\n    //! Try acquiring lock (non-blocking)\n    /** Return true if lock acquired; false otherwise. */\n    bool try_lock() {\n#if TBB_USE_ASSERT\n        aligned_space<scoped_lock> tmp;\n        scoped_lock& s = *tmp.begin();\n        s.my_mutex = NULL;\n        return s.internal_try_acquire(*this);\n#else\n  #if _WIN32||_WIN64\n        return TryEnterCriticalSection(&impl)!=0;\n  #else\n        return pthread_mutex_trylock(&impl)==0;\n  #endif /* _WIN32||_WIN64 */\n#endif /* TBB_USE_ASSERT */\n    }\n\n    //! Release lock\n    void unlock() {\n#if TBB_USE_ASSERT\n        aligned_space<scoped_lock> tmp;\n        scoped_lock& s = *tmp.begin();\n        s.my_mutex = this;\n        s.internal_release();\n#else\n  #if _WIN32||_WIN64\n        LeaveCriticalSection(&impl);\n  #else\n        pthread_mutex_unlock(&impl);\n  #endif /* _WIN32||_WIN64 */\n#endif /* TBB_USE_ASSERT */\n    }\n\n    //! Return native_handle\n  #if _WIN32||_WIN64\n    typedef LPCRITICAL_SECTION native_handle_type;\n  #else\n    typedef pthread_mutex_t* native_handle_type;\n  #endif\n    native_handle_type native_handle() { return (native_handle_type) &impl; }\n\n    enum state_t {\n        INITIALIZED=0x1234,\n        DESTROYED=0x789A,\n        HELD=0x56CD\n    };\nprivate:\n#if _WIN32||_WIN64\n    CRITICAL_SECTION impl;    \n    enum state_t state;\n#else\n    pthread_mutex_t impl;\n#endif /* _WIN32||_WIN64 */\n\n    //! All checks from mutex constructor using mutex.state were moved here\n    void __TBB_EXPORTED_METHOD internal_construct();\n\n    //! All checks from mutex destructor using mutex.state were moved here\n    void __TBB_EXPORTED_METHOD internal_destroy();\n\n#if _WIN32||_WIN64\npublic:\n    //!  Set the internal state\n    void set_state( state_t to ) { state = to; }\n#endif\n};\n\n__TBB_DEFINE_PROFILING_SET_NAME(mutex)\n\n} // namespace tbb \n\n#endif /* __TBB_mutex_H */\n"
  },
  {
    "path": "benchmarks/tbb/null_mutex.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_null_mutex_H\n#define __TBB_null_mutex_H\n\n#include \"tbb_stddef.h\"\n\nnamespace tbb {\n    \n//! A mutex which does nothing\n/** A null_mutex does no operation and simulates success.\n    @ingroup synchronization */\nclass null_mutex : internal::mutex_copy_deprecated_and_disabled {\npublic:   \n    //! Represents acquisition of a mutex.\n    class scoped_lock : internal::no_copy {   \n    public:   \n        scoped_lock() {}\n        scoped_lock( null_mutex& ) {}   \n        ~scoped_lock() {}\n        void acquire( null_mutex& ) {}\n        bool try_acquire( null_mutex& ) { return true; }\n        void release() {}\n    };\n  \n    null_mutex() {}\n    \n    // Mutex traits   \n    static const bool is_rw_mutex = false;   \n    static const bool is_recursive_mutex = true;\n    static const bool is_fair_mutex = true;\n};  \n\n}\n\n#endif /* __TBB_null_mutex_H */\n"
  },
  {
    "path": "benchmarks/tbb/null_rw_mutex.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_null_rw_mutex_H\n#define __TBB_null_rw_mutex_H\n\n#include \"tbb_stddef.h\"\n\nnamespace tbb {\n    \n//! A rw mutex which does nothing\n/** A null_rw_mutex is a rw mutex that does nothing and simulates successful operation.\n    @ingroup synchronization */\nclass null_rw_mutex : internal::mutex_copy_deprecated_and_disabled {\npublic:   \n    //! Represents acquisition of a mutex.\n    class scoped_lock : internal::no_copy {   \n    public:   \n        scoped_lock() {}\n        scoped_lock( null_rw_mutex& , bool = true ) {}\n        ~scoped_lock() {}\n        void acquire( null_rw_mutex& , bool = true ) {}\n        bool upgrade_to_writer() { return true; }\n        bool downgrade_to_reader() { return true; }\n        bool try_acquire( null_rw_mutex& , bool = true ) { return true; }\n        void release() {}\n    };\n  \n    null_rw_mutex() {}\n    \n    // Mutex traits   \n    static const bool is_rw_mutex = true;   \n    static const bool is_recursive_mutex = true;\n    static const bool is_fair_mutex = true;\n};  \n\n}\n\n#endif /* __TBB_null_rw_mutex_H */\n"
  },
  {
    "path": "benchmarks/tbb/observer_proxy.cpp",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#include \"tbb/tbb_config.h\"\n#if !__TBB_ARENA_OBSERVER\n    #error __TBB_ARENA_OBSERVER must be defined\n#endif\n\n#if __TBB_SCHEDULER_OBSERVER\n\n#include \"observer_proxy.h\"\n#include \"tbb_main.h\"\n#include \"governor.h\"\n#include \"scheduler.h\"\n#include \"arena.h\"\n\nnamespace tbb {\nnamespace internal {\n\npadded<observer_list> the_global_observer_list;\n\n#if TBB_USE_ASSERT\nstatic atomic<int> observer_proxy_count;\n\nstruct check_observer_proxy_count {\n    ~check_observer_proxy_count() {\n        if( observer_proxy_count!=0 ) {\n            runtime_warning( \"Leaked %ld observer_proxy objects\\n\", long(observer_proxy_count) );\n        }\n    }\n};\n\nstatic check_observer_proxy_count the_check_observer_proxy_count;\n#endif /* TBB_USE_ASSERT */\n\ninterface6::task_scheduler_observer* observer_proxy::get_v6_observer() {\n    if(my_version != 6) return NULL;\n    return static_cast<interface6::task_scheduler_observer*>(my_observer);\n}\n\nbool observer_proxy::is_global() {\n    return !get_v6_observer() || get_v6_observer()->my_context_tag == interface6::task_scheduler_observer::global_tag;\n}\n\nobserver_proxy::observer_proxy( task_scheduler_observer_v3& tso )\n    : my_list(NULL), my_next(NULL), my_prev(NULL), my_observer(&tso)\n{\n#if TBB_USE_ASSERT\n    ++observer_proxy_count;\n#endif /* TBB_USE_ASSERT */\n    // 1 for observer\n    my_ref_count = 1;\n    my_version = load<relaxed>(my_observer->my_busy_count)\n                 == interface6::task_scheduler_observer::v6_trait ? 6 : 0;\n    __TBB_ASSERT( my_version >= 6 || !load<relaxed>(my_observer->my_busy_count), NULL );\n}\n\n#if TBB_USE_ASSERT\nobserver_proxy::~observer_proxy () {\n    __TBB_ASSERT( !my_ref_count, \"Attempt to destroy proxy still in use\" );\n    poison_value(my_ref_count);\n    poison_pointer(my_prev);\n    poison_pointer(my_next);\n    --observer_proxy_count;\n}\n#endif /* TBB_USE_ASSERT */\n\ntemplate<memory_semantics M, class T, class V>\nT atomic_fetch_and_store ( T* addr, const V& val ) {\n    return (T)atomic_traits<sizeof(T), M>::fetch_and_store( addr, (T)val );\n}\n\nvoid observer_list::clear () {\n    __TBB_ASSERT( this != &the_global_observer_list, \"Method clear() cannot be used on the list of global observers\" );\n    // Though the method will work fine for the empty list, we require the caller\n    // to check for the list emptiness before invoking it to avoid extra overhead.\n    __TBB_ASSERT( !empty(), NULL );\n    {\n        scoped_lock lock(mutex(), /*is_writer=*/true);\n        observer_proxy *next = my_head;\n        while ( observer_proxy *p = next ) {\n            __TBB_ASSERT( p->my_version >= 6, NULL );\n            next = p->my_next;\n            // Both proxy p and observer p->my_observer (if non-null) are guaranteed\n            // to be alive while the list is locked.\n            task_scheduler_observer_v3 *obs = p->my_observer;\n            // Make sure that possible concurrent observer destruction does not\n            // conflict with the proxy list cleanup.\n            if ( !obs || !(p = (observer_proxy*)__TBB_FetchAndStoreW(&obs->my_proxy, 0)) )\n                continue;\n            // accessing 'obs' after detaching of obs->my_proxy leads to the race with observer destruction\n            __TBB_ASSERT( !next || p == next->my_prev, NULL );\n            __TBB_ASSERT( is_alive(p->my_ref_count), \"Observer's proxy died prematurely\" );\n            __TBB_ASSERT( p->my_ref_count == 1, \"Reference for observer is missing\" );\n#if TBB_USE_ASSERT\n            p->my_observer = NULL;\n            p->my_ref_count = 0;\n#endif /* TBB_USE_ASSERT */\n            remove(p);\n            delete p;\n        }\n    }\n    while( my_head )\n        __TBB_Yield();\n}\n\nvoid observer_list::insert ( observer_proxy* p ) {\n    scoped_lock lock(mutex(), /*is_writer=*/true);\n    if ( my_head ) {\n        p->my_prev = my_tail;\n        my_tail->my_next = p;\n    }\n    else\n        my_head = p;\n    my_tail = p;\n}\n\nvoid observer_list::remove ( observer_proxy* p ) {\n    __TBB_ASSERT( my_head, \"Attempt to remove an item from an empty list\" );\n    __TBB_ASSERT( !my_tail->my_next, \"Last item's my_next must be NULL\" );\n    if( p == my_tail ) {\n        __TBB_ASSERT( !p->my_next, NULL );\n        my_tail = p->my_prev;\n    }\n    else {\n        __TBB_ASSERT( p->my_next, NULL );\n        p->my_next->my_prev = p->my_prev;\n    }\n    if ( p == my_head ) {\n        __TBB_ASSERT( !p->my_prev, NULL );\n        my_head = p->my_next;\n    }\n    else {\n        __TBB_ASSERT( p->my_prev, NULL );\n        p->my_prev->my_next = p->my_next;\n    }\n    __TBB_ASSERT( (my_head && my_tail) || (!my_head && !my_tail), NULL );\n}\n\nvoid observer_list::remove_ref( observer_proxy* p ) {\n    int r = p->my_ref_count;\n    __TBB_ASSERT( is_alive(r), NULL );\n    while(r>1) {\n        __TBB_ASSERT( r!=0, NULL );\n        int r_old = p->my_ref_count.compare_and_swap(r-1,r);\n        if( r_old==r ) {\n            // Successfully decremented count.\n            return;\n        }\n        r = r_old;\n    }\n    __TBB_ASSERT( r==1, NULL );\n    // Reference count might go to zero\n    {\n        // Use lock to avoid resurrection by a thread concurrently walking the list\n        observer_list::scoped_lock lock(mutex(), /*is_writer=*/true);\n        r = --p->my_ref_count;\n        if( !r )\n            remove(p);\n    }\n    __TBB_ASSERT( r || !p->my_ref_count, NULL );\n    if( !r )\n        delete p;\n}\n\nvoid observer_list::do_notify_entry_observers( observer_proxy*& last, bool worker ) {\n    // Pointer p marches though the list from last (exclusively) to the end.\n    observer_proxy *p = last, *prev = p;\n    for(;;) {\n        task_scheduler_observer_v3* tso=NULL;\n        // Hold lock on list only long enough to advance to the next proxy in the list.\n        {\n            scoped_lock lock(mutex(), /*is_writer=*/false);\n            do {\n                if( p ) {\n                    // We were already processing the list.\n                    if( observer_proxy* q = p->my_next ) {\n                        if( p == prev )\n                            remove_ref_fast(prev); // sets prev to NULL if successful\n                        p = q;\n                    }\n                    else {\n                        // Reached the end of the list.\n                        if( p == prev ) {\n                            // Keep the reference as we store the 'last' pointer in scheduler\n                            __TBB_ASSERT(p->my_ref_count >= 1 + (p->my_observer?1:0), NULL);\n                        } else {\n                            // The last few proxies were empty\n                            __TBB_ASSERT(p->my_ref_count, NULL);\n                            ++p->my_ref_count;\n                            if( prev ) {\n                                lock.release();\n                                remove_ref(prev);\n                            }\n                        }\n                        last = p;\n                        return;\n                    }\n                } else {\n                    // Starting pass through the list\n                    p = my_head;\n                    if( !p )\n                        return;\n                }\n                tso = p->my_observer;\n            } while( !tso );\n            ++p->my_ref_count;\n            ++tso->my_busy_count;\n        }\n        __TBB_ASSERT( !prev || p!=prev, NULL );\n        // Release the proxy pinned before p\n        if( prev )\n            remove_ref(prev);\n        // Do not hold any locks on the list while calling user's code.\n        // Do not intercept any exceptions that may escape the callback so that\n        // they are either handled by the TBB scheduler or passed to the debugger.\n        tso->on_scheduler_entry(worker);\n        __TBB_ASSERT(p->my_ref_count, NULL);\n        intptr_t bc = --tso->my_busy_count;\n        __TBB_ASSERT_EX( bc>=0, \"my_busy_count underflowed\" );\n        prev = p;\n    }\n}\n\nvoid observer_list::do_notify_exit_observers( observer_proxy* last, bool worker ) {\n    // Pointer p marches though the list from the beginning to last (inclusively).\n    observer_proxy *p = NULL, *prev = NULL;\n    for(;;) {\n        task_scheduler_observer_v3* tso=NULL;\n        // Hold lock on list only long enough to advance to the next proxy in the list.\n        {\n            scoped_lock lock(mutex(), /*is_writer=*/false);\n            do {\n                if( p ) {\n                    // We were already processing the list.\n                    if( p != last ) {\n                        __TBB_ASSERT( p->my_next, \"List items before 'last' must have valid my_next pointer\" );\n                        if( p == prev )\n                            remove_ref_fast(prev); // sets prev to NULL if successful\n                        p = p->my_next;\n                    } else {\n                        // remove the reference from the last item\n                        remove_ref_fast(p);\n                        if( p ) {\n                            lock.release();\n                            remove_ref(p);\n                        }\n                        return;\n                    }\n                } else {\n                    // Starting pass through the list\n                    p = my_head;\n                    __TBB_ASSERT( p, \"Nonzero 'last' must guarantee that the global list is non-empty\" );\n                }\n                tso = p->my_observer;\n            } while( !tso );\n            // The item is already refcounted\n            if ( p != last ) // the last is already referenced since entry notification\n                ++p->my_ref_count;\n            ++tso->my_busy_count;\n        }\n        __TBB_ASSERT( !prev || p!=prev, NULL );\n        if( prev )\n            remove_ref(prev);\n        // Do not hold any locks on the list while calling user's code.\n        // Do not intercept any exceptions that may escape the callback so that\n        // they are either handled by the TBB scheduler or passed to the debugger.\n        tso->on_scheduler_exit(worker);\n        __TBB_ASSERT(p->my_ref_count || p == last, NULL);\n        intptr_t bc = --tso->my_busy_count;\n        __TBB_ASSERT_EX( bc>=0, \"my_busy_count underflowed\" );\n        prev = p;\n    }\n}\n\n#if __TBB_SLEEP_PERMISSION\nbool observer_list::ask_permission_to_leave() {\n    __TBB_ASSERT( this == &the_global_observer_list, \"This method cannot be used on lists of arena observers\" );\n    if( !my_head ) return true;\n    // Pointer p marches though the list\n    observer_proxy *p = NULL, *prev = NULL;\n    bool result = true;\n    while( result ) {\n        task_scheduler_observer* tso = NULL;\n        // Hold lock on list only long enough to advance to the next proxy in the list.\n        {\n            scoped_lock lock(mutex(), /*is_writer=*/false);\n            do {\n                if( p ) {\n                    // We were already processing the list.\n                    observer_proxy* q = p->my_next;\n                    // read next, remove the previous reference\n                    if( p == prev )\n                        remove_ref_fast(prev); // sets prev to NULL if successful\n                    if( q ) p = q;\n                    else {\n                        // Reached the end of the list.\n                        if( prev ) {\n                            lock.release();\n                            remove_ref(prev);\n                        }\n                        return result;\n                    }\n                } else {\n                    // Starting pass through the list\n                    p = my_head;\n                    if( !p )\n                        return result;\n                }\n                tso = p->get_v6_observer();\n            } while( !tso );\n            ++p->my_ref_count;\n            ++tso->my_busy_count;\n        }\n        __TBB_ASSERT( !prev || p!=prev, NULL );\n        // Release the proxy pinned before p\n        if( prev )\n            remove_ref(prev);\n        // Do not hold any locks on the list while calling user's code.\n        // Do not intercept any exceptions that may escape the callback so that\n        // they are either handled by the TBB scheduler or passed to the debugger.\n        result = tso->may_sleep();\n        __TBB_ASSERT(p->my_ref_count, NULL);\n        intptr_t bc = --tso->my_busy_count;\n        __TBB_ASSERT_EX( bc>=0, \"my_busy_count underflowed\" );\n        prev = p;\n    }\n    if( prev )\n        remove_ref(prev);\n    return result;\n}\n#endif//__TBB_SLEEP_PERMISSION\n\nvoid task_scheduler_observer_v3::observe( bool enable ) {\n    if( enable ) {\n        if( !my_proxy ) {\n            my_proxy = new observer_proxy( *this );\n            my_busy_count = 0; // proxy stores versioning information, clear it\n            if ( !my_proxy->is_global() ) {\n                // Local observer activation\n                generic_scheduler* s = governor::local_scheduler_if_initialized();\n#if __TBB_TASK_ARENA\n                __TBB_ASSERT( my_proxy->get_v6_observer(), NULL );\n                intptr_t tag = my_proxy->get_v6_observer()->my_context_tag;\n                if( tag != interface6::task_scheduler_observer::implicit_tag ) { // explicit arena\n                    task_arena *a = reinterpret_cast<task_arena*>(tag);\n                    a->initialize();\n                    my_proxy->my_list = &a->my_arena->my_observers;\n                } else\n#endif\n                {\n                    if( !s ) s = governor::init_scheduler( (unsigned)task_scheduler_init::automatic, 0, true );\n                    __TBB_ASSERT( __TBB_InitOnce::initialization_done(), NULL );\n                    __TBB_ASSERT( s && s->my_arena, NULL );\n                    my_proxy->my_list = &s->my_arena->my_observers;\n                }\n                my_proxy->my_list->insert(my_proxy);\n                // Notify newly activated observer and other pending ones if it belongs to current arena\n                if(s && &s->my_arena->my_observers == my_proxy->my_list )\n                    my_proxy->my_list->notify_entry_observers( s->my_last_local_observer, s->is_worker() );\n            } else {\n                // Obsolete. Global observer activation\n                if( !__TBB_InitOnce::initialization_done() )\n                    DoOneTimeInitializations();\n                my_proxy->my_list = &the_global_observer_list;\n                my_proxy->my_list->insert(my_proxy);\n                if( generic_scheduler* s = governor::local_scheduler_if_initialized() ) {\n                    // Notify newly created observer of its own thread.\n                    // Any other pending observers are notified too.\n                    the_global_observer_list.notify_entry_observers( s->my_last_global_observer, s->is_worker() );\n                }\n            }\n        }\n    } else {\n        // Make sure that possible concurrent proxy list cleanup does not conflict\n        // with the observer destruction here.\n        if ( observer_proxy* proxy = (observer_proxy*)__TBB_FetchAndStoreW(&my_proxy, 0) ) {\n            // List destruction should not touch this proxy after we've won the above interlocked exchange.\n            __TBB_ASSERT( proxy->my_observer == this, NULL );\n            __TBB_ASSERT( is_alive(proxy->my_ref_count), \"Observer's proxy died prematurely\" );\n            __TBB_ASSERT( proxy->my_ref_count >= 1, \"reference for observer missing\" );\n            observer_list &list = *proxy->my_list;\n            {\n                // Ensure that none of the list walkers relies on observer pointer validity\n                observer_list::scoped_lock lock(list.mutex(), /*is_writer=*/true);\n                proxy->my_observer = NULL;\n                // Proxy may still be held by other threads (to track the last notified observer)\n                if( !--proxy->my_ref_count ) {// nobody can increase it under exclusive lock\n                    list.remove(proxy);\n                    __TBB_ASSERT( !proxy->my_ref_count, NULL );\n                    delete proxy;\n                }\n            }\n            while( my_busy_count ) // other threads are still accessing the callback\n                __TBB_Yield();\n        }\n    }\n}\n\n} // namespace internal\n} // namespace tbb\n\n#endif /* __TBB_SCHEDULER_OBSERVER */\n"
  },
  {
    "path": "benchmarks/tbb/observer_proxy.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef _TBB_observer_proxy_H\n#define _TBB_observer_proxy_H\n\n#if __TBB_SCHEDULER_OBSERVER\n\n#include \"scheduler_common.h\" // to include task.h\n#include \"tbb/task_scheduler_observer.h\"\n#include \"tbb/spin_rw_mutex.h\"\n#include \"tbb/aligned_space.h\"\n\nnamespace tbb {\nnamespace internal {\n\nclass observer_list {\n    friend class arena;\n\n    // Mutex is wrapped with aligned_space to shut up warnings when its destructor\n    // is called while threads are still using it.\n    typedef aligned_space<spin_rw_mutex>  my_mutex_type;\n\n    //! Pointer to the head of this list.\n    observer_proxy* my_head;\n\n    //! Pointer to the tail of this list.\n    observer_proxy* my_tail;\n\n    //! Mutex protecting this list.\n    my_mutex_type my_mutex;\n\n    //! Back-pointer to the arena this list belongs to.\n    arena* my_arena;\n\n    //! Decrement refcount of the proxy p if there are other outstanding references.\n    /** In case of success sets p to NULL. Must be invoked from under the list lock. **/\n    inline static void remove_ref_fast( observer_proxy*& p );\n\n    //! Implements notify_entry_observers functionality.\n    void do_notify_entry_observers( observer_proxy*& last, bool worker );\n\n    //! Implements notify_exit_observers functionality.\n    void do_notify_exit_observers( observer_proxy* last, bool worker );\n\npublic:\n    observer_list () : my_head(NULL), my_tail(NULL) {}\n\n    //! Removes and destroys all observer proxies from the list.\n    /** Cannot be used concurrently with other methods. **/\n    void clear ();\n\n    //! Add observer proxy to the tail of the list.\n    void insert ( observer_proxy* p );\n\n    //! Remove observer proxy from the list.\n    void remove ( observer_proxy* p );\n\n    //! Decrement refcount of the proxy and destroy it if necessary.\n    /** When refcount reaches zero removes the proxy from the list and destructs it. **/\n    void remove_ref( observer_proxy* p );\n\n    //! Type of the scoped lock for the reader-writer mutex associated with the list.\n    typedef spin_rw_mutex::scoped_lock scoped_lock;\n\n    //! Accessor to the reader-writer mutex associated with the list.\n    spin_rw_mutex& mutex () { return my_mutex.begin()[0]; }\n\n    bool empty () const { return my_head == NULL; }\n\n    //! Call entry notifications on observers added after last was notified.\n    /** Updates last to become the last notified observer proxy (in the global list)\n        or leaves it to be NULL. The proxy has its refcount incremented. **/\n    inline void notify_entry_observers( observer_proxy*& last, bool worker );\n\n    //! Call exit notifications on last and observers added before it.\n    inline void notify_exit_observers( observer_proxy*& last, bool worker );\n\n    //! Call may_sleep callbacks to ask for permission for a worker thread to leave market\n    bool ask_permission_to_leave();\n}; // class observer_list\n\n//! Wrapper for an observer object\n/** To maintain shared lists of observers the scheduler first wraps each observer\n    object into a proxy so that a list item remained valid even after the corresponding\n    proxy object is destroyed by the user code. **/\nclass observer_proxy {\n    friend class task_scheduler_observer_v3;\n    friend class observer_list;\n    //! Reference count used for garbage collection.\n    /** 1 for reference from my task_scheduler_observer.\n        1 for each task dispatcher's last observer pointer. \n        No accounting for neighbors in the shared list. */\n    atomic<int> my_ref_count;\n    //! Reference to the list this observer belongs to.\n    observer_list* my_list;\n    //! Pointer to next observer in the list specified by my_head.\n    /** NULL for the last item in the list. **/\n    observer_proxy* my_next;\n    //! Pointer to the previous observer in the list specified by my_head.\n    /** For the head of the list points to the last item. **/\n    observer_proxy* my_prev;\n    //! Associated observer\n    task_scheduler_observer_v3* my_observer;\n    //! Version\n    char my_version;\n\n    interface6::task_scheduler_observer* get_v6_observer();\n    bool is_global(); //TODO: move them back inline when un-CPF'ing\n\n    //! Constructs proxy for the given observer and adds it to the specified list.\n    observer_proxy( task_scheduler_observer_v3& );\n\n#if TBB_USE_ASSERT\n    ~observer_proxy();\n#endif /* TBB_USE_ASSERT */\n\n    //! Shut up the warning\n    observer_proxy& operator = ( const observer_proxy& );\n}; // class observer_proxy\n\ninline void observer_list::remove_ref_fast( observer_proxy*& p ) {\n    if( p->my_observer ) {\n        // Can decrement refcount quickly, as it cannot drop to zero while under the lock.\n        int r = --p->my_ref_count;\n        __TBB_ASSERT_EX( r, NULL );\n        p = NULL;\n    } else {\n        // Use slow form of refcount decrementing, after the lock is released.\n    }\n}\n\ninline void observer_list::notify_entry_observers( observer_proxy*& last, bool worker ) {\n    if ( last == my_tail )\n        return;\n    do_notify_entry_observers( last, worker );\n}\n\ninline void observer_list::notify_exit_observers( observer_proxy*& last, bool worker ) {\n    if ( !last )\n        return;\n    __TBB_ASSERT(is_alive((uintptr_t)last), NULL);\n    do_notify_exit_observers( last, worker );\n    __TBB_ASSERT(last, NULL);\n    poison_value(last);\n}\n\nextern padded<observer_list> the_global_observer_list;\n\n} // namespace internal\n} // namespace tbb\n\n#endif /* __TBB_SCHEDULER_OBSERVER */\n\n#endif /* _TBB_observer_proxy_H */\n"
  },
  {
    "path": "benchmarks/tbb/parallel_do.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_parallel_do_H\n#define __TBB_parallel_do_H\n\n#include \"internal/_range_iterator.h\"\n#include \"task.h\"\n#include \"aligned_space.h\"\n#include <iterator>\n\nnamespace tbb {\n\n//! @cond INTERNAL\nnamespace internal {\n    template<typename Body, typename Item> class parallel_do_feeder_impl;\n    template<typename Body> class do_group_task;\n\n    //! Strips its template type argument from 'cv' and '&' qualifiers\n    template<typename T>\n    struct strip { typedef T type; };\n    template<typename T>\n    struct strip<T&> { typedef T type; };\n    template<typename T>\n    struct strip<const T&> { typedef T type; };\n    template<typename T>\n    struct strip<volatile T&> { typedef T type; };\n    template<typename T>\n    struct strip<const volatile T&> { typedef T type; };\n    // Most of the compilers remove cv-qualifiers from non-reference function argument types. \n    // But unfortunately there are those that don't.\n    template<typename T>\n    struct strip<const T> { typedef T type; };\n    template<typename T>\n    struct strip<volatile T> { typedef T type; };\n    template<typename T>\n    struct strip<const volatile T> { typedef T type; };\n} // namespace internal\n//! @endcond\n\n//! Class the user supplied algorithm body uses to add new tasks\n/** \\param Item Work item type **/\ntemplate<typename Item>\nclass parallel_do_feeder: internal::no_copy\n{\n    parallel_do_feeder() {}\n    virtual ~parallel_do_feeder () {}\n    virtual void internal_add( const Item& item ) = 0;\n    template<typename Body_, typename Item_> friend class internal::parallel_do_feeder_impl;\npublic:\n    //! Add a work item to a running parallel_do.\n    void add( const Item& item ) {internal_add(item);}\n};\n\n//! @cond INTERNAL\nnamespace internal {\n    //! For internal use only.\n    /** Selects one of the two possible forms of function call member operator.\n        @ingroup algorithms **/\n    template<class Body, typename Item>\n    class parallel_do_operator_selector\n    {\n        typedef parallel_do_feeder<Item> Feeder;\n        template<typename A1, typename A2, typename CvItem >\n        static void internal_call( const Body& obj, A1& arg1, A2&, void (Body::*)(CvItem) const ) {\n            obj(arg1);\n        }\n        template<typename A1, typename A2, typename CvItem >\n        static void internal_call( const Body& obj, A1& arg1, A2& arg2, void (Body::*)(CvItem, parallel_do_feeder<Item>&) const ) {\n            obj(arg1, arg2);\n        }\n\n    public:\n        template<typename A1, typename A2 >\n        static void call( const Body& obj, A1& arg1, A2& arg2 )\n        {\n            internal_call( obj, arg1, arg2, &Body::operator() );\n        }\n    };\n\n    //! For internal use only.\n    /** Executes one iteration of a do.\n        @ingroup algorithms */\n    template<typename Body, typename Item>\n    class do_iteration_task: public task\n    {\n        typedef parallel_do_feeder_impl<Body, Item> feeder_type;\n\n        Item my_value;\n        feeder_type& my_feeder;\n\n        do_iteration_task( const Item& value, feeder_type& feeder ) : \n            my_value(value), my_feeder(feeder)\n        {}\n\n        /*override*/ \n        task* execute()\n        {\n            parallel_do_operator_selector<Body, Item>::call(*my_feeder.my_body, my_value, my_feeder);\n            return NULL;\n        }\n\n        template<typename Body_, typename Item_> friend class parallel_do_feeder_impl;\n    }; // class do_iteration_task\n\n    template<typename Iterator, typename Body, typename Item>\n    class do_iteration_task_iter: public task\n    {\n        typedef parallel_do_feeder_impl<Body, Item> feeder_type;\n\n        Iterator my_iter;\n        feeder_type& my_feeder;\n\n        do_iteration_task_iter( const Iterator& iter, feeder_type& feeder ) : \n            my_iter(iter), my_feeder(feeder)\n        {}\n\n        /*override*/ \n        task* execute()\n        {\n            parallel_do_operator_selector<Body, Item>::call(*my_feeder.my_body, *my_iter, my_feeder);\n            return NULL;\n        }\n\n        template<typename Iterator_, typename Body_, typename Item_> friend class do_group_task_forward;    \n        template<typename Body_, typename Item_> friend class do_group_task_input;    \n        template<typename Iterator_, typename Body_, typename Item_> friend class do_task_iter;    \n    }; // class do_iteration_task_iter\n\n    //! For internal use only.\n    /** Implements new task adding procedure.\n        @ingroup algorithms **/\n    template<class Body, typename Item>\n    class parallel_do_feeder_impl : public parallel_do_feeder<Item>\n    {\n        /*override*/ \n        void internal_add( const Item& item )\n        {\n            typedef do_iteration_task<Body, Item> iteration_type;\n\n            iteration_type& t = *new (task::allocate_additional_child_of(*my_barrier)) iteration_type(item, *this);\n\n            t.spawn( t );\n        }\n    public:\n        const Body* my_body;\n        empty_task* my_barrier;\n\n        parallel_do_feeder_impl()\n        {\n            my_barrier = new( task::allocate_root() ) empty_task();\n            __TBB_ASSERT(my_barrier, \"root task allocation failed\");\n        }\n\n#if __TBB_TASK_GROUP_CONTEXT\n        parallel_do_feeder_impl(tbb::task_group_context &context)\n        {\n            my_barrier = new( task::allocate_root(context) ) empty_task();\n            __TBB_ASSERT(my_barrier, \"root task allocation failed\");\n        }\n#endif\n\n        ~parallel_do_feeder_impl()\n        {\n            my_barrier->destroy(*my_barrier);\n        }\n    }; // class parallel_do_feeder_impl\n\n\n    //! For internal use only\n    /** Unpacks a block of iterations.\n        @ingroup algorithms */\n    \n    template<typename Iterator, typename Body, typename Item>\n    class do_group_task_forward: public task\n    {\n        static const size_t max_arg_size = 4;         \n\n        typedef parallel_do_feeder_impl<Body, Item> feeder_type;\n\n        feeder_type& my_feeder;\n        Iterator my_first;\n        size_t my_size;\n        \n        do_group_task_forward( Iterator first, size_t size, feeder_type& feeder ) \n            : my_feeder(feeder), my_first(first), my_size(size)\n        {}\n\n        /*override*/ task* execute()\n        {\n            typedef do_iteration_task_iter<Iterator, Body, Item> iteration_type;\n            __TBB_ASSERT( my_size>0, NULL );\n            task_list list;\n            task* t; \n            size_t k=0; \n            for(;;) {\n                t = new( allocate_child() ) iteration_type( my_first, my_feeder );\n                ++my_first;\n                if( ++k==my_size ) break;\n                list.push_back(*t);\n            }\n            set_ref_count(int(k+1));\n            spawn(list);\n            spawn_and_wait_for_all(*t);\n            return NULL;\n        }\n\n        template<typename Iterator_, typename Body_, typename _Item> friend class do_task_iter;\n    }; // class do_group_task_forward\n\n    template<typename Body, typename Item>\n    class do_group_task_input: public task\n    {\n        static const size_t max_arg_size = 4;         \n        \n        typedef parallel_do_feeder_impl<Body, Item> feeder_type;\n\n        feeder_type& my_feeder;\n        size_t my_size;\n        aligned_space<Item, max_arg_size> my_arg;\n\n        do_group_task_input( feeder_type& feeder ) \n            : my_feeder(feeder), my_size(0)\n        {}\n\n        /*override*/ task* execute()\n        {\n            typedef do_iteration_task_iter<Item*, Body, Item> iteration_type;\n            __TBB_ASSERT( my_size>0, NULL );\n            task_list list;\n            task* t; \n            size_t k=0; \n            for(;;) {\n                t = new( allocate_child() ) iteration_type( my_arg.begin() + k, my_feeder );\n                if( ++k==my_size ) break;\n                list.push_back(*t);\n            }\n            set_ref_count(int(k+1));\n            spawn(list);\n            spawn_and_wait_for_all(*t);\n            return NULL;\n        }\n\n        ~do_group_task_input(){\n            for( size_t k=0; k<my_size; ++k)\n                (my_arg.begin() + k)->~Item();\n        }\n\n        template<typename Iterator_, typename Body_, typename Item_> friend class do_task_iter;\n    }; // class do_group_task_input\n    \n    //! For internal use only.\n    /** Gets block of iterations and packages them into a do_group_task.\n        @ingroup algorithms */\n    template<typename Iterator, typename Body, typename Item>\n    class do_task_iter: public task\n    {\n        typedef parallel_do_feeder_impl<Body, Item> feeder_type;\n\n    public:\n        do_task_iter( Iterator first, Iterator last , feeder_type& feeder ) : \n            my_first(first), my_last(last), my_feeder(feeder)\n        {}\n\n    private:\n        Iterator my_first;\n        Iterator my_last;\n        feeder_type& my_feeder;\n\n        /* Do not merge run(xxx) and run_xxx() methods. They are separated in order\n            to make sure that compilers will eliminate unused argument of type xxx\n            (that is will not put it on stack). The sole purpose of this argument \n            is overload resolution.\n            \n            An alternative could be using template functions, but explicit specialization \n            of member function templates is not supported for non specialized class \n            templates. Besides template functions would always fall back to the least \n            efficient variant (the one for input iterators) in case of iterators having \n            custom tags derived from basic ones. */\n        /*override*/ task* execute()\n        {\n            typedef typename std::iterator_traits<Iterator>::iterator_category iterator_tag;\n            return run( (iterator_tag*)NULL );\n        }\n\n        /** This is the most restricted variant that operates on input iterators or\n            iterators with unknown tags (tags not derived from the standard ones). **/\n        inline task* run( void* ) { return run_for_input_iterator(); }\n        \n        task* run_for_input_iterator() {\n            typedef do_group_task_input<Body, Item> block_type;\n\n            block_type& t = *new( allocate_additional_child_of(*my_feeder.my_barrier) ) block_type(my_feeder);\n            size_t k=0; \n            while( !(my_first == my_last) ) {\n                new (t.my_arg.begin() + k) Item(*my_first);\n                ++my_first;\n                if( ++k==block_type::max_arg_size ) {\n                    if ( !(my_first == my_last) )\n                        recycle_to_reexecute();\n                    break;\n                }\n            }\n            if( k==0 ) {\n                destroy(t);\n                return NULL;\n            } else {\n                t.my_size = k;\n                return &t;\n            }\n        }\n\n        inline task* run( std::forward_iterator_tag* ) { return run_for_forward_iterator(); }\n\n        task* run_for_forward_iterator() {\n            typedef do_group_task_forward<Iterator, Body, Item> block_type;\n\n            Iterator first = my_first;\n            size_t k=0; \n            while( !(my_first==my_last) ) {\n                ++my_first;\n                if( ++k==block_type::max_arg_size ) {\n                    if ( !(my_first==my_last) )\n                        recycle_to_reexecute();\n                    break;\n                }\n            }\n            return k==0 ? NULL : new( allocate_additional_child_of(*my_feeder.my_barrier) ) block_type(first, k, my_feeder);\n        }\n        \n        inline task* run( std::random_access_iterator_tag* ) { return run_for_random_access_iterator(); }\n\n        task* run_for_random_access_iterator() {\n            typedef do_group_task_forward<Iterator, Body, Item> block_type;\n            typedef do_iteration_task_iter<Iterator, Body, Item> iteration_type;\n            \n            size_t k = static_cast<size_t>(my_last-my_first); \n            if( k > block_type::max_arg_size ) {\n                Iterator middle = my_first + k/2;\n\n                empty_task& c = *new( allocate_continuation() ) empty_task;\n                do_task_iter& b = *new( c.allocate_child() ) do_task_iter(middle, my_last, my_feeder);\n                recycle_as_child_of(c);\n\n                my_last = middle;\n                c.set_ref_count(2);\n                c.spawn(b);\n                return this;\n            }else if( k != 0 ) {\n                task_list list;\n                task* t; \n                size_t k1=0; \n                for(;;) {\n                    t = new( allocate_child() ) iteration_type(my_first, my_feeder);\n                    ++my_first;\n                    if( ++k1==k ) break;\n                    list.push_back(*t);\n                }\n                set_ref_count(int(k+1));\n                spawn(list);\n                spawn_and_wait_for_all(*t);\n            }\n            return NULL;\n        }\n    }; // class do_task_iter\n\n    //! For internal use only.\n    /** Implements parallel iteration over a range.\n        @ingroup algorithms */\n    template<typename Iterator, typename Body, typename Item> \n    void run_parallel_do( Iterator first, Iterator last, const Body& body\n#if __TBB_TASK_GROUP_CONTEXT\n        , task_group_context& context\n#endif\n        )\n    {\n        typedef do_task_iter<Iterator, Body, Item> root_iteration_task;\n#if __TBB_TASK_GROUP_CONTEXT\n        parallel_do_feeder_impl<Body, Item> feeder(context);\n#else\n        parallel_do_feeder_impl<Body, Item> feeder;\n#endif\n        feeder.my_body = &body;\n\n        root_iteration_task &t = *new( feeder.my_barrier->allocate_child() ) root_iteration_task(first, last, feeder);\n\n        feeder.my_barrier->set_ref_count(2);\n        feeder.my_barrier->spawn_and_wait_for_all(t);\n    }\n\n    //! For internal use only.\n    /** Detects types of Body's operator function arguments.\n        @ingroup algorithms **/\n    template<typename Iterator, typename Body, typename Item> \n    void select_parallel_do( Iterator first, Iterator last, const Body& body, void (Body::*)(Item) const\n#if __TBB_TASK_GROUP_CONTEXT\n        , task_group_context& context \n#endif // __TBB_TASK_GROUP_CONTEXT \n        )\n    {\n        run_parallel_do<Iterator, Body, typename strip<Item>::type>( first, last, body\n#if __TBB_TASK_GROUP_CONTEXT\n            , context\n#endif // __TBB_TASK_GROUP_CONTEXT \n            );\n    }\n\n    //! For internal use only.\n    /** Detects types of Body's operator function arguments.\n        @ingroup algorithms **/\n    template<typename Iterator, typename Body, typename Item, typename _Item> \n    void select_parallel_do( Iterator first, Iterator last, const Body& body, void (Body::*)(Item, parallel_do_feeder<_Item>&) const\n#if __TBB_TASK_GROUP_CONTEXT\n        , task_group_context& context \n#endif // __TBB_TASK_GROUP_CONTEXT\n        )\n    {\n        run_parallel_do<Iterator, Body, typename strip<Item>::type>( first, last, body\n#if __TBB_TASK_GROUP_CONTEXT\n            , context\n#endif // __TBB_TASK_GROUP_CONTEXT\n            );\n    }\n\n} // namespace internal\n//! @endcond\n\n\n/** \\page parallel_do_body_req Requirements on parallel_do body\n    Class \\c Body implementing the concept of parallel_do body must define:\n    - \\code \n        B::operator()( \n                cv_item_type item,\n                parallel_do_feeder<item_type>& feeder\n        ) const\n        \n        OR\n\n        B::operator()( cv_item_type& item ) const\n      \\endcode                                                      Process item. \n                                                                    May be invoked concurrently  for the same \\c this but different \\c item.\n                                                        \n    - \\code item_type( const item_type& ) \\endcode \n                                                                    Copy a work item.\n    - \\code ~item_type() \\endcode                            Destroy a work item\n**/\n\n/** \\name parallel_do\n    See also requirements on \\ref parallel_do_body_req \"parallel_do Body\". **/\n//@{\n//! Parallel iteration over a range, with optional addition of more work.\n/** @ingroup algorithms */\ntemplate<typename Iterator, typename Body> \nvoid parallel_do( Iterator first, Iterator last, const Body& body )\n{\n    if ( first == last )\n        return;\n#if __TBB_TASK_GROUP_CONTEXT\n    task_group_context context;\n#endif // __TBB_TASK_GROUP_CONTEXT\n    internal::select_parallel_do( first, last, body, &Body::operator()\n#if __TBB_TASK_GROUP_CONTEXT\n        , context\n#endif // __TBB_TASK_GROUP_CONTEXT\n        );\n}\n\ntemplate<typename Range, typename Body>\nvoid parallel_do(Range& rng, const Body& body) {\n    parallel_do(tbb::internal::first(rng), tbb::internal::last(rng), body);\n}\n\ntemplate<typename Range, typename Body>\nvoid parallel_do(const Range& rng, const Body& body) {\n    parallel_do(tbb::internal::first(rng), tbb::internal::last(rng), body);\n}\n\n#if __TBB_TASK_GROUP_CONTEXT\n//! Parallel iteration over a range, with optional addition of more work and user-supplied context\n/** @ingroup algorithms */\ntemplate<typename Iterator, typename Body> \nvoid parallel_do( Iterator first, Iterator last, const Body& body, task_group_context& context  )\n{\n    if ( first == last )\n        return;\n    internal::select_parallel_do( first, last, body, &Body::operator(), context );\n}\n\ntemplate<typename Range, typename Body>\nvoid parallel_do(Range& rng, const Body& body, task_group_context& context) {\n    parallel_do(tbb::internal::first(rng), tbb::internal::last(rng), body, context);\n}\n\ntemplate<typename Range, typename Body>\nvoid parallel_do(const Range& rng, const Body& body, task_group_context& context) {\n    parallel_do(tbb::internal::first(rng), tbb::internal::last(rng), body, context);\n}\n\n#endif // __TBB_TASK_GROUP_CONTEXT\n\n//@}\n\n} // namespace \n\n#endif /* __TBB_parallel_do_H */\n"
  },
  {
    "path": "benchmarks/tbb/parallel_for.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_parallel_for_H\n#define __TBB_parallel_for_H\n\n#include <new>\n#include \"task.h\"\n#include \"partitioner.h\"\n#include \"blocked_range.h\"\n#include \"tbb_exception.h\"\n\nnamespace tbb {\n\nnamespace interface7 {\n//! @cond INTERNAL\nnamespace internal {\n\n    //! allocate right task with new parent\n    void* allocate_sibling(task* start_for_task, size_t bytes);\n\n    //! Task type used in parallel_for\n    /** @ingroup algorithms */\n    template<typename Range, typename Body, typename Partitioner>\n    class start_for: public task {\n        Range my_range;\n        const Body my_body;\n        typename Partitioner::task_partition_type my_partition;\n        /*override*/ task* execute();\n\n        //! Update affinity info, if any.\n        /*override*/ void note_affinity( affinity_id id ) {\n            my_partition.note_affinity( id );\n        }\n\n    public:\n        //! Constructor for root task.\n        start_for( const Range& range, const Body& body, Partitioner& partitioner ) :\n            my_range(range),\n            my_body(body),\n            my_partition(partitioner)\n        {\n        }\n        //! Splitting constructor used to generate children.\n        /** parent_ becomes left child.  Newly constructed object is right child. */\n        start_for( start_for& parent_, typename Partitioner::split_type& split_obj) :\n            my_range(parent_.my_range, split_obj),\n            my_body(parent_.my_body),\n            my_partition(parent_.my_partition, split_obj)\n        {\n            my_partition.set_affinity(*this);\n        }\n        //! Construct right child from the given range as response to the demand.\n        /** parent_ remains left child.  Newly constructed object is right child. */\n        start_for( start_for& parent_, const Range& r, depth_t d ) :\n            my_range(r),\n            my_body(parent_.my_body),\n            my_partition(parent_.my_partition, split())\n        {\n            my_partition.set_affinity(*this);\n            my_partition.align_depth( d );\n        }\n        static void run(  const Range& range, const Body& body, Partitioner& partitioner ) {\n            if( !range.empty() ) {\n#if !__TBB_TASK_GROUP_CONTEXT || TBB_JOIN_OUTER_TASK_GROUP\n                start_for& a = *new(task::allocate_root()) start_for(range,body,partitioner);\n#else\n                // Bound context prevents exceptions from body to affect nesting or sibling algorithms,\n                // and allows users to handle exceptions safely by wrapping parallel_for in the try-block.\n                task_group_context context;\n                start_for& a = *new(task::allocate_root(context)) start_for(range,body,partitioner);\n#endif /* __TBB_TASK_GROUP_CONTEXT && !TBB_JOIN_OUTER_TASK_GROUP */\n                task::spawn_root_and_wait(a);\n            }\n        }\n#if __TBB_TASK_GROUP_CONTEXT\n        static void run(  const Range& range, const Body& body, Partitioner& partitioner, task_group_context& context ) {\n            if( !range.empty() ) {\n                start_for& a = *new(task::allocate_root(context)) start_for(range,body,partitioner);\n                task::spawn_root_and_wait(a);\n            }\n        }\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n        //! Run body for range, serves as callback for partitioner\n        void run_body( Range &r ) { my_body( r ); }\n\n        //! spawn right task, serves as callback for partitioner\n        void offer_work(typename Partitioner::split_type& split_obj) {\n            spawn( *new( allocate_sibling(static_cast<task*>(this), sizeof(start_for)) ) start_for(*this, split_obj) );\n        }\n        //! spawn right task, serves as callback for partitioner\n        void offer_work(const Range& r, depth_t d = 0) {\n            spawn( *new( allocate_sibling(static_cast<task*>(this), sizeof(start_for)) ) start_for(*this, r, d) );\n        }\n    };\n\n    //! allocate right task with new parent\n    // TODO: 'inline' here is to avoid multiple definition error but for sake of code size this should not be inlined\n    inline void* allocate_sibling(task* start_for_task, size_t bytes) {\n        task* parent_ptr = new( start_for_task->allocate_continuation() ) flag_task();\n        start_for_task->set_parent(parent_ptr);\n        parent_ptr->set_ref_count(2);\n        return &parent_ptr->allocate_child().allocate(bytes);\n    }\n\n    //! execute task for parallel_for\n    template<typename Range, typename Body, typename Partitioner>\n    task* start_for<Range,Body,Partitioner>::execute() {\n        my_partition.check_being_stolen( *this );\n        my_partition.execute(*this, my_range);\n        return NULL;\n    }\n} // namespace internal\n//! @endcond\n} // namespace interfaceX\n\n//! @cond INTERNAL\nnamespace internal {\n    using interface7::internal::start_for;\n\n    //! Calls the function with values from range [begin, end) with a step provided\n    template<typename Function, typename Index>\n    class parallel_for_body : internal::no_assign {\n        const Function &my_func;\n        const Index my_begin;\n        const Index my_step;\n    public:\n        parallel_for_body( const Function& _func, Index& _begin, Index& _step )\n            : my_func(_func), my_begin(_begin), my_step(_step) {}\n\n        void operator()( const tbb::blocked_range<Index>& r ) const {\n            // A set of local variables to help the compiler with vectorization of the following loop.\n            Index b = r.begin();\n            Index e = r.end();\n            Index ms = my_step;\n            Index k = my_begin + b*ms;\n\n#if __INTEL_COMPILER\n#pragma ivdep\n#if __TBB_ASSERT_ON_VECTORIZATION_FAILURE\n#pragma vector always assert\n#endif\n#endif\n            for ( Index i = b; i < e; ++i, k += ms ) {\n                my_func( k );\n            }\n        }\n    };\n} // namespace internal\n//! @endcond\n\n// Requirements on Range concept are documented in blocked_range.h\n\n/** \\page parallel_for_body_req Requirements on parallel_for body\n    Class \\c Body implementing the concept of parallel_for body must define:\n    - \\code Body::Body( const Body& ); \\endcode                 Copy constructor\n    - \\code Body::~Body(); \\endcode                             Destructor\n    - \\code void Body::operator()( Range& r ) const; \\endcode   Function call operator applying the body to range \\c r.\n**/\n\n/** \\name parallel_for\n    See also requirements on \\ref range_req \"Range\" and \\ref parallel_for_body_req \"parallel_for Body\". **/\n//@{\n\n//! Parallel iteration over range with default partitioner.\n/** @ingroup algorithms **/\ntemplate<typename Range, typename Body>\nvoid parallel_for( const Range& range, const Body& body ) {\n    internal::start_for<Range,Body,const __TBB_DEFAULT_PARTITIONER>::run(range,body,__TBB_DEFAULT_PARTITIONER());\n}\n\n//! Parallel iteration over range with simple partitioner.\n/** @ingroup algorithms **/\ntemplate<typename Range, typename Body>\nvoid parallel_for( const Range& range, const Body& body, const simple_partitioner& partitioner ) {\n    internal::start_for<Range,Body,const simple_partitioner>::run(range,body,partitioner);\n}\n\n//! Parallel iteration over range with auto_partitioner.\n/** @ingroup algorithms **/\ntemplate<typename Range, typename Body>\nvoid parallel_for( const Range& range, const Body& body, const auto_partitioner& partitioner ) {\n    internal::start_for<Range,Body,const auto_partitioner>::run(range,body,partitioner);\n}\n\n//! Parallel iteration over range with affinity_partitioner.\n/** @ingroup algorithms **/\ntemplate<typename Range, typename Body>\nvoid parallel_for( const Range& range, const Body& body, affinity_partitioner& partitioner ) {\n    internal::start_for<Range,Body,affinity_partitioner>::run(range,body,partitioner);\n}\n\n#if __TBB_TASK_GROUP_CONTEXT\n//! Parallel iteration over range with default partitioner and user-supplied context.\n/** @ingroup algorithms **/\ntemplate<typename Range, typename Body>\nvoid parallel_for( const Range& range, const Body& body, task_group_context& context ) {\n    internal::start_for<Range,Body,const __TBB_DEFAULT_PARTITIONER>::run(range, body, __TBB_DEFAULT_PARTITIONER(), context);\n}\n\n//! Parallel iteration over range with simple partitioner and user-supplied context.\n/** @ingroup algorithms **/\ntemplate<typename Range, typename Body>\nvoid parallel_for( const Range& range, const Body& body, const simple_partitioner& partitioner, task_group_context& context ) {\n    internal::start_for<Range,Body,const simple_partitioner>::run(range, body, partitioner, context);\n}\n\n//! Parallel iteration over range with auto_partitioner and user-supplied context.\n/** @ingroup algorithms **/\ntemplate<typename Range, typename Body>\nvoid parallel_for( const Range& range, const Body& body, const auto_partitioner& partitioner, task_group_context& context ) {\n    internal::start_for<Range,Body,const auto_partitioner>::run(range, body, partitioner, context);\n}\n\n//! Parallel iteration over range with affinity_partitioner and user-supplied context.\n/** @ingroup algorithms **/\ntemplate<typename Range, typename Body>\nvoid parallel_for( const Range& range, const Body& body, affinity_partitioner& partitioner, task_group_context& context ) {\n    internal::start_for<Range,Body,affinity_partitioner>::run(range,body,partitioner, context);\n}\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n//@}\n\nnamespace strict_ppl {\n\n//@{\n//! Implementation of parallel iteration over stepped range of integers with explicit step and partitioner\ntemplate <typename Index, typename Function, typename Partitioner>\nvoid parallel_for_impl(Index first, Index last, Index step, const Function& f, Partitioner& partitioner) {\n    if (step <= 0 )\n        internal::throw_exception(internal::eid_nonpositive_step); // throws std::invalid_argument\n    else if (last > first) {\n        // Above \"else\" avoids \"potential divide by zero\" warning on some platforms\n        Index end = (last - first - Index(1)) / step + Index(1);\n        tbb::blocked_range<Index> range(static_cast<Index>(0), end);\n        internal::parallel_for_body<Function, Index> body(f, first, step);\n        tbb::parallel_for(range, body, partitioner);\n    }\n}\n\n//! Parallel iteration over a range of integers with a step provided and default partitioner\ntemplate <typename Index, typename Function>\nvoid parallel_for(Index first, Index last, Index step, const Function& f) {\n    parallel_for_impl<Index,Function,const auto_partitioner>(first, last, step, f, auto_partitioner());\n}\n//! Parallel iteration over a range of integers with a step provided and simple partitioner\ntemplate <typename Index, typename Function>\nvoid parallel_for(Index first, Index last, Index step, const Function& f, const simple_partitioner& partitioner) {\n    parallel_for_impl<Index,Function,const simple_partitioner>(first, last, step, f, partitioner);\n}\n//! Parallel iteration over a range of integers with a step provided and auto partitioner\ntemplate <typename Index, typename Function>\nvoid parallel_for(Index first, Index last, Index step, const Function& f, const auto_partitioner& partitioner) {\n    parallel_for_impl<Index,Function,const auto_partitioner>(first, last, step, f, partitioner);\n}\n//! Parallel iteration over a range of integers with a step provided and affinity partitioner\ntemplate <typename Index, typename Function>\nvoid parallel_for(Index first, Index last, Index step, const Function& f, affinity_partitioner& partitioner) {\n    parallel_for_impl(first, last, step, f, partitioner);\n}\n\n//! Parallel iteration over a range of integers with a default step value and default partitioner\ntemplate <typename Index, typename Function>\nvoid parallel_for(Index first, Index last, const Function& f) {\n    parallel_for_impl<Index,Function,const auto_partitioner>(first, last, static_cast<Index>(1), f, auto_partitioner());\n}\n//! Parallel iteration over a range of integers with a default step value and simple partitioner\ntemplate <typename Index, typename Function>\nvoid parallel_for(Index first, Index last, const Function& f, const simple_partitioner& partitioner) {\n    parallel_for_impl<Index,Function,const simple_partitioner>(first, last, static_cast<Index>(1), f, partitioner);\n}\n//! Parallel iteration over a range of integers with a default step value and auto partitioner\ntemplate <typename Index, typename Function>\nvoid parallel_for(Index first, Index last, const Function& f, const auto_partitioner& partitioner) {\n    parallel_for_impl<Index,Function,const auto_partitioner>(first, last, static_cast<Index>(1), f, partitioner);\n}\n//! Parallel iteration over a range of integers with a default step value and affinity partitioner\ntemplate <typename Index, typename Function>\nvoid parallel_for(Index first, Index last, const Function& f, affinity_partitioner& partitioner) {\n    parallel_for_impl(first, last, static_cast<Index>(1), f, partitioner);\n}\n\n#if __TBB_TASK_GROUP_CONTEXT\n//! Implementation of parallel iteration over stepped range of integers with explicit step, task group context, and partitioner\ntemplate <typename Index, typename Function, typename Partitioner>\nvoid parallel_for_impl(Index first, Index last, Index step, const Function& f, Partitioner& partitioner, tbb::task_group_context &context) {\n    if (step <= 0 )\n        internal::throw_exception(internal::eid_nonpositive_step); // throws std::invalid_argument\n    else if (last > first) {\n        // Above \"else\" avoids \"potential divide by zero\" warning on some platforms\n        Index end = (last - first - Index(1)) / step + Index(1);\n        tbb::blocked_range<Index> range(static_cast<Index>(0), end);\n        internal::parallel_for_body<Function, Index> body(f, first, step);\n        tbb::parallel_for(range, body, partitioner, context);\n    }\n}\n\n//! Parallel iteration over a range of integers with explicit step, task group context, and default partitioner\ntemplate <typename Index, typename Function>\nvoid parallel_for(Index first, Index last, Index step, const Function& f, tbb::task_group_context &context) {\n    parallel_for_impl<Index,Function,const auto_partitioner>(first, last, step, f, auto_partitioner(), context);\n}\n//! Parallel iteration over a range of integers with explicit step, task group context, and simple partitioner\n template <typename Index, typename Function>\nvoid parallel_for(Index first, Index last, Index step, const Function& f, const simple_partitioner& partitioner, tbb::task_group_context &context) {\n    parallel_for_impl<Index,Function,const simple_partitioner>(first, last, step, f, partitioner, context);\n}\n//! Parallel iteration over a range of integers with explicit step, task group context, and auto partitioner\n template <typename Index, typename Function>\nvoid parallel_for(Index first, Index last, Index step, const Function& f, const auto_partitioner& partitioner, tbb::task_group_context &context) {\n    parallel_for_impl<Index,Function,const auto_partitioner>(first, last, step, f, partitioner, context);\n}\n//! Parallel iteration over a range of integers with explicit step, task group context, and affinity partitioner\n template <typename Index, typename Function>\nvoid parallel_for(Index first, Index last, Index step, const Function& f, affinity_partitioner& partitioner, tbb::task_group_context &context) {\n    parallel_for_impl(first, last, step, f, partitioner, context);\n}\n\n\n//! Parallel iteration over a range of integers with a default step value, explicit task group context, and default partitioner\ntemplate <typename Index, typename Function>\nvoid parallel_for(Index first, Index last, const Function& f, tbb::task_group_context &context) {\n    parallel_for_impl<Index,Function,const auto_partitioner>(first, last, static_cast<Index>(1), f, auto_partitioner(), context);\n}\n//! Parallel iteration over a range of integers with a default step value, explicit task group context, and simple partitioner\n template <typename Index, typename Function, typename Partitioner>\nvoid parallel_for(Index first, Index last, const Function& f, const simple_partitioner& partitioner, tbb::task_group_context &context) {\n    parallel_for_impl<Index,Function,const simple_partitioner>(first, last, static_cast<Index>(1), f, partitioner, context);\n}\n//! Parallel iteration over a range of integers with a default step value, explicit task group context, and auto partitioner\n template <typename Index, typename Function, typename Partitioner>\nvoid parallel_for(Index first, Index last, const Function& f, const auto_partitioner& partitioner, tbb::task_group_context &context) {\n    parallel_for_impl<Index,Function,const auto_partitioner>(first, last, static_cast<Index>(1), f, partitioner, context);\n}\n//! Parallel iteration over a range of integers with a default step value, explicit task group context, and affinity_partitioner\n template <typename Index, typename Function, typename Partitioner>\nvoid parallel_for(Index first, Index last, const Function& f, affinity_partitioner& partitioner, tbb::task_group_context &context) {\n    parallel_for_impl(first, last, static_cast<Index>(1), f, partitioner, context);\n}\n\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n//@}\n\n} // namespace strict_ppl\n\nusing strict_ppl::parallel_for;\n\n} // namespace tbb\n\n#if TBB_PREVIEW_SERIAL_SUBSET\n#define __TBB_NORMAL_EXECUTION\n#include \"../serial/tbb/parallel_for.h\"\n#undef __TBB_NORMAL_EXECUTION\n#endif\n\n#endif /* __TBB_parallel_for_H */\n"
  },
  {
    "path": "benchmarks/tbb/parallel_for_each.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_parallel_for_each_H\n#define __TBB_parallel_for_each_H\n\n#include \"parallel_do.h\"\n\nnamespace tbb {\n\n//! @cond INTERNAL\nnamespace internal {\n    // The class calls user function in operator()\n    template <typename Function, typename Iterator>\n    class parallel_for_each_body : internal::no_assign {\n        const Function &my_func;\n    public:\n        parallel_for_each_body(const Function &_func) : my_func(_func) {}\n        parallel_for_each_body(const parallel_for_each_body<Function, Iterator> &_caller) : my_func(_caller.my_func) {}\n\n        void operator() ( typename std::iterator_traits<Iterator>::reference value ) const {\n            my_func(value);\n        }\n    };\n} // namespace internal\n//! @endcond\n\n/** \\name parallel_for_each\n    **/\n//@{\n//! Calls function f for all items from [first, last) interval using user-supplied context\n/** @ingroup algorithms */\n#if __TBB_TASK_GROUP_CONTEXT\ntemplate<typename InputIterator, typename Function>\nvoid parallel_for_each(InputIterator first, InputIterator last, const Function& f, task_group_context &context) {\n    internal::parallel_for_each_body<Function, InputIterator> body(f);\n    tbb::parallel_do (first, last, body, context);\n}\n\n//! Calls function f for all items from rng using user-supplied context\n/** @ingroup algorithms */\ntemplate<typename Range, typename Function>\nvoid parallel_for_each(Range& rng, const Function& f, task_group_context& context) {\n    parallel_for_each(tbb::internal::first(rng), tbb::internal::last(rng), f, context);\n}\n\n//! Calls function f for all items from const rng user-supplied context\n/** @ingroup algorithms */\ntemplate<typename Range, typename Function>\nvoid parallel_for_each(const Range& rng, const Function& f, task_group_context& context) {\n    parallel_for_each(tbb::internal::first(rng), tbb::internal::last(rng), f, context);\n}\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n//! Uses default context\ntemplate<typename InputIterator, typename Function>\nvoid parallel_for_each(InputIterator first, InputIterator last, const Function& f) {\n    internal::parallel_for_each_body<Function, InputIterator> body(f);\n    tbb::parallel_do (first, last, body);\n}\n\n//! Uses default context\ntemplate<typename Range, typename Function>\nvoid parallel_for_each(Range& rng, const Function& f) {\n    parallel_for_each(tbb::internal::first(rng), tbb::internal::last(rng), f);\n}\n\n//! Uses default context\ntemplate<typename Range, typename Function>\nvoid parallel_for_each(const Range& rng, const Function& f) {\n    parallel_for_each(tbb::internal::first(rng), tbb::internal::last(rng), f);\n}\n\n//@}\n\n} // namespace\n\n#endif /* __TBB_parallel_for_each_H */\n"
  },
  {
    "path": "benchmarks/tbb/parallel_invoke.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_parallel_invoke_H\n#define __TBB_parallel_invoke_H\n\n#include \"task.h\"\n\n#if __TBB_VARIADIC_PARALLEL_INVOKE\n    #include <utility>\n#endif\n\nnamespace tbb {\n\n#if !__TBB_TASK_GROUP_CONTEXT\n    /** Dummy to avoid cluttering the bulk of the header with enormous amount of ifdefs. **/\n    struct task_group_context {};\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n//! @cond INTERNAL\nnamespace internal {\n    // Simple task object, executing user method\n    template<typename function>\n    class function_invoker : public task{\n    public:\n        function_invoker(const function& _function) : my_function(_function) {}\n    private:\n        const function &my_function;\n        /*override*/\n        task* execute()\n        {\n            my_function();\n            return NULL;\n        }\n    };\n\n    // The class spawns two or three child tasks\n    template <size_t N, typename function1, typename function2, typename function3>\n    class spawner : public task {\n    private:\n        const function1& my_func1;\n        const function2& my_func2;\n        const function3& my_func3;\n        bool is_recycled;\n\n        task* execute (){\n            if(is_recycled){\n                return NULL;\n            }else{\n                __TBB_ASSERT(N==2 || N==3, \"Number of arguments passed to spawner is wrong\");\n                set_ref_count(N);\n                recycle_as_safe_continuation();\n                internal::function_invoker<function2>* invoker2 = new (allocate_child()) internal::function_invoker<function2>(my_func2);\n                __TBB_ASSERT(invoker2, \"Child task allocation failed\");\n                spawn(*invoker2);\n                size_t n = N; // To prevent compiler warnings\n                if (n>2) {\n                    internal::function_invoker<function3>* invoker3 = new (allocate_child()) internal::function_invoker<function3>(my_func3);\n                    __TBB_ASSERT(invoker3, \"Child task allocation failed\");\n                    spawn(*invoker3);\n                }\n                my_func1();\n                is_recycled = true;\n                return NULL;\n            }\n        } // execute\n\n    public:\n        spawner(const function1& _func1, const function2& _func2, const function3& _func3) : my_func1(_func1), my_func2(_func2), my_func3(_func3), is_recycled(false) {}\n    };\n\n    // Creates and spawns child tasks\n    class parallel_invoke_helper : public empty_task {\n    public:\n        // Dummy functor class\n        class parallel_invoke_noop {\n        public:\n            void operator() () const {}\n        };\n        // Creates a helper object with user-defined number of children expected\n        parallel_invoke_helper(int number_of_children)\n        {\n            set_ref_count(number_of_children + 1);\n        }\n\n#if __TBB_VARIADIC_PARALLEL_INVOKE\n        void add_children() {}\n        void add_children(tbb::task_group_context&) {}\n\n        template <typename function>\n        void add_children(function&& _func)\n        {\n            internal::function_invoker<function>* invoker = new (allocate_child()) internal::function_invoker<function>(std::forward<function>(_func));\n            __TBB_ASSERT(invoker, \"Child task allocation failed\");\n            spawn(*invoker);\n        }\n\n        template<typename function>\n        void add_children(function&& _func, tbb::task_group_context&)\n        {\n            add_children(std::forward<function>(_func));\n        }\n\n        // Adds child(ren) task(s) and spawns them\n        template <typename function1, typename function2, typename... function>\n        void add_children(function1&& _func1, function2&& _func2, function&&... _func)\n        {\n            // The third argument is dummy, it is ignored actually.\n            parallel_invoke_noop noop;\n            typedef internal::spawner<2, function1, function2, parallel_invoke_noop> spawner_type;\n            spawner_type & sub_root = *new(allocate_child()) spawner_type(std::forward<function1>(_func1), std::forward<function2>(_func2), noop);\n            spawn(sub_root);\n            add_children(std::forward<function>(_func)...);\n        }\n#else\n        // Adds child task and spawns it\n        template <typename function>\n        void add_children (const function &_func)\n        {\n            internal::function_invoker<function>* invoker = new (allocate_child()) internal::function_invoker<function>(_func);\n            __TBB_ASSERT(invoker, \"Child task allocation failed\");\n            spawn(*invoker);\n        }\n\n        // Adds a task with multiple child tasks and spawns it\n        // two arguments\n        template <typename function1, typename function2>\n        void add_children (const function1& _func1, const function2& _func2)\n        {\n            // The third argument is dummy, it is ignored actually.\n            parallel_invoke_noop noop;\n            internal::spawner<2, function1, function2, parallel_invoke_noop>& sub_root = *new(allocate_child())internal::spawner<2, function1, function2, parallel_invoke_noop>(_func1, _func2, noop);\n            spawn(sub_root);\n        }\n        // three arguments\n        template <typename function1, typename function2, typename function3>\n        void add_children (const function1& _func1, const function2& _func2, const function3& _func3)\n        {\n            internal::spawner<3, function1, function2, function3>& sub_root = *new(allocate_child())internal::spawner<3, function1, function2, function3>(_func1, _func2, _func3);\n            spawn(sub_root);\n        }\n#endif // __TBB_VARIADIC_PARALLEL_INVOKE\n\n        // Waits for all child tasks\n        template <typename F0>\n        void run_and_finish(const F0& f0)\n        {\n            internal::function_invoker<F0>* invoker = new (allocate_child()) internal::function_invoker<F0>(f0);\n            __TBB_ASSERT(invoker, \"Child task allocation failed\");\n            spawn_and_wait_for_all(*invoker);\n        }\n    };\n    // The class destroys root if exception occurred as well as in normal case\n    class parallel_invoke_cleaner: internal::no_copy {\n    public:\n#if __TBB_TASK_GROUP_CONTEXT\n        parallel_invoke_cleaner(int number_of_children, tbb::task_group_context& context)\n            : root(*new(task::allocate_root(context)) internal::parallel_invoke_helper(number_of_children))\n#else\n        parallel_invoke_cleaner(int number_of_children, tbb::task_group_context&)\n            : root(*new(task::allocate_root()) internal::parallel_invoke_helper(number_of_children))\n#endif /* !__TBB_TASK_GROUP_CONTEXT */\n        {}\n\n        ~parallel_invoke_cleaner(){\n            root.destroy(root);\n        }\n        internal::parallel_invoke_helper& root;\n    };\n\n#if __TBB_VARIADIC_PARALLEL_INVOKE\n//  Determine whether the last parameter in a pack is task_group_context\n    template<typename... T> struct impl_selector; // to workaround a GCC bug\n\n    template<typename T1, typename... T> struct impl_selector<T1, T...> {\n        typedef typename impl_selector<T...>::type type;\n    };\n\n    template<typename T> struct impl_selector<T> {\n        typedef false_type type;\n    };\n    template<> struct impl_selector<task_group_context&> {\n        typedef true_type  type;\n    };\n\n    // Select task_group_context parameter from the back of a pack\n    task_group_context& get_context( task_group_context& tgc ) { return tgc; }\n\n    template<typename T1, typename... T>\n    task_group_context& get_context( T1&& /*ignored*/, T&&... t )\n    { return get_context( std::forward<T>(t)... ); }\n\n    // task_group_context is known to be at the back of the parameter pack\n    template<typename F0, typename F1, typename... F>\n    void parallel_invoke_impl(true_type, F0&& f0, F1&& f1, F&&... f) {\n        __TBB_STATIC_ASSERT(sizeof...(F)>0, \"Variadic parallel_invoke implementation broken?\");\n        // # of child tasks: f0, f1, and a task for each two elements of the pack except the last\n        const size_t number_of_children = 2 + sizeof...(F)/2;\n        parallel_invoke_cleaner cleaner(number_of_children, get_context(std::forward<F>(f)...));\n        parallel_invoke_helper& root = cleaner.root;\n\n        root.add_children(std::forward<F>(f)...);\n        root.add_children(std::forward<F1>(f1));\n        root.run_and_finish(std::forward<F0>(f0));\n    }\n\n    // task_group_context is not in the pack, needs to be added\n    template<typename F0, typename F1, typename... F>\n    void parallel_invoke_impl(false_type, F0&& f0, F1&& f1, F&&... f) {\n        tbb::task_group_context context;\n        // Add context to the arguments, and redirect to the other overload\n        parallel_invoke_impl(true_type(), std::forward<F0>(f0), std::forward<F1>(f1), std::forward<F>(f)..., context);\n    }\n#endif\n} // namespace internal\n//! @endcond\n\n/** \\name parallel_invoke\n    **/\n//@{\n//! Executes a list of tasks in parallel and waits for all tasks to complete.\n/** @ingroup algorithms */\n\n#if __TBB_VARIADIC_PARALLEL_INVOKE\n\n// parallel_invoke for two or more arguments via variadic templates\n// presence of task_group_context is defined automatically\ntemplate<typename F0, typename F1, typename... F>\nvoid parallel_invoke(F0&& f0, F1&& f1, F&&... f) {\n    typedef typename internal::impl_selector<internal::false_type, F...>::type selector_type;\n    internal::parallel_invoke_impl(selector_type(), std::forward<F0>(f0), std::forward<F1>(f1), std::forward<F>(f)...);\n}\n\n#else\n\n// parallel_invoke with user-defined context\n// two arguments\ntemplate<typename F0, typename F1 >\nvoid parallel_invoke(const F0& f0, const F1& f1, tbb::task_group_context& context) {\n    internal::parallel_invoke_cleaner cleaner(2, context);\n    internal::parallel_invoke_helper& root = cleaner.root;\n\n    root.add_children(f1);\n\n    root.run_and_finish(f0);\n}\n\n// three arguments\ntemplate<typename F0, typename F1, typename F2 >\nvoid parallel_invoke(const F0& f0, const F1& f1, const F2& f2, tbb::task_group_context& context) {\n    internal::parallel_invoke_cleaner cleaner(3, context);\n    internal::parallel_invoke_helper& root = cleaner.root;\n\n    root.add_children(f2);\n    root.add_children(f1);\n\n    root.run_and_finish(f0);\n}\n\n// four arguments\ntemplate<typename F0, typename F1, typename F2, typename F3>\nvoid parallel_invoke(const F0& f0, const F1& f1, const F2& f2, const F3& f3,\n                     tbb::task_group_context& context)\n{\n    internal::parallel_invoke_cleaner cleaner(4, context);\n    internal::parallel_invoke_helper& root = cleaner.root;\n\n    root.add_children(f3);\n    root.add_children(f2);\n    root.add_children(f1);\n\n    root.run_and_finish(f0);\n}\n\n// five arguments\ntemplate<typename F0, typename F1, typename F2, typename F3, typename F4 >\nvoid parallel_invoke(const F0& f0, const F1& f1, const F2& f2, const F3& f3, const F4& f4,\n                     tbb::task_group_context& context)\n{\n    internal::parallel_invoke_cleaner cleaner(3, context);\n    internal::parallel_invoke_helper& root = cleaner.root;\n\n    root.add_children(f4, f3);\n    root.add_children(f2, f1);\n\n    root.run_and_finish(f0);\n}\n\n// six arguments\ntemplate<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5>\nvoid parallel_invoke(const F0& f0, const F1& f1, const F2& f2, const F3& f3, const F4& f4, const F5& f5,\n                     tbb::task_group_context& context)\n{\n    internal::parallel_invoke_cleaner cleaner(3, context);\n    internal::parallel_invoke_helper& root = cleaner.root;\n\n    root.add_children(f5, f4, f3);\n    root.add_children(f2, f1);\n\n    root.run_and_finish(f0);\n}\n\n// seven arguments\ntemplate<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6>\nvoid parallel_invoke(const F0& f0, const F1& f1, const F2& f2, const F3& f3, const F4& f4,\n                     const F5& f5, const F6& f6,\n                     tbb::task_group_context& context)\n{\n    internal::parallel_invoke_cleaner cleaner(3, context);\n    internal::parallel_invoke_helper& root = cleaner.root;\n\n    root.add_children(f6, f5, f4);\n    root.add_children(f3, f2, f1);\n\n    root.run_and_finish(f0);\n}\n\n// eight arguments\ntemplate<typename F0, typename F1, typename F2, typename F3, typename F4,\n         typename F5, typename F6, typename F7>\nvoid parallel_invoke(const F0& f0, const F1& f1, const F2& f2, const F3& f3, const F4& f4,\n                     const F5& f5, const F6& f6, const F7& f7,\n                     tbb::task_group_context& context)\n{\n    internal::parallel_invoke_cleaner cleaner(4, context);\n    internal::parallel_invoke_helper& root = cleaner.root;\n\n    root.add_children(f7, f6, f5);\n    root.add_children(f4, f3);\n    root.add_children(f2, f1);\n\n    root.run_and_finish(f0);\n}\n\n// nine arguments\ntemplate<typename F0, typename F1, typename F2, typename F3, typename F4,\n         typename F5, typename F6, typename F7, typename F8>\nvoid parallel_invoke(const F0& f0, const F1& f1, const F2& f2, const F3& f3, const F4& f4,\n                     const F5& f5, const F6& f6, const F7& f7, const F8& f8,\n                     tbb::task_group_context& context)\n{\n    internal::parallel_invoke_cleaner cleaner(4, context);\n    internal::parallel_invoke_helper& root = cleaner.root;\n\n    root.add_children(f8, f7, f6);\n    root.add_children(f5, f4, f3);\n    root.add_children(f2, f1);\n\n    root.run_and_finish(f0);\n}\n\n// ten arguments\ntemplate<typename F0, typename F1, typename F2, typename F3, typename F4,\n         typename F5, typename F6, typename F7, typename F8, typename F9>\nvoid parallel_invoke(const F0& f0, const F1& f1, const F2& f2, const F3& f3, const F4& f4,\n                     const F5& f5, const F6& f6, const F7& f7, const F8& f8, const F9& f9,\n                     tbb::task_group_context& context)\n{\n    internal::parallel_invoke_cleaner cleaner(4, context);\n    internal::parallel_invoke_helper& root = cleaner.root;\n\n    root.add_children(f9, f8, f7);\n    root.add_children(f6, f5, f4);\n    root.add_children(f3, f2, f1);\n\n    root.run_and_finish(f0);\n}\n\n// two arguments\ntemplate<typename F0, typename F1>\nvoid parallel_invoke(const F0& f0, const F1& f1) {\n    task_group_context context;\n    parallel_invoke<F0, F1>(f0, f1, context);\n}\n// three arguments\ntemplate<typename F0, typename F1, typename F2>\nvoid parallel_invoke(const F0& f0, const F1& f1, const F2& f2) {\n    task_group_context context;\n    parallel_invoke<F0, F1, F2>(f0, f1, f2, context);\n}\n// four arguments\ntemplate<typename F0, typename F1, typename F2, typename F3 >\nvoid parallel_invoke(const F0& f0, const F1& f1, const F2& f2, const F3& f3) {\n    task_group_context context;\n    parallel_invoke<F0, F1, F2, F3>(f0, f1, f2, f3, context);\n}\n// five arguments\ntemplate<typename F0, typename F1, typename F2, typename F3, typename F4>\nvoid parallel_invoke(const F0& f0, const F1& f1, const F2& f2, const F3& f3, const F4& f4) {\n    task_group_context context;\n    parallel_invoke<F0, F1, F2, F3, F4>(f0, f1, f2, f3, f4, context);\n}\n// six arguments\ntemplate<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5>\nvoid parallel_invoke(const F0& f0, const F1& f1, const F2& f2, const F3& f3, const F4& f4, const F5& f5) {\n    task_group_context context;\n    parallel_invoke<F0, F1, F2, F3, F4, F5>(f0, f1, f2, f3, f4, f5, context);\n}\n// seven arguments\ntemplate<typename F0, typename F1, typename F2, typename F3, typename F4, typename F5, typename F6>\nvoid parallel_invoke(const F0& f0, const F1& f1, const F2& f2, const F3& f3, const F4& f4,\n                     const F5& f5, const F6& f6)\n{\n    task_group_context context;\n    parallel_invoke<F0, F1, F2, F3, F4, F5, F6>(f0, f1, f2, f3, f4, f5, f6, context);\n}\n// eight arguments\ntemplate<typename F0, typename F1, typename F2, typename F3, typename F4,\n         typename F5, typename F6, typename F7>\nvoid parallel_invoke(const F0& f0, const F1& f1, const F2& f2, const F3& f3, const F4& f4,\n                     const F5& f5, const F6& f6, const F7& f7)\n{\n    task_group_context context;\n    parallel_invoke<F0, F1, F2, F3, F4, F5, F6, F7>(f0, f1, f2, f3, f4, f5, f6, f7, context);\n}\n// nine arguments\ntemplate<typename F0, typename F1, typename F2, typename F3, typename F4,\n         typename F5, typename F6, typename F7, typename F8>\nvoid parallel_invoke(const F0& f0, const F1& f1, const F2& f2, const F3& f3, const F4& f4,\n                     const F5& f5, const F6& f6, const F7& f7, const F8& f8)\n{\n    task_group_context context;\n    parallel_invoke<F0, F1, F2, F3, F4, F5, F6, F7, F8>(f0, f1, f2, f3, f4, f5, f6, f7, f8, context);\n}\n// ten arguments\ntemplate<typename F0, typename F1, typename F2, typename F3, typename F4,\n         typename F5, typename F6, typename F7, typename F8, typename F9>\nvoid parallel_invoke(const F0& f0, const F1& f1, const F2& f2, const F3& f3, const F4& f4,\n                     const F5& f5, const F6& f6, const F7& f7, const F8& f8, const F9& f9)\n{\n    task_group_context context;\n    parallel_invoke<F0, F1, F2, F3, F4, F5, F6, F7, F8, F9>(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, context);\n}\n#endif // __TBB_VARIADIC_PARALLEL_INVOKE\n//@}\n\n} // namespace\n\n#endif /* __TBB_parallel_invoke_H */\n"
  },
  {
    "path": "benchmarks/tbb/parallel_reduce.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_parallel_reduce_H\n#define __TBB_parallel_reduce_H\n\n#include <new>\n#include \"task.h\"\n#include \"aligned_space.h\"\n#include \"partitioner.h\"\n#include \"tbb_profiling.h\"\n\nnamespace tbb {\n\nnamespace interface7 {\n//! @cond INTERNAL\nnamespace internal {\n\n    using namespace tbb::internal;\n\n    /** Values for reduction_context. */\n    enum {\n        root_task, left_child, right_child\n    };\n\n    /** Represented as a char, not enum, for compactness. */\n    typedef char reduction_context;\n\n    //! Task type used to combine the partial results of parallel_reduce.\n    /** @ingroup algorithms */\n    template<typename Body>\n    class finish_reduce: public flag_task {\n        //! Pointer to body, or NULL if the left child has not yet finished.\n        bool has_right_zombie;\n        const reduction_context my_context;\n        Body* my_body;\n        aligned_space<Body> zombie_space;\n        finish_reduce( reduction_context context_ ) :\n            has_right_zombie(false), // TODO: substitute by flag_task::child_stolen?\n            my_context(context_),\n            my_body(NULL)\n        {\n        }\n        ~finish_reduce() {\n            if( has_right_zombie )\n                zombie_space.begin()->~Body();\n        }\n        task* execute() {\n            if( has_right_zombie ) {\n                // Right child was stolen.\n                Body* s = zombie_space.begin();\n                my_body->join( *s );\n                // Body::join() won't be called if canceled. Defer destruction to destructor\n            }\n            if( my_context==left_child )\n                itt_store_word_with_release( static_cast<finish_reduce*>(parent())->my_body, my_body );\n            return NULL;\n        }\n        template<typename Range,typename Body_, typename Partitioner>\n        friend class start_reduce;\n    };\n\n    //! allocate right task with new parent\n    void allocate_sibling(task* start_reduce_task, task *tasks[], size_t start_bytes, size_t finish_bytes);\n\n    //! Task type used to split the work of parallel_reduce.\n    /** @ingroup algorithms */\n    template<typename Range, typename Body, typename Partitioner>\n    class start_reduce: public task {\n        typedef finish_reduce<Body> finish_type;\n        Body* my_body;\n        Range my_range;\n        typename Partitioner::task_partition_type my_partition;\n        reduction_context my_context;\n        /*override*/ task* execute();\n        //! Update affinity info, if any\n        /*override*/ void note_affinity( affinity_id id ) {\n            my_partition.note_affinity( id );\n        }\n        template<typename Body_>\n        friend class finish_reduce;\n\npublic:\n        //! Constructor used for root task\n        start_reduce( const Range& range, Body* body, Partitioner& partitioner ) :\n            my_body(body),\n            my_range(range),\n            my_partition(partitioner),\n            my_context(root_task)\n        {\n        }\n        //! Splitting constructor used to generate children.\n        /** parent_ becomes left child.  Newly constructed object is right child. */\n        start_reduce( start_reduce& parent_, typename Partitioner::split_type& split_obj ) :\n            my_body(parent_.my_body),\n            my_range(parent_.my_range, split_obj),\n            my_partition(parent_.my_partition, split_obj),\n            my_context(right_child)\n        {\n            my_partition.set_affinity(*this);\n            parent_.my_context = left_child;\n        }\n        //! Construct right child from the given range as response to the demand.\n        /** parent_ remains left child.  Newly constructed object is right child. */\n        start_reduce( start_reduce& parent_, const Range& r, depth_t d ) :\n            my_body(parent_.my_body),\n            my_range(r),\n            my_partition(parent_.my_partition, split()),\n            my_context(right_child)\n        {\n            my_partition.set_affinity(*this);\n            my_partition.align_depth( d ); // TODO: move into constructor of partitioner\n            parent_.my_context = left_child;\n        }\n        static void run( const Range& range, Body& body, Partitioner& partitioner ) {\n            if( !range.empty() ) {\n#if !__TBB_TASK_GROUP_CONTEXT || TBB_JOIN_OUTER_TASK_GROUP\n                task::spawn_root_and_wait( *new(task::allocate_root()) start_reduce(range,&body,partitioner) );\n#else\n                // Bound context prevents exceptions from body to affect nesting or sibling algorithms,\n                // and allows users to handle exceptions safely by wrapping parallel_for in the try-block.\n                task_group_context context;\n                task::spawn_root_and_wait( *new(task::allocate_root(context)) start_reduce(range,&body,partitioner) );\n#endif /* __TBB_TASK_GROUP_CONTEXT && !TBB_JOIN_OUTER_TASK_GROUP */\n            }\n        }\n#if __TBB_TASK_GROUP_CONTEXT\n        static void run( const Range& range, Body& body, Partitioner& partitioner, task_group_context& context ) {\n            if( !range.empty() )\n                task::spawn_root_and_wait( *new(task::allocate_root(context)) start_reduce(range,&body,partitioner) );\n        }\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n        //! Run body for range\n        void run_body( Range &r ) { (*my_body)( r ); }\n\n        //! spawn right task, serves as callback for partitioner\n        // TODO: remove code duplication from 'offer_work' methods\n        void offer_work(typename Partitioner::split_type& split_obj) {\n            task *tasks[2];\n            allocate_sibling(static_cast<task*>(this), tasks, sizeof(start_reduce), sizeof(finish_type));\n            new((void*)tasks[0]) finish_type(my_context);\n            new((void*)tasks[1]) start_reduce(*this, split_obj);\n            spawn(*tasks[1]);\n        }\n        //! spawn right task, serves as callback for partitioner\n        void offer_work(const Range& r, depth_t d = 0) {\n            task *tasks[2];\n            allocate_sibling(static_cast<task*>(this), tasks, sizeof(start_reduce), sizeof(finish_type));\n            new((void*)tasks[0]) finish_type(my_context);\n            new((void*)tasks[1]) start_reduce(*this, r, d);\n            spawn(*tasks[1]);\n        }\n    };\n\n    //! allocate right task with new parent\n    // TODO: 'inline' here is to avoid multiple definition error but for sake of code size this should not be inlined\n    inline void allocate_sibling(task* start_reduce_task, task *tasks[], size_t start_bytes, size_t finish_bytes) {\n        tasks[0] = &start_reduce_task->allocate_continuation().allocate(finish_bytes);\n        start_reduce_task->set_parent(tasks[0]);\n        tasks[0]->set_ref_count(2);\n        tasks[1] = &tasks[0]->allocate_child().allocate(start_bytes);\n    }\n\n    template<typename Range, typename Body, typename Partitioner>\n    task* start_reduce<Range,Body,Partitioner>::execute() {\n        my_partition.check_being_stolen( *this );\n        if( my_context==right_child ) {\n            finish_type* parent_ptr = static_cast<finish_type*>(parent());\n            if( !itt_load_word_with_acquire(parent_ptr->my_body) ) { // TODO: replace by is_stolen_task() or by parent_ptr->ref_count() == 2???\n                my_body = new( parent_ptr->zombie_space.begin() ) Body(*my_body,split());\n                parent_ptr->has_right_zombie = true;\n            }\n        } else __TBB_ASSERT(my_context==root_task,NULL);// because left leaf spawns right leafs without recycling\n        my_partition.execute(*this, my_range);\n        if( my_context==left_child ) {\n            finish_type* parent_ptr = static_cast<finish_type*>(parent());\n            __TBB_ASSERT(my_body!=parent_ptr->zombie_space.begin(),NULL);\n            itt_store_word_with_release(parent_ptr->my_body, my_body );\n        }\n        return NULL;\n    }\n\n    //! Task type used to combine the partial results of parallel_deterministic_reduce.\n    /** @ingroup algorithms */\n    template<typename Body>\n    class finish_deterministic_reduce: public task {\n        Body &my_left_body;\n        Body my_right_body;\n\n        finish_deterministic_reduce( Body &body ) :\n            my_left_body( body ),\n            my_right_body( body, split() )\n        {\n        }\n        task* execute() {\n            my_left_body.join( my_right_body );\n            return NULL;\n        }\n        template<typename Range,typename Body_>\n        friend class start_deterministic_reduce;\n    };\n\n    //! Task type used to split the work of parallel_deterministic_reduce.\n    /** @ingroup algorithms */\n    template<typename Range, typename Body>\n    class start_deterministic_reduce: public task {\n        typedef finish_deterministic_reduce<Body> finish_type;\n        Body &my_body;\n        Range my_range;\n        /*override*/ task* execute();\n\n        //! Constructor used for root task\n        start_deterministic_reduce( const Range& range, Body& body ) :\n            my_body( body ),\n            my_range( range )\n        {\n        }\n        //! Splitting constructor used to generate children.\n        /** parent_ becomes left child.  Newly constructed object is right child. */\n        start_deterministic_reduce( start_deterministic_reduce& parent_, finish_type& c ) :\n            my_body( c.my_right_body ),\n            my_range( parent_.my_range, split() )\n        {\n        }\n\npublic:\n        static void run( const Range& range, Body& body ) {\n            if( !range.empty() ) {\n#if !__TBB_TASK_GROUP_CONTEXT || TBB_JOIN_OUTER_TASK_GROUP\n                task::spawn_root_and_wait( *new(task::allocate_root()) start_deterministic_reduce(range,&body) );\n#else\n                // Bound context prevents exceptions from body to affect nesting or sibling algorithms,\n                // and allows users to handle exceptions safely by wrapping parallel_for in the try-block.\n                task_group_context context;\n                task::spawn_root_and_wait( *new(task::allocate_root(context)) start_deterministic_reduce(range,body) );\n#endif /* __TBB_TASK_GROUP_CONTEXT && !TBB_JOIN_OUTER_TASK_GROUP */\n            }\n        }\n#if __TBB_TASK_GROUP_CONTEXT\n        static void run( const Range& range, Body& body, task_group_context& context ) {\n            if( !range.empty() )\n                task::spawn_root_and_wait( *new(task::allocate_root(context)) start_deterministic_reduce(range,body) );\n        }\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n    };\n\n    template<typename Range, typename Body>\n    task* start_deterministic_reduce<Range,Body>::execute() {\n        if( !my_range.is_divisible() ) {\n            my_body( my_range );\n            return NULL;\n        } else {\n            finish_type& c = *new( allocate_continuation() ) finish_type( my_body );\n            recycle_as_child_of(c);\n            c.set_ref_count(2);\n            start_deterministic_reduce& b = *new( c.allocate_child() ) start_deterministic_reduce( *this, c );\n            task::spawn(b);\n            return this;\n        }\n    }\n} // namespace internal\n//! @endcond\n} //namespace interfaceX\n\n//! @cond INTERNAL\nnamespace internal {\n    using interface7::internal::start_reduce;\n    using interface7::internal::start_deterministic_reduce;\n    //! Auxiliary class for parallel_reduce; for internal use only.\n    /** The adaptor class that implements \\ref parallel_reduce_body_req \"parallel_reduce Body\"\n        using given \\ref parallel_reduce_lambda_req \"anonymous function objects\".\n     **/\n    /** @ingroup algorithms */\n    template<typename Range, typename Value, typename RealBody, typename Reduction>\n    class lambda_reduce_body {\n\n//FIXME: decide if my_real_body, my_reduction, and identity_element should be copied or referenced\n//       (might require some performance measurements)\n\n        const Value&     identity_element;\n        const RealBody&  my_real_body;\n        const Reduction& my_reduction;\n        Value            my_value;\n        lambda_reduce_body& operator= ( const lambda_reduce_body& other );\n    public:\n        lambda_reduce_body( const Value& identity, const RealBody& body, const Reduction& reduction )\n            : identity_element(identity)\n            , my_real_body(body)\n            , my_reduction(reduction)\n            , my_value(identity)\n        { }\n        lambda_reduce_body( const lambda_reduce_body& other )\n            : identity_element(other.identity_element)\n            , my_real_body(other.my_real_body)\n            , my_reduction(other.my_reduction)\n            , my_value(other.my_value)\n        { }\n        lambda_reduce_body( lambda_reduce_body& other, tbb::split )\n            : identity_element(other.identity_element)\n            , my_real_body(other.my_real_body)\n            , my_reduction(other.my_reduction)\n            , my_value(other.identity_element)\n        { }\n        void operator()(Range& range) {\n            my_value = my_real_body(range, const_cast<const Value&>(my_value));\n        }\n        void join( lambda_reduce_body& rhs ) {\n            my_value = my_reduction(const_cast<const Value&>(my_value), const_cast<const Value&>(rhs.my_value));\n        }\n        Value result() const {\n            return my_value;\n        }\n    };\n\n} // namespace internal\n//! @endcond\n\n// Requirements on Range concept are documented in blocked_range.h\n\n/** \\page parallel_reduce_body_req Requirements on parallel_reduce body\n    Class \\c Body implementing the concept of parallel_reduce body must define:\n    - \\code Body::Body( Body&, split ); \\endcode        Splitting constructor.\n                                                        Must be able to run concurrently with operator() and method \\c join\n    - \\code Body::~Body(); \\endcode                     Destructor\n    - \\code void Body::operator()( Range& r ); \\endcode Function call operator applying body to range \\c r\n                                                        and accumulating the result\n    - \\code void Body::join( Body& b ); \\endcode        Join results.\n                                                        The result in \\c b should be merged into the result of \\c this\n**/\n\n/** \\page parallel_reduce_lambda_req Requirements on parallel_reduce anonymous function objects (lambda functions)\n    TO BE DOCUMENTED\n**/\n\n/** \\name parallel_reduce\n    See also requirements on \\ref range_req \"Range\" and \\ref parallel_reduce_body_req \"parallel_reduce Body\". **/\n//@{\n\n//! Parallel iteration with reduction and default partitioner.\n/** @ingroup algorithms **/\ntemplate<typename Range, typename Body>\nvoid parallel_reduce( const Range& range, Body& body ) {\n    internal::start_reduce<Range,Body, const __TBB_DEFAULT_PARTITIONER>::run( range, body, __TBB_DEFAULT_PARTITIONER() );\n}\n\n//! Parallel iteration with reduction and simple_partitioner\n/** @ingroup algorithms **/\ntemplate<typename Range, typename Body>\nvoid parallel_reduce( const Range& range, Body& body, const simple_partitioner& partitioner ) {\n    internal::start_reduce<Range,Body,const simple_partitioner>::run( range, body, partitioner );\n}\n\n//! Parallel iteration with reduction and auto_partitioner\n/** @ingroup algorithms **/\ntemplate<typename Range, typename Body>\nvoid parallel_reduce( const Range& range, Body& body, const auto_partitioner& partitioner ) {\n    internal::start_reduce<Range,Body,const auto_partitioner>::run( range, body, partitioner );\n}\n\n//! Parallel iteration with reduction and affinity_partitioner\n/** @ingroup algorithms **/\ntemplate<typename Range, typename Body>\nvoid parallel_reduce( const Range& range, Body& body, affinity_partitioner& partitioner ) {\n    internal::start_reduce<Range,Body,affinity_partitioner>::run( range, body, partitioner );\n}\n\n#if __TBB_TASK_GROUP_CONTEXT\n//! Parallel iteration with reduction, simple partitioner and user-supplied context.\n/** @ingroup algorithms **/\ntemplate<typename Range, typename Body>\nvoid parallel_reduce( const Range& range, Body& body, const simple_partitioner& partitioner, task_group_context& context ) {\n    internal::start_reduce<Range,Body,const simple_partitioner>::run( range, body, partitioner, context );\n}\n\n//! Parallel iteration with reduction, auto_partitioner and user-supplied context\n/** @ingroup algorithms **/\ntemplate<typename Range, typename Body>\nvoid parallel_reduce( const Range& range, Body& body, const auto_partitioner& partitioner, task_group_context& context ) {\n    internal::start_reduce<Range,Body,const auto_partitioner>::run( range, body, partitioner, context );\n}\n\n//! Parallel iteration with reduction, affinity_partitioner and user-supplied context\n/** @ingroup algorithms **/\ntemplate<typename Range, typename Body>\nvoid parallel_reduce( const Range& range, Body& body, affinity_partitioner& partitioner, task_group_context& context ) {\n    internal::start_reduce<Range,Body,affinity_partitioner>::run( range, body, partitioner, context );\n}\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n/** parallel_reduce overloads that work with anonymous function objects\n    (see also \\ref parallel_reduce_lambda_req \"requirements on parallel_reduce anonymous function objects\"). **/\n\n//! Parallel iteration with reduction and default partitioner.\n/** @ingroup algorithms **/\ntemplate<typename Range, typename Value, typename RealBody, typename Reduction>\nValue parallel_reduce( const Range& range, const Value& identity, const RealBody& real_body, const Reduction& reduction ) {\n    internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);\n    internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,const __TBB_DEFAULT_PARTITIONER>\n                          ::run(range, body, __TBB_DEFAULT_PARTITIONER() );\n    return body.result();\n}\n\n//! Parallel iteration with reduction and simple_partitioner.\n/** @ingroup algorithms **/\ntemplate<typename Range, typename Value, typename RealBody, typename Reduction>\nValue parallel_reduce( const Range& range, const Value& identity, const RealBody& real_body, const Reduction& reduction,\n                       const simple_partitioner& partitioner ) {\n    internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);\n    internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,const simple_partitioner>\n                          ::run(range, body, partitioner );\n    return body.result();\n}\n\n//! Parallel iteration with reduction and auto_partitioner\n/** @ingroup algorithms **/\ntemplate<typename Range, typename Value, typename RealBody, typename Reduction>\nValue parallel_reduce( const Range& range, const Value& identity, const RealBody& real_body, const Reduction& reduction,\n                       const auto_partitioner& partitioner ) {\n    internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);\n    internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,const auto_partitioner>\n                          ::run( range, body, partitioner );\n    return body.result();\n}\n\n//! Parallel iteration with reduction and affinity_partitioner\n/** @ingroup algorithms **/\ntemplate<typename Range, typename Value, typename RealBody, typename Reduction>\nValue parallel_reduce( const Range& range, const Value& identity, const RealBody& real_body, const Reduction& reduction,\n                       affinity_partitioner& partitioner ) {\n    internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);\n    internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,affinity_partitioner>\n                                        ::run( range, body, partitioner );\n    return body.result();\n}\n\n#if __TBB_TASK_GROUP_CONTEXT\n//! Parallel iteration with reduction, simple partitioner and user-supplied context.\n/** @ingroup algorithms **/\ntemplate<typename Range, typename Value, typename RealBody, typename Reduction>\nValue parallel_reduce( const Range& range, const Value& identity, const RealBody& real_body, const Reduction& reduction,\n                       const simple_partitioner& partitioner, task_group_context& context ) {\n    internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);\n    internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,const simple_partitioner>\n                          ::run( range, body, partitioner, context );\n    return body.result();\n}\n\n//! Parallel iteration with reduction, auto_partitioner and user-supplied context\n/** @ingroup algorithms **/\ntemplate<typename Range, typename Value, typename RealBody, typename Reduction>\nValue parallel_reduce( const Range& range, const Value& identity, const RealBody& real_body, const Reduction& reduction,\n                       const auto_partitioner& partitioner, task_group_context& context ) {\n    internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);\n    internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,const auto_partitioner>\n                          ::run( range, body, partitioner, context );\n    return body.result();\n}\n\n//! Parallel iteration with reduction, affinity_partitioner and user-supplied context\n/** @ingroup algorithms **/\ntemplate<typename Range, typename Value, typename RealBody, typename Reduction>\nValue parallel_reduce( const Range& range, const Value& identity, const RealBody& real_body, const Reduction& reduction,\n                       affinity_partitioner& partitioner, task_group_context& context ) {\n    internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);\n    internal::start_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction>,affinity_partitioner>\n                                        ::run( range, body, partitioner, context );\n    return body.result();\n}\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n//! Parallel iteration with deterministic reduction and default partitioner.\n/** @ingroup algorithms **/\ntemplate<typename Range, typename Body>\nvoid parallel_deterministic_reduce( const Range& range, Body& body ) {\n    internal::start_deterministic_reduce<Range,Body>::run( range, body );\n}\n\n#if __TBB_TASK_GROUP_CONTEXT\n//! Parallel iteration with deterministic reduction, simple partitioner and user-supplied context.\n/** @ingroup algorithms **/\ntemplate<typename Range, typename Body>\nvoid parallel_deterministic_reduce( const Range& range, Body& body, task_group_context& context ) {\n    internal::start_deterministic_reduce<Range,Body>::run( range, body, context );\n}\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n/** parallel_reduce overloads that work with anonymous function objects\n    (see also \\ref parallel_reduce_lambda_req \"requirements on parallel_reduce anonymous function objects\"). **/\n\n//! Parallel iteration with deterministic reduction and default partitioner.\n/** @ingroup algorithms **/\ntemplate<typename Range, typename Value, typename RealBody, typename Reduction>\nValue parallel_deterministic_reduce( const Range& range, const Value& identity, const RealBody& real_body, const Reduction& reduction ) {\n    internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);\n    internal::start_deterministic_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction> >\n                          ::run(range, body);\n    return body.result();\n}\n\n#if __TBB_TASK_GROUP_CONTEXT\n//! Parallel iteration with deterministic reduction, simple partitioner and user-supplied context.\n/** @ingroup algorithms **/\ntemplate<typename Range, typename Value, typename RealBody, typename Reduction>\nValue parallel_deterministic_reduce( const Range& range, const Value& identity, const RealBody& real_body, const Reduction& reduction,\n                       task_group_context& context ) {\n    internal::lambda_reduce_body<Range,Value,RealBody,Reduction> body(identity, real_body, reduction);\n    internal::start_deterministic_reduce<Range,internal::lambda_reduce_body<Range,Value,RealBody,Reduction> >\n                          ::run( range, body, context );\n    return body.result();\n}\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n//@}\n\n} // namespace tbb\n\n#endif /* __TBB_parallel_reduce_H */\n"
  },
  {
    "path": "benchmarks/tbb/parallel_scan.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_parallel_scan_H\n#define __TBB_parallel_scan_H\n\n#include \"task.h\"\n#include \"aligned_space.h\"\n#include <new>\n#include \"partitioner.h\"\n\nnamespace tbb {\n\n//! Used to indicate that the initial scan is being performed.\n/** @ingroup algorithms */\nstruct pre_scan_tag {\n    static bool is_final_scan() {return false;}\n};\n\n//! Used to indicate that the final scan is being performed.\n/** @ingroup algorithms */\nstruct final_scan_tag {\n    static bool is_final_scan() {return true;}\n};\n\n//! @cond INTERNAL\nnamespace internal {\n\n    //! Performs final scan for a leaf \n    /** @ingroup algorithms */\n    template<typename Range, typename Body>\n    class final_sum: public task {\n    public:\n        Body my_body;\n    private:\n        aligned_space<Range> my_range;\n        //! Where to put result of last subrange, or NULL if not last subrange.\n        Body* my_stuff_last;\n    public:\n        final_sum( Body& body_ ) :\n            my_body(body_,split())\n        {\n            poison_pointer(my_stuff_last);\n        }\n        ~final_sum() {\n            my_range.begin()->~Range();\n        }     \n        void finish_construction( const Range& range_, Body* stuff_last_ ) {\n            new( my_range.begin() ) Range(range_);\n            my_stuff_last = stuff_last_;\n        }\n    private:\n        /*override*/ task* execute() {\n            my_body( *my_range.begin(), final_scan_tag() );\n            if( my_stuff_last )\n                my_stuff_last->assign(my_body);\n            return NULL;\n        }\n    };       \n\n    //! Split work to be done in the scan.\n    /** @ingroup algorithms */\n    template<typename Range, typename Body>\n    class sum_node: public task {\n        typedef final_sum<Range,Body> final_sum_type;\n    public:\n        final_sum_type *my_incoming; \n        final_sum_type *my_body;\n        Body *my_stuff_last;\n    private:\n        final_sum_type *my_left_sum;\n        sum_node *my_left;\n        sum_node *my_right;     \n        bool my_left_is_final;\n        Range my_range;\n        sum_node( const Range range_, bool left_is_final_ ) : \n            my_left_sum(NULL), \n            my_left(NULL), \n            my_right(NULL), \n            my_left_is_final(left_is_final_), \n            my_range(range_)\n        {\n            // Poison fields that will be set by second pass.\n            poison_pointer(my_body);\n            poison_pointer(my_incoming);\n        }\n        task* create_child( const Range& range_, final_sum_type& f, sum_node* n, final_sum_type* incoming_, Body* stuff_last_ ) {\n            if( !n ) {\n                f.recycle_as_child_of( *this );\n                f.finish_construction( range_, stuff_last_ );\n                return &f;\n            } else {\n                n->my_body = &f;\n                n->my_incoming = incoming_;\n                n->my_stuff_last = stuff_last_;\n                return n;\n            }\n        }\n        /*override*/ task* execute() {\n            if( my_body ) {\n                if( my_incoming )\n                    my_left_sum->my_body.reverse_join( my_incoming->my_body );\n                recycle_as_continuation();\n                sum_node& c = *this;\n                task* b = c.create_child(Range(my_range,split()),*my_left_sum,my_right,my_left_sum,my_stuff_last);\n                task* a = my_left_is_final ? NULL : c.create_child(my_range,*my_body,my_left,my_incoming,NULL);\n                set_ref_count( (a!=NULL)+(b!=NULL) );\n                my_body = NULL; \n                if( a ) spawn(*b);\n                else a = b;\n                return a;\n            } else {\n                return NULL;\n            }\n        }\n        template<typename Range_,typename Body_,typename Partitioner_>\n        friend class start_scan;\n\n        template<typename Range_,typename Body_>\n        friend class finish_scan;\n    };\n\n    //! Combine partial results\n    /** @ingroup algorithms */\n    template<typename Range, typename Body>\n    class finish_scan: public task {\n        typedef sum_node<Range,Body> sum_node_type;\n        typedef final_sum<Range,Body> final_sum_type;\n        final_sum_type** const my_sum;\n        sum_node_type*& my_return_slot;\n    public:\n        final_sum_type* my_right_zombie;\n        sum_node_type& my_result;\n\n        /*override*/ task* execute() {\n            __TBB_ASSERT( my_result.ref_count()==(my_result.my_left!=NULL)+(my_result.my_right!=NULL), NULL );\n            if( my_result.my_left )\n                my_result.my_left_is_final = false;\n            if( my_right_zombie && my_sum ) \n                ((*my_sum)->my_body).reverse_join(my_result.my_left_sum->my_body);\n            __TBB_ASSERT( !my_return_slot, NULL );\n            if( my_right_zombie || my_result.my_right ) {\n                my_return_slot = &my_result;\n            } else {\n                destroy( my_result );\n            }\n            if( my_right_zombie && !my_sum && !my_result.my_right ) {\n                destroy(*my_right_zombie);\n                my_right_zombie = NULL;\n            }\n            return NULL;\n        }\n\n        finish_scan( sum_node_type*& return_slot_, final_sum_type** sum_, sum_node_type& result_ ) : \n            my_sum(sum_),\n            my_return_slot(return_slot_), \n            my_right_zombie(NULL),\n            my_result(result_)\n        {\n            __TBB_ASSERT( !my_return_slot, NULL );\n        }\n    };\n\n    //! Initial task to split the work\n    /** @ingroup algorithms */\n    template<typename Range, typename Body, typename Partitioner=simple_partitioner>\n    class start_scan: public task {\n        typedef sum_node<Range,Body> sum_node_type;\n        typedef final_sum<Range,Body> final_sum_type;\n        final_sum_type* my_body;\n        /** Non-null if caller is requesting total. */\n        final_sum_type** my_sum; \n        sum_node_type** my_return_slot;\n        /** Null if computing root. */\n        sum_node_type* my_parent_sum;\n        bool my_is_final;\n        bool my_is_right_child;\n        Range my_range;\n        typename Partitioner::partition_type my_partition;\n        /*override*/ task* execute();\n    public:\n        start_scan( sum_node_type*& return_slot_, start_scan& parent_, sum_node_type* parent_sum_ ) :\n            my_body(parent_.my_body),\n            my_sum(parent_.my_sum),\n            my_return_slot(&return_slot_),\n            my_parent_sum(parent_sum_),\n            my_is_final(parent_.my_is_final),\n            my_is_right_child(false),\n            my_range(parent_.my_range,split()),\n            my_partition(parent_.my_partition,split())\n        {\n            __TBB_ASSERT( !*my_return_slot, NULL );\n        }\n\n        start_scan( sum_node_type*& return_slot_, const Range& range_, final_sum_type& body_, const Partitioner& partitioner_) :\n            my_body(&body_),\n            my_sum(NULL),\n            my_return_slot(&return_slot_),\n            my_parent_sum(NULL),\n            my_is_final(true),\n            my_is_right_child(false),\n            my_range(range_),\n            my_partition(partitioner_)\n        {\n            __TBB_ASSERT( !*my_return_slot, NULL );\n        }\n\n        static void run( const Range& range_, Body& body_, const Partitioner& partitioner_ ) {\n            if( !range_.empty() ) {\n                typedef internal::start_scan<Range,Body,Partitioner> start_pass1_type;\n                internal::sum_node<Range,Body>* root = NULL;\n                typedef internal::final_sum<Range,Body> final_sum_type;\n                final_sum_type* temp_body = new(task::allocate_root()) final_sum_type( body_ );\n                start_pass1_type& pass1 = *new(task::allocate_root()) start_pass1_type(\n                    /*my_return_slot=*/root,\n                    range_,\n                    *temp_body,\n                    partitioner_ );\n                task::spawn_root_and_wait( pass1 );\n                if( root ) {\n                    root->my_body = temp_body;\n                    root->my_incoming = NULL;\n                    root->my_stuff_last = &body_;\n                    task::spawn_root_and_wait( *root );\n                } else {\n                    body_.assign(temp_body->my_body);\n                    temp_body->finish_construction( range_, NULL );\n                    temp_body->destroy(*temp_body);\n                }\n            }\n        }\n    };\n\n    template<typename Range, typename Body, typename Partitioner>\n    task* start_scan<Range,Body,Partitioner>::execute() {\n        typedef internal::finish_scan<Range,Body> finish_pass1_type;\n        finish_pass1_type* p = my_parent_sum ? static_cast<finish_pass1_type*>( parent() ) : NULL;\n        // Inspecting p->result.left_sum would ordinarily be a race condition.\n        // But we inspect it only if we are not a stolen task, in which case we\n        // know that task assigning to p->result.left_sum has completed.\n        bool treat_as_stolen = my_is_right_child && (is_stolen_task() || my_body!=p->my_result.my_left_sum);\n        if( treat_as_stolen ) {\n            // Invocation is for right child that has been really stolen or needs to be virtually stolen\n            p->my_right_zombie = my_body = new( allocate_root() ) final_sum_type(my_body->my_body);\n            my_is_final = false;\n        }\n        task* next_task = NULL;\n        if( (my_is_right_child && !treat_as_stolen) || !my_range.is_divisible() || my_partition.should_execute_range(*this) ) {\n            if( my_is_final )\n                (my_body->my_body)( my_range, final_scan_tag() );\n            else if( my_sum )\n                (my_body->my_body)( my_range, pre_scan_tag() );\n            if( my_sum ) \n                *my_sum = my_body;\n            __TBB_ASSERT( !*my_return_slot, NULL );\n        } else {\n            sum_node_type* result;\n            if( my_parent_sum ) \n                result = new(allocate_additional_child_of(*my_parent_sum)) sum_node_type(my_range,/*my_left_is_final=*/my_is_final);\n            else\n                result = new(task::allocate_root()) sum_node_type(my_range,/*my_left_is_final=*/my_is_final);\n            finish_pass1_type& c = *new( allocate_continuation()) finish_pass1_type(*my_return_slot,my_sum,*result);\n            // Split off right child\n            start_scan& b = *new( c.allocate_child() ) start_scan( /*my_return_slot=*/result->my_right, *this, result );\n            b.my_is_right_child = true;    \n            // Left child is recycling of *this.  Must recycle this before spawning b, \n            // otherwise b might complete and decrement c.ref_count() to zero, which\n            // would cause c.execute() to run prematurely.\n            recycle_as_child_of(c);\n            c.set_ref_count(2);\n            c.spawn(b);\n            my_sum = &result->my_left_sum;\n            my_return_slot = &result->my_left;\n            my_is_right_child = false;\n            next_task = this;\n            my_parent_sum = result; \n            __TBB_ASSERT( !*my_return_slot, NULL );\n        }\n        return next_task;\n    } \n} // namespace internal\n//! @endcond\n\n// Requirements on Range concept are documented in blocked_range.h\n\n/** \\page parallel_scan_body_req Requirements on parallel_scan body\n    Class \\c Body implementing the concept of parallel_scan body must define:\n    - \\code Body::Body( Body&, split ); \\endcode    Splitting constructor.\n                                                    Split \\c b so that \\c this and \\c b can accumulate separately\n    - \\code Body::~Body(); \\endcode                 Destructor\n    - \\code void Body::operator()( const Range& r, pre_scan_tag ); \\endcode\n                                                    Preprocess iterations for range \\c r\n    - \\code void Body::operator()( const Range& r, final_scan_tag ); \\endcode \n                                                    Do final processing for iterations of range \\c r\n    - \\code void Body::reverse_join( Body& a ); \\endcode\n                                                    Merge preprocessing state of \\c a into \\c this, where \\c a was \n                                                    created earlier from \\c b by b's splitting constructor\n**/\n\n/** \\name parallel_scan\n    See also requirements on \\ref range_req \"Range\" and \\ref parallel_scan_body_req \"parallel_scan Body\". **/\n//@{\n\n//! Parallel prefix with default partitioner\n/** @ingroup algorithms **/\ntemplate<typename Range, typename Body>\nvoid parallel_scan( const Range& range, Body& body ) {\n    internal::start_scan<Range,Body,__TBB_DEFAULT_PARTITIONER>::run(range,body,__TBB_DEFAULT_PARTITIONER());\n}\n\n//! Parallel prefix with simple_partitioner\n/** @ingroup algorithms **/\ntemplate<typename Range, typename Body>\nvoid parallel_scan( const Range& range, Body& body, const simple_partitioner& partitioner ) {\n    internal::start_scan<Range,Body,simple_partitioner>::run(range,body,partitioner);\n}\n\n//! Parallel prefix with auto_partitioner\n/** @ingroup algorithms **/\ntemplate<typename Range, typename Body>\nvoid parallel_scan( const Range& range, Body& body, const auto_partitioner& partitioner ) {\n    internal::start_scan<Range,Body,auto_partitioner>::run(range,body,partitioner);\n}\n//@}\n\n} // namespace tbb\n\n#endif /* __TBB_parallel_scan_H */\n\n"
  },
  {
    "path": "benchmarks/tbb/parallel_sort.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_parallel_sort_H\n#define __TBB_parallel_sort_H\n\n#include \"parallel_for.h\"\n#include \"blocked_range.h\"\n#include \"internal/_range_iterator.h\"\n#include <algorithm>\n#include <iterator>\n#include <functional>\n\nnamespace tbb {\n\n//! @cond INTERNAL\nnamespace internal {\n\n//! Range used in quicksort to split elements into subranges based on a value.\n/** The split operation selects a splitter and places all elements less than or equal \n    to the value in the first range and the remaining elements in the second range.\n    @ingroup algorithms */\ntemplate<typename RandomAccessIterator, typename Compare>\nclass quick_sort_range: private no_assign {\n\n    inline size_t median_of_three(const RandomAccessIterator &array, size_t l, size_t m, size_t r) const {\n        return comp(array[l], array[m]) ? ( comp(array[m], array[r]) ? m : ( comp( array[l], array[r]) ? r : l ) ) \n                                        : ( comp(array[r], array[m]) ? m : ( comp( array[r], array[l] ) ? r : l ) );\n    }\n\n    inline size_t pseudo_median_of_nine( const RandomAccessIterator &array, const quick_sort_range &range ) const {\n        size_t offset = range.size/8u;\n        return median_of_three(array, \n                               median_of_three(array, 0, offset, offset*2),\n                               median_of_three(array, offset*3, offset*4, offset*5),\n                               median_of_three(array, offset*6, offset*7, range.size - 1) );\n\n    }\n\npublic:\n\n    static const size_t grainsize = 500;\n    const Compare &comp;\n    RandomAccessIterator begin;\n    size_t size;\n\n    quick_sort_range( RandomAccessIterator begin_, size_t size_, const Compare &comp_ ) :\n        comp(comp_), begin(begin_), size(size_) {}\n\n    bool empty() const {return size==0;}\n    bool is_divisible() const {return size>=grainsize;}\n\n    quick_sort_range( quick_sort_range& range, split ) : comp(range.comp) {\n        using std::swap;\n        RandomAccessIterator array = range.begin;\n        RandomAccessIterator key0 = range.begin; \n        size_t m = pseudo_median_of_nine(array, range);\n        if (m) swap ( array[0], array[m] );\n\n        size_t i=0;\n        size_t j=range.size;\n        // Partition interval [i+1,j-1] with key *key0.\n        for(;;) {\n            __TBB_ASSERT( i<j, NULL );\n            // Loop must terminate since array[l]==*key0.\n            do {\n                --j;\n                __TBB_ASSERT( i<=j, \"bad ordering relation?\" );\n            } while( comp( *key0, array[j] ));\n            do {\n                __TBB_ASSERT( i<=j, NULL );\n                if( i==j ) goto partition;\n                ++i;\n            } while( comp( array[i],*key0 ));\n            if( i==j ) goto partition;\n            swap( array[i], array[j] );\n        }\npartition:\n        // Put the partition key were it belongs\n        swap( array[j], *key0 );\n        // array[l..j) is less or equal to key.\n        // array(j..r) is greater or equal to key.\n        // array[j] is equal to key\n        i=j+1;\n        begin = array+i;\n        size = range.size-i;\n        range.size = j;\n    }\n};\n\n#if __TBB_TASK_GROUP_CONTEXT\n//! Body class used to test if elements in a range are presorted\n/** @ingroup algorithms */\ntemplate<typename RandomAccessIterator, typename Compare>\nclass quick_sort_pretest_body : internal::no_assign {\n    const Compare &comp;\n\npublic:\n    quick_sort_pretest_body(const Compare &_comp) : comp(_comp) {}\n\n    void operator()( const blocked_range<RandomAccessIterator>& range ) const {\n        task &my_task = task::self();\n        RandomAccessIterator my_end = range.end();\n\n        int i = 0;\n        for (RandomAccessIterator k = range.begin(); k != my_end; ++k, ++i) {\n            if ( i%64 == 0 && my_task.is_cancelled() ) break;\n          \n            // The k-1 is never out-of-range because the first chunk starts at begin+serial_cutoff+1\n            if ( comp( *(k), *(k-1) ) ) {\n                my_task.cancel_group_execution();\n                break;\n            }\n        }\n    }\n\n};\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n//! Body class used to sort elements in a range that is smaller than the grainsize.\n/** @ingroup algorithms */\ntemplate<typename RandomAccessIterator, typename Compare>\nstruct quick_sort_body {\n    void operator()( const quick_sort_range<RandomAccessIterator,Compare>& range ) const {\n        //SerialQuickSort( range.begin, range.size, range.comp );\n        std::sort( range.begin, range.begin + range.size, range.comp );\n    }\n};\n\n//! Wrapper method to initiate the sort by calling parallel_for.\n/** @ingroup algorithms */\ntemplate<typename RandomAccessIterator, typename Compare>\nvoid parallel_quick_sort( RandomAccessIterator begin, RandomAccessIterator end, const Compare& comp ) {\n#if __TBB_TASK_GROUP_CONTEXT\n    task_group_context my_context;\n    const int serial_cutoff = 9;\n\n    __TBB_ASSERT( begin + serial_cutoff < end, \"min_parallel_size is smaller than serial cutoff?\" );\n    RandomAccessIterator k;\n    for ( k = begin ; k != begin + serial_cutoff; ++k ) {\n        if ( comp( *(k+1), *k ) ) {\n            goto do_parallel_quick_sort;\n        }\n    }\n\n    parallel_for( blocked_range<RandomAccessIterator>(k+1, end),\n                  quick_sort_pretest_body<RandomAccessIterator,Compare>(comp),\n                  auto_partitioner(),\n                  my_context);\n\n    if (my_context.is_group_execution_cancelled())\ndo_parallel_quick_sort:\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n        parallel_for( quick_sort_range<RandomAccessIterator,Compare>(begin, end-begin, comp ), \n                      quick_sort_body<RandomAccessIterator,Compare>(),\n                      auto_partitioner() );\n}\n\n} // namespace internal\n//! @endcond\n\n/** \\page parallel_sort_iter_req Requirements on iterators for parallel_sort\n    Requirements on value type \\c T of \\c RandomAccessIterator for \\c parallel_sort:\n    - \\code void swap( T& x, T& y ) \\endcode        Swaps \\c x and \\c y\n    - \\code bool Compare::operator()( const T& x, const T& y ) \\endcode\n                                                    True if x comes before y;\n**/\n\n/** \\name parallel_sort\n    See also requirements on \\ref parallel_sort_iter_req \"iterators for parallel_sort\". **/\n//@{\n\n//! Sorts the data in [begin,end) using the given comparator \n/** The compare function object is used for all comparisons between elements during sorting.\n    The compare object must define a bool operator() function.\n    @ingroup algorithms **/\ntemplate<typename RandomAccessIterator, typename Compare>\nvoid parallel_sort( RandomAccessIterator begin, RandomAccessIterator end, const Compare& comp) { \n    const int min_parallel_size = 500; \n    if( end > begin ) {\n        if (end - begin < min_parallel_size) { \n            std::sort(begin, end, comp);\n        } else {\n            internal::parallel_quick_sort(begin, end, comp);\n        }\n    }\n}\n\n//! Sorts the data in [begin,end) with a default comparator \\c std::less<RandomAccessIterator>\n/** @ingroup algorithms **/\ntemplate<typename RandomAccessIterator>\ninline void parallel_sort( RandomAccessIterator begin, RandomAccessIterator end ) { \n    parallel_sort( begin, end, std::less< typename std::iterator_traits<RandomAccessIterator>::value_type >() );\n}\n\n//! Sorts the data in rng using the given comparator\n/** @ingroup algorithms **/\ntemplate<typename Range, typename Compare>\nvoid parallel_sort(Range& rng, const Compare& comp) {\n    parallel_sort(tbb::internal::first(rng), tbb::internal::last(rng), comp);\n}\n\n//! Sorts the data in const rng using the given comparator\n/** @ingroup algorithms **/\ntemplate<typename Range, typename Compare>\nvoid parallel_sort(const Range& rng, const Compare& comp) {\n    parallel_sort(tbb::internal::first(rng), tbb::internal::last(rng), comp);\n}\n\n//! Sorts the data in rng with a default comparator \\c std::less<RandomAccessIterator>\n/** @ingroup algorithms **/\ntemplate<typename Range>\nvoid parallel_sort(Range& rng) {\n    parallel_sort(tbb::internal::first(rng), tbb::internal::last(rng));\n}\n\n//! Sorts the data in const rng with a default comparator \\c std::less<RandomAccessIterator>\n/** @ingroup algorithms **/\ntemplate<typename Range>\nvoid parallel_sort(const Range& rng) {\n    parallel_sort(tbb::internal::first(rng), tbb::internal::last(rng));\n}\n\n//! Sorts the data in the range \\c [begin,end) with a default comparator \\c std::less<T>\n/** @ingroup algorithms **/\ntemplate<typename T>\ninline void parallel_sort( T * begin, T * end ) {\n    parallel_sort( begin, end, std::less< T >() );\n}   \n//@}\n\n\n} // namespace tbb\n\n#endif\n\n"
  },
  {
    "path": "benchmarks/tbb/parallel_while.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_parallel_while\n#define __TBB_parallel_while\n\n#include \"task.h\"\n#include <new>\n\nnamespace tbb {\n\ntemplate<typename Body>\nclass parallel_while;\n\n//! @cond INTERNAL\nnamespace internal {\n\n    template<typename Stream, typename Body> class while_task;\n\n    //! For internal use only.\n    /** Executes one iteration of a while.\n        @ingroup algorithms */\n    template<typename Body>\n    class while_iteration_task: public task {\n        const Body& my_body;\n        typename Body::argument_type my_value;\n        /*override*/ task* execute() {\n            my_body(my_value); \n            return NULL;\n        }\n        while_iteration_task( const typename Body::argument_type& value, const Body& body ) : \n            my_body(body), my_value(value)\n        {}\n        template<typename Body_> friend class while_group_task;\n        friend class tbb::parallel_while<Body>;\n    };\n\n    //! For internal use only\n    /** Unpacks a block of iterations.\n        @ingroup algorithms */\n    template<typename Body>\n    class while_group_task: public task {\n        static const size_t max_arg_size = 4;         \n        const Body& my_body;\n        size_t size;\n        typename Body::argument_type my_arg[max_arg_size];\n        while_group_task( const Body& body ) : my_body(body), size(0) {} \n        /*override*/ task* execute() {\n            typedef while_iteration_task<Body> iteration_type;\n            __TBB_ASSERT( size>0, NULL );\n            task_list list;\n            task* t; \n            size_t k=0; \n            for(;;) {\n                t = new( allocate_child() ) iteration_type(my_arg[k],my_body); \n                if( ++k==size ) break;\n                list.push_back(*t);\n            }\n            set_ref_count(int(k+1));\n            spawn(list);\n            spawn_and_wait_for_all(*t);\n            return NULL;\n        }\n        template<typename Stream, typename Body_> friend class while_task;\n    };\n    \n    //! For internal use only.\n    /** Gets block of iterations from a stream and packages them into a while_group_task.\n        @ingroup algorithms */\n    template<typename Stream, typename Body>\n    class while_task: public task {\n        Stream& my_stream;\n        const Body& my_body;\n        empty_task& my_barrier;\n        /*override*/ task* execute() {\n            typedef while_group_task<Body> block_type;\n            block_type& t = *new( allocate_additional_child_of(my_barrier) ) block_type(my_body);\n            size_t k=0; \n            while( my_stream.pop_if_present(t.my_arg[k]) ) {\n                if( ++k==block_type::max_arg_size ) {\n                    // There might be more iterations.\n                    recycle_to_reexecute();\n                    break;\n                }\n            }\n            if( k==0 ) {\n                destroy(t);\n                return NULL;\n            } else {\n                t.size = k;\n                return &t;\n            }\n        }\n        while_task( Stream& stream, const Body& body, empty_task& barrier ) : \n            my_stream(stream),\n            my_body(body),\n            my_barrier(barrier)\n        {} \n        friend class tbb::parallel_while<Body>;\n    };\n\n} // namespace internal\n//! @endcond\n\n//! Parallel iteration over a stream, with optional addition of more work.\n/** The Body b has the requirement: \\n\n        \"b(v)\"                      \\n\n        \"b.argument_type\"           \\n\n    where v is an argument_type\n    @ingroup algorithms */\ntemplate<typename Body>\nclass parallel_while: internal::no_copy {\npublic:\n    //! Construct empty non-running parallel while.\n    parallel_while() : my_body(NULL), my_barrier(NULL) {}\n\n    //! Destructor cleans up data members before returning.\n    ~parallel_while() {\n        if( my_barrier ) {\n            my_barrier->destroy(*my_barrier);    \n            my_barrier = NULL;\n        }\n    }\n\n    //! Type of items\n    typedef typename Body::argument_type value_type;\n\n    //! Apply body.apply to each item in the stream.\n    /** A Stream s has the requirements \\n\n         \"S::value_type\"                \\n\n         \"s.pop_if_present(value) is convertible to bool */\n    template<typename Stream>\n    void run( Stream& stream, const Body& body );\n\n    //! Add a work item while running.\n    /** Should be executed only by body.apply or a thread spawned therefrom. */\n    void add( const value_type& item );\n\nprivate:\n    const Body* my_body;\n    empty_task* my_barrier;\n};\n\ntemplate<typename Body>\ntemplate<typename Stream>\nvoid parallel_while<Body>::run( Stream& stream, const Body& body ) {\n    using namespace internal;\n    empty_task& barrier = *new( task::allocate_root() ) empty_task();\n    my_body = &body;\n    my_barrier = &barrier;\n    my_barrier->set_ref_count(2);\n    while_task<Stream,Body>& w = *new( my_barrier->allocate_child() ) while_task<Stream,Body>( stream, body, barrier );\n    my_barrier->spawn_and_wait_for_all(w);\n    my_barrier->destroy(*my_barrier);\n    my_barrier = NULL;\n    my_body = NULL;\n}\n\ntemplate<typename Body>\nvoid parallel_while<Body>::add( const value_type& item ) {\n    __TBB_ASSERT(my_barrier,\"attempt to add to parallel_while that is not running\");\n    typedef internal::while_iteration_task<Body> iteration_type;\n    iteration_type& i = *new( task::allocate_additional_child_of(*my_barrier) ) iteration_type(item,*my_body);\n    task::self().spawn( i );\n}\n\n} // namespace \n\n#endif /* __TBB_parallel_while */\n"
  },
  {
    "path": "benchmarks/tbb/partitioner.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_partitioner_H\n#define __TBB_partitioner_H\n\n#ifndef __TBB_INITIAL_CHUNKS\n// initial task divisions per thread\n#define __TBB_INITIAL_CHUNKS 2\n#endif\n#ifndef __TBB_RANGE_POOL_CAPACITY\n// maximum number of elements in range pool\n#define __TBB_RANGE_POOL_CAPACITY 8\n#endif\n#ifndef __TBB_INIT_DEPTH\n// initial value for depth of range pool\n#define __TBB_INIT_DEPTH 5\n#endif\n#ifndef __TBB_DEMAND_DEPTH_ADD\n// when imbalance is found range splits this value times more\n#define __TBB_DEMAND_DEPTH_ADD 2\n#endif\n#ifndef __TBB_STATIC_THRESHOLD\n// necessary number of clocks for the work to be distributed among all tasks\n#define __TBB_STATIC_THRESHOLD 40000\n#endif\n#if __TBB_DEFINE_MIC\n#define __TBB_NONUNIFORM_TASK_CREATION 1\n#ifdef __TBB_machine_time_stamp\n#define __TBB_USE_MACHINE_TIME_STAMPS 1\n#define __TBB_task_duration() __TBB_STATIC_THRESHOLD\n#endif // __TBB_machine_time_stamp\n#endif // __TBB_DEFINE_MIC\n\n#include \"task.h\"\n#include \"aligned_space.h\"\n#include \"atomic.h\"\n\n#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)\n    // Workaround for overzealous compiler warnings\n    #pragma warning (push)\n    #pragma warning (disable: 4244)\n#endif\n\nnamespace tbb {\n\nclass auto_partitioner;\nclass simple_partitioner;\nclass affinity_partitioner;\nnamespace interface7 {\n    namespace internal {\n        class affinity_partition_type;\n    }\n}\n\nnamespace internal { //< @cond INTERNAL\nsize_t __TBB_EXPORTED_FUNC get_initial_auto_partitioner_divisor();\n\n//! Defines entry point for affinity partitioner into tbb run-time library.\nclass affinity_partitioner_base_v3: no_copy {\n    friend class tbb::affinity_partitioner;\n    friend class tbb::interface7::internal::affinity_partition_type;\n    //! Array that remembers affinities of tree positions to affinity_id.\n    /** NULL if my_size==0. */\n    affinity_id* my_array;\n    //! Number of elements in my_array.\n    size_t my_size;\n    //! Zeros the fields.\n    affinity_partitioner_base_v3() : my_array(NULL), my_size(0) {}\n    //! Deallocates my_array.\n    ~affinity_partitioner_base_v3() {resize(0);}\n    //! Resize my_array.\n    /** Retains values if resulting size is the same. */\n    void __TBB_EXPORTED_METHOD resize( unsigned factor );\n};\n\n//! Provides backward-compatible methods for partition objects without affinity.\nclass partition_type_base {\npublic:\n    void set_affinity( task & ) {}\n    void note_affinity( task::affinity_id ) {}\n    task* continue_after_execute_range() {return NULL;}\n    bool decide_whether_to_delay() {return false;}\n    void spawn_or_delay( bool, task& b ) {\n        task::spawn(b);\n    }\n};\n\ntemplate<typename Range, typename Body, typename Partitioner> class start_scan;\n\n} //< namespace internal @endcond\n\nnamespace serial {\nnamespace interface7 {\ntemplate<typename Range, typename Body, typename Partitioner> class start_for;\n}\n}\n\nnamespace interface7 {\n//! @cond INTERNAL\nnamespace internal {\nusing namespace tbb::internal;\ntemplate<typename Range, typename Body, typename Partitioner> class start_for;\ntemplate<typename Range, typename Body, typename Partitioner> class start_reduce;\n\n//! Join task node that contains shared flag for stealing feedback\nclass flag_task: public task {\npublic:\n    tbb::atomic<bool> my_child_stolen;\n    flag_task() { my_child_stolen = false; }\n    task* execute() { return NULL; }\n    static void mark_task_stolen(task &t) {\n        tbb::atomic<bool> &flag = static_cast<flag_task*>(t.parent())->my_child_stolen;\n#if TBB_USE_THREADING_TOOLS\n        // Threading tools respect lock prefix but report false-positive data-race via plain store\n        flag.fetch_and_store<release>(true);\n#else\n        flag = true;\n#endif //TBB_USE_THREADING_TOOLS\n    }\n    static bool is_peer_stolen(task &t) {\n        return static_cast<flag_task*>(t.parent())->my_child_stolen;\n    }\n};\n\n//! Depth is a relative depth of recursive division inside a range pool. Relative depth allows\n//! infinite absolute depth of the recursion for heavily unbalanced workloads with range represented\n//! by a number that cannot fit into machine word.\ntypedef unsigned char depth_t;\n\n//! Range pool stores ranges of type T in a circular buffer with MaxCapacity\ntemplate <typename T, depth_t MaxCapacity>\nclass range_vector {\n    depth_t my_head;\n    depth_t my_tail;\n    depth_t my_size;\n    depth_t my_depth[MaxCapacity]; // relative depths of stored ranges\n    tbb::aligned_space<T, MaxCapacity> my_pool;\n\npublic:\n    //! initialize via first range in pool\n    range_vector(const T& elem) : my_head(0), my_tail(0), my_size(1) {\n        my_depth[0] = 0;\n        new( static_cast<void *>(my_pool.begin()) ) T(elem);//TODO: std::move?\n    }\n    ~range_vector() {\n        while( !empty() ) pop_back();\n    }\n    bool empty() const { return my_size == 0; }\n    depth_t size() const { return my_size; }\n    //! Populates range pool via ranges up to max depth or while divisible\n    //! max_depth starts from 0, e.g. value 2 makes 3 ranges in the pool up to two 1/4 pieces\n    void split_to_fill(depth_t max_depth) {\n        while( my_size < MaxCapacity && is_divisible(max_depth) ) {\n            depth_t prev = my_head;\n            my_head = (my_head + 1) % MaxCapacity;\n            new(my_pool.begin()+my_head) T(my_pool.begin()[prev]); // copy TODO: std::move?\n            my_pool.begin()[prev].~T(); // instead of assignment\n            new(my_pool.begin()+prev) T(my_pool.begin()[my_head], split()); // do 'inverse' split\n            my_depth[my_head] = ++my_depth[prev];\n            my_size++;\n        }\n    }\n    void pop_back() {\n        __TBB_ASSERT(my_size > 0, \"range_vector::pop_back() with empty size\");\n        my_pool.begin()[my_head].~T();\n        my_size--;\n        my_head = (my_head + MaxCapacity - 1) % MaxCapacity;\n    }\n    void pop_front() {\n        __TBB_ASSERT(my_size > 0, \"range_vector::pop_front() with empty size\");\n        my_pool.begin()[my_tail].~T();\n        my_size--;\n        my_tail = (my_tail + 1) % MaxCapacity;\n    }\n    T& back() {\n        __TBB_ASSERT(my_size > 0, \"range_vector::back() with empty size\");\n        return my_pool.begin()[my_head];\n    }\n    T& front() {\n        __TBB_ASSERT(my_size > 0, \"range_vector::front() with empty size\");\n        return my_pool.begin()[my_tail];\n    }\n    //! similarly to front(), returns depth of the first range in the pool\n    depth_t front_depth() {\n        __TBB_ASSERT(my_size > 0, \"range_vector::front_depth() with empty size\");\n        return my_depth[my_tail];\n    }\n    depth_t back_depth() {\n        __TBB_ASSERT(my_size > 0, \"range_vector::back_depth() with empty size\");\n        return my_depth[my_head];\n    }\n    bool is_divisible(depth_t max_depth) {\n        return back_depth() < max_depth && back().is_divisible();\n    }\n};\n\n//! Provides default methods for partition objects and common algorithm blocks.\ntemplate <typename Partition>\nstruct partition_type_base {\n    typedef split split_type;\n    // decision makers\n    void set_affinity( task & ) {}\n    void note_affinity( task::affinity_id ) {}\n    bool check_being_stolen(task &) { return false; } // part of old should_execute_range()\n    bool check_for_demand(task &) { return false; }\n    bool is_divisible() { return true; } // part of old should_execute_range()\n    depth_t max_depth() { return 0; }\n    void align_depth(depth_t) { }\n    template <typename Range> split_type get_split() { return split(); }\n\n    // common function blocks\n    Partition& self() { return *static_cast<Partition*>(this); } // CRTP helper\n    template<typename StartType, typename Range>\n    void execute(StartType &start, Range &range) {\n        // The algorithm in a few words ([]-denotes calls to decision methods of partitioner):\n        // [If this task is stolen, adjust depth and divisions if necessary, set flag].\n        // If range is divisible {\n        //    Spread the work while [initial divisions left];\n        //    Create trap task [if necessary];\n        // }\n        // If not divisible or [max depth is reached], execute, else do the range pool part\n        if ( range.is_divisible() ) {\n            if ( self().is_divisible() ) {\n                do { // split until is divisible\n                    typename Partition::split_type split_obj = self().template get_split<Range>();\n                    start.offer_work( split_obj );\n                } while ( range.is_divisible() && self().is_divisible() );\n            }\n        }\n        if( !range.is_divisible() || !self().max_depth() )\n            start.run_body( range ); // simple partitioner goes always here\n        else { // do range pool\n            internal::range_vector<Range, Partition::range_pool_size> range_pool(range);\n            do {\n                range_pool.split_to_fill(self().max_depth()); // fill range pool\n                if( self().check_for_demand( start ) ) {\n                    if( range_pool.size() > 1 ) {\n                        start.offer_work( range_pool.front(), range_pool.front_depth() );\n                        range_pool.pop_front();\n                        continue;\n                    }\n                    if( range_pool.is_divisible(self().max_depth()) ) // was not enough depth to fork a task\n                        continue; // note: next split_to_fill() should split range at least once\n                }\n                start.run_body( range_pool.back() );\n                range_pool.pop_back();\n            } while( !range_pool.empty() && !start.is_cancelled() );\n        }\n    }\n};\n\n//! Provides default methods for auto (adaptive) partition objects.\ntemplate <typename Partition>\nstruct adaptive_partition_type_base : partition_type_base<Partition> {\n    size_t my_divisor;\n    depth_t my_max_depth;\n    adaptive_partition_type_base() : my_max_depth(__TBB_INIT_DEPTH) {\n        my_divisor = tbb::internal::get_initial_auto_partitioner_divisor() / 4;\n        __TBB_ASSERT(my_divisor, \"initial value of get_initial_auto_partitioner_divisor() is not valid\");\n    }\n    adaptive_partition_type_base(adaptive_partition_type_base &src, split) {\n        my_max_depth = src.my_max_depth;\n#if TBB_USE_ASSERT\n        size_t old_divisor = src.my_divisor;\n#endif\n\n#if __TBB_INITIAL_TASK_IMBALANCE\n        if( src.my_divisor <= 1 ) my_divisor = 0;\n        else my_divisor = src.my_divisor = (src.my_divisor + 1u) / 2u;\n#else\n        my_divisor = src.my_divisor / 2u;\n        src.my_divisor = src.my_divisor - my_divisor; // TODO: check the effect separately\n        if (my_divisor) src.my_max_depth += static_cast<depth_t>(__TBB_Log2(src.my_divisor / my_divisor));\n#endif\n        // For affinity_partitioner, my_divisor indicates the number of affinity array indices the task reserves.\n        // A task which has only one index must produce the right split without reserved index in order to avoid\n        // it to be overwritten in note_affinity() of the created (right) task.\n        // I.e. a task created deeper than the affinity array can remember must not save its affinity (LIFO order)\n        __TBB_ASSERT( (old_divisor <= 1 && my_divisor == 0) ||\n                      (old_divisor > 1 && my_divisor != 0), NULL);\n    }\n    adaptive_partition_type_base(adaptive_partition_type_base &src, const proportional_split& split_obj) {\n        my_max_depth = src.my_max_depth;\n        my_divisor = size_t(float(src.my_divisor) * float(split_obj.right())\n                            / float(split_obj.left() + split_obj.right()));\n        src.my_divisor -= my_divisor;\n    }\n    bool check_being_stolen( task &t) { // part of old should_execute_range()\n        if( !my_divisor ) { // if not from the top P tasks of binary tree\n            my_divisor = 1; // TODO: replace by on-stack flag (partition_state's member)?\n            if( t.is_stolen_task() && t.parent()->ref_count() >= 2 ) { // runs concurrently with the left task\n#if TBB_USE_EXCEPTIONS\n                // RTTI is available, check whether the cast is valid\n                __TBB_ASSERT(dynamic_cast<flag_task*>(t.parent()), 0);\n                // correctness of the cast relies on avoiding the root task for which:\n                // - initial value of my_divisor != 0 (protected by separate assertion)\n                // - is_stolen_task() always returns false for the root task.\n#endif\n                flag_task::mark_task_stolen(t);\n                if( !my_max_depth ) my_max_depth++;\n                my_max_depth += __TBB_DEMAND_DEPTH_ADD;\n                return true;\n            }\n        }\n        return false;\n    }\n    void align_depth(depth_t base) {\n        __TBB_ASSERT(base <= my_max_depth, 0);\n        my_max_depth -= base;\n    }\n    depth_t max_depth() { return my_max_depth; }\n};\n\n//! Helper that enables one or the other code branches (see example in is_range_divisible_in_proportion)\ntemplate<bool C, typename T = void> struct enable_if { typedef T type; };\ntemplate<typename T> struct enable_if<false, T> { };\n\n//! Class determines whether template parameter has static boolean\n//! constant 'is_divisible_in_proportion' initialized with value of\n//! 'true' or not.\n/** If template parameter has such field that has been initialized\n *  with non-zero value then class field will be set to 'true',\n *  otherwise - 'false'\n */\ntemplate <typename Range>\nclass is_range_divisible_in_proportion {\nprivate:\n    typedef char yes[1];\n    typedef char no [2];\n\n    template <typename range_type> static yes& decide(typename enable_if<range_type::is_divisible_in_proportion>::type *);\n    template <typename range_type> static no& decide(...);\npublic:\n    // equals to 'true' if and only if static const variable 'is_divisible_in_proportion' of template parameter\n    // initialized with the value of 'true'\n    static const bool value = (sizeof(decide<Range>(0)) == sizeof(yes));\n};\n\n//! Provides default methods for affinity (adaptive) partition objects.\nclass affinity_partition_type : public adaptive_partition_type_base<affinity_partition_type> {\n    static const unsigned factor_power = 4;\n    static const unsigned factor = 1<<factor_power;  // number of slots in affinity array per task\n    enum {\n        start = 0,\n        run,\n        pass\n    } my_delay;\n#ifdef __TBB_USE_MACHINE_TIME_STAMPS\n    machine_tsc_t my_dst_tsc;\n#endif\n    size_t my_begin;\n    tbb::internal::affinity_id* my_array;\npublic:\n    typedef proportional_split split_type;\n\n    affinity_partition_type( tbb::internal::affinity_partitioner_base_v3& ap )\n        : adaptive_partition_type_base<affinity_partition_type>(),\n          my_delay(start)\n#ifdef __TBB_USE_MACHINE_TIME_STAMPS\n        , my_dst_tsc(0)\n#endif\n        {\n        __TBB_ASSERT( (factor&(factor-1))==0, \"factor must be power of two\" );\n        my_divisor *= factor;\n        ap.resize(factor);\n        my_array = ap.my_array;\n        my_begin = 0;\n        my_max_depth = factor_power + 1; // the first factor_power ranges will be spawned, and >=1 ranges should be left\n        __TBB_ASSERT( my_max_depth < __TBB_RANGE_POOL_CAPACITY, 0 );\n    }\n    affinity_partition_type(affinity_partition_type& p, split)\n        : adaptive_partition_type_base<affinity_partition_type>(p, split()),\n          my_delay(pass),\n#ifdef __TBB_USE_MACHINE_TIME_STAMPS\n          my_dst_tsc(0),\n#endif\n          my_array(p.my_array) {\n        // the sum of the divisors represents original value of p.my_divisor before split\n        __TBB_ASSERT(my_divisor + p.my_divisor <= factor, NULL);\n        my_begin = p.my_begin + p.my_divisor;\n    }\n    affinity_partition_type(affinity_partition_type& p, const proportional_split& split_obj)\n        : adaptive_partition_type_base<affinity_partition_type>(p, split_obj),\n          my_delay(start),\n#ifdef __TBB_USE_MACHINE_TIME_STAMPS\n          my_dst_tsc(0),\n#endif\n          my_array(p.my_array) {\n        size_t total_divisor = my_divisor + p.my_divisor;\n        __TBB_ASSERT(total_divisor % factor == 0, NULL);\n        my_divisor = (my_divisor + factor/2) & (0u - factor);\n        if (!my_divisor)\n            my_divisor = factor;\n        else if (my_divisor == total_divisor)\n            my_divisor = total_divisor - factor;\n        p.my_divisor = total_divisor - my_divisor;\n        __TBB_ASSERT(my_divisor && p.my_divisor, NULL);\n        my_begin = p.my_begin + p.my_divisor;\n    }\n    void set_affinity( task &t ) {\n        if( my_divisor ) {\n            if( !my_array[my_begin] ) {\n                // TODO: consider code reuse for static_paritioner\n                my_array[my_begin] = affinity_id(my_begin / factor + 1);\n            }\n            t.set_affinity( my_array[my_begin] );\n        }\n    }\n    void note_affinity( task::affinity_id id ) {\n        if( my_divisor )\n            my_array[my_begin] = id;\n    }\n    bool check_for_demand( task &t ) {\n        if( pass == my_delay ) {\n            if( my_divisor > 1 ) // produce affinitized tasks while they have slot in array\n                return true; // do not do my_max_depth++ here, but be sure range_pool is splittable once more\n            else if( my_divisor && my_max_depth ) { // make balancing task\n                my_divisor = 0; // once for each task; depth will be decreased in align_depth()\n                return true;\n            }\n            else if( flag_task::is_peer_stolen(t) ) {\n                my_max_depth += __TBB_DEMAND_DEPTH_ADD;\n                return true;\n            }\n        } else if( start == my_delay ) {\n#ifndef __TBB_USE_MACHINE_TIME_STAMPS\n            my_delay = pass;\n#else\n            my_dst_tsc = __TBB_machine_time_stamp() + __TBB_task_duration();\n            my_delay = run;\n        } else if( run == my_delay ) {\n            if( __TBB_machine_time_stamp() < my_dst_tsc ) {\n                __TBB_ASSERT(my_max_depth > 0, NULL);\n                return false;\n            }\n            my_delay = pass;\n            return true;\n#endif // __TBB_USE_MACHINE_TIME_STAMPS\n        }\n        return false;\n    }\n    bool is_divisible() { // part of old should_execute_range()\n        return my_divisor > factor;\n    }\n\n#if _MSC_VER && !defined(__INTEL_COMPILER)\n    // Suppress \"conditional expression is constant\" warning.\n    #pragma warning( push )\n    #pragma warning( disable: 4127 )\n#endif\n    template <typename Range>\n    split_type get_split() {\n        if (is_range_divisible_in_proportion<Range>::value) {\n            size_t size = my_divisor / factor;\n#if __TBB_NONUNIFORM_TASK_CREATION\n            size_t right = (size + 2) / 3;\n#else\n            size_t right = size / 2;\n#endif\n            size_t left = size - right;\n            return split_type(left, right);\n        } else {\n            return split_type(1, 1);\n        }\n    }\n#if _MSC_VER && !defined(__INTEL_COMPILER)\n    #pragma warning( pop )\n#endif // warning 4127 is back\n\n    static const unsigned range_pool_size = __TBB_RANGE_POOL_CAPACITY;\n};\n\nclass auto_partition_type: public adaptive_partition_type_base<auto_partition_type> {\npublic:\n    auto_partition_type( const auto_partitioner& ) {\n        my_divisor *= __TBB_INITIAL_CHUNKS;\n    }\n    auto_partition_type( auto_partition_type& src, split)\n      : adaptive_partition_type_base<auto_partition_type>(src, split()) {}\n\n    bool is_divisible() { // part of old should_execute_range()\n        if( my_divisor > 1 ) return true;\n        if( my_divisor && my_max_depth ) { // can split the task. TODO: on-stack flag instead\n            // keep same fragmentation while splitting for the local task pool\n            my_max_depth--;\n            my_divisor = 0; // decrease max_depth once per task\n            return true;\n        } else return false;\n    }\n    bool check_for_demand(task &t) {\n        if( flag_task::is_peer_stolen(t) ) {\n            my_max_depth += __TBB_DEMAND_DEPTH_ADD;\n            return true;\n        } else return false;\n    }\n\n    static const unsigned range_pool_size = __TBB_RANGE_POOL_CAPACITY;\n};\n\nclass simple_partition_type: public partition_type_base<simple_partition_type> {\npublic:\n    simple_partition_type( const simple_partitioner& ) {}\n    simple_partition_type( const simple_partition_type&, split ) {}\n    //! simplified algorithm\n    template<typename StartType, typename Range>\n    void execute(StartType &start, Range &range) {\n        split_type split_obj = split(); // start.offer_work accepts split_type as reference\n        while( range.is_divisible() )\n            start.offer_work( split_obj );\n        start.run_body( range );\n    }\n    //static const unsigned range_pool_size = 1; - not necessary because execute() is overridden\n};\n\n//! Backward-compatible partition for auto and affinity partition objects.\nclass old_auto_partition_type: public tbb::internal::partition_type_base {\n    size_t num_chunks;\n    static const size_t VICTIM_CHUNKS = 4;\npublic:\n    bool should_execute_range(const task &t) {\n        if( num_chunks<VICTIM_CHUNKS && t.is_stolen_task() )\n            num_chunks = VICTIM_CHUNKS;\n        return num_chunks==1;\n    }\n    old_auto_partition_type( const auto_partitioner& )\n      : num_chunks(internal::get_initial_auto_partitioner_divisor()*__TBB_INITIAL_CHUNKS/4) {}\n    old_auto_partition_type( const affinity_partitioner& )\n      : num_chunks(internal::get_initial_auto_partitioner_divisor()*__TBB_INITIAL_CHUNKS/4) {}\n    old_auto_partition_type( old_auto_partition_type& pt, split ) {\n        num_chunks = pt.num_chunks = (pt.num_chunks+1u) / 2u;\n    }\n};\n\n} // namespace interfaceX::internal\n//! @endcond\n} // namespace interfaceX\n\n//! A simple partitioner\n/** Divides the range until the range is not divisible.\n    @ingroup algorithms */\nclass simple_partitioner {\npublic:\n    simple_partitioner() {}\nprivate:\n    template<typename Range, typename Body, typename Partitioner> friend class serial::interface7::start_for;\n    template<typename Range, typename Body, typename Partitioner> friend class interface7::internal::start_for;\n    template<typename Range, typename Body, typename Partitioner> friend class interface7::internal::start_reduce;\n    template<typename Range, typename Body, typename Partitioner> friend class internal::start_scan;\n    // backward compatibility\n    class partition_type: public internal::partition_type_base {\n    public:\n        bool should_execute_range(const task& ) {return false;}\n        partition_type( const simple_partitioner& ) {}\n        partition_type( const partition_type&, split ) {}\n    };\n    // new implementation just extends existing interface\n    typedef interface7::internal::simple_partition_type task_partition_type;\n\n    // TODO: consider to make split_type public\n    typedef interface7::internal::simple_partition_type::split_type split_type;\n};\n\n//! An auto partitioner\n/** The range is initial divided into several large chunks.\n    Chunks are further subdivided into smaller pieces if demand detected and they are divisible.\n    @ingroup algorithms */\nclass auto_partitioner {\npublic:\n    auto_partitioner() {}\n\nprivate:\n    template<typename Range, typename Body, typename Partitioner> friend class serial::interface7::start_for;\n    template<typename Range, typename Body, typename Partitioner> friend class interface7::internal::start_for;\n    template<typename Range, typename Body, typename Partitioner> friend class interface7::internal::start_reduce;\n    template<typename Range, typename Body, typename Partitioner> friend class internal::start_scan;\n    // backward compatibility\n    typedef interface7::internal::old_auto_partition_type partition_type;\n    // new implementation just extends existing interface\n    typedef interface7::internal::auto_partition_type task_partition_type;\n\n    // TODO: consider to make split_type public\n    typedef interface7::internal::auto_partition_type::split_type split_type;\n};\n\n//! An affinity partitioner\nclass affinity_partitioner: internal::affinity_partitioner_base_v3 {\npublic:\n    affinity_partitioner() {}\n\nprivate:\n    template<typename Range, typename Body, typename Partitioner> friend class serial::interface7::start_for;\n    template<typename Range, typename Body, typename Partitioner> friend class interface7::internal::start_for;\n    template<typename Range, typename Body, typename Partitioner> friend class interface7::internal::start_reduce;\n    template<typename Range, typename Body, typename Partitioner> friend class internal::start_scan;\n    // backward compatibility - for parallel_scan only\n    typedef interface7::internal::old_auto_partition_type partition_type;\n    // new implementation just extends existing interface\n    typedef interface7::internal::affinity_partition_type task_partition_type;\n\n    // TODO: consider to make split_type public\n    typedef interface7::internal::affinity_partition_type::split_type split_type;\n};\n\n} // namespace tbb\n\n#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)\n    #pragma warning (pop)\n#endif // warning 4244 is back\n#undef __TBB_INITIAL_CHUNKS\n#undef __TBB_RANGE_POOL_CAPACITY\n#undef __TBB_INIT_DEPTH\n#endif /* __TBB_partitioner_H */\n"
  },
  {
    "path": "benchmarks/tbb/pipeline.cpp",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#include \"tbb/pipeline.h\"\n#include \"tbb/spin_mutex.h\"\n#include \"tbb/cache_aligned_allocator.h\"\n#include \"itt_notify.h\"\n#include \"semaphore.h\"\n#include \"tls.h\"  // for parallel filters that do not use NULL as end_of_input\n\n\nnamespace tbb {\n\nnamespace internal {\n\n//! This structure is used to store task information in a input buffer\nstruct task_info {\n    void* my_object;\n    //! Invalid unless a task went through an ordered stage.\n    Token my_token;\n    //! False until my_token is set.\n    bool my_token_ready;\n    //! True if my_object is valid.\n    bool is_valid;\n    //! Set to initial state (no object, no token)\n    void reset() {\n        my_object = NULL;\n        my_token = 0;\n        my_token_ready = false;\n        is_valid = false;\n    }\n};\n//! A buffer of input items for a filter.\n/** Each item is a task_info, inserted into a position in the buffer corresponding to a Token. */\nclass input_buffer : no_copy {\n    friend class tbb::internal::pipeline_root_task;\n    friend class tbb::filter;\n    friend class tbb::thread_bound_filter;\n    friend class tbb::internal::stage_task;\n    friend class tbb::pipeline;\n\n    typedef  Token  size_type;\n\n    //! Array of deferred tasks that cannot yet start executing.\n    task_info* array;\n\n    //! for thread-bound filter, semaphore for waiting, NULL otherwise.\n    semaphore* my_sem;\n\n    //! Size of array\n    /** Always 0 or a power of 2 */\n    size_type array_size;\n\n    //! Lowest token that can start executing.\n    /** All prior Token have already been seen. */\n    Token low_token;\n\n    //! Serializes updates.\n    spin_mutex array_mutex;\n\n    //! Resize \"array\".\n    /** Caller is responsible to acquiring a lock on \"array_mutex\". */\n    void grow( size_type minimum_size );\n\n    //! Initial size for \"array\"\n    /** Must be a power of 2 */\n    static const size_type initial_buffer_size = 4;\n\n    //! Used for out of order buffer, and for assigning my_token if is_ordered and my_token not already assigned\n    Token high_token;\n\n    //! True for ordered filter, false otherwise.\n    bool is_ordered;\n\n    //! True for thread-bound filter, false otherwise.\n    bool is_bound;\n\n    //! for parallel filters that accepts NULLs, thread-local flag for reaching end_of_input\n    typedef basic_tls<intptr_t> end_of_input_tls_t;\n    end_of_input_tls_t end_of_input_tls;\n    bool end_of_input_tls_allocated; // no way to test pthread creation of TLS\n\n    void create_sema(size_t initial_tokens) { __TBB_ASSERT(!my_sem,NULL); my_sem = new internal::semaphore(initial_tokens); }\n    void free_sema() { __TBB_ASSERT(my_sem,NULL); delete my_sem; }\n    void sema_P() { __TBB_ASSERT(my_sem,NULL); my_sem->P(); }\n    void sema_V() { __TBB_ASSERT(my_sem,NULL); my_sem->V(); }\n\npublic:\n    //! Construct empty buffer.\n    input_buffer( bool is_ordered_, bool is_bound_ ) :\n            array(NULL), my_sem(NULL), array_size(0),\n            low_token(0), high_token(0),\n            is_ordered(is_ordered_), is_bound(is_bound_),\n            end_of_input_tls_allocated(false) {\n        grow(initial_buffer_size);\n        __TBB_ASSERT( array, NULL );\n        if(is_bound) create_sema(0);\n    }\n\n    //! Destroy the buffer.\n    ~input_buffer() {\n        __TBB_ASSERT( array, NULL );\n        cache_aligned_allocator<task_info>().deallocate(array,array_size);\n        poison_pointer( array );\n        if(my_sem) {\n            free_sema();\n        }\n        if(end_of_input_tls_allocated) {\n            destroy_my_tls();\n        }\n    }\n\n    //! Put a token into the buffer.\n    /** If task information was placed into buffer, returns true;\n        otherwise returns false, informing the caller to create and spawn a task.\n        If input buffer owned by thread-bound filter and the item at\n        low_token was not valid, issue a V()\n        If the input_buffer is owned by a successor to a thread-bound filter,\n        the force_put parameter should be true to ensure the token is inserted\n        in the buffer.\n    */\n    bool put_token( task_info& info_, bool force_put = false ) {\n        {\n            info_.is_valid = true;\n            spin_mutex::scoped_lock lock( array_mutex );\n            Token token;\n            bool was_empty = !array[low_token&(array_size-1)].is_valid;\n            if( is_ordered ) {\n                if( !info_.my_token_ready ) {\n                    info_.my_token = high_token++;\n                    info_.my_token_ready = true;\n                }\n                token = info_.my_token;\n            } else\n                token = high_token++;\n            __TBB_ASSERT( (tokendiff_t)(token-low_token)>=0, NULL );\n            if( token!=low_token || is_bound || force_put ) {\n                // Trying to put token that is beyond low_token.\n                // Need to wait until low_token catches up before dispatching.\n                if( token-low_token>=array_size )\n                    grow( token-low_token+1 );\n                ITT_NOTIFY( sync_releasing, this );\n                array[token&(array_size-1)] = info_;\n                if(was_empty && is_bound) {\n                    sema_V();\n                }\n                return true;\n            }\n        }\n        return false;\n    }\n\n    //! Note that processing of a token is finished.\n    /** Fires up processing of the next token, if processing was deferred. */\n    // Using template to avoid explicit dependency on stage_task\n    // this is only called for serial filters, and is the reason for the\n    // advance parameter in return_item (we're incrementing low_token here.)\n    // Non-TBF serial stages don't advance the token at the start because the presence\n    // of the current token in the buffer keeps another stage from being spawned.\n    template<typename StageTask>\n    void note_done( Token token, StageTask& spawner ) {\n        task_info wakee;\n        wakee.reset();\n        {\n            spin_mutex::scoped_lock lock( array_mutex );\n            if( !is_ordered || token==low_token ) {\n                // Wake the next task\n                task_info& item = array[++low_token & (array_size-1)];\n                ITT_NOTIFY( sync_acquired, this );\n                wakee = item;\n                item.is_valid = false;\n            }\n        }\n        if( wakee.is_valid )\n            spawner.spawn_stage_task(wakee);\n    }\n\n#if __TBB_TASK_GROUP_CONTEXT\n    //! The method destroys all data in filters to prevent memory leaks\n    void clear( filter* my_filter ) {\n        long t=low_token;\n        for( size_type i=0; i<array_size; ++i, ++t ){\n            task_info& temp = array[t&(array_size-1)];\n            if (temp.is_valid ) {\n                my_filter->finalize(temp.my_object);\n                temp.is_valid = false;\n            }\n        }\n    }\n#endif\n\n    //! return an item, invalidate the queued item, but only advance if advance\n    //  advance == true for parallel filters.  If the filter is serial, leave the\n    // item in the buffer to keep another stage from being spawned.\n    bool return_item(task_info& info, bool advance) {\n        spin_mutex::scoped_lock lock( array_mutex );\n        task_info& item = array[low_token&(array_size-1)];\n        ITT_NOTIFY( sync_acquired, this );\n        if( item.is_valid ) {\n            info = item;\n            item.is_valid = false;\n            if (advance) low_token++;\n            return true;\n        }\n        return false;\n    }\n\n    //! true if the current low_token is valid.\n    bool has_item() { spin_mutex::scoped_lock lock(array_mutex); return array[low_token&(array_size -1)].is_valid; }\n\n    // end_of_input signal for parallel_pipeline, parallel input filters with 0 tokens allowed.\n    void create_my_tls() { int status = end_of_input_tls.create(); if(status) handle_perror(status, \"TLS not allocated for filter\"); end_of_input_tls_allocated = true; }\n    void destroy_my_tls() { int status = end_of_input_tls.destroy(); if(status) handle_perror(status, \"Failed to destroy filter TLS\"); }\n    bool my_tls_end_of_input() { return end_of_input_tls.get() != 0; }\n    void set_my_tls_end_of_input() { end_of_input_tls.set(1); }\n};\n\nvoid input_buffer::grow( size_type minimum_size ) {\n    size_type old_size = array_size;\n    size_type new_size = old_size ? 2*old_size : initial_buffer_size;\n    while( new_size<minimum_size )\n        new_size*=2;\n    task_info* new_array = cache_aligned_allocator<task_info>().allocate(new_size);\n    task_info* old_array = array;\n    for( size_type i=0; i<new_size; ++i )\n        new_array[i].is_valid = false;\n    long t=low_token;\n    for( size_type i=0; i<old_size; ++i, ++t )\n        new_array[t&(new_size-1)] = old_array[t&(old_size-1)];\n    array = new_array;\n    array_size = new_size;\n    if( old_array )\n        cache_aligned_allocator<task_info>().deallocate(old_array,old_size);\n}\n\nclass stage_task: public task, public task_info {\nprivate:\n    friend class tbb::pipeline;\n    pipeline& my_pipeline;\n    filter* my_filter;\n    //! True if this task has not yet read the input.\n    bool my_at_start;\n\npublic:\n    //! Construct stage_task for first stage in a pipeline.\n    /** Such a stage has not read any input yet. */\n    stage_task( pipeline& pipeline ) :\n        my_pipeline(pipeline),\n        my_filter(pipeline.filter_list),\n        my_at_start(true)\n    {\n        task_info::reset();\n    }\n    //! Construct stage_task for a subsequent stage in a pipeline.\n    stage_task( pipeline& pipeline, filter* filter_, const task_info& info ) :\n        task_info(info),\n        my_pipeline(pipeline),\n        my_filter(filter_),\n        my_at_start(false)\n    {}\n    //! Roughly equivalent to the constructor of input stage task\n    void reset() {\n        task_info::reset();\n        my_filter = my_pipeline.filter_list;\n        my_at_start = true;\n    }\n    //! The virtual task execution method\n    /*override*/ task* execute();\n#if __TBB_TASK_GROUP_CONTEXT\n    ~stage_task()\n    {\n        if (my_filter && my_object && (my_filter->my_filter_mode & filter::version_mask) >= __TBB_PIPELINE_VERSION(4)) {\n            __TBB_ASSERT(is_cancelled(), \"Trying to finalize the task that wasn't cancelled\");\n            my_filter->finalize(my_object);\n            my_object = NULL;\n        }\n    }\n#endif // __TBB_TASK_GROUP_CONTEXT\n    //! Creates and spawns stage_task from task_info\n    void spawn_stage_task(const task_info& info)\n    {\n        stage_task* clone = new (allocate_additional_child_of(*parent()))\n                                stage_task( my_pipeline, my_filter, info );\n        spawn(*clone);\n    }\n};\n\ntask* stage_task::execute() {\n    __TBB_ASSERT( !my_at_start || !my_object, NULL );\n    __TBB_ASSERT( !my_filter->is_bound(), NULL );\n    if( my_at_start ) {\n        if( my_filter->is_serial() ) {\n            my_object = (*my_filter)(my_object);\n            if( my_object || ( my_filter->object_may_be_null() && !my_pipeline.end_of_input) )\n            {\n                if( my_filter->is_ordered() ) {\n                    my_token = my_pipeline.token_counter++; // ideally, with relaxed semantics\n                    my_token_ready = true;\n                } else if( (my_filter->my_filter_mode & my_filter->version_mask) >= __TBB_PIPELINE_VERSION(5) ) {\n                    if( my_pipeline.has_thread_bound_filters )\n                        my_pipeline.token_counter++; // ideally, with relaxed semantics\n                }\n                if( !my_filter->next_filter_in_pipeline ) { // we're only filter in pipeline\n                    reset();\n                    goto process_another_stage;\n                } else {\n                    ITT_NOTIFY( sync_releasing, &my_pipeline.input_tokens );\n                    if( --my_pipeline.input_tokens>0 )\n                        spawn( *new( allocate_additional_child_of(*parent()) ) stage_task( my_pipeline ) );\n                }\n            } else {\n                my_pipeline.end_of_input = true;\n                return NULL;\n            }\n        } else /*not is_serial*/ {\n            if( my_pipeline.end_of_input )\n                return NULL;\n            if( (my_filter->my_filter_mode & my_filter->version_mask) >= __TBB_PIPELINE_VERSION(5) ) {\n                if( my_pipeline.has_thread_bound_filters )\n                    my_pipeline.token_counter++;\n            }\n            ITT_NOTIFY( sync_releasing, &my_pipeline.input_tokens );\n            if( --my_pipeline.input_tokens>0 )\n                spawn( *new( allocate_additional_child_of(*parent()) ) stage_task( my_pipeline ) );\n            my_object = (*my_filter)(my_object);\n            if( !my_object && (!my_filter->object_may_be_null() || my_filter->my_input_buffer->my_tls_end_of_input()) )\n            {\n                my_pipeline.end_of_input = true;\n                if( (my_filter->my_filter_mode & my_filter->version_mask) >= __TBB_PIPELINE_VERSION(5) ) {\n                    if( my_pipeline.has_thread_bound_filters )\n                        my_pipeline.token_counter--;  // fix token_counter\n                }\n                return NULL;\n            }\n        }\n        my_at_start = false;\n    } else {\n        my_object = (*my_filter)(my_object);\n        if( my_filter->is_serial() )\n            my_filter->my_input_buffer->note_done(my_token, *this);\n    }\n    my_filter = my_filter->next_filter_in_pipeline;\n    if( my_filter ) {\n        // There is another filter to execute.\n        if( my_filter->is_serial() ) {\n            // The next filter must execute tokens in order\n            if( my_filter->my_input_buffer->put_token(*this) ){\n                // Can't proceed with the same item\n                if( my_filter->is_bound() ) {\n                    // Find the next non-thread-bound filter\n                    do {\n                        my_filter = my_filter->next_filter_in_pipeline;\n                    } while( my_filter && my_filter->is_bound() );\n                    // Check if there is an item ready to process\n                    if( my_filter && my_filter->my_input_buffer->return_item(*this, !my_filter->is_serial()))\n                        goto process_another_stage;\n                }\n                my_filter = NULL; // To prevent deleting my_object twice if exception occurs\n                return NULL;\n            }\n        }\n    } else {\n        // Reached end of the pipe.\n        size_t ntokens_avail = ++my_pipeline.input_tokens;\n        if(my_pipeline.filter_list->is_bound() ) {\n            if(ntokens_avail == 1) {\n                my_pipeline.filter_list->my_input_buffer->sema_V();\n            }\n            return NULL;\n        }\n        if( ntokens_avail>1  // Only recycle if there is one available token\n                || my_pipeline.end_of_input ) {\n            return NULL; // No need to recycle for new input\n        }\n        ITT_NOTIFY( sync_acquired, &my_pipeline.input_tokens );\n        // Recycle as an input stage task.\n        reset();\n    }\nprocess_another_stage:\n    /* A semi-hackish way to reexecute the same task object immediately without spawning.\n       recycle_as_continuation marks the task for future execution,\n       and then 'this' pointer is returned to bypass spawning. */\n    recycle_as_continuation();\n    return this;\n}\n\nclass pipeline_root_task: public task {\n    pipeline& my_pipeline;\n    bool do_segment_scanning;\n\n    /*override*/ task* execute() {\n        if( !my_pipeline.end_of_input )\n            if( !my_pipeline.filter_list->is_bound() )\n                if( my_pipeline.input_tokens > 0 ) {\n                    recycle_as_continuation();\n                    set_ref_count(1);\n                    return new( allocate_child() ) stage_task( my_pipeline );\n                }\n        if( do_segment_scanning ) {\n            filter* current_filter = my_pipeline.filter_list->next_segment;\n            /* first non-thread-bound filter that follows thread-bound one\n            and may have valid items to process */\n            filter* first_suitable_filter = current_filter;\n            while( current_filter ) {\n                __TBB_ASSERT( !current_filter->is_bound(), \"filter is thread-bound?\" );\n                __TBB_ASSERT( current_filter->prev_filter_in_pipeline->is_bound(), \"previous filter is not thread-bound?\" );\n                if( !my_pipeline.end_of_input || current_filter->has_more_work())\n                {\n                    task_info info;\n                    info.reset();\n                    if( current_filter->my_input_buffer->return_item(info, !current_filter->is_serial()) ) {\n                        set_ref_count(1);\n                        recycle_as_continuation();\n                        return new( allocate_child() ) stage_task( my_pipeline, current_filter, info);\n                    }\n                    current_filter = current_filter->next_segment;\n                    if( !current_filter ) {\n                        if( !my_pipeline.end_of_input ) {\n                            recycle_as_continuation();\n                            return this;\n                        }\n                        current_filter = first_suitable_filter;\n                        __TBB_Yield();\n                    }\n                } else {\n                    /* The preceding pipeline segment is empty.\n                    Fast-forward to the next post-TBF segment. */\n                    first_suitable_filter = first_suitable_filter->next_segment;\n                    current_filter = first_suitable_filter;\n                }\n            } /* while( current_filter ) */\n            return NULL;\n        } else {\n            if( !my_pipeline.end_of_input ) {\n                recycle_as_continuation();\n                return this;\n            }\n            return NULL;\n        }\n    }\npublic:\n    pipeline_root_task( pipeline& pipeline ): my_pipeline(pipeline), do_segment_scanning(false)\n    {\n        __TBB_ASSERT( my_pipeline.filter_list, NULL );\n        filter* first = my_pipeline.filter_list;\n        if( (first->my_filter_mode & first->version_mask) >= __TBB_PIPELINE_VERSION(5) ) {\n            // Scanning the pipeline for segments\n            filter* head_of_previous_segment = first;\n            for(  filter* subfilter=first->next_filter_in_pipeline;\n                  subfilter!=NULL;\n                  subfilter=subfilter->next_filter_in_pipeline )\n            {\n                if( subfilter->prev_filter_in_pipeline->is_bound() && !subfilter->is_bound() ) {\n                    do_segment_scanning = true;\n                    head_of_previous_segment->next_segment = subfilter;\n                    head_of_previous_segment = subfilter;\n                }\n            }\n        }\n    }\n};\n\n#if _MSC_VER && !defined(__INTEL_COMPILER)\n    // Workaround for overzealous compiler warnings\n    // Suppress compiler warning about constant conditional expression\n    #pragma warning (disable: 4127)\n#endif\n\n// The class destroys end_counter and clears all input buffers if pipeline was cancelled.\nclass pipeline_cleaner: internal::no_copy {\n    pipeline& my_pipeline;\npublic:\n    pipeline_cleaner(pipeline& _pipeline) :\n        my_pipeline(_pipeline)\n    {}\n    ~pipeline_cleaner(){\n#if __TBB_TASK_GROUP_CONTEXT\n        if (my_pipeline.end_counter->is_cancelled()) // Pipeline was cancelled\n            my_pipeline.clear_filters();\n#endif\n        my_pipeline.end_counter = NULL;\n    }\n};\n\n} // namespace internal\n\nvoid pipeline::inject_token( task& ) {\n    __TBB_ASSERT(false,\"illegal call to inject_token\");\n}\n\n#if __TBB_TASK_GROUP_CONTEXT\nvoid pipeline::clear_filters() {\n    for( filter* f = filter_list; f; f = f->next_filter_in_pipeline ) {\n        if ((f->my_filter_mode & filter::version_mask) >= __TBB_PIPELINE_VERSION(4))\n            if( internal::input_buffer* b = f->my_input_buffer )\n                b->clear(f);\n    }\n}\n#endif\n\npipeline::pipeline() :\n    filter_list(NULL),\n    filter_end(NULL),\n    end_counter(NULL),\n    end_of_input(false),\n    has_thread_bound_filters(false)\n{\n    token_counter = 0;\n    input_tokens = 0;\n}\n\npipeline::~pipeline() {\n    clear();\n}\n\nvoid pipeline::clear() {\n    filter* next;\n    for( filter* f = filter_list; f; f=next ) {\n        if( internal::input_buffer* b = f->my_input_buffer ) {\n            delete b;\n            f->my_input_buffer = NULL;\n        }\n        next=f->next_filter_in_pipeline;\n        f->next_filter_in_pipeline = filter::not_in_pipeline();\n        if ( (f->my_filter_mode & filter::version_mask) >= __TBB_PIPELINE_VERSION(3) ) {\n            f->prev_filter_in_pipeline = filter::not_in_pipeline();\n            f->my_pipeline = NULL;\n        }\n        if ( (f->my_filter_mode & filter::version_mask) >= __TBB_PIPELINE_VERSION(5) )\n            f->next_segment = NULL;\n    }\n    filter_list = filter_end = NULL;\n}\n\nvoid pipeline::add_filter( filter& filter_ ) {\n#if TBB_USE_ASSERT\n    if ( (filter_.my_filter_mode & filter::version_mask) >= __TBB_PIPELINE_VERSION(3) )\n        __TBB_ASSERT( filter_.prev_filter_in_pipeline==filter::not_in_pipeline(), \"filter already part of pipeline?\" );\n    __TBB_ASSERT( filter_.next_filter_in_pipeline==filter::not_in_pipeline(), \"filter already part of pipeline?\" );\n    __TBB_ASSERT( !end_counter, \"invocation of add_filter on running pipeline\" );\n#endif\n    if ( (filter_.my_filter_mode & filter::version_mask) >= __TBB_PIPELINE_VERSION(3) ) {\n        filter_.my_pipeline = this;\n        filter_.prev_filter_in_pipeline = filter_end;\n        if ( filter_list == NULL)\n            filter_list = &filter_;\n        else\n            filter_end->next_filter_in_pipeline = &filter_;\n        filter_.next_filter_in_pipeline = NULL;\n        filter_end = &filter_;\n    }\n    else\n    {\n        if( !filter_end )\n            filter_end = reinterpret_cast<filter*>(&filter_list);\n\n        *reinterpret_cast<filter**>(filter_end) = &filter_;\n        filter_end = reinterpret_cast<filter*>(&filter_.next_filter_in_pipeline);\n        *reinterpret_cast<filter**>(filter_end) = NULL;\n    }\n    if( (filter_.my_filter_mode & filter_.version_mask) >= __TBB_PIPELINE_VERSION(5) ) {\n        if( filter_.is_serial() ) {\n            if( filter_.is_bound() )\n                has_thread_bound_filters = true;\n            filter_.my_input_buffer = new internal::input_buffer( filter_.is_ordered(), filter_.is_bound() );\n        }\n        else {\n            if(filter_.prev_filter_in_pipeline) {\n                if(filter_.prev_filter_in_pipeline->is_bound()) {\n                    // successors to bound filters must have an input_buffer\n                    filter_.my_input_buffer = new internal::input_buffer( /*is_ordered*/false, false );\n                }\n            }\n            else {  // input filter\n                if(filter_.object_may_be_null() ) {\n                    //TODO: buffer only needed to hold TLS; could improve\n                    filter_.my_input_buffer = new internal::input_buffer( /*is_ordered*/false, false );\n                    filter_.my_input_buffer->create_my_tls();\n                }\n            }\n        }\n    } else {\n        if( filter_.is_serial() ) {\n            filter_.my_input_buffer = new internal::input_buffer( filter_.is_ordered(), false );\n        }\n    }\n\n}\n\nvoid pipeline::remove_filter( filter& filter_ ) {\n    __TBB_ASSERT( filter_.prev_filter_in_pipeline!=filter::not_in_pipeline(), \"filter not part of pipeline\" );\n    __TBB_ASSERT( filter_.next_filter_in_pipeline!=filter::not_in_pipeline(), \"filter not part of pipeline\" );\n    __TBB_ASSERT( !end_counter, \"invocation of remove_filter on running pipeline\" );\n    if (&filter_ == filter_list)\n        filter_list = filter_.next_filter_in_pipeline;\n    else {\n        __TBB_ASSERT( filter_.prev_filter_in_pipeline, \"filter list broken?\" );\n        filter_.prev_filter_in_pipeline->next_filter_in_pipeline = filter_.next_filter_in_pipeline;\n    }\n    if (&filter_ == filter_end)\n        filter_end = filter_.prev_filter_in_pipeline;\n    else {\n        __TBB_ASSERT( filter_.next_filter_in_pipeline, \"filter list broken?\" );\n        filter_.next_filter_in_pipeline->prev_filter_in_pipeline = filter_.prev_filter_in_pipeline;\n    }\n    if( internal::input_buffer* b = filter_.my_input_buffer ) {\n        delete b;\n        filter_.my_input_buffer = NULL;\n    }\n    filter_.next_filter_in_pipeline = filter_.prev_filter_in_pipeline = filter::not_in_pipeline();\n    if ( (filter_.my_filter_mode & filter::version_mask) >= __TBB_PIPELINE_VERSION(5) )\n        filter_.next_segment = NULL;\n    filter_.my_pipeline = NULL;\n}\n\nvoid pipeline::run( size_t max_number_of_live_tokens\n#if __TBB_TASK_GROUP_CONTEXT\n    , tbb::task_group_context& context\n#endif\n    ) {\n    __TBB_ASSERT( max_number_of_live_tokens>0, \"pipeline::run must have at least one token\" );\n    __TBB_ASSERT( !end_counter, \"pipeline already running?\" );\n    if( filter_list ) {\n        internal::pipeline_cleaner my_pipeline_cleaner(*this);\n        end_of_input = false;\n        input_tokens = internal::Token(max_number_of_live_tokens);\n        if(has_thread_bound_filters) {\n            // release input filter if thread-bound\n            if(filter_list->is_bound()) {\n                filter_list->my_input_buffer->sema_V();\n            }\n        }\n#if __TBB_TASK_GROUP_CONTEXT\n        end_counter = new( task::allocate_root(context) ) internal::pipeline_root_task( *this );\n#else\n        end_counter = new( task::allocate_root() ) internal::pipeline_root_task( *this );\n#endif\n        // Start execution of tasks\n        task::spawn_root_and_wait( *end_counter );\n\n        if(has_thread_bound_filters) {\n            for(filter* f = filter_list->next_filter_in_pipeline; f; f=f->next_filter_in_pipeline) {\n                if(f->is_bound()) {\n                    f->my_input_buffer->sema_V(); // wake to end\n                }\n            }\n        }\n    }\n}\n\n#if __TBB_TASK_GROUP_CONTEXT\nvoid pipeline::run( size_t max_number_of_live_tokens ) {\n    if( filter_list ) {\n        // Construct task group context with the exception propagation mode expected\n        // by the pipeline caller.\n        uintptr_t ctx_traits = filter_list->my_filter_mode & filter::exact_exception_propagation ?\n                task_group_context::default_traits :\n                task_group_context::default_traits & ~task_group_context::exact_exception;\n        task_group_context context(task_group_context::bound, ctx_traits);\n        run(max_number_of_live_tokens, context);\n    }\n}\n#endif // __TBB_TASK_GROUP_CONTEXT\n\nbool filter::has_more_work() {\n    __TBB_ASSERT(my_pipeline, NULL);\n    __TBB_ASSERT(my_input_buffer, \"has_more_work() called for filter with no input buffer\");\n    return (internal::tokendiff_t)(my_pipeline->token_counter - my_input_buffer->low_token) != 0;\n}\n\nfilter::~filter() {\n    if ( (my_filter_mode & version_mask) >= __TBB_PIPELINE_VERSION(3) ) {\n        if ( next_filter_in_pipeline != filter::not_in_pipeline() )\n            my_pipeline->remove_filter(*this);\n        else\n            __TBB_ASSERT( prev_filter_in_pipeline == filter::not_in_pipeline(), \"probably filter list is broken\" );\n    } else {\n        __TBB_ASSERT( next_filter_in_pipeline==filter::not_in_pipeline(), \"cannot destroy filter that is part of pipeline\" );\n    }\n}\n\nvoid\nfilter::set_end_of_input() {\n    __TBB_ASSERT(my_input_buffer, NULL);\n    __TBB_ASSERT(object_may_be_null(), NULL);\n    if(is_serial()) {\n        my_pipeline->end_of_input = true;\n    }\n    else {\n        __TBB_ASSERT(my_input_buffer->end_of_input_tls_allocated, NULL);\n        my_input_buffer->set_my_tls_end_of_input();\n    }\n}\n\nthread_bound_filter::result_type thread_bound_filter::process_item() {\n    return internal_process_item(true);\n}\n\nthread_bound_filter::result_type thread_bound_filter::try_process_item() {\n    return internal_process_item(false);\n}\n\nthread_bound_filter::result_type thread_bound_filter::internal_process_item(bool is_blocking) {\n    __TBB_ASSERT(my_pipeline != NULL,\"It's not supposed that process_item is called for a filter that is not in a pipeline.\");\n    internal::task_info info;\n    info.reset();\n\n    if( my_pipeline->end_of_input && !has_more_work() )\n        return end_of_stream;\n\n    if( !prev_filter_in_pipeline ) {\n        if( my_pipeline->end_of_input )\n            return end_of_stream;\n        while( my_pipeline->input_tokens == 0 ) {\n            if( !is_blocking )\n                return item_not_available;\n            my_input_buffer->sema_P();\n        }\n        info.my_object = (*this)(info.my_object);\n        if( info.my_object ) {\n            __TBB_ASSERT(my_pipeline->input_tokens > 0, \"Token failed in thread-bound filter\");\n            my_pipeline->input_tokens--;\n            if( is_ordered() ) {\n                info.my_token = my_pipeline->token_counter;\n                info.my_token_ready = true;\n            }\n            my_pipeline->token_counter++; // ideally, with relaxed semantics\n        } else {\n            my_pipeline->end_of_input = true;\n            return end_of_stream;\n        }\n    } else { /* this is not an input filter */\n        while( !my_input_buffer->has_item() ) {\n            if( !is_blocking ) {\n                return item_not_available;\n            }\n            my_input_buffer->sema_P();\n            if( my_pipeline->end_of_input && !has_more_work() ) {\n                return end_of_stream;\n            }\n        }\n        if( !my_input_buffer->return_item(info, /*advance*/true) ) {\n            __TBB_ASSERT(false,\"return_item failed\");\n        }\n        info.my_object = (*this)(info.my_object);\n    }\n    if( next_filter_in_pipeline ) {\n        if ( !next_filter_in_pipeline->my_input_buffer->put_token(info,/*force_put=*/true) ) {\n            __TBB_ASSERT(false, \"Couldn't put token after thread-bound buffer\");\n        }\n    } else {\n        size_t ntokens_avail = ++(my_pipeline->input_tokens);\n        if( my_pipeline->filter_list->is_bound() ) {\n            if( ntokens_avail == 1 ) {\n                my_pipeline->filter_list->my_input_buffer->sema_V();\n            }\n        }\n    }\n\n    return success;\n}\n\n} // tbb\n\n"
  },
  {
    "path": "benchmarks/tbb/pipeline.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_pipeline_H \n#define __TBB_pipeline_H \n\n#include \"atomic.h\"\n#include \"task.h\"\n#include \"tbb_allocator.h\"\n#include <cstddef>\n\n#if __TBB_CPP11_TYPE_PROPERTIES_PRESENT || __TBB_TR1_TYPE_PROPERTIES_IN_STD_PRESENT\n#include <type_traits>\n#endif\n\nnamespace tbb {\n\nclass pipeline;\nclass filter;\n\n//! @cond INTERNAL\nnamespace internal {\n\n// The argument for PIPELINE_VERSION should be an integer between 2 and 9\n#define __TBB_PIPELINE_VERSION(x) ((unsigned char)(x-2)<<1)\n\ntypedef unsigned long Token;\ntypedef long tokendiff_t;\nclass stage_task;\nclass input_buffer;\nclass pipeline_root_task;\nclass pipeline_cleaner;\n\n} // namespace internal\n\nnamespace interface6 {\n    template<typename T, typename U> class filter_t;\n\n    namespace internal {\n        class pipeline_proxy;\n    }\n}\n\n//! @endcond\n\n//! A stage in a pipeline.\n/** @ingroup algorithms */\nclass filter: internal::no_copy {\nprivate:\n    //! Value used to mark \"not in pipeline\"\n    static filter* not_in_pipeline() {return reinterpret_cast<filter*>(intptr_t(-1));}\nprotected:    \n    //! The lowest bit 0 is for parallel vs. serial\n    static const unsigned char filter_is_serial = 0x1; \n\n    //! 4th bit distinguishes ordered vs unordered filters.\n    /** The bit was not set for parallel filters in TBB 2.1 and earlier,\n        but is_ordered() function always treats parallel filters as out of order. */\n    static const unsigned char filter_is_out_of_order = 0x1<<4;  \n\n    //! 5th bit distinguishes thread-bound and regular filters.\n    static const unsigned char filter_is_bound = 0x1<<5;  \n\n    //! 6th bit marks input filters emitting small objects\n    static const unsigned char filter_may_emit_null = 0x1<<6;\n\n    //! 7th bit defines exception propagation mode expected by the application.\n    static const unsigned char exact_exception_propagation =\n#if TBB_USE_CAPTURED_EXCEPTION\n            0x0;\n#else\n            0x1<<7;\n#endif /* TBB_USE_CAPTURED_EXCEPTION */\n\n    static const unsigned char current_version = __TBB_PIPELINE_VERSION(5);\n    static const unsigned char version_mask = 0x7<<1; // bits 1-3 are for version\npublic:\n    enum mode {\n        //! processes multiple items in parallel and in no particular order\n        parallel = current_version | filter_is_out_of_order, \n        //! processes items one at a time; all such filters process items in the same order\n        serial_in_order = current_version | filter_is_serial,\n        //! processes items one at a time and in no particular order\n        serial_out_of_order = current_version | filter_is_serial | filter_is_out_of_order,\n        //! @deprecated use serial_in_order instead\n        serial = serial_in_order\n    };\nprotected:\n    filter( bool is_serial_ ) : \n        next_filter_in_pipeline(not_in_pipeline()),\n        my_input_buffer(NULL),\n        my_filter_mode(static_cast<unsigned char>((is_serial_ ? serial : parallel) | exact_exception_propagation)),\n        prev_filter_in_pipeline(not_in_pipeline()),\n        my_pipeline(NULL),\n        next_segment(NULL)\n    {}\n    \n    filter( mode filter_mode ) :\n        next_filter_in_pipeline(not_in_pipeline()),\n        my_input_buffer(NULL),\n        my_filter_mode(static_cast<unsigned char>(filter_mode | exact_exception_propagation)),\n        prev_filter_in_pipeline(not_in_pipeline()),\n        my_pipeline(NULL),\n        next_segment(NULL)\n    {}\n\n    // signal end-of-input for concrete_filters\n    void __TBB_EXPORTED_METHOD set_end_of_input();\n\npublic:\n    //! True if filter is serial.\n    bool is_serial() const {\n        return bool( my_filter_mode & filter_is_serial );\n    }  \n    \n    //! True if filter must receive stream in order.\n    bool is_ordered() const {\n        return (my_filter_mode & (filter_is_out_of_order|filter_is_serial))==filter_is_serial;\n    }\n\n    //! True if filter is thread-bound.\n    bool is_bound() const {\n        return ( my_filter_mode & filter_is_bound )==filter_is_bound;\n    }\n\n    //! true if an input filter can emit null\n    bool object_may_be_null() { \n        return ( my_filter_mode & filter_may_emit_null ) == filter_may_emit_null;\n    }\n\n    //! Operate on an item from the input stream, and return item for output stream.\n    /** Returns NULL if filter is a sink. */\n    virtual void* operator()( void* item ) = 0;\n\n    //! Destroy filter.  \n    /** If the filter was added to a pipeline, the pipeline must be destroyed first. */\n    virtual __TBB_EXPORTED_METHOD ~filter();\n\n#if __TBB_TASK_GROUP_CONTEXT\n    //! Destroys item if pipeline was cancelled.\n    /** Required to prevent memory leaks.\n        Note it can be called concurrently even for serial filters.*/\n    virtual void finalize( void* /*item*/ ) {};\n#endif\n\nprivate:\n    //! Pointer to next filter in the pipeline.\n    filter* next_filter_in_pipeline;\n\n    //! has the filter not yet processed all the tokens it will ever see?  \n    //  (pipeline has not yet reached end_of_input or this filter has not yet\n    //  seen the last token produced by input_filter)\n    bool has_more_work();\n\n    //! Buffer for incoming tokens, or NULL if not required.\n    /** The buffer is required if the filter is serial or follows a thread-bound one. */\n    internal::input_buffer* my_input_buffer;\n\n    friend class internal::stage_task;\n    friend class internal::pipeline_root_task;\n    friend class pipeline;\n    friend class thread_bound_filter;\n\n    //! Storage for filter mode and dynamically checked implementation version.\n    const unsigned char my_filter_mode;\n\n    //! Pointer to previous filter in the pipeline.\n    filter* prev_filter_in_pipeline;\n\n    //! Pointer to the pipeline.\n    pipeline* my_pipeline;\n\n    //! Pointer to the next \"segment\" of filters, or NULL if not required.\n    /** In each segment, the first filter is not thread-bound but follows a thread-bound one. */\n    filter* next_segment;\n};\n\n//! A stage in a pipeline served by a user thread.\n/** @ingroup algorithms */\nclass thread_bound_filter: public filter {\npublic:\n    enum result_type {\n        // item was processed\n        success,\n        // item is currently not available\n        item_not_available,\n        // there are no more items to process\n        end_of_stream\n    };\nprotected:\n    thread_bound_filter(mode filter_mode): \n         filter(static_cast<mode>(filter_mode | filter::filter_is_bound))\n    {\n        __TBB_ASSERT(filter_mode & filter::filter_is_serial, \"thread-bound filters must be serial\");\n    }\npublic:\n    //! If a data item is available, invoke operator() on that item.  \n    /** This interface is non-blocking.\n        Returns 'success' if an item was processed.\n        Returns 'item_not_available' if no item can be processed now \n        but more may arrive in the future, or if token limit is reached. \n        Returns 'end_of_stream' if there are no more items to process. */\n    result_type __TBB_EXPORTED_METHOD try_process_item(); \n\n    //! Wait until a data item becomes available, and invoke operator() on that item.\n    /** This interface is blocking.\n        Returns 'success' if an item was processed.\n        Returns 'end_of_stream' if there are no more items to process.\n        Never returns 'item_not_available', as it blocks until another return condition applies. */\n    result_type __TBB_EXPORTED_METHOD process_item();\n\nprivate:\n    //! Internal routine for item processing\n    result_type internal_process_item(bool is_blocking);\n};\n\n//! A processing pipeline that applies filters to items.\n/** @ingroup algorithms */\nclass pipeline {\npublic:\n    //! Construct empty pipeline.\n    __TBB_EXPORTED_METHOD pipeline();\n\n    /** Though the current implementation declares the destructor virtual, do not rely on this \n        detail.  The virtualness is deprecated and may disappear in future versions of TBB. */\n    virtual __TBB_EXPORTED_METHOD ~pipeline();\n\n    //! Add filter to end of pipeline.\n    void __TBB_EXPORTED_METHOD add_filter( filter& filter_ );\n\n    //! Run the pipeline to completion.\n    void __TBB_EXPORTED_METHOD run( size_t max_number_of_live_tokens );\n\n#if __TBB_TASK_GROUP_CONTEXT\n    //! Run the pipeline to completion with user-supplied context.\n    void __TBB_EXPORTED_METHOD run( size_t max_number_of_live_tokens, tbb::task_group_context& context );\n#endif\n\n    //! Remove all filters from the pipeline.\n    void __TBB_EXPORTED_METHOD clear();\n\nprivate:\n    friend class internal::stage_task;\n    friend class internal::pipeline_root_task;\n    friend class filter;\n    friend class thread_bound_filter;\n    friend class internal::pipeline_cleaner;\n    friend class tbb::interface6::internal::pipeline_proxy;\n\n    //! Pointer to first filter in the pipeline.\n    filter* filter_list;\n\n    //! Pointer to location where address of next filter to be added should be stored.\n    filter* filter_end;\n\n    //! task who's reference count is used to determine when all stages are done.\n    task* end_counter;\n\n    //! Number of idle tokens waiting for input stage.\n    atomic<internal::Token> input_tokens;\n\n    //! Global counter of tokens \n    atomic<internal::Token> token_counter;\n\n    //! False until fetch_input returns NULL.\n    bool end_of_input;\n\n    //! True if the pipeline contains a thread-bound filter; false otherwise.\n    bool has_thread_bound_filters;\n\n    //! Remove filter from pipeline.\n    void remove_filter( filter& filter_ );\n\n    //! Not used, but retained to satisfy old export files.\n    void __TBB_EXPORTED_METHOD inject_token( task& self );\n\n#if __TBB_TASK_GROUP_CONTEXT\n    //! Does clean up if pipeline is cancelled or exception occurred\n    void clear_filters();\n#endif\n};\n\n//------------------------------------------------------------------------\n// Support for lambda-friendly parallel_pipeline interface\n//------------------------------------------------------------------------\n\nnamespace interface6 {\n\nnamespace internal {\n    template<typename T, typename U, typename Body> class concrete_filter;\n}\n\n//! input_filter control to signal end-of-input for parallel_pipeline\nclass flow_control {\n    bool is_pipeline_stopped;\n    flow_control() { is_pipeline_stopped = false; }\n    template<typename T, typename U, typename Body> friend class internal::concrete_filter;\npublic:\n    void stop() { is_pipeline_stopped = true; }\n};\n\n//! @cond INTERNAL\nnamespace internal {\n\ntemplate<typename T> struct tbb_large_object {enum { value = sizeof(T) > sizeof(void *) }; };\n\n// Obtain type properties in one or another way\n#if   __TBB_CPP11_TYPE_PROPERTIES_PRESENT\ntemplate<typename T> struct tbb_trivially_copyable { enum { value = std::is_trivially_copyable<T>::value }; };\n#elif __TBB_TR1_TYPE_PROPERTIES_IN_STD_PRESENT\ntemplate<typename T> struct tbb_trivially_copyable { enum { value = std::has_trivial_copy_constructor<T>::value }; };\n#else\n// Explicitly list the types we wish to be placed as-is in the pipeline input_buffers.\ntemplate<typename T> struct tbb_trivially_copyable { enum { value = false }; };\ntemplate<typename T> struct tbb_trivially_copyable <T*> { enum { value = true }; };\ntemplate<> struct tbb_trivially_copyable <short> { enum { value = true }; };\ntemplate<> struct tbb_trivially_copyable <unsigned short> { enum { value = true }; };\ntemplate<> struct tbb_trivially_copyable <int> { enum { value = !tbb_large_object<int>::value }; };\ntemplate<> struct tbb_trivially_copyable <unsigned int> { enum { value = !tbb_large_object<int>::value }; };\ntemplate<> struct tbb_trivially_copyable <long> { enum { value = !tbb_large_object<long>::value }; };\ntemplate<> struct tbb_trivially_copyable <unsigned long> { enum { value = !tbb_large_object<long>::value }; };\ntemplate<> struct tbb_trivially_copyable <float> { enum { value = !tbb_large_object<float>::value }; };\ntemplate<> struct tbb_trivially_copyable <double> { enum { value = !tbb_large_object<double>::value }; };\n#endif // Obtaining type properties\n\ntemplate<typename T> struct is_large_object {enum { value = tbb_large_object<T>::value || !tbb_trivially_copyable<T>::value }; };\n\ntemplate<typename T, bool> class token_helper;\n\n// large object helper (uses tbb_allocator)\ntemplate<typename T>\nclass token_helper<T, true> {\n    public:\n    typedef typename tbb::tbb_allocator<T> allocator;\n    typedef T* pointer;\n    typedef T value_type;\n    static pointer create_token(const value_type & source) {\n        pointer output_t = allocator().allocate(1);\n        return new (output_t) T(source);\n    }\n    static value_type & token(pointer & t) { return *t;}\n    static void * cast_to_void_ptr(pointer ref) { return (void *) ref; }\n    static pointer cast_from_void_ptr(void * ref) { return (pointer)ref; }\n    static void destroy_token(pointer token) {\n        allocator().destroy(token);\n        allocator().deallocate(token,1);\n    }\n};\n\n// pointer specialization\ntemplate<typename T>\nclass token_helper<T*, false > {\n    public:\n    typedef T* pointer;\n    typedef T* value_type;\n    static pointer create_token(const value_type & source) { return source; }\n    static value_type & token(pointer & t) { return t;}\n    static void * cast_to_void_ptr(pointer ref) { return (void *)ref; }\n    static pointer cast_from_void_ptr(void * ref) { return (pointer)ref; }\n    static void destroy_token( pointer /*token*/) {}\n};\n\n// small object specialization (converts void* to the correct type, passes objects directly.)\ntemplate<typename T>\nclass token_helper<T, false> {\n    typedef union {\n        T actual_value;\n        void * void_overlay;\n    } type_to_void_ptr_map;\n    public:\n    typedef T pointer;  // not really a pointer in this case.\n    typedef T value_type;\n    static pointer create_token(const value_type & source) {\n        return source; }\n    static value_type & token(pointer & t) { return t;}\n    static void * cast_to_void_ptr(pointer ref) { \n        type_to_void_ptr_map mymap; \n        mymap.void_overlay = NULL;\n        mymap.actual_value = ref; \n        return mymap.void_overlay; \n    }\n    static pointer cast_from_void_ptr(void * ref) { \n        type_to_void_ptr_map mymap;\n        mymap.void_overlay = ref;\n        return mymap.actual_value;\n    }\n    static void destroy_token( pointer /*token*/) {}\n};\n\ntemplate<typename T, typename U, typename Body>\nclass concrete_filter: public tbb::filter {\n    const Body& my_body;\n    typedef token_helper<T,is_large_object<T>::value > t_helper;\n    typedef typename t_helper::pointer t_pointer;\n    typedef token_helper<U,is_large_object<U>::value > u_helper;\n    typedef typename u_helper::pointer u_pointer;\n\n    /*override*/ void* operator()(void* input) {\n        t_pointer temp_input = t_helper::cast_from_void_ptr(input);\n        u_pointer output_u = u_helper::create_token(my_body(t_helper::token(temp_input)));\n        t_helper::destroy_token(temp_input);\n        return u_helper::cast_to_void_ptr(output_u);\n    }\n\n    /*override*/ void finalize(void * input) {\n        t_pointer temp_input = t_helper::cast_from_void_ptr(input);\n        t_helper::destroy_token(temp_input);\n    }\n\npublic:\n    concrete_filter(tbb::filter::mode filter_mode, const Body& body) : filter(filter_mode), my_body(body) {}\n};\n\n// input \ntemplate<typename U, typename Body>\nclass concrete_filter<void,U,Body>: public filter {\n    const Body& my_body;\n    typedef token_helper<U, is_large_object<U>::value > u_helper;\n    typedef typename u_helper::pointer u_pointer;\n\n    /*override*/void* operator()(void*) {\n        flow_control control;\n        u_pointer output_u = u_helper::create_token(my_body(control));\n        if(control.is_pipeline_stopped) {\n            u_helper::destroy_token(output_u);\n            set_end_of_input();\n            return NULL;\n        }\n        return u_helper::cast_to_void_ptr(output_u);\n    }\n\npublic:\n    concrete_filter(tbb::filter::mode filter_mode, const Body& body) : \n        filter(static_cast<tbb::filter::mode>(filter_mode | filter_may_emit_null)),\n        my_body(body)\n    {}\n};\n\ntemplate<typename T, typename Body>\nclass concrete_filter<T,void,Body>: public filter {\n    const Body& my_body;\n    typedef token_helper<T, is_large_object<T>::value > t_helper;\n    typedef typename t_helper::pointer t_pointer;\n   \n    /*override*/ void* operator()(void* input) {\n        t_pointer temp_input = t_helper::cast_from_void_ptr(input);\n        my_body(t_helper::token(temp_input));\n        t_helper::destroy_token(temp_input);\n        return NULL;\n    }\n    /*override*/ void finalize(void* input) {\n        t_pointer temp_input = t_helper::cast_from_void_ptr(input);\n        t_helper::destroy_token(temp_input);\n    }\n\npublic:\n    concrete_filter(tbb::filter::mode filter_mode, const Body& body) : filter(filter_mode), my_body(body) {}\n};\n\ntemplate<typename Body>\nclass concrete_filter<void,void,Body>: public filter {\n    const Body& my_body;\n    \n    /** Override privately because it is always called virtually */\n    /*override*/ void* operator()(void*) {\n        flow_control control;\n        my_body(control);\n        void* output = control.is_pipeline_stopped ? NULL : (void*)(intptr_t)-1; \n        return output;\n    }\npublic:\n    concrete_filter(filter::mode filter_mode, const Body& body) : filter(filter_mode), my_body(body) {}\n};\n\n//! The class that represents an object of the pipeline for parallel_pipeline().\n/** It primarily serves as RAII class that deletes heap-allocated filter instances. */\nclass pipeline_proxy {\n    tbb::pipeline my_pipe;\npublic:\n    pipeline_proxy( const filter_t<void,void>& filter_chain );\n    ~pipeline_proxy() {\n        while( filter* f = my_pipe.filter_list ) \n            delete f; // filter destructor removes it from the pipeline\n    }\n    tbb::pipeline* operator->() { return &my_pipe; }\n};\n\n//! Abstract base class that represents a node in a parse tree underlying a filter_t.\n/** These nodes are always heap-allocated and can be shared by filter_t objects. */\nclass filter_node: tbb::internal::no_copy {\n    /** Count must be atomic because it is hidden state for user, but might be shared by threads. */\n    tbb::atomic<intptr_t> ref_count;\nprotected:\n    filter_node() {\n        ref_count = 0;\n#ifdef __TBB_TEST_FILTER_NODE_COUNT\n        ++(__TBB_TEST_FILTER_NODE_COUNT);\n#endif\n    }\npublic:\n    //! Add concrete_filter to pipeline \n    virtual void add_to( pipeline& ) = 0;\n    //! Increment reference count\n    void add_ref() {++ref_count;}\n    //! Decrement reference count and delete if it becomes zero.\n    void remove_ref() {\n        __TBB_ASSERT(ref_count>0,\"ref_count underflow\");\n        if( --ref_count==0 ) \n            delete this;\n    }\n    virtual ~filter_node() {\n#ifdef __TBB_TEST_FILTER_NODE_COUNT\n        --(__TBB_TEST_FILTER_NODE_COUNT);\n#endif\n    }\n};\n\n//! Node in parse tree representing result of make_filter.\ntemplate<typename T, typename U, typename Body>\nclass filter_node_leaf: public filter_node  {\n    const tbb::filter::mode mode;\n    const Body body;\n    /*override*/void add_to( pipeline& p ) {\n        concrete_filter<T,U,Body>* f = new concrete_filter<T,U,Body>(mode,body);\n        p.add_filter( *f );\n    }\npublic:\n    filter_node_leaf( tbb::filter::mode m, const Body& b ) : mode(m), body(b) {}\n};\n\n//! Node in parse tree representing join of two filters.\nclass filter_node_join: public filter_node {\n    friend class filter_node; // to suppress GCC 3.2 warnings\n    filter_node& left;\n    filter_node& right;\n    /*override*/~filter_node_join() {\n       left.remove_ref();\n       right.remove_ref();\n    }\n    /*override*/void add_to( pipeline& p ) {\n        left.add_to(p);\n        right.add_to(p);\n    }\npublic:\n    filter_node_join( filter_node& x, filter_node& y ) : left(x), right(y) {\n       left.add_ref();\n       right.add_ref();\n    }\n};\n\n} // namespace internal\n//! @endcond\n\n//! Create a filter to participate in parallel_pipeline\ntemplate<typename T, typename U, typename Body>\nfilter_t<T,U> make_filter(tbb::filter::mode mode, const Body& body) {\n    return new internal::filter_node_leaf<T,U,Body>(mode, body);\n}\n\ntemplate<typename T, typename V, typename U>\nfilter_t<T,U> operator& (const filter_t<T,V>& left, const filter_t<V,U>& right) {\n    __TBB_ASSERT(left.root,\"cannot use default-constructed filter_t as left argument of '&'\");\n    __TBB_ASSERT(right.root,\"cannot use default-constructed filter_t as right argument of '&'\");\n    return new internal::filter_node_join(*left.root,*right.root);\n}\n\n//! Class representing a chain of type-safe pipeline filters\ntemplate<typename T, typename U>\nclass filter_t {\n    typedef internal::filter_node filter_node;\n    filter_node* root;\n    filter_t( filter_node* root_ ) : root(root_) {\n        root->add_ref();\n    }\n    friend class internal::pipeline_proxy;\n    template<typename T_, typename U_, typename Body>\n    friend filter_t<T_,U_> make_filter(tbb::filter::mode, const Body& );\n    template<typename T_, typename V_, typename U_>\n    friend filter_t<T_,U_> operator& (const filter_t<T_,V_>& , const filter_t<V_,U_>& );\npublic:\n    filter_t() : root(NULL) {}\n    filter_t( const filter_t<T,U>& rhs ) : root(rhs.root) {\n        if( root ) root->add_ref();\n    }\n    template<typename Body>\n    filter_t( tbb::filter::mode mode, const Body& body ) :\n        root( new internal::filter_node_leaf<T,U,Body>(mode, body) ) {\n        root->add_ref();\n    }\n\n    void operator=( const filter_t<T,U>& rhs ) {\n        // Order of operations below carefully chosen so that reference counts remain correct\n        // in unlikely event that remove_ref throws exception.\n        filter_node* old = root;\n        root = rhs.root; \n        if( root ) root->add_ref();\n        if( old ) old->remove_ref();\n    }\n    ~filter_t() {\n        if( root ) root->remove_ref();\n    }\n    void clear() {\n        // Like operator= with filter_t() on right side.\n        if( root ) {\n            filter_node* old = root;\n            root = NULL;\n            old->remove_ref();\n        }\n    }\n};\n\ninline internal::pipeline_proxy::pipeline_proxy( const filter_t<void,void>& filter_chain ) : my_pipe() {\n    __TBB_ASSERT( filter_chain.root, \"cannot apply parallel_pipeline to default-constructed filter_t\"  );\n    filter_chain.root->add_to(my_pipe);\n}\n\ninline void parallel_pipeline(size_t max_number_of_live_tokens, const filter_t<void,void>& filter_chain\n#if __TBB_TASK_GROUP_CONTEXT\n    , tbb::task_group_context& context\n#endif\n    ) {\n    internal::pipeline_proxy pipe(filter_chain);\n    // tbb::pipeline::run() is called via the proxy\n    pipe->run(max_number_of_live_tokens\n#if __TBB_TASK_GROUP_CONTEXT\n              , context\n#endif\n    );\n}\n\n#if __TBB_TASK_GROUP_CONTEXT\ninline void parallel_pipeline(size_t max_number_of_live_tokens, const filter_t<void,void>& filter_chain) {\n    tbb::task_group_context context;\n    parallel_pipeline(max_number_of_live_tokens, filter_chain, context);\n}\n#endif // __TBB_TASK_GROUP_CONTEXT\n\n} // interface6\n\nusing interface6::flow_control;\nusing interface6::filter_t;\nusing interface6::make_filter;\nusing interface6::parallel_pipeline;\n\n} // tbb\n\n#endif /* __TBB_pipeline_H */\n"
  },
  {
    "path": "benchmarks/tbb/private_server.cpp",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#include \"rml_tbb.h\"\n#include \"../server/thread_monitor.h\"\n#include \"tbb/atomic.h\"\n#include \"tbb/cache_aligned_allocator.h\"\n#include \"scheduler_common.h\"\n#include \"governor.h\"\n#include \"tbb_misc.h\"\n\nusing rml::internal::thread_monitor;\n\nnamespace tbb {\nnamespace internal {\nnamespace rml {\n\ntypedef thread_monitor::handle_type thread_handle;\n\nclass private_server;\n\nclass private_worker: no_copy {\n    //! State in finite-state machine that controls the worker.\n    /** State diagram:\n        init --> starting --> normal\n          |         |           |\n          |         V           |\n          \\------> quit <------/\n      */\n    enum state_t {\n        //! *this is initialized\n        st_init,\n        //! *this has associated thread that is starting up.\n        st_starting,\n        //! Associated thread is doing normal life sequence.\n        st_normal,\n        //! Associated thread has ended normal life sequence and promises to never touch *this again.\n        st_quit\n    };\n    atomic<state_t> my_state;\n    \n    //! Associated server\n    private_server& my_server; \n\n    //! Associated client\n    tbb_client& my_client; \n\n    //! index used for avoiding the 64K aliasing problem\n    const size_t my_index;\n\n    //! Monitor for sleeping when there is no work to do.\n    /** The invariant that holds for sleeping workers is:\n        \"my_slack<=0 && my_state==st_normal && I am on server's list of asleep threads\" */\n    thread_monitor my_thread_monitor;\n\n    //! Handle of the OS thread associated with this worker\n    thread_handle my_handle;\n\n    //! Link for list of workers that are sleeping or have no associated thread.\n    private_worker* my_next;\n\n    friend class private_server;\n\n    //! Actions executed by the associated thread \n    void run();\n\n    //! Wake up associated thread (or launch a thread if there is none)\n    void wake_or_launch();\n\n    //! Called by a thread (usually not the associated thread) to commence termination.\n    void start_shutdown();\n\n    static __RML_DECL_THREAD_ROUTINE thread_routine( void* arg );\n\n    static void release_handle(thread_handle my_handle);\n\nprotected:\n    private_worker( private_server& server, tbb_client& client, const size_t i ) : \n        my_server(server),\n        my_client(client),\n        my_index(i)\n    {\n        my_state = st_init;\n    }\n};\n\nstatic const size_t cache_line_size = tbb::internal::NFS_MaxLineSize;\n\n\n#if _MSC_VER && !defined(__INTEL_COMPILER)\n    // Suppress overzealous compiler warnings about uninstantiable class\n    #pragma warning(push)\n    #pragma warning(disable:4510 4610)\n#endif\nclass padded_private_worker: public private_worker {\n    char pad[cache_line_size - sizeof(private_worker)%cache_line_size];\npublic:\n    padded_private_worker( private_server& server, tbb_client& client, const size_t i )\n    : private_worker(server,client,i) { suppress_unused_warning(pad); }\n};\n#if _MSC_VER && !defined(__INTEL_COMPILER)\n    #pragma warning(pop)\n#endif\n\nclass private_server: public tbb_server, no_copy {\n    tbb_client& my_client;\n    //! Maximum number of threads to be created.\n    /** Threads are created lazily, so maximum might not actually be reached. */\n    const tbb_client::size_type my_n_thread;\n\n    //! Stack size for each thread. */\n    const size_t my_stack_size;\n\n    //! Number of jobs that could use their associated thread minus number of active threads.\n    /** If negative, indicates oversubscription.\n        If positive, indicates that more threads should run. \n        Can be lowered asynchronously, but must be raised only while holding my_asleep_list_mutex,\n        because raising it impacts the invariant for sleeping threads. */\n    atomic<int> my_slack;\n\n    //! Counter used to determine when to delete this.\n    atomic<int> my_ref_count;\n\n    padded_private_worker* my_thread_array;\n\n    //! List of workers that are asleep or committed to sleeping until notified by another thread.\n    tbb::atomic<private_worker*> my_asleep_list_root;\n\n    //! Protects my_asleep_list_root\n    typedef scheduler_mutex_type asleep_list_mutex_type;\n    asleep_list_mutex_type my_asleep_list_mutex;\n\n#if TBB_USE_ASSERT\n    atomic<int> my_net_slack_requests;\n#endif /* TBB_USE_ASSERT */\n\n    //! Wake up to two sleeping workers, if there are any sleeping.\n    /** The call is used to propagate a chain reaction where each thread wakes up two threads,\n        which in turn each wake up two threads, etc. */\n    void propagate_chain_reaction() {\n        // First test of a double-check idiom.  Second test is inside wake_some(0).\n        if( my_asleep_list_root ) \n            wake_some(0);\n    }\n\n    //! Try to add t to list of sleeping workers\n    bool try_insert_in_asleep_list( private_worker& t );\n\n    //! Equivalent of adding additional_slack to my_slack and waking up to 2 threads if my_slack permits.\n    void wake_some( int additional_slack );\n\n    virtual ~private_server();\n    \n    void remove_server_ref() {\n        if( --my_ref_count==0 ) {\n            my_client.acknowledge_close_connection();\n            this->~private_server();\n            tbb::cache_aligned_allocator<private_server>().deallocate( this, 1 );\n        } \n    }\n\n    friend class private_worker;\npublic:\n    private_server( tbb_client& client );\n\n    /*override*/ version_type version() const {\n        return 0;\n    } \n\n    /*override*/ void request_close_connection( bool /*exiting*/ ) {\n        for( size_t i=0; i<my_n_thread; ++i )\n            my_thread_array[i].start_shutdown();\n        remove_server_ref();\n    }\n\n    /*override*/ void yield() {__TBB_Yield();}\n\n    /*override*/ void independent_thread_number_changed( int ) {__TBB_ASSERT(false,NULL);}\n\n    /*override*/ unsigned default_concurrency() const { return governor::default_num_threads() - 1; }\n\n    /*override*/ void adjust_job_count_estimate( int delta );\n\n#if _WIN32||_WIN64\n    /*override*/ void register_master ( ::rml::server::execution_resource_t& ) {}\n    /*override*/ void unregister_master ( ::rml::server::execution_resource_t ) {}\n#endif /* _WIN32||_WIN64 */\n};\n\n//------------------------------------------------------------------------\n// Methods of private_worker\n//------------------------------------------------------------------------\n#if _MSC_VER && !defined(__INTEL_COMPILER)\n    // Suppress overzealous compiler warnings about an initialized variable 'sink_for_alloca' not referenced\n    #pragma warning(push)\n    #pragma warning(disable:4189)\n#endif\n#if __MINGW32__ && __GNUC__==4 &&__GNUC_MINOR__>=2 && !__MINGW64__\n// ensure that stack is properly aligned for TBB threads\n__attribute__((force_align_arg_pointer))\n#endif\n__RML_DECL_THREAD_ROUTINE private_worker::thread_routine( void* arg ) {\n    private_worker* self = static_cast<private_worker*>(arg);\n    AVOID_64K_ALIASING( self->my_index );\n#if _XBOX\n    int HWThreadIndex = __TBB_XBOX360_GetHardwareThreadIndex(i);\n    XSetThreadProcessor(GetCurrentThread(), HWThreadIndex);\n#endif\n    self->run();\n    return 0;\n}\n#if _MSC_VER && !defined(__INTEL_COMPILER)\n    #pragma warning(pop)\n#endif\n\nvoid private_worker::release_handle(thread_handle handle) {\n    if (governor::needsWaitWorkers())\n        thread_monitor::join(handle);\n    else\n        thread_monitor::detach_thread(handle);\n}\n\nvoid private_worker::start_shutdown() {\n    state_t s;\n\n    do {\n        s = my_state;\n        __TBB_ASSERT( s!=st_quit, NULL );\n    } while( my_state.compare_and_swap( st_quit, s )!=s );\n    if( s==st_normal || s==st_starting ) {\n        // May have invalidated invariant for sleeping, so wake up the thread.\n        // Note that the notify() here occurs without maintaining invariants for my_slack.\n        // It does not matter, because my_state==st_quit overrides checking of my_slack.\n        my_thread_monitor.notify();\n        // Do not need release handle in st_init state,\n        // because in this case the thread wasn't started yet.\n        // For st_starting release is done at launch site.\n        if (s==st_normal)\n            release_handle(my_handle);\n    } else if( s==st_init ) {\n        // Perform action that otherwise would be performed by associated thread when it quits.\n        my_server.remove_server_ref();\n    }\n}\n\nvoid private_worker::run() {\n    my_server.propagate_chain_reaction();\n\n    // Transiting to st_normal here would require setting my_handle,\n    // which would create race with the launching thread and \n    // complications in handle management on Windows.\n\n    ::rml::job& j = *my_client.create_one_job();\n    while( my_state!=st_quit ) {\n        if( my_server.my_slack>=0 ) {\n            my_client.process(j);\n        } else {\n            thread_monitor::cookie c;\n            // Prepare to wait\n            my_thread_monitor.prepare_wait(c);\n            // Check/set the invariant for sleeping\n            if( my_state!=st_quit && my_server.try_insert_in_asleep_list(*this) ) {\n                my_thread_monitor.commit_wait(c);\n                my_server.propagate_chain_reaction();\n            } else {\n                // Invariant broken\n                my_thread_monitor.cancel_wait();\n            }\n        }\n    }\n    my_client.cleanup(j);\n\n    ++my_server.my_slack;\n    my_server.remove_server_ref();\n}\n\ninline void private_worker::wake_or_launch() {\n    if( my_state==st_init && my_state.compare_and_swap( st_starting, st_init )==st_init ) {\n        // after this point, remove_server_ref() must be done by created thread\n#if USE_WINTHREAD\n        my_handle = thread_monitor::launch( thread_routine, this, my_server.my_stack_size, &this->my_index );\n#elif USE_PTHREAD\n        {\n        affinity_helper fpa;\n        fpa.protect_affinity_mask();\n        my_handle = thread_monitor::launch( thread_routine, this, my_server.my_stack_size );\n        // Implicit destruction of fpa resets original affinity mask.\n        }\n#endif /* USE_PTHREAD */\n        state_t s = my_state.compare_and_swap( st_normal, st_starting );\n        if (st_starting != s) {\n            // Do shutdown during startup. my_handle can't be released\n            // by start_shutdown, because my_handle value might be not set yet\n            // at time of transition from st_starting to st_quit.\n            __TBB_ASSERT( s==st_quit, NULL );\n            release_handle(my_handle);\n        }\n    }\n    else\n        my_thread_monitor.notify();\n}\n\n//------------------------------------------------------------------------\n// Methods of private_server\n//------------------------------------------------------------------------\nprivate_server::private_server( tbb_client& client ) : \n    my_client(client), \n    my_n_thread(client.max_job_count()),\n    my_stack_size(client.min_stack_size()),\n    my_thread_array(NULL) \n{\n    my_ref_count = my_n_thread+1;\n    my_slack = 0;\n#if TBB_USE_ASSERT\n    my_net_slack_requests = 0;\n#endif /* TBB_USE_ASSERT */\n    my_asleep_list_root = NULL;\n    my_thread_array = tbb::cache_aligned_allocator<padded_private_worker>().allocate( my_n_thread );\n    memset( my_thread_array, 0, sizeof(private_worker)*my_n_thread );\n    for( size_t i=0; i<my_n_thread; ++i ) {\n        private_worker* t = new( &my_thread_array[i] ) padded_private_worker( *this, client, i ); \n        t->my_next = my_asleep_list_root;\n        my_asleep_list_root = t;\n    } \n}\n\nprivate_server::~private_server() {\n    __TBB_ASSERT( my_net_slack_requests==0, NULL );\n    for( size_t i=my_n_thread; i--; ) \n        my_thread_array[i].~padded_private_worker();\n    tbb::cache_aligned_allocator<padded_private_worker>().deallocate( my_thread_array, my_n_thread );\n    tbb::internal::poison_pointer( my_thread_array );\n}\n\ninline bool private_server::try_insert_in_asleep_list( private_worker& t ) {\n    asleep_list_mutex_type::scoped_lock lock;\n    if( !lock.try_acquire(my_asleep_list_mutex) )\n        return false;\n    // Contribute to slack under lock so that if another takes that unit of slack,\n    // it sees us sleeping on the list and wakes us up.\n    int k = ++my_slack;\n    if( k<=0 ) {\n        t.my_next = my_asleep_list_root;\n        my_asleep_list_root = &t;\n        return true;\n    } else {\n        --my_slack;\n        return false;\n    }\n}\n\nvoid private_server::wake_some( int additional_slack ) {\n    __TBB_ASSERT( additional_slack>=0, NULL );\n    private_worker* wakee[2];\n    private_worker**w = wakee;\n    {\n        asleep_list_mutex_type::scoped_lock lock(my_asleep_list_mutex);\n        while( my_asleep_list_root && w<wakee+2 ) {\n            if( additional_slack>0 ) {\n                if (additional_slack+my_slack<=0) // additional demand does not exceed surplus supply\n                    break;\n                --additional_slack;\n            } else {\n                // Chain reaction; Try to claim unit of slack\n                int old;\n                do {\n                    old = my_slack;\n                    if( old<=0 ) goto done;\n                } while( my_slack.compare_and_swap(old-1,old)!=old );\n            }\n            // Pop sleeping worker to combine with claimed unit of slack\n            my_asleep_list_root = (*w++ = my_asleep_list_root)->my_next;\n        }\n        if( additional_slack ) {\n            // Contribute our unused slack to my_slack.\n            my_slack += additional_slack;\n        }\n    }\ndone:\n    while( w>wakee ) \n        (*--w)->wake_or_launch();\n}\n\nvoid private_server::adjust_job_count_estimate( int delta ) {\n#if TBB_USE_ASSERT\n    my_net_slack_requests+=delta;\n#endif /* TBB_USE_ASSERT */\n    if( delta<0 ) {\n        my_slack+=delta;\n    } else if( delta>0 ) {\n        wake_some( delta );\n    }\n}\n\n//! Factory method called from task.cpp to create a private_server.\ntbb_server* make_private_server( tbb_client& client ) {\n    return new( tbb::cache_aligned_allocator<private_server>().allocate(1) ) private_server(client);\n}\n\n} // namespace rml\n} // namespace internal\n\n} // namespace tbb\n"
  },
  {
    "path": "benchmarks/tbb/queuing_mutex.cpp",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#include \"tbb/queuing_mutex.h\"\n#include \"tbb/tbb_machine.h\"\n#include \"tbb/tbb_stddef.h\"\n#include \"tbb_misc.h\"\n#include \"itt_notify.h\"\n\nnamespace tbb {\n\nusing namespace internal;\n\n//! A method to acquire queuing_mutex lock\nvoid queuing_mutex::scoped_lock::acquire( queuing_mutex& m )\n{\n    __TBB_ASSERT( !this->mutex, \"scoped_lock is already holding a mutex\");\n\n    // Must set all fields before the fetch_and_store, because once the\n    // fetch_and_store executes, *this becomes accessible to other threads.\n    mutex = &m;\n    next  = NULL;\n    going = 0;\n\n    // The fetch_and_store must have release semantics, because we are\n    // \"sending\" the fields initialized above to other processors.\n    scoped_lock* pred = m.q_tail.fetch_and_store<tbb::release>(this);\n    if( pred ) {\n        ITT_NOTIFY(sync_prepare, mutex);\n#if TBB_USE_ASSERT\n        __TBB_control_consistency_helper(); // on \"m.q_tail\"\n        __TBB_ASSERT( !pred->next, \"the predecessor has another successor!\");\n#endif\n        pred->next = this;\n        spin_wait_while_eq( going, 0ul );\n    }\n    ITT_NOTIFY(sync_acquired, mutex);\n\n    // Force acquire so that user's critical section receives correct values\n    // from processor that was previously in the user's critical section.\n    __TBB_load_with_acquire(going);\n}\n\n//! A method to acquire queuing_mutex if it is free\nbool queuing_mutex::scoped_lock::try_acquire( queuing_mutex& m )\n{\n    __TBB_ASSERT( !this->mutex, \"scoped_lock is already holding a mutex\");\n\n    // Must set all fields before the fetch_and_store, because once the\n    // fetch_and_store executes, *this becomes accessible to other threads.\n    next  = NULL;\n    going = 0;\n\n    // The CAS must have release semantics, because we are\n    // \"sending\" the fields initialized above to other processors.\n    if( m.q_tail.compare_and_swap<tbb::release>(this, NULL) )\n        return false;\n\n    // Force acquire so that user's critical section receives correct values\n    // from processor that was previously in the user's critical section.\n    // try_acquire should always have acquire semantic, even if failed.\n    __TBB_load_with_acquire(going);\n    mutex = &m;\n    ITT_NOTIFY(sync_acquired, mutex);\n    return true;\n}\n\n//! A method to release queuing_mutex lock\nvoid queuing_mutex::scoped_lock::release( )\n{\n    __TBB_ASSERT(this->mutex!=NULL, \"no lock acquired\");\n\n    ITT_NOTIFY(sync_releasing, mutex);\n    if( !next ) {\n        if( this == mutex->q_tail.compare_and_swap<tbb::release>(NULL, this) ) {\n            // this was the only item in the queue, and the queue is now empty.\n            goto done;\n        }\n        // Someone in the queue\n        spin_wait_while_eq( next, (scoped_lock*)0 );\n    }\n    __TBB_ASSERT(next,NULL);\n    __TBB_store_with_release(next->going, 1);\ndone:\n    initialize();\n}\n\nvoid queuing_mutex::internal_construct() {\n    ITT_SYNC_CREATE(this, _T(\"tbb::queuing_mutex\"), _T(\"\"));\n}\n\n} // namespace tbb\n"
  },
  {
    "path": "benchmarks/tbb/queuing_mutex.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_queuing_mutex_H\n#define __TBB_queuing_mutex_H\n\n#include \"tbb_config.h\"\n\n#if !TBB_USE_EXCEPTIONS && _MSC_VER\n    // Suppress \"C++ exception handler used, but unwind semantics are not enabled\" warning in STL headers\n    #pragma warning (push)\n    #pragma warning (disable: 4530)\n#endif\n\n#include <cstring>\n\n#if !TBB_USE_EXCEPTIONS && _MSC_VER\n    #pragma warning (pop)\n#endif\n\n#include \"atomic.h\"\n#include \"tbb_profiling.h\"\n\nnamespace tbb {\n\n//! Queuing mutex with local-only spinning.\n/** @ingroup synchronization */\nclass queuing_mutex : internal::mutex_copy_deprecated_and_disabled {\npublic:\n    //! Construct unacquired mutex.\n    queuing_mutex() {\n        q_tail = NULL;\n#if TBB_USE_THREADING_TOOLS\n        internal_construct();\n#endif\n    }\n\n    //! The scoped locking pattern\n    /** It helps to avoid the common problem of forgetting to release lock.\n        It also nicely provides the \"node\" for queuing locks. */\n    class scoped_lock: internal::no_copy {\n        //! Initialize fields to mean \"no lock held\".\n        void initialize() {\n            mutex = NULL;\n#if TBB_USE_ASSERT\n            internal::poison_pointer(next);\n#endif /* TBB_USE_ASSERT */\n        }\n\n    public:\n        //! Construct lock that has not acquired a mutex.\n        /** Equivalent to zero-initialization of *this. */\n        scoped_lock() {initialize();}\n\n        //! Acquire lock on given mutex.\n        scoped_lock( queuing_mutex& m ) {\n            initialize();\n            acquire(m);\n        }\n\n        //! Release lock (if lock is held).\n        ~scoped_lock() {\n            if( mutex ) release();\n        }\n\n        //! Acquire lock on given mutex.\n        void __TBB_EXPORTED_METHOD acquire( queuing_mutex& m );\n\n        //! Acquire lock on given mutex if free (i.e. non-blocking)\n        bool __TBB_EXPORTED_METHOD try_acquire( queuing_mutex& m );\n\n        //! Release lock.\n        void __TBB_EXPORTED_METHOD release();\n\n    private:\n        //! The pointer to the mutex owned, or NULL if not holding a mutex.\n        queuing_mutex* mutex;\n\n        //! The pointer to the next competitor for a mutex\n        scoped_lock *next;\n\n        //! The local spin-wait variable\n        /** Inverted (0 - blocked, 1 - acquired the mutex) for the sake of\n            zero-initialization.  Defining it as an entire word instead of\n            a byte seems to help performance slightly. */\n        uintptr_t going;\n    };\n\n    void __TBB_EXPORTED_METHOD internal_construct();\n\n    // Mutex traits\n    static const bool is_rw_mutex = false;\n    static const bool is_recursive_mutex = false;\n    static const bool is_fair_mutex = true;\n\nprivate:\n    //! The last competitor requesting the lock\n    atomic<scoped_lock*> q_tail;\n\n};\n\n__TBB_DEFINE_PROFILING_SET_NAME(queuing_mutex)\n\n} // namespace tbb\n\n#endif /* __TBB_queuing_mutex_H */\n"
  },
  {
    "path": "benchmarks/tbb/queuing_rw_mutex.cpp",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n/** Before making any changes in the implementation, please emulate algorithmic changes\n    with SPIN tool using <TBB directory>/tools/spin_models/ReaderWriterMutex.pml.\n    There could be some code looking as \"can be restructured\" but its structure does matter! */\n\n#include \"tbb/queuing_rw_mutex.h\"\n#include \"tbb/tbb_machine.h\"\n#include \"tbb/tbb_stddef.h\"\n#include \"tbb/tbb_machine.h\"\n#include \"itt_notify.h\"\n\n\nnamespace tbb {\n\nusing namespace internal;\n\n//! Flag bits in a state_t that specify information about a locking request.\nenum state_t_flags {\n    STATE_NONE                   = 0,\n    STATE_WRITER                 = 1<<0,\n    STATE_READER                 = 1<<1,\n    STATE_READER_UNBLOCKNEXT     = 1<<2,\n    STATE_ACTIVEREADER           = 1<<3,\n    STATE_UPGRADE_REQUESTED      = 1<<4,\n    STATE_UPGRADE_WAITING        = 1<<5,\n    STATE_UPGRADE_LOSER          = 1<<6,\n    STATE_COMBINED_WAITINGREADER = STATE_READER | STATE_READER_UNBLOCKNEXT,\n    STATE_COMBINED_READER        = STATE_COMBINED_WAITINGREADER | STATE_ACTIVEREADER,\n    STATE_COMBINED_UPGRADING     = STATE_UPGRADE_WAITING | STATE_UPGRADE_LOSER\n};\n\nconst unsigned char RELEASED = 0;\nconst unsigned char ACQUIRED = 1;\n\ninline bool queuing_rw_mutex::scoped_lock::try_acquire_internal_lock()\n{\n    return as_atomic(my_internal_lock).compare_and_swap<tbb::acquire>(ACQUIRED,RELEASED) == RELEASED;\n}\n\ninline void queuing_rw_mutex::scoped_lock::acquire_internal_lock()\n{\n    // Usually, we would use the test-test-and-set idiom here, with exponential backoff.\n    // But so far, experiments indicate there is no value in doing so here.\n    while( !try_acquire_internal_lock() ) {\n        __TBB_Pause(1);\n    }\n}\n\ninline void queuing_rw_mutex::scoped_lock::release_internal_lock()\n{\n    __TBB_store_with_release(my_internal_lock,RELEASED);\n}\n\ninline void queuing_rw_mutex::scoped_lock::wait_for_release_of_internal_lock()\n{\n    spin_wait_until_eq(my_internal_lock, RELEASED);\n}\n\ninline void queuing_rw_mutex::scoped_lock::unblock_or_wait_on_internal_lock( uintptr_t flag ) {\n    if( flag )\n        wait_for_release_of_internal_lock();\n    else\n        release_internal_lock();\n}\n\n#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)\n    // Workaround for overzealous compiler warnings\n    #pragma warning (push)\n    #pragma warning (disable: 4311 4312)\n#endif\n\n//! A view of a T* with additional functionality for twiddling low-order bits.\ntemplate<typename T>\nclass tricky_atomic_pointer: no_copy {\npublic:\n    typedef typename atomic_selector<sizeof(T*)>::word word;\n\n    template<memory_semantics M>\n    static T* fetch_and_add( T* volatile * location, word addend ) {\n        return reinterpret_cast<T*>( atomic_traits<sizeof(T*),M>::fetch_and_add(location, addend) );\n    }\n    template<memory_semantics M>\n    static T* fetch_and_store( T* volatile * location, T* value ) {\n        return reinterpret_cast<T*>( atomic_traits<sizeof(T*),M>::fetch_and_store(location, reinterpret_cast<word>(value)) );\n    }\n    template<memory_semantics M>\n    static T* compare_and_swap( T* volatile * location, T* value, T* comparand ) {\n        return reinterpret_cast<T*>(\n                 atomic_traits<sizeof(T*),M>::compare_and_swap(location, reinterpret_cast<word>(value),\n                                                              reinterpret_cast<word>(comparand))\n               );\n    }\n\n    T* & ref;\n    tricky_atomic_pointer( T*& original ) : ref(original) {};\n    tricky_atomic_pointer( T* volatile & original ) : ref(original) {};\n    T* operator&( word operand2 ) const {\n        return reinterpret_cast<T*>( reinterpret_cast<word>(ref) & operand2 );\n    }\n    T* operator|( word operand2 ) const {\n        return reinterpret_cast<T*>( reinterpret_cast<word>(ref) | operand2 );\n    }\n};\n\ntypedef tricky_atomic_pointer<queuing_rw_mutex::scoped_lock> tricky_pointer;\n\n#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)\n    // Workaround for overzealous compiler warnings\n    #pragma warning (pop)\n#endif\n\n//! Mask for low order bit of a pointer.\nstatic const tricky_pointer::word FLAG = 0x1;\n\ninline\nuintptr_t get_flag( queuing_rw_mutex::scoped_lock* ptr ) {\n    return uintptr_t(ptr) & FLAG;\n}\n\n//------------------------------------------------------------------------\n// Methods of queuing_rw_mutex::scoped_lock\n//------------------------------------------------------------------------\n\n//! A method to acquire queuing_rw_mutex lock\nvoid queuing_rw_mutex::scoped_lock::acquire( queuing_rw_mutex& m, bool write )\n{\n    __TBB_ASSERT( !my_mutex, \"scoped_lock is already holding a mutex\");\n\n    // Must set all fields before the fetch_and_store, because once the\n    // fetch_and_store executes, *this becomes accessible to other threads.\n    my_mutex = &m;\n    __TBB_store_relaxed(my_prev , (scoped_lock*)0);\n    __TBB_store_relaxed(my_next , (scoped_lock*)0);\n    __TBB_store_relaxed(my_going, 0);\n    my_state = state_t(write ? STATE_WRITER : STATE_READER);\n    my_internal_lock = RELEASED;\n\n    queuing_rw_mutex::scoped_lock* pred = m.q_tail.fetch_and_store<tbb::release>(this);\n\n    if( write ) {       // Acquiring for write\n\n        if( pred ) {\n            ITT_NOTIFY(sync_prepare, my_mutex);\n            pred = tricky_pointer(pred) & ~FLAG;\n            __TBB_ASSERT( !( uintptr_t(pred) & FLAG ), \"use of corrupted pointer!\" );\n#if TBB_USE_ASSERT\n            __TBB_control_consistency_helper(); // on \"m.q_tail\"\n            __TBB_ASSERT( !__TBB_load_relaxed(pred->my_next), \"the predecessor has another successor!\");\n#endif\n           __TBB_store_with_release(pred->my_next,this);\n            spin_wait_until_eq(my_going, 1);\n        }\n\n    } else {            // Acquiring for read\n#if DO_ITT_NOTIFY\n        bool sync_prepare_done = false;\n#endif\n        if( pred ) {\n            unsigned short pred_state;\n            __TBB_ASSERT( !__TBB_load_relaxed(my_prev), \"the predecessor is already set\" );\n            if( uintptr_t(pred) & FLAG ) {\n                /* this is only possible if pred is an upgrading reader and it signals us to wait */\n                pred_state = STATE_UPGRADE_WAITING;\n                pred = tricky_pointer(pred) & ~FLAG;\n            } else {\n                // Load pred->my_state now, because once pred->my_next becomes\n                // non-NULL, we must assume that *pred might be destroyed.\n                pred_state = pred->my_state.compare_and_swap<tbb::acquire>(STATE_READER_UNBLOCKNEXT, STATE_READER);\n            }\n            __TBB_store_relaxed(my_prev, pred);\n            __TBB_ASSERT( !( uintptr_t(pred) & FLAG ), \"use of corrupted pointer!\" );\n#if TBB_USE_ASSERT\n            __TBB_control_consistency_helper(); // on \"m.q_tail\"\n            __TBB_ASSERT( !__TBB_load_relaxed(pred->my_next), \"the predecessor has another successor!\");\n#endif\n           __TBB_store_with_release(pred->my_next,this);\n            if( pred_state != STATE_ACTIVEREADER ) {\n#if DO_ITT_NOTIFY\n                sync_prepare_done = true;\n                ITT_NOTIFY(sync_prepare, my_mutex);\n#endif\n                spin_wait_until_eq(my_going, 1);\n            }\n        }\n\n        // The protected state must have been acquired here before it can be further released to any other reader(s):\n        unsigned short old_state = my_state.compare_and_swap<tbb::acquire>(STATE_ACTIVEREADER, STATE_READER);\n        if( old_state!=STATE_READER ) {\n#if DO_ITT_NOTIFY\n            if( !sync_prepare_done )\n                ITT_NOTIFY(sync_prepare, my_mutex);\n#endif\n            // Failed to become active reader -> need to unblock the next waiting reader first\n            __TBB_ASSERT( my_state==STATE_READER_UNBLOCKNEXT, \"unexpected state\" );\n            spin_wait_while_eq(my_next, (scoped_lock*)NULL);\n            /* my_state should be changed before unblocking the next otherwise it might finish\n               and another thread can get our old state and left blocked */\n            my_state = STATE_ACTIVEREADER;\n           __TBB_store_with_release(my_next->my_going,1);\n        }\n    }\n\n    ITT_NOTIFY(sync_acquired, my_mutex);\n\n    // Force acquire so that user's critical section receives correct values\n    // from processor that was previously in the user's critical section.\n    __TBB_load_with_acquire(my_going);\n}\n\n//! A method to acquire queuing_rw_mutex if it is free\nbool queuing_rw_mutex::scoped_lock::try_acquire( queuing_rw_mutex& m, bool write )\n{\n    __TBB_ASSERT( !my_mutex, \"scoped_lock is already holding a mutex\");\n\n    if( load<relaxed>(m.q_tail) )\n        return false; // Someone already took the lock\n\n    // Must set all fields before the fetch_and_store, because once the\n    // fetch_and_store executes, *this becomes accessible to other threads.\n    __TBB_store_relaxed(my_prev, (scoped_lock*)0);\n    __TBB_store_relaxed(my_next, (scoped_lock*)0);\n    __TBB_store_relaxed(my_going, 0); // TODO: remove dead assignment?\n    my_state = state_t(write ? STATE_WRITER : STATE_ACTIVEREADER);\n    my_internal_lock = RELEASED;\n\n    // The CAS must have release semantics, because we are\n    // \"sending\" the fields initialized above to other processors.\n    if( m.q_tail.compare_and_swap<tbb::release>(this, NULL) )\n        return false; // Someone already took the lock\n    // Force acquire so that user's critical section receives correct values\n    // from processor that was previously in the user's critical section.\n    // try_acquire should always have acquire semantic, even if failed.\n    __TBB_load_with_acquire(my_going);\n    my_mutex = &m;\n    ITT_NOTIFY(sync_acquired, my_mutex);\n    return true;\n}\n\n//! A method to release queuing_rw_mutex lock\nvoid queuing_rw_mutex::scoped_lock::release( )\n{\n    __TBB_ASSERT(my_mutex!=NULL, \"no lock acquired\");\n\n    ITT_NOTIFY(sync_releasing, my_mutex);\n\n    if( my_state == STATE_WRITER ) { // Acquired for write\n\n        // The logic below is the same as \"writerUnlock\", but elides\n        // \"return\" from the middle of the routine.\n        // In the statement below, acquire semantics of reading my_next is required\n        // so that following operations with fields of my_next are safe.\n        scoped_lock* n = __TBB_load_with_acquire(my_next);\n        if( !n ) {\n            if( this == my_mutex->q_tail.compare_and_swap<tbb::release>(NULL, this) ) {\n                // this was the only item in the queue, and the queue is now empty.\n                goto done;\n            }\n            spin_wait_while_eq( my_next, (scoped_lock*)NULL );\n            n = __TBB_load_with_acquire(my_next);\n        }\n        __TBB_store_relaxed(n->my_going, 2); // protect next queue node from being destroyed too early\n        if( n->my_state==STATE_UPGRADE_WAITING ) {\n            // the next waiting for upgrade means this writer was upgraded before.\n            acquire_internal_lock();\n            queuing_rw_mutex::scoped_lock* tmp = tricky_pointer::fetch_and_store<tbb::release>(&(n->my_prev), NULL);\n            n->my_state = STATE_UPGRADE_LOSER;\n            __TBB_store_with_release(n->my_going,1);\n            unblock_or_wait_on_internal_lock(get_flag(tmp));\n        } else {\n            __TBB_ASSERT( my_state & (STATE_COMBINED_WAITINGREADER | STATE_WRITER), \"unexpected state\" );\n            __TBB_ASSERT( !( uintptr_t(__TBB_load_relaxed(n->my_prev)) & FLAG ), \"use of corrupted pointer!\" );\n            __TBB_store_relaxed(n->my_prev, (scoped_lock*)0);\n            __TBB_store_with_release(n->my_going,1);\n        }\n\n    } else { // Acquired for read\n\n        queuing_rw_mutex::scoped_lock *tmp = NULL;\nretry:\n        // Addition to the original paper: Mark my_prev as in use\n        queuing_rw_mutex::scoped_lock *pred = tricky_pointer::fetch_and_add<tbb::acquire>(&my_prev, FLAG);\n\n        if( pred ) {\n            if( !(pred->try_acquire_internal_lock()) )\n            {\n                // Failed to acquire the lock on pred. The predecessor either unlinks or upgrades.\n                // In the second case, it could or could not know my \"in use\" flag - need to check\n                tmp = tricky_pointer::compare_and_swap<tbb::release>(&my_prev, pred, tricky_pointer(pred) | FLAG );\n                if( !(uintptr_t(tmp) & FLAG) ) {\n                    // Wait for the predecessor to change my_prev (e.g. during unlink)\n                    spin_wait_while_eq( my_prev, tricky_pointer(pred)|FLAG );\n                    // Now owner of pred is waiting for _us_ to release its lock\n                    pred->release_internal_lock();\n                }\n                // else the \"in use\" flag is back -> the predecessor didn't get it and will release itself; nothing to do\n\n                tmp = NULL;\n                goto retry;\n            }\n            __TBB_ASSERT(pred && pred->my_internal_lock==ACQUIRED, \"predecessor's lock is not acquired\");\n            __TBB_store_relaxed(my_prev, pred);\n            acquire_internal_lock();\n\n            __TBB_store_with_release(pred->my_next,reinterpret_cast<scoped_lock *>(NULL));\n\n            if( !__TBB_load_relaxed(my_next) && this != my_mutex->q_tail.compare_and_swap<tbb::release>(pred, this) ) {\n                spin_wait_while_eq( my_next, (void*)NULL );\n            }\n            __TBB_ASSERT( !get_flag(__TBB_load_relaxed(my_next)), \"use of corrupted pointer\" );\n\n            // ensure acquire semantics of reading 'my_next'\n            if( scoped_lock *const l_next = __TBB_load_with_acquire(my_next) ) { // I->next != nil, TODO: rename to n after clearing up and adapting the n in the comment two lines below\n                // Equivalent to I->next->prev = I->prev but protected against (prev[n]&FLAG)!=0\n                tmp = tricky_pointer::fetch_and_store<tbb::release>(&(l_next->my_prev), pred);\n                // I->prev->next = I->next;\n                __TBB_ASSERT(__TBB_load_relaxed(my_prev)==pred, NULL);\n                __TBB_store_with_release(pred->my_next, my_next);\n            }\n            // Safe to release in the order opposite to acquiring which makes the code simpler\n            pred->release_internal_lock();\n\n        } else { // No predecessor when we looked\n            acquire_internal_lock();  // \"exclusiveLock(&I->EL)\"\n            scoped_lock* n = __TBB_load_with_acquire(my_next);\n            if( !n ) {\n                if( this != my_mutex->q_tail.compare_and_swap<tbb::release>(NULL, this) ) {\n                    spin_wait_while_eq( my_next, (scoped_lock*)NULL );\n                    n = __TBB_load_relaxed(my_next);\n                } else {\n                    goto unlock_self;\n                }\n            }\n            __TBB_store_relaxed(n->my_going, 2); // protect next queue node from being destroyed too early\n            tmp = tricky_pointer::fetch_and_store<tbb::release>(&(n->my_prev), NULL);\n            __TBB_store_with_release(n->my_going,1);\n        }\nunlock_self:\n        unblock_or_wait_on_internal_lock(get_flag(tmp));\n    }\ndone:\n    spin_wait_while_eq( my_going, 2 );\n\n    initialize();\n}\n\nbool queuing_rw_mutex::scoped_lock::downgrade_to_reader()\n{\n    __TBB_ASSERT( my_state==STATE_WRITER, \"no sense to downgrade a reader\" );\n\n    ITT_NOTIFY(sync_releasing, my_mutex);\n\n    if( ! __TBB_load_with_acquire(my_next) ) {\n        my_state = STATE_READER;\n        if( this==my_mutex->q_tail ) {\n            unsigned short old_state = my_state.compare_and_swap<tbb::release>(STATE_ACTIVEREADER, STATE_READER);\n            if( old_state==STATE_READER ) {\n                // Downgrade completed\n                return true;\n            }\n        }\n        /* wait for the next to register */\n        spin_wait_while_eq( my_next, (void*)NULL );\n    }\n    scoped_lock *const n = __TBB_load_relaxed(my_next);\n    __TBB_ASSERT( n, \"still no successor at this point!\" );\n    if( n->my_state & STATE_COMBINED_WAITINGREADER )\n        __TBB_store_with_release(n->my_going,1);\n    else if( n->my_state==STATE_UPGRADE_WAITING )\n        // the next waiting for upgrade means this writer was upgraded before.\n        n->my_state = STATE_UPGRADE_LOSER;\n    my_state = STATE_ACTIVEREADER;\n    return true;\n}\n\nbool queuing_rw_mutex::scoped_lock::upgrade_to_writer()\n{\n    __TBB_ASSERT( my_state==STATE_ACTIVEREADER, \"only active reader can be upgraded\" );\n\n    queuing_rw_mutex::scoped_lock * tmp;\n    queuing_rw_mutex::scoped_lock * me = this;\n\n    ITT_NOTIFY(sync_releasing, my_mutex);\n    my_state = STATE_UPGRADE_REQUESTED;\nrequested:\n    __TBB_ASSERT( !(uintptr_t(__TBB_load_relaxed(my_next)) & FLAG), \"use of corrupted pointer!\" );\n    acquire_internal_lock();\n    if( this != my_mutex->q_tail.compare_and_swap<tbb::release>(tricky_pointer(me)|FLAG, this) ) {\n        spin_wait_while_eq( my_next, (void*)NULL );\n        queuing_rw_mutex::scoped_lock * n;\n        n = tricky_pointer::fetch_and_add<tbb::acquire>(&my_next, FLAG);\n        unsigned short n_state = n->my_state;\n        /* the next reader can be blocked by our state. the best thing to do is to unblock it */\n        if( n_state & STATE_COMBINED_WAITINGREADER )\n            __TBB_store_with_release(n->my_going,1);\n        tmp = tricky_pointer::fetch_and_store<tbb::release>(&(n->my_prev), this);\n        unblock_or_wait_on_internal_lock(get_flag(tmp));\n        if( n_state & (STATE_COMBINED_READER | STATE_UPGRADE_REQUESTED) ) {\n            // save n|FLAG for simplicity of following comparisons\n            tmp = tricky_pointer(n)|FLAG;\n            for( atomic_backoff b; __TBB_load_relaxed(my_next)==tmp; b.pause() ) {\n                if( my_state & STATE_COMBINED_UPGRADING ) {\n                    if( __TBB_load_with_acquire(my_next)==tmp )\n                        __TBB_store_relaxed(my_next, n);\n                    goto waiting;\n                }\n            }\n            __TBB_ASSERT(__TBB_load_relaxed(my_next) != (tricky_pointer(n)|FLAG), NULL);\n            goto requested;\n        } else {\n            __TBB_ASSERT( n_state & (STATE_WRITER | STATE_UPGRADE_WAITING), \"unexpected state\");\n            __TBB_ASSERT( (tricky_pointer(n)|FLAG) == __TBB_load_relaxed(my_next), NULL);\n            __TBB_store_relaxed(my_next, n);\n        }\n    } else {\n        /* We are in the tail; whoever comes next is blocked by q_tail&FLAG */\n        release_internal_lock();\n    } // if( this != my_mutex->q_tail... )\n    my_state.compare_and_swap<tbb::acquire>(STATE_UPGRADE_WAITING, STATE_UPGRADE_REQUESTED);\n\nwaiting:\n    __TBB_ASSERT( !( intptr_t(__TBB_load_relaxed(my_next)) & FLAG ), \"use of corrupted pointer!\" );\n    __TBB_ASSERT( my_state & STATE_COMBINED_UPGRADING, \"wrong state at upgrade waiting_retry\" );\n    __TBB_ASSERT( me==this, NULL );\n    ITT_NOTIFY(sync_prepare, my_mutex);\n    /* if no one was blocked by the \"corrupted\" q_tail, turn it back */\n    my_mutex->q_tail.compare_and_swap<tbb::release>( this, tricky_pointer(me)|FLAG );\n    queuing_rw_mutex::scoped_lock * pred;\n    pred = tricky_pointer::fetch_and_add<tbb::acquire>(&my_prev, FLAG);\n    if( pred ) {\n        bool success = pred->try_acquire_internal_lock();\n        pred->my_state.compare_and_swap<tbb::release>(STATE_UPGRADE_WAITING, STATE_UPGRADE_REQUESTED);\n        if( !success ) {\n            tmp = tricky_pointer::compare_and_swap<tbb::release>(&my_prev, pred, tricky_pointer(pred)|FLAG );\n            if( uintptr_t(tmp) & FLAG ) {\n                spin_wait_while_eq(my_prev, pred);\n                pred = __TBB_load_relaxed(my_prev);\n            } else {\n                spin_wait_while_eq( my_prev, tricky_pointer(pred)|FLAG );\n                pred->release_internal_lock();\n            }\n        } else {\n            __TBB_store_relaxed(my_prev, pred);\n            pred->release_internal_lock();\n            spin_wait_while_eq(my_prev, pred);\n            pred = __TBB_load_relaxed(my_prev);\n        }\n        if( pred )\n            goto waiting;\n    } else {\n        // restore the corrupted my_prev field for possible further use (e.g. if downgrade back to reader)\n        __TBB_store_relaxed(my_prev, pred);\n    }\n    __TBB_ASSERT( !pred && !__TBB_load_relaxed(my_prev), NULL );\n\n    // additional lifetime issue prevention checks\n    // wait for the successor to finish working with my fields\n    wait_for_release_of_internal_lock();\n    // now wait for the predecessor to finish working with my fields\n    spin_wait_while_eq( my_going, 2 );\n\n    // Acquire critical section indirectly from previous owner or directly from predecessor (TODO: not clear).\n    __TBB_control_consistency_helper(); // on either \"my_mutex->q_tail\" or \"my_going\" (TODO: not clear)\n\n    bool result = ( my_state != STATE_UPGRADE_LOSER );\n    my_state = STATE_WRITER;\n    __TBB_store_relaxed(my_going, 1);\n\n    ITT_NOTIFY(sync_acquired, my_mutex);\n    return result;\n}\n\nvoid queuing_rw_mutex::internal_construct() {\n    ITT_SYNC_CREATE(this, _T(\"tbb::queuing_rw_mutex\"), _T(\"\"));\n}\n\n} // namespace tbb\n"
  },
  {
    "path": "benchmarks/tbb/queuing_rw_mutex.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_queuing_rw_mutex_H\n#define __TBB_queuing_rw_mutex_H\n\n#include \"tbb_config.h\"\n\n#if !TBB_USE_EXCEPTIONS && _MSC_VER\n    // Suppress \"C++ exception handler used, but unwind semantics are not enabled\" warning in STL headers\n    #pragma warning (push)\n    #pragma warning (disable: 4530)\n#endif\n\n#include <cstring>\n\n#if !TBB_USE_EXCEPTIONS && _MSC_VER\n    #pragma warning (pop)\n#endif\n\n#include \"atomic.h\"\n#include \"tbb_profiling.h\"\n\nnamespace tbb {\n\n//! Queuing reader-writer mutex with local-only spinning.\n/** Adapted from Krieger, Stumm, et al. pseudocode at\n    http://www.eecg.toronto.edu/parallel/pubs_abs.html#Krieger_etal_ICPP93\n    @ingroup synchronization */\nclass queuing_rw_mutex : internal::mutex_copy_deprecated_and_disabled {\npublic:\n    //! Construct unacquired mutex.\n    queuing_rw_mutex() {\n        q_tail = NULL;\n#if TBB_USE_THREADING_TOOLS\n        internal_construct();\n#endif\n    }\n\n    //! Destructor asserts if the mutex is acquired, i.e. q_tail is non-NULL\n    ~queuing_rw_mutex() {\n#if TBB_USE_ASSERT\n        __TBB_ASSERT( !q_tail, \"destruction of an acquired mutex\");\n#endif\n    }\n\n    //! The scoped locking pattern\n    /** It helps to avoid the common problem of forgetting to release lock.\n        It also nicely provides the \"node\" for queuing locks. */\n    class scoped_lock: internal::no_copy {\n        //! Initialize fields to mean \"no lock held\".\n        void initialize() {\n            my_mutex = NULL;\n#if TBB_USE_ASSERT\n            my_state = 0xFF; // Set to invalid state\n            internal::poison_pointer(my_next);\n            internal::poison_pointer(my_prev);\n#endif /* TBB_USE_ASSERT */\n        }\n\n    public:\n        //! Construct lock that has not acquired a mutex.\n        /** Equivalent to zero-initialization of *this. */\n        scoped_lock() {initialize();}\n\n        //! Acquire lock on given mutex.\n        scoped_lock( queuing_rw_mutex& m, bool write=true ) {\n            initialize();\n            acquire(m,write);\n        }\n\n        //! Release lock (if lock is held).\n        ~scoped_lock() {\n            if( my_mutex ) release();\n        }\n\n        //! Acquire lock on given mutex.\n        void acquire( queuing_rw_mutex& m, bool write=true );\n\n        //! Acquire lock on given mutex if free (i.e. non-blocking)\n        bool try_acquire( queuing_rw_mutex& m, bool write=true );\n\n        //! Release lock.\n        void release();\n\n        //! Upgrade reader to become a writer.\n        /** Returns whether the upgrade happened without releasing and re-acquiring the lock */\n        bool upgrade_to_writer();\n\n        //! Downgrade writer to become a reader.\n        bool downgrade_to_reader();\n\n    private:\n        //! The pointer to the mutex owned, or NULL if not holding a mutex.\n        queuing_rw_mutex* my_mutex;\n\n        //! The pointer to the previous and next competitors for a mutex\n        scoped_lock *__TBB_atomic my_prev, *__TBB_atomic my_next;\n\n        typedef unsigned char state_t;\n\n        //! State of the request: reader, writer, active reader, other service states\n        atomic<state_t> my_state;\n\n        //! The local spin-wait variable\n        /** Corresponds to \"spin\" in the pseudocode but inverted for the sake of zero-initialization */\n        unsigned char __TBB_atomic my_going;\n\n        //! A tiny internal lock\n        unsigned char my_internal_lock;\n\n        //! Acquire the internal lock\n        void acquire_internal_lock();\n\n        //! Try to acquire the internal lock\n        /** Returns true if lock was successfully acquired. */\n        bool try_acquire_internal_lock();\n\n        //! Release the internal lock\n        void release_internal_lock();\n\n        //! Wait for internal lock to be released\n        void wait_for_release_of_internal_lock();\n\n        //! A helper function\n        void unblock_or_wait_on_internal_lock( uintptr_t );\n    };\n\n    void __TBB_EXPORTED_METHOD internal_construct();\n\n    // Mutex traits\n    static const bool is_rw_mutex = true;\n    static const bool is_recursive_mutex = false;\n    static const bool is_fair_mutex = true;\n\nprivate:\n    //! The last competitor requesting the lock\n    atomic<scoped_lock*> q_tail;\n\n};\n\n__TBB_DEFINE_PROFILING_SET_NAME(queuing_rw_mutex)\n\n} // namespace tbb\n\n#endif /* __TBB_queuing_rw_mutex_H */\n"
  },
  {
    "path": "benchmarks/tbb/reader_writer_lock.cpp",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#include \"tbb/reader_writer_lock.h\"\n#include \"tbb/tbb_machine.h\"\n#include \"tbb/tbb_exception.h\"\n#include \"itt_notify.h\"\n\n#if defined(_MSC_VER) && defined(_Wp64)\n    // Workaround for overzealous compiler warnings in /Wp64 mode\n    #pragma warning (disable: 4244)\n#endif\n\nnamespace tbb {\nnamespace interface5 {\n\nconst uintptr_t WFLAG1 = 0x1;  // writer interested or active\nconst uintptr_t WFLAG2 = 0x2;  // writers interested, no entering readers\nconst uintptr_t RFLAG = 0x4;   // reader interested but not active\nconst uintptr_t RC_INCR = 0x8; // to adjust reader count\n\n\n// Perform an atomic bitwise-OR on the operand, and return its previous value.\ninline uintptr_t fetch_and_or(atomic<uintptr_t>& operand, uintptr_t value) {\n    for (tbb::internal::atomic_backoff b;;b.pause()) {\n        uintptr_t old = operand;\n        uintptr_t result = operand.compare_and_swap(old|value, old);\n        if (result==old) return result;\n    }\n}\n\n// Perform an atomic bitwise-AND on the operand, and return its previous value.\ninline uintptr_t fetch_and_and(atomic<uintptr_t>& operand, uintptr_t value) {\n    for (tbb::internal::atomic_backoff b;;b.pause()) {\n        uintptr_t old = operand;\n        uintptr_t result = operand.compare_and_swap(old&value, old);\n        if (result==old) return result;\n    }\n}\n\n//! Spin WHILE the value at the location is greater than or equal to a given value\n/** T and U should be comparable types. */\ntemplate<typename T, typename U>\nvoid spin_wait_while_geq( const volatile T& location, U value ) {\n    tbb::internal::atomic_backoff backoff;\n    while( location>=value ) backoff.pause();\n}\n\n//! Spin UNTIL (location & value) is true.\n/** T and U should be comparable types. */\ntemplate<typename T, typename U>\nvoid spin_wait_until_and( const volatile T& location, U value ) {\n    tbb::internal::atomic_backoff backoff;\n    while( !(location & value) ) backoff.pause();\n}\n\n\nvoid reader_writer_lock::internal_construct() {\n    reader_head = NULL;\n    writer_head = NULL;\n    writer_tail = NULL;\n    rdr_count_and_flags = 0;\n    my_current_writer = tbb_thread::id();\n#if TBB_USE_THREADING_TOOLS\n    ITT_SYNC_CREATE(this, _T(\"tbb::reader_writer_lock\"), _T(\"\"));\n#endif /* TBB_USE_THREADING_TOOLS */\n}\n\nvoid reader_writer_lock::internal_destroy() {\n    __TBB_ASSERT(rdr_count_and_flags==0, \"reader_writer_lock destroyed with pending readers/writers.\");\n    __TBB_ASSERT(reader_head==NULL, \"reader_writer_lock destroyed with pending readers.\");\n    __TBB_ASSERT(writer_tail==NULL, \"reader_writer_lock destroyed with pending writers.\");\n    __TBB_ASSERT(writer_head==NULL, \"reader_writer_lock destroyed with pending/active writers.\");\n}\n\n// Acquires the reader_writer_lock for write.    If the lock is currently held in write\n// mode by another context, the writer will block by spinning on a local variable.\n// Throws exception improper_lock if the context tries to acquire a\n// reader_writer_lock that it already has write ownership of.\nvoid reader_writer_lock::lock() {\n    if (is_current_writer()) { // recursive lock attempt\n        // we don't support recursive writer locks; throw exception\n        tbb::internal::throw_exception(tbb::internal::eid_improper_lock);\n    }\n    else {\n        scoped_lock *a_writer_lock = new scoped_lock();\n        (void) start_write(a_writer_lock);\n    }\n}\n\n// Tries to acquire the reader_writer_lock for write.    This function does not block.\n// Return Value: True or false, depending on whether the lock is acquired or not.\n// If the lock is already held by this acquiring context, try_lock() returns false.\nbool reader_writer_lock::try_lock() {\n    if (is_current_writer()) { // recursive lock attempt\n        return false;\n    }\n    else {\n        scoped_lock *a_writer_lock = new scoped_lock();\n        a_writer_lock->status = waiting_nonblocking;\n        return start_write(a_writer_lock);\n    }\n}\n\nbool reader_writer_lock::start_write(scoped_lock *I) {\n    tbb_thread::id id = this_tbb_thread::get_id();\n    scoped_lock *pred = NULL;\n    if (I->status == waiting_nonblocking) {\n        if ((pred = writer_tail.compare_and_swap(I, NULL)) != NULL) {\n            delete I;\n            return false;\n        }\n    }\n    else {\n        ITT_NOTIFY(sync_prepare, this);\n        pred = writer_tail.fetch_and_store(I);\n    }\n    if (pred)\n        pred->next = I;\n    else {\n        set_next_writer(I);\n        if (I->status == waiting_nonblocking) {\n            if (I->next) { // potentially more writers\n                set_next_writer(I->next);\n            }\n            else { // no more writers\n                writer_head.fetch_and_store(NULL);\n                if (I != writer_tail.compare_and_swap(NULL, I)) { // an incoming writer is in the process of being added\n                    spin_wait_while_eq(I->next, (scoped_lock *)NULL);  // wait for new writer to be added\n                    __TBB_ASSERT(I->next, \"There should be a node following the last writer.\");\n                    set_next_writer(I->next);\n                }\n            }\n            delete I;\n            return false;\n        }\n    }\n    spin_wait_while_eq(I->status, waiting);\n    ITT_NOTIFY(sync_acquired, this);\n    my_current_writer = id;\n    return true;\n}\n\nvoid reader_writer_lock::set_next_writer(scoped_lock *W) {\n    writer_head = W;\n    if (W->status == waiting_nonblocking) {\n        if (rdr_count_and_flags.compare_and_swap(WFLAG1+WFLAG2, 0) == 0) {\n            W->status = active;\n        }\n    }\n    else {\n        if (fetch_and_or(rdr_count_and_flags, WFLAG1) & RFLAG) { // reader present\n            spin_wait_until_and(rdr_count_and_flags, WFLAG2); // block until readers set WFLAG2\n        }\n        else { // no reader in timing window\n            __TBB_AtomicOR(&rdr_count_and_flags, WFLAG2);\n        }\n        spin_wait_while_geq(rdr_count_and_flags, RC_INCR); // block until readers finish\n        W->status = active;\n   }\n}\n\n// Acquires the reader_writer_lock for read.    If the lock is currently held by a writer,\n// this reader will block and wait until the writers are done.\n// Throws exception improper_lock when the context tries to acquire a reader_writer_lock\n// that it already has write ownership of.\nvoid reader_writer_lock::lock_read() {\n    if (is_current_writer()) { // recursive lock attempt\n        // we don't support writer->reader downgrade; throw exception\n        tbb::internal::throw_exception(tbb::internal::eid_improper_lock);\n    }\n    else {\n        scoped_lock_read a_reader_lock;\n        start_read(&a_reader_lock);\n    }\n}\n\n// Tries to acquire the reader_writer_lock for read.    This function does not block.\n// Return Value: True or false, depending on whether the lock is acquired or not.\nbool reader_writer_lock::try_lock_read() {\n    if (is_current_writer()) { // recursive lock attempt\n        return false;\n    }\n    else {\n        if (rdr_count_and_flags.fetch_and_add(RC_INCR) & (WFLAG1+WFLAG2)) { // writers present\n            rdr_count_and_flags -= RC_INCR;\n            return false;\n        }\n        else { // no writers\n            ITT_NOTIFY(sync_acquired, this);\n            return true;\n        }\n    }\n}\n\nvoid reader_writer_lock::start_read(scoped_lock_read *I) {\n    ITT_NOTIFY(sync_prepare, this);\n    I->next = reader_head.fetch_and_store(I);\n    if (!I->next) { // first arriving reader in my group; set RFLAG, test writer flags\n        // unblock and/or update statuses of non-blocking readers\n        if (!(fetch_and_or(rdr_count_and_flags, RFLAG) & (WFLAG1+WFLAG2))) { // no writers\n            unblock_readers();\n        }\n    }\n    __TBB_ASSERT(I->status == waiting || I->status == active, \"Lock requests should be waiting or active before blocking.\");\n    spin_wait_while_eq(I->status, waiting); // block\n    if (I->next) {\n        __TBB_ASSERT(I->next->status == waiting, NULL);\n        rdr_count_and_flags += RC_INCR;\n        I->next->status = active; // wake successor\n    }\n    ITT_NOTIFY(sync_acquired, this);\n}\n\nvoid reader_writer_lock::unblock_readers() {\n    // clear rdr interest flag, increment rdr count\n    __TBB_ASSERT(rdr_count_and_flags&RFLAG, NULL);\n    rdr_count_and_flags += RC_INCR-RFLAG;\n    __TBB_ASSERT(rdr_count_and_flags >= RC_INCR, NULL);\n    // indicate clear of window\n    if (rdr_count_and_flags & WFLAG1 && !(rdr_count_and_flags & WFLAG2)) {\n        __TBB_AtomicOR(&rdr_count_and_flags, WFLAG2);\n    }\n    // unblock waiting readers\n    scoped_lock_read *head = reader_head.fetch_and_store(NULL);\n    __TBB_ASSERT(head, NULL);\n    __TBB_ASSERT(head->status == waiting, NULL);\n    head->status = active;\n}\n\n// Releases the reader_writer_lock\nvoid reader_writer_lock::unlock() {\n    if( my_current_writer!=tbb_thread::id() ) {\n        // A writer owns the lock\n        __TBB_ASSERT(is_current_writer(), \"caller of reader_writer_lock::unlock() does not own the lock.\");\n        __TBB_ASSERT(writer_head, NULL);\n        __TBB_ASSERT(writer_head->status==active, NULL);\n        scoped_lock *a_writer_lock = writer_head;\n        end_write(a_writer_lock);\n        __TBB_ASSERT(a_writer_lock != writer_head, \"Internal error: About to turn writer_head into dangling reference.\");\n        delete a_writer_lock;\n    } else {\n        end_read();\n    }\n}\n\nvoid reader_writer_lock::end_write(scoped_lock *I) {\n    __TBB_ASSERT(I==writer_head, \"Internal error: can't unlock a thread that is not holding the lock.\");\n    my_current_writer = tbb_thread::id();\n    ITT_NOTIFY(sync_releasing, this);\n    if (I->next) { // potentially more writers\n        writer_head = I->next;\n        writer_head->status = active;\n    }\n    else { // No more writers; clear writer flag, test reader interest flag\n        __TBB_ASSERT(writer_head, NULL);\n        if (fetch_and_and(rdr_count_and_flags, ~(WFLAG1+WFLAG2)) & RFLAG) {\n            unblock_readers();\n        }\n        writer_head.fetch_and_store(NULL);\n        if (I != writer_tail.compare_and_swap(NULL, I)) { // an incoming writer is in the process of being added\n            spin_wait_while_eq(I->next, (scoped_lock *)NULL);  // wait for new writer to be added\n            __TBB_ASSERT(I->next, \"There should be a node following the last writer.\");\n            set_next_writer(I->next);\n        }\n    }\n}\n\nvoid reader_writer_lock::end_read() {\n    ITT_NOTIFY(sync_releasing, this);\n    __TBB_ASSERT(rdr_count_and_flags >= RC_INCR, \"unlock() called but no readers hold the lock.\");\n    rdr_count_and_flags -= RC_INCR;\n}\n\ninline bool reader_writer_lock::is_current_writer() {\n    return my_current_writer==this_tbb_thread::get_id();\n}\n\n// Construct with a blocking attempt to acquire a write lock on the passed reader_writer_lock\nvoid reader_writer_lock::scoped_lock::internal_construct (reader_writer_lock& lock) {\n    mutex = &lock;\n    next = NULL;\n    status = waiting;\n    if (mutex->is_current_writer()) { // recursive lock attempt\n        // we don't support recursive writer locks; throw exception\n        tbb::internal::throw_exception(tbb::internal::eid_improper_lock);\n    }\n    else { // this thread holds no locks\n        (void) mutex->start_write(this);\n    }\n}\n\ninline reader_writer_lock::scoped_lock::scoped_lock() : mutex(NULL), next(NULL) { \n    status = waiting;\n}\n\n// Construct with a blocking attempt to acquire a write lock on the passed reader_writer_lock\nvoid reader_writer_lock::scoped_lock_read::internal_construct (reader_writer_lock& lock) {\n    mutex = &lock;\n    next = NULL;\n    status = waiting;\n    if (mutex->is_current_writer()) { // recursive lock attempt\n        // we don't support writer->reader downgrade; throw exception\n        tbb::internal::throw_exception(tbb::internal::eid_improper_lock);\n    }\n    else { // this thread holds no locks\n        mutex->start_read(this);\n    }\n}\n\ninline reader_writer_lock::scoped_lock_read::scoped_lock_read() : mutex(NULL), next(NULL) {\n    status = waiting;\n}\n\nvoid reader_writer_lock::scoped_lock::internal_destroy() {\n    if (mutex) {\n        __TBB_ASSERT(mutex->is_current_writer(), \"~scoped_lock() destroyed by thread different than thread that holds lock.\");\n        mutex->end_write(this);\n    }\n    status = invalid;\n}\n\nvoid reader_writer_lock::scoped_lock_read::internal_destroy() {\n    if (mutex)\n        mutex->end_read();\n    status = invalid;\n}\n\n} // namespace interface5\n} // namespace tbb\n"
  },
  {
    "path": "benchmarks/tbb/reader_writer_lock.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_reader_writer_lock_H\n#define __TBB_reader_writer_lock_H\n\n#include \"tbb_thread.h\"\n#include \"tbb_allocator.h\"\n#include \"atomic.h\"\n\nnamespace tbb {\nnamespace interface5 {\n//! Writer-preference reader-writer lock with local-only spinning on readers.\n/** Loosely adapted from Mellor-Crummey and Scott pseudocode at\n    http://www.cs.rochester.edu/research/synchronization/pseudocode/rw.html#s_wp\n    @ingroup synchronization */\n    class reader_writer_lock : tbb::internal::no_copy {\n public:\n    friend class scoped_lock;\n    friend class scoped_lock_read;\n    //! Status type for nodes associated with lock instances\n    /** waiting_nonblocking: the wait state for nonblocking lock\n          instances; for writes, these transition straight to active\n          states; for reads, these are unused.\n\n        waiting: the start and spin state for all lock instances; these will\n          transition to active state when appropriate.  Non-blocking write locks\n          transition from this state to waiting_nonblocking immediately.\n\n        active: the active state means that the lock instance holds\n          the lock; it will transition to invalid state during node deletion\n\n        invalid: the end state for all nodes; this is set in the\n          destructor so if we encounter this state, we are looking at\n          memory that has already been freed\n\n        The state diagrams below describe the status transitions.\n        Single arrows indicate that the thread that owns the node is\n        responsible for the transition; double arrows indicate that\n        any thread could make the transition.\n\n        State diagram for scoped_lock status:\n\n        waiting ----------> waiting_nonblocking\n          |     _____________/       |\n          V    V                     V\n        active -----------------> invalid\n\n        State diagram for scoped_lock_read status:\n\n        waiting\n          |\n          V\n        active ----------------->invalid\n\n    */\n    enum status_t { waiting_nonblocking, waiting, active, invalid };\n\n    //! Constructs a new reader_writer_lock\n    reader_writer_lock() {\n        internal_construct();\n    }\n\n    //! Destructs a reader_writer_lock object\n    ~reader_writer_lock() {\n        internal_destroy();\n    }\n\n    //! The scoped lock pattern for write locks\n    /** Scoped locks help avoid the common problem of forgetting to release the lock.\n        This type also serves as the node for queuing locks. */\n    class scoped_lock : tbb::internal::no_copy {\n    public:\n        friend class reader_writer_lock;\n\n        //! Construct with blocking attempt to acquire write lock on the passed-in lock\n        scoped_lock(reader_writer_lock& lock) {\n            internal_construct(lock);\n        }\n\n        //! Destructor, releases the write lock\n        ~scoped_lock() {\n            internal_destroy();\n        }\n\n        void* operator new(size_t s) {\n            return tbb::internal::allocate_via_handler_v3(s);\n        }\n        void operator delete(void* p) {\n            tbb::internal::deallocate_via_handler_v3(p);\n        }\n\n    private:\n        //! The pointer to the mutex to lock\n        reader_writer_lock *mutex;\n        //! The next queued competitor for the mutex\n        scoped_lock* next;\n        //! Status flag of the thread associated with this node\n        atomic<status_t> status;\n\n        //! Construct scoped_lock that is not holding lock\n        scoped_lock();\n\n        void __TBB_EXPORTED_METHOD internal_construct(reader_writer_lock&);\n        void __TBB_EXPORTED_METHOD internal_destroy();\n   };\n\n    //! The scoped lock pattern for read locks\n    class scoped_lock_read : tbb::internal::no_copy {\n    public:\n        friend class reader_writer_lock;\n\n        //! Construct with blocking attempt to acquire read lock on the passed-in lock\n        scoped_lock_read(reader_writer_lock& lock) {\n            internal_construct(lock);\n        }\n\n        //! Destructor, releases the read lock\n        ~scoped_lock_read() {\n            internal_destroy();\n        }\n\n        void* operator new(size_t s) {\n            return tbb::internal::allocate_via_handler_v3(s);\n        }\n        void operator delete(void* p) {\n            tbb::internal::deallocate_via_handler_v3(p);\n        }\n\n    private:\n        //! The pointer to the mutex to lock\n        reader_writer_lock *mutex;\n        //! The next queued competitor for the mutex\n        scoped_lock_read *next;\n        //! Status flag of the thread associated with this node\n        atomic<status_t> status;\n\n        //! Construct scoped_lock_read that is not holding lock\n        scoped_lock_read();\n\n        void __TBB_EXPORTED_METHOD internal_construct(reader_writer_lock&);\n        void __TBB_EXPORTED_METHOD internal_destroy();\n    };\n\n    //! Acquires the reader_writer_lock for write.\n    /** If the lock is currently held in write mode by another\n        context, the writer will block by spinning on a local\n        variable.  Exceptions thrown: improper_lock The context tries\n        to acquire a reader_writer_lock that it already has write\n        ownership of.*/\n    void __TBB_EXPORTED_METHOD lock();\n\n    //! Tries to acquire the reader_writer_lock for write.\n    /** This function does not block.  Return Value: True or false,\n        depending on whether the lock is acquired or not.  If the lock\n        is already held by this acquiring context, try_lock() returns\n        false. */\n    bool __TBB_EXPORTED_METHOD try_lock();\n\n    //! Acquires the reader_writer_lock for read.\n    /** If the lock is currently held by a writer, this reader will\n        block and wait until the writers are done.  Exceptions thrown:\n        improper_lock The context tries to acquire a\n        reader_writer_lock that it already has write ownership of. */\n    void __TBB_EXPORTED_METHOD lock_read();\n\n    //! Tries to acquire the reader_writer_lock for read.\n    /** This function does not block.  Return Value: True or false,\n        depending on whether the lock is acquired or not.  */\n    bool __TBB_EXPORTED_METHOD try_lock_read();\n\n    //! Releases the reader_writer_lock\n    void __TBB_EXPORTED_METHOD unlock();\n\n private:\n    void __TBB_EXPORTED_METHOD internal_construct();\n    void __TBB_EXPORTED_METHOD internal_destroy();\n\n    //! Attempts to acquire write lock\n    /** If unavailable, spins in blocking case, returns false in non-blocking case. */\n    bool start_write(scoped_lock *);\n    //! Sets writer_head to w and attempts to unblock\n    void set_next_writer(scoped_lock *w);\n    //! Relinquishes write lock to next waiting writer or group of readers\n    void end_write(scoped_lock *);\n    //! Checks if current thread holds write lock\n    bool is_current_writer();\n\n    //! Attempts to acquire read lock\n    /** If unavailable, spins in blocking case, returns false in non-blocking case. */\n    void start_read(scoped_lock_read *);\n    //! Unblocks pending readers\n    void unblock_readers();\n    //! Relinquishes read lock by decrementing counter; last reader wakes pending writer\n    void end_read();\n\n    //! The list of pending readers\n    atomic<scoped_lock_read*> reader_head;\n    //! The list of pending writers\n    atomic<scoped_lock*> writer_head;\n    //! The last node in the list of pending writers\n    atomic<scoped_lock*> writer_tail;\n    //! Writer that owns the mutex; tbb_thread::id() otherwise.\n    tbb_thread::id my_current_writer;\n    //! Status of mutex\n    atomic<uintptr_t> rdr_count_and_flags; // used with __TBB_AtomicOR, which assumes uintptr_t\n};\n\n} // namespace interface5\n\nusing interface5::reader_writer_lock;\n\n} // namespace tbb\n\n#endif /* __TBB_reader_writer_lock_H */\n"
  },
  {
    "path": "benchmarks/tbb/recursive_mutex.cpp",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#include \"tbb/recursive_mutex.h\"\n#include \"itt_notify.h\"\n\nnamespace tbb {\n\nvoid recursive_mutex::scoped_lock::internal_acquire( recursive_mutex& m ) {\n#if _WIN32||_WIN64\n    switch( m.state ) {\n      case INITIALIZED:\n        // since we cannot look into the internal of the CriticalSection object\n        // we won't know how many times the lock has been acquired, and thus\n        // we won't know when we may safely set the state back to INITIALIZED\n        // if we change the state to HELD as in mutex.cpp.  thus, we won't change\n        // the state for recursive_mutex\n        EnterCriticalSection( &m.impl );\n        break;\n      case DESTROYED:\n        __TBB_ASSERT(false,\"recursive_mutex::scoped_lock: mutex already destroyed\");\n        break;\n      default:\n        __TBB_ASSERT(false,\"recursive_mutex::scoped_lock: illegal mutex state\");\n        break;\n    }\n#else\n    int error_code = pthread_mutex_lock(&m.impl);\n    if( error_code )\n        tbb::internal::handle_perror(error_code,\"recursive_mutex::scoped_lock: pthread_mutex_lock failed\");\n#endif /* _WIN32||_WIN64 */\n    my_mutex = &m;\n}\n\nvoid recursive_mutex::scoped_lock::internal_release() {\n    __TBB_ASSERT( my_mutex, \"recursive_mutex::scoped_lock: not holding a mutex\" );\n#if _WIN32||_WIN64    \n    switch( my_mutex->state ) {\n      case INITIALIZED: \n        LeaveCriticalSection( &my_mutex->impl );\n        break;\n      case DESTROYED: \n        __TBB_ASSERT(false,\"recursive_mutex::scoped_lock: mutex already destroyed\"); \n        break;\n      default: \n        __TBB_ASSERT(false,\"recursive_mutex::scoped_lock: illegal mutex state\");\n        break;\n    }\n#else\n     int error_code = pthread_mutex_unlock(&my_mutex->impl);\n     __TBB_ASSERT_EX(!error_code, \"recursive_mutex::scoped_lock: pthread_mutex_unlock failed\");\n#endif /* _WIN32||_WIN64 */\n     my_mutex = NULL;\n}\n\nbool recursive_mutex::scoped_lock::internal_try_acquire( recursive_mutex& m ) {\n#if _WIN32||_WIN64\n    switch( m.state ) {\n      case INITIALIZED: \n        break;\n      case DESTROYED: \n        __TBB_ASSERT(false,\"recursive_mutex::scoped_lock: mutex already destroyed\"); \n        break;\n      default: \n        __TBB_ASSERT(false,\"recursive_mutex::scoped_lock: illegal mutex state\");\n        break;\n    }\n#endif /* _WIN32||_WIN64 */\n    bool result;\n#if _WIN32||_WIN64\n    result = TryEnterCriticalSection(&m.impl)!=0;\n#else\n    result = pthread_mutex_trylock(&m.impl)==0;\n#endif /* _WIN32||_WIN64 */\n    if( result )\n        my_mutex = &m;\n    return result;\n}\n\nvoid recursive_mutex::internal_construct() {\n#if _WIN32||_WIN64\n    InitializeCriticalSectionEx(&impl, 4000, 0);\n    state = INITIALIZED;\n#else\n    pthread_mutexattr_t mtx_attr;\n    int error_code = pthread_mutexattr_init( &mtx_attr );\n    if( error_code )\n        tbb::internal::handle_perror(error_code,\"recursive_mutex: pthread_mutexattr_init failed\");\n\n    pthread_mutexattr_settype( &mtx_attr, PTHREAD_MUTEX_RECURSIVE );\n    error_code = pthread_mutex_init( &impl, &mtx_attr );\n    if( error_code )\n        tbb::internal::handle_perror(error_code,\"recursive_mutex: pthread_mutex_init failed\");\n    pthread_mutexattr_destroy( &mtx_attr );\n#endif /* _WIN32||_WIN64*/    \n    ITT_SYNC_CREATE(&impl, _T(\"tbb::recursive_mutex\"), _T(\"\"));\n}\n\nvoid recursive_mutex::internal_destroy() {\n#if _WIN32||_WIN64\n    switch( state ) {\n      case INITIALIZED:\n        DeleteCriticalSection(&impl);\n        break;\n      case DESTROYED: \n        __TBB_ASSERT(false,\"recursive_mutex: already destroyed\");\n        break;\n      default: \n        __TBB_ASSERT(false,\"recursive_mutex: illegal state for destruction\");\n        break;\n    }\n    state = DESTROYED;\n#else\n    int error_code = pthread_mutex_destroy(&impl); \n    __TBB_ASSERT_EX(!error_code,\"recursive_mutex: pthread_mutex_destroy failed\");\n#endif /* _WIN32||_WIN64 */\n}\n\n} // namespace tbb\n"
  },
  {
    "path": "benchmarks/tbb/recursive_mutex.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_recursive_mutex_H\n#define __TBB_recursive_mutex_H\n\n#if _WIN32||_WIN64\n#include \"machine/windows_api.h\"\n#else\n#include <pthread.h>\n#endif /* _WIN32||_WIN64 */\n\n#include <new>\n#include \"aligned_space.h\"\n#include \"tbb_stddef.h\"\n#include \"tbb_profiling.h\"\n\nnamespace tbb {\n//! Mutex that allows recursive mutex acquisition.\n/** Mutex that allows recursive mutex acquisition.\n    @ingroup synchronization */\nclass recursive_mutex : internal::mutex_copy_deprecated_and_disabled {\npublic:\n    //! Construct unacquired recursive_mutex.\n    recursive_mutex() {\n#if TBB_USE_ASSERT || TBB_USE_THREADING_TOOLS\n        internal_construct();\n#else\n  #if _WIN32||_WIN64\n        InitializeCriticalSectionEx(&impl, 4000, 0);\n  #else\n        pthread_mutexattr_t mtx_attr;\n        int error_code = pthread_mutexattr_init( &mtx_attr );\n        if( error_code )\n            tbb::internal::handle_perror(error_code,\"recursive_mutex: pthread_mutexattr_init failed\");\n\n        pthread_mutexattr_settype( &mtx_attr, PTHREAD_MUTEX_RECURSIVE );\n        error_code = pthread_mutex_init( &impl, &mtx_attr );\n        if( error_code )\n            tbb::internal::handle_perror(error_code,\"recursive_mutex: pthread_mutex_init failed\");\n\n        pthread_mutexattr_destroy( &mtx_attr );\n  #endif /* _WIN32||_WIN64*/\n#endif /* TBB_USE_ASSERT */\n    };\n\n    ~recursive_mutex() {\n#if TBB_USE_ASSERT\n        internal_destroy();\n#else\n  #if _WIN32||_WIN64\n        DeleteCriticalSection(&impl);\n  #else\n        pthread_mutex_destroy(&impl); \n\n  #endif /* _WIN32||_WIN64 */\n#endif /* TBB_USE_ASSERT */\n    };\n\n    class scoped_lock;\n    friend class scoped_lock;\n\n    //! The scoped locking pattern\n    /** It helps to avoid the common problem of forgetting to release lock.\n        It also nicely provides the \"node\" for queuing locks. */\n    class scoped_lock: internal::no_copy {\n    public:\n        //! Construct lock that has not acquired a recursive_mutex. \n        scoped_lock() : my_mutex(NULL) {};\n\n        //! Acquire lock on given mutex.\n        scoped_lock( recursive_mutex& mutex ) {\n#if TBB_USE_ASSERT\n            my_mutex = &mutex; \n#endif /* TBB_USE_ASSERT */\n            acquire( mutex );\n        }\n\n        //! Release lock (if lock is held).\n        ~scoped_lock() {\n            if( my_mutex ) \n                release();\n        }\n\n        //! Acquire lock on given mutex.\n        void acquire( recursive_mutex& mutex ) {\n#if TBB_USE_ASSERT\n            internal_acquire( mutex );\n#else\n            my_mutex = &mutex;\n            mutex.lock();\n#endif /* TBB_USE_ASSERT */\n        }\n\n        //! Try acquire lock on given recursive_mutex.\n        bool try_acquire( recursive_mutex& mutex ) {\n#if TBB_USE_ASSERT\n            return internal_try_acquire( mutex );\n#else\n            bool result = mutex.try_lock();\n            if( result )\n                my_mutex = &mutex;\n            return result;\n#endif /* TBB_USE_ASSERT */\n        }\n\n        //! Release lock\n        void release() {\n#if TBB_USE_ASSERT\n            internal_release();\n#else\n            my_mutex->unlock();\n            my_mutex = NULL;\n#endif /* TBB_USE_ASSERT */\n        }\n\n    private:\n        //! The pointer to the current recursive_mutex to work\n        recursive_mutex* my_mutex;\n\n        //! All checks from acquire using mutex.state were moved here\n        void __TBB_EXPORTED_METHOD internal_acquire( recursive_mutex& m );\n\n        //! All checks from try_acquire using mutex.state were moved here\n        bool __TBB_EXPORTED_METHOD internal_try_acquire( recursive_mutex& m );\n\n        //! All checks from release using mutex.state were moved here\n        void __TBB_EXPORTED_METHOD internal_release();\n\n        friend class recursive_mutex;\n    };\n\n    // Mutex traits\n    static const bool is_rw_mutex = false;\n    static const bool is_recursive_mutex = true;\n    static const bool is_fair_mutex = false;\n\n    // C++0x compatibility interface\n    \n    //! Acquire lock\n    void lock() {\n#if TBB_USE_ASSERT\n        aligned_space<scoped_lock> tmp;\n        new(tmp.begin()) scoped_lock(*this);\n#else\n  #if _WIN32||_WIN64\n        EnterCriticalSection(&impl);\n  #else\n        int error_code = pthread_mutex_lock(&impl);\n        if( error_code )\n            tbb::internal::handle_perror(error_code,\"recursive_mutex: pthread_mutex_lock failed\");\n  #endif /* _WIN32||_WIN64 */\n#endif /* TBB_USE_ASSERT */\n    }\n\n    //! Try acquiring lock (non-blocking)\n    /** Return true if lock acquired; false otherwise. */\n    bool try_lock() {\n#if TBB_USE_ASSERT\n        aligned_space<scoped_lock> tmp;\n        return (new(tmp.begin()) scoped_lock)->internal_try_acquire(*this);\n#else        \n  #if _WIN32||_WIN64\n        return TryEnterCriticalSection(&impl)!=0;\n  #else\n        return pthread_mutex_trylock(&impl)==0;\n  #endif /* _WIN32||_WIN64 */\n#endif /* TBB_USE_ASSERT */\n    }\n\n    //! Release lock\n    void unlock() {\n#if TBB_USE_ASSERT\n        aligned_space<scoped_lock> tmp;\n        scoped_lock& s = *tmp.begin();\n        s.my_mutex = this;\n        s.internal_release();\n#else\n  #if _WIN32||_WIN64\n        LeaveCriticalSection(&impl);\n  #else\n        pthread_mutex_unlock(&impl);\n  #endif /* _WIN32||_WIN64 */\n#endif /* TBB_USE_ASSERT */\n    }\n\n    //! Return native_handle\n  #if _WIN32||_WIN64\n    typedef LPCRITICAL_SECTION native_handle_type;\n  #else\n    typedef pthread_mutex_t* native_handle_type;\n  #endif\n    native_handle_type native_handle() { return (native_handle_type) &impl; }\n\nprivate:\n#if _WIN32||_WIN64\n    CRITICAL_SECTION impl;\n    enum state_t {\n        INITIALIZED=0x1234,\n        DESTROYED=0x789A,\n    } state;\n#else\n    pthread_mutex_t impl;\n#endif /* _WIN32||_WIN64 */\n\n    //! All checks from mutex constructor using mutex.state were moved here\n    void __TBB_EXPORTED_METHOD internal_construct();\n\n    //! All checks from mutex destructor using mutex.state were moved here\n    void __TBB_EXPORTED_METHOD internal_destroy();\n};\n\n__TBB_DEFINE_PROFILING_SET_NAME(recursive_mutex)\n\n} // namespace tbb \n\n#endif /* __TBB_recursive_mutex_H */\n"
  },
  {
    "path": "benchmarks/tbb/runtime_loader.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_runtime_loader_H\n#define __TBB_runtime_loader_H\n\n#if ! TBB_PREVIEW_RUNTIME_LOADER\n    #error Set TBB_PREVIEW_RUNTIME_LOADER to include runtime_loader.h\n#endif\n\n#include \"tbb_stddef.h\"\n#include <climits>\n\n#if _MSC_VER\n    #if ! __TBB_NO_IMPLICIT_LINKAGE\n        #ifdef _DEBUG\n            #pragma comment( linker, \"/nodefaultlib:tbb_debug.lib\" )\n            #pragma comment( linker, \"/defaultlib:tbbproxy_debug.lib\" )\n        #else\n            #pragma comment( linker, \"/nodefaultlib:tbb.lib\" )\n            #pragma comment( linker, \"/defaultlib:tbbproxy.lib\" )\n        #endif\n    #endif\n#endif\n\nnamespace tbb {\n\nnamespace interface6 {\n\n//! Load TBB at runtime.\n/*!\n\n\\b Usage:\n\nIn source code:\n\n\\code\n#include \"tbb/runtime_loader.h\"\n\nchar const * path[] = { \"<install dir>/lib/ia32\", NULL };\ntbb::runtime_loader loader( path );\n\n// Now use TBB.\n\\endcode\n\nLink with \\c tbbproxy.lib (or \\c libtbbproxy.a) instead of \\c tbb.lib (\\c libtbb.dylib,\n\\c libtbb.so).\n\nTBB library will be loaded at runtime from \\c <install dir>/lib/ia32 directory.\n\n\\b Attention:\n\nAll \\c runtime_loader objects (in the same module, i.e. exe or dll) share some global state.\nThe most noticeable piece of global state is loaded TBB library.\nThere are some implications:\n\n    -   Only one TBB library can be loaded per module.\n\n    -   If one object has already loaded TBB library, another object will not load TBB.\n        If the loaded TBB library is suitable for the second object, both will use TBB\n        cooperatively, otherwise the second object will report an error.\n\n    -   \\c runtime_loader objects will not work (correctly) in parallel due to absence of\n        synchronization.\n\n*/\n\nclass runtime_loader : tbb::internal::no_copy {\n\n    public:\n\n        //! Error mode constants.\n        enum error_mode {\n            em_status,     //!< Save status of operation and continue.\n            em_throw,      //!< Throw an exception of tbb::runtime_loader::error_code type.\n            em_abort       //!< Print message to \\c stderr and call \\c abort().\n        }; // error_mode\n\n        //! Error codes.\n        enum error_code {\n            ec_ok,         //!< No errors.\n            ec_bad_call,   //!< Invalid function call (e. g. load() called when TBB is already loaded).\n            ec_bad_arg,    //!< Invalid argument passed.\n            ec_bad_lib,    //!< Invalid library found (e. g. \\c TBB_runtime_version symbol not found).\n            ec_bad_ver,    //!< TBB found but version is not suitable.\n            ec_no_lib      //!< No suitable TBB library found.\n        }; // error_code\n\n        //! Initialize object but do not load TBB.\n        runtime_loader( error_mode mode = em_abort );\n\n        //! Initialize object and load TBB.\n        /*!\n            See load() for details.\n\n            If error mode is \\c em_status, call status() to check whether TBB was loaded or not.\n        */\n        runtime_loader(\n            char const * path[],                           //!< List of directories to search TBB in.\n            int          min_ver = TBB_INTERFACE_VERSION,  //!< Minimal suitable version of TBB.\n            int          max_ver = INT_MAX,                //!< Maximal suitable version of TBB.\n            error_mode   mode    = em_abort                //!< Error mode for this object.\n        );\n\n        //! Destroy object.\n        ~runtime_loader();\n\n        //! Load TBB.\n        /*!\n            The method searches the directories specified in \\c path[] array for the TBB library.\n            When the library is found, it is loaded and its version is checked. If the version is\n            not suitable, the library is unloaded, and the search continues.\n\n            \\b Note:\n\n            For security reasons, avoid using relative directory names. For example, never load\n            TBB from current (\\c \".\"), parent (\\c \"..\") or any other relative directory (like\n            \\c \"lib\" ). Use only absolute directory names (e. g. \"/usr/local/lib\").\n\n            For the same security reasons, avoid using system default directories (\\c \"\") on\n            Windows. (See http://www.microsoft.com/technet/security/advisory/2269637.mspx for\n            details.)\n\n            Neglecting these rules may cause your program to execute 3-rd party malicious code.\n\n            \\b Errors:\n                -   \\c ec_bad_call - TBB already loaded by this object.\n                -   \\c ec_bad_arg - \\p min_ver and/or \\p max_ver negative or zero,\n                    or \\p min_ver > \\p max_ver.\n                -   \\c ec_bad_ver - TBB of unsuitable version already loaded by another object.\n                -   \\c ec_no_lib - No suitable library found.\n        */\n        error_code\n        load(\n            char const * path[],                           //!< List of directories to search TBB in.\n            int          min_ver = TBB_INTERFACE_VERSION,  //!< Minimal suitable version of TBB.\n            int          max_ver = INT_MAX                 //!< Maximal suitable version of TBB.\n\n        );\n\n\n        //! Report status.\n        /*!\n            If error mode is \\c em_status, the function returns status of the last operation.\n        */\n        error_code status();\n\n    private:\n\n        error_mode const my_mode;\n        error_code       my_status;\n        bool             my_loaded;\n\n}; // class runtime_loader\n\n} // namespace interface6\n\nusing interface6::runtime_loader;\n\n} // namespace tbb\n\n#endif /* __TBB_runtime_loader_H */\n\n"
  },
  {
    "path": "benchmarks/tbb/scalable_allocator.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_scalable_allocator_H\n#define __TBB_scalable_allocator_H\n/** @file */\n\n#include <stddef.h> /* Need ptrdiff_t and size_t from here. */\n#if !_MSC_VER\n#include <stdint.h> /* Need intptr_t from here. */\n#endif\n\n#if !defined(__cplusplus) && __ICC==1100\n    #pragma warning (push)\n    #pragma warning (disable: 991)\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif /* __cplusplus */\n\n#if _MSC_VER >= 1400\n#define __TBB_EXPORTED_FUNC   __cdecl\n#else\n#define __TBB_EXPORTED_FUNC\n#endif\n\n/** The \"malloc\" analogue to allocate block of memory of size bytes.\n  * @ingroup memory_allocation */\nvoid * __TBB_EXPORTED_FUNC scalable_malloc (size_t size);\n\n/** The \"free\" analogue to discard a previously allocated piece of memory.\n    @ingroup memory_allocation */\nvoid   __TBB_EXPORTED_FUNC scalable_free (void* ptr);\n\n/** The \"realloc\" analogue complementing scalable_malloc.\n    @ingroup memory_allocation */\nvoid * __TBB_EXPORTED_FUNC scalable_realloc (void* ptr, size_t size);\n\n/** The \"calloc\" analogue complementing scalable_malloc.\n    @ingroup memory_allocation */\nvoid * __TBB_EXPORTED_FUNC scalable_calloc (size_t nobj, size_t size);\n\n/** The \"posix_memalign\" analogue.\n    @ingroup memory_allocation */\nint __TBB_EXPORTED_FUNC scalable_posix_memalign (void** memptr, size_t alignment, size_t size);\n\n/** The \"_aligned_malloc\" analogue.\n    @ingroup memory_allocation */\nvoid * __TBB_EXPORTED_FUNC scalable_aligned_malloc (size_t size, size_t alignment);\n\n/** The \"_aligned_realloc\" analogue.\n    @ingroup memory_allocation */\nvoid * __TBB_EXPORTED_FUNC scalable_aligned_realloc (void* ptr, size_t size, size_t alignment);\n\n/** The \"_aligned_free\" analogue.\n    @ingroup memory_allocation */\nvoid __TBB_EXPORTED_FUNC scalable_aligned_free (void* ptr);\n\n/** The analogue of _msize/malloc_size/malloc_usable_size.\n    Returns the usable size of a memory block previously allocated by scalable_*,\n    or 0 (zero) if ptr does not point to such a block.\n    @ingroup memory_allocation */\nsize_t __TBB_EXPORTED_FUNC scalable_msize (void* ptr);\n\n/* Results for scalable_allocation_* functions */\ntypedef enum {\n    TBBMALLOC_OK,\n    TBBMALLOC_INVALID_PARAM,\n    TBBMALLOC_UNSUPPORTED,\n    TBBMALLOC_NO_MEMORY,\n    TBBMALLOC_NO_EFFECT\n} ScalableAllocationResult;\n\n/* Setting TBB_MALLOC_USE_HUGE_PAGES environment variable to 1 enables huge pages.\n   scalable_allocation_mode call has priority over environment variable. */\ntypedef enum {\n    TBBMALLOC_USE_HUGE_PAGES,  /* value turns using huge pages on and off */\n    /* deprecated, kept for backward compatibility only */\n    USE_HUGE_PAGES = TBBMALLOC_USE_HUGE_PAGES,\n    /* try to limit memory consumption value Bytes, clean internal buffers\n       if limit is exceeded, but not prevents from requesting memory from OS */\n    TBBMALLOC_SET_SOFT_HEAP_LIMIT\n} AllocationModeParam;\n\n/** Set TBB allocator-specific allocation modes.\n    @ingroup memory_allocation */\nint __TBB_EXPORTED_FUNC scalable_allocation_mode(int param, intptr_t value);\n\ntypedef enum {\n    /* Clean internal allocator buffers for all threads.\n       Returns TBBMALLOC_NO_EFFECT if no buffers cleaned,\n       TBBMALLOC_OK if some memory released from buffers. */\n    TBBMALLOC_CLEAN_ALL_BUFFERS,\n    /* Clean internal allocator buffer for current thread only.\n       Return values same as for TBBMALLOC_CLEAN_ALL_BUFFERS. */\n    TBBMALLOC_CLEAN_THREAD_BUFFERS\n} ScalableAllocationCmd;\n\n/** Call TBB allocator-specific commands.\n    @ingroup memory_allocation */\nint __TBB_EXPORTED_FUNC scalable_allocation_command(int cmd, void *param);\n\n#ifdef __cplusplus\n} /* extern \"C\" */\n#endif /* __cplusplus */\n\n#ifdef __cplusplus\n\n//! The namespace rml contains components of low-level memory pool interface.\nnamespace rml {\nclass MemoryPool;\n\ntypedef void *(*rawAllocType)(intptr_t pool_id, size_t &bytes);\ntypedef int   (*rawFreeType)(intptr_t pool_id, void* raw_ptr, size_t raw_bytes);\n\n/*\nMemPoolPolicy extension must be compatible with such structure fields layout\n\nstruct MemPoolPolicy {\n    rawAllocType pAlloc;\n    rawFreeType  pFree;\n    size_t       granularity;   // granularity of pAlloc allocations\n};\n*/\n\nstruct MemPoolPolicy {\n    enum {\n        TBBMALLOC_POOL_VERSION = 1\n    };\n\n    rawAllocType pAlloc;\n    rawFreeType  pFree;\n                 // granularity of pAlloc allocations. 0 means default used.\n    size_t       granularity;\n    int          version;\n                 // all memory consumed at 1st pAlloc call and never returned,\n                 // no more pAlloc calls after 1st\n    unsigned     fixedPool : 1,\n                 // memory consumed but returned only at pool termination\n                 keepAllMemory : 1,\n                 reserved : 30;\n\n    MemPoolPolicy(rawAllocType pAlloc_, rawFreeType pFree_,\n                  size_t granularity_ = 0, bool fixedPool_ = false,\n                  bool keepAllMemory_ = false) :\n        pAlloc(pAlloc_), pFree(pFree_), granularity(granularity_), version(TBBMALLOC_POOL_VERSION),\n        fixedPool(fixedPool_), keepAllMemory(keepAllMemory_),\n        reserved(0) {}\n};\n\n// enums have same values as appropriate enums from ScalableAllocationResult\n// TODO: use ScalableAllocationResult in pool_create directly\nenum MemPoolError {\n    // pool created successfully\n    POOL_OK = TBBMALLOC_OK,\n    // invalid policy parameters found\n    INVALID_POLICY = TBBMALLOC_INVALID_PARAM,\n     // requested pool policy is not supported by allocator library\n    UNSUPPORTED_POLICY = TBBMALLOC_UNSUPPORTED,\n    // lack of memory during pool creation\n    NO_MEMORY = TBBMALLOC_NO_MEMORY,\n    // action takes no effect\n    NO_EFFECT = TBBMALLOC_NO_EFFECT\n};\n\nMemPoolError pool_create_v1(intptr_t pool_id, const MemPoolPolicy *policy,\n                            rml::MemoryPool **pool);\n\nbool  pool_destroy(MemoryPool* memPool);\nvoid *pool_malloc(MemoryPool* memPool, size_t size);\nvoid *pool_realloc(MemoryPool* memPool, void *object, size_t size);\nvoid *pool_aligned_malloc(MemoryPool* mPool, size_t size, size_t alignment);\nvoid *pool_aligned_realloc(MemoryPool* mPool, void *ptr, size_t size, size_t alignment);\nbool  pool_reset(MemoryPool* memPool);\nbool  pool_free(MemoryPool *memPool, void *object);\n}\n\n#include <new>      /* To use new with the placement argument */\n\n/* Ensure that including this header does not cause implicit linkage with TBB */\n#ifndef __TBB_NO_IMPLICIT_LINKAGE\n    #define __TBB_NO_IMPLICIT_LINKAGE 1\n    #include \"tbb_stddef.h\"\n    #undef  __TBB_NO_IMPLICIT_LINKAGE\n#else\n    #include \"tbb_stddef.h\"\n#endif\n\n#if __TBB_ALLOCATOR_CONSTRUCT_VARIADIC\n #include <utility> // std::forward\n#endif\n\nnamespace tbb {\n\n#if _MSC_VER && !defined(__INTEL_COMPILER)\n    // Workaround for erroneous \"unreferenced parameter\" warning in method destroy.\n    #pragma warning (push)\n    #pragma warning (disable: 4100)\n#endif\n\n//! Meets \"allocator\" requirements of ISO C++ Standard, Section 20.1.5\n/** The members are ordered the same way they are in section 20.4.1\n    of the ISO C++ standard.\n    @ingroup memory_allocation */\ntemplate<typename T>\nclass scalable_allocator {\npublic:\n    typedef typename internal::allocator_type<T>::value_type value_type;\n    typedef value_type* pointer;\n    typedef const value_type* const_pointer;\n    typedef value_type& reference;\n    typedef const value_type& const_reference;\n    typedef size_t size_type;\n    typedef ptrdiff_t difference_type;\n    template<class U> struct rebind {\n        typedef scalable_allocator<U> other;\n    };\n\n    scalable_allocator() throw() {}\n    scalable_allocator( const scalable_allocator& ) throw() {}\n    template<typename U> scalable_allocator(const scalable_allocator<U>&) throw() {}\n\n    pointer address(reference x) const {return &x;}\n    const_pointer address(const_reference x) const {return &x;}\n\n    //! Allocate space for n objects.\n    pointer allocate( size_type n, const void* /*hint*/ =0 ) {\n        return static_cast<pointer>( scalable_malloc( n * sizeof(value_type) ) );\n    }\n\n    //! Free previously allocated block of memory\n    void deallocate( pointer p, size_type ) {\n        scalable_free( p );\n    }\n\n    //! Largest value for which method allocate might succeed.\n    size_type max_size() const throw() {\n        size_type absolutemax = static_cast<size_type>(-1) / sizeof (value_type);\n        return (absolutemax > 0 ? absolutemax : 1);\n    }\n#if __TBB_ALLOCATOR_CONSTRUCT_VARIADIC\n    template<typename U, typename... Args>\n    void construct(U *p, Args&&... args)\n        { ::new((void *)p) U(std::forward<Args>(args)...); }\n#else // __TBB_ALLOCATOR_CONSTRUCT_VARIADIC\n#if __TBB_CPP11_RVALUE_REF_PRESENT\n    void construct( pointer p, value_type&& value ) { ::new((void*)(p)) value_type( std::move( value ) ); }\n#endif\n    void construct( pointer p, const value_type& value ) {::new((void*)(p)) value_type(value);}\n#endif // __TBB_ALLOCATOR_CONSTRUCT_VARIADIC\n    void destroy( pointer p ) {p->~value_type();}\n};\n\n#if _MSC_VER && !defined(__INTEL_COMPILER)\n    #pragma warning (pop)\n#endif // warning 4100 is back\n\n//! Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1\n/** @ingroup memory_allocation */\ntemplate<>\nclass scalable_allocator<void> {\npublic:\n    typedef void* pointer;\n    typedef const void* const_pointer;\n    typedef void value_type;\n    template<class U> struct rebind {\n        typedef scalable_allocator<U> other;\n    };\n};\n\ntemplate<typename T, typename U>\ninline bool operator==( const scalable_allocator<T>&, const scalable_allocator<U>& ) {return true;}\n\ntemplate<typename T, typename U>\ninline bool operator!=( const scalable_allocator<T>&, const scalable_allocator<U>& ) {return false;}\n\n} // namespace tbb\n\n#if _MSC_VER\n    #if (__TBB_BUILD || __TBBMALLOC_BUILD) && !defined(__TBBMALLOC_NO_IMPLICIT_LINKAGE)\n        #define __TBBMALLOC_NO_IMPLICIT_LINKAGE 1\n    #endif\n\n    #if !__TBBMALLOC_NO_IMPLICIT_LINKAGE\n        #ifdef _DEBUG\n            #pragma comment(lib, \"tbbmalloc_debug.lib\")\n        #else\n            #pragma comment(lib, \"tbbmalloc.lib\")\n        #endif\n    #endif\n\n\n#endif\n\n#endif /* __cplusplus */\n\n#if !defined(__cplusplus) && __ICC==1100\n    #pragma warning (pop)\n#endif // ICC 11.0 warning 991 is back\n\n#endif /* __TBB_scalable_allocator_H */\n"
  },
  {
    "path": "benchmarks/tbb/scheduler.cpp",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#include \"custom_scheduler.h\"\n#include \"scheduler_utility.h\"\n#include \"governor.h\"\n#include \"market.h\"\n#include \"arena.h\"\n#include \"mailbox.h\"\n#include \"observer_proxy.h\"\n#include \"tbb/tbb_machine.h\"\n#include \"tbb/atomic.h\"\n\nnamespace tbb {\nnamespace internal {\n\n//------------------------------------------------------------------------\n// Library initialization\n//------------------------------------------------------------------------\n\n/** Defined in tbb_main.cpp **/\nextern generic_scheduler* (*AllocateSchedulerPtr)( arena*, size_t index );\n\ninline generic_scheduler* allocate_scheduler ( arena* a, size_t index ) {\n    return AllocateSchedulerPtr(a, index);\n}\n\n#if __TBB_TASK_GROUP_CONTEXT\ncontext_state_propagation_mutex_type the_context_state_propagation_mutex;\n\nuintptr_t the_context_state_propagation_epoch = 0;\n\n//! Context to be associated with dummy tasks of worker threads schedulers.\n/** It is never used for its direct purpose, and is introduced solely for the sake\n    of avoiding one extra conditional branch in the end of wait_for_all method. **/\nstatic task_group_context the_dummy_context(task_group_context::isolated);\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\nvoid Scheduler_OneTimeInitialization ( bool itt_present ) {\n    AllocateSchedulerPtr = itt_present ? &custom_scheduler<DefaultSchedulerTraits>::allocate_scheduler :\n                                      &custom_scheduler<IntelSchedulerTraits>::allocate_scheduler;\n#if __TBB_TASK_GROUP_CONTEXT\n    // There must be no tasks belonging to this fake task group. Mark invalid for the assert\n    __TBB_ASSERT(!(task_group_context::low_unused_state_bit & (task_group_context::low_unused_state_bit-1)), NULL);\n    the_dummy_context.my_state = task_group_context::low_unused_state_bit;\n#if __TBB_TASK_PRIORITY\n    // It should never prevent tasks from being passed to execution.\n    the_dummy_context.my_priority = num_priority_levels - 1;\n#endif /* __TBB_TASK_PRIORITY */\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n}\n\n//------------------------------------------------------------------------\n// scheduler interface\n//------------------------------------------------------------------------\n\n//  A pure virtual destructor should still have a body\n//  so the one for tbb::internal::scheduler::~scheduler() is provided here\nscheduler::~scheduler( ) {}\n\n//------------------------------------------------------------------------\n// generic_scheduler\n//------------------------------------------------------------------------\n\n#if _MSC_VER && !defined(__INTEL_COMPILER)\n    // Suppress overzealous compiler warning about using 'this' in base initializer list.\n    #pragma warning(push)\n    #pragma warning(disable:4355)\n#endif\n\ngeneric_scheduler::generic_scheduler( arena* a, size_t index )\n    : my_stealing_threshold(0)\n    , my_market(NULL)\n    , my_random( this )\n    , my_free_list(NULL)\n#if __TBB_HOARD_NONLOCAL_TASKS\n    , my_nonlocal_free_list(NULL)\n#endif\n    , my_dummy_task(NULL)\n    , my_ref_count(1)\n    , my_auto_initialized(false)\n#if __TBB_COUNT_TASK_NODES\n    , my_task_node_count(0)\n#endif /* __TBB_COUNT_TASK_NODES */\n    , my_small_task_count(1)   // Extra 1 is a guard reference\n    , my_return_list(NULL)\n#if __TBB_TASK_GROUP_CONTEXT\n    , my_local_ctx_list_update(make_atomic(uintptr_t(0)))\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n#if __TBB_TASK_PRIORITY\n    , my_offloaded_tasks(NULL)\n    , my_offloaded_task_list_tail_link(NULL)\n    , my_local_reload_epoch(0)\n    , my_pool_reshuffling_pending(false)\n#endif /* __TBB_TASK_PRIORITY */\n#if __TBB_TASK_GROUP_CONTEXT\n    , my_nonlocal_ctx_list_update(make_atomic(uintptr_t(0)))\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n#if __TBB_SURVIVE_THREAD_SWITCH && TBB_USE_ASSERT\n    , my_cilk_state(cs_none)\n#endif /* __TBB_SURVIVE_THREAD_SWITCH && TBB_USE_ASSERT */\n{\n    my_arena_index = index;\n    my_arena_slot = 0;\n    my_arena = a;\n    my_innermost_running_task = NULL;\n    my_dispatching_task = NULL;\n    my_affinity_id = 0;\n#if __TBB_SCHEDULER_OBSERVER\n    my_last_global_observer = NULL;\n    my_last_local_observer = NULL;\n#endif /* __TBB_SCHEDULER_OBSERVER */\n#if __TBB_TASK_PRIORITY\n    my_ref_top_priority = NULL;\n    my_ref_reload_epoch = NULL;\n#endif /* __TBB_TASK_PRIORITY */\n\n    my_dummy_task = &allocate_task( sizeof(task), __TBB_CONTEXT_ARG(NULL, NULL) );\n#if __TBB_TASK_GROUP_CONTEXT\n    my_context_list_head.my_prev = &my_context_list_head;\n    my_context_list_head.my_next = &my_context_list_head;\n    ITT_SYNC_CREATE(&my_context_list_mutex, SyncType_Scheduler, SyncObj_ContextsList);\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n    my_dummy_task->prefix().ref_count = 2;\n    ITT_SYNC_CREATE(&my_dummy_task->prefix().ref_count, SyncType_Scheduler, SyncObj_WorkerLifeCycleMgmt);\n    ITT_SYNC_CREATE(&my_return_list, SyncType_Scheduler, SyncObj_TaskReturnList);\n    assert_task_pool_valid();\n#if __TBB_SURVIVE_THREAD_SWITCH\n    my_cilk_unwatch_thunk.routine = NULL;\n#endif /* __TBB_SURVIVE_THREAD_SWITCH */\n}\n\n#if _MSC_VER && !defined(__INTEL_COMPILER)\n    #pragma warning(pop)\n#endif // warning 4355 is back\n\n#if TBB_USE_ASSERT > 1\nvoid generic_scheduler::assert_task_pool_valid() const {\n    acquire_task_pool();\n    task** tp = my_arena_slot->task_pool_ptr;\n    __TBB_ASSERT( my_arena_slot->my_task_pool_size >= min_task_pool_size, NULL );\n    const size_t H = __TBB_load_relaxed(my_arena_slot->head); // mirror\n    const size_t T = __TBB_load_relaxed(my_arena_slot->tail); // mirror\n    __TBB_ASSERT( H <= T, NULL );\n    for ( size_t i = 0; i < H; ++i )\n        __TBB_ASSERT( tp[i] == poisoned_ptr, \"Task pool corrupted\" );\n    for ( size_t i = H; i < T; ++i ) {\n        __TBB_ASSERT( (uintptr_t)tp[i] + 1 > 1u, \"nil or invalid task pointer in the deque\" );\n        __TBB_ASSERT( tp[i]->prefix().state == task::ready ||\n                      tp[i]->prefix().extra_state == es_task_proxy, \"task in the deque has invalid state\" );\n    }\n    for ( size_t i = T; i < my_arena_slot->my_task_pool_size; ++i )\n        __TBB_ASSERT( tp[i] == poisoned_ptr, \"Task pool corrupted\" );\n    release_task_pool();\n}\n#endif /* TBB_USE_ASSERT > 1 */\n\nvoid generic_scheduler::init_stack_info () {\n    // Stacks are growing top-down. Highest address is called \"stack base\",\n    // and the lowest is \"stack limit\".\n    __TBB_ASSERT( !my_stealing_threshold, \"Stealing threshold has already been calculated\" );\n    size_t  stack_size = my_market->worker_stack_size();\n#if USE_WINTHREAD\n#if defined(_MSC_VER)&&_MSC_VER<1400 && !_WIN64\n    NT_TIB  *pteb = (NT_TIB*)__TBB_machine_get_current_teb();\n#else\n    NT_TIB  *pteb = (NT_TIB*)NtCurrentTeb();\n#endif\n    __TBB_ASSERT( &pteb < pteb->StackBase && &pteb > pteb->StackLimit, \"invalid stack info in TEB\" );\n    __TBB_ASSERT( stack_size >0, \"stack_size not initialized?\" );\n    // When a thread is created with the attribute STACK_SIZE_PARAM_IS_A_RESERVATION, stack limit\n    // in the TIB points to the committed part of the stack only. This renders the expression\n    // \"(uintptr_t)pteb->StackBase / 2 + (uintptr_t)pteb->StackLimit / 2\" virtually useless.\n    // Thus for worker threads we use the explicit stack size we used while creating them.\n    // And for master threads we rely on the following fact and assumption:\n    // - the default stack size of a master thread on Windows is 1M;\n    // - if it was explicitly set by the application it is at least as large as the size of a worker stack.\n    if ( is_worker() || stack_size < MByte )\n        my_stealing_threshold = (uintptr_t)pteb->StackBase - stack_size / 2;\n    else\n        my_stealing_threshold = (uintptr_t)pteb->StackBase - MByte / 2;\n#else /* USE_PTHREAD */\n    // There is no portable way to get stack base address in Posix, so we use\n    // non-portable method (on all modern Linux) or the simplified approach\n    // based on the common sense assumptions. The most important assumption\n    // is that the main thread's stack size is not less than that of other threads.\n    // See also comment 3 at the end of this file\n    void    *stack_base = &stack_size;\n#if __linux__ && !__bg__\n#if __TBB_ipf\n    void    *rsb_base = __TBB_get_bsp();\n#endif\n    size_t  np_stack_size = 0;\n    void    *stack_limit = NULL;\n    pthread_attr_t  np_attr_stack;\n    if( 0 == pthread_getattr_np(pthread_self(), &np_attr_stack) ) {\n        if ( 0 == pthread_attr_getstack(&np_attr_stack, &stack_limit, &np_stack_size) ) {\n#if __TBB_ipf\n            pthread_attr_t  attr_stack;\n            if ( 0 == pthread_attr_init(&attr_stack) ) {\n                if ( 0 == pthread_attr_getstacksize(&attr_stack, &stack_size) ) {\n                    if ( np_stack_size < stack_size ) {\n                        // We are in a secondary thread. Use reliable data.\n                        // IA-64 architecture stack is split into RSE backup and memory parts\n                        rsb_base = stack_limit;\n                        stack_size = np_stack_size/2;\n                        // Limit of the memory part of the stack\n                        stack_limit = (char*)stack_limit + stack_size;\n                    }\n                    // We are either in the main thread or this thread stack\n                    // is bigger that that of the main one. As we cannot discern\n                    // these cases we fall back to the default (heuristic) values.\n                }\n                pthread_attr_destroy(&attr_stack);\n            }\n            // IA-64 architecture stack is split into RSE backup and memory parts\n            my_rsb_stealing_threshold = (uintptr_t)((char*)rsb_base + stack_size/2);\n#endif /* __TBB_ipf */\n            // Size of the stack free part \n            stack_size = size_t((char*)stack_base - (char*)stack_limit);\n        }\n        pthread_attr_destroy(&np_attr_stack);\n    }\n#endif /* __linux__ */\n    __TBB_ASSERT( stack_size>0, \"stack size must be positive\" );\n    my_stealing_threshold = (uintptr_t)((char*)stack_base - stack_size/2);\n#endif /* USE_PTHREAD */\n}\n\n#if __TBB_TASK_GROUP_CONTEXT\n/** The function uses synchronization scheme similar to the one in the destructor\n    of task_group_context augmented with interlocked state change of each context\n    object. The purpose of this algo is to prevent threads doing nonlocal context\n    destruction from accessing destroyed owner-scheduler instance still pointed to\n    by the context object. **/\nvoid generic_scheduler::cleanup_local_context_list () {\n    // Detach contexts remaining in the local list\n    bool wait_for_concurrent_destroyers_to_leave = false;\n    uintptr_t local_count_snapshot = my_context_state_propagation_epoch;\n    my_local_ctx_list_update.store<relaxed>(1);\n    {\n        // This is just a definition. Actual lock is acquired only in case of conflict.\n        spin_mutex::scoped_lock lock;\n        // Full fence prevents reordering of store to my_local_ctx_list_update with\n        // load from my_nonlocal_ctx_list_update.\n        atomic_fence();\n        // Check for the conflict with concurrent destroyer or cancellation propagator\n        if ( my_nonlocal_ctx_list_update.load<relaxed>() || local_count_snapshot != the_context_state_propagation_epoch )\n            lock.acquire(my_context_list_mutex);\n        // No acquire fence is necessary for loading my_context_list_head.my_next,\n        // as the list can be updated by this thread only.\n        context_list_node_t *node = my_context_list_head.my_next;\n        while ( node != &my_context_list_head ) {\n            task_group_context &ctx = __TBB_get_object_ref(task_group_context, my_node, node);\n            __TBB_ASSERT( __TBB_load_relaxed(ctx.my_kind) != task_group_context::binding_required, \"Only a context bound to a root task can be detached\" );\n            node = node->my_next;\n            __TBB_ASSERT( is_alive(ctx.my_version_and_traits), \"Walked into a destroyed context while detaching contexts from the local list\" );\n            // Synchronizes with ~task_group_context(). TODO: evaluate and perhaps relax\n            if ( internal::as_atomic(ctx.my_kind).fetch_and_store(task_group_context::detached) == task_group_context::dying )\n                wait_for_concurrent_destroyers_to_leave = true;\n        }\n    }\n    my_local_ctx_list_update.store<release>(0);\n    // Wait until other threads referencing this scheduler object finish with it\n    if ( wait_for_concurrent_destroyers_to_leave )\n        spin_wait_until_eq( my_nonlocal_ctx_list_update, 0u );\n}\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\nvoid generic_scheduler::free_scheduler() {\n    __TBB_ASSERT( !my_arena_slot, NULL );\n#if __TBB_TASK_GROUP_CONTEXT\n    cleanup_local_context_list();\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n    free_task<small_local_task>( *my_dummy_task );\n\n#if __TBB_HOARD_NONLOCAL_TASKS\n    while( task* t = my_nonlocal_free_list ) {\n        task_prefix& p = t->prefix();\n        my_nonlocal_free_list = p.next;\n        __TBB_ASSERT( p.origin && p.origin!=this, NULL );\n        free_nonlocal_small_task(*t);\n    }\n#endif\n    // k accounts for a guard reference and each task that we deallocate.\n    intptr_t k = 1;\n    for(;;) {\n        while( task* t = my_free_list ) {\n            my_free_list = t->prefix().next;\n            deallocate_task(*t);\n            ++k;\n        }\n        if( my_return_list==plugged_return_list() )\n            break;\n        my_free_list = (task*)__TBB_FetchAndStoreW( &my_return_list, (intptr_t)plugged_return_list() );\n    }\n#if __TBB_COUNT_TASK_NODES\n    my_market->update_task_node_count( my_task_node_count );\n#endif /* __TBB_COUNT_TASK_NODES */\n    // Update my_small_task_count last.  Doing so sooner might cause another thread to free *this.\n    __TBB_ASSERT( my_small_task_count>=k, \"my_small_task_count corrupted\" );\n    governor::sign_off(this);\n    if( __TBB_FetchAndAddW( &my_small_task_count, -k )==k )\n        NFS_Free( this );\n}\n\ntask& generic_scheduler::allocate_task( size_t number_of_bytes,\n                                            __TBB_CONTEXT_ARG(task* parent, task_group_context* context) ) {\n    GATHER_STATISTIC(++my_counters.active_tasks);\n    task *t;\n    if( number_of_bytes<=quick_task_size ) {\n#if __TBB_HOARD_NONLOCAL_TASKS\n        if( (t = my_nonlocal_free_list) ) {\n            GATHER_STATISTIC(--my_counters.free_list_length);\n            __TBB_ASSERT( t->state()==task::freed, \"free list of tasks is corrupted\" );\n            my_nonlocal_free_list = t->prefix().next;\n        } else\n#endif\n        if( (t = my_free_list) ) {\n            GATHER_STATISTIC(--my_counters.free_list_length);\n            __TBB_ASSERT( t->state()==task::freed, \"free list of tasks is corrupted\" );\n            my_free_list = t->prefix().next;\n        } else if( my_return_list ) {\n            // No fence required for read of my_return_list above, because __TBB_FetchAndStoreW has a fence.\n            t = (task*)__TBB_FetchAndStoreW( &my_return_list, 0 ); // with acquire\n            __TBB_ASSERT( t, \"another thread emptied the my_return_list\" );\n            __TBB_ASSERT( t->prefix().origin==this, \"task returned to wrong my_return_list\" );\n            ITT_NOTIFY( sync_acquired, &my_return_list );\n            my_free_list = t->prefix().next;\n        } else {\n            t = (task*)((char*)NFS_Allocate( 1, task_prefix_reservation_size+quick_task_size, NULL ) + task_prefix_reservation_size );\n#if __TBB_COUNT_TASK_NODES\n            ++my_task_node_count;\n#endif /* __TBB_COUNT_TASK_NODES */\n            t->prefix().origin = this;\n            t->prefix().next = 0;\n            ++my_small_task_count;\n        }\n#if __TBB_PREFETCHING\n        task *t_next = t->prefix().next;\n        if( !t_next ) { // the task was last in the list\n#if __TBB_HOARD_NONLOCAL_TASKS\n            if( my_free_list )\n                t_next = my_free_list;\n            else\n#endif\n            if( my_return_list ) // enable prefetching, gives speedup\n                t_next = my_free_list = (task*)__TBB_FetchAndStoreW( &my_return_list, 0 );\n        }\n        if( t_next ) { // gives speedup for both cache lines\n            __TBB_cl_prefetch(t_next);\n            __TBB_cl_prefetch(&t_next->prefix());\n        }\n#endif /* __TBB_PREFETCHING */\n    } else {\n        GATHER_STATISTIC(++my_counters.big_tasks);\n        t = (task*)((char*)NFS_Allocate( 1, task_prefix_reservation_size+number_of_bytes, NULL ) + task_prefix_reservation_size );\n#if __TBB_COUNT_TASK_NODES\n        ++my_task_node_count;\n#endif /* __TBB_COUNT_TASK_NODES */\n        t->prefix().origin = NULL;\n    }\n    task_prefix& p = t->prefix();\n#if __TBB_TASK_GROUP_CONTEXT\n    p.context = context;\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n    // Obsolete. But still in use, so has to be assigned correct value here.\n    p.owner = this;\n    p.ref_count = 0;\n    // Obsolete. Assign some not outrageously out-of-place value for a while.\n    p.depth = 0;\n    p.parent = parent;\n    // In TBB 2.1 and later, the constructor for task sets extra_state to indicate the version of the tbb/task.h header.\n    // In TBB 2.0 and earlier, the constructor leaves extra_state as zero.\n    p.extra_state = 0;\n    p.affinity = 0;\n    p.state = task::allocated;\n    return *t;\n}\n\nvoid generic_scheduler::free_nonlocal_small_task( task& t ) {\n    __TBB_ASSERT( t.state()==task::freed, NULL );\n    generic_scheduler& s = *static_cast<generic_scheduler*>(t.prefix().origin);\n    __TBB_ASSERT( &s!=this, NULL );\n    for(;;) {\n        task* old = s.my_return_list;\n        if( old==plugged_return_list() )\n            break;\n        // Atomically insert t at head of s.my_return_list\n        t.prefix().next = old;\n        ITT_NOTIFY( sync_releasing, &s.my_return_list );\n        if( as_atomic(s.my_return_list).compare_and_swap(&t, old )==old ) {\n#if __TBB_PREFETCHING\n            __TBB_cl_evict(&t.prefix());\n            __TBB_cl_evict(&t);\n#endif\n            return;\n        }\n    }\n    deallocate_task(t);\n    if( __TBB_FetchAndDecrementWrelease( &s.my_small_task_count )==1 ) {\n        // We freed the last task allocated by scheduler s, so it's our responsibility\n        // to free the scheduler.\n        NFS_Free( &s );\n    }\n}\n\nsize_t generic_scheduler::prepare_task_pool ( size_t num_tasks ) {\n    size_t T = __TBB_load_relaxed(my_arena_slot->tail); // mirror\n    if ( T + num_tasks <= my_arena_slot->my_task_pool_size )\n        return T;\n    acquire_task_pool();\n    size_t H = __TBB_load_relaxed(my_arena_slot->head); // mirror\n    T -= H;\n    size_t new_size = T + num_tasks;\n    __TBB_ASSERT(!my_arena_slot->my_task_pool_size || my_arena_slot->my_task_pool_size >= min_task_pool_size, NULL);\n    if( !my_arena_slot->my_task_pool_size ) {\n        __TBB_ASSERT( !in_arena() && !my_arena_slot->task_pool_ptr, NULL );\n        if( new_size < min_task_pool_size ) new_size = min_task_pool_size;\n        my_arena_slot->allocate_task_pool( new_size );\n    }\n    // If the free space at the beginning of the task pool is too short, we\n    // are likely facing a pathological single-producer-multiple-consumers\n    // scenario, and thus it's better to expand the task pool\n    else if ( new_size <= my_arena_slot->my_task_pool_size - min_task_pool_size/4 ) {\n        // Relocate the busy part to the beginning of the deque\n        memmove( my_arena_slot->task_pool_ptr, my_arena_slot->task_pool_ptr + H, T * sizeof(task*) );\n        my_arena_slot->fill_with_canary_pattern( T, my_arena_slot->tail );\n        commit_relocated_tasks(T);\n    }\n    else {\n        // Grow task pool. As this operation is rare, and its cost is asymptotically\n        // amortizable, we can tolerate new task pool allocation done under the lock.\n        if ( new_size < 2 * my_arena_slot->my_task_pool_size )\n            new_size = 2 * my_arena_slot->my_task_pool_size;\n        task** old_pool = my_arena_slot->task_pool_ptr;\n        my_arena_slot->allocate_task_pool( new_size ); // updates my_task_pool_size\n        __TBB_ASSERT( T <= my_arena_slot->my_task_pool_size, \"new task pool is too short\" );\n        memcpy( my_arena_slot->task_pool_ptr, old_pool + H, T * sizeof(task*) );\n        commit_relocated_tasks(T);\n        __TBB_ASSERT( old_pool, \"attempt to free NULL TaskPool\" );\n        NFS_Free( old_pool );\n    }\n    assert_task_pool_valid();\n    return T;\n}\n\n/** ATTENTION:\n    This method is mostly the same as generic_scheduler::lock_task_pool(), with\n    a little different logic of slot state checks (slot is either locked or points\n    to our task pool).\n    Thus if either of them is changed, consider changing the counterpart as well. **/\ninline void generic_scheduler::acquire_task_pool() const {\n    if ( !in_arena() )\n        return; // we are not in arena - nothing to lock\n    bool sync_prepare_done = false;\n    for( atomic_backoff b;;b.pause() ) {\n#if TBB_USE_ASSERT\n        __TBB_ASSERT( my_arena_slot == my_arena->my_slots + my_arena_index, \"invalid arena slot index\" );\n        // Local copy of the arena slot task pool pointer is necessary for the next\n        // assertion to work correctly to exclude asynchronous state transition effect.\n        task** tp = my_arena_slot->task_pool;\n        __TBB_ASSERT( tp == LockedTaskPool || tp == my_arena_slot->task_pool_ptr, \"slot ownership corrupt?\" );\n#endif\n        if( my_arena_slot->task_pool != LockedTaskPool &&\n            as_atomic(my_arena_slot->task_pool).compare_and_swap(LockedTaskPool, my_arena_slot->task_pool_ptr ) == my_arena_slot->task_pool_ptr )\n        {\n            // We acquired our own slot\n            ITT_NOTIFY(sync_acquired, my_arena_slot);\n            break;\n        }\n        else if( !sync_prepare_done ) {\n            // Start waiting\n            ITT_NOTIFY(sync_prepare, my_arena_slot);\n            sync_prepare_done = true;\n        }\n        // Someone else acquired a lock, so pause and do exponential backoff.\n    }\n    __TBB_ASSERT( my_arena_slot->task_pool == LockedTaskPool, \"not really acquired task pool\" );\n} // generic_scheduler::acquire_task_pool\n\ninline void generic_scheduler::release_task_pool() const {\n    if ( !in_arena() )\n        return; // we are not in arena - nothing to unlock\n    __TBB_ASSERT( my_arena_slot, \"we are not in arena\" );\n    __TBB_ASSERT( my_arena_slot->task_pool == LockedTaskPool, \"arena slot is not locked\" );\n    ITT_NOTIFY(sync_releasing, my_arena_slot);\n    __TBB_store_with_release( my_arena_slot->task_pool, my_arena_slot->task_pool_ptr );\n}\n\n/** ATTENTION:\n    This method is mostly the same as generic_scheduler::acquire_task_pool(),\n    with a little different logic of slot state checks (slot can be empty, locked\n    or point to any task pool other than ours, and asynchronous transitions between\n    all these states are possible).\n    Thus if any of them is changed, consider changing the counterpart as well **/\ninline task** generic_scheduler::lock_task_pool( arena_slot* victim_arena_slot ) const {\n    task** victim_task_pool;\n    bool sync_prepare_done = false;\n    for( atomic_backoff backoff;; /*backoff pause embedded in the loop*/) {\n        victim_task_pool = victim_arena_slot->task_pool;\n        // NOTE: Do not use comparison of head and tail indices to check for\n        // the presence of work in the victim's task pool, as they may give\n        // incorrect indication because of task pool relocations and resizes.\n        if ( victim_task_pool == EmptyTaskPool ) {\n            // The victim thread emptied its task pool - nothing to lock\n            if( sync_prepare_done )\n                ITT_NOTIFY(sync_cancel, victim_arena_slot);\n            break;\n        }\n        if( victim_task_pool != LockedTaskPool &&\n            as_atomic(victim_arena_slot->task_pool).compare_and_swap(LockedTaskPool, victim_task_pool ) == victim_task_pool )\n        {\n            // We've locked victim's task pool\n            ITT_NOTIFY(sync_acquired, victim_arena_slot);\n            break;\n        }\n        else if( !sync_prepare_done ) {\n            // Start waiting\n            ITT_NOTIFY(sync_prepare, victim_arena_slot);\n            sync_prepare_done = true;\n        }\n        GATHER_STATISTIC( ++my_counters.thieves_conflicts );\n        // Someone else acquired a lock, so pause and do exponential backoff.\n#if __TBB_STEALING_ABORT_ON_CONTENTION\n        if(!backoff.bounded_pause()) {\n            // the 16 was acquired empirically and a theory behind it supposes\n            // that number of threads becomes much bigger than number of\n            // tasks which can be spawned by one thread causing excessive contention.\n            // TODO: However even small arenas can benefit from the abort on contention\n            //       if preemption of a thief is a problem\n            if(my_arena->my_limit >= 16)\n                return EmptyTaskPool;\n            __TBB_Yield();\n        }\n#else\n        backoff.pause();\n#endif\n    }\n    __TBB_ASSERT( victim_task_pool == EmptyTaskPool ||\n                  (victim_arena_slot->task_pool == LockedTaskPool && victim_task_pool != LockedTaskPool),\n                  \"not really locked victim's task pool?\" );\n    return victim_task_pool;\n} // generic_scheduler::lock_task_pool\n\ninline void generic_scheduler::unlock_task_pool( arena_slot* victim_arena_slot,\n                                                task** victim_task_pool ) const {\n    __TBB_ASSERT( victim_arena_slot, \"empty victim arena slot pointer\" );\n    __TBB_ASSERT( victim_arena_slot->task_pool == LockedTaskPool, \"victim arena slot is not locked\" );\n    ITT_NOTIFY(sync_releasing, victim_arena_slot);\n    __TBB_store_with_release( victim_arena_slot->task_pool, victim_task_pool );\n}\n\n\ninline task* generic_scheduler::prepare_for_spawning( task* t ) {\n    __TBB_ASSERT( t->state()==task::allocated, \"attempt to spawn task that is not in 'allocated' state\" );\n    t->prefix().state = task::ready;\n#if TBB_USE_ASSERT\n    if( task* parent = t->parent() ) {\n        internal::reference_count ref_count = parent->prefix().ref_count;\n        __TBB_ASSERT( ref_count>=0, \"attempt to spawn task whose parent has a ref_count<0\" );\n        __TBB_ASSERT( ref_count!=0, \"attempt to spawn task whose parent has a ref_count==0 (forgot to set_ref_count?)\" );\n        parent->prefix().extra_state |= es_ref_count_active;\n    }\n#endif /* TBB_USE_ASSERT */\n    affinity_id dst_thread = t->prefix().affinity;\n    __TBB_ASSERT( dst_thread == 0 || is_version_3_task(*t),\n                  \"backwards compatibility to TBB 2.0 tasks is broken\" );\n    if( dst_thread != 0 && dst_thread != my_affinity_id ) {\n        task_proxy& proxy = (task_proxy&)allocate_task( sizeof(task_proxy),\n                                                      __TBB_CONTEXT_ARG(NULL, NULL) );\n        // Mark as a proxy\n        proxy.prefix().extra_state = es_task_proxy;\n        proxy.outbox = &my_arena->mailbox(dst_thread);\n        // Mark proxy as present in both locations (sender's task pool and destination mailbox)\n        proxy.task_and_tag = intptr_t(t) | task_proxy::location_mask;\n#if __TBB_TASK_PRIORITY\n        proxy.prefix().context = t->prefix().context;\n#endif /* __TBB_TASK_PRIORITY */\n        ITT_NOTIFY( sync_releasing, proxy.outbox );\n        // Mail the proxy - after this point t may be destroyed by another thread at any moment.\n        proxy.outbox->push(proxy);\n        return &proxy;\n    }\n    return t;\n}\n\n/** Conceptually, this method should be a member of class scheduler.\n    But doing so would force us to publish class scheduler in the headers. */\nvoid generic_scheduler::local_spawn( task& first, task*& next ) {\n    __TBB_ASSERT( governor::is_set(this), NULL );\n    if ( &first.prefix().next == &next ) {\n        // Single task is being spawned\n        size_t T = prepare_task_pool( 1 );\n        my_arena_slot->task_pool_ptr[T] = prepare_for_spawning( &first );\n        commit_spawned_tasks( T + 1 );\n    }\n    else {\n        // Task list is being spawned\n        task *arr[min_task_pool_size];\n        fast_reverse_vector<task*> tasks(arr, min_task_pool_size);\n        task *t_next = NULL;\n        for( task* t = &first; ; t = t_next ) {\n            // If t is affinitized to another thread, it may already be executed\n            // and destroyed by the time prepare_for_spawning returns.\n            // So milk it while it is alive.\n            bool end = &t->prefix().next == &next;\n            t_next = t->prefix().next;\n            tasks.push_back( prepare_for_spawning(t) );\n            if( end )\n                break;\n        }\n        size_t num_tasks = tasks.size();\n        size_t T = prepare_task_pool( num_tasks );\n        tasks.copy_memory( my_arena_slot->task_pool_ptr + T );\n        commit_spawned_tasks( T + num_tasks );\n    }\n    if ( !in_arena() )\n        enter_arena();\n    my_arena->advertise_new_work</*Spawned=*/true>();\n    assert_task_pool_valid();\n}\n\nvoid generic_scheduler::local_spawn_root_and_wait( task& first, task*& next ) {\n    __TBB_ASSERT( governor::is_set(this), NULL );\n    __TBB_ASSERT( &first, NULL );\n    auto_empty_task dummy( __TBB_CONTEXT_ARG(this, first.prefix().context) );\n    internal::reference_count n = 0;\n    for( task* t=&first; ; t=t->prefix().next ) {\n        ++n;\n        __TBB_ASSERT( !t->prefix().parent, \"not a root task, or already running\" );\n        t->prefix().parent = &dummy;\n        if( &t->prefix().next==&next ) break;\n#if __TBB_TASK_GROUP_CONTEXT\n        __TBB_ASSERT( t->prefix().context == t->prefix().next->prefix().context,\n                    \"all the root tasks in list must share the same context\");\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n    }\n    dummy.prefix().ref_count = n+1;\n    if( n>1 )\n        local_spawn( *first.prefix().next, next );\n    local_wait_for_all( dummy, &first );\n}\n\nvoid tbb::internal::generic_scheduler::spawn( task& first, task*& next ) {\n    governor::local_scheduler()->local_spawn( first, next );\n}\n\nvoid tbb::internal::generic_scheduler::spawn_root_and_wait( task& first, task*& next ) {\n    governor::local_scheduler()->local_spawn_root_and_wait( first, next );\n}\n\nvoid tbb::internal::generic_scheduler::enqueue( task& t, void* prio ) {\n    generic_scheduler *s = governor::local_scheduler();\n    // these redirections are due to bw-compatibility, consider reworking some day\n    __TBB_ASSERT( s->my_arena, \"thread is not in any arena\" );\n    s->my_arena->enqueue_task(t, (intptr_t)prio, s->my_random );\n}\n\n#if __TBB_TASK_PRIORITY\nclass auto_indicator : no_copy {\n    volatile bool& my_indicator;\npublic:\n    auto_indicator ( volatile bool& indicator ) : my_indicator(indicator) { my_indicator = true ;}\n    ~auto_indicator () { my_indicator = false; }\n};\n\ntask* generic_scheduler::winnow_task_pool () {\n    GATHER_STATISTIC( ++my_counters.prio_winnowings );\n    __TBB_ASSERT( in_arena(), NULL );\n    __TBB_ASSERT( my_offloaded_tasks, \"At least one task is expected to be already offloaded\" );\n    // To eliminate possible sinking of the store to the indicator below the subsequent\n    // store to my_arena_slot->tail, the stores should have either been separated\n    // by full fence or both use release fences. And resetting indicator should have\n    // been done with release fence. But since this is just an optimization, and\n    // the corresponding checking sequence in arena::is_out_of_work() is not atomic\n    // anyway, fences aren't used, so that not to penalize warmer path.\n    auto_indicator indicator(my_pool_reshuffling_pending);\n    // The purpose of the synchronization algorithm here is for the owner thread\n    // to avoid locking task pool most of the time.\n    size_t T0 = __TBB_load_relaxed(my_arena_slot->tail);\n    __TBB_store_relaxed( my_arena_slot->tail, __TBB_load_relaxed(my_arena_slot->head) - 1 );\n    atomic_fence();\n    size_t H = __TBB_load_relaxed(my_arena_slot->head);\n    size_t T = __TBB_load_relaxed(my_arena_slot->tail);\n    __TBB_ASSERT( (intptr_t)T <= (intptr_t)T0, NULL);\n    __TBB_ASSERT( (intptr_t)H >= (intptr_t)T || (H == T0 && T == T0), NULL );\n    bool acquired = false;\n    if ( H == T ) {\n        // Either no contention with thieves during arbitration protocol execution or ...\n        if ( H >= T0 ) {\n            // ... the task pool got empty\n            reset_deque_and_leave_arena( /*locked=*/false );\n            return NULL;\n        }\n    }\n    else {\n        // Contention with thieves detected. Now without taking lock it is impossible\n        // to define the current head value because of its jitter caused by continuing\n        // stealing attempts (the pool is not locked so far).\n        acquired = true;\n        acquire_task_pool();\n        H = __TBB_load_relaxed(my_arena_slot->head);\n        if ( H >= T0 ) {\n            reset_deque_and_leave_arena( /*locked=*/true );\n            return NULL;\n        }\n    }\n    size_t src,\n           dst = T0;\n    // Find the first task to offload.\n    for ( src = H; src < T0; ++src ) {\n        task &t = *my_arena_slot->task_pool_ptr[src];\n        intptr_t p = priority(t);\n        if ( p < *my_ref_top_priority ) {\n            // Position of the first offloaded task will be the starting point\n            // for relocation of subsequent tasks that survive winnowing.\n            dst = src;\n            offload_task( t, p );\n            break;\n        }\n    }\n    for ( ++src; src < T0; ++src ) {\n        task &t = *my_arena_slot->task_pool_ptr[src];\n        intptr_t p = priority(t);\n        if ( p < *my_ref_top_priority )\n            offload_task( t, p );\n        else\n            my_arena_slot->task_pool_ptr[dst++] = &t;\n    }\n    __TBB_ASSERT( T0 >= dst, NULL );\n    task *t = H < dst ? my_arena_slot->task_pool_ptr[--dst] : NULL;\n    if ( H == dst ) {\n        // No tasks remain the primary pool\n        reset_deque_and_leave_arena( acquired );\n    }\n    else if ( acquired ) {\n        __TBB_ASSERT( !is_poisoned(my_arena_slot->task_pool_ptr[H]), NULL );\n        __TBB_store_relaxed( my_arena_slot->tail, dst );\n        release_task_pool();\n    }\n    else {\n        __TBB_ASSERT( !is_poisoned(my_arena_slot->task_pool_ptr[H]), NULL );\n        // Release fence is necessary to make sure possibly relocated task pointers\n        // become visible to potential thieves\n        __TBB_store_with_release( my_arena_slot->tail, dst );\n    }\n    my_arena_slot->fill_with_canary_pattern( dst, T0 );\n    assert_task_pool_valid();\n    return t;\n}\n\ntask* generic_scheduler::reload_tasks ( task*& offloaded_tasks, task**& offloaded_task_list_link, intptr_t top_priority ) {\n    GATHER_STATISTIC( ++my_counters.prio_reloads );\n    __TBB_ASSERT( !in_arena(), NULL );\n    task *arr[min_task_pool_size];\n    fast_reverse_vector<task*> tasks(arr, min_task_pool_size);\n    task **link = &offloaded_tasks;\n    task *t;\n    while ( (t = *link) ) {\n        task** next_ptr = &t->prefix().next_offloaded;\n        if ( priority(*t) >= top_priority ) {\n            tasks.push_back( t );\n            // Note that owner is an alias of next_offloaded. Thus the following\n            // assignment overwrites *next_ptr\n            task* next = *next_ptr;\n            t->prefix().owner = this;\n            __TBB_ASSERT( t->prefix().state == task::ready || t->prefix().extra_state == es_task_proxy, NULL );\n            *link = next;\n        }\n        else {\n            link = next_ptr;\n        }\n    }\n    if ( link == &offloaded_tasks ) {\n        offloaded_tasks = NULL;\n#if TBB_USE_ASSERT\n        offloaded_task_list_link = NULL;\n#endif /* TBB_USE_ASSERT */\n    }\n    else {\n        __TBB_ASSERT( link, NULL );\n        // Mark end of list\n        *link = NULL;\n        offloaded_task_list_link = link;\n    }\n    __TBB_ASSERT( link, NULL );\n    size_t num_tasks = tasks.size();\n    if ( num_tasks ) {\n        GATHER_STATISTIC( ++my_counters.prio_tasks_reloaded );\n        size_t T = prepare_task_pool( num_tasks );\n        tasks.copy_memory( my_arena_slot->task_pool_ptr + T );\n        if ( --num_tasks ) {\n            commit_spawned_tasks( T += num_tasks );\n            enter_arena();\n            my_arena->advertise_new_work</*Spawned=*/true>();\n        }\n        __TBB_ASSERT( T == __TBB_load_relaxed(my_arena_slot->tail), NULL );\n        __TBB_ASSERT( T < my_arena_slot->my_task_pool_size, NULL );\n        t = my_arena_slot->task_pool_ptr[T];\n        poison_pointer(my_arena_slot->task_pool_ptr[T]);\n        assert_task_pool_valid();\n    }\n    return t;\n}\n\ntask* generic_scheduler::reload_tasks () {\n    uintptr_t reload_epoch = *my_ref_reload_epoch;\n    __TBB_ASSERT( my_offloaded_tasks, NULL );\n    __TBB_ASSERT( my_local_reload_epoch <= reload_epoch\n                  || my_local_reload_epoch - reload_epoch > uintptr_t(-1)/2,\n                  \"Reload epoch counter overflow?\" );\n    if ( my_local_reload_epoch == reload_epoch )\n        return NULL;\n    __TBB_ASSERT( my_offloaded_tasks, NULL );\n    intptr_t top_priority = effective_reference_priority();\n    __TBB_ASSERT( (uintptr_t)top_priority < (uintptr_t)num_priority_levels, NULL );\n    task *t = reload_tasks( my_offloaded_tasks, my_offloaded_task_list_tail_link, top_priority );\n    if ( my_offloaded_tasks && (my_arena->my_bottom_priority >= top_priority || !my_arena->my_num_workers_requested) ) {\n        // Safeguard against deliberately relaxed synchronization while checking\n        // for the presence of work in arena (so that not to impact hot paths).\n        // Arena may be reset to empty state when offloaded low priority tasks\n        // are still present. This results in both bottom and top priority bounds\n        // becoming 'normal', which makes offloaded low priority tasks unreachable.\n        // Update arena's bottom priority to accommodate them.\n\n        // First indicate the presence of lower-priority tasks\n        my_market->update_arena_priority( *my_arena, priority(*my_offloaded_tasks) );\n        // Then mark arena as full to unlock arena priority level adjustment\n        // by arena::is_out_of_work(), and ensure worker's presence\n        my_arena->advertise_new_work</*Spawned=*/false>();\n    }\n    my_local_reload_epoch = reload_epoch;\n    return t;\n}\n#endif /* __TBB_TASK_PRIORITY */\n\ninline task* generic_scheduler::get_task() {\n    __TBB_ASSERT( in_arena(), NULL );\n    task* result = NULL;\n    size_t T = __TBB_load_relaxed(my_arena_slot->tail); // mirror\nretry:\n    __TBB_store_relaxed(my_arena_slot->tail, --T);\n    atomic_fence();\n    if ( (intptr_t)__TBB_load_relaxed(my_arena_slot->head) > (intptr_t)T ) {\n        acquire_task_pool();\n        size_t H = __TBB_load_relaxed(my_arena_slot->head); // mirror\n        if ( (intptr_t)H <= (intptr_t)T ) {\n            // The thief backed off - grab the task\n            result = my_arena_slot->task_pool_ptr[T];\n            __TBB_ASSERT( !is_poisoned(result), NULL );\n            poison_pointer( my_arena_slot->task_pool_ptr[T] );\n        }\n        else {\n            __TBB_ASSERT ( H == __TBB_load_relaxed(my_arena_slot->head)\n                        && T == __TBB_load_relaxed(my_arena_slot->tail)\n                        && H == T + 1, \"victim/thief arbitration algorithm failure\" );\n        }\n        if ( (intptr_t)H < (intptr_t)T )\n            release_task_pool();\n        else\n            reset_deque_and_leave_arena( /*locked=*/true );\n    }\n    else {\n        __TBB_control_consistency_helper(); // on my_arena_slot->head\n        result = my_arena_slot->task_pool_ptr[T];\n        __TBB_ASSERT( !is_poisoned(result), NULL );\n        poison_pointer( my_arena_slot->task_pool_ptr[T] );\n    }\n    if( result && is_proxy(*result) ) {\n        task_proxy &tp = *(task_proxy*)result;\n        result = tp.extract_task<task_proxy::pool_bit>();\n        if( !result ) {\n            // Proxy was empty, so it's our responsibility to free it\n            free_task<small_task>(tp);\n            if ( in_arena() )\n                goto retry;\n            __TBB_ASSERT( is_quiescent_local_task_pool_reset(), NULL );\n            return NULL;\n        }\n        GATHER_STATISTIC( ++my_counters.proxies_executed );\n        // Following assertion should be true because TBB 2.0 tasks never specify affinity, and hence are not proxied.\n        __TBB_ASSERT( is_version_3_task(*result), \"backwards compatibility with TBB 2.0 broken\" );\n        // Task affinity has changed.\n        my_innermost_running_task = result;\n        result->note_affinity(my_affinity_id);\n    }\n    __TBB_ASSERT( result || is_quiescent_local_task_pool_reset(), NULL );\n    return result;\n} // generic_scheduler::get_task\n\ntask* generic_scheduler::steal_task( arena_slot& victim_slot ) {\n    task** victim_pool = lock_task_pool( &victim_slot );\n    if ( !victim_pool )\n        return NULL;\n    task* result = NULL;\n    size_t H = __TBB_load_relaxed(victim_slot.head); // mirror\n    const size_t H0 = H;\n    int skip_and_bump = 0; // +1 for skipped task and +1 for bumped head&tail\nretry:\n    __TBB_store_relaxed( victim_slot.head, ++H );\n    atomic_fence();\n    if ( (intptr_t)H > (intptr_t)__TBB_load_relaxed(victim_slot.tail) ) {\n        // Stealing attempt failed, deque contents has not been changed by us\n        GATHER_STATISTIC( ++my_counters.thief_backoffs );\n        __TBB_store_relaxed( victim_slot.head, /*dead: H = */ H0 );\n        skip_and_bump++; // trigger that we bumped head and tail\n        __TBB_ASSERT ( !result, NULL );\n    }\n    else {\n        __TBB_control_consistency_helper(); // on victim_slot.tail\n        result = victim_pool[H-1];\n        __TBB_ASSERT( !is_poisoned(result), NULL );\n        if( is_proxy(*result) ) {\n            task_proxy& tp = *static_cast<task_proxy*>(result);\n            // If mailed task is likely to be grabbed by its destination thread, skip it.\n            if ( task_proxy::is_shared(tp.task_and_tag) && tp.outbox->recipient_is_idle() )\n            {\n                GATHER_STATISTIC( ++my_counters.proxies_bypassed );\n                result = NULL;\n                __TBB_ASSERT( skip_and_bump < 2, NULL );\n                skip_and_bump = 1; // note we skipped a task\n                goto retry;\n            }\n        }\n        __TBB_ASSERT( result, NULL );\n        // emit \"task was consumed\" signal\n        ITT_NOTIFY(sync_acquired, (void*)((uintptr_t)&victim_slot+sizeof(uintptr_t)));\n        const size_t H1 = H0 + 1;\n        if ( H1 < H ) {\n            // Some proxies in the task pool have been bypassed. Need to close\n            // the hole left by the stolen task. The following variant:\n            //     victim_pool[H-1] = victim_pool[H0];\n            // is of constant time, but creates a potential for degrading stealing\n            // mechanism efficiency and growing owner's stack size too much because\n            // of moving earlier split off (and thus larger) chunks closer to owner's\n            // end of the deque (tail).\n            // So we use linear time variant that is likely to be amortized to be\n            // near-constant time, though, and preserves stealing efficiency premises.\n            // These changes in the deque must be released to the owner.\n            memmove( victim_pool + H1, victim_pool + H0, (H - H1) * sizeof(task*) );\n            __TBB_store_with_release( victim_slot.head, /*dead: H = */ H1 );\n            if ( (intptr_t)H >= (intptr_t)__TBB_load_relaxed(victim_slot.tail) )\n                skip_and_bump++; // trigger that we bumped head and tail\n        }\n        poison_pointer( victim_pool[H0] );\n    }\n\n    unlock_task_pool( &victim_slot, victim_pool );\n    __TBB_ASSERT( skip_and_bump <= 2, NULL );\n#if __TBB_PREFETCHING\n    __TBB_cl_evict(&victim_slot.head);\n    __TBB_cl_evict(&victim_slot.tail);\n#endif\n    if( --skip_and_bump > 0 ) { // if both: task skipped and head&tail bumped\n        // Synchronize with snapshot as we bumped head and tail which can falsely trigger EMPTY state\n        atomic_fence();\n        my_arena->advertise_new_work</*Spawned=*/true>();\n    }\n    return result;\n}\n\ntask* generic_scheduler::get_mailbox_task() {\n    __TBB_ASSERT( my_affinity_id>0, \"not in arena\" );\n    while ( task_proxy* const tp = my_inbox.pop() ) {\n        if ( task* result = tp->extract_task<task_proxy::mailbox_bit>() ) {\n            ITT_NOTIFY( sync_acquired, my_inbox.outbox() );\n            result->prefix().extra_state |= es_task_is_stolen;\n            return result;\n        }\n        // We have exclusive access to the proxy, and can destroy it.\n        free_task<no_cache_small_task>(*tp);\n    }\n    return NULL;\n}\n\n// TODO: Rename to publish_task_pool\nvoid generic_scheduler::enter_arena() {\n    __TBB_ASSERT ( my_arena, \"no arena: initialization not completed?\" );\n    __TBB_ASSERT ( my_arena_index < my_arena->my_num_slots, \"arena slot index is out-of-bound\" );\n    __TBB_ASSERT ( my_arena_slot == &my_arena->my_slots[my_arena_index], NULL);\n    __TBB_ASSERT ( my_arena_slot->task_pool == EmptyTaskPool, \"someone else grabbed my arena slot?\" );\n    __TBB_ASSERT ( __TBB_load_relaxed(my_arena_slot->head) < __TBB_load_relaxed(my_arena_slot->tail),\n                   \"entering arena without tasks to share\" );\n    // Release signal on behalf of previously spawned tasks (when this thread was not in arena yet)\n    ITT_NOTIFY(sync_releasing, my_arena_slot);\n    __TBB_store_with_release( my_arena_slot->task_pool, my_arena_slot->task_pool_ptr );\n}\n\nvoid generic_scheduler::leave_arena() {\n    __TBB_ASSERT( in_arena(), \"Not in arena\" );\n    // Do not reset my_arena_index. It will be used to (attempt to) re-acquire the slot next time\n    __TBB_ASSERT( &my_arena->my_slots[my_arena_index] == my_arena_slot, \"arena slot and slot index mismatch\" );\n    __TBB_ASSERT ( my_arena_slot->task_pool == LockedTaskPool, \"Task pool must be locked when leaving arena\" );\n    __TBB_ASSERT ( is_quiescent_local_task_pool_empty(), \"Cannot leave arena when the task pool is not empty\" );\n    ITT_NOTIFY(sync_releasing, &my_arena->my_slots[my_arena_index]);\n    // No release fence is necessary here as this assignment precludes external\n    // accesses to the local task pool when becomes visible. Thus it is harmless\n    // if it gets hoisted above preceding local bookkeeping manipulations.\n    __TBB_store_relaxed( my_arena_slot->task_pool, EmptyTaskPool );\n}\n\ngeneric_scheduler* generic_scheduler::create_worker( market& m, size_t index ) {\n    generic_scheduler* s = allocate_scheduler( NULL, index ); // index is not a real slot in arena\n#if __TBB_TASK_GROUP_CONTEXT\n    s->my_dummy_task->prefix().context = &the_dummy_context;\n    // Sync up the local cancellation state with the global one. No need for fence here.\n    s->my_context_state_propagation_epoch = the_context_state_propagation_epoch;\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n    s->my_market = &m;\n    s->init_stack_info();\n#if __TBB_TASK_PRIORITY\n    s->my_ref_top_priority = &s->my_market->my_global_top_priority;\n    s->my_ref_reload_epoch = &s->my_market->my_global_reload_epoch;\n#endif /* __TBB_TASK_PRIORITY */\n    return s;\n}\n\n// TODO: make it a member method\ngeneric_scheduler* generic_scheduler::create_master( arena& a ) {\n    generic_scheduler* s = allocate_scheduler( &a, 0 /*Master thread always occupies the first slot*/ );\n    task& t = *s->my_dummy_task;\n    s->my_innermost_running_task = &t;\n    s->my_dispatching_task = &t;\n    t.prefix().ref_count = 1;\n    governor::sign_on(s);\n    __TBB_ASSERT( &task::self()==&t, \"governor::sign_on failed?\" );\n#if __TBB_TASK_GROUP_CONTEXT\n    // Context to be used by root tasks by default (if the user has not specified one).\n    // Allocation is done by NFS allocator because we cannot reuse memory allocated\n    // for task objects since the free list is empty at the moment.\n    t.prefix().context = a.my_default_ctx;\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n    s->my_market = a.my_market;\n    __TBB_ASSERT( s->my_arena_index == 0, \"Master thread must occupy the first slot in its arena\" );\n    s->attach_mailbox(1);\n    s->my_arena_slot = a.my_slots + 0;\n    s->my_arena_slot->my_scheduler = s;\n#if _WIN32||_WIN64\n    __TBB_ASSERT( s->my_market, NULL );\n    s->my_market->register_master( s->master_exec_resource );\n#endif /* _WIN32||_WIN64 */\n    s->init_stack_info();\n#if __TBB_TASK_GROUP_CONTEXT\n    // Sync up the local cancellation state with the global one. No need for fence here.\n    s->my_context_state_propagation_epoch = the_context_state_propagation_epoch;\n#endif\n#if __TBB_TASK_PRIORITY\n    // In the current implementation master threads continue processing even when\n    // there are other masters with higher priority. Only TBB worker threads are\n    // redistributed between arenas based on the latters' priority. Thus master\n    // threads use arena's top priority as a reference point (in contrast to workers\n    // that use my_market->my_global_top_priority).\n    s->my_ref_top_priority = &s->my_arena->my_top_priority;\n    s->my_ref_reload_epoch = &s->my_arena->my_reload_epoch;\n#endif /* __TBB_TASK_PRIORITY */\n#if __TBB_SCHEDULER_OBSERVER\n    // Process any existing observers.\n    __TBB_ASSERT( a.my_observers.empty(), \"Just created arena cannot have any observers associated with it\" );\n    the_global_observer_list.notify_entry_observers( s->my_last_global_observer, /*worker=*/false );\n#endif /* __TBB_SCHEDULER_OBSERVER */\n    return s;\n}\n\nvoid generic_scheduler::cleanup_worker( void* arg, bool worker ) {\n    generic_scheduler& s = *(generic_scheduler*)arg;\n    __TBB_ASSERT( !s.my_arena_slot, \"cleaning up attached worker\" );\n#if __TBB_SCHEDULER_OBSERVER\n    if ( worker ) // can be called by master for worker, do not notify master twice\n        the_global_observer_list.notify_exit_observers( s.my_last_global_observer, /*worker=*/true );\n#endif /* __TBB_SCHEDULER_OBSERVER */\n    s.free_scheduler();\n}\n\nvoid generic_scheduler::cleanup_master() {\n    generic_scheduler& s = *this; // for similarity with cleanup_worker\n    __TBB_ASSERT( s.my_arena_slot, NULL);\n#if __TBB_SCHEDULER_OBSERVER\n    s.my_arena->my_observers.notify_exit_observers( s.my_last_local_observer, /*worker=*/false );\n    the_global_observer_list.notify_exit_observers( s.my_last_global_observer, /*worker=*/false );\n#endif /* __TBB_SCHEDULER_OBSERVER */\n    if( in_arena() ) {\n        acquire_task_pool();\n        if ( my_arena_slot->task_pool == EmptyTaskPool ||\n             __TBB_load_relaxed(my_arena_slot->head) >= __TBB_load_relaxed(my_arena_slot->tail) )\n        {\n            // Local task pool is empty\n            leave_arena();\n        }\n        else {\n            // Master's local task pool may e.g. contain proxies of affinitized tasks.\n            release_task_pool();\n            __TBB_ASSERT ( governor::is_set(this), \"TLS slot is cleared before the task pool cleanup\" );\n            s.local_wait_for_all( *s.my_dummy_task, NULL );\n            __TBB_ASSERT( !in_arena(), NULL );\n            __TBB_ASSERT ( governor::is_set(this), \"Other thread reused our TLS key during the task pool cleanup\" );\n        }\n    }\n    __TBB_ASSERT( s.my_market, NULL );\n    market *my_market = s.my_market;\n#if _WIN32||_WIN64\n    s.my_market->unregister_master( s.master_exec_resource );\n#endif /* _WIN32||_WIN64 */\n    arena* a = s.my_arena;\n    __TBB_ASSERT(a->my_slots+0 == my_arena_slot, NULL);\n#if __TBB_STATISTICS\n    *my_arena_slot->my_counters += s.my_counters;\n#endif /* __TBB_STATISTICS */\n#if __TBB_TASK_PRIORITY\n    __TBB_ASSERT( my_arena_slot->my_scheduler, NULL );\n    // Master's scheduler may be locked by a worker taking arena snapshot or by\n    // a thread propagating task group state change across the context tree.\n    while ( as_atomic(my_arena_slot->my_scheduler).compare_and_swap(NULL, this) != this )\n        __TBB_Yield();\n    __TBB_ASSERT( !my_arena_slot->my_scheduler, NULL );\n#else /* !__TBB_TASK_PRIORITY */\n    __TBB_store_with_release(my_arena_slot->my_scheduler, (generic_scheduler*)NULL);\n#endif /* __TBB_TASK_PRIORITY */\n    my_arena_slot = NULL; // detached from slot\n    s.free_scheduler();\n    // Resetting arena to EMPTY state (as earlier TBB versions did) should not be\n    // done here (or anywhere else in the master thread to that matter) because\n    // after introducing arena-per-master logic and fire-and-forget tasks doing\n    // so can result either in arena's premature destruction (at least without\n    // additional costly checks in workers) or in unnecessary arena state changes\n    // (and ensuing workers migration).\n#if __TBB_STATISTICS_EARLY_DUMP\n    GATHER_STATISTIC( a->dump_arena_statistics() );\n#endif\n    if (governor::needsWaitWorkers())\n        my_market->prepare_wait_workers();\n    a->on_thread_leaving</*is_master*/true>();\n    if (governor::needsWaitWorkers())\n        my_market->wait_workers();\n}\n\n} // namespace internal\n} // namespace tbb\n\n/*\n    Comments:\n\n1.  The premise of the cancellation support implementation is that cancellations are\n    not part of the hot path of the program execution. Therefore all changes in its\n    implementation in order to reduce the overhead of the cancellation control flow\n    should be done only in ways that do not increase overhead of the normal execution.\n\n    In general contexts are used by all threads and their descendants are created in\n    different threads as well. In order to minimize impact of the cross-thread tree\n    maintenance (first of all because of the synchronization), the tree of contexts\n    is split into pieces, each of which is handled by the only thread. Such pieces\n    are represented as lists of contexts, members of which are contexts that were\n    bound to their parents in the given thread.\n\n    The context tree maintenance and cancellation propagation algorithms is designed\n    in such a manner that cross-thread access to a context list will take place only\n    when cancellation signal is sent (by user or when an exception happens), and\n    synchronization is necessary only then. Thus the normal execution flow (without\n    exceptions and cancellation) remains free from any synchronization done on\n    behalf of exception handling and cancellation support.\n\n2.  Consider parallel cancellations at the different levels of the context tree:\n\n        Ctx1 <- Cancelled by Thread1            |- Thread2 started processing\n         |                                      |\n        Ctx2                                    |- Thread1 started processing\n         |                                   T1 |- Thread2 finishes and syncs up local counters\n        Ctx3 <- Cancelled by Thread2            |\n         |                                      |- Ctx5 is bound to Ctx2\n        Ctx4                                    |\n                                             T2 |- Thread1 reaches Ctx2\n\n    Thread-propagator of each cancellation increments global counter. However the thread\n    propagating the cancellation from the outermost context (Thread1) may be the last\n    to finish. Which means that the local counters may be synchronized earlier (by Thread2,\n    at Time1) than it propagated cancellation into Ctx2 (at time Time2). If a new context\n    (Ctx5) is created and bound to Ctx2 between Time1 and Time2, checking its parent only\n    (Ctx2) may result in cancellation request being lost.\n\n    This issue is solved by doing the whole propagation under the lock.\n\n    If we need more concurrency while processing parallel cancellations, we could try\n    the following modification of the propagation algorithm:\n\n    advance global counter and remember it\n    for each thread:\n        scan thread's list of contexts\n    for each thread:\n        sync up its local counter only if the global counter has not been changed\n\n    However this version of the algorithm requires more analysis and verification.\n\n3.  There is no portable way to get stack base address in Posix, however the modern\n    Linux versions provide pthread_attr_np API that can be used  to obtain thread's\n    stack size and base address. Unfortunately even this function does not provide\n    enough information for the main thread on IA-64 architecture (RSE spill area\n    and memory stack are allocated as two separate discontinuous chunks of memory),\n    and there is no portable way to discern the main and the secondary threads.\n    Thus for OS X* and IA-64 Linux architecture we use the TBB worker stack size for \n    all threads and use the current stack top as the stack base. This simplified \n    approach is based on the following assumptions:\n    1) If the default stack size is insufficient for the user app needs, the\n    required amount will be explicitly specified by the user at the point of the\n    TBB scheduler initialization (as an argument to tbb::task_scheduler_init\n    constructor).\n    2) When a master thread initializes the scheduler, it has enough space on its\n    stack. Here \"enough\" means \"at least as much as worker threads have\".\n    3) If the user app strives to conserve the memory by cutting stack size, it\n    should do this for TBB workers too (as in the #1).\n*/\n"
  },
  {
    "path": "benchmarks/tbb/scheduler.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef _TBB_scheduler_H\n#define _TBB_scheduler_H\n\n#include \"scheduler_common.h\"\n#include \"tbb/spin_mutex.h\"\n#include \"mailbox.h\"\n#include \"tbb_misc.h\" // for FastRandom\n#include \"itt_notify.h\"\n#include \"../rml/include/rml_tbb.h\"\n\n#if __TBB_SURVIVE_THREAD_SWITCH\n#include \"cilk-tbb-interop.h\"\n#endif /* __TBB_SURVIVE_THREAD_SWITCH */\n\nnamespace tbb {\nnamespace internal {\n\ntemplate<typename SchedulerTraits> class custom_scheduler;\nstruct nested_arena_context;\n\n//------------------------------------------------------------------------\n// generic_scheduler\n//------------------------------------------------------------------------\n\n#if __TBB_TASK_GROUP_CONTEXT\nstruct scheduler_list_node_t {\n    scheduler_list_node_t *my_prev,\n                          *my_next;\n};\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n#define EmptyTaskPool ((task**)0)\n#define LockedTaskPool ((task**)~(intptr_t)0)\n\n#define LockedMaster ((generic_scheduler*)~(intptr_t)0)\n\nstruct scheduler_state {\n    //! Index of the arena slot the scheduler occupies now, or occupied last time.\n    size_t my_arena_index; // TODO: make it unsigned and pair with my_affinity_id to fit into cache line\n\n    //! Pointer to the slot in the arena we own at the moment.\n    arena_slot* my_arena_slot;\n\n    //! The arena that I own (if master) or am servicing at the moment (if worker)\n    arena* my_arena;\n\n    //! Innermost task whose task::execute() is running.\n    task* my_innermost_running_task;\n\n    //! Task, in the context of which the current TBB dispatch loop is running.\n    /** Outside of or in the outermost dispatch loop (not in a nested call to\n        wait_for_all) it is my_dummy_task for master threads, and NULL for workers. **/\n    task* my_dispatching_task;\n\n    mail_inbox my_inbox;\n\n    //! The mailbox id assigned to this scheduler.\n    /** The id is assigned upon first entry into the arena.\n        TODO: how are id's being garbage collected?\n        TODO: master thread may enter arena and leave and then reenter.\n                We want to give it the same affinity_id upon reentry, if practical.\n      */\n    affinity_id my_affinity_id;\n\n#if __TBB_SCHEDULER_OBSERVER\n    //! Last observer in the global observers list processed by this scheduler\n    observer_proxy* my_last_global_observer;\n\n    //! Last observer in the local observers list processed by this scheduler\n    observer_proxy* my_last_local_observer;\n#endif /* __TBB_SCHEDULER_OBSERVER */\n#if __TBB_TASK_PRIORITY\n    //! Latest known highest priority of tasks in the market or arena.\n    /** Master threads currently tracks only tasks in their arenas, while workers\n        take into account global top priority (among all arenas in the market). **/\n    volatile intptr_t *my_ref_top_priority;\n\n    //! Pointer to market's (for workers) or current arena's (for the master) reload epoch counter.\n    volatile uintptr_t *my_ref_reload_epoch;\n#endif /* __TBB_TASK_PRIORITY */\n};\n\n//! Work stealing task scheduler.\n/** None of the fields here are ever read or written by threads other than\n    the thread that creates the instance.\n\n    Class generic_scheduler is an abstract base class that contains most of the scheduler,\n    except for tweaks specific to processors and tools (e.g. VTune).\n    The derived template class custom_scheduler<SchedulerTraits> fills in the tweaks. */\nclass generic_scheduler: public scheduler, public ::rml::job, public scheduler_state {\npublic: // almost every class in TBB uses generic_scheduler\n\n    //! If sizeof(task) is <=quick_task_size, it is handled on a free list instead of malloc'd.\n    static const size_t quick_task_size = 256-task_prefix_reservation_size;\n\n    static bool is_version_3_task( task& t ) {\n        return (t.prefix().extra_state & 0x0F)>=0x1;\n    }\n\n    //! Position in the call stack specifying its maximal filling when stealing is still allowed\n    uintptr_t my_stealing_threshold;\n#if __TBB_ipf\n    //! Position in the RSE backup area specifying its maximal filling when stealing is still allowed\n    uintptr_t my_rsb_stealing_threshold;\n#endif\n\n    static const size_t null_arena_index = ~size_t(0);\n\n    // TODO: Rename into is_task_pool_published()\n    inline bool in_arena () const;\n\n    inline bool is_local_task_pool_quiescent () const;\n\n    inline bool is_quiescent_local_task_pool_empty () const;\n\n    inline bool is_quiescent_local_task_pool_reset () const;\n\n    //! The market I am in\n    market* my_market;\n\n    //! Random number generator used for picking a random victim from which to steal.\n    FastRandom my_random;\n\n    //! Free list of small tasks that can be reused.\n    task* my_free_list;\n\n#if __TBB_HOARD_NONLOCAL_TASKS\n    //! Free list of small non-local tasks that should be returned or can be reused.\n    task* my_nonlocal_free_list;\n#endif\n    //! Fake root task created by slave threads.\n    /** The task is used as the \"parent\" argument to method wait_for_all. */\n    task* my_dummy_task;\n\n    //! Reference count for scheduler\n    /** Number of task_scheduler_init objects that point to this scheduler */\n    long my_ref_count;\n\n    inline void attach_mailbox( affinity_id id );\n\n    /* A couple of bools can be located here because space is otherwise just padding after my_affinity_id. */\n\n    //! True if *this was created by automatic TBB initialization\n    bool my_auto_initialized;\n\n#if __TBB_COUNT_TASK_NODES\n    //! Net number of big task objects that have been allocated but not yet freed.\n    intptr_t my_task_node_count;\n#endif /* __TBB_COUNT_TASK_NODES */\n\n    //! Sets up the data necessary for the stealing limiting heuristics\n    void init_stack_info ();\n\n    //! Returns true if stealing is allowed\n    bool can_steal () {\n        int anchor;\n        // TODO IDEA: Add performance warning?\n#if __TBB_ipf\n        return my_stealing_threshold < (uintptr_t)&anchor && (uintptr_t)__TBB_get_bsp() < my_rsb_stealing_threshold;\n#else\n        return my_stealing_threshold < (uintptr_t)&anchor;\n#endif\n    }\n\n    //! Actions common to enter_arena and try_enter_arena\n    void do_enter_arena();\n\n    //! Used by workers to enter the arena \n    /** Does not lock the task pool in case if arena slot has been successfully grabbed. **/\n    void enter_arena();\n\n    //! Leave the arena\n    /** Leaving arena automatically releases the task pool if it is locked. **/\n    void leave_arena();\n\n    //! Resets head and tail indices to 0, and leaves arena\n    /** Argument specifies whether the task pool is currently locked by the owner\n        (via acquire_task_pool).**/\n    inline void reset_deque_and_leave_arena ( bool locked );\n\n    //! Locks victim's task pool, and returns pointer to it. The pointer can be NULL.\n    /** Garbles victim_arena_slot->task_pool for the duration of the lock. **/\n    task** lock_task_pool( arena_slot* victim_arena_slot ) const;\n\n    //! Unlocks victim's task pool\n    /** Restores victim_arena_slot->task_pool munged by lock_task_pool. **/\n    void unlock_task_pool( arena_slot* victim_arena_slot, task** victim_task_pool ) const;\n\n    //! Locks the local task pool\n    /** Garbles my_arena_slot->task_pool for the duration of the lock. Requires\n        correctly set my_arena_slot->task_pool_ptr. **/\n    void acquire_task_pool() const;\n\n    //! Unlocks the local task pool\n    /** Restores my_arena_slot->task_pool munged by acquire_task_pool. Requires\n        correctly set my_arena_slot->task_pool_ptr. **/\n    void release_task_pool() const;\n\n    //! Checks if t is affinitized to another thread, and if so, bundles it as proxy.\n    /** Returns either t or proxy containing t. **/\n    task* prepare_for_spawning( task* t );\n\n    //! Makes newly spawned tasks visible to thieves\n    inline void commit_spawned_tasks( size_t new_tail );\n\n    //! Makes relocated tasks visible to thieves and releases the local task pool.\n    /** Obviously, the task pool must be locked when calling this method. **/\n    inline void commit_relocated_tasks( size_t new_tail );\n\n    //! Get a task from the local pool.\n    /** Called only by the pool owner.\n        Returns the pointer to the task or NULL if the pool is empty. \n        In the latter case compacts the pool. **/\n    task* get_task();\n\n    //! Attempt to get a task from the mailbox.\n    /** Gets a task only if it has not been executed by its sender or a thief \n        that has stolen it from the sender's task pool. Otherwise returns NULL.\n\n        This method is intended to be used only by the thread extracting the proxy \n        from its mailbox. (In contrast to local task pool, mailbox can be read only\n        by its owner). **/\n    task* get_mailbox_task();\n\n    //! True if t is a task_proxy\n    static bool is_proxy( const task& t ) {\n        return t.prefix().extra_state==es_task_proxy;\n    }\n\n    //! Steal task from another scheduler's ready pool.\n    task* steal_task( arena_slot& victim_arena_slot );\n\n    /** Initial size of the task deque sufficient to serve without reallocation\n        4 nested parallel_for calls with iteration space of 65535 grains each. **/\n    static const size_t min_task_pool_size = 64;\n\n    //! Makes sure that the task pool can accommodate at least n more elements\n    /** If necessary relocates existing task pointers or grows the ready task deque.\n        Returns (possible updated) tail index (not accounting for n). **/\n    size_t prepare_task_pool( size_t n );\n\n    //! Initialize a scheduler for a master thread.\n    static generic_scheduler* create_master( arena& a );\n\n    //! Perform necessary cleanup when a master thread stops using TBB.\n    void cleanup_master();\n\n    //! Initialize a scheduler for a worker thread.\n    static generic_scheduler* create_worker( market& m, size_t index );\n\n    //! Perform necessary cleanup when a worker thread finishes.\n    static void cleanup_worker( void* arg, bool worker );\n\nprotected:\n    template<typename SchedulerTraits> friend class custom_scheduler;\n    generic_scheduler( arena*, size_t index );\n\npublic:\n#if TBB_USE_ASSERT > 1\n    //! Check that internal data structures are in consistent state.\n    /** Raises __TBB_ASSERT failure if inconsistency is found. */\n    void assert_task_pool_valid () const;\n#else\n    void assert_task_pool_valid() const {}\n#endif /* TBB_USE_ASSERT <= 1 */\n\n#if __TBB_TASK_ARENA\n    void nested_arena_entry(arena*, nested_arena_context &, bool);\n    void nested_arena_exit(nested_arena_context &);\n    void wait_until_empty();\n#endif\n\n    /*override*/ \n    void spawn( task& first, task*& next );\n\n    /*override*/ \n    void spawn_root_and_wait( task& first, task*& next );\n\n    /*override*/ \n    void enqueue( task&, void* reserved );\n\n    void local_spawn( task& first, task*& next );\n    void local_spawn_root_and_wait( task& first, task*& next );\n    virtual void local_wait_for_all( task& parent, task* child ) = 0;\n\n    //! Destroy and deallocate this scheduler object\n    void free_scheduler();\n\n    //! Allocate task object, either from the heap or a free list.\n    /** Returns uninitialized task object with initialized prefix. */\n    task& allocate_task( size_t number_of_bytes, \n                       __TBB_CONTEXT_ARG(task* parent, task_group_context* context) );\n\n    //! Put task on free list.\n    /** Does not call destructor. */\n    template<free_task_hint h>\n    void free_task( task& t );\n\n    //! Return task object to the memory allocator.\n    inline void deallocate_task( task& t );\n\n    //! True if running on a worker thread, false otherwise.\n    inline bool is_worker();\n\n    //! True if the scheduler is on the outermost dispatch level in a master thread.\n    /** Returns true when this scheduler instance is associated with an application\n        thread, and is not executing any TBB task. This includes being in a TBB \n        dispatch loop (one of wait_for_all methods) invoked directly from that thread. **/\n    inline bool master_outermost_level () const;\n\n    //! True if the scheduler is on the outermost dispatch level in a worker thread.\n    inline bool worker_outermost_level () const;\n\n#if __TBB_TASK_GROUP_CONTEXT\n    //! Returns task group context used by this scheduler instance.\n    /** This context is associated with root tasks created by a master thread \n        without explicitly specified context object outside of any running task.\n\n        Note that the default context of a worker thread is never accessed by\n        user code (directly or indirectly). **/\n    inline task_group_context* default_context ();\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n    //! Returns number of worker threads in the arena this thread belongs to.\n    unsigned number_of_workers_in_my_arena();\n\n#if __TBB_COUNT_TASK_NODES\n    intptr_t get_task_node_count( bool count_arena_workers = false );\n#endif /* __TBB_COUNT_TASK_NODES */\n\n    //! Special value used to mark my_return_list as not taking any more entries.\n    static task* plugged_return_list() {return (task*)(intptr_t)(-1);}\n\n    //! Number of small tasks that have been allocated by this scheduler. \n    intptr_t my_small_task_count;\n\n    //! List of small tasks that have been returned to this scheduler by other schedulers.\n    task* my_return_list;\n\n    //! Try getting a task from other threads (via mailbox, stealing, FIFO queue, orphans adoption).\n    /** Returns obtained task or NULL if all attempts fail. */\n    virtual task* receive_or_steal_task( __TBB_atomic reference_count& completion_ref_count,\n                                         bool return_if_no_work ) = 0;\n\n    //! Free a small task t that that was allocated by a different scheduler \n    void free_nonlocal_small_task( task& t ); \n\n#if __TBB_TASK_GROUP_CONTEXT\n    //! Padding isolating thread-local members from members that can be written to by other threads.\n    char _padding1[NFS_MaxLineSize - sizeof(context_list_node_t)];\n\n    //! Head of the thread specific list of task group contexts.\n    context_list_node_t my_context_list_head;\n\n    //! Mutex protecting access to the list of task group contexts.\n    // TODO: check whether it can be deadly preempted and replace by spinning/sleeping mutex\n    spin_mutex my_context_list_mutex;\n\n    //! Last state propagation epoch known to this thread \n    /** Together with the_context_state_propagation_epoch constitute synchronization protocol\n        that keeps hot path of task group context construction destruction mostly \n        lock-free.\n        When local epoch equals the global one, the state of task group contexts\n        registered with this thread is consistent with that of the task group trees\n        they belong to. **/\n    uintptr_t my_context_state_propagation_epoch;\n\n    //! Flag indicating that a context is being destructed by its owner thread \n    /** Together with my_nonlocal_ctx_list_update constitute synchronization protocol\n        that keeps hot path of context destruction (by the owner thread) mostly \n        lock-free. **/\n    tbb::atomic<uintptr_t> my_local_ctx_list_update;\n\n#if __TBB_TASK_PRIORITY\n    //! Returns reference priority used to decide whether a task should be offloaded.\n    inline intptr_t effective_reference_priority () const;\n\n    // TODO: move into slots and fix is_out_of_work\n    //! Task pool for offloading tasks with priorities lower than the current top priority.\n    task* my_offloaded_tasks;\n\n    //! Points to the last offloaded task in the my_offloaded_tasks list.\n    task** my_offloaded_task_list_tail_link;\n\n    //! Indicator of how recently the offload area was checked for the presence of top priority tasks.\n    uintptr_t my_local_reload_epoch;\n\n    //! Indicates that the pool is likely non-empty even if appears so from outside\n    volatile bool my_pool_reshuffling_pending;\n\n    //! Searches offload area for top priority tasks and reloads found ones into primary task pool.\n    /** Returns one of the found tasks or NULL. **/\n    task* reload_tasks ();\n\n    task* reload_tasks ( task*& offloaded_tasks, task**& offloaded_task_list_link, intptr_t top_priority );\n\n    //! Moves tasks with priority below the top one from primary task pool into offload area.\n    /** Returns the next execution candidate task or NULL. **/\n    task* winnow_task_pool ();\n\n    //! Unconditionally moves the task into offload area.\n    inline void offload_task ( task& t, intptr_t task_priority );\n#endif /* __TBB_TASK_PRIORITY */\n\n    //! Detaches abandoned contexts\n    /** These contexts must be destroyed by other threads. **/\n    void cleanup_local_context_list ();\n\n    //! Finds all contexts registered by this scheduler affected by the state change\n    //! and propagates the new state to them.\n    template <typename T>\n    void propagate_task_group_state ( T task_group_context::*mptr_state, task_group_context& src, T new_state );\n\n    // check consistency\n    static void assert_context_valid(const task_group_context *tgc) {\n        suppress_unused_warning(tgc);\n#if TBB_USE_ASSERT\n        __TBB_ASSERT(tgc, NULL);\n        uintptr_t ctx = tgc->my_version_and_traits;\n        __TBB_ASSERT(is_alive(ctx), \"referenced task_group_context was destroyed\");\n        static const char *msg = \"task_group_context is invalid\";\n        __TBB_ASSERT(!(ctx&~(3|(7<<task_group_context::traits_offset))), msg); // the value fits known values of versions and traits\n        __TBB_ASSERT(tgc->my_kind < task_group_context::dying, msg);\n        __TBB_ASSERT(tgc->my_cancellation_requested == 0 || tgc->my_cancellation_requested == 1, msg);\n        __TBB_ASSERT(tgc->my_state < task_group_context::low_unused_state_bit, msg);\n        if(tgc->my_kind != task_group_context::isolated) {\n            __TBB_ASSERT(tgc->my_owner, msg);\n            __TBB_ASSERT(tgc->my_node.my_next && tgc->my_node.my_prev, msg);\n        }\n#if __TBB_TASK_PRIORITY\n        assert_priority_valid(tgc->my_priority);\n#endif\n        if(tgc->my_parent)\n#if TBB_USE_ASSERT > 1\n            assert_context_valid(tgc->my_parent);\n#else\n            __TBB_ASSERT(is_alive(tgc->my_parent->my_version_and_traits), msg);\n#endif\n#endif\n    }\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n#if _WIN32||_WIN64\nprivate:\n    //! Handle returned by RML when registering a master with RML\n    ::rml::server::execution_resource_t master_exec_resource;\npublic:\n#endif /* _WIN32||_WIN64 */\n\n#if __TBB_TASK_GROUP_CONTEXT\n    //! Flag indicating that a context is being destructed by non-owner thread.\n    /** See also my_local_ctx_list_update. **/\n    tbb::atomic<uintptr_t> my_nonlocal_ctx_list_update;\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n#if __TBB_SURVIVE_THREAD_SWITCH\n    __cilk_tbb_unwatch_thunk my_cilk_unwatch_thunk;\n#if TBB_USE_ASSERT\n    //! State values used to check interface contract with cilkrts.\n    /** Names of cs_running...cs_freed derived from state machine diagram in cilk-tbb-interop.h */\n    enum cilk_state_t {\n        cs_none=0xF000, // Start at nonzero value so that we can detect use of zeroed memory.\n        cs_running,\n        cs_limbo,\n        cs_freed\n    };\n    cilk_state_t my_cilk_state;\n#endif /* TBB_USE_ASSERT */\n#endif /* __TBB_SURVIVE_THREAD_SWITCH */\n\n#if __TBB_STATISTICS\n    //! Set of counters to track internal statistics on per thread basis\n    /** Placed at the end of the class definition to minimize the disturbance of\n        the core logic memory operations. **/\n    mutable statistics_counters my_counters;\n#endif /* __TBB_STATISTICS */\n\n}; // class generic_scheduler\n\n\n} // namespace internal\n} // namespace tbb\n\n#include \"arena.h\"\n#include \"governor.h\"\n\nnamespace tbb {\nnamespace internal {\n\ninline bool generic_scheduler::in_arena () const {\n    __TBB_ASSERT(my_arena_slot, 0);\n    return my_arena_slot->task_pool != EmptyTaskPool;\n}\n\ninline bool generic_scheduler::is_local_task_pool_quiescent () const {\n    __TBB_ASSERT(my_arena_slot, 0);\n    task** tp = my_arena_slot->task_pool;\n    return tp == EmptyTaskPool || tp == LockedTaskPool;\n}\n\ninline bool generic_scheduler::is_quiescent_local_task_pool_empty () const {\n    __TBB_ASSERT( is_local_task_pool_quiescent(), \"Task pool is not quiescent\" );\n    return __TBB_load_relaxed(my_arena_slot->head) == __TBB_load_relaxed(my_arena_slot->tail);\n}\n\ninline bool generic_scheduler::is_quiescent_local_task_pool_reset () const {\n    __TBB_ASSERT( is_local_task_pool_quiescent(), \"Task pool is not quiescent\" );\n    return __TBB_load_relaxed(my_arena_slot->head) == 0 && __TBB_load_relaxed(my_arena_slot->tail) == 0;\n}\n\ninline bool generic_scheduler::master_outermost_level () const {\n    return my_dispatching_task == my_dummy_task;\n}\n\ninline bool generic_scheduler::worker_outermost_level () const {\n    return !my_dispatching_task;\n}\n\n#if __TBB_TASK_GROUP_CONTEXT\ninline task_group_context* generic_scheduler::default_context () {\n    return my_dummy_task->prefix().context;\n}\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\ninline void generic_scheduler::attach_mailbox( affinity_id id ) {\n    __TBB_ASSERT(id>0,NULL);\n    my_inbox.attach( my_arena->mailbox(id) );\n    my_affinity_id = id;\n}\n\ninline bool generic_scheduler::is_worker() {\n    return my_arena_index != 0; //TODO: rework for multiple master\n}\n\ninline unsigned generic_scheduler::number_of_workers_in_my_arena() {\n    return my_arena->my_max_num_workers;\n}\n\n//! Return task object to the memory allocator.\ninline void generic_scheduler::deallocate_task( task& t ) {\n#if TBB_USE_ASSERT\n    task_prefix& p = t.prefix();\n    p.state = 0xFF;\n    p.extra_state = 0xFF; \n    poison_pointer(p.next);\n#endif /* TBB_USE_ASSERT */\n    NFS_Free((char*)&t-task_prefix_reservation_size);\n#if __TBB_COUNT_TASK_NODES\n    --my_task_node_count;\n#endif /* __TBB_COUNT_TASK_NODES */\n}\n\n#if __TBB_COUNT_TASK_NODES\ninline intptr_t generic_scheduler::get_task_node_count( bool count_arena_workers ) {\n    return my_task_node_count + (count_arena_workers? my_arena->workers_task_node_count(): 0);\n}\n#endif /* __TBB_COUNT_TASK_NODES */\n\ninline void generic_scheduler::reset_deque_and_leave_arena ( bool locked ) {\n    if ( !locked )\n        acquire_task_pool();\n    __TBB_store_relaxed( my_arena_slot->tail, 0 );\n    __TBB_store_relaxed( my_arena_slot->head, 0 );\n    leave_arena();\n}\n\n//TODO: move to arena_slot\ninline void generic_scheduler::commit_spawned_tasks( size_t new_tail ) {\n    __TBB_ASSERT ( new_tail <= my_arena_slot->my_task_pool_size, \"task deque end was overwritten\" );\n    // emit \"task was released\" signal\n    ITT_NOTIFY(sync_releasing, (void*)((uintptr_t)my_arena_slot+sizeof(uintptr_t)));\n    // Release fence is necessary to make sure that previously stored task pointers\n    // are visible to thieves.\n    __TBB_store_with_release( my_arena_slot->tail, new_tail );\n}\n\nvoid generic_scheduler::commit_relocated_tasks ( size_t new_tail ) {\n    __TBB_ASSERT( is_local_task_pool_quiescent(),\n                  \"Task pool must be locked when calling commit_relocated_tasks()\" );\n    __TBB_store_relaxed( my_arena_slot->head, 0 );\n    // Tail is updated last to minimize probability of a thread making arena \n    // snapshot being misguided into thinking that this task pool is empty.\n    __TBB_store_relaxed( my_arena_slot->tail, new_tail );\n    release_task_pool();\n}\n\ntemplate<free_task_hint hint>\nvoid generic_scheduler::free_task( task& t ) {\n#if __TBB_HOARD_NONLOCAL_TASKS\n    static const int h = hint&(~local_task);\n#else\n    static const free_task_hint h = hint;\n#endif\n    GATHER_STATISTIC(--my_counters.active_tasks);\n    task_prefix& p = t.prefix();\n    // Verify that optimization hints are correct.\n    __TBB_ASSERT( h!=small_local_task || p.origin==this, NULL );\n    __TBB_ASSERT( !(h&small_task) || p.origin, NULL );\n    __TBB_ASSERT( !(h&local_task) || (!p.origin || uintptr_t(p.origin) > uintptr_t(4096)), \"local_task means allocated\");\n    poison_value(p.depth);\n    poison_value(p.ref_count);\n    poison_pointer(p.owner);\n    __TBB_ASSERT( 1L<<t.state() & (1L<<task::executing|1L<<task::allocated), NULL );\n    p.state = task::freed;\n    if( h==small_local_task || p.origin==this ) {\n        GATHER_STATISTIC(++my_counters.free_list_length);\n        p.next = my_free_list;\n        my_free_list = &t;\n    } else if( !(h&local_task) && p.origin && uintptr_t(p.origin) < uintptr_t(4096) ) {\n        // a special value reserved for future use, do nothing since\n        // origin is not pointing to a scheduler instance\n    } else if( !(h&local_task) && p.origin ) {\n        GATHER_STATISTIC(++my_counters.free_list_length);\n#if __TBB_HOARD_NONLOCAL_TASKS\n        if( !(h&no_cache) ) {\n            p.next = my_nonlocal_free_list;\n            my_nonlocal_free_list = &t;\n        } else\n#endif\n        free_nonlocal_small_task(t);\n    } else {\n        GATHER_STATISTIC(--my_counters.big_tasks);\n        deallocate_task(t);\n    }\n}\n\n#if __TBB_TASK_PRIORITY\ninline intptr_t generic_scheduler::effective_reference_priority () const {\n    // Workers on the outermost dispatch level (i.e. with empty stack) use market's\n    // priority as a reference point (to speedup discovering process level priority\n    // changes). But when there are enough workers to service (even if only partially)\n    // a lower priority arena, they should use arena's priority as a reference, lest\n    // be trapped in a futile spinning (because market's priority would prohibit\n    // executing ANY tasks in this arena).\n    return !worker_outermost_level() || \n            my_arena->my_num_workers_allotted < my_arena->num_workers_active()\n            ? *my_ref_top_priority : my_arena->my_top_priority;\n}\n\ninline void generic_scheduler::offload_task ( task& t, intptr_t /*priority*/ ) {\n    GATHER_STATISTIC( ++my_counters.prio_tasks_offloaded );\n    __TBB_ASSERT( my_offloaded_task_list_tail_link && !*my_offloaded_task_list_tail_link, NULL );\n#if TBB_USE_ASSERT\n    t.prefix().state = task::ready;\n#endif /* TBB_USE_ASSERT */\n    t.prefix().next_offloaded = my_offloaded_tasks;\n    my_offloaded_tasks = &t;\n}\n#endif /* __TBB_TASK_PRIORITY */\n\n#if __TBB_FP_CONTEXT\nclass cpu_ctl_env_helper {\n    cpu_ctl_env guard_cpu_ctl_env;\n    cpu_ctl_env curr_cpu_ctl_env;\npublic:\n    cpu_ctl_env_helper() {\n        guard_cpu_ctl_env.get_env();\n        curr_cpu_ctl_env = guard_cpu_ctl_env;\n    }\n    ~cpu_ctl_env_helper() {\n        if ( curr_cpu_ctl_env != guard_cpu_ctl_env )\n            guard_cpu_ctl_env.set_env();\n    }\n    void set_env( const task_group_context *ctx ) {\n        generic_scheduler::assert_context_valid(ctx);\n        const cpu_ctl_env &ctl = *punned_cast<cpu_ctl_env*>(&ctx->my_cpu_ctl_env);\n        if ( ctl != curr_cpu_ctl_env ) {\n            curr_cpu_ctl_env = ctl;\n            curr_cpu_ctl_env.set_env();\n        }\n    }\n    void restore_default() {\n        if ( curr_cpu_ctl_env != guard_cpu_ctl_env ) {\n            guard_cpu_ctl_env.set_env();\n            curr_cpu_ctl_env = guard_cpu_ctl_env;\n        }\n    }\n};\n#else\nstruct cpu_ctl_env_helper {\n    void set_env( __TBB_CONTEXT_ARG1(task_group_context *) ) {}\n    void restore_default() {}\n};\n#endif /* __TBB_FP_CONTEXT */\n\n} // namespace internal\n} // namespace tbb\n\n#endif /* _TBB_scheduler_H */\n"
  },
  {
    "path": "benchmarks/tbb/scheduler_common.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef _TBB_scheduler_common_H\n#define _TBB_scheduler_common_H\n\n#include \"tbb/tbb_machine.h\"\n#include \"tbb/cache_aligned_allocator.h\"\n\n#include <string.h>  // for memset, memcpy, memmove\n\n#include \"tbb_statistics.h\"\n\n#if TBB_USE_ASSERT > 1\n#include <stdio.h>\n#endif /* TBB_USE_ASSERT > 1 */\n\n/* Temporarily change \"private\" to \"public\" while including \"tbb/task.h\".\n   This hack allows us to avoid publishing internal types and methods\n   in the public header files just for sake of friend declarations. */\n#ifndef private\n    #define private public\n    #define undef_private\n#endif\n\n#include \"tbb/task.h\"\n#include \"tbb/tbb_exception.h\"\n\n#ifdef undef_private\n    #undef private\n#endif\n\n#ifndef __TBB_SCHEDULER_MUTEX_TYPE\n#define __TBB_SCHEDULER_MUTEX_TYPE tbb::spin_mutex\n#endif\n// TODO: add conditional inclusion based on specified type\n#include \"tbb/spin_mutex.h\"\n\n// This macro is an attempt to get rid of ugly ifdefs in the shared parts of the code.\n// It drops the second argument depending on whether the controlling macro is defined.\n// The first argument is just a convenience allowing to keep comma before the macro usage.\n#if __TBB_TASK_GROUP_CONTEXT\n    #define __TBB_CONTEXT_ARG1(context) context\n    #define __TBB_CONTEXT_ARG(arg1, context) arg1, context\n#else /* !__TBB_TASK_GROUP_CONTEXT */\n    #define __TBB_CONTEXT_ARG1(context)\n    #define __TBB_CONTEXT_ARG(arg1, context) arg1\n#endif /* !__TBB_TASK_GROUP_CONTEXT */\n\n#if DO_TBB_TRACE\n#include <cstdio>\n#define TBB_TRACE(x) ((void)std::printf x)\n#else\n#define TBB_TRACE(x) ((void)(0))\n#endif /* DO_TBB_TRACE */\n\n#if !__TBB_CPU_CTL_ENV_PRESENT\n#include <fenv.h>\n#endif\n\n#if _MSC_VER && !defined(__INTEL_COMPILER)\n    // Workaround for overzealous compiler warnings\n    // These particular warnings are so ubiquitous that no attempt is made to narrow\n    // the scope of the warnings.\n    #pragma warning (disable: 4100 4127 4312 4244 4267 4706)\n#endif\n\nnamespace tbb {\nnamespace interface7 {\nnamespace internal {\nclass task_arena_base;\nclass delegated_task;\nclass wait_task;\n}}\nnamespace internal {\nusing namespace interface7::internal;\n\nclass arena;\ntemplate<typename SchedulerTraits> class custom_scheduler;\nclass generic_scheduler;\nclass governor;\nclass mail_outbox;\nclass market;\nclass observer_proxy;\nclass task_scheduler_observer_v3;\n\n#if __TBB_TASK_PRIORITY\nstatic const intptr_t num_priority_levels = 3;\nstatic const intptr_t normalized_normal_priority = (num_priority_levels - 1) / 2;\n\ninline intptr_t normalize_priority ( priority_t p ) {\n    return intptr_t(p - priority_low) / priority_stride_v4;\n}\n\nstatic const priority_t priority_from_normalized_rep[num_priority_levels] = {\n    priority_low, priority_normal, priority_high\n};\n\ninline void assert_priority_valid ( intptr_t p ) {\n    __TBB_ASSERT_EX( p >= 0 && p < num_priority_levels, NULL );\n}\n\ninline intptr_t& priority ( task& t ) {\n    return t.prefix().context->my_priority;\n}\n#endif /* __TBB_TASK_PRIORITY */\n\n//! Mutex type for global locks in the scheduler\ntypedef __TBB_SCHEDULER_MUTEX_TYPE scheduler_mutex_type;\n\n#if __TBB_TASK_GROUP_CONTEXT\n//! Task group state change propagation global epoch\n/** Together with generic_scheduler::my_context_state_propagation_epoch forms\n    cross-thread signaling mechanism that allows to avoid locking at the hot path\n    of normal execution flow.\n\n    When a descendant task group context is registered or unregistered, the global\n    and local epochs are compared. If they differ, a state change is being propagated,\n    and thus registration/deregistration routines take slower branch that may block\n    (at most one thread of the pool can be blocked at any moment). Otherwise the\n    control path is lock-free and fast. **/\nextern uintptr_t the_context_state_propagation_epoch;\n\n//! Mutex guarding state change propagation across task groups forest.\n/** Also protects modification of related data structures. **/\ntypedef scheduler_mutex_type context_state_propagation_mutex_type;\nextern context_state_propagation_mutex_type the_context_state_propagation_mutex;\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n//! Alignment for a task object\nconst size_t task_alignment = 32;\n\n//! Number of bytes reserved for a task prefix\n/** If not exactly sizeof(task_prefix), the extra bytes *precede* the task_prefix. */\nconst size_t task_prefix_reservation_size = ((sizeof(internal::task_prefix)-1)/task_alignment+1)*task_alignment;\n\n//! Definitions for bits in task_prefix::extra_state\nenum task_extra_state {\n    //! Tag for v1 tasks (i.e. tasks in TBB 1.0 and 2.0)\n    es_version_1_task = 0,\n    //! Tag for v3 tasks (i.e. tasks in TBB 2.1-2.2)\n    es_version_3_task = 1,\n    //! Tag for enqueued tasks\n    es_task_enqueued = 0x10,\n    //! Tag for v3 task_proxy.\n    es_task_proxy = 0x20,\n    //! Set if ref_count might be changed by another thread.  Used for debugging.\n    es_ref_count_active = 0x40,\n    //! Set if the task has been stolen\n    es_task_is_stolen = 0x80\n};\n\ninline void reset_extra_state ( task *t ) {\n    t->prefix().extra_state &= ~(es_task_is_stolen | es_task_enqueued);\n}\n\n//! Optimization hint to free_task that enables it omit unnecessary tests and code.\nenum free_task_hint {\n    //! No hint\n    no_hint=0,\n    //! Task is known to have been allocated by this scheduler\n    local_task=1,\n    //! Task is known to be a small task.\n    /** Task should be returned to the free list of *some* scheduler, possibly not this scheduler. */\n    small_task=2,\n    //! Bitwise-OR of local_task and small_task.\n    /** Task should be returned to free list of this scheduler. */\n    small_local_task=3,\n    //! Disable caching for a small task.\n    no_cache = 4,\n    //! Task is known to be a small task and must not be cached.\n    no_cache_small_task = no_cache | small_task\n};\n\n//------------------------------------------------------------------------\n// Debugging support\n//------------------------------------------------------------------------\n\n#if TBB_USE_ASSERT\n\nstatic const uintptr_t venom = tbb::internal::select_size_t_constant<0xDEADBEEFU,0xDDEEAADDDEADBEEFULL>::value;\n\ntemplate <typename T>\nvoid poison_value ( T& val ) { val = * punned_cast<T*>(&venom); }\n\n/** Expected to be used in assertions only, thus no empty form is defined. **/\ninline bool is_alive( uintptr_t v ) { return v != venom; }\n\n/** Logically, this method should be a member of class task.\n    But we do not want to publish it, so it is here instead. */\ninline void assert_task_valid( const task& task ) {\n    __TBB_ASSERT( &task!=NULL, NULL );\n    __TBB_ASSERT( !is_poisoned(&task), NULL );\n    __TBB_ASSERT( (uintptr_t)&task % task_alignment == 0, \"misaligned task\" );\n#if __TBB_RECYCLE_TO_ENQUEUE\n    __TBB_ASSERT( (unsigned)task.state()<=(unsigned)task::to_enqueue, \"corrupt task (invalid state)\" );\n#else\n    __TBB_ASSERT( (unsigned)task.state()<=(unsigned)task::recycle, \"corrupt task (invalid state)\" );\n#endif\n}\n\n#else /* !TBB_USE_ASSERT */\n\n/** In contrast to debug version poison_value() is a macro here because\n    the variable used as its argument may be undefined in release builds. **/\n#define poison_value(g) ((void)0)\n\ninline void assert_task_valid( const task& ) {}\n\n#endif /* !TBB_USE_ASSERT */\n\n//------------------------------------------------------------------------\n// Helpers\n//------------------------------------------------------------------------\n\n#if __TBB_TASK_GROUP_CONTEXT\ninline bool ConcurrentWaitsEnabled ( task& t ) {\n    return (t.prefix().context->my_version_and_traits & task_group_context::concurrent_wait) != 0;\n}\n\ninline bool CancellationInfoPresent ( task& t ) {\n    return t.prefix().context->my_cancellation_requested != 0;\n}\n\n#if TBB_USE_CAPTURED_EXCEPTION\n    inline tbb_exception* TbbCurrentException( task_group_context*, tbb_exception* src) { return src->move(); }\n    inline tbb_exception* TbbCurrentException( task_group_context*, captured_exception* src) { return src; }\n#else\n    // Using macro instead of an inline function here allows to avoid evaluation of the\n    // TbbCapturedException expression when exact propagation is enabled for the context.\n    #define TbbCurrentException(context, TbbCapturedException) \\\n        context->my_version_and_traits & task_group_context::exact_exception    \\\n            ? tbb_exception_ptr::allocate()    \\\n            : tbb_exception_ptr::allocate( *(TbbCapturedException) );\n#endif /* !TBB_USE_CAPTURED_EXCEPTION */\n\n#define TbbRegisterCurrentException(context, TbbCapturedException) \\\n    if ( context->cancel_group_execution() ) {  \\\n        /* We are the first to signal cancellation, so store the exception that caused it. */  \\\n        context->my_exception = TbbCurrentException( context, TbbCapturedException ); \\\n    }\n\n#define TbbCatchAll(context)  \\\n    catch ( tbb_exception& exc ) {  \\\n        TbbRegisterCurrentException( context, &exc );   \\\n    } catch ( std::exception& exc ) {   \\\n        TbbRegisterCurrentException( context, captured_exception::allocate(typeid(exc).name(), exc.what()) ); \\\n    } catch ( ... ) {   \\\n        TbbRegisterCurrentException( context, captured_exception::allocate(\"...\", \"Unidentified exception\") );\\\n    }\n\n#else /* !__TBB_TASK_GROUP_CONTEXT */\n\ninline bool ConcurrentWaitsEnabled ( task& t ) { return false; }\n\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n//------------------------------------------------------------------------\n// arena_slot\n//------------------------------------------------------------------------\nstruct arena_slot_line1 {\n    //TODO: make this tbb:atomic<>.\n    //! Scheduler of the thread attached to the slot\n    /** Marks the slot as busy, and is used to iterate through the schedulers belonging to this arena **/\n    generic_scheduler* my_scheduler;\n\n    // Synchronization of access to Task pool\n    /** Also is used to specify if the slot is empty or locked:\n         0 - empty\n        -1 - locked **/\n    task* *__TBB_atomic task_pool;\n\n    //! Index of the first ready task in the deque.\n    /** Modified by thieves, and by the owner during compaction/reallocation **/\n    __TBB_atomic size_t head;\n};\n\nstruct arena_slot_line2 {\n    //! Hint provided for operations with the container of starvation-resistant tasks.\n    /** Modified by the owner thread (during these operations). **/\n    unsigned hint_for_pop;\n\n    //! Index of the element following the last ready task in the deque.\n    /** Modified by the owner thread. **/\n    __TBB_atomic size_t tail;\n\n    //! Capacity of the primary task pool (number of elements - pointers to task).\n    size_t my_task_pool_size;\n\n    // Task pool of the scheduler that owns this slot\n    task* *__TBB_atomic task_pool_ptr;\n\n#if __TBB_STATISTICS\n    //! Set of counters to accumulate internal statistics related to this arena\n    statistics_counters *my_counters;\n#endif /* __TBB_STATISTICS */\n};\n\nstruct arena_slot : padded<arena_slot_line1>, padded<arena_slot_line2> {\n#if TBB_USE_ASSERT\n    void fill_with_canary_pattern ( size_t first, size_t last ) {\n        for ( size_t i = first; i < last; ++i )\n            poison_pointer(task_pool_ptr[i]);\n    }\n#else\n    void fill_with_canary_pattern ( size_t, size_t ) {}\n#endif /* TBB_USE_ASSERT */\n\n    void allocate_task_pool( size_t n ) {\n        size_t byte_size = ((n * sizeof(task*) + NFS_MaxLineSize - 1) / NFS_MaxLineSize) * NFS_MaxLineSize;\n        my_task_pool_size = byte_size / sizeof(task*);\n        task_pool_ptr = (task**)NFS_Allocate( 1, byte_size, NULL );\n        // No need to clear the fresh deque since valid items are designated by the head and tail members.\n        // But fill it with a canary pattern in the high vigilance debug mode.\n        fill_with_canary_pattern( 0, my_task_pool_size );\n    }\n\n    //! Deallocate task pool that was allocated by means of allocate_task_pool.\n    void free_task_pool( ) {\n#if !__TBB_TASK_ARENA\n        __TBB_ASSERT( !task_pool /*TODO: == EmptyTaskPool*/, NULL);\n#else\n        //TODO: understand the assertion and modify\n#endif\n        if( task_pool_ptr ) {\n           __TBB_ASSERT( my_task_pool_size, NULL);\n           NFS_Free( task_pool_ptr );\n           task_pool_ptr = NULL;\n           my_task_pool_size = 0;\n        }\n    }\n};\n\n#if !__TBB_CPU_CTL_ENV_PRESENT\nclass cpu_ctl_env {\n    fenv_t *my_fenv_ptr;\npublic:\n    cpu_ctl_env() : my_fenv_ptr(NULL) {}\n    ~cpu_ctl_env() {\n        if ( my_fenv_ptr )\n            tbb::internal::NFS_Free( (void*)my_fenv_ptr );\n    }\n    // It is possible not to copy memory but just to copy pointers but the following issues should be addressed:\n    //   1. The arena lifetime and the context lifetime are independent;\n    //   2. The user is allowed to recapture different FPU settings to context so 'current FPU settings' inside\n    //   dispatch loop may become invalid.\n    // But do we really want to improve the fenv implementation? It seems to be better to replace the fenv implementation\n    // with a platform specific implementation.\n    cpu_ctl_env( const cpu_ctl_env &src ) : my_fenv_ptr(NULL) {\n        *this = src;\n    }\n    cpu_ctl_env& operator=( const cpu_ctl_env &src ) {\n        __TBB_ASSERT( src.my_fenv_ptr, NULL );\n        if ( !my_fenv_ptr )\n            my_fenv_ptr = (fenv_t*)tbb::internal::NFS_Allocate(1, sizeof(fenv_t), NULL);\n        *my_fenv_ptr = *src.my_fenv_ptr;\n        return *this;\n    }\n    bool operator!=( const cpu_ctl_env &ctl ) const {\n        __TBB_ASSERT( my_fenv_ptr, \"cpu_ctl_env is not initialized.\" );\n        __TBB_ASSERT( ctl.my_fenv_ptr, \"cpu_ctl_env is not initialized.\" );\n        return memcmp( (void*)my_fenv_ptr, (void*)ctl.my_fenv_ptr, sizeof(fenv_t) );\n    }\n    void get_env () {\n        if ( !my_fenv_ptr )\n            my_fenv_ptr = (fenv_t*)tbb::internal::NFS_Allocate(1, sizeof(fenv_t), NULL);\n        fegetenv( my_fenv_ptr );\n    }\n    const cpu_ctl_env& set_env () const {\n        __TBB_ASSERT( my_fenv_ptr, \"cpu_ctl_env is not initialized.\" );\n        fesetenv( my_fenv_ptr );\n        return *this;\n    }\n};\n#endif /* !__TBB_CPU_CTL_ENV_PRESENT */\n\n} // namespace internal\n} // namespace tbb\n\n#endif /* _TBB_scheduler_common_H */\n"
  },
  {
    "path": "benchmarks/tbb/scheduler_utility.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef _TBB_scheduler_utility_H\n#define _TBB_scheduler_utility_H\n\n#include \"scheduler.h\"\n\nnamespace tbb {\nnamespace internal {\n\n//------------------------------------------------------------------------\n// auto_empty_task\n//------------------------------------------------------------------------\n\n//! Smart holder for the empty task class with automatic destruction\nclass auto_empty_task {\n    task* my_task;\n    generic_scheduler* my_scheduler;\npublic:\n    auto_empty_task ( __TBB_CONTEXT_ARG(generic_scheduler *s, task_group_context* context) ) \n        : my_task( new(&s->allocate_task(sizeof(empty_task), __TBB_CONTEXT_ARG(NULL, context))) empty_task )\n        , my_scheduler(s)\n    {}\n    // empty_task has trivial destructor, so there's no need to call it.\n    ~auto_empty_task () { my_scheduler->free_task<small_local_task>(*my_task); }\n\n    operator task& () { return *my_task; }\n    task* operator & () { return my_task; }\n    task_prefix& prefix () { return my_task->prefix(); }\n}; // class auto_empty_task\n\n//------------------------------------------------------------------------\n// fast_reverse_vector\n//------------------------------------------------------------------------\n\n//! Vector that grows without reallocations, and stores items in the reverse order.\n/** Requires to initialize its first segment with a preallocated memory chunk\n    (usually it is static array or an array allocated on the stack).\n    The second template parameter specifies maximal number of segments. Each next \n    segment is twice as large as the previous one. **/\ntemplate<typename T, size_t max_segments = 16>\nclass fast_reverse_vector\n{\npublic:\n    fast_reverse_vector ( T* initial_segment, size_t segment_size )\n        : m_cur_segment(initial_segment)\n        , m_cur_segment_size(segment_size)\n        , m_pos(segment_size)\n        , m_num_segments(0)\n        , m_size(0)\n    {\n        __TBB_ASSERT ( initial_segment && segment_size, \"Nonempty initial segment must be supplied\");\n    }\n\n    ~fast_reverse_vector ()\n    {\n        for ( size_t i = 1; i < m_num_segments; ++i )\n            NFS_Free( m_segments[i] );\n    }\n\n    size_t size () const { return m_size + m_cur_segment_size - m_pos; }\n\n    void push_back ( const T& val )\n    {\n        if ( !m_pos ) {\n            if ( !m_num_segments ) m_segments[m_num_segments++] = m_cur_segment;\n            m_size += m_cur_segment_size;\n            m_cur_segment_size *= 2;\n            m_pos = m_cur_segment_size;\n            m_segments[m_num_segments++] = m_cur_segment = (T*)NFS_Allocate( m_cur_segment_size, sizeof(T), NULL );\n            __TBB_ASSERT ( m_num_segments < max_segments, \"Maximal capacity exceeded\" );\n        }\n        m_cur_segment[--m_pos] = val;\n    }\n\n    //! Copies the contents of the vector into the dst array. \n    /** Can only be used when T is a POD type, as copying does not invoke copy constructors. **/\n    void copy_memory ( T* dst ) const\n    {\n        size_t sz = m_cur_segment_size - m_pos;\n        memcpy( dst, m_cur_segment + m_pos, sz * sizeof(T) );\n        dst += sz;\n        sz = m_cur_segment_size / 2;\n        for ( long i = (long)m_num_segments - 2; i >= 0; --i ) {\n            memcpy( dst, m_segments[i], sz * sizeof(T) );\n            dst += sz;\n            sz /= 2;\n        }\n    }\n\nprotected:\n    //! The current (not completely filled) segment\n    T       *m_cur_segment;\n\n    //! Capacity of m_cur_segment\n    size_t  m_cur_segment_size;\n\n    //! Insertion position in m_cur_segment\n    size_t  m_pos;\n\n    //! Array of segments (has fixed size specified by the second template parameter)\n    T       *m_segments[max_segments];\n    \n    //! Number of segments (the size of m_segments)\n    size_t  m_num_segments;\n\n    //! Number of items in the segments in m_segments\n    size_t  m_size;\n\n}; // class fast_reverse_vector\n\n} // namespace internal\n} // namespace tbb\n\n#endif /* _TBB_scheduler_utility_H */\n"
  },
  {
    "path": "benchmarks/tbb/semaphore.cpp",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#include \"semaphore.h\"\n#if __TBB_USE_SRWLOCK\n#include \"dynamic_link.h\" // Refers to src/tbb, not include/tbb\n#include \"tbb_misc.h\"\n#endif\n\nnamespace tbb {\nnamespace internal {\n\n// TODO: For new win UI port, we can use SRWLock API without dynamic_link etc.\n#if __TBB_USE_SRWLOCK\n\nstatic atomic<do_once_state> concmon_module_inited;\n\nvoid WINAPI init_binsem_using_event( SRWLOCK* h_ )\n{\n    srwl_or_handle* shptr = (srwl_or_handle*) h_;\n    shptr->h = CreateEventEx( NULL, NULL, 0, EVENT_ALL_ACCESS|SEMAPHORE_ALL_ACCESS );\n}\n\nvoid WINAPI acquire_binsem_using_event( SRWLOCK* h_ )\n{\n    srwl_or_handle* shptr = (srwl_or_handle*) h_;\n    WaitForSingleObjectEx( shptr->h, INFINITE, FALSE );\n}\n\nvoid WINAPI release_binsem_using_event( SRWLOCK* h_ )\n{\n    srwl_or_handle* shptr = (srwl_or_handle*) h_;\n    SetEvent( shptr->h );\n}\n\nstatic void (WINAPI *__TBB_init_binsem)( SRWLOCK* ) = (void (WINAPI *)(SRWLOCK*))&init_binsem_using_event;\nstatic void (WINAPI *__TBB_acquire_binsem)( SRWLOCK* ) = (void (WINAPI *)(SRWLOCK*))&acquire_binsem_using_event;\nstatic void (WINAPI *__TBB_release_binsem)( SRWLOCK* ) = (void (WINAPI *)(SRWLOCK*))&release_binsem_using_event;\n\n//! Table describing the how to link the handlers.\nstatic const dynamic_link_descriptor SRWLLinkTable[] = {\n    DLD(InitializeSRWLock,       __TBB_init_binsem),\n    DLD(AcquireSRWLockExclusive, __TBB_acquire_binsem),\n    DLD(ReleaseSRWLockExclusive, __TBB_release_binsem)\n};\n\ninline void init_concmon_module()\n{\n    __TBB_ASSERT( (uintptr_t)__TBB_init_binsem==(uintptr_t)&init_binsem_using_event, NULL );\n    if( dynamic_link( \"Kernel32.dll\", SRWLLinkTable, sizeof(SRWLLinkTable)/sizeof(dynamic_link_descriptor) ) ) {\n        __TBB_ASSERT( (uintptr_t)__TBB_init_binsem!=(uintptr_t)&init_binsem_using_event, NULL );\n        __TBB_ASSERT( (uintptr_t)__TBB_acquire_binsem!=(uintptr_t)&acquire_binsem_using_event, NULL );\n        __TBB_ASSERT( (uintptr_t)__TBB_release_binsem!=(uintptr_t)&release_binsem_using_event, NULL );\n    }\n}\n\nbinary_semaphore::binary_semaphore() {\n    atomic_do_once( &init_concmon_module, concmon_module_inited );\n\n    __TBB_init_binsem( &my_sem.lock ); \n    if( (uintptr_t)__TBB_init_binsem!=(uintptr_t)&init_binsem_using_event )\n        P();\n}\n\nbinary_semaphore::~binary_semaphore() {\n    if( (uintptr_t)__TBB_init_binsem==(uintptr_t)&init_binsem_using_event )\n        CloseHandle( my_sem.h );\n}\n\nvoid binary_semaphore::P() { __TBB_acquire_binsem( &my_sem.lock ); }\n\nvoid binary_semaphore::V() { __TBB_release_binsem( &my_sem.lock ); }\n\n#endif /* __TBB_USE_SRWLOCK */\n\n} // namespace internal\n} // namespace tbb\n"
  },
  {
    "path": "benchmarks/tbb/semaphore.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_tbb_semaphore_H\n#define __TBB_tbb_semaphore_H\n\n#include \"tbb/tbb_stddef.h\"\n\n#if _WIN32||_WIN64\n#include \"tbb/machine/windows_api.h\"\n\n#elif __APPLE__\n#include <mach/semaphore.h>\n#include <mach/task.h>\n#include <mach/mach_init.h>\n#include <mach/error.h>\n\n#else\n#include <semaphore.h>\n#ifdef TBB_USE_DEBUG\n#include <errno.h>\n#endif\n#endif /*_WIN32||_WIN64*/\n\nnamespace tbb {\nnamespace internal {\n\n\n#if _WIN32||_WIN64\ntypedef LONG sem_count_t;\n//! Edsger Dijkstra's counting semaphore\nclass semaphore : no_copy {\n    static const int max_semaphore_cnt = MAXLONG;\npublic:\n    //! ctor\n    semaphore(size_t start_cnt_ = 0) {init_semaphore(start_cnt_);}\n    //! dtor\n    ~semaphore() {CloseHandle( sem );}\n    //! wait/acquire\n    void P() {WaitForSingleObjectEx( sem, INFINITE, FALSE );}\n    //! post/release \n    void V() {ReleaseSemaphore( sem, 1, NULL );}\nprivate:\n    HANDLE sem;\n    void init_semaphore(size_t start_cnt_) {\n        sem = CreateSemaphoreEx( NULL, LONG(start_cnt_), max_semaphore_cnt, NULL, 0, SEMAPHORE_ALL_ACCESS );\n    }\n};\n#elif __APPLE__\n//! Edsger Dijkstra's counting semaphore\nclass semaphore : no_copy {\npublic:\n    //! ctor\n    semaphore(int start_cnt_ = 0) : sem(start_cnt_) { init_semaphore(start_cnt_); }\n    //! dtor\n    ~semaphore() {\n        kern_return_t ret = semaphore_destroy( mach_task_self(), sem );\n        __TBB_ASSERT_EX( ret==err_none, NULL );\n    }\n    //! wait/acquire\n    void P() { \n        int ret;\n        do {\n            ret = semaphore_wait( sem );\n        } while( ret==KERN_ABORTED );\n        __TBB_ASSERT( ret==KERN_SUCCESS, \"semaphore_wait() failed\" );\n    }\n    //! post/release \n    void V() { semaphore_signal( sem ); }\nprivate:\n    semaphore_t sem;\n    void init_semaphore(int start_cnt_) {\n        kern_return_t ret = semaphore_create( mach_task_self(), &sem, SYNC_POLICY_FIFO, start_cnt_ );\n        __TBB_ASSERT_EX( ret==err_none, \"failed to create a semaphore\" );\n    }\n};\n#else /* Linux/Unix */\ntypedef uint32_t sem_count_t;\n//! Edsger Dijkstra's counting semaphore\nclass semaphore : no_copy {\npublic:\n    //! ctor\n    semaphore(int start_cnt_ = 0 ) { init_semaphore( start_cnt_ ); }\n\n    //! dtor\n    ~semaphore() {\n        int ret = sem_destroy( &sem );\n        __TBB_ASSERT_EX( !ret, NULL );\n    }\n    //! wait/acquire\n    void P() {\n        while( sem_wait( &sem )!=0 )\n            __TBB_ASSERT( errno==EINTR, NULL );\n    }\n    //! post/release \n    void V() { sem_post( &sem ); }\nprivate:\n    sem_t sem;\n    void init_semaphore(int start_cnt_) {\n        int ret = sem_init( &sem, /*shared among threads*/ 0, start_cnt_ );\n        __TBB_ASSERT_EX( !ret, NULL );\n    }\n};\n#endif /* _WIN32||_WIN64 */\n\n\n//! for performance reasons, we want specialized binary_semaphore\n#if _WIN32||_WIN64\n#if !__TBB_USE_SRWLOCK\n//! binary_semaphore for concurrent_monitor\nclass binary_semaphore : no_copy {\npublic:\n    //! ctor\n    binary_semaphore() { my_sem = CreateEventEx( NULL, NULL, 0, EVENT_ALL_ACCESS );  }\n    //! dtor\n    ~binary_semaphore() { CloseHandle( my_sem ); }\n    //! wait/acquire\n    void P() { WaitForSingleObjectEx( my_sem, INFINITE, FALSE ); }\n    //! post/release \n    void V() { SetEvent( my_sem ); }\nprivate:\n    HANDLE my_sem;\n};\n#else /* __TBB_USE_SRWLOCK */\n\nunion srwl_or_handle {\n    SRWLOCK lock;\n    HANDLE  h;\n};\n\n//! binary_semaphore for concurrent_monitor\nclass binary_semaphore : no_copy {\npublic:\n    //! ctor\n    binary_semaphore();\n    //! dtor\n    ~binary_semaphore();\n    //! wait/acquire\n    void P();\n    //! post/release \n    void V();\nprivate:\n    srwl_or_handle my_sem;\n};\n#endif /* !__TBB_USE_SRWLOCK */\n#elif __APPLE__\n//! binary_semaphore for concurrent monitor\nclass binary_semaphore : no_copy {\npublic:\n    //! ctor\n    binary_semaphore() : my_sem(0) {\n        kern_return_t ret = semaphore_create( mach_task_self(), &my_sem, SYNC_POLICY_FIFO, 0 );\n        __TBB_ASSERT_EX( ret==err_none, \"failed to create a semaphore\" );\n    }\n    //! dtor\n    ~binary_semaphore() {\n        kern_return_t ret = semaphore_destroy( mach_task_self(), my_sem );\n        __TBB_ASSERT_EX( ret==err_none, NULL );\n    }\n    //! wait/acquire\n    void P() { \n        int ret;\n        do {\n            ret = semaphore_wait( my_sem );\n        } while( ret==KERN_ABORTED );\n        __TBB_ASSERT( ret==KERN_SUCCESS, \"semaphore_wait() failed\" );\n    }\n    //! post/release \n    void V() { semaphore_signal( my_sem ); }\nprivate:\n    semaphore_t my_sem;\n};\n#else /* Linux/Unix */\n\n#if __TBB_USE_FUTEX\nclass binary_semaphore : no_copy {\npublic:\n    //! ctor\n    binary_semaphore() { my_sem = 1; }\n    //! dtor\n    ~binary_semaphore() {}\n    //! wait/acquire\n    void P() {\n        int s;\n        if( (s = my_sem.compare_and_swap( 1, 0 ))!=0 ) {\n            if( s!=2 )\n                s = my_sem.fetch_and_store( 2 );\n            while( s!=0 ) {\n                futex_wait( &my_sem, 2 );\n                s = my_sem.fetch_and_store( 2 );\n            }\n        }\n    }\n    //! post/release \n    void V() { \n        __TBB_ASSERT( my_sem>=1, \"multiple V()'s in a row?\" );\n        if( my_sem--!=1 ) {\n            //if old value was 2\n            my_sem = 0;\n            futex_wakeup_one( &my_sem );\n        }\n    }\nprivate:\n    atomic<int> my_sem;\n};\n#else\ntypedef uint32_t sem_count_t;\n//! binary_semaphore for concurrent monitor\nclass binary_semaphore : no_copy {\npublic:\n    //! ctor\n    binary_semaphore() {\n        int ret = sem_init( &my_sem, /*shared among threads*/ 0, 0 );\n        __TBB_ASSERT_EX( !ret, NULL );\n    }\n    //! dtor\n    ~binary_semaphore() {\n        int ret = sem_destroy( &my_sem );\n        __TBB_ASSERT_EX( !ret, NULL );\n    }\n    //! wait/acquire\n    void P() {\n        while( sem_wait( &my_sem )!=0 )\n            __TBB_ASSERT( errno==EINTR, NULL );\n    }\n    //! post/release \n    void V() { sem_post( &my_sem ); }\nprivate:\n    sem_t my_sem;\n};\n#endif /* __TBB_USE_FUTEX */\n#endif /* _WIN32||_WIN64 */\n\n} // namespace internal\n} // namespace tbb\n\n#endif /* __TBB_tbb_semaphore_H */\n"
  },
  {
    "path": "benchmarks/tbb/spin_mutex.cpp",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#include \"tbb/tbb_machine.h\"\n#include \"tbb/spin_mutex.h\"\n#include \"itt_notify.h\"\n#include \"tbb_misc.h\"\n\nnamespace tbb {\n\nvoid spin_mutex::scoped_lock::internal_acquire( spin_mutex& m ) {\n    __TBB_ASSERT( !my_mutex, \"already holding a lock on a spin_mutex\" );\n    ITT_NOTIFY(sync_prepare, &m);\n    __TBB_LockByte(m.flag);\n    my_mutex = &m;\n    ITT_NOTIFY(sync_acquired, &m);\n}\n\nvoid spin_mutex::scoped_lock::internal_release() {\n    __TBB_ASSERT( my_mutex, \"release on spin_mutex::scoped_lock that is not holding a lock\" );\n\n    ITT_NOTIFY(sync_releasing, my_mutex);\n    __TBB_UnlockByte(my_mutex->flag);\n    my_mutex = NULL;\n}\n\nbool spin_mutex::scoped_lock::internal_try_acquire( spin_mutex& m ) {\n    __TBB_ASSERT( !my_mutex, \"already holding a lock on a spin_mutex\" );\n    bool result = bool( __TBB_TryLockByte(m.flag) );\n    if( result ) {\n        my_mutex = &m;\n        ITT_NOTIFY(sync_acquired, &m);\n    }\n    return result;\n}\n\nvoid spin_mutex::internal_construct() {\n    ITT_SYNC_CREATE(this, _T(\"tbb::spin_mutex\"), _T(\"\"));\n}\n\n} // namespace tbb\n"
  },
  {
    "path": "benchmarks/tbb/spin_mutex.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_spin_mutex_H\n#define __TBB_spin_mutex_H\n\n#include <cstddef>\n#include <new>\n#include \"aligned_space.h\"\n#include \"tbb_stddef.h\"\n#include \"tbb_machine.h\"\n#include \"tbb_profiling.h\"\n#include \"internal/_mutex_padding.h\"\n\nnamespace tbb {\n\n//! A lock that occupies a single byte.\n/** A spin_mutex is a spin mutex that fits in a single byte.\n    It should be used only for locking short critical sections\n    (typically less than 20 instructions) when fairness is not an issue.\n    If zero-initialized, the mutex is considered unheld.\n    @ingroup synchronization */\nclass spin_mutex : internal::mutex_copy_deprecated_and_disabled {\n    //! 0 if lock is released, 1 if lock is acquired.\n    __TBB_atomic_flag flag;\n\npublic:\n    //! Construct unacquired lock.\n    /** Equivalent to zero-initialization of *this. */\n    spin_mutex() : flag(0) {\n#if TBB_USE_THREADING_TOOLS\n        internal_construct();\n#endif\n    }\n\n    //! Represents acquisition of a mutex.\n    class scoped_lock : internal::no_copy {\n    private:\n        //! Points to currently held mutex, or NULL if no lock is held.\n        spin_mutex* my_mutex;\n\n        //! Value to store into spin_mutex::flag to unlock the mutex.\n        /** This variable is no longer used. Instead, 0 and 1 are used to\n            represent that the lock is free and acquired, respectively.\n            We keep the member variable here to ensure backward compatibility */\n        __TBB_Flag my_unlock_value;\n\n        //! Like acquire, but with ITT instrumentation.\n        void __TBB_EXPORTED_METHOD internal_acquire( spin_mutex& m );\n\n        //! Like try_acquire, but with ITT instrumentation.\n        bool __TBB_EXPORTED_METHOD internal_try_acquire( spin_mutex& m );\n\n        //! Like release, but with ITT instrumentation.\n        void __TBB_EXPORTED_METHOD internal_release();\n\n        friend class spin_mutex;\n\n    public:\n        //! Construct without acquiring a mutex.\n        scoped_lock() : my_mutex(NULL), my_unlock_value(0) {}\n\n        //! Construct and acquire lock on a mutex.\n        scoped_lock( spin_mutex& m ) : my_unlock_value(0) {\n            internal::suppress_unused_warning(my_unlock_value);\n#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT\n            my_mutex=NULL;\n            internal_acquire(m);\n#else\n            my_mutex=&m;\n            __TBB_LockByte(m.flag);\n#endif /* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT*/\n        }\n\n        //! Acquire lock.\n        void acquire( spin_mutex& m ) {\n#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT\n            internal_acquire(m);\n#else\n            my_mutex = &m;\n            __TBB_LockByte(m.flag);\n#endif /* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT*/\n        }\n\n        //! Try acquiring lock (non-blocking)\n        /** Return true if lock acquired; false otherwise. */\n        bool try_acquire( spin_mutex& m ) {\n#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT\n            return internal_try_acquire(m);\n#else\n            bool result = __TBB_TryLockByte(m.flag);\n            if( result )\n                my_mutex = &m;\n            return result;\n#endif /* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT*/\n        }\n\n        //! Release lock\n        void release() {\n#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT\n            internal_release();\n#else\n            __TBB_UnlockByte(my_mutex->flag);\n            my_mutex = NULL;\n#endif /* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */\n        }\n\n        //! Destroy lock.  If holding a lock, releases the lock first.\n        ~scoped_lock() {\n            if( my_mutex ) {\n#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT\n                internal_release();\n#else\n                __TBB_UnlockByte(my_mutex->flag);\n#endif /* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */\n            }\n        }\n    };\n\n    //! Internal constructor with ITT instrumentation.\n    void __TBB_EXPORTED_METHOD internal_construct();\n\n    // Mutex traits\n    static const bool is_rw_mutex = false;\n    static const bool is_recursive_mutex = false;\n    static const bool is_fair_mutex = false;\n\n    // ISO C++0x compatibility methods\n\n    //! Acquire lock\n    void lock() {\n#if TBB_USE_THREADING_TOOLS\n        aligned_space<scoped_lock> tmp;\n        new(tmp.begin()) scoped_lock(*this);\n#else\n        __TBB_LockByte(flag);\n#endif /* TBB_USE_THREADING_TOOLS*/\n    }\n\n    //! Try acquiring lock (non-blocking)\n    /** Return true if lock acquired; false otherwise. */\n    bool try_lock() {\n#if TBB_USE_THREADING_TOOLS\n        aligned_space<scoped_lock> tmp;\n        return (new(tmp.begin()) scoped_lock)->internal_try_acquire(*this);\n#else\n        return __TBB_TryLockByte(flag);\n#endif /* TBB_USE_THREADING_TOOLS*/\n    }\n\n    //! Release lock\n    void unlock() {\n#if TBB_USE_THREADING_TOOLS\n        aligned_space<scoped_lock> tmp;\n        scoped_lock& s = *tmp.begin();\n        s.my_mutex = this;\n        s.internal_release();\n#else\n        __TBB_store_with_release(flag, 0);\n#endif /* TBB_USE_THREADING_TOOLS */\n    }\n\n    friend class scoped_lock;\n}; // end of spin_mutex\n\n__TBB_DEFINE_PROFILING_SET_NAME(spin_mutex)\n\n} // namespace tbb\n\n#if ( __TBB_x86_32 || __TBB_x86_64 )\n#include \"internal/_x86_eliding_mutex_impl.h\"\n#endif\n\nnamespace tbb {\n//! A cross-platform spin mutex with speculative lock acquisition.\n/** On platforms with proper HW support, this lock may speculatively execute\n    its critical sections, using HW mechanisms to detect real data races and\n    ensure atomicity of the critical sections. In particular, it uses\n    Intel(R) Transactional Synchronization Extensions (Intel(R) TSX).\n    Without such HW support, it behaves like a spin_mutex.\n    It should be used for locking short critical sections where the lock is\n    contended but the data it protects are not.  If zero-initialized, the\n    mutex is considered unheld.\n    @ingroup synchronization */\n\n#if ( __TBB_x86_32 || __TBB_x86_64 )\ntypedef interface7::internal::padded_mutex<interface7::internal::x86_eliding_mutex,false> speculative_spin_mutex;\n#else\ntypedef interface7::internal::padded_mutex<spin_mutex,false> speculative_spin_mutex;\n#endif\n__TBB_DEFINE_PROFILING_SET_NAME(speculative_spin_mutex)\n\n} // namespace tbb\n\n#endif /* __TBB_spin_mutex_H */\n"
  },
  {
    "path": "benchmarks/tbb/spin_rw_mutex.cpp",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#include \"tbb/spin_rw_mutex.h\"\n#include \"tbb/tbb_machine.h\"\n#include \"tbb/atomic.h\"\n#include \"itt_notify.h\"\n\n#if defined(_MSC_VER) && defined(_Wp64)\n    // Workaround for overzealous compiler warnings in /Wp64 mode\n    #pragma warning (disable: 4244)\n#endif\n\nnamespace tbb {\n\ntemplate<typename T> // a template can work with private spin_rw_mutex::state_t\nstatic inline T CAS(volatile T &addr, T newv, T oldv) {\n    // ICC (9.1 and 10.1 tried) unable to do implicit conversion\n    // from \"volatile T*\" to \"volatile void*\", so explicit cast added.\n    return tbb::internal::as_atomic(addr).compare_and_swap( newv, oldv );\n}\n\n//! Acquire write lock on the given mutex.\nbool spin_rw_mutex_v3::internal_acquire_writer()\n{\n    ITT_NOTIFY(sync_prepare, this);\n    for( internal::atomic_backoff backoff;;backoff.pause() ){\n        state_t s = const_cast<volatile state_t&>(state); // ensure reloading\n        if( !(s & BUSY) ) { // no readers, no writers\n            if( CAS(state, WRITER, s)==s )\n                break; // successfully stored writer flag\n            backoff.reset(); // we could be very close to complete op.\n        } else if( !(s & WRITER_PENDING) ) { // no pending writers\n            __TBB_AtomicOR(&state, WRITER_PENDING);\n        }\n    }\n    ITT_NOTIFY(sync_acquired, this);\n    return false;\n}\n\n//! Release writer lock on the given mutex\nvoid spin_rw_mutex_v3::internal_release_writer()\n{\n    ITT_NOTIFY(sync_releasing, this);\n    __TBB_AtomicAND( &state, READERS );\n}\n\n//! Acquire read lock on given mutex.\nvoid spin_rw_mutex_v3::internal_acquire_reader()\n{\n    ITT_NOTIFY(sync_prepare, this);\n    for( internal::atomic_backoff b;;b.pause() ){\n        state_t s = const_cast<volatile state_t&>(state); // ensure reloading\n        if( !(s & (WRITER|WRITER_PENDING)) ) { // no writer or write requests\n            state_t t = (state_t)__TBB_FetchAndAddW( &state, (intptr_t) ONE_READER );\n            if( !( t&WRITER )) \n                break; // successfully stored increased number of readers\n            // writer got there first, undo the increment\n            __TBB_FetchAndAddW( &state, -(intptr_t)ONE_READER );\n        }\n    }\n\n    ITT_NOTIFY(sync_acquired, this);\n    __TBB_ASSERT( state & READERS, \"invalid state of a read lock: no readers\" );\n}\n\n//! Upgrade reader to become a writer.\n/** Returns whether the upgrade happened without releasing and re-acquiring the lock */\nbool spin_rw_mutex_v3::internal_upgrade()\n{\n    state_t s = state;\n    __TBB_ASSERT( s & READERS, \"invalid state before upgrade: no readers \" );\n    // check and set writer-pending flag\n    // required conditions: either no pending writers, or we are the only reader\n    // (with multiple readers and pending writer, another upgrade could have been requested)\n    while( (s & READERS)==ONE_READER || !(s & WRITER_PENDING) ) {\n        state_t old_s = s;\n        if( (s=CAS(state, s | WRITER | WRITER_PENDING, s))==old_s ) {\n            ITT_NOTIFY(sync_prepare, this);\n            internal::atomic_backoff backoff;\n            while( (state & READERS) != ONE_READER ) backoff.pause();\n            __TBB_ASSERT((state&(WRITER_PENDING|WRITER))==(WRITER_PENDING|WRITER),\"invalid state when upgrading to writer\");\n            // both new readers and writers are blocked at this time\n            __TBB_FetchAndAddW( &state,  - (intptr_t)(ONE_READER+WRITER_PENDING));\n            ITT_NOTIFY(sync_acquired, this);\n            return true; // successfully upgraded\n        }\n    }\n    // slow reacquire\n    internal_release_reader();\n    return internal_acquire_writer(); // always returns false\n}\n\n//! Downgrade writer to a reader\nvoid spin_rw_mutex_v3::internal_downgrade() {\n    ITT_NOTIFY(sync_releasing, this);\n    __TBB_FetchAndAddW( &state, (intptr_t)(ONE_READER-WRITER));\n    __TBB_ASSERT( state & READERS, \"invalid state after downgrade: no readers\" );\n}\n\n//! Release read lock on the given mutex\nvoid spin_rw_mutex_v3::internal_release_reader()\n{\n    __TBB_ASSERT( state & READERS, \"invalid state of a read lock: no readers\" );\n    ITT_NOTIFY(sync_releasing, this); // release reader\n    __TBB_FetchAndAddWrelease( &state,-(intptr_t)ONE_READER);\n}\n\n//! Try to acquire write lock on the given mutex\nbool spin_rw_mutex_v3::internal_try_acquire_writer()\n{\n    // for a writer: only possible to acquire if no active readers or writers\n    state_t s = state;\n    if( !(s & BUSY) ) // no readers, no writers; mask is 1..1101\n        if( CAS(state, WRITER, s)==s ) {\n            ITT_NOTIFY(sync_acquired, this);\n            return true; // successfully stored writer flag\n        }\n    return false;\n}\n\n//! Try to acquire read lock on the given mutex\nbool spin_rw_mutex_v3::internal_try_acquire_reader()\n{\n    // for a reader: acquire if no active or waiting writers\n    state_t s = state;\n    if( !(s & (WRITER|WRITER_PENDING)) ) { // no writers\n        state_t t = (state_t)__TBB_FetchAndAddW( &state, (intptr_t) ONE_READER );\n        if( !( t&WRITER )) {  // got the lock\n            ITT_NOTIFY(sync_acquired, this);\n            return true; // successfully stored increased number of readers\n        }\n        // writer got there first, undo the increment\n        __TBB_FetchAndAddW( &state, -(intptr_t)ONE_READER );\n    }\n    return false;\n}\n\nvoid spin_rw_mutex_v3::internal_construct() {\n    ITT_SYNC_CREATE(this, _T(\"tbb::spin_rw_mutex\"), _T(\"\"));\n}\n} // namespace tbb\n"
  },
  {
    "path": "benchmarks/tbb/spin_rw_mutex.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_spin_rw_mutex_H\n#define __TBB_spin_rw_mutex_H\n\n#include \"tbb_stddef.h\"\n#include \"tbb_machine.h\"\n#include \"tbb_profiling.h\"\n#include \"internal/_mutex_padding.h\"\n\nnamespace tbb {\n\n#if __TBB_TSX_AVAILABLE\nnamespace interface8 { namespace internal {\n    class x86_rtm_rw_mutex;\n}}\n#endif\n\nclass spin_rw_mutex_v3;\ntypedef spin_rw_mutex_v3 spin_rw_mutex;\n\n//! Fast, unfair, spinning reader-writer lock with backoff and writer-preference\n/** @ingroup synchronization */\nclass spin_rw_mutex_v3 : internal::mutex_copy_deprecated_and_disabled {\n    //! @cond INTERNAL\n\n    //! Internal acquire write lock.\n    bool __TBB_EXPORTED_METHOD internal_acquire_writer();\n\n    //! Out of line code for releasing a write lock.\n    /** This code has debug checking and instrumentation for Intel(R) Thread Checker and Intel(R) Thread Profiler. */\n    void __TBB_EXPORTED_METHOD internal_release_writer();\n\n    //! Internal acquire read lock.\n    void __TBB_EXPORTED_METHOD internal_acquire_reader();\n\n    //! Internal upgrade reader to become a writer.\n    bool __TBB_EXPORTED_METHOD internal_upgrade();\n\n    //! Out of line code for downgrading a writer to a reader.\n    /** This code has debug checking and instrumentation for Intel(R) Thread Checker and Intel(R) Thread Profiler. */\n    void __TBB_EXPORTED_METHOD internal_downgrade();\n\n    //! Internal release read lock.\n    void __TBB_EXPORTED_METHOD internal_release_reader();\n\n    //! Internal try_acquire write lock.\n    bool __TBB_EXPORTED_METHOD internal_try_acquire_writer();\n\n    //! Internal try_acquire read lock.\n    bool __TBB_EXPORTED_METHOD internal_try_acquire_reader();\n\n    //! @endcond\npublic:\n    //! Construct unacquired mutex.\n    spin_rw_mutex_v3() : state(0) {\n#if TBB_USE_THREADING_TOOLS\n        internal_construct();\n#endif\n    }\n\n#if TBB_USE_ASSERT\n    //! Destructor asserts if the mutex is acquired, i.e. state is zero.\n    ~spin_rw_mutex_v3() {\n        __TBB_ASSERT( !state, \"destruction of an acquired mutex\");\n    };\n#endif /* TBB_USE_ASSERT */\n\n    //! The scoped locking pattern\n    /** It helps to avoid the common problem of forgetting to release lock.\n        It also nicely provides the \"node\" for queuing locks. */\n    class scoped_lock : internal::no_copy {\n#if __TBB_TSX_AVAILABLE\n        friend class tbb::interface8::internal::x86_rtm_rw_mutex;\n        // helper methods for x86_rtm_rw_mutex\n        spin_rw_mutex *internal_get_mutex() const { return mutex; }\n        void internal_set_mutex(spin_rw_mutex* m) { mutex = m; }\n#endif\n    public:\n        //! Construct lock that has not acquired a mutex.\n        /** Equivalent to zero-initialization of *this. */\n        scoped_lock() : mutex(NULL), is_writer(false) {}\n\n        //! Acquire lock on given mutex.\n        scoped_lock( spin_rw_mutex& m, bool write = true ) : mutex(NULL) {\n            acquire(m, write);\n        }\n\n        //! Release lock (if lock is held).\n        ~scoped_lock() {\n            if( mutex ) release();\n        }\n\n        //! Acquire lock on given mutex.\n        void acquire( spin_rw_mutex& m, bool write = true ) {\n            __TBB_ASSERT( !mutex, \"holding mutex already\" );\n            is_writer = write;\n            mutex = &m;\n            if( write ) mutex->internal_acquire_writer();\n            else        mutex->internal_acquire_reader();\n        }\n\n        //! Upgrade reader to become a writer.\n        /** Returns whether the upgrade happened without releasing and re-acquiring the lock */\n        bool upgrade_to_writer() {\n            __TBB_ASSERT( mutex, \"lock is not acquired\" );\n            __TBB_ASSERT( !is_writer, \"not a reader\" );\n            is_writer = true;\n            return mutex->internal_upgrade();\n        }\n\n        //! Release lock.\n        void release() {\n            __TBB_ASSERT( mutex, \"lock is not acquired\" );\n            spin_rw_mutex *m = mutex; \n            mutex = NULL;\n#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT\n            if( is_writer ) m->internal_release_writer();\n            else            m->internal_release_reader();\n#else\n            if( is_writer ) __TBB_AtomicAND( &m->state, READERS ); \n            else            __TBB_FetchAndAddWrelease( &m->state, -(intptr_t)ONE_READER);\n#endif /* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */\n        }\n\n        //! Downgrade writer to become a reader.\n        bool downgrade_to_reader() {\n            __TBB_ASSERT( mutex, \"lock is not acquired\" );\n            __TBB_ASSERT( is_writer, \"not a writer\" );\n#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT\n            mutex->internal_downgrade();\n#else\n            __TBB_FetchAndAddW( &mutex->state, ((intptr_t)ONE_READER-WRITER));\n#endif /* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */\n            is_writer = false;\n            return true;\n        }\n\n        //! Try acquire lock on given mutex.\n        bool try_acquire( spin_rw_mutex& m, bool write = true ) {\n            __TBB_ASSERT( !mutex, \"holding mutex already\" );\n            bool result;\n            is_writer = write; \n            result = write? m.internal_try_acquire_writer()\n                          : m.internal_try_acquire_reader();\n            if( result ) \n                mutex = &m;\n            return result;\n        }\n\n    protected:\n\n        //! The pointer to the current mutex that is held, or NULL if no mutex is held.\n        spin_rw_mutex* mutex;\n\n        //! If mutex!=NULL, then is_writer is true if holding a writer lock, false if holding a reader lock.\n        /** Not defined if not holding a lock. */\n        bool is_writer;\n    };\n\n    // Mutex traits\n    static const bool is_rw_mutex = true;\n    static const bool is_recursive_mutex = false;\n    static const bool is_fair_mutex = false;\n\n    // ISO C++0x compatibility methods\n\n    //! Acquire writer lock\n    void lock() {internal_acquire_writer();}\n\n    //! Try acquiring writer lock (non-blocking)\n    /** Return true if lock acquired; false otherwise. */\n    bool try_lock() {return internal_try_acquire_writer();}\n\n    //! Release lock\n    void unlock() {\n#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT\n        if( state&WRITER ) internal_release_writer();\n        else               internal_release_reader();\n#else\n        if( state&WRITER ) __TBB_AtomicAND( &state, READERS ); \n        else               __TBB_FetchAndAddWrelease( &state, -(intptr_t)ONE_READER);\n#endif /* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */\n    }\n\n    // Methods for reader locks that resemble ISO C++0x compatibility methods.\n\n    //! Acquire reader lock\n    void lock_read() {internal_acquire_reader();}\n\n    //! Try acquiring reader lock (non-blocking)\n    /** Return true if reader lock acquired; false otherwise. */\n    bool try_lock_read() {return internal_try_acquire_reader();}\n\nprotected:\n    typedef intptr_t state_t;\n    static const state_t WRITER = 1;\n    static const state_t WRITER_PENDING = 2;\n    static const state_t READERS = ~(WRITER | WRITER_PENDING);\n    static const state_t ONE_READER = 4;\n    static const state_t BUSY = WRITER | READERS;\n    //! State of lock\n    /** Bit 0 = writer is holding lock\n        Bit 1 = request by a writer to acquire lock (hint to readers to wait)\n        Bit 2..N = number of readers holding lock */\n    state_t state;\n\nprivate:\n    void __TBB_EXPORTED_METHOD internal_construct();\n};\n\n__TBB_DEFINE_PROFILING_SET_NAME(spin_rw_mutex)\n\n} // namespace tbb\n\n#if __TBB_TSX_AVAILABLE\n#include \"internal/_x86_rtm_rw_mutex_impl.h\"\n#endif\n\nnamespace tbb {\nnamespace interface8 {\n//! A cross-platform spin reader/writer mutex with speculative lock acquisition.\n/** On platforms with proper HW support, this lock may speculatively execute\n    its critical sections, using HW mechanisms to detect real data races and\n    ensure atomicity of the critical sections. In particular, it uses\n    Intel(R) Transactional Synchronization Extensions (Intel(R) TSX).\n    Without such HW support, it behaves like a spin_rw_mutex.\n    It should be used for locking short critical sections where the lock is \n    contended but the data it protects are not.\n    @ingroup synchronization */\n#if __TBB_TSX_AVAILABLE\ntypedef interface7::internal::padded_mutex<tbb::interface8::internal::x86_rtm_rw_mutex,true> speculative_spin_rw_mutex;\n#else\ntypedef interface7::internal::padded_mutex<tbb::spin_rw_mutex,true> speculative_spin_rw_mutex;\n#endif\n}  // namespace interface8\n\nusing interface8::speculative_spin_rw_mutex;\n__TBB_DEFINE_PROFILING_SET_NAME(speculative_spin_rw_mutex)\n} // namespace tbb\n#endif /* __TBB_spin_rw_mutex_H */\n"
  },
  {
    "path": "benchmarks/tbb/task.cpp",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n// Do not include task.h directly. Use scheduler_common.h instead\n#include \"scheduler_common.h\"\n#include \"governor.h\"\n#include \"scheduler.h\"\n#include \"itt_notify.h\"\n\n#include \"tbb/cache_aligned_allocator.h\"\n#include \"tbb/partitioner.h\"\n\n#include <new>\n\nnamespace tbb {\n\nusing namespace std;\n\nnamespace internal {\n\n//------------------------------------------------------------------------\n// Methods of allocate_root_proxy\n//------------------------------------------------------------------------\ntask& allocate_root_proxy::allocate( size_t size ) {\n    internal::generic_scheduler* v = governor::local_scheduler();\n    __TBB_ASSERT( v, \"thread did not activate a task_scheduler_init object?\" );\n#if __TBB_TASK_GROUP_CONTEXT\n    task_prefix& p = v->my_innermost_running_task->prefix();\n\n    ITT_STACK_CREATE(p.context->itt_caller);\n#endif\n    // New root task becomes part of the currently running task's cancellation context\n    return v->allocate_task( size, __TBB_CONTEXT_ARG(NULL, p.context) );\n}\n\nvoid allocate_root_proxy::free( task& task ) {\n    internal::generic_scheduler* v = governor::local_scheduler();\n    __TBB_ASSERT( v, \"thread does not have initialized task_scheduler_init object?\" );\n#if __TBB_TASK_GROUP_CONTEXT\n    // No need to do anything here as long as there is no context -> task connection\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n    v->free_task<local_task>( task );\n}\n\n#if __TBB_TASK_GROUP_CONTEXT\n//------------------------------------------------------------------------\n// Methods of allocate_root_with_context_proxy\n//------------------------------------------------------------------------\ntask& allocate_root_with_context_proxy::allocate( size_t size ) const {\n    internal::generic_scheduler* s = governor::local_scheduler();\n    __TBB_ASSERT( s, \"Scheduler auto-initialization failed?\" );\n    task& t = s->allocate_task( size, NULL, &my_context );\n    // Supported usage model prohibits concurrent initial binding. Thus we do not\n    // need interlocked operations or fences to manipulate with my_context.my_kind\n    if ( __TBB_load_relaxed(my_context.my_kind) == task_group_context::binding_required ) {\n        // If we are in the outermost task dispatch loop of a master thread, then\n        // there is nothing to bind this context to, and we skip the binding part\n        // treating the context as isolated.\n        if ( s->my_innermost_running_task == s->my_dummy_task )\n            __TBB_store_relaxed(my_context.my_kind, task_group_context::isolated);\n        else\n            my_context.bind_to( s );\n    }\n#if __TBB_FP_CONTEXT\n    if ( __TBB_load_relaxed(my_context.my_kind) == task_group_context::isolated &&\n            !(my_context.my_version_and_traits & task_group_context::fp_settings) )\n        my_context.copy_fp_settings( *s->my_arena->my_default_ctx );\n#endif\n    ITT_STACK_CREATE(my_context.itt_caller);\n    return t;\n}\n\nvoid allocate_root_with_context_proxy::free( task& task ) const {\n    internal::generic_scheduler* v = governor::local_scheduler();\n    __TBB_ASSERT( v, \"thread does not have initialized task_scheduler_init object?\" );\n    // No need to do anything here as long as unbinding is performed by context destructor only.\n    v->free_task<local_task>( task );\n}\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n//------------------------------------------------------------------------\n// Methods of allocate_continuation_proxy\n//------------------------------------------------------------------------\ntask& allocate_continuation_proxy::allocate( size_t size ) const {\n    task& t = *((task*)this);\n    assert_task_valid(t);\n    generic_scheduler* s = governor::local_scheduler();\n    task* parent = t.parent();\n    t.prefix().parent = NULL;\n    return s->allocate_task( size, __TBB_CONTEXT_ARG(parent, t.prefix().context) );\n}\n\nvoid allocate_continuation_proxy::free( task& mytask ) const {\n    // Restore the parent as it was before the corresponding allocate was called.\n    ((task*)this)->prefix().parent = mytask.parent();\n    governor::local_scheduler()->free_task<local_task>(mytask);\n}\n\n//------------------------------------------------------------------------\n// Methods of allocate_child_proxy\n//------------------------------------------------------------------------\ntask& allocate_child_proxy::allocate( size_t size ) const {\n    task& t = *((task*)this);\n    assert_task_valid(t);\n    generic_scheduler* s = governor::local_scheduler();\n    return s->allocate_task( size, __TBB_CONTEXT_ARG(&t, t.prefix().context) );\n}\n\nvoid allocate_child_proxy::free( task& mytask ) const {\n    governor::local_scheduler()->free_task<local_task>(mytask);\n}\n\n//------------------------------------------------------------------------\n// Methods of allocate_additional_child_of_proxy\n//------------------------------------------------------------------------\ntask& allocate_additional_child_of_proxy::allocate( size_t size ) const {\n    parent.increment_ref_count();\n    generic_scheduler* s = governor::local_scheduler();\n    return s->allocate_task( size, __TBB_CONTEXT_ARG(&parent, parent.prefix().context) );\n}\n\nvoid allocate_additional_child_of_proxy::free( task& task ) const {\n    // Undo the increment.  We do not check the result of the fetch-and-decrement.\n    // We could consider be spawning the task if the fetch-and-decrement returns 1.\n    // But we do not know that was the programmer's intention.\n    // Furthermore, if it was the programmer's intention, the program has a fundamental\n    // race condition (that we warn about in Reference manual), because the\n    // reference count might have become zero before the corresponding call to\n    // allocate_additional_child_of_proxy::allocate.\n    parent.internal_decrement_ref_count();\n    governor::local_scheduler()->free_task<local_task>(task);\n}\n\n//------------------------------------------------------------------------\n// Support for auto_partitioner\n//------------------------------------------------------------------------\nsize_t get_initial_auto_partitioner_divisor() {\n    const size_t X_FACTOR = 4;\n    return X_FACTOR * (1+governor::local_scheduler()->number_of_workers_in_my_arena());\n}\n\n//------------------------------------------------------------------------\n// Methods of affinity_partitioner_base_v3\n//------------------------------------------------------------------------\nvoid affinity_partitioner_base_v3::resize( unsigned factor ) {\n    // Check factor to avoid asking for number of workers while there might be no arena.\n    size_t new_size = factor ? factor*(1+governor::local_scheduler()->number_of_workers_in_my_arena()) : 0;\n    if( new_size!=my_size ) {\n        if( my_array ) {\n            NFS_Free( my_array );\n            // Following two assignments must be done here for sake of exception safety.\n            my_array = NULL;\n            my_size = 0;\n        }\n        if( new_size ) {\n            my_array = static_cast<affinity_id*>(NFS_Allocate(new_size,sizeof(affinity_id), NULL ));\n            memset( my_array, 0, sizeof(affinity_id)*new_size );\n            my_size = new_size;\n        }\n    }\n}\n\n} // namespace internal\n\nusing namespace tbb::internal;\n\n//------------------------------------------------------------------------\n// task\n//------------------------------------------------------------------------\n\nvoid task::internal_set_ref_count( int count ) {\n    __TBB_ASSERT( count>=0, \"count must not be negative\" );\n    task_prefix &p = prefix();\n    __TBB_ASSERT(p.ref_count==1 && p.state==allocated && self().parent()==this\n        || !(p.extra_state & es_ref_count_active), \"ref_count race detected\");\n    ITT_NOTIFY(sync_releasing, &p.ref_count);\n    p.ref_count = count;\n}\n\ninternal::reference_count task::internal_decrement_ref_count() {\n    ITT_NOTIFY( sync_releasing, &prefix().ref_count );\n    internal::reference_count k = __TBB_FetchAndDecrementWrelease( &prefix().ref_count );\n    __TBB_ASSERT( k>=1, \"task's reference count underflowed\" );\n    if( k==1 )\n        ITT_NOTIFY( sync_acquired, &prefix().ref_count );\n    return k-1;\n}\n\ntask& task::self() {\n    generic_scheduler *v = governor::local_scheduler();\n    v->assert_task_pool_valid();\n    __TBB_ASSERT( v->my_innermost_running_task, NULL );\n    return *v->my_innermost_running_task;\n}\n\nbool task::is_owned_by_current_thread() const {\n    return true;\n}\n\nvoid interface5::internal::task_base::destroy( task& victim ) {\n    // 1 may be a guard reference for wait_for_all, which was not reset because\n    // of concurrent_wait mode or because prepared root task was not actually used\n    // for spawning tasks (as in structured_task_group).\n    __TBB_ASSERT( (intptr_t)victim.prefix().ref_count <= 1, \"Task being destroyed must not have children\" );\n    __TBB_ASSERT( victim.state()==task::allocated, \"illegal state for victim task\" );\n    task* parent = victim.parent();\n    victim.~task();\n    if( parent ) {\n        __TBB_ASSERT( parent->state()!=task::freed && parent->state()!=task::ready,\n                      \"attempt to destroy child of running or corrupted parent?\" );\n        // 'reexecute' and 'executing' are also signs of a race condition, since most tasks\n        // set their ref_count upon entry but \"es_ref_count_active\" should detect this\n        parent->internal_decrement_ref_count();\n        // Even if the last reference to *parent is removed, it should not be spawned (documented behavior).\n    }\n    governor::local_scheduler()->free_task<no_cache>( victim );\n}\n\nvoid task::spawn_and_wait_for_all( task_list& list ) {\n    generic_scheduler* s = governor::local_scheduler();\n    task* t = list.first;\n    if( t ) {\n        if( &t->prefix().next!=list.next_ptr )\n            s->local_spawn( *t->prefix().next, *list.next_ptr );\n        list.clear();\n    }\n    s->local_wait_for_all( *this, t );\n}\n\n/** Defined out of line so that compiler does not replicate task's vtable.\n    It's pointless to define it inline anyway, because all call sites to it are virtual calls\n    that the compiler is unlikely to optimize. */\nvoid task::note_affinity( affinity_id ) {\n}\n\n#if __TBB_TASK_GROUP_CONTEXT\nvoid task::change_group ( task_group_context& ctx ) {\n    prefix().context = &ctx;\n    internal::generic_scheduler* s = governor::local_scheduler();\n    if ( __TBB_load_relaxed(ctx.my_kind) == task_group_context::binding_required ) {\n        // If we are in the outermost task dispatch loop of a master thread, then\n        // there is nothing to bind this context to, and we skip the binding part\n        // treating the context as isolated.\n        if ( s->my_innermost_running_task == s->my_dummy_task )\n            __TBB_store_relaxed(ctx.my_kind, task_group_context::isolated);\n        else\n            ctx.bind_to( s );\n    }\n#if __TBB_FP_CONTEXT\n    if ( __TBB_load_relaxed(ctx.my_kind) == task_group_context::isolated &&\n            !(ctx.my_version_and_traits & task_group_context::fp_settings) )\n        ctx.copy_fp_settings( *s->my_arena->my_default_ctx );\n#endif\n    ITT_STACK_CREATE(ctx.itt_caller);\n}\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n} // namespace tbb\n\n"
  },
  {
    "path": "benchmarks/tbb/task.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_task_H\n#define __TBB_task_H\n\n#include \"tbb_stddef.h\"\n#include \"tbb_machine.h\"\n#include <climits>\n\ntypedef struct ___itt_caller *__itt_caller;\n\nnamespace tbb {\n\nclass task;\nclass task_list;\nclass task_group_context;\n\n// MSVC does not allow taking the address of a member that was defined\n// privately in task_base and made public in class task via a using declaration.\n#if _MSC_VER || (__GNUC__==3 && __GNUC_MINOR__<3)\n#define __TBB_TASK_BASE_ACCESS public\n#else\n#define __TBB_TASK_BASE_ACCESS private\n#endif\n\nnamespace internal { //< @cond INTERNAL\n\n    class allocate_additional_child_of_proxy: no_assign {\n        //! No longer used, but retained for binary layout compatibility.  Always NULL.\n        task* self;\n        task& parent;\n    public:\n        explicit allocate_additional_child_of_proxy( task& parent_ ) : self(NULL), parent(parent_) {}\n        task& __TBB_EXPORTED_METHOD allocate( size_t size ) const;\n        void __TBB_EXPORTED_METHOD free( task& ) const;\n    };\n\n    struct cpu_ctl_env_space { int space[sizeof(internal::uint64_t)/sizeof(int)]; };\n} //< namespace internal @endcond\n\nnamespace interface5 {\n    namespace internal {\n        //! Base class for methods that became static in TBB 3.0.\n        /** TBB's evolution caused the \"this\" argument for several methods to become obsolete.\n            However, for backwards binary compatibility, the new methods need distinct names,\n            otherwise the One Definition Rule would be broken.  Hence the new methods are\n            defined in this private base class, and then exposed in class task via\n            using declarations. */\n        class task_base: tbb::internal::no_copy {\n        __TBB_TASK_BASE_ACCESS:\n            friend class tbb::task;\n\n            //! Schedule task for execution when a worker becomes available.\n            static void spawn( task& t );\n\n            //! Spawn multiple tasks and clear list.\n            static void spawn( task_list& list );\n\n            //! Like allocate_child, except that task's parent becomes \"t\", not this.\n            /** Typically used in conjunction with schedule_to_reexecute to implement while loops.\n               Atomically increments the reference count of t.parent() */\n            static tbb::internal::allocate_additional_child_of_proxy allocate_additional_child_of( task& t ) {\n                return tbb::internal::allocate_additional_child_of_proxy(t);\n            }\n\n            //! Destroy a task.\n            /** Usually, calling this method is unnecessary, because a task is\n                implicitly deleted after its execute() method runs.  However,\n                sometimes a task needs to be explicitly deallocated, such as\n                when a root task is used as the parent in spawn_and_wait_for_all. */\n            static void __TBB_EXPORTED_FUNC destroy( task& victim );\n        };\n    } // internal\n} // interface5\n\n//! @cond INTERNAL\nnamespace internal {\n\n    class scheduler: no_copy {\n    public:\n        //! For internal use only\n        virtual void spawn( task& first, task*& next ) = 0;\n\n        //! For internal use only\n        virtual void wait_for_all( task& parent, task* child ) = 0;\n\n        //! For internal use only\n        virtual void spawn_root_and_wait( task& first, task*& next ) = 0;\n\n        //! Pure virtual destructor;\n        //  Have to have it just to shut up overzealous compilation warnings\n        virtual ~scheduler() = 0;\n\n        //! For internal use only\n        virtual void enqueue( task& t, void* reserved ) = 0;\n    };\n\n    //! A reference count\n    /** Should always be non-negative.  A signed type is used so that underflow can be detected. */\n    typedef intptr_t reference_count;\n\n    //! An id as used for specifying affinity.\n    typedef unsigned short affinity_id;\n\n#if __TBB_TASK_GROUP_CONTEXT\n    class generic_scheduler;\n\n    struct context_list_node_t {\n        context_list_node_t *my_prev,\n                            *my_next;\n    };\n\n    class allocate_root_with_context_proxy: no_assign {\n        task_group_context& my_context;\n    public:\n        allocate_root_with_context_proxy ( task_group_context& ctx ) : my_context(ctx) {}\n        task& __TBB_EXPORTED_METHOD allocate( size_t size ) const;\n        void __TBB_EXPORTED_METHOD free( task& ) const;\n    };\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n    class allocate_root_proxy: no_assign {\n    public:\n        static task& __TBB_EXPORTED_FUNC allocate( size_t size );\n        static void __TBB_EXPORTED_FUNC free( task& );\n    };\n\n    class allocate_continuation_proxy: no_assign {\n    public:\n        task& __TBB_EXPORTED_METHOD allocate( size_t size ) const;\n        void __TBB_EXPORTED_METHOD free( task& ) const;\n    };\n\n    class allocate_child_proxy: no_assign {\n    public:\n        task& __TBB_EXPORTED_METHOD allocate( size_t size ) const;\n        void __TBB_EXPORTED_METHOD free( task& ) const;\n    };\n\n    //! Memory prefix to a task object.\n    /** This class is internal to the library.\n        Do not reference it directly, except within the library itself.\n        Fields are ordered in way that preserves backwards compatibility and yields\n        good packing on typical 32-bit and 64-bit platforms.\n\n        In case task prefix size exceeds 32 or 64 bytes on IA32 and Intel64\n        architectures correspondingly, consider dynamic setting of task_alignment\n        and task_prefix_reservation_size based on the maximal operand size supported\n        by the current CPU.\n\n        @ingroup task_scheduling */\n    class task_prefix {\n    private:\n        friend class tbb::task;\n        friend class tbb::interface5::internal::task_base;\n        friend class tbb::task_list;\n        friend class internal::scheduler;\n        friend class internal::allocate_root_proxy;\n        friend class internal::allocate_child_proxy;\n        friend class internal::allocate_continuation_proxy;\n        friend class internal::allocate_additional_child_of_proxy;\n\n#if __TBB_TASK_GROUP_CONTEXT\n        //! Shared context that is used to communicate asynchronous state changes\n        /** Currently it is used to broadcast cancellation requests generated both\n            by users and as the result of unhandled exceptions in the task::execute()\n            methods. */\n        task_group_context  *context;\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n        //! The scheduler that allocated the task, or NULL if the task is big.\n        /** Small tasks are pooled by the scheduler that allocated the task.\n            If a scheduler needs to free a small task allocated by another scheduler,\n            it returns the task to that other scheduler.  This policy avoids\n            memory space blowup issues for memory allocators that allocate from\n            thread-specific pools. */\n        scheduler* origin;\n\n#if __TBB_TASK_PRIORITY\n        union {\n#endif /* __TBB_TASK_PRIORITY */\n        //! Obsolete. The scheduler that owns the task.\n        /** Retained only for the sake of backward binary compatibility.\n            Still used by inline methods in the task.h header. **/\n        scheduler* owner;\n\n#if __TBB_TASK_PRIORITY\n        //! Pointer to the next offloaded lower priority task.\n        /** Used to maintain a list of offloaded tasks inside the scheduler. **/\n        task* next_offloaded;\n        };\n#endif /* __TBB_TASK_PRIORITY */\n\n        //! The task whose reference count includes me.\n        /** In the \"blocking style\" of programming, this field points to the parent task.\n            In the \"continuation-passing style\" of programming, this field points to the\n            continuation of the parent. */\n        tbb::task* parent;\n\n        //! Reference count used for synchronization.\n        /** In the \"continuation-passing style\" of programming, this field is\n            the difference of the number of allocated children minus the\n            number of children that have completed.\n            In the \"blocking style\" of programming, this field is one more than the difference. */\n        __TBB_atomic reference_count ref_count;\n\n        //! Obsolete. Used to be scheduling depth before TBB 2.2\n        /** Retained only for the sake of backward binary compatibility.\n            Not used by TBB anymore. **/\n        int depth;\n\n        //! A task::state_type, stored as a byte for compactness.\n        /** This state is exposed to users via method task::state(). */\n        unsigned char state;\n\n        //! Miscellaneous state that is not directly visible to users, stored as a byte for compactness.\n        /** 0x0 -> version 1.0 task\n            0x1 -> version >=2.1 task\n            0x10 -> task was enqueued\n            0x20 -> task_proxy\n            0x40 -> task has live ref_count\n            0x80 -> a stolen task */\n        unsigned char extra_state;\n\n        affinity_id affinity;\n\n        //! \"next\" field for list of task\n        tbb::task* next;\n\n        //! The task corresponding to this task_prefix.\n        tbb::task& task() {return *reinterpret_cast<tbb::task*>(this+1);}\n    };\n\n} // namespace internal\n//! @endcond\n\n#if __TBB_TASK_GROUP_CONTEXT\n\n#if __TBB_TASK_PRIORITY\nnamespace internal {\n    static const int priority_stride_v4 = INT_MAX / 4;\n}\n\nenum priority_t {\n    priority_normal = internal::priority_stride_v4 * 2,\n    priority_low = priority_normal - internal::priority_stride_v4,\n    priority_high = priority_normal + internal::priority_stride_v4\n};\n\n#endif /* __TBB_TASK_PRIORITY */\n\n#if TBB_USE_CAPTURED_EXCEPTION\n    class tbb_exception;\n#else\n    namespace internal {\n        class tbb_exception_ptr;\n    }\n#endif /* !TBB_USE_CAPTURED_EXCEPTION */\n\nclass task_scheduler_init;\nnamespace interface7 { class task_arena; }\n\n//! Used to form groups of tasks\n/** @ingroup task_scheduling\n    The context services explicit cancellation requests from user code, and unhandled\n    exceptions intercepted during tasks execution. Intercepting an exception results\n    in generating internal cancellation requests (which is processed in exactly the\n    same way as external ones).\n\n    The context is associated with one or more root tasks and defines the cancellation\n    group that includes all the descendants of the corresponding root task(s). Association\n    is established when a context object is passed as an argument to the task::allocate_root()\n    method. See task_group_context::task_group_context for more details.\n\n    The context can be bound to another one, and other contexts can be bound to it,\n    forming a tree-like structure: parent -> this -> children. Arrows here designate\n    cancellation propagation direction. If a task in a cancellation group is cancelled\n    all the other tasks in this group and groups bound to it (as children) get cancelled too.\n\n    IMPLEMENTATION NOTE:\n    When adding new members to task_group_context or changing types of existing ones,\n    update the size of both padding buffers (_leading_padding and _trailing_padding)\n    appropriately. See also VERSIONING NOTE at the constructor definition below. **/\nclass task_group_context : internal::no_copy {\nprivate:\n    friend class internal::generic_scheduler;\n    friend class task_scheduler_init;\n    friend class interface7::task_arena;\n\n#if TBB_USE_CAPTURED_EXCEPTION\n    typedef tbb_exception exception_container_type;\n#else\n    typedef internal::tbb_exception_ptr exception_container_type;\n#endif\n\n    enum version_traits_word_layout {\n        traits_offset = 16,\n        version_mask = 0xFFFF,\n        traits_mask = 0xFFFFul << traits_offset\n    };\n\npublic:\n    enum kind_type {\n        isolated,\n        bound\n    };\n\n    enum traits_type {\n        exact_exception = 0x0001ul << traits_offset,\n#if __TBB_FP_CONTEXT\n        fp_settings     = 0x0002ul << traits_offset,\n#endif\n        concurrent_wait = 0x0004ul << traits_offset,\n#if TBB_USE_CAPTURED_EXCEPTION\n        default_traits = 0\n#else\n        default_traits = exact_exception\n#endif /* !TBB_USE_CAPTURED_EXCEPTION */\n    };\n\nprivate:\n    enum state {\n        may_have_children = 1,\n        // the following enumerations must be the last, new 2^x values must go above\n        next_state_value, low_unused_state_bit = (next_state_value-1)*2\n    };\n\n    union {\n        //! Flavor of this context: bound or isolated.\n        // TODO: describe asynchronous use, and whether any memory semantics are needed\n        __TBB_atomic kind_type my_kind;\n        uintptr_t _my_kind_aligner;\n    };\n\n    //! Pointer to the context of the parent cancellation group. NULL for isolated contexts.\n    task_group_context *my_parent;\n\n    //! Used to form the thread specific list of contexts without additional memory allocation.\n    /** A context is included into the list of the current thread when its binding to\n        its parent happens. Any context can be present in the list of one thread only. **/\n    internal::context_list_node_t my_node;\n\n    //! Used to set and maintain stack stitching point for Intel Performance Tools.\n    __itt_caller itt_caller;\n\n    //! Leading padding protecting accesses to frequently used members from false sharing.\n    /** Read accesses to the field my_cancellation_requested are on the hot path inside\n        the scheduler. This padding ensures that this field never shares the same cache\n        line with a local variable that is frequently written to. **/\n    char _leading_padding[internal::NFS_MaxLineSize\n                          - 2 * sizeof(uintptr_t)- sizeof(void*) - sizeof(internal::context_list_node_t)\n                          - sizeof(__itt_caller)\n#if __TBB_FP_CONTEXT\n                          - sizeof(internal::cpu_ctl_env_space)\n#endif\n                         ];\n\n#if __TBB_FP_CONTEXT\n    //! Space for platform-specific FPU settings.\n    /** Must only be accessed inside TBB binaries, and never directly in user\n        code or inline methods. */\n    internal::cpu_ctl_env_space my_cpu_ctl_env;\n#endif\n\n    //! Specifies whether cancellation was requested for this task group.\n    uintptr_t my_cancellation_requested;\n\n    //! Version for run-time checks and behavioral traits of the context.\n    /** Version occupies low 16 bits, and traits (zero or more ORed enumerators\n        from the traits_type enumerations) take the next 16 bits.\n        Original (zeroth) version of the context did not support any traits. **/\n    uintptr_t my_version_and_traits;\n\n    //! Pointer to the container storing exception being propagated across this task group.\n    exception_container_type *my_exception;\n\n    //! Scheduler instance that registered this context in its thread specific list.\n    internal::generic_scheduler *my_owner;\n\n    //! Internal state (combination of state flags, currently only may_have_children).\n    uintptr_t my_state;\n\n#if __TBB_TASK_PRIORITY\n    //! Priority level of the task group (in normalized representation)\n    intptr_t my_priority;\n#endif /* __TBB_TASK_PRIORITY */\n\n    //! Trailing padding protecting accesses to frequently used members from false sharing\n    /** \\sa _leading_padding **/\n    char _trailing_padding[internal::NFS_MaxLineSize - 2 * sizeof(uintptr_t) - 2 * sizeof(void*)\n#if __TBB_TASK_PRIORITY\n                            - sizeof(intptr_t)\n#endif /* __TBB_TASK_PRIORITY */\n                          ];\n\npublic:\n    //! Default & binding constructor.\n    /** By default a bound context is created. That is this context will be bound\n        (as child) to the context of the task calling task::allocate_root(this_context)\n        method. Cancellation requests passed to the parent context are propagated\n        to all the contexts bound to it. Similarly priority change is propagated\n        from the parent context to its children.\n\n        If task_group_context::isolated is used as the argument, then the tasks associated\n        with this context will never be affected by events in any other context.\n\n        Creating isolated contexts involve much less overhead, but they have limited\n        utility. Normally when an exception occurs in an algorithm that has nested\n        ones running, it is desirably to have all the nested algorithms cancelled\n        as well. Such a behavior requires nested algorithms to use bound contexts.\n\n        There is one good place where using isolated algorithms is beneficial. It is\n        a master thread. That is if a particular algorithm is invoked directly from\n        the master thread (not from a TBB task), supplying it with explicitly\n        created isolated context will result in a faster algorithm startup.\n\n        VERSIONING NOTE:\n        Implementation(s) of task_group_context constructor(s) cannot be made\n        entirely out-of-line because the run-time version must be set by the user\n        code. This will become critically important for binary compatibility, if\n        we ever have to change the size of the context object.\n\n        Boosting the runtime version will also be necessary if new data fields are\n        introduced in the currently unused padding areas and these fields are updated\n        by inline methods. **/\n    task_group_context ( kind_type relation_with_parent = bound,\n                         uintptr_t traits = default_traits )\n        : my_kind(relation_with_parent)\n        , my_version_and_traits(2 | traits)\n    {\n        init();\n    }\n\n    // Do not introduce standalone unbind method since it will break state propagation assumptions\n    __TBB_EXPORTED_METHOD ~task_group_context ();\n\n    //! Forcefully reinitializes the context after the task tree it was associated with is completed.\n    /** Because the method assumes that all the tasks that used to be associated with\n        this context have already finished, calling it while the context is still\n        in use somewhere in the task hierarchy leads to undefined behavior.\n\n        IMPORTANT: This method is not thread safe!\n\n        The method does not change the context's parent if it is set. **/\n    void __TBB_EXPORTED_METHOD reset ();\n\n    //! Initiates cancellation of all tasks in this cancellation group and its subordinate groups.\n    /** \\return false if cancellation has already been requested, true otherwise.\n\n        Note that canceling never fails. When false is returned, it just means that\n        another thread (or this one) has already sent cancellation request to this\n        context or to one of its ancestors (if this context is bound). It is guaranteed\n        that when this method is concurrently called on the same not yet cancelled\n        context, true will be returned by one and only one invocation. **/\n    bool __TBB_EXPORTED_METHOD cancel_group_execution ();\n\n    //! Returns true if the context received cancellation request.\n    bool __TBB_EXPORTED_METHOD is_group_execution_cancelled () const;\n\n    //! Records the pending exception, and cancels the task group.\n    /** May be called only from inside a catch-block. If the context is already\n        cancelled, does nothing.\n        The method brings the task group associated with this context exactly into\n        the state it would be in, if one of its tasks threw the currently pending\n        exception during its execution. In other words, it emulates the actions\n        of the scheduler's dispatch loop exception handler. **/\n    void __TBB_EXPORTED_METHOD register_pending_exception ();\n\n#if __TBB_FP_CONTEXT\n    //! Captures the current FPU control settings to the context.\n    /** Because the method assumes that all the tasks that used to be associated with\n        this context have already finished, calling it while the context is still\n        in use somewhere in the task hierarchy leads to undefined behavior.\n\n        IMPORTANT: This method is not thread safe!\n\n        The method does not change the FPU control settings of the context's parent. **/\n    void __TBB_EXPORTED_METHOD capture_fp_settings ();\n#endif\n\n#if __TBB_TASK_PRIORITY\n    //! Changes priority of the task group\n    void set_priority ( priority_t );\n\n    //! Retrieves current priority of the current task group\n    priority_t priority () const;\n#endif /* __TBB_TASK_PRIORITY */\n\nprotected:\n    //! Out-of-line part of the constructor.\n    /** Singled out to ensure backward binary compatibility of the future versions. **/\n    void __TBB_EXPORTED_METHOD init ();\n\nprivate:\n    friend class task;\n    friend class internal::allocate_root_with_context_proxy;\n\n    static const kind_type binding_required = bound;\n    static const kind_type binding_completed = kind_type(bound+1);\n    static const kind_type detached = kind_type(binding_completed+1);\n    static const kind_type dying = kind_type(detached+1);\n\n    //! Propagates any state change detected to *this, and as an optimisation possibly also upward along the heritage line.\n    template <typename T>\n    void propagate_task_group_state ( T task_group_context::*mptr_state, task_group_context& src, T new_state );\n\n    //! Registers this context with the local scheduler and binds it to its parent context\n    void bind_to ( internal::generic_scheduler *local_sched );\n\n    //! Registers this context with the local scheduler\n    void register_with ( internal::generic_scheduler *local_sched );\n\n#if __TBB_FP_CONTEXT\n    //! Copies FPU control setting from another context\n    // TODO: Consider adding #else stub in order to omit #if sections in other code\n    void copy_fp_settings( const task_group_context &src );\n#endif /* __TBB_FP_CONTEXT */\n}; // class task_group_context\n\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n//! Base class for user-defined tasks.\n/** @ingroup task_scheduling */\nclass task: __TBB_TASK_BASE_ACCESS interface5::internal::task_base {\n\n    //! Set reference count\n    void __TBB_EXPORTED_METHOD internal_set_ref_count( int count );\n\n    //! Decrement reference count and return its new value.\n    internal::reference_count __TBB_EXPORTED_METHOD internal_decrement_ref_count();\n\nprotected:\n    //! Default constructor.\n    task() {prefix().extra_state=1;}\n\npublic:\n    //! Destructor.\n    virtual ~task() {}\n\n    //! Should be overridden by derived classes.\n    virtual task* execute() = 0;\n\n    //! Enumeration of task states that the scheduler considers.\n    enum state_type {\n        //! task is running, and will be destroyed after method execute() completes.\n        executing,\n        //! task to be rescheduled.\n        reexecute,\n        //! task is in ready pool, or is going to be put there, or was just taken off.\n        ready,\n        //! task object is freshly allocated or recycled.\n        allocated,\n        //! task object is on free list, or is going to be put there, or was just taken off.\n        freed,\n        //! task to be recycled as continuation\n        recycle\n#if __TBB_RECYCLE_TO_ENQUEUE\n        //! task to be scheduled for starvation-resistant execution\n        ,to_enqueue\n#endif\n    };\n\n    //------------------------------------------------------------------------\n    // Allocating tasks\n    //------------------------------------------------------------------------\n\n    //! Returns proxy for overloaded new that allocates a root task.\n    static internal::allocate_root_proxy allocate_root() {\n        return internal::allocate_root_proxy();\n    }\n\n#if __TBB_TASK_GROUP_CONTEXT\n    //! Returns proxy for overloaded new that allocates a root task associated with user supplied context.\n    static internal::allocate_root_with_context_proxy allocate_root( task_group_context& ctx ) {\n        return internal::allocate_root_with_context_proxy(ctx);\n    }\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n    //! Returns proxy for overloaded new that allocates a continuation task of *this.\n    /** The continuation's parent becomes the parent of *this. */\n    internal::allocate_continuation_proxy& allocate_continuation() {\n        return *reinterpret_cast<internal::allocate_continuation_proxy*>(this);\n    }\n\n    //! Returns proxy for overloaded new that allocates a child task of *this.\n    internal::allocate_child_proxy& allocate_child() {\n        return *reinterpret_cast<internal::allocate_child_proxy*>(this);\n    }\n\n    //! Define recommended static form via import from base class.\n    using task_base::allocate_additional_child_of;\n\n#if __TBB_DEPRECATED_TASK_INTERFACE\n    //! Destroy a task.\n    /** Usually, calling this method is unnecessary, because a task is\n        implicitly deleted after its execute() method runs.  However,\n        sometimes a task needs to be explicitly deallocated, such as\n        when a root task is used as the parent in spawn_and_wait_for_all. */\n    void __TBB_EXPORTED_METHOD destroy( task& t );\n#else /* !__TBB_DEPRECATED_TASK_INTERFACE */\n    //! Define recommended static form via import from base class.\n    using task_base::destroy;\n#endif /* !__TBB_DEPRECATED_TASK_INTERFACE */\n\n    //------------------------------------------------------------------------\n    // Recycling of tasks\n    //------------------------------------------------------------------------\n\n    //! Change this to be a continuation of its former self.\n    /** The caller must guarantee that the task's refcount does not become zero until\n        after the method execute() returns.  Typically, this is done by having\n        method execute() return a pointer to a child of the task.  If the guarantee\n        cannot be made, use method recycle_as_safe_continuation instead.\n\n        Because of the hazard, this method may be deprecated in the future. */\n    void recycle_as_continuation() {\n        __TBB_ASSERT( prefix().state==executing, \"execute not running?\" );\n        prefix().state = allocated;\n    }\n\n    //! Recommended to use, safe variant of recycle_as_continuation\n    /** For safety, it requires additional increment of ref_count.\n        With no descendants and ref_count of 1, it has the semantics of recycle_to_reexecute. */\n    void recycle_as_safe_continuation() {\n        __TBB_ASSERT( prefix().state==executing, \"execute not running?\" );\n        prefix().state = recycle;\n    }\n\n    //! Change this to be a child of new_parent.\n    void recycle_as_child_of( task& new_parent ) {\n        internal::task_prefix& p = prefix();\n        __TBB_ASSERT( prefix().state==executing||prefix().state==allocated, \"execute not running, or already recycled\" );\n        __TBB_ASSERT( prefix().ref_count==0, \"no child tasks allowed when recycled as a child\" );\n        __TBB_ASSERT( p.parent==NULL, \"parent must be null\" );\n        __TBB_ASSERT( new_parent.prefix().state<=recycle, \"corrupt parent's state\" );\n        __TBB_ASSERT( new_parent.prefix().state!=freed, \"parent already freed\" );\n        p.state = allocated;\n        p.parent = &new_parent;\n#if __TBB_TASK_GROUP_CONTEXT\n        p.context = new_parent.prefix().context;\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n    }\n\n    //! Schedule this for reexecution after current execute() returns.\n    /** Made obsolete by recycle_as_safe_continuation; may become deprecated. */\n    void recycle_to_reexecute() {\n        __TBB_ASSERT( prefix().state==executing, \"execute not running, or already recycled\" );\n        __TBB_ASSERT( prefix().ref_count==0, \"no child tasks allowed when recycled for reexecution\" );\n        prefix().state = reexecute;\n    }\n\n#if __TBB_RECYCLE_TO_ENQUEUE\n    //! Schedule this to enqueue after descendant tasks complete.\n    /** Save enqueue/spawn difference, it has the semantics of recycle_as_safe_continuation. */\n    void recycle_to_enqueue() {\n        __TBB_ASSERT( prefix().state==executing, \"execute not running, or already recycled\" );\n        prefix().state = to_enqueue;\n    }\n#endif /* __TBB_RECYCLE_TO_ENQUEUE */\n\n    //------------------------------------------------------------------------\n    // Spawning and blocking\n    //------------------------------------------------------------------------\n\n    //! Set reference count\n    void set_ref_count( int count ) {\n#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT\n        internal_set_ref_count(count);\n#else\n        prefix().ref_count = count;\n#endif /* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */\n    }\n\n    //! Atomically increment reference count and returns its old value.\n    /** Has acquire semantics */\n    void increment_ref_count() {\n        __TBB_FetchAndIncrementWacquire( &prefix().ref_count );\n    }\n\n    //! Atomically decrement reference count and returns its new value.\n    /** Has release semantics. */\n    int decrement_ref_count() {\n#if TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT\n        return int(internal_decrement_ref_count());\n#else\n        return int(__TBB_FetchAndDecrementWrelease( &prefix().ref_count ))-1;\n#endif /* TBB_USE_THREADING_TOOLS||TBB_USE_ASSERT */\n    }\n\n    //! Define recommended static forms via import from base class.\n    using task_base::spawn;\n\n    //! Similar to spawn followed by wait_for_all, but more efficient.\n    void spawn_and_wait_for_all( task& child ) {\n        prefix().owner->wait_for_all( *this, &child );\n    }\n\n    //! Similar to spawn followed by wait_for_all, but more efficient.\n    void __TBB_EXPORTED_METHOD spawn_and_wait_for_all( task_list& list );\n\n    //! Spawn task allocated by allocate_root, wait for it to complete, and deallocate it.\n    static void spawn_root_and_wait( task& root ) {\n        root.prefix().owner->spawn_root_and_wait( root, root.prefix().next );\n    }\n\n    //! Spawn root tasks on list and wait for all of them to finish.\n    /** If there are more tasks than worker threads, the tasks are spawned in\n        order of front to back. */\n    static void spawn_root_and_wait( task_list& root_list );\n\n    //! Wait for reference count to become one, and set reference count to zero.\n    /** Works on tasks while waiting. */\n    void wait_for_all() {\n        prefix().owner->wait_for_all( *this, NULL );\n    }\n\n    //! Enqueue task for starvation-resistant execution.\n#if __TBB_TASK_PRIORITY\n    /** The task will be enqueued on the normal priority level disregarding the\n        priority of its task group.\n\n        The rationale of such semantics is that priority of an enqueued task is\n        statically fixed at the moment of its enqueuing, while task group priority\n        is dynamic. Thus automatic priority inheritance would be generally a subject\n        to the race, which may result in unexpected behavior.\n\n        Use enqueue() overload with explicit priority value and task::group_priority()\n        method to implement such priority inheritance when it is really necessary. **/\n#endif /* __TBB_TASK_PRIORITY */\n    static void enqueue( task& t ) {\n        t.prefix().owner->enqueue( t, NULL );\n    }\n\n#if __TBB_TASK_PRIORITY\n    //! Enqueue task for starvation-resistant execution on the specified priority level.\n    static void enqueue( task& t, priority_t p ) {\n        __TBB_ASSERT( p == priority_low || p == priority_normal || p == priority_high, \"Invalid priority level value\" );\n        t.prefix().owner->enqueue( t, (void*)p );\n    }\n#endif /* __TBB_TASK_PRIORITY */\n\n    //! The innermost task being executed or destroyed by the current thread at the moment.\n    static task& __TBB_EXPORTED_FUNC self();\n\n    //! task on whose behalf this task is working, or NULL if this is a root.\n    task* parent() const {return prefix().parent;}\n\n    //! sets parent task pointer to specified value\n    void set_parent(task* p) {\n#if __TBB_TASK_GROUP_CONTEXT\n        __TBB_ASSERT(prefix().context == p->prefix().context, \"The tasks must be in the same context\");\n#endif\n        prefix().parent = p;\n    }\n\n#if __TBB_TASK_GROUP_CONTEXT\n    //! This method is deprecated and will be removed in the future.\n    /** Use method group() instead. **/\n    task_group_context* context() {return prefix().context;}\n\n    //! Pointer to the task group descriptor.\n    task_group_context* group () { return prefix().context; }\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n    //! True if task was stolen from the task pool of another thread.\n    bool is_stolen_task() const {\n        return (prefix().extra_state & 0x80)!=0;\n    }\n\n    //------------------------------------------------------------------------\n    // Debugging\n    //------------------------------------------------------------------------\n\n    //! Current execution state\n    state_type state() const {return state_type(prefix().state);}\n\n    //! The internal reference count.\n    int ref_count() const {\n#if TBB_USE_ASSERT\n        internal::reference_count ref_count_ = prefix().ref_count;\n        __TBB_ASSERT( ref_count_==int(ref_count_), \"integer overflow error\");\n#endif\n        return int(prefix().ref_count);\n    }\n\n    //! Obsolete, and only retained for the sake of backward compatibility. Always returns true.\n    bool __TBB_EXPORTED_METHOD is_owned_by_current_thread() const;\n\n    //------------------------------------------------------------------------\n    // Affinity\n    //------------------------------------------------------------------------\n\n    //! An id as used for specifying affinity.\n    /** Guaranteed to be integral type.  Value of 0 means no affinity. */\n    typedef internal::affinity_id affinity_id;\n\n    //! Set affinity for this task.\n    void set_affinity( affinity_id id ) {prefix().affinity = id;}\n\n    //! Current affinity of this task\n    affinity_id affinity() const {return prefix().affinity;}\n\n    //! Invoked by scheduler to notify task that it ran on unexpected thread.\n    /** Invoked before method execute() runs, if task is stolen, or task has\n        affinity but will be executed on another thread.\n\n        The default action does nothing. */\n    virtual void __TBB_EXPORTED_METHOD note_affinity( affinity_id id );\n\n#if __TBB_TASK_GROUP_CONTEXT\n    //! Moves this task from its current group into another one.\n    /** Argument ctx specifies the new group.\n\n        The primary purpose of this method is to associate unique task group context\n        with a task allocated for subsequent enqueuing. In contrast to spawned tasks\n        enqueued ones normally outlive the scope where they were created. This makes\n        traditional usage model where task group context are allocated locally on\n        the stack inapplicable. Dynamic allocation of context objects is performance\n        inefficient. Method change_group() allows to make task group context object\n        a member of the task class, and then associate it with its containing task\n        object in the latter's constructor. **/\n    void __TBB_EXPORTED_METHOD change_group ( task_group_context& ctx );\n\n    //! Initiates cancellation of all tasks in this cancellation group and its subordinate groups.\n    /** \\return false if cancellation has already been requested, true otherwise. **/\n    bool cancel_group_execution () { return prefix().context->cancel_group_execution(); }\n\n    //! Returns true if the context has received cancellation request.\n    bool is_cancelled () const { return prefix().context->is_group_execution_cancelled(); }\n#else\n    bool is_cancelled () const { return false; }\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n#if __TBB_TASK_PRIORITY\n    //! Changes priority of the task group this task belongs to.\n    void set_group_priority ( priority_t p ) {  prefix().context->set_priority(p); }\n\n    //! Retrieves current priority of the task group this task belongs to.\n    priority_t group_priority () const { return prefix().context->priority(); }\n\n#endif /* __TBB_TASK_PRIORITY */\n\nprivate:\n    friend class interface5::internal::task_base;\n    friend class task_list;\n    friend class internal::scheduler;\n    friend class internal::allocate_root_proxy;\n#if __TBB_TASK_GROUP_CONTEXT\n    friend class internal::allocate_root_with_context_proxy;\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n    friend class internal::allocate_continuation_proxy;\n    friend class internal::allocate_child_proxy;\n    friend class internal::allocate_additional_child_of_proxy;\n\n    //! Get reference to corresponding task_prefix.\n    /** Version tag prevents loader on Linux from using the wrong symbol in debug builds. **/\n    internal::task_prefix& prefix( internal::version_tag* = NULL ) const {\n        return reinterpret_cast<internal::task_prefix*>(const_cast<task*>(this))[-1];\n    }\n}; // class task\n\n//! task that does nothing.  Useful for synchronization.\n/** @ingroup task_scheduling */\nclass empty_task: public task {\n    /*override*/ task* execute() {\n        return NULL;\n    }\n};\n\n//! @cond INTERNAL\nnamespace internal {\n    template<typename F>\n    class function_task : public task {\n        F my_func;\n        /*override*/ task* execute() {\n            my_func();\n            return NULL;\n        }\n    public:\n        function_task( const F& f ) : my_func(f) {}\n    };\n} // namespace internal\n//! @endcond\n\n//! A list of children.\n/** Used for method task::spawn_children\n    @ingroup task_scheduling */\nclass task_list: internal::no_copy {\nprivate:\n    task* first;\n    task** next_ptr;\n    friend class task;\n    friend class interface5::internal::task_base;\npublic:\n    //! Construct empty list\n    task_list() : first(NULL), next_ptr(&first) {}\n\n    //! Destroys the list, but does not destroy the task objects.\n    ~task_list() {}\n\n    //! True if list if empty; false otherwise.\n    bool empty() const {return !first;}\n\n    //! Push task onto back of list.\n    void push_back( task& task ) {\n        task.prefix().next = NULL;\n        *next_ptr = &task;\n        next_ptr = &task.prefix().next;\n    }\n\n    //! Pop the front task from the list.\n    task& pop_front() {\n        __TBB_ASSERT( !empty(), \"attempt to pop item from empty task_list\" );\n        task* result = first;\n        first = result->prefix().next;\n        if( !first ) next_ptr = &first;\n        return *result;\n    }\n\n    //! Clear the list\n    void clear() {\n        first=NULL;\n        next_ptr=&first;\n    }\n};\n\ninline void interface5::internal::task_base::spawn( task& t ) {\n    t.prefix().owner->spawn( t, t.prefix().next );\n}\n\ninline void interface5::internal::task_base::spawn( task_list& list ) {\n    if( task* t = list.first ) {\n        t->prefix().owner->spawn( *t, *list.next_ptr );\n        list.clear();\n    }\n}\n\ninline void task::spawn_root_and_wait( task_list& root_list ) {\n    if( task* t = root_list.first ) {\n        t->prefix().owner->spawn_root_and_wait( *t, *root_list.next_ptr );\n        root_list.clear();\n    }\n}\n\n} // namespace tbb\n\ninline void *operator new( size_t bytes, const tbb::internal::allocate_root_proxy& ) {\n    return &tbb::internal::allocate_root_proxy::allocate(bytes);\n}\n\ninline void operator delete( void* task, const tbb::internal::allocate_root_proxy& ) {\n    tbb::internal::allocate_root_proxy::free( *static_cast<tbb::task*>(task) );\n}\n\n#if __TBB_TASK_GROUP_CONTEXT\ninline void *operator new( size_t bytes, const tbb::internal::allocate_root_with_context_proxy& p ) {\n    return &p.allocate(bytes);\n}\n\ninline void operator delete( void* task, const tbb::internal::allocate_root_with_context_proxy& p ) {\n    p.free( *static_cast<tbb::task*>(task) );\n}\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\ninline void *operator new( size_t bytes, const tbb::internal::allocate_continuation_proxy& p ) {\n    return &p.allocate(bytes);\n}\n\ninline void operator delete( void* task, const tbb::internal::allocate_continuation_proxy& p ) {\n    p.free( *static_cast<tbb::task*>(task) );\n}\n\ninline void *operator new( size_t bytes, const tbb::internal::allocate_child_proxy& p ) {\n    return &p.allocate(bytes);\n}\n\ninline void operator delete( void* task, const tbb::internal::allocate_child_proxy& p ) {\n    p.free( *static_cast<tbb::task*>(task) );\n}\n\ninline void *operator new( size_t bytes, const tbb::internal::allocate_additional_child_of_proxy& p ) {\n    return &p.allocate(bytes);\n}\n\ninline void operator delete( void* task, const tbb::internal::allocate_additional_child_of_proxy& p ) {\n    p.free( *static_cast<tbb::task*>(task) );\n}\n\n#endif /* __TBB_task_H */\n"
  },
  {
    "path": "benchmarks/tbb/task_arena.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_task_arena_H\n#define __TBB_task_arena_H\n\n#include \"task.h\"\n#include \"tbb_exception.h\"\n#if TBB_USE_THREADING_TOOLS\n#include \"atomic.h\" // for as_atomic\n#endif\n\n#if __TBB_TASK_ARENA\n\nnamespace tbb {\n\n//! @cond INTERNAL\nnamespace internal {\n    //! Internal to library. Should not be used by clients.\n    /** @ingroup task_scheduling */\n    class arena;\n    class task_scheduler_observer_v3;\n} // namespace internal\n//! @endcond\n\nnamespace interface7 {\n//! @cond INTERNAL\nnamespace internal {\nusing namespace tbb::internal; //e.g. function_task from task.h\n\nclass delegate_base : no_assign {\npublic:\n    virtual void operator()() const = 0;\n    virtual ~delegate_base() {}\n};\n\ntemplate<typename F>\nclass delegated_function : public delegate_base {\n    F &my_func;\n    /*override*/ void operator()() const {\n        my_func();\n    }\npublic:\n    delegated_function ( F& f ) : my_func(f) {}\n};\n\nclass task_arena_base {\nprotected:\n    //! NULL if not currently initialized.\n    internal::arena* my_arena;\n\n#if __TBB_TASK_GROUP_CONTEXT\n    //! default context of the arena\n    task_group_context *my_context;\n#endif\n\n    //! Concurrency level for deferred initialization\n    int my_max_concurrency;\n\n    //! Reserved master slots\n    unsigned my_master_slots;\n\n    //! Special settings\n    intptr_t my_version_and_traits;\n\n    enum {\n        default_flags = 0\n#if __TBB_TASK_GROUP_CONTEXT\n        | (task_group_context::default_traits & task_group_context::exact_exception)  // 0 or 1 << 16\n        , exact_exception_flag = task_group_context::exact_exception // used to specify flag for context directly\n#endif\n    };\n\n    task_arena_base(int max_concurrency, unsigned reserved_for_masters)\n        : my_arena(0)\n#if __TBB_TASK_GROUP_CONTEXT\n        , my_context(0)\n#endif\n        , my_max_concurrency(max_concurrency)\n        , my_master_slots(reserved_for_masters)\n        , my_version_and_traits(default_flags)\n        {}\n\n    void __TBB_EXPORTED_METHOD internal_initialize( );\n    void __TBB_EXPORTED_METHOD internal_terminate( );\n    void __TBB_EXPORTED_METHOD internal_enqueue( task&, intptr_t ) const;\n    void __TBB_EXPORTED_METHOD internal_execute( delegate_base& ) const;\n    void __TBB_EXPORTED_METHOD internal_wait() const;\n    static int __TBB_EXPORTED_FUNC internal_current_slot();\npublic:\n    //! Typedef for number of threads that is automatic.\n    static const int automatic = -1; // any value < 1 means 'automatic'\n\n};\n\n} // namespace internal\n//! @endcond\n\n/** 1-to-1 proxy representation class of scheduler's arena\n * Constructors set up settings only, real construction is deferred till the first method invocation\n * Destructor only removes one of the references to the inner arena representation.\n * Final destruction happens when all the references (and the work) are gone.\n */\nclass task_arena : public internal::task_arena_base {\n    friend class tbb::internal::task_scheduler_observer_v3;\n    bool my_initialized;\n\npublic:\n    //! Creates task_arena with certain concurrency limits\n    /** Sets up settings only, real construction is deferred till the first method invocation\n     *  @arg max_concurrency specifies total number of slots in arena where threads work\n     *  @arg reserved_for_masters specifies number of slots to be used by master threads only.\n     *       Value of 1 is default and reflects behavior of implicit arenas.\n     **/\n    task_arena(int max_concurrency = automatic, unsigned reserved_for_masters = 1)\n        : task_arena_base(max_concurrency, reserved_for_masters)\n        , my_initialized(false)\n    {}\n\n    //! Copies settings from another task_arena\n    task_arena(const task_arena &s) // copy settings but not the reference or instance\n        : task_arena_base(s.my_max_concurrency, s.my_master_slots)\n        , my_initialized(false)\n    {}\n\n    //! Forces allocation of the resources for the task_arena as specified in constructor arguments\n    inline void initialize() {\n        if( !my_initialized ) {\n            internal_initialize();\n#if TBB_USE_THREADING_TOOLS\n            // Threading tools respect lock prefix but report false-positive data-race via plain store\n            internal::as_atomic(my_initialized).fetch_and_store<release>(true);\n#else\n            my_initialized = true;\n#endif //TBB_USE_THREADING_TOOLS\n        }\n    }\n\n    //! Overrides concurrency level and forces initialization of internal representation\n    inline void initialize(int max_concurrency, unsigned reserved_for_masters = 1) {\n        __TBB_ASSERT( !my_arena, \"Impossible to modify settings of an already initialized task_arena\");\n        if( !my_initialized ) {\n            my_max_concurrency = max_concurrency;\n            my_master_slots = reserved_for_masters;\n            initialize();\n        }\n    }\n\n    //! Removes the reference to the internal arena representation.\n    //! Not thread safe wrt concurrent invocations of other methods.\n    inline void terminate() {\n        if( my_initialized ) {\n            internal_terminate();\n            my_initialized = false;\n        }\n    }\n\n    //! Removes the reference to the internal arena representation, and destroys the external object.\n    //! Not thread safe wrt concurrent invocations of other methods.\n    ~task_arena() {\n        terminate();\n    }\n\n    //! Returns true if the arena is active (initialized); false otherwise.\n    //! The name was chosen to match a task_scheduler_init method with the same semantics.\n    bool is_active() const { return my_initialized; }\n\n    //! Enqueues a task into the arena to process a functor, and immediately returns.\n    //! Does not require the calling thread to join the arena\n    template<typename F>\n    void enqueue( const F& f ) {\n        initialize();\n#if __TBB_TASK_GROUP_CONTEXT\n        internal_enqueue( *new( task::allocate_root(*my_context) ) internal::function_task<F>(f), 0 );\n#else\n        internal_enqueue( *new( task::allocate_root() ) internal::function_task<F>(f), 0 );\n#endif\n    }\n\n#if __TBB_TASK_PRIORITY\n    //! Enqueues a task with priority p into the arena to process a functor f, and immediately returns.\n    //! Does not require the calling thread to join the arena\n    template<typename F>\n    void enqueue( const F& f, priority_t p ) {\n        __TBB_ASSERT( p == priority_low || p == priority_normal || p == priority_high, \"Invalid priority level value\" );\n        initialize();\n#if __TBB_TASK_GROUP_CONTEXT\n        internal_enqueue( *new( task::allocate_root(*my_context) ) internal::function_task<F>(f), (intptr_t)p );\n#else\n        internal_enqueue( *new( task::allocate_root() ) internal::function_task<F>(f), (intptr_t)p );\n#endif\n    }\n#endif// __TBB_TASK_PRIORITY\n\n    //! Joins the arena and executes a functor, then returns\n    //! If not possible to join, wraps the functor into a task, enqueues it and waits for task completion\n    //! Can decrement the arena demand for workers, causing a worker to leave and free a slot to the calling thread\n    template<typename F>\n    void execute(F& f) {\n        initialize();\n        internal::delegated_function<F> d(f);\n        internal_execute( d );\n    }\n\n    //! Joins the arena and executes a functor, then returns\n    //! If not possible to join, wraps the functor into a task, enqueues it and waits for task completion\n    //! Can decrement the arena demand for workers, causing a worker to leave and free a slot to the calling thread\n    template<typename F>\n    void execute(const F& f) {\n        initialize();\n        internal::delegated_function<const F> d(f);\n        internal_execute( d );\n    }\n\n#if __TBB_EXTRA_DEBUG\n    //! Wait for all work in the arena to be completed\n    //! Even submitted by other application threads\n    //! Joins arena if/when possible (in the same way as execute())\n    void debug_wait_until_empty() {\n        initialize();\n        internal_wait();\n    }\n#endif //__TBB_EXTRA_DEBUG\n\n    //! Returns the index, aka slot number, of the calling thread in its current arena\n    inline static int current_thread_index() {\n        return internal_current_slot();\n    }\n};\n\n} // namespace interfaceX\n\nusing interface7::task_arena;\n\n} // namespace tbb\n\n#endif /* __TBB_TASK_ARENA */\n\n#endif /* __TBB_task_arena_H */\n"
  },
  {
    "path": "benchmarks/tbb/task_group.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_task_group_H\n#define __TBB_task_group_H\n\n#include \"task.h\"\n#include \"tbb_exception.h\"\n\n#if __TBB_TASK_GROUP_CONTEXT\n\nnamespace tbb {\n\nnamespace internal {\n    template<typename F> class task_handle_task;\n}\n\nclass task_group;\nclass structured_task_group;\n\ntemplate<typename F>\nclass task_handle : internal::no_assign {\n    template<typename _F> friend class internal::task_handle_task;\n    friend class task_group;\n    friend class structured_task_group;\n\n    static const intptr_t scheduled = 0x1;\n\n    F my_func;\n    intptr_t my_state;\n\n    void mark_scheduled () {\n        // The check here is intentionally lax to avoid the impact of interlocked operation\n        if ( my_state & scheduled )\n            internal::throw_exception( internal::eid_invalid_multiple_scheduling );\n        my_state |= scheduled;\n    }\npublic:\n    task_handle( const F& f ) : my_func(f), my_state(0) {}\n\n    void operator() () const { my_func(); }\n};\n\nenum task_group_status {\n    not_complete,\n    complete,\n    canceled\n};\n\nnamespace internal {\n\ntemplate<typename F>\nclass task_handle_task : public task {\n    task_handle<F>& my_handle;\n    /*override*/ task* execute() {\n        my_handle();\n        return NULL;\n    }\npublic:\n    task_handle_task( task_handle<F>& h ) : my_handle(h) { h.mark_scheduled(); }\n};\n\nclass task_group_base : internal::no_copy {\nprotected:\n    empty_task* my_root;\n    task_group_context my_context;\n\n    task& owner () { return *my_root; }\n\n    template<typename F>\n    task_group_status internal_run_and_wait( F& f ) {\n        __TBB_TRY {\n            if ( !my_context.is_group_execution_cancelled() )\n                f();\n        } __TBB_CATCH( ... ) {\n            my_context.register_pending_exception();\n        }\n        return wait();\n    }\n\n    template<typename F, typename Task>\n    void internal_run( F& f ) {\n        owner().spawn( *new( owner().allocate_additional_child_of(*my_root) ) Task(f) );\n    }\n\npublic:\n    task_group_base( uintptr_t traits = 0 )\n        : my_context(task_group_context::bound, task_group_context::default_traits | traits)\n    {\n        my_root = new( task::allocate_root(my_context) ) empty_task;\n        my_root->set_ref_count(1);\n    }\n\n    ~task_group_base() __TBB_NOEXCEPT(false) {\n        if( my_root->ref_count() > 1 ) {\n            bool stack_unwinding_in_progress = std::uncaught_exception();\n            // Always attempt to do proper cleanup to avoid inevitable memory corruption \n            // in case of missing wait (for the sake of better testability & debuggability)\n            if ( !is_canceling() )\n                cancel();\n            __TBB_TRY {\n                my_root->wait_for_all();\n            } __TBB_CATCH (...) {\n                task::destroy(*my_root);\n                __TBB_RETHROW();\n            }\n            task::destroy(*my_root);\n            if ( !stack_unwinding_in_progress )\n                internal::throw_exception( internal::eid_missing_wait );\n        }\n        else {\n            task::destroy(*my_root);\n        }\n    }\n\n    template<typename F>\n    void run( task_handle<F>& h ) {\n        internal_run< task_handle<F>, internal::task_handle_task<F> >( h );\n    }\n\n    task_group_status wait() {\n        __TBB_TRY {\n            my_root->wait_for_all();\n        } __TBB_CATCH( ... ) {\n            my_context.reset();\n            __TBB_RETHROW();\n        }\n        if ( my_context.is_group_execution_cancelled() ) {\n            my_context.reset();\n            return canceled;\n        }\n        return complete;\n    }\n\n    bool is_canceling() {\n        return my_context.is_group_execution_cancelled();\n    }\n\n    void cancel() {\n        my_context.cancel_group_execution();\n    }\n}; // class task_group_base\n\n} // namespace internal\n\nclass task_group : public internal::task_group_base {\npublic:\n    task_group () : task_group_base( task_group_context::concurrent_wait ) {}\n\n#if __SUNPRO_CC\n    template<typename F>\n    void run( task_handle<F>& h ) {\n        internal_run< task_handle<F>, internal::task_handle_task<F> >( h );\n    }\n#else\n    using task_group_base::run;\n#endif\n\n    template<typename F>\n    void run( const F& f ) {\n        internal_run< const F, internal::function_task<F> >( f );\n    }\n\n    template<typename F>\n    task_group_status run_and_wait( const F& f ) {\n        return internal_run_and_wait<const F>( f );\n    }\n\n    template<typename F>\n    task_group_status run_and_wait( task_handle<F>& h ) {\n      h.mark_scheduled();\n      return internal_run_and_wait< task_handle<F> >( h );\n    }\n}; // class task_group\n\nclass structured_task_group : public internal::task_group_base {\npublic:\n    template<typename F>\n    task_group_status run_and_wait ( task_handle<F>& h ) {\n        h.mark_scheduled();\n        return internal_run_and_wait< task_handle<F> >( h );\n    }\n\n    task_group_status wait() {\n        task_group_status res = task_group_base::wait();\n        my_root->set_ref_count(1);\n        return res;\n    }\n}; // class structured_task_group\n\ninline \nbool is_current_task_group_canceling() {\n    return task::self().is_cancelled();\n}\n\ntemplate<class F>\ntask_handle<F> make_task( const F& f ) {\n    return task_handle<F>( f );\n}\n\n} // namespace tbb\n\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n#endif /* __TBB_task_group_H */\n"
  },
  {
    "path": "benchmarks/tbb/task_group_context.cpp",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#include \"scheduler.h\"\n\n#include \"itt_notify.h\"\n\nnamespace tbb {\n\n#if __TBB_TASK_GROUP_CONTEXT\n\nusing namespace internal;\n\n//------------------------------------------------------------------------\n// captured_exception\n//------------------------------------------------------------------------\n\ninline char* duplicate_string ( const char* src ) {\n    char* dst = NULL;\n    if ( src ) {\n        size_t len = strlen(src) + 1;\n        dst = (char*)allocate_via_handler_v3(len);\n        strncpy (dst, src, len);\n    }\n    return dst;\n}\n\ncaptured_exception::~captured_exception () throw() {\n    clear();\n}\n\nvoid captured_exception::set ( const char* a_name, const char* info ) throw() {\n    my_exception_name = duplicate_string( a_name );\n    my_exception_info = duplicate_string( info );\n}\n\nvoid captured_exception::clear () throw() {\n    deallocate_via_handler_v3 (const_cast<char*>(my_exception_name));\n    deallocate_via_handler_v3 (const_cast<char*>(my_exception_info));\n}\n\ncaptured_exception* captured_exception::move () throw() {\n    captured_exception *e = (captured_exception*)allocate_via_handler_v3(sizeof(captured_exception));\n    if ( e ) {\n        ::new (e) captured_exception();\n        e->my_exception_name = my_exception_name;\n        e->my_exception_info = my_exception_info;\n        e->my_dynamic = true;\n        my_exception_name = my_exception_info = NULL;\n    }\n    return e;\n}\n\nvoid captured_exception::destroy () throw() {\n    __TBB_ASSERT ( my_dynamic, \"Method destroy can be used only on objects created by clone or allocate\" );\n    if ( my_dynamic ) {\n        this->captured_exception::~captured_exception();\n        deallocate_via_handler_v3 (this);\n    }\n}\n\ncaptured_exception* captured_exception::allocate ( const char* a_name, const char* info ) {\n    captured_exception *e = (captured_exception*)allocate_via_handler_v3( sizeof(captured_exception) );\n    if ( e ) {\n        ::new (e) captured_exception(a_name, info);\n        e->my_dynamic = true;\n    }\n    return e;\n}\n\nconst char* captured_exception::name() const throw() {\n    return my_exception_name;\n}\n\nconst char* captured_exception::what() const throw() {\n    return my_exception_info;\n}\n\n\n//------------------------------------------------------------------------\n// tbb_exception_ptr\n//------------------------------------------------------------------------\n\n#if !TBB_USE_CAPTURED_EXCEPTION\n\nnamespace internal {\n\ntemplate<typename T>\ntbb_exception_ptr* AllocateExceptionContainer( const T& src ) {\n    tbb_exception_ptr *eptr = (tbb_exception_ptr*)allocate_via_handler_v3( sizeof(tbb_exception_ptr) );\n    if ( eptr )\n        new (eptr) tbb_exception_ptr(src);\n    return eptr;\n}\n\ntbb_exception_ptr* tbb_exception_ptr::allocate () {\n    return AllocateExceptionContainer( std::current_exception() );\n}\n\ntbb_exception_ptr* tbb_exception_ptr::allocate ( const tbb_exception& ) {\n    return AllocateExceptionContainer( std::current_exception() );\n}\n\ntbb_exception_ptr* tbb_exception_ptr::allocate ( captured_exception& src ) {\n    tbb_exception_ptr *res = AllocateExceptionContainer( src );\n    src.destroy();\n    return res;\n}\n\nvoid tbb_exception_ptr::destroy () throw() {\n    this->tbb_exception_ptr::~tbb_exception_ptr();\n    deallocate_via_handler_v3 (this);\n}\n\n} // namespace internal\n#endif /* !TBB_USE_CAPTURED_EXCEPTION */\n\n\n//------------------------------------------------------------------------\n// task_group_context\n//------------------------------------------------------------------------\n\ntask_group_context::~task_group_context () {\n    if ( __TBB_load_relaxed(my_kind) == binding_completed ) {\n        if ( governor::is_set(my_owner) ) {\n            // Local update of the context list\n            uintptr_t local_count_snapshot = my_owner->my_context_state_propagation_epoch;\n            my_owner->my_local_ctx_list_update.store<relaxed>(1);\n            // Prevent load of nonlocal update flag from being hoisted before the\n            // store to local update flag.\n            atomic_fence();\n            if ( my_owner->my_nonlocal_ctx_list_update.load<relaxed>() ) {\n                spin_mutex::scoped_lock lock(my_owner->my_context_list_mutex);\n                my_node.my_prev->my_next = my_node.my_next;\n                my_node.my_next->my_prev = my_node.my_prev;\n                my_owner->my_local_ctx_list_update.store<relaxed>(0);\n            }\n            else {\n                my_node.my_prev->my_next = my_node.my_next;\n                my_node.my_next->my_prev = my_node.my_prev;\n                // Release fence is necessary so that update of our neighbors in\n                // the context list was committed when possible concurrent destroyer\n                // proceeds after local update flag is reset by the following store.\n                my_owner->my_local_ctx_list_update.store<release>(0);\n                if ( local_count_snapshot != the_context_state_propagation_epoch ) {\n                    // Another thread was propagating cancellation request when we removed\n                    // ourselves from the list. We must ensure that it is not accessing us\n                    // when this destructor finishes. We'll be able to acquire the lock\n                    // below only after the other thread finishes with us.\n                    spin_mutex::scoped_lock lock(my_owner->my_context_list_mutex);\n                }\n            }\n        }\n        else {\n            // Nonlocal update of the context list\n            // Synchronizes with generic_scheduler::cleanup_local_context_list()\n            // TODO: evaluate and perhaps relax, or add some lock instead\n            if ( internal::as_atomic(my_kind).fetch_and_store(dying) == detached ) {\n                my_node.my_prev->my_next = my_node.my_next;\n                my_node.my_next->my_prev = my_node.my_prev;\n            }\n            else {\n                //TODO: evaluate and perhaps relax\n                my_owner->my_nonlocal_ctx_list_update.fetch_and_increment<full_fence>();\n                //TODO: evaluate and perhaps remove\n                spin_wait_until_eq( my_owner->my_local_ctx_list_update, 0u );\n                my_owner->my_context_list_mutex.lock();\n                my_node.my_prev->my_next = my_node.my_next;\n                my_node.my_next->my_prev = my_node.my_prev;\n                my_owner->my_context_list_mutex.unlock();\n                //TODO: evaluate and perhaps relax\n                my_owner->my_nonlocal_ctx_list_update.fetch_and_decrement<full_fence>();\n            }\n        }\n    }\n#if __TBB_FP_CONTEXT\n    internal::punned_cast<cpu_ctl_env*>(&my_cpu_ctl_env)->~cpu_ctl_env();\n#endif\n    poison_value(my_version_and_traits);\n    if ( my_exception )\n        my_exception->destroy();\n    ITT_STACK(itt_caller != ITT_CALLER_NULL, caller_destroy, itt_caller);\n}\n\nvoid task_group_context::init () {\n    __TBB_STATIC_ASSERT ( sizeof(my_version_and_traits) >= 4, \"Layout of my_version_and_traits must be reconsidered on this platform\" );\n    __TBB_STATIC_ASSERT ( sizeof(task_group_context) == 2 * NFS_MaxLineSize, \"Context class has wrong size - check padding and members alignment\" );\n    __TBB_ASSERT ( (uintptr_t(this) & (sizeof(my_cancellation_requested) - 1)) == 0, \"Context is improperly aligned\" );\n    __TBB_ASSERT ( __TBB_load_relaxed(my_kind) == isolated || __TBB_load_relaxed(my_kind) == bound, \"Context can be created only as isolated or bound\" );\n    my_parent = NULL;\n    my_cancellation_requested = 0;\n    my_exception = NULL;\n    my_owner = NULL;\n    my_state = 0;\n    itt_caller = ITT_CALLER_NULL;\n#if __TBB_TASK_PRIORITY\n    my_priority = normalized_normal_priority;\n#endif /* __TBB_TASK_PRIORITY */\n#if __TBB_FP_CONTEXT\n    __TBB_STATIC_ASSERT( sizeof(my_cpu_ctl_env) == sizeof(internal::uint64_t), \"The reserved space for FPU settings are not equal sizeof(uint64_t)\" );\n    __TBB_STATIC_ASSERT( sizeof(cpu_ctl_env) <= sizeof(my_cpu_ctl_env), \"FPU settings storage does not fit to uint64_t\" );\n    suppress_unused_warning( my_cpu_ctl_env.space );\n\n    cpu_ctl_env &ctl = *internal::punned_cast<cpu_ctl_env*>(&my_cpu_ctl_env);\n    new ( &ctl ) cpu_ctl_env;\n    if ( my_version_and_traits & fp_settings )\n        ctl.get_env();\n#endif\n}\n\nvoid task_group_context::register_with ( generic_scheduler *local_sched ) {\n    __TBB_ASSERT( local_sched, NULL );\n    my_owner = local_sched;\n    // state propagation logic assumes new contexts are bound to head of the list\n    my_node.my_prev = &local_sched->my_context_list_head;\n    // Notify threads that may be concurrently destroying contexts registered\n    // in this scheduler's list that local list update is underway.\n    local_sched->my_local_ctx_list_update.store<relaxed>(1);\n    // Prevent load of global propagation epoch counter from being hoisted before\n    // speculative stores above, as well as load of nonlocal update flag from\n    // being hoisted before the store to local update flag.\n    atomic_fence();\n    // Finalize local context list update\n    if ( local_sched->my_nonlocal_ctx_list_update.load<relaxed>() ) {\n        spin_mutex::scoped_lock lock(my_owner->my_context_list_mutex);\n        local_sched->my_context_list_head.my_next->my_prev = &my_node;\n        my_node.my_next = local_sched->my_context_list_head.my_next;\n        my_owner->my_local_ctx_list_update.store<relaxed>(0);\n        local_sched->my_context_list_head.my_next = &my_node;\n    }\n    else {\n        local_sched->my_context_list_head.my_next->my_prev = &my_node;\n        my_node.my_next = local_sched->my_context_list_head.my_next;\n        my_owner->my_local_ctx_list_update.store<release>(0);\n        // Thread-local list of contexts allows concurrent traversal by another thread\n        // while propagating state change. To ensure visibility of my_node's members\n        // to the concurrently traversing thread, the list's head is updated by means\n        // of store-with-release.\n        __TBB_store_with_release(local_sched->my_context_list_head.my_next, &my_node);\n    }\n}\n\nvoid task_group_context::bind_to ( generic_scheduler *local_sched ) {\n    __TBB_ASSERT ( __TBB_load_relaxed(my_kind) == binding_required, \"Already bound or isolated?\" );\n    __TBB_ASSERT ( !my_parent, \"Parent is set before initial binding\" );\n    my_parent = local_sched->my_innermost_running_task->prefix().context;\n#if __TBB_FP_CONTEXT\n    // Inherit FPU settings only if the context has not captured FPU settings yet.\n    if ( !(my_version_and_traits & fp_settings) )\n        copy_fp_settings(*my_parent);\n#endif\n\n    // Condition below prevents unnecessary thrashing parent context's cache line\n    if ( !(my_parent->my_state & may_have_children) )\n        my_parent->my_state |= may_have_children; // full fence is below\n    if ( my_parent->my_parent ) {\n        // Even if this context were made accessible for state change propagation\n        // (by placing __TBB_store_with_release(s->my_context_list_head.my_next, &my_node)\n        // above), it still could be missed if state propagation from a grand-ancestor\n        // was underway concurrently with binding.\n        // Speculative propagation from the parent together with epoch counters\n        // detecting possibility of such a race allow to avoid taking locks when\n        // there is no contention.\n\n        // Acquire fence is necessary to prevent reordering subsequent speculative\n        // loads of parent state data out of the scope where epoch counters comparison\n        // can reliably validate it.\n        uintptr_t local_count_snapshot = __TBB_load_with_acquire( my_parent->my_owner->my_context_state_propagation_epoch );\n        // Speculative propagation of parent's state. The speculation will be\n        // validated by the epoch counters check further on.\n        my_cancellation_requested = my_parent->my_cancellation_requested;\n#if __TBB_TASK_PRIORITY\n        my_priority = my_parent->my_priority;\n#endif /* __TBB_TASK_PRIORITY */\n        register_with( local_sched ); // Issues full fence\n\n        // If no state propagation was detected by the following condition, the above\n        // full fence guarantees that the parent had correct state during speculative\n        // propagation before the fence. Otherwise the propagation from parent is\n        // repeated under the lock.\n        if ( local_count_snapshot != the_context_state_propagation_epoch ) {\n            // Another thread may be propagating state change right now. So resort to lock.\n            context_state_propagation_mutex_type::scoped_lock lock(the_context_state_propagation_mutex);\n            my_cancellation_requested = my_parent->my_cancellation_requested;\n#if __TBB_TASK_PRIORITY\n            my_priority = my_parent->my_priority;\n#endif /* __TBB_TASK_PRIORITY */\n        }\n    }\n    else {\n        register_with( local_sched ); // Issues full fence\n        // As we do not have grand-ancestors, concurrent state propagation (if any)\n        // may originate only from the parent context, and thus it is safe to directly\n        // copy the state from it.\n        my_cancellation_requested = my_parent->my_cancellation_requested;\n#if __TBB_TASK_PRIORITY\n        my_priority = my_parent->my_priority;\n#endif /* __TBB_TASK_PRIORITY */\n    }\n    __TBB_store_relaxed(my_kind, binding_completed);\n}\n\n#if __TBB_TASK_GROUP_CONTEXT\ntemplate <typename T>\nvoid task_group_context::propagate_task_group_state ( T task_group_context::*mptr_state, task_group_context& src, T new_state ) {\n    if (this->*mptr_state == new_state) {\n        // Nothing to do, whether descending from \"src\" or not, so no need to scan.\n        // Hopefully this happens often thanks to earlier invocations.\n        // This optimization is enabled by LIFO order in the context lists:\n        // - new contexts are bound to the beginning of lists;\n        // - descendants are newer than ancestors;\n        // - earlier invocations are therefore likely to \"paint\" long chains.\n    }\n    else if (this == &src) {\n        // This clause is disjunct from the traversal below, which skips src entirely.\n        // Note that src.*mptr_state is not necessarily still equal to new_state (another thread may have changed it again).\n        // Such interference is probably not frequent enough to aim for optimisation by writing new_state again (to make the other thread back down).\n        // Letting the other thread prevail may also be fairer.\n    }\n    else {\n        for ( task_group_context *ancestor = my_parent; ancestor != NULL; ancestor = ancestor->my_parent ) {\n            __TBB_ASSERT(internal::is_alive(ancestor->my_version_and_traits), \"context tree was corrupted\");\n            if ( ancestor == &src ) {\n                for ( task_group_context *ctx = this; ctx != ancestor; ctx = ctx->my_parent )\n                    ctx->*mptr_state = new_state;\n                break;\n            }\n        }\n    }\n}\n\ntemplate <typename T>\nvoid generic_scheduler::propagate_task_group_state ( T task_group_context::*mptr_state, task_group_context& src, T new_state ) {\n    spin_mutex::scoped_lock lock(my_context_list_mutex);\n    // Acquire fence is necessary to ensure that the subsequent node->my_next load\n    // returned the correct value in case it was just inserted in another thread.\n    // The fence also ensures visibility of the correct my_parent value.\n    context_list_node_t *node = __TBB_load_with_acquire(my_context_list_head.my_next);\n    while ( node != &my_context_list_head ) {\n        task_group_context &ctx = __TBB_get_object_ref(task_group_context, my_node, node);\n        if ( ctx.*mptr_state != new_state )\n            ctx.propagate_task_group_state( mptr_state, src, new_state );\n        node = node->my_next;\n        __TBB_ASSERT( is_alive(ctx.my_version_and_traits), \"Local context list contains destroyed object\" );\n    }\n    // Sync up local propagation epoch with the global one. Release fence prevents\n    // reordering of possible store to *mptr_state after the sync point.\n    __TBB_store_with_release(my_context_state_propagation_epoch, the_context_state_propagation_epoch);\n}\n\ntemplate <typename T>\nbool market::propagate_task_group_state ( T task_group_context::*mptr_state, task_group_context& src, T new_state ) {\n    if ( !(src.my_state & task_group_context::may_have_children) )\n        return true;\n    // The whole propagation algorithm is under the lock in order to ensure correctness\n    // in case of concurrent state changes at the different levels of the context tree.\n    // See comment at the bottom of scheduler.cpp\n    context_state_propagation_mutex_type::scoped_lock lock(the_context_state_propagation_mutex);\n    if ( src.*mptr_state != new_state )\n        // Another thread has concurrently changed the state. Back down.\n        return false;\n    // Advance global state propagation epoch\n    __TBB_FetchAndAddWrelease(&the_context_state_propagation_epoch, 1);\n    // Propagate to all workers and masters and sync up their local epochs with the global one\n    unsigned num_workers = my_num_workers;\n    for ( unsigned i = 0; i < num_workers; ++i ) {\n        generic_scheduler *s = my_workers[i];\n        // If the worker is only about to be registered, skip it.\n        if ( s )\n            s->propagate_task_group_state( mptr_state, src, new_state );\n    }\n    // Propagate to all master threads (under my_arenas_list_mutex lock)\n    ForEachArena(a) { // uses lock on my_arenas_list_mutex\n        arena_slot &slot = a.my_slots[0];\n        generic_scheduler *s = slot.my_scheduler;\n        // If the master is under construction, skip it. Otherwise make sure that it does not\n        // leave its arena and its scheduler get destroyed while we accessing its data.\n        if ( s && as_atomic(slot.my_scheduler).compare_and_swap(LockedMaster, s) == s ) { //TODO: remove need in lock\n            __TBB_ASSERT( slot.my_scheduler == LockedMaster, NULL );\n            // The whole propagation sequence is locked, thus no contention is expected\n            __TBB_ASSERT( s != LockedMaster, NULL );\n            s->propagate_task_group_state( mptr_state, src, new_state );\n            __TBB_store_with_release( slot.my_scheduler, s );\n        }\n    } EndForEach();\n    return true;\n}\n\ntemplate <typename T>\nbool arena::propagate_task_group_state ( T task_group_context::*mptr_state, task_group_context& src, T new_state ) {\n    return my_market->propagate_task_group_state( mptr_state, src, new_state );\n}\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\nbool task_group_context::cancel_group_execution () {\n    __TBB_ASSERT ( my_cancellation_requested == 0 || my_cancellation_requested == 1, \"Invalid cancellation state\");\n    if ( my_cancellation_requested || as_atomic(my_cancellation_requested).compare_and_swap(1, 0) ) {\n        // This task group and any descendants have already been canceled.\n        // (A newly added descendant would inherit its parent's my_cancellation_requested,\n        // not missing out on any cancellation still being propagated, and a context cannot be uncanceled.)\n        return false;\n    }\n    governor::local_scheduler()->my_arena->propagate_task_group_state( &task_group_context::my_cancellation_requested, *this, (uintptr_t)1 );\n    return true;\n}\n\nbool task_group_context::is_group_execution_cancelled () const {\n    return my_cancellation_requested != 0;\n}\n\n// IMPORTANT: It is assumed that this method is not used concurrently!\nvoid task_group_context::reset () {\n    //! TODO: Add assertion that this context does not have children\n    // No fences are necessary since this context can be accessed from another thread\n    // only after stealing happened (which means necessary fences were used).\n    if ( my_exception )  {\n        my_exception->destroy();\n        my_exception = NULL;\n    }\n    my_cancellation_requested = 0;\n}\n\n#if __TBB_FP_CONTEXT\n// IMPORTANT: It is assumed that this method is not used concurrently!\nvoid task_group_context::capture_fp_settings () {\n    //! TODO: Add assertion that this context does not have children\n    // No fences are necessary since this context can be accessed from another thread\n    // only after stealing happened (which means necessary fences were used).\n    cpu_ctl_env &ctl = *internal::punned_cast<cpu_ctl_env*>(&my_cpu_ctl_env);\n    if ( !(my_version_and_traits & fp_settings) ) {\n        new ( &ctl ) cpu_ctl_env;\n        my_version_and_traits |= fp_settings;\n    }\n    ctl.get_env();\n}\n\nvoid task_group_context::copy_fp_settings( const task_group_context &src ) {\n    __TBB_ASSERT( !(my_version_and_traits & fp_settings), \"The context already has FPU settings.\" );\n    __TBB_ASSERT( src.my_version_and_traits & fp_settings, \"The source context does not have FPU settings.\" );\n\n    cpu_ctl_env &ctl = *internal::punned_cast<cpu_ctl_env*>(&my_cpu_ctl_env);\n    cpu_ctl_env &src_ctl = *internal::punned_cast<cpu_ctl_env*>(&src.my_cpu_ctl_env);\n    new (&ctl) cpu_ctl_env( src_ctl );\n    my_version_and_traits |= fp_settings;\n}\n#endif /* __TBB_FP_CONTEXT */\n\nvoid task_group_context::register_pending_exception () {\n    if ( my_cancellation_requested )\n        return;\n#if TBB_USE_EXCEPTIONS\n    try {\n        throw;\n    } TbbCatchAll( this );\n#endif /* TBB_USE_EXCEPTIONS */\n}\n\n#if __TBB_TASK_PRIORITY\nvoid task_group_context::set_priority ( priority_t prio ) {\n    __TBB_ASSERT( prio == priority_low || prio == priority_normal || prio == priority_high, \"Invalid priority level value\" );\n    intptr_t p = normalize_priority(prio);\n    if ( my_priority == p && !(my_state & task_group_context::may_have_children))\n        return;\n    my_priority = p;\n    internal::generic_scheduler* s = governor::local_scheduler_if_initialized();\n    if ( !s || !s->my_arena->propagate_task_group_state(&task_group_context::my_priority, *this, p) )\n        return;\n    // Updating arena priority here does not eliminate necessity of checking each\n    // task priority and updating arena priority if necessary before the task execution.\n    // These checks will be necessary because:\n    // a) set_priority() may be invoked before any tasks from this task group are spawned;\n    // b) all spawned tasks from this task group are retrieved from the task pools.\n    // These cases create a time window when arena priority may be lowered.\n    s->my_market->update_arena_priority( *s->my_arena, p );\n}\n\npriority_t task_group_context::priority () const {\n    return static_cast<priority_t>(priority_from_normalized_rep[my_priority]);\n}\n#endif /* __TBB_TASK_PRIORITY */\n\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n} // namespace tbb\n"
  },
  {
    "path": "benchmarks/tbb/task_scheduler_init.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_task_scheduler_init_H\n#define __TBB_task_scheduler_init_H\n\n#include \"tbb_stddef.h\"\n#include \"limits.h\"\n\nnamespace tbb {\n\ntypedef std::size_t stack_size_type;\n\n//! @cond INTERNAL\nnamespace internal {\n    //! Internal to library. Should not be used by clients.\n    /** @ingroup task_scheduling */\n    class scheduler;\n} // namespace internal\n//! @endcond\n\n//! Class delimiting the scope of task scheduler activity.\n/** A thread can construct a task_scheduler_init object and keep it alive\n    while it uses TBB's tasking subsystem (including parallel algorithms).\n\n    This class allows to customize properties of the TBB task pool to some extent.\n    For example it can limit concurrency level of parallel work initiated by the\n    given thread. It also can be used to specify stack size of the TBB worker threads,\n    though this setting is not effective if the thread pool has already been created.\n\n    If a parallel construct is used without task_scheduler_init object previously\n    created, the scheduler will be initialized automatically with default settings,\n    and will persist until this thread exits. Default concurrency level is defined\n    as described in task_scheduler_init::initialize().\n    @ingroup task_scheduling */\nclass task_scheduler_init: internal::no_copy {\n    enum ExceptionPropagationMode {\n        propagation_mode_exact = 1u,\n        propagation_mode_captured = 2u,\n        propagation_mode_mask = propagation_mode_exact | propagation_mode_captured\n    };\n#if __TBB_SUPPORTS_WORKERS_WAITING_IN_TERMINATE\n    enum {\n        wait_workers_in_terminate_flag = 128u\n    };\n#endif\n\n    /** NULL if not currently initialized. */\n    internal::scheduler* my_scheduler;\npublic:\n\n    //! Typedef for number of threads that is automatic.\n    static const int automatic = -1;\n\n    //! Argument to initialize() or constructor that causes initialization to be deferred.\n    static const int deferred = -2;\n\n    //! Ensure that scheduler exists for this thread\n    /** A value of -1 lets TBB decide on the number of threads, which is usually\n        maximal hardware concurrency for this process, that is the number of logical\n        CPUs on the machine (possibly limited by the processor affinity mask of this\n        process (Windows) or of this thread (Linux, FreeBSD). It is preferable option\n        for production code because it helps to avoid nasty surprises when several\n        TBB based components run side-by-side or in a nested fashion inside the same\n        process.\n\n        The number_of_threads is ignored if any other task_scheduler_inits \n        currently exist.  A thread may construct multiple task_scheduler_inits.  \n        Doing so does no harm because the underlying scheduler is reference counted. */\n    void __TBB_EXPORTED_METHOD initialize( int number_of_threads=automatic );\n\n    //! The overloaded method with stack size parameter\n    /** Overloading is necessary to preserve ABI compatibility */\n    void __TBB_EXPORTED_METHOD initialize( int number_of_threads, stack_size_type thread_stack_size );\n\n    //! Inverse of method initialize.\n    void __TBB_EXPORTED_METHOD terminate();\n\n    //! Shorthand for default constructor followed by call to initialize(number_of_threads).\n#if __TBB_SUPPORTS_WORKERS_WAITING_IN_TERMINATE\n    task_scheduler_init( int number_of_threads=automatic, stack_size_type thread_stack_size=0, bool wait_workers_in_terminate = false ) : my_scheduler(NULL)\n#else\n    task_scheduler_init( int number_of_threads=automatic, stack_size_type thread_stack_size=0 ) : my_scheduler(NULL)\n#endif\n    {\n        // Two lowest order bits of the stack size argument may be taken to communicate\n        // default exception propagation mode of the client to be used when the\n        // client manually creates tasks in the master thread and does not use\n        // explicit task group context object. This is necessary because newer \n        // TBB binaries with exact propagation enabled by default may be used \n        // by older clients that expect tbb::captured_exception wrapper.\n        // All zeros mean old client - no preference. \n        __TBB_ASSERT( !(thread_stack_size & propagation_mode_mask), \"Requested stack size is not aligned\" );\n#if TBB_USE_EXCEPTIONS\n        thread_stack_size |= TBB_USE_CAPTURED_EXCEPTION ? propagation_mode_captured : propagation_mode_exact;\n#endif /* TBB_USE_EXCEPTIONS */\n#if __TBB_SUPPORTS_WORKERS_WAITING_IN_TERMINATE\n        if (wait_workers_in_terminate)\n            my_scheduler = (internal::scheduler*)wait_workers_in_terminate_flag;\n#endif\n        initialize( number_of_threads, thread_stack_size );\n    }\n\n    //! Destroy scheduler for this thread if thread has no other live task_scheduler_inits.\n    ~task_scheduler_init() {\n        if( my_scheduler ) \n            terminate();\n        internal::poison_pointer( my_scheduler );\n    }\n    //! Returns the number of threads TBB scheduler would create if initialized by default.\n    /** Result returned by this method does not depend on whether the scheduler \n        has already been initialized.\n        \n        Because tbb 2.0 does not support blocking tasks yet, you may use this method\n        to boost the number of threads in the tbb's internal pool, if your tasks are \n        doing I/O operations. The optimal number of additional threads depends on how\n        much time your tasks spend in the blocked state.\n        \n        Before TBB 3.0 U4 this method returned the number of logical CPU in the\n        system. Currently on Windows, Linux and FreeBSD it returns the number of\n        logical CPUs available to the current process in accordance with its affinity\n        mask.\n        \n        NOTE: The return value of this method never changes after its first invocation. \n        This means that changes in the process affinity mask that took place after\n        this method was first invoked will not affect the number of worker threads\n        in the TBB worker threads pool. */\n    static int __TBB_EXPORTED_FUNC default_num_threads ();\n\n    //! Returns true if scheduler is active (initialized); false otherwise\n    bool is_active() const { return my_scheduler != NULL; }\n};\n\n} // namespace tbb\n\n#endif /* __TBB_task_scheduler_init_H */\n"
  },
  {
    "path": "benchmarks/tbb/task_scheduler_observer.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_task_scheduler_observer_H\n#define __TBB_task_scheduler_observer_H\n\n#include \"atomic.h\"\n#if __TBB_TASK_ARENA\n#include \"task_arena.h\"\n#endif //__TBB_TASK_ARENA\n\n#if __TBB_SCHEDULER_OBSERVER\n\nnamespace tbb {\nnamespace interface6 {\nclass task_scheduler_observer;\n}\nnamespace internal {\n\nclass observer_proxy;\nclass observer_list;\n\nclass task_scheduler_observer_v3 {\n    friend class observer_proxy;\n    friend class observer_list;\n    friend class interface6::task_scheduler_observer;\n\n    //! Pointer to the proxy holding this observer.\n    /** Observers are proxied by the scheduler to maintain persistent lists of them. **/\n    observer_proxy* my_proxy;\n\n    //! Counter preventing the observer from being destroyed while in use by the scheduler.\n    /** Valid only when observation is on. **/\n    atomic<intptr_t> my_busy_count;\n\npublic:\n    //! Enable or disable observation\n    /** For local observers the method can be used only when the current thread\n        has the task scheduler initialized or is attached to an arena.\n\n        Repeated calls with the same state are no-ops. **/\n    void __TBB_EXPORTED_METHOD observe( bool state=true );\n\n    //! Returns true if observation is enabled, false otherwise.\n    bool is_observing() const {return my_proxy!=NULL;}\n\n    //! Construct observer with observation disabled.\n    task_scheduler_observer_v3() : my_proxy(NULL) { my_busy_count.store<relaxed>(0); }\n\n    //! Entry notification\n    /** Invoked from inside observe(true) call and whenever a worker enters the arena \n        this observer is associated with. If a thread is already in the arena when\n        the observer is activated, the entry notification is called before it\n        executes the first stolen task.\n\n        Obsolete semantics. For global observers it is called by a thread before\n        the first steal since observation became enabled. **/\n    virtual void on_scheduler_entry( bool /*is_worker*/ ) {} \n\n    //! Exit notification\n    /** Invoked from inside observe(false) call and whenever a worker leaves the\n        arena this observer is associated with.\n\n        Obsolete semantics. For global observers it is called by a thread before\n        the first steal since observation became enabled. **/\n    virtual void on_scheduler_exit( bool /*is_worker*/ ) {}\n\n    //! Destructor automatically switches observation off if it is enabled.\n    virtual ~task_scheduler_observer_v3() { if(my_proxy) observe(false);}\n};\n\n} // namespace internal\n\n#if __TBB_ARENA_OBSERVER\nnamespace interface6 {\nclass task_scheduler_observer : public internal::task_scheduler_observer_v3 {\n    friend class internal::task_scheduler_observer_v3;\n    friend class internal::observer_proxy;\n    friend class internal::observer_list;\n\n    /** Negative numbers with the largest absolute value to minimize probability\n        of coincidence in case of a bug in busy count usage. **/\n    // TODO: take more high bits for version number\n    static const intptr_t v6_trait = (intptr_t)((~(uintptr_t)0 >> 1) + 1);\n\n    //! contains task_arena pointer or tag indicating local or global semantics of the observer\n    intptr_t my_context_tag;\n    enum { global_tag = 0, implicit_tag = 1 };\n\npublic:\n    //! Construct local or global observer in inactive state (observation disabled).\n    /** For a local observer entry/exit notifications are invoked whenever a worker\n        thread joins/leaves the arena of the observer's owner thread. If a thread is\n        already in the arena when the observer is activated, the entry notification is\n        called before it executes the first stolen task. **/\n    /** TODO: Obsolete.\n        Global observer semantics is obsolete as it violates master thread isolation\n        guarantees and is not composable. Thus the current default behavior of the\n        constructor is obsolete too and will be changed in one of the future versions\n        of the library. **/\n    task_scheduler_observer( bool local = false ) {\n        my_context_tag = local? implicit_tag : global_tag;\n    }\n\n#if __TBB_TASK_ARENA\n    //! Construct local observer for a given arena in inactive state (observation disabled).\n    /** entry/exit notifications are invoked whenever a thread joins/leaves arena.\n        If a thread is already in the arena when the observer is activated, the entry notification\n        is called before it executes the first stolen task. **/\n    task_scheduler_observer( task_arena & a) {\n        my_context_tag = (intptr_t)&a;\n    }\n#endif //__TBB_TASK_ARENA\n\n    /** Destructor protects instance of the observer from concurrent notification.\n       It is recommended to disable observation before destructor of a derived class starts,\n       otherwise it can lead to concurrent notification callback on partly destroyed object **/\n    virtual ~task_scheduler_observer() { if(my_proxy) observe(false); }\n\n    //! Enable or disable observation\n    /** Warning: concurrent invocations of this method are not safe.\n        Repeated calls with the same state are no-ops. **/\n    void observe( bool state=true ) {\n        if( state && !my_proxy ) {\n            __TBB_ASSERT( !my_busy_count, \"Inconsistent state of task_scheduler_observer instance\");\n            my_busy_count.store<relaxed>(v6_trait);\n        }\n        internal::task_scheduler_observer_v3::observe(state);\n    }\n\n    //! Return commands for may_sleep()\n    enum { keep_awake = false, allow_sleep = true };\n\n    //! The callback can be invoked by a worker thread before it goes to sleep.\n    /** If it returns false ('keep_awake'), the thread will keep spinning and looking for work.\n        It will not be called for master threads. **/\n    virtual bool may_sleep() { return allow_sleep; }\n};\n\n} //namespace interface6\nusing interface6::task_scheduler_observer;\n#else /*__TBB_ARENA_OBSERVER*/\ntypedef tbb::internal::task_scheduler_observer_v3 task_scheduler_observer;\n#endif /*__TBB_ARENA_OBSERVER*/\n\n} // namespace tbb\n\n#endif /* __TBB_SCHEDULER_OBSERVER */\n\n#endif /* __TBB_task_scheduler_observer_H */\n"
  },
  {
    "path": "benchmarks/tbb/task_stream.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef _TBB_task_stream_H\n#define _TBB_task_stream_H\n\n#include \"tbb/tbb_stddef.h\"\n#include <deque>\n#include <climits>\n#include \"tbb/atomic.h\" // for __TBB_Atomic*\n#include \"tbb/spin_mutex.h\"\n#include \"tbb/tbb_allocator.h\"\n#include \"scheduler_common.h\"\n#include \"tbb_misc.h\" // for FastRandom\n\nnamespace tbb {\nnamespace internal {\n\n//! Essentially, this is just a pair of a queue and a mutex to protect the queue.\n/** The reason std::pair is not used is that the code would look less clean\n    if field names were replaced with 'first' and 'second'. **/\ntemplate< typename T, typename mutex_t >\nstruct queue_and_mutex {\n    typedef std::deque< T, tbb_allocator<T> > queue_base_t;\n\n    queue_base_t my_queue;\n    mutex_t      my_mutex;\n\n    queue_and_mutex () : my_queue(), my_mutex() {}\n    ~queue_and_mutex () {}\n};\n\nconst uintptr_t one = 1;\n\ninline void set_one_bit( uintptr_t& dest, int pos ) {\n    __TBB_ASSERT( pos>=0, NULL );\n    __TBB_ASSERT( pos<32, NULL );\n    __TBB_AtomicOR( &dest, one<<pos );\n}\n\ninline void clear_one_bit( uintptr_t& dest, int pos ) {\n    __TBB_ASSERT( pos>=0, NULL );\n    __TBB_ASSERT( pos<32, NULL );\n    __TBB_AtomicAND( &dest, ~(one<<pos) );\n}\n\ninline bool is_bit_set( uintptr_t val, int pos ) {\n    __TBB_ASSERT( pos>=0, NULL );\n    __TBB_ASSERT( pos<32, NULL );\n    return (val & (one<<pos)) != 0;\n}\n\n//! The container for \"fairness-oriented\" aka \"enqueued\" tasks.\nclass task_stream : no_copy {\n    typedef queue_and_mutex <task*, spin_mutex> lane_t;\n    uintptr_t population;\n    padded<lane_t>* lanes;\n    unsigned N;\n\npublic:\n    task_stream() : population(), lanes()\n    {\n    }\n\n    void initialize( unsigned n_lanes ) {\n        const unsigned max_lanes =\n#if __TBB_MORE_FIFO_LANES\n                sizeof(population) * CHAR_BIT;\n#else\n                32;\n#endif\n        N = n_lanes>=max_lanes ? max_lanes : n_lanes>2 ? 1<<(__TBB_Log2(n_lanes-1)+1) : 2;\n        __TBB_ASSERT( N==max_lanes || N>=n_lanes && ((N-1)&N)==0, \"number of lanes miscalculated\");\n        __TBB_ASSERT( N <= sizeof(population) * CHAR_BIT, NULL );\n        lanes = new padded<lane_t>[N];\n        __TBB_ASSERT( !population, NULL );\n    }\n\n    ~task_stream() { if (lanes) delete[] lanes; }\n\n    //! Push a task into a lane.\n    void push( task* source, FastRandom& random ) {\n        // Lane selection is random. Each thread should keep a separate seed value.\n        unsigned idx;\n        for( ; ; ) {\n            idx = random.get() & (N-1);\n            spin_mutex::scoped_lock lock;\n            if( lock.try_acquire(lanes[idx].my_mutex) ) {\n                lanes[idx].my_queue.push_back(source);\n                set_one_bit( population, idx ); //TODO: avoid atomic op if the bit is already set\n                break;\n            }\n        }\n    }\n\n    //! Try finding and popping a task.\n    task* pop( unsigned& last_used_lane ) {\n        task* result = NULL;\n        // Lane selection is round-robin. Each thread should keep its last used lane.\n        unsigned idx = (last_used_lane+1)&(N-1);\n        for( ; population; idx=(idx+1)&(N-1) ) {\n            if( is_bit_set( population, idx ) ) {\n                lane_t& lane = lanes[idx];\n                spin_mutex::scoped_lock lock;\n                if( lock.try_acquire(lane.my_mutex) && !lane.my_queue.empty() ) {\n                    result = lane.my_queue.front();\n                    lane.my_queue.pop_front();\n                    if( lane.my_queue.empty() )\n                        clear_one_bit( population, idx );\n                    break;\n                }\n            }\n        }\n        last_used_lane = idx;\n        return result;\n    }\n\n    //! Checks existence of a task.\n    bool empty() {\n        return !population;\n    }\n\n    //! Destroys all remaining tasks in every lane. Returns the number of destroyed tasks.\n    /** Tasks are not executed, because it would potentially create more tasks at a late stage.\n        The scheduler is really expected to execute all tasks before task_stream destruction. */\n    intptr_t drain() {\n        intptr_t result = 0;\n        for(unsigned i=0; i<N; ++i) {\n            lane_t& lane = lanes[i];\n            spin_mutex::scoped_lock lock(lane.my_mutex);\n            for(lane_t::queue_base_t::iterator it=lane.my_queue.begin();\n                it!=lane.my_queue.end(); ++it, ++result)\n            {\n                task* t = *it;\n                tbb::task::destroy(*t);\n            }\n            lane.my_queue.clear();\n            clear_one_bit( population, i );\n        }\n        return result;\n    }\n}; // task_stream\n\n} // namespace internal\n} // namespace tbb\n\n#endif /* _TBB_task_stream_H */\n"
  },
  {
    "path": "benchmarks/tbb/tbb.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_tbb_H\n#define __TBB_tbb_H\n\n/** \n    This header bulk-includes declarations or definitions of all the functionality \n    provided by TBB (save for malloc dependent headers). \n\n    If you use only a few TBB constructs, consider including specific headers only.\n    Any header listed below can be included independently of others.\n**/\n\n#if TBB_PREVIEW_AGGREGATOR\n#include \"aggregator.h\"\n#endif\n#include \"aligned_space.h\"\n#include \"atomic.h\"\n#include \"blocked_range.h\"\n#include \"blocked_range2d.h\"\n#include \"blocked_range3d.h\"\n#include \"cache_aligned_allocator.h\"\n#include \"combinable.h\"\n#include \"concurrent_hash_map.h\"\n#if TBB_PREVIEW_CONCURRENT_LRU_CACHE\n#include \"concurrent_lru_cache.h\"\n#endif\n#include \"concurrent_priority_queue.h\"\n#include \"concurrent_queue.h\"\n#include \"concurrent_unordered_map.h\"\n#include \"concurrent_unordered_set.h\"\n#include \"concurrent_vector.h\"\n#include \"critical_section.h\"\n#include \"enumerable_thread_specific.h\"\n#include \"flow_graph.h\"\n#include \"mutex.h\"\n#include \"null_mutex.h\"\n#include \"null_rw_mutex.h\"\n#include \"parallel_do.h\"\n#include \"parallel_for.h\"\n#include \"parallel_for_each.h\"\n#include \"parallel_invoke.h\"\n#include \"parallel_reduce.h\"\n#include \"parallel_scan.h\"\n#include \"parallel_sort.h\"\n#include \"partitioner.h\"\n#include \"pipeline.h\"\n#include \"queuing_mutex.h\"\n#include \"queuing_rw_mutex.h\"\n#include \"reader_writer_lock.h\"\n#include \"recursive_mutex.h\"\n#include \"spin_mutex.h\"\n#include \"spin_rw_mutex.h\"\n#include \"task.h\"\n#include \"task_arena.h\"\n#include \"task_group.h\"\n#include \"task_scheduler_init.h\"\n#include \"task_scheduler_observer.h\"\n#include \"tbb_allocator.h\"\n#include \"tbb_exception.h\"\n#include \"tbb_thread.h\"\n#include \"tick_count.h\"\n\n#endif /* __TBB_tbb_H */\n"
  },
  {
    "path": "benchmarks/tbb/tbb_allocator.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_tbb_allocator_H\n#define __TBB_tbb_allocator_H\n\n#include \"tbb_stddef.h\"\n#include <new>\n#if __TBB_ALLOCATOR_CONSTRUCT_VARIADIC\n #include <utility> // std::forward\n#endif\n\n#if !TBB_USE_EXCEPTIONS && _MSC_VER\n    // Suppress \"C++ exception handler used, but unwind semantics are not enabled\" warning in STL headers\n    #pragma warning (push)\n    #pragma warning (disable: 4530)\n#endif\n\n#include <cstring>\n\n#if !TBB_USE_EXCEPTIONS && _MSC_VER\n    #pragma warning (pop)\n#endif\n\nnamespace tbb {\n\n//! @cond INTERNAL\nnamespace internal {\n\n    //! Deallocates memory using FreeHandler\n    /** The function uses scalable_free if scalable allocator is available and free if not*/\n    void __TBB_EXPORTED_FUNC deallocate_via_handler_v3( void *p );\n\n    //! Allocates memory using MallocHandler\n    /** The function uses scalable_malloc if scalable allocator is available and malloc if not*/\n    void* __TBB_EXPORTED_FUNC allocate_via_handler_v3( size_t n );\n\n    //! Returns true if standard malloc/free are used to work with memory.\n    bool __TBB_EXPORTED_FUNC is_malloc_used_v3();\n}\n//! @endcond\n\n#if _MSC_VER && !defined(__INTEL_COMPILER)\n    // Workaround for erroneous \"unreferenced parameter\" warning in method destroy.\n    #pragma warning (push)\n    #pragma warning (disable: 4100)\n#endif\n\n//! Meets \"allocator\" requirements of ISO C++ Standard, Section 20.1.5\n/** The class selects the best memory allocation mechanism available \n    from scalable_malloc and standard malloc.\n    The members are ordered the same way they are in section 20.4.1\n    of the ISO C++ standard.\n    @ingroup memory_allocation */\ntemplate<typename T>\nclass tbb_allocator {\npublic:\n    typedef typename internal::allocator_type<T>::value_type value_type;\n    typedef value_type* pointer;\n    typedef const value_type* const_pointer;\n    typedef value_type& reference;\n    typedef const value_type& const_reference;\n    typedef size_t size_type;\n    typedef ptrdiff_t difference_type;\n    template<typename U> struct rebind {\n        typedef tbb_allocator<U> other;\n    };\n\n    //! Specifies current allocator\n    enum malloc_type {\n        scalable, \n        standard\n    };\n\n    tbb_allocator() throw() {}\n    tbb_allocator( const tbb_allocator& ) throw() {}\n    template<typename U> tbb_allocator(const tbb_allocator<U>&) throw() {}\n\n    pointer address(reference x) const {return &x;}\n    const_pointer address(const_reference x) const {return &x;}\n    \n    //! Allocate space for n objects.\n    pointer allocate( size_type n, const void* /*hint*/ = 0) {\n        return pointer(internal::allocate_via_handler_v3( n * sizeof(value_type) ));\n    }\n\n    //! Free previously allocated block of memory.\n    void deallocate( pointer p, size_type ) {\n        internal::deallocate_via_handler_v3(p);        \n    }\n\n    //! Largest value for which method allocate might succeed.\n    size_type max_size() const throw() {\n        size_type max = static_cast<size_type>(-1) / sizeof (value_type);\n        return (max > 0 ? max : 1);\n    }\n    \n    //! Copy-construct value at location pointed to by p.\n#if __TBB_ALLOCATOR_CONSTRUCT_VARIADIC\n    template<typename U, typename... Args>\n    void construct(U *p, Args&&... args)\n        { ::new((void *)p) U(std::forward<Args>(args)...); }\n#else // __TBB_ALLOCATOR_CONSTRUCT_VARIADIC\n#if __TBB_CPP11_RVALUE_REF_PRESENT\n    void construct( pointer p, value_type&& value ) {::new((void*)(p)) value_type(std::move(value));}\n#endif\n    void construct( pointer p, const value_type& value ) {::new((void*)(p)) value_type(value);}\n#endif // __TBB_ALLOCATOR_CONSTRUCT_VARIADIC\n\n    //! Destroy value at location pointed to by p.\n    void destroy( pointer p ) {p->~value_type();}\n\n    //! Returns current allocator\n    static malloc_type allocator_type() {\n        return internal::is_malloc_used_v3() ? standard : scalable;\n    }\n};\n\n#if _MSC_VER && !defined(__INTEL_COMPILER)\n    #pragma warning (pop)\n#endif // warning 4100 is back\n\n//! Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1\n/** @ingroup memory_allocation */\ntemplate<> \nclass tbb_allocator<void> {\npublic:\n    typedef void* pointer;\n    typedef const void* const_pointer;\n    typedef void value_type;\n    template<typename U> struct rebind {\n        typedef tbb_allocator<U> other;\n    };\n};\n\ntemplate<typename T, typename U>\ninline bool operator==( const tbb_allocator<T>&, const tbb_allocator<U>& ) {return true;}\n\ntemplate<typename T, typename U>\ninline bool operator!=( const tbb_allocator<T>&, const tbb_allocator<U>& ) {return false;}\n\n//! Meets \"allocator\" requirements of ISO C++ Standard, Section 20.1.5\n/** The class is an adapter over an actual allocator that fills the allocation\n    using memset function with template argument C as the value.\n    The members are ordered the same way they are in section 20.4.1\n    of the ISO C++ standard.\n    @ingroup memory_allocation */\ntemplate <typename T, template<typename X> class Allocator = tbb_allocator>\nclass zero_allocator : public Allocator<T>\n{\npublic:\n    typedef Allocator<T> base_allocator_type;\n    typedef typename base_allocator_type::value_type value_type;\n    typedef typename base_allocator_type::pointer pointer;\n    typedef typename base_allocator_type::const_pointer const_pointer;\n    typedef typename base_allocator_type::reference reference;\n    typedef typename base_allocator_type::const_reference const_reference;\n    typedef typename base_allocator_type::size_type size_type;\n    typedef typename base_allocator_type::difference_type difference_type;\n    template<typename U> struct rebind {\n        typedef zero_allocator<U, Allocator> other;\n    };\n\n    zero_allocator() throw() { }\n    zero_allocator(const zero_allocator &a) throw() : base_allocator_type( a ) { }\n    template<typename U>\n    zero_allocator(const zero_allocator<U> &a) throw() : base_allocator_type( Allocator<U>( a ) ) { }\n\n    pointer allocate(const size_type n, const void *hint = 0 ) {\n        pointer ptr = base_allocator_type::allocate( n, hint );\n        std::memset( ptr, 0, n * sizeof(value_type) );\n        return ptr;\n    }\n};\n\n//! Analogous to std::allocator<void>, as defined in ISO C++ Standard, Section 20.4.1\n/** @ingroup memory_allocation */\ntemplate<template<typename T> class Allocator> \nclass zero_allocator<void, Allocator> : public Allocator<void> {\npublic:\n    typedef Allocator<void> base_allocator_type;\n    typedef typename base_allocator_type::value_type value_type;\n    typedef typename base_allocator_type::pointer pointer;\n    typedef typename base_allocator_type::const_pointer const_pointer;\n    template<typename U> struct rebind {\n        typedef zero_allocator<U, Allocator> other;\n    };\n};\n\ntemplate<typename T1, template<typename X1> class B1, typename T2, template<typename X2> class B2>\ninline bool operator==( const zero_allocator<T1,B1> &a, const zero_allocator<T2,B2> &b) {\n    return static_cast< B1<T1> >(a) == static_cast< B2<T2> >(b);\n}\ntemplate<typename T1, template<typename X1> class B1, typename T2, template<typename X2> class B2>\ninline bool operator!=( const zero_allocator<T1,B1> &a, const zero_allocator<T2,B2> &b) {\n    return static_cast< B1<T1> >(a) != static_cast< B2<T2> >(b);\n}\n\n} // namespace tbb \n\n#endif /* __TBB_tbb_allocator_H */\n"
  },
  {
    "path": "benchmarks/tbb/tbb_assert_impl.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n// IMPORTANT: To use assertion handling in TBB, exactly one of the TBB source files\n// should #include tbb_assert_impl.h thus instantiating assertion handling routines.\n// The intent of putting it to a separate file is to allow some tests to use it\n// as well in order to avoid dependency on the library.\n\n// include headers for required function declarations\n#include <cstdlib>\n#include <stdio.h>\n#include <string.h>\n#include <stdarg.h>\n#if _MSC_VER\n#include <crtdbg.h>\n#endif\n\n#if _MSC_VER >= 1400\n#define __TBB_EXPORTED_FUNC   __cdecl\n#else\n#define __TBB_EXPORTED_FUNC\n#endif\n\nusing namespace std;\n\n#if __TBBMALLOC_BUILD\nnamespace rml { namespace internal {\n#else\nnamespace tbb {\n#endif\n    //! Type for an assertion handler\n    typedef void(*assertion_handler_type)( const char* filename, int line, const char* expression, const char * comment );\n\n    static assertion_handler_type assertion_handler;\n\n    assertion_handler_type __TBB_EXPORTED_FUNC set_assertion_handler( assertion_handler_type new_handler ) {\n        assertion_handler_type old_handler = assertion_handler;\n        assertion_handler = new_handler;\n        return old_handler;\n    }\n\n    void __TBB_EXPORTED_FUNC assertion_failure( const char* filename, int line, const char* expression, const char* comment ) {\n        if( assertion_handler_type a = assertion_handler ) {\n            (*a)(filename,line,expression,comment);\n        } else {\n            static bool already_failed;\n            if( !already_failed ) {\n                already_failed = true;\n                fprintf( stderr, \"Assertion %s failed on line %d of file %s\\n\",\n                         expression, line, filename );\n                if( comment )\n                    fprintf( stderr, \"Detailed description: %s\\n\", comment );\n#if _MSC_VER && _DEBUG\n                if(1 == _CrtDbgReport(_CRT_ASSERT, filename, line, \"tbb_debug.dll\", \"%s\\r\\n%s\", expression, comment?comment:\"\"))\n                        _CrtDbgBreak();\n#else\n                fflush(stderr);\n                abort();\n#endif\n            }\n        }\n    }\n\n#if defined(_MSC_VER)&&_MSC_VER<1400\n#   define vsnprintf _vsnprintf\n#endif\n\n#if !__TBBMALLOC_BUILD\n    namespace internal {\n        //! Report a runtime warning.\n        void __TBB_EXPORTED_FUNC runtime_warning( const char* format, ... )\n        {\n            char str[1024]; memset(str, 0, 1024);\n            va_list args; va_start(args, format);\n            vsnprintf( str, 1024-1, format, args);\n            va_end(args);\n            fprintf( stderr, \"TBB Warning: %s\\n\", str);\n        }\n    } // namespace internal\n#endif\n\n#if __TBBMALLOC_BUILD\n}} // namespaces rml::internal\n#else\n}  // namespace tbb\n#endif\n"
  },
  {
    "path": "benchmarks/tbb/tbb_config.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_tbb_config_H\n#define __TBB_tbb_config_H\n\n/** This header is supposed to contain macro definitions and C style comments only.\n    The macros defined here are intended to control such aspects of TBB build as\n    - presence of compiler features\n    - compilation modes\n    - feature sets\n    - known compiler/platform issues\n**/\n\n/*Check which standard library we use on OS X.*/\n/*__TBB_SYMBOL is defined only while processing exported symbols list where C++ is not allowed.*/\n#if !defined(__TBB_SYMBOL) && __APPLE__\n    #include <cstddef>\n#endif\n\n// note that when ICC is in use __TBB_GCC_VERSION might not closely match GCC version on the machine\n#define __TBB_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)\n\n#if __clang__\n    /**according to clang documentation version can be vendor specific **/\n    #define __TBB_CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)\n#endif\n\n/** Preprocessor symbols to determine HW architecture **/\n\n#if _WIN32||_WIN64\n#   if defined(_M_X64)||defined(__x86_64__)  // the latter for MinGW support\n#       define __TBB_x86_64 1\n#   elif defined(_M_IA64)\n#       define __TBB_ipf 1\n#   elif defined(_M_IX86)||defined(__i386__) // the latter for MinGW support\n#       define __TBB_x86_32 1\n#   else\n#       define __TBB_generic_arch 1\n#   endif\n#else /* Assume generic Unix */\n#   if !__linux__ && !__APPLE__\n#       define __TBB_generic_os 1\n#   endif\n#   if __x86_64__\n#       define __TBB_x86_64 1\n#   elif __ia64__\n#       define __TBB_ipf 1\n#   elif __i386__||__i386  // __i386 is for Sun OS\n#       define __TBB_x86_32 1\n#   else\n#       define __TBB_generic_arch 1\n#   endif\n#endif\n\n#if __MIC__ || __MIC2__\n#define __TBB_DEFINE_MIC 1\n#endif\n\n#define __TBB_TSX_AVAILABLE  (__TBB_x86_32 || __TBB_x86_64) && !__TBB_DEFINE_MIC\n\n/** Presence of compiler features **/\n\n#if __INTEL_COMPILER == 9999 && __INTEL_COMPILER_BUILD_DATE == 20110811\n/* Intel(R) Composer XE 2011 Update 6 incorrectly sets __INTEL_COMPILER. Fix it. */\n    #undef __INTEL_COMPILER\n    #define __INTEL_COMPILER 1210\n#endif\n\n#if __TBB_GCC_VERSION >= 40400 && !defined(__INTEL_COMPILER)\n    /** warning suppression pragmas available in GCC since 4.4 **/\n    #define __TBB_GCC_WARNING_SUPPRESSION_PRESENT 1\n#endif\n\n/* Select particular features of C++11 based on compiler version.\n   ICC 12.1 (Linux), GCC 4.3 and higher, clang 2.9 and higher\n   set __GXX_EXPERIMENTAL_CXX0X__ in c++11 mode.\n\n   Compilers that mimics other compilers (ICC, clang) must be processed before\n   compilers they mimic (GCC, MSVC).\n\n   TODO: The following conditions should be extended when new compilers/runtimes\n   support added.\n */\n\n#if __INTEL_COMPILER\n    /** C++11 mode detection macros for Intel C++ compiler (enabled by -std=c++0x option):\n          __INTEL_CXX11_MODE__ for version >=13.0\n          __STDC_HOSTED__ for version >=12.0 on Windows,\n          __GXX_EXPERIMENTAL_CXX0X__ for version >=12.0 on Linux and OS X. **/\n    //  On Windows, C++11 features supported by Visual Studio 2010 and higher are enabled by default\n    #ifndef __INTEL_CXX11_MODE__\n        #define __INTEL_CXX11_MODE__ ((_MSC_VER && __STDC_HOSTED__) || __GXX_EXPERIMENTAL_CXX0X__)\n        // TODO: check if more conditions can be simplified with the above macro\n    #endif\n    #define __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT    (__INTEL_CXX11_MODE__ && __VARIADIC_TEMPLATES)\n    // Both r-value reference support in compiler and std::move/std::forward\n    // presence in C++ standard library is checked.\n    #define __TBB_CPP11_RVALUE_REF_PRESENT            ((__GXX_EXPERIMENTAL_CXX0X__ && (__TBB_GCC_VERSION >= 40300 || _LIBCPP_VERSION) || _MSC_VER >= 1600) && __INTEL_COMPILER >= 1200)\n    #if  _MSC_VER >= 1600\n        #define __TBB_EXCEPTION_PTR_PRESENT           ( __INTEL_COMPILER > 1300                                                \\\n                                                      /*ICC 12.1 Upd 10 and 13 beta Upd 2 fixed exception_ptr linking  issue*/ \\\n                                                      || (__INTEL_COMPILER == 1300 && __INTEL_COMPILER_BUILD_DATE >= 20120530) \\\n                                                      || (__INTEL_COMPILER == 1210 && __INTEL_COMPILER_BUILD_DATE >= 20120410) )\n    /** libstdc++ that comes with GCC 4.6 use C++11 features not supported by ICC 12.1.\n     *  Because of that ICC 12.1 does not support C++11 mode with with gcc 4.6 (or higher),\n     *  and therefore does not  define __GXX_EXPERIMENTAL_CXX0X__ macro **/\n    #elif __TBB_GCC_VERSION >= 40404 && __TBB_GCC_VERSION < 40600\n        #define __TBB_EXCEPTION_PTR_PRESENT           (__GXX_EXPERIMENTAL_CXX0X__ && __INTEL_COMPILER >= 1200)\n    #elif __TBB_GCC_VERSION >= 40600\n        #define __TBB_EXCEPTION_PTR_PRESENT           (__GXX_EXPERIMENTAL_CXX0X__ && __INTEL_COMPILER >= 1300)\n    #else\n        #define __TBB_EXCEPTION_PTR_PRESENT           0\n    #endif\n    #define __TBB_MAKE_EXCEPTION_PTR_PRESENT          (_MSC_VER >= 1700 || (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40600))\n    #define __TBB_STATIC_ASSERT_PRESENT               (__INTEL_CXX11_MODE__ || _MSC_VER >= 1600)\n    #define __TBB_CPP11_TUPLE_PRESENT                 (_MSC_VER >= 1600 || (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40300))\n    /**Intel C++ compiler 14.0 crashes on using __has_include. When it fixed, condition will need to be updated. **/\n    #if (__clang__ && __INTEL_COMPILER > 1400)\n        #if (__has_feature(__cxx_generalized_initializers__) && __has_include(<initializer_list>))\n            #define __TBB_INITIALIZER_LISTS_PRESENT   1\n        #endif\n    #else\n        /** TODO: when MSVC2013 is supported by Intel C++ compiler, it will be enabled silently by compiler, so rule will need to be updated.**/\n        #define __TBB_INITIALIZER_LISTS_PRESENT       __INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1400 && (_MSC_VER >= 1800 || __TBB_GCC_VERSION >= 40400 || _LIBCPP_VERSION)\n    #endif\n    \n    #define __TBB_CONSTEXPR_PRESENT                   __INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1400\n    #define __TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT  __INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1200\n    /** ICC seems to disable support of noexcept event in c++11 when compiling in compatibility mode for gcc <4.6 **/\n    #define __TBB_NOEXCEPT_PRESENT                    __INTEL_CXX11_MODE__ && __INTEL_COMPILER >= 1300 && (__TBB_GCC_VERSION >= 40600 || _LIBCPP_VERSION || _MSC_VER)\n    #define __TBB_CPP11_STD_BEGIN_END_PRESENT         (_MSC_VER >= 1700 || __GXX_EXPERIMENTAL_CXX0X__ && __INTEL_COMPILER >= 1310 && (__TBB_GCC_VERSION >= 40600 || _LIBCPP_VERSION))\n    #define __TBB_CPP11_AUTO_PRESENT                  (_MSC_VER >= 1600 || __GXX_EXPERIMENTAL_CXX0X__ && __INTEL_COMPILER >= 1210)\n    #define __TBB_CPP11_DECLTYPE_PRESENT              (_MSC_VER >= 1600 || __GXX_EXPERIMENTAL_CXX0X__ && __INTEL_COMPILER >= 1210)\n#elif __clang__\n//TODO: these options need to be rechecked\n/** on OS X* the only way to get C++11 is to use clang. For library features (e.g. exception_ptr) libc++ is also\n *  required. So there is no need to check GCC version for clang**/\n    #define __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT     (__has_feature(__cxx_variadic_templates__))\n    #define __TBB_CPP11_RVALUE_REF_PRESENT             (__has_feature(__cxx_rvalue_references__) && (__TBB_GCC_VERSION >= 40300 || _LIBCPP_VERSION))\n/** TODO: extend exception_ptr related conditions to cover libstdc++ **/\n    #define __TBB_EXCEPTION_PTR_PRESENT               (__cplusplus >= 201103L && _LIBCPP_VERSION)\n    #define __TBB_MAKE_EXCEPTION_PTR_PRESENT          (__cplusplus >= 201103L && _LIBCPP_VERSION)\n    #define __TBB_STATIC_ASSERT_PRESENT               __has_feature(__cxx_static_assert__)\n    /**Clang (preprocessor) has problems with dealing with expression having __has_include in #ifs\n     * used inside C++ code. (At least version that comes with OS X 10.8 : Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)) **/\n    #if (__GXX_EXPERIMENTAL_CXX0X__ && __has_include(<tuple>))\n        #define __TBB_CPP11_TUPLE_PRESENT             1\n    #endif\n    #if (__has_feature(__cxx_generalized_initializers__) && __has_include(<initializer_list>))\n        #define __TBB_INITIALIZER_LISTS_PRESENT       1\n    #endif\n    #define __TBB_CONSTEXPR_PRESENT                   __has_feature(__cxx_constexpr__)\n    #define __TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT  (__has_feature(__cxx_defaulted_functions__) && __has_feature(__cxx_deleted_functions__))\n    /**For some unknown reason  __has_feature(__cxx_noexcept) does not yield true for all cases. Compiler bug ? **/\n    #define __TBB_NOEXCEPT_PRESENT                    (__cplusplus >= 201103L)\n    #define __TBB_CPP11_STD_BEGIN_END_PRESENT         (__has_feature(__cxx_range_for__) && _LIBCPP_VERSION)\n    #define __TBB_CPP11_AUTO_PRESENT                  __has_feature(__cxx_auto_type__)\n    #define __TBB_CPP11_DECLTYPE_PRESENT              __has_feature(__cxx_decltype__)\n#elif __GNUC__\n    #define __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT    __GXX_EXPERIMENTAL_CXX0X__\n    #define __TBB_CPP11_RVALUE_REF_PRESENT            __GXX_EXPERIMENTAL_CXX0X__\n    /** __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 here is a substitution for _GLIBCXX_ATOMIC_BUILTINS_4, which is a prerequisite \n        for exception_ptr but cannot be used in this file because it is defined in a header, not by the compiler. \n        If the compiler has no atomic intrinsics, the C++ library should not expect those as well. **/\n    #define __TBB_EXCEPTION_PTR_PRESENT               (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40404 && __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)\n    #define __TBB_MAKE_EXCEPTION_PTR_PRESENT          (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40600)\n    #define __TBB_STATIC_ASSERT_PRESENT               (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40300)\n    #define __TBB_CPP11_TUPLE_PRESENT                 (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40300)\n    #define __TBB_INITIALIZER_LISTS_PRESENT           (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40400)\n    /** gcc seems have to support constexpr from 4.4 but tests in (test_atomic) seeming reasonable fail to compile prior 4.6**/\n    #define __TBB_CONSTEXPR_PRESENT                   (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40400)\n    #define __TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT  (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40400)\n    #define __TBB_NOEXCEPT_PRESENT                    (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40600)\n    #define __TBB_CPP11_STD_BEGIN_END_PRESENT         (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40600)\n    #define __TBB_CPP11_AUTO_PRESENT                  (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40400)\n    #define __TBB_CPP11_DECLTYPE_PRESENT              (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40400)\n#elif _MSC_VER\n    #define __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT    (_MSC_VER >= 1800)\n    #define __TBB_CPP11_RVALUE_REF_PRESENT            (_MSC_VER >= 1600)\n    #define __TBB_EXCEPTION_PTR_PRESENT               (_MSC_VER >= 1600)\n    #define __TBB_STATIC_ASSERT_PRESENT               (_MSC_VER >= 1600)\n    #define __TBB_MAKE_EXCEPTION_PTR_PRESENT          (_MSC_VER >= 1700)\n    #define __TBB_CPP11_TUPLE_PRESENT                 (_MSC_VER >= 1600)\n    #define __TBB_INITIALIZER_LISTS_PRESENT           (_MSC_VER >= 1800)\n    #define __TBB_CONSTEXPR_PRESENT                   0\n    #define __TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT  (_MSC_VER >= 1800)\n    #define __TBB_NOEXCEPT_PRESENT                    0 /*for _MSC_VER == 1800*/\n    #define __TBB_CPP11_STD_BEGIN_END_PRESENT         (_MSC_VER >= 1700)\n    #define __TBB_CPP11_AUTO_PRESENT                  (_MSC_VER >= 1600)\n    #define __TBB_CPP11_DECLTYPE_PRESENT              (_MSC_VER >= 1600)\n#else\n    #define __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT    0\n    #define __TBB_CPP11_RVALUE_REF_PRESENT            0\n    #define __TBB_EXCEPTION_PTR_PRESENT               0\n    #define __TBB_STATIC_ASSERT_PRESENT               0\n    #define __TBB_MAKE_EXCEPTION_PTR_PRESENT          0\n    #define __TBB_CPP11_TUPLE_PRESENT                 0\n    #define __TBB_INITIALIZER_LISTS_PRESENT           0\n    #define __TBB_CONSTEXPR_PRESENT                   0\n    #define __TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT  0\n    #define __TBB_NOEXCEPT_PRESENT                    0\n    #define __TBB_CPP11_STD_BEGIN_END_PRESENT         0\n    #define __TBB_CPP11_AUTO_PRESENT                  0\n    #define __TBB_CPP11_DECLTYPE_PRESENT              0\n#endif\n\n// C++11 standard library features\n\n#define __TBB_CPP11_TYPE_PROPERTIES_PRESENT      (_LIBCPP_VERSION || _MSC_VER >= 1700)\n#define __TBB_TR1_TYPE_PROPERTIES_IN_STD_PRESENT (__GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40300 || _MSC_VER >= 1600)\n//TODO: Probably more accurate way is to analyze version of stdlibc++ via__GLIBCXX__ instead of __TBB_GCC_VERSION\n#define __TBB_ALLOCATOR_TRAITS_PRESENT           (__cplusplus >= 201103L && _LIBCPP_VERSION  || _MSC_VER >= 1700 ||                                             \\\n                                                  __GXX_EXPERIMENTAL_CXX0X__ && __TBB_GCC_VERSION >= 40700 && !(__TBB_GCC_VERSION == 40700 && __TBB_DEFINE_MIC) \\\n                                                 )\n\n//TODO: not clear how exactly this macro affects exception_ptr - investigate\n// On linux ICC fails to find existing std::exception_ptr in libstdc++ without this define\n#if __INTEL_COMPILER && __GNUC__ && __TBB_EXCEPTION_PTR_PRESENT && !defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)\n    #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1\n#endif\n\n// Work around a bug in MinGW32\n#if __MINGW32__ && __TBB_EXCEPTION_PTR_PRESENT && !defined(_GLIBCXX_ATOMIC_BUILTINS_4)\n    #define _GLIBCXX_ATOMIC_BUILTINS_4\n#endif\n\n#if __GNUC__ || __SUNPRO_CC || __IBMCPP__\n    /* ICC defines __GNUC__ and so is covered */\n    #define __TBB_ATTRIBUTE_ALIGNED_PRESENT 1\n#elif _MSC_VER && (_MSC_VER >= 1300 || __INTEL_COMPILER)\n    #define __TBB_DECLSPEC_ALIGN_PRESENT 1\n#endif\n\n/* Actually ICC supports gcc __sync_* intrinsics starting 11.1,\n * but 64 bit support for 32 bit target comes in later ones*/\n/* TODO: change the version back to 4.1.2 once macro __TBB_WORD_SIZE become optional */\n#if __TBB_GCC_VERSION >= 40306 || __INTEL_COMPILER >= 1200\n    /** built-in atomics available in GCC since 4.1.2 **/\n    #define __TBB_GCC_BUILTIN_ATOMICS_PRESENT 1\n#endif\n\n#if __INTEL_COMPILER >= 1200\n    /** built-in C++11 style atomics available in ICC since 12.0 **/\n    #define __TBB_ICC_BUILTIN_ATOMICS_PRESENT 1\n#endif\n\n#define __TBB_TSX_INTRINSICS_PRESENT ((__RTM__ || _MSC_VER>=1700 || __INTEL_COMPILER>=1300) && !__TBB_DEFINE_MIC && !__ANDROID__)\n\n/** User controlled TBB features & modes **/\n\n#ifndef TBB_USE_DEBUG\n#ifdef _DEBUG\n#define TBB_USE_DEBUG _DEBUG\n#else\n#define TBB_USE_DEBUG 0\n#endif\n#endif /* TBB_USE_DEBUG */\n\n#ifndef TBB_USE_ASSERT\n#define TBB_USE_ASSERT TBB_USE_DEBUG\n#endif /* TBB_USE_ASSERT */\n\n#ifndef TBB_USE_THREADING_TOOLS\n#define TBB_USE_THREADING_TOOLS TBB_USE_DEBUG\n#endif /* TBB_USE_THREADING_TOOLS */\n\n#ifndef TBB_USE_PERFORMANCE_WARNINGS\n#ifdef TBB_PERFORMANCE_WARNINGS\n#define TBB_USE_PERFORMANCE_WARNINGS TBB_PERFORMANCE_WARNINGS\n#else\n#define TBB_USE_PERFORMANCE_WARNINGS TBB_USE_DEBUG\n#endif /* TBB_PEFORMANCE_WARNINGS */\n#endif /* TBB_USE_PERFORMANCE_WARNINGS */\n\n#if !defined(__EXCEPTIONS) && !defined(_CPPUNWIND) && !defined(__SUNPRO_CC) || defined(_XBOX)\n    #if TBB_USE_EXCEPTIONS\n        #error Compilation settings do not support exception handling. Please do not set TBB_USE_EXCEPTIONS macro or set it to 0.\n    #elif !defined(TBB_USE_EXCEPTIONS)\n        #define TBB_USE_EXCEPTIONS 0\n    #endif\n#elif !defined(TBB_USE_EXCEPTIONS)\n    #if __TBB_DEFINE_MIC\n    #define TBB_USE_EXCEPTIONS 0\n    #else\n    #define TBB_USE_EXCEPTIONS 1\n    #endif\n#elif TBB_USE_EXCEPTIONS && __TBB_DEFINE_MIC\n    #error Please do not set TBB_USE_EXCEPTIONS macro or set it to 0.\n#endif\n\n#ifndef TBB_IMPLEMENT_CPP0X\n    /** By default, use C++11 classes if available **/\n    #if __GNUC__==4 && __GNUC_MINOR__>=4 && __GXX_EXPERIMENTAL_CXX0X__\n        #define TBB_IMPLEMENT_CPP0X 0\n    #elif __clang__ && __cplusplus >= 201103L\n        //TODO: consider introducing separate macros for each file?\n        //prevent injection of corresponding tbb names into std:: namespace if native headers are present\n        #if __has_include(<thread>) || __has_include(<condition_variable>)\n            #define TBB_IMPLEMENT_CPP0X 0\n        #else\n            #define TBB_IMPLEMENT_CPP0X 1\n        #endif\n    #elif _MSC_VER>=1700\n        #define TBB_IMPLEMENT_CPP0X 0\n    #elif __STDCPP_THREADS__\n        #define TBB_IMPLEMENT_CPP0X 0\n    #else\n        #define TBB_IMPLEMENT_CPP0X 1\n    #endif\n#endif /* TBB_IMPLEMENT_CPP0X */\n\n/* TBB_USE_CAPTURED_EXCEPTION should be explicitly set to either 0 or 1, as it is used as C++ const */\n#ifndef TBB_USE_CAPTURED_EXCEPTION\n    /** IA-64 architecture pre-built TBB binaries do not support exception_ptr. **/\n    #if __TBB_EXCEPTION_PTR_PRESENT && !defined(__ia64__)\n        #define TBB_USE_CAPTURED_EXCEPTION 0\n    #else\n        #define TBB_USE_CAPTURED_EXCEPTION 1\n    #endif\n#else /* defined TBB_USE_CAPTURED_EXCEPTION */\n    #if !TBB_USE_CAPTURED_EXCEPTION && !__TBB_EXCEPTION_PTR_PRESENT\n        #error Current runtime does not support std::exception_ptr. Set TBB_USE_CAPTURED_EXCEPTION and make sure that your code is ready to catch tbb::captured_exception.\n    #endif\n#endif /* defined TBB_USE_CAPTURED_EXCEPTION */\n\n/** Check whether the request to use GCC atomics can be satisfied **/\n#if TBB_USE_GCC_BUILTINS && !__TBB_GCC_BUILTIN_ATOMICS_PRESENT\n    #error \"GCC atomic built-ins are not supported.\"\n#endif\n\n/** Internal TBB features & modes **/\n\n/** __TBB_WEAK_SYMBOLS_PRESENT denotes that the system supports the weak symbol mechanism **/\n#ifndef __TBB_WEAK_SYMBOLS_PRESENT\n#define __TBB_WEAK_SYMBOLS_PRESENT ( !_WIN32 && !__APPLE__ && !__sun && (__TBB_GCC_VERSION >= 40000 || __INTEL_COMPILER ) )\n#endif\n\n/** __TBB_DYNAMIC_LOAD_ENABLED describes the system possibility to load shared libraries at run time **/\n#ifndef __TBB_DYNAMIC_LOAD_ENABLED\n    #define __TBB_DYNAMIC_LOAD_ENABLED 1\n#endif\n\n/** __TBB_SOURCE_DIRECTLY_INCLUDED is a mode used in whitebox testing when\n    it's necessary to test internal functions not exported from TBB DLLs\n**/\n#if (_WIN32||_WIN64) && (__TBB_SOURCE_DIRECTLY_INCLUDED || TBB_USE_PREVIEW_BINARY)\n    #define __TBB_NO_IMPLICIT_LINKAGE 1\n    #define __TBBMALLOC_NO_IMPLICIT_LINKAGE 1\n#endif\n\n#ifndef __TBB_COUNT_TASK_NODES\n    #define __TBB_COUNT_TASK_NODES TBB_USE_ASSERT\n#endif\n\n#ifndef __TBB_TASK_GROUP_CONTEXT\n    #define __TBB_TASK_GROUP_CONTEXT 1\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n#ifndef __TBB_SCHEDULER_OBSERVER\n    #define __TBB_SCHEDULER_OBSERVER 1\n#endif /* __TBB_SCHEDULER_OBSERVER */\n\n#ifndef __TBB_FP_CONTEXT\n    #define __TBB_FP_CONTEXT __TBB_TASK_GROUP_CONTEXT\n#endif /* __TBB_FP_CONTEXT */\n\n#if __TBB_FP_CONTEXT && !__TBB_TASK_GROUP_CONTEXT\n    #error __TBB_FP_CONTEXT requires __TBB_TASK_GROUP_CONTEXT to be enabled\n#endif\n\n#ifndef __TBB_TASK_ARENA\n    #define __TBB_TASK_ARENA 1\n#endif /* __TBB_TASK_ARENA  */\n#if __TBB_TASK_ARENA\n    #define __TBB_RECYCLE_TO_ENQUEUE __TBB_BUILD // keep non-official\n    #if !__TBB_SCHEDULER_OBSERVER\n        #error __TBB_TASK_ARENA requires __TBB_SCHEDULER_OBSERVER to be enabled\n    #endif\n#endif /* __TBB_TASK_ARENA */\n\n#ifndef __TBB_ARENA_OBSERVER\n    #define __TBB_ARENA_OBSERVER ((__TBB_BUILD||TBB_PREVIEW_LOCAL_OBSERVER)&& __TBB_SCHEDULER_OBSERVER)\n#endif /* __TBB_ARENA_OBSERVER */\n\n#ifndef __TBB_SLEEP_PERMISSION\n    #define __TBB_SLEEP_PERMISSION ((__TBB_CPF_BUILD||TBB_PREVIEW_LOCAL_OBSERVER)&& __TBB_SCHEDULER_OBSERVER)\n#endif /* __TBB_SLEEP_PERMISSION */\n\n#if TBB_PREVIEW_FLOW_GRAPH_TRACE\n#define __TBB_NO_IMPLICIT_LINKAGE 1\n#endif /* TBB_PREVIEW_FLOW_GRAPH_TRACE */\n\n#ifndef __TBB_ITT_STRUCTURE_API\n#define __TBB_ITT_STRUCTURE_API ( !__TBB_DEFINE_MIC && (__TBB_CPF_BUILD || TBB_PREVIEW_FLOW_GRAPH_TRACE) )\n#endif\n\n#if TBB_USE_EXCEPTIONS && !__TBB_TASK_GROUP_CONTEXT\n    #error TBB_USE_EXCEPTIONS requires __TBB_TASK_GROUP_CONTEXT to be enabled\n#endif\n\n#ifndef __TBB_TASK_PRIORITY\n    #define __TBB_TASK_PRIORITY (!(__TBB_CPF_BUILD||TBB_USE_PREVIEW_BINARY)&&__TBB_TASK_GROUP_CONTEXT) // TODO: it will be enabled for CPF in the next versions\n#endif /* __TBB_TASK_PRIORITY */\n\n#if __TBB_TASK_PRIORITY && !__TBB_TASK_GROUP_CONTEXT\n    #error __TBB_TASK_PRIORITY requires __TBB_TASK_GROUP_CONTEXT to be enabled\n#endif\n\n#if TBB_PREVIEW_WAITING_FOR_WORKERS || __TBB_BUILD\n    #define __TBB_SUPPORTS_WORKERS_WAITING_IN_TERMINATE 1\n#endif\n\n#if !defined(__TBB_SURVIVE_THREAD_SWITCH) && \\\n          (_WIN32 || _WIN64 || __APPLE__ || (__linux__ && !__ANDROID__))\n    #define __TBB_SURVIVE_THREAD_SWITCH 1\n#endif /* __TBB_SURVIVE_THREAD_SWITCH */\n\n#ifndef __TBB_DEFAULT_PARTITIONER\n#if TBB_DEPRECATED\n/** Default partitioner for parallel loop templates in TBB 1.0-2.1 */\n#define __TBB_DEFAULT_PARTITIONER tbb::simple_partitioner\n#else\n/** Default partitioner for parallel loop templates since TBB 2.2 */\n#define __TBB_DEFAULT_PARTITIONER tbb::auto_partitioner\n#endif /* TBB_DEPRECATED */\n#endif /* !defined(__TBB_DEFAULT_PARTITIONER */\n\n#ifndef __TBB_USE_PROPORTIONAL_SPLIT_IN_BLOCKED_RANGES\n#define __TBB_USE_PROPORTIONAL_SPLIT_IN_BLOCKED_RANGES 1\n#endif\n\n#ifdef _VARIADIC_MAX\n#define __TBB_VARIADIC_MAX _VARIADIC_MAX\n#else\n#if _MSC_VER >= 1700\n#define __TBB_VARIADIC_MAX 5  /* current VS11 setting, may change. */\n#else\n#define __TBB_VARIADIC_MAX 10\n#endif\n#endif\n\n/** __TBB_WIN8UI_SUPPORT enables support of New Windows*8 Store Apps and limit a possibility to load\n    shared libraries at run time only from application container **/\n#if defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_APP\n    #define __TBB_WIN8UI_SUPPORT 1\n#else\n    #define __TBB_WIN8UI_SUPPORT 0\n#endif\n\n/** Macros of the form __TBB_XXX_BROKEN denote known issues that are caused by\n    the bugs in compilers, standard or OS specific libraries. They should be\n    removed as soon as the corresponding bugs are fixed or the buggy OS/compiler\n    versions go out of the support list.\n**/\n\n#if __ANDROID__ && __TBB_GCC_VERSION <= 40403 && !__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8\n    /** Necessary because on Android 8-byte CAS and F&A are not available for some processor architectures,\n        but no mandatory warning message appears from GCC 4.4.3. Instead, only a linkage error occurs when\n        these atomic operations are used (such as in unit test test_atomic.exe). **/\n    #define __TBB_GCC_64BIT_ATOMIC_BUILTINS_BROKEN 1\n#elif __TBB_x86_32 && __TBB_GCC_VERSION == 40102 && ! __GNUC_RH_RELEASE__\n    /** GCC 4.1.2 erroneously emit call to external function for 64 bit sync_ intrinsics.\n        However these functions are not defined anywhere. It seems that this problem was fixed later on\n        and RHEL got an updated version of gcc 4.1.2. **/\n    #define __TBB_GCC_64BIT_ATOMIC_BUILTINS_BROKEN 1\n#endif\n\n#if __GNUC__ && __TBB_x86_64 && __INTEL_COMPILER == 1200\n    #define __TBB_ICC_12_0_INL_ASM_FSTCW_BROKEN 1\n#endif\n\n#if _MSC_VER && __INTEL_COMPILER && (__INTEL_COMPILER<1110 || __INTEL_COMPILER==1110 && __INTEL_COMPILER_BUILD_DATE < 20091012)\n    /** Necessary to avoid ICL error (or warning in non-strict mode):\n        \"exception specification for implicitly declared virtual destructor is\n        incompatible with that of overridden one\". **/\n    #define __TBB_DEFAULT_DTOR_THROW_SPEC_BROKEN 1\n#endif\n\n#if defined(_MSC_VER) && _MSC_VER < 1500 && !defined(__INTEL_COMPILER)\n    /** VS2005 and earlier do not allow declaring template class as a friend\n        of classes defined in other namespaces. **/\n    #define __TBB_TEMPLATE_FRIENDS_BROKEN 1\n#endif\n\n//TODO: recheck for different clang versions \n#if __GLIBC__==2 && __GLIBC_MINOR__==3 ||  (__APPLE__ && ( __INTEL_COMPILER==1200 && !TBB_USE_DEBUG))\n    /** Macro controlling EH usages in TBB tests.\n        Some older versions of glibc crash when exception handling happens concurrently. **/\n    #define __TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN 1\n#else\n    #define __TBB_THROW_ACROSS_MODULE_BOUNDARY_BROKEN 0\n#endif\n\n#if (_WIN32||_WIN64) && __INTEL_COMPILER == 1110\n    /** That's a bug in Intel compiler 11.1.044/IA-32/Windows, that leads to a worker thread crash on the thread's startup. **/\n    #define __TBB_ICL_11_1_CODE_GEN_BROKEN 1\n#endif\n\n#if __clang__ || (__GNUC__==3 && __GNUC_MINOR__==3 && !defined(__INTEL_COMPILER))\n    /** Bugs with access to nested classes declared in protected area */\n    #define __TBB_PROTECTED_NESTED_CLASS_BROKEN 1\n#endif\n\n#if __MINGW32__ && __TBB_GCC_VERSION < 40200\n    /** MinGW has a bug with stack alignment for routines invoked from MS RTLs.\n        Since GCC 4.2, the bug can be worked around via a special attribute. **/\n    #define __TBB_SSE_STACK_ALIGNMENT_BROKEN 1\n#else\n    #define __TBB_SSE_STACK_ALIGNMENT_BROKEN 0\n#endif\n\n#if __GNUC__==4 && __GNUC_MINOR__==3 && __GNUC_PATCHLEVEL__==0\n    /* GCC of this version may rashly ignore control dependencies */\n    #define __TBB_GCC_OPTIMIZER_ORDERING_BROKEN 1\n#endif\n\n#if __FreeBSD__\n    /** A bug in FreeBSD 8.0 results in kernel panic when there is contention\n        on a mutex created with this attribute. **/\n    #define __TBB_PRIO_INHERIT_BROKEN 1\n\n    /** A bug in FreeBSD 8.0 results in test hanging when an exception occurs\n        during (concurrent?) object construction by means of placement new operator. **/\n    #define __TBB_PLACEMENT_NEW_EXCEPTION_SAFETY_BROKEN 1\n#endif /* __FreeBSD__ */\n\n#if (__linux__ || __APPLE__) && __i386__ && defined(__INTEL_COMPILER)\n    /** The Intel compiler for IA-32 (Linux|OS X) crashes or generates\n        incorrect code when __asm__ arguments have a cast to volatile. **/\n    #define __TBB_ICC_ASM_VOLATILE_BROKEN 1\n#endif\n\n#if !__INTEL_COMPILER && (_MSC_VER || __GNUC__==3 && __GNUC_MINOR__<=2)\n    /** Bug in GCC 3.2 and MSVC compilers that sometimes return 0 for __alignof(T)\n        when T has not yet been instantiated. **/\n    #define __TBB_ALIGNOF_NOT_INSTANTIATED_TYPES_BROKEN 1\n#endif\n\n#if __TBB_DEFINE_MIC\n    /** Main thread and user's thread have different default thread affinity masks. **/\n    #define __TBB_MAIN_THREAD_AFFINITY_BROKEN 1\n#endif\n\n#if __GXX_EXPERIMENTAL_CXX0X__ && !defined(__EXCEPTIONS) && \\\n    ((!__INTEL_COMPILER && !__clang__ && (__TBB_GCC_VERSION>=40400 && __TBB_GCC_VERSION<40600)) || \\\n     (__INTEL_COMPILER<=1400 && (__TBB_GCC_VERSION>=40400 && __TBB_GCC_VERSION<=40801)))\n/* There is an issue for specific GCC toolchain when C++11 is enabled\n   and exceptions are disabled:\n   exceprion_ptr.h/nested_exception.h use throw unconditionally.\n   GCC can ignore 'throw' since 4.6; but with ICC the issue still exists.\n */\n    #define __TBB_LIBSTDCPP_EXCEPTION_HEADERS_BROKEN 1\n#else\n    #define __TBB_LIBSTDCPP_EXCEPTION_HEADERS_BROKEN 0\n#endif\n\n#if __INTEL_COMPILER==1300 && __TBB_GCC_VERSION>=40700 && defined(__GXX_EXPERIMENTAL_CXX0X__)\n/* Some C++11 features used inside libstdc++ are not supported by Intel compiler.\n * Checking version of gcc instead of libstdc++ because\n *  - they are directly connected,\n *  - for now it is not possible to check version of any standard library in this file\n */\n    #define __TBB_ICC_13_0_CPP11_STDLIB_SUPPORT_BROKEN 1\n#else\n    #define __TBB_ICC_13_0_CPP11_STDLIB_SUPPORT_BROKEN 0\n#endif\n\n#if (__GNUC__==4 && __GNUC_MINOR__==4 ) && !defined(__INTEL_COMPILER) && !defined(__clang__)\n    /** excessive warnings related to strict aliasing rules in GCC 4.4 **/\n    #define __TBB_GCC_STRICT_ALIASING_BROKEN 1\n    /* topical remedy: #pragma GCC diagnostic ignored \"-Wstrict-aliasing\" */\n    #if !__TBB_GCC_WARNING_SUPPRESSION_PRESENT\n        #error Warning suppression is not supported, while should.\n    #endif\n#endif\n\n/*In a PIC mode some versions of GCC 4.1.2 generate incorrect inlined code for 8 byte __sync_val_compare_and_swap intrinsic */\n#if __TBB_GCC_VERSION == 40102 && __PIC__ && !defined(__INTEL_COMPILER) && !defined(__clang__)\n    #define __TBB_GCC_CAS8_BUILTIN_INLINING_BROKEN 1\n#endif\n\n#if __TBB_x86_32 && (__linux__ || __APPLE__ || _WIN32 || __sun || __ANDROID__) &&  (__INTEL_COMPILER || (__GNUC__==3 && __GNUC_MINOR__==3 ) || __SUNPRO_CC)\n    // Some compilers for IA-32 fail to provide 8-byte alignment of objects on the stack,\n    // even if the object specifies 8-byte alignment.  On such platforms, the IA-32 implementation\n    // of 64 bit atomics (e.g. atomic<long long>) use different tactics depending upon\n    // whether the object is properly aligned or not.\n    #define __TBB_FORCE_64BIT_ALIGNMENT_BROKEN 1\n#else\n    #define __TBB_FORCE_64BIT_ALIGNMENT_BROKEN 0\n#endif\n\n#if __TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT && __TBB_GCC_VERSION < 40700 && !defined(__INTEL_COMPILER) && !defined (__clang__)\n    #define __TBB_ZERO_INIT_WITH_DEFAULTED_CTOR_BROKEN 1\n#endif\n\n#if _MSC_VER && _MSC_VER <= 1800 && !__INTEL_COMPILER\n    // With MSVC, when an array is passed by const reference to a template function,\n    // constness from the function parameter may get propagated to the template parameter.\n    #define __TBB_CONST_REF_TO_ARRAY_TEMPLATE_PARAM_BROKEN 1\n#endif\n\n// A compiler bug: a disabled copy constructor prevents use of the moving constructor\n#define __TBB_IF_NO_COPY_CTOR_MOVE_SEMANTICS_BROKEN (_MSC_VER && (__INTEL_COMPILER >= 1300 && __INTEL_COMPILER <= 1310) && !__INTEL_CXX11_MODE__)\n\n// MSVC 2013 and ICC 15 seems do not generate implicit move constructor for empty derived class while should\n#define __TBB_CPP11_IMPLICIT_MOVE_MEMBERS_GENERATION_FOR_DERIVED_BROKEN  (__TBB_CPP11_RVALUE_REF_PRESENT &&  \\\n      ( !__INTEL_COMPILER && _MSC_VER && _MSC_VER <=1800 || __INTEL_COMPILER && __INTEL_COMPILER <= 1500 ))\n\n/** End of __TBB_XXX_BROKEN macro section **/\n\n#if defined(_MSC_VER) && _MSC_VER>=1500 && !defined(__INTEL_COMPILER)\n    // A macro to suppress erroneous or benign \"unreachable code\" MSVC warning (4702)\n    #define __TBB_MSVC_UNREACHABLE_CODE_IGNORED 1\n#endif\n\n#define __TBB_ATOMIC_CTORS     (__TBB_CONSTEXPR_PRESENT && __TBB_DEFAULTED_AND_DELETED_FUNC_PRESENT && (!__TBB_ZERO_INIT_WITH_DEFAULTED_CTOR_BROKEN))\n\n#define __TBB_ALLOCATOR_CONSTRUCT_VARIADIC      (__TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __TBB_CPP11_RVALUE_REF_PRESENT)\n\n#define __TBB_VARIADIC_PARALLEL_INVOKE          (TBB_PREVIEW_VARIADIC_PARALLEL_INVOKE && __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT && __TBB_CPP11_RVALUE_REF_PRESENT)\n#endif /* __TBB_tbb_config_H */\n"
  },
  {
    "path": "benchmarks/tbb/tbb_exception.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_exception_H\n#define __TBB_exception_H\n\n#include \"tbb_stddef.h\"\n\n#if !TBB_USE_EXCEPTIONS && _MSC_VER\n    // Suppress \"C++ exception handler used, but unwind semantics are not enabled\" warning in STL headers\n    #pragma warning (push)\n    #pragma warning (disable: 4530)\n#endif\n\n#include <exception>\n#include <new>    //required for bad_alloc definition, operators new\n#include <string> // required to construct std exception classes\n\n#if !TBB_USE_EXCEPTIONS && _MSC_VER\n    #pragma warning (pop)\n#endif\n\nnamespace tbb {\n\n//! Exception for concurrent containers\nclass bad_last_alloc : public std::bad_alloc {\npublic:\n    /*override*/ const char* what() const throw();\n#if __TBB_DEFAULT_DTOR_THROW_SPEC_BROKEN\n    /*override*/ ~bad_last_alloc() throw() {}\n#endif\n};\n\n//! Exception for PPL locks\nclass improper_lock : public std::exception {\npublic:\n    /*override*/ const char* what() const throw();\n};\n\n//! Exception for user-initiated abort\nclass user_abort : public std::exception {\npublic:\n    /*override*/ const char* what() const throw();\n};\n\n//! Exception for missing wait on structured_task_group\nclass missing_wait : public std::exception {\npublic:\n    /*override*/ const char* what() const throw();\n};\n\n//! Exception for repeated scheduling of the same task_handle\nclass invalid_multiple_scheduling : public std::exception {\npublic:\n    /*override*/ const char* what() const throw();\n};\n\nnamespace internal {\n//! Obsolete\nvoid __TBB_EXPORTED_FUNC throw_bad_last_alloc_exception_v4();\n\nenum exception_id {\n    eid_bad_alloc = 1,\n    eid_bad_last_alloc,\n    eid_nonpositive_step,\n    eid_out_of_range,\n    eid_segment_range_error,\n    eid_index_range_error,\n    eid_missing_wait,\n    eid_invalid_multiple_scheduling,\n    eid_improper_lock,\n    eid_possible_deadlock,\n    eid_operation_not_permitted,\n    eid_condvar_wait_failed,\n    eid_invalid_load_factor,\n    eid_reserved, // free slot for backward compatibility, can be reused.\n    eid_invalid_swap,\n    eid_reservation_length_error,\n    eid_invalid_key,\n    eid_user_abort,\n    eid_reserved1,\n#if __TBB_SUPPORTS_WORKERS_WAITING_IN_TERMINATE\n    // This id is used only inside library and only for support of CPF functionality.\n    // So, if we drop the functionality, eid_reserved1 can be safely renamed and reused.\n    eid_blocking_sch_init = eid_reserved1,\n#endif\n    eid_bad_tagged_msg_cast,\n    //! The last enumerator tracks the number of defined IDs. It must remain the last one.\n    /** When adding new IDs, place them immediately _before_ this comment (that is\n        _after_ all the existing IDs. NEVER insert new IDs between the existing ones. **/\n    eid_max\n};\n\n//! Gathers all throw operators in one place.\n/** Its purpose is to minimize code bloat that can be caused by throw operators\n    scattered in multiple places, especially in templates. **/\nvoid __TBB_EXPORTED_FUNC throw_exception_v4 ( exception_id );\n\n//! Versionless convenience wrapper for throw_exception_v4()\ninline void throw_exception ( exception_id eid ) { throw_exception_v4(eid); }\n\n} // namespace internal\n} // namespace tbb\n\n#if __TBB_TASK_GROUP_CONTEXT\n#include \"tbb_allocator.h\"\n#include <typeinfo> //for typeid\n\nnamespace tbb {\n\n//! Interface to be implemented by all exceptions TBB recognizes and propagates across the threads.\n/** If an unhandled exception of the type derived from tbb::tbb_exception is intercepted\n    by the TBB scheduler in one of the worker threads, it is delivered to and re-thrown in\n    the root thread. The root thread is the thread that has started the outermost algorithm\n    or root task sharing the same task_group_context with the guilty algorithm/task (the one\n    that threw the exception first).\n\n    Note: when documentation mentions workers with respect to exception handling,\n    masters are implied as well, because they are completely equivalent in this context.\n    Consequently a root thread can be master or worker thread.\n\n    NOTE: In case of nested algorithms or complex task hierarchies when the nested\n    levels share (explicitly or by means of implicit inheritance) the task group\n    context of the outermost level, the exception may be (re-)thrown multiple times\n    (ultimately - in each worker on each nesting level) before reaching the root\n    thread at the outermost level. IMPORTANT: if you intercept an exception derived\n    from this class on a nested level, you must re-throw it in the catch block by means\n    of the \"throw;\" operator.\n\n    TBB provides two implementations of this interface: tbb::captured_exception and\n    template class tbb::movable_exception. See their declarations for more info. **/\nclass tbb_exception : public std::exception\n{\n    /** No operator new is provided because the TBB usage model assumes dynamic\n        creation of the TBB exception objects only by means of applying move()\n        operation on an exception thrown out of TBB scheduler. **/\n    void* operator new ( size_t );\n\npublic:\n#if __clang__\n    // At -O3 or even -O2 optimization level, Clang may fully throw away an empty destructor\n    // of tbb_exception from destructors of derived classes. As a result, it does not create\n    // vtable for tbb_exception, which is a required part of TBB binary interface.\n    // Making the destructor non-empty (with just a semicolon) prevents that optimization.\n    ~tbb_exception() throw() { /* keep the semicolon! */ ; }\n#endif\n\n    //! Creates and returns pointer to the deep copy of this exception object.\n    /** Move semantics is allowed. **/\n    virtual tbb_exception* move () throw() = 0;\n\n    //! Destroys objects created by the move() method.\n    /** Frees memory and calls destructor for this exception object.\n        Can and must be used only on objects created by the move method. **/\n    virtual void destroy () throw() = 0;\n\n    //! Throws this exception object.\n    /** Make sure that if you have several levels of derivation from this interface\n        you implement or override this method on the most derived level. The implementation\n        is as simple as \"throw *this;\". Failure to do this will result in exception\n        of a base class type being thrown. **/\n    virtual void throw_self () = 0;\n\n    //! Returns RTTI name of the originally intercepted exception\n    virtual const char* name() const throw() = 0;\n\n    //! Returns the result of originally intercepted exception's what() method.\n    virtual const char* what() const throw() = 0;\n\n    /** Operator delete is provided only to allow using existing smart pointers\n        with TBB exception objects obtained as the result of applying move()\n        operation on an exception thrown out of TBB scheduler.\n\n        When overriding method move() make sure to override operator delete as well\n        if memory is allocated not by TBB's scalable allocator. **/\n    void operator delete ( void* p ) {\n        internal::deallocate_via_handler_v3(p);\n    }\n};\n\n//! This class is used by TBB to propagate information about unhandled exceptions into the root thread.\n/** Exception of this type is thrown by TBB in the root thread (thread that started a parallel\n    algorithm ) if an unhandled exception was intercepted during the algorithm execution in one\n    of the workers.\n    \\sa tbb::tbb_exception **/\nclass captured_exception : public tbb_exception\n{\npublic:\n    captured_exception ( const captured_exception& src )\n        : tbb_exception(src), my_dynamic(false)\n    {\n        set(src.my_exception_name, src.my_exception_info);\n    }\n\n    captured_exception ( const char* name_, const char* info )\n        : my_dynamic(false)\n    {\n        set(name_, info);\n    }\n\n    __TBB_EXPORTED_METHOD ~captured_exception () throw();\n\n    captured_exception& operator= ( const captured_exception& src ) {\n        if ( this != &src ) {\n            clear();\n            set(src.my_exception_name, src.my_exception_info);\n        }\n        return *this;\n    }\n\n    /*override*/\n    captured_exception* __TBB_EXPORTED_METHOD move () throw();\n\n    /*override*/\n    void __TBB_EXPORTED_METHOD destroy () throw();\n\n    /*override*/\n    void throw_self () { __TBB_THROW(*this); }\n\n    /*override*/\n    const char* __TBB_EXPORTED_METHOD name() const throw();\n\n    /*override*/\n    const char* __TBB_EXPORTED_METHOD what() const throw();\n\n    void __TBB_EXPORTED_METHOD set ( const char* name, const char* info ) throw();\n    void __TBB_EXPORTED_METHOD clear () throw();\n\nprivate:\n    //! Used only by method clone().\n    captured_exception() {}\n\n    //! Functionally equivalent to {captured_exception e(name,info); return e.clone();}\n    static captured_exception* allocate ( const char* name, const char* info );\n\n    bool my_dynamic;\n    const char* my_exception_name;\n    const char* my_exception_info;\n};\n\n//! Template that can be used to implement exception that transfers arbitrary ExceptionData to the root thread\n/** Code using TBB can instantiate this template with an arbitrary ExceptionData type\n    and throw this exception object. Such exceptions are intercepted by the TBB scheduler\n    and delivered to the root thread ().\n    \\sa tbb::tbb_exception **/\ntemplate<typename ExceptionData>\nclass movable_exception : public tbb_exception\n{\n    typedef movable_exception<ExceptionData> self_type;\n\npublic:\n    movable_exception ( const ExceptionData& data_ )\n        : my_exception_data(data_)\n        , my_dynamic(false)\n        , my_exception_name(\n#if TBB_USE_EXCEPTIONS\n        typeid(self_type).name()\n#else /* !TBB_USE_EXCEPTIONS */\n        \"movable_exception\"\n#endif /* !TBB_USE_EXCEPTIONS */\n        )\n    {}\n\n    movable_exception ( const movable_exception& src ) throw ()\n        : tbb_exception(src)\n        , my_exception_data(src.my_exception_data)\n        , my_dynamic(false)\n        , my_exception_name(src.my_exception_name)\n    {}\n\n    ~movable_exception () throw() {}\n\n    const movable_exception& operator= ( const movable_exception& src ) {\n        if ( this != &src ) {\n            my_exception_data = src.my_exception_data;\n            my_exception_name = src.my_exception_name;\n        }\n        return *this;\n    }\n\n    ExceptionData& data () throw() { return my_exception_data; }\n\n    const ExceptionData& data () const throw() { return my_exception_data; }\n\n    /*override*/ const char* name () const throw() { return my_exception_name; }\n\n    /*override*/ const char* what () const throw() { return \"tbb::movable_exception\"; }\n\n    /*override*/\n    movable_exception* move () throw() {\n        void* e = internal::allocate_via_handler_v3(sizeof(movable_exception));\n        if ( e ) {\n            ::new (e) movable_exception(*this);\n            ((movable_exception*)e)->my_dynamic = true;\n        }\n        return (movable_exception*)e;\n    }\n    /*override*/\n    void destroy () throw() {\n        __TBB_ASSERT ( my_dynamic, \"Method destroy can be called only on dynamically allocated movable_exceptions\" );\n        if ( my_dynamic ) {\n            this->~movable_exception();\n            internal::deallocate_via_handler_v3(this);\n        }\n    }\n    /*override*/\n    void throw_self () { __TBB_THROW( *this ); }\n\nprotected:\n    //! User data\n    ExceptionData  my_exception_data;\n\nprivate:\n    //! Flag specifying whether this object has been dynamically allocated (by the move method)\n    bool my_dynamic;\n\n    //! RTTI name of this class\n    /** We rely on the fact that RTTI names are static string constants. **/\n    const char* my_exception_name;\n};\n\n#if !TBB_USE_CAPTURED_EXCEPTION\nnamespace internal {\n\n//! Exception container that preserves the exact copy of the original exception\n/** This class can be used only when the appropriate runtime support (mandated\n    by C++0x) is present **/\nclass tbb_exception_ptr {\n    std::exception_ptr  my_ptr;\n\npublic:\n    static tbb_exception_ptr* allocate ();\n    static tbb_exception_ptr* allocate ( const tbb_exception& tag );\n    //! This overload uses move semantics (i.e. it empties src)\n    static tbb_exception_ptr* allocate ( captured_exception& src );\n\n    //! Destroys this objects\n    /** Note that objects of this type can be created only by the allocate() method. **/\n    void destroy () throw();\n\n    //! Throws the contained exception .\n    void throw_self () { std::rethrow_exception(my_ptr); }\n\nprivate:\n    tbb_exception_ptr ( const std::exception_ptr& src ) : my_ptr(src) {}\n    tbb_exception_ptr ( const captured_exception& src ) :\n        #if __TBB_MAKE_EXCEPTION_PTR_PRESENT\n            my_ptr(std::make_exception_ptr(src))  // the final function name in C++11\n        #else\n            my_ptr(std::copy_exception(src))      // early C++0x drafts name\n        #endif\n    {}\n}; // class tbb::internal::tbb_exception_ptr\n\n} // namespace internal\n#endif /* !TBB_USE_CAPTURED_EXCEPTION */\n\n} // namespace tbb\n\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n#endif /* __TBB_exception_H */\n"
  },
  {
    "path": "benchmarks/tbb/tbb_machine.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_machine_H\n#define __TBB_machine_H\n\n/** This header provides basic platform abstraction layer by hooking up appropriate\n    architecture/OS/compiler specific headers from the /include/tbb/machine directory.\n    If a plug-in header does not implement all the required APIs, it must specify\n    the missing ones by setting one or more of the following macros:\n\n    __TBB_USE_GENERIC_PART_WORD_CAS\n    __TBB_USE_GENERIC_PART_WORD_FETCH_ADD\n    __TBB_USE_GENERIC_PART_WORD_FETCH_STORE\n    __TBB_USE_GENERIC_FETCH_ADD\n    __TBB_USE_GENERIC_FETCH_STORE\n    __TBB_USE_GENERIC_DWORD_FETCH_ADD\n    __TBB_USE_GENERIC_DWORD_FETCH_STORE\n    __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE\n    __TBB_USE_GENERIC_FULL_FENCED_LOAD_STORE\n    __TBB_USE_GENERIC_RELAXED_LOAD_STORE\n    __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE\n\n    In this case tbb_machine.h will add missing functionality based on a minimal set \n    of APIs that are required to be implemented by all plug-n headers as described\n    further.\n    Note that these generic implementations may be sub-optimal for a particular\n    architecture, and thus should be relied upon only after careful evaluation\n    or as the last resort.\n\n    Additionally __TBB_64BIT_ATOMICS can be set to 0 on a 32-bit architecture to\n    indicate that the port is not going to support double word atomics. It may also\n    be set to 1 explicitly, though normally this is not necessary as tbb_machine.h\n    will set it automatically.\n\n    __TBB_ENDIANNESS macro can be defined by the implementation as well.\n    It is used only if __TBB_USE_GENERIC_PART_WORD_CAS is set (or for testing),\n    and must specify the layout of aligned 16-bit and 32-bit data anywhere within a process\n    (while the details of unaligned 16-bit or 32-bit data or of 64-bit data are irrelevant).\n    The layout must be the same at all relevant memory locations within the current process;\n    in case of page-specific endianness, one endianness must be kept \"out of sight\".\n    Possible settings, reflecting hardware and possibly O.S. convention, are:\n    -  __TBB_ENDIAN_BIG for big-endian data,\n    -  __TBB_ENDIAN_LITTLE for little-endian data,\n    -  __TBB_ENDIAN_DETECT for run-time detection iff exactly one of the above,\n    -  __TBB_ENDIAN_UNSUPPORTED to prevent undefined behavior if none of the above.\n\n    Prerequisites for each architecture port\n    ----------------------------------------\n    The following functions and macros have no generic implementation. Therefore they must be\n    implemented in each machine architecture specific header either as a conventional\n    function or as a functional macro.\n\n    __TBB_WORDSIZE\n        This is the size of machine word in bytes, i.e. for 32 bit systems it\n        should be defined to 4.\n\n    __TBB_Yield()\n        Signals OS that the current thread is willing to relinquish the remainder\n        of its time quantum.\n\n    __TBB_full_memory_fence()\n        Must prevent all memory operations from being reordered across it (both\n        by hardware and compiler). All such fences must be totally ordered (or\n        sequentially consistent).\n\n    __TBB_machine_cmpswp4( volatile void *ptr, int32_t value, int32_t comparand )\n        Must be provided if __TBB_USE_FENCED_ATOMICS is not set.\n\n    __TBB_machine_cmpswp8( volatile void *ptr, int32_t value, int64_t comparand )\n        Must be provided for 64-bit architectures if __TBB_USE_FENCED_ATOMICS is not set,\n        and for 32-bit architectures if __TBB_64BIT_ATOMICS is set\n\n    __TBB_machine_<op><S><fence>(...), where\n        <op> = {cmpswp, fetchadd, fetchstore}\n        <S> = {1, 2, 4, 8}\n        <fence> = {full_fence, acquire, release, relaxed}\n        Must be provided if __TBB_USE_FENCED_ATOMICS is set.\n\n    __TBB_control_consistency_helper()\n        Bridges the memory-semantics gap between architectures providing only\n        implicit C++0x \"consume\" semantics (like Power Architecture) and those\n        also implicitly obeying control dependencies (like IA-64 architecture).\n        It must be used only in conditional code where the condition is itself\n        data-dependent, and will then make subsequent code behave as if the\n        original data dependency were acquired.\n        It needs only a compiler fence where implied by the architecture\n        either specifically (like IA-64 architecture) or because generally stronger \n        \"acquire\" semantics are enforced (like x86).\n        It is always valid, though potentially suboptimal, to replace\n        control with acquire on the load and then remove the helper.\n\n    __TBB_acquire_consistency_helper(), __TBB_release_consistency_helper()\n        Must be provided if __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE is set.\n        Enforce acquire and release semantics in generic implementations of fenced\n        store and load operations. Depending on the particular architecture/compiler\n        combination they may be a hardware fence, a compiler fence, both or nothing.\n **/\n\n#include \"tbb_stddef.h\"\n\nnamespace tbb {\nnamespace internal { //< @cond INTERNAL\n\n////////////////////////////////////////////////////////////////////////////////\n// Overridable helpers declarations\n//\n// A machine/*.h file may choose to define these templates, otherwise it must\n// request default implementation by setting appropriate __TBB_USE_GENERIC_XXX macro(s).\n//\ntemplate <typename T, std::size_t S>\nstruct machine_load_store;\n\ntemplate <typename T, std::size_t S>\nstruct machine_load_store_relaxed;\n\ntemplate <typename T, std::size_t S>\nstruct machine_load_store_seq_cst;\n//\n// End of overridable helpers declarations\n////////////////////////////////////////////////////////////////////////////////\n\ntemplate<size_t S> struct atomic_selector;\n\ntemplate<> struct atomic_selector<1> {\n    typedef int8_t word;\n    inline static word fetch_store ( volatile void* location, word value );\n};\n\ntemplate<> struct atomic_selector<2> {\n    typedef int16_t word;\n    inline static word fetch_store ( volatile void* location, word value );\n};\n\ntemplate<> struct atomic_selector<4> {\n#if _MSC_VER && !_WIN64\n    // Work-around that avoids spurious /Wp64 warnings\n    typedef intptr_t word;\n#else\n    typedef int32_t word;\n#endif\n    inline static word fetch_store ( volatile void* location, word value );\n};\n\ntemplate<> struct atomic_selector<8> {\n    typedef int64_t word;\n    inline static word fetch_store ( volatile void* location, word value );\n};\n\n}} //< namespaces internal @endcond, tbb\n\n#define __TBB_MACHINE_DEFINE_STORE8_GENERIC_FENCED(M)                                        \\\n    inline void __TBB_machine_generic_store8##M(volatile void *ptr, int64_t value) {         \\\n        for(;;) {                                                                            \\\n            int64_t result = *(volatile int64_t *)ptr;                                       \\\n            if( __TBB_machine_cmpswp8##M(ptr,value,result)==result ) break;                  \\\n        }                                                                                    \\\n    }                                                                                        \\\n\n#define __TBB_MACHINE_DEFINE_LOAD8_GENERIC_FENCED(M)                                         \\\n    inline int64_t __TBB_machine_generic_load8##M(const volatile void *ptr) {                \\\n        /* Comparand and new value may be anything, they only must be equal, and      */     \\\n        /* the value should have a low probability to be actually found in 'location'.*/     \\\n        const int64_t anyvalue = 2305843009213693951LL;                                      \\\n        return __TBB_machine_cmpswp8##M(const_cast<volatile void *>(ptr),anyvalue,anyvalue); \\\n    }                                                                                        \\\n\n// The set of allowed values for __TBB_ENDIANNESS (see above for details)\n#define __TBB_ENDIAN_UNSUPPORTED -1\n#define __TBB_ENDIAN_LITTLE       0\n#define __TBB_ENDIAN_BIG          1\n#define __TBB_ENDIAN_DETECT       2\n\n#if _WIN32||_WIN64\n\n#ifdef _MANAGED\n#pragma managed(push, off)\n#endif\n\n    #if __MINGW64__ || __MINGW32__\n        extern \"C\" __declspec(dllimport) int __stdcall SwitchToThread( void );\n        #define __TBB_Yield()  SwitchToThread()\n        #if (TBB_USE_GCC_BUILTINS && __TBB_GCC_BUILTIN_ATOMICS_PRESENT)\n            #include \"machine/gcc_generic.h\"\n        #elif __MINGW64__\n            #include \"machine/linux_intel64.h\"\n        #elif __MINGW32__\n            #include \"machine/linux_ia32.h\"\n        #endif\n    #elif (TBB_USE_ICC_BUILTINS && __TBB_ICC_BUILTIN_ATOMICS_PRESENT)\n        #include \"machine/icc_generic.h\"\n    #elif defined(_M_IX86) && !defined(__TBB_WIN32_USE_CL_BUILTINS)\n        #include \"machine/windows_ia32.h\"\n    #elif defined(_M_X64) \n        #include \"machine/windows_intel64.h\"\n    #elif defined(_XBOX)\n        #include \"machine/xbox360_ppc.h\"\n    #elif defined(_M_ARM) || defined(__TBB_WIN32_USE_CL_BUILTINS)\n        #include \"machine/msvc_armv7.h\"\n    #endif\n\n#ifdef _MANAGED\n#pragma managed(pop)\n#endif\n\n#elif __TBB_DEFINE_MIC\n\n    #include \"machine/mic_common.h\"\n    #if (TBB_USE_ICC_BUILTINS && __TBB_ICC_BUILTIN_ATOMICS_PRESENT)\n        #include \"machine/icc_generic.h\"\n    #else\n        #include \"machine/linux_intel64.h\"\n    #endif\n\n#elif __linux__ || __FreeBSD__ || __NetBSD__\n\n    #if (TBB_USE_GCC_BUILTINS && __TBB_GCC_BUILTIN_ATOMICS_PRESENT)\n        #include \"machine/gcc_generic.h\"\n    #elif (TBB_USE_ICC_BUILTINS && __TBB_ICC_BUILTIN_ATOMICS_PRESENT)\n        #include \"machine/icc_generic.h\"\n    #elif __i386__\n        #include \"machine/linux_ia32.h\"\n    #elif __x86_64__\n        #include \"machine/linux_intel64.h\"\n    #elif __ia64__\n        #include \"machine/linux_ia64.h\"\n    #elif __powerpc__\n        #include \"machine/mac_ppc.h\"\n    #elif __arm__\n        #include \"machine/gcc_armv7.h\"\n    #elif __TBB_GCC_BUILTIN_ATOMICS_PRESENT\n        #include \"machine/gcc_generic.h\"\n    #endif\n    #include \"machine/linux_common.h\"\n\n#elif __APPLE__\n    //TODO:  TBB_USE_GCC_BUILTINS is not used for Mac, Sun, Aix\n    #if (TBB_USE_ICC_BUILTINS && __TBB_ICC_BUILTIN_ATOMICS_PRESENT)\n        #include \"machine/icc_generic.h\"\n    #elif __i386__\n        #include \"machine/linux_ia32.h\"\n    #elif __x86_64__\n        #include \"machine/linux_intel64.h\"\n    #elif __POWERPC__\n        #include \"machine/mac_ppc.h\"\n    #endif\n    #include \"machine/macos_common.h\"\n\n#elif _AIX\n\n    #include \"machine/ibm_aix51.h\"\n\n#elif __sun || __SUNPRO_CC\n\n    #define __asm__ asm\n    #define __volatile__ volatile\n\n    #if __i386  || __i386__\n        #include \"machine/linux_ia32.h\"\n    #elif __x86_64__\n        #include \"machine/linux_intel64.h\"\n    #elif __sparc\n        #include \"machine/sunos_sparc.h\"\n    #endif\n    #include <sched.h>\n\n    #define __TBB_Yield() sched_yield()\n\n#endif /* OS selection */\n\n#ifndef __TBB_64BIT_ATOMICS\n    #define __TBB_64BIT_ATOMICS 1\n#endif\n\n//TODO: replace usage of these functions with usage of tbb::atomic, and then remove them\n//TODO: map functions with W suffix to use cast to tbb::atomic and according op, i.e. as_atomic().op()\n// Special atomic functions\n#if __TBB_USE_FENCED_ATOMICS\n    #define __TBB_machine_cmpswp1   __TBB_machine_cmpswp1full_fence\n    #define __TBB_machine_cmpswp2   __TBB_machine_cmpswp2full_fence\n    #define __TBB_machine_cmpswp4   __TBB_machine_cmpswp4full_fence\n    #define __TBB_machine_cmpswp8   __TBB_machine_cmpswp8full_fence\n\n    #if __TBB_WORDSIZE==8\n        #define __TBB_machine_fetchadd8             __TBB_machine_fetchadd8full_fence\n        #define __TBB_machine_fetchstore8           __TBB_machine_fetchstore8full_fence\n        #define __TBB_FetchAndAddWrelease(P,V)      __TBB_machine_fetchadd8release(P,V)\n        #define __TBB_FetchAndIncrementWacquire(P)  __TBB_machine_fetchadd8acquire(P,1)\n        #define __TBB_FetchAndDecrementWrelease(P)  __TBB_machine_fetchadd8release(P,(-1))\n    #else\n        #define __TBB_machine_fetchadd4             __TBB_machine_fetchadd4full_fence\n        #define __TBB_machine_fetchstore4           __TBB_machine_fetchstore4full_fence\n        #define __TBB_FetchAndAddWrelease(P,V)      __TBB_machine_fetchadd4release(P,V)\n        #define __TBB_FetchAndIncrementWacquire(P)  __TBB_machine_fetchadd4acquire(P,1)\n        #define __TBB_FetchAndDecrementWrelease(P)  __TBB_machine_fetchadd4release(P,(-1))\n    #endif /* __TBB_WORDSIZE==4 */\n#else /* !__TBB_USE_FENCED_ATOMICS */\n    #define __TBB_FetchAndAddWrelease(P,V)      __TBB_FetchAndAddW(P,V)\n    #define __TBB_FetchAndIncrementWacquire(P)  __TBB_FetchAndAddW(P,1)\n    #define __TBB_FetchAndDecrementWrelease(P)  __TBB_FetchAndAddW(P,(-1))\n#endif /* !__TBB_USE_FENCED_ATOMICS */\n\n#if __TBB_WORDSIZE==4\n    #define __TBB_CompareAndSwapW(P,V,C)    __TBB_machine_cmpswp4(P,V,C)\n    #define __TBB_FetchAndAddW(P,V)         __TBB_machine_fetchadd4(P,V)\n    #define __TBB_FetchAndStoreW(P,V)       __TBB_machine_fetchstore4(P,V)\n#elif  __TBB_WORDSIZE==8\n    #if __TBB_USE_GENERIC_DWORD_LOAD_STORE || __TBB_USE_GENERIC_DWORD_FETCH_ADD || __TBB_USE_GENERIC_DWORD_FETCH_STORE\n        #error These macros should only be used on 32-bit platforms.\n    #endif\n\n    #define __TBB_CompareAndSwapW(P,V,C)    __TBB_machine_cmpswp8(P,V,C)\n    #define __TBB_FetchAndAddW(P,V)         __TBB_machine_fetchadd8(P,V)\n    #define __TBB_FetchAndStoreW(P,V)       __TBB_machine_fetchstore8(P,V)\n#else /* __TBB_WORDSIZE != 8 */\n    #error Unsupported machine word size.\n#endif /* __TBB_WORDSIZE */\n\n#ifndef __TBB_Pause\n    inline void __TBB_Pause(int32_t) {\n        __TBB_Yield();\n    }\n#endif\n\nnamespace tbb {\n\n//! Sequentially consistent full memory fence.\ninline void atomic_fence () { __TBB_full_memory_fence(); }\n\nnamespace internal { //< @cond INTERNAL\n\n//! Class that implements exponential backoff.\n/** See implementation of spin_wait_while_eq for an example. */\nclass atomic_backoff : no_copy {\n    //! Time delay, in units of \"pause\" instructions.\n    /** Should be equal to approximately the number of \"pause\" instructions\n        that take the same time as an context switch. */\n    static const int32_t LOOPS_BEFORE_YIELD = 16;\n    int32_t count;\npublic:\n    // In many cases, an object of this type is initialized eagerly on hot path,\n    // as in for(atomic_backoff b; ; b.pause()) { /*loop body*/ }\n    // For this reason, the construction cost must be very small!\n    atomic_backoff() : count(1) {}\n    // This constructor pauses immediately; do not use on hot paths!\n    atomic_backoff( bool ) : count(1) { pause(); }\n\n    //! Pause for a while.\n    void pause() {\n        if( count<=LOOPS_BEFORE_YIELD ) {\n            __TBB_Pause(count);\n            // Pause twice as long the next time.\n            count*=2;\n        } else {\n            // Pause is so long that we might as well yield CPU to scheduler.\n            __TBB_Yield();\n        }\n    }\n\n    // pause for a few times and then return false immediately.\n    bool bounded_pause() {\n        if( count<=LOOPS_BEFORE_YIELD ) {\n            __TBB_Pause(count);\n            // Pause twice as long the next time.\n            count*=2;\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    void reset() {\n        count = 1;\n    }\n};\n\n//! Spin WHILE the value of the variable is equal to a given value\n/** T and U should be comparable types. */\ntemplate<typename T, typename U>\nvoid spin_wait_while_eq( const volatile T& location, U value ) {\n    atomic_backoff backoff;\n    while( location==value ) backoff.pause();\n}\n\n//! Spin UNTIL the value of the variable is equal to a given value\n/** T and U should be comparable types. */\ntemplate<typename T, typename U>\nvoid spin_wait_until_eq( const volatile T& location, const U value ) {\n    atomic_backoff backoff;\n    while( location!=value ) backoff.pause();\n}\n\ntemplate <typename predicate_type>\nvoid spin_wait_while(predicate_type condition){\n    atomic_backoff backoff;\n    while( condition() ) backoff.pause();\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Generic compare-and-swap applied to only a part of a machine word.\n//\n#ifndef __TBB_ENDIANNESS\n#define __TBB_ENDIANNESS __TBB_ENDIAN_DETECT\n#endif\n\n#if __TBB_USE_GENERIC_PART_WORD_CAS && __TBB_ENDIANNESS==__TBB_ENDIAN_UNSUPPORTED\n#error Generic implementation of part-word CAS may not be used with __TBB_ENDIAN_UNSUPPORTED\n#endif\n\n#if __TBB_ENDIANNESS!=__TBB_ENDIAN_UNSUPPORTED\n//\n// This function is the only use of __TBB_ENDIANNESS.\n// The following restrictions/limitations apply for this operation:\n//  - T must be an integer type of at most 4 bytes for the casts and calculations to work\n//  - T must also be less than 4 bytes to avoid compiler warnings when computing mask\n//      (and for the operation to be useful at all, so no workaround is applied)\n//  - the architecture must consistently use either little-endian or big-endian (same for all locations)\n//\n// TODO: static_assert for the type requirements stated above\ntemplate<typename T>\ninline T __TBB_MaskedCompareAndSwap (volatile T * const ptr, const T value, const T comparand ) {\n    struct endianness{ static bool is_big_endian(){\n        #if __TBB_ENDIANNESS==__TBB_ENDIAN_DETECT\n            const uint32_t probe = 0x03020100;\n            return (((const char*)(&probe))[0]==0x03);\n        #elif __TBB_ENDIANNESS==__TBB_ENDIAN_BIG || __TBB_ENDIANNESS==__TBB_ENDIAN_LITTLE\n            return __TBB_ENDIANNESS==__TBB_ENDIAN_BIG;\n        #else\n            #error Unexpected value of __TBB_ENDIANNESS\n        #endif\n    }};\n\n    const uint32_t byte_offset            = (uint32_t) ((uintptr_t)ptr & 0x3);\n    volatile uint32_t * const aligned_ptr = (uint32_t*)((uintptr_t)ptr - byte_offset );\n\n    // location of T within uint32_t for a C++ shift operation\n    const uint32_t bits_to_shift     = 8*(endianness::is_big_endian() ? (4 - sizeof(T) - (byte_offset)) : byte_offset);\n    const uint32_t mask              = (((uint32_t)1<<(sizeof(T)*8)) - 1 )<<bits_to_shift;\n    // for signed T, any sign extension bits in cast value/comparand are immediately clipped by mask\n    const uint32_t shifted_comparand = ((uint32_t)comparand << bits_to_shift)&mask;\n    const uint32_t shifted_value     = ((uint32_t)value     << bits_to_shift)&mask;\n\n    for( atomic_backoff b;;b.pause() ) {\n        const uint32_t surroundings  = *aligned_ptr & ~mask ; // may have changed during the pause\n        const uint32_t big_comparand = surroundings | shifted_comparand ;\n        const uint32_t big_value     = surroundings | shifted_value     ;\n        // __TBB_machine_cmpswp4 presumed to have full fence.\n        // Cast shuts up /Wp64 warning\n        const uint32_t big_result = (uint32_t)__TBB_machine_cmpswp4( aligned_ptr, big_value, big_comparand );\n        if( big_result == big_comparand                    // CAS succeeded\n          || ((big_result ^ big_comparand) & mask) != 0)   // CAS failed and the bits of interest have changed\n        {\n            return T((big_result & mask) >> bits_to_shift);\n        }\n        else continue;                                     // CAS failed but the bits of interest were not changed\n    }\n}\n#endif // __TBB_ENDIANNESS!=__TBB_ENDIAN_UNSUPPORTED\n////////////////////////////////////////////////////////////////////////////////\n\ntemplate<size_t S, typename T>\ninline T __TBB_CompareAndSwapGeneric (volatile void *ptr, T value, T comparand );\n\ntemplate<>\ninline int8_t __TBB_CompareAndSwapGeneric <1,int8_t> (volatile void *ptr, int8_t value, int8_t comparand ) {\n#if __TBB_USE_GENERIC_PART_WORD_CAS\n    return __TBB_MaskedCompareAndSwap<int8_t>((volatile int8_t *)ptr,value,comparand);\n#else\n    return __TBB_machine_cmpswp1(ptr,value,comparand);\n#endif\n}\n\ntemplate<>\ninline int16_t __TBB_CompareAndSwapGeneric <2,int16_t> (volatile void *ptr, int16_t value, int16_t comparand ) {\n#if __TBB_USE_GENERIC_PART_WORD_CAS\n    return __TBB_MaskedCompareAndSwap<int16_t>((volatile int16_t *)ptr,value,comparand);\n#else\n    return __TBB_machine_cmpswp2(ptr,value,comparand);\n#endif\n}\n\ntemplate<>\ninline int32_t __TBB_CompareAndSwapGeneric <4,int32_t> (volatile void *ptr, int32_t value, int32_t comparand ) {\n    // Cast shuts up /Wp64 warning\n    return (int32_t)__TBB_machine_cmpswp4(ptr,value,comparand);\n}\n\n#if __TBB_64BIT_ATOMICS\ntemplate<>\ninline int64_t __TBB_CompareAndSwapGeneric <8,int64_t> (volatile void *ptr, int64_t value, int64_t comparand ) {\n    return __TBB_machine_cmpswp8(ptr,value,comparand);\n}\n#endif\n\ntemplate<size_t S, typename T>\ninline T __TBB_FetchAndAddGeneric (volatile void *ptr, T addend) {\n    T result;\n    for( atomic_backoff b;;b.pause() ) {\n        result = *reinterpret_cast<volatile T *>(ptr);\n        // __TBB_CompareAndSwapGeneric presumed to have full fence.\n        if( __TBB_CompareAndSwapGeneric<S,T> ( ptr, result+addend, result )==result )\n            break;\n    }\n    return result;\n}\n\ntemplate<size_t S, typename T>\ninline T __TBB_FetchAndStoreGeneric (volatile void *ptr, T value) {\n    T result;\n    for( atomic_backoff b;;b.pause() ) {\n        result = *reinterpret_cast<volatile T *>(ptr);\n        // __TBB_CompareAndSwapGeneric presumed to have full fence.\n        if( __TBB_CompareAndSwapGeneric<S,T> ( ptr, value, result )==result )\n            break;\n    }\n    return result;\n}\n\n#if __TBB_USE_GENERIC_PART_WORD_CAS\n#define __TBB_machine_cmpswp1 tbb::internal::__TBB_CompareAndSwapGeneric<1,int8_t>\n#define __TBB_machine_cmpswp2 tbb::internal::__TBB_CompareAndSwapGeneric<2,int16_t>\n#endif\n\n#if __TBB_USE_GENERIC_FETCH_ADD || __TBB_USE_GENERIC_PART_WORD_FETCH_ADD\n#define __TBB_machine_fetchadd1 tbb::internal::__TBB_FetchAndAddGeneric<1,int8_t>\n#define __TBB_machine_fetchadd2 tbb::internal::__TBB_FetchAndAddGeneric<2,int16_t>\n#endif\n\n#if __TBB_USE_GENERIC_FETCH_ADD\n#define __TBB_machine_fetchadd4 tbb::internal::__TBB_FetchAndAddGeneric<4,int32_t>\n#endif\n\n#if __TBB_USE_GENERIC_FETCH_ADD || __TBB_USE_GENERIC_DWORD_FETCH_ADD\n#define __TBB_machine_fetchadd8 tbb::internal::__TBB_FetchAndAddGeneric<8,int64_t>\n#endif\n\n#if __TBB_USE_GENERIC_FETCH_STORE || __TBB_USE_GENERIC_PART_WORD_FETCH_STORE\n#define __TBB_machine_fetchstore1 tbb::internal::__TBB_FetchAndStoreGeneric<1,int8_t>\n#define __TBB_machine_fetchstore2 tbb::internal::__TBB_FetchAndStoreGeneric<2,int16_t>\n#endif\n\n#if __TBB_USE_GENERIC_FETCH_STORE\n#define __TBB_machine_fetchstore4 tbb::internal::__TBB_FetchAndStoreGeneric<4,int32_t>\n#endif\n\n#if __TBB_USE_GENERIC_FETCH_STORE || __TBB_USE_GENERIC_DWORD_FETCH_STORE\n#define __TBB_machine_fetchstore8 tbb::internal::__TBB_FetchAndStoreGeneric<8,int64_t>\n#endif\n\n#if __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE\n#define __TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE(S)                                             \\\n    atomic_selector<S>::word atomic_selector<S>::fetch_store ( volatile void* location, word value ) {  \\\n        return __TBB_machine_fetchstore##S( location, value );                                          \\\n    }\n\n__TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE(1)\n__TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE(2)\n__TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE(4)\n__TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE(8)\n\n#undef __TBB_MACHINE_DEFINE_ATOMIC_SELECTOR_FETCH_STORE\n#endif /* __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE */\n\n#if __TBB_USE_GENERIC_DWORD_LOAD_STORE\n/*TODO: find a more elegant way to handle function names difference*/\n#if ! __TBB_USE_FENCED_ATOMICS\n    /* This name forwarding is needed for generic implementation of\n     * load8/store8 defined below (via macro) to pick the right CAS function*/\n    #define   __TBB_machine_cmpswp8full_fence __TBB_machine_cmpswp8\n#endif\n__TBB_MACHINE_DEFINE_LOAD8_GENERIC_FENCED(full_fence)\n__TBB_MACHINE_DEFINE_STORE8_GENERIC_FENCED(full_fence)\n\n#if ! __TBB_USE_FENCED_ATOMICS\n    #undef   __TBB_machine_cmpswp8full_fence\n#endif\n\n#define __TBB_machine_store8 tbb::internal::__TBB_machine_generic_store8full_fence\n#define __TBB_machine_load8  tbb::internal::__TBB_machine_generic_load8full_fence\n#endif /* __TBB_USE_GENERIC_DWORD_LOAD_STORE */\n\n#if __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE\n/** Fenced operations use volatile qualifier to prevent compiler from optimizing\n    them out, and on architectures with weak memory ordering to induce compiler\n    to generate code with appropriate acquire/release semantics.\n    On architectures like IA32, Intel64 (and likely Sparc TSO) volatile has\n    no effect on code gen, and consistency helpers serve as a compiler fence (the\n    latter being true for IA64/gcc as well to fix a bug in some gcc versions).\n    This code assumes that the generated instructions will operate atomically,\n    which typically requires a type that can be moved in a single instruction,\n    cooperation from the compiler for effective use of such an instruction,\n    and appropriate alignment of the data. **/\ntemplate <typename T, size_t S>\nstruct machine_load_store {\n    static T load_with_acquire ( const volatile T& location ) {\n        T to_return = location;\n        __TBB_acquire_consistency_helper();\n        return to_return;\n    }\n    static void store_with_release ( volatile T &location, T value ) {\n        __TBB_release_consistency_helper();\n        location = value;\n    }\n};\n\n//in general, plain load and store of 32bit compiler is not atomic for 64bit types\n#if __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS\ntemplate <typename T>\nstruct machine_load_store<T,8> {\n    static T load_with_acquire ( const volatile T& location ) {\n        return (T)__TBB_machine_load8( (const volatile void*)&location );\n    }\n    static void store_with_release ( volatile T& location, T value ) {\n        __TBB_machine_store8( (volatile void*)&location, (int64_t)value );\n    }\n};\n#endif /* __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS */\n#endif /* __TBB_USE_GENERIC_HALF_FENCED_LOAD_STORE */\n\n#if __TBB_USE_GENERIC_SEQUENTIAL_CONSISTENCY_LOAD_STORE\ntemplate <typename T, size_t S>\nstruct machine_load_store_seq_cst {\n    static T load ( const volatile T& location ) {\n        __TBB_full_memory_fence();\n        return machine_load_store<T,S>::load_with_acquire( location );\n    }\n#if __TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE\n    static void store ( volatile T &location, T value ) {\n        atomic_selector<S>::fetch_store( (volatile void*)&location, (typename atomic_selector<S>::word)value );\n    }\n#else /* !__TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE */\n    static void store ( volatile T &location, T value ) {\n        machine_load_store<T,S>::store_with_release( location, value );\n        __TBB_full_memory_fence();\n    }\n#endif /* !__TBB_USE_FETCHSTORE_AS_FULL_FENCED_STORE */\n};\n\n#if __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS\n/** The implementation does not use functions __TBB_machine_load8/store8 as they\n    are not required to be sequentially consistent. **/\ntemplate <typename T>\nstruct machine_load_store_seq_cst<T,8> {\n    static T load ( const volatile T& location ) {\n        // Comparand and new value may be anything, they only must be equal, and\n        // the value should have a low probability to be actually found in 'location'.\n        const int64_t anyvalue = 2305843009213693951LL;\n        return __TBB_machine_cmpswp8( (volatile void*)const_cast<volatile T*>(&location), anyvalue, anyvalue );\n    }\n    static void store ( volatile T &location, T value ) {\n        int64_t result = (volatile int64_t&)location;\n        while ( __TBB_machine_cmpswp8((volatile void*)&location, (int64_t)value, result) != result )\n            result = (volatile int64_t&)location;\n    }\n};\n#endif /* __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS */\n#endif /*__TBB_USE_GENERIC_SEQUENTIAL_CONSISTENCY_LOAD_STORE */\n\n#if __TBB_USE_GENERIC_RELAXED_LOAD_STORE\n// Relaxed operations add volatile qualifier to prevent compiler from optimizing them out.\n/** Volatile should not incur any additional cost on IA32, Intel64, and Sparc TSO\n    architectures. However on architectures with weak memory ordering compiler may\n    generate code with acquire/release semantics for operations on volatile data. **/\ntemplate <typename T, size_t S>\nstruct machine_load_store_relaxed {\n    static inline T load ( const volatile T& location ) {\n        return location;\n    }\n    static inline void store ( volatile T& location, T value ) {\n        location = value;\n    }\n};\n\n#if __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS\ntemplate <typename T>\nstruct machine_load_store_relaxed<T,8> {\n    static inline T load ( const volatile T& location ) {\n        return (T)__TBB_machine_load8( (const volatile void*)&location );\n    }\n    static inline void store ( volatile T& location, T value ) {\n        __TBB_machine_store8( (volatile void*)&location, (int64_t)value );\n    }\n};\n#endif /* __TBB_WORDSIZE==4 && __TBB_64BIT_ATOMICS */\n#endif /* __TBB_USE_GENERIC_RELAXED_LOAD_STORE */\n\n#undef __TBB_WORDSIZE //this macro is forbidden to use outside of atomic machinery\n\ntemplate<typename T>\ninline T __TBB_load_with_acquire(const volatile T &location) {\n    return machine_load_store<T,sizeof(T)>::load_with_acquire( location );\n}\ntemplate<typename T, typename V>\ninline void __TBB_store_with_release(volatile T& location, V value) {\n    machine_load_store<T,sizeof(T)>::store_with_release( location, T(value) );\n}\n//! Overload that exists solely to avoid /Wp64 warnings.\ninline void __TBB_store_with_release(volatile size_t& location, size_t value) {\n    machine_load_store<size_t,sizeof(size_t)>::store_with_release( location, value );\n}\n\ntemplate<typename T>\ninline T __TBB_load_full_fence(const volatile T &location) {\n    return machine_load_store_seq_cst<T,sizeof(T)>::load( location );\n}\ntemplate<typename T, typename V>\ninline void __TBB_store_full_fence(volatile T& location, V value) {\n    machine_load_store_seq_cst<T,sizeof(T)>::store( location, T(value) );\n}\n//! Overload that exists solely to avoid /Wp64 warnings.\ninline void __TBB_store_full_fence(volatile size_t& location, size_t value) {\n    machine_load_store_seq_cst<size_t,sizeof(size_t)>::store( location, value );\n}\n\ntemplate<typename T>\ninline T __TBB_load_relaxed (const volatile T& location) {\n    return machine_load_store_relaxed<T,sizeof(T)>::load( const_cast<T&>(location) );\n}\ntemplate<typename T, typename V>\ninline void __TBB_store_relaxed ( volatile T& location, V value ) {\n    machine_load_store_relaxed<T,sizeof(T)>::store( const_cast<T&>(location), T(value) );\n}\n//! Overload that exists solely to avoid /Wp64 warnings.\ninline void __TBB_store_relaxed ( volatile size_t& location, size_t value ) {\n    machine_load_store_relaxed<size_t,sizeof(size_t)>::store( const_cast<size_t&>(location), value );\n}\n\n// Macro __TBB_TypeWithAlignmentAtLeastAsStrict(T) should be a type with alignment at least as\n// strict as type T.  The type should have a trivial default constructor and destructor, so that\n// arrays of that type can be declared without initializers.\n// It is correct (but perhaps a waste of space) if __TBB_TypeWithAlignmentAtLeastAsStrict(T) expands\n// to a type bigger than T.\n// The default definition here works on machines where integers are naturally aligned and the\n// strictest alignment is 64.\n#ifndef __TBB_TypeWithAlignmentAtLeastAsStrict\n\n#if __TBB_ATTRIBUTE_ALIGNED_PRESENT\n\n#define __TBB_DefineTypeWithAlignment(PowerOf2)       \\\nstruct __TBB_machine_type_with_alignment_##PowerOf2 { \\\n    uint32_t member[PowerOf2/sizeof(uint32_t)];       \\\n} __attribute__((aligned(PowerOf2)));\n#define __TBB_alignof(T) __alignof__(T)\n\n#elif __TBB_DECLSPEC_ALIGN_PRESENT\n\n#define __TBB_DefineTypeWithAlignment(PowerOf2)       \\\n__declspec(align(PowerOf2))                           \\\nstruct __TBB_machine_type_with_alignment_##PowerOf2 { \\\n    uint32_t member[PowerOf2/sizeof(uint32_t)];       \\\n};\n#define __TBB_alignof(T) __alignof(T)\n\n#else /* A compiler with unknown syntax for data alignment */\n#error Must define __TBB_TypeWithAlignmentAtLeastAsStrict(T)\n#endif\n\n/* Now declare types aligned to useful powers of two */\n// TODO: Is __TBB_DefineTypeWithAlignment(8) needed on 32 bit platforms?\n__TBB_DefineTypeWithAlignment(16)\n__TBB_DefineTypeWithAlignment(32)\n__TBB_DefineTypeWithAlignment(64)\n\ntypedef __TBB_machine_type_with_alignment_64 __TBB_machine_type_with_strictest_alignment;\n\n// Primary template is a declaration of incomplete type so that it fails with unknown alignments\ntemplate<size_t N> struct type_with_alignment;\n\n// Specializations for allowed alignments\ntemplate<> struct type_with_alignment<1> { char member; };\ntemplate<> struct type_with_alignment<2> { uint16_t member; };\ntemplate<> struct type_with_alignment<4> { uint32_t member; };\ntemplate<> struct type_with_alignment<8> { uint64_t member; };\ntemplate<> struct type_with_alignment<16> {__TBB_machine_type_with_alignment_16 member; };\ntemplate<> struct type_with_alignment<32> {__TBB_machine_type_with_alignment_32 member; };\ntemplate<> struct type_with_alignment<64> {__TBB_machine_type_with_alignment_64 member; };\n\n#if __TBB_ALIGNOF_NOT_INSTANTIATED_TYPES_BROKEN\n//! Work around for bug in GNU 3.2 and MSVC compilers.\n/** Bug is that compiler sometimes returns 0 for __alignof(T) when T has not yet been instantiated.\n    The work-around forces instantiation by forcing computation of sizeof(T) before __alignof(T). */\ntemplate<size_t Size, typename T>\nstruct work_around_alignment_bug {\n    static const size_t alignment = __TBB_alignof(T);\n};\n#define __TBB_TypeWithAlignmentAtLeastAsStrict(T) tbb::internal::type_with_alignment<tbb::internal::work_around_alignment_bug<sizeof(T),T>::alignment>\n#else\n#define __TBB_TypeWithAlignmentAtLeastAsStrict(T) tbb::internal::type_with_alignment<__TBB_alignof(T)>\n#endif  /* __TBB_ALIGNOF_NOT_INSTANTIATED_TYPES_BROKEN */\n\n#endif  /* __TBB_TypeWithAlignmentAtLeastAsStrict */\n\n// Template class here is to avoid instantiation of the static data for modules that don't use it\ntemplate<typename T>\nstruct reverse {\n    static const T byte_table[256];\n};\n// An efficient implementation of the reverse function utilizes a 2^8 lookup table holding the bit-reversed\n// values of [0..2^8 - 1]. Those values can also be computed on the fly at a slightly higher cost.\ntemplate<typename T>\nconst T reverse<T>::byte_table[256] = {\n    0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,\n    0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,\n    0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,\n    0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,\n    0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,\n    0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,\n    0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,\n    0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,\n    0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,\n    0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,\n    0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,\n    0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,\n    0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,\n    0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,\n    0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,\n    0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF\n};\n\n} // namespace internal @endcond\n} // namespace tbb\n\n// Preserving access to legacy APIs\nusing tbb::internal::__TBB_load_with_acquire;\nusing tbb::internal::__TBB_store_with_release;\n\n// Mapping historically used names to the ones expected by atomic_load_store_traits\n#define __TBB_load_acquire  __TBB_load_with_acquire\n#define __TBB_store_release __TBB_store_with_release\n\n#ifndef __TBB_Log2\ninline intptr_t __TBB_Log2( uintptr_t x ) {\n    if( x==0 ) return -1;\n    intptr_t result = 0;\n\n#if !defined(_M_ARM) \n    uintptr_t tmp;\n    if( sizeof(x)>4 && (tmp = ((uint64_t)x)>>32) ) { x=tmp; result += 32; }\n#endif\n    if( uintptr_t tmp = x>>16 ) { x=tmp; result += 16; }\n    if( uintptr_t tmp = x>>8 )  { x=tmp; result += 8; }\n    if( uintptr_t tmp = x>>4 )  { x=tmp; result += 4; }\n    if( uintptr_t tmp = x>>2 )  { x=tmp; result += 2; }\n\n    return (x&2)? result+1: result;\n}\n#endif\n\n#ifndef __TBB_AtomicOR\ninline void __TBB_AtomicOR( volatile void *operand, uintptr_t addend ) {\n    for( tbb::internal::atomic_backoff b;;b.pause() ) {\n        uintptr_t tmp = *(volatile uintptr_t *)operand;\n        uintptr_t result = __TBB_CompareAndSwapW(operand, tmp|addend, tmp);\n        if( result==tmp ) break;\n    }\n}\n#endif\n\n#ifndef __TBB_AtomicAND\ninline void __TBB_AtomicAND( volatile void *operand, uintptr_t addend ) {\n    for( tbb::internal::atomic_backoff b;;b.pause() ) {\n        uintptr_t tmp = *(volatile uintptr_t *)operand;\n        uintptr_t result = __TBB_CompareAndSwapW(operand, tmp&addend, tmp);\n        if( result==tmp ) break;\n    }\n}\n#endif\n\n#if __TBB_PREFETCHING\n#ifndef __TBB_cl_prefetch\n#error This platform does not define cache management primitives required for __TBB_PREFETCHING\n#endif\n\n#ifndef __TBB_cl_evict\n#define __TBB_cl_evict(p)\n#endif\n#endif\n\n#ifndef __TBB_Flag\ntypedef unsigned char __TBB_Flag;\n#endif\ntypedef __TBB_atomic __TBB_Flag __TBB_atomic_flag;\n\n#ifndef __TBB_TryLockByte\ninline bool __TBB_TryLockByte( __TBB_atomic_flag &flag ) {\n    return __TBB_machine_cmpswp1(&flag,1,0)==0;\n}\n#endif\n\n#ifndef __TBB_LockByte\ninline __TBB_Flag __TBB_LockByte( __TBB_atomic_flag& flag ) {\n    tbb::internal::atomic_backoff backoff;\n    while( !__TBB_TryLockByte(flag) ) backoff.pause();\n    return 0;\n}\n#endif\n\n#ifndef  __TBB_UnlockByte\n#define __TBB_UnlockByte(addr) __TBB_store_with_release((addr),0)\n#endif\n\n// lock primitives with TSX\n#if ( __TBB_x86_32 || __TBB_x86_64 )  /* only on ia32/intel64 */\ninline void __TBB_TryLockByteElidedCancel() { __TBB_machine_try_lock_elided_cancel(); }\n\ninline bool __TBB_TryLockByteElided( __TBB_atomic_flag& flag ) {\n    bool res = __TBB_machine_try_lock_elided( &flag )!=0;\n    // to avoid the \"lemming\" effect, we need to abort the transaction\n    // if  __TBB_machine_try_lock_elided returns false (i.e., someone else\n    // has acquired the mutex non-speculatively).\n    if( !res ) __TBB_TryLockByteElidedCancel();\n    return res;\n}\n\ninline void __TBB_LockByteElided( __TBB_atomic_flag& flag )\n{\n    for(;;) {\n        tbb::internal::spin_wait_while_eq( flag, 1 );\n        if( __TBB_machine_try_lock_elided( &flag ) )\n            return;\n        // Another thread acquired the lock \"for real\".\n        // To avoid the \"lemming\" effect, we abort the transaction.\n        __TBB_TryLockByteElidedCancel();\n    }\n}\n\ninline void __TBB_UnlockByteElided( __TBB_atomic_flag& flag ) {\n    __TBB_machine_unlock_elided( &flag );\n}\n#endif\n\n#ifndef __TBB_ReverseByte\ninline unsigned char __TBB_ReverseByte(unsigned char src) {\n    return tbb::internal::reverse<unsigned char>::byte_table[src];\n}\n#endif\n\ntemplate<typename T>\nT __TBB_ReverseBits(T src) {\n    T dst;\n    unsigned char *original = (unsigned char *) &src;\n    unsigned char *reversed = (unsigned char *) &dst;\n\n    for( int i = sizeof(T)-1; i >= 0; i-- )\n        reversed[i] = __TBB_ReverseByte( original[sizeof(T)-i-1] );\n\n    return dst;\n}\n\n#endif /* __TBB_machine_H */\n"
  },
  {
    "path": "benchmarks/tbb/tbb_main.cpp",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#include \"tbb/tbb_config.h\"\n#include \"tbb_main.h\"\n#include \"governor.h\"\n#include \"market.h\"\n#include \"tbb_misc.h\"\n#include \"itt_notify.h\"\n\nnamespace tbb {\nnamespace internal {\n\n//------------------------------------------------------------------------\n// Begin shared data layout.\n// The following global data items are mostly read-only after initialization.\n//------------------------------------------------------------------------\n\n//! Padding in order to prevent false sharing.\nstatic const char _pad[NFS_MaxLineSize - sizeof(int)] = {};\n\n//------------------------------------------------------------------------\n// governor data\nbasic_tls<generic_scheduler*> governor::theTLS;\nunsigned governor::DefaultNumberOfThreads;\nrml::tbb_factory governor::theRMLServerFactory;\nbool governor::UsePrivateRML;\nconst task_scheduler_init *governor::BlockingTSI;\n#if TBB_USE_ASSERT\nbool governor::IsBlockingTerminationInProgress;\n#endif\nbool governor::is_speculation_enabled;\n\n//------------------------------------------------------------------------\n// market data\nmarket* market::theMarket;\nmarket::global_market_mutex_type market::theMarketMutex;\n\n//------------------------------------------------------------------------\n// One time initialization data\n\n//! Counter of references to global shared resources such as TLS.\natomic<int> __TBB_InitOnce::count;\n\n__TBB_atomic_flag __TBB_InitOnce::InitializationLock;\n\n//! Flag that is set to true after one-time initializations are done.\nbool __TBB_InitOnce::InitializationDone;\n\n#if DO_ITT_NOTIFY\n    static bool ITT_Present;\n    static bool ITT_InitializationDone;\n#endif\n\n#if !(_WIN32||_WIN64) || __TBB_SOURCE_DIRECTLY_INCLUDED\n    static __TBB_InitOnce __TBB_InitOnceHiddenInstance;\n#endif\n\n//------------------------------------------------------------------------\n// generic_scheduler data\n\n//! Pointer to the scheduler factory function\ngeneric_scheduler* (*AllocateSchedulerPtr)( arena*, size_t index );\n\n#if __TBB_OLD_PRIMES_RNG\n//! Table of primes used by fast random-number generator (FastRandom).\n/** Also serves to keep anything else from being placed in the same\n    cache line as the global data items preceding it. */\nstatic const unsigned Primes[] = {\n    0x9e3779b1, 0xffe6cc59, 0x2109f6dd, 0x43977ab5,\n    0xba5703f5, 0xb495a877, 0xe1626741, 0x79695e6b,\n    0xbc98c09f, 0xd5bee2b3, 0x287488f9, 0x3af18231,\n    0x9677cd4d, 0xbe3a6929, 0xadc6a877, 0xdcf0674b,\n    0xbe4d6fe9, 0x5f15e201, 0x99afc3fd, 0xf3f16801,\n    0xe222cfff, 0x24ba5fdb, 0x0620452d, 0x79f149e3,\n    0xc8b93f49, 0x972702cd, 0xb07dd827, 0x6c97d5ed,\n    0x085a3d61, 0x46eb5ea7, 0x3d9910ed, 0x2e687b5b,\n    0x29609227, 0x6eb081f1, 0x0954c4e1, 0x9d114db9,\n    0x542acfa9, 0xb3e6bd7b, 0x0742d917, 0xe9f3ffa7,\n    0x54581edb, 0xf2480f45, 0x0bb9288f, 0xef1affc7,\n    0x85fa0ca7, 0x3ccc14db, 0xe6baf34b, 0x343377f7,\n    0x5ca19031, 0xe6d9293b, 0xf0a9f391, 0x5d2e980b,\n    0xfc411073, 0xc3749363, 0xb892d829, 0x3549366b,\n    0x629750ad, 0xb98294e5, 0x892d9483, 0xc235baf3,\n    0x3d2402a3, 0x6bdef3c9, 0xbec333cd, 0x40c9520f\n};\n\n//------------------------------------------------------------------------\n// End of shared data layout\n//------------------------------------------------------------------------\n\n//------------------------------------------------------------------------\n// Shared data accessors\n//------------------------------------------------------------------------\n\nunsigned GetPrime ( unsigned seed ) {\n    return Primes[seed%(sizeof(Primes)/sizeof(Primes[0]))];\n}\n#endif //__TBB_OLD_PRIMES_RNG\n\n//------------------------------------------------------------------------\n// __TBB_InitOnce\n//------------------------------------------------------------------------\n\nvoid __TBB_InitOnce::add_ref() {\n    if( ++count==1 )\n        governor::acquire_resources();\n}\n\nvoid __TBB_InitOnce::remove_ref() {\n    int k = --count;\n    __TBB_ASSERT(k>=0,\"removed __TBB_InitOnce ref that was not added?\"); \n    if( k==0 ) {\n        governor::release_resources();\n        ITT_FINI_ITTLIB();\n    }\n}\n\n//------------------------------------------------------------------------\n// One-time Initializations\n//------------------------------------------------------------------------\n\n//! Defined in cache_aligned_allocator.cpp\nvoid initialize_cache_aligned_allocator();\n\n//! Defined in scheduler.cpp\nvoid Scheduler_OneTimeInitialization ( bool itt_present );\n\n#if DO_ITT_NOTIFY\n\n#if __TBB_ITT_STRUCTURE_API\n\nstatic __itt_domain *fgt_domain = NULL;\n\nstruct resource_string {\n    const char *str;\n    __itt_string_handle *itt_str_handle;\n};\n\n//\n// populate resource strings\n//\n#define TBB_STRING_RESOURCE( index_name, str ) { str, NULL },\nstatic resource_string strings_for_itt[] = {\n    #include \"tbb/internal/_tbb_strings.h\"\n    { \"num_resource_strings\", NULL } \n};\n#undef TBB_STRING_RESOURCE\n\nstatic __itt_string_handle *ITT_get_string_handle(int idx) {\n    __TBB_ASSERT(idx >= 0, NULL);\n    return idx < NUM_STRINGS ? strings_for_itt[idx].itt_str_handle : NULL;\n}\n\nstatic void ITT_init_domains() {\n    fgt_domain = __itt_domain_create( _T(\"tbb.flow\") );\n    fgt_domain->flags = 1;\n}\n\nstatic void ITT_init_strings() {\n    for ( int i = 0; i < NUM_STRINGS; ++i ) {\n#if _WIN32||_WIN64\n        strings_for_itt[i].itt_str_handle = __itt_string_handle_createA( strings_for_itt[i].str );\n#else\n        strings_for_itt[i].itt_str_handle = __itt_string_handle_create( strings_for_itt[i].str );\n#endif\n    }\n}\n\nstatic void ITT_init() {\n    ITT_init_domains();\n    ITT_init_strings();\n}\n\n#endif // __TBB_ITT_STRUCTURE_API\n\n/** Thread-unsafe lazy one-time initialization of tools interop.\n    Used by both dummy handlers and general TBB one-time initialization routine. **/\nvoid ITT_DoUnsafeOneTimeInitialization () {\n    if ( !ITT_InitializationDone ) {\n        ITT_Present = (__TBB_load_ittnotify()!=0);\n#if __TBB_ITT_STRUCTURE_API\n        if (ITT_Present) ITT_init();\n#endif\n        ITT_InitializationDone = true;\n        ITT_SYNC_CREATE(&market::theMarketMutex, SyncType_GlobalLock, SyncObj_SchedulerInitialization);\n    }\n}\n\n/** Thread-safe lazy one-time initialization of tools interop.\n    Used by dummy handlers only. **/\nextern \"C\"\nvoid ITT_DoOneTimeInitialization() {\n    __TBB_InitOnce::lock();\n    ITT_DoUnsafeOneTimeInitialization();\n    __TBB_InitOnce::unlock();\n}\n#endif /* DO_ITT_NOTIFY */\n\n//! Performs thread-safe lazy one-time general TBB initialization.\nvoid DoOneTimeInitializations() {\n    suppress_unused_warning(_pad);\n    __TBB_InitOnce::lock();\n    // No fence required for load of InitializationDone, because we are inside a critical section.\n    if( !__TBB_InitOnce::InitializationDone ) {\n        __TBB_InitOnce::add_ref();\n        if( GetBoolEnvironmentVariable(\"TBB_VERSION\") )\n            PrintVersion();\n        bool itt_present = false;\n#if DO_ITT_NOTIFY\n        ITT_DoUnsafeOneTimeInitialization();\n        itt_present = ITT_Present;\n#endif /* DO_ITT_NOTIFY */\n        initialize_cache_aligned_allocator();\n        governor::initialize_rml_factory();\n        Scheduler_OneTimeInitialization( itt_present );\n        // Force processor groups support detection\n        governor::default_num_threads();\n        // Dump version data\n        governor::print_version_info();\n        PrintExtraVersionInfo( \"Tools support\", itt_present ? \"enabled\" : \"disabled\" );\n        __TBB_InitOnce::InitializationDone = true;\n    }\n    __TBB_InitOnce::unlock();\n}\n\n#if (_WIN32||_WIN64) && !__TBB_SOURCE_DIRECTLY_INCLUDED\n//! Windows \"DllMain\" that handles startup and shutdown of dynamic library.\nextern \"C\" bool WINAPI DllMain( HANDLE /*hinstDLL*/, DWORD reason, LPVOID /*lpvReserved*/ ) {\n    switch( reason ) {\n        case DLL_PROCESS_ATTACH:\n            __TBB_InitOnce::add_ref();\n            break;\n        case DLL_PROCESS_DETACH:\n            __TBB_InitOnce::remove_ref();\n            // It is assumed that InitializationDone is not set after DLL_PROCESS_DETACH,\n            // and thus no race on InitializationDone is possible.\n            if( __TBB_InitOnce::initialization_done() ) {\n                // Remove reference that we added in DoOneTimeInitializations.\n                __TBB_InitOnce::remove_ref();\n            }\n            break;\n        case DLL_THREAD_DETACH:\n            governor::terminate_auto_initialized_scheduler();\n            break;\n    }\n    return true;\n}\n#endif /* (_WIN32||_WIN64) && !__TBB_SOURCE_DIRECTLY_INCLUDED */\n\nvoid itt_store_pointer_with_release_v3( void* dst, void* src ) {\n    ITT_NOTIFY(sync_releasing, dst);\n    __TBB_store_with_release(*static_cast<void**>(dst),src);\n}\n\nvoid* itt_load_pointer_with_acquire_v3( const void* src ) {\n    void* result = __TBB_load_with_acquire(*static_cast<void*const*>(src));\n    ITT_NOTIFY(sync_acquired, const_cast<void*>(src));\n    return result;\n}\n    \n#if DO_ITT_NOTIFY\nvoid call_itt_notify_v5(int t, void *ptr) {\n    switch (t) {\n    case 0: ITT_NOTIFY(sync_prepare, ptr); break;\n    case 1: ITT_NOTIFY(sync_cancel, ptr); break;\n    case 2: ITT_NOTIFY(sync_acquired, ptr); break;\n    case 3: ITT_NOTIFY(sync_releasing, ptr); break;\n    }\n}\n#else\nvoid call_itt_notify_v5(int /*t*/, void* /*ptr*/) {}\n#endif\n\n#if __TBB_ITT_STRUCTURE_API\n\n#if DO_ITT_NOTIFY\n\nconst __itt_id itt_null_id = {0, 0, 0};\n\nstatic inline __itt_domain* get_itt_domain( itt_domain_enum idx ) {\n    return ( idx == ITT_DOMAIN_FLOW ) ? fgt_domain : NULL;\n}\n\nstatic inline void itt_id_make(__itt_id *id, void* addr, unsigned long long extra) {\n    *id = __itt_id_make(addr, extra);\n}\n\nstatic inline void itt_id_create(const __itt_domain *domain, __itt_id id) {\n    ITTNOTIFY_VOID_D1(id_create, domain, id);\n}\n\nvoid itt_make_task_group_v7( itt_domain_enum domain, void *group, unsigned long long group_extra, \n                             void *parent, unsigned long long parent_extra, string_index name_index ) {\n    if ( __itt_domain *d = get_itt_domain( domain ) ) {\n        __itt_id group_id = itt_null_id;\n        __itt_id parent_id = itt_null_id;\n        itt_id_make( &group_id, group, group_extra );\n        itt_id_create( d, group_id );\n        if ( parent ) {\n            itt_id_make( &parent_id, parent, parent_extra );\n        }\n        __itt_string_handle *n = ITT_get_string_handle(name_index);\n        ITTNOTIFY_VOID_D3(task_group, d, group_id, parent_id, n);\n    }\n}\n\nvoid itt_metadata_str_add_v7( itt_domain_enum domain, void *addr, unsigned long long addr_extra, \n                              string_index key, const char *value ) {\n    if ( __itt_domain *d = get_itt_domain( domain ) ) {\n        __itt_id id = itt_null_id;\n        itt_id_make( &id, addr, addr_extra );\n        __itt_string_handle *k = ITT_get_string_handle(key);\n       size_t value_length = strlen( value );\n#if _WIN32||_WIN64\n        ITTNOTIFY_VOID_D4(metadata_str_addA, d, id, k, value, value_length);\n#else\n        ITTNOTIFY_VOID_D4(metadata_str_add, d, id, k, value, value_length);\n#endif\n    }\n}\n\nvoid itt_relation_add_v7( itt_domain_enum domain, void *addr0, unsigned long long addr0_extra, \n                          itt_relation relation, void *addr1, unsigned long long addr1_extra ) {\n    if ( __itt_domain *d = get_itt_domain( domain ) ) {\n        __itt_id id0 = itt_null_id; \n        __itt_id id1 = itt_null_id;\n        itt_id_make( &id0, addr0, addr0_extra );\n        itt_id_make( &id1, addr1, addr1_extra );\n        ITTNOTIFY_VOID_D3(relation_add, d, id0, (__itt_relation)relation, id1); \n    }\n}\n\nvoid itt_task_begin_v7( itt_domain_enum domain, void *task, unsigned long long task_extra, \n                        void *parent, unsigned long long parent_extra, string_index /* name_index */ ) {\n    if ( __itt_domain *d = get_itt_domain( domain ) ) {\n        __itt_id task_id = itt_null_id;\n        __itt_id parent_id = itt_null_id;\n        itt_id_make( &task_id, task, task_extra );\n        if ( parent ) {\n            itt_id_make( &parent_id, parent, parent_extra );\n        }\n        ITTNOTIFY_VOID_D3(task_begin, d, task_id, parent_id, NULL );\n    }\n}\n\nvoid itt_task_end_v7( itt_domain_enum domain ) {\n    if ( __itt_domain *d = get_itt_domain( domain ) ) {\n        ITTNOTIFY_VOID_D0(task_end, d);\n    }\n}\n\n#else // DO_ITT_NOTIFY\n\nvoid itt_make_task_group_v7( itt_domain_enum domain, void *group, unsigned long long group_extra, \n                             void *parent, unsigned long long parent_extra, string_index name_index ) { }\n\nvoid itt_metadata_str_add_v7( itt_domain_enum domain, void *addr, unsigned long long addr_extra, \n                              string_index key, const char *value ) { }\n\nvoid itt_relation_add_v7( itt_domain_enum domain, void *addr0, unsigned long long addr0_extra, \n                          itt_relation relation, void *addr1, unsigned long long addr1_extra ) { }\n\nvoid itt_task_begin_v7( itt_domain_enum domain, void *task, unsigned long long task_extra, \n                        void * /*parent*/, unsigned long long /* parent_extra */, string_index /* name_index */ ) { }\n\nvoid itt_task_end_v7( itt_domain_enum domain ) { }\n\n#endif // DO_ITT_NOTIFY\n\n#endif // __TBB_ITT_STRUCTURE_API\n\nvoid* itt_load_pointer_v3( const void* src ) {\n    //TODO: replace this with __TBB_load_relaxed\n    void* result = *static_cast<void*const*>(src);\n    return result;\n}\n\nvoid itt_set_sync_name_v3( void* obj, const tchar* name) {\n    ITT_SYNC_RENAME(obj, name);\n    suppress_unused_warning(obj && name);\n}\n\n\n} // namespace internal\n} // namespace tbb\n"
  },
  {
    "path": "benchmarks/tbb/tbb_main.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef _TBB_tbb_main_H\n#define _TBB_tbb_main_H\n\n#include \"tbb/atomic.h\"\n\nnamespace tbb {\n\nnamespace internal {\n\nvoid DoOneTimeInitializations ();\n\n//------------------------------------------------------------------------\n// __TBB_InitOnce\n//------------------------------------------------------------------------\n\n//! Class that supports TBB initialization. \n/** It handles acquisition and release of global resources (e.g. TLS) during startup and shutdown,\n    as well as synchronization for DoOneTimeInitializations. */\nclass __TBB_InitOnce {\n    friend void DoOneTimeInitializations();\n    friend void ITT_DoUnsafeOneTimeInitialization ();\n\n    static atomic<int> count;\n\n    //! Platform specific code to acquire resources.\n    static void acquire_resources();\n\n    //! Platform specific code to release resources.\n    static void release_resources();\n\n    //! Specifies if the one-time initializations has been done.\n    static bool InitializationDone;\n\n    //! Global initialization lock\n    /** Scenarios are possible when tools interop has to be initialized before the\n        TBB itself. This imposes a requirement that the global initialization lock \n        has to support valid static initialization, and does not issue any tool\n        notifications in any build mode. **/\n    static __TBB_atomic_flag InitializationLock;\n\npublic:\n    static void lock()   { __TBB_LockByte( InitializationLock ); }\n\n    static void unlock() { __TBB_UnlockByte( InitializationLock ); }\n\n    static bool initialization_done() { return __TBB_load_with_acquire(InitializationDone); }\n\n    //! Add initial reference to resources. \n    /** We assume that dynamic loading of the library prevents any other threads \n        from entering the library until this constructor has finished running. **/\n    __TBB_InitOnce() { add_ref(); }\n\n    //! Remove the initial reference to resources.\n    /** This is not necessarily the last reference if other threads are still running. **/\n    ~__TBB_InitOnce() {\n        remove_ref();\n        // We assume that InitializationDone is not set after file-scope destructors\n        // start running, and thus no race on InitializationDone is possible.\n        if( initialization_done() ) {\n            // Remove an extra reference that was added in DoOneTimeInitializations.\n            remove_ref();  \n        }\n    } \n    //! Add reference to resources.  If first reference added, acquire the resources.\n    static void add_ref();\n\n    //! Remove reference to resources.  If last reference removed, release the resources.\n    static void remove_ref();\n}; // class __TBB_InitOnce\n\n\n} // namespace internal\n\n} // namespace tbb\n\n#endif /* _TBB_tbb_main_H */\n"
  },
  {
    "path": "benchmarks/tbb/tbb_misc.cpp",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n// Source file for miscellaneous entities that are infrequently referenced by \n// an executing program.\n\n#include \"tbb/tbb_stddef.h\"\n#include \"tbb_assert_impl.h\" // Out-of-line TBB assertion handling routines are instantiated here.\n#include \"tbb/tbb_exception.h\"\n#include \"tbb/tbb_machine.h\"\n#include \"tbb_misc.h\"\n#include <cstdio>\n#include <cstdlib>\n#include <stdexcept>\n\n#if _WIN32||_WIN64\n#include \"tbb/machine/windows_api.h\"\n#endif\n\n#if !TBB_USE_EXCEPTIONS && _MSC_VER\n    // Suppress \"C++ exception handler used, but unwind semantics are not enabled\" warning in STL headers\n    #pragma warning (push)\n    #pragma warning (disable: 4530)\n#endif\n\n#include <cstring>\n\n#if !TBB_USE_EXCEPTIONS && _MSC_VER\n    #pragma warning (pop)\n#endif\n\nusing namespace std;\n\nnamespace tbb {\n\nconst char* bad_last_alloc::what() const throw() { return \"bad allocation in previous or concurrent attempt\"; }\nconst char* improper_lock::what() const throw() { return \"attempted recursive lock on critical section or non-recursive mutex\"; }\nconst char* user_abort::what() const throw() { return \"User-initiated abort has terminated this operation\"; }\nconst char* invalid_multiple_scheduling::what() const throw() { return \"The same task_handle object cannot be executed more than once\"; }\nconst char* missing_wait::what() const throw() { return \"wait() was not called on the structured_task_group\"; }\n\nnamespace internal {\n\n#if TBB_USE_EXCEPTIONS\n    #define DO_THROW(exc, init_args) throw exc init_args;\n#else /* !TBB_USE_EXCEPTIONS */\n    #define PRINT_ERROR_AND_ABORT(exc_name, msg) \\\n        fprintf (stderr, \"Exception %s with message %s would've been thrown, \"  \\\n            \"if exception handling were not disabled. Aborting.\\n\", exc_name, msg); \\\n        fflush(stderr); \\\n        abort();\n    #define DO_THROW(exc, init_args) PRINT_ERROR_AND_ABORT(#exc, #init_args)\n#endif /* !TBB_USE_EXCEPTIONS */\n\n\n/* The \"what\" should be fairly short, not more than about 128 characters.\n   Because we control all the call sites to handle_perror, it is pointless\n   to bullet-proof it for very long strings.\n\n   Design note: ADR put this routine off to the side in tbb_misc.cpp instead of\n   Task.cpp because the throw generates a pathetic lot of code, and ADR wanted\n   this large chunk of code to be placed on a cold page. */\nvoid handle_perror( int error_code, const char* what ) {\n    char buf[256];\n#if _MSC_VER\n #define snprintf _snprintf\n#endif\n    int written = snprintf(buf, sizeof(buf), \"%s: %s\", what, strerror( error_code ));\n    // On overflow, the returned value exceeds sizeof(buf) (for GLIBC) or is negative (for MSVC).\n    __TBB_ASSERT_EX( written>0 && written<(int)sizeof(buf), \"Error description is too long\" );\n    // Ensure that buffer ends in terminator.\n    buf[sizeof(buf)-1] = 0;\n#if TBB_USE_EXCEPTIONS\n    throw runtime_error(buf);\n#else\n    PRINT_ERROR_AND_ABORT( \"runtime_error\", buf);\n#endif /* !TBB_USE_EXCEPTIONS */\n}\n\n#if _WIN32||_WIN64 \nvoid handle_win_error( int error_code ) {\n    char buf[512];\n#if !__TBB_WIN8UI_SUPPORT\n    FormatMessageA( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,\n                    NULL, error_code, 0, buf, sizeof(buf), NULL );\n#else\n//TODO: update with right replacement for FormatMessageA\n    sprintf_s((char*)&buf, 512, \"error code %d\", error_code);\n#endif\n#if TBB_USE_EXCEPTIONS\n    throw runtime_error(buf);\n#else\n    PRINT_ERROR_AND_ABORT( \"runtime_error\", buf);\n#endif /* !TBB_USE_EXCEPTIONS */\n}\n#endif // _WIN32||_WIN64\n\nvoid throw_bad_last_alloc_exception_v4() {\n    throw_exception_v4(eid_bad_last_alloc);\n}\n\nvoid throw_exception_v4 ( exception_id eid ) {\n    __TBB_ASSERT ( eid > 0 && eid < eid_max, \"Unknown exception ID\" );\n    switch ( eid ) {\n    case eid_bad_alloc: DO_THROW( bad_alloc, () );\n    case eid_bad_last_alloc: DO_THROW( bad_last_alloc, () );\n    case eid_nonpositive_step: DO_THROW( invalid_argument, (\"Step must be positive\") );\n    case eid_out_of_range: DO_THROW( out_of_range, (\"Index out of requested size range\") );\n    case eid_segment_range_error: DO_THROW( range_error, (\"Index out of allocated segment slots\") );\n    case eid_index_range_error: DO_THROW( range_error, (\"Index is not allocated\") );\n    case eid_missing_wait: DO_THROW( missing_wait, () );\n    case eid_invalid_multiple_scheduling: DO_THROW( invalid_multiple_scheduling, () );\n    case eid_improper_lock: DO_THROW( improper_lock, () );\n    case eid_possible_deadlock: DO_THROW( runtime_error, (\"Resource deadlock would occur\") );\n    case eid_operation_not_permitted: DO_THROW( runtime_error, (\"Operation not permitted\") );\n    case eid_condvar_wait_failed: DO_THROW( runtime_error, (\"Wait on condition variable failed\") );\n    case eid_invalid_load_factor: DO_THROW( out_of_range, (\"Invalid hash load factor\") );\n    case eid_reserved: DO_THROW( out_of_range, (\"[backward compatibility] Invalid number of buckets\") );\n    case eid_invalid_swap: DO_THROW( invalid_argument, (\"swap() is invalid on non-equal allocators\") );\n    case eid_reservation_length_error: DO_THROW( length_error, (\"reservation size exceeds permitted max size\") );\n    case eid_invalid_key: DO_THROW( out_of_range, (\"invalid key\") );\n    case eid_user_abort: DO_THROW( user_abort, () );\n    case eid_bad_tagged_msg_cast: DO_THROW( runtime_error, (\"Illegal tagged_msg cast\") );\n#if __TBB_SUPPORTS_WORKERS_WAITING_IN_TERMINATE\n    case eid_blocking_sch_init: DO_THROW( runtime_error, (\"Nesting of blocking termination is impossible\") );\n#endif\n    default: break;\n    }\n#if !TBB_USE_EXCEPTIONS && __APPLE__\n    out_of_range e1(\"\");\n    length_error e2(\"\");\n    range_error e3(\"\");\n    invalid_argument e4(\"\");\n#endif /* !TBB_USE_EXCEPTIONS && __APPLE__ */\n}\n\n#if _XBOX || __TBB_WIN8UI_SUPPORT\nbool GetBoolEnvironmentVariable( const char * ) { return false;}\n#else  /* _XBOX || __TBB_WIN8UI_SUPPORT */\nbool GetBoolEnvironmentVariable( const char * name ) {\n    if( const char* s = getenv(name) )\n        return strcmp(s,\"0\") != 0;\n    return false;\n}\n#endif /* _XBOX || __TBB_WIN8UI_SUPPORT */\n\n#include \"tbb_version.h\"\n\n/** The leading \"\\0\" is here so that applying \"strings\" to the binary delivers a clean result. */\nstatic const char VersionString[] = \"\\0\" TBB_VERSION_STRINGS;\n\nstatic bool PrintVersionFlag = false;\n\nvoid PrintVersion() {\n    PrintVersionFlag = true;\n    fputs(VersionString+1,stderr);\n}\n\nvoid PrintExtraVersionInfo( const char* category, const char* format, ... ) {\n    if( PrintVersionFlag ) {\n        char str[1024]; memset(str, 0, 1024);\n        va_list args; va_start(args, format);\n        // Note: correct vsnprintf definition obtained from tbb_assert_impl.h\n        vsnprintf( str, 1024-1, format, args);\n        va_end(args);\n        fprintf(stderr, \"TBB: %s\\t%s\\n\", category, str );\n    }\n}\n\nvoid PrintRMLVersionInfo( void* arg, const char* server_info ) {\n    PrintExtraVersionInfo( server_info, (const char *)arg );\n}\n\n//! check for transaction support.\n#if _MSC_VER\n#include <intrin.h> // for __cpuid\n#endif\nbool cpu_has_speculation() {\n#if __TBB_TSX_AVAILABLE\n#if (__INTEL_COMPILER || __GNUC__ || _MSC_VER || __SUNPRO_CC)\n    bool result = false;\n    const int hle_ebx_mask = 1<<4;\n#if _MSC_VER\n    int info[4] = {0,0,0,0};\n    const int reg_ebx = 1;\n    __cpuidex(info, 7, 0);\n    result = (info[reg_ebx] & hle_ebx_mask)!=0;\n#elif __GNUC__ || __SUNPRO_CC\n    int32_t reg_ebx = 0;\n    int32_t reg_eax = 7;\n    int32_t reg_ecx = 0;\n    __asm__ __volatile__ ( \"movl %%ebx, %%esi\\n\"\n                           \"cpuid\\n\"\n                           \"movl %%ebx, %0\\n\"\n                           \"movl %%esi, %%ebx\\n\"\n                           : \"=a\"(reg_ebx) : \"0\" (reg_eax), \"c\" (reg_ecx) : \"esi\", \n#if __TBB_x86_64\n                           \"ebx\",\n#endif\n                           \"edx\"\n                           );\n    result = (reg_ebx & hle_ebx_mask)!=0 ;\n#endif\n    return result;\n#else\n    #error Speculation detection not enabled for compiler\n#endif /* __INTEL_COMPILER || __GNUC__ || _MSC_VER */\n#else  /* __TBB_TSX_AVAILABLE */\n    return false;\n#endif /* __TBB_TSX_AVAILABLE */\n}\n\n} // namespace internal\n\nextern \"C\" int TBB_runtime_interface_version() {\n    return TBB_INTERFACE_VERSION;\n}\n\n} // namespace tbb\n\n#if !__TBB_RML_STATIC\n#if __TBB_x86_32\n\n#include \"tbb/atomic.h\"\n\n// in MSVC environment, int64_t defined in tbb::internal namespace only (see tbb_stddef.h)\n#if _MSC_VER\nusing tbb::internal::int64_t;\n#endif\n\n//! Warn about 8-byte store that crosses a cache line.\nextern \"C\" void __TBB_machine_store8_slow_perf_warning( volatile void *ptr ) {\n    // Report run-time warning unless we have already recently reported warning for that address.\n    const unsigned n = 4;\n    static tbb::atomic<void*> cache[n];\n    static tbb::atomic<unsigned> k;\n    for( unsigned i=0; i<n; ++i ) \n        if( ptr==cache[i] ) \n            goto done;\n    cache[(k++)%n] = const_cast<void*>(ptr);\n    tbb::internal::runtime_warning( \"atomic store on misaligned 8-byte location %p is slow\", ptr );\ndone:;\n}\n\n//! Handle 8-byte store that crosses a cache line.\nextern \"C\" void __TBB_machine_store8_slow( volatile void *ptr, int64_t value ) {\n    for( tbb::internal::atomic_backoff b;;b.pause() ) {\n        int64_t tmp = *(int64_t*)ptr;\n        if( __TBB_machine_cmpswp8(ptr,value,tmp)==tmp ) \n            break;\n    }\n}\n\n#endif /* __TBB_x86_32 */\n#endif /* !__TBB_RML_STATIC */\n\n#if __TBB_ipf\n/* It was found that on IA-64 architecture inlining of __TBB_machine_lockbyte leads\n   to serious performance regression with ICC. So keep it out-of-line.\n */\nextern \"C\" intptr_t __TBB_machine_lockbyte( volatile unsigned char& flag ) {\n    tbb::internal::atomic_backoff backoff;\n    while( !__TBB_TryLockByte(flag) ) backoff.pause();\n    return 0;\n}\n#endif\n"
  },
  {
    "path": "benchmarks/tbb/tbb_misc.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef _TBB_tbb_misc_H\n#define _TBB_tbb_misc_H\n\n#include \"tbb/tbb_stddef.h\"\n#include \"tbb/tbb_machine.h\"\n#include \"tbb/atomic.h\"     // For atomic_xxx definitions\n\n#if __linux__ || __FreeBSD__\n#include <sys/param.h>  // __FreeBSD_version\n#if __FreeBSD_version >= 701000\n#include <sys/cpuset.h>\n#endif\n#endif\n\n// Does the operating system have a system call to pin a thread to a set of OS processors?\n#define __TBB_OS_AFFINITY_SYSCALL_PRESENT ((__linux__ && !__ANDROID__) || (__FreeBSD_version >= 701000))\n// On IBM* Blue Gene* CNK nodes, the affinity API has restrictions that prevent its usability for TBB,\n// and also sysconf(_SC_NPROCESSORS_ONLN) already takes process affinity into account.\n#define __TBB_USE_OS_AFFINITY_SYSCALL (__TBB_OS_AFFINITY_SYSCALL_PRESENT && !__bg__)\n\nnamespace tbb {\nnamespace internal {\n\nconst size_t MByte = 1024*1024;\n\n#if __TBB_WIN8UI_SUPPORT\n// In Win8UI mode, TBB uses a thread creation API that does not allow to specify the stack size.\n// Still, the thread stack size value, either explicit or default, is used by the scheduler.\n// So here we set the default value to match the platform's default of 1MB.\nconst size_t ThreadStackSize = 1*MByte;\n#else\nconst size_t ThreadStackSize = (sizeof(uintptr_t) <= 4 ? 2 : 4 )*MByte;\n#endif\n\n#ifndef __TBB_HardwareConcurrency\n\n//! Returns maximal parallelism level supported by the current OS configuration.\nint AvailableHwConcurrency();\n\n#else\n\ninline int AvailableHwConcurrency() {\n    int n = __TBB_HardwareConcurrency();\n    return n > 0 ? n : 1; // Fail safety strap\n}\n#endif /* __TBB_HardwareConcurrency */\n\n\n#if _WIN32||_WIN64\n\n//! Returns number of processor groups in the current OS configuration.\n/** AvailableHwConcurrency must be called at least once before calling this method. **/\nint NumberOfProcessorGroups();\n\n//! Retrieves index of processor group containing processor with the given index\nint FindProcessorGroupIndex ( int processorIndex );\n\n//! Affinitizes the thread to the specified processor group\nvoid MoveThreadIntoProcessorGroup( void* hThread, int groupIndex );\n\n#endif /* _WIN32||_WIN64 */\n\n//! Throws std::runtime_error with what() returning error_code description prefixed with aux_info\nvoid handle_win_error( int error_code );\n\n//! True if environment variable with given name is set and not 0; otherwise false.\nbool GetBoolEnvironmentVariable( const char * name );\n\n//! Prints TBB version information on stderr\nvoid PrintVersion();\n\n//! Prints arbitrary extra TBB version information on stderr\nvoid PrintExtraVersionInfo( const char* category, const char* format, ... );\n\n//! A callback routine to print RML version information on stderr\nvoid PrintRMLVersionInfo( void* arg, const char* server_info );\n\n// For TBB compilation only; not to be used in public headers\n#if defined(min) || defined(max)\n#undef min\n#undef max\n#endif\n\n//! Utility template function returning lesser of the two values.\n/** Provided here to avoid including not strict safe <algorithm>.\\n\n    In case operands cause signed/unsigned or size mismatch warnings it is caller's\n    responsibility to do the appropriate cast before calling the function. **/\ntemplate<typename T1, typename T2>\nT1 min ( const T1& val1, const T2& val2 ) {\n    return val1 < val2 ? val1 : val2;\n}\n\n//! Utility template function returning greater of the two values.\n/** Provided here to avoid including not strict safe <algorithm>.\\n\n    In case operands cause signed/unsigned or size mismatch warnings it is caller's\n    responsibility to do the appropriate cast before calling the function. **/\ntemplate<typename T1, typename T2>\nT1 max ( const T1& val1, const T2& val2 ) {\n    return val1 < val2 ? val2 : val1;\n}\n\n//! Utility helper structure to ease overload resolution\ntemplate<int > struct int_to_type {};\n\n//------------------------------------------------------------------------\n// FastRandom\n//------------------------------------------------------------------------\n\n/** Defined in tbb_main.cpp **/\nunsigned GetPrime ( unsigned seed );\n\n//! A fast random number generator.\n/** Uses linear congruential method. */\nclass FastRandom {\nprivate:\n#if __TBB_OLD_PRIMES_RNG\n    unsigned x, a;\n    static const unsigned c = 1;\n#else\n    unsigned x, c;\n    static const unsigned a = 0x9e3779b1; // a big prime number\n#endif //__TBB_OLD_PRIMES_RNG\npublic:\n    //! Get a random number.\n    unsigned short get() {\n        return get(x);\n    }\n    //! Get a random number for the given seed; update the seed for next use.\n    unsigned short get( unsigned& seed ) {\n        unsigned short r = (unsigned short)(seed>>16);\n        __TBB_ASSERT(c&1, \"c must be odd for big rng period\");\n        seed = seed*a+c;\n        return r;\n    }\n    //! Construct a random number generator.\n    FastRandom( void* unique_ptr ) { init(uintptr_t(unique_ptr)); }\n    FastRandom( uint32_t seed) { init(seed); }\n    FastRandom( uint64_t seed) { init(seed); }\n    template <typename T>\n    void init( T seed ) {\n        init(seed,int_to_type<sizeof(seed)>());\n    }\n    void init( uint64_t seed , int_to_type<8> ) {\n        init(uint32_t((seed>>32)+seed), int_to_type<4>());\n    }\n    void init( uint32_t seed, int_to_type<4> ) {\n#if __TBB_OLD_PRIMES_RNG\n        x = seed;\n        a = GetPrime( seed );\n#else\n        // threads use different seeds for unique sequences\n        c = (seed|1)*0xba5703f5; // c must be odd, shuffle by a prime number\n        x = c^(seed>>1); // also shuffle x for the first get() invocation\n#endif\n    }\n};\n\n//------------------------------------------------------------------------\n// Atomic extensions\n//------------------------------------------------------------------------\n\n//! Atomically replaces value of dst with newValue if they satisfy condition of compare predicate\n/** Return value semantics is the same as for CAS. **/\ntemplate<typename T1, typename T2, class Pred>\nT1 atomic_update ( tbb::atomic<T1>& dst, T2 newValue, Pred compare ) {\n    T1 oldValue = dst;\n    while ( compare(oldValue, newValue) ) {\n        if ( dst.compare_and_swap((T1)newValue, oldValue) == oldValue )\n            break;\n        oldValue = dst;\n    }\n    return oldValue;\n}\n\n//! One-time initialization states\nenum do_once_state {\n    do_once_uninitialized = 0,  ///< No execution attempts have been undertaken yet\n    do_once_pending,            ///< A thread is executing associated do-once routine\n    do_once_executed,           ///< Do-once routine has been executed\n    initialization_complete = do_once_executed  ///< Convenience alias\n};\n\n//! One-time initialization function\n/** /param initializer Pointer to function without arguments\n           The variant that returns bool is used for cases when initialization can fail\n           and it is OK to continue execution, but the state should be reset so that\n           the initialization attempt was repeated the next time.\n    /param state Shared state associated with initializer that specifies its\n            initialization state. Must be initially set to #uninitialized value\n            (e.g. by means of default static zero initialization). **/\ntemplate <typename F>\nvoid atomic_do_once ( const F& initializer, atomic<do_once_state>& state ) {\n    // tbb::atomic provides necessary acquire and release fences.\n    // The loop in the implementation is necessary to avoid race when thread T2\n    // that arrived in the middle of initialization attempt by another thread T1\n    // has just made initialization possible.\n    // In such a case T2 has to rely on T1 to initialize, but T1 may already be past\n    // the point where it can recognize the changed conditions.\n    while ( state != do_once_executed ) {\n        if( state == do_once_uninitialized ) {\n            if( state.compare_and_swap( do_once_pending, do_once_uninitialized ) == do_once_uninitialized ) {\n                run_initializer( initializer, state );\n                break;\n            }\n        }\n        spin_wait_while_eq( state, do_once_pending );\n    }\n}\n\n// Run the initializer which can not fail\ninline void run_initializer( void (*f)(), atomic<do_once_state>& state ) {\n    f();\n    state = do_once_executed;\n}\n\n// Run the initializer which can require repeated call\ninline void run_initializer( bool (*f)(), atomic<do_once_state>& state ) {\n    state = f() ? do_once_executed : do_once_uninitialized;\n}\n\n#if __TBB_USE_OS_AFFINITY_SYSCALL\n  #if __linux__\n    typedef cpu_set_t basic_mask_t;\n  #elif __FreeBSD_version >= 701000\n    typedef cpuset_t basic_mask_t;\n  #else\n    #error affinity_helper is not implemented in this OS\n  #endif\n    class affinity_helper : no_copy {\n        basic_mask_t* threadMask;\n        int is_changed;\n    public:\n        affinity_helper() : threadMask(NULL), is_changed(0) {}\n        ~affinity_helper();\n        void protect_affinity_mask();\n    };\n#else\n    class affinity_helper : no_copy {\n    public:\n        void protect_affinity_mask() {}\n    };\n#endif /* __TBB_USE_OS_AFFINITY_SYSCALL */\n\nextern bool cpu_has_speculation();\n\n} // namespace internal\n} // namespace tbb\n\n#endif /* _TBB_tbb_misc_H */\n"
  },
  {
    "path": "benchmarks/tbb/tbb_misc_ex.cpp",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n// Source file for miscellaneous entities that are infrequently referenced by \n// an executing program, and implementation of which requires dynamic linking.\n\n#include \"tbb_misc.h\"\n\n#if !defined(__TBB_HardwareConcurrency)\n\n#include \"dynamic_link.h\"\n#include <stdio.h>\n#include <limits.h>\n\n#if _WIN32||_WIN64\n#include \"tbb/machine/windows_api.h\"\n#if __TBB_WIN8UI_SUPPORT\n#include <thread>\n#endif\n#else\n#include <unistd.h>\n#if __linux__\n#include <sys/sysinfo.h>\n#include <string.h>\n#include <sched.h>\n#include <errno.h>\n#elif __sun\n#include <sys/sysinfo.h>\n#elif __FreeBSD__\n#include <errno.h>\n#include <string.h>\n#include <sys/param.h>  // Required by <sys/cpuset.h>\n#include <sys/cpuset.h>\n#endif\n#endif\n\nnamespace tbb {\nnamespace internal {\n\n#if __TBB_USE_OS_AFFINITY_SYSCALL\n\nstatic void set_affinity_mask( size_t maskSize, const basic_mask_t* threadMask ) {\n#if __linux__\n    if( sched_setaffinity( 0, maskSize, threadMask ) )\n#else /* FreeBSD */\n    if( cpuset_setaffinity( CPU_LEVEL_WHICH, CPU_WHICH_TID, -1, maskSize, threadMask ) )\n#endif\n        runtime_warning( \"setaffinity syscall failed\" );\n}\n\nstatic void get_affinity_mask( size_t maskSize, basic_mask_t* threadMask ) {\n#if __linux__\n    if( sched_getaffinity( 0, maskSize, threadMask ) )\n#else /* FreeBSD */\n    if( cpuset_getaffinity( CPU_LEVEL_WHICH, CPU_WHICH_TID, -1, maskSize, threadMask ) )\n#endif\n        runtime_warning( \"getaffinity syscall failed\" );\n}\n\nstatic basic_mask_t* process_mask;\nstatic int num_masks;\nstruct process_mask_cleanup_helper {\n    ~process_mask_cleanup_helper() {\n        if( process_mask ) {\n            delete [] process_mask;\n        }\n     }\n};\nstatic process_mask_cleanup_helper process_mask_cleanup;\n\n#define curMaskSize sizeof(basic_mask_t) * num_masks\naffinity_helper::~affinity_helper() {\n    if( threadMask ) {\n        if( is_changed ) {\n            set_affinity_mask( curMaskSize, threadMask );\n        }\n        delete [] threadMask;\n    }\n}\nvoid affinity_helper::protect_affinity_mask() {\n    if( threadMask == NULL && num_masks && process_mask ) {\n        threadMask = new basic_mask_t [num_masks];\n        memset( threadMask, 0, curMaskSize );\n        get_affinity_mask( curMaskSize, threadMask );\n        is_changed = memcmp( process_mask, threadMask, curMaskSize );\n        if( is_changed ) {\n            set_affinity_mask( curMaskSize, process_mask );\n        }\n    }\n}\n#undef curMaskSize\n\nstatic atomic<do_once_state> hardware_concurrency_info;\n\nstatic int theNumProcs;\n\nstatic void initialize_hardware_concurrency_info () {\n    int err;\n    int availableProcs = 0;\n    int numMasks = 1;\n#if __linux__\n#if __TBB_MAIN_THREAD_AFFINITY_BROKEN\n    int maxProcs = INT_MAX; // To check the entire mask.\n    int pid = 0; // Get the mask of the calling thread.\n#else\n    int maxProcs = sysconf(_SC_NPROCESSORS_ONLN);\n    int pid = getpid();\n#endif\n    cpu_set_t *processMask;\n    const size_t BasicMaskSize =  sizeof(cpu_set_t);\n    for (;;) {\n        int curMaskSize = BasicMaskSize * numMasks;\n        processMask = new cpu_set_t[numMasks];\n        memset( processMask, 0, curMaskSize );\n        err = sched_getaffinity( pid, curMaskSize, processMask );\n        if ( !err || errno != EINVAL || curMaskSize * CHAR_BIT >= 256 * 1024 )\n            break;\n        delete[] processMask;\n        numMasks <<= 1;\n    }\n#else /* FreeBSD >= 7.1 */\n    int maxProcs = sysconf(_SC_NPROCESSORS_ONLN);\n    cpuset_t *processMask;\n    const size_t BasicMaskSize = sizeof(cpuset_t);\n    for (;;) {\n        int curMaskSize = BasicMaskSize * numMasks;\n        processMask = new cpuset_t[numMasks];\n        memset( processMask, 0, curMaskSize );\n        // CPU_LEVEL_WHICH - anonymous (current) mask, CPU_LEVEL_CPUSET - assigned mask\n#if __TBB_MAIN_THREAD_AFFINITY_BROKEN\n        err = cpuset_getaffinity( CPU_LEVEL_WHICH, CPU_WHICH_TID, -1, curMaskSize, processMask );\n#else\n        err = cpuset_getaffinity( CPU_LEVEL_WHICH, CPU_WHICH_PID, -1, curMaskSize, processMask );\n#endif\n        if ( !err || errno != ERANGE || curMaskSize * CHAR_BIT >= 16 * 1024 )\n            break;\n        delete[] processMask;\n        numMasks <<= 1;\n    }\n#endif /* FreeBSD >= 7.1 */\n    if ( !err ) {\n        for ( int m = 0; availableProcs < maxProcs && m < numMasks; ++m ) {\n            for ( size_t i = 0; (availableProcs < maxProcs) && (i < BasicMaskSize * CHAR_BIT); ++i ) {\n                if ( CPU_ISSET( i, processMask + m ) )\n                    ++availableProcs;\n            }\n        }\n        num_masks = numMasks;\n        process_mask = processMask;\n    }\n    else {\n        availableProcs = (maxProcs == INT_MAX) ? sysconf(_SC_NPROCESSORS_ONLN) : maxProcs;\n        delete[] processMask;\n    }\n    theNumProcs = availableProcs > 0 ? availableProcs : 1; // Fail safety strap\n    __TBB_ASSERT( theNumProcs <= sysconf(_SC_NPROCESSORS_ONLN), NULL );\n}\n\nint AvailableHwConcurrency() {\n    atomic_do_once( &initialize_hardware_concurrency_info, hardware_concurrency_info );\n    return theNumProcs;\n}\n\n#elif __ANDROID__\n// Work-around for Android that reads the correct number of available CPUs since system calls are unreliable.\n// Format of \"present\" file is: ([<int>-<int>|<int>],)+\nint AvailableHwConcurrency() {\n    FILE *fp = fopen(\"/sys/devices/system/cpu/present\", \"r\");\n    if (fp == NULL) return 1;\n    int num_args, lower, upper, num_cpus=0;\n    while ((num_args = fscanf(fp, \"%u-%u\", &lower, &upper)) != EOF) {\n        switch(num_args) {\n            case 2: num_cpus += upper - lower + 1; break;\n            case 1: num_cpus += 1; break;\n        }\n        fscanf(fp, \",\");\n    }\n    return (num_cpus > 0) ? num_cpus : 1;\n}\n\n#elif defined(_SC_NPROCESSORS_ONLN)\nint AvailableHwConcurrency() {\n    int n = sysconf(_SC_NPROCESSORS_ONLN);\n    return (n > 0) ? n : 1;\n}\n\n#elif _WIN32||_WIN64\n\nstatic atomic<do_once_state> hardware_concurrency_info;\n\nstatic const WORD TBB_ALL_PROCESSOR_GROUPS = 0xffff;\n\n// Statically allocate an array for processor group information.\n// Windows 7 supports maximum 4 groups, but let's look ahead a little.\nstatic const WORD MaxProcessorGroups = 64;\n\nstruct ProcessorGroupInfo {\n    DWORD_PTR   mask;                   ///< Affinity mask covering the whole group\n    int         numProcs;               ///< Number of processors in the group\n    int         numProcsRunningTotal;   ///< Subtotal of processors in this and preceding groups\n\n    //! Total number of processor groups in the system\n    static int NumGroups; \n\n    //! Index of the group with a slot reserved for the first master thread\n    /** In the context of multiple processor groups support current implementation\n        defines \"the first master thread\" as the first thread to invoke\n        AvailableHwConcurrency(). \n\n        TODO:   Implement a dynamic scheme remapping workers depending on the pending\n                master threads affinity. **/\n    static int HoleIndex;\n};\n\nint ProcessorGroupInfo::NumGroups = 1;\nint ProcessorGroupInfo::HoleIndex = 0;\n\n\nProcessorGroupInfo theProcessorGroups[MaxProcessorGroups];\n\nstruct TBB_GROUP_AFFINITY {\n    DWORD_PTR Mask;\n    WORD   Group;\n    WORD   Reserved[3];\n};\n\nstatic DWORD (WINAPI *TBB_GetActiveProcessorCount)( WORD groupIndex ) = NULL;\nstatic WORD (WINAPI *TBB_GetActiveProcessorGroupCount)() = NULL;\nstatic BOOL (WINAPI *TBB_SetThreadGroupAffinity)( HANDLE hThread, \n                        const TBB_GROUP_AFFINITY* newAff, TBB_GROUP_AFFINITY *prevAff );\nstatic BOOL (WINAPI *TBB_GetThreadGroupAffinity)( HANDLE hThread, TBB_GROUP_AFFINITY* );\n\nstatic const dynamic_link_descriptor ProcessorGroupsApiLinkTable[] = {\n      DLD(GetActiveProcessorCount, TBB_GetActiveProcessorCount)\n    , DLD(GetActiveProcessorGroupCount, TBB_GetActiveProcessorGroupCount)\n    , DLD(SetThreadGroupAffinity, TBB_SetThreadGroupAffinity)\n    , DLD(GetThreadGroupAffinity, TBB_GetThreadGroupAffinity)\n};\n\nstatic void initialize_hardware_concurrency_info () {\n#if __TBB_WIN8UI_SUPPORT\n    // For these applications processor groups info is unavailable\n    // Setting up a number of processors for one processor group\n    theProcessorGroups[0].numProcs = theProcessorGroups[0].numProcsRunningTotal = std::thread::hardware_concurrency();\n#else /* __TBB_WIN8UI_SUPPORT */\n    dynamic_link( \"Kernel32.dll\", ProcessorGroupsApiLinkTable,\n                  sizeof(ProcessorGroupsApiLinkTable)/sizeof(dynamic_link_descriptor) );\n    SYSTEM_INFO si;\n    GetNativeSystemInfo(&si);\n    DWORD_PTR pam, sam, m = 1;\n    GetProcessAffinityMask( GetCurrentProcess(), &pam, &sam );\n    int nproc = 0;\n    for ( size_t i = 0; i < sizeof(DWORD_PTR) * CHAR_BIT; ++i, m <<= 1 ) {\n        if ( pam & m )\n            ++nproc;\n    }\n    __TBB_ASSERT( nproc <= (int)si.dwNumberOfProcessors, NULL );\n    // By default setting up a number of processors for one processor group\n    theProcessorGroups[0].numProcs = theProcessorGroups[0].numProcsRunningTotal = nproc;\n    // Setting up processor groups in case the process does not restrict affinity mask and more than one processor group is present\n    if ( nproc == (int)si.dwNumberOfProcessors && TBB_GetActiveProcessorCount ) {\n        // The process does not have restricting affinity mask and multiple processor groups are possible\n        ProcessorGroupInfo::NumGroups = (int)TBB_GetActiveProcessorGroupCount();\n        __TBB_ASSERT( ProcessorGroupInfo::NumGroups <= MaxProcessorGroups, NULL );\n        // Fail safety bootstrap. Release versions will limit available concurrency\n        // level, while debug ones would assert.\n        if ( ProcessorGroupInfo::NumGroups > MaxProcessorGroups )\n            ProcessorGroupInfo::NumGroups = MaxProcessorGroups;\n        if ( ProcessorGroupInfo::NumGroups > 1 ) {\n            TBB_GROUP_AFFINITY ga;\n            if ( TBB_GetThreadGroupAffinity( GetCurrentThread(), &ga ) )\n                ProcessorGroupInfo::HoleIndex = ga.Group;\n            int nprocs = 0;\n            for ( WORD i = 0; i < ProcessorGroupInfo::NumGroups; ++i ) {\n                ProcessorGroupInfo  &pgi = theProcessorGroups[i];\n                pgi.numProcs = (int)TBB_GetActiveProcessorCount(i);\n                __TBB_ASSERT( pgi.numProcs <= (int)sizeof(DWORD_PTR) * CHAR_BIT, NULL );\n                pgi.mask = pgi.numProcs == sizeof(DWORD_PTR) * CHAR_BIT ? ~(DWORD_PTR)0 : (DWORD_PTR(1) << pgi.numProcs) - 1;\n                pgi.numProcsRunningTotal = nprocs += pgi.numProcs;\n            }\n            __TBB_ASSERT( nprocs == (int)TBB_GetActiveProcessorCount( TBB_ALL_PROCESSOR_GROUPS ), NULL );\n        }\n    }\n#endif /* __TBB_WIN8UI_SUPPORT */\n\n    PrintExtraVersionInfo(\"Processor groups\", \"%d\", ProcessorGroupInfo::NumGroups);\n    if (ProcessorGroupInfo::NumGroups>1)\n        for (int i=0; i<ProcessorGroupInfo::NumGroups; ++i)\n            PrintExtraVersionInfo( \"----- Group\", \"%d: size %d\", i, theProcessorGroups[i].numProcs);\n}\n\nint AvailableHwConcurrency() {\n    atomic_do_once( &initialize_hardware_concurrency_info, hardware_concurrency_info );\n    return theProcessorGroups[ProcessorGroupInfo::NumGroups - 1].numProcsRunningTotal;\n}\n\nint NumberOfProcessorGroups() {\n    __TBB_ASSERT( hardware_concurrency_info == initialization_complete, \"NumberOfProcessorGroups is used before AvailableHwConcurrency\" );\n    return ProcessorGroupInfo::NumGroups;\n}\n\n// Offset for the slot reserved for the first master thread\n#define HoleAdjusted(procIdx, grpIdx) (procIdx + (holeIdx <= grpIdx))\n\nint FindProcessorGroupIndex ( int procIdx ) {\n    // In case of oversubscription spread extra workers in a round robin manner\n    int holeIdx;\n    const int numProcs = theProcessorGroups[ProcessorGroupInfo::NumGroups - 1].numProcsRunningTotal;\n    if ( procIdx >= numProcs - 1 ) {\n        holeIdx = INT_MAX;\n        procIdx = (procIdx - numProcs + 1) % numProcs;\n    }\n    else\n        holeIdx = ProcessorGroupInfo::HoleIndex;\n    __TBB_ASSERT( hardware_concurrency_info == initialization_complete, \"FindProcessorGroupIndex is used before AvailableHwConcurrency\" );\n    // Approximate the likely group index assuming all groups are of the same size\n    int i = procIdx / theProcessorGroups[0].numProcs;\n    // Make sure the approximation is a valid group index\n    if (i >= ProcessorGroupInfo::NumGroups) i = ProcessorGroupInfo::NumGroups-1;\n    // Now adjust the approximation up or down\n    if ( theProcessorGroups[i].numProcsRunningTotal > HoleAdjusted(procIdx, i) ) {\n        while ( theProcessorGroups[i].numProcsRunningTotal - theProcessorGroups[i].numProcs > HoleAdjusted(procIdx, i) ) {\n            __TBB_ASSERT( i > 0, NULL );\n            --i;\n        }\n    }\n    else {\n        do {\n            ++i;\n        } while ( theProcessorGroups[i].numProcsRunningTotal <= HoleAdjusted(procIdx, i) );\n    }\n    __TBB_ASSERT( i < ProcessorGroupInfo::NumGroups, NULL );\n    return i;\n}\n\nvoid MoveThreadIntoProcessorGroup( void* hThread, int groupIndex ) {\n    __TBB_ASSERT( hardware_concurrency_info == initialization_complete, \"MoveThreadIntoProcessorGroup is used before AvailableHwConcurrency\" );\n    if ( !TBB_SetThreadGroupAffinity )\n        return;\n    TBB_GROUP_AFFINITY ga = { theProcessorGroups[groupIndex].mask, (WORD)groupIndex, {0,0,0} };\n    TBB_SetThreadGroupAffinity( hThread, &ga, NULL );\n}\n\n#else\n    #error AvailableHwConcurrency is not implemented in this OS \n#endif /* OS */\n\n} // namespace internal\n} // namespace tbb\n\n#endif /* !__TBB_HardwareConcurrency */\n"
  },
  {
    "path": "benchmarks/tbb/tbb_profiling.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_profiling_H\n#define __TBB_profiling_H\n\nnamespace tbb {\n    namespace internal {\n\n        //\n        // This is not under __TBB_ITT_STRUCTURE_API because these values are used directly in flow_graph.h.  \n        //\n       \n        // include list of index names\n        #define TBB_STRING_RESOURCE(index_name,str) index_name,\n        enum string_index {\n           #include \"internal/_tbb_strings.h\"\n           NUM_STRINGS\n        };\n        #undef TBB_STRING_RESOURCE\n\n        enum itt_relation\n        {\n        __itt_relation_is_unknown = 0,\n        __itt_relation_is_dependent_on,         /**< \"A is dependent on B\" means that A cannot start until B completes */\n        __itt_relation_is_sibling_of,           /**< \"A is sibling of B\" means that A and B were created as a group */\n        __itt_relation_is_parent_of,            /**< \"A is parent of B\" means that A created B */\n        __itt_relation_is_continuation_of,      /**< \"A is continuation of B\" means that A assumes the dependencies of B */\n        __itt_relation_is_child_of,             /**< \"A is child of B\" means that A was created by B (inverse of is_parent_of) */\n        __itt_relation_is_continued_by,         /**< \"A is continued by B\" means that B assumes the dependencies of A (inverse of is_continuation_of) */\n        __itt_relation_is_predecessor_to        /**< \"A is predecessor to B\" means that B cannot start until A completes (inverse of is_dependent_on) */\n        };\n    \n    }\n}\n\n// Check if the tools support is enabled\n#if (_WIN32||_WIN64||__linux__) && !__MINGW32__ && TBB_USE_THREADING_TOOLS\n\n#if _WIN32||_WIN64\n#include <stdlib.h>  /* mbstowcs_s */\n#endif\n#include \"tbb_stddef.h\"\n\nnamespace tbb {\n    namespace internal {\n\n#if _WIN32||_WIN64\n        void __TBB_EXPORTED_FUNC itt_set_sync_name_v3( void *obj, const wchar_t* name );\n        inline size_t multibyte_to_widechar( wchar_t* wcs, const char* mbs, size_t bufsize) {\n#if _MSC_VER>=1400\n            size_t len;\n            mbstowcs_s( &len, wcs, bufsize, mbs, _TRUNCATE );\n            return len;   // mbstowcs_s counts null terminator\n#else\n            size_t len = mbstowcs( wcs, mbs, bufsize );\n            if(wcs && len!=size_t(-1) )\n                wcs[len<bufsize-1? len: bufsize-1] = wchar_t('\\0');\n            return len+1; // mbstowcs does not count null terminator\n#endif\n        }\n#else\n        void __TBB_EXPORTED_FUNC itt_set_sync_name_v3( void *obj, const char* name );\n#endif\n    } // namespace internal\n} // namespace tbb\n\n//! Macro __TBB_DEFINE_PROFILING_SET_NAME(T) defines \"set_name\" methods for sync objects of type T\n/** Should be used in the \"tbb\" namespace only.\n    Don't place semicolon after it to avoid compiler warnings. **/\n#if _WIN32||_WIN64\n    #define __TBB_DEFINE_PROFILING_SET_NAME(sync_object_type)                       \\\n        namespace profiling {                                                       \\\n            inline void set_name( sync_object_type& obj, const wchar_t* name ) {    \\\n                tbb::internal::itt_set_sync_name_v3( &obj, name );                  \\\n            }                                                                       \\\n            inline void set_name( sync_object_type& obj, const char* name ) {       \\\n                size_t len = tbb::internal::multibyte_to_widechar(NULL, name, 0);   \\\n                wchar_t *wname = new wchar_t[len];                                  \\\n                tbb::internal::multibyte_to_widechar(wname, name, len);             \\\n                set_name( obj, wname );                                             \\\n                delete[] wname;                                                     \\\n            }                                                                       \\\n        }\n#else /* !WIN */\n    #define __TBB_DEFINE_PROFILING_SET_NAME(sync_object_type)                       \\\n        namespace profiling {                                                       \\\n            inline void set_name( sync_object_type& obj, const char* name ) {       \\\n                tbb::internal::itt_set_sync_name_v3( &obj, name );                  \\\n            }                                                                       \\\n        }\n#endif /* !WIN */\n\n#else /* no tools support */\n\n#if _WIN32||_WIN64\n    #define __TBB_DEFINE_PROFILING_SET_NAME(sync_object_type)               \\\n        namespace profiling {                                               \\\n            inline void set_name( sync_object_type&, const wchar_t* ) {}    \\\n            inline void set_name( sync_object_type&, const char* ) {}       \\\n        }\n#else /* !WIN */\n    #define __TBB_DEFINE_PROFILING_SET_NAME(sync_object_type)               \\\n        namespace profiling {                                               \\\n            inline void set_name( sync_object_type&, const char* ) {}       \\\n        }\n#endif /* !WIN */\n\n#endif /* no tools support */\n\n#include \"atomic.h\"\n// Need these to work regardless of tools support\nnamespace tbb {\n    namespace internal {\n\n        enum notify_type {prepare=0, cancel, acquired, releasing};\n\n        const uintptr_t NUM_NOTIFY_TYPES = 4; // set to # elements in enum above\n\n        void __TBB_EXPORTED_FUNC call_itt_notify_v5(int t, void *ptr);\n        void __TBB_EXPORTED_FUNC itt_store_pointer_with_release_v3(void *dst, void *src);\n        void* __TBB_EXPORTED_FUNC itt_load_pointer_with_acquire_v3(const void *src);\n        void* __TBB_EXPORTED_FUNC itt_load_pointer_v3( const void* src );\n#if __TBB_ITT_STRUCTURE_API\n        enum itt_domain_enum { ITT_DOMAIN_FLOW=0 };\n\n        void __TBB_EXPORTED_FUNC itt_make_task_group_v7( itt_domain_enum domain, void *group, unsigned long long group_extra, \n                                                         void *parent, unsigned long long parent_extra, string_index name_index ); \n        void __TBB_EXPORTED_FUNC itt_metadata_str_add_v7( itt_domain_enum domain, void *addr, unsigned long long addr_extra, \n                                                          string_index key, const char *value ); \n        void __TBB_EXPORTED_FUNC itt_relation_add_v7( itt_domain_enum domain, void *addr0, unsigned long long addr0_extra, \n                                                      itt_relation relation, void *addr1, unsigned long long addr1_extra );\n        void __TBB_EXPORTED_FUNC itt_task_begin_v7( itt_domain_enum domain, void *task, unsigned long long task_extra, \n                                                    void *parent, unsigned long long parent_extra, string_index name_index );\n        void __TBB_EXPORTED_FUNC itt_task_end_v7( itt_domain_enum domain );\n#endif // __TBB_ITT_STRUCTURE_API\n\n        // two template arguments are to workaround /Wp64 warning with tbb::atomic specialized for unsigned type\n        template <typename T, typename U>\n        inline void itt_store_word_with_release(tbb::atomic<T>& dst, U src) {\n#if TBB_USE_THREADING_TOOLS\n            // This assertion should be replaced with static_assert\n            __TBB_ASSERT(sizeof(T) == sizeof(void *), \"Type must be word-sized.\");\n            itt_store_pointer_with_release_v3(&dst, (void *)uintptr_t(src));\n#else\n            dst = src;\n#endif // TBB_USE_THREADING_TOOLS\n        }\n\n        template <typename T>\n        inline T itt_load_word_with_acquire(const tbb::atomic<T>& src) {\n#if TBB_USE_THREADING_TOOLS\n            // This assertion should be replaced with static_assert\n            __TBB_ASSERT(sizeof(T) == sizeof(void *), \"Type must be word-sized.\");\n#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)\n            // Workaround for overzealous compiler warnings\n            #pragma warning (push)\n            #pragma warning (disable: 4311)\n#endif\n            T result = (T)itt_load_pointer_with_acquire_v3(&src);\n#if defined(_MSC_VER) && !defined(__INTEL_COMPILER)\n            #pragma warning (pop)\n#endif\n            return result;\n#else\n            return src;\n#endif // TBB_USE_THREADING_TOOLS\n        }\n\n        template <typename T>\n        inline void itt_store_word_with_release(T& dst, T src) {\n#if TBB_USE_THREADING_TOOLS\n            // This assertion should be replaced with static_assert\n            __TBB_ASSERT(sizeof(T) == sizeof(void *), \"Type must be word-sized.\");\n            itt_store_pointer_with_release_v3(&dst, (void *)src);\n#else\n            __TBB_store_with_release(dst, src); \n#endif // TBB_USE_THREADING_TOOLS\n        }\n\n        template <typename T>\n        inline T itt_load_word_with_acquire(const T& src) {\n#if TBB_USE_THREADING_TOOLS\n            // This assertion should be replaced with static_assert\n            __TBB_ASSERT(sizeof(T) == sizeof(void *), \"Type must be word-sized\");\n            return (T)itt_load_pointer_with_acquire_v3(&src);\n#else\n            return __TBB_load_with_acquire(src);\n#endif // TBB_USE_THREADING_TOOLS\n        }\n\n        template <typename T>\n        inline void itt_hide_store_word(T& dst, T src) {\n#if TBB_USE_THREADING_TOOLS\n            //TODO: This assertion should be replaced with static_assert\n            __TBB_ASSERT(sizeof(T) == sizeof(void *), \"Type must be word-sized\");\n            itt_store_pointer_with_release_v3(&dst, (void *)src);\n#else\n            dst = src;\n#endif\n        }\n\n        //TODO: rename to itt_hide_load_word_relaxed\n        template <typename T>\n        inline T itt_hide_load_word(const T& src) {\n#if TBB_USE_THREADING_TOOLS\n            //TODO: This assertion should be replaced with static_assert\n            __TBB_ASSERT(sizeof(T) == sizeof(void *), \"Type must be word-sized.\");\n            return (T)itt_load_pointer_v3(&src);\n#else\n            return src;\n#endif\n        }\n\n#if TBB_USE_THREADING_TOOLS\n        inline void call_itt_notify(notify_type t, void *ptr) {\n            call_itt_notify_v5((int)t, ptr);\n        }\n\n#else\n        inline void call_itt_notify(notify_type /*t*/, void * /*ptr*/) {}\n\n#endif // TBB_USE_THREADING_TOOLS\n\n#if __TBB_ITT_STRUCTURE_API\n        inline void itt_make_task_group( itt_domain_enum domain, void *group, unsigned long long group_extra, \n                                         void *parent, unsigned long long parent_extra, string_index name_index ) {\n            itt_make_task_group_v7( domain, group, group_extra, parent, parent_extra, name_index ); \n        }\n\n        inline void itt_metadata_str_add( itt_domain_enum domain, void *addr, unsigned long long addr_extra, \n                                          string_index key, const char *value ) {\n            itt_metadata_str_add_v7( domain, addr, addr_extra, key, value ); \n        }\n\n        inline void itt_relation_add( itt_domain_enum domain, void *addr0, unsigned long long addr0_extra, \n                                      itt_relation relation, void *addr1, unsigned long long addr1_extra ) {\n            itt_relation_add_v7( domain, addr0, addr0_extra, relation, addr1, addr1_extra );\n        }\n\n        inline void itt_task_begin( itt_domain_enum domain, void *task, unsigned long long task_extra, \n                                                        void *parent, unsigned long long parent_extra, string_index name_index ) {\n            itt_task_begin_v7( domain, task, task_extra, parent, parent_extra, name_index );\n        }\n\n        inline void itt_task_end( itt_domain_enum domain ) {\n            itt_task_end_v7( domain );\n        }\n#endif // __TBB_ITT_STRUCTURE_API\n\n    } // namespace internal\n} // namespace tbb\n\n#endif /* __TBB_profiling_H */\n"
  },
  {
    "path": "benchmarks/tbb/tbb_resource.rc",
    "content": "// Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n//\n// This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n// you can redistribute it and/or modify it under the terms of the GNU General Public License\n// version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n// distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n// implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n// See  the GNU General Public License for more details.   You should have received a copy of\n// the  GNU General Public License along with Threading Building Blocks; if not, write to the\n// Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n//\n// As a special exception,  you may use this file  as part of a free software library without\n// restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n// functions from this file, or you compile this file and link it with other files to produce\n// an executable,  this file does not by itself cause the resulting executable to be covered\n// by the GNU General Public License. This exception does not however invalidate any other\n// reasons why the executable file might be covered by the GNU General Public License.\n\n// Microsoft Visual C++ generated resource script.\n//\n#ifdef APSTUDIO_INVOKED\n#ifndef APSTUDIO_READONLY_SYMBOLS\n#define _APS_NO_MFC                     1\n#define _APS_NEXT_RESOURCE_VALUE        102\n#define _APS_NEXT_COMMAND_VALUE         40001\n#define _APS_NEXT_CONTROL_VALUE         1001\n#define _APS_NEXT_SYMED_VALUE           101\n#endif\n#endif\n\n#define APSTUDIO_READONLY_SYMBOLS\n/////////////////////////////////////////////////////////////////////////////\n//\n// Generated from the TEXTINCLUDE 2 resource.\n//\n#include <winresrc.h>\n#define ENDL \"\\r\\n\"\n#include \"tbb_version.h\"\n\n/////////////////////////////////////////////////////////////////////////////\n#undef APSTUDIO_READONLY_SYMBOLS\n\n/////////////////////////////////////////////////////////////////////////////\n// Neutral resources\n\n//#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU)\n#ifdef _WIN32\nLANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL\n#pragma code_page(1252)\n#endif //_WIN32\n\n/////////////////////////////////////////////////////////////////////////////\n// manifest integration\n#ifdef TBB_MANIFEST\n#include \"winuser.h\"\n2 RT_MANIFEST tbbmanifest.exe.manifest\n#endif\n\n/////////////////////////////////////////////////////////////////////////////\n//\n// Version\n//\n\nVS_VERSION_INFO VERSIONINFO\n FILEVERSION TBB_VERNUMBERS\n PRODUCTVERSION TBB_VERNUMBERS\n FILEFLAGSMASK 0x17L\n#ifdef _DEBUG\n FILEFLAGS 0x1L\n#else\n FILEFLAGS 0x0L\n#endif\n FILEOS 0x40004L\n FILETYPE 0x2L\n FILESUBTYPE 0x0L\nBEGIN\n    BLOCK \"StringFileInfo\"\n    BEGIN\n        BLOCK \"000004b0\"\n        BEGIN\n            VALUE \"CompanyName\", \"Intel Corporation\\0\"\n            VALUE \"FileDescription\", \"Intel(R) Threading Building Blocks library\\0\"\n            VALUE \"FileVersion\", TBB_VERSION \"\\0\"\n            VALUE \"LegalCopyright\", \"Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\\0\"\n            VALUE \"LegalTrademarks\", \"\\0\"\n#ifndef TBB_USE_DEBUG\n            VALUE \"OriginalFilename\", \"tbb.dll\\0\"\n#else\n            VALUE \"OriginalFilename\", \"tbb_debug.dll\\0\"\n#endif\n            VALUE \"ProductName\", \"Intel(R) Threading Building Blocks for Windows\\0\"\n            VALUE \"ProductVersion\", TBB_VERSION \"\\0\"\n            VALUE \"PrivateBuild\", \"\\0\"\n            VALUE \"SpecialBuild\", \"\\0\"\n        END\n    END\n    BLOCK \"VarFileInfo\"\n    BEGIN\n        VALUE \"Translation\", 0x0, 1200\n    END\nEND\n\n//#endif    // Neutral resources\n/////////////////////////////////////////////////////////////////////////////\n\n\n#ifndef APSTUDIO_INVOKED\n/////////////////////////////////////////////////////////////////////////////\n//\n// Generated from the TEXTINCLUDE 3 resource.\n//\n\n\n/////////////////////////////////////////////////////////////////////////////\n#endif    // not APSTUDIO_INVOKED\n\n"
  },
  {
    "path": "benchmarks/tbb/tbb_statistics.cpp",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#include \"tbb_statistics.h\"\n\n#if __TBB_STATISTICS\n\n#include <climits>\n#include <cstdarg>\n#if __TBB_STATISTICS_STDOUT\n#include <cstdio>\n#endif\n\n#include \"tbb/spin_mutex.h\"\n\nnamespace tbb {\nnamespace internal {\n\n//! Human readable titles of statistics groups defined by statistics_groups enum.\n/** The order of this vector elements must correspond to the statistics_counters \n    structure layout. **/\nconst char* StatGroupTitles[] = { \n    \"task objects\", \"tasks executed\", \"stealing attempts\", \"task proxies\", \"arena\", \"market\", \"priority ops\", \"prio ops details\"\n};\n\n//! Human readable titles of statistics elements defined by statistics_counters struct.\n/** The order of this vector elements must correspond to the statistics_counters \n    structure layout (with NULLs interspersed to separate groups). **/\nconst char* StatFieldTitles[] = {\n    /*task objects*/        \"active\", \"freed\", \"big\", NULL,\n    /*tasks executed*/      \"total\", \"w/o spawn\", NULL,\n    /*stealing attempts*/   \"succeeded\", \"failed\", \"conflicts\", \"backoffs\", NULL,\n    /*task proxies*/        \"mailed\", \"revoked\", \"stolen\", \"bypassed\", \"ignored\", NULL,\n    /*arena*/               \"switches\", \"roundtrips\", \"avg.conc\", \"avg.allot\", NULL,\n    /*market*/              \"roundtrips\", NULL,\n    /*priority ops*/        \"ar.switch\", \"mkt.switch\", \"ar.reset\", \"ref.fixup\", \"avg.ar.pr\", \"avg.mkt.pr\", NULL,\n    /*prio ops details*/    \"winnows\", \"reloads\", \"orphaned\", \"winnowed\", \"reloaded\", NULL\n};\n\n//! Class for logging statistics\n/** There should be only one instance of this class. \n    Results are written to a file \"statistics.txt\" in tab-separated format. */\nclass statistics_logger {\npublic:\n    statistics_logger () {\n        __TBB_ASSERT( sg_end - 1 == 1 << (sizeof(StatGroupTitles)/sizeof(*StatGroupTitles) - 1), NULL );\n\n        my_file = fopen(\"statistics.txt\",\"w\");\n        if( !my_file )\n            perror(\"fopen(\\\"statistics.txt\\\"\\\")\");\n        // Initialize groups dump layout info\n        group_start_field[0] = 0;\n        for ( size_t i = 0, j = 0; i < NumGroups; ++i, ++j ) {\n            __TBB_ASSERT( StatFieldTitles[j], \"Empty group occurred\" );\n            while ( StatFieldTitles[j] )\n                ++j;\n            group_start_field[i + 1] = j - i; // -i accounts for preceding NULL separators\n        }\n        __TBB_ASSERT( group_start_field[NumGroups] == statistics_counters::size(),\n                      \"Wrong number of elements in StatFieldTitles\" );\n        dump( \"%-*s\", IDColumnWidth, \"\");\n        process_groups( &statistics_logger::print_group_title );\n        dump( \"%-*s\", IDColumnWidth, \"ID\");\n        process_groups( &statistics_logger::print_field_titles );\n    }\n\n    ~statistics_logger () { fclose(my_file); }\n\n    void record( const statistics_counters& c, size_t id ) {\n        spin_mutex::scoped_lock lock(my_mutex);\n        counters_to_dump = &c;\n#if __TBB_STATISTICS_TOTALS_ONLY\n        if ( id == arena_counters_total ) {\n            dump( \"%-*s\", IDColumnWidth, \"Tot\" );\n            process_groups( &statistics_logger::print_field_values );\n        }\n#else /* !__TBB_STATISTICS_TOTALS_ONLY */\n        const char* idString = NULL;\n        switch ( id ) {\n        case 0:\n            idString = \"M\"; break;\n        case workers_counters_total:\n            idString = \"Wtot\"; break;\n        case arena_counters_total:\n            idString = \"Tot\"; break;\n        default:\n            dump( \"W%-*u\", IDColumnWidth - 1, id );\n        }\n        if ( idString )\n            dump( \"%-*s\", IDColumnWidth, idString );\n        process_groups( &statistics_logger::print_field_values );\n#endif /* !__TBB_STATISTICS_TOTALS_ONLY */\n    }\nprivate:\n    static const size_t IDColumnWidth = 5;\n    static const size_t StatisticsColumnWidth = 10;\n    static const size_t NumGroups = sizeof(StatGroupTitles)/sizeof(char*);\n\n    //! File into which statistics are written.\n    FILE* my_file;\n    //! Mutex that serializes accesses to my_file\n    spin_mutex my_mutex;\n    //! Indices of the each group's first field in statistics_counters struct.\n    /** An extra element is used to track the total number of statistics fields. **/\n    size_t group_start_field[NumGroups + 1];\n    //! Currently processed set of counters.\n    const statistics_counters* counters_to_dump;\n\n    static const size_t NumFields = sizeof(StatFieldTitles)/sizeof(*StatFieldTitles) - NumGroups;\n    bool averages_fields[NumFields];\n\n    void dump ( char const* fmt, ... ) {\n        va_list args;\n        if ( my_file ) {\n            va_start( args, fmt );\n            vfprintf( my_file, fmt, args );\n            va_end( args );\n        }\n#if __TBB_STATISTICS_STDOUT\n        va_start( args, fmt );\n        vprintf( fmt, args );\n        va_end( args );\n#endif\n    }\n\n    void process_groups ( void (statistics_logger::*per_group_action)(size_t group_idx) ) {\n        for ( size_t i = 0, group_flag = 1; i < NumGroups; ++i, group_flag <<= 1 ) {\n            __TBB_ASSERT( group_flag < sg_end, \"StatGroupTitles contents is incompatible with statistics_groups definition\" );\n            if ( __TBB_ActiveStatisticsGroups & group_flag )\n                (this->*per_group_action)( i );\n        }\n        dump( \"\\n\" );\n    }\n\n    void print_group_title ( size_t group_idx ) {\n        dump( \"%-*s\", (group_start_field[group_idx + 1] - group_start_field[group_idx]) * (StatisticsColumnWidth + 1),\n                        StatGroupTitles[group_idx] );\n    }\n\n    void print_field_titles ( size_t group_idx ) {\n        // +group_idx accounts for preceding NULL separators\n        size_t i = group_start_field[group_idx] + group_idx;\n        while ( StatFieldTitles[i] ) {\n            averages_fields[i - group_idx] = strncmp(StatFieldTitles[i], \"avg.\", 4) == 0;\n            dump( \"%-*s \", StatisticsColumnWidth, StatFieldTitles[i++] );\n        }\n    }\n\n    void print_field_values ( size_t group_idx ) {\n        size_t begin = group_start_field[group_idx],\n               end = group_start_field[group_idx + 1];\n        for ( size_t i = begin; i < end; ++i ) {\n            if ( averages_fields[i] )\n                dump( \"%-*.2f \", StatisticsColumnWidth, (double)counters_to_dump->field(i)/counters_to_dump->tasks_executed );\n            else\n                dump( \"%-*ld \", StatisticsColumnWidth, counters_to_dump->field(i) );\n        }\n    }\n}; // class statistics_logger\n\nstatic statistics_logger the_statistics;\n\nvoid dump_statistics ( const statistics_counters& c, size_t id ) {\n    the_statistics.record(c, id);\n}\n\n} // namespace internal\n} // namespace tbb\n\n#endif /* __TBB_STATISTICS */\n"
  },
  {
    "path": "benchmarks/tbb/tbb_statistics.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef _TBB_tbb_statistics_H\n#define _TBB_tbb_statistics_H\n\n/**\n    This file defines parameters of the internal statistics collected by the TBB\n    library (currently by the task scheduler only).\n    \n    Statistics is accumulated separately in each thread and is dumped when \n    the scheduler instance associated with the given  thread is destroyed.\n    For apps with multiple master threads or with the same master repeatedly\n    initializing and then deinitializing task scheduler this results in TBB\n    workers statistics getting inseparably mixed.\n    \n    Therefore statistics is accumulated in arena slots, and should be dumped\n    when arena is destroyed. This separates statistics collected for each\n    scheduler activity region in each master thread.\n\n    With the current RML implementation (TBB 2.2, 3.0) to avoid complete loss of \n    statistics data during app shutdown (because of lazy workers deinitialization \n    logic) set __TBB_STATISTICS_EARLY_DUMP macro to write the statistics at the \n    moment a master thread deinitializes its scheduler. This may happen a little \n    earlier than the moment of arena destruction resulting in the following undesired\n    (though usually tolerable) effects:\n    - a few events related to unsuccessful stealing or thread pool activity may be lost,\n    - statistics may be substantially incomplete in case of FIFO tasks used in \n      the FAF mode.\n\n    Macro __TBB_STATISTICS_STDOUT and global variable __TBB_ActiveStatisticsGroups\n    defined below can be used to configure the statistics output.\n\n    To add new counter:\n    1) Insert it into the appropriate group range in statistics_counters;\n    2) Insert the corresponding field title into StatFieldTitles (preserving \n       relative order of the fields).\n\n    To add new counters group:\n    1) Insert new group bit flag into statistics_groups;\n    2) Insert the new group title into StatGroupTitles (preserving \n       relative order of the groups).\n    3) Add counter belonging to the new group as described above\n**/\n\n#include \"tbb/tbb_stddef.h\"\n\n#ifndef __TBB_STATISTICS\n#define __TBB_STATISTICS 0\n#endif /* __TBB_STATISTICS */\n\n#if __TBB_STATISTICS\n\n#include <string.h>  // for memset\n\n//! Dump counters into stdout as well.\n/** By default statistics counters are written to the file \"statistics.txt\" only. **/\n#define __TBB_STATISTICS_STDOUT 1\n\n//! Dump only totals for all threads in the given arena\n/** By default statistics counters for each arena slot are dumped separately, as\n    well as the subtotal for workers. **/\n#define __TBB_STATISTICS_TOTALS_ONLY 1\n\n//! Dump statistics for an arena when its master completes\n/** By default (when this macro is not set) the statistics is sent to output when\n    arena object is destroyed. But with the current lazy workers termination\n    logic default behavior may result in loosing all statistics output. **/\n#define __TBB_STATISTICS_EARLY_DUMP 1\n\n#define GATHER_STATISTIC(x) (x)\n\nnamespace tbb {\nnamespace internal {\n\n//! Groups of statistics counters.\n/** The order of enumerators must be the same as the order of the corresponding\n    field groups in the statistics_counters structure. **/\nenum statistics_groups {\n    sg_task_allocation = 0x01,\n    sg_task_execution = 0x02,\n    sg_stealing = 0x04,\n    sg_affinity = 0x08,\n    sg_arena = 0x10,\n    sg_market = 0x20,\n    sg_prio = 0x40,\n    sg_prio_ex = 0x80,\n    // List end marker. Insert new groups only before it.\n    sg_end\n};\n\n//! Groups of counters to output\nconst uintptr_t __TBB_ActiveStatisticsGroups = sg_task_execution | sg_stealing | sg_affinity | sg_arena | sg_market;\n\n//! A set of various statistics counters that are updated by the library on per thread basis.\n/** All the fields must be of the same type (statistics_counters::counter_type).\n    This is necessary to allow reinterpreting this structure as an array. **/\nstruct statistics_counters {\n    typedef long counter_type;\n\n    // Group: sg_task_allocation\n    // Counters in this group can have negative values as the tasks migrate across \n    // threads while the associated counters are updated in the current thread only\n    // to avoid data races\n    \n    //! Number of tasks allocated and not yet destroyed\n    counter_type active_tasks;\n    //! Number of task corpses stored for future reuse\n    counter_type free_list_length;\n    //! Number of big tasks allocated during the run\n    /** To find total number of tasks malloc'd, compute (big_tasks+my_small_task_count) */\n    counter_type big_tasks;\n    \n    // Group: sg_task_execution\n\n    //! Number of tasks executed\n    counter_type tasks_executed;\n    //! Number of elided spawns\n    counter_type spawns_bypassed;\n    \n    // Group: sg_stealing\n\n    //! Number of tasks successfully stolen\n    counter_type steals_committed;\n    //! Number of failed stealing attempts\n    counter_type steals_failed;\n    //! Number of failed attempts to lock victim's task pool\n    counter_type thieves_conflicts;\n    //! Number of times thief backed off because of the collision with the owner\n    counter_type thief_backoffs;\n\n    // Group: sg_affinity\n\n    //! Number of tasks received from mailbox\n    counter_type mails_received;\n    //! Number of affinitized tasks executed by the owner\n    /** Goes as \"revoked\" in statistics printout. **/\n    counter_type proxies_executed;\n    //! Number of affinitized tasks intercepted by thieves \n    counter_type proxies_stolen;\n    //! Number of proxy bypasses by thieves during stealing\n    counter_type proxies_bypassed;\n    //! Number of affinitized tasks executed by the owner via scheduler bypass mechanism\n    counter_type affinity_ignored;\n\n    // Group: sg_arena\n\n    //! Number of times the state of arena switched between \"full\" and \"empty\"\n    counter_type gate_switches;\n    //! Number of times workers left an arena and returned into the market\n    counter_type arena_roundtrips;\n    // !Average concurrency level of this arena\n    counter_type avg_arena_concurrency;\n    //! Average assigned priority\n    counter_type avg_assigned_workers;\n\n    // Group: sg_market\n\n    //! Number of times workers left the market and returned into RML\n    counter_type market_roundtrips;\n\n    // Group; sg_prio\n\n    //! Number of arena priority switches\n    counter_type arena_prio_switches;\n    //! Number of market priority switches\n    counter_type market_prio_switches;\n    //! Number of arena priority switches\n    counter_type arena_prio_resets;\n    //! Number of reference priority source fixups to avoid deadlock\n    counter_type prio_ref_fixups;\n    //! Average arena priority\n    counter_type avg_arena_prio;\n    //! Average market priority\n    counter_type avg_market_prio;\n\n    // Group; sg_prio_ex\n\n    //! Number of times local task pools were winnowed\n    counter_type prio_winnowings;\n    //! Number of times secondary task pools were searched for top priority tasks\n    counter_type prio_reloads;\n    //! Number of times secondary task pools were abandoned by quitting workers\n    counter_type prio_orphanings;\n    //! Number of tasks offloaded into secondary task pools\n    counter_type prio_tasks_offloaded;\n    //! Number of tasks reloaded from secondary task pools\n    counter_type prio_tasks_reloaded;\n\n    // Constructor and helpers\n\n    statistics_counters() { reset(); }\n\n    void reset () { memset( this, 0, sizeof(statistics_counters) ); }\n\n    counter_type& field ( size_t index ) { return reinterpret_cast<counter_type*>(this)[index]; }\n\n    const counter_type& field ( size_t index ) const { return reinterpret_cast<const counter_type*>(this)[index]; }\n\n    static size_t size () { return sizeof(statistics_counters) / sizeof(counter_type); }\n\n    const statistics_counters& operator += ( const statistics_counters& rhs ) {\n        for ( size_t i = 0; i < size(); ++i )\n            field(i) += rhs.field(i);\n        return *this;\n    }\n}; // statistics_counters\n\nstatic const size_t workers_counters_total = (size_t)-1;\nstatic const size_t arena_counters_total = (size_t)-2;\n\nvoid dump_statistics ( const statistics_counters& c, size_t id );\n\n} // namespace internal\n} // namespace tbb\n\n#else /* !__TBB_STATISTICS */\n\n#define GATHER_STATISTIC(x) ((void)0)\n\n#endif /* !__TBB_STATISTICS */\n\n#endif /* _TBB_tbb_statistics_H */\n"
  },
  {
    "path": "benchmarks/tbb/tbb_stddef.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_tbb_stddef_H\n#define __TBB_tbb_stddef_H\n\n// Marketing-driven product version\n#define TBB_VERSION_MAJOR 4\n#define TBB_VERSION_MINOR 3\n\n// Engineering-focused interface version\n#define TBB_INTERFACE_VERSION 8000\n#define TBB_INTERFACE_VERSION_MAJOR TBB_INTERFACE_VERSION/1000\n\n// The oldest major interface version still supported\n// To be used in SONAME, manifests, etc.\n#define TBB_COMPATIBLE_INTERFACE_VERSION 2\n\n#define __TBB_STRING_AUX(x) #x\n#define __TBB_STRING(x) __TBB_STRING_AUX(x)\n\n// We do not need defines below for resource processing on windows\n#if !defined RC_INVOKED\n\n// Define groups for Doxygen documentation\n/**\n * @defgroup algorithms         Algorithms\n * @defgroup containers         Containers\n * @defgroup memory_allocation  Memory Allocation\n * @defgroup synchronization    Synchronization\n * @defgroup timing             Timing\n * @defgroup task_scheduling    Task Scheduling\n */\n\n// Simple text that is displayed on the main page of Doxygen documentation.\n/**\n * \\mainpage Main Page\n *\n * Click the tabs above for information about the\n * - <a href=\"./modules.html\">Modules</a> (groups of functionality) implemented by the library\n * - <a href=\"./annotated.html\">Classes</a> provided by the library\n * - <a href=\"./files.html\">Files</a> constituting the library.\n * .\n * Please note that significant part of TBB functionality is implemented in the form of\n * template functions, descriptions of which are not accessible on the <a href=\"./annotated.html\">Classes</a>\n * tab. Use <a href=\"./modules.html\">Modules</a> or <a href=\"./namespacemembers.html\">Namespace/Namespace Members</a>\n * tabs to find them.\n *\n * Additional pieces of information can be found here\n * - \\subpage concepts\n * .\n */\n\n/** \\page concepts TBB concepts\n\n    A concept is a set of requirements to a type, which are necessary and sufficient\n    for the type to model a particular behavior or a set of behaviors. Some concepts\n    are specific to a particular algorithm (e.g. algorithm body), while other ones\n    are common to several algorithms (e.g. range concept).\n\n    All TBB algorithms make use of different classes implementing various concepts.\n    Implementation classes are supplied by the user as type arguments of template\n    parameters and/or as objects passed as function call arguments. The library\n    provides predefined  implementations of some concepts (e.g. several kinds of\n    \\ref range_req \"ranges\"), while other ones must always be implemented by the user.\n\n    TBB defines a set of minimal requirements each concept must conform to. Here is\n    the list of different concepts hyperlinked to the corresponding requirements specifications:\n    - \\subpage range_req\n    - \\subpage parallel_do_body_req\n    - \\subpage parallel_for_body_req\n    - \\subpage parallel_reduce_body_req\n    - \\subpage parallel_scan_body_req\n    - \\subpage parallel_sort_iter_req\n**/\n\n// tbb_config.h should be included the first since it contains macro definitions used in other headers\n#include \"tbb_config.h\"\n\n#if _MSC_VER >=1400\n    #define __TBB_EXPORTED_FUNC   __cdecl\n    #define __TBB_EXPORTED_METHOD __thiscall\n#else\n    #define __TBB_EXPORTED_FUNC\n    #define __TBB_EXPORTED_METHOD\n#endif\n\n#if __INTEL_COMPILER || _MSC_VER\n#define __TBB_NOINLINE(decl) __declspec(noinline) decl\n#elif __GNUC__\n#define __TBB_NOINLINE(decl) decl __attribute__ ((noinline))\n#else\n#define __TBB_NOINLINE(decl) decl\n#endif\n\n#if __TBB_NOEXCEPT_PRESENT\n#define __TBB_NOEXCEPT(expression) noexcept(expression)\n#else\n#define __TBB_NOEXCEPT(expression)\n#endif\n\n#include <cstddef>      /* Need size_t and ptrdiff_t */\n\n#if _MSC_VER\n    #define __TBB_tbb_windef_H\n    #include \"internal/_tbb_windef.h\"\n    #undef __TBB_tbb_windef_H\n#endif\n#if !defined(_MSC_VER) || _MSC_VER>=1600\n    #include <stdint.h>\n#endif\n\n//! Type for an assertion handler\ntypedef void(*assertion_handler_type)( const char* filename, int line, const char* expression, const char * comment );\n\n#if TBB_USE_ASSERT\n\n     #define __TBB_ASSERT_NS(predicate,message,ns) ((predicate)?((void)0) : ns::assertion_failure(__FILE__,__LINE__,#predicate,message))\n    //! Assert that x is true.\n    /** If x is false, print assertion failure message.\n        If the comment argument is not NULL, it is printed as part of the failure message.\n        The comment argument has no other effect. */\n#if __TBBMALLOC_BUILD\nnamespace rml { namespace internal {\n    #define __TBB_ASSERT(predicate,message) __TBB_ASSERT_NS(predicate,message,rml::internal)\n#else\nnamespace tbb {\n    #define __TBB_ASSERT(predicate,message) __TBB_ASSERT_NS(predicate,message,tbb)\n#endif\n\n    #define __TBB_ASSERT_EX __TBB_ASSERT\n\n    //! Set assertion handler and return previous value of it.\n    assertion_handler_type __TBB_EXPORTED_FUNC set_assertion_handler( assertion_handler_type new_handler );\n\n    //! Process an assertion failure.\n    /** Normally called from __TBB_ASSERT macro.\n        If assertion handler is null, print message for assertion failure and abort.\n        Otherwise call the assertion handler. */\n    void __TBB_EXPORTED_FUNC assertion_failure( const char* filename, int line, const char* expression, const char* comment );\n\n#if __TBBMALLOC_BUILD\n}}  // namespace rml::internal\n#else\n} // namespace tbb\n#endif\n#else /* !TBB_USE_ASSERT */\n\n    //! No-op version of __TBB_ASSERT.\n    #define __TBB_ASSERT(predicate,comment) ((void)0)\n    //! \"Extended\" version is useful to suppress warnings if a variable is only used with an assert\n    #define __TBB_ASSERT_EX(predicate,comment) ((void)(1 && (predicate)))\n\n#endif /* !TBB_USE_ASSERT */\n\n//! The namespace tbb contains all components of the library.\nnamespace tbb {\n\n#if _MSC_VER && _MSC_VER<1600\n    namespace internal {\n        typedef __int8 int8_t;\n        typedef __int16 int16_t;\n        typedef __int32 int32_t;\n        typedef __int64 int64_t;\n        typedef unsigned __int8 uint8_t;\n        typedef unsigned __int16 uint16_t;\n        typedef unsigned __int32 uint32_t;\n        typedef unsigned __int64 uint64_t;\n    } // namespace internal\n#else /* Posix */\n    namespace internal {\n        using ::int8_t;\n        using ::int16_t;\n        using ::int32_t;\n        using ::int64_t;\n        using ::uint8_t;\n        using ::uint16_t;\n        using ::uint32_t;\n        using ::uint64_t;\n    } // namespace internal\n#endif /* Posix */\n\n    using std::size_t;\n    using std::ptrdiff_t;\n\n//! The function returns the interface version of the TBB shared library being used.\n/**\n * The version it returns is determined at runtime, not at compile/link time.\n * So it can be different than the value of TBB_INTERFACE_VERSION obtained at compile time.\n */\nextern \"C\" int __TBB_EXPORTED_FUNC TBB_runtime_interface_version();\n\n//! Dummy type that distinguishes splitting constructor from copy constructor.\n/**\n * See description of parallel_for and parallel_reduce for example usages.\n * @ingroup algorithms\n */\nclass split {\n};\n\n//! Type enables transmission of splitting proportion from partitioners to range objects\n/**\n * In order to make use of such facility Range objects must implement\n * splitting constructor with this type passed and initialize static\n * constant boolean field 'is_divisible_in_proportion' with the value\n * of 'true'\n */\nclass proportional_split {\npublic:\n    proportional_split(size_t _left = 1, size_t _right = 1) : my_left(_left), my_right(_right) { }\n    proportional_split(split) : my_left(1), my_right(1) { }\n\n    size_t left() const { return my_left; }\n    size_t right() const { return my_right; }\n\n    void set_proportion(size_t _left, size_t _right) {\n        my_left = _left;\n        my_right = _right;\n    }\n\n    // used when range does not support proportional split\n    operator split() const { return split(); }\nprivate:\n    size_t my_left, my_right;\n};\n\n/**\n * @cond INTERNAL\n * @brief Identifiers declared inside namespace internal should never be used directly by client code.\n */\nnamespace internal {\n\n//! Compile-time constant that is upper bound on cache line/sector size.\n/** It should be used only in situations where having a compile-time upper\n    bound is more useful than a run-time exact answer.\n    @ingroup memory_allocation */\nconst size_t NFS_MaxLineSize = 128;\n\n/** Label for data that may be accessed from different threads, and that may eventually become wrapped\n    in a formal atomic type.\n\n    Note that no problems have yet been observed relating to the definition currently being empty,\n    even if at least \"volatile\" would seem to be in order to avoid data sometimes temporarily hiding\n    in a register (although \"volatile\" as a \"poor man's atomic\" lacks several other features of a proper\n    atomic, some of which are now provided instead through specialized functions).\n\n    Note that usage is intentionally compatible with a definition as qualifier \"volatile\",\n    both as a way to have the compiler help enforce use of the label and to quickly rule out\n    one potential issue.\n\n    Note however that, with some architecture/compiler combinations, e.g. on IA-64 architecture, \"volatile\"\n    also has non-portable memory semantics that are needlessly expensive for \"relaxed\" operations.\n\n    Note that this must only be applied to data that will not change bit patterns when cast to/from\n    an integral type of the same length; tbb::atomic must be used instead for, e.g., floating-point types.\n\n    TODO: apply wherever relevant **/\n#define __TBB_atomic // intentionally empty, see above\n\ntemplate<class T, size_t S, size_t R>\nstruct padded_base : T {\n    char pad[S - R];\n};\ntemplate<class T, size_t S> struct padded_base<T, S, 0> : T {};\n\n//! Pads type T to fill out to a multiple of cache line size.\ntemplate<class T, size_t S = NFS_MaxLineSize>\nstruct padded : padded_base<T, S, sizeof(T) % S> {};\n\n//! Extended variant of the standard offsetof macro\n/** The standard offsetof macro is not sufficient for TBB as it can be used for\n    POD-types only. The constant 0x1000 (not NULL) is necessary to appease GCC. **/\n#define __TBB_offsetof(class_name, member_name) \\\n    ((ptrdiff_t)&(reinterpret_cast<class_name*>(0x1000)->member_name) - 0x1000)\n\n//! Returns address of the object containing a member with the given name and address\n#define __TBB_get_object_ref(class_name, member_name, member_addr) \\\n    (*reinterpret_cast<class_name*>((char*)member_addr - __TBB_offsetof(class_name, member_name)))\n\n//! Throws std::runtime_error with what() returning error_code description prefixed with aux_info\nvoid __TBB_EXPORTED_FUNC handle_perror( int error_code, const char* aux_info );\n\n#if TBB_USE_EXCEPTIONS\n    #define __TBB_TRY try\n    #define __TBB_CATCH(e) catch(e)\n    #define __TBB_THROW(e) throw e\n    #define __TBB_RETHROW() throw\n#else /* !TBB_USE_EXCEPTIONS */\n    inline bool __TBB_false() { return false; }\n    #define __TBB_TRY\n    #define __TBB_CATCH(e) if ( tbb::internal::__TBB_false() )\n    #define __TBB_THROW(e) ((void)0)\n    #define __TBB_RETHROW() ((void)0)\n#endif /* !TBB_USE_EXCEPTIONS */\n\n//! Report a runtime warning.\nvoid __TBB_EXPORTED_FUNC runtime_warning( const char* format, ... );\n\n#if TBB_USE_ASSERT\nstatic void* const poisoned_ptr = reinterpret_cast<void*>(-1);\n\n//! Set p to invalid pointer value.\n//  Also works for regular (non-__TBB_atomic) pointers.\ntemplate<typename T>\ninline void poison_pointer( T* __TBB_atomic & p ) { p = reinterpret_cast<T*>(poisoned_ptr); }\n\n/** Expected to be used in assertions only, thus no empty form is defined. **/\ntemplate<typename T>\ninline bool is_poisoned( T* p ) { return p == reinterpret_cast<T*>(poisoned_ptr); }\n#else\ntemplate<typename T>\ninline void poison_pointer( T* __TBB_atomic & ) {/*do nothing*/}\n#endif /* !TBB_USE_ASSERT */\n\n//! Cast between unrelated pointer types.\n/** This method should be used sparingly as a last resort for dealing with\n    situations that inherently break strict ISO C++ aliasing rules. */\n// T is a pointer type because it will be explicitly provided by the programmer as a template argument;\n// U is a referent type to enable the compiler to check that \"ptr\" is a pointer, deducing U in the process.\ntemplate<typename T, typename U>\ninline T punned_cast( U* ptr ) {\n    uintptr_t x = reinterpret_cast<uintptr_t>(ptr);\n    return reinterpret_cast<T>(x);\n}\n\n//! Base class for types that should not be assigned.\nclass no_assign {\n    // Deny assignment\n    void operator=( const no_assign& );\npublic:\n#if __GNUC__\n    //! Explicitly define default construction, because otherwise gcc issues gratuitous warning.\n    no_assign() {}\n#endif /* __GNUC__ */\n};\n\n//! Base class for types that should not be copied or assigned.\nclass no_copy: no_assign {\n    //! Deny copy construction\n    no_copy( const no_copy& );\npublic:\n    //! Allow default construction\n    no_copy() {}\n};\n\n#if TBB_DEPRECATED_MUTEX_COPYING\nclass mutex_copy_deprecated_and_disabled {};\n#else\n// By default various implementations of mutexes are not copy constructible\n// and not copy assignable.\nclass mutex_copy_deprecated_and_disabled : no_copy {};\n#endif\n\n//! A function to check if passed in pointer is aligned on a specific border\ntemplate<typename T>\ninline bool is_aligned(T* pointer, uintptr_t alignment) {\n    return 0==((uintptr_t)pointer & (alignment-1));\n}\n\n//! A function to check if passed integer is a power of 2\ntemplate<typename integer_type>\ninline bool is_power_of_two(integer_type arg) {\n    return arg && (0 == (arg & (arg - 1)));\n}\n\n//! A function to compute arg modulo divisor where divisor is a power of 2.\ntemplate<typename argument_integer_type, typename divisor_integer_type>\ninline argument_integer_type modulo_power_of_two(argument_integer_type arg, divisor_integer_type divisor) {\n    // Divisor is assumed to be a power of two (which is valid for current uses).\n    __TBB_ASSERT( is_power_of_two(divisor), \"Divisor should be a power of two\" );\n    return (arg & (divisor - 1));\n}\n\n\n//! A function to determine if \"arg is a multiplication of a number and a power of 2\".\n// i.e. for strictly positive i and j, with j a power of 2,\n// determines whether i==j<<k for some nonnegative k (so i==j yields true).\ntemplate<typename argument_integer_type, typename divisor_integer_type>\ninline bool is_power_of_two_factor(argument_integer_type arg, divisor_integer_type divisor) {\n    // Divisor is assumed to be a power of two (which is valid for current uses).\n    __TBB_ASSERT( is_power_of_two(divisor), \"Divisor should be a power of two\" );\n    return 0 == (arg & (arg - divisor));\n}\n\n//! Utility template function to prevent \"unused\" warnings by various compilers.\ntemplate<typename T>\nvoid suppress_unused_warning( const T& ) {}\n\n// Struct to be used as a version tag for inline functions.\n/** Version tag can be necessary to prevent loader on Linux from using the wrong\n    symbol in debug builds (when inline functions are compiled as out-of-line). **/\nstruct version_tag_v3 {};\n\ntypedef version_tag_v3 version_tag;\n\n} // internal\n} // tbb\n\n// Following is a set of classes and functions typically used in compile-time \"metaprogramming\".\n// TODO: move all that to a separate header\n\n#if __TBB_ALLOCATOR_TRAITS_PRESENT\n#include <memory> //for allocator_traits\n#endif\n\n#if __TBB_CPP11_RVALUE_REF_PRESENT || _LIBCPP_VERSION\n#include <utility> // for std::move\n#endif\n\nnamespace tbb {\nnamespace internal {\n\n//! Class for determining type of std::allocator<T>::value_type.\ntemplate<typename T>\nstruct allocator_type {\n    typedef T value_type;\n};\n\n#if _MSC_VER\n//! Microsoft std::allocator has non-standard extension that strips const from a type.\ntemplate<typename T>\nstruct allocator_type<const T> {\n    typedef T value_type;\n};\n#endif\n\n// Ad-hoc implementation of true_type & false_type\n// Intended strictly for internal use! For public APIs (traits etc), use C++11 analogues.\ntemplate <bool v>\nstruct bool_constant {\n    static /*constexpr*/ const bool value = v;\n};\ntypedef bool_constant<true> true_type;\ntypedef bool_constant<false> false_type;\n\n#if __TBB_ALLOCATOR_TRAITS_PRESENT\nusing std::allocator_traits;\n#else\ntemplate<typename allocator>\nstruct allocator_traits{\n    typedef tbb::internal::false_type propagate_on_container_move_assignment;\n};\n#endif\n\n//! A template to select either 32-bit or 64-bit constant as compile time, depending on machine word size.\ntemplate <unsigned u, unsigned long long ull >\nstruct select_size_t_constant {\n    //Explicit cast is needed to avoid compiler warnings about possible truncation.\n    //The value of the right size,   which is selected by ?:, is anyway not truncated or promoted.\n    static const size_t value = (size_t)((sizeof(size_t)==sizeof(u)) ? u : ull);\n};\n\n#if __TBB_CPP11_RVALUE_REF_PRESENT\nusing std::move;\n#elif defined(_LIBCPP_NAMESPACE)\n// libc++ defines \"pre-C++11 move\" similarly to our; use it to avoid name conflicts in some cases.\nusing std::_LIBCPP_NAMESPACE::move;\n#else\ntemplate <typename T>\nT& move( T& x ) { return x; }\n#endif\n\ntemplate <bool condition>\nstruct STATIC_ASSERTION_FAILED;\n\ntemplate <>\nstruct STATIC_ASSERTION_FAILED<false> { enum {value=1};};\n\ntemplate<>\nstruct STATIC_ASSERTION_FAILED<true>; //intentionally left undefined to cause compile time error\n\n//! @endcond\n}} // namespace tbb::internal\n\n#if    __TBB_STATIC_ASSERT_PRESENT\n#define __TBB_STATIC_ASSERT(condition,msg) static_assert(condition,msg)\n#else\n//please note condition is intentionally inverted to get a bit more understandable error msg\n#define __TBB_STATIC_ASSERT_IMPL1(condition,msg,line)       \\\n    enum {static_assert_on_line_##line = tbb::internal::STATIC_ASSERTION_FAILED<!(condition)>::value}\n\n#define __TBB_STATIC_ASSERT_IMPL(condition,msg,line) __TBB_STATIC_ASSERT_IMPL1(condition,msg,line)\n//! Verify at compile time that passed in condition is hold\n#define __TBB_STATIC_ASSERT(condition,msg) __TBB_STATIC_ASSERT_IMPL(condition,msg,__LINE__)\n#endif\n\n#endif /* RC_INVOKED */\n#endif /* __TBB_tbb_stddef_H */\n"
  },
  {
    "path": "benchmarks/tbb/tbb_thread.cpp",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#if _WIN32||_WIN64\n#include <process.h>        // _beginthreadex()\n#endif\n#include <errno.h>\n#include \"tbb_misc.h\"       // handle_win_error(), ThreadStackSize\n#include \"tbb/tbb_stddef.h\"\n#include \"tbb/tbb_thread.h\"\n#include \"tbb/tbb_allocator.h\"\n#include \"governor.h\"       // default_num_threads()\n#if __TBB_WIN8UI_SUPPORT\n#include <thread>\n#endif\n\nnamespace tbb {\nnamespace internal {\n\n//! Allocate a closure\nvoid* allocate_closure_v3( size_t size )\n{\n    return allocate_via_handler_v3( size );\n}\n\n//! Free a closure allocated by allocate_closure_v3\nvoid free_closure_v3( void *ptr )\n{\n    deallocate_via_handler_v3( ptr );\n}\n\nvoid tbb_thread_v3::join()\n{\n    if (!joinable())\n        handle_perror( EINVAL, \"tbb_thread::join\" ); // Invalid argument\n    if (this_tbb_thread::get_id() == get_id())\n        handle_perror( EDEADLK, \"tbb_thread::join\" ); // Resource deadlock avoided\n#if _WIN32||_WIN64\n#if __TBB_WIN8UI_SUPPORT\n    std::thread* thread_tmp=(std::thread*)my_thread_id;\n    thread_tmp->join();\n    delete thread_tmp;\n#else // __TBB_WIN8UI_SUPPORT\n    DWORD status = WaitForSingleObjectEx( my_handle, INFINITE, FALSE );\n    if ( status == WAIT_FAILED )\n        handle_win_error( GetLastError() );\n    BOOL close_stat = CloseHandle( my_handle );\n    if ( close_stat == 0 )\n        handle_win_error( GetLastError() );\n    my_thread_id = 0;\n#endif // __TBB_WIN8UI_SUPPORT\n#else\n    int status = pthread_join( my_handle, NULL );\n    if( status )\n        handle_perror( status, \"pthread_join\" );\n#endif // _WIN32||_WIN64\n    my_handle = 0;\n}\n\nvoid tbb_thread_v3::detach() {\n    if (!joinable())\n        handle_perror( EINVAL, \"tbb_thread::detach\" ); // Invalid argument\n#if _WIN32||_WIN64\n    BOOL status = CloseHandle( my_handle );\n    if ( status == 0 )\n      handle_win_error( GetLastError() );\n    my_thread_id = 0;\n#else\n    int status = pthread_detach( my_handle );\n    if( status )\n        handle_perror( status, \"pthread_detach\" );\n#endif // _WIN32||_WIN64\n    my_handle = 0;\n}\n\nvoid tbb_thread_v3::internal_start( __TBB_NATIVE_THREAD_ROUTINE_PTR(start_routine),\n                                    void* closure ) {\n#if _WIN32||_WIN64\n#if __TBB_WIN8UI_SUPPORT\n    std::thread* thread_tmp=new std::thread(start_routine, closure);\n    my_handle  = thread_tmp->native_handle();\n//  TODO: to find out the way to find thread_id without GetThreadId and other\n//  desktop functions.\n//  Now tbb_thread does have its own thread_id that stores std::thread object\n    my_thread_id = (size_t)thread_tmp;\n#else\n    unsigned thread_id;\n    // The return type of _beginthreadex is \"uintptr_t\" on new MS compilers,\n    // and 'unsigned long' on old MS compilers.  uintptr_t works for both.\n    uintptr_t status = _beginthreadex( NULL, ThreadStackSize, start_routine,\n                                     closure, 0, &thread_id );\n    if( status==0 )\n        handle_perror(errno,\"__beginthreadex\");\n    else {\n        my_handle = (HANDLE)status;\n        my_thread_id = thread_id;\n    }\n#endif\n#else\n    pthread_t thread_handle;\n    int status;\n    pthread_attr_t stack_size;\n    status = pthread_attr_init( &stack_size );\n    if( status )\n        handle_perror( status, \"pthread_attr_init\" );\n    status = pthread_attr_setstacksize( &stack_size, ThreadStackSize );\n    if( status )\n        handle_perror( status, \"pthread_attr_setstacksize\" );\n\n    status = pthread_create( &thread_handle, &stack_size, start_routine, closure );\n    if( status )\n        handle_perror( status, \"pthread_create\" );\n    status = pthread_attr_destroy( &stack_size );\n    if( status )\n        handle_perror( status, \"pthread_attr_destroy\" );\n\n    my_handle = thread_handle;\n#endif // _WIN32||_WIN64\n}\n\nunsigned tbb_thread_v3::hardware_concurrency() __TBB_NOEXCEPT(true) {\n    return governor::default_num_threads();\n}\n\ntbb_thread_v3::id thread_get_id_v3() {\n#if _WIN32||_WIN64\n    return tbb_thread_v3::id( GetCurrentThreadId() );\n#else\n    return tbb_thread_v3::id( pthread_self() );\n#endif // _WIN32||_WIN64\n}\n    \nvoid move_v3( tbb_thread_v3& t1, tbb_thread_v3& t2 )\n{\n    if (t1.joinable())\n        t1.detach();\n    t1.my_handle = t2.my_handle;\n    t2.my_handle = 0;\n#if _WIN32||_WIN64\n    t1.my_thread_id = t2.my_thread_id;\n    t2.my_thread_id = 0;\n#endif // _WIN32||_WIN64\n}\n\nvoid thread_yield_v3()\n{\n    __TBB_Yield();\n}\n\nvoid thread_sleep_v3(const tick_count::interval_t &i)\n{\n#if _WIN32||_WIN64\n     tick_count t0 = tick_count::now();\n     tick_count t1 = t0;\n     for(;;) {\n         double remainder = (i-(t1-t0)).seconds()*1e3;  // milliseconds remaining to sleep\n         if( remainder<=0 ) break;\n         DWORD t = remainder>=INFINITE ? INFINITE-1 : DWORD(remainder);\n#if !__TBB_WIN8UI_SUPPORT\n         Sleep( t );\n#else\n         std::chrono::milliseconds sleep_time( t );\n         std::this_thread::sleep_for( sleep_time );\n#endif\n         t1 = tick_count::now();\n    }\n#else\n    struct timespec req;\n    double sec = i.seconds();\n\n    req.tv_sec = static_cast<long>(sec);\n    req.tv_nsec = static_cast<long>( (sec - req.tv_sec)*1e9 );\n    nanosleep(&req, NULL);\n#endif // _WIN32||_WIN64\n}\n\n} // internal\n} // tbb\n"
  },
  {
    "path": "benchmarks/tbb/tbb_thread.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_tbb_thread_H\n#define __TBB_tbb_thread_H\n\n#include \"tbb_stddef.h\"\n#if _WIN32||_WIN64\n#include \"machine/windows_api.h\"\n#define __TBB_NATIVE_THREAD_ROUTINE unsigned WINAPI\n#define __TBB_NATIVE_THREAD_ROUTINE_PTR(r) unsigned (WINAPI* r)( void* )\n#if __TBB_WIN8UI_SUPPORT\ntypedef size_t thread_id_type;\n#else  // __TBB_WIN8UI_SUPPORT\ntypedef DWORD thread_id_type;\n#endif // __TBB_WIN8UI_SUPPORT\n#else\n#define __TBB_NATIVE_THREAD_ROUTINE void*\n#define __TBB_NATIVE_THREAD_ROUTINE_PTR(r) void* (*r)( void* )\n#include <pthread.h>\n#endif // _WIN32||_WIN64\n\n#include \"tick_count.h\"\n\n#if !TBB_USE_EXCEPTIONS && _MSC_VER\n    // Suppress \"C++ exception handler used, but unwind semantics are not enabled\" warning in STL headers\n    #pragma warning (push)\n    #pragma warning (disable: 4530)\n#endif\n\n#include <iosfwd>\n\n#if !TBB_USE_EXCEPTIONS && _MSC_VER\n    #pragma warning (pop)\n#endif\n\nnamespace tbb {\n\nnamespace internal {\n    class tbb_thread_v3;\n}\n\ninline void swap( internal::tbb_thread_v3& t1, internal::tbb_thread_v3& t2 ) __TBB_NOEXCEPT(true);\n\nnamespace internal {\n\n    //! Allocate a closure\n    void* __TBB_EXPORTED_FUNC allocate_closure_v3( size_t size );\n    //! Free a closure allocated by allocate_closure_v3\n    void __TBB_EXPORTED_FUNC free_closure_v3( void* );\n   \n    struct thread_closure_base {\n        void* operator new( size_t size ) {return allocate_closure_v3(size);}\n        void operator delete( void* ptr ) {free_closure_v3(ptr);}\n    };\n\n    template<class F> struct thread_closure_0: thread_closure_base {\n        F function;\n\n        static __TBB_NATIVE_THREAD_ROUTINE start_routine( void* c ) {\n            thread_closure_0 *self = static_cast<thread_closure_0*>(c);\n            self->function();\n            delete self;\n            return 0;\n        }\n        thread_closure_0( const F& f ) : function(f) {}\n    };\n    //! Structure used to pass user function with 1 argument to thread.  \n    template<class F, class X> struct thread_closure_1: thread_closure_base {\n        F function;\n        X arg1;\n        //! Routine passed to Windows's _beginthreadex by thread::internal_start() inside tbb.dll\n        static __TBB_NATIVE_THREAD_ROUTINE start_routine( void* c ) {\n            thread_closure_1 *self = static_cast<thread_closure_1*>(c);\n            self->function(self->arg1);\n            delete self;\n            return 0;\n        }\n        thread_closure_1( const F& f, const X& x ) : function(f), arg1(x) {}\n    };\n    template<class F, class X, class Y> struct thread_closure_2: thread_closure_base {\n        F function;\n        X arg1;\n        Y arg2;\n        //! Routine passed to Windows's _beginthreadex by thread::internal_start() inside tbb.dll\n        static __TBB_NATIVE_THREAD_ROUTINE start_routine( void* c ) {\n            thread_closure_2 *self = static_cast<thread_closure_2*>(c);\n            self->function(self->arg1, self->arg2);\n            delete self;\n            return 0;\n        }\n        thread_closure_2( const F& f, const X& x, const Y& y ) : function(f), arg1(x), arg2(y) {}\n    };\n\n    //! Versioned thread class.\n    class tbb_thread_v3 {\n#if __TBB_IF_NO_COPY_CTOR_MOVE_SEMANTICS_BROKEN\n        // Workaround for a compiler bug: declaring the copy constructor as public\n        // enables use of the moving constructor.\n        // The definition is not provided in order to prohibit copying.\n    public:\n#endif\n        tbb_thread_v3(const tbb_thread_v3&); // = delete;   // Deny access\n    public:\n#if _WIN32||_WIN64\n        typedef HANDLE native_handle_type; \n#else\n        typedef pthread_t native_handle_type; \n#endif // _WIN32||_WIN64\n\n        class id;\n        //! Constructs a thread object that does not represent a thread of execution. \n        tbb_thread_v3() __TBB_NOEXCEPT(true) : my_handle(0)\n#if _WIN32||_WIN64\n            , my_thread_id(0)\n#endif // _WIN32||_WIN64\n        {}\n        \n        //! Constructs an object and executes f() in a new thread\n        template <class F> explicit tbb_thread_v3(F f) {\n            typedef internal::thread_closure_0<F> closure_type;\n            internal_start(closure_type::start_routine, new closure_type(f));\n        }\n        //! Constructs an object and executes f(x) in a new thread\n        template <class F, class X> tbb_thread_v3(F f, X x) {\n            typedef internal::thread_closure_1<F,X> closure_type;\n            internal_start(closure_type::start_routine, new closure_type(f,x));\n        }\n        //! Constructs an object and executes f(x,y) in a new thread\n        template <class F, class X, class Y> tbb_thread_v3(F f, X x, Y y) {\n            typedef internal::thread_closure_2<F,X,Y> closure_type;\n            internal_start(closure_type::start_routine, new closure_type(f,x,y));\n        }\n\n#if __TBB_CPP11_RVALUE_REF_PRESENT\n        tbb_thread_v3(tbb_thread_v3&& x) __TBB_NOEXCEPT(true)\n            : my_handle(x.my_handle)\n#if _WIN32||_WIN64\n            , my_thread_id(x.my_thread_id)\n#endif\n        {\n            x.internal_wipe();\n        }\n        tbb_thread_v3& operator=(tbb_thread_v3&& x) __TBB_NOEXCEPT(true) {\n            internal_move(x);\n            return *this;\n        }\n    private:\n        tbb_thread_v3& operator=(const tbb_thread_v3& x); // = delete;\n    public:\n#else  // __TBB_CPP11_RVALUE_REF_PRESENT\n        tbb_thread_v3& operator=(tbb_thread_v3& x) {\n            internal_move(x);\n            return *this;\n        }\n#endif // __TBB_CPP11_RVALUE_REF_PRESENT\n\n        void swap( tbb_thread_v3& t ) __TBB_NOEXCEPT(true) {tbb::swap( *this, t );}\n        bool joinable() const __TBB_NOEXCEPT(true) {return my_handle!=0; }\n        //! The completion of the thread represented by *this happens before join() returns.\n        void __TBB_EXPORTED_METHOD join();\n        //! When detach() returns, *this no longer represents the possibly continuing thread of execution.\n        void __TBB_EXPORTED_METHOD detach();\n        ~tbb_thread_v3() {if( joinable() ) detach();}\n        inline id get_id() const __TBB_NOEXCEPT(true);\n        native_handle_type native_handle() { return my_handle; }\n    \n        //! The number of hardware thread contexts.\n        /** Before TBB 3.0 U4 this methods returned the number of logical CPU in\n            the system. Currently on Windows, Linux and FreeBSD it returns the\n            number of logical CPUs available to the current process in accordance\n            with its affinity mask.\n            \n            NOTE: The return value of this method never changes after its first\n            invocation. This means that changes in the process affinity mask that\n            took place after this method was first invoked will not affect the\n            number of worker threads in the TBB worker threads pool. **/\n        static unsigned __TBB_EXPORTED_FUNC hardware_concurrency() __TBB_NOEXCEPT(true);\n    private:\n        native_handle_type my_handle; \n#if _WIN32||_WIN64\n        thread_id_type my_thread_id;\n#endif // _WIN32||_WIN64\n\n        void internal_wipe() __TBB_NOEXCEPT(true) {\n            my_handle = 0;\n#if _WIN32||_WIN64\n            my_thread_id = 0;\n#endif\n        }\n        void internal_move(tbb_thread_v3& x) __TBB_NOEXCEPT(true) {\n            if (joinable()) detach();\n            my_handle = x.my_handle;\n#if _WIN32||_WIN64\n            my_thread_id = x.my_thread_id;\n#endif // _WIN32||_WIN64\n            x.internal_wipe();\n        }\n\n        /** Runs start_routine(closure) on another thread and sets my_handle to the handle of the created thread. */\n        void __TBB_EXPORTED_METHOD internal_start( __TBB_NATIVE_THREAD_ROUTINE_PTR(start_routine), \n                             void* closure );\n        friend void __TBB_EXPORTED_FUNC move_v3( tbb_thread_v3& t1, tbb_thread_v3& t2 );\n        friend void tbb::swap( tbb_thread_v3& t1, tbb_thread_v3& t2 ) __TBB_NOEXCEPT(true);\n    };\n        \n    class tbb_thread_v3::id { \n#if _WIN32||_WIN64\n        thread_id_type my_id;\n        id( thread_id_type id_ ) : my_id(id_) {}\n#else\n        pthread_t my_id;\n        id( pthread_t id_ ) : my_id(id_) {}\n#endif // _WIN32||_WIN64\n        friend class tbb_thread_v3;\n    public:\n        id() __TBB_NOEXCEPT(true) : my_id(0) {}\n\n        friend bool operator==( tbb_thread_v3::id x, tbb_thread_v3::id y ) __TBB_NOEXCEPT(true);\n        friend bool operator!=( tbb_thread_v3::id x, tbb_thread_v3::id y ) __TBB_NOEXCEPT(true);\n        friend bool operator<( tbb_thread_v3::id x, tbb_thread_v3::id y ) __TBB_NOEXCEPT(true);\n        friend bool operator<=( tbb_thread_v3::id x, tbb_thread_v3::id y ) __TBB_NOEXCEPT(true);\n        friend bool operator>( tbb_thread_v3::id x, tbb_thread_v3::id y ) __TBB_NOEXCEPT(true);\n        friend bool operator>=( tbb_thread_v3::id x, tbb_thread_v3::id y ) __TBB_NOEXCEPT(true);\n        \n        template<class charT, class traits>\n        friend std::basic_ostream<charT, traits>&\n        operator<< (std::basic_ostream<charT, traits> &out, \n                    tbb_thread_v3::id id)\n        {\n            out << id.my_id;\n            return out;\n        }\n        friend tbb_thread_v3::id __TBB_EXPORTED_FUNC thread_get_id_v3();\n    }; // tbb_thread_v3::id\n\n    tbb_thread_v3::id tbb_thread_v3::get_id() const __TBB_NOEXCEPT(true) {\n#if _WIN32||_WIN64\n        return id(my_thread_id);\n#else\n        return id(my_handle);\n#endif // _WIN32||_WIN64\n    }\n    void __TBB_EXPORTED_FUNC move_v3( tbb_thread_v3& t1, tbb_thread_v3& t2 );\n    tbb_thread_v3::id __TBB_EXPORTED_FUNC thread_get_id_v3();\n    void __TBB_EXPORTED_FUNC thread_yield_v3();\n    void __TBB_EXPORTED_FUNC thread_sleep_v3(const tick_count::interval_t &i);\n\n    inline bool operator==(tbb_thread_v3::id x, tbb_thread_v3::id y) __TBB_NOEXCEPT(true)\n    {\n        return x.my_id == y.my_id;\n    }\n    inline bool operator!=(tbb_thread_v3::id x, tbb_thread_v3::id y) __TBB_NOEXCEPT(true)\n    {\n        return x.my_id != y.my_id;\n    }\n    inline bool operator<(tbb_thread_v3::id x, tbb_thread_v3::id y) __TBB_NOEXCEPT(true)\n    {\n        return x.my_id < y.my_id;\n    }\n    inline bool operator<=(tbb_thread_v3::id x, tbb_thread_v3::id y) __TBB_NOEXCEPT(true)\n    {\n        return x.my_id <= y.my_id;\n    }\n    inline bool operator>(tbb_thread_v3::id x, tbb_thread_v3::id y) __TBB_NOEXCEPT(true)\n    {\n        return x.my_id > y.my_id;\n    }\n    inline bool operator>=(tbb_thread_v3::id x, tbb_thread_v3::id y) __TBB_NOEXCEPT(true)\n    {\n        return x.my_id >= y.my_id;\n    }\n\n} // namespace internal;\n\n//! Users reference thread class by name tbb_thread\ntypedef internal::tbb_thread_v3 tbb_thread;\n\nusing internal::operator==;\nusing internal::operator!=;\nusing internal::operator<;\nusing internal::operator>;\nusing internal::operator<=;\nusing internal::operator>=;\n\ninline void move( tbb_thread& t1, tbb_thread& t2 ) {\n    internal::move_v3(t1, t2);\n}\n\ninline void swap( internal::tbb_thread_v3& t1, internal::tbb_thread_v3& t2 )  __TBB_NOEXCEPT(true) {\n    tbb::tbb_thread::native_handle_type h = t1.my_handle;\n    t1.my_handle = t2.my_handle;\n    t2.my_handle = h;\n#if _WIN32||_WIN64\n    thread_id_type i = t1.my_thread_id;\n    t1.my_thread_id  = t2.my_thread_id;\n    t2.my_thread_id  = i;\n#endif /* _WIN32||_WIN64 */\n}\n\nnamespace this_tbb_thread {\n    inline tbb_thread::id get_id() { return internal::thread_get_id_v3(); }\n    //! Offers the operating system the opportunity to schedule another thread.\n    inline void yield() { internal::thread_yield_v3(); }\n    //! The current thread blocks at least until the time specified.\n    inline void sleep(const tick_count::interval_t &i) { \n        internal::thread_sleep_v3(i);  \n    }\n}  // namespace this_tbb_thread\n\n} // namespace tbb\n\n#endif /* __TBB_tbb_thread_H */\n"
  },
  {
    "path": "benchmarks/tbb/tbb_version.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n// Please define version number in the file:\n#include \"tbb/tbb_stddef.h\"\n\n// And don't touch anything below\n#ifndef ENDL\n#define ENDL \"\\n\"\n#endif\n#include \"version_string.ver\"\n\n#ifndef __TBB_VERSION_STRINGS\n#pragma message(\"Warning: version_string.ver isn't generated properly by version_info.sh script!\")\n// here is an example of macros value:\n#define __TBB_VERSION_STRINGS \\\n\"TBB: BUILD_HOST\\tUnknown\\n\" \\\n\"TBB: BUILD_ARCH\\tUnknown\\n\" \\\n\"TBB: BUILD_OS\\t\\tUnknown\\n\" \\\n\"TBB: BUILD_CL\\t\\tUnknown\\n\" \\\n\"TBB: BUILD_COMPILER\\tUnknown\\n\" \\\n\"TBB: BUILD_COMMAND\\tUnknown\\n\"\n#endif\n#ifndef __TBB_DATETIME\n#ifdef RC_INVOKED\n#define __TBB_DATETIME \"Unknown\"\n#else\n#define __TBB_DATETIME __DATE__ __TIME__\n#endif\n#endif\n\n#define __TBB_VERSION_NUMBER(N) #N \": VERSION\\t\\t\" __TBB_STRING(TBB_VERSION_MAJOR.TBB_VERSION_MINOR) ENDL\n#define __TBB_INTERFACE_VERSION_NUMBER(N) #N \": INTERFACE VERSION\\t\" __TBB_STRING(TBB_INTERFACE_VERSION) ENDL\n\n#define __TBB_VERSION_DATETIME(N) #N \": BUILD_DATE\\t\\t\" __TBB_DATETIME ENDL\n#ifndef TBB_USE_DEBUG\n    #define __TBB_VERSION_USE_DEBUG(N) #N \": TBB_USE_DEBUG\\tundefined\" ENDL\n#elif TBB_USE_DEBUG==0\n    #define __TBB_VERSION_USE_DEBUG(N) #N \": TBB_USE_DEBUG\\t0\" ENDL\n#elif TBB_USE_DEBUG==1\n    #define __TBB_VERSION_USE_DEBUG(N) #N \": TBB_USE_DEBUG\\t1\" ENDL\n#elif TBB_USE_DEBUG==2\n    #define __TBB_VERSION_USE_DEBUG(N) #N \": TBB_USE_DEBUG\\t2\" ENDL\n#else\n    #error Unexpected value for TBB_USE_DEBUG\n#endif\n\n/* Make __TBB_VERSION_USE_ASSERT and __TBB_VERSION_DO_NOTIFY empty for rc\n * because rc from VS2005 crashed with fatal error RC10056 for too complex\n * macros (for example, when __TBB_CPF_BUILD is enabled).\n * All information is available in BUILD_COMMAND anyway.\n */\n\n#ifdef RC_INVOKED\n    #define __TBB_VERSION_USE_ASSERT(N)\n#else // RC_INVOKED\n#ifndef TBB_USE_ASSERT\n    #define __TBB_VERSION_USE_ASSERT(N) #N \": TBB_USE_ASSERT\\tundefined\" ENDL\n#elif TBB_USE_ASSERT==0\n    #define __TBB_VERSION_USE_ASSERT(N) #N \": TBB_USE_ASSERT\\t0\" ENDL\n#elif TBB_USE_ASSERT==1\n    #define __TBB_VERSION_USE_ASSERT(N) #N \": TBB_USE_ASSERT\\t1\" ENDL\n#elif TBB_USE_ASSERT==2\n    #define __TBB_VERSION_USE_ASSERT(N) #N \": TBB_USE_ASSERT\\t2\" ENDL\n#else\n    #error Unexpected value for TBB_USE_ASSERT\n#endif\n#endif // RC_INVOKED\n\n#ifndef __TBB_CPF_BUILD\n    #define __TBB_VERSION_TBB_PREVIEW_BINARY(N)\n#else\n    #define __TBB_VERSION_TBB_PREVIEW_BINARY(N) #N \": TBB_PREVIEW_BINARY\\t1\" ENDL\n#endif\n\n#ifdef RC_INVOKED\n    #define __TBB_VERSION_DO_NOTIFY(N)\n#else\n#ifndef DO_ITT_NOTIFY\n    #define __TBB_VERSION_DO_NOTIFY(N) #N \": DO_ITT_NOTIFY\\tundefined\" ENDL\n#elif DO_ITT_NOTIFY==1\n    #define __TBB_VERSION_DO_NOTIFY(N) #N \": DO_ITT_NOTIFY\\t1\" ENDL\n#elif DO_ITT_NOTIFY==0\n    #define __TBB_VERSION_DO_NOTIFY(N)\n#else\n    #error Unexpected value for DO_ITT_NOTIFY\n#endif\n#endif // RC_INVOKED\n\n#define TBB_VERSION_STRINGS_P(N) __TBB_VERSION_NUMBER(N) __TBB_INTERFACE_VERSION_NUMBER(N) __TBB_VERSION_DATETIME(N) __TBB_VERSION_STRINGS(N) __TBB_VERSION_USE_DEBUG(N) __TBB_VERSION_USE_ASSERT(N) __TBB_VERSION_TBB_PREVIEW_BINARY(N) __TBB_VERSION_DO_NOTIFY(N)\n\n#define TBB_VERSION_STRINGS TBB_VERSION_STRINGS_P(TBB)\n#define TBBMALLOC_VERSION_STRINGS TBB_VERSION_STRINGS_P(TBBmalloc)\n\n// numbers\n#ifndef __TBB_VERSION_YMD\n#define __TBB_VERSION_YMD 0, 0\n#endif\n\n#define TBB_VERNUMBERS TBB_VERSION_MAJOR, TBB_VERSION_MINOR, __TBB_VERSION_YMD\n\n#define TBB_VERSION __TBB_STRING(TBB_VERNUMBERS)\n"
  },
  {
    "path": "benchmarks/tbb/tbbmalloc_proxy.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n/*\nReplacing the standard memory allocation routines in Microsoft* C/C++ RTL \n(malloc/free, global new/delete, etc.) with the TBB memory allocator. \n\nInclude the following header to a source of any binary which is loaded during \napplication startup\n\n#include \"tbb/tbbmalloc_proxy.h\"\n\nor add following parameters to the linker options for the binary which is \nloaded during application startup. It can be either exe-file or dll.\n\nFor win32\ntbbmalloc_proxy.lib /INCLUDE:\"___TBB_malloc_proxy\"\nwin64\ntbbmalloc_proxy.lib /INCLUDE:\"__TBB_malloc_proxy\"\n*/\n\n#ifndef __TBB_tbbmalloc_proxy_H\n#define __TBB_tbbmalloc_proxy_H\n\n#if _MSC_VER\n\n#ifdef _DEBUG\n    #pragma comment(lib, \"tbbmalloc_proxy_debug.lib\")\n#else\n    #pragma comment(lib, \"tbbmalloc_proxy.lib\")\n#endif\n\n#if defined(_WIN64)\n    #pragma comment(linker, \"/include:__TBB_malloc_proxy\")\n#else\n    #pragma comment(linker, \"/include:___TBB_malloc_proxy\")\n#endif\n\n#else\n/* Primarily to support MinGW */\n\nextern \"C\" void __TBB_malloc_proxy();\nstruct __TBB_malloc_proxy_caller {\n    __TBB_malloc_proxy_caller() { __TBB_malloc_proxy(); }\n} volatile __TBB_malloc_proxy_helper_object;\n\n#endif // _MSC_VER\n\n#endif //__TBB_tbbmalloc_proxy_H\n"
  },
  {
    "path": "benchmarks/tbb/tick_count.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef __TBB_tick_count_H\n#define __TBB_tick_count_H\n\n#include \"tbb_stddef.h\"\n\n#if _WIN32||_WIN64\n#include \"machine/windows_api.h\"\n#elif __linux__\n#include <ctime>\n#else /* generic Unix */\n#include <sys/time.h>\n#endif /* (choice of OS) */\n\nnamespace tbb {\n\n//! Absolute timestamp\n/** @ingroup timing */\nclass tick_count {\npublic:\n    //! Relative time interval.\n    class interval_t {\n        long long value;\n        explicit interval_t( long long value_ ) : value(value_) {}\n    public:\n        //! Construct a time interval representing zero time duration\n        interval_t() : value(0) {};\n\n        //! Construct a time interval representing sec seconds time  duration\n        explicit interval_t( double sec );\n\n        //! Return the length of a time interval in seconds\n        double seconds() const;\n\n        friend class tbb::tick_count;\n\n        //! Extract the intervals from the tick_counts and subtract them.\n        friend interval_t operator-( const tick_count& t1, const tick_count& t0 );\n\n        //! Add two intervals.\n        friend interval_t operator+( const interval_t& i, const interval_t& j ) {\n            return interval_t(i.value+j.value);\n        }\n\n        //! Subtract two intervals.\n        friend interval_t operator-( const interval_t& i, const interval_t& j ) {\n            return interval_t(i.value-j.value);\n        }\n\n        //! Accumulation operator\n        interval_t& operator+=( const interval_t& i ) {value += i.value; return *this;}\n\n        //! Subtraction operator\n        interval_t& operator-=( const interval_t& i ) {value -= i.value; return *this;}\n    private:\n        static long long ticks_per_second(){\n#if _WIN32||_WIN64\n            LARGE_INTEGER qpfreq;\n            int rval = QueryPerformanceFrequency(&qpfreq);\n            __TBB_ASSERT_EX(rval, \"QueryPerformanceFrequency returned zero\");\n            return static_cast<long long>(qpfreq.QuadPart);\n#elif __linux__\n            return static_cast<long long>(1E9);\n#else /* generic Unix */\n            return static_cast<long long>(1E6);\n#endif /* (choice of OS) */\n        }\n    };\n    \n    //! Construct an absolute timestamp initialized to zero.\n    tick_count() : my_count(0) {};\n\n    //! Return current time.\n    static tick_count now();\n    \n    //! Subtract two timestamps to get the time interval between\n    friend interval_t operator-( const tick_count& t1, const tick_count& t0 );\n\n    //! Return the resolution of the clock in seconds per tick.\n    static double resolution() { return 1.0 / interval_t::ticks_per_second(); }\n\nprivate:\n    long long my_count;\n};\n\ninline tick_count tick_count::now() {\n    tick_count result;\n#if _WIN32||_WIN64\n    LARGE_INTEGER qpcnt;\n    int rval = QueryPerformanceCounter(&qpcnt);\n    __TBB_ASSERT_EX(rval, \"QueryPerformanceCounter failed\");\n    result.my_count = qpcnt.QuadPart;\n#elif __linux__\n    struct timespec ts;\n    int status = clock_gettime( CLOCK_REALTIME, &ts );\n    __TBB_ASSERT_EX( status==0, \"CLOCK_REALTIME not supported\" );\n    result.my_count = static_cast<long long>(1000000000UL)*static_cast<long long>(ts.tv_sec) + static_cast<long long>(ts.tv_nsec);\n#else /* generic Unix */\n    struct timeval tv;\n    int status = gettimeofday(&tv, NULL);\n    __TBB_ASSERT_EX( status==0, \"gettimeofday failed\" );\n    result.my_count = static_cast<long long>(1000000)*static_cast<long long>(tv.tv_sec) + static_cast<long long>(tv.tv_usec);\n#endif /*(choice of OS) */\n    return result;\n}\n\ninline tick_count::interval_t::interval_t( double sec ) {\n    value = static_cast<long long>(sec*interval_t::ticks_per_second());\n}\n\ninline tick_count::interval_t operator-( const tick_count& t1, const tick_count& t0 ) {\n    return tick_count::interval_t( t1.my_count-t0.my_count );\n}\n\ninline double tick_count::interval_t::seconds() const {\n    return value*tick_count::resolution();\n}\n\n} // namespace tbb\n\n#endif /* __TBB_tick_count_H */\n"
  },
  {
    "path": "benchmarks/tbb/tls.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef _TBB_tls_H\n#define _TBB_tls_H\n\n#if USE_PTHREAD\n#include <pthread.h>\n#else /* assume USE_WINTHREAD */\n#include \"tbb/machine/windows_api.h\"\n#endif\n\nnamespace tbb {\n\nnamespace internal {\n\ntypedef void (*tls_dtor_t)(void*);\n\n//! Basic cross-platform wrapper class for TLS operations.\ntemplate <typename T>\nclass basic_tls {\n#if USE_PTHREAD\n    typedef pthread_key_t tls_key_t;\npublic:\n    int  create( tls_dtor_t dtor = NULL ) {\n        return pthread_key_create(&my_key, dtor);\n    }\n    int  destroy()      { return pthread_key_delete(my_key); }\n    void set( T value ) { pthread_setspecific(my_key, (void*)value); }\n    T    get()          { return (T)pthread_getspecific(my_key); }\n#else /* USE_WINTHREAD */\n    typedef DWORD tls_key_t;\npublic:\n#if !__TBB_WIN8UI_SUPPORT\n    int create() {\n        tls_key_t tmp = TlsAlloc();\n        if( tmp==TLS_OUT_OF_INDEXES )\n            return TLS_OUT_OF_INDEXES;\n        my_key = tmp;\n        return 0;\n    }\n    int  destroy()      { TlsFree(my_key); my_key=0; return 0; }\n    void set( T value ) { TlsSetValue(my_key, (LPVOID)value); }\n    T    get()          { return (T)TlsGetValue(my_key); }\n#else /*!__TBB_WIN8UI_SUPPORT*/\n    int create() {\n        tls_key_t tmp = FlsAlloc(NULL);\n        if( tmp== (DWORD)0xFFFFFFFF )\n            return (DWORD)0xFFFFFFFF;\n        my_key = tmp;\n        return 0;\n    }\n    int  destroy()      { FlsFree(my_key); my_key=0; return 0; }\n    void set( T value ) { FlsSetValue(my_key, (LPVOID)value); }\n    T    get()          { return (T)FlsGetValue(my_key); }\n#endif /* !__TBB_WIN8UI_SUPPORT */\n#endif /* USE_WINTHREAD */\nprivate:\n    tls_key_t my_key;\n};\n\n//! More advanced TLS support template class.\n/** It supports RAII and to some extent mimic __declspec(thread) variables. */\ntemplate <typename T>\nclass tls : public basic_tls<T> {\n    typedef basic_tls<T> base;\npublic:\n    tls()  { base::create();  }\n    ~tls() { base::destroy(); }\n    T operator=(T value) { base::set(value); return value; }\n    operator T() { return base::get(); }\n};\n\ntemplate <typename T>\nclass tls<T*> : basic_tls<T*> {\n    typedef basic_tls<T*> base;\n    static void internal_dtor(void* ptr) {\n        if (ptr) delete (T*)ptr;\n    }\n    T* internal_get() {\n        T* result = base::get();\n        if (!result) {\n            result = new T;\n            base::set(result);\n        }\n        return result;\n    }\npublic:\n    tls()  {\n#if USE_PTHREAD\n        base::create( internal_dtor );\n#else\n        base::create();\n#endif\n    }\n    ~tls() { base::destroy(); }\n    T* operator=(T* value) { base::set(value); return value; }\n    operator T*()   { return  internal_get(); }\n    T* operator->() { return  internal_get(); }\n    T& operator*()  { return *internal_get(); }\n};\n\n} // namespace internal\n\n} // namespace tbb\n\n#endif /* _TBB_tls_H */\n"
  },
  {
    "path": "benchmarks/tbb/tools_api/disable_warnings.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#include \"ittnotify_config.h\"\n\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n\n#pragma warning (disable: 593)   /* parameter \"XXXX\" was set but never used                 */\n#pragma warning (disable: 344)   /* typedef name has already been declared (with same type) */\n#pragma warning (disable: 174)   /* expression has no effect                                */\n#pragma warning (disable: 4127)  /* conditional expression is constant                      */\n#pragma warning (disable: 4306)  /* conversion from '?' to '?' of greater size              */\n\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\n#if defined __INTEL_COMPILER\n\n#pragma warning (disable: 869)  /* parameter \"XXXXX\" was never referenced                  */\n#pragma warning (disable: 1418) /* external function definition with no prior declaration  */\n#pragma warning (disable: 1419) /* external declaration in primary source file             */\n\n#endif /* __INTEL_COMPILER */\n"
  },
  {
    "path": "benchmarks/tbb/tools_api/internal/ittnotify.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef _INTERNAL_ITTNOTIFY_H_\n#define _INTERNAL_ITTNOTIFY_H_\n\n/**\n * @file\n * @brief Internal User API functions and types\n */\n\n/** @cond exclude_from_documentation */\n#ifndef ITT_OS_WIN\n#  define ITT_OS_WIN   1\n#endif /* ITT_OS_WIN */\n\n#ifndef ITT_OS_LINUX\n#  define ITT_OS_LINUX 2\n#endif /* ITT_OS_LINUX */\n\n#ifndef ITT_OS_MAC\n#  define ITT_OS_MAC   3\n#endif /* ITT_OS_MAC */\n\n#ifndef ITT_OS\n#  if defined WIN32 || defined _WIN32\n#    define ITT_OS ITT_OS_WIN\n#  elif defined( __APPLE__ ) && defined( __MACH__ )\n#    define ITT_OS ITT_OS_MAC\n#  else\n#    define ITT_OS ITT_OS_LINUX\n#  endif\n#endif /* ITT_OS */\n\n#ifndef ITT_PLATFORM_WIN\n#  define ITT_PLATFORM_WIN 1\n#endif /* ITT_PLATFORM_WIN */\n\n#ifndef ITT_PLATFORM_POSIX\n#  define ITT_PLATFORM_POSIX 2\n#endif /* ITT_PLATFORM_POSIX */\n\n#ifndef ITT_PLATFORM_MAC\n#  define ITT_PLATFORM_MAC 3\n#endif /* ITT_PLATFORM_MAC */\n\n#ifndef ITT_PLATFORM\n#  if ITT_OS==ITT_OS_WIN\n#    define ITT_PLATFORM ITT_PLATFORM_WIN\n#  elif ITT_OS==ITT_OS_MAC\n#    define ITT_PLATFORM ITT_PLATFORM_MAC\n#  else\n#    define ITT_PLATFORM ITT_PLATFORM_POSIX\n#  endif\n#endif /* ITT_PLATFORM */\n\n#if defined(_UNICODE) && !defined(UNICODE)\n#define UNICODE\n#endif\n\n#include <stddef.h>\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#include <tchar.h>\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#include <stdint.h>\n#if defined(UNICODE) || defined(_UNICODE)\n#include <wchar.h>\n#endif /* UNICODE || _UNICODE */\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\n#ifndef CDECL\n#  if ITT_PLATFORM==ITT_PLATFORM_WIN\n#    define CDECL __cdecl\n#  else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#    if defined _M_IX86 || defined __i386__ \n#      define CDECL __attribute__ ((cdecl))\n#    else  /* _M_IX86 || __i386__ */\n#      define CDECL /* actual only on x86 platform */\n#    endif /* _M_IX86 || __i386__ */\n#  endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* CDECL */\n\n#ifndef STDCALL\n#  if ITT_PLATFORM==ITT_PLATFORM_WIN\n#    define STDCALL __stdcall\n#  else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#    if defined _M_IX86 || defined __i386__\n#      define STDCALL __attribute__ ((stdcall)) \n#    else  /* _M_IX86 || __i386__ */\n#      define STDCALL /* supported only on x86 platform */\n#    endif /* _M_IX86 || __i386__ */\n#  endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* STDCALL */\n\n#define ITTAPI    CDECL\n#define LIBITTAPI CDECL\n\n/* TODO: Temporary for compatibility! */\n#define ITTAPI_CALL    CDECL\n#define LIBITTAPI_CALL CDECL\n\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n/* use __forceinline (VC++ specific) */\n#define ITT_INLINE           __forceinline\n#define ITT_INLINE_ATTRIBUTE /* nothing */\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n/*\n * Generally, functions are not inlined unless optimization is specified.\n * For functions declared inline, this attribute inlines the function even\n * if no optimization level was specified.\n */\n#ifdef __STRICT_ANSI__\n#define ITT_INLINE           static\n#else  /* __STRICT_ANSI__ */\n#define ITT_INLINE           static inline\n#endif /* __STRICT_ANSI__ */\n#define ITT_INLINE_ATTRIBUTE __attribute__ ((always_inline, unused))\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n/** @endcond */\n\n/** @cond exclude_from_documentation */\n/* Helper macro for joining tokens */\n#define ITT_JOIN_AUX(p,n) p##n\n#define ITT_JOIN(p,n)     ITT_JOIN_AUX(p,n)\n\n#ifdef ITT_MAJOR\n#undef ITT_MAJOR\n#endif\n#ifdef ITT_MINOR\n#undef ITT_MINOR\n#endif\n#define ITT_MAJOR     3\n#define ITT_MINOR     0\n\n/* Standard versioning of a token with major and minor version numbers */\n#define ITT_VERSIONIZE(x)    \\\n    ITT_JOIN(x,              \\\n    ITT_JOIN(_,              \\\n    ITT_JOIN(ITT_MAJOR,      \\\n    ITT_JOIN(_, ITT_MINOR))))\n\n#ifndef INTEL_ITTNOTIFY_PREFIX\n#  define INTEL_ITTNOTIFY_PREFIX __itt_\n#endif /* INTEL_ITTNOTIFY_PREFIX */\n#ifndef INTEL_ITTNOTIFY_POSTFIX\n#  define INTEL_ITTNOTIFY_POSTFIX _ptr_\n#endif /* INTEL_ITTNOTIFY_POSTFIX */\n\n#define ITTNOTIFY_NAME_AUX(n) ITT_JOIN(INTEL_ITTNOTIFY_PREFIX,n)\n#define ITTNOTIFY_NAME(n)     ITT_VERSIONIZE(ITTNOTIFY_NAME_AUX(ITT_JOIN(n,INTEL_ITTNOTIFY_POSTFIX)))\n\n#define ITTNOTIFY_VOID(n) (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)\n#define ITTNOTIFY_DATA(n) (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)\n\n#define ITTNOTIFY_VOID_D0(n,d)       (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d)\n#define ITTNOTIFY_VOID_D1(n,d,x)     (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x)\n#define ITTNOTIFY_VOID_D2(n,d,x,y)   (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y)\n#define ITTNOTIFY_VOID_D3(n,d,x,y,z) (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y,z)\n#define ITTNOTIFY_VOID_D4(n,d,x,y,z,a)     (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y,z,a)\n#define ITTNOTIFY_VOID_D5(n,d,x,y,z,a,b)   (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y,z,a,b)\n#define ITTNOTIFY_VOID_D6(n,d,x,y,z,a,b,c) (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y,z,a,b,c)\n#define ITTNOTIFY_DATA_D0(n,d)       (!(d)->flags) ?       0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d)\n#define ITTNOTIFY_DATA_D1(n,d,x)     (!(d)->flags) ?       0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x)\n#define ITTNOTIFY_DATA_D2(n,d,x,y)   (!(d)->flags) ?       0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x,y)\n#define ITTNOTIFY_DATA_D3(n,d,x,y,z) (!(d)->flags) ?       0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x,y,z)\n#define ITTNOTIFY_DATA_D4(n,d,x,y,z,a)     (!(d)->flags) ? 0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x,y,z,a)\n#define ITTNOTIFY_DATA_D5(n,d,x,y,z,a,b)   (!(d)->flags) ? 0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x,y,z,a,b)\n#define ITTNOTIFY_DATA_D6(n,d,x,y,z,a,b,c) (!(d)->flags) ? 0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x,y,z,a,b,c)\n\n#ifdef ITT_STUB\n#undef ITT_STUB\n#endif\n#ifdef ITT_STUBV\n#undef ITT_STUBV\n#endif\n#define ITT_STUBV(api,type,name,args)                             \\\n    typedef type (api* ITT_JOIN(ITTNOTIFY_NAME(name),_t)) args;   \\\n    extern ITT_JOIN(ITTNOTIFY_NAME(name),_t) ITTNOTIFY_NAME(name);\n#define ITT_STUB ITT_STUBV\n/** @endcond */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif /* __cplusplus */\n\n#define INTEL_ITTNOTIFY_API_PRIVATE\n#include \"../ittnotify.h\"\n\n#ifdef __cplusplus\n}\n#endif /* __cplusplus */\n\n#endif /* _INTERNAL_ITTNOTIFY_H_ */\n"
  },
  {
    "path": "benchmarks/tbb/tools_api/ittnotify.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef _ITTNOTIFY_H_\n#define _ITTNOTIFY_H_\n\n/**\n@file\n@brief Public User API functions and types\n@mainpage\n\nThe ITT API is used to annotate a user's program with additional information\nthat can be used by correctness and performance tools. The user inserts\ncalls in their program. Those calls generate information that is collected\nat runtime, and used by tools such as Intel(R) Parallel Amplifier and\nIntel(R) Parallel Inspector.\n\n@section API Concepts\nThe following general concepts are used throughout the API.\n\n@subsection Unicode Support\nMany API functions take character string arguments. On Windows, there\nare two versions of each such function. The function name is suffixed\nby W if Unicode support is enabled, and by A otherwise. Any API function\nthat takes a character string argument adheres to this convention.\n\n@subsection Conditional Compilation\nMany users prefer having an option to modify ITT API code when linking it\ninside their runtimes. ITT API header file provides a mechanism to replace\nITT API function names inside your code with empty strings. To do this,\ndefine the macros INTEL_NO_ITTNOTIFY_API during compilation and remove the\nstatic library from the linker script.\n\n@subsection Domains\n[see domains]\nDomains provide a way to separate notification for different modules or\nlibraries in a program. Domains are specified by dotted character strings,\ne.g. TBB.Internal.Control.\n\nA mechanism (to be specified) is provided to enable and disable\ndomains. By default, all domains are enabled.\n@subsection Named Entities and Instances\nNamed entities (frames, regions, tasks, and markers) communicate\ninformation about the program to the analysis tools. A named entity often\nrefers to a section of program code, or to some set of logical concepts\nthat the programmer wants to group together.\n\nNamed entities relate to the programmer's static view of the program. When\nthe program actually executes, many instances of a given named entity\nmay be created.\n\nThe API annotations denote instances of named entities. The actual\nnamed entities are displayed using the analysis tools. In other words,\nthe named entities come into existence when instances are created.\n\nInstances of named entities may have instance identifiers (IDs). Some\nAPI calls use instance identifiers to create relationships between\ndifferent instances of named entities. Other API calls associate data\nwith instances of named entities.\n\nSome named entities must always have instance IDs. In particular, regions\nand frames always have IDs. Task and markers need IDs only if the ID is\nneeded in another API call (such as adding a relation or metadata).\n\nThe lifetime of instance IDs is distinct from the lifetime of\ninstances. This allows various relationships to be specified separate\nfrom the actual execution of instances. This flexibility comes at the\nexpense of extra API calls.\n\nThe same ID may not be reused for different instances, unless a previous\n[ref] __itt_id_destroy call for that ID has been issued.\n*/\n\n/** @cond exclude_from_documentation */\n#ifndef ITT_OS_WIN\n#  define ITT_OS_WIN   1\n#endif /* ITT_OS_WIN */\n\n#ifndef ITT_OS_LINUX\n#  define ITT_OS_LINUX 2\n#endif /* ITT_OS_LINUX */\n\n#ifndef ITT_OS_MAC\n#  define ITT_OS_MAC   3\n#endif /* ITT_OS_MAC */\n\n#ifndef ITT_OS\n#  if defined WIN32 || defined _WIN32\n#    define ITT_OS ITT_OS_WIN\n#  elif defined( __APPLE__ ) && defined( __MACH__ )\n#    define ITT_OS ITT_OS_MAC\n#  else\n#    define ITT_OS ITT_OS_LINUX\n#  endif\n#endif /* ITT_OS */\n\n#ifndef ITT_PLATFORM_WIN\n#  define ITT_PLATFORM_WIN 1\n#endif /* ITT_PLATFORM_WIN */\n\n#ifndef ITT_PLATFORM_POSIX\n#  define ITT_PLATFORM_POSIX 2\n#endif /* ITT_PLATFORM_POSIX */\n\n#ifndef ITT_PLATFORM_MAC\n#  define ITT_PLATFORM_MAC 3\n#endif /* ITT_PLATFORM_MAC */\n\n#ifndef ITT_PLATFORM\n#  if ITT_OS==ITT_OS_WIN\n#    define ITT_PLATFORM ITT_PLATFORM_WIN\n#  elif ITT_OS==ITT_OS_MAC\n#    define ITT_PLATFORM ITT_PLATFORM_MAC\n#  else\n#    define ITT_PLATFORM ITT_PLATFORM_POSIX\n#  endif\n#endif /* ITT_PLATFORM */\n\n#if defined(_UNICODE) && !defined(UNICODE)\n#define UNICODE\n#endif\n\n#include <stddef.h>\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#include <tchar.h>\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#include <stdint.h>\n#if defined(UNICODE) || defined(_UNICODE)\n#include <wchar.h>\n#endif /* UNICODE || _UNICODE */\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\n#ifndef CDECL\n#  if ITT_PLATFORM==ITT_PLATFORM_WIN\n#    define CDECL __cdecl\n#  else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#    if defined _M_IX86 || defined __i386__ \n#      define CDECL __attribute__ ((cdecl))\n#    else  /* _M_IX86 || __i386__ */\n#      define CDECL /* actual only on x86 platform */\n#    endif /* _M_IX86 || __i386__ */\n#  endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* CDECL */\n\n#ifndef STDCALL\n#  if ITT_PLATFORM==ITT_PLATFORM_WIN\n#    define STDCALL __stdcall\n#  else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#    if defined _M_IX86 || defined __i386__\n#      define STDCALL __attribute__ ((stdcall)) \n#    else  /* _M_IX86 || __i386__ */\n#      define STDCALL /* supported only on x86 platform */\n#    endif /* _M_IX86 || __i386__ */\n#  endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* STDCALL */\n\n#define ITTAPI    CDECL\n#define LIBITTAPI CDECL\n\n/* TODO: Temporary for compatibility! */\n#define ITTAPI_CALL    CDECL\n#define LIBITTAPI_CALL CDECL\n\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n/* use __forceinline (VC++ specific) */\n#define ITT_INLINE           __forceinline\n#define ITT_INLINE_ATTRIBUTE /* nothing */\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n/*\n * Generally, functions are not inlined unless optimization is specified.\n * For functions declared inline, this attribute inlines the function even\n * if no optimization level was specified.\n */\n#ifdef __STRICT_ANSI__\n#define ITT_INLINE           static inline\n#else  /* __STRICT_ANSI__ */\n#define ITT_INLINE           static inline\n#endif /* __STRICT_ANSI__ */\n#define ITT_INLINE_ATTRIBUTE __attribute__ ((always_inline, unused))\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n/** @endcond */\n\n#ifdef INTEL_ITTNOTIFY_ENABLE_LEGACY\n#  if ITT_PLATFORM==ITT_PLATFORM_WIN\n#    pragma message(\"WARNING!!! Deprecated API is used. Please undefine INTEL_ITTNOTIFY_ENABLE_LEGACY macro\")\n#  else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n// #warning usage leads to ICC's compilation error\n// #    warning \"Deprecated API is used. Please undefine INTEL_ITTNOTIFY_ENABLE_LEGACY macro\"\n#  endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#  include \"legacy/ittnotify.h\"\n#endif /* INTEL_ITTNOTIFY_ENABLE_LEGACY */\n\n/** @cond exclude_from_documentation */\n/* Helper macro for joining tokens */\n#define ITT_JOIN_AUX(p,n) p##n\n#define ITT_JOIN(p,n)     ITT_JOIN_AUX(p,n)\n\n#ifdef ITT_MAJOR\n#undef ITT_MAJOR\n#endif\n#ifdef ITT_MINOR\n#undef ITT_MINOR\n#endif\n#define ITT_MAJOR     3\n#define ITT_MINOR     0\n\n/* Standard versioning of a token with major and minor version numbers */\n#define ITT_VERSIONIZE(x)    \\\n    ITT_JOIN(x,              \\\n    ITT_JOIN(_,              \\\n    ITT_JOIN(ITT_MAJOR,      \\\n    ITT_JOIN(_, ITT_MINOR))))\n\n#ifndef INTEL_ITTNOTIFY_PREFIX\n#  define INTEL_ITTNOTIFY_PREFIX __itt_\n#endif /* INTEL_ITTNOTIFY_PREFIX */\n#ifndef INTEL_ITTNOTIFY_POSTFIX\n#  define INTEL_ITTNOTIFY_POSTFIX _ptr_\n#endif /* INTEL_ITTNOTIFY_POSTFIX */\n\n#define ITTNOTIFY_NAME_AUX(n) ITT_JOIN(INTEL_ITTNOTIFY_PREFIX,n)\n#define ITTNOTIFY_NAME(n)     ITT_VERSIONIZE(ITTNOTIFY_NAME_AUX(ITT_JOIN(n,INTEL_ITTNOTIFY_POSTFIX)))\n\n#define ITTNOTIFY_VOID(n) (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)\n#define ITTNOTIFY_DATA(n) (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)\n\n#define ITTNOTIFY_VOID_D0(n,d)       (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d)\n#define ITTNOTIFY_VOID_D1(n,d,x)     (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x)\n#define ITTNOTIFY_VOID_D2(n,d,x,y)   (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y)\n#define ITTNOTIFY_VOID_D3(n,d,x,y,z) (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y,z)\n#define ITTNOTIFY_VOID_D4(n,d,x,y,z,a)     (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y,z,a)\n#define ITTNOTIFY_VOID_D5(n,d,x,y,z,a,b)   (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y,z,a,b)\n#define ITTNOTIFY_VOID_D6(n,d,x,y,z,a,b,c) (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y,z,a,b,c)\n#define ITTNOTIFY_DATA_D0(n,d)       (!(d)->flags) ?       0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d)\n#define ITTNOTIFY_DATA_D1(n,d,x)     (!(d)->flags) ?       0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x)\n#define ITTNOTIFY_DATA_D2(n,d,x,y)   (!(d)->flags) ?       0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x,y)\n#define ITTNOTIFY_DATA_D3(n,d,x,y,z) (!(d)->flags) ?       0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x,y,z)\n#define ITTNOTIFY_DATA_D4(n,d,x,y,z,a)     (!(d)->flags) ? 0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x,y,z,a)\n#define ITTNOTIFY_DATA_D5(n,d,x,y,z,a,b)   (!(d)->flags) ? 0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x,y,z,a,b)\n#define ITTNOTIFY_DATA_D6(n,d,x,y,z,a,b,c) (!(d)->flags) ? 0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x,y,z,a,b,c)\n\n#ifdef ITT_STUB\n#undef ITT_STUB\n#endif\n#ifdef ITT_STUBV\n#undef ITT_STUBV\n#endif\n#define ITT_STUBV(api,type,name,args)                             \\\n    typedef type (api* ITT_JOIN(ITTNOTIFY_NAME(name),_t)) args;   \\\n    extern ITT_JOIN(ITTNOTIFY_NAME(name),_t) ITTNOTIFY_NAME(name);\n#define ITT_STUB ITT_STUBV\n/** @endcond */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif /* __cplusplus */\n\n/** @cond exclude_from_gpa_documentation */\n/**\n * @defgroup public Public API\n * @{\n * @}\n */\n\n/**\n * @defgroup control Collection Control\n * @ingroup public\n * General behavior: application continues to run, but no profiling information is being collected\n *\n * Pausing occurs not only for the current thread but for all process as well as spawned processes\n * - Intel(R) Parallel Inspector and Intel(R) Inspector XE:\n *   - Does not analyze or report errors that involve memory access.\n *   - Other errors are reported as usual. Pausing data collection in\n *     Intel(R) Parallel Inspector and Intel(R) Inspector XE\n *     only pauses tracing and analyzing memory access.\n *     It does not pause tracing or analyzing threading APIs.\n *   .\n * - Intel(R) Parallel Amplifier and Intel(R) VTune(TM) Amplifier XE:\n *   - Does continue to record when new threads are started.\n *   .\n * - Other effects:\n *   - Possible reduction of runtime overhead.\n *   .\n * @{\n */\n/** @brief Pause collection */\nvoid ITTAPI __itt_pause(void);\n/** @brief Resume collection */\nvoid ITTAPI __itt_resume(void);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, pause,  (void))\nITT_STUBV(ITTAPI, void, resume, (void))\n#define __itt_pause      ITTNOTIFY_VOID(pause)\n#define __itt_pause_ptr  ITTNOTIFY_NAME(pause)\n#define __itt_resume     ITTNOTIFY_VOID(resume)\n#define __itt_resume_ptr ITTNOTIFY_NAME(resume)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_pause()\n#define __itt_pause_ptr  0\n#define __itt_resume()\n#define __itt_resume_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_pause_ptr  0\n#define __itt_resume_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n/** @} control group */\n/** @endcond */\n\n/**\n * @defgroup threads Threads\n * @ingroup public\n * Give names to threads\n * @{\n */\n/**\n * @brief Sets thread name of calling thread\n * @param[in] name - name of thread\n */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nvoid ITTAPI __itt_thread_set_nameA(const char    *name);\nvoid ITTAPI __itt_thread_set_nameW(const wchar_t *name);\n#if defined(UNICODE) || defined(_UNICODE)\n#  define __itt_thread_set_name     __itt_thread_set_nameW\n#  define __itt_thread_set_name_ptr __itt_thread_set_nameW_ptr\n#else /* UNICODE */\n#  define __itt_thread_set_name     __itt_thread_set_nameA\n#  define __itt_thread_set_name_ptr __itt_thread_set_nameA_ptr\n#endif /* UNICODE */\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nvoid ITTAPI __itt_thread_set_name(const char *name);\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUBV(ITTAPI, void, thread_set_nameA, (const char    *name))\nITT_STUBV(ITTAPI, void, thread_set_nameW, (const wchar_t *name))\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nITT_STUBV(ITTAPI, void, thread_set_name,  (const char    *name))\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_thread_set_nameA     ITTNOTIFY_VOID(thread_set_nameA)\n#define __itt_thread_set_nameA_ptr ITTNOTIFY_NAME(thread_set_nameA)\n#define __itt_thread_set_nameW     ITTNOTIFY_VOID(thread_set_nameW)\n#define __itt_thread_set_nameW_ptr ITTNOTIFY_NAME(thread_set_nameW)\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_thread_set_name     ITTNOTIFY_VOID(thread_set_name)\n#define __itt_thread_set_name_ptr ITTNOTIFY_NAME(thread_set_name)\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_thread_set_nameA(name)\n#define __itt_thread_set_nameA_ptr 0\n#define __itt_thread_set_nameW(name)\n#define __itt_thread_set_nameW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_thread_set_name(name)\n#define __itt_thread_set_name_ptr 0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_thread_set_nameA_ptr 0\n#define __itt_thread_set_nameW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_thread_set_name_ptr 0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/** @cond exclude_from_gpa_documentation */\n\n/**\n * @brief Mark current thread as ignored from this point on, for the duration of its existence.\n */\nvoid ITTAPI __itt_thread_ignore(void);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, thread_ignore, (void))\n#define __itt_thread_ignore     ITTNOTIFY_VOID(thread_ignore)\n#define __itt_thread_ignore_ptr ITTNOTIFY_NAME(thread_ignore)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_thread_ignore()\n#define __itt_thread_ignore_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_thread_ignore_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n/** @} threads group */\n\n/**\n * @defgroup suppress Error suppression\n * @ingroup public\n * General behavior: application continues to run, but errors are suppressed\n *\n * @{\n */\n\n/*****************************************************************//**\n * @name group of functions used for error suppression in correctness tools\n *********************************************************************/\n/** @{ */\n/**\n * @hideinitializer \n * @brief possible value for suppression mask\n */\n#define __itt_suppress_all_errors 0x7fffffff\n\n/**\n * @hideinitializer \n * @brief possible value for suppression mask (suppresses errors from threading analysis)\n */\n#define __itt_suppress_threading_errors 0x000000ff\n\n/**\n * @hideinitializer \n * @brief possible value for suppression mask (suppresses errors from memory analysis)\n */\n#define __itt_suppress_memory_errors 0x0000ff00\n\n/**\n * @brief Start suppressing errors identified in mask on this thread\n */\nvoid ITTAPI __itt_suppress_push(unsigned int mask);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, suppress_push, (unsigned int mask))\n#define __itt_suppress_push     ITTNOTIFY_VOID(suppress_push)\n#define __itt_suppress_push_ptr ITTNOTIFY_NAME(suppress_push)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_suppress_push(mask)\n#define __itt_suppress_push_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_suppress_push_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief Undo the effects of the matching call to __itt_suppress_push  \n */\nvoid ITTAPI __itt_suppress_pop(void);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, suppress_pop, (void))\n#define __itt_suppress_pop     ITTNOTIFY_VOID(suppress_pop)\n#define __itt_suppress_pop_ptr ITTNOTIFY_NAME(suppress_pop)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_suppress_pop()\n#define __itt_suppress_pop_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_suppress_pop_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @enum __itt_model_disable\n * @brief Enumerator for the disable methods\n */\ntypedef enum __itt_suppress_mode {\n    __itt_unsuppress_range,\n    __itt_suppress_range\n} __itt_suppress_mode_t;\n\n/**\n * @brief Mark a range of memory for error suppression or unsuppression for error types included in mask\n */\nvoid ITTAPI __itt_suppress_mark_range(__itt_suppress_mode_t mode, unsigned int mask, void * address, size_t size);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, suppress_mark_range, (__itt_suppress_mode_t mode, unsigned int mask, void * address, size_t size))\n#define __itt_suppress_mark_range     ITTNOTIFY_VOID(suppress_mark_range)\n#define __itt_suppress_mark_range_ptr ITTNOTIFY_NAME(suppress_mark_range)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_suppress_mark_range(mask)\n#define __itt_suppress_mark_range_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_suppress_mark_range_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief Undo the effect of a matching call to __itt_suppress_mark_range.   If not matching\n *        call is found, nothing is changed.\n */\nvoid ITTAPI __itt_suppress_clear_range(__itt_suppress_mode_t mode, unsigned int mask, void * address, size_t size);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, suppress_clear_range, (__itt_suppress_mode_t mode, unsigned int mask, void * address, size_t size))\n#define __itt_suppress_clear_range     ITTNOTIFY_VOID(suppress_clear_range)\n#define __itt_suppress_clear_range_ptr ITTNOTIFY_NAME(suppress_clear_range)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_suppress_clear_range(mask)\n#define __itt_suppress_clear_range_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_suppress_clear_range_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n/** @} */\n/** @} suppress group */\n\n/**\n * @defgroup sync Synchronization\n * @ingroup public\n * Indicate user-written synchronization code\n * @{\n */\n/**\n * @hideinitializer\n * @brief possible value of attribute argument for sync object type\n */\n#define __itt_attr_barrier 1\n\n/**\n * @hideinitializer\n * @brief possible value of attribute argument for sync object type\n */\n#define __itt_attr_mutex   2\n\n/**\n@brief Name a synchronization object\n@param[in] addr       Handle for the synchronization object. You should\nuse a real address to uniquely identify the synchronization object.\n@param[in] objtype    null-terminated object type string. If NULL is\npassed, the name will be \"User Synchronization\".\n@param[in] objname    null-terminated object name string. If NULL,\nno name will be assigned to the object.\n@param[in] attribute  one of [#__itt_attr_barrier, #__itt_attr_mutex]\n */\n\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nvoid ITTAPI __itt_sync_createA(void *addr, const char    *objtype, const char    *objname, int attribute);\nvoid ITTAPI __itt_sync_createW(void *addr, const wchar_t *objtype, const wchar_t *objname, int attribute);\n#if defined(UNICODE) || defined(_UNICODE)\n#  define __itt_sync_create     __itt_sync_createW\n#  define __itt_sync_create_ptr __itt_sync_createW_ptr\n#else /* UNICODE */\n#  define __itt_sync_create     __itt_sync_createA\n#  define __itt_sync_create_ptr __itt_sync_createA_ptr\n#endif /* UNICODE */\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nvoid ITTAPI __itt_sync_create (void *addr, const char *objtype, const char *objname, int attribute);\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUBV(ITTAPI, void, sync_createA, (void *addr, const char    *objtype, const char    *objname, int attribute))\nITT_STUBV(ITTAPI, void, sync_createW, (void *addr, const wchar_t *objtype, const wchar_t *objname, int attribute))\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nITT_STUBV(ITTAPI, void, sync_create,  (void *addr, const char*    objtype, const char*    objname, int attribute))\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_sync_createA     ITTNOTIFY_VOID(sync_createA)\n#define __itt_sync_createA_ptr ITTNOTIFY_NAME(sync_createA)\n#define __itt_sync_createW     ITTNOTIFY_VOID(sync_createW)\n#define __itt_sync_createW_ptr ITTNOTIFY_NAME(sync_createW)\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_sync_create     ITTNOTIFY_VOID(sync_create)\n#define __itt_sync_create_ptr ITTNOTIFY_NAME(sync_create)\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_sync_createA(addr, objtype, objname, attribute)\n#define __itt_sync_createA_ptr 0\n#define __itt_sync_createW(addr, objtype, objname, attribute)\n#define __itt_sync_createW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_sync_create(addr, objtype, objname, attribute)\n#define __itt_sync_create_ptr 0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_sync_createA_ptr 0\n#define __itt_sync_createW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_sync_create_ptr 0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n@brief Rename a synchronization object\n\nYou can use the rename call to assign or reassign a name to a given\nsynchronization object.\n@param[in] addr  handle for the synchronization object.\n@param[in] name  null-terminated object name string.\n*/\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nvoid ITTAPI __itt_sync_renameA(void *addr, const char    *name);\nvoid ITTAPI __itt_sync_renameW(void *addr, const wchar_t *name);\n#if defined(UNICODE) || defined(_UNICODE)\n#  define __itt_sync_rename     __itt_sync_renameW\n#  define __itt_sync_rename_ptr __itt_sync_renameW_ptr\n#else /* UNICODE */\n#  define __itt_sync_rename     __itt_sync_renameA\n#  define __itt_sync_rename_ptr __itt_sync_renameA_ptr\n#endif /* UNICODE */\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nvoid ITTAPI __itt_sync_rename(void *addr, const char *name);\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUBV(ITTAPI, void, sync_renameA, (void *addr, const char    *name))\nITT_STUBV(ITTAPI, void, sync_renameW, (void *addr, const wchar_t *name))\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nITT_STUBV(ITTAPI, void, sync_rename,  (void *addr, const char    *name))\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_sync_renameA     ITTNOTIFY_VOID(sync_renameA)\n#define __itt_sync_renameA_ptr ITTNOTIFY_NAME(sync_renameA)\n#define __itt_sync_renameW     ITTNOTIFY_VOID(sync_renameW)\n#define __itt_sync_renameW_ptr ITTNOTIFY_NAME(sync_renameW)\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_sync_rename     ITTNOTIFY_VOID(sync_rename)\n#define __itt_sync_rename_ptr ITTNOTIFY_NAME(sync_rename)\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_sync_renameA(addr, name)\n#define __itt_sync_renameA_ptr 0\n#define __itt_sync_renameW(addr, name)\n#define __itt_sync_renameW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_sync_rename(addr, name)\n#define __itt_sync_rename_ptr 0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_sync_renameA_ptr 0\n#define __itt_sync_renameW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_sync_rename_ptr 0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n @brief Destroy a synchronization object.\n @param addr Handle for the synchronization object.\n */\nvoid ITTAPI __itt_sync_destroy(void *addr);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, sync_destroy, (void *addr))\n#define __itt_sync_destroy     ITTNOTIFY_VOID(sync_destroy)\n#define __itt_sync_destroy_ptr ITTNOTIFY_NAME(sync_destroy)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_sync_destroy(addr)\n#define __itt_sync_destroy_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_sync_destroy_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/*****************************************************************//**\n * @name group of functions is used for performance measurement tools\n *********************************************************************/\n/** @{ */\n/**\n * @brief Enter spin loop on user-defined sync object\n */\nvoid ITTAPI __itt_sync_prepare(void* addr);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, sync_prepare, (void *addr))\n#define __itt_sync_prepare     ITTNOTIFY_VOID(sync_prepare)\n#define __itt_sync_prepare_ptr ITTNOTIFY_NAME(sync_prepare)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_sync_prepare(addr)\n#define __itt_sync_prepare_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_sync_prepare_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief Quit spin loop without acquiring spin object\n */\nvoid ITTAPI __itt_sync_cancel(void *addr);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, sync_cancel, (void *addr))\n#define __itt_sync_cancel     ITTNOTIFY_VOID(sync_cancel)\n#define __itt_sync_cancel_ptr ITTNOTIFY_NAME(sync_cancel)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_sync_cancel(addr)\n#define __itt_sync_cancel_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_sync_cancel_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief Successful spin loop completion (sync object acquired)\n */\nvoid ITTAPI __itt_sync_acquired(void *addr);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, sync_acquired, (void *addr))\n#define __itt_sync_acquired     ITTNOTIFY_VOID(sync_acquired)\n#define __itt_sync_acquired_ptr ITTNOTIFY_NAME(sync_acquired)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_sync_acquired(addr)\n#define __itt_sync_acquired_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_sync_acquired_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief Start sync object releasing code. Is called before the lock release call.\n */\nvoid ITTAPI __itt_sync_releasing(void* addr);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, sync_releasing, (void *addr))\n#define __itt_sync_releasing     ITTNOTIFY_VOID(sync_releasing)\n#define __itt_sync_releasing_ptr ITTNOTIFY_NAME(sync_releasing)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_sync_releasing(addr)\n#define __itt_sync_releasing_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_sync_releasing_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n/** @} */\n\n/** @} sync group */\n\n/**************************************************************//**\n * @name group of functions is used for correctness checking tools\n ******************************************************************/\n/** @{ */\n/**\n * @ingroup legacy\n * @deprecated Legacy API\n * @brief Fast synchronization which does no require spinning.\n * - This special function is to be used by TBB and OpenMP libraries only when they know\n *   there is no spin but they need to suppress TC warnings about shared variable modifications.\n * - It only has corresponding pointers in static library and does not have corresponding function\n *   in dynamic library.\n * @see void __itt_sync_prepare(void* addr);\n */\nvoid ITTAPI __itt_fsync_prepare(void* addr);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, fsync_prepare, (void *addr))\n#define __itt_fsync_prepare     ITTNOTIFY_VOID(fsync_prepare)\n#define __itt_fsync_prepare_ptr ITTNOTIFY_NAME(fsync_prepare)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_fsync_prepare(addr)\n#define __itt_fsync_prepare_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_fsync_prepare_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @ingroup legacy\n * @deprecated Legacy API\n * @brief Fast synchronization which does no require spinning.\n * - This special function is to be used by TBB and OpenMP libraries only when they know\n *   there is no spin but they need to suppress TC warnings about shared variable modifications.\n * - It only has corresponding pointers in static library and does not have corresponding function\n *   in dynamic library.\n * @see void __itt_sync_cancel(void *addr);\n */\nvoid ITTAPI __itt_fsync_cancel(void *addr);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, fsync_cancel, (void *addr))\n#define __itt_fsync_cancel     ITTNOTIFY_VOID(fsync_cancel)\n#define __itt_fsync_cancel_ptr ITTNOTIFY_NAME(fsync_cancel)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_fsync_cancel(addr)\n#define __itt_fsync_cancel_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_fsync_cancel_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @ingroup legacy\n * @deprecated Legacy API\n * @brief Fast synchronization which does no require spinning.\n * - This special function is to be used by TBB and OpenMP libraries only when they know\n *   there is no spin but they need to suppress TC warnings about shared variable modifications.\n * - It only has corresponding pointers in static library and does not have corresponding function\n *   in dynamic library.\n * @see void __itt_sync_acquired(void *addr);\n */\nvoid ITTAPI __itt_fsync_acquired(void *addr);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, fsync_acquired, (void *addr))\n#define __itt_fsync_acquired     ITTNOTIFY_VOID(fsync_acquired)\n#define __itt_fsync_acquired_ptr ITTNOTIFY_NAME(fsync_acquired)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_fsync_acquired(addr)\n#define __itt_fsync_acquired_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_fsync_acquired_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @ingroup legacy\n * @deprecated Legacy API\n * @brief Fast synchronization which does no require spinning.\n * - This special function is to be used by TBB and OpenMP libraries only when they know\n *   there is no spin but they need to suppress TC warnings about shared variable modifications.\n * - It only has corresponding pointers in static library and does not have corresponding function\n *   in dynamic library.\n * @see void __itt_sync_releasing(void* addr);\n */\nvoid ITTAPI __itt_fsync_releasing(void* addr);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, fsync_releasing, (void *addr))\n#define __itt_fsync_releasing     ITTNOTIFY_VOID(fsync_releasing)\n#define __itt_fsync_releasing_ptr ITTNOTIFY_NAME(fsync_releasing)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_fsync_releasing(addr)\n#define __itt_fsync_releasing_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_fsync_releasing_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n/** @} */\n\n/**\n * @defgroup model Modeling by Intel(R) Parallel Advisor\n * @ingroup public\n * This is the subset of itt used for modeling by Intel(R) Parallel Advisor.\n * This API is called ONLY using annotate.h, by \"Annotation\" macros\n * the user places in their sources during the parallelism modeling steps.\n *\n * site_begin/end and task_begin/end take the address of handle variables,\n * which are writeable by the API.  Handles must be 0 initialized prior\n * to the first call to begin, or may cause a run-time failure.\n * The handles are initialized in a multi-thread safe way by the API if\n * the handle is 0.  The commonly expected idiom is one static handle to\n * identify a site or task.  If a site or task of the same name has already\n * been started during this collection, the same handle MAY be returned,\n * but is not required to be - it is unspecified if data merging is done\n * based on name.  These routines also take an instance variable.  Like\n * the lexical instance, these must be 0 initialized.  Unlike the lexical\n * instance, this is used to track a single dynamic instance.\n *\n * API used by the Intel(R) Parallel Advisor to describe potential concurrency\n * and related activities. User-added source annotations expand to calls\n * to these procedures to enable modeling of a hypothetical concurrent\n * execution serially.\n * @{\n */\n#if !defined(_ADVISOR_ANNOTATE_H_) || defined(ANNOTATE_EXPAND_NULL)\n\ntypedef void* __itt_model_site;             /*!< @brief handle for lexical site     */\ntypedef void* __itt_model_site_instance;    /*!< @brief handle for dynamic instance */\ntypedef void* __itt_model_task;             /*!< @brief handle for lexical site     */\ntypedef void* __itt_model_task_instance;    /*!< @brief handle for dynamic instance */\n\n/**\n * @enum __itt_model_disable\n * @brief Enumerator for the disable methods\n */\ntypedef enum {\n    __itt_model_disable_observation,\n    __itt_model_disable_collection\n} __itt_model_disable;\n\n#endif /* !_ADVISOR_ANNOTATE_H_ || ANNOTATE_EXPAND_NULL */\n\n/**\n * @brief ANNOTATE_SITE_BEGIN/ANNOTATE_SITE_END support.\n *\n * site_begin/end model a potential concurrency site.\n * site instances may be recursively nested with themselves.\n * site_end exits the most recently started but unended site for the current\n * thread.  The handle passed to end may be used to validate structure.\n * Instances of a site encountered on different threads concurrently\n * are considered completely distinct. If the site name for two different\n * lexical sites match, it is unspecified whether they are treated as the\n * same or different for data presentation.\n */\nvoid ITTAPI __itt_model_site_begin(__itt_model_site *site, __itt_model_site_instance *instance, const char *name);\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nvoid ITTAPI __itt_model_site_beginW(const wchar_t *name);\n#endif\nvoid ITTAPI __itt_model_site_beginA(const char *name);\nvoid ITTAPI __itt_model_site_beginAL(const char *name, size_t siteNameLen);\nvoid ITTAPI __itt_model_site_end  (__itt_model_site *site, __itt_model_site_instance *instance);\nvoid ITTAPI __itt_model_site_end_2(void);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, model_site_begin,  (__itt_model_site *site, __itt_model_site_instance *instance, const char *name))\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUBV(ITTAPI, void, model_site_beginW,  (const wchar_t *name))\n#endif\nITT_STUBV(ITTAPI, void, model_site_beginA,  (const char *name))\nITT_STUBV(ITTAPI, void, model_site_beginAL,  (const char *name, size_t siteNameLen))\nITT_STUBV(ITTAPI, void, model_site_end,    (__itt_model_site *site, __itt_model_site_instance *instance))\nITT_STUBV(ITTAPI, void, model_site_end_2,  (void))\n#define __itt_model_site_begin      ITTNOTIFY_VOID(model_site_begin)\n#define __itt_model_site_begin_ptr  ITTNOTIFY_NAME(model_site_begin)\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_model_site_beginW      ITTNOTIFY_VOID(model_site_beginW)\n#define __itt_model_site_beginW_ptr  ITTNOTIFY_NAME(model_site_beginW)\n#endif\n#define __itt_model_site_beginA      ITTNOTIFY_VOID(model_site_beginA)\n#define __itt_model_site_beginA_ptr  ITTNOTIFY_NAME(model_site_beginA)\n#define __itt_model_site_beginAL      ITTNOTIFY_VOID(model_site_beginAL)\n#define __itt_model_site_beginAL_ptr  ITTNOTIFY_NAME(model_site_beginAL)\n#define __itt_model_site_end        ITTNOTIFY_VOID(model_site_end)\n#define __itt_model_site_end_ptr    ITTNOTIFY_NAME(model_site_end)\n#define __itt_model_site_end_2        ITTNOTIFY_VOID(model_site_end_2)\n#define __itt_model_site_end_2_ptr    ITTNOTIFY_NAME(model_site_end_2)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_model_site_begin(site, instance, name)\n#define __itt_model_site_begin_ptr  0\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_model_site_beginW(name)\n#define __itt_model_site_beginW_ptr  0\n#endif\n#define __itt_model_site_beginA(name)\n#define __itt_model_site_beginA_ptr  0\n#define __itt_model_site_beginAL(name, siteNameLen)\n#define __itt_model_site_beginAL_ptr  0\n#define __itt_model_site_end(site, instance)\n#define __itt_model_site_end_ptr    0\n#define __itt_model_site_end_2()\n#define __itt_model_site_end_2_ptr    0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_model_site_begin_ptr  0\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_model_site_beginW_ptr  0\n#endif\n#define __itt_model_site_beginA_ptr  0\n#define __itt_model_site_beginAL_ptr  0\n#define __itt_model_site_end_ptr    0\n#define __itt_model_site_end_2_ptr    0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief ANNOTATE_TASK_BEGIN/ANNOTATE_TASK_END support\n *\n * task_begin/end model a potential task, which is contained within the most\n * closely enclosing dynamic site.  task_end exits the most recently started\n * but unended task.  The handle passed to end may be used to validate\n * structure.  It is unspecified if bad dynamic nesting is detected.  If it\n * is, it should be encoded in the resulting data collection.  The collector\n * should not fail due to construct nesting issues, nor attempt to directly\n * indicate the problem.\n */\nvoid ITTAPI __itt_model_task_begin(__itt_model_task *task, __itt_model_task_instance *instance, const char *name);\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nvoid ITTAPI __itt_model_task_beginW(const wchar_t *name);\nvoid ITTAPI __itt_model_iteration_taskW(const wchar_t *name);\n#endif\nvoid ITTAPI __itt_model_task_beginA(const char *name);\nvoid ITTAPI __itt_model_task_beginAL(const char *name, size_t taskNameLen);\nvoid ITTAPI __itt_model_iteration_taskA(const char *name);\nvoid ITTAPI __itt_model_iteration_taskAL(const char *name, size_t taskNameLen);\nvoid ITTAPI __itt_model_task_end  (__itt_model_task *task, __itt_model_task_instance *instance);\nvoid ITTAPI __itt_model_task_end_2(void);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, model_task_begin,  (__itt_model_task *task, __itt_model_task_instance *instance, const char *name))\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUBV(ITTAPI, void, model_task_beginW,  (const wchar_t *name))\nITT_STUBV(ITTAPI, void, model_iteration_taskW, (const wchar_t *name))\n#endif\nITT_STUBV(ITTAPI, void, model_task_beginA,  (const char *name))\nITT_STUBV(ITTAPI, void, model_task_beginAL,  (const char *name, size_t taskNameLen))\nITT_STUBV(ITTAPI, void, model_iteration_taskA,  (const char *name))\nITT_STUBV(ITTAPI, void, model_iteration_taskAL,  (const char *name, size_t taskNameLen))\nITT_STUBV(ITTAPI, void, model_task_end,    (__itt_model_task *task, __itt_model_task_instance *instance))\nITT_STUBV(ITTAPI, void, model_task_end_2,  (void))\n#define __itt_model_task_begin      ITTNOTIFY_VOID(model_task_begin)\n#define __itt_model_task_begin_ptr  ITTNOTIFY_NAME(model_task_begin)\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_model_task_beginW     ITTNOTIFY_VOID(model_task_beginW)\n#define __itt_model_task_beginW_ptr ITTNOTIFY_NAME(model_task_beginW)\n#define __itt_model_iteration_taskW     ITTNOTIFY_VOID(model_iteration_taskW)\n#define __itt_model_iteration_taskW_ptr ITTNOTIFY_NAME(model_iteration_taskW)\n#endif\n#define __itt_model_task_beginA    ITTNOTIFY_VOID(model_task_beginA)\n#define __itt_model_task_beginA_ptr ITTNOTIFY_NAME(model_task_beginA)\n#define __itt_model_task_beginAL    ITTNOTIFY_VOID(model_task_beginAL)\n#define __itt_model_task_beginAL_ptr ITTNOTIFY_NAME(model_task_beginAL)\n#define __itt_model_iteration_taskA    ITTNOTIFY_VOID(model_iteration_taskA)\n#define __itt_model_iteration_taskA_ptr ITTNOTIFY_NAME(model_iteration_taskA)\n#define __itt_model_iteration_taskAL    ITTNOTIFY_VOID(model_iteration_taskAL)\n#define __itt_model_iteration_taskAL_ptr ITTNOTIFY_NAME(model_iteration_taskAL)\n#define __itt_model_task_end        ITTNOTIFY_VOID(model_task_end)\n#define __itt_model_task_end_ptr    ITTNOTIFY_NAME(model_task_end)\n#define __itt_model_task_end_2        ITTNOTIFY_VOID(model_task_end_2)\n#define __itt_model_task_end_2_ptr    ITTNOTIFY_NAME(model_task_end_2)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_model_task_begin(task, instance, name)\n#define __itt_model_task_begin_ptr  0\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_model_task_beginW(name)\n#define __itt_model_task_beginW_ptr  0\n#endif\n#define __itt_model_task_beginA(name)\n#define __itt_model_task_beginA_ptr  0\n#define __itt_model_task_beginAL(name, siteNameLen)\n#define __itt_model_task_beginAL_ptr  0\n#define __itt_model_iteration_taskA(name)\n#define __itt_model_iteration_taskA_ptr  0\n#define __itt_model_iteration_taskAL(name, siteNameLen)\n#define __itt_model_iteration_taskAL_ptr  0\n#define __itt_model_task_end(task, instance)\n#define __itt_model_task_end_ptr    0\n#define __itt_model_task_end_2()\n#define __itt_model_task_end_2_ptr    0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_model_task_begin_ptr  0\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_model_task_beginW_ptr 0\n#endif\n#define __itt_model_task_beginA_ptr  0\n#define __itt_model_task_beginAL_ptr  0\n#define __itt_model_iteration_taskA_ptr    0\n#define __itt_model_iteration_taskAL_ptr    0\n#define __itt_model_task_end_ptr    0\n#define __itt_model_task_end_2_ptr    0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief ANNOTATE_LOCK_ACQUIRE/ANNOTATE_LOCK_RELEASE support\n *\n * lock_acquire/release model a potential lock for both lockset and\n * performance modeling.  Each unique address is modeled as a separate\n * lock, with invalid addresses being valid lock IDs.  Specifically:\n * no storage is accessed by the API at the specified address - it is only\n * used for lock identification.  Lock acquires may be self-nested and are\n * unlocked by a corresponding number of releases.\n * (These closely correspond to __itt_sync_acquired/__itt_sync_releasing,\n * but may not have identical semantics.)\n */\nvoid ITTAPI __itt_model_lock_acquire(void *lock);\nvoid ITTAPI __itt_model_lock_acquire_2(void *lock);\nvoid ITTAPI __itt_model_lock_release(void *lock);\nvoid ITTAPI __itt_model_lock_release_2(void *lock);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, model_lock_acquire, (void *lock))\nITT_STUBV(ITTAPI, void, model_lock_acquire_2, (void *lock))\nITT_STUBV(ITTAPI, void, model_lock_release, (void *lock))\nITT_STUBV(ITTAPI, void, model_lock_release_2, (void *lock))\n#define __itt_model_lock_acquire     ITTNOTIFY_VOID(model_lock_acquire)\n#define __itt_model_lock_acquire_ptr ITTNOTIFY_NAME(model_lock_acquire)\n#define __itt_model_lock_acquire_2     ITTNOTIFY_VOID(model_lock_acquire_2)\n#define __itt_model_lock_acquire_2_ptr ITTNOTIFY_NAME(model_lock_acquire_2)\n#define __itt_model_lock_release     ITTNOTIFY_VOID(model_lock_release)\n#define __itt_model_lock_release_ptr ITTNOTIFY_NAME(model_lock_release)\n#define __itt_model_lock_release_2     ITTNOTIFY_VOID(model_lock_release_2)\n#define __itt_model_lock_release_2_ptr ITTNOTIFY_NAME(model_lock_release_2)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_model_lock_acquire(lock)\n#define __itt_model_lock_acquire_ptr 0\n#define __itt_model_lock_acquire_2(lock)\n#define __itt_model_lock_acquire_2_ptr 0\n#define __itt_model_lock_release(lock)\n#define __itt_model_lock_release_ptr 0\n#define __itt_model_lock_release_2(lock)\n#define __itt_model_lock_release_2_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_model_lock_acquire_ptr 0\n#define __itt_model_lock_acquire_2_ptr 0\n#define __itt_model_lock_release_ptr 0\n#define __itt_model_lock_release_2_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief ANNOTATE_RECORD_ALLOCATION/ANNOTATE_RECORD_DEALLOCATION support\n *\n * record_allocation/deallocation describe user-defined memory allocator\n * behavior, which may be required for correctness modeling to understand\n * when storage is not expected to be actually reused across threads.\n */\nvoid ITTAPI __itt_model_record_allocation  (void *addr, size_t size);\nvoid ITTAPI __itt_model_record_deallocation(void *addr);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, model_record_allocation,   (void *addr, size_t size))\nITT_STUBV(ITTAPI, void, model_record_deallocation, (void *addr))\n#define __itt_model_record_allocation       ITTNOTIFY_VOID(model_record_allocation)\n#define __itt_model_record_allocation_ptr   ITTNOTIFY_NAME(model_record_allocation)\n#define __itt_model_record_deallocation     ITTNOTIFY_VOID(model_record_deallocation)\n#define __itt_model_record_deallocation_ptr ITTNOTIFY_NAME(model_record_deallocation)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_model_record_allocation(addr, size)\n#define __itt_model_record_allocation_ptr   0\n#define __itt_model_record_deallocation(addr)\n#define __itt_model_record_deallocation_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_model_record_allocation_ptr   0\n#define __itt_model_record_deallocation_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief ANNOTATE_INDUCTION_USES support\n *\n * Note particular storage is inductive through the end of the current site\n */\nvoid ITTAPI __itt_model_induction_uses(void* addr, size_t size);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, model_induction_uses, (void *addr, size_t size))\n#define __itt_model_induction_uses     ITTNOTIFY_VOID(model_induction_uses)\n#define __itt_model_induction_uses_ptr ITTNOTIFY_NAME(model_induction_uses)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_model_induction_uses(addr, size)\n#define __itt_model_induction_uses_ptr   0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_model_induction_uses_ptr   0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief ANNOTATE_REDUCTION_USES support\n *\n * Note particular storage is used for reduction through the end\n * of the current site\n */\nvoid ITTAPI __itt_model_reduction_uses(void* addr, size_t size);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, model_reduction_uses, (void *addr, size_t size))\n#define __itt_model_reduction_uses     ITTNOTIFY_VOID(model_reduction_uses)\n#define __itt_model_reduction_uses_ptr ITTNOTIFY_NAME(model_reduction_uses)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_model_reduction_uses(addr, size)\n#define __itt_model_reduction_uses_ptr   0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_model_reduction_uses_ptr   0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief ANNOTATE_OBSERVE_USES support\n *\n * Have correctness modeling record observations about uses of storage\n * through the end of the current site\n */\nvoid ITTAPI __itt_model_observe_uses(void* addr, size_t size);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, model_observe_uses, (void *addr, size_t size))\n#define __itt_model_observe_uses     ITTNOTIFY_VOID(model_observe_uses)\n#define __itt_model_observe_uses_ptr ITTNOTIFY_NAME(model_observe_uses)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_model_observe_uses(addr, size)\n#define __itt_model_observe_uses_ptr   0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_model_observe_uses_ptr   0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief ANNOTATE_CLEAR_USES support\n *\n * Clear the special handling of a piece of storage related to induction,\n * reduction or observe_uses\n */\nvoid ITTAPI __itt_model_clear_uses(void* addr);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, model_clear_uses, (void *addr))\n#define __itt_model_clear_uses     ITTNOTIFY_VOID(model_clear_uses)\n#define __itt_model_clear_uses_ptr ITTNOTIFY_NAME(model_clear_uses)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_model_clear_uses(addr)\n#define __itt_model_clear_uses_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_model_clear_uses_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief ANNOTATE_DISABLE_*_PUSH/ANNOTATE_DISABLE_*_POP support\n *\n * disable_push/disable_pop push and pop disabling based on a parameter.\n * Disabling observations stops processing of memory references during\n * correctness modeling, and all annotations that occur in the disabled\n * region.  This allows description of code that is expected to be handled\n * specially during conversion to parallelism or that is not recognized\n * by tools (e.g. some kinds of synchronization operations.)\n * This mechanism causes all annotations in the disabled region, other\n * than disable_push and disable_pop, to be ignored.  (For example, this\n * might validly be used to disable an entire parallel site and the contained\n * tasks and locking in it for data collection purposes.)\n * The disable for collection is a more expensive operation, but reduces\n * collector overhead significantly.  This applies to BOTH correctness data\n * collection and performance data collection.  For example, a site\n * containing a task might only enable data collection for the first 10\n * iterations.  Both performance and correctness data should reflect this,\n * and the program should run as close to full speed as possible when\n * collection is disabled.\n */\nvoid ITTAPI __itt_model_disable_push(__itt_model_disable x);\nvoid ITTAPI __itt_model_disable_pop(void);\nvoid ITTAPI __itt_model_aggregate_task(size_t x);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, model_disable_push, (__itt_model_disable x))\nITT_STUBV(ITTAPI, void, model_disable_pop,  (void))\nITT_STUBV(ITTAPI, void, model_aggregate_task, (size_t x))\n#define __itt_model_disable_push     ITTNOTIFY_VOID(model_disable_push)\n#define __itt_model_disable_push_ptr ITTNOTIFY_NAME(model_disable_push)\n#define __itt_model_disable_pop      ITTNOTIFY_VOID(model_disable_pop)\n#define __itt_model_disable_pop_ptr  ITTNOTIFY_NAME(model_disable_pop)\n#define __itt_model_aggregate_task      ITTNOTIFY_VOID(model_aggregate_task)\n#define __itt_model_aggregate_task_ptr  ITTNOTIFY_NAME(model_aggregate_task)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_model_disable_push(x)\n#define __itt_model_disable_push_ptr 0\n#define __itt_model_disable_pop()\n#define __itt_model_disable_pop_ptr 0\n#define __itt_model_aggregate_task(x)\n#define __itt_model_aggregate_task_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_model_disable_push_ptr 0\n#define __itt_model_disable_pop_ptr 0\n#define __itt_model_aggregate_task_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n/** @} model group */\n\n/**\n * @defgroup heap Heap\n * @ingroup public\n * Heap group\n * @{\n */\n\ntypedef void* __itt_heap_function;\n\n/**\n * @brief Create an identification for heap function\n * @return non-zero identifier or NULL\n */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n__itt_heap_function ITTAPI __itt_heap_function_createA(const char*    name, const char*    domain);\n__itt_heap_function ITTAPI __itt_heap_function_createW(const wchar_t* name, const wchar_t* domain);\n#if defined(UNICODE) || defined(_UNICODE)\n#  define __itt_heap_function_create     __itt_heap_function_createW\n#  define __itt_heap_function_create_ptr __itt_heap_function_createW_ptr\n#else\n#  define __itt_heap_function_create     __itt_heap_function_createA\n#  define __itt_heap_function_create_ptr __itt_heap_function_createA_ptr\n#endif /* UNICODE */\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n__itt_heap_function ITTAPI __itt_heap_function_create(const char* name, const char* domain);\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUB(ITTAPI, __itt_heap_function, heap_function_createA, (const char*    name, const char*    domain))\nITT_STUB(ITTAPI, __itt_heap_function, heap_function_createW, (const wchar_t* name, const wchar_t* domain))\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nITT_STUB(ITTAPI, __itt_heap_function, heap_function_create,  (const char*    name, const char*    domain))\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_heap_function_createA     ITTNOTIFY_DATA(heap_function_createA)\n#define __itt_heap_function_createA_ptr ITTNOTIFY_NAME(heap_function_createA)\n#define __itt_heap_function_createW     ITTNOTIFY_DATA(heap_function_createW)\n#define __itt_heap_function_createW_ptr ITTNOTIFY_NAME(heap_function_createW)\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_heap_function_create      ITTNOTIFY_DATA(heap_function_create)\n#define __itt_heap_function_create_ptr  ITTNOTIFY_NAME(heap_function_create)\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_heap_function_createA(name, domain) (__itt_heap_function)0\n#define __itt_heap_function_createA_ptr 0\n#define __itt_heap_function_createW(name, domain) (__itt_heap_function)0\n#define __itt_heap_function_createW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_heap_function_create(name, domain)  (__itt_heap_function)0\n#define __itt_heap_function_create_ptr  0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_heap_function_createA_ptr 0\n#define __itt_heap_function_createW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_heap_function_create_ptr  0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief Record an allocation begin occurrence.\n */\nvoid ITTAPI __itt_heap_allocate_begin(__itt_heap_function h, size_t size, int initialized);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, heap_allocate_begin, (__itt_heap_function h, size_t size, int initialized))\n#define __itt_heap_allocate_begin     ITTNOTIFY_VOID(heap_allocate_begin)\n#define __itt_heap_allocate_begin_ptr ITTNOTIFY_NAME(heap_allocate_begin)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_heap_allocate_begin(h, size, initialized)\n#define __itt_heap_allocate_begin_ptr   0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_heap_allocate_begin_ptr   0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief Record an allocation end occurrence.\n */\nvoid ITTAPI __itt_heap_allocate_end(__itt_heap_function h, void** addr, size_t size, int initialized);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, heap_allocate_end, (__itt_heap_function h, void** addr, size_t size, int initialized))\n#define __itt_heap_allocate_end     ITTNOTIFY_VOID(heap_allocate_end)\n#define __itt_heap_allocate_end_ptr ITTNOTIFY_NAME(heap_allocate_end)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_heap_allocate_end(h, addr, size, initialized)\n#define __itt_heap_allocate_end_ptr   0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_heap_allocate_end_ptr   0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief Record an free begin occurrence.\n */\nvoid ITTAPI __itt_heap_free_begin(__itt_heap_function h, void* addr);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, heap_free_begin, (__itt_heap_function h, void* addr))\n#define __itt_heap_free_begin     ITTNOTIFY_VOID(heap_free_begin)\n#define __itt_heap_free_begin_ptr ITTNOTIFY_NAME(heap_free_begin)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_heap_free_begin(h, addr)\n#define __itt_heap_free_begin_ptr   0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_heap_free_begin_ptr   0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief Record an free end occurrence.\n */\nvoid ITTAPI __itt_heap_free_end(__itt_heap_function h, void* addr);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, heap_free_end, (__itt_heap_function h, void* addr))\n#define __itt_heap_free_end     ITTNOTIFY_VOID(heap_free_end)\n#define __itt_heap_free_end_ptr ITTNOTIFY_NAME(heap_free_end)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_heap_free_end(h, addr)\n#define __itt_heap_free_end_ptr   0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_heap_free_end_ptr   0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief Record an reallocation begin occurrence.\n */\nvoid ITTAPI __itt_heap_reallocate_begin(__itt_heap_function h, void* addr, size_t new_size, int initialized);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, heap_reallocate_begin, (__itt_heap_function h, void* addr, size_t new_size, int initialized))\n#define __itt_heap_reallocate_begin     ITTNOTIFY_VOID(heap_reallocate_begin)\n#define __itt_heap_reallocate_begin_ptr ITTNOTIFY_NAME(heap_reallocate_begin)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_heap_reallocate_begin(h, addr, new_size, initialized)\n#define __itt_heap_reallocate_begin_ptr   0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_heap_reallocate_begin_ptr   0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief Record an reallocation end occurrence.\n */\nvoid ITTAPI __itt_heap_reallocate_end(__itt_heap_function h, void* addr, void** new_addr, size_t new_size, int initialized);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, heap_reallocate_end, (__itt_heap_function h, void* addr, void** new_addr, size_t new_size, int initialized))\n#define __itt_heap_reallocate_end     ITTNOTIFY_VOID(heap_reallocate_end)\n#define __itt_heap_reallocate_end_ptr ITTNOTIFY_NAME(heap_reallocate_end)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_heap_reallocate_end(h, addr, new_addr, new_size, initialized)\n#define __itt_heap_reallocate_end_ptr   0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_heap_reallocate_end_ptr   0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/** @brief internal access begin */\nvoid ITTAPI __itt_heap_internal_access_begin(void);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, heap_internal_access_begin,  (void))\n#define __itt_heap_internal_access_begin      ITTNOTIFY_VOID(heap_internal_access_begin)\n#define __itt_heap_internal_access_begin_ptr  ITTNOTIFY_NAME(heap_internal_access_begin)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_heap_internal_access_begin()\n#define __itt_heap_internal_access_begin_ptr  0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_heap_internal_access_begin_ptr  0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/** @brief internal access end */\nvoid ITTAPI __itt_heap_internal_access_end(void);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, heap_internal_access_end, (void))\n#define __itt_heap_internal_access_end     ITTNOTIFY_VOID(heap_internal_access_end)\n#define __itt_heap_internal_access_end_ptr ITTNOTIFY_NAME(heap_internal_access_end)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_heap_internal_access_end()\n#define __itt_heap_internal_access_end_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_heap_internal_access_end_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/** @brief record memory growth begin */\nvoid ITTAPI __itt_heap_record_memory_growth_begin(void);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, heap_record_memory_growth_begin,  (void))\n#define __itt_heap_record_memory_growth_begin      ITTNOTIFY_VOID(heap_record_memory_growth_begin)\n#define __itt_heap_record_memory_growth_begin_ptr  ITTNOTIFY_NAME(heap_record_memory_growth_begin)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_heap_record_memory_growth_begin()\n#define __itt_heap_record_memory_growth_begin_ptr  0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_heap_record_memory_growth_begin_ptr  0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/** @brief record memory growth end */\nvoid ITTAPI __itt_heap_record_memory_growth_end(void);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, heap_record_memory_growth_end, (void))\n#define __itt_heap_record_memory_growth_end     ITTNOTIFY_VOID(heap_record_memory_growth_end)\n#define __itt_heap_record_memory_growth_end_ptr ITTNOTIFY_NAME(heap_record_memory_growth_end)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_heap_record_memory_growth_end()\n#define __itt_heap_record_memory_growth_end_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_heap_record_memory_growth_end_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief Specify the type of heap detection/reporting to modify.\n */\n/**\n * @hideinitializer \n * @brief Report on memory leaks.\n */\n#define __itt_heap_leaks 0x00000001\n\n/**\n * @hideinitializer \n * @brief Report on memory growth.\n */\n#define __itt_heap_growth 0x00000002\n\n\n/** @brief heap reset detection */\nvoid ITTAPI __itt_heap_reset_detection(unsigned int reset_mask);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, heap_reset_detection,  (unsigned int reset_mask))\n#define __itt_heap_reset_detection      ITTNOTIFY_VOID(heap_reset_detection)\n#define __itt_heap_reset_detection_ptr  ITTNOTIFY_NAME(heap_reset_detection)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_heap_reset_detection()\n#define __itt_heap_reset_detection_ptr  0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_heap_reset_detection_ptr  0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/** @brief report */\nvoid ITTAPI __itt_heap_record(unsigned int record_mask);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, heap_record, (unsigned int record_mask))\n#define __itt_heap_record     ITTNOTIFY_VOID(heap_record)\n#define __itt_heap_record_ptr ITTNOTIFY_NAME(heap_record)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_heap_record()\n#define __itt_heap_record_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_heap_record_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/** @} heap group */\n/** @endcond */\n/* ========================================================================== */\n\n/**\n * @defgroup domains Domains\n * @ingroup public\n * Domains group\n * @{\n */\n\n/** @cond exclude_from_documentation */\n#pragma pack(push, 8)\n\ntypedef struct ___itt_domain\n{\n    volatile int flags; /*!< Zero if disabled, non-zero if enabled. The meaning of different non-zero values is reserved to the runtime */\n    const char* nameA;  /*!< Copy of original name in ASCII. */\n#if defined(UNICODE) || defined(_UNICODE)\n    const wchar_t* nameW; /*!< Copy of original name in UNICODE. */\n#else  /* UNICODE || _UNICODE */\n    void* nameW;\n#endif /* UNICODE || _UNICODE */\n    int   extra1; /*!< Reserved to the runtime */\n    void* extra2; /*!< Reserved to the runtime */\n    struct ___itt_domain* next;\n} __itt_domain;\n\n#pragma pack(pop)\n/** @endcond */\n\n/**\n * @ingroup domains\n * @brief Create a domain.\n * Create domain using some domain name: the URI naming style is recommended.\n * Because the set of domains is expected to be static over the application's \n * execution time, there is no mechanism to destroy a domain.\n * Any domain can be accessed by any thread in the process, regardless of\n * which thread created the domain. This call is thread-safe.\n * @param[in] name name of domain\n */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n__itt_domain* ITTAPI __itt_domain_createA(const char    *name);\n__itt_domain* ITTAPI __itt_domain_createW(const wchar_t *name);\n#if defined(UNICODE) || defined(_UNICODE)\n#  define __itt_domain_create     __itt_domain_createW\n#  define __itt_domain_create_ptr __itt_domain_createW_ptr\n#else /* UNICODE */\n#  define __itt_domain_create     __itt_domain_createA\n#  define __itt_domain_create_ptr __itt_domain_createA_ptr\n#endif /* UNICODE */\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n__itt_domain* ITTAPI __itt_domain_create(const char *name);\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUB(ITTAPI, __itt_domain*, domain_createA, (const char    *name))\nITT_STUB(ITTAPI, __itt_domain*, domain_createW, (const wchar_t *name))\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nITT_STUB(ITTAPI, __itt_domain*, domain_create,  (const char    *name))\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_domain_createA     ITTNOTIFY_DATA(domain_createA)\n#define __itt_domain_createA_ptr ITTNOTIFY_NAME(domain_createA)\n#define __itt_domain_createW     ITTNOTIFY_DATA(domain_createW)\n#define __itt_domain_createW_ptr ITTNOTIFY_NAME(domain_createW)\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_domain_create     ITTNOTIFY_DATA(domain_create)\n#define __itt_domain_create_ptr ITTNOTIFY_NAME(domain_create)\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_domain_createA(name) (__itt_domain*)0\n#define __itt_domain_createA_ptr 0\n#define __itt_domain_createW(name) (__itt_domain*)0\n#define __itt_domain_createW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_domain_create(name)  (__itt_domain*)0\n#define __itt_domain_create_ptr 0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_domain_createA_ptr 0\n#define __itt_domain_createW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_domain_create_ptr  0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n/** @} domains group */\n\n/**\n * @defgroup ids IDs\n * @ingroup public\n * IDs group\n * @{\n */\n\n/** @cond exclude_from_documentation */\n#pragma pack(push, 8)\n\ntypedef struct ___itt_id\n{\n    unsigned long long d1, d2, d3;\n} __itt_id;\n\n#pragma pack(pop)\n/** @endcond */\n\nstatic const __itt_id __itt_null = { 0, 0, 0 };\n\n/**\n * @ingroup ids\n * @brief A convenience function is provided to create an ID without domain control.\n * @brief This is a convenience function to initialize an __itt_id structure. This function\n * does not affect the trace collector runtime in any way. After you make the ID with this\n * function, you still must create it with the __itt_id_create function before using the ID\n * to identify a named entity.\n * @param[in] addr The address of object; high QWORD of the ID value.\n * @param[in] extra The extra data to unique identify object; low QWORD of the ID value.\n */\n\nITT_INLINE __itt_id ITTAPI __itt_id_make(void* addr, unsigned long long extra) ITT_INLINE_ATTRIBUTE;\nITT_INLINE __itt_id ITTAPI __itt_id_make(void* addr, unsigned long long extra)\n{\n    __itt_id id = __itt_null;\n    id.d1 = (unsigned long long)((uintptr_t)addr);\n    id.d2 = (unsigned long long)extra;\n    id.d3 = (unsigned long long)0; /* Reserved. Must be zero */\n    return id;\n}\n\n/**\n * @ingroup ids\n * @brief Create an instance of identifier.\n * This establishes the beginning of the lifetime of an instance of\n * the given ID in the trace. Once this lifetime starts, the ID\n * can be used to tag named entity instances in calls such as\n * __itt_task_begin, and to specify relationships among\n * identified named entity instances, using the \\ref relations APIs.\n * Instance IDs are not domain specific!\n * @param[in] domain The domain controlling the execution of this call.\n * @param[in] id The ID to create.\n */\nvoid ITTAPI __itt_id_create(const __itt_domain *domain, __itt_id id);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, id_create, (const __itt_domain *domain, __itt_id id))\n#define __itt_id_create(d,x) ITTNOTIFY_VOID_D1(id_create,d,x)\n#define __itt_id_create_ptr  ITTNOTIFY_NAME(id_create)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_id_create(domain,id)\n#define __itt_id_create_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_id_create_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @ingroup ids\n * @brief Destroy an instance of identifier.\n * This ends the lifetime of the current instance of the given ID value in the trace.\n * Any relationships that are established after this lifetime ends are invalid.\n * This call must be performed before the given ID value can be reused for a different \n * named entity instance.\n * @param[in] domain The domain controlling the execution of this call.\n * @param[in] id The ID to destroy.\n */\nvoid ITTAPI __itt_id_destroy(const __itt_domain *domain, __itt_id id);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, id_destroy, (const __itt_domain *domain, __itt_id id))\n#define __itt_id_destroy(d,x) ITTNOTIFY_VOID_D1(id_destroy,d,x)\n#define __itt_id_destroy_ptr  ITTNOTIFY_NAME(id_destroy)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_id_destroy(domain,id)\n#define __itt_id_destroy_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_id_destroy_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n/** @} ids group */\n\n/**\n * @defgroup handless String Handles\n * @ingroup public\n * String Handles group\n * @{\n */\n\n/** @cond exclude_from_documentation */\n#pragma pack(push, 8)\n\ntypedef struct ___itt_string_handle\n{\n    const char* strA; /*!< Copy of original string in ASCII. */\n#if defined(UNICODE) || defined(_UNICODE)\n    const wchar_t* strW; /*!< Copy of original string in UNICODE. */\n#else  /* UNICODE || _UNICODE */\n    void* strW;\n#endif /* UNICODE || _UNICODE */\n    int   extra1; /*!< Reserved. Must be zero   */\n    void* extra2; /*!< Reserved. Must be zero   */\n    struct ___itt_string_handle* next;\n} __itt_string_handle;\n\n#pragma pack(pop)\n/** @endcond */\n\n/**\n * @ingroup handles\n * @brief Create a string handle.\n * Create and return handle value that can be associated with a string.\n * Consecutive calls to __itt_string_handle_create with the same name\n * return the same value. Because the set of string handles is expected to remain\n * static during the application's execution time, there is no mechanism to destroy a string handle.\n * Any string handle can be accessed by any thread in the process, regardless of which thread created\n * the string handle. This call is thread-safe.\n * @param[in] name The input string\n */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n__itt_string_handle* ITTAPI __itt_string_handle_createA(const char    *name);\n__itt_string_handle* ITTAPI __itt_string_handle_createW(const wchar_t *name);\n#if defined(UNICODE) || defined(_UNICODE)\n#  define __itt_string_handle_create     __itt_string_handle_createW\n#  define __itt_string_handle_create_ptr __itt_string_handle_createW_ptr\n#else /* UNICODE */\n#  define __itt_string_handle_create     __itt_string_handle_createA\n#  define __itt_string_handle_create_ptr __itt_string_handle_createA_ptr\n#endif /* UNICODE */\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n__itt_string_handle* ITTAPI __itt_string_handle_create(const char *name);\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUB(ITTAPI, __itt_string_handle*, string_handle_createA, (const char    *name))\nITT_STUB(ITTAPI, __itt_string_handle*, string_handle_createW, (const wchar_t *name))\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nITT_STUB(ITTAPI, __itt_string_handle*, string_handle_create,  (const char    *name))\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_string_handle_createA     ITTNOTIFY_DATA(string_handle_createA)\n#define __itt_string_handle_createA_ptr ITTNOTIFY_NAME(string_handle_createA)\n#define __itt_string_handle_createW     ITTNOTIFY_DATA(string_handle_createW)\n#define __itt_string_handle_createW_ptr ITTNOTIFY_NAME(string_handle_createW)\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_string_handle_create     ITTNOTIFY_DATA(string_handle_create)\n#define __itt_string_handle_create_ptr ITTNOTIFY_NAME(string_handle_create)\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_string_handle_createA(name) (__itt_string_handle*)0\n#define __itt_string_handle_createA_ptr 0\n#define __itt_string_handle_createW(name) (__itt_string_handle*)0\n#define __itt_string_handle_createW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_string_handle_create(name)  (__itt_string_handle*)0\n#define __itt_string_handle_create_ptr 0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_string_handle_createA_ptr 0\n#define __itt_string_handle_createW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_string_handle_create_ptr  0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n/** @} handles group */\n\n/** @cond exclude_from_documentation */\ntypedef unsigned long long __itt_timestamp;\n/** @endcond */\n\nstatic const __itt_timestamp __itt_timestamp_none = (__itt_timestamp)-1LL;\n\n/** @cond exclude_from_gpa_documentation */\n\n/**\n * @ingroup timestamps\n * @brief Return timestamp corresponding to the current moment.\n * This returns the timestamp in the format that is the most relevant for the current\n * host or platform (RDTSC, QPC, and others). You can use the \"<\" operator to\n * compare __itt_timestamp values.\n */\n__itt_timestamp ITTAPI __itt_get_timestamp(void);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUB(ITTAPI, __itt_timestamp, get_timestamp, (void))\n#define __itt_get_timestamp      ITTNOTIFY_DATA(get_timestamp)\n#define __itt_get_timestamp_ptr  ITTNOTIFY_NAME(get_timestamp)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_get_timestamp()\n#define __itt_get_timestamp_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_get_timestamp_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n/** @} timestamps */\n/** @endcond */\n\n/** @cond exclude_from_gpa_documentation */\n\n/**\n * @defgroup regions Regions\n * @ingroup public\n * Regions group\n * @{\n */\n/**\n * @ingroup regions\n * @brief Begin of region instance.\n * Successive calls to __itt_region_begin with the same ID are ignored\n * until a call to __itt_region_end with the same ID\n * @param[in] domain The domain for this region instance\n * @param[in] id The instance ID for this region instance. Must not be __itt_null\n * @param[in] parentid The instance ID for the parent of this region instance, or __itt_null\n * @param[in] name The name of this region\n */\nvoid ITTAPI __itt_region_begin(const __itt_domain *domain, __itt_id id, __itt_id parentid, __itt_string_handle *name);\n\n/**\n * @ingroup regions\n * @brief End of region instance.\n * The first call to __itt_region_end with a given ID ends the\n * region. Successive calls with the same ID are ignored, as are\n * calls that do not have a matching __itt_region_begin call.\n * @param[in] domain The domain for this region instance\n * @param[in] id The instance ID for this region instance\n */\nvoid ITTAPI __itt_region_end(const __itt_domain *domain, __itt_id id);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, region_begin, (const __itt_domain *domain, __itt_id id, __itt_id parentid, __itt_string_handle *name))\nITT_STUBV(ITTAPI, void, region_end,   (const __itt_domain *domain, __itt_id id))\n#define __itt_region_begin(d,x,y,z) ITTNOTIFY_VOID_D3(region_begin,d,x,y,z)\n#define __itt_region_begin_ptr      ITTNOTIFY_NAME(region_begin)\n#define __itt_region_end(d,x)       ITTNOTIFY_VOID_D1(region_end,d,x)\n#define __itt_region_end_ptr        ITTNOTIFY_NAME(region_end)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_region_begin(d,x,y,z)\n#define __itt_region_begin_ptr 0\n#define __itt_region_end(d,x)\n#define __itt_region_end_ptr   0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_region_begin_ptr 0\n#define __itt_region_end_ptr   0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n/** @} regions group */\n\n/**\n * @defgroup frames Frames\n * @ingroup public\n * Frames are similar to regions, but are intended to be easier to use and to implement.\n * In particular:\n * - Frames always represent periods of elapsed time\n * - By default, frames have no nesting relationships\n * @{\n */\n\n/**\n * @ingroup frames\n * @brief Begin a frame instance.\n * Successive calls to __itt_frame_begin with the\n * same ID are ignored until a call to __itt_frame_end with the same ID.\n * @param[in] domain The domain for this frame instance\n * @param[in] id The instance ID for this frame instance or NULL\n */\nvoid ITTAPI __itt_frame_begin_v3(const __itt_domain *domain, __itt_id *id);\n\n/**\n * @ingroup frames\n * @brief End a frame instance.\n * The first call to __itt_frame_end with a given ID\n * ends the frame. Successive calls with the same ID are ignored, as are\n * calls that do not have a matching __itt_frame_begin call.\n * @param[in] domain The domain for this frame instance\n * @param[in] id The instance ID for this frame instance or NULL for current\n */\nvoid ITTAPI __itt_frame_end_v3(const __itt_domain *domain, __itt_id *id);\n\n/**\n * @ingroup frames\n * @brief Submits a frame instance.\n * Successive calls to __itt_frame_begin or __itt_frame_submit with the\n * same ID are ignored until a call to __itt_frame_end or __itt_frame_submit\n * with the same ID.\n * Passing special __itt_timestamp_none value as \"end\" argument means\n * take the current timestamp as the end timestamp.\n * @param[in] domain The domain for this frame instance\n * @param[in] id The instance ID for this frame instance or NULL\n * @param[in] begin Timestamp of the beggining of the frame\n * @param[in] end Timestamp of the end of the frame\n */\nvoid ITTAPI __itt_frame_submit_v3(const __itt_domain *domain, __itt_id *id,\n    __itt_timestamp begin, __itt_timestamp end);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, frame_begin_v3,  (const __itt_domain *domain, __itt_id *id))\nITT_STUBV(ITTAPI, void, frame_end_v3,    (const __itt_domain *domain, __itt_id *id))\nITT_STUBV(ITTAPI, void, frame_submit_v3, (const __itt_domain *domain, __itt_id *id, __itt_timestamp begin, __itt_timestamp end))\n#define __itt_frame_begin_v3(d,x)      ITTNOTIFY_VOID_D1(frame_begin_v3,d,x)\n#define __itt_frame_begin_v3_ptr       ITTNOTIFY_NAME(frame_begin_v3)\n#define __itt_frame_end_v3(d,x)        ITTNOTIFY_VOID_D1(frame_end_v3,d,x)\n#define __itt_frame_end_v3_ptr         ITTNOTIFY_NAME(frame_end_v3)\n#define __itt_frame_submit_v3(d,x,b,e) ITTNOTIFY_VOID_D3(frame_submit_v3,d,x,b,e)\n#define __itt_frame_submit_v3_ptr      ITTNOTIFY_NAME(frame_submit_v3)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_frame_begin_v3(domain,id)\n#define __itt_frame_begin_v3_ptr 0\n#define __itt_frame_end_v3(domain,id)\n#define __itt_frame_end_v3_ptr   0\n#define __itt_frame_submit_v3(domain,id,begin,end)\n#define __itt_frame_submit_v3_ptr   0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_frame_begin_v3_ptr 0\n#define __itt_frame_end_v3_ptr   0\n#define __itt_frame_submit_v3_ptr   0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n/** @} frames group */\n/** @endcond */\n\n/**\n * @defgroup taskgroup Task Group\n * @ingroup public\n * Task Group\n * @{\n */\n/**\n * @ingroup task_groups\n * @brief Denotes a task_group instance.\n * Successive calls to __itt_task_group with the same ID are ignored.\n * @param[in] domain The domain for this task_group instance\n * @param[in] id The instance ID for this task_group instance. Must not be __itt_null.\n * @param[in] parentid The instance ID for the parent of this task_group instance, or __itt_null.\n * @param[in] name The name of this task_group\n */\nvoid ITTAPI __itt_task_group(const __itt_domain *domain, __itt_id id, __itt_id parentid, __itt_string_handle *name);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, task_group, (const __itt_domain *domain, __itt_id id, __itt_id parentid, __itt_string_handle *name))\n#define __itt_task_group(d,x,y,z) ITTNOTIFY_VOID_D3(task_group,d,x,y,z)\n#define __itt_task_group_ptr      ITTNOTIFY_NAME(task_group)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_task_group(d,x,y,z)\n#define __itt_task_group_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_task_group_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n/** @} taskgroup group */\n\n/**\n * @defgroup tasks Tasks\n * @ingroup public\n * A task instance represents a piece of work performed by a particular\n * thread for a period of time. A call to __itt_task_begin creates a\n * task instance. This becomes the current instance for that task on that\n * thread. A following call to __itt_task_end on the same thread ends the\n * instance. There may be multiple simultaneous instances of tasks with the\n * same name on different threads. If an ID is specified, the task instance\n * receives that ID. Nested tasks are allowed.\n *\n * Note: The task is defined by the bracketing of __itt_task_begin and\n * __itt_task_end on the same thread. If some scheduling mechanism causes\n * task switching (the thread executes a different user task) or task\n * switching (the user task switches to a different thread) then this breaks\n * the notion of  current instance. Additional API calls are required to\n * deal with that possibility.\n * @{\n */\n\n/**\n * @ingroup tasks\n * @brief Begin a task instance.\n * @param[in] domain The domain for this task\n * @param[in] taskid The instance ID for this task instance, or __itt_null\n * @param[in] parentid The parent instance to which this task instance belongs, or __itt_null\n * @param[in] name The name of this task\n */\nvoid ITTAPI __itt_task_begin(const __itt_domain *domain, __itt_id taskid, __itt_id parentid, __itt_string_handle *name);\n\n/**\n * @ingroup tasks\n * @brief Begin a task instance.\n * @param[in] domain The domain for this task\n * @param[in] taskid The identifier for this task instance (may be 0)\n * @param[in] parentid The parent of this task (may be 0)\n * @param[in] fn The pointer to the function you are tracing\n */\nvoid ITTAPI __itt_task_begin_fn(const __itt_domain *domain, __itt_id taskid, __itt_id parentid, void* fn);\n\n/**\n * @ingroup tasks\n * @brief End the current task instance.\n * @param[in] domain The domain for this task\n */\nvoid ITTAPI __itt_task_end(const __itt_domain *domain);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, task_begin,    (const __itt_domain *domain, __itt_id id, __itt_id parentid, __itt_string_handle *name))\nITT_STUBV(ITTAPI, void, task_begin_fn, (const __itt_domain *domain, __itt_id id, __itt_id parentid, void* fn))\nITT_STUBV(ITTAPI, void, task_end,      (const __itt_domain *domain))\n#define __itt_task_begin(d,x,y,z)    ITTNOTIFY_VOID_D3(task_begin,d,x,y,z)\n#define __itt_task_begin_ptr         ITTNOTIFY_NAME(task_begin)\n#define __itt_task_begin_fn(d,x,y,z) ITTNOTIFY_VOID_D3(task_begin_fn,d,x,y,z)\n#define __itt_task_begin_fn_ptr      ITTNOTIFY_NAME(task_begin_fn)\n#define __itt_task_end(d)            ITTNOTIFY_VOID_D0(task_end,d)\n#define __itt_task_end_ptr           ITTNOTIFY_NAME(task_end)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_task_begin(domain,id,parentid,name)\n#define __itt_task_begin_ptr    0\n#define __itt_task_begin_fn(domain,id,parentid,fn)\n#define __itt_task_begin_fn_ptr 0\n#define __itt_task_end(domain)\n#define __itt_task_end_ptr      0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_task_begin_ptr    0\n#define __itt_task_begin_fn_ptr 0\n#define __itt_task_end_ptr      0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n/** @} tasks group */\n\n/**\n * @defgroup counters Counters\n * @ingroup public\n * Counters are user-defined objects with a monotonically increasing\n * value. Counter values are 64-bit unsigned integers. Counter values\n * are tracked per-thread. Counters have names that can be displayed in\n * the tools.\n * @{\n */\n\n/**\n * @ingroup counters\n * @brief Increment a counter by one.\n * The first call with a given name creates a counter by that name and sets its\n * value to zero on every thread. Successive calls increment the counter value\n * on the thread on which the call is issued.\n * @param[in] domain The domain controlling the call. Counter names are not domain specific.\n *            The domain argument is used only to enable or disable the API calls.\n * @param[in] name The name of the counter\n */\nvoid ITTAPI __itt_counter_inc_v3(const __itt_domain *domain, __itt_string_handle *name);\n\n/**\n * @ingroup counters\n * @brief Increment a counter by the value specified in delta.\n * @param[in] domain The domain controlling the call. Counter names are not domain specific.\n *            The domain argument is used only to enable or disable the API calls.\n * @param[in] name The name of the counter\n * @param[in] delta The amount by which to increment the counter\n */\nvoid ITTAPI __itt_counter_inc_delta_v3(const __itt_domain *domain, __itt_string_handle *name, unsigned long long delta);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, counter_inc_v3,       (const __itt_domain *domain, __itt_string_handle *name))\nITT_STUBV(ITTAPI, void, counter_inc_delta_v3, (const __itt_domain *domain, __itt_string_handle *name, unsigned long long delta))\n#define __itt_counter_inc_v3(d,x)         ITTNOTIFY_VOID_D1(counter_inc_v3,d,x)\n#define __itt_counter_inc_v3_ptr          ITTNOTIFY_NAME(counter_inc_v3)\n#define __itt_counter_inc_delta_v3(d,x,y) ITTNOTIFY_VOID_D2(counter_inc_delta_v3,d,x,y)\n#define __itt_counter_inc_delta_v3_ptr    ITTNOTIFY_NAME(counter_inc_delta_v3)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_counter_inc_v3(domain,name)\n#define __itt_counter_inc_v3_ptr       0\n#define __itt_counter_inc_delta_v3(domain,name,delta)\n#define __itt_counter_inc_delta_v3_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_counter_inc_v3_ptr       0\n#define __itt_counter_inc_delta_v3_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n/** @} counters group */\n\n/**\n * @defgroup markers Markers\n * Markers represent a single discreet event in time. Markers have a scope,\n * described by an enumerated type __itt_scope. Markers are created by\n * the API call __itt_marker. A marker instance can be given an ID for use in\n * adding metadata.\n * @{\n */\n\n/**\n * @brief Describes the scope of an event object in the trace.\n */\ntypedef enum\n{\n    __itt_scope_unknown = 0,\n    __itt_scope_global,\n    __itt_scope_track_group,\n    __itt_scope_track,\n    __itt_scope_task,\n    __itt_scope_marker\n} __itt_scope;\n\n/** @cond exclude_from_documentation */\n#define __itt_marker_scope_unknown  __itt_scope_unknown\n#define __itt_marker_scope_global   __itt_scope_global\n#define __itt_marker_scope_process  __itt_scope_track_group\n#define __itt_marker_scope_thread   __itt_scope_track\n#define __itt_marker_scope_task     __itt_scope_task\n/** @endcond */\n\n/**\n * @ingroup markers\n * @brief Create a marker instance\n * @param[in] domain The domain for this marker\n * @param[in] id The instance ID for this marker or __itt_null\n * @param[in] name The name for this marker\n * @param[in] scope The scope for this marker\n */\nvoid ITTAPI __itt_marker(const __itt_domain *domain, __itt_id id, __itt_string_handle *name, __itt_scope scope);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, marker, (const __itt_domain *domain, __itt_id id, __itt_string_handle *name, __itt_scope scope))\n#define __itt_marker(d,x,y,z) ITTNOTIFY_VOID_D3(marker,d,x,y,z)\n#define __itt_marker_ptr      ITTNOTIFY_NAME(marker)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_marker(domain,id,name,scope)\n#define __itt_marker_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_marker_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n/** @} markers group */\n\n/**\n * @defgroup metadata Metadata\n * The metadata API is used to attach extra information to named\n * entities. Metadata can be attached to an identified named entity by ID,\n * or to the current entity (which is always a task).\n *\n * Conceptually metadata has a type (what kind of metadata), a key (the\n * name of the metadata), and a value (the actual data). The encoding of\n * the value depends on the type of the metadata.\n *\n * The type of metadata is specified by an enumerated type __itt_metdata_type.\n * @{\n */\n\n/**\n * @ingroup parameters\n * @brief describes the type of metadata\n */\ntypedef enum {\n    __itt_metadata_unknown = 0,\n    __itt_metadata_u64,     /**< Unsigned 64-bit integer */\n    __itt_metadata_s64,     /**< Signed 64-bit integer */\n    __itt_metadata_u32,     /**< Unsigned 32-bit integer */\n    __itt_metadata_s32,     /**< Signed 32-bit integer */\n    __itt_metadata_u16,     /**< Unsigned 16-bit integer */\n    __itt_metadata_s16,     /**< Signed 16-bit integer */\n    __itt_metadata_float,   /**< Signed 32-bit floating-point */\n    __itt_metadata_double   /**< SIgned 64-bit floating-point */\n} __itt_metadata_type;\n\n/**\n * @ingroup parameters\n * @brief Add metadata to an instance of a named entity.\n * @param[in] domain The domain controlling the call\n * @param[in] id The identifier of the instance to which the metadata is to be added, or __itt_null to add to the current task\n * @param[in] key The name of the metadata\n * @param[in] type The type of the metadata\n * @param[in] count The number of elements of the given type. If count == 0, no metadata will be added.\n * @param[in] data The metadata itself\n*/\nvoid ITTAPI __itt_metadata_add(const __itt_domain *domain, __itt_id id, __itt_string_handle *key, __itt_metadata_type type, size_t count, void *data);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, metadata_add, (const __itt_domain *domain, __itt_id id, __itt_string_handle *key, __itt_metadata_type type, size_t count, void *data))\n#define __itt_metadata_add(d,x,y,z,a,b) ITTNOTIFY_VOID_D5(metadata_add,d,x,y,z,a,b)\n#define __itt_metadata_add_ptr          ITTNOTIFY_NAME(metadata_add)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_metadata_add(d,x,y,z,a,b)\n#define __itt_metadata_add_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_metadata_add_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @ingroup parameters\n * @brief Add string metadata to an instance of a named entity.\n * @param[in] domain The domain controlling the call\n * @param[in] id The identifier of the instance to which the metadata is to be added, or __itt_null to add to the current task\n * @param[in] key The name of the metadata\n * @param[in] data The metadata itself\n * @param[in] length The number of characters in the string, or -1 if the length is unknown but the string is null-terminated \n*/\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nvoid ITTAPI __itt_metadata_str_addA(const __itt_domain *domain, __itt_id id, __itt_string_handle *key, const char *data, size_t length);\nvoid ITTAPI __itt_metadata_str_addW(const __itt_domain *domain, __itt_id id, __itt_string_handle *key, const wchar_t *data, size_t length);\n#if defined(UNICODE) || defined(_UNICODE)\n#  define __itt_metadata_str_add     __itt_metadata_str_addW\n#  define __itt_metadata_str_add_ptr __itt_metadata_str_addW_ptr\n#else /* UNICODE */\n#  define __itt_metadata_str_add     __itt_metadata_str_addA\n#  define __itt_metadata_str_add_ptr __itt_metadata_str_addA_ptr\n#endif /* UNICODE */\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nvoid ITTAPI __itt_metadata_str_add(const __itt_domain *domain, __itt_id id, __itt_string_handle *key, const char *data, size_t length);\n#endif\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUBV(ITTAPI, void, metadata_str_addA, (const __itt_domain *domain, __itt_id id, __itt_string_handle *key, const char *data, size_t length))\nITT_STUBV(ITTAPI, void, metadata_str_addW, (const __itt_domain *domain, __itt_id id, __itt_string_handle *key, const wchar_t *data, size_t length))\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nITT_STUBV(ITTAPI, void, metadata_str_add, (const __itt_domain *domain, __itt_id id, __itt_string_handle *key, const char *data, size_t length))\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_metadata_str_addA(d,x,y,z,a) ITTNOTIFY_VOID_D4(metadata_str_addA,d,x,y,z,a)\n#define __itt_metadata_str_addA_ptr        ITTNOTIFY_NAME(metadata_str_addA)\n#define __itt_metadata_str_addW(d,x,y,z,a) ITTNOTIFY_VOID_D4(metadata_str_addW,d,x,y,z,a)\n#define __itt_metadata_str_addW_ptr        ITTNOTIFY_NAME(metadata_str_addW)\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_metadata_str_add(d,x,y,z,a)  ITTNOTIFY_VOID_D4(metadata_str_add,d,x,y,z,a)\n#define __itt_metadata_str_add_ptr         ITTNOTIFY_NAME(metadata_str_add)\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_metadata_str_addA(d,x,y,z,a) \n#define __itt_metadata_str_addA_ptr 0\n#define __itt_metadata_str_addW(d,x,y,z,a) \n#define __itt_metadata_str_addW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_metadata_str_add(d,x,y,z,a)\n#define __itt_metadata_str_add_ptr 0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_metadata_str_addA_ptr 0\n#define __itt_metadata_str_addW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_metadata_str_add_ptr  0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @ingroup parameters\n * @brief Add metadata to an instance of a named entity.\n * @param[in] domain The domain controlling the call\n * @param[in] scope The scope of the instance to which the metadata is to be added\n\n * @param[in] id The identifier of the instance to which the metadata is to be added, or __itt_null to add to the current task\n \n * @param[in] key The name of the metadata\n * @param[in] type The type of the metadata\n * @param[in] count The number of elements of the given type. If count == 0, no metadata will be added.\n * @param[in] data The metadata itself\n*/\nvoid ITTAPI __itt_metadata_add_with_scope(const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, __itt_metadata_type type, size_t count, void *data);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, metadata_add_with_scope, (const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, __itt_metadata_type type, size_t count, void *data))\n#define __itt_metadata_add_with_scope(d,x,y,z,a,b) ITTNOTIFY_VOID_D5(metadata_add_with_scope,d,x,y,z,a,b)\n#define __itt_metadata_add_with_scope_ptr          ITTNOTIFY_NAME(metadata_add_with_scope)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_metadata_add_with_scope(d,x,y,z,a,b)\n#define __itt_metadata_add_with_scope_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_metadata_add_with_scope_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @ingroup parameters\n * @brief Add string metadata to an instance of a named entity.\n * @param[in] domain The domain controlling the call\n * @param[in] scope The scope of the instance to which the metadata is to be added\n\n * @param[in] id The identifier of the instance to which the metadata is to be added, or __itt_null to add to the current task\n\n * @param[in] key The name of the metadata\n * @param[in] data The metadata itself\n * @param[in] length The number of characters in the string, or -1 if the length is unknown but the string is null-terminated \n*/\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nvoid ITTAPI __itt_metadata_str_add_with_scopeA(const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, const char *data, size_t length);\nvoid ITTAPI __itt_metadata_str_add_with_scopeW(const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, const wchar_t *data, size_t length);\n#if defined(UNICODE) || defined(_UNICODE)\n#  define __itt_metadata_str_add_with_scope     __itt_metadata_str_add_with_scopeW\n#  define __itt_metadata_str_add_with_scope_ptr __itt_metadata_str_add_with_scopeW_ptr\n#else /* UNICODE */\n#  define __itt_metadata_str_add_with_scope     __itt_metadata_str_add_with_scopeA\n#  define __itt_metadata_str_add_with_scope_ptr __itt_metadata_str_add_with_scopeA_ptr\n#endif /* UNICODE */\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nvoid ITTAPI __itt_metadata_str_add_with_scope(const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, const char *data, size_t length);\n#endif\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUBV(ITTAPI, void, metadata_str_add_with_scopeA, (const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, const char *data, size_t length))\nITT_STUBV(ITTAPI, void, metadata_str_add_with_scopeW, (const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, const wchar_t *data, size_t length))\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nITT_STUBV(ITTAPI, void, metadata_str_add_with_scope, (const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, const char *data, size_t length))\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_metadata_str_add_with_scopeA(d,x,y,z,a) ITTNOTIFY_VOID_D4(metadata_str_add_with_scopeA,d,x,y,z,a)\n#define __itt_metadata_str_add_with_scopeA_ptr        ITTNOTIFY_NAME(metadata_str_add_with_scopeA)\n#define __itt_metadata_str_add_with_scopeW(d,x,y,z,a) ITTNOTIFY_VOID_D4(metadata_str_add_with_scopeW,d,x,y,z,a)\n#define __itt_metadata_str_add_with_scopeW_ptr        ITTNOTIFY_NAME(metadata_str_add_with_scopeW)\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_metadata_str_add_with_scope(d,x,y,z,a)  ITTNOTIFY_VOID_D4(metadata_str_add_with_scope,d,x,y,z,a)\n#define __itt_metadata_str_add_with_scope_ptr         ITTNOTIFY_NAME(metadata_str_add_with_scope)\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_metadata_str_add_with_scopeA(d,x,y,z,a) \n#define __itt_metadata_str_add_with_scopeA_ptr  0\n#define __itt_metadata_str_add_with_scopeW(d,x,y,z,a) \n#define __itt_metadata_str_add_with_scopeW_ptr  0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_metadata_str_add_with_scope(d,x,y,z,a)\n#define __itt_metadata_str_add_with_scope_ptr   0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_metadata_str_add_with_scopeA_ptr  0\n#define __itt_metadata_str_add_with_scopeW_ptr  0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_metadata_str_add_with_scope_ptr   0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/** @} metadata group */\n\n/**\n * @defgroup relations Relations\n * Instances of named entities can be explicitly associated with other\n * instances using instance IDs and the relationship API calls.\n *\n * @{\n */\n\n/**\n * @ingroup relations\n * @brief The kind of relation between two instances is specified by the enumerated type __itt_relation.\n * Relations between instances can be added with an API call. The relation\n * API uses instance IDs. Relations can be added before or after the actual\n * instances are created and persist independently of the instances. This\n * is the motivation for having different lifetimes for instance IDs and\n * the actual instances.\n */\ntypedef enum\n{\n    __itt_relation_is_unknown = 0,\n    __itt_relation_is_dependent_on,         /**< \"A is dependent on B\" means that A cannot start until B completes */\n    __itt_relation_is_sibling_of,           /**< \"A is sibling of B\" means that A and B were created as a group */\n    __itt_relation_is_parent_of,            /**< \"A is parent of B\" means that A created B */\n    __itt_relation_is_continuation_of,      /**< \"A is continuation of B\" means that A assumes the dependencies of B */\n    __itt_relation_is_child_of,             /**< \"A is child of B\" means that A was created by B (inverse of is_parent_of) */\n    __itt_relation_is_continued_by,         /**< \"A is continued by B\" means that B assumes the dependencies of A (inverse of is_continuation_of) */\n    __itt_relation_is_predecessor_to        /**< \"A is predecessor to B\" means that B cannot start until A completes (inverse of is_dependent_on) */\n} __itt_relation;\n\n/**\n * @ingroup relations\n * @brief Add a relation to the current task instance.\n * The current task instance is the head of the relation.\n * @param[in] domain The domain controlling this call\n * @param[in] relation The kind of relation\n * @param[in] tail The ID for the tail of the relation\n */\nvoid ITTAPI __itt_relation_add_to_current(const __itt_domain *domain, __itt_relation relation, __itt_id tail);\n\n/**\n * @ingroup relations\n * @brief Add a relation between two instance identifiers.\n * @param[in] domain The domain controlling this call\n * @param[in] head The ID for the head of the relation\n * @param[in] relation The kind of relation\n * @param[in] tail The ID for the tail of the relation\n */\nvoid ITTAPI __itt_relation_add(const __itt_domain *domain, __itt_id head, __itt_relation relation, __itt_id tail);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, relation_add_to_current, (const __itt_domain *domain, __itt_relation relation, __itt_id tail))\nITT_STUBV(ITTAPI, void, relation_add,            (const __itt_domain *domain, __itt_id head, __itt_relation relation, __itt_id tail))\n#define __itt_relation_add_to_current(d,x,y) ITTNOTIFY_VOID_D2(relation_add_to_current,d,x,y)\n#define __itt_relation_add_to_current_ptr    ITTNOTIFY_NAME(relation_add_to_current)\n#define __itt_relation_add(d,x,y,z)          ITTNOTIFY_VOID_D3(relation_add,d,x,y,z)\n#define __itt_relation_add_ptr               ITTNOTIFY_NAME(relation_add)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_relation_add_to_current(d,x,y)\n#define __itt_relation_add_to_current_ptr 0\n#define __itt_relation_add(d,x,y,z)\n#define __itt_relation_add_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_relation_add_to_current_ptr 0\n#define __itt_relation_add_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n/** @} relations group */\n\n/** @cond exclude_from_documentation */\n#pragma pack(push, 8)\n\ntypedef struct ___itt_clock_info\n{\n    unsigned long long clock_freq; /*!< Clock domain frequency */\n    unsigned long long clock_base; /*!< Clock domain base timestamp */\n} __itt_clock_info;\n\n#pragma pack(pop)\n/** @endcond */\n\n/** @cond exclude_from_documentation */\ntypedef void (ITTAPI *__itt_get_clock_info_fn)(__itt_clock_info* clock_info, void* data);\n/** @endcond */\n\n/** @cond exclude_from_documentation */\n#pragma pack(push, 8)\n\ntypedef struct ___itt_clock_domain\n{\n    __itt_clock_info info;      /*!< Most recent clock domain info */\n    __itt_get_clock_info_fn fn; /*!< Callback function pointer */\n    void* fn_data;              /*!< Input argument for the callback function */\n    int   extra1;               /*!< Reserved. Must be zero */\n    void* extra2;               /*!< Reserved. Must be zero */\n    struct ___itt_clock_domain* next;\n} __itt_clock_domain;\n\n#pragma pack(pop)\n/** @endcond */\n\n/**\n * @ingroup clockdomains\n * @brief Create a clock domain.\n * Certain applications require the capability to trace their application using\n * a clock domain different than the CPU, for instance the instrumentation of events\n * that occur on a GPU.\n * Because the set of domains is expected to be static over the application's execution time,\n * there is no mechanism to destroy a domain.\n * Any domain can be accessed by any thread in the process, regardless of which thread created\n * the domain. This call is thread-safe.\n * @param[in] fn A pointer to a callback function which retrieves alternative CPU timestamps\n * @param[in] fn_data Argument for a callback function; may be NULL\n */\n__itt_clock_domain* ITTAPI __itt_clock_domain_create(__itt_get_clock_info_fn fn, void* fn_data);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUB(ITTAPI, __itt_clock_domain*, clock_domain_create, (__itt_get_clock_info_fn fn, void* fn_data))\n#define __itt_clock_domain_create     ITTNOTIFY_DATA(clock_domain_create)\n#define __itt_clock_domain_create_ptr ITTNOTIFY_NAME(clock_domain_create)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_clock_domain_create(fn,fn_data) (__itt_clock_domain*)0\n#define __itt_clock_domain_create_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_clock_domain_create_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @ingroup clockdomains\n * @brief Recalculate clock domains frequences and clock base timestamps.\n */\nvoid ITTAPI __itt_clock_domain_reset(void);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, clock_domain_reset, (void))\n#define __itt_clock_domain_reset     ITTNOTIFY_VOID(clock_domain_reset)\n#define __itt_clock_domain_reset_ptr ITTNOTIFY_NAME(clock_domain_reset)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_clock_domain_reset()\n#define __itt_clock_domain_reset_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_clock_domain_reset_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @ingroup clockdomain\n * @brief Create an instance of identifier. This establishes the beginning of the lifetime of\n * an instance of the given ID in the trace. Once this lifetime starts, the ID can be used to\n * tag named entity instances in calls such as __itt_task_begin, and to specify relationships among\n * identified named entity instances, using the \\ref relations APIs.\n * @param[in] domain The domain controlling the execution of this call.\n * @param[in] clock_domain The clock domain controlling the execution of this call.\n * @param[in] timestamp The user defined timestamp.\n * @param[in] id The ID to create.\n */\nvoid ITTAPI __itt_id_create_ex(const __itt_domain* domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id);\n\n/**\n * @ingroup clockdomain\n * @brief Destroy an instance of identifier. This ends the lifetime of the current instance of the\n * given ID value in the trace. Any relationships that are established after this lifetime ends are\n * invalid. This call must be performed before the given ID value can be reused for a different\n * named entity instance.\n * @param[in] domain The domain controlling the execution of this call.\n * @param[in] clock_domain The clock domain controlling the execution of this call.\n * @param[in] timestamp The user defined timestamp.\n * @param[in] id The ID to destroy.\n */\nvoid ITTAPI __itt_id_destroy_ex(const __itt_domain* domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, id_create_ex,  (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id))\nITT_STUBV(ITTAPI, void, id_destroy_ex, (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id))\n#define __itt_id_create_ex(d,x,y,z)  ITTNOTIFY_VOID_D3(id_create_ex,d,x,y,z)\n#define __itt_id_create_ex_ptr       ITTNOTIFY_NAME(id_create_ex)\n#define __itt_id_destroy_ex(d,x,y,z) ITTNOTIFY_VOID_D3(id_destroy_ex,d,x,y,z)\n#define __itt_id_destroy_ex_ptr      ITTNOTIFY_NAME(id_destroy_ex)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_id_create_ex(domain,clock_domain,timestamp,id)\n#define __itt_id_create_ex_ptr    0\n#define __itt_id_destroy_ex(domain,clock_domain,timestamp,id)\n#define __itt_id_destroy_ex_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_id_create_ex_ptr    0\n#define __itt_id_destroy_ex_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @ingroup clockdomain\n * @brief Begin a task instance.\n * @param[in] domain The domain for this task\n * @param[in] clock_domain The clock domain controlling the execution of this call.\n * @param[in] timestamp The user defined timestamp.\n * @param[in] taskid The instance ID for this task instance, or __itt_null\n * @param[in] parentid The parent instance to which this task instance belongs, or __itt_null\n * @param[in] name The name of this task\n */\nvoid ITTAPI __itt_task_begin_ex(const __itt_domain* domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id taskid, __itt_id parentid, __itt_string_handle* name);\n\n/**\n * @ingroup clockdomain\n * @brief Begin a task instance.\n * @param[in] domain The domain for this task\n * @param[in] clock_domain The clock domain controlling the execution of this call.\n * @param[in] timestamp The user defined timestamp.\n * @param[in] taskid The identifier for this task instance, or __itt_null\n * @param[in] parentid The parent of this task, or __itt_null\n * @param[in] fn The pointer to the function you are tracing\n */\nvoid ITTAPI __itt_task_begin_fn_ex(const __itt_domain* domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id taskid, __itt_id parentid, void* fn);\n\n/**\n * @ingroup clockdomain\n * @brief End the current task instance.\n * @param[in] domain The domain for this task\n * @param[in] clock_domain The clock domain controlling the execution of this call.\n * @param[in] timestamp The user defined timestamp.\n */\nvoid ITTAPI __itt_task_end_ex(const __itt_domain* domain, __itt_clock_domain* clock_domain, unsigned long long timestamp);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, task_begin_ex,        (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id, __itt_id parentid, __itt_string_handle *name))\nITT_STUBV(ITTAPI, void, task_begin_fn_ex,     (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id, __itt_id parentid, void* fn))\nITT_STUBV(ITTAPI, void, task_end_ex,          (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp))\n#define __itt_task_begin_ex(d,x,y,z,a,b)      ITTNOTIFY_VOID_D5(task_begin_ex,d,x,y,z,a,b)\n#define __itt_task_begin_ex_ptr               ITTNOTIFY_NAME(task_begin_ex)\n#define __itt_task_begin_fn_ex(d,x,y,z,a,b)   ITTNOTIFY_VOID_D5(task_begin_fn_ex,d,x,y,z,a,b)\n#define __itt_task_begin_fn_ex_ptr            ITTNOTIFY_NAME(task_begin_fn_ex)\n#define __itt_task_end_ex(d,x,y)              ITTNOTIFY_VOID_D2(task_end_ex,d,x,y)\n#define __itt_task_end_ex_ptr                 ITTNOTIFY_NAME(task_end_ex)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_task_begin_ex(domain,clock_domain,timestamp,id,parentid,name)\n#define __itt_task_begin_ex_ptr          0\n#define __itt_task_begin_fn_ex(domain,clock_domain,timestamp,id,parentid,fn)\n#define __itt_task_begin_fn_ex_ptr       0\n#define __itt_task_end_ex(domain,clock_domain,timestamp)\n#define __itt_task_end_ex_ptr            0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_task_begin_ex_ptr          0\n#define __itt_task_begin_fn_ex_ptr       0\n#define __itt_task_end_ex_ptr            0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @ingroup markers\n * @brief Create a marker instance.\n * @param[in] domain The domain for this marker\n * @param[in] clock_domain The clock domain controlling the execution of this call.\n * @param[in] timestamp The user defined timestamp.\n * @param[in] id The instance ID for this marker, or __itt_null\n * @param[in] name The name for this marker\n * @param[in] scope The scope for this marker\n */\nvoid ITTAPI __itt_marker_ex(const __itt_domain *domain,  __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id, __itt_string_handle *name, __itt_scope scope);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, marker_ex,    (const __itt_domain *domain,  __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id, __itt_string_handle *name, __itt_scope scope))\n#define __itt_marker_ex(d,x,y,z,a,b)    ITTNOTIFY_VOID_D5(marker_ex,d,x,y,z,a,b)\n#define __itt_marker_ex_ptr             ITTNOTIFY_NAME(marker_ex)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_marker_ex(domain,clock_domain,timestamp,id,name,scope)\n#define __itt_marker_ex_ptr    0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_marker_ex_ptr    0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @ingroup clockdomain\n * @brief Add a relation to the current task instance.\n * The current task instance is the head of the relation.\n * @param[in] domain The domain controlling this call\n * @param[in] clock_domain The clock domain controlling the execution of this call.\n * @param[in] timestamp The user defined timestamp.\n * @param[in] relation The kind of relation\n * @param[in] tail The ID for the tail of the relation\n */\nvoid ITTAPI __itt_relation_add_to_current_ex(const __itt_domain *domain,  __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_relation relation, __itt_id tail);\n\n/**\n * @ingroup clockdomain\n * @brief Add a relation between two instance identifiers.\n * @param[in] domain The domain controlling this call\n * @param[in] clock_domain The clock domain controlling the execution of this call.\n * @param[in] timestamp The user defined timestamp.\n * @param[in] head The ID for the head of the relation\n * @param[in] relation The kind of relation\n * @param[in] tail The ID for the tail of the relation\n */\nvoid ITTAPI __itt_relation_add_ex(const __itt_domain *domain,  __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id head, __itt_relation relation, __itt_id tail);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, relation_add_to_current_ex, (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_relation relation, __itt_id tail))\nITT_STUBV(ITTAPI, void, relation_add_ex,            (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id head, __itt_relation relation, __itt_id tail))\n#define __itt_relation_add_to_current_ex(d,x,y,z,a) ITTNOTIFY_VOID_D4(relation_add_to_current_ex,d,x,y,z,a)\n#define __itt_relation_add_to_current_ex_ptr        ITTNOTIFY_NAME(relation_add_to_current_ex)\n#define __itt_relation_add_ex(d,x,y,z,a,b)          ITTNOTIFY_VOID_D5(relation_add_ex,d,x,y,z,a,b)\n#define __itt_relation_add_ex_ptr                   ITTNOTIFY_NAME(relation_add_ex)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_relation_add_to_current_ex(domain,clock_domain,timestame,relation,tail)\n#define __itt_relation_add_to_current_ex_ptr 0\n#define __itt_relation_add_ex(domain,clock_domain,timestamp,head,relation,tail)\n#define __itt_relation_add_ex_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_relation_add_to_current_ex_ptr 0\n#define __itt_relation_add_ex_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/** @cond exclude_from_documentation */\ntypedef enum ___itt_track_group_type\n{\n    __itt_track_group_type_normal = 0\n} __itt_track_group_type;\n/** @endcond */\n\n/** @cond exclude_from_documentation */\n#pragma pack(push, 8)\n\ntypedef struct ___itt_track_group\n{\n    __itt_string_handle* name;     /*!< Name of the track group */\n    struct ___itt_track* track;    /*!< List of child tracks    */\n    __itt_track_group_type tgtype; /*!< Type of the track group */\n    int   extra1;                  /*!< Reserved. Must be zero  */\n    void* extra2;                  /*!< Reserved. Must be zero  */\n    struct ___itt_track_group* next;\n} __itt_track_group;\n\n#pragma pack(pop)\n/** @endcond */\n\n/**\n * @brief Placeholder for custom track types. Currently, \"normal\" custom track\n * is the only available track type.\n */\ntypedef enum ___itt_track_type\n{\n    __itt_track_type_normal = 0\n#ifdef INTEL_ITTNOTIFY_API_PRIVATE\n    , __itt_track_type_queue\n#endif /* INTEL_ITTNOTIFY_API_PRIVATE */\n} __itt_track_type;\n\n/** @cond exclude_from_documentation */\n#pragma pack(push, 8)\n\ntypedef struct ___itt_track\n{\n    __itt_string_handle* name; /*!< Name of the track group */\n    __itt_track_group* group;  /*!< Parent group to a track */\n    __itt_track_type ttype;    /*!< Type of the track       */\n    int   extra1;              /*!< Reserved. Must be zero  */\n    void* extra2;              /*!< Reserved. Must be zero  */\n    struct ___itt_track* next;\n} __itt_track;\n\n#pragma pack(pop)\n/** @endcond */\n\n/**\n * @brief Create logical track group.\n */\n__itt_track_group* ITTAPI __itt_track_group_create(__itt_string_handle* name, __itt_track_group_type track_group_type);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUB(ITTAPI, __itt_track_group*, track_group_create, (__itt_string_handle* name, __itt_track_group_type track_group_type))\n#define __itt_track_group_create     ITTNOTIFY_DATA(track_group_create)\n#define __itt_track_group_create_ptr ITTNOTIFY_NAME(track_group_create)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_track_group_create(name)  (__itt_track_group*)0\n#define __itt_track_group_create_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_track_group_create_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief Create logical track.\n */\n__itt_track* ITTAPI __itt_track_create(__itt_track_group* track_group, __itt_string_handle* name, __itt_track_type track_type);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUB(ITTAPI, __itt_track*, track_create, (__itt_track_group* track_group,__itt_string_handle* name, __itt_track_type track_type))\n#define __itt_track_create     ITTNOTIFY_DATA(track_create)\n#define __itt_track_create_ptr ITTNOTIFY_NAME(track_create)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_track_create(track_group,name,track_type)  (__itt_track*)0\n#define __itt_track_create_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_track_create_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief Set the logical track.\n */\nvoid ITTAPI __itt_set_track(__itt_track* track);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, set_track, (__itt_track *track))\n#define __itt_set_track     ITTNOTIFY_VOID(set_track)\n#define __itt_set_track_ptr ITTNOTIFY_NAME(set_track)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_set_track(track)\n#define __itt_set_track_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_set_track_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/* ========================================================================== */\n/** @cond exclude_from_gpa_documentation */\n/**\n * @defgroup events Events\n * @ingroup public\n * Events group\n * @{\n */\n/** @brief user event type */\ntypedef int __itt_event;\n\n/**\n * @brief Create an event notification\n * @note name or namelen being null/name and namelen not matching, user event feature not enabled\n * @return non-zero event identifier upon success and __itt_err otherwise\n */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n__itt_event LIBITTAPI __itt_event_createA(const char    *name, int namelen);\n__itt_event LIBITTAPI __itt_event_createW(const wchar_t *name, int namelen);\n#if defined(UNICODE) || defined(_UNICODE)\n#  define __itt_event_create     __itt_event_createW\n#  define __itt_event_create_ptr __itt_event_createW_ptr\n#else\n#  define __itt_event_create     __itt_event_createA\n#  define __itt_event_create_ptr __itt_event_createA_ptr\n#endif /* UNICODE */\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n__itt_event LIBITTAPI __itt_event_create(const char *name, int namelen);\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUB(LIBITTAPI, __itt_event, event_createA, (const char    *name, int namelen))\nITT_STUB(LIBITTAPI, __itt_event, event_createW, (const wchar_t *name, int namelen))\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nITT_STUB(LIBITTAPI, __itt_event, event_create,  (const char    *name, int namelen))\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_event_createA     ITTNOTIFY_DATA(event_createA)\n#define __itt_event_createA_ptr ITTNOTIFY_NAME(event_createA)\n#define __itt_event_createW     ITTNOTIFY_DATA(event_createW)\n#define __itt_event_createW_ptr ITTNOTIFY_NAME(event_createW)\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_event_create      ITTNOTIFY_DATA(event_create)\n#define __itt_event_create_ptr  ITTNOTIFY_NAME(event_create)\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_event_createA(name, namelen) (__itt_event)0\n#define __itt_event_createA_ptr 0\n#define __itt_event_createW(name, namelen) (__itt_event)0\n#define __itt_event_createW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_event_create(name, namelen)  (__itt_event)0\n#define __itt_event_create_ptr  0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_event_createA_ptr 0\n#define __itt_event_createW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_event_create_ptr  0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief Record an event occurrence.\n * @return __itt_err upon failure (invalid event id/user event feature not enabled)\n */\nint LIBITTAPI __itt_event_start(__itt_event event);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUB(LIBITTAPI, int, event_start, (__itt_event event))\n#define __itt_event_start     ITTNOTIFY_DATA(event_start)\n#define __itt_event_start_ptr ITTNOTIFY_NAME(event_start)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_event_start(event) (int)0\n#define __itt_event_start_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_event_start_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief Record an event end occurrence.\n * @note It is optional if events do not have durations.\n * @return __itt_err upon failure (invalid event id/user event feature not enabled)\n */\nint LIBITTAPI __itt_event_end(__itt_event event);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUB(LIBITTAPI, int, event_end, (__itt_event event))\n#define __itt_event_end     ITTNOTIFY_DATA(event_end)\n#define __itt_event_end_ptr ITTNOTIFY_NAME(event_end)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_event_end(event) (int)0\n#define __itt_event_end_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_event_end_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n/** @} events group */\n\n\n/**\n * @defgroup arrays Arrays Visualizer\n * @ingroup public\n * Visualize arrays\n * @{\n */\n\n/**\n * @enum __itt_av_data_type\n * @brief Defines types of arrays data (for C/C++ intrinsic types) \n */\ntypedef enum \n{\n    __itt_e_first = 0,\n    __itt_e_char = 0,  /* 1-byte integer */\n    __itt_e_uchar,     /* 1-byte unsigned integer */\n    __itt_e_int16,     /* 2-byte integer */\n    __itt_e_uint16,    /* 2-byte unsigned integer  */\n    __itt_e_int32,     /* 4-byte integer */\n    __itt_e_uint32,    /* 4-byte unsigned integer */\n    __itt_e_int64,     /* 8-byte integer */\n    __itt_e_uint64,    /* 8-byte unsigned integer */\n    __itt_e_float,     /* 4-byte floating */\n    __itt_e_double,    /* 8-byte floating */\n    __itt_e_last = __itt_e_double\n} __itt_av_data_type;\n\n/**\n * @brief Save an array data to a file.\n * Output format is defined by the file extension. The csv and bmp formats are supported (bmp - for 2-dimensional array only).\n * @param[in] data - pointer to the array data\n * @param[in] rank - the rank of the array \n * @param[in] dimensions - pointer to an array of integers, which specifies the array dimensions. \n * The size of dimensions must be equal to the rank\n * @param[in] type - the type of the array, specified as one of the __itt_av_data_type values (for intrinsic types)\n * @param[in] filePath - the file path; the output format is defined by the file extension\n * @param[in] columnOrder - defines how the array is stored in the linear memory.\n * It should be 1 for column-major order (e.g. in FORTRAN) or 0 - for row-major order (e.g. in C).\n */\n\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nint ITTAPI __itt_av_saveA(void *data, int rank, const int *dimensions, int type, const char *filePath, int columnOrder);\nint ITTAPI __itt_av_saveW(void *data, int rank, const int *dimensions, int type, const wchar_t *filePath, int columnOrder);\n#if defined(UNICODE) || defined(_UNICODE)\n#  define __itt_av_save     __itt_av_saveW\n#  define __itt_av_save_ptr __itt_av_saveW_ptr\n#else /* UNICODE */\n#  define __itt_av_save     __itt_av_saveA\n#  define __itt_av_save_ptr __itt_av_saveA_ptr\n#endif /* UNICODE */\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nint ITTAPI __itt_av_save(void *data, int rank, const int *dimensions, int type, const char *filePath, int columnOrder);\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUB(ITTAPI, int, av_saveA, (void *data, int rank, const int *dimensions, int type, const char *filePath, int columnOrder))\nITT_STUB(ITTAPI, int, av_saveW, (void *data, int rank, const int *dimensions, int type, const wchar_t *filePath, int columnOrder))\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nITT_STUB(ITTAPI, int, av_save,  (void *data, int rank, const int *dimensions, int type, const char *filePath, int columnOrder))\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_av_saveA     ITTNOTIFY_DATA(av_saveA)\n#define __itt_av_saveA_ptr ITTNOTIFY_NAME(av_saveA)\n#define __itt_av_saveW     ITTNOTIFY_DATA(av_saveW)\n#define __itt_av_saveW_ptr ITTNOTIFY_NAME(av_saveW)\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_av_save     ITTNOTIFY_DATA(av_save)\n#define __itt_av_save_ptr ITTNOTIFY_NAME(av_save)\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_av_saveA(name)\n#define __itt_av_saveA_ptr 0\n#define __itt_av_saveW(name)\n#define __itt_av_saveW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_av_save(name)\n#define __itt_av_save_ptr 0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_av_saveA_ptr 0\n#define __itt_av_saveW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_av_save_ptr 0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\nvoid ITTAPI __itt_enable_attach(void);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, enable_attach, (void))\n#define __itt_enable_attach     ITTNOTIFY_VOID(enable_attach)\n#define __itt_enable_attach_ptr ITTNOTIFY_NAME(enable_attach)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_enable_attach()\n#define __itt_enable_attach_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_enable_attach_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/** @cond exclude_from_gpa_documentation */\n\n/** @} arrays group */\n\n/** @endcond */\n\n\n#ifdef __cplusplus\n}\n#endif /* __cplusplus */\n\n#endif /* _ITTNOTIFY_H_ */\n\n#ifdef INTEL_ITTNOTIFY_API_PRIVATE\n\n#ifndef _ITTNOTIFY_PRIVATE_\n#define _ITTNOTIFY_PRIVATE_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif /* __cplusplus */\n\n/**\n * @ingroup tasks\n * @brief Begin an overlapped task instance.\n * @param[in] domain The domain for this task.\n * @param[in] taskid The identifier for this task instance, *cannot* be __itt_null.\n * @param[in] parentid The parent of this task, or __itt_null.\n * @param[in] name The name of this task.\n */\nvoid ITTAPI __itt_task_begin_overlapped(const __itt_domain* domain, __itt_id taskid, __itt_id parentid, __itt_string_handle* name);\n\n/**\n * @ingroup clockdomain\n * @brief Begin an overlapped task instance.\n * @param[in] domain The domain for this task\n * @param[in] clock_domain The clock domain controlling the execution of this call.\n * @param[in] timestamp The user defined timestamp.\n * @param[in] taskid The identifier for this task instance, *cannot* be __itt_null.\n * @param[in] parentid The parent of this task, or __itt_null.\n * @param[in] name The name of this task.\n */\nvoid ITTAPI __itt_task_begin_overlapped_ex(const __itt_domain* domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id taskid, __itt_id parentid, __itt_string_handle* name);\n\n/**\n * @ingroup tasks\n * @brief End an overlapped task instance.\n * @param[in] domain The domain for this task\n * @param[in] taskid Explicit ID of finished task\n */\nvoid ITTAPI __itt_task_end_overlapped(const __itt_domain *domain, __itt_id taskid);\n\n/**\n * @ingroup clockdomain\n * @brief End an overlapped task instance.\n * @param[in] domain The domain for this task\n * @param[in] clock_domain The clock domain controlling the execution of this call.\n * @param[in] timestamp The user defined timestamp.\n * @param[in] taskid Explicit ID of finished task\n */\nvoid ITTAPI __itt_task_end_overlapped_ex(const __itt_domain* domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id taskid);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, task_begin_overlapped,          (const __itt_domain *domain, __itt_id taskid, __itt_id parentid, __itt_string_handle *name))\nITT_STUBV(ITTAPI, void, task_begin_overlapped_ex,       (const __itt_domain* domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id taskid, __itt_id parentid, __itt_string_handle* name))\nITT_STUBV(ITTAPI, void, task_end_overlapped,            (const __itt_domain *domain, __itt_id taskid))\nITT_STUBV(ITTAPI, void, task_end_overlapped_ex,         (const __itt_domain* domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id taskid))\n#define __itt_task_begin_overlapped(d,x,y,z)            ITTNOTIFY_VOID_D3(task_begin_overlapped,d,x,y,z)\n#define __itt_task_begin_overlapped_ptr                 ITTNOTIFY_NAME(task_begin_overlapped)\n#define __itt_task_begin_overlapped_ex(d,x,y,z,a,b)     ITTNOTIFY_VOID_D5(task_begin_overlapped_ex,d,x,y,z,a,b)\n#define __itt_task_begin_overlapped_ex_ptr              ITTNOTIFY_NAME(task_begin_overlapped_ex)\n#define __itt_task_end_overlapped(d,x)                  ITTNOTIFY_VOID_D1(task_end_overlapped,d,x)\n#define __itt_task_end_overlapped_ptr                   ITTNOTIFY_NAME(task_end_overlapped)\n#define __itt_task_end_overlapped_ex(d,x,y,z)           ITTNOTIFY_VOID_D3(task_end_overlapped_ex,d,x,y,z)\n#define __itt_task_end_overlapped_ex_ptr                ITTNOTIFY_NAME(task_end_overlapped_ex)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_task_begin_overlapped(domain,taskid,parentid,name)\n#define __itt_task_begin_overlapped_ptr         0\n#define __itt_task_begin_overlapped_ex(domain,clock_domain,timestamp,taskid,parentid,name)\n#define __itt_task_begin_overlapped_ex_ptr      0\n#define __itt_task_end_overlapped(domain,taskid)\n#define __itt_task_end_overlapped_ptr           0\n#define __itt_task_end_overlapped_ex(domain,clock_domain,timestamp,taskid)\n#define __itt_task_end_overlapped_ex_ptr        0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_task_begin_overlapped_ptr         0\n#define __itt_task_begin_overlapped_ex_ptr      0\n#define __itt_task_end_overlapped_ptr           0\n#define __itt_task_end_overlapped_ex_ptr        0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @defgroup makrs_internal Marks\n * @ingroup internal\n * Marks group\n * @warning Internal API:\n *   - It is not shipped to outside of Intel\n *   - It is delivered to internal Intel teams using e-mail or SVN access only\n * @{\n */\n/** @brief user mark type */\ntypedef int __itt_mark_type;\n\n/**\n * @brief Creates a user mark type with the specified name using char or Unicode string.\n * @param[in] name - name of mark to create\n * @return Returns a handle to the mark type\n */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n__itt_mark_type ITTAPI __itt_mark_createA(const char    *name);\n__itt_mark_type ITTAPI __itt_mark_createW(const wchar_t *name);\n#if defined(UNICODE) || defined(_UNICODE)\n#  define __itt_mark_create     __itt_mark_createW\n#  define __itt_mark_create_ptr __itt_mark_createW_ptr\n#else /* UNICODE */\n#  define __itt_mark_create     __itt_mark_createA\n#  define __itt_mark_create_ptr __itt_mark_createA_ptr\n#endif /* UNICODE */\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n__itt_mark_type ITTAPI __itt_mark_create(const char *name);\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUB(ITTAPI, __itt_mark_type, mark_createA, (const char    *name))\nITT_STUB(ITTAPI, __itt_mark_type, mark_createW, (const wchar_t *name))\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nITT_STUB(ITTAPI, __itt_mark_type, mark_create,  (const char *name))\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_mark_createA     ITTNOTIFY_DATA(mark_createA)\n#define __itt_mark_createA_ptr ITTNOTIFY_NAME(mark_createA)\n#define __itt_mark_createW     ITTNOTIFY_DATA(mark_createW)\n#define __itt_mark_createW_ptr ITTNOTIFY_NAME(mark_createW)\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_mark_create      ITTNOTIFY_DATA(mark_create)\n#define __itt_mark_create_ptr  ITTNOTIFY_NAME(mark_create)\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_mark_createA(name) (__itt_mark_type)0\n#define __itt_mark_createA_ptr 0\n#define __itt_mark_createW(name) (__itt_mark_type)0\n#define __itt_mark_createW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_mark_create(name)  (__itt_mark_type)0\n#define __itt_mark_create_ptr  0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_mark_createA_ptr 0\n#define __itt_mark_createW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_mark_create_ptr  0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief Creates a \"discrete\" user mark type of the specified type and an optional parameter using char or Unicode string.\n *\n * - The mark of \"discrete\" type is placed to collection results in case of success. It appears in overtime view(s) as a special tick sign.\n * - The call is \"synchronous\" - function returns after mark is actually added to results.\n * - This function is useful, for example, to mark different phases of application\n *   (beginning of the next mark automatically meand end of current region).\n * - Can be used together with \"continuous\" marks (see below) at the same collection session\n * @param[in] mt - mark, created by __itt_mark_create(const char* name) function\n * @param[in] parameter - string parameter of mark\n * @return Returns zero value in case of success, non-zero value otherwise.\n */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nint ITTAPI __itt_markA(__itt_mark_type mt, const char    *parameter);\nint ITTAPI __itt_markW(__itt_mark_type mt, const wchar_t *parameter);\n#if defined(UNICODE) || defined(_UNICODE)\n#  define __itt_mark     __itt_markW\n#  define __itt_mark_ptr __itt_markW_ptr\n#else /* UNICODE  */\n#  define __itt_mark     __itt_markA\n#  define __itt_mark_ptr __itt_markA_ptr\n#endif /* UNICODE */\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nint ITTAPI __itt_mark(__itt_mark_type mt, const char *parameter);\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUB(ITTAPI, int, markA, (__itt_mark_type mt, const char    *parameter))\nITT_STUB(ITTAPI, int, markW, (__itt_mark_type mt, const wchar_t *parameter))\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nITT_STUB(ITTAPI, int, mark,  (__itt_mark_type mt, const char *parameter))\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_markA     ITTNOTIFY_DATA(markA)\n#define __itt_markA_ptr ITTNOTIFY_NAME(markA)\n#define __itt_markW     ITTNOTIFY_DATA(markW)\n#define __itt_markW_ptr ITTNOTIFY_NAME(markW)\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_mark      ITTNOTIFY_DATA(mark)\n#define __itt_mark_ptr  ITTNOTIFY_NAME(mark)\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_markA(mt, parameter) (int)0\n#define __itt_markA_ptr 0\n#define __itt_markW(mt, parameter) (int)0\n#define __itt_markW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_mark(mt, parameter)  (int)0\n#define __itt_mark_ptr  0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_markA_ptr 0\n#define __itt_markW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_mark_ptr  0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief Use this if necessary to create a \"discrete\" user event type (mark) for process\n * rather then for one thread\n * @see int __itt_mark(__itt_mark_type mt, const char* parameter);\n */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nint ITTAPI __itt_mark_globalA(__itt_mark_type mt, const char    *parameter);\nint ITTAPI __itt_mark_globalW(__itt_mark_type mt, const wchar_t *parameter);\n#if defined(UNICODE) || defined(_UNICODE)\n#  define __itt_mark_global     __itt_mark_globalW\n#  define __itt_mark_global_ptr __itt_mark_globalW_ptr\n#else /* UNICODE  */\n#  define __itt_mark_global     __itt_mark_globalA\n#  define __itt_mark_global_ptr __itt_mark_globalA_ptr\n#endif /* UNICODE */\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nint ITTAPI __itt_mark_global(__itt_mark_type mt, const char *parameter);\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUB(ITTAPI, int, mark_globalA, (__itt_mark_type mt, const char    *parameter))\nITT_STUB(ITTAPI, int, mark_globalW, (__itt_mark_type mt, const wchar_t *parameter))\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nITT_STUB(ITTAPI, int, mark_global,  (__itt_mark_type mt, const char *parameter))\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_mark_globalA     ITTNOTIFY_DATA(mark_globalA)\n#define __itt_mark_globalA_ptr ITTNOTIFY_NAME(mark_globalA)\n#define __itt_mark_globalW     ITTNOTIFY_DATA(mark_globalW)\n#define __itt_mark_globalW_ptr ITTNOTIFY_NAME(mark_globalW)\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_mark_global      ITTNOTIFY_DATA(mark_global)\n#define __itt_mark_global_ptr  ITTNOTIFY_NAME(mark_global)\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_mark_globalA(mt, parameter) (int)0\n#define __itt_mark_globalA_ptr 0\n#define __itt_mark_globalW(mt, parameter) (int)0\n#define __itt_mark_globalW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_mark_global(mt, parameter)  (int)0\n#define __itt_mark_global_ptr  0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_mark_globalA_ptr 0\n#define __itt_mark_globalW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_mark_global_ptr  0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief Creates an \"end\" point for \"continuous\" mark with specified name.\n *\n * - Returns zero value in case of success, non-zero value otherwise.\n *   Also returns non-zero value when preceding \"begin\" point for the\n *   mark with the same name failed to be created or not created.\n * - The mark of \"continuous\" type is placed to collection results in\n *   case of success. It appears in overtime view(s) as a special tick\n *   sign (different from \"discrete\" mark) together with line from\n *   corresponding \"begin\" mark to \"end\" mark.\n * @note Continuous marks can overlap and be nested inside each other.\n * Discrete mark can be nested inside marked region\n * @param[in] mt - mark, created by __itt_mark_create(const char* name) function\n * @return Returns zero value in case of success, non-zero value otherwise.\n */\nint ITTAPI __itt_mark_off(__itt_mark_type mt);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUB(ITTAPI, int, mark_off, (__itt_mark_type mt))\n#define __itt_mark_off     ITTNOTIFY_DATA(mark_off)\n#define __itt_mark_off_ptr ITTNOTIFY_NAME(mark_off)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_mark_off(mt) (int)0\n#define __itt_mark_off_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_mark_off_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief Use this if necessary to create an \"end\" point for mark of process\n * @see int __itt_mark_off(__itt_mark_type mt);\n */\nint ITTAPI __itt_mark_global_off(__itt_mark_type mt);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUB(ITTAPI, int, mark_global_off, (__itt_mark_type mt))\n#define __itt_mark_global_off     ITTNOTIFY_DATA(mark_global_off)\n#define __itt_mark_global_off_ptr ITTNOTIFY_NAME(mark_global_off)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_mark_global_off(mt) (int)0\n#define __itt_mark_global_off_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_mark_global_off_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n/** @} marks group */\n\n/**\n * @defgroup counters_internal Counters\n * @ingroup internal\n * Counters group\n * @{\n */\n/**\n * @brief opaque structure for counter identification\n */\ntypedef struct ___itt_counter *__itt_counter;\n\n/**\n * @brief Create a counter with given name/domain for the calling thread\n *\n * After __itt_counter_create() is called, __itt_counter_inc() / __itt_counter_inc_delta() can be used\n * to increment the counter on any thread\n */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n__itt_counter ITTAPI __itt_counter_createA(const char    *name, const char    *domain);\n__itt_counter ITTAPI __itt_counter_createW(const wchar_t *name, const wchar_t *domain);\n#if defined(UNICODE) || defined(_UNICODE)\n#  define __itt_counter_create     __itt_counter_createW\n#  define __itt_counter_create_ptr __itt_counter_createW_ptr\n#else /* UNICODE */\n#  define __itt_counter_create     __itt_counter_createA\n#  define __itt_counter_create_ptr __itt_counter_createA_ptr\n#endif /* UNICODE */\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n__itt_counter ITTAPI __itt_counter_create(const char *name, const char *domain);\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUB(ITTAPI, __itt_counter, counter_createA, (const char    *name, const char    *domain))\nITT_STUB(ITTAPI, __itt_counter, counter_createW, (const wchar_t *name, const wchar_t *domain))\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nITT_STUB(ITTAPI, __itt_counter, counter_create,  (const char *name, const char *domain))\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_counter_createA     ITTNOTIFY_DATA(counter_createA)\n#define __itt_counter_createA_ptr ITTNOTIFY_NAME(counter_createA)\n#define __itt_counter_createW     ITTNOTIFY_DATA(counter_createW)\n#define __itt_counter_createW_ptr ITTNOTIFY_NAME(counter_createW)\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_counter_create     ITTNOTIFY_DATA(counter_create)\n#define __itt_counter_create_ptr ITTNOTIFY_NAME(counter_create)\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_counter_createA(name, domain)\n#define __itt_counter_createA_ptr 0\n#define __itt_counter_createW(name, domain)\n#define __itt_counter_createW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_counter_create(name, domain)\n#define __itt_counter_create_ptr  0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_counter_createA_ptr 0\n#define __itt_counter_createW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_counter_create_ptr  0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief Destroy the counter identified by the pointer previously returned by __itt_counter_create()\n */\nvoid ITTAPI __itt_counter_destroy(__itt_counter id);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, counter_destroy, (__itt_counter id))\n#define __itt_counter_destroy     ITTNOTIFY_VOID(counter_destroy)\n#define __itt_counter_destroy_ptr ITTNOTIFY_NAME(counter_destroy)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_counter_destroy(id)\n#define __itt_counter_destroy_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_counter_destroy_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief Increment the counter value\n */\nvoid ITTAPI __itt_counter_inc(__itt_counter id);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, counter_inc, (__itt_counter id))\n#define __itt_counter_inc     ITTNOTIFY_VOID(counter_inc)\n#define __itt_counter_inc_ptr ITTNOTIFY_NAME(counter_inc)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_counter_inc(id)\n#define __itt_counter_inc_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_counter_inc_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief Increment the counter value with x\n */\nvoid ITTAPI __itt_counter_inc_delta(__itt_counter id, unsigned long long value);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, counter_inc_delta, (__itt_counter id, unsigned long long value))\n#define __itt_counter_inc_delta     ITTNOTIFY_VOID(counter_inc_delta)\n#define __itt_counter_inc_delta_ptr ITTNOTIFY_NAME(counter_inc_delta)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_counter_inc_delta(id, value)\n#define __itt_counter_inc_delta_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_counter_inc_delta_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n/** @} counters group */\n\n/**\n * @defgroup stitch Stack Stitching\n * @ingroup internal\n * Stack Stitching group\n * @{\n */\n/**\n * @brief opaque structure for counter identification\n */\ntypedef struct ___itt_caller *__itt_caller;\n\n/**\n * @brief Create the stitch point e.g. a point in call stack where other stacks should be stitched to.\n * The function returns a unique identifier which is used to match the cut points with corresponding stitch points.\n */\n__itt_caller ITTAPI __itt_stack_caller_create(void);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUB(ITTAPI, __itt_caller, stack_caller_create, (void))\n#define __itt_stack_caller_create     ITTNOTIFY_DATA(stack_caller_create)\n#define __itt_stack_caller_create_ptr ITTNOTIFY_NAME(stack_caller_create)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_stack_caller_create() (__itt_caller)0\n#define __itt_stack_caller_create_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_stack_caller_create_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief Destroy the inforamtion about stitch point identified by the pointer previously returned by __itt_stack_caller_create()\n */\nvoid ITTAPI __itt_stack_caller_destroy(__itt_caller id);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, stack_caller_destroy, (__itt_caller id))\n#define __itt_stack_caller_destroy     ITTNOTIFY_VOID(stack_caller_destroy)\n#define __itt_stack_caller_destroy_ptr ITTNOTIFY_NAME(stack_caller_destroy)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_stack_caller_destroy(id)\n#define __itt_stack_caller_destroy_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_stack_caller_destroy_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief Sets the cut point. Stack from each event which occurs after this call will be cut\n * at the same stack level the function was called and stitched to the corresponding stitch point.\n */\nvoid ITTAPI __itt_stack_callee_enter(__itt_caller id);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, stack_callee_enter, (__itt_caller id))\n#define __itt_stack_callee_enter     ITTNOTIFY_VOID(stack_callee_enter)\n#define __itt_stack_callee_enter_ptr ITTNOTIFY_NAME(stack_callee_enter)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_stack_callee_enter(id)\n#define __itt_stack_callee_enter_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_stack_callee_enter_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief This function eliminates the cut point which was set by latest __itt_stack_callee_enter().\n */\nvoid ITTAPI __itt_stack_callee_leave(__itt_caller id);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, stack_callee_leave, (__itt_caller id))\n#define __itt_stack_callee_leave     ITTNOTIFY_VOID(stack_callee_leave)\n#define __itt_stack_callee_leave_ptr ITTNOTIFY_NAME(stack_callee_leave)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_stack_callee_leave(id)\n#define __itt_stack_callee_leave_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_stack_callee_leave_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/** @} stitch group */\n\n/* ***************************************************************************************************************************** */\n\n#include <stdarg.h>\n\n/** @cond exclude_from_documentation */\ntypedef enum __itt_error_code\n{\n    __itt_error_success       = 0, /*!< no error */\n    __itt_error_no_module     = 1, /*!< module can't be loaded */\n    /* %1$s -- library name; win: %2$d -- system error code; unx: %2$s -- system error message. */\n    __itt_error_no_symbol     = 2, /*!< symbol not found */\n    /* %1$s -- library name, %2$s -- symbol name. */\n    __itt_error_unknown_group = 3, /*!< unknown group specified */\n    /* %1$s -- env var name, %2$s -- group name. */\n    __itt_error_cant_read_env = 4, /*!< GetEnvironmentVariable() failed */\n    /* %1$s -- env var name, %2$d -- system error. */\n    __itt_error_env_too_long  = 5, /*!< variable value too long */\n    /* %1$s -- env var name, %2$d -- actual length of the var, %3$d -- max allowed length. */\n    __itt_error_system        = 6  /*!< pthread_mutexattr_init or pthread_mutex_init failed */\n    /* %1$s -- function name, %2$d -- errno. */\n} __itt_error_code;\n\ntypedef void (__itt_error_handler_t)(__itt_error_code code, va_list);\n__itt_error_handler_t* __itt_set_error_handler(__itt_error_handler_t*);\n\nconst char* ITTAPI __itt_api_version(void);\n/** @endcond */\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\n#define __itt_error_handler ITT_JOIN(INTEL_ITTNOTIFY_PREFIX, error_handler)\nvoid __itt_error_handler(__itt_error_code code, va_list args);\nextern const int ITTNOTIFY_NAME(err);\n#define __itt_err ITTNOTIFY_NAME(err)\nITT_STUB(ITTAPI, const char*, api_version, (void))\n#define __itt_api_version     ITTNOTIFY_DATA(api_version)\n#define __itt_api_version_ptr ITTNOTIFY_NAME(api_version)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_api_version()   (const char*)0\n#define __itt_api_version_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_api_version_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n#ifdef __cplusplus\n}\n#endif /* __cplusplus */\n\n#endif /* _ITTNOTIFY_PRIVATE_ */\n\n#endif /* INTEL_ITTNOTIFY_API_PRIVATE */\n"
  },
  {
    "path": "benchmarks/tbb/tools_api/ittnotify_config.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef _ITTNOTIFY_CONFIG_H_\n#define _ITTNOTIFY_CONFIG_H_\n\n/** @cond exclude_from_documentation */\n#ifndef ITT_OS_WIN\n#  define ITT_OS_WIN   1\n#endif /* ITT_OS_WIN */\n\n#ifndef ITT_OS_LINUX\n#  define ITT_OS_LINUX 2\n#endif /* ITT_OS_LINUX */\n\n#ifndef ITT_OS_MAC\n#  define ITT_OS_MAC   3\n#endif /* ITT_OS_MAC */\n\n#ifndef ITT_OS\n#  if defined WIN32 || defined _WIN32\n#    define ITT_OS ITT_OS_WIN\n#  elif defined( __APPLE__ ) && defined( __MACH__ )\n#    define ITT_OS ITT_OS_MAC\n#  else\n#    define ITT_OS ITT_OS_LINUX\n#  endif\n#endif /* ITT_OS */\n\n#ifndef ITT_PLATFORM_WIN\n#  define ITT_PLATFORM_WIN 1\n#endif /* ITT_PLATFORM_WIN */\n\n#ifndef ITT_PLATFORM_POSIX\n#  define ITT_PLATFORM_POSIX 2\n#endif /* ITT_PLATFORM_POSIX */\n\n#ifndef ITT_PLATFORM_MAC\n#  define ITT_PLATFORM_MAC 3\n#endif /* ITT_PLATFORM_MAC */\n\n#ifndef ITT_PLATFORM\n#  if ITT_OS==ITT_OS_WIN\n#    define ITT_PLATFORM ITT_PLATFORM_WIN\n#  elif ITT_OS==ITT_OS_MAC\n#    define ITT_PLATFORM ITT_PLATFORM_MAC\n#  else\n#    define ITT_PLATFORM ITT_PLATFORM_POSIX\n#  endif\n#endif /* ITT_PLATFORM */\n\n#if defined(_UNICODE) && !defined(UNICODE)\n#define UNICODE\n#endif\n\n#include <stddef.h>\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#include <tchar.h>\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#include <stdint.h>\n#if defined(UNICODE) || defined(_UNICODE)\n#include <wchar.h>\n#endif /* UNICODE || _UNICODE */\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\n#ifndef CDECL\n#  if ITT_PLATFORM==ITT_PLATFORM_WIN\n#    define CDECL __cdecl\n#  else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#    if defined _M_IX86 || defined __i386__ \n#      define CDECL __attribute__ ((cdecl))\n#    else  /* _M_IX86 || __i386__ */\n#      define CDECL /* actual only on x86 platform */\n#    endif /* _M_IX86 || __i386__ */\n#  endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* CDECL */\n\n#ifndef STDCALL\n#  if ITT_PLATFORM==ITT_PLATFORM_WIN\n#    define STDCALL __stdcall\n#  else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#    if defined _M_IX86 || defined __i386__\n#      define STDCALL __attribute__ ((stdcall)) \n#    else  /* _M_IX86 || __i386__ */\n#      define STDCALL /* supported only on x86 platform */\n#    endif /* _M_IX86 || __i386__ */\n#  endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* STDCALL */\n\n#define ITTAPI    CDECL\n#define LIBITTAPI CDECL\n\n/* TODO: Temporary for compatibility! */\n#define ITTAPI_CALL    CDECL\n#define LIBITTAPI_CALL CDECL\n\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n/* use __forceinline (VC++ specific) */\n#define ITT_INLINE           __forceinline\n#define ITT_INLINE_ATTRIBUTE /* nothing */\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n/*\n * Generally, functions are not inlined unless optimization is specified.\n * For functions declared inline, this attribute inlines the function even\n * if no optimization level was specified.\n */\n#ifdef __STRICT_ANSI__\n#define ITT_INLINE           static inline\n#else  /* __STRICT_ANSI__ */\n#define ITT_INLINE           static inline\n#endif /* __STRICT_ANSI__ */\n#define ITT_INLINE_ATTRIBUTE __attribute__ ((always_inline, unused))\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n/** @endcond */\n\n#ifndef ITT_ARCH_IA32\n#  define ITT_ARCH_IA32  1\n#endif /* ITT_ARCH_IA32 */\n\n#ifndef ITT_ARCH_IA32E\n#  define ITT_ARCH_IA32E 2\n#endif /* ITT_ARCH_IA32E */\n\n#ifndef ITT_ARCH_ARM\n#  define ITT_ARCH_ARM  4\n#endif /* ITT_ARCH_ARM */\n\n#ifndef ITT_ARCH\n#  if defined _M_IX86 || defined __i386__\n#    define ITT_ARCH ITT_ARCH_IA32\n#  elif defined _M_X64 || defined _M_AMD64 || defined __x86_64__\n#    define ITT_ARCH ITT_ARCH_IA32E\n#  elif defined _M_IA64 || defined __ia64__\n#    define ITT_ARCH ITT_ARCH_IA64\n#  elif defined _M_ARM || __arm__\n#    define ITT_ARCH ITT_ARCH_ARM\n#  endif\n#endif\n\n#ifdef __cplusplus\n#  define ITT_EXTERN_C extern \"C\"\n#else\n#  define ITT_EXTERN_C /* nothing */\n#endif /* __cplusplus */\n\n#define ITT_TO_STR_AUX(x) #x\n#define ITT_TO_STR(x)     ITT_TO_STR_AUX(x)\n\n#define __ITT_BUILD_ASSERT(expr, suffix) do { \\\n    static char __itt_build_check_##suffix[(expr) ? 1 : -1]; \\\n    __itt_build_check_##suffix[0] = 0; \\\n} while(0)\n#define _ITT_BUILD_ASSERT(expr, suffix)  __ITT_BUILD_ASSERT((expr), suffix)\n#define ITT_BUILD_ASSERT(expr)           _ITT_BUILD_ASSERT((expr), __LINE__)\n\n#define ITT_MAGIC { 0xED, 0xAB, 0xAB, 0xEC, 0x0D, 0xEE, 0xDA, 0x30 }\n\n/* Replace with snapshot date YYYYMMDD for promotion build. */\n#define API_VERSION_BUILD    20111111\n\n#ifndef API_VERSION_NUM\n#define API_VERSION_NUM 0.0.0\n#endif /* API_VERSION_NUM */\n\n#define API_VERSION \"ITT-API-Version \" ITT_TO_STR(API_VERSION_NUM) \\\n                                \" (\" ITT_TO_STR(API_VERSION_BUILD) \")\"\n\n/* OS communication functions */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#include <windows.h>\ntypedef HMODULE           lib_t;\ntypedef DWORD             TIDT;\ntypedef CRITICAL_SECTION  mutex_t;\n#define MUTEX_INITIALIZER { 0 }\n#define strong_alias(name, aliasname) /* empty for Windows */\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#include <dlfcn.h>\n#if defined(UNICODE) || defined(_UNICODE)\n#include <wchar.h>\n#endif /* UNICODE */\n#ifndef _GNU_SOURCE\n#define _GNU_SOURCE 1 /* need for PTHREAD_MUTEX_RECURSIVE */\n#endif /* _GNU_SOURCE */\n#ifndef __USE_UNIX98\n#define __USE_UNIX98 1 /* need for PTHREAD_MUTEX_RECURSIVE, on SLES11.1 with gcc 4.3.4 wherein pthread.h missing dependency on __USE_XOPEN2K8 */\n#endif /*__USE_UNIX98*/\n#include <pthread.h>\ntypedef void*             lib_t;\ntypedef pthread_t         TIDT;\ntypedef pthread_mutex_t   mutex_t;\n#define MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER\n#define _strong_alias(name, aliasname) \\\n            extern __typeof (name) aliasname __attribute__ ((alias (#name)));\n#define strong_alias(name, aliasname) _strong_alias(name, aliasname)\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_get_proc(lib, name) GetProcAddress(lib, name)\n#define __itt_mutex_init(mutex)   InitializeCriticalSection(mutex)\n#define __itt_mutex_lock(mutex)   EnterCriticalSection(mutex)\n#define __itt_mutex_unlock(mutex) LeaveCriticalSection(mutex)\n#define __itt_load_lib(name)      LoadLibraryA(name)\n#define __itt_unload_lib(handle)  FreeLibrary(handle)\n#define __itt_system_error()      (int)GetLastError()\n#define __itt_fstrcmp(s1, s2)     lstrcmpA(s1, s2)\n#define __itt_fstrlen(s)          lstrlenA(s)\n#define __itt_fstrcpyn(s1, s2, l) lstrcpynA(s1, s2, l)\n#define __itt_fstrdup(s)          _strdup(s)\n#define __itt_thread_id()         GetCurrentThreadId()\n#define __itt_thread_yield()      SwitchToThread()\n#ifndef ITT_SIMPLE_INIT\nITT_INLINE long\n__itt_interlocked_increment(volatile long* ptr) ITT_INLINE_ATTRIBUTE;\nITT_INLINE long __itt_interlocked_increment(volatile long* ptr)\n{\n    return InterlockedIncrement(ptr);\n}\n#endif /* ITT_SIMPLE_INIT */\n#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */\n#define __itt_get_proc(lib, name) dlsym(lib, name)\n#define __itt_mutex_init(mutex)   {\\\n    pthread_mutexattr_t mutex_attr;                                         \\\n    int error_code = pthread_mutexattr_init(&mutex_attr);                   \\\n    if (error_code)                                                         \\\n        __itt_report_error(__itt_error_system, \"pthread_mutexattr_init\",    \\\n                           error_code);                                     \\\n    error_code = pthread_mutexattr_settype(&mutex_attr,                     \\\n                                           PTHREAD_MUTEX_RECURSIVE);        \\\n    if (error_code)                                                         \\\n        __itt_report_error(__itt_error_system, \"pthread_mutexattr_settype\", \\\n                           error_code);                                     \\\n    error_code = pthread_mutex_init(mutex, &mutex_attr);                    \\\n    if (error_code)                                                         \\\n        __itt_report_error(__itt_error_system, \"pthread_mutex_init\",        \\\n                           error_code);                                     \\\n    error_code = pthread_mutexattr_destroy(&mutex_attr);                    \\\n    if (error_code)                                                         \\\n        __itt_report_error(__itt_error_system, \"pthread_mutexattr_destroy\", \\\n                           error_code);                                     \\\n}\n#define __itt_mutex_lock(mutex)   pthread_mutex_lock(mutex)\n#define __itt_mutex_unlock(mutex) pthread_mutex_unlock(mutex)\n#define __itt_load_lib(name)      dlopen(name, RTLD_LAZY)\n#define __itt_unload_lib(handle)  dlclose(handle)\n#define __itt_system_error()      errno\n#define __itt_fstrcmp(s1, s2)     strcmp(s1, s2)\n#define __itt_fstrlen(s)          strlen(s)\n#define __itt_fstrcpyn(s1, s2, l) strncpy(s1, s2, l)\n#define __itt_fstrdup(s)          strdup(s)\n#define __itt_thread_id()         pthread_self()\n#define __itt_thread_yield()      sched_yield()\n#if ITT_ARCH==ITT_ARCH_IA64\n#ifdef __INTEL_COMPILER\n#define __TBB_machine_fetchadd4(addr, val) __fetchadd4_acq((void *)addr, val)\n#else  /* __INTEL_COMPILER */\n/* TODO: Add Support for not Intel compilers for IA-64 architecture */\n#endif /* __INTEL_COMPILER */\n#elif ITT_ARCH==ITT_ARCH_IA32 || ITT_ARCH==ITT_ARCH_IA32E /* ITT_ARCH!=ITT_ARCH_IA64 */\nITT_INLINE long\n__TBB_machine_fetchadd4(volatile void* ptr, long addend) ITT_INLINE_ATTRIBUTE;\nITT_INLINE long __TBB_machine_fetchadd4(volatile void* ptr, long addend)\n{\n    long result;\n    __asm__ __volatile__(\"lock\\nxadd %0,%1\"\n                          : \"=r\"(result),\"=m\"(*(int*)ptr)\n                          : \"0\"(addend), \"m\"(*(int*)ptr)\n                          : \"memory\");\n    return result;\n}\n#elif ITT_ARCH==ITT_ARCH_ARM\n#define __TBB_machine_fetchadd4(addr, val) __sync_fetch_and_add(addr, val)\n#endif /* ITT_ARCH==ITT_ARCH_IA64 */\n#ifndef ITT_SIMPLE_INIT\nITT_INLINE long\n__itt_interlocked_increment(volatile long* ptr) ITT_INLINE_ATTRIBUTE;\nITT_INLINE long __itt_interlocked_increment(volatile long* ptr)\n{\n    return __TBB_machine_fetchadd4(ptr, 1) + 1L;\n}\n#endif /* ITT_SIMPLE_INIT */\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\ntypedef enum {\n    __itt_collection_normal = 0,\n    __itt_collection_paused = 1\n} __itt_collection_state;\n\ntypedef enum {\n    __itt_thread_normal  = 0,\n    __itt_thread_ignored = 1\n} __itt_thread_state;\n\n#pragma pack(push, 8)\n\ntypedef struct ___itt_thread_info\n{\n    const char* nameA; /*!< Copy of original name in ASCII. */\n#if defined(UNICODE) || defined(_UNICODE)\n    const wchar_t* nameW; /*!< Copy of original name in UNICODE. */\n#else  /* UNICODE || _UNICODE */\n    void* nameW;\n#endif /* UNICODE || _UNICODE */\n    TIDT               tid;\n    __itt_thread_state state;   /*!< Thread state (paused or normal) */\n    int                extra1;  /*!< Reserved to the runtime */\n    void*              extra2;  /*!< Reserved to the runtime */\n    struct ___itt_thread_info* next;\n} __itt_thread_info;\n\n#include \"ittnotify_types.h\" /* For __itt_group_id definition */\n\ntypedef struct ___itt_api_info_20101001\n{\n    const char*    name;\n    void**         func_ptr;\n    void*          init_func;\n    __itt_group_id group;\n}  __itt_api_info_20101001;\n\ntypedef struct ___itt_api_info\n{\n    const char*    name;\n    void**         func_ptr;\n    void*          init_func;\n    void*          null_func;\n    __itt_group_id group;\n}  __itt_api_info;\n\nstruct ___itt_domain;\nstruct ___itt_string_handle;\n\ntypedef struct ___itt_global\n{\n    unsigned char          magic[8];\n    unsigned long          version_major;\n    unsigned long          version_minor;\n    unsigned long          version_build;\n    volatile long          api_initialized;\n    volatile long          mutex_initialized;\n    volatile long          atomic_counter;\n    mutex_t                mutex;\n    lib_t                  lib;\n    void*                  error_handler;\n    const char**           dll_path_ptr;\n    __itt_api_info*        api_list_ptr;\n    struct ___itt_global*  next;\n    /* Joinable structures below */\n    __itt_thread_info*     thread_list;\n    struct ___itt_domain*  domain_list;\n    struct ___itt_string_handle* string_list;\n    __itt_collection_state state;\n} __itt_global;\n\n#pragma pack(pop)\n\n#define NEW_THREAD_INFO_W(gptr,h,h_tail,t,s,n) { \\\n    h = (__itt_thread_info*)malloc(sizeof(__itt_thread_info)); \\\n    if (h != NULL) { \\\n        h->tid    = t; \\\n        h->nameA  = NULL; \\\n        h->nameW  = n ? _wcsdup(n) : NULL; \\\n        h->state  = s; \\\n        h->extra1 = 0;    /* reserved */ \\\n        h->extra2 = NULL; /* reserved */ \\\n        h->next   = NULL; \\\n        if (h_tail == NULL) \\\n            (gptr)->thread_list = h; \\\n        else \\\n            h_tail->next = h; \\\n    } \\\n}\n\n#define NEW_THREAD_INFO_A(gptr,h,h_tail,t,s,n) { \\\n    h = (__itt_thread_info*)malloc(sizeof(__itt_thread_info)); \\\n    if (h != NULL) { \\\n        h->tid    = t; \\\n        h->nameA  = n ? __itt_fstrdup(n) : NULL; \\\n        h->nameW  = NULL; \\\n        h->state  = s; \\\n        h->extra1 = 0;    /* reserved */ \\\n        h->extra2 = NULL; /* reserved */ \\\n        h->next   = NULL; \\\n        if (h_tail == NULL) \\\n            (gptr)->thread_list = h; \\\n        else \\\n            h_tail->next = h; \\\n    } \\\n}\n\n#define NEW_DOMAIN_W(gptr,h,h_tail,name) { \\\n    h = (__itt_domain*)malloc(sizeof(__itt_domain)); \\\n    if (h != NULL) { \\\n        h->flags  = 0;    /* domain is disabled by default */ \\\n        h->nameA  = NULL; \\\n        h->nameW  = name ? _wcsdup(name) : NULL; \\\n        h->extra1 = 0;    /* reserved */ \\\n        h->extra2 = NULL; /* reserved */ \\\n        h->next   = NULL; \\\n        if (h_tail == NULL) \\\n            (gptr)->domain_list = h; \\\n        else \\\n            h_tail->next = h; \\\n    } \\\n}\n\n#define NEW_DOMAIN_A(gptr,h,h_tail,name) { \\\n    h = (__itt_domain*)malloc(sizeof(__itt_domain)); \\\n    if (h != NULL) { \\\n        h->flags  = 0;    /* domain is disabled by default */ \\\n        h->nameA  = name ? __itt_fstrdup(name) : NULL; \\\n        h->nameW  = NULL; \\\n        h->extra1 = 0;    /* reserved */ \\\n        h->extra2 = NULL; /* reserved */ \\\n        h->next   = NULL; \\\n        if (h_tail == NULL) \\\n            (gptr)->domain_list = h; \\\n        else \\\n            h_tail->next = h; \\\n    } \\\n}\n\n#define NEW_STRING_HANDLE_W(gptr,h,h_tail,name) { \\\n    h = (__itt_string_handle*)malloc(sizeof(__itt_string_handle)); \\\n    if (h != NULL) { \\\n        h->strA   = NULL; \\\n        h->strW   = name ? _wcsdup(name) : NULL; \\\n        h->extra1 = 0;    /* reserved */ \\\n        h->extra2 = NULL; /* reserved */ \\\n        h->next   = NULL; \\\n        if (h_tail == NULL) \\\n            (gptr)->string_list = h; \\\n        else \\\n            h_tail->next = h; \\\n    } \\\n}\n\n#define NEW_STRING_HANDLE_A(gptr,h,h_tail,name) { \\\n    h = (__itt_string_handle*)malloc(sizeof(__itt_string_handle)); \\\n    if (h != NULL) { \\\n        h->strA   = name ? __itt_fstrdup(name) : NULL; \\\n        h->strW   = NULL; \\\n        h->extra1 = 0;    /* reserved */ \\\n        h->extra2 = NULL; /* reserved */ \\\n        h->next   = NULL; \\\n        if (h_tail == NULL) \\\n            (gptr)->string_list = h; \\\n        else \\\n            h_tail->next = h; \\\n    } \\\n}\n\n#endif /* _ITTNOTIFY_CONFIG_H_ */\n"
  },
  {
    "path": "benchmarks/tbb/tools_api/ittnotify_static.c",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#include \"ittnotify_config.h\"\n\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define PATH_MAX 512\n#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */\n#include <limits.h>\n#include <dlfcn.h>\n#include <errno.h>\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#include <stdio.h>\n#include <stdlib.h>\n#include <stdarg.h>\n#include <string.h>\n\n#define INTEL_NO_MACRO_BODY \n#define INTEL_ITTNOTIFY_API_PRIVATE\n#include \"ittnotify.h\"\n#include \"legacy/ittnotify.h\"\n\n#include \"disable_warnings.h\"\n\nstatic const char api_version[] = API_VERSION \"\\0\\n@(#) $Revision: 336044 $\\n\";\n\n#define _N_(n) ITT_JOIN(INTEL_ITTNOTIFY_PREFIX,n)\n\n#if ITT_OS==ITT_OS_WIN\nstatic const char* ittnotify_lib_name = \"libittnotify.dll\";\n#elif ITT_OS==ITT_OS_LINUX\nstatic const char* ittnotify_lib_name = \"libittnotify.so\";\n#elif ITT_OS==ITT_OS_MAC\nstatic const char* ittnotify_lib_name = \"libittnotify.dylib\";\n#else\n#error Unsupported or unknown OS.\n#endif\n\n#ifdef __ANDROID__\n#include <android/log.h>\n#include <stdio.h>\n#include <unistd.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <fcntl.h>\n#include <linux/limits.h>\n\n#ifdef ITT_ANDROID_LOG\n    #define ITT_ANDROID_LOG_TAG   \"INTEL_VTUNE_USERAPI\"\n    #define ITT_ANDROID_LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, ITT_ANDROID_LOG_TAG, __VA_ARGS__))\n    #define ITT_ANDROID_LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, ITT_ANDROID_LOG_TAG, __VA_ARGS__))\n    #define ITT_ANDROID_LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR,ITT_ANDROID_LOG_TAG, __VA_ARGS__))\n    #define ITT_ANDROID_LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG,ITT_ANDROID_LOG_TAG, __VA_ARGS__))\n#else\n    #define ITT_ANDROID_LOGI(...)\n    #define ITT_ANDROID_LOGW(...)\n    #define ITT_ANDROID_LOGE(...)\n    #define ITT_ANDROID_LOGD(...)\n#endif\n\n/* default location of userapi collector on Android */\n#define ANDROID_ITTNOTIFY_DEFAULT_PATH  \"/data/data/com.intel.vtune/intel/libittnotify.so\"\n#endif\n\n\n#ifndef LIB_VAR_NAME\n#if ITT_ARCH==ITT_ARCH_IA32 || ITT_ARCH==ITT_ARCH_ARM\n#define LIB_VAR_NAME INTEL_LIBITTNOTIFY32\n#else\n#define LIB_VAR_NAME INTEL_LIBITTNOTIFY64\n#endif\n#endif /* LIB_VAR_NAME */\n\n#define ITT_MUTEX_INIT_AND_LOCK(p) {                                 \\\n        if (!p.mutex_initialized)                                    \\\n        {                                                            \\\n            if (__itt_interlocked_increment(&p.atomic_counter) == 1) \\\n            {                                                        \\\n                __itt_mutex_init(&p.mutex);                          \\\n                p.mutex_initialized = 1;                             \\\n            }                                                        \\\n            else                                                     \\\n                while (!p.mutex_initialized)                         \\\n                    __itt_thread_yield();                            \\\n        }                                                            \\\n        __itt_mutex_lock(&p.mutex);                                  \\\n}\n\nconst int _N_(err) = 0;\n\ntypedef int (__itt_init_ittlib_t)(const char*, __itt_group_id);\n\n/* this define used to control initialization function name. */\n#ifndef __itt_init_ittlib_name\nITT_EXTERN_C int _N_(init_ittlib)(const char*, __itt_group_id);\nstatic __itt_init_ittlib_t* __itt_init_ittlib_ptr = _N_(init_ittlib);\n#define __itt_init_ittlib_name __itt_init_ittlib_ptr\n#endif /* __itt_init_ittlib_name */\n\ntypedef void (__itt_fini_ittlib_t)(void);\n\n/* this define used to control finalization function name. */\n#ifndef __itt_fini_ittlib_name\nITT_EXTERN_C void _N_(fini_ittlib)(void);\nstatic __itt_fini_ittlib_t* __itt_fini_ittlib_ptr = _N_(fini_ittlib);\n#define __itt_fini_ittlib_name __itt_fini_ittlib_ptr\n#endif /* __itt_fini_ittlib_name */\n\n/* building pointers to imported funcs */\n#undef ITT_STUBV\n#undef ITT_STUB\n#define ITT_STUB(api,type,name,args,params,ptr,group,format)   \\\nstatic type api ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)) args;\\\ntypedef type api ITT_JOIN(_N_(name),_t) args;                  \\\nITT_EXTERN_C { ITT_JOIN(_N_(name),_t)* ITTNOTIFY_NAME(name) = ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)); }  \\\nstatic type api ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)) args \\\n{                                                              \\\n    __itt_init_ittlib_name(NULL, __itt_group_all);             \\\n    if (ITTNOTIFY_NAME(name) && ITTNOTIFY_NAME(name) != ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init))) \\\n        return ITTNOTIFY_NAME(name) params;                    \\\n    else                                                       \\\n        return (type)0;                                        \\\n}\n\n#define ITT_STUBV(api,type,name,args,params,ptr,group,format)  \\\nstatic type api ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)) args;\\\ntypedef type api ITT_JOIN(_N_(name),_t) args;                  \\\nITT_EXTERN_C { ITT_JOIN(_N_(name),_t)* ITTNOTIFY_NAME(name) = ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)); }  \\\nstatic type api ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)) args \\\n{                                                              \\\n    __itt_init_ittlib_name(NULL, __itt_group_all);             \\\n    if (ITTNOTIFY_NAME(name) && ITTNOTIFY_NAME(name) != ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init))) \\\n        ITTNOTIFY_NAME(name) params;                           \\\n    else                                                       \\\n        return;                                                \\\n}\n\n#undef __ITT_INTERNAL_INIT\n#include \"ittnotify_static.h\"\n\n#undef ITT_STUB\n#undef ITT_STUBV\n#define ITT_STUB(api,type,name,args,params,ptr,group,format)   \\\nstatic type api ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)) args;\\\ntypedef type api ITT_JOIN(_N_(name),_t) args;                  \\\nITT_EXTERN_C { ITT_JOIN(_N_(name),_t)* ITTNOTIFY_NAME(name) = ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)); }\n\n#define ITT_STUBV(api,type,name,args,params,ptr,group,format)  \\\nstatic type api ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)) args;\\\ntypedef type api ITT_JOIN(_N_(name),_t) args;                  \\\nITT_EXTERN_C { ITT_JOIN(_N_(name),_t)* ITTNOTIFY_NAME(name) = ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)); }\n\n#define __ITT_INTERNAL_INIT\n#include \"ittnotify_static.h\"\n#undef __ITT_INTERNAL_INIT\n\nITT_GROUP_LIST(group_list);\n\n#pragma pack(push, 8)\n\ntypedef struct ___itt_group_alias\n{\n    const char*    env_var;\n    __itt_group_id groups;\n} __itt_group_alias;\n\nstatic __itt_group_alias group_alias[] = {\n    { \"KMP_FOR_TPROFILE\", (__itt_group_id)(__itt_group_control | __itt_group_thread | __itt_group_sync  | __itt_group_mark) },\n    { \"KMP_FOR_TCHECK\",   (__itt_group_id)(__itt_group_control | __itt_group_thread | __itt_group_sync  | __itt_group_fsync | __itt_group_mark | __itt_group_suppress) },\n    { NULL,               (__itt_group_none) },\n    { api_version,        (__itt_group_none) } /* !!! Just to avoid unused code elimination !!! */\n};\n\n#pragma pack(pop)\n\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#pragma warning(push)\n#pragma warning(disable: 4054) /* warning C4054: 'type cast' : from function pointer 'XXX' to data pointer 'void *' */\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\nstatic __itt_api_info api_list[] = {\n/* Define functions with static implementation */\n#undef ITT_STUB\n#undef ITT_STUBV\n#define ITT_STUB(api,type,name,args,params,nameindll,group,format) { ITT_TO_STR(ITT_JOIN(__itt_,nameindll)), (void**)(void*)&ITTNOTIFY_NAME(name), (void*)(size_t)&ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)), (void*)(size_t)&ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)), (__itt_group_id)(group)},\n#define ITT_STUBV ITT_STUB\n#define __ITT_INTERNAL_INIT\n#include \"ittnotify_static.h\"\n#undef __ITT_INTERNAL_INIT\n/* Define functions without static implementation */\n#undef ITT_STUB\n#undef ITT_STUBV\n#define ITT_STUB(api,type,name,args,params,nameindll,group,format) {ITT_TO_STR(ITT_JOIN(__itt_,nameindll)), (void**)(void*)&ITTNOTIFY_NAME(name), (void*)(size_t)&ITT_VERSIONIZE(ITT_JOIN(_N_(name),_init)), NULL, (__itt_group_id)(group)},\n#define ITT_STUBV ITT_STUB\n#include \"ittnotify_static.h\"\n    {NULL, NULL, NULL, NULL, __itt_group_none}\n};\n\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#pragma warning(pop)\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\n/* private, init thread info item. used for internal purposes */\nstatic __itt_thread_info init_thread_info = {\n    (const char*)NULL,                        /* nameA */\n#if defined(UNICODE) || defined(_UNICODE)\n    (const wchar_t*)NULL,                     /* nameW */\n#else\n    (void*)NULL,                              /* nameW */\n#endif\n    0,                                        /* tid */\n    __itt_thread_normal,                      /* state */\n    0,                                        /* extra1 */\n    (void*)NULL,                              /* extra2 */\n    (__itt_thread_info*)NULL                  /* next */\n};\n\n/* private, NULL domain item. used for internal purposes */\nstatic __itt_domain null_domain = {\n    0,                                        /* flags:  disabled by default */\n    (const char*)NULL,                        /* nameA */\n#if defined(UNICODE) || defined(_UNICODE)\n    (const wchar_t*)NULL,                     /* nameW */\n#else\n    (void*)NULL,                              /* nameW */\n#endif\n    0,                                        /* extra1 */\n    (void*)NULL,                              /* extra2 */\n    (__itt_domain*)NULL                       /* next */\n};\n\n/* private, NULL string handle item. used for internal purposes */\nstatic __itt_string_handle null_string_handle = {\n    (const char*)NULL,                        /* strA */\n#if defined(UNICODE) || defined(_UNICODE)\n    (const wchar_t*)NULL,                     /* strW */\n#else\n    (void*)NULL,                              /* strW */\n#endif\n    0,                                        /* extra1 */\n    (void*)NULL,                              /* extra2 */\n    (__itt_string_handle*)NULL                /* next */\n};\n\nstatic const char dll_path[PATH_MAX] = { 0 };\n\n/* static part descriptor which handles. all notification api attributes. */\n__itt_global _N_(_ittapi_global) = {\n    ITT_MAGIC,                                     /* identification info */\n    ITT_MAJOR, ITT_MINOR, API_VERSION_BUILD,       /* version info */\n    0,                                             /* api_initialized */\n    0,                                             /* mutex_initialized */\n    0,                                             /* atomic_counter */\n    MUTEX_INITIALIZER,                             /* mutex */\n    NULL,                                          /* dynamic library handle */\n    NULL,                                          /* error_handler */\n    (const char**)&dll_path,                       /* dll_path_ptr */\n    (__itt_api_info*)&api_list,                    /* api_list_ptr */\n    NULL,                                          /* next __itt_global */\n    (__itt_thread_info*)&init_thread_info,         /* thread_list */\n    (__itt_domain*)&null_domain,                   /* domain_list */\n    (__itt_string_handle*)&null_string_handle,     /* string_list */\n    __itt_collection_normal                        /* collection state */\n};\n\ntypedef void (__itt_api_init_t)(__itt_global*, __itt_group_id);\ntypedef void (__itt_api_fini_t)(__itt_global*);\n\n/* ========================================================================= */\n\n#ifdef ITT_NOTIFY_EXT_REPORT\nITT_EXTERN_C void _N_(error_handler)(__itt_error_code, va_list args);\n#endif /* ITT_NOTIFY_EXT_REPORT */\n\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#pragma warning(push)\n#pragma warning(disable: 4055) /* warning C4055: 'type cast' : from data pointer 'void *' to function pointer 'XXX' */\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\nstatic void __itt_report_error(__itt_error_code code, ...)\n{\n    va_list args;\n    va_start(args, code);\n    if (_N_(_ittapi_global).error_handler != NULL)\n    {\n        __itt_error_handler_t* handler = (__itt_error_handler_t*)(size_t)_N_(_ittapi_global).error_handler;\n        handler(code, args);\n    }\n#ifdef ITT_NOTIFY_EXT_REPORT\n    _N_(error_handler)(code, args);\n#endif /* ITT_NOTIFY_EXT_REPORT */\n    va_end(args);\n}\n\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#pragma warning(pop)\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nstatic __itt_domain* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(domain_createW),_init))(const wchar_t* name)\n{\n    __itt_domain *h_tail, *h;\n\n    if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list->tid == 0)\n    {\n        __itt_init_ittlib_name(NULL, __itt_group_all);\n        if (ITTNOTIFY_NAME(domain_createW) && ITTNOTIFY_NAME(domain_createW) != ITT_VERSIONIZE(ITT_JOIN(_N_(domain_createW),_init)))\n            return ITTNOTIFY_NAME(domain_createW)(name);\n    }\n\n    if (name == NULL)\n        return _N_(_ittapi_global).domain_list;\n\n    ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));\n    for (h_tail = NULL, h = _N_(_ittapi_global).domain_list; h != NULL; h_tail = h, h = h->next)\n        if (h->nameW != NULL && !wcscmp(h->nameW, name))\n            break;\n    if (h == NULL) {\n        NEW_DOMAIN_W(&_N_(_ittapi_global),h,h_tail,name);\n    }\n    __itt_mutex_unlock(&_N_(_ittapi_global).mutex);\n    return h;\n}\n\nstatic __itt_domain* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(domain_createA),_init))(const char* name)\n#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */\nstatic __itt_domain* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(domain_create),_init))(const char* name)\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n{\n    __itt_domain *h_tail, *h;\n\n    if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list->tid == 0)\n    {\n        __itt_init_ittlib_name(NULL, __itt_group_all);\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n        if (ITTNOTIFY_NAME(domain_createA) && ITTNOTIFY_NAME(domain_createA) != ITT_VERSIONIZE(ITT_JOIN(_N_(domain_createA),_init)))\n            return ITTNOTIFY_NAME(domain_createA)(name);\n#else\n        if (ITTNOTIFY_NAME(domain_create) && ITTNOTIFY_NAME(domain_create) != ITT_VERSIONIZE(ITT_JOIN(_N_(domain_create),_init)))\n            return ITTNOTIFY_NAME(domain_create)(name);\n#endif\n    }\n\n    if (name == NULL)\n        return _N_(_ittapi_global).domain_list;\n\n    ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));\n    for (h_tail = NULL, h = _N_(_ittapi_global).domain_list; h != NULL; h_tail = h, h = h->next)\n        if (h->nameA != NULL && !__itt_fstrcmp(h->nameA, name))\n            break;\n    if (h == NULL) {\n        NEW_DOMAIN_A(&_N_(_ittapi_global),h,h_tail,name);\n    }\n    __itt_mutex_unlock(&_N_(_ittapi_global).mutex);\n    return h;\n}\n\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nstatic __itt_string_handle* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_createW),_init))(const wchar_t* name)\n{\n    __itt_string_handle *h_tail, *h;\n\n    if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list->tid == 0)\n    {\n        __itt_init_ittlib_name(NULL, __itt_group_all);\n        if (ITTNOTIFY_NAME(string_handle_createW) && ITTNOTIFY_NAME(string_handle_createW) != ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_createW),_init)))\n            return ITTNOTIFY_NAME(string_handle_createW)(name);\n    }\n\n    if (name == NULL)\n        return _N_(_ittapi_global).string_list;\n\n    ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));\n    for (h_tail = NULL, h = _N_(_ittapi_global).string_list; h != NULL; h_tail = h, h = h->next)\n        if (h->strW != NULL && !wcscmp(h->strW, name))\n            break;\n    if (h == NULL) {\n        NEW_STRING_HANDLE_W(&_N_(_ittapi_global),h,h_tail,name);\n    }\n    __itt_mutex_unlock(&_N_(_ittapi_global).mutex);\n    return h;\n}\n\nstatic __itt_string_handle* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_createA),_init))(const char* name)\n#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */\nstatic __itt_string_handle* ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_create),_init))(const char* name)\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n{\n    __itt_string_handle *h_tail, *h;\n\n    if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list->tid == 0)\n    {\n        __itt_init_ittlib_name(NULL, __itt_group_all);\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n        if (ITTNOTIFY_NAME(string_handle_createA) && ITTNOTIFY_NAME(string_handle_createA) != ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_createA),_init)))\n            return ITTNOTIFY_NAME(string_handle_createA)(name);\n#else\n        if (ITTNOTIFY_NAME(string_handle_create) && ITTNOTIFY_NAME(string_handle_create) != ITT_VERSIONIZE(ITT_JOIN(_N_(string_handle_create),_init)))\n            return ITTNOTIFY_NAME(string_handle_create)(name);\n#endif\n    }\n\n    if (name == NULL)\n        return _N_(_ittapi_global).string_list;\n\n    ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));\n    for (h_tail = NULL, h = _N_(_ittapi_global).string_list; h != NULL; h_tail = h, h = h->next)\n        if (h->strA != NULL && !__itt_fstrcmp(h->strA, name))\n            break;\n    if (h == NULL) {\n        NEW_STRING_HANDLE_A(&_N_(_ittapi_global),h,h_tail,name);\n    }\n    __itt_mutex_unlock(&_N_(_ittapi_global).mutex);\n    return h;\n}\n\n/* -------------------------------------------------------------------------- */\n\nstatic void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(pause),_init))(void)\n{\n    if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list->tid == 0)\n    {\n        __itt_init_ittlib_name(NULL, __itt_group_all);\n        if (ITTNOTIFY_NAME(pause) && ITTNOTIFY_NAME(pause) != ITT_VERSIONIZE(ITT_JOIN(_N_(pause),_init)))\n        {\n            ITTNOTIFY_NAME(pause)();\n            return;\n        }\n    }\n    _N_(_ittapi_global).state = __itt_collection_paused;\n}\n\nstatic void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(resume),_init))(void)\n{\n    if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list->tid == 0)\n    {\n        __itt_init_ittlib_name(NULL, __itt_group_all);\n        if (ITTNOTIFY_NAME(resume) && ITTNOTIFY_NAME(resume) != ITT_VERSIONIZE(ITT_JOIN(_N_(resume),_init)))\n        {\n            ITTNOTIFY_NAME(resume)();\n            return;\n        }\n    }\n    _N_(_ittapi_global).state = __itt_collection_normal;\n}\n\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nstatic void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameW),_init))(const wchar_t* name)\n{\n    TIDT tid = __itt_thread_id();\n    __itt_thread_info *h_tail, *h;\n\n    if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list->tid == 0)\n    {\n        __itt_init_ittlib_name(NULL, __itt_group_all);\n        if (ITTNOTIFY_NAME(thread_set_nameW) && ITTNOTIFY_NAME(thread_set_nameW) != ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameW),_init)))\n        {\n            ITTNOTIFY_NAME(thread_set_nameW)(name);\n            return;\n        }\n    }\n\n    __itt_mutex_lock(&_N_(_ittapi_global).mutex);\n    for (h_tail = NULL, h = _N_(_ittapi_global).thread_list; h != NULL; h_tail = h, h = h->next)\n        if (h->tid == tid)\n            break;\n    if (h == NULL) {\n        NEW_THREAD_INFO_W(&_N_(_ittapi_global), h, h_tail, tid, __itt_thread_normal, name);\n    }\n    else\n    {\n        h->nameW = name ? _wcsdup(name) : NULL;\n    }\n    __itt_mutex_unlock(&_N_(_ittapi_global).mutex);\n}\n\nstatic int ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thr_name_setW),_init))(const wchar_t* name, int namelen)\n{\n    namelen = namelen;\n    ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameW),_init))(name);\n    return 0;\n}\n\nstatic void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameA),_init))(const char* name)\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nstatic void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_name),_init))(const char* name)\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n{\n    TIDT tid = __itt_thread_id();\n    __itt_thread_info *h_tail, *h;\n\n    if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list->tid == 0)\n    {\n        __itt_init_ittlib_name(NULL, __itt_group_all);\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n        if (ITTNOTIFY_NAME(thread_set_nameA) && ITTNOTIFY_NAME(thread_set_nameA) != ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameA),_init)))\n        {\n            ITTNOTIFY_NAME(thread_set_nameA)(name);\n            return;\n        }\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n        if (ITTNOTIFY_NAME(thread_set_name) && ITTNOTIFY_NAME(thread_set_name) != ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_name),_init)))\n        {\n            ITTNOTIFY_NAME(thread_set_name)(name);\n            return;\n        }\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n    }\n\n    __itt_mutex_lock(&_N_(_ittapi_global).mutex);\n    for (h_tail = NULL, h = _N_(_ittapi_global).thread_list; h != NULL; h_tail = h, h = h->next)\n        if (h->tid == tid)\n            break;\n    if (h == NULL) {\n        NEW_THREAD_INFO_A(&_N_(_ittapi_global), h, h_tail, tid, __itt_thread_normal, name);\n    }\n    else\n    {\n        h->nameA = name ? __itt_fstrdup(name) : NULL;\n    }\n    __itt_mutex_unlock(&_N_(_ittapi_global).mutex);\n}\n\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nstatic int ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thr_name_setA),_init))(const char* name, int namelen)\n{\n    namelen = namelen;\n    ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_nameA),_init))(name);\n    return 0;\n}\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nstatic int ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thr_name_set),_init))(const char* name, int namelen)\n{\n    ITT_VERSIONIZE(ITT_JOIN(_N_(thread_set_name),_init))(name);\n    return 0;\n}\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\nstatic void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thread_ignore),_init))(void)\n{\n    TIDT tid = __itt_thread_id();\n    __itt_thread_info *h_tail, *h;\n\n    if (!_N_(_ittapi_global).api_initialized && _N_(_ittapi_global).thread_list->tid == 0)\n    {\n        __itt_init_ittlib_name(NULL, __itt_group_all);\n        if (ITTNOTIFY_NAME(thread_ignore) && ITTNOTIFY_NAME(thread_ignore) != ITT_VERSIONIZE(ITT_JOIN(_N_(thread_ignore),_init)))\n        {\n            ITTNOTIFY_NAME(thread_ignore)();\n            return;\n        }\n    }\n\n    __itt_mutex_lock(&_N_(_ittapi_global).mutex);\n    for (h_tail = NULL, h = _N_(_ittapi_global).thread_list; h != NULL; h_tail = h, h = h->next)\n        if (h->tid == tid)\n            break;\n    if (h == NULL) {\n        static const char* name = \"unknown\";\n        NEW_THREAD_INFO_A(&_N_(_ittapi_global), h, h_tail, tid, __itt_thread_ignored, name);\n    }\n    else\n    {\n        h->state = __itt_thread_ignored;\n    }\n    __itt_mutex_unlock(&_N_(_ittapi_global).mutex);\n}\n\nstatic void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(thr_ignore),_init))(void)\n{\n    ITT_VERSIONIZE(ITT_JOIN(_N_(thread_ignore),_init))();\n}\n\nstatic void ITTAPI ITT_VERSIONIZE(ITT_JOIN(_N_(enable_attach),_init))(void)\n{\n#ifdef __ANDROID__\n    /*\n     * if LIB_VAR_NAME env variable were set before then stay previous value\n     * else set default path\n    */\n    setenv(ITT_TO_STR(LIB_VAR_NAME), ANDROID_ITTNOTIFY_DEFAULT_PATH, 0);\n#endif\n}\n\n/* -------------------------------------------------------------------------- */\n\nstatic const char* __itt_fsplit(const char* s, const char* sep, const char** out, int* len)\n{\n    int i;\n    int j;\n\n    if (!s || !sep || !out || !len)\n        return NULL;\n\n    for (i = 0; s[i]; i++)\n    {\n        int b = 0;\n        for (j = 0; sep[j]; j++)\n            if (s[i] == sep[j])\n            {\n                b = 1;\n                break;\n            }\n        if (!b)\n            break;\n    }\n\n    if (!s[i])\n        return NULL;\n\n    *len = 0;\n    *out = &s[i];\n\n    for (; s[i]; i++, (*len)++)\n    {\n        int b = 0;\n        for (j = 0; sep[j]; j++)\n            if (s[i] == sep[j])\n            {\n                b = 1;\n                break;\n            }\n        if (b)\n            break;\n    }\n\n    for (; s[i]; i++)\n    {\n        int b = 0;\n        for (j = 0; sep[j]; j++)\n            if (s[i] == sep[j])\n            {\n                b = 1;\n                break;\n            }\n        if (!b)\n            break;\n    }\n\n    return &s[i];\n}\n\n/* This function return value of env variable that placed into static buffer.\n * !!! The same static buffer is used for subsequent calls. !!!\n * This was done to aviod dynamic allocation for few calls.\n * Actually we need this function only four times.\n */\nstatic const char* __itt_get_env_var(const char* name)\n{\n#define MAX_ENV_VALUE_SIZE 4086\n    static char  env_buff[MAX_ENV_VALUE_SIZE];\n    static char* env_value = (char*)env_buff;\n\n    if (name != NULL)\n    {\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n        size_t max_len = MAX_ENV_VALUE_SIZE - (size_t)(env_value - env_buff);\n        DWORD rc = GetEnvironmentVariableA(name, env_value, (DWORD)max_len);\n        if (rc >= max_len)\n            __itt_report_error(__itt_error_env_too_long, name, (size_t)rc - 1, (size_t)(max_len - 1));\n        else if (rc > 0)\n        {\n            const char* ret = (const char*)env_value;\n            env_value += rc + 1;\n            return ret;\n        }\n        else\n        {\n            /* If environment variable is empty, GetEnvirornmentVariables()\n             * returns zero (number of characters (not including terminating null),\n             * and GetLastError() returns ERROR_SUCCESS. */\n            DWORD err = GetLastError();\n            if (err == ERROR_SUCCESS)\n                return env_value;\n\n            if (err != ERROR_ENVVAR_NOT_FOUND)\n                __itt_report_error(__itt_error_cant_read_env, name, (int)err);\n        }\n#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */\n        char* env = getenv(name);\n        if (env != NULL)\n        {\n            size_t len = strlen(env);\n            size_t max_len = MAX_ENV_VALUE_SIZE - (size_t)(env_value - env_buff);\n            if (len < max_len)\n            {\n                const char* ret = (const char*)env_value;\n                strncpy(env_value, env, len + 1);\n                env_value += len + 1;\n                return ret;\n            } else\n                __itt_report_error(__itt_error_env_too_long, name, (size_t)len, (size_t)(max_len - 1));\n        }\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n    }\n    return NULL;\n}\n\nstatic const char* __itt_get_lib_name(void)\n{\n    const char* lib_name = __itt_get_env_var(ITT_TO_STR(LIB_VAR_NAME));\n\n#ifdef __ANDROID__\n    if (lib_name == NULL)\n    {\n        const char* const system_wide_marker_filename = \"/data/local/tmp/com.intel.itt.collector_lib\";\n        int itt_marker_file_fd = open(system_wide_marker_filename, O_RDONLY);\n        ssize_t res = 0;\n\n        if (itt_marker_file_fd == -1)\n        {\n            const pid_t my_pid = getpid();\n            char cmdline_path[PATH_MAX] = {0};\n            char package_name[PATH_MAX] = {0};\n            char app_sandbox_file[PATH_MAX] = {0};\n            int cmdline_fd = 0;\n\n            ITT_ANDROID_LOGI(\"Unable to open system-wide marker file.\");\n            snprintf(cmdline_path, PATH_MAX - 1, \"/proc/%d/cmdline\", my_pid);\n            ITT_ANDROID_LOGI(\"CMD file: %s\\n\", cmdline_path);\n            cmdline_fd = open(cmdline_path, O_RDONLY);\n            if (cmdline_fd == -1)\n            {\n                ITT_ANDROID_LOGE(\"Unable to open %s file!\", cmdline_path);\n                return lib_name;\n            }\n            res = read(cmdline_fd, package_name, PATH_MAX - 1);\n            if (res == -1)\n            {\n                ITT_ANDROID_LOGE(\"Unable to read %s file!\", cmdline_path);\n                res = close(cmdline_fd);\n                if (res == -1)\n                {\n                    ITT_ANDROID_LOGE(\"Unable to close %s file!\", cmdline_path);\n                }\n                return lib_name;\n            }\n            res = close(cmdline_fd);\n            if (res == -1)\n            {\n                ITT_ANDROID_LOGE(\"Unable to close %s file!\", cmdline_path);\n                return lib_name;\n            }\n            ITT_ANDROID_LOGI(\"Package name: %s\\n\", package_name);\n            snprintf(app_sandbox_file, PATH_MAX - 1, \"/data/data/%s/com.intel.itt.collector_lib\", package_name);\n            ITT_ANDROID_LOGI(\"Lib marker file name: %s\\n\", app_sandbox_file);\n            itt_marker_file_fd = open(app_sandbox_file, O_RDONLY);\n            if (itt_marker_file_fd == -1)\n            {\n                ITT_ANDROID_LOGE(\"Unable to open app marker file!\");\n                return lib_name;\n            }\n        }\n\n        {\n            char itt_lib_name[PATH_MAX] = {0};\n\n            res = read(itt_marker_file_fd, itt_lib_name, PATH_MAX - 1);\n            if (res == -1)\n            {\n                ITT_ANDROID_LOGE(\"Unable to read %s file!\", itt_marker_file_fd);\n                res = close(itt_marker_file_fd);\n                if (res == -1)\n                {\n                    ITT_ANDROID_LOGE(\"Unable to close %s file!\", itt_marker_file_fd);\n                }\n                return lib_name;\n            }\n            ITT_ANDROID_LOGI(\"ITT Lib path: %s\", itt_lib_name);\n            res = close(itt_marker_file_fd);\n            if (res == -1)\n            {\n                ITT_ANDROID_LOGE(\"Unable to close %s file!\", itt_marker_file_fd);\n                return lib_name;\n            }\n            ITT_ANDROID_LOGI(\"Set env\");\n            res = setenv(ITT_TO_STR(LIB_VAR_NAME), itt_lib_name, 0);\n            if (res == -1)\n            {\n                ITT_ANDROID_LOGE(\"Unable to set env var!\");\n                return lib_name;\n            }\n            lib_name = __itt_get_env_var(ITT_TO_STR(LIB_VAR_NAME));\n            ITT_ANDROID_LOGI(\"ITT Lib path from env: %s\", itt_lib_name);\n        }\n    }\n#endif\n\n    return lib_name;\n}\n\n#ifndef min\n#define min(a,b) (a) < (b) ? (a) : (b)\n#endif /* min */\n\nstatic __itt_group_id __itt_get_groups(void)\n{\n    int i;\n    __itt_group_id res = __itt_group_none;\n    const char* var_name  = \"INTEL_ITTNOTIFY_GROUPS\";\n    const char* group_str = __itt_get_env_var(var_name);\n\n    if (group_str != NULL)\n    {\n        int len;\n        char gr[255];\n        const char* chunk;\n        while ((group_str = __itt_fsplit(group_str, \",; \", &chunk, &len)) != NULL)\n        {\n            __itt_fstrcpyn(gr, chunk, sizeof(gr) - 1);\n            gr[min(len, (int)(sizeof(gr) - 1))] = 0;\n\n            for (i = 0; group_list[i].name != NULL; i++)\n            {\n                if (!__itt_fstrcmp(gr, group_list[i].name))\n                {\n                    res = (__itt_group_id)(res | group_list[i].id);\n                    break;\n                }\n            }\n        }\n        /* TODO: !!! Workaround for bug with warning for unknown group !!!\n         * Should be fixed in new initialization scheme.\n         * Now the following groups should be set always. */\n        for (i = 0; group_list[i].id != __itt_group_none; i++)\n            if (group_list[i].id != __itt_group_all &&\n                group_list[i].id > __itt_group_splitter_min &&\n                group_list[i].id < __itt_group_splitter_max)\n                res = (__itt_group_id)(res | group_list[i].id);\n        return res;\n    }\n    else\n    {\n        for (i = 0; group_alias[i].env_var != NULL; i++)\n            if (__itt_get_env_var(group_alias[i].env_var) != NULL)\n                return group_alias[i].groups;\n    }\n\n    return res;\n}\n\nstatic int __itt_lib_version(lib_t lib)\n{\n    if (lib == NULL)\n        return 0;\n    if (__itt_get_proc(lib, \"__itt_api_init\"))\n        return 2;\n    if (__itt_get_proc(lib, \"__itt_api_version\"))\n        return 1;\n    return 0;\n}\n\n/* It's not used right now! Comment it out to avoid warnings.\nstatic void __itt_reinit_all_pointers(void)\n{\n    register int i;\n    // Fill all pointers with initial stubs\n    for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL; i++)\n        *_N_(_ittapi_global).api_list_ptr[i].func_ptr = _N_(_ittapi_global).api_list_ptr[i].init_func;\n}\n*/\n\nstatic void __itt_nullify_all_pointers(void)\n{\n    int i;\n    /* Nulify all pointers except domain_create and string_handle_create */\n    for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL; i++)\n        *_N_(_ittapi_global).api_list_ptr[i].func_ptr = _N_(_ittapi_global).api_list_ptr[i].null_func;\n}\n\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#pragma warning(push)\n#pragma warning(disable: 4054) /* warning C4054: 'type cast' : from function pointer 'XXX' to data pointer 'void *' */\n#pragma warning(disable: 4055) /* warning C4055: 'type cast' : from data pointer 'void *' to function pointer 'XXX' */\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\nITT_EXTERN_C void _N_(fini_ittlib)(void)\n{\n    __itt_api_fini_t* __itt_api_fini_ptr;\n    static volatile TIDT current_thread = 0;\n\n    if (_N_(_ittapi_global).api_initialized)\n    {\n        __itt_mutex_lock(&_N_(_ittapi_global).mutex);\n        if (_N_(_ittapi_global).api_initialized)\n        {\n            if (current_thread == 0)\n            {\n                current_thread = __itt_thread_id();\n                __itt_api_fini_ptr = (__itt_api_fini_t*)(size_t)__itt_get_proc(_N_(_ittapi_global).lib, \"__itt_api_fini\");\n                if (__itt_api_fini_ptr)\n                    __itt_api_fini_ptr(&_N_(_ittapi_global));\n\n                __itt_nullify_all_pointers();\n\n /* TODO: !!! not safe !!! don't support unload so far.\n  *             if (_N_(_ittapi_global).lib != NULL)\n  *                 __itt_unload_lib(_N_(_ittapi_global).lib);\n  *             _N_(_ittapi_global).lib = NULL;\n  */\n                _N_(_ittapi_global).api_initialized = 0;\n                current_thread = 0;\n            }\n        }\n        __itt_mutex_unlock(&_N_(_ittapi_global).mutex);\n    }\n}\n\nITT_EXTERN_C int _N_(init_ittlib)(const char* lib_name, __itt_group_id init_groups)\n{\n    int i;\n    __itt_group_id groups;\n#ifdef ITT_COMPLETE_GROUP\n    __itt_group_id zero_group = __itt_group_none;\n#endif /* ITT_COMPLETE_GROUP */\n    static volatile TIDT current_thread = 0;\n\n    if (!_N_(_ittapi_global).api_initialized)\n    {\n#ifndef ITT_SIMPLE_INIT\n        ITT_MUTEX_INIT_AND_LOCK(_N_(_ittapi_global));\n#endif /* ITT_SIMPLE_INIT */\n\n        if (!_N_(_ittapi_global).api_initialized)\n        {\n            if (current_thread == 0)\n            {\n                current_thread = __itt_thread_id();\n                _N_(_ittapi_global).thread_list->tid = current_thread;\n                if (lib_name == NULL)\n                    lib_name = __itt_get_lib_name();\n                groups = __itt_get_groups();\n                if (groups != __itt_group_none || lib_name != NULL)\n                {\n                    _N_(_ittapi_global).lib = __itt_load_lib((lib_name == NULL) ? ittnotify_lib_name : lib_name);\n\n                    if (_N_(_ittapi_global).lib != NULL)\n                    {\n                        __itt_api_init_t* __itt_api_init_ptr;\n                        int lib_version = __itt_lib_version(_N_(_ittapi_global).lib);\n\n                        switch (lib_version) {\n                        case 0:\n                            groups = __itt_group_legacy;\n                        case 1:\n                            /* Fill all pointers from dynamic library */\n                            for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL; i++)\n                            {\n                                if (_N_(_ittapi_global).api_list_ptr[i].group & groups & init_groups)\n                                {\n                                    *_N_(_ittapi_global).api_list_ptr[i].func_ptr = (void*)__itt_get_proc(_N_(_ittapi_global).lib, _N_(_ittapi_global).api_list_ptr[i].name);\n                                    if (*_N_(_ittapi_global).api_list_ptr[i].func_ptr == NULL)\n                                    {\n                                        /* Restore pointers for function with static implementation */\n                                        *_N_(_ittapi_global).api_list_ptr[i].func_ptr = _N_(_ittapi_global).api_list_ptr[i].null_func;\n                                        __itt_report_error(__itt_error_no_symbol, lib_name, _N_(_ittapi_global).api_list_ptr[i].name);\n#ifdef ITT_COMPLETE_GROUP\n                                        zero_group = (__itt_group_id)(zero_group | _N_(_ittapi_global).api_list_ptr[i].group);\n#endif /* ITT_COMPLETE_GROUP */\n                                    }\n                                }\n                                else\n                                    *_N_(_ittapi_global).api_list_ptr[i].func_ptr = _N_(_ittapi_global).api_list_ptr[i].null_func;\n                            }\n\n                            if (groups == __itt_group_legacy)\n                            {\n                                /* Compatibility with legacy tools */\n                                ITTNOTIFY_NAME(thread_ignore)  = ITTNOTIFY_NAME(thr_ignore);\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n                                ITTNOTIFY_NAME(sync_createA)   = ITTNOTIFY_NAME(sync_set_nameA);\n                                ITTNOTIFY_NAME(sync_createW)   = ITTNOTIFY_NAME(sync_set_nameW);\n#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */\n                                ITTNOTIFY_NAME(sync_create)    = ITTNOTIFY_NAME(sync_set_name);\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n                                ITTNOTIFY_NAME(sync_prepare)   = ITTNOTIFY_NAME(notify_sync_prepare);\n                                ITTNOTIFY_NAME(sync_cancel)    = ITTNOTIFY_NAME(notify_sync_cancel);\n                                ITTNOTIFY_NAME(sync_acquired)  = ITTNOTIFY_NAME(notify_sync_acquired);\n                                ITTNOTIFY_NAME(sync_releasing) = ITTNOTIFY_NAME(notify_sync_releasing);\n                            }\n\n#ifdef ITT_COMPLETE_GROUP\n                            for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL; i++)\n                                if (_N_(_ittapi_global).api_list_ptr[i].group & zero_group)\n                                    *_N_(_ittapi_global).api_list_ptr[i].func_ptr = _N_(_ittapi_global).api_list_ptr[i].null_func;\n#endif /* ITT_COMPLETE_GROUP */\n                            break;\n                        case 2:\n                            __itt_api_init_ptr = (__itt_api_init_t*)(size_t)__itt_get_proc(_N_(_ittapi_global).lib, \"__itt_api_init\");\n                            if (__itt_api_init_ptr)\n                                __itt_api_init_ptr(&_N_(_ittapi_global), init_groups);\n                            break;\n                        }\n                    }\n                    else\n                    {\n                        __itt_nullify_all_pointers();\n\n                        __itt_report_error(__itt_error_no_module, lib_name,\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n                            __itt_system_error()\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n                            dlerror()\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n                        );\n                    }\n                }\n                else\n                {\n                    __itt_nullify_all_pointers();\n                }\n                _N_(_ittapi_global).api_initialized = 1;\n                current_thread = 0;\n                /* !!! Just to avoid unused code elimination !!! */\n                if (__itt_fini_ittlib_ptr == _N_(fini_ittlib)) current_thread = 0;\n            }\n        }\n\n#ifndef ITT_SIMPLE_INIT\n        __itt_mutex_unlock(&_N_(_ittapi_global).mutex);\n#endif /* ITT_SIMPLE_INIT */\n    }\n\n    /* Evaluating if any function ptr is non empty and it's in init_groups */\n    for (i = 0; _N_(_ittapi_global).api_list_ptr[i].name != NULL; i++)\n        if (*_N_(_ittapi_global).api_list_ptr[i].func_ptr != _N_(_ittapi_global).api_list_ptr[i].null_func &&\n            _N_(_ittapi_global).api_list_ptr[i].group & init_groups)\n            return 1;\n    return 0;\n}\n\nITT_EXTERN_C __itt_error_handler_t* _N_(set_error_handler)(__itt_error_handler_t* handler)\n{\n    __itt_error_handler_t* prev = (__itt_error_handler_t*)(size_t)_N_(_ittapi_global).error_handler;\n    _N_(_ittapi_global).error_handler = (void*)(size_t)handler;\n    return prev;\n}\n\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#pragma warning(pop)\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\n"
  },
  {
    "path": "benchmarks/tbb/tools_api/ittnotify_static.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#include \"ittnotify_config.h\"\n\n#ifndef ITT_FORMAT_DEFINED\n#  ifndef ITT_FORMAT\n#    define ITT_FORMAT\n#  endif /* ITT_FORMAT */\n#  ifndef ITT_NO_PARAMS\n#    define ITT_NO_PARAMS\n#  endif /* ITT_NO_PARAMS */\n#endif /* ITT_FORMAT_DEFINED */\n\n/*\n * parameters for macro expected:\n * ITT_STUB(api, type, func_name, arguments, params, func_name_in_dll, group, printf_fmt)\n */\n#ifdef __ITT_INTERNAL_INIT\n\n#ifndef __ITT_INTERNAL_BODY\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUB(ITTAPI, __itt_domain*, domain_createA, (const char    *name), (ITT_FORMAT name), domain_createA, __itt_group_structure, \"\\\"%s\\\"\")\nITT_STUB(ITTAPI, __itt_domain*, domain_createW, (const wchar_t *name), (ITT_FORMAT name), domain_createW, __itt_group_structure, \"\\\"%S\\\"\")\n#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */\nITT_STUB(ITTAPI, __itt_domain*, domain_create,  (const char    *name), (ITT_FORMAT name), domain_create,  __itt_group_structure, \"\\\"%s\\\"\")\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUB(ITTAPI, __itt_string_handle*, string_handle_createA, (const char    *name), (ITT_FORMAT name), string_handle_createA, __itt_group_structure, \"\\\"%s\\\"\")\nITT_STUB(ITTAPI, __itt_string_handle*, string_handle_createW, (const wchar_t *name), (ITT_FORMAT name), string_handle_createW, __itt_group_structure, \"\\\"%S\\\"\")\n#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */\nITT_STUB(ITTAPI, __itt_string_handle*, string_handle_create,  (const char    *name), (ITT_FORMAT name), string_handle_create,  __itt_group_structure, \"\\\"%s\\\"\")\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\nITT_STUBV(ITTAPI, void, pause,  (void), (ITT_NO_PARAMS), pause,  __itt_group_control | __itt_group_legacy, \"no args\")\nITT_STUBV(ITTAPI, void, resume, (void), (ITT_NO_PARAMS), resume, __itt_group_control | __itt_group_legacy, \"no args\")\n\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUBV(ITTAPI, void, thread_set_nameA, (const char    *name), (ITT_FORMAT name), thread_set_nameA, __itt_group_thread, \"\\\"%s\\\"\")\nITT_STUBV(ITTAPI, void, thread_set_nameW, (const wchar_t *name), (ITT_FORMAT name), thread_set_nameW, __itt_group_thread, \"\\\"%S\\\"\")\n#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */\nITT_STUBV(ITTAPI, void, thread_set_name,  (const char    *name), (ITT_FORMAT name), thread_set_name,  __itt_group_thread, \"\\\"%s\\\"\")\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nITT_STUBV(ITTAPI, void, thread_ignore, (void), (ITT_NO_PARAMS), thread_ignore, __itt_group_thread, \"no args\")\n\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUB(LIBITTAPI, int,  thr_name_setA, (const char    *name, int namelen), (ITT_FORMAT name, namelen), thr_name_setA, __itt_group_thread | __itt_group_legacy, \"\\\"%s\\\", %d\")\nITT_STUB(LIBITTAPI, int,  thr_name_setW, (const wchar_t *name, int namelen), (ITT_FORMAT name, namelen), thr_name_setW, __itt_group_thread | __itt_group_legacy, \"\\\"%S\\\", %d\")\n#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */\nITT_STUB(LIBITTAPI, int,  thr_name_set,  (const char    *name, int namelen), (ITT_FORMAT name, namelen), thr_name_set,  __itt_group_thread | __itt_group_legacy, \"\\\"%s\\\", %d\")\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nITT_STUBV(LIBITTAPI, void, thr_ignore,   (void),                             (ITT_NO_PARAMS),            thr_ignore,    __itt_group_thread | __itt_group_legacy, \"no args\")\n#endif /* __ITT_INTERNAL_BODY */\n\nITT_STUBV(ITTAPI, void, enable_attach, (void), (ITT_NO_PARAMS), enable_attach, __itt_group_all, \"no args\")\n\n#else  /* __ITT_INTERNAL_INIT */\n\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUBV(ITTAPI, void, sync_createA, (void *addr, const char    *objtype, const char    *objname, int attribute), (ITT_FORMAT addr, objtype, objname, attribute), sync_createA, __itt_group_sync | __itt_group_fsync, \"%p, \\\"%s\\\", \\\"%s\\\", %x\")\nITT_STUBV(ITTAPI, void, sync_createW, (void *addr, const wchar_t *objtype, const wchar_t *objname, int attribute), (ITT_FORMAT addr, objtype, objname, attribute), sync_createW, __itt_group_sync | __itt_group_fsync, \"%p, \\\"%S\\\", \\\"%S\\\", %x\")\nITT_STUBV(ITTAPI, void, sync_renameA, (void *addr, const char    *name), (ITT_FORMAT addr, name), sync_renameA, __itt_group_sync | __itt_group_fsync, \"%p, \\\"%s\\\"\")\nITT_STUBV(ITTAPI, void, sync_renameW, (void *addr, const wchar_t *name), (ITT_FORMAT addr, name), sync_renameW, __itt_group_sync | __itt_group_fsync, \"%p, \\\"%S\\\"\")\n#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */\nITT_STUBV(ITTAPI, void, sync_create,  (void *addr, const char    *objtype, const char    *objname, int attribute), (ITT_FORMAT addr, objtype, objname, attribute), sync_create,  __itt_group_sync | __itt_group_fsync, \"%p, \\\"%s\\\", \\\"%s\\\", %x\")\nITT_STUBV(ITTAPI, void, sync_rename,  (void *addr, const char    *name), (ITT_FORMAT addr, name), sync_rename,  __itt_group_sync | __itt_group_fsync, \"%p, \\\"%s\\\"\")\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nITT_STUBV(ITTAPI, void, sync_destroy,    (void *addr), (ITT_FORMAT addr), sync_destroy,   __itt_group_sync | __itt_group_fsync, \"%p\")\n\nITT_STUBV(ITTAPI, void, sync_prepare,    (void* addr), (ITT_FORMAT addr), sync_prepare,   __itt_group_sync,  \"%p\")\nITT_STUBV(ITTAPI, void, sync_cancel,     (void *addr), (ITT_FORMAT addr), sync_cancel,    __itt_group_sync,  \"%p\")\nITT_STUBV(ITTAPI, void, sync_acquired,   (void *addr), (ITT_FORMAT addr), sync_acquired,  __itt_group_sync,  \"%p\")\nITT_STUBV(ITTAPI, void, sync_releasing,  (void* addr), (ITT_FORMAT addr), sync_releasing, __itt_group_sync,  \"%p\")\n\nITT_STUBV(ITTAPI, void, suppress_push,       (unsigned int mask),                             (ITT_FORMAT mask), suppress_push,  __itt_group_suppress,  \"%p\")\nITT_STUBV(ITTAPI, void, suppress_pop,        (void),                                          (ITT_NO_PARAMS),   suppress_pop,   __itt_group_suppress,  \"no args\")\nITT_STUBV(ITTAPI, void, suppress_mark_range, (__itt_suppress_mode_t mode, unsigned int mask, void * address, size_t size),(ITT_FORMAT mode, mask, address, size), suppress_mark_range, __itt_group_suppress, \"%d, %p, %p, %d\")\nITT_STUBV(ITTAPI, void, suppress_clear_range,(__itt_suppress_mode_t mode, unsigned int mask, void * address, size_t size),(ITT_FORMAT mode, mask, address, size), suppress_clear_range,__itt_group_suppress, \"%d, %p, %p, %d\")\n\nITT_STUBV(ITTAPI, void, fsync_prepare,   (void* addr), (ITT_FORMAT addr), sync_prepare,   __itt_group_fsync, \"%p\")\nITT_STUBV(ITTAPI, void, fsync_cancel,    (void *addr), (ITT_FORMAT addr), sync_cancel,    __itt_group_fsync, \"%p\")\nITT_STUBV(ITTAPI, void, fsync_acquired,  (void *addr), (ITT_FORMAT addr), sync_acquired,  __itt_group_fsync, \"%p\")\nITT_STUBV(ITTAPI, void, fsync_releasing, (void* addr), (ITT_FORMAT addr), sync_releasing, __itt_group_fsync, \"%p\")\n\nITT_STUBV(ITTAPI, void, model_site_begin,          (__itt_model_site *site, __itt_model_site_instance *instance, const char *name), (ITT_FORMAT site, instance, name), model_site_begin, __itt_group_model, \"%p, %p, \\\"%s\\\"\")\nITT_STUBV(ITTAPI, void, model_site_end,            (__itt_model_site *site, __itt_model_site_instance *instance),                   (ITT_FORMAT site, instance),       model_site_end,   __itt_group_model, \"%p, %p\")\nITT_STUBV(ITTAPI, void, model_task_begin,          (__itt_model_task *task, __itt_model_task_instance *instance, const char *name), (ITT_FORMAT task, instance, name), model_task_begin, __itt_group_model, \"%p, %p, \\\"%s\\\"\")\nITT_STUBV(ITTAPI, void, model_task_end,            (__itt_model_task *task, __itt_model_task_instance *instance),                   (ITT_FORMAT task, instance),       model_task_end,   __itt_group_model, \"%p, %p\")\nITT_STUBV(ITTAPI, void, model_lock_acquire,        (void *lock), (ITT_FORMAT lock), model_lock_acquire, __itt_group_model, \"%p\")\nITT_STUBV(ITTAPI, void, model_lock_release,        (void *lock), (ITT_FORMAT lock), model_lock_release, __itt_group_model, \"%p\")\nITT_STUBV(ITTAPI, void, model_record_allocation,   (void *addr, size_t size), (ITT_FORMAT addr, size), model_record_allocation,   __itt_group_model, \"%p, %d\")\nITT_STUBV(ITTAPI, void, model_record_deallocation, (void *addr),              (ITT_FORMAT addr),       model_record_deallocation, __itt_group_model, \"%p\")\nITT_STUBV(ITTAPI, void, model_induction_uses,      (void* addr, size_t size), (ITT_FORMAT addr, size), model_induction_uses,      __itt_group_model, \"%p, %d\")\nITT_STUBV(ITTAPI, void, model_reduction_uses,      (void* addr, size_t size), (ITT_FORMAT addr, size), model_reduction_uses,      __itt_group_model, \"%p, %d\")\nITT_STUBV(ITTAPI, void, model_observe_uses,        (void* addr, size_t size), (ITT_FORMAT addr, size), model_observe_uses,        __itt_group_model, \"%p, %d\")\nITT_STUBV(ITTAPI, void, model_clear_uses,          (void* addr),              (ITT_FORMAT addr),       model_clear_uses,          __itt_group_model, \"%p\")\n\n#ifndef __ITT_INTERNAL_BODY\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUBV(ITTAPI, void, model_site_beginW,         (const wchar_t *name),     (ITT_FORMAT name),       model_site_beginW,         __itt_group_model, \"\\\"%s\\\"\")\nITT_STUBV(ITTAPI, void, model_task_beginW,         (const wchar_t *name),     (ITT_FORMAT name),       model_task_beginW,         __itt_group_model, \"\\\"%s\\\"\")\nITT_STUBV(ITTAPI, void, model_iteration_taskW,     (const wchar_t *name),     (ITT_FORMAT name),       model_iteration_taskW,     __itt_group_model, \"\\\"%s\\\"\")\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nITT_STUBV(ITTAPI, void, model_site_beginA,         (const char *name),        (ITT_FORMAT name),       model_site_beginA,         __itt_group_model, \"\\\"%s\\\"\")\nITT_STUBV(ITTAPI, void, model_site_beginAL,        (const char *name, size_t len), (ITT_FORMAT name, len), model_site_beginAL,    __itt_group_model, \"\\\"%s\\\", %d\")\nITT_STUBV(ITTAPI, void, model_task_beginA,         (const char *name),        (ITT_FORMAT name),       model_task_beginA,         __itt_group_model, \"\\\"%s\\\"\")\nITT_STUBV(ITTAPI, void, model_task_beginAL,        (const char *name, size_t len), (ITT_FORMAT name, len), model_task_beginAL,    __itt_group_model, \"\\\"%s\\\", %d\")\nITT_STUBV(ITTAPI, void, model_iteration_taskA,     (const char *name),        (ITT_FORMAT name),       model_iteration_taskA,     __itt_group_model, \"\\\"%s\\\"\")\nITT_STUBV(ITTAPI, void, model_iteration_taskAL,    (const char *name, size_t len), (ITT_FORMAT name, len), model_iteration_taskAL, __itt_group_model, \"\\\"%s\\\", %d\")\nITT_STUBV(ITTAPI, void, model_site_end_2,          (void),                    (ITT_NO_PARAMS),         model_site_end_2,          __itt_group_model, \"no args\")\nITT_STUBV(ITTAPI, void, model_task_end_2,          (void),                    (ITT_NO_PARAMS),         model_task_end_2,          __itt_group_model, \"no args\")\nITT_STUBV(ITTAPI, void, model_lock_acquire_2,      (void *lock),              (ITT_FORMAT lock),       model_lock_acquire_2,      __itt_group_model, \"%p\")\nITT_STUBV(ITTAPI, void, model_lock_release_2,      (void *lock),              (ITT_FORMAT lock),       model_lock_release_2,      __itt_group_model, \"%p\")\nITT_STUBV(ITTAPI, void, model_aggregate_task,      (size_t count),            (ITT_FORMAT count),      model_aggregate_task,      __itt_group_model, \"%d\")\nITT_STUBV(ITTAPI, void, model_disable_push,        (__itt_model_disable x),   (ITT_FORMAT x),          model_disable_push,        __itt_group_model, \"%p\")\nITT_STUBV(ITTAPI, void, model_disable_pop,         (void),                    (ITT_NO_PARAMS),         model_disable_pop,         __itt_group_model, \"no args\")\n#endif /* __ITT_INTERNAL_BODY */\n\n#ifndef __ITT_INTERNAL_BODY\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUB(ITTAPI, __itt_heap_function, heap_function_createA, (const char    *name, const char    *domain), (ITT_FORMAT name, domain), heap_function_createA, __itt_group_heap, \"\\\"%s\\\", \\\"%s\\\"\")\nITT_STUB(ITTAPI, __itt_heap_function, heap_function_createW, (const wchar_t *name, const wchar_t *domain), (ITT_FORMAT name, domain), heap_function_createW, __itt_group_heap, \"\\\"%s\\\", \\\"%s\\\"\")\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nITT_STUB(ITTAPI, __itt_heap_function, heap_function_create,  (const char    *name, const char    *domain), (ITT_FORMAT name, domain), heap_function_create,  __itt_group_heap, \"\\\"%s\\\", \\\"%s\\\"\")\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* __ITT_INTERNAL_BODY */\nITT_STUBV(ITTAPI, void, heap_allocate_begin,   (__itt_heap_function h, size_t size, int initialized),             (ITT_FORMAT h, size, initialized),       heap_allocate_begin, __itt_group_heap, \"%p, %lu, %d\")\nITT_STUBV(ITTAPI, void, heap_allocate_end,     (__itt_heap_function h, void** addr, size_t size, int initialized), (ITT_FORMAT h, addr, size, initialized), heap_allocate_end,   __itt_group_heap, \"%p, %p, %lu, %d\")\nITT_STUBV(ITTAPI, void, heap_free_begin,       (__itt_heap_function h, void*  addr), (ITT_FORMAT h, addr), heap_free_begin, __itt_group_heap, \"%p, %p\")\nITT_STUBV(ITTAPI, void, heap_free_end,         (__itt_heap_function h, void*  addr), (ITT_FORMAT h, addr), heap_free_end,   __itt_group_heap, \"%p, %p\")\nITT_STUBV(ITTAPI, void, heap_reallocate_begin, (__itt_heap_function h, void*  addr, size_t new_size, int initialized),                  (ITT_FORMAT h, addr, new_size, initialized),           heap_reallocate_begin, __itt_group_heap, \"%p, %p, %lu, %d\")\nITT_STUBV(ITTAPI, void, heap_reallocate_end,   (__itt_heap_function h, void*  addr, void** new_addr, size_t new_size, int initialized), (ITT_FORMAT h, addr, new_addr, new_size, initialized), heap_reallocate_end,   __itt_group_heap, \"%p, %p, %p, %lu, %d\")\nITT_STUBV(ITTAPI, void, heap_internal_access_begin, (void), (ITT_NO_PARAMS), heap_internal_access_begin, __itt_group_heap, \"no args\")\nITT_STUBV(ITTAPI, void, heap_internal_access_end,   (void), (ITT_NO_PARAMS), heap_internal_access_end,   __itt_group_heap, \"no args\")\nITT_STUBV(ITTAPI, void, heap_record_memory_growth_begin, (void), (ITT_NO_PARAMS), heap_record_memory_growth_begin, __itt_group_heap, \"no args\")\nITT_STUBV(ITTAPI, void, heap_record_memory_growth_end,   (void), (ITT_NO_PARAMS), heap_record_memory_growth_end,   __itt_group_heap, \"no args\")\nITT_STUBV(ITTAPI, void, heap_reset_detection, (unsigned int reset_mask),  (ITT_FORMAT reset_mask), heap_reset_detection, __itt_group_heap, \"%u\")\nITT_STUBV(ITTAPI, void, heap_record,          (unsigned int record_mask), (ITT_FORMAT record_mask),  heap_record,        __itt_group_heap, \"%u\")\n\nITT_STUBV(ITTAPI, void, id_create,  (const __itt_domain *domain, __itt_id id), (ITT_FORMAT domain, id), id_create,  __itt_group_structure, \"%p, %lu\")\nITT_STUBV(ITTAPI, void, id_destroy, (const __itt_domain *domain, __itt_id id), (ITT_FORMAT domain, id), id_destroy, __itt_group_structure, \"%p, %lu\")\n\nITT_STUB(ITTAPI, __itt_timestamp, get_timestamp, (void), (ITT_NO_PARAMS), get_timestamp,  __itt_group_structure, \"no args\")\n\nITT_STUBV(ITTAPI, void, region_begin, (const __itt_domain *domain, __itt_id id, __itt_id parent, __itt_string_handle *name), (ITT_FORMAT domain, id, parent, name), region_begin, __itt_group_structure, \"%p, %lu, %lu, %p\")\nITT_STUBV(ITTAPI, void, region_end,   (const __itt_domain *domain, __itt_id id),                                             (ITT_FORMAT domain, id),               region_end,   __itt_group_structure, \"%p, %lu\")\n\n#ifndef __ITT_INTERNAL_BODY\nITT_STUBV(ITTAPI, void, frame_begin_v3,  (const __itt_domain *domain, __itt_id *id),                                             (ITT_FORMAT domain, id),             frame_begin_v3,  __itt_group_structure, \"%p, %p\")\nITT_STUBV(ITTAPI, void, frame_end_v3,    (const __itt_domain *domain, __itt_id *id),                                             (ITT_FORMAT domain, id),             frame_end_v3,    __itt_group_structure, \"%p, %p\")\nITT_STUBV(ITTAPI, void, frame_submit_v3, (const __itt_domain *domain, __itt_id *id, __itt_timestamp begin, __itt_timestamp end), (ITT_FORMAT domain, id, begin, end), frame_submit_v3, __itt_group_structure, \"%p, %p, %lu, %lu\")\n#endif /* __ITT_INTERNAL_BODY */\n\nITT_STUBV(ITTAPI, void, task_group,   (const __itt_domain *domain, __itt_id id, __itt_id parent, __itt_string_handle *name), (ITT_FORMAT domain, id, parent, name), task_group,  __itt_group_structure, \"%p, %lu, %lu, %p\")\n\nITT_STUBV(ITTAPI, void, task_begin,    (const __itt_domain *domain, __itt_id id, __itt_id parent, __itt_string_handle *name), (ITT_FORMAT domain, id, parent, name), task_begin,    __itt_group_structure, \"%p, %lu, %lu, %p\")\nITT_STUBV(ITTAPI, void, task_begin_fn, (const __itt_domain *domain, __itt_id id, __itt_id parent, void* fn),                  (ITT_FORMAT domain, id, parent, fn),   task_begin_fn, __itt_group_structure, \"%p, %lu, %lu, %p\")\nITT_STUBV(ITTAPI, void, task_end,      (const __itt_domain *domain),                                                          (ITT_FORMAT domain),                   task_end,      __itt_group_structure, \"%p\")\n\nITT_STUBV(ITTAPI, void, counter_inc_v3,       (const __itt_domain *domain, __itt_string_handle *name),                           (ITT_FORMAT domain, name),        counter_inc_v3,       __itt_group_structure, \"%p, %p\")\nITT_STUBV(ITTAPI, void, counter_inc_delta_v3, (const __itt_domain *domain, __itt_string_handle *name, unsigned long long value), (ITT_FORMAT domain, name, value), counter_inc_delta_v3, __itt_group_structure, \"%p, %p, %lu\")\n\nITT_STUBV(ITTAPI, void, marker, (const __itt_domain *domain, __itt_id id, __itt_string_handle *name, __itt_scope scope), (ITT_FORMAT domain, id, name, scope), marker, __itt_group_structure, \"%p, %lu, %p, %d\")\n\nITT_STUBV(ITTAPI, void, metadata_add,      (const __itt_domain *domain, __itt_id id, __itt_string_handle *key, __itt_metadata_type type, size_t count, void *data), (ITT_FORMAT domain, id, key, type, count, data), metadata_add, __itt_group_structure, \"%p, %lu, %p, %d, %lu, %p\")\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUBV(ITTAPI, void, metadata_str_addA, (const __itt_domain *domain, __itt_id id, __itt_string_handle *key, const char* data, size_t length),    (ITT_FORMAT domain, id, key, data, length), metadata_str_addA, __itt_group_structure, \"%p, %lu, %p, %p, %lu\")\nITT_STUBV(ITTAPI, void, metadata_str_addW, (const __itt_domain *domain, __itt_id id, __itt_string_handle *key, const wchar_t* data, size_t length), (ITT_FORMAT domain, id, key, data, length), metadata_str_addW, __itt_group_structure, \"%p, %lu, %p, %p, %lu\")\n#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */\nITT_STUBV(ITTAPI, void, metadata_str_add,  (const __itt_domain *domain, __itt_id id, __itt_string_handle *key, const char* data, size_t length),    (ITT_FORMAT domain, id, key, data, length), metadata_str_add,  __itt_group_structure, \"%p, %lu, %p, %p, %lu\")\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\nITT_STUBV(ITTAPI, void, relation_add_to_current, (const __itt_domain *domain, __itt_relation relation, __itt_id tail),                (ITT_FORMAT domain, relation, tail),       relation_add_to_current, __itt_group_structure, \"%p, %lu, %p\")\nITT_STUBV(ITTAPI, void, relation_add,            (const __itt_domain *domain, __itt_id head, __itt_relation relation, __itt_id tail), (ITT_FORMAT domain, head, relation, tail), relation_add,            __itt_group_structure, \"%p, %p, %lu, %p\")\n\n#ifndef __ITT_INTERNAL_BODY\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUB(LIBITTAPI, __itt_event, event_createA, (const char    *name, int namelen), (ITT_FORMAT name, namelen), event_createA, __itt_group_mark | __itt_group_legacy, \"\\\"%s\\\", %d\")\nITT_STUB(LIBITTAPI, __itt_event, event_createW, (const wchar_t *name, int namelen), (ITT_FORMAT name, namelen), event_createW, __itt_group_mark | __itt_group_legacy, \"\\\"%S\\\", %d\")\n#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */\nITT_STUB(LIBITTAPI, __itt_event, event_create,  (const char    *name, int namelen), (ITT_FORMAT name, namelen), event_create,  __itt_group_mark | __itt_group_legacy, \"\\\"%s\\\", %d\")\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nITT_STUB(LIBITTAPI, int,  event_start,          (__itt_event event),                (ITT_FORMAT event),         event_start,   __itt_group_mark | __itt_group_legacy, \"%d\")\nITT_STUB(LIBITTAPI, int,  event_end,            (__itt_event event),                (ITT_FORMAT event),         event_end,     __itt_group_mark | __itt_group_legacy, \"%d\")\n#endif /* __ITT_INTERNAL_BODY */\n\n#ifndef __ITT_INTERNAL_BODY\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUBV(ITTAPI, void, sync_set_nameA, (void *addr, const char    *objtype, const char    *objname, int attribute), (ITT_FORMAT addr, objtype, objname, attribute), sync_set_nameA, __itt_group_sync | __itt_group_fsync | __itt_group_legacy, \"%p, \\\"%s\\\", \\\"%s\\\", %x\")\nITT_STUBV(ITTAPI, void, sync_set_nameW, (void *addr, const wchar_t *objtype, const wchar_t *objname, int attribute), (ITT_FORMAT addr, objtype, objname, attribute), sync_set_nameW, __itt_group_sync | __itt_group_fsync | __itt_group_legacy, \"%p, \\\"%S\\\", \\\"%S\\\", %x\")\n#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */\nITT_STUBV(ITTAPI, void, sync_set_name,  (void *addr, const char    *objtype, const char    *objname, int attribute), (ITT_FORMAT addr, objtype, objname, attribute), sync_set_name,  __itt_group_sync | __itt_group_fsync | __itt_group_legacy, \"p, \\\"%s\\\", \\\"%s\\\", %x\")\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUB(LIBITTAPI, int, notify_sync_nameA, (void *p, const char    *objtype, int typelen, const char    *objname, int namelen, int attribute), (ITT_FORMAT p, objtype, typelen, objname, namelen, attribute), notify_sync_nameA, __itt_group_sync | __itt_group_fsync | __itt_group_legacy, \"%p, \\\"%s\\\", %d, \\\"%s\\\", %d, %x\")\nITT_STUB(LIBITTAPI, int, notify_sync_nameW, (void *p, const wchar_t *objtype, int typelen, const wchar_t *objname, int namelen, int attribute), (ITT_FORMAT p, objtype, typelen, objname, namelen, attribute), notify_sync_nameW, __itt_group_sync | __itt_group_fsync | __itt_group_legacy, \"%p, \\\"%S\\\", %d, \\\"%S\\\", %d, %x\")\n#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */\nITT_STUB(LIBITTAPI, int, notify_sync_name,  (void *p, const char    *objtype, int typelen, const char    *objname, int namelen, int attribute), (ITT_FORMAT p, objtype, typelen, objname, namelen, attribute), notify_sync_name,  __itt_group_sync | __itt_group_fsync | __itt_group_legacy, \"%p, \\\"%s\\\", %d, \\\"%s\\\", %d, %x\")\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\nITT_STUBV(LIBITTAPI, void, notify_sync_prepare,   (void *p), (ITT_FORMAT p), notify_sync_prepare,   __itt_group_sync | __itt_group_fsync | __itt_group_legacy, \"%p\")\nITT_STUBV(LIBITTAPI, void, notify_sync_cancel,    (void *p), (ITT_FORMAT p), notify_sync_cancel,    __itt_group_sync | __itt_group_fsync | __itt_group_legacy, \"%p\")\nITT_STUBV(LIBITTAPI, void, notify_sync_acquired,  (void *p), (ITT_FORMAT p), notify_sync_acquired,  __itt_group_sync | __itt_group_fsync | __itt_group_legacy, \"%p\")\nITT_STUBV(LIBITTAPI, void, notify_sync_releasing, (void *p), (ITT_FORMAT p), notify_sync_releasing, __itt_group_sync | __itt_group_fsync | __itt_group_legacy, \"%p\")\n#endif /* __ITT_INTERNAL_BODY */\n\nITT_STUBV(LIBITTAPI, void, memory_read,   (void *addr, size_t size), (ITT_FORMAT addr, size), memory_read,   __itt_group_legacy, \"%p, %lu\")\nITT_STUBV(LIBITTAPI, void, memory_write,  (void *addr, size_t size), (ITT_FORMAT addr, size), memory_write,  __itt_group_legacy, \"%p, %lu\")\nITT_STUBV(LIBITTAPI, void, memory_update, (void *addr, size_t size), (ITT_FORMAT addr, size), memory_update, __itt_group_legacy, \"%p, %lu\")\n\nITT_STUB(LIBITTAPI, __itt_state_t,     state_get,    (void),                                    (ITT_NO_PARAMS),   state_get,    __itt_group_legacy, \"no args\")\nITT_STUB(LIBITTAPI, __itt_state_t,     state_set,    (__itt_state_t s),                         (ITT_FORMAT s),    state_set,    __itt_group_legacy, \"%d\")\nITT_STUB(LIBITTAPI, __itt_obj_state_t, obj_mode_set, (__itt_obj_prop_t p, __itt_obj_state_t s), (ITT_FORMAT p, s), obj_mode_set, __itt_group_legacy, \"%d, %d\")\nITT_STUB(LIBITTAPI, __itt_thr_state_t, thr_mode_set, (__itt_thr_prop_t p, __itt_thr_state_t s), (ITT_FORMAT p, s), thr_mode_set, __itt_group_legacy, \"%d, %d\")\n\n#ifndef __ITT_INTERNAL_BODY\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUB(ITTAPI, __itt_frame, frame_createA, (const char    *domain), (ITT_FORMAT domain), frame_createA, __itt_group_frame, \"\\\"%s\\\"\")\nITT_STUB(ITTAPI, __itt_frame, frame_createW, (const wchar_t *domain), (ITT_FORMAT domain), frame_createW, __itt_group_frame, \"\\\"%s\\\"\")\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nITT_STUB(ITTAPI, __itt_frame, frame_create,  (const char    *domain), (ITT_FORMAT domain), frame_create,  __itt_group_frame, \"\\\"%s\\\"\")\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* __ITT_INTERNAL_BODY */\nITT_STUBV(ITTAPI, void, frame_begin,         (__itt_frame frame),     (ITT_FORMAT frame),  frame_begin,   __itt_group_frame, \"%p\")\nITT_STUBV(ITTAPI, void, frame_end,           (__itt_frame frame),     (ITT_FORMAT frame),  frame_end,     __itt_group_frame, \"%p\")\n\n#ifndef __ITT_INTERNAL_BODY\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUB(ITTAPI, __itt_counter, counter_createA, (const char    *name, const char    *domain), (ITT_FORMAT name, domain), counter_createA, __itt_group_counter, \"\\\"%s\\\", \\\"%s\\\"\")\nITT_STUB(ITTAPI, __itt_counter, counter_createW, (const wchar_t *name, const wchar_t *domain), (ITT_FORMAT name, domain), counter_createW, __itt_group_counter, \"\\\"%s\\\", \\\"%s\\\"\")\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nITT_STUB(ITTAPI, __itt_counter, counter_create,  (const char    *name, const char    *domain), (ITT_FORMAT name, domain), counter_create,  __itt_group_counter, \"\\\"%s\\\", \\\"%s\\\"\")\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* __ITT_INTERNAL_BODY */\nITT_STUBV(ITTAPI, void, counter_destroy,   (__itt_counter id),                           (ITT_FORMAT id),        counter_destroy,   __itt_group_counter, \"%p\")\nITT_STUBV(ITTAPI, void, counter_inc,       (__itt_counter id),                           (ITT_FORMAT id),        counter_inc,       __itt_group_counter, \"%p\")\nITT_STUBV(ITTAPI, void, counter_inc_delta, (__itt_counter id, unsigned long long value), (ITT_FORMAT id, value), counter_inc_delta, __itt_group_counter, \"%p, %lu\")\n\n#ifndef __ITT_INTERNAL_BODY\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUB(ITTAPI, __itt_mark_type, mark_createA, (const char    *name), (ITT_FORMAT name), mark_createA, __itt_group_mark, \"\\\"%s\\\"\")\nITT_STUB(ITTAPI, __itt_mark_type, mark_createW, (const wchar_t *name), (ITT_FORMAT name), mark_createW, __itt_group_mark, \"\\\"%S\\\"\")\n#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */\nITT_STUB(ITTAPI, __itt_mark_type, mark_create,  (const char    *name), (ITT_FORMAT name), mark_create,  __itt_group_mark, \"\\\"%s\\\"\")\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* __ITT_INTERNAL_BODY */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUB(ITTAPI, int,  markA,        (__itt_mark_type mt, const char    *parameter), (ITT_FORMAT mt, parameter), markA, __itt_group_mark, \"%d, \\\"%s\\\"\")\nITT_STUB(ITTAPI, int,  markW,        (__itt_mark_type mt, const wchar_t *parameter), (ITT_FORMAT mt, parameter), markW, __itt_group_mark, \"%d, \\\"%S\\\"\")\n#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */\nITT_STUB(ITTAPI, int,  mark,         (__itt_mark_type mt, const char    *parameter), (ITT_FORMAT mt, parameter), mark,  __itt_group_mark, \"%d, \\\"%s\\\"\")\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nITT_STUB(ITTAPI, int,  mark_off, (__itt_mark_type mt), (ITT_FORMAT mt), mark_off, __itt_group_mark, \"%d\")\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUB(ITTAPI, int,  mark_globalA, (__itt_mark_type mt, const char    *parameter), (ITT_FORMAT mt, parameter), mark_globalA, __itt_group_mark, \"%d, \\\"%s\\\"\")\nITT_STUB(ITTAPI, int,  mark_globalW, (__itt_mark_type mt, const wchar_t *parameter), (ITT_FORMAT mt, parameter), mark_globalW, __itt_group_mark, \"%d, \\\"%S\\\"\")\n#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */\nITT_STUB(ITTAPI, int,  mark_global,  (__itt_mark_type mt, const char    *parameter), (ITT_FORMAT mt, parameter), mark_global,  __itt_group_mark, \"%d, \\\"%S\\\"\")\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nITT_STUB(ITTAPI, int,  mark_global_off, (__itt_mark_type mt),                        (ITT_FORMAT mt),            mark_global_off, __itt_group_mark, \"%d\")\n\n#ifndef __ITT_INTERNAL_BODY\nITT_STUB(ITTAPI, __itt_caller, stack_caller_create, (void), (ITT_NO_PARAMS), stack_caller_create,  __itt_group_stitch, \"no args\")\n#endif /* __ITT_INTERNAL_BODY */\nITT_STUBV(ITTAPI, void, stack_caller_destroy, (__itt_caller id), (ITT_FORMAT id), stack_caller_destroy, __itt_group_stitch, \"%p\")\nITT_STUBV(ITTAPI, void, stack_callee_enter,   (__itt_caller id), (ITT_FORMAT id), stack_callee_enter,   __itt_group_stitch, \"%p\")\nITT_STUBV(ITTAPI, void, stack_callee_leave,   (__itt_caller id), (ITT_FORMAT id), stack_callee_leave,   __itt_group_stitch, \"%p\")\n\nITT_STUB(ITTAPI,  __itt_clock_domain*, clock_domain_create, (__itt_get_clock_info_fn fn, void* fn_data), (ITT_FORMAT fn, fn_data), clock_domain_create, __itt_group_structure, \"%p, %p\")\nITT_STUBV(ITTAPI, void,                clock_domain_reset,  (void),                                      (ITT_NO_PARAMS),          clock_domain_reset,  __itt_group_structure, \"no args\")\nITT_STUBV(ITTAPI, void, id_create_ex,  (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id), (ITT_FORMAT domain, clock_domain, timestamp, id), id_create_ex,  __itt_group_structure, \"%p, %p, %lu, %lu\")\nITT_STUBV(ITTAPI, void, id_destroy_ex, (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id), (ITT_FORMAT domain, clock_domain, timestamp, id), id_destroy_ex, __itt_group_structure, \"%p, %p, %lu, %lu\")\nITT_STUBV(ITTAPI, void, task_begin_ex,    (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id, __itt_id parentid, __itt_string_handle *name), (ITT_FORMAT domain, clock_domain, timestamp, id, parentid, name), task_begin_ex, __itt_group_structure, \"%p, %p, %lu, %lu, %lu, %p\")\nITT_STUBV(ITTAPI, void, task_begin_fn_ex, (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id, __itt_id parentid, void* fn),                  (ITT_FORMAT domain, clock_domain, timestamp, id, parentid, fn), task_begin_fn_ex, __itt_group_structure, \"%p, %p, %lu, %lu, %lu, %p\")\nITT_STUBV(ITTAPI, void, task_end_ex,      (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp),                                                            (ITT_FORMAT domain, clock_domain, timestamp), task_end_ex, __itt_group_structure, \"%p, %p, %lu\")\nITT_STUBV(ITTAPI, void, task_begin_overlapped,       (const __itt_domain *domain, __itt_id id, __itt_id parent, __itt_string_handle *name),                                                                   (ITT_FORMAT domain, id, parent, name), task_begin_overlapped, __itt_group_structure, \"%p, %lu, %lu, %p\")\nITT_STUBV(ITTAPI, void, task_begin_overlapped_ex,    (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id, __itt_id parentid, __itt_string_handle *name), (ITT_FORMAT domain, clock_domain, timestamp, id, parentid, name), task_begin_overlapped_ex, __itt_group_structure, \"%p, %p, %lu, %lu, %lu, %p\")\nITT_STUBV(ITTAPI, void, task_end_overlapped, (const __itt_domain *domain, __itt_id id),                                                                                                                       (ITT_FORMAT domain, id), task_end_overlapped, __itt_group_structure, \"%p, %lu\")\nITT_STUBV(ITTAPI, void, task_end_overlapped_ex, (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id),                                                    (ITT_FORMAT domain, clock_domain, timestamp, id), task_end_overlapped_ex, __itt_group_structure, \"%p, %p, %lu, %lu\")\nITT_STUBV(ITTAPI, void, marker_ex, (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id id, __itt_string_handle *name, __itt_scope scope), (ITT_FORMAT domain, clock_domain, timestamp, id, name, scope), marker_ex, __itt_group_structure, \"%p, %p, %lu, %lu, %p, %d\")\nITT_STUBV(ITTAPI, void, metadata_add_with_scope, (const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, __itt_metadata_type type, size_t count, void *data), (ITT_FORMAT domain, scope, key, type, count, data), metadata_add_with_scope, __itt_group_structure, \"%p, %d, %p, %d, %lu, %p\")\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUBV(ITTAPI, void, metadata_str_add_with_scopeA, (const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, const char *data, size_t length),    (ITT_FORMAT domain, scope, key, data, length), metadata_str_add_with_scopeA, __itt_group_structure, \"%p, %d, %p, %p, %lu\")\nITT_STUBV(ITTAPI, void, metadata_str_add_with_scopeW, (const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, const wchar_t *data, size_t length), (ITT_FORMAT domain, scope, key, data, length), metadata_str_add_with_scopeW, __itt_group_structure, \"%p, %d, %p, %p, %lu\")\n#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */\nITT_STUBV(ITTAPI, void, metadata_str_add_with_scope,  (const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, const char *data, size_t length),    (ITT_FORMAT domain, scope, key, data, length), metadata_str_add_with_scope,  __itt_group_structure, \"%p, %d, %p, %p, %lu\")\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nITT_STUBV(ITTAPI, void, relation_add_to_current_ex, (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_relation relation, __itt_id tail),                (ITT_FORMAT domain, clock_domain, timestamp, relation, tail),       relation_add_to_current_ex, __itt_group_structure, \"%p, %p, %lu, %d, %lu\")\nITT_STUBV(ITTAPI, void, relation_add_ex,            (const __itt_domain *domain, __itt_clock_domain* clock_domain, unsigned long long timestamp, __itt_id head, __itt_relation relation, __itt_id tail), (ITT_FORMAT domain, clock_domain, timestamp, head, relation, tail), relation_add_ex,            __itt_group_structure, \"%p, %p, %lu, %lu, %d, %lu\")\nITT_STUB(ITTAPI,  __itt_track_group*, track_group_create, (__itt_string_handle* name, __itt_track_group_type track_group_type),                    (ITT_FORMAT name, track_group_type),        track_group_create, __itt_group_structure, \"%p, %d\")\nITT_STUB(ITTAPI,  __itt_track*,       track_create,       (__itt_track_group* track_group,__itt_string_handle* name, __itt_track_type track_type), (ITT_FORMAT track_group, name, track_type), track_create,       __itt_group_structure, \"%p, %p, %d\")\nITT_STUBV(ITTAPI, void,               set_track,          (__itt_track *track),                                                                    (ITT_FORMAT track),                         set_track,          __itt_group_structure, \"%p\")\n\n#ifndef __ITT_INTERNAL_BODY\nITT_STUB(ITTAPI, const char*, api_version, (void), (ITT_NO_PARAMS), api_version, __itt_group_all & ~__itt_group_legacy, \"no args\")\n#endif /* __ITT_INTERNAL_BODY */\n\n#ifndef __ITT_INTERNAL_BODY\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUB(ITTAPI, int, av_saveA, (void *data, int rank, const int *dimensions, int type, const char *filePath, int columnOrder), (ITT_FORMAT data, rank, dimensions, type, filePath, columnOrder), av_saveA, __itt_group_arrays, \"%p, %d, %p, %d, \\\"%s\\\", %d\")\nITT_STUB(ITTAPI, int, av_saveW, (void *data, int rank, const int *dimensions, int type, const wchar_t *filePath, int columnOrder), (ITT_FORMAT data, rank, dimensions, type, filePath, columnOrder), av_saveW, __itt_group_arrays, \"%p, %d, %p, %d, \\\"%S\\\", %d\")\n#else  /* ITT_PLATFORM!=ITT_PLATFORM_WIN */\nITT_STUB(ITTAPI, int, av_save,  (void *data, int rank, const int *dimensions, int type, const char *filePath, int columnOrder), (ITT_FORMAT data, rank, dimensions, type, filePath, columnOrder), av_save,  __itt_group_arrays, \"%p, %d, %p, %d, \\\"%s\\\", %d\")\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* __ITT_INTERNAL_BODY */\n\n#endif /* __ITT_INTERNAL_INIT */\n"
  },
  {
    "path": "benchmarks/tbb/tools_api/ittnotify_types.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef _ITTNOTIFY_TYPES_H_\n#define _ITTNOTIFY_TYPES_H_\n\ntypedef enum ___itt_group_id\n{\n    __itt_group_none      = 0,\n    __itt_group_legacy    = 1<<0,\n    __itt_group_control   = 1<<1,\n    __itt_group_thread    = 1<<2,\n    __itt_group_mark      = 1<<3,\n    __itt_group_sync      = 1<<4,\n    __itt_group_fsync     = 1<<5,\n    __itt_group_jit       = 1<<6,\n    __itt_group_model     = 1<<7,\n    __itt_group_splitter_min = 1<<7,\n    __itt_group_counter   = 1<<8,\n    __itt_group_frame     = 1<<9,\n    __itt_group_stitch    = 1<<10,\n    __itt_group_heap      = 1<<11,\n    __itt_group_splitter_max = 1<<12,\n    __itt_group_structure = 1<<12,\n    __itt_group_suppress = 1<<13,\n    __itt_group_arrays    = 1<<14,\n    __itt_group_all       = -1\n} __itt_group_id;\n\n#pragma pack(push, 8)\n\ntypedef struct ___itt_group_list\n{\n    __itt_group_id id;\n    const char*    name;\n} __itt_group_list;\n\n#pragma pack(pop)\n\n#define ITT_GROUP_LIST(varname) \\\n    static __itt_group_list varname[] = {       \\\n        { __itt_group_all,       \"all\"       }, \\\n        { __itt_group_control,   \"control\"   }, \\\n        { __itt_group_thread,    \"thread\"    }, \\\n        { __itt_group_mark,      \"mark\"      }, \\\n        { __itt_group_sync,      \"sync\"      }, \\\n        { __itt_group_fsync,     \"fsync\"     }, \\\n        { __itt_group_jit,       \"jit\"       }, \\\n        { __itt_group_model,     \"model\"     }, \\\n        { __itt_group_counter,   \"counter\"   }, \\\n        { __itt_group_frame,     \"frame\"     }, \\\n        { __itt_group_stitch,    \"stitch\"    }, \\\n        { __itt_group_heap,      \"heap\"      }, \\\n        { __itt_group_structure, \"structure\" }, \\\n        { __itt_group_suppress,  \"suppress\"  }, \\\n        { __itt_group_arrays,    \"arrays\"    }, \\\n        { __itt_group_none,      NULL        }  \\\n    }\n\n#endif /* _ITTNOTIFY_TYPES_H_ */\n"
  },
  {
    "path": "benchmarks/tbb/tools_api/legacy/ittnotify.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef _LEGACY_ITTNOTIFY_H_\n#define _LEGACY_ITTNOTIFY_H_\n\n/**\n * @file\n * @brief Legacy User API functions and types\n */\n\n/** @cond exclude_from_documentation */\n#ifndef ITT_OS_WIN\n#  define ITT_OS_WIN   1\n#endif /* ITT_OS_WIN */\n\n#ifndef ITT_OS_LINUX\n#  define ITT_OS_LINUX 2\n#endif /* ITT_OS_LINUX */\n\n#ifndef ITT_OS_MAC\n#  define ITT_OS_MAC   3\n#endif /* ITT_OS_MAC */\n\n#ifndef ITT_OS\n#  if defined WIN32 || defined _WIN32\n#    define ITT_OS ITT_OS_WIN\n#  elif defined( __APPLE__ ) && defined( __MACH__ )\n#    define ITT_OS ITT_OS_MAC\n#  else\n#    define ITT_OS ITT_OS_LINUX\n#  endif\n#endif /* ITT_OS */\n\n#ifndef ITT_PLATFORM_WIN\n#  define ITT_PLATFORM_WIN 1\n#endif /* ITT_PLATFORM_WIN */\n\n#ifndef ITT_PLATFORM_POSIX\n#  define ITT_PLATFORM_POSIX 2\n#endif /* ITT_PLATFORM_POSIX */\n\n#ifndef ITT_PLATFORM_MAC\n#  define ITT_PLATFORM_MAC 3\n#endif /* ITT_PLATFORM_MAC */\n\n#ifndef ITT_PLATFORM\n#  if ITT_OS==ITT_OS_WIN\n#    define ITT_PLATFORM ITT_PLATFORM_WIN\n#  elif ITT_OS==ITT_OS_MAC\n#    define ITT_PLATFORM ITT_PLATFORM_MAC\n#  else\n#    define ITT_PLATFORM ITT_PLATFORM_POSIX\n#  endif\n#endif /* ITT_PLATFORM */\n\n#if defined(_UNICODE) && !defined(UNICODE)\n#define UNICODE\n#endif\n\n#include <stddef.h>\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#include <tchar.h>\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#include <stdint.h>\n#if defined(UNICODE) || defined(_UNICODE)\n#include <wchar.h>\n#endif /* UNICODE || _UNICODE */\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\n#ifndef CDECL\n#  if ITT_PLATFORM==ITT_PLATFORM_WIN\n#    define CDECL __cdecl\n#  else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#    if defined _M_IX86 || defined __i386__ \n#      define CDECL __attribute__ ((cdecl))\n#    else  /* _M_IX86 || __i386__ */\n#      define CDECL /* actual only on x86 platform */\n#    endif /* _M_IX86 || __i386__ */\n#  endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* CDECL */\n\n#ifndef STDCALL\n#  if ITT_PLATFORM==ITT_PLATFORM_WIN\n#    define STDCALL __stdcall\n#  else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#    if defined _M_IX86 || defined __i386__\n#      define STDCALL __attribute__ ((stdcall)) \n#    else  /* _M_IX86 || __i386__ */\n#      define STDCALL /* supported only on x86 platform */\n#    endif /* _M_IX86 || __i386__ */\n#  endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* STDCALL */\n\n#define ITTAPI    CDECL\n#define LIBITTAPI CDECL\n\n/* TODO: Temporary for compatibility! */\n#define ITTAPI_CALL    CDECL\n#define LIBITTAPI_CALL CDECL\n\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n/* use __forceinline (VC++ specific) */\n#define ITT_INLINE           __forceinline\n#define ITT_INLINE_ATTRIBUTE /* nothing */\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n/*\n * Generally, functions are not inlined unless optimization is specified.\n * For functions declared inline, this attribute inlines the function even\n * if no optimization level was specified.\n */\n#ifdef __STRICT_ANSI__\n#define ITT_INLINE           static inline\n#else  /* __STRICT_ANSI__ */\n#define ITT_INLINE           static inline\n#endif /* __STRICT_ANSI__ */\n#define ITT_INLINE_ATTRIBUTE __attribute__ ((always_inline, unused))\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n/** @endcond */\n\n/** @cond exclude_from_documentation */\n/* Helper macro for joining tokens */\n#define ITT_JOIN_AUX(p,n) p##n\n#define ITT_JOIN(p,n)     ITT_JOIN_AUX(p,n)\n\n#ifdef ITT_MAJOR\n#undef ITT_MAJOR\n#endif\n#ifdef ITT_MINOR\n#undef ITT_MINOR\n#endif\n#define ITT_MAJOR     3\n#define ITT_MINOR     0\n\n/* Standard versioning of a token with major and minor version numbers */\n#define ITT_VERSIONIZE(x)    \\\n    ITT_JOIN(x,              \\\n    ITT_JOIN(_,              \\\n    ITT_JOIN(ITT_MAJOR,      \\\n    ITT_JOIN(_, ITT_MINOR))))\n\n#ifndef INTEL_ITTNOTIFY_PREFIX\n#  define INTEL_ITTNOTIFY_PREFIX __itt_\n#endif /* INTEL_ITTNOTIFY_PREFIX */\n#ifndef INTEL_ITTNOTIFY_POSTFIX\n#  define INTEL_ITTNOTIFY_POSTFIX _ptr_\n#endif /* INTEL_ITTNOTIFY_POSTFIX */\n\n#define ITTNOTIFY_NAME_AUX(n) ITT_JOIN(INTEL_ITTNOTIFY_PREFIX,n)\n#define ITTNOTIFY_NAME(n)     ITT_VERSIONIZE(ITTNOTIFY_NAME_AUX(ITT_JOIN(n,INTEL_ITTNOTIFY_POSTFIX)))\n\n#define ITTNOTIFY_VOID(n) (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)\n#define ITTNOTIFY_DATA(n) (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)\n\n#define ITTNOTIFY_VOID_D0(n,d)       (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d)\n#define ITTNOTIFY_VOID_D1(n,d,x)     (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x)\n#define ITTNOTIFY_VOID_D2(n,d,x,y)   (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y)\n#define ITTNOTIFY_VOID_D3(n,d,x,y,z) (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y,z)\n#define ITTNOTIFY_VOID_D4(n,d,x,y,z,a)     (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y,z,a)\n#define ITTNOTIFY_VOID_D5(n,d,x,y,z,a,b)   (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y,z,a,b)\n#define ITTNOTIFY_VOID_D6(n,d,x,y,z,a,b,c) (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y,z,a,b,c)\n#define ITTNOTIFY_DATA_D0(n,d)       (!(d)->flags) ?       0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d)\n#define ITTNOTIFY_DATA_D1(n,d,x)     (!(d)->flags) ?       0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x)\n#define ITTNOTIFY_DATA_D2(n,d,x,y)   (!(d)->flags) ?       0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x,y)\n#define ITTNOTIFY_DATA_D3(n,d,x,y,z) (!(d)->flags) ?       0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x,y,z)\n#define ITTNOTIFY_DATA_D4(n,d,x,y,z,a)     (!(d)->flags) ? 0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x,y,z,a)\n#define ITTNOTIFY_DATA_D5(n,d,x,y,z,a,b)   (!(d)->flags) ? 0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x,y,z,a,b)\n#define ITTNOTIFY_DATA_D6(n,d,x,y,z,a,b,c) (!(d)->flags) ? 0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x,y,z,a,b,c)\n\n#ifdef ITT_STUB\n#undef ITT_STUB\n#endif\n#ifdef ITT_STUBV\n#undef ITT_STUBV\n#endif\n#define ITT_STUBV(api,type,name,args)                             \\\n    typedef type (api* ITT_JOIN(ITTNOTIFY_NAME(name),_t)) args;   \\\n    extern ITT_JOIN(ITTNOTIFY_NAME(name),_t) ITTNOTIFY_NAME(name);\n#define ITT_STUB ITT_STUBV\n/** @endcond */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif /* __cplusplus */\n\n/**\n * @defgroup legacy Legacy API\n * @{\n * @}\n */\n\n/**\n * @defgroup legacy_control Collection Control\n * @ingroup legacy\n * General behavior: application continues to run, but no profiling information is being collected\n *\n * Pausing occurs not only for the current thread but for all process as well as spawned processes\n * - Intel(R) Parallel Inspector and Intel(R) Inspector XE:\n *   - Does not analyze or report errors that involve memory access.\n *   - Other errors are reported as usual. Pausing data collection in\n *     Intel(R) Parallel Inspector and Intel(R) Inspector XE\n *     only pauses tracing and analyzing memory access.\n *     It does not pause tracing or analyzing threading APIs.\n *   .\n * - Intel(R) Parallel Amplifier and Intel(R) VTune(TM) Amplifier XE:\n *   - Does continue to record when new threads are started.\n *   .\n * - Other effects:\n *   - Possible reduction of runtime overhead.\n *   .\n * @{\n */\n#ifndef _ITTNOTIFY_H_\n/** @brief Pause collection */\nvoid ITTAPI __itt_pause(void);\n/** @brief Resume collection */\nvoid ITTAPI __itt_resume(void);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, pause,   (void))\nITT_STUBV(ITTAPI, void, resume,  (void))\n#define __itt_pause      ITTNOTIFY_VOID(pause)\n#define __itt_pause_ptr  ITTNOTIFY_NAME(pause)\n#define __itt_resume     ITTNOTIFY_VOID(resume)\n#define __itt_resume_ptr ITTNOTIFY_NAME(resume)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_pause()\n#define __itt_pause_ptr  0\n#define __itt_resume()\n#define __itt_resume_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_pause_ptr  0\n#define __itt_resume_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n#endif /* _ITTNOTIFY_H_ */\n/** @} legacy_control group */\n\n/**\n * @defgroup legacy_threads Threads\n * @ingroup legacy\n * Threads group\n * @warning Legacy API\n * @{\n */\n/**\n * @deprecated Legacy API\n * @brief Set name to be associated with thread in analysis GUI.\n * @return __itt_err upon failure (name or namelen being null,name and namelen mismatched)\n */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nint LIBITTAPI __itt_thr_name_setA(const char    *name, int namelen);\nint LIBITTAPI __itt_thr_name_setW(const wchar_t *name, int namelen);\n#if defined(UNICODE) || defined(_UNICODE)\n#  define __itt_thr_name_set     __itt_thr_name_setW\n#  define __itt_thr_name_set_ptr __itt_thr_name_setW_ptr\n#else\n#  define __itt_thr_name_set     __itt_thr_name_setA\n#  define __itt_thr_name_set_ptr __itt_thr_name_setA_ptr\n#endif /* UNICODE */\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nint LIBITTAPI __itt_thr_name_set(const char *name, int namelen);\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUB(LIBITTAPI, int, thr_name_setA, (const char    *name, int namelen))\nITT_STUB(LIBITTAPI, int, thr_name_setW, (const wchar_t *name, int namelen))\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nITT_STUB(LIBITTAPI, int, thr_name_set,  (const char    *name, int namelen))\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_thr_name_setA     ITTNOTIFY_DATA(thr_name_setA)\n#define __itt_thr_name_setA_ptr ITTNOTIFY_NAME(thr_name_setA)\n#define __itt_thr_name_setW     ITTNOTIFY_DATA(thr_name_setW)\n#define __itt_thr_name_setW_ptr ITTNOTIFY_NAME(thr_name_setW)\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_thr_name_set     ITTNOTIFY_DATA(thr_name_set)\n#define __itt_thr_name_set_ptr ITTNOTIFY_NAME(thr_name_set)\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_thr_name_setA(name, namelen)\n#define __itt_thr_name_setA_ptr 0\n#define __itt_thr_name_setW(name, namelen)\n#define __itt_thr_name_setW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_thr_name_set(name, namelen)\n#define __itt_thr_name_set_ptr 0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_thr_name_setA_ptr 0\n#define __itt_thr_name_setW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_thr_name_set_ptr 0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @deprecated Legacy API\n * @brief Mark current thread as ignored from this point on, for the duration of its existence.\n */\nvoid LIBITTAPI __itt_thr_ignore(void);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(LIBITTAPI, void, thr_ignore, (void))\n#define __itt_thr_ignore     ITTNOTIFY_VOID(thr_ignore)\n#define __itt_thr_ignore_ptr ITTNOTIFY_NAME(thr_ignore)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_thr_ignore()\n#define __itt_thr_ignore_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_thr_ignore_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n/** @} legacy_threads group */\n\n/**\n * @defgroup legacy_sync Synchronization\n * @ingroup legacy\n * Synchronization group\n * @warning Legacy API\n * @{\n */\n/**\n * @hideinitializer\n * @brief possible value of attribute argument for sync object type\n */\n#define __itt_attr_barrier 1\n\n/**\n * @hideinitializer\n * @brief possible value of attribute argument for sync object type\n */\n#define __itt_attr_mutex   2\n\n/**\n * @deprecated Legacy API\n * @brief Assign a name to a sync object using char or Unicode string\n * @param[in] addr    - pointer to the sync object. You should use a real pointer to your object\n *                      to make sure that the values don't clash with other object addresses\n * @param[in] objtype - null-terminated object type string. If NULL is passed, the object will\n *                      be assumed to be of generic \"User Synchronization\" type\n * @param[in] objname - null-terminated object name string. If NULL, no name will be assigned\n *                      to the object -- you can use the __itt_sync_rename call later to assign\n *                      the name\n * @param[in] attribute - one of [#__itt_attr_barrier, #__itt_attr_mutex] values which defines the\n *                      exact semantics of how prepare/acquired/releasing calls work.\n */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nvoid ITTAPI __itt_sync_set_nameA(void *addr, const char    *objtype, const char    *objname, int attribute);\nvoid ITTAPI __itt_sync_set_nameW(void *addr, const wchar_t *objtype, const wchar_t *objname, int attribute);\n#if defined(UNICODE) || defined(_UNICODE)\n#  define __itt_sync_set_name     __itt_sync_set_nameW\n#  define __itt_sync_set_name_ptr __itt_sync_set_nameW_ptr\n#else /* UNICODE */\n#  define __itt_sync_set_name     __itt_sync_set_nameA\n#  define __itt_sync_set_name_ptr __itt_sync_set_nameA_ptr\n#endif /* UNICODE */\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nvoid ITTAPI __itt_sync_set_name(void *addr, const char* objtype, const char* objname, int attribute);\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUBV(ITTAPI, void, sync_set_nameA, (void *addr, const char    *objtype, const char    *objname, int attribute))\nITT_STUBV(ITTAPI, void, sync_set_nameW, (void *addr, const wchar_t *objtype, const wchar_t *objname, int attribute))\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nITT_STUBV(ITTAPI, void, sync_set_name,  (void *addr, const char    *objtype, const char    *objname, int attribute))\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_sync_set_nameA     ITTNOTIFY_VOID(sync_set_nameA)\n#define __itt_sync_set_nameA_ptr ITTNOTIFY_NAME(sync_set_nameA)\n#define __itt_sync_set_nameW     ITTNOTIFY_VOID(sync_set_nameW)\n#define __itt_sync_set_nameW_ptr ITTNOTIFY_NAME(sync_set_nameW)\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_sync_set_name     ITTNOTIFY_VOID(sync_set_name)\n#define __itt_sync_set_name_ptr ITTNOTIFY_NAME(sync_set_name)\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_sync_set_nameA(addr, objtype, objname, attribute)\n#define __itt_sync_set_nameA_ptr 0\n#define __itt_sync_set_nameW(addr, objtype, objname, attribute)\n#define __itt_sync_set_nameW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_sync_set_name(addr, objtype, objname, attribute)\n#define __itt_sync_set_name_ptr 0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_sync_set_nameA_ptr 0\n#define __itt_sync_set_nameW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_sync_set_name_ptr 0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @deprecated Legacy API\n * @brief Assign a name and type to a sync object using char or Unicode string\n * @param[in] addr -      pointer to the sync object. You should use a real pointer to your object\n *                        to make sure that the values don't clash with other object addresses\n * @param[in] objtype -   null-terminated object type string. If NULL is passed, the object will\n *                        be assumed to be of generic \"User Synchronization\" type\n * @param[in] objname -   null-terminated object name string. If NULL, no name will be assigned\n *                        to the object -- you can use the __itt_sync_rename call later to assign\n *                        the name\n * @param[in] typelen, namelen -   a lenght of string for appropriate objtype and objname parameter\n * @param[in] attribute - one of [#__itt_attr_barrier, #__itt_attr_mutex] values which defines the\n *                        exact semantics of how prepare/acquired/releasing calls work.\n * @return __itt_err upon failure (name or namelen being null,name and namelen mismatched)\n */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nint LIBITTAPI __itt_notify_sync_nameA(void *addr, const char    *objtype, int typelen, const char    *objname, int namelen, int attribute);\nint LIBITTAPI __itt_notify_sync_nameW(void *addr, const wchar_t *objtype, int typelen, const wchar_t *objname, int namelen, int attribute);\n#if defined(UNICODE) || defined(_UNICODE)\n#  define __itt_notify_sync_name __itt_notify_sync_nameW\n#else\n#  define __itt_notify_sync_name __itt_notify_sync_nameA\n#endif\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nint LIBITTAPI __itt_notify_sync_name(void *addr, const char *objtype, int typelen, const char *objname, int namelen, int attribute);\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUB(LIBITTAPI, int, notify_sync_nameA, (void *addr, const char    *objtype, int typelen, const char    *objname, int namelen, int attribute))\nITT_STUB(LIBITTAPI, int, notify_sync_nameW, (void *addr, const wchar_t *objtype, int typelen, const wchar_t *objname, int namelen, int attribute))\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nITT_STUB(LIBITTAPI, int, notify_sync_name,  (void *addr, const char    *objtype, int typelen, const char    *objname, int namelen, int attribute))\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_notify_sync_nameA     ITTNOTIFY_DATA(notify_sync_nameA)\n#define __itt_notify_sync_nameA_ptr ITTNOTIFY_NAME(notify_sync_nameA)\n#define __itt_notify_sync_nameW     ITTNOTIFY_DATA(notify_sync_nameW)\n#define __itt_notify_sync_nameW_ptr ITTNOTIFY_NAME(notify_sync_nameW)\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_notify_sync_name     ITTNOTIFY_DATA(notify_sync_name)\n#define __itt_notify_sync_name_ptr ITTNOTIFY_NAME(notify_sync_name)\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_notify_sync_nameA(addr, objtype, typelen, objname, namelen, attribute)\n#define __itt_notify_sync_nameA_ptr 0\n#define __itt_notify_sync_nameW(addr, objtype, typelen, objname, namelen, attribute)\n#define __itt_notify_sync_nameW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_notify_sync_name(addr, objtype, typelen, objname, namelen, attribute)\n#define __itt_notify_sync_name_ptr 0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_notify_sync_nameA_ptr 0\n#define __itt_notify_sync_nameW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_notify_sync_name_ptr 0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @deprecated Legacy API\n * @brief Enter spin loop on user-defined sync object\n */\nvoid LIBITTAPI __itt_notify_sync_prepare(void* addr);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(LIBITTAPI, void, notify_sync_prepare, (void *addr))\n#define __itt_notify_sync_prepare     ITTNOTIFY_VOID(notify_sync_prepare)\n#define __itt_notify_sync_prepare_ptr ITTNOTIFY_NAME(notify_sync_prepare)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_notify_sync_prepare(addr)\n#define __itt_notify_sync_prepare_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_notify_sync_prepare_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @deprecated Legacy API\n * @brief Quit spin loop without acquiring spin object\n */\nvoid LIBITTAPI __itt_notify_sync_cancel(void *addr);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(LIBITTAPI, void, notify_sync_cancel, (void *addr))\n#define __itt_notify_sync_cancel     ITTNOTIFY_VOID(notify_sync_cancel)\n#define __itt_notify_sync_cancel_ptr ITTNOTIFY_NAME(notify_sync_cancel)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_notify_sync_cancel(addr)\n#define __itt_notify_sync_cancel_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_notify_sync_cancel_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @deprecated Legacy API\n * @brief Successful spin loop completion (sync object acquired)\n */\nvoid LIBITTAPI __itt_notify_sync_acquired(void *addr);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(LIBITTAPI, void, notify_sync_acquired, (void *addr))\n#define __itt_notify_sync_acquired     ITTNOTIFY_VOID(notify_sync_acquired)\n#define __itt_notify_sync_acquired_ptr ITTNOTIFY_NAME(notify_sync_acquired)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_notify_sync_acquired(addr)\n#define __itt_notify_sync_acquired_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_notify_sync_acquired_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @deprecated Legacy API\n * @brief Start sync object releasing code. Is called before the lock release call.\n */\nvoid LIBITTAPI __itt_notify_sync_releasing(void* addr);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(LIBITTAPI, void, notify_sync_releasing, (void *addr))\n#define __itt_notify_sync_releasing     ITTNOTIFY_VOID(notify_sync_releasing)\n#define __itt_notify_sync_releasing_ptr ITTNOTIFY_NAME(notify_sync_releasing)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_notify_sync_releasing(addr)\n#define __itt_notify_sync_releasing_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_notify_sync_releasing_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n/** @} legacy_sync group */\n\n#ifndef _ITTNOTIFY_H_\n/**\n * @defgroup legacy_events Events\n * @ingroup legacy\n * Events group\n * @{\n */\n\n/** @brief user event type */\ntypedef int __itt_event;\n\n/**\n * @brief Create an event notification\n * @note name or namelen being null/name and namelen not matching, user event feature not enabled\n * @return non-zero event identifier upon success and __itt_err otherwise\n */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n__itt_event LIBITTAPI __itt_event_createA(const char    *name, int namelen);\n__itt_event LIBITTAPI __itt_event_createW(const wchar_t *name, int namelen);\n#if defined(UNICODE) || defined(_UNICODE)\n#  define __itt_event_create     __itt_event_createW\n#  define __itt_event_create_ptr __itt_event_createW_ptr\n#else\n#  define __itt_event_create     __itt_event_createA\n#  define __itt_event_create_ptr __itt_event_createA_ptr\n#endif /* UNICODE */\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n__itt_event LIBITTAPI __itt_event_create(const char *name, int namelen);\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUB(LIBITTAPI, __itt_event, event_createA, (const char    *name, int namelen))\nITT_STUB(LIBITTAPI, __itt_event, event_createW, (const wchar_t *name, int namelen))\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nITT_STUB(LIBITTAPI, __itt_event, event_create,  (const char *name, int namelen))\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_event_createA     ITTNOTIFY_DATA(event_createA)\n#define __itt_event_createA_ptr ITTNOTIFY_NAME(event_createA)\n#define __itt_event_createW     ITTNOTIFY_DATA(event_createW)\n#define __itt_event_createW_ptr ITTNOTIFY_NAME(event_createW)\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_event_create      ITTNOTIFY_DATA(event_create)\n#define __itt_event_create_ptr  ITTNOTIFY_NAME(event_create)\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_event_createA(name, namelen) (__itt_event)0\n#define __itt_event_createA_ptr 0\n#define __itt_event_createW(name, namelen) (__itt_event)0\n#define __itt_event_createW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_event_create(name, namelen)  (__itt_event)0\n#define __itt_event_create_ptr  0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_event_createA_ptr 0\n#define __itt_event_createW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_event_create_ptr  0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief Record an event occurrence.\n * @return __itt_err upon failure (invalid event id/user event feature not enabled)\n */\nint LIBITTAPI __itt_event_start(__itt_event event);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUB(LIBITTAPI, int, event_start, (__itt_event event))\n#define __itt_event_start     ITTNOTIFY_DATA(event_start)\n#define __itt_event_start_ptr ITTNOTIFY_NAME(event_start)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_event_start(event) (int)0\n#define __itt_event_start_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_event_start_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @brief Record an event end occurrence.\n * @note It is optional if events do not have durations.\n * @return __itt_err upon failure (invalid event id/user event feature not enabled)\n */\nint LIBITTAPI __itt_event_end(__itt_event event);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUB(LIBITTAPI, int, event_end, (__itt_event event))\n#define __itt_event_end     ITTNOTIFY_DATA(event_end)\n#define __itt_event_end_ptr ITTNOTIFY_NAME(event_end)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_event_end(event) (int)0\n#define __itt_event_end_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_event_end_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n/** @} legacy_events group */\n#endif /* _ITTNOTIFY_H_ */\n\n/**\n * @defgroup legacy_memory Memory Accesses\n * @ingroup legacy\n */\n\n/**\n * @deprecated Legacy API\n * @brief Inform the tool of memory accesses on reading\n */\nvoid LIBITTAPI __itt_memory_read(void *addr, size_t size);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(LIBITTAPI, void, memory_read, (void *addr, size_t size))\n#define __itt_memory_read     ITTNOTIFY_VOID(memory_read)\n#define __itt_memory_read_ptr ITTNOTIFY_NAME(memory_read)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_memory_read(addr, size)\n#define __itt_memory_read_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_memory_read_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @deprecated Legacy API\n * @brief Inform the tool of memory accesses on writing\n */\nvoid LIBITTAPI __itt_memory_write(void *addr, size_t size);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(LIBITTAPI, void, memory_write, (void *addr, size_t size))\n#define __itt_memory_write     ITTNOTIFY_VOID(memory_write)\n#define __itt_memory_write_ptr ITTNOTIFY_NAME(memory_write)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_memory_write(addr, size)\n#define __itt_memory_write_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_memory_write_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @deprecated Legacy API\n * @brief Inform the tool of memory accesses on updating\n */\nvoid LIBITTAPI __itt_memory_update(void *address, size_t size);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(LIBITTAPI, void, memory_update, (void *addr, size_t size))\n#define __itt_memory_update     ITTNOTIFY_VOID(memory_update)\n#define __itt_memory_update_ptr ITTNOTIFY_NAME(memory_update)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_memory_update(addr, size)\n#define __itt_memory_update_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_memory_update_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n/** @} legacy_memory group */\n\n/**\n * @defgroup legacy_state Thread and Object States\n * @ingroup legacy\n */\n\n/** @brief state type */\ntypedef int __itt_state_t;\n\n/** @cond exclude_from_documentation */\ntypedef enum __itt_obj_state {\n    __itt_obj_state_err = 0,\n    __itt_obj_state_clr = 1,\n    __itt_obj_state_set = 2,\n    __itt_obj_state_use = 3\n} __itt_obj_state_t;\n\ntypedef enum __itt_thr_state {\n    __itt_thr_state_err = 0,\n    __itt_thr_state_clr = 1,\n    __itt_thr_state_set = 2\n} __itt_thr_state_t;\n\ntypedef enum __itt_obj_prop {\n    __itt_obj_prop_watch    = 1,\n    __itt_obj_prop_ignore   = 2,\n    __itt_obj_prop_sharable = 3\n} __itt_obj_prop_t;\n\ntypedef enum __itt_thr_prop {\n    __itt_thr_prop_quiet = 1\n} __itt_thr_prop_t;\n/** @endcond */\n\n/**\n * @deprecated Legacy API\n * @brief managing thread and object states\n */\n__itt_state_t LIBITTAPI __itt_state_get(void);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUB(ITTAPI, __itt_state_t, state_get, (void))\n#define __itt_state_get     ITTNOTIFY_DATA(state_get)\n#define __itt_state_get_ptr ITTNOTIFY_NAME(state_get)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_state_get(void) (__itt_state_t)0\n#define __itt_state_get_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_state_get_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @deprecated Legacy API\n * @brief managing thread and object states\n */\n__itt_state_t LIBITTAPI __itt_state_set(__itt_state_t s);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUB(ITTAPI, __itt_state_t, state_set, (__itt_state_t s))\n#define __itt_state_set     ITTNOTIFY_DATA(state_set)\n#define __itt_state_set_ptr ITTNOTIFY_NAME(state_set)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_state_set(s) (__itt_state_t)0\n#define __itt_state_set_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_state_set_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @deprecated Legacy API\n * @brief managing thread and object modes\n */\n__itt_thr_state_t LIBITTAPI __itt_thr_mode_set(__itt_thr_prop_t p, __itt_thr_state_t s);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUB(ITTAPI, __itt_thr_state_t, thr_mode_set, (__itt_thr_prop_t p, __itt_thr_state_t s))\n#define __itt_thr_mode_set     ITTNOTIFY_DATA(thr_mode_set)\n#define __itt_thr_mode_set_ptr ITTNOTIFY_NAME(thr_mode_set)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_thr_mode_set(p, s) (__itt_thr_state_t)0\n#define __itt_thr_mode_set_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_thr_mode_set_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/**\n * @deprecated Legacy API\n * @brief managing thread and object modes\n */\n__itt_obj_state_t LIBITTAPI __itt_obj_mode_set(__itt_obj_prop_t p, __itt_obj_state_t s);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUB(ITTAPI, __itt_obj_state_t, obj_mode_set, (__itt_obj_prop_t p, __itt_obj_state_t s))\n#define __itt_obj_mode_set     ITTNOTIFY_DATA(obj_mode_set)\n#define __itt_obj_mode_set_ptr ITTNOTIFY_NAME(obj_mode_set)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_obj_mode_set(p, s) (__itt_obj_state_t)0\n#define __itt_obj_mode_set_ptr 0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_obj_mode_set_ptr 0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n/** @} legacy_state group */\n\n/**\n * @defgroup frames Frames\n * @ingroup legacy\n * Frames group\n * @{\n */\n/**\n * @brief opaque structure for frame identification\n */\ntypedef struct __itt_frame_t *__itt_frame;\n\n/**\n * @brief Create a global frame with given domain\n */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n__itt_frame ITTAPI __itt_frame_createA(const char    *domain);\n__itt_frame ITTAPI __itt_frame_createW(const wchar_t *domain);\n#if defined(UNICODE) || defined(_UNICODE)\n#  define __itt_frame_create     __itt_frame_createW\n#  define __itt_frame_create_ptr __itt_frame_createW_ptr\n#else /* UNICODE */\n#  define __itt_frame_create     __itt_frame_createA\n#  define __itt_frame_create_ptr __itt_frame_createA_ptr\n#endif /* UNICODE */\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n__itt_frame ITTAPI __itt_frame_create(const char *domain);\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\nITT_STUB(ITTAPI, __itt_frame, frame_createA, (const char    *domain))\nITT_STUB(ITTAPI, __itt_frame, frame_createW, (const wchar_t *domain))\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\nITT_STUB(ITTAPI, __itt_frame, frame_create,  (const char *domain))\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_frame_createA     ITTNOTIFY_DATA(frame_createA)\n#define __itt_frame_createA_ptr ITTNOTIFY_NAME(frame_createA)\n#define __itt_frame_createW     ITTNOTIFY_DATA(frame_createW)\n#define __itt_frame_createW_ptr ITTNOTIFY_NAME(frame_createW)\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_frame_create     ITTNOTIFY_DATA(frame_create)\n#define __itt_frame_create_ptr ITTNOTIFY_NAME(frame_create)\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_frame_createA(domain)\n#define __itt_frame_createA_ptr 0\n#define __itt_frame_createW(domain)\n#define __itt_frame_createW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_frame_create(domain)\n#define __itt_frame_create_ptr  0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#define __itt_frame_createA_ptr 0\n#define __itt_frame_createW_ptr 0\n#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#define __itt_frame_create_ptr  0\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n\n/** @brief Record an frame begin occurrence. */\nvoid ITTAPI __itt_frame_begin(__itt_frame frame);\n/** @brief Record an frame end occurrence. */\nvoid ITTAPI __itt_frame_end  (__itt_frame frame);\n\n/** @cond exclude_from_documentation */\n#ifndef INTEL_NO_MACRO_BODY\n#ifndef INTEL_NO_ITTNOTIFY_API\nITT_STUBV(ITTAPI, void, frame_begin, (__itt_frame frame))\nITT_STUBV(ITTAPI, void, frame_end,   (__itt_frame frame))\n#define __itt_frame_begin     ITTNOTIFY_VOID(frame_begin)\n#define __itt_frame_begin_ptr ITTNOTIFY_NAME(frame_begin)\n#define __itt_frame_end       ITTNOTIFY_VOID(frame_end)\n#define __itt_frame_end_ptr   ITTNOTIFY_NAME(frame_end)\n#else  /* INTEL_NO_ITTNOTIFY_API */\n#define __itt_frame_begin(frame)\n#define __itt_frame_begin_ptr 0\n#define __itt_frame_end(frame)\n#define __itt_frame_end_ptr   0\n#endif /* INTEL_NO_ITTNOTIFY_API */\n#else  /* INTEL_NO_MACRO_BODY */\n#define __itt_frame_begin_ptr 0\n#define __itt_frame_end_ptr   0\n#endif /* INTEL_NO_MACRO_BODY */\n/** @endcond */\n/** @} frames group */\n\n#ifdef __cplusplus\n}\n#endif /* __cplusplus */\n\n#endif /* _LEGACY_ITTNOTIFY_H_ */\n"
  },
  {
    "path": "benchmarks/tbb/tools_api/prototype/ittnotify.h",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#ifndef _PROTOTYPE_ITTNOTIFY_H_\n#define _PROTOTYPE_ITTNOTIFY_H_\n\n/**\n * @file\n * @brief Prototype User API functions and types\n */\n\n/** @cond exclude_from_documentation */\n#ifndef ITT_OS_WIN\n#  define ITT_OS_WIN   1\n#endif /* ITT_OS_WIN */\n\n#ifndef ITT_OS_LINUX\n#  define ITT_OS_LINUX 2\n#endif /* ITT_OS_LINUX */\n\n#ifndef ITT_OS_MAC\n#  define ITT_OS_MAC   3\n#endif /* ITT_OS_MAC */\n\n#ifndef ITT_OS\n#  if defined WIN32 || defined _WIN32\n#    define ITT_OS ITT_OS_WIN\n#  elif defined( __APPLE__ ) && defined( __MACH__ )\n#    define ITT_OS ITT_OS_MAC\n#  else\n#    define ITT_OS ITT_OS_LINUX\n#  endif\n#endif /* ITT_OS */\n\n#ifndef ITT_PLATFORM_WIN\n#  define ITT_PLATFORM_WIN 1\n#endif /* ITT_PLATFORM_WIN */\n\n#ifndef ITT_PLATFORM_POSIX\n#  define ITT_PLATFORM_POSIX 2\n#endif /* ITT_PLATFORM_POSIX */\n\n#ifndef ITT_PLATFORM_MAC\n#  define ITT_PLATFORM_MAC 3\n#endif /* ITT_PLATFORM_MAC */\n\n#ifndef ITT_PLATFORM\n#  if ITT_OS==ITT_OS_WIN\n#    define ITT_PLATFORM ITT_PLATFORM_WIN\n#  elif ITT_OS==ITT_OS_MAC\n#    define ITT_PLATFORM ITT_PLATFORM_MAC\n#  else\n#    define ITT_PLATFORM ITT_PLATFORM_POSIX\n#  endif\n#endif /* ITT_PLATFORM */\n\n#if defined(_UNICODE) && !defined(UNICODE)\n#define UNICODE\n#endif\n\n#include <stddef.h>\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n#include <tchar.h>\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#include <stdint.h>\n#if defined(UNICODE) || defined(_UNICODE)\n#include <wchar.h>\n#endif /* UNICODE || _UNICODE */\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n\n#ifndef CDECL\n#  if ITT_PLATFORM==ITT_PLATFORM_WIN\n#    define CDECL __cdecl\n#  else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#    if defined _M_IX86 || defined __i386__ \n#      define CDECL __attribute__ ((cdecl))\n#    else  /* _M_IX86 || __i386__ */\n#      define CDECL /* actual only on x86 platform */\n#    endif /* _M_IX86 || __i386__ */\n#  endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* CDECL */\n\n#ifndef STDCALL\n#  if ITT_PLATFORM==ITT_PLATFORM_WIN\n#    define STDCALL __stdcall\n#  else /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#    if defined _M_IX86 || defined __i386__\n#      define STDCALL __attribute__ ((stdcall)) \n#    else  /* _M_IX86 || __i386__ */\n#      define STDCALL /* supported only on x86 platform */\n#    endif /* _M_IX86 || __i386__ */\n#  endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n#endif /* STDCALL */\n\n#define ITTAPI    CDECL\n#define LIBITTAPI CDECL\n\n/* TODO: Temporary for compatibility! */\n#define ITTAPI_CALL    CDECL\n#define LIBITTAPI_CALL CDECL\n\n#if ITT_PLATFORM==ITT_PLATFORM_WIN\n/* use __forceinline (VC++ specific) */\n#define ITT_INLINE           __forceinline\n#define ITT_INLINE_ATTRIBUTE /* nothing */\n#else  /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n/*\n * Generally, functions are not inlined unless optimization is specified.\n * For functions declared inline, this attribute inlines the function even\n * if no optimization level was specified.\n */\n#ifdef __STRICT_ANSI__\n#define ITT_INLINE           static\n#else  /* __STRICT_ANSI__ */\n#define ITT_INLINE           static inline\n#endif /* __STRICT_ANSI__ */\n#define ITT_INLINE_ATTRIBUTE __attribute__ ((always_inline, unused))\n#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */\n/** @endcond */\n\n/** @cond exclude_from_documentation */\n/* Helper macro for joining tokens */\n#define ITT_JOIN_AUX(p,n) p##n\n#define ITT_JOIN(p,n)     ITT_JOIN_AUX(p,n)\n\n#ifdef ITT_MAJOR\n#undef ITT_MAJOR\n#endif\n#ifdef ITT_MINOR\n#undef ITT_MINOR\n#endif\n#define ITT_MAJOR     3\n#define ITT_MINOR     0\n\n/* Standard versioning of a token with major and minor version numbers */\n#define ITT_VERSIONIZE(x)    \\\n    ITT_JOIN(x,              \\\n    ITT_JOIN(_,              \\\n    ITT_JOIN(ITT_MAJOR,      \\\n    ITT_JOIN(_, ITT_MINOR))))\n\n#ifndef INTEL_ITTNOTIFY_PREFIX\n#  define INTEL_ITTNOTIFY_PREFIX __itt_\n#endif /* INTEL_ITTNOTIFY_PREFIX */\n#ifndef INTEL_ITTNOTIFY_POSTFIX\n#  define INTEL_ITTNOTIFY_POSTFIX _ptr_\n#endif /* INTEL_ITTNOTIFY_POSTFIX */\n\n#define ITTNOTIFY_NAME_AUX(n) ITT_JOIN(INTEL_ITTNOTIFY_PREFIX,n)\n#define ITTNOTIFY_NAME(n)     ITT_VERSIONIZE(ITTNOTIFY_NAME_AUX(ITT_JOIN(n,INTEL_ITTNOTIFY_POSTFIX)))\n\n#define ITTNOTIFY_VOID(n) (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)\n#define ITTNOTIFY_DATA(n) (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)\n\n#define ITTNOTIFY_VOID_D0(n,d)       (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d)\n#define ITTNOTIFY_VOID_D1(n,d,x)     (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x)\n#define ITTNOTIFY_VOID_D2(n,d,x,y)   (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y)\n#define ITTNOTIFY_VOID_D3(n,d,x,y,z) (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y,z)\n#define ITTNOTIFY_VOID_D4(n,d,x,y,z,a)     (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y,z,a)\n#define ITTNOTIFY_VOID_D5(n,d,x,y,z,a,b)   (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y,z,a,b)\n#define ITTNOTIFY_VOID_D6(n,d,x,y,z,a,b,c) (!(d)->flags) ? (void)0 : (!ITTNOTIFY_NAME(n)) ? (void)0 : ITTNOTIFY_NAME(n)(d,x,y,z,a,b,c)\n#define ITTNOTIFY_DATA_D0(n,d)       (!(d)->flags) ?       0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d)\n#define ITTNOTIFY_DATA_D1(n,d,x)     (!(d)->flags) ?       0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x)\n#define ITTNOTIFY_DATA_D2(n,d,x,y)   (!(d)->flags) ?       0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x,y)\n#define ITTNOTIFY_DATA_D3(n,d,x,y,z) (!(d)->flags) ?       0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x,y,z)\n#define ITTNOTIFY_DATA_D4(n,d,x,y,z,a)     (!(d)->flags) ? 0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x,y,z,a)\n#define ITTNOTIFY_DATA_D5(n,d,x,y,z,a,b)   (!(d)->flags) ? 0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x,y,z,a,b)\n#define ITTNOTIFY_DATA_D6(n,d,x,y,z,a,b,c) (!(d)->flags) ? 0 : (!ITTNOTIFY_NAME(n)) ?       0 : ITTNOTIFY_NAME(n)(d,x,y,z,a,b,c)\n\n#ifdef ITT_STUB\n#undef ITT_STUB\n#endif\n#ifdef ITT_STUBV\n#undef ITT_STUBV\n#endif\n#define ITT_STUBV(api,type,name,args)                             \\\n    typedef type (api* ITT_JOIN(ITTNOTIFY_NAME(name),_t)) args;   \\\n    extern ITT_JOIN(ITTNOTIFY_NAME(name),_t) ITTNOTIFY_NAME(name);\n#define ITT_STUB ITT_STUBV\n/** @endcond */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif /* __cplusplus */\n\n/**\n * @defgroup prototype Prototype API\n * @{\n * @}\n */\n\n#ifdef __cplusplus\n}\n#endif /* __cplusplus */\n\n#endif /* _PROTOTYPE_ITTNOTIFY_H_ */\n"
  },
  {
    "path": "benchmarks/tbb/version_string.ver",
    "content": "#define __TBB_VERSION_STRINGS(N) \"Empty\"\n"
  },
  {
    "path": "benchmarks/tbb/win32-tbb-export.def",
    "content": "; Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n;\n; This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n; you can redistribute it and/or modify it under the terms of the GNU General Public License\n; version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n; distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n; implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n; See  the GNU General Public License for more details.   You should have received a copy of\n; the  GNU General Public License along with Threading Building Blocks; if not, write to the\n; Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n;\n; As a special exception,  you may use this file  as part of a free software library without\n; restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n; functions from this file, or you compile this file and link it with other files to produce\n; an executable,  this file does not by itself cause the resulting executable to be covered\n; by the GNU General Public License. This exception does not however invalidate any other\n; reasons why the executable file might be covered by the GNU General Public License.\n\nEXPORTS\n\n#define __TBB_SYMBOL( sym ) sym\n#if _M_ARM\n#include \"winrt-tbb-export.lst\"\n#else\n#include \"win32-tbb-export.lst\"\n#endif\n\n\n"
  },
  {
    "path": "benchmarks/tbb/win32-tbb-export.lst",
    "content": "; Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n;\n; This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n; you can redistribute it and/or modify it under the terms of the GNU General Public License\n; version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n; distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n; implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n; See  the GNU General Public License for more details.   You should have received a copy of\n; the  GNU General Public License along with Threading Building Blocks; if not, write to the\n; Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n;\n; As a special exception,  you may use this file  as part of a free software library without\n; restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n; functions from this file, or you compile this file and link it with other files to produce\n; an executable,  this file does not by itself cause the resulting executable to be covered\n; by the GNU General Public License. This exception does not however invalidate any other\n; reasons why the executable file might be covered by the GNU General Public License.\n\n#include \"tbb/tbb_config.h\"\n\n// Assembly-language support that is called directly by clients\n// __TBB_SYMBOL( __TBB_machine_cmpswp1 )\n// __TBB_SYMBOL( __TBB_machine_cmpswp2 )\n// __TBB_SYMBOL( __TBB_machine_cmpswp4 )\n__TBB_SYMBOL( __TBB_machine_cmpswp8 )\n// __TBB_SYMBOL( __TBB_machine_fetchadd1 )\n// __TBB_SYMBOL( __TBB_machine_fetchadd2 )\n// __TBB_SYMBOL( __TBB_machine_fetchadd4 )\n__TBB_SYMBOL( __TBB_machine_fetchadd8 )\n// __TBB_SYMBOL( __TBB_machine_fetchstore1 )\n// __TBB_SYMBOL( __TBB_machine_fetchstore2 )\n// __TBB_SYMBOL( __TBB_machine_fetchstore4 )\n__TBB_SYMBOL( __TBB_machine_fetchstore8 )\n__TBB_SYMBOL( __TBB_machine_store8 )\n__TBB_SYMBOL( __TBB_machine_load8 )\n__TBB_SYMBOL( __TBB_machine_trylockbyte )\n__TBB_SYMBOL( __TBB_machine_try_lock_elided )\n__TBB_SYMBOL( __TBB_machine_unlock_elided )\n__TBB_SYMBOL( __TBB_machine_is_in_transaction )\n\n// cache_aligned_allocator.cpp\n__TBB_SYMBOL( ?NFS_Allocate@internal@tbb@@YAPAXIIPAX@Z )\n__TBB_SYMBOL( ?NFS_GetLineSize@internal@tbb@@YAIXZ )\n__TBB_SYMBOL( ?NFS_Free@internal@tbb@@YAXPAX@Z )\n__TBB_SYMBOL( ?allocate_via_handler_v3@internal@tbb@@YAPAXI@Z )\n__TBB_SYMBOL( ?deallocate_via_handler_v3@internal@tbb@@YAXPAX@Z )\n__TBB_SYMBOL( ?is_malloc_used_v3@internal@tbb@@YA_NXZ )\n\n// task.cpp v3\n__TBB_SYMBOL( ?allocate@allocate_additional_child_of_proxy@internal@tbb@@QBEAAVtask@3@I@Z )\n__TBB_SYMBOL( ?allocate@allocate_child_proxy@internal@tbb@@QBEAAVtask@3@I@Z )\n__TBB_SYMBOL( ?allocate@allocate_continuation_proxy@internal@tbb@@QBEAAVtask@3@I@Z )\n__TBB_SYMBOL( ?allocate@allocate_root_proxy@internal@tbb@@SAAAVtask@3@I@Z )\n__TBB_SYMBOL( ?destroy@task_base@internal@interface5@tbb@@SAXAAVtask@4@@Z )\n__TBB_SYMBOL( ?free@allocate_additional_child_of_proxy@internal@tbb@@QBEXAAVtask@3@@Z )\n__TBB_SYMBOL( ?free@allocate_child_proxy@internal@tbb@@QBEXAAVtask@3@@Z )\n__TBB_SYMBOL( ?free@allocate_continuation_proxy@internal@tbb@@QBEXAAVtask@3@@Z )\n__TBB_SYMBOL( ?free@allocate_root_proxy@internal@tbb@@SAXAAVtask@3@@Z )\n__TBB_SYMBOL( ?internal_set_ref_count@task@tbb@@AAEXH@Z )\n__TBB_SYMBOL( ?internal_decrement_ref_count@task@tbb@@AAEHXZ )\n__TBB_SYMBOL( ?is_owned_by_current_thread@task@tbb@@QBE_NXZ )\n__TBB_SYMBOL( ?note_affinity@task@tbb@@UAEXG@Z )\n__TBB_SYMBOL( ?resize@affinity_partitioner_base_v3@internal@tbb@@AAEXI@Z )\n__TBB_SYMBOL( ?self@task@tbb@@SAAAV12@XZ )\n__TBB_SYMBOL( ?spawn_and_wait_for_all@task@tbb@@QAEXAAVtask_list@2@@Z )\n__TBB_SYMBOL( ?default_num_threads@task_scheduler_init@tbb@@SAHXZ )\n__TBB_SYMBOL( ?initialize@task_scheduler_init@tbb@@QAEXHI@Z )\n__TBB_SYMBOL( ?initialize@task_scheduler_init@tbb@@QAEXH@Z )\n__TBB_SYMBOL( ?terminate@task_scheduler_init@tbb@@QAEXXZ )\n#if __TBB_SCHEDULER_OBSERVER\n__TBB_SYMBOL( ?observe@task_scheduler_observer_v3@internal@tbb@@QAEX_N@Z )\n#endif /* __TBB_SCHEDULER_OBSERVER */\n\n#if __TBB_TASK_ARENA\n/* arena.cpp */\n__TBB_SYMBOL( ?internal_current_slot@task_arena_base@internal@interface7@tbb@@KAHXZ )\n__TBB_SYMBOL( ?internal_initialize@task_arena_base@internal@interface7@tbb@@IAEXXZ )\n__TBB_SYMBOL( ?internal_terminate@task_arena_base@internal@interface7@tbb@@IAEXXZ )\n__TBB_SYMBOL( ?internal_enqueue@task_arena_base@internal@interface7@tbb@@IBEXAAVtask@4@H@Z )\n__TBB_SYMBOL( ?internal_execute@task_arena_base@internal@interface7@tbb@@IBEXAAVdelegate_base@234@@Z )\n__TBB_SYMBOL( ?internal_wait@task_arena_base@internal@interface7@tbb@@IBEXXZ )\n#endif /* __TBB_TASK_ARENA */\n\n#if !TBB_NO_LEGACY\n// task_v2.cpp\n__TBB_SYMBOL( ?destroy@task@tbb@@QAEXAAV12@@Z )\n#endif\n\n// exception handling support\n#if __TBB_TASK_GROUP_CONTEXT\n__TBB_SYMBOL( ?allocate@allocate_root_with_context_proxy@internal@tbb@@QBEAAVtask@3@I@Z )\n__TBB_SYMBOL( ?free@allocate_root_with_context_proxy@internal@tbb@@QBEXAAVtask@3@@Z )\n__TBB_SYMBOL( ?change_group@task@tbb@@QAEXAAVtask_group_context@2@@Z )\n__TBB_SYMBOL( ?is_group_execution_cancelled@task_group_context@tbb@@QBE_NXZ )\n__TBB_SYMBOL( ?cancel_group_execution@task_group_context@tbb@@QAE_NXZ )\n__TBB_SYMBOL( ?reset@task_group_context@tbb@@QAEXXZ )\n__TBB_SYMBOL( ?capture_fp_settings@task_group_context@tbb@@QAEXXZ )\n__TBB_SYMBOL( ?init@task_group_context@tbb@@IAEXXZ )\n__TBB_SYMBOL( ?register_pending_exception@task_group_context@tbb@@QAEXXZ )\n__TBB_SYMBOL( ??1task_group_context@tbb@@QAE@XZ )\n#if __TBB_TASK_PRIORITY\n__TBB_SYMBOL( ?set_priority@task_group_context@tbb@@QAEXW4priority_t@2@@Z )\n__TBB_SYMBOL( ?priority@task_group_context@tbb@@QBE?AW4priority_t@2@XZ )\n#endif /* __TBB_TASK_PRIORITY */\n__TBB_SYMBOL( ?name@captured_exception@tbb@@UBEPBDXZ )\n__TBB_SYMBOL( ?what@captured_exception@tbb@@UBEPBDXZ )\n__TBB_SYMBOL( ??1captured_exception@tbb@@UAE@XZ )\n__TBB_SYMBOL( ?move@captured_exception@tbb@@UAEPAV12@XZ )\n__TBB_SYMBOL( ?destroy@captured_exception@tbb@@UAEXXZ )\n__TBB_SYMBOL( ?set@captured_exception@tbb@@QAEXPBD0@Z )\n__TBB_SYMBOL( ?clear@captured_exception@tbb@@QAEXXZ )\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n// Symbols for exceptions thrown from TBB\n__TBB_SYMBOL( ?throw_bad_last_alloc_exception_v4@internal@tbb@@YAXXZ )\n__TBB_SYMBOL( ?throw_exception_v4@internal@tbb@@YAXW4exception_id@12@@Z )\n__TBB_SYMBOL( ?what@bad_last_alloc@tbb@@UBEPBDXZ )\n__TBB_SYMBOL( ?what@missing_wait@tbb@@UBEPBDXZ )\n__TBB_SYMBOL( ?what@invalid_multiple_scheduling@tbb@@UBEPBDXZ )\n__TBB_SYMBOL( ?what@improper_lock@tbb@@UBEPBDXZ )\n__TBB_SYMBOL( ?what@user_abort@tbb@@UBEPBDXZ )\n\n// tbb_misc.cpp\n__TBB_SYMBOL( ?assertion_failure@tbb@@YAXPBDH00@Z )\n__TBB_SYMBOL( ?get_initial_auto_partitioner_divisor@internal@tbb@@YAIXZ )\n__TBB_SYMBOL( ?handle_perror@internal@tbb@@YAXHPBD@Z )\n__TBB_SYMBOL( ?set_assertion_handler@tbb@@YAP6AXPBDH00@ZP6AX0H00@Z@Z )\n__TBB_SYMBOL( ?runtime_warning@internal@tbb@@YAXPBDZZ )\n__TBB_SYMBOL( TBB_runtime_interface_version )\n\n// tbb_main.cpp\n__TBB_SYMBOL( ?itt_load_pointer_with_acquire_v3@internal@tbb@@YAPAXPBX@Z )\n__TBB_SYMBOL( ?itt_store_pointer_with_release_v3@internal@tbb@@YAXPAX0@Z )\n__TBB_SYMBOL( ?call_itt_notify_v5@internal@tbb@@YAXHPAX@Z )\n__TBB_SYMBOL( ?itt_set_sync_name_v3@internal@tbb@@YAXPAXPB_W@Z )\n__TBB_SYMBOL( ?itt_load_pointer_v3@internal@tbb@@YAPAXPBX@Z )\n#if __TBB_ITT_STRUCTURE_API\n__TBB_SYMBOL( ?itt_make_task_group_v7@internal@tbb@@YAXW4itt_domain_enum@12@PAX_K12W4string_index@12@@Z )\n__TBB_SYMBOL( ?itt_metadata_str_add_v7@internal@tbb@@YAXW4itt_domain_enum@12@PAX_KW4string_index@12@PBD@Z )\n__TBB_SYMBOL( ?itt_relation_add_v7@internal@tbb@@YAXW4itt_domain_enum@12@PAX_KW4itt_relation@12@12@Z )\n__TBB_SYMBOL( ?itt_task_begin_v7@internal@tbb@@YAXW4itt_domain_enum@12@PAX_K12W4string_index@12@@Z )\n__TBB_SYMBOL( ?itt_task_end_v7@internal@tbb@@YAXW4itt_domain_enum@12@@Z )\n#endif\n\n// pipeline.cpp\n__TBB_SYMBOL( ??0pipeline@tbb@@QAE@XZ )\n__TBB_SYMBOL( ??1filter@tbb@@UAE@XZ )\n__TBB_SYMBOL( ??1pipeline@tbb@@UAE@XZ )\n__TBB_SYMBOL( ??_7pipeline@tbb@@6B@ )\n__TBB_SYMBOL( ?add_filter@pipeline@tbb@@QAEXAAVfilter@2@@Z )\n__TBB_SYMBOL( ?clear@pipeline@tbb@@QAEXXZ )\n__TBB_SYMBOL( ?inject_token@pipeline@tbb@@AAEXAAVtask@2@@Z )\n__TBB_SYMBOL( ?run@pipeline@tbb@@QAEXI@Z )\n#if __TBB_TASK_GROUP_CONTEXT\n__TBB_SYMBOL( ?run@pipeline@tbb@@QAEXIAAVtask_group_context@2@@Z )\n#endif\n__TBB_SYMBOL( ?process_item@thread_bound_filter@tbb@@QAE?AW4result_type@12@XZ )\n__TBB_SYMBOL( ?try_process_item@thread_bound_filter@tbb@@QAE?AW4result_type@12@XZ )\n__TBB_SYMBOL( ?set_end_of_input@filter@tbb@@IAEXXZ )\n\n// queuing_rw_mutex.cpp\n__TBB_SYMBOL( ?internal_construct@queuing_rw_mutex@tbb@@QAEXXZ )\n__TBB_SYMBOL( ?acquire@scoped_lock@queuing_rw_mutex@tbb@@QAEXAAV23@_N@Z )\n__TBB_SYMBOL( ?downgrade_to_reader@scoped_lock@queuing_rw_mutex@tbb@@QAE_NXZ )\n__TBB_SYMBOL( ?release@scoped_lock@queuing_rw_mutex@tbb@@QAEXXZ )\n__TBB_SYMBOL( ?upgrade_to_writer@scoped_lock@queuing_rw_mutex@tbb@@QAE_NXZ )\n__TBB_SYMBOL( ?try_acquire@scoped_lock@queuing_rw_mutex@tbb@@QAE_NAAV23@_N@Z )\n\n// reader_writer_lock.cpp\n__TBB_SYMBOL( ?try_lock_read@reader_writer_lock@interface5@tbb@@QAE_NXZ )\n__TBB_SYMBOL( ?try_lock@reader_writer_lock@interface5@tbb@@QAE_NXZ )\n__TBB_SYMBOL( ?unlock@reader_writer_lock@interface5@tbb@@QAEXXZ )\n__TBB_SYMBOL( ?lock_read@reader_writer_lock@interface5@tbb@@QAEXXZ )\n__TBB_SYMBOL( ?lock@reader_writer_lock@interface5@tbb@@QAEXXZ )\n__TBB_SYMBOL( ?internal_construct@reader_writer_lock@interface5@tbb@@AAEXXZ )\n__TBB_SYMBOL( ?internal_destroy@reader_writer_lock@interface5@tbb@@AAEXXZ )\n__TBB_SYMBOL( ?internal_construct@scoped_lock@reader_writer_lock@interface5@tbb@@AAEXAAV234@@Z )\n__TBB_SYMBOL( ?internal_destroy@scoped_lock@reader_writer_lock@interface5@tbb@@AAEXXZ )\n__TBB_SYMBOL( ?internal_construct@scoped_lock_read@reader_writer_lock@interface5@tbb@@AAEXAAV234@@Z )\n__TBB_SYMBOL( ?internal_destroy@scoped_lock_read@reader_writer_lock@interface5@tbb@@AAEXXZ )\n\n#if !TBB_NO_LEGACY\n// spin_rw_mutex.cpp v2\n__TBB_SYMBOL( ?internal_acquire_reader@spin_rw_mutex@tbb@@CAXPAV12@@Z )\n__TBB_SYMBOL( ?internal_acquire_writer@spin_rw_mutex@tbb@@CA_NPAV12@@Z )\n__TBB_SYMBOL( ?internal_downgrade@spin_rw_mutex@tbb@@CAXPAV12@@Z )\n__TBB_SYMBOL( ?internal_itt_releasing@spin_rw_mutex@tbb@@CAXPAV12@@Z )\n__TBB_SYMBOL( ?internal_release_reader@spin_rw_mutex@tbb@@CAXPAV12@@Z )\n__TBB_SYMBOL( ?internal_release_writer@spin_rw_mutex@tbb@@CAXPAV12@@Z )\n__TBB_SYMBOL( ?internal_upgrade@spin_rw_mutex@tbb@@CA_NPAV12@@Z )\n__TBB_SYMBOL( ?internal_try_acquire_writer@spin_rw_mutex@tbb@@CA_NPAV12@@Z )\n__TBB_SYMBOL( ?internal_try_acquire_reader@spin_rw_mutex@tbb@@CA_NPAV12@@Z )\n#endif\n\n// spin_rw_mutex v3\n__TBB_SYMBOL( ?internal_construct@spin_rw_mutex_v3@tbb@@AAEXXZ )\n__TBB_SYMBOL( ?internal_upgrade@spin_rw_mutex_v3@tbb@@AAE_NXZ )\n__TBB_SYMBOL( ?internal_downgrade@spin_rw_mutex_v3@tbb@@AAEXXZ )\n__TBB_SYMBOL( ?internal_acquire_reader@spin_rw_mutex_v3@tbb@@AAEXXZ )\n__TBB_SYMBOL( ?internal_acquire_writer@spin_rw_mutex_v3@tbb@@AAE_NXZ )\n__TBB_SYMBOL( ?internal_release_reader@spin_rw_mutex_v3@tbb@@AAEXXZ )\n__TBB_SYMBOL( ?internal_release_writer@spin_rw_mutex_v3@tbb@@AAEXXZ )\n__TBB_SYMBOL( ?internal_try_acquire_reader@spin_rw_mutex_v3@tbb@@AAE_NXZ )\n__TBB_SYMBOL( ?internal_try_acquire_writer@spin_rw_mutex_v3@tbb@@AAE_NXZ )\n\n// x86_rtm_rw_mutex.cpp\n__TBB_SYMBOL( ?internal_construct@x86_rtm_rw_mutex@internal@interface8@tbb@@AAEXXZ ) \n__TBB_SYMBOL( ?internal_release@x86_rtm_rw_mutex@internal@interface8@tbb@@AAEXAAVscoped_lock@1234@@Z ) \n__TBB_SYMBOL( ?internal_acquire_writer@x86_rtm_rw_mutex@internal@interface8@tbb@@AAEXAAVscoped_lock@1234@_N@Z ) \n__TBB_SYMBOL( ?internal_acquire_reader@x86_rtm_rw_mutex@internal@interface8@tbb@@AAEXAAVscoped_lock@1234@_N@Z ) \n__TBB_SYMBOL( ?internal_upgrade@x86_rtm_rw_mutex@internal@interface8@tbb@@AAE_NAAVscoped_lock@1234@@Z ) \n__TBB_SYMBOL( ?internal_downgrade@x86_rtm_rw_mutex@internal@interface8@tbb@@AAE_NAAVscoped_lock@1234@@Z ) \n__TBB_SYMBOL( ?internal_try_acquire_writer@x86_rtm_rw_mutex@internal@interface8@tbb@@AAE_NAAVscoped_lock@1234@@Z ) \n\n// spin_mutex.cpp\n__TBB_SYMBOL( ?internal_construct@spin_mutex@tbb@@QAEXXZ )\n__TBB_SYMBOL( ?internal_acquire@scoped_lock@spin_mutex@tbb@@AAEXAAV23@@Z )\n__TBB_SYMBOL( ?internal_release@scoped_lock@spin_mutex@tbb@@AAEXXZ )\n__TBB_SYMBOL( ?internal_try_acquire@scoped_lock@spin_mutex@tbb@@AAE_NAAV23@@Z )\n\n// mutex.cpp\n__TBB_SYMBOL( ?internal_acquire@scoped_lock@mutex@tbb@@AAEXAAV23@@Z )\n__TBB_SYMBOL( ?internal_release@scoped_lock@mutex@tbb@@AAEXXZ )\n__TBB_SYMBOL( ?internal_try_acquire@scoped_lock@mutex@tbb@@AAE_NAAV23@@Z )\n__TBB_SYMBOL( ?internal_construct@mutex@tbb@@AAEXXZ )\n__TBB_SYMBOL( ?internal_destroy@mutex@tbb@@AAEXXZ )\n\n// recursive_mutex.cpp\n__TBB_SYMBOL( ?internal_acquire@scoped_lock@recursive_mutex@tbb@@AAEXAAV23@@Z )\n__TBB_SYMBOL( ?internal_release@scoped_lock@recursive_mutex@tbb@@AAEXXZ )\n__TBB_SYMBOL( ?internal_try_acquire@scoped_lock@recursive_mutex@tbb@@AAE_NAAV23@@Z )\n__TBB_SYMBOL( ?internal_construct@recursive_mutex@tbb@@AAEXXZ )\n__TBB_SYMBOL( ?internal_destroy@recursive_mutex@tbb@@AAEXXZ )\n\n// queuing_mutex.cpp\n__TBB_SYMBOL( ?internal_construct@queuing_mutex@tbb@@QAEXXZ )\n__TBB_SYMBOL( ?acquire@scoped_lock@queuing_mutex@tbb@@QAEXAAV23@@Z )\n__TBB_SYMBOL( ?release@scoped_lock@queuing_mutex@tbb@@QAEXXZ )\n__TBB_SYMBOL( ?try_acquire@scoped_lock@queuing_mutex@tbb@@QAE_NAAV23@@Z )\n\n// critical_section.cpp\n__TBB_SYMBOL( ?internal_construct@critical_section_v4@internal@tbb@@QAEXXZ )\n\n#if !TBB_NO_LEGACY\n// concurrent_hash_map.cpp\n__TBB_SYMBOL( ?internal_grow_predicate@hash_map_segment_base@internal@tbb@@QBE_NXZ )\n\n// concurrent_queue.cpp v2\n__TBB_SYMBOL( ?advance@concurrent_queue_iterator_base@internal@tbb@@IAEXXZ )\n__TBB_SYMBOL( ?assign@concurrent_queue_iterator_base@internal@tbb@@IAEXABV123@@Z )\n__TBB_SYMBOL( ?internal_size@concurrent_queue_base@internal@tbb@@IBEHXZ )\n__TBB_SYMBOL( ??0concurrent_queue_base@internal@tbb@@IAE@I@Z )\n__TBB_SYMBOL( ??0concurrent_queue_iterator_base@internal@tbb@@IAE@ABVconcurrent_queue_base@12@@Z )\n__TBB_SYMBOL( ??1concurrent_queue_base@internal@tbb@@MAE@XZ )\n__TBB_SYMBOL( ??1concurrent_queue_iterator_base@internal@tbb@@IAE@XZ )\n__TBB_SYMBOL( ?internal_pop@concurrent_queue_base@internal@tbb@@IAEXPAX@Z )\n__TBB_SYMBOL( ?internal_pop_if_present@concurrent_queue_base@internal@tbb@@IAE_NPAX@Z )\n__TBB_SYMBOL( ?internal_push@concurrent_queue_base@internal@tbb@@IAEXPBX@Z )\n__TBB_SYMBOL( ?internal_push_if_not_full@concurrent_queue_base@internal@tbb@@IAE_NPBX@Z )\n__TBB_SYMBOL( ?internal_set_capacity@concurrent_queue_base@internal@tbb@@IAEXHI@Z )\n#endif\n\n// concurrent_queue v3\n__TBB_SYMBOL( ??1concurrent_queue_iterator_base_v3@internal@tbb@@IAE@XZ )\n__TBB_SYMBOL( ??0concurrent_queue_iterator_base_v3@internal@tbb@@IAE@ABVconcurrent_queue_base_v3@12@@Z )\n__TBB_SYMBOL( ??0concurrent_queue_iterator_base_v3@internal@tbb@@IAE@ABVconcurrent_queue_base_v3@12@I@Z )\n__TBB_SYMBOL( ?advance@concurrent_queue_iterator_base_v3@internal@tbb@@IAEXXZ )\n__TBB_SYMBOL( ?assign@concurrent_queue_iterator_base_v3@internal@tbb@@IAEXABV123@@Z )\n__TBB_SYMBOL( ??0concurrent_queue_base_v3@internal@tbb@@IAE@I@Z )\n__TBB_SYMBOL( ??1concurrent_queue_base_v3@internal@tbb@@MAE@XZ )\n__TBB_SYMBOL( ?internal_pop@concurrent_queue_base_v3@internal@tbb@@IAEXPAX@Z )\n__TBB_SYMBOL( ?internal_pop_if_present@concurrent_queue_base_v3@internal@tbb@@IAE_NPAX@Z )\n__TBB_SYMBOL( ?internal_abort@concurrent_queue_base_v3@internal@tbb@@IAEXXZ )\n__TBB_SYMBOL( ?internal_push@concurrent_queue_base_v3@internal@tbb@@IAEXPBX@Z )\n__TBB_SYMBOL( ?internal_push_move@concurrent_queue_base_v8@internal@tbb@@IAEXPBX@Z )\n__TBB_SYMBOL( ?internal_push_if_not_full@concurrent_queue_base_v3@internal@tbb@@IAE_NPBX@Z )\n__TBB_SYMBOL( ?internal_push_move_if_not_full@concurrent_queue_base_v8@internal@tbb@@IAE_NPBX@Z )\n__TBB_SYMBOL( ?internal_size@concurrent_queue_base_v3@internal@tbb@@IBEHXZ )\n__TBB_SYMBOL( ?internal_empty@concurrent_queue_base_v3@internal@tbb@@IBE_NXZ )\n__TBB_SYMBOL( ?internal_set_capacity@concurrent_queue_base_v3@internal@tbb@@IAEXHI@Z )\n__TBB_SYMBOL( ?internal_finish_clear@concurrent_queue_base_v3@internal@tbb@@IAEXXZ )\n__TBB_SYMBOL( ?internal_throw_exception@concurrent_queue_base_v3@internal@tbb@@IBEXXZ )\n__TBB_SYMBOL( ?assign@concurrent_queue_base_v3@internal@tbb@@IAEXABV123@@Z )\n__TBB_SYMBOL( ?move_content@concurrent_queue_base_v8@internal@tbb@@IAEXAAV123@@Z )\n\n#if !TBB_NO_LEGACY\n// concurrent_vector.cpp v2\n__TBB_SYMBOL( ?internal_assign@concurrent_vector_base@internal@tbb@@IAEXABV123@IP6AXPAXI@ZP6AX1PBXI@Z4@Z )\n__TBB_SYMBOL( ?internal_capacity@concurrent_vector_base@internal@tbb@@IBEIXZ )\n__TBB_SYMBOL( ?internal_clear@concurrent_vector_base@internal@tbb@@IAEXP6AXPAXI@Z_N@Z )\n__TBB_SYMBOL( ?internal_copy@concurrent_vector_base@internal@tbb@@IAEXABV123@IP6AXPAXPBXI@Z@Z )\n__TBB_SYMBOL( ?internal_grow_by@concurrent_vector_base@internal@tbb@@IAEIIIP6AXPAXI@Z@Z )\n__TBB_SYMBOL( ?internal_grow_to_at_least@concurrent_vector_base@internal@tbb@@IAEXIIP6AXPAXI@Z@Z )\n__TBB_SYMBOL( ?internal_push_back@concurrent_vector_base@internal@tbb@@IAEPAXIAAI@Z )\n__TBB_SYMBOL( ?internal_reserve@concurrent_vector_base@internal@tbb@@IAEXIII@Z )\n#endif\n\n// concurrent_vector v3\n__TBB_SYMBOL( ??1concurrent_vector_base_v3@internal@tbb@@IAE@XZ )\n__TBB_SYMBOL( ?internal_assign@concurrent_vector_base_v3@internal@tbb@@IAEXABV123@IP6AXPAXI@ZP6AX1PBXI@Z4@Z )\n__TBB_SYMBOL( ?internal_capacity@concurrent_vector_base_v3@internal@tbb@@IBEIXZ )\n__TBB_SYMBOL( ?internal_clear@concurrent_vector_base_v3@internal@tbb@@IAEIP6AXPAXI@Z@Z )\n__TBB_SYMBOL( ?internal_copy@concurrent_vector_base_v3@internal@tbb@@IAEXABV123@IP6AXPAXPBXI@Z@Z )\n__TBB_SYMBOL( ?internal_grow_by@concurrent_vector_base_v3@internal@tbb@@IAEIIIP6AXPAXPBXI@Z1@Z )\n__TBB_SYMBOL( ?internal_grow_to_at_least@concurrent_vector_base_v3@internal@tbb@@IAEXIIP6AXPAXPBXI@Z1@Z )\n__TBB_SYMBOL( ?internal_push_back@concurrent_vector_base_v3@internal@tbb@@IAEPAXIAAI@Z )\n__TBB_SYMBOL( ?internal_reserve@concurrent_vector_base_v3@internal@tbb@@IAEXIII@Z )\n__TBB_SYMBOL( ?internal_compact@concurrent_vector_base_v3@internal@tbb@@IAEPAXIPAXP6AX0I@ZP6AX0PBXI@Z@Z )\n__TBB_SYMBOL( ?internal_swap@concurrent_vector_base_v3@internal@tbb@@IAEXAAV123@@Z )\n__TBB_SYMBOL( ?internal_throw_exception@concurrent_vector_base_v3@internal@tbb@@IBEXI@Z )\n__TBB_SYMBOL( ?internal_resize@concurrent_vector_base_v3@internal@tbb@@IAEXIIIPBXP6AXPAXI@ZP6AX10I@Z@Z )\n__TBB_SYMBOL( ?internal_grow_to_at_least_with_result@concurrent_vector_base_v3@internal@tbb@@IAEIIIP6AXPAXPBXI@Z1@Z )\n\n// tbb_thread\n__TBB_SYMBOL( ?join@tbb_thread_v3@internal@tbb@@QAEXXZ )\n__TBB_SYMBOL( ?detach@tbb_thread_v3@internal@tbb@@QAEXXZ )\n__TBB_SYMBOL( ?internal_start@tbb_thread_v3@internal@tbb@@AAEXP6GIPAX@Z0@Z )\n__TBB_SYMBOL( ?allocate_closure_v3@internal@tbb@@YAPAXI@Z )\n__TBB_SYMBOL( ?free_closure_v3@internal@tbb@@YAXPAX@Z )\n__TBB_SYMBOL( ?hardware_concurrency@tbb_thread_v3@internal@tbb@@SAIXZ )\n__TBB_SYMBOL( ?thread_yield_v3@internal@tbb@@YAXXZ )\n__TBB_SYMBOL( ?thread_sleep_v3@internal@tbb@@YAXABVinterval_t@tick_count@2@@Z )\n__TBB_SYMBOL( ?move_v3@internal@tbb@@YAXAAVtbb_thread_v3@12@0@Z )\n__TBB_SYMBOL( ?thread_get_id_v3@internal@tbb@@YA?AVid@tbb_thread_v3@12@XZ )\n\n// condition_variable\n__TBB_SYMBOL( ?internal_initialize_condition_variable@internal@interface5@tbb@@YAXAATcondvar_impl_t@123@@Z )\n__TBB_SYMBOL( ?internal_condition_variable_wait@internal@interface5@tbb@@YA_NAATcondvar_impl_t@123@PAVmutex@3@PBVinterval_t@tick_count@3@@Z )\n__TBB_SYMBOL( ?internal_condition_variable_notify_one@internal@interface5@tbb@@YAXAATcondvar_impl_t@123@@Z )\n__TBB_SYMBOL( ?internal_condition_variable_notify_all@internal@interface5@tbb@@YAXAATcondvar_impl_t@123@@Z )\n__TBB_SYMBOL( ?internal_destroy_condition_variable@internal@interface5@tbb@@YAXAATcondvar_impl_t@123@@Z )\n\n#undef __TBB_SYMBOL\n"
  },
  {
    "path": "benchmarks/tbb/win64-gcc-tbb-export.def",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n\n{\nglobal:\n\n#define __TBB_SYMBOL( sym ) sym;\n#include \"win64-gcc-tbb-export.lst\"\n\nlocal:\n\n/* TBB symbols */\n*3tbb*;\n*__TBB*;\n\n/* Intel Compiler (libirc) symbols */\n__intel_*;\n_intel_*;\nget_msg_buf;\nget_text_buf;\nmessage_catalog;\nprint_buf;\nirc__get_msg;\nirc__print;\n\n};\n\n"
  },
  {
    "path": "benchmarks/tbb/win64-gcc-tbb-export.lst",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#include \"tbb/tbb_config.h\"\n\n/* cache_aligned_allocator.cpp */\n__TBB_SYMBOL( _ZN3tbb8internal12NFS_AllocateEyyPv ) // MODIFIED LINUX ENTRY\n__TBB_SYMBOL( _ZN3tbb8internal15NFS_GetLineSizeEv )\n__TBB_SYMBOL( _ZN3tbb8internal8NFS_FreeEPv )\n__TBB_SYMBOL( _ZN3tbb8internal23allocate_via_handler_v3Ey ) // MODIFIED LINUX ENTRY\n__TBB_SYMBOL( _ZN3tbb8internal25deallocate_via_handler_v3EPv )\n__TBB_SYMBOL( _ZN3tbb8internal17is_malloc_used_v3Ev )\n\n/* task.cpp v3 */\n__TBB_SYMBOL( _ZN3tbb4task13note_affinityEt )\n__TBB_SYMBOL( _ZN3tbb4task22internal_set_ref_countEi )\n__TBB_SYMBOL( _ZN3tbb4task28internal_decrement_ref_countEv )\n__TBB_SYMBOL( _ZN3tbb4task22spawn_and_wait_for_allERNS_9task_listE )\n__TBB_SYMBOL( _ZN3tbb4task4selfEv )\n__TBB_SYMBOL( _ZN3tbb10interface58internal9task_base7destroyERNS_4taskE )\n__TBB_SYMBOL( _ZNK3tbb4task26is_owned_by_current_threadEv )\n__TBB_SYMBOL( _ZN3tbb8internal19allocate_root_proxy4freeERNS_4taskE )\n__TBB_SYMBOL( _ZN3tbb8internal19allocate_root_proxy8allocateEy ) // MODIFIED LINUX ENTRY\n__TBB_SYMBOL( _ZN3tbb8internal28affinity_partitioner_base_v36resizeEj )\n__TBB_SYMBOL( _ZNK3tbb8internal20allocate_child_proxy4freeERNS_4taskE )\n__TBB_SYMBOL( _ZNK3tbb8internal20allocate_child_proxy8allocateEy ) // MODIFIED LINUX ENTRY\n__TBB_SYMBOL( _ZNK3tbb8internal27allocate_continuation_proxy4freeERNS_4taskE )\n__TBB_SYMBOL( _ZNK3tbb8internal27allocate_continuation_proxy8allocateEy ) // MODIFIED LINUX ENTRY\n__TBB_SYMBOL( _ZNK3tbb8internal34allocate_additional_child_of_proxy4freeERNS_4taskE )\n__TBB_SYMBOL( _ZNK3tbb8internal34allocate_additional_child_of_proxy8allocateEy ) // MODIFIED LINUX ENTRY\n__TBB_SYMBOL( _ZTIN3tbb4taskE )\n__TBB_SYMBOL( _ZTSN3tbb4taskE )\n__TBB_SYMBOL( _ZTVN3tbb4taskE )\n__TBB_SYMBOL( _ZN3tbb19task_scheduler_init19default_num_threadsEv )\n__TBB_SYMBOL( _ZN3tbb19task_scheduler_init10initializeEiy )  // MODIFIED LINUX ENTRY\n__TBB_SYMBOL( _ZN3tbb19task_scheduler_init10initializeEi )\n__TBB_SYMBOL( _ZN3tbb19task_scheduler_init9terminateEv )\n#if __TBB_SCHEDULER_OBSERVER\n__TBB_SYMBOL( _ZN3tbb8internal26task_scheduler_observer_v37observeEb )\n#endif /* __TBB_SCHEDULER_OBSERVER */\n__TBB_SYMBOL( _ZN3tbb10empty_task7executeEv )\n__TBB_SYMBOL( _ZN3tbb10empty_taskD0Ev )\n__TBB_SYMBOL( _ZN3tbb10empty_taskD1Ev )\n__TBB_SYMBOL( _ZTIN3tbb10empty_taskE )\n__TBB_SYMBOL( _ZTSN3tbb10empty_taskE )\n__TBB_SYMBOL( _ZTVN3tbb10empty_taskE )\n\n#if __TBB_TASK_ARENA\n/* arena.cpp */\n__TBB_SYMBOL( _ZN3tbb10interface78internal15task_arena_base19internal_initializeEv )\n__TBB_SYMBOL( _ZN3tbb10interface78internal15task_arena_base18internal_terminateEv )\n__TBB_SYMBOL( _ZNK3tbb10interface78internal15task_arena_base16internal_enqueueERNS_4taskEx )\n__TBB_SYMBOL( _ZNK3tbb10interface78internal15task_arena_base16internal_executeERNS1_13delegate_baseE )\n__TBB_SYMBOL( _ZNK3tbb10interface78internal15task_arena_base13internal_waitEv )\n__TBB_SYMBOL( _ZN3tbb10interface78internal15task_arena_base21internal_current_slotEv )\n#endif /* __TBB_TASK_ARENA */\n\n#if !TBB_NO_LEGACY\n/* task_v2.cpp */\n__TBB_SYMBOL( _ZN3tbb4task7destroyERS0_ )\n#endif /* !TBB_NO_LEGACY */\n\n/* Exception handling in task scheduler */\n#if __TBB_TASK_GROUP_CONTEXT\n__TBB_SYMBOL( _ZNK3tbb8internal32allocate_root_with_context_proxy8allocateEy ) // MODIFIED LINUX ENTRY\n__TBB_SYMBOL( _ZNK3tbb8internal32allocate_root_with_context_proxy4freeERNS_4taskE )\n__TBB_SYMBOL( _ZN3tbb4task12change_groupERNS_18task_group_contextE )\n__TBB_SYMBOL( _ZNK3tbb18task_group_context28is_group_execution_cancelledEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_context22cancel_group_executionEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_context26register_pending_exceptionEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_context5resetEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_context19capture_fp_settingsEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_context4initEv )\n__TBB_SYMBOL( _ZN3tbb18task_group_contextD1Ev )\n__TBB_SYMBOL( _ZN3tbb18task_group_contextD2Ev )\n#if __TBB_TASK_PRIORITY\n__TBB_SYMBOL( _ZN3tbb18task_group_context12set_priorityENS_10priority_tE )\n__TBB_SYMBOL( _ZNK3tbb18task_group_context8priorityEv )\n#endif /* __TBB_TASK_PRIORITY */\n__TBB_SYMBOL( _ZNK3tbb18captured_exception4nameEv )\n__TBB_SYMBOL( _ZNK3tbb18captured_exception4whatEv )\n__TBB_SYMBOL( _ZN3tbb18captured_exception10throw_selfEv )\n__TBB_SYMBOL( _ZN3tbb18captured_exception3setEPKcS2_ )\n__TBB_SYMBOL( _ZN3tbb18captured_exception4moveEv )\n__TBB_SYMBOL( _ZN3tbb18captured_exception5clearEv )\n__TBB_SYMBOL( _ZN3tbb18captured_exception7destroyEv )\n__TBB_SYMBOL( _ZN3tbb18captured_exception8allocateEPKcS2_ )\n__TBB_SYMBOL( _ZN3tbb18captured_exceptionD0Ev )\n__TBB_SYMBOL( _ZN3tbb18captured_exceptionD1Ev )\n__TBB_SYMBOL( _ZN3tbb18captured_exceptionD2Ev )\n__TBB_SYMBOL( _ZTIN3tbb18captured_exceptionE )\n__TBB_SYMBOL( _ZTSN3tbb18captured_exceptionE )\n__TBB_SYMBOL( _ZTVN3tbb18captured_exceptionE )\n__TBB_SYMBOL( _ZN3tbb13tbb_exceptionD2Ev )\n__TBB_SYMBOL( _ZTIN3tbb13tbb_exceptionE )\n__TBB_SYMBOL( _ZTSN3tbb13tbb_exceptionE )\n__TBB_SYMBOL( _ZTVN3tbb13tbb_exceptionE )\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n/* Symbols for exceptions thrown from TBB */\n__TBB_SYMBOL( _ZN3tbb8internal33throw_bad_last_alloc_exception_v4Ev )\n__TBB_SYMBOL( _ZN3tbb8internal18throw_exception_v4ENS0_12exception_idE )\n__TBB_SYMBOL( _ZN3tbb14bad_last_allocD0Ev )\n__TBB_SYMBOL( _ZN3tbb14bad_last_allocD1Ev )\n__TBB_SYMBOL( _ZNK3tbb14bad_last_alloc4whatEv )\n__TBB_SYMBOL( _ZTIN3tbb14bad_last_allocE )\n__TBB_SYMBOL( _ZTSN3tbb14bad_last_allocE )\n__TBB_SYMBOL( _ZTVN3tbb14bad_last_allocE )\n__TBB_SYMBOL( _ZN3tbb12missing_waitD0Ev )\n__TBB_SYMBOL( _ZN3tbb12missing_waitD1Ev )\n__TBB_SYMBOL( _ZNK3tbb12missing_wait4whatEv )\n__TBB_SYMBOL( _ZTIN3tbb12missing_waitE )\n__TBB_SYMBOL( _ZTSN3tbb12missing_waitE )\n__TBB_SYMBOL( _ZTVN3tbb12missing_waitE )\n__TBB_SYMBOL( _ZN3tbb27invalid_multiple_schedulingD0Ev )\n__TBB_SYMBOL( _ZN3tbb27invalid_multiple_schedulingD1Ev )\n__TBB_SYMBOL( _ZNK3tbb27invalid_multiple_scheduling4whatEv )\n__TBB_SYMBOL( _ZTIN3tbb27invalid_multiple_schedulingE )\n__TBB_SYMBOL( _ZTSN3tbb27invalid_multiple_schedulingE )\n__TBB_SYMBOL( _ZTVN3tbb27invalid_multiple_schedulingE )\n__TBB_SYMBOL( _ZN3tbb13improper_lockD0Ev )\n__TBB_SYMBOL( _ZN3tbb13improper_lockD1Ev )\n__TBB_SYMBOL( _ZNK3tbb13improper_lock4whatEv )\n__TBB_SYMBOL( _ZTIN3tbb13improper_lockE )\n__TBB_SYMBOL( _ZTSN3tbb13improper_lockE )\n__TBB_SYMBOL( _ZTVN3tbb13improper_lockE )\n__TBB_SYMBOL( _ZN3tbb10user_abortD0Ev )\n__TBB_SYMBOL( _ZN3tbb10user_abortD1Ev )\n__TBB_SYMBOL( _ZNK3tbb10user_abort4whatEv )\n__TBB_SYMBOL( _ZTIN3tbb10user_abortE )\n__TBB_SYMBOL( _ZTSN3tbb10user_abortE )\n__TBB_SYMBOL( _ZTVN3tbb10user_abortE )\n\n/* tbb_misc.cpp */\n__TBB_SYMBOL( _ZN3tbb17assertion_failureEPKciS1_S1_ )\n__TBB_SYMBOL( _ZN3tbb21set_assertion_handlerEPFvPKciS1_S1_E )\n__TBB_SYMBOL( _ZN3tbb8internal36get_initial_auto_partitioner_divisorEv )\n__TBB_SYMBOL( _ZN3tbb8internal13handle_perrorEiPKc )\n__TBB_SYMBOL( _ZN3tbb8internal15runtime_warningEPKcz )\n__TBB_SYMBOL( TBB_runtime_interface_version )\n\n/* tbb_main.cpp */\n__TBB_SYMBOL( _ZN3tbb8internal32itt_load_pointer_with_acquire_v3EPKv )\n__TBB_SYMBOL( _ZN3tbb8internal33itt_store_pointer_with_release_v3EPvS1_ )\n__TBB_SYMBOL( _ZN3tbb8internal18call_itt_notify_v5EiPv )\n__TBB_SYMBOL( _ZN3tbb8internal20itt_set_sync_name_v3EPvPKc )\n__TBB_SYMBOL( _ZN3tbb8internal19itt_load_pointer_v3EPKv )\n\n/* pipeline.cpp */\n__TBB_SYMBOL( _ZTIN3tbb6filterE )\n__TBB_SYMBOL( _ZTSN3tbb6filterE )\n__TBB_SYMBOL( _ZTVN3tbb6filterE )\n__TBB_SYMBOL( _ZN3tbb6filterD2Ev )\n__TBB_SYMBOL( _ZN3tbb8pipeline10add_filterERNS_6filterE )\n__TBB_SYMBOL( _ZN3tbb8pipeline12inject_tokenERNS_4taskE )\n__TBB_SYMBOL( _ZN3tbb8pipeline13remove_filterERNS_6filterE )\n__TBB_SYMBOL( _ZN3tbb8pipeline3runEy ) // MODIFIED LINUX ENTRY\n#if __TBB_TASK_GROUP_CONTEXT\n__TBB_SYMBOL( _ZN3tbb8pipeline3runEyRNS_18task_group_contextE ) // MODIFIED LINUX ENTRY\n#endif\n__TBB_SYMBOL( _ZN3tbb8pipeline5clearEv )\n__TBB_SYMBOL( _ZN3tbb19thread_bound_filter12process_itemEv )\n__TBB_SYMBOL( _ZN3tbb19thread_bound_filter16try_process_itemEv )\n__TBB_SYMBOL( _ZTIN3tbb8pipelineE )\n__TBB_SYMBOL( _ZTSN3tbb8pipelineE )\n__TBB_SYMBOL( _ZTVN3tbb8pipelineE )\n__TBB_SYMBOL( _ZN3tbb8pipelineC1Ev )\n__TBB_SYMBOL( _ZN3tbb8pipelineC2Ev )\n__TBB_SYMBOL( _ZN3tbb8pipelineD0Ev )\n__TBB_SYMBOL( _ZN3tbb8pipelineD1Ev )\n__TBB_SYMBOL( _ZN3tbb8pipelineD2Ev )\n__TBB_SYMBOL( _ZN3tbb6filter16set_end_of_inputEv )\n\n/* queuing_rw_mutex.cpp */\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex18internal_constructEv )\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex11scoped_lock17upgrade_to_writerEv )\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex11scoped_lock19downgrade_to_readerEv )\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex11scoped_lock7acquireERS0_b )\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex11scoped_lock7releaseEv )\n__TBB_SYMBOL( _ZN3tbb16queuing_rw_mutex11scoped_lock11try_acquireERS0_b )\n\n/* reader_writer_lock.cpp */\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock11scoped_lock16internal_destroyEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock11scoped_lock18internal_constructERS1_ )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock13try_lock_readEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock16scoped_lock_read16internal_destroyEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock16scoped_lock_read18internal_constructERS1_ )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock16internal_destroyEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock18internal_constructEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock4lockEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock6unlockEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock8try_lockEv )\n__TBB_SYMBOL( _ZN3tbb10interface518reader_writer_lock9lock_readEv )\n\n#if !TBB_NO_LEGACY\n/* spin_rw_mutex.cpp v2 */\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex16internal_upgradeEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex22internal_itt_releasingEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex23internal_acquire_readerEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex23internal_acquire_writerEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex18internal_downgradeEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex23internal_release_readerEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex23internal_release_writerEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex27internal_try_acquire_readerEPS0_ )\n__TBB_SYMBOL( _ZN3tbb13spin_rw_mutex27internal_try_acquire_writerEPS0_ )\n#endif\n\n// x86_rtm_rw_mutex.cpp\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex18internal_constructEv )\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex23internal_acquire_writerERNS2_11scoped_lockEb )\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex27internal_try_acquire_writerERNS2_11scoped_lockE )\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex23internal_acquire_readerERNS2_11scoped_lockEb )\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex16internal_releaseERNS2_11scoped_lockE )\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex16internal_upgradeERNS2_11scoped_lockE )\n__TBB_SYMBOL( _ZN3tbb10interface88internal16x86_rtm_rw_mutex18internal_downgradeERNS2_11scoped_lockE )\n\n/* spin_rw_mutex v3 */\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v318internal_constructEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v316internal_upgradeEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v318internal_downgradeEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v323internal_acquire_readerEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v323internal_acquire_writerEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v323internal_release_readerEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v323internal_release_writerEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v327internal_try_acquire_readerEv )\n__TBB_SYMBOL( _ZN3tbb16spin_rw_mutex_v327internal_try_acquire_writerEv )\n\n/* spin_mutex.cpp */\n__TBB_SYMBOL( _ZN3tbb10spin_mutex11scoped_lock16internal_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb10spin_mutex11scoped_lock16internal_releaseEv )\n__TBB_SYMBOL( _ZN3tbb10spin_mutex11scoped_lock20internal_try_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb10spin_mutex18internal_constructEv )\n\n/* mutex.cpp */\n__TBB_SYMBOL( _ZN3tbb5mutex11scoped_lock16internal_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb5mutex11scoped_lock16internal_releaseEv )\n__TBB_SYMBOL( _ZN3tbb5mutex11scoped_lock20internal_try_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb5mutex16internal_destroyEv )\n__TBB_SYMBOL( _ZN3tbb5mutex18internal_constructEv )\n\n/* recursive_mutex.cpp */\n__TBB_SYMBOL( _ZN3tbb15recursive_mutex11scoped_lock16internal_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb15recursive_mutex11scoped_lock16internal_releaseEv )\n__TBB_SYMBOL( _ZN3tbb15recursive_mutex11scoped_lock20internal_try_acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb15recursive_mutex16internal_destroyEv )\n__TBB_SYMBOL( _ZN3tbb15recursive_mutex18internal_constructEv )\n\n/* QueuingMutex.cpp */\n__TBB_SYMBOL( _ZN3tbb13queuing_mutex18internal_constructEv )\n__TBB_SYMBOL( _ZN3tbb13queuing_mutex11scoped_lock7acquireERS0_ )\n__TBB_SYMBOL( _ZN3tbb13queuing_mutex11scoped_lock7releaseEv )\n__TBB_SYMBOL( _ZN3tbb13queuing_mutex11scoped_lock11try_acquireERS0_ )\n\n/* critical_section.cpp */\n__TBB_SYMBOL( _ZN3tbb8internal19critical_section_v418internal_constructEv )\n\n#if !TBB_NO_LEGACY\n/* concurrent_hash_map */\n__TBB_SYMBOL( _ZNK3tbb8internal21hash_map_segment_base23internal_grow_predicateEv )\n\n/* concurrent_queue.cpp v2 */\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_base12internal_popEPv )\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_base13internal_pushEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_base21internal_set_capacityExy ) // MODIFIED LINUX ENTRY\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_base23internal_pop_if_presentEPv )\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_base25internal_push_if_not_fullEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_baseC2Ey ) // MODIFIED LINUX ENTRY\n__TBB_SYMBOL( _ZN3tbb8internal21concurrent_queue_baseD2Ev )\n__TBB_SYMBOL( _ZTIN3tbb8internal21concurrent_queue_baseE )\n__TBB_SYMBOL( _ZTSN3tbb8internal21concurrent_queue_baseE )\n__TBB_SYMBOL( _ZTVN3tbb8internal21concurrent_queue_baseE )\n__TBB_SYMBOL( _ZN3tbb8internal30concurrent_queue_iterator_base6assignERKS1_ )\n__TBB_SYMBOL( _ZN3tbb8internal30concurrent_queue_iterator_base7advanceEv )\n__TBB_SYMBOL( _ZN3tbb8internal30concurrent_queue_iterator_baseC2ERKNS0_21concurrent_queue_baseE )\n__TBB_SYMBOL( _ZN3tbb8internal30concurrent_queue_iterator_baseD2Ev )\n__TBB_SYMBOL( _ZNK3tbb8internal21concurrent_queue_base13internal_sizeEv )\n#endif\n\n/* concurrent_queue v3 */\n/* constructors */\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v3C2Ey ) // MODIFIED LINUX ENTRY\n__TBB_SYMBOL( _ZN3tbb8internal33concurrent_queue_iterator_base_v3C2ERKNS0_24concurrent_queue_base_v3E )\n__TBB_SYMBOL( _ZN3tbb8internal33concurrent_queue_iterator_base_v3C2ERKNS0_24concurrent_queue_base_v3Ey ) // MODIFIED LINUX ENTRY\n/* destructors */\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v3D2Ev )\n__TBB_SYMBOL( _ZN3tbb8internal33concurrent_queue_iterator_base_v3D2Ev )\n/* typeinfo */\n__TBB_SYMBOL( _ZTIN3tbb8internal24concurrent_queue_base_v3E )\n__TBB_SYMBOL( _ZTSN3tbb8internal24concurrent_queue_base_v3E )\n/* vtable */\n__TBB_SYMBOL( _ZTVN3tbb8internal24concurrent_queue_base_v3E )\n/* methods */\n__TBB_SYMBOL( _ZN3tbb8internal33concurrent_queue_iterator_base_v36assignERKS1_ )\n__TBB_SYMBOL( _ZN3tbb8internal33concurrent_queue_iterator_base_v37advanceEv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v313internal_pushEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v818internal_push_moveEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v325internal_push_if_not_fullEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v830internal_push_move_if_not_fullEPKv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v312internal_popEPv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v323internal_pop_if_presentEPv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v314internal_abortEv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v321internal_finish_clearEv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v321internal_set_capacityExy ) // MODIFIED LINUX ENTRY\n__TBB_SYMBOL( _ZNK3tbb8internal24concurrent_queue_base_v313internal_sizeEv )\n__TBB_SYMBOL( _ZNK3tbb8internal24concurrent_queue_base_v314internal_emptyEv )\n__TBB_SYMBOL( _ZNK3tbb8internal24concurrent_queue_base_v324internal_throw_exceptionEv )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v36assignERKS1_ )\n__TBB_SYMBOL( _ZN3tbb8internal24concurrent_queue_base_v812move_contentERS1_ )\n\n\n#if !TBB_NO_LEGACY\n/* concurrent_vector.cpp v2 */\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base13internal_copyERKS1_yPFvPvPKvyE ) // MODIFIED LINUX ENTRY\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base14internal_clearEPFvPvyEb ) // MODIFIED LINUX ENTRY\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base15internal_assignERKS1_yPFvPvyEPFvS4_PKvyESA_ ) // MODIFIED LINUX ENTRY\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base16internal_grow_byEyyPFvPvyE ) // MODIFIED LINUX ENTRY\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base16internal_reserveEyyy ) // MODIFIED LINUX ENTRY\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base18internal_push_backEyRy ) // MODIFIED LINUX ENTRY\n__TBB_SYMBOL( _ZN3tbb8internal22concurrent_vector_base25internal_grow_to_at_leastEyyPFvPvyE ) // MODIFIED LINUX ENTRY\n__TBB_SYMBOL( _ZNK3tbb8internal22concurrent_vector_base17internal_capacityEv )\n#endif\n\n/* concurrent_vector v3 */\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v313internal_copyERKS1_yPFvPvPKvyE ) // MODIFIED LINUX ENTRY\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v314internal_clearEPFvPvyE ) // MODIFIED LINUX ENTRY\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v315internal_assignERKS1_yPFvPvyEPFvS4_PKvyESA_ ) // MODIFIED LINUX ENTRY\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v316internal_grow_byEyyPFvPvPKvyES4_ ) // MODIFIED LINUX ENTRY\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v316internal_reserveEyyy ) // MODIFIED LINUX ENTRY\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v318internal_push_backEyRy ) // MODIFIED LINUX ENTRY\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v325internal_grow_to_at_leastEyyPFvPvPKvyES4_ ) // MODIFIED LINUX ENTRY\n__TBB_SYMBOL( _ZNK3tbb8internal25concurrent_vector_base_v317internal_capacityEv )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v316internal_compactEyPvPFvS2_yEPFvS2_PKvyE ) // MODIFIED LINUX ENTRY\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v313internal_swapERS1_ )\n__TBB_SYMBOL( _ZNK3tbb8internal25concurrent_vector_base_v324internal_throw_exceptionEy ) // MODIFIED LINUX ENTRY\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v3D2Ev )\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v315internal_resizeEyyyPKvPFvPvyEPFvS4_S3_yE ) // MODIFIED LINUX ENTRY\n__TBB_SYMBOL( _ZN3tbb8internal25concurrent_vector_base_v337internal_grow_to_at_least_with_resultEyyPFvPvPKvyES4_ ) // MODIFIED LINUX ENTRY\n\n/* tbb_thread */\n__TBB_SYMBOL( _ZN3tbb8internal13tbb_thread_v320hardware_concurrencyEv )\n__TBB_SYMBOL( _ZN3tbb8internal13tbb_thread_v36detachEv )\n__TBB_SYMBOL( _ZN3tbb8internal16thread_get_id_v3Ev )\n__TBB_SYMBOL( _ZN3tbb8internal15free_closure_v3EPv )\n__TBB_SYMBOL( _ZN3tbb8internal13tbb_thread_v34joinEv )\n__TBB_SYMBOL( _ZN3tbb8internal13tbb_thread_v314internal_startEPFjPvES2_ )  // MODIFIED LINUX ENTRY\n__TBB_SYMBOL( _ZN3tbb8internal19allocate_closure_v3Ey )  // MODIFIED LINUX ENTRY\n__TBB_SYMBOL( _ZN3tbb8internal7move_v3ERNS0_13tbb_thread_v3ES2_ )\n__TBB_SYMBOL( _ZN3tbb8internal15thread_yield_v3Ev )\n__TBB_SYMBOL( _ZN3tbb8internal15thread_sleep_v3ERKNS_10tick_count10interval_tE )\n\n/* condition_variable */\n__TBB_SYMBOL( _ZN3tbb10interface58internal32internal_condition_variable_waitERNS1_14condvar_impl_tEPNS_5mutexEPKNS_10tick_count10interval_tE )\n__TBB_SYMBOL( _ZN3tbb10interface58internal35internal_destroy_condition_variableERNS1_14condvar_impl_tE )\n__TBB_SYMBOL( _ZN3tbb10interface58internal38internal_condition_variable_notify_allERNS1_14condvar_impl_tE )\n__TBB_SYMBOL( _ZN3tbb10interface58internal38internal_condition_variable_notify_oneERNS1_14condvar_impl_tE )\n__TBB_SYMBOL( _ZN3tbb10interface58internal38internal_initialize_condition_variableERNS1_14condvar_impl_tE )\n\n#undef __TBB_SYMBOL\n"
  },
  {
    "path": "benchmarks/tbb/win64-tbb-export.def",
    "content": "; Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n;\n; This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n; you can redistribute it and/or modify it under the terms of the GNU General Public License\n; version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n; distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n; implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n; See  the GNU General Public License for more details.   You should have received a copy of\n; the  GNU General Public License along with Threading Building Blocks; if not, write to the\n; Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n;\n; As a special exception,  you may use this file  as part of a free software library without\n; restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n; functions from this file, or you compile this file and link it with other files to produce\n; an executable,  this file does not by itself cause the resulting executable to be covered\n; by the GNU General Public License. This exception does not however invalidate any other\n; reasons why the executable file might be covered by the GNU General Public License.\n\n; This file is organized with a section for each .cpp file.\n; Each of these sections is in alphabetical order.\n\nEXPORTS\n\n#define __TBB_SYMBOL( sym ) sym\n#include \"win64-tbb-export.lst\"\n\n"
  },
  {
    "path": "benchmarks/tbb/win64-tbb-export.lst",
    "content": "; Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n;\n; This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n; you can redistribute it and/or modify it under the terms of the GNU General Public License\n; version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n; distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n; implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n; See  the GNU General Public License for more details.   You should have received a copy of\n; the  GNU General Public License along with Threading Building Blocks; if not, write to the\n; Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n;\n; As a special exception,  you may use this file  as part of a free software library without\n; restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n; functions from this file, or you compile this file and link it with other files to produce\n; an executable,  this file does not by itself cause the resulting executable to be covered\n; by the GNU General Public License. This exception does not however invalidate any other\n; reasons why the executable file might be covered by the GNU General Public License.\n\n// This file is organized with a section for each .cpp file.\n// Each of these sections is in alphabetical order.\n\n#include \"tbb/tbb_config.h\"\n\n// Assembly-language support that is called directly by clients\n__TBB_SYMBOL( __TBB_machine_cmpswp1 )\n__TBB_SYMBOL( __TBB_machine_fetchadd1 )\n__TBB_SYMBOL( __TBB_machine_fetchstore1 )\n__TBB_SYMBOL( __TBB_machine_cmpswp2 )\n__TBB_SYMBOL( __TBB_machine_fetchadd2 )\n__TBB_SYMBOL( __TBB_machine_fetchstore2 )\n__TBB_SYMBOL( __TBB_machine_pause )\n__TBB_SYMBOL( __TBB_machine_try_lock_elided )\n__TBB_SYMBOL( __TBB_machine_unlock_elided )\n__TBB_SYMBOL( __TBB_machine_is_in_transaction )\n\n// cache_aligned_allocator.cpp\n__TBB_SYMBOL( ?NFS_Allocate@internal@tbb@@YAPEAX_K0PEAX@Z )\n__TBB_SYMBOL( ?NFS_GetLineSize@internal@tbb@@YA_KXZ )\n__TBB_SYMBOL( ?NFS_Free@internal@tbb@@YAXPEAX@Z )\n__TBB_SYMBOL( ?allocate_via_handler_v3@internal@tbb@@YAPEAX_K@Z )\n__TBB_SYMBOL( ?deallocate_via_handler_v3@internal@tbb@@YAXPEAX@Z )\n__TBB_SYMBOL( ?is_malloc_used_v3@internal@tbb@@YA_NXZ )\n\n\n// task.cpp v3\n__TBB_SYMBOL( ?resize@affinity_partitioner_base_v3@internal@tbb@@AEAAXI@Z )\n__TBB_SYMBOL( ?allocate@allocate_additional_child_of_proxy@internal@tbb@@QEBAAEAVtask@3@_K@Z )\n__TBB_SYMBOL( ?allocate@allocate_child_proxy@internal@tbb@@QEBAAEAVtask@3@_K@Z )\n__TBB_SYMBOL( ?allocate@allocate_continuation_proxy@internal@tbb@@QEBAAEAVtask@3@_K@Z )\n__TBB_SYMBOL( ?allocate@allocate_root_proxy@internal@tbb@@SAAEAVtask@3@_K@Z )\n__TBB_SYMBOL( ?destroy@task_base@internal@interface5@tbb@@SAXAEAVtask@4@@Z )\n__TBB_SYMBOL( ?free@allocate_additional_child_of_proxy@internal@tbb@@QEBAXAEAVtask@3@@Z )\n__TBB_SYMBOL( ?free@allocate_child_proxy@internal@tbb@@QEBAXAEAVtask@3@@Z )\n__TBB_SYMBOL( ?free@allocate_continuation_proxy@internal@tbb@@QEBAXAEAVtask@3@@Z )\n__TBB_SYMBOL( ?free@allocate_root_proxy@internal@tbb@@SAXAEAVtask@3@@Z )\n__TBB_SYMBOL( ?internal_set_ref_count@task@tbb@@AEAAXH@Z )\n__TBB_SYMBOL( ?internal_decrement_ref_count@task@tbb@@AEAA_JXZ )\n__TBB_SYMBOL( ?is_owned_by_current_thread@task@tbb@@QEBA_NXZ )\n__TBB_SYMBOL( ?note_affinity@task@tbb@@UEAAXG@Z )\n__TBB_SYMBOL( ?self@task@tbb@@SAAEAV12@XZ )\n__TBB_SYMBOL( ?spawn_and_wait_for_all@task@tbb@@QEAAXAEAVtask_list@2@@Z )\n__TBB_SYMBOL( ?default_num_threads@task_scheduler_init@tbb@@SAHXZ )\n__TBB_SYMBOL( ?initialize@task_scheduler_init@tbb@@QEAAXH_K@Z )\n__TBB_SYMBOL( ?initialize@task_scheduler_init@tbb@@QEAAXH@Z )\n__TBB_SYMBOL( ?terminate@task_scheduler_init@tbb@@QEAAXXZ )\n#if __TBB_SCHEDULER_OBSERVER\n__TBB_SYMBOL( ?observe@task_scheduler_observer_v3@internal@tbb@@QEAAX_N@Z )\n#endif /* __TBB_SCHEDULER_OBSERVER */\n\n#if __TBB_TASK_ARENA\n/* arena.cpp */\n__TBB_SYMBOL( ?internal_current_slot@task_arena_base@internal@interface7@tbb@@KAHXZ )\n__TBB_SYMBOL( ?internal_initialize@task_arena_base@internal@interface7@tbb@@IEAAXXZ )\n__TBB_SYMBOL( ?internal_terminate@task_arena_base@internal@interface7@tbb@@IEAAXXZ )\n__TBB_SYMBOL( ?internal_enqueue@task_arena_base@internal@interface7@tbb@@IEBAXAEAVtask@4@_J@Z )\n__TBB_SYMBOL( ?internal_execute@task_arena_base@internal@interface7@tbb@@IEBAXAEAVdelegate_base@234@@Z )\n__TBB_SYMBOL( ?internal_wait@task_arena_base@internal@interface7@tbb@@IEBAXXZ )\n#endif /* __TBB_TASK_ARENA */\n\n#if !TBB_NO_LEGACY\n// task_v2.cpp\n__TBB_SYMBOL( ?destroy@task@tbb@@QEAAXAEAV12@@Z )\n#endif\n\n// Exception handling in task scheduler\n#if __TBB_TASK_GROUP_CONTEXT\n__TBB_SYMBOL( ?allocate@allocate_root_with_context_proxy@internal@tbb@@QEBAAEAVtask@3@_K@Z )\n__TBB_SYMBOL( ?free@allocate_root_with_context_proxy@internal@tbb@@QEBAXAEAVtask@3@@Z )\n__TBB_SYMBOL( ?change_group@task@tbb@@QEAAXAEAVtask_group_context@2@@Z )\n__TBB_SYMBOL( ?is_group_execution_cancelled@task_group_context@tbb@@QEBA_NXZ )\n__TBB_SYMBOL( ?cancel_group_execution@task_group_context@tbb@@QEAA_NXZ )\n__TBB_SYMBOL( ?reset@task_group_context@tbb@@QEAAXXZ )\n__TBB_SYMBOL( ?capture_fp_settings@task_group_context@tbb@@QEAAXXZ )\n__TBB_SYMBOL( ?init@task_group_context@tbb@@IEAAXXZ )\n__TBB_SYMBOL( ?register_pending_exception@task_group_context@tbb@@QEAAXXZ )\n__TBB_SYMBOL( ??1task_group_context@tbb@@QEAA@XZ )\n#if __TBB_TASK_PRIORITY\n__TBB_SYMBOL( ?set_priority@task_group_context@tbb@@QEAAXW4priority_t@2@@Z )\n__TBB_SYMBOL( ?priority@task_group_context@tbb@@QEBA?AW4priority_t@2@XZ )\n#endif /* __TBB_TASK_PRIORITY */\n__TBB_SYMBOL( ?name@captured_exception@tbb@@UEBAPEBDXZ )\n__TBB_SYMBOL( ?what@captured_exception@tbb@@UEBAPEBDXZ )\n__TBB_SYMBOL( ??1captured_exception@tbb@@UEAA@XZ )\n__TBB_SYMBOL( ?move@captured_exception@tbb@@UEAAPEAV12@XZ )\n__TBB_SYMBOL( ?destroy@captured_exception@tbb@@UEAAXXZ )\n__TBB_SYMBOL( ?set@captured_exception@tbb@@QEAAXPEBD0@Z )\n__TBB_SYMBOL( ?clear@captured_exception@tbb@@QEAAXXZ )\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n// Symbols for exceptions thrown from TBB\n__TBB_SYMBOL( ?throw_bad_last_alloc_exception_v4@internal@tbb@@YAXXZ )\n__TBB_SYMBOL( ?throw_exception_v4@internal@tbb@@YAXW4exception_id@12@@Z )\n__TBB_SYMBOL( ?what@bad_last_alloc@tbb@@UEBAPEBDXZ )\n__TBB_SYMBOL( ?what@missing_wait@tbb@@UEBAPEBDXZ )\n__TBB_SYMBOL( ?what@invalid_multiple_scheduling@tbb@@UEBAPEBDXZ )\n__TBB_SYMBOL( ?what@improper_lock@tbb@@UEBAPEBDXZ )\n__TBB_SYMBOL( ?what@user_abort@tbb@@UEBAPEBDXZ )\n\n// tbb_misc.cpp\n__TBB_SYMBOL( ?assertion_failure@tbb@@YAXPEBDH00@Z )\n__TBB_SYMBOL( ?get_initial_auto_partitioner_divisor@internal@tbb@@YA_KXZ )\n__TBB_SYMBOL( ?handle_perror@internal@tbb@@YAXHPEBD@Z )\n__TBB_SYMBOL( ?set_assertion_handler@tbb@@YAP6AXPEBDH00@ZP6AX0H00@Z@Z )\n__TBB_SYMBOL( ?runtime_warning@internal@tbb@@YAXPEBDZZ )\n__TBB_SYMBOL( TBB_runtime_interface_version )\n\n// tbb_main.cpp\n__TBB_SYMBOL( ?itt_load_pointer_with_acquire_v3@internal@tbb@@YAPEAXPEBX@Z )\n__TBB_SYMBOL( ?itt_store_pointer_with_release_v3@internal@tbb@@YAXPEAX0@Z )\n__TBB_SYMBOL( ?call_itt_notify_v5@internal@tbb@@YAXHPEAX@Z )\n__TBB_SYMBOL( ?itt_load_pointer_v3@internal@tbb@@YAPEAXPEBX@Z )\n__TBB_SYMBOL( ?itt_set_sync_name_v3@internal@tbb@@YAXPEAXPEB_W@Z )\n#if __TBB_ITT_STRUCTURE_API\n__TBB_SYMBOL( ?itt_make_task_group_v7@internal@tbb@@YAXW4itt_domain_enum@12@PEAX_K12W4string_index@12@@Z )\n__TBB_SYMBOL( ?itt_metadata_str_add_v7@internal@tbb@@YAXW4itt_domain_enum@12@PEAX_KW4string_index@12@PEBD@Z )\n__TBB_SYMBOL( ?itt_relation_add_v7@internal@tbb@@YAXW4itt_domain_enum@12@PEAX_KW4itt_relation@12@12@Z )\n__TBB_SYMBOL( ?itt_task_begin_v7@internal@tbb@@YAXW4itt_domain_enum@12@PEAX_K12W4string_index@12@@Z )\n__TBB_SYMBOL( ?itt_task_end_v7@internal@tbb@@YAXW4itt_domain_enum@12@@Z )\n#endif\n\n// pipeline.cpp\n__TBB_SYMBOL( ??_7pipeline@tbb@@6B@ )\n__TBB_SYMBOL( ??0pipeline@tbb@@QEAA@XZ )\n__TBB_SYMBOL( ??1filter@tbb@@UEAA@XZ )\n__TBB_SYMBOL( ??1pipeline@tbb@@UEAA@XZ )\n__TBB_SYMBOL( ?add_filter@pipeline@tbb@@QEAAXAEAVfilter@2@@Z )\n__TBB_SYMBOL( ?clear@pipeline@tbb@@QEAAXXZ )\n__TBB_SYMBOL( ?inject_token@pipeline@tbb@@AEAAXAEAVtask@2@@Z )\n__TBB_SYMBOL( ?run@pipeline@tbb@@QEAAX_K@Z )\n#if __TBB_TASK_GROUP_CONTEXT\n__TBB_SYMBOL( ?run@pipeline@tbb@@QEAAX_KAEAVtask_group_context@2@@Z )\n#endif\n__TBB_SYMBOL( ?process_item@thread_bound_filter@tbb@@QEAA?AW4result_type@12@XZ )\n__TBB_SYMBOL( ?try_process_item@thread_bound_filter@tbb@@QEAA?AW4result_type@12@XZ )\n__TBB_SYMBOL( ?set_end_of_input@filter@tbb@@IEAAXXZ )\n\n// queuing_rw_mutex.cpp\n__TBB_SYMBOL( ?internal_construct@queuing_rw_mutex@tbb@@QEAAXXZ )\n__TBB_SYMBOL( ?acquire@scoped_lock@queuing_rw_mutex@tbb@@QEAAXAEAV23@_N@Z )\n__TBB_SYMBOL( ?downgrade_to_reader@scoped_lock@queuing_rw_mutex@tbb@@QEAA_NXZ )\n__TBB_SYMBOL( ?release@scoped_lock@queuing_rw_mutex@tbb@@QEAAXXZ )\n__TBB_SYMBOL( ?upgrade_to_writer@scoped_lock@queuing_rw_mutex@tbb@@QEAA_NXZ )\n__TBB_SYMBOL( ?try_acquire@scoped_lock@queuing_rw_mutex@tbb@@QEAA_NAEAV23@_N@Z )\n\n// reader_writer_lock.cpp\n__TBB_SYMBOL( ?try_lock_read@reader_writer_lock@interface5@tbb@@QEAA_NXZ )\n__TBB_SYMBOL( ?try_lock@reader_writer_lock@interface5@tbb@@QEAA_NXZ )\n__TBB_SYMBOL( ?unlock@reader_writer_lock@interface5@tbb@@QEAAXXZ )\n__TBB_SYMBOL( ?lock_read@reader_writer_lock@interface5@tbb@@QEAAXXZ )\n__TBB_SYMBOL( ?lock@reader_writer_lock@interface5@tbb@@QEAAXXZ )\n__TBB_SYMBOL( ?internal_construct@reader_writer_lock@interface5@tbb@@AEAAXXZ )\n__TBB_SYMBOL( ?internal_destroy@reader_writer_lock@interface5@tbb@@AEAAXXZ )\n__TBB_SYMBOL( ?internal_construct@scoped_lock@reader_writer_lock@interface5@tbb@@AEAAXAEAV234@@Z )\n__TBB_SYMBOL( ?internal_destroy@scoped_lock@reader_writer_lock@interface5@tbb@@AEAAXXZ )\n__TBB_SYMBOL( ?internal_construct@scoped_lock_read@reader_writer_lock@interface5@tbb@@AEAAXAEAV234@@Z )\n__TBB_SYMBOL( ?internal_destroy@scoped_lock_read@reader_writer_lock@interface5@tbb@@AEAAXXZ )\n\n#if !TBB_NO_LEGACY\n// spin_rw_mutex.cpp v2\n__TBB_SYMBOL( ?internal_itt_releasing@spin_rw_mutex@tbb@@CAXPEAV12@@Z )\n__TBB_SYMBOL( ?internal_acquire_writer@spin_rw_mutex@tbb@@CA_NPEAV12@@Z )\n__TBB_SYMBOL( ?internal_acquire_reader@spin_rw_mutex@tbb@@CAXPEAV12@@Z )\n__TBB_SYMBOL( ?internal_downgrade@spin_rw_mutex@tbb@@CAXPEAV12@@Z )\n__TBB_SYMBOL( ?internal_upgrade@spin_rw_mutex@tbb@@CA_NPEAV12@@Z )\n__TBB_SYMBOL( ?internal_release_reader@spin_rw_mutex@tbb@@CAXPEAV12@@Z )\n__TBB_SYMBOL( ?internal_release_writer@spin_rw_mutex@tbb@@CAXPEAV12@@Z )\n__TBB_SYMBOL( ?internal_try_acquire_writer@spin_rw_mutex@tbb@@CA_NPEAV12@@Z )\n__TBB_SYMBOL( ?internal_try_acquire_reader@spin_rw_mutex@tbb@@CA_NPEAV12@@Z )\n#endif\n\n// spin_rw_mutex v3\n__TBB_SYMBOL( ?internal_construct@spin_rw_mutex_v3@tbb@@AEAAXXZ )\n__TBB_SYMBOL( ?internal_upgrade@spin_rw_mutex_v3@tbb@@AEAA_NXZ )\n__TBB_SYMBOL( ?internal_downgrade@spin_rw_mutex_v3@tbb@@AEAAXXZ )\n__TBB_SYMBOL( ?internal_acquire_reader@spin_rw_mutex_v3@tbb@@AEAAXXZ )\n__TBB_SYMBOL( ?internal_acquire_writer@spin_rw_mutex_v3@tbb@@AEAA_NXZ )\n__TBB_SYMBOL( ?internal_release_reader@spin_rw_mutex_v3@tbb@@AEAAXXZ )\n__TBB_SYMBOL( ?internal_release_writer@spin_rw_mutex_v3@tbb@@AEAAXXZ )\n__TBB_SYMBOL( ?internal_try_acquire_reader@spin_rw_mutex_v3@tbb@@AEAA_NXZ )\n__TBB_SYMBOL( ?internal_try_acquire_writer@spin_rw_mutex_v3@tbb@@AEAA_NXZ )\n\n// x86_rtm_rw_mutex.cpp\n__TBB_SYMBOL( ?internal_acquire_writer@x86_rtm_rw_mutex@internal@interface8@tbb@@AEAAXAEAVscoped_lock@1234@_N@Z )\n__TBB_SYMBOL( ?internal_acquire_reader@x86_rtm_rw_mutex@internal@interface8@tbb@@AEAAXAEAVscoped_lock@1234@_N@Z )\n__TBB_SYMBOL( ?internal_upgrade@x86_rtm_rw_mutex@internal@interface8@tbb@@AEAA_NAEAVscoped_lock@1234@@Z )\n__TBB_SYMBOL( ?internal_downgrade@x86_rtm_rw_mutex@internal@interface8@tbb@@AEAA_NAEAVscoped_lock@1234@@Z )\n__TBB_SYMBOL( ?internal_try_acquire_writer@x86_rtm_rw_mutex@internal@interface8@tbb@@AEAA_NAEAVscoped_lock@1234@@Z )\n__TBB_SYMBOL( ?internal_release@x86_rtm_rw_mutex@internal@interface8@tbb@@AEAAXAEAVscoped_lock@1234@@Z )\n__TBB_SYMBOL( ?internal_construct@x86_rtm_rw_mutex@internal@interface8@tbb@@AEAAXXZ )\n\n// spin_mutex.cpp\n__TBB_SYMBOL( ?internal_construct@spin_mutex@tbb@@QEAAXXZ )\n__TBB_SYMBOL( ?internal_acquire@scoped_lock@spin_mutex@tbb@@AEAAXAEAV23@@Z )\n__TBB_SYMBOL( ?internal_release@scoped_lock@spin_mutex@tbb@@AEAAXXZ )\n__TBB_SYMBOL( ?internal_try_acquire@scoped_lock@spin_mutex@tbb@@AEAA_NAEAV23@@Z )\n\n// mutex.cpp\n__TBB_SYMBOL( ?internal_acquire@scoped_lock@mutex@tbb@@AEAAXAEAV23@@Z )\n__TBB_SYMBOL( ?internal_release@scoped_lock@mutex@tbb@@AEAAXXZ )\n__TBB_SYMBOL( ?internal_try_acquire@scoped_lock@mutex@tbb@@AEAA_NAEAV23@@Z )\n__TBB_SYMBOL( ?internal_construct@mutex@tbb@@AEAAXXZ )\n__TBB_SYMBOL( ?internal_destroy@mutex@tbb@@AEAAXXZ )\n\n// recursive_mutex.cpp\n__TBB_SYMBOL( ?internal_construct@recursive_mutex@tbb@@AEAAXXZ )\n__TBB_SYMBOL( ?internal_destroy@recursive_mutex@tbb@@AEAAXXZ )\n__TBB_SYMBOL( ?internal_acquire@scoped_lock@recursive_mutex@tbb@@AEAAXAEAV23@@Z )\n__TBB_SYMBOL( ?internal_try_acquire@scoped_lock@recursive_mutex@tbb@@AEAA_NAEAV23@@Z )\n__TBB_SYMBOL( ?internal_release@scoped_lock@recursive_mutex@tbb@@AEAAXXZ )\n\n// queuing_mutex.cpp\n__TBB_SYMBOL( ?internal_construct@queuing_mutex@tbb@@QEAAXXZ )\n__TBB_SYMBOL( ?acquire@scoped_lock@queuing_mutex@tbb@@QEAAXAEAV23@@Z )\n__TBB_SYMBOL( ?release@scoped_lock@queuing_mutex@tbb@@QEAAXXZ )\n__TBB_SYMBOL( ?try_acquire@scoped_lock@queuing_mutex@tbb@@QEAA_NAEAV23@@Z )\n\n//critical_section.cpp\n__TBB_SYMBOL( ?internal_construct@critical_section_v4@internal@tbb@@QEAAXXZ )\n\n#if !TBB_NO_LEGACY\n// concurrent_hash_map.cpp\n__TBB_SYMBOL( ?internal_grow_predicate@hash_map_segment_base@internal@tbb@@QEBA_NXZ )\n\n// concurrent_queue.cpp v2\n__TBB_SYMBOL( ??0concurrent_queue_base@internal@tbb@@IEAA@_K@Z )\n__TBB_SYMBOL( ??0concurrent_queue_iterator_base@internal@tbb@@IEAA@AEBVconcurrent_queue_base@12@@Z )\n__TBB_SYMBOL( ??1concurrent_queue_base@internal@tbb@@MEAA@XZ )\n__TBB_SYMBOL( ??1concurrent_queue_iterator_base@internal@tbb@@IEAA@XZ )\n__TBB_SYMBOL( ?advance@concurrent_queue_iterator_base@internal@tbb@@IEAAXXZ )\n__TBB_SYMBOL( ?assign@concurrent_queue_iterator_base@internal@tbb@@IEAAXAEBV123@@Z )\n__TBB_SYMBOL( ?internal_pop@concurrent_queue_base@internal@tbb@@IEAAXPEAX@Z )\n__TBB_SYMBOL( ?internal_pop_if_present@concurrent_queue_base@internal@tbb@@IEAA_NPEAX@Z )\n__TBB_SYMBOL( ?internal_push@concurrent_queue_base@internal@tbb@@IEAAXPEBX@Z )\n__TBB_SYMBOL( ?internal_push_if_not_full@concurrent_queue_base@internal@tbb@@IEAA_NPEBX@Z )\n__TBB_SYMBOL( ?internal_set_capacity@concurrent_queue_base@internal@tbb@@IEAAX_J_K@Z )\n__TBB_SYMBOL( ?internal_size@concurrent_queue_base@internal@tbb@@IEBA_JXZ )\n#endif\n\n// concurrent_queue v3\n__TBB_SYMBOL( ??0concurrent_queue_iterator_base_v3@internal@tbb@@IEAA@AEBVconcurrent_queue_base_v3@12@@Z )\n__TBB_SYMBOL( ??0concurrent_queue_iterator_base_v3@internal@tbb@@IEAA@AEBVconcurrent_queue_base_v3@12@_K@Z )\n__TBB_SYMBOL( ??1concurrent_queue_iterator_base_v3@internal@tbb@@IEAA@XZ )\n__TBB_SYMBOL( ?assign@concurrent_queue_iterator_base_v3@internal@tbb@@IEAAXAEBV123@@Z )\n__TBB_SYMBOL( ?advance@concurrent_queue_iterator_base_v3@internal@tbb@@IEAAXXZ )\n__TBB_SYMBOL( ??0concurrent_queue_base_v3@internal@tbb@@IEAA@_K@Z )\n__TBB_SYMBOL( ??1concurrent_queue_base_v3@internal@tbb@@MEAA@XZ )\n__TBB_SYMBOL( ?internal_push@concurrent_queue_base_v3@internal@tbb@@IEAAXPEBX@Z )\n__TBB_SYMBOL( ?internal_push_move@concurrent_queue_base_v8@internal@tbb@@IEAAXPEBX@Z )\n__TBB_SYMBOL( ?internal_push_if_not_full@concurrent_queue_base_v3@internal@tbb@@IEAA_NPEBX@Z )\n__TBB_SYMBOL( ?internal_push_move_if_not_full@concurrent_queue_base_v8@internal@tbb@@IEAA_NPEBX@Z )\n__TBB_SYMBOL( ?internal_pop@concurrent_queue_base_v3@internal@tbb@@IEAAXPEAX@Z )\n__TBB_SYMBOL( ?internal_pop_if_present@concurrent_queue_base_v3@internal@tbb@@IEAA_NPEAX@Z )\n__TBB_SYMBOL( ?internal_abort@concurrent_queue_base_v3@internal@tbb@@IEAAXXZ )\n__TBB_SYMBOL( ?internal_size@concurrent_queue_base_v3@internal@tbb@@IEBA_JXZ )\n__TBB_SYMBOL( ?internal_empty@concurrent_queue_base_v3@internal@tbb@@IEBA_NXZ )\n__TBB_SYMBOL( ?internal_finish_clear@concurrent_queue_base_v3@internal@tbb@@IEAAXXZ )\n__TBB_SYMBOL( ?internal_set_capacity@concurrent_queue_base_v3@internal@tbb@@IEAAX_J_K@Z )\n__TBB_SYMBOL( ?internal_throw_exception@concurrent_queue_base_v3@internal@tbb@@IEBAXXZ )\n__TBB_SYMBOL( ?assign@concurrent_queue_base_v3@internal@tbb@@IEAAXAEBV123@@Z )\n__TBB_SYMBOL( ?move_content@concurrent_queue_base_v8@internal@tbb@@IEAAXAEAV123@@Z )\n\n#if !TBB_NO_LEGACY\n// concurrent_vector.cpp v2\n__TBB_SYMBOL( ?internal_assign@concurrent_vector_base@internal@tbb@@IEAAXAEBV123@_KP6AXPEAX1@ZP6AX2PEBX1@Z5@Z )\n__TBB_SYMBOL( ?internal_capacity@concurrent_vector_base@internal@tbb@@IEBA_KXZ )\n__TBB_SYMBOL( ?internal_clear@concurrent_vector_base@internal@tbb@@IEAAXP6AXPEAX_K@Z_N@Z )\n__TBB_SYMBOL( ?internal_copy@concurrent_vector_base@internal@tbb@@IEAAXAEBV123@_KP6AXPEAXPEBX1@Z@Z )\n__TBB_SYMBOL( ?internal_grow_by@concurrent_vector_base@internal@tbb@@IEAA_K_K0P6AXPEAX0@Z@Z )\n__TBB_SYMBOL( ?internal_grow_to_at_least@concurrent_vector_base@internal@tbb@@IEAAX_K0P6AXPEAX0@Z@Z )\n__TBB_SYMBOL( ?internal_push_back@concurrent_vector_base@internal@tbb@@IEAAPEAX_KAEA_K@Z )\n__TBB_SYMBOL( ?internal_reserve@concurrent_vector_base@internal@tbb@@IEAAX_K00@Z )\n#endif\n\n// concurrent_vector v3\n__TBB_SYMBOL( ??1concurrent_vector_base_v3@internal@tbb@@IEAA@XZ )\n__TBB_SYMBOL( ?internal_assign@concurrent_vector_base_v3@internal@tbb@@IEAAXAEBV123@_KP6AXPEAX1@ZP6AX2PEBX1@Z5@Z )\n__TBB_SYMBOL( ?internal_capacity@concurrent_vector_base_v3@internal@tbb@@IEBA_KXZ )\n__TBB_SYMBOL( ?internal_clear@concurrent_vector_base_v3@internal@tbb@@IEAA_KP6AXPEAX_K@Z@Z )\n__TBB_SYMBOL( ?internal_copy@concurrent_vector_base_v3@internal@tbb@@IEAAXAEBV123@_KP6AXPEAXPEBX1@Z@Z )\n__TBB_SYMBOL( ?internal_grow_by@concurrent_vector_base_v3@internal@tbb@@IEAA_K_K0P6AXPEAXPEBX0@Z2@Z )\n__TBB_SYMBOL( ?internal_grow_to_at_least@concurrent_vector_base_v3@internal@tbb@@IEAAX_K0P6AXPEAXPEBX0@Z2@Z )\n__TBB_SYMBOL( ?internal_push_back@concurrent_vector_base_v3@internal@tbb@@IEAAPEAX_KAEA_K@Z )\n__TBB_SYMBOL( ?internal_reserve@concurrent_vector_base_v3@internal@tbb@@IEAAX_K00@Z )\n__TBB_SYMBOL( ?internal_compact@concurrent_vector_base_v3@internal@tbb@@IEAAPEAX_KPEAXP6AX10@ZP6AX1PEBX0@Z@Z )\n__TBB_SYMBOL( ?internal_swap@concurrent_vector_base_v3@internal@tbb@@IEAAXAEAV123@@Z )\n__TBB_SYMBOL( ?internal_throw_exception@concurrent_vector_base_v3@internal@tbb@@IEBAX_K@Z )\n__TBB_SYMBOL( ?internal_resize@concurrent_vector_base_v3@internal@tbb@@IEAAX_K00PEBXP6AXPEAX0@ZP6AX210@Z@Z )\n__TBB_SYMBOL( ?internal_grow_to_at_least_with_result@concurrent_vector_base_v3@internal@tbb@@IEAA_K_K0P6AXPEAXPEBX0@Z2@Z )\n\n// tbb_thread\n__TBB_SYMBOL( ?allocate_closure_v3@internal@tbb@@YAPEAX_K@Z )\n__TBB_SYMBOL( ?detach@tbb_thread_v3@internal@tbb@@QEAAXXZ )\n__TBB_SYMBOL( ?free_closure_v3@internal@tbb@@YAXPEAX@Z )\n__TBB_SYMBOL( ?hardware_concurrency@tbb_thread_v3@internal@tbb@@SAIXZ )\n__TBB_SYMBOL( ?internal_start@tbb_thread_v3@internal@tbb@@AEAAXP6AIPEAX@Z0@Z )\n__TBB_SYMBOL( ?join@tbb_thread_v3@internal@tbb@@QEAAXXZ )\n__TBB_SYMBOL( ?move_v3@internal@tbb@@YAXAEAVtbb_thread_v3@12@0@Z )\n__TBB_SYMBOL( ?thread_get_id_v3@internal@tbb@@YA?AVid@tbb_thread_v3@12@XZ )\n__TBB_SYMBOL( ?thread_sleep_v3@internal@tbb@@YAXAEBVinterval_t@tick_count@2@@Z )\n__TBB_SYMBOL( ?thread_yield_v3@internal@tbb@@YAXXZ )\n\n// condition_variable\n__TBB_SYMBOL( ?internal_initialize_condition_variable@internal@interface5@tbb@@YAXAEATcondvar_impl_t@123@@Z )\n__TBB_SYMBOL( ?internal_condition_variable_wait@internal@interface5@tbb@@YA_NAEATcondvar_impl_t@123@PEAVmutex@3@PEBVinterval_t@tick_count@3@@Z )\n__TBB_SYMBOL( ?internal_condition_variable_notify_one@internal@interface5@tbb@@YAXAEATcondvar_impl_t@123@@Z )\n__TBB_SYMBOL( ?internal_condition_variable_notify_all@internal@interface5@tbb@@YAXAEATcondvar_impl_t@123@@Z )\n__TBB_SYMBOL( ?internal_destroy_condition_variable@internal@interface5@tbb@@YAXAEATcondvar_impl_t@123@@Z )\n\n#undef __TBB_SYMBOL\n"
  },
  {
    "path": "benchmarks/tbb/winrt-tbb-export.lst",
    "content": "; Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n;\n; This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n; you can redistribute it and/or modify it under the terms of the GNU General Public License\n; version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n; distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n; implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n; See  the GNU General Public License for more details.   You should have received a copy of\n; the  GNU General Public License along with Threading Building Blocks; if not, write to the\n; Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n;\n; As a special exception,  you may use this file  as part of a free software library without\n; restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n; functions from this file, or you compile this file and link it with other files to produce\n; an executable,  this file does not by itself cause the resulting executable to be covered\n; by the GNU General Public License. This exception does not however invalidate any other\n; reasons why the executable file might be covered by the GNU General Public License.\n\n#include \"tbb/tbb_config.h\"\n\n// cache_aligned_allocator.cpp\n__TBB_SYMBOL( ?NFS_Allocate@internal@tbb@@YAPAXIIPAX@Z )\n__TBB_SYMBOL( ?NFS_GetLineSize@internal@tbb@@YAIXZ )\n__TBB_SYMBOL( ?NFS_Free@internal@tbb@@YAXPAX@Z )\n__TBB_SYMBOL( ?allocate_via_handler_v3@internal@tbb@@YAPAXI@Z )\n__TBB_SYMBOL( ?deallocate_via_handler_v3@internal@tbb@@YAXPAX@Z )\n__TBB_SYMBOL( ?is_malloc_used_v3@internal@tbb@@YA_NXZ )\n\n// task.cpp v3\n__TBB_SYMBOL( ?allocate@allocate_additional_child_of_proxy@internal@tbb@@QBAAAVtask@3@I@Z )\n__TBB_SYMBOL( ?allocate@allocate_child_proxy@internal@tbb@@QBAAAVtask@3@I@Z )\n__TBB_SYMBOL( ?allocate@allocate_continuation_proxy@internal@tbb@@QBAAAVtask@3@I@Z )\n__TBB_SYMBOL( ?allocate@allocate_root_proxy@internal@tbb@@SAAAVtask@3@I@Z )\n__TBB_SYMBOL( ?destroy@task_base@internal@interface5@tbb@@SAXAAVtask@4@@Z )\n__TBB_SYMBOL( ?free@allocate_additional_child_of_proxy@internal@tbb@@QBAXAAVtask@3@@Z )\n__TBB_SYMBOL( ?free@allocate_child_proxy@internal@tbb@@QBAXAAVtask@3@@Z )\n__TBB_SYMBOL( ?free@allocate_continuation_proxy@internal@tbb@@QBAXAAVtask@3@@Z )\n__TBB_SYMBOL( ?free@allocate_root_proxy@internal@tbb@@SAXAAVtask@3@@Z )\n__TBB_SYMBOL( ?internal_set_ref_count@task@tbb@@AAAXH@Z )\n__TBB_SYMBOL( ?internal_decrement_ref_count@task@tbb@@AAAHXZ )\n__TBB_SYMBOL( ?is_owned_by_current_thread@task@tbb@@QBA_NXZ )\n__TBB_SYMBOL( ?note_affinity@task@tbb@@UAAXG@Z )\n__TBB_SYMBOL( ?resize@affinity_partitioner_base_v3@internal@tbb@@AAAXI@Z )\n__TBB_SYMBOL( ?self@task@tbb@@SAAAV12@XZ )\n__TBB_SYMBOL( ?spawn_and_wait_for_all@task@tbb@@QAAXAAVtask_list@2@@Z )\n__TBB_SYMBOL( ?default_num_threads@task_scheduler_init@tbb@@SAHXZ )\n__TBB_SYMBOL( ?initialize@task_scheduler_init@tbb@@QAAXHI@Z )\n__TBB_SYMBOL( ?initialize@task_scheduler_init@tbb@@QAAXH@Z )\n__TBB_SYMBOL( ?terminate@task_scheduler_init@tbb@@QAAXXZ )\n#if __TBB_SCHEDULER_OBSERVER\n__TBB_SYMBOL( ?observe@task_scheduler_observer_v3@internal@tbb@@QAAX_N@Z )\n#endif /* __TBB_SCHEDULER_OBSERVER */\n\n#if __TBB_TASK_ARENA\n/* arena.cpp */\n__TBB_SYMBOL( ?internal_current_slot@task_arena_base@internal@interface7@tbb@@KAHXZ )\n__TBB_SYMBOL( ?internal_initialize@task_arena_base@internal@interface7@tbb@@IAAXXZ )\n__TBB_SYMBOL( ?internal_terminate@task_arena_base@internal@interface7@tbb@@IAAXXZ )\n__TBB_SYMBOL( ?internal_enqueue@task_arena_base@internal@interface7@tbb@@IBAXAAVtask@4@H@Z )\n__TBB_SYMBOL( ?internal_execute@task_arena_base@internal@interface7@tbb@@IBAXAAVdelegate_base@234@@Z )\n__TBB_SYMBOL( ?internal_wait@task_arena_base@internal@interface7@tbb@@IBAXXZ )\n#endif /* __TBB_TASK_ARENA */\n\n#if !TBB_NO_LEGACY\n// task_v2.cpp\n__TBB_SYMBOL( ?destroy@task@tbb@@QAAXAAV12@@Z )\n#endif\n\n// exception handling support\n#if __TBB_TASK_GROUP_CONTEXT\n__TBB_SYMBOL( ?allocate@allocate_root_with_context_proxy@internal@tbb@@QBAAAVtask@3@I@Z )\n__TBB_SYMBOL( ?free@allocate_root_with_context_proxy@internal@tbb@@QBAXAAVtask@3@@Z )\n__TBB_SYMBOL( ?change_group@task@tbb@@QAAXAAVtask_group_context@2@@Z )\n__TBB_SYMBOL( ?is_group_execution_cancelled@task_group_context@tbb@@QBA_NXZ )\n__TBB_SYMBOL( ?cancel_group_execution@task_group_context@tbb@@QAA_NXZ )\n__TBB_SYMBOL( ?reset@task_group_context@tbb@@QAAXXZ )\n__TBB_SYMBOL( ?capture_fp_settings@task_group_context@tbb@@QAAXXZ )\n__TBB_SYMBOL( ?init@task_group_context@tbb@@IAAXXZ )\n__TBB_SYMBOL( ?register_pending_exception@task_group_context@tbb@@QAAXXZ )\n__TBB_SYMBOL( ??1task_group_context@tbb@@QAA@XZ )\n#if __TBB_TASK_PRIORITY\n__TBB_SYMBOL( ?set_priority@task_group_context@tbb@@QAAXW4priority_t@2@@Z )\n__TBB_SYMBOL( ?priority@task_group_context@tbb@@QBA?AW4priority_t@2@XZ )\n#endif /* __TBB_TASK_PRIORITY */\n__TBB_SYMBOL( ?name@captured_exception@tbb@@UBAPBDXZ )\n__TBB_SYMBOL( ?what@captured_exception@tbb@@UBAPBDXZ )\n__TBB_SYMBOL( ??1captured_exception@tbb@@UAA@XZ )\n__TBB_SYMBOL( ?move@captured_exception@tbb@@UAAPAV12@XZ )\n__TBB_SYMBOL( ?destroy@captured_exception@tbb@@UAAXXZ )\n__TBB_SYMBOL( ?set@captured_exception@tbb@@QAAXPBD0@Z )\n__TBB_SYMBOL( ?clear@captured_exception@tbb@@QAAXXZ )\n#endif /* __TBB_TASK_GROUP_CONTEXT */\n\n// Symbols for exceptions thrown from TBB\n__TBB_SYMBOL( ?throw_bad_last_alloc_exception_v4@internal@tbb@@YAXXZ )\n__TBB_SYMBOL( ?throw_exception_v4@internal@tbb@@YAXW4exception_id@12@@Z )\n__TBB_SYMBOL( ?what@bad_last_alloc@tbb@@UBAPBDXZ )\n__TBB_SYMBOL( ?what@missing_wait@tbb@@UBAPBDXZ )\n__TBB_SYMBOL( ?what@invalid_multiple_scheduling@tbb@@UBAPBDXZ )\n__TBB_SYMBOL( ?what@improper_lock@tbb@@UBAPBDXZ )\n__TBB_SYMBOL( ?what@user_abort@tbb@@UBAPBDXZ )\n\n// tbb_misc.cpp\n__TBB_SYMBOL( ?assertion_failure@tbb@@YAXPBDH00@Z )\n__TBB_SYMBOL( ?get_initial_auto_partitioner_divisor@internal@tbb@@YAIXZ )\n__TBB_SYMBOL( ?handle_perror@internal@tbb@@YAXHPBD@Z )\n__TBB_SYMBOL( ?set_assertion_handler@tbb@@YAP6AXPBDH00@ZP6AX0H00@Z@Z )\n__TBB_SYMBOL( ?runtime_warning@internal@tbb@@YAXPBDZZ )\n__TBB_SYMBOL( TBB_runtime_interface_version )\n\n// tbb_main.cpp\n__TBB_SYMBOL( ?itt_load_pointer_with_acquire_v3@internal@tbb@@YAPAXPBX@Z )\n__TBB_SYMBOL( ?itt_store_pointer_with_release_v3@internal@tbb@@YAXPAX0@Z )\n__TBB_SYMBOL( ?call_itt_notify_v5@internal@tbb@@YAXHPAX@Z )\n__TBB_SYMBOL( ?itt_set_sync_name_v3@internal@tbb@@YAXPAXPB_W@Z )\n__TBB_SYMBOL( ?itt_load_pointer_v3@internal@tbb@@YAPAXPBX@Z )\n\n// pipeline.cpp\n__TBB_SYMBOL( ??0pipeline@tbb@@QAA@XZ )\n__TBB_SYMBOL( ??1filter@tbb@@UAA@XZ )\n__TBB_SYMBOL( ??1pipeline@tbb@@UAA@XZ )\n__TBB_SYMBOL( ??_7pipeline@tbb@@6B@ )\n__TBB_SYMBOL( ?add_filter@pipeline@tbb@@QAAXAAVfilter@2@@Z )\n__TBB_SYMBOL( ?clear@pipeline@tbb@@QAAXXZ )\n__TBB_SYMBOL( ?inject_token@pipeline@tbb@@AAAXAAVtask@2@@Z )\n__TBB_SYMBOL( ?run@pipeline@tbb@@QAAXI@Z )\n#if __TBB_TASK_GROUP_CONTEXT\n__TBB_SYMBOL( ?run@pipeline@tbb@@QAAXIAAVtask_group_context@2@@Z )\n#endif\n__TBB_SYMBOL( ?process_item@thread_bound_filter@tbb@@QAA?AW4result_type@12@XZ )\n__TBB_SYMBOL( ?try_process_item@thread_bound_filter@tbb@@QAA?AW4result_type@12@XZ )\n__TBB_SYMBOL( ?set_end_of_input@filter@tbb@@IAAXXZ )\n\n// queuing_rw_mutex.cpp\n__TBB_SYMBOL( ?internal_construct@queuing_rw_mutex@tbb@@QAAXXZ )\n__TBB_SYMBOL( ?acquire@scoped_lock@queuing_rw_mutex@tbb@@QAAXAAV23@_N@Z )\n__TBB_SYMBOL( ?downgrade_to_reader@scoped_lock@queuing_rw_mutex@tbb@@QAA_NXZ )\n__TBB_SYMBOL( ?release@scoped_lock@queuing_rw_mutex@tbb@@QAAXXZ )\n__TBB_SYMBOL( ?upgrade_to_writer@scoped_lock@queuing_rw_mutex@tbb@@QAA_NXZ )\n__TBB_SYMBOL( ?try_acquire@scoped_lock@queuing_rw_mutex@tbb@@QAA_NAAV23@_N@Z )\n\n// reader_writer_lock.cpp\n__TBB_SYMBOL( ?try_lock_read@reader_writer_lock@interface5@tbb@@QAA_NXZ )\n__TBB_SYMBOL( ?try_lock@reader_writer_lock@interface5@tbb@@QAA_NXZ )\n__TBB_SYMBOL( ?unlock@reader_writer_lock@interface5@tbb@@QAAXXZ )\n__TBB_SYMBOL( ?lock_read@reader_writer_lock@interface5@tbb@@QAAXXZ )\n__TBB_SYMBOL( ?lock@reader_writer_lock@interface5@tbb@@QAAXXZ )\n__TBB_SYMBOL( ?internal_construct@reader_writer_lock@interface5@tbb@@AAAXXZ )\n__TBB_SYMBOL( ?internal_destroy@reader_writer_lock@interface5@tbb@@AAAXXZ )\n__TBB_SYMBOL( ?internal_construct@scoped_lock@reader_writer_lock@interface5@tbb@@AAAXAAV234@@Z )\n__TBB_SYMBOL( ?internal_destroy@scoped_lock@reader_writer_lock@interface5@tbb@@AAAXXZ )\n__TBB_SYMBOL( ?internal_construct@scoped_lock_read@reader_writer_lock@interface5@tbb@@AAAXAAV234@@Z )\n__TBB_SYMBOL( ?internal_destroy@scoped_lock_read@reader_writer_lock@interface5@tbb@@AAAXXZ )\n\n#if !TBB_NO_LEGACY\n// spin_rw_mutex.cpp v2\n__TBB_SYMBOL( ?internal_acquire_reader@spin_rw_mutex@tbb@@CAXPAV12@@Z )\n__TBB_SYMBOL( ?internal_acquire_writer@spin_rw_mutex@tbb@@CA_NPAV12@@Z )\n__TBB_SYMBOL( ?internal_downgrade@spin_rw_mutex@tbb@@CAXPAV12@@Z )\n__TBB_SYMBOL( ?internal_itt_releasing@spin_rw_mutex@tbb@@CAXPAV12@@Z )\n__TBB_SYMBOL( ?internal_release_reader@spin_rw_mutex@tbb@@CAXPAV12@@Z )\n__TBB_SYMBOL( ?internal_release_writer@spin_rw_mutex@tbb@@CAXPAV12@@Z )\n__TBB_SYMBOL( ?internal_upgrade@spin_rw_mutex@tbb@@CA_NPAV12@@Z )\n__TBB_SYMBOL( ?internal_try_acquire_writer@spin_rw_mutex@tbb@@CA_NPAV12@@Z )\n__TBB_SYMBOL( ?internal_try_acquire_reader@spin_rw_mutex@tbb@@CA_NPAV12@@Z )\n#endif\n\n// spin_rw_mutex v3\n__TBB_SYMBOL( ?internal_construct@spin_rw_mutex_v3@tbb@@AAAXXZ )\n__TBB_SYMBOL( ?internal_upgrade@spin_rw_mutex_v3@tbb@@AAA_NXZ )\n__TBB_SYMBOL( ?internal_downgrade@spin_rw_mutex_v3@tbb@@AAAXXZ )\n__TBB_SYMBOL( ?internal_acquire_reader@spin_rw_mutex_v3@tbb@@AAAXXZ )\n__TBB_SYMBOL( ?internal_acquire_writer@spin_rw_mutex_v3@tbb@@AAA_NXZ )\n__TBB_SYMBOL( ?internal_release_reader@spin_rw_mutex_v3@tbb@@AAAXXZ )\n__TBB_SYMBOL( ?internal_release_writer@spin_rw_mutex_v3@tbb@@AAAXXZ )\n__TBB_SYMBOL( ?internal_try_acquire_reader@spin_rw_mutex_v3@tbb@@AAA_NXZ )\n__TBB_SYMBOL( ?internal_try_acquire_writer@spin_rw_mutex_v3@tbb@@AAA_NXZ )\n\n// spin_mutex.cpp\n__TBB_SYMBOL( ?internal_construct@spin_mutex@tbb@@QAAXXZ )\n__TBB_SYMBOL( ?internal_acquire@scoped_lock@spin_mutex@tbb@@AAAXAAV23@@Z )\n__TBB_SYMBOL( ?internal_release@scoped_lock@spin_mutex@tbb@@AAAXXZ )\n__TBB_SYMBOL( ?internal_try_acquire@scoped_lock@spin_mutex@tbb@@AAA_NAAV23@@Z )\n\n// mutex.cpp\n__TBB_SYMBOL( ?internal_acquire@scoped_lock@mutex@tbb@@AAAXAAV23@@Z )\n__TBB_SYMBOL( ?internal_release@scoped_lock@mutex@tbb@@AAAXXZ )\n__TBB_SYMBOL( ?internal_try_acquire@scoped_lock@mutex@tbb@@AAA_NAAV23@@Z )\n__TBB_SYMBOL( ?internal_construct@mutex@tbb@@AAAXXZ )\n__TBB_SYMBOL( ?internal_destroy@mutex@tbb@@AAAXXZ )\n\n// recursive_mutex.cpp\n__TBB_SYMBOL( ?internal_acquire@scoped_lock@recursive_mutex@tbb@@AAAXAAV23@@Z )\n__TBB_SYMBOL( ?internal_release@scoped_lock@recursive_mutex@tbb@@AAAXXZ )\n__TBB_SYMBOL( ?internal_try_acquire@scoped_lock@recursive_mutex@tbb@@AAA_NAAV23@@Z )\n__TBB_SYMBOL( ?internal_construct@recursive_mutex@tbb@@AAAXXZ )\n__TBB_SYMBOL( ?internal_destroy@recursive_mutex@tbb@@AAAXXZ )\n\n// queuing_mutex.cpp\n__TBB_SYMBOL( ?internal_construct@queuing_mutex@tbb@@QAAXXZ )\n__TBB_SYMBOL( ?acquire@scoped_lock@queuing_mutex@tbb@@QAAXAAV23@@Z )\n__TBB_SYMBOL( ?release@scoped_lock@queuing_mutex@tbb@@QAAXXZ )\n__TBB_SYMBOL( ?try_acquire@scoped_lock@queuing_mutex@tbb@@QAA_NAAV23@@Z )\n\n// critical_section.cpp\n__TBB_SYMBOL( ?internal_construct@critical_section_v4@internal@tbb@@QAAXXZ )\n\n#if !TBB_NO_LEGACY\n// concurrent_hash_map.cpp\n__TBB_SYMBOL( ?internal_grow_predicate@hash_map_segment_base@internal@tbb@@QBA_NXZ )\n\n// concurrent_queue.cpp v2\n__TBB_SYMBOL( ?advance@concurrent_queue_iterator_base@internal@tbb@@IAAXXZ )\n__TBB_SYMBOL( ?assign@concurrent_queue_iterator_base@internal@tbb@@IAAXABV123@@Z )\n__TBB_SYMBOL( ?internal_size@concurrent_queue_base@internal@tbb@@IBAHXZ )\n__TBB_SYMBOL( ??0concurrent_queue_base@internal@tbb@@IAA@I@Z )\n__TBB_SYMBOL( ??0concurrent_queue_iterator_base@internal@tbb@@IAA@ABVconcurrent_queue_base@12@@Z )\n__TBB_SYMBOL( ??1concurrent_queue_base@internal@tbb@@MAA@XZ )\n__TBB_SYMBOL( ??1concurrent_queue_iterator_base@internal@tbb@@IAA@XZ )\n__TBB_SYMBOL( ?internal_pop@concurrent_queue_base@internal@tbb@@IAAXPAX@Z )\n__TBB_SYMBOL( ?internal_pop_if_present@concurrent_queue_base@internal@tbb@@IAA_NPAX@Z )\n__TBB_SYMBOL( ?internal_push@concurrent_queue_base@internal@tbb@@IAAXPBX@Z )\n__TBB_SYMBOL( ?internal_push_if_not_full@concurrent_queue_base@internal@tbb@@IAA_NPBX@Z )\n__TBB_SYMBOL( ?internal_set_capacity@concurrent_queue_base@internal@tbb@@IAAXHI@Z )\n#endif\n\n// concurrent_queue v3\n__TBB_SYMBOL( ??1concurrent_queue_iterator_base_v3@internal@tbb@@IAA@XZ )\n__TBB_SYMBOL( ??0concurrent_queue_iterator_base_v3@internal@tbb@@IAA@ABVconcurrent_queue_base_v3@12@@Z )\n__TBB_SYMBOL( ??0concurrent_queue_iterator_base_v3@internal@tbb@@IAA@ABVconcurrent_queue_base_v3@12@I@Z )\n__TBB_SYMBOL( ?advance@concurrent_queue_iterator_base_v3@internal@tbb@@IAAXXZ )\n__TBB_SYMBOL( ?assign@concurrent_queue_iterator_base_v3@internal@tbb@@IAAXABV123@@Z )\n__TBB_SYMBOL( ??0concurrent_queue_base_v3@internal@tbb@@IAA@I@Z )\n__TBB_SYMBOL( ??1concurrent_queue_base_v3@internal@tbb@@MAA@XZ )\n__TBB_SYMBOL( ?internal_pop@concurrent_queue_base_v3@internal@tbb@@IAAXPAX@Z )\n__TBB_SYMBOL( ?internal_pop_if_present@concurrent_queue_base_v3@internal@tbb@@IAA_NPAX@Z )\n__TBB_SYMBOL( ?internal_abort@concurrent_queue_base_v3@internal@tbb@@IAAXXZ )\n__TBB_SYMBOL( ?internal_push@concurrent_queue_base_v3@internal@tbb@@IAAXPBX@Z )\n__TBB_SYMBOL( ?internal_push_move@concurrent_queue_base_v8@internal@tbb@@IAAXPBX@Z )\n__TBB_SYMBOL( ?internal_push_if_not_full@concurrent_queue_base_v3@internal@tbb@@IAA_NPBX@Z )\n__TBB_SYMBOL( ?internal_push_move_if_not_full@concurrent_queue_base_v8@internal@tbb@@IAA_NPBX@Z )\n__TBB_SYMBOL( ?internal_size@concurrent_queue_base_v3@internal@tbb@@IBAHXZ )\n__TBB_SYMBOL( ?internal_empty@concurrent_queue_base_v3@internal@tbb@@IBA_NXZ )\n__TBB_SYMBOL( ?internal_set_capacity@concurrent_queue_base_v3@internal@tbb@@IAAXHI@Z )\n__TBB_SYMBOL( ?internal_finish_clear@concurrent_queue_base_v3@internal@tbb@@IAAXXZ )\n__TBB_SYMBOL( ?internal_throw_exception@concurrent_queue_base_v3@internal@tbb@@IBAXXZ )\n__TBB_SYMBOL( ?assign@concurrent_queue_base_v3@internal@tbb@@IAAXABV123@@Z )\n__TBB_SYMBOL( ?move_content@concurrent_queue_base_v8@internal@tbb@@IAAXAAV123@@Z )\n\n#if !TBB_NO_LEGACY\n// concurrent_vector.cpp v2\n__TBB_SYMBOL( ?internal_assign@concurrent_vector_base@internal@tbb@@IAAXABV123@IP6AXPAXI@ZP6AX1PBXI@Z4@Z )\n__TBB_SYMBOL( ?internal_capacity@concurrent_vector_base@internal@tbb@@IBAIXZ )\n__TBB_SYMBOL( ?internal_clear@concurrent_vector_base@internal@tbb@@IAAXP6AXPAXI@Z_N@Z )\n__TBB_SYMBOL( ?internal_copy@concurrent_vector_base@internal@tbb@@IAAXABV123@IP6AXPAXPBXI@Z@Z )\n__TBB_SYMBOL( ?internal_grow_by@concurrent_vector_base@internal@tbb@@IAAIIIP6AXPAXI@Z@Z )\n__TBB_SYMBOL( ?internal_grow_to_at_least@concurrent_vector_base@internal@tbb@@IAAXIIP6AXPAXI@Z@Z )\n__TBB_SYMBOL( ?internal_push_back@concurrent_vector_base@internal@tbb@@IAAPAXIAAI@Z )\n__TBB_SYMBOL( ?internal_reserve@concurrent_vector_base@internal@tbb@@IAAXIII@Z )\n#endif\n\n// concurrent_vector v3\n__TBB_SYMBOL( ??1concurrent_vector_base_v3@internal@tbb@@IAA@XZ )\n__TBB_SYMBOL( ?internal_assign@concurrent_vector_base_v3@internal@tbb@@IAAXABV123@IP6AXPAXI@ZP6AX1PBXI@Z4@Z )\n__TBB_SYMBOL( ?internal_capacity@concurrent_vector_base_v3@internal@tbb@@IBAIXZ )\n__TBB_SYMBOL( ?internal_clear@concurrent_vector_base_v3@internal@tbb@@IAAIP6AXPAXI@Z@Z )\n__TBB_SYMBOL( ?internal_copy@concurrent_vector_base_v3@internal@tbb@@IAAXABV123@IP6AXPAXPBXI@Z@Z )\n__TBB_SYMBOL( ?internal_grow_by@concurrent_vector_base_v3@internal@tbb@@IAAIIIP6AXPAXPBXI@Z1@Z )\n__TBB_SYMBOL( ?internal_grow_to_at_least@concurrent_vector_base_v3@internal@tbb@@IAAXIIP6AXPAXPBXI@Z1@Z )\n__TBB_SYMBOL( ?internal_push_back@concurrent_vector_base_v3@internal@tbb@@IAAPAXIAAI@Z )\n__TBB_SYMBOL( ?internal_reserve@concurrent_vector_base_v3@internal@tbb@@IAAXIII@Z )\n__TBB_SYMBOL( ?internal_compact@concurrent_vector_base_v3@internal@tbb@@IAAPAXIPAXP6AX0I@ZP6AX0PBXI@Z@Z )\n__TBB_SYMBOL( ?internal_swap@concurrent_vector_base_v3@internal@tbb@@IAAXAAV123@@Z )\n__TBB_SYMBOL( ?internal_throw_exception@concurrent_vector_base_v3@internal@tbb@@IBAXI@Z )\n__TBB_SYMBOL( ?internal_resize@concurrent_vector_base_v3@internal@tbb@@IAAXIIIPBXP6AXPAXI@ZP6AX10I@Z@Z )\n__TBB_SYMBOL( ?internal_grow_to_at_least_with_result@concurrent_vector_base_v3@internal@tbb@@IAAIIIP6AXPAXPBXI@Z1@Z )\n\n// tbb_thread\n__TBB_SYMBOL( ?join@tbb_thread_v3@internal@tbb@@QAAXXZ )\n__TBB_SYMBOL( ?detach@tbb_thread_v3@internal@tbb@@QAAXXZ )\n__TBB_SYMBOL( ?internal_start@tbb_thread_v3@internal@tbb@@AAAXP6AIPAX@Z0@Z )\n__TBB_SYMBOL( ?allocate_closure_v3@internal@tbb@@YAPAXI@Z )\n__TBB_SYMBOL( ?free_closure_v3@internal@tbb@@YAXPAX@Z )\n__TBB_SYMBOL( ?hardware_concurrency@tbb_thread_v3@internal@tbb@@SAIXZ )\n__TBB_SYMBOL( ?thread_yield_v3@internal@tbb@@YAXXZ )\n__TBB_SYMBOL( ?thread_sleep_v3@internal@tbb@@YAXABVinterval_t@tick_count@2@@Z )\n__TBB_SYMBOL( ?move_v3@internal@tbb@@YAXAAVtbb_thread_v3@12@0@Z )\n__TBB_SYMBOL( ?thread_get_id_v3@internal@tbb@@YA?AVid@tbb_thread_v3@12@XZ )\n\n// condition_variable\n__TBB_SYMBOL( ?internal_initialize_condition_variable@internal@interface5@tbb@@YAXAATcondvar_impl_t@123@@Z )\n__TBB_SYMBOL( ?internal_condition_variable_wait@internal@interface5@tbb@@YA_NAATcondvar_impl_t@123@PAVmutex@3@PBVinterval_t@tick_count@3@@Z )\n__TBB_SYMBOL( ?internal_condition_variable_notify_one@internal@interface5@tbb@@YAXAATcondvar_impl_t@123@@Z )\n__TBB_SYMBOL( ?internal_condition_variable_notify_all@internal@interface5@tbb@@YAXAATcondvar_impl_t@123@@Z )\n__TBB_SYMBOL( ?internal_destroy_condition_variable@internal@interface5@tbb@@YAXAATcondvar_impl_t@123@@Z )\n\n#undef __TBB_SYMBOL\n"
  },
  {
    "path": "benchmarks/tbb/x86_rtm_rw_mutex.cpp",
    "content": "/*\n    Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n\n    This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n    you can redistribute it and/or modify it under the terms of the GNU General Public License\n    version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n    distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n    See  the GNU General Public License for more details.   You should have received a copy of\n    the  GNU General Public License along with Threading Building Blocks; if not, write to the\n    Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n\n    As a special exception,  you may use this file  as part of a free software library without\n    restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n    functions from this file, or you compile this file and link it with other files to produce\n    an executable,  this file does not by itself cause the resulting executable to be covered\n    by the GNU General Public License. This exception does not however invalidate any other\n    reasons why the executable file might be covered by the GNU General Public License.\n*/\n\n#include \"tbb/tbb_config.h\"\n#if __TBB_TSX_AVAILABLE\n#include \"tbb/spin_rw_mutex.h\"\n#include \"tbb/tbb_machine.h\"\n#include \"itt_notify.h\"\n#include \"governor.h\"\n#include \"tbb/atomic.h\"\n\n// __TBB_RW_MUTEX_DELAY_TEST shifts the point where flags aborting speculation are\n// added to the read-set of the operation.  If 1, will add the test just before\n// the transaction is ended.\n#ifndef __TBB_RW_MUTEX_DELAY_TEST\n    #define __TBB_RW_MUTEX_DELAY_TEST 1\n#endif\n\n#if defined(_MSC_VER) && defined(_Wp64)\n    // Workaround for overzealous compiler warnings in /Wp64 mode\n    #pragma warning (disable: 4244)\n#endif\n\nnamespace tbb {\n\nnamespace interface8 {\nnamespace internal {\n\n// abort code for mutexes that detect a conflict with another thread.\n// value is hexadecimal\nenum {\n    speculation_transaction_aborted = 0x01,\n    speculation_can_retry           = 0x02,\n    speculation_memadd_conflict     = 0x04,\n    speculation_buffer_overflow     = 0x08,\n    speculation_breakpoint_hit      = 0x10,\n    speculation_nested_abort        = 0x20,\n    speculation_xabort_mask         = 0xFF000000,\n    speculation_xabort_shift        = 24,\n    speculation_retry               = speculation_transaction_aborted\n                                      | speculation_can_retry\n                                      | speculation_memadd_conflict\n};\n\n// maximum number of times to retry\nstatic const int retry_threshold_read = 10;\nstatic const int retry_threshold_write = 10;\n\n//! Release speculative mutex\nvoid x86_rtm_rw_mutex::internal_release(x86_rtm_rw_mutex::scoped_lock& s) {\n    switch(s.transaction_state) {\n    case RTM_transacting_writer:\n    case RTM_transacting_reader:\n        {\n            __TBB_ASSERT(__TBB_machine_is_in_transaction(), \"transaction_state && not speculating\");\n#if __TBB_RW_MUTEX_DELAY_TEST\n            if(s.transaction_state == RTM_transacting_reader) {\n                if(this->w_flag) __TBB_machine_transaction_conflict_abort();\n            } else {\n                if(this->state) __TBB_machine_transaction_conflict_abort();\n            }\n#endif\n            __TBB_machine_end_transaction();\n            s.my_scoped_lock.internal_set_mutex(NULL);\n        }\n        break;\n    case RTM_real_reader:\n        __TBB_ASSERT(!this->w_flag, \"w_flag set but read lock acquired\");\n        s.my_scoped_lock.release();\n        break;\n    case RTM_real_writer:\n        __TBB_ASSERT(this->w_flag, \"w_flag unset but write lock acquired\");\n        this->w_flag = false;\n        s.my_scoped_lock.release();\n        break;\n    case RTM_not_in_mutex:\n        __TBB_ASSERT(false, \"RTM_not_in_mutex, but in release\");\n    default:\n        __TBB_ASSERT(false, \"invalid transaction_state\");\n    }\n    s.transaction_state = RTM_not_in_mutex;\n}\n\n//! Acquire write lock on the given mutex.\nvoid x86_rtm_rw_mutex::internal_acquire_writer(x86_rtm_rw_mutex::scoped_lock& s, bool only_speculate)\n{\n    __TBB_ASSERT(s.transaction_state == RTM_not_in_mutex, \"scoped_lock already in transaction\");\n    if(tbb::internal::governor::speculation_enabled()) {\n        int num_retries = 0;\n        unsigned int abort_code;\n        do {\n            tbb::internal::atomic_backoff backoff;\n            if(this->state) {\n                if(only_speculate) return;\n                do {\n                    backoff.pause();  // test the spin_rw_mutex (real readers or writers)\n                } while(this->state);\n            }\n            // _xbegin returns -1 on success or the abort code, so capture it\n            if(( abort_code = __TBB_machine_begin_transaction()) == ~(unsigned int)(0) )\n            {\n                // started speculation\n#if !__TBB_RW_MUTEX_DELAY_TEST\n                if(this->state) {  // add spin_rw_mutex to read-set.\n                    // reader or writer grabbed the lock, so abort.\n                    __TBB_machine_transaction_conflict_abort();\n                }\n#endif\n                s.transaction_state = RTM_transacting_writer;\n                s.my_scoped_lock.internal_set_mutex(this);  // need mutex for release()\n                return;  // successfully started speculation\n            }\n            ++num_retries;\n        } while( (abort_code & speculation_retry) != 0 && (num_retries < retry_threshold_write) );\n    }\n\n    if(only_speculate) return;              // should apply a real try_lock...\n    s.my_scoped_lock.acquire(*this, true);  // kill transactional writers\n    __TBB_ASSERT(!w_flag, \"After acquire for write, w_flag already true\");\n    w_flag = true;                          // kill transactional readers\n    s.transaction_state = RTM_real_writer;\n    return;\n}\n\n//! Acquire read lock on given mutex.\n//  only_speculate : true if we are doing a try_acquire.  If true and we fail to speculate, don't\n//     really acquire the lock, return and do a try_acquire on the contained spin_rw_mutex.  If\n//     the lock is already held by a writer, just return.\nvoid x86_rtm_rw_mutex::internal_acquire_reader(x86_rtm_rw_mutex::scoped_lock& s, bool only_speculate) {\n    __TBB_ASSERT(s.transaction_state == RTM_not_in_mutex, \"scoped_lock already in transaction\");\n    if(tbb::internal::governor::speculation_enabled()) {\n        int num_retries = 0;\n        unsigned int abort_code;\n        do {\n            tbb::internal::atomic_backoff backoff;\n            // if in try_acquire, and lock is held as writer, don't attempt to speculate.\n            if(w_flag) {\n                if(only_speculate) return;\n                do {\n                    backoff.pause();  // test the spin_rw_mutex (real readers or writers)\n                } while(w_flag);\n            }\n            // _xbegin returns -1 on success or the abort code, so capture it\n            if((abort_code = __TBB_machine_begin_transaction()) == ~(unsigned int)(0) )\n            {\n                // started speculation\n#if !__TBB_RW_MUTEX_DELAY_TEST\n                if(w_flag) {  // add w_flag to read-set.\n                    __TBB_machine_transaction_conflict_abort();  // writer grabbed the lock, so abort.\n                }\n#endif\n                s.transaction_state = RTM_transacting_reader;\n                s.my_scoped_lock.internal_set_mutex(this);  // need mutex for release()\n                return;  // successfully started speculation\n            }\n            // fallback path\n            // retry only if there is any hope of getting into a transaction soon\n            // Retry in the following cases (from Section 8.3.5 of Intel(R)\n            // Architecture Instruction Set Extensions Programming Reference):\n            // 1. abort caused by XABORT instruction (bit 0 of EAX register is set)\n            // 2. the transaction may succeed on a retry (bit 1 of EAX register is set)\n            // 3. if another logical processor conflicted with a memory address\n            //    that was part of the transaction that aborted (bit 2 of EAX register is set)\n            // That is, retry if (abort_code & 0x7) is non-zero\n            ++num_retries;\n        } while( (abort_code & speculation_retry) != 0 && (num_retries < retry_threshold_read) );\n    }\n\n    if(only_speculate) return;\n    s.my_scoped_lock.acquire( *this, false );\n    s.transaction_state = RTM_real_reader;\n}\n\n//! Upgrade reader to become a writer.\n/** Returns whether the upgrade happened without releasing and re-acquiring the lock */\nbool x86_rtm_rw_mutex::internal_upgrade(x86_rtm_rw_mutex::scoped_lock& s)\n{\n    switch(s.transaction_state) {\n    case RTM_real_reader: {\n            s.transaction_state = RTM_real_writer;\n            bool no_release = s.my_scoped_lock.upgrade_to_writer();\n            __TBB_ASSERT(!w_flag, \"After upgrade_to_writer, w_flag already true\");\n            w_flag = true;\n            return no_release;\n        }\n    case RTM_transacting_reader:\n        s.transaction_state = RTM_transacting_writer;\n        // don't need to add w_flag to read_set even if __TBB_RW_MUTEX_DELAY_TEST\n        // because the this pointer (the spin_rw_mutex) will be sufficient on release.\n        return true;\n    default:\n        __TBB_ASSERT(false, \"Invalid state for upgrade\");\n        return false;\n    }\n}\n\n//! Downgrade writer to a reader.\nbool x86_rtm_rw_mutex::internal_downgrade(x86_rtm_rw_mutex::scoped_lock& s) {\n    switch(s.transaction_state) {\n    case RTM_real_writer:\n        s.transaction_state = RTM_real_reader;\n        __TBB_ASSERT(w_flag, \"Before downgrade_to_reader w_flag not true\");\n        w_flag = false;\n        return s.my_scoped_lock.downgrade_to_reader();\n    case RTM_transacting_writer:\n#if __TBB_RW_MUTEX_DELAY_TEST\n        if(this->state) {  // a reader or writer has acquired mutex for real.\n            __TBB_machine_transaction_conflict_abort();\n        }\n#endif\n        s.transaction_state = RTM_transacting_reader;\n        return true;\n    default:\n        __TBB_ASSERT(false, \"Invalid state for downgrade\");\n        return false;\n    }\n}\n\n//! Try to acquire write lock on the given mutex.\n//  There may be reader(s) which acquired the spin_rw_mutex, as well as possibly\n//  transactional reader(s).  If this is the case, the acquire will fail, and assigning\n//  w_flag will kill the transactors.  So we only assign w_flag if we have successfully\n//  acquired the lock.\nbool x86_rtm_rw_mutex::internal_try_acquire_writer(x86_rtm_rw_mutex::scoped_lock& s)\n{\n    internal_acquire_writer(s, /*only_speculate=*/true);\n    if(s.transaction_state == RTM_transacting_writer) {\n        return true;\n    }\n    __TBB_ASSERT(s.transaction_state == RTM_not_in_mutex, \"Trying to acquire writer which is already allocated\");\n    // transacting write acquire failed.  try_acquire the real mutex\n    bool result = s.my_scoped_lock.try_acquire(*this, true);\n    if(result) {\n        // only shoot down readers if we're not transacting ourselves\n        __TBB_ASSERT(!w_flag, \"After try_acquire_writer, w_flag already true\");\n        w_flag = true;\n        s.transaction_state = RTM_real_writer;\n    }\n    return result;\n}\n\nvoid x86_rtm_rw_mutex::internal_construct() {\n    ITT_SYNC_CREATE(this, _T(\"tbb::x86_rtm_rw_mutex\"), _T(\"\"));\n}\n\n} // namespace internal\n} // namespace interface8\n} // namespace tbb\n\n#endif /* __TBB_TSX_AVAILABLE */\n"
  },
  {
    "path": "benchmarks/tbb/xbox360-tbb-export.def",
    "content": "; Copyright 2005-2014 Intel Corporation.  All Rights Reserved.\n;\n; This file is part of Threading Building Blocks. Threading Building Blocks is free software;\n; you can redistribute it and/or modify it under the terms of the GNU General Public License\n; version 2  as  published  by  the  Free Software Foundation.  Threading Building Blocks is\n; distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the\n; implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n; See  the GNU General Public License for more details.   You should have received a copy of\n; the  GNU General Public License along with Threading Building Blocks; if not, write to the\n; Free Software Foundation, Inc.,  51 Franklin St,  Fifth Floor,  Boston,  MA 02110-1301 USA\n;\n; As a special exception,  you may use this file  as part of a free software library without\n; restriction.  Specifically,  if other files instantiate templates  or use macros or inline\n; functions from this file, or you compile this file and link it with other files to produce\n; an executable,  this file does not by itself cause the resulting executable to be covered\n; by the GNU General Public License. This exception does not however invalidate any other\n; reasons why the executable file might be covered by the GNU General Public License.\n\nEXPORTS\n\n; Assembly-language support that is called directly by clients\n;__TBB_machine_cmpswp1\n;__TBB_machine_cmpswp2\n;__TBB_machine_cmpswp4\n;__TBB_machine_cmpswp8\n;__TBB_machine_fetchadd1\n;__TBB_machine_fetchadd2\n;__TBB_machine_fetchadd4\n;__TBB_machine_fetchadd8\n;__TBB_machine_fetchstore1\n;__TBB_machine_fetchstore2\n;__TBB_machine_fetchstore4\n;__TBB_machine_fetchstore8\n;__TBB_machine_store8\n;__TBB_machine_load8\n;__TBB_machine_trylockbyte\n\n; cache_aligned_allocator.cpp\n?NFS_Allocate@internal@tbb@@YAPAXIIPAX@Z @1\n?NFS_GetLineSize@internal@tbb@@YAIXZ @2\n?NFS_Free@internal@tbb@@YAXPAX@Z @3 \n?allocate_via_handler_v3@internal@tbb@@YAPAXI@Z @4\n?deallocate_via_handler_v3@internal@tbb@@YAXPAX@Z @5\n?is_malloc_used_v3@internal@tbb@@YA_NXZ @6\n\n; task.cpp v3\n?allocate@allocate_additional_child_of_proxy@internal@tbb@@QBAAAVtask@3@I@Z @7\n?allocate@allocate_child_proxy@internal@tbb@@QBAAAVtask@3@I@Z @8\n?allocate@allocate_continuation_proxy@internal@tbb@@QBAAAVtask@3@I@Z @9\n?allocate@allocate_root_proxy@internal@tbb@@SAAAVtask@3@I@Z @10\n?destroy@task@tbb@@QAAXAAV12@@Z @11\n?free@allocate_additional_child_of_proxy@internal@tbb@@QBAXAAVtask@3@@Z @12\n?free@allocate_child_proxy@internal@tbb@@QBAXAAVtask@3@@Z @13\n?free@allocate_continuation_proxy@internal@tbb@@QBAXAAVtask@3@@Z @14\n?free@allocate_root_proxy@internal@tbb@@SAXAAVtask@3@@Z @15\n?internal_set_ref_count@task@tbb@@AAAXH@Z @16\n?is_owned_by_current_thread@task@tbb@@QBA_NXZ @17\n?note_affinity@task@tbb@@UAAXG@Z @18\n?resize@affinity_partitioner_base_v3@internal@tbb@@AAAXI@Z @19\n?self@task@tbb@@SAAAV12@XZ @20\n?spawn_and_wait_for_all@task@tbb@@QAAXAAVtask_list@2@@Z @21\n?default_num_threads@task_scheduler_init@tbb@@SAHXZ @22\n?initialize@task_scheduler_init@tbb@@QAAXHI@Z @23\n?initialize@task_scheduler_init@tbb@@QAAXH@Z @24\n?terminate@task_scheduler_init@tbb@@QAAXXZ @25\n?observe@task_scheduler_observer_v3@internal@tbb@@QAAX_N@Z @26\n\n; exception handling support\n?allocate@allocate_root_with_context_proxy@internal@tbb@@QBAAAVtask@3@I@Z @27\n?free@allocate_root_with_context_proxy@internal@tbb@@QBAXAAVtask@3@@Z @28\n?is_group_execution_cancelled@task_group_context@tbb@@QBA_NXZ @29\n?cancel_group_execution@task_group_context@tbb@@QAA_NXZ @30\n?reset@task_group_context@tbb@@QAAXXZ @31\n?init@task_group_context@tbb@@IAAXXZ @32\n??1task_group_context@tbb@@QAA@XZ @33\n?name@captured_exception@tbb@@UBAPBDXZ @34\n?what@captured_exception@tbb@@UBAPBDXZ @35   \n??1captured_exception@tbb@@UAA@XZ @36\n\n; tbb_misc.cpp\n?assertion_failure@tbb@@YAXPBDH00@Z @37\n?get_initial_auto_partitioner_divisor@internal@tbb@@YAIXZ @38\n?handle_perror@internal@tbb@@YAXHPBD@Z @39\n?set_assertion_handler@tbb@@YAP6AXPBDH00@ZP6AX0H00@Z@Z @40\n?runtime_warning@internal@tbb@@YAXPBDZZ @41\n\n; tbb_main.cpp\n?itt_load_pointer_with_acquire_v3@internal@tbb@@YAPAXPBX@Z @42\n?itt_store_pointer_with_release_v3@internal@tbb@@YAXPAX0@Z @43\n\n; pipeline.cpp\n??0pipeline@tbb@@QAA@XZ @44\n??1filter@tbb@@UAA@XZ @45\n??1pipeline@tbb@@UAA@XZ @46   \n??_7pipeline@tbb@@6B@ @47\n?add_filter@pipeline@tbb@@QAAXAAVfilter@2@@Z @48\n?clear@pipeline@tbb@@QAAXXZ @49\n?inject_token@pipeline@tbb@@AAAXAAVtask@2@@Z @50\n?run@pipeline@tbb@@QAAXI@Z @51\n\n; queuing_rw_mutex.cpp\n?acquire@scoped_lock@queuing_rw_mutex@tbb@@QAAXAAV23@_N@Z @52\n?downgrade_to_reader@scoped_lock@queuing_rw_mutex@tbb@@QAA_NXZ @53\n?release@scoped_lock@queuing_rw_mutex@tbb@@QAAXXZ @54\n?upgrade_to_writer@scoped_lock@queuing_rw_mutex@tbb@@QAA_NXZ @55\n?try_acquire@scoped_lock@queuing_rw_mutex@tbb@@QAA_NAAV23@_N@Z @56\n\n#if !TBB_NO_LEGACY\n; spin_rw_mutex.cpp v2\n?internal_acquire_reader@spin_rw_mutex@tbb@@CAXPAV12@@Z @57\n?internal_acquire_writer@spin_rw_mutex@tbb@@CA_NPAV12@@Z @58\n?internal_downgrade@spin_rw_mutex@tbb@@CAXPAV12@@Z @59\n?internal_itt_releasing@spin_rw_mutex@tbb@@CAXPAV12@@Z @60\n?internal_release_reader@spin_rw_mutex@tbb@@CAXPAV12@@Z @61   \n?internal_release_writer@spin_rw_mutex@tbb@@CAXPAV12@@Z @62\n?internal_upgrade@spin_rw_mutex@tbb@@CA_NPAV12@@Z @63\n?internal_try_acquire_writer@spin_rw_mutex@tbb@@CA_NPAV12@@Z @64\n?internal_try_acquire_reader@spin_rw_mutex@tbb@@CA_NPAV12@@Z @65\n#endif\n\n; spin_rw_mutex v3\n?internal_upgrade@spin_rw_mutex_v3@tbb@@AAA_NXZ @66\n?internal_downgrade@spin_rw_mutex_v3@tbb@@AAAXXZ @67\n?internal_acquire_reader@spin_rw_mutex_v3@tbb@@AAAXXZ @68\n?internal_acquire_writer@spin_rw_mutex_v3@tbb@@AAA_NXZ @69\n?internal_release_reader@spin_rw_mutex_v3@tbb@@AAAXXZ @70\n?internal_release_writer@spin_rw_mutex_v3@tbb@@AAAXXZ @71\n?internal_try_acquire_reader@spin_rw_mutex_v3@tbb@@AAA_NXZ @72\n?internal_try_acquire_writer@spin_rw_mutex_v3@tbb@@AAA_NXZ @73\n\n; spin_mutex.cpp\n?internal_acquire@scoped_lock@spin_mutex@tbb@@AAAXAAV23@@Z @74\n?internal_release@scoped_lock@spin_mutex@tbb@@AAAXXZ @75\n?internal_try_acquire@scoped_lock@spin_mutex@tbb@@AAA_NAAV23@@Z @76\n\n; mutex.cpp\n?internal_acquire@scoped_lock@mutex@tbb@@AAAXAAV23@@Z @77\n?internal_release@scoped_lock@mutex@tbb@@AAAXXZ @78\n?internal_try_acquire@scoped_lock@mutex@tbb@@AAA_NAAV23@@Z @79\n?internal_construct@mutex@tbb@@AAAXXZ @80\n?internal_destroy@mutex@tbb@@AAAXXZ @81\n\n; recursive_mutex.cpp\n?internal_acquire@scoped_lock@recursive_mutex@tbb@@AAAXAAV23@@Z @82 \n?internal_release@scoped_lock@recursive_mutex@tbb@@AAAXXZ @83\n?internal_try_acquire@scoped_lock@recursive_mutex@tbb@@AAA_NAAV23@@Z @84\n?internal_construct@recursive_mutex@tbb@@AAAXXZ @85\n?internal_destroy@recursive_mutex@tbb@@AAAXXZ @86\n\n; queuing_mutex.cpp\n?acquire@scoped_lock@queuing_mutex@tbb@@QAAXAAV23@@Z @87\n?release@scoped_lock@queuing_mutex@tbb@@QAAXXZ @88\n?try_acquire@scoped_lock@queuing_mutex@tbb@@QAA_NAAV23@@Z @89\n\n; concurrent_hash_map.cpp\n?internal_grow_predicate@hash_map_segment_base@internal@tbb@@QBA_NXZ @90\n\n#if !TBB_NO_LEGACY\n; concurrent_queue.cpp v2\n?advance@concurrent_queue_iterator_base@internal@tbb@@IAAXXZ @91\n?assign@concurrent_queue_iterator_base@internal@tbb@@IAAXABV123@@Z @92\n?internal_size@concurrent_queue_base@internal@tbb@@IBAHXZ @93\n??0concurrent_queue_base@internal@tbb@@IAA@I@Z @94\n??0concurrent_queue_iterator_base@internal@tbb@@IAA@ABVconcurrent_queue_base@12@@Z @95\n??1concurrent_queue_base@internal@tbb@@MAA@XZ @96\n??1concurrent_queue_iterator_base@internal@tbb@@IAA@XZ @97\n?internal_pop@concurrent_queue_base@internal@tbb@@IAAXPAX@Z @98\n?internal_pop_if_present@concurrent_queue_base@internal@tbb@@IAA_NPAX@Z @99\n?internal_push@concurrent_queue_base@internal@tbb@@IAAXPBX@Z @100\n?internal_push_if_not_full@concurrent_queue_base@internal@tbb@@IAA_NPBX@Z @101\n?internal_set_capacity@concurrent_queue_base@internal@tbb@@IAAXHI@Z @102\n#endif\n\n; concurrent_queue v3\n??1concurrent_queue_iterator_base_v3@internal@tbb@@IAA@XZ @103\n??0concurrent_queue_iterator_base_v3@internal@tbb@@IAA@ABVconcurrent_queue_base_v3@12@@Z @104\n?advance@concurrent_queue_iterator_base_v3@internal@tbb@@IAAXXZ @105\n?assign@concurrent_queue_iterator_base_v3@internal@tbb@@IAAXABV123@@Z @106\n??0concurrent_queue_base_v3@internal@tbb@@IAA@I@Z @107\n??1concurrent_queue_base_v3@internal@tbb@@MAA@XZ @108\n?internal_pop@concurrent_queue_base_v3@internal@tbb@@IAAXPAX@Z @109\n?internal_pop_if_present@concurrent_queue_base_v3@internal@tbb@@IAA_NPAX@Z @110\n?internal_push@concurrent_queue_base_v3@internal@tbb@@IAAXPBX@Z @111\n?internal_push_if_not_full@concurrent_queue_base_v3@internal@tbb@@IAA_NPBX@Z @112\n?internal_size@concurrent_queue_base_v3@internal@tbb@@IBAHXZ @113\n?internal_set_capacity@concurrent_queue_base_v3@internal@tbb@@IAAXHI@Z @114\n?internal_finish_clear@concurrent_queue_base_v3@internal@tbb@@IAAXXZ @115\n?internal_throw_exception@concurrent_queue_base_v3@internal@tbb@@IBAXXZ @116\n\n#if !TBB_NO_LEGACY\n; concurrent_vector.cpp v2\n?internal_assign@concurrent_vector_base@internal@tbb@@IAAXABV123@IP6AXPAXI@ZP6AX1PBXI@Z4@Z @117\n?internal_capacity@concurrent_vector_base@internal@tbb@@IBAIXZ @118\n?internal_clear@concurrent_vector_base@internal@tbb@@IAAXP6AXPAXI@Z_N@Z @119\n?internal_copy@concurrent_vector_base@internal@tbb@@IAAXABV123@IP6AXPAXPBXI@Z@Z @120\n?internal_grow_by@concurrent_vector_base@internal@tbb@@IAAIIIP6AXPAXI@Z@Z @121\n?internal_grow_to_at_least@concurrent_vector_base@internal@tbb@@IAAXIIP6AXPAXI@Z@Z @122\n?internal_push_back@concurrent_vector_base@internal@tbb@@IAAPAXIAAI@Z @123\n?internal_reserve@concurrent_vector_base@internal@tbb@@IAAXIII@Z @124\n#endif\n\n; concurrent_vector v3\n??1concurrent_vector_base_v3@internal@tbb@@IAA@XZ @125\n?internal_assign@concurrent_vector_base_v3@internal@tbb@@IAAXABV123@IP6AXPAXI@ZP6AX1PBXI@Z4@Z @126\n?internal_capacity@concurrent_vector_base_v3@internal@tbb@@IBAIXZ @127\n?internal_clear@concurrent_vector_base_v3@internal@tbb@@IAAIP6AXPAXI@Z@Z @128\n?internal_copy@concurrent_vector_base_v3@internal@tbb@@IAAXABV123@IP6AXPAXPBXI@Z@Z @129\n?internal_grow_by@concurrent_vector_base_v3@internal@tbb@@IAAIIIP6AXPAXPBXI@Z1@Z @130\n?internal_grow_to_at_least@concurrent_vector_base_v3@internal@tbb@@IAAXIIP6AXPAXPBXI@Z1@Z @131\n?internal_push_back@concurrent_vector_base_v3@internal@tbb@@IAAPAXIAAI@Z @132\n?internal_reserve@concurrent_vector_base_v3@internal@tbb@@IAAXIII@Z @133\n?internal_compact@concurrent_vector_base_v3@internal@tbb@@IAAPAXIPAXP6AX0I@ZP6AX0PBXI@Z@Z @134\n?internal_swap@concurrent_vector_base_v3@internal@tbb@@IAAXAAV123@@Z @135\n?internal_throw_exception@concurrent_vector_base_v3@internal@tbb@@IBAXI@Z @136\n\n; tbb_thread\n?join@tbb_thread_v3@internal@tbb@@QAAXXZ @137\n?detach@tbb_thread_v3@internal@tbb@@QAAXXZ @138\n?internal_start@tbb_thread_v3@internal@tbb@@AAAXP6AIPAX@Z0@Z @139\n?allocate_closure_v3@internal@tbb@@YAPAXI@Z @140\n?free_closure_v3@internal@tbb@@YAXPAX@Z @141\n?hardware_concurrency@tbb_thread_v3@internal@tbb@@SAIXZ @142\n?thread_yield_v3@internal@tbb@@YAXXZ @143\n?thread_sleep_v3@internal@tbb@@YAXABVinterval_t@tick_count@2@@Z @144\n?move_v3@internal@tbb@@YAXAAVtbb_thread_v3@12@0@Z @145\n?thread_get_id_v3@internal@tbb@@YA?AVid@tbb_thread_v3@12@XZ @146\n"
  },
  {
    "path": "benchmarks/tbbqueue.h",
    "content": "#pragma once\n\n#include <utility>\n\n#include \"tbb/concurrent_queue.h\"\n#include \"wrappers.h\"\n\ntemplate<typename T>\nstruct TbbQueueWrapper\n{\npublic:\n\ttypedef DummyToken producer_token_t;\n\ttypedef DummyToken consumer_token_t;\n\t\npublic:\n\ttemplate<typename U>\n\tinline bool enqueue(U&& item)\n\t{\n\t\tq.push(std::forward<U>(item));\n\t\treturn true;\t\t// assume successful allocation for the sake of the benchmarks\n\t}\n\t\n\tinline bool try_dequeue(T& item)\n\t{\n\t\treturn q.try_pop(item);\n\t}\n\t\n\t// Dummy token methods (not used)\n\tbool enqueue(producer_token_t const&, T const&) { return false; }\n\tbool try_enqueue(producer_token_t, T const&) { return false; }\n\tbool try_dequeue(consumer_token_t, T& item) { return false; }\n\ttemplate<typename It> bool enqueue_bulk(It, size_t) { return false; }\n\ttemplate<typename It> bool enqueue_bulk(producer_token_t const&, It, size_t) { return false; }\n\ttemplate<typename It> size_t try_dequeue_bulk(It, size_t) { return 0; }\n\ttemplate<typename It> size_t try_dequeue_bulk(consumer_token_t, It, size_t) { return 0; }\n\t\nprivate:\n\ttbb::concurrent_queue<T> q;\n};\n"
  },
  {
    "path": "benchmarks/wrappers.h",
    "content": "#pragma once\n\nstruct DummyToken\n{\n\ttemplate<typename TQueue>\n\tDummyToken(TQueue const&)\n\t{\n\t}\n};\n"
  },
  {
    "path": "blockingconcurrentqueue.h",
    "content": "// Provides an efficient blocking version of moodycamel::ConcurrentQueue.\n// ©2015-2020 Cameron Desrochers. Distributed under the terms of the simplified\n// BSD license, available at the top of concurrentqueue.h.\n// Also dual-licensed under the Boost Software License (see LICENSE.md)\n// Uses Jeff Preshing's semaphore implementation (under the terms of its\n// separate zlib license, see lightweightsemaphore.h).\n\n#pragma once\n\n#include \"concurrentqueue.h\"\n#include \"lightweightsemaphore.h\"\n\n#include <type_traits>\n#include <cerrno>\n#include <memory>\n#include <chrono>\n#include <ctime>\n\nnamespace moodycamel\n{\n// This is a blocking version of the queue. It has an almost identical interface to\n// the normal non-blocking version, with the addition of various wait_dequeue() methods\n// and the removal of producer-specific dequeue methods.\ntemplate<typename T, typename Traits = ConcurrentQueueDefaultTraits>\nclass BlockingConcurrentQueue\n{\nprivate:\n\ttypedef ::moodycamel::ConcurrentQueue<T, Traits> ConcurrentQueue;\n\ttypedef ::moodycamel::LightweightSemaphore LightweightSemaphore;\n\npublic:\n\ttypedef typename ConcurrentQueue::producer_token_t producer_token_t;\n\ttypedef typename ConcurrentQueue::consumer_token_t consumer_token_t;\n\t\n\ttypedef typename ConcurrentQueue::index_t index_t;\n\ttypedef typename ConcurrentQueue::size_t size_t;\n\ttypedef typename std::make_signed<size_t>::type ssize_t;\n\t\n\tstatic const size_t BLOCK_SIZE = ConcurrentQueue::BLOCK_SIZE;\n\tstatic const size_t EXPLICIT_BLOCK_EMPTY_COUNTER_THRESHOLD = ConcurrentQueue::EXPLICIT_BLOCK_EMPTY_COUNTER_THRESHOLD;\n\tstatic const size_t EXPLICIT_INITIAL_INDEX_SIZE = ConcurrentQueue::EXPLICIT_INITIAL_INDEX_SIZE;\n\tstatic const size_t IMPLICIT_INITIAL_INDEX_SIZE = ConcurrentQueue::IMPLICIT_INITIAL_INDEX_SIZE;\n\tstatic const size_t INITIAL_IMPLICIT_PRODUCER_HASH_SIZE = ConcurrentQueue::INITIAL_IMPLICIT_PRODUCER_HASH_SIZE;\n\tstatic const std::uint32_t EXPLICIT_CONSUMER_CONSUMPTION_QUOTA_BEFORE_ROTATE = ConcurrentQueue::EXPLICIT_CONSUMER_CONSUMPTION_QUOTA_BEFORE_ROTATE;\n\tstatic const size_t MAX_SUBQUEUE_SIZE = ConcurrentQueue::MAX_SUBQUEUE_SIZE;\n\t\npublic:\n\t// Creates a queue with at least `capacity` element slots; note that the\n\t// actual number of elements that can be inserted without additional memory\n\t// allocation depends on the number of producers and the block size (e.g. if\n\t// the block size is equal to `capacity`, only a single block will be allocated\n\t// up-front, which means only a single producer will be able to enqueue elements\n\t// without an extra allocation -- blocks aren't shared between producers).\n\t// This method is not thread safe -- it is up to the user to ensure that the\n\t// queue is fully constructed before it starts being used by other threads (this\n\t// includes making the memory effects of construction visible, possibly with a\n\t// memory barrier).\n\texplicit BlockingConcurrentQueue(size_t capacity = 6 * BLOCK_SIZE)\n\t\t: inner(capacity), sema(create<LightweightSemaphore, ssize_t, int>(0, (int)Traits::MAX_SEMA_SPINS), &BlockingConcurrentQueue::template destroy<LightweightSemaphore>)\n\t{\n\t\tassert(reinterpret_cast<ConcurrentQueue*>((BlockingConcurrentQueue*)1) == &((BlockingConcurrentQueue*)1)->inner && \"BlockingConcurrentQueue must have ConcurrentQueue as its first member\");\n\t\tif (!sema) {\n\t\t\tMOODYCAMEL_THROW(std::bad_alloc());\n\t\t}\n\t}\n\t\n\tBlockingConcurrentQueue(size_t minCapacity, size_t maxExplicitProducers, size_t maxImplicitProducers)\n\t\t: inner(minCapacity, maxExplicitProducers, maxImplicitProducers), sema(create<LightweightSemaphore, ssize_t, int>(0, (int)Traits::MAX_SEMA_SPINS), &BlockingConcurrentQueue::template destroy<LightweightSemaphore>)\n\t{\n\t\tassert(reinterpret_cast<ConcurrentQueue*>((BlockingConcurrentQueue*)1) == &((BlockingConcurrentQueue*)1)->inner && \"BlockingConcurrentQueue must have ConcurrentQueue as its first member\");\n\t\tif (!sema) {\n\t\t\tMOODYCAMEL_THROW(std::bad_alloc());\n\t\t}\n\t}\n\t\n\t// Disable copying and copy assignment\n\tBlockingConcurrentQueue(BlockingConcurrentQueue const&) MOODYCAMEL_DELETE_FUNCTION;\n\tBlockingConcurrentQueue& operator=(BlockingConcurrentQueue const&) MOODYCAMEL_DELETE_FUNCTION;\n\t\n\t// Moving is supported, but note that it is *not* a thread-safe operation.\n\t// Nobody can use the queue while it's being moved, and the memory effects\n\t// of that move must be propagated to other threads before they can use it.\n\t// Note: When a queue is moved, its tokens are still valid but can only be\n\t// used with the destination queue (i.e. semantically they are moved along\n\t// with the queue itself).\n\tBlockingConcurrentQueue(BlockingConcurrentQueue&& other) MOODYCAMEL_NOEXCEPT\n\t\t: inner(std::move(other.inner)), sema(std::move(other.sema))\n\t{ }\n\t\n\tinline BlockingConcurrentQueue& operator=(BlockingConcurrentQueue&& other) MOODYCAMEL_NOEXCEPT\n\t{\n\t\treturn swap_internal(other);\n\t}\n\t\n\t// Swaps this queue's state with the other's. Not thread-safe.\n\t// Swapping two queues does not invalidate their tokens, however\n\t// the tokens that were created for one queue must be used with\n\t// only the swapped queue (i.e. the tokens are tied to the\n\t// queue's movable state, not the object itself).\n\tinline void swap(BlockingConcurrentQueue& other) MOODYCAMEL_NOEXCEPT\n\t{\n\t\tswap_internal(other);\n\t}\n\t\nprivate:\n\tBlockingConcurrentQueue& swap_internal(BlockingConcurrentQueue& other)\n\t{\n\t\tif (this == &other) {\n\t\t\treturn *this;\n\t\t}\n\t\t\n\t\tinner.swap(other.inner);\n\t\tsema.swap(other.sema);\n\t\treturn *this;\n\t}\n\t\npublic:\n\t// Enqueues a single item (by copying it).\n\t// Allocates memory if required. Only fails if memory allocation fails (or implicit\n\t// production is disabled because Traits::INITIAL_IMPLICIT_PRODUCER_HASH_SIZE is 0,\n\t// or Traits::MAX_SUBQUEUE_SIZE has been defined and would be surpassed).\n\t// Thread-safe.\n\tinline bool enqueue(T const& item)\n\t{\n\t\tif ((details::likely)(inner.enqueue(item))) {\n\t\t\tsema->signal();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t// Enqueues a single item (by moving it, if possible).\n\t// Allocates memory if required. Only fails if memory allocation fails (or implicit\n\t// production is disabled because Traits::INITIAL_IMPLICIT_PRODUCER_HASH_SIZE is 0,\n\t// or Traits::MAX_SUBQUEUE_SIZE has been defined and would be surpassed).\n\t// Thread-safe.\n\tinline bool enqueue(T&& item)\n\t{\n\t\tif ((details::likely)(inner.enqueue(std::move(item)))) {\n\t\t\tsema->signal();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t// Enqueues a single item (by copying it) using an explicit producer token.\n\t// Allocates memory if required. Only fails if memory allocation fails (or\n\t// Traits::MAX_SUBQUEUE_SIZE has been defined and would be surpassed).\n\t// Thread-safe.\n\tinline bool enqueue(producer_token_t const& token, T const& item)\n\t{\n\t\tif ((details::likely)(inner.enqueue(token, item))) {\n\t\t\tsema->signal();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t// Enqueues a single item (by moving it, if possible) using an explicit producer token.\n\t// Allocates memory if required. Only fails if memory allocation fails (or\n\t// Traits::MAX_SUBQUEUE_SIZE has been defined and would be surpassed).\n\t// Thread-safe.\n\tinline bool enqueue(producer_token_t const& token, T&& item)\n\t{\n\t\tif ((details::likely)(inner.enqueue(token, std::move(item)))) {\n\t\t\tsema->signal();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t// Enqueues several items.\n\t// Allocates memory if required. Only fails if memory allocation fails (or\n\t// implicit production is disabled because Traits::INITIAL_IMPLICIT_PRODUCER_HASH_SIZE\n\t// is 0, or Traits::MAX_SUBQUEUE_SIZE has been defined and would be surpassed).\n\t// Note: Use std::make_move_iterator if the elements should be moved instead of copied.\n\t// Thread-safe.\n\ttemplate<typename It>\n\tinline bool enqueue_bulk(It itemFirst, size_t count)\n\t{\n\t\tif ((details::likely)(inner.enqueue_bulk(std::forward<It>(itemFirst), count))) {\n\t\t\tsema->signal((LightweightSemaphore::ssize_t)(ssize_t)count);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t// Enqueues several items using an explicit producer token.\n\t// Allocates memory if required. Only fails if memory allocation fails\n\t// (or Traits::MAX_SUBQUEUE_SIZE has been defined and would be surpassed).\n\t// Note: Use std::make_move_iterator if the elements should be moved\n\t// instead of copied.\n\t// Thread-safe.\n\ttemplate<typename It>\n\tinline bool enqueue_bulk(producer_token_t const& token, It itemFirst, size_t count)\n\t{\n\t\tif ((details::likely)(inner.enqueue_bulk(token, std::forward<It>(itemFirst), count))) {\n\t\t\tsema->signal((LightweightSemaphore::ssize_t)(ssize_t)count);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t// Enqueues a single item (by copying it).\n\t// Does not allocate memory. Fails if not enough room to enqueue (or implicit\n\t// production is disabled because Traits::INITIAL_IMPLICIT_PRODUCER_HASH_SIZE\n\t// is 0).\n\t// Thread-safe.\n\tinline bool try_enqueue(T const& item)\n\t{\n\t\tif (inner.try_enqueue(item)) {\n\t\t\tsema->signal();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t// Enqueues a single item (by moving it, if possible).\n\t// Does not allocate memory (except for one-time implicit producer).\n\t// Fails if not enough room to enqueue (or implicit production is\n\t// disabled because Traits::INITIAL_IMPLICIT_PRODUCER_HASH_SIZE is 0).\n\t// Thread-safe.\n\tinline bool try_enqueue(T&& item)\n\t{\n\t\tif (inner.try_enqueue(std::move(item))) {\n\t\t\tsema->signal();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t// Enqueues a single item (by copying it) using an explicit producer token.\n\t// Does not allocate memory. Fails if not enough room to enqueue.\n\t// Thread-safe.\n\tinline bool try_enqueue(producer_token_t const& token, T const& item)\n\t{\n\t\tif (inner.try_enqueue(token, item)) {\n\t\t\tsema->signal();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t// Enqueues a single item (by moving it, if possible) using an explicit producer token.\n\t// Does not allocate memory. Fails if not enough room to enqueue.\n\t// Thread-safe.\n\tinline bool try_enqueue(producer_token_t const& token, T&& item)\n\t{\n\t\tif (inner.try_enqueue(token, std::move(item))) {\n\t\t\tsema->signal();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t// Enqueues several items.\n\t// Does not allocate memory (except for one-time implicit producer).\n\t// Fails if not enough room to enqueue (or implicit production is\n\t// disabled because Traits::INITIAL_IMPLICIT_PRODUCER_HASH_SIZE is 0).\n\t// Note: Use std::make_move_iterator if the elements should be moved\n\t// instead of copied.\n\t// Thread-safe.\n\ttemplate<typename It>\n\tinline bool try_enqueue_bulk(It itemFirst, size_t count)\n\t{\n\t\tif (inner.try_enqueue_bulk(std::forward<It>(itemFirst), count)) {\n\t\t\tsema->signal((LightweightSemaphore::ssize_t)(ssize_t)count);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t// Enqueues several items using an explicit producer token.\n\t// Does not allocate memory. Fails if not enough room to enqueue.\n\t// Note: Use std::make_move_iterator if the elements should be moved\n\t// instead of copied.\n\t// Thread-safe.\n\ttemplate<typename It>\n\tinline bool try_enqueue_bulk(producer_token_t const& token, It itemFirst, size_t count)\n\t{\n\t\tif (inner.try_enqueue_bulk(token, std::forward<It>(itemFirst), count)) {\n\t\t\tsema->signal((LightweightSemaphore::ssize_t)(ssize_t)count);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t\n\t// Attempts to dequeue from the queue.\n\t// Returns false if all producer streams appeared empty at the time they\n\t// were checked (so, the queue is likely but not guaranteed to be empty).\n\t// Never allocates. Thread-safe.\n\ttemplate<typename U>\n\tinline bool try_dequeue(U& item)\n\t{\n\t\tif (sema->tryWait()) {\n\t\t\twhile (!inner.try_dequeue(item)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t// Attempts to dequeue from the queue using an explicit consumer token.\n\t// Returns false if all producer streams appeared empty at the time they\n\t// were checked (so, the queue is likely but not guaranteed to be empty).\n\t// Never allocates. Thread-safe.\n\ttemplate<typename U>\n\tinline bool try_dequeue(consumer_token_t& token, U& item)\n\t{\n\t\tif (sema->tryWait()) {\n\t\t\twhile (!inner.try_dequeue(token, item)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t// Attempts to dequeue several elements from the queue.\n\t// Returns the number of items actually dequeued.\n\t// Returns 0 if all producer streams appeared empty at the time they\n\t// were checked (so, the queue is likely but not guaranteed to be empty).\n\t// Never allocates. Thread-safe.\n\ttemplate<typename It>\n\tinline size_t try_dequeue_bulk(It itemFirst, size_t max)\n\t{\n\t\tsize_t count = 0;\n\t\tmax = (size_t)sema->tryWaitMany((LightweightSemaphore::ssize_t)(ssize_t)max);\n\t\twhile (count != max) {\n\t\t\tcount += inner.template try_dequeue_bulk<It&>(itemFirst, max - count);\n\t\t}\n\t\treturn count;\n\t}\n\t\n\t// Attempts to dequeue several elements from the queue using an explicit consumer token.\n\t// Returns the number of items actually dequeued.\n\t// Returns 0 if all producer streams appeared empty at the time they\n\t// were checked (so, the queue is likely but not guaranteed to be empty).\n\t// Never allocates. Thread-safe.\n\ttemplate<typename It>\n\tinline size_t try_dequeue_bulk(consumer_token_t& token, It itemFirst, size_t max)\n\t{\n\t\tsize_t count = 0;\n\t\tmax = (size_t)sema->tryWaitMany((LightweightSemaphore::ssize_t)(ssize_t)max);\n\t\twhile (count != max) {\n\t\t\tcount += inner.template try_dequeue_bulk<It&>(token, itemFirst, max - count);\n\t\t}\n\t\treturn count;\n\t}\n\t\n\t\n\t\n\t// Blocks the current thread until there's something to dequeue, then\n\t// dequeues it.\n\t// Never allocates. Thread-safe.\n\ttemplate<typename U>\n\tinline void wait_dequeue(U& item)\n\t{\n\t\twhile (!sema->wait()) {\n\t\t\tcontinue;\n\t\t}\n\t\twhile (!inner.try_dequeue(item)) {\n\t\t\tcontinue;\n\t\t}\n\t}\n\n\t// Blocks the current thread until either there's something to dequeue\n\t// or the timeout (specified in microseconds) expires. Returns false\n\t// without setting `item` if the timeout expires, otherwise assigns\n\t// to `item` and returns true.\n\t// Using a negative timeout indicates an indefinite timeout,\n\t// and is thus functionally equivalent to calling wait_dequeue.\n\t// Never allocates. Thread-safe.\n\ttemplate<typename U>\n\tinline bool wait_dequeue_timed(U& item, std::int64_t timeout_usecs)\n\t{\n\t\tif (!sema->wait(timeout_usecs)) {\n\t\t\treturn false;\n\t\t}\n\t\twhile (!inner.try_dequeue(item)) {\n\t\t\tcontinue;\n\t\t}\n\t\treturn true;\n\t}\n    \n    // Blocks the current thread until either there's something to dequeue\n\t// or the timeout expires. Returns false without setting `item` if the\n    // timeout expires, otherwise assigns to `item` and returns true.\n\t// Never allocates. Thread-safe.\n\ttemplate<typename U, typename Rep, typename Period>\n\tinline bool wait_dequeue_timed(U& item, std::chrono::duration<Rep, Period> const& timeout)\n    {\n        return wait_dequeue_timed(item, std::chrono::duration_cast<std::chrono::microseconds>(timeout).count());\n    }\n\t\n\t// Blocks the current thread until there's something to dequeue, then\n\t// dequeues it using an explicit consumer token.\n\t// Never allocates. Thread-safe.\n\ttemplate<typename U>\n\tinline void wait_dequeue(consumer_token_t& token, U& item)\n\t{\n\t\twhile (!sema->wait()) {\n\t\t\tcontinue;\n\t\t}\n\t\twhile (!inner.try_dequeue(token, item)) {\n\t\t\tcontinue;\n\t\t}\n\t}\n\t\n\t// Blocks the current thread until either there's something to dequeue\n\t// or the timeout (specified in microseconds) expires. Returns false\n\t// without setting `item` if the timeout expires, otherwise assigns\n\t// to `item` and returns true.\n\t// Using a negative timeout indicates an indefinite timeout,\n\t// and is thus functionally equivalent to calling wait_dequeue.\n\t// Never allocates. Thread-safe.\n\ttemplate<typename U>\n\tinline bool wait_dequeue_timed(consumer_token_t& token, U& item, std::int64_t timeout_usecs)\n\t{\n\t\tif (!sema->wait(timeout_usecs)) {\n\t\t\treturn false;\n\t\t}\n\t\twhile (!inner.try_dequeue(token, item)) {\n\t\t\tcontinue;\n\t\t}\n\t\treturn true;\n\t}\n    \n    // Blocks the current thread until either there's something to dequeue\n\t// or the timeout expires. Returns false without setting `item` if the\n    // timeout expires, otherwise assigns to `item` and returns true.\n\t// Never allocates. Thread-safe.\n\ttemplate<typename U, typename Rep, typename Period>\n\tinline bool wait_dequeue_timed(consumer_token_t& token, U& item, std::chrono::duration<Rep, Period> const& timeout)\n    {\n        return wait_dequeue_timed(token, item, std::chrono::duration_cast<std::chrono::microseconds>(timeout).count());\n    }\n\t\n\t// Attempts to dequeue several elements from the queue.\n\t// Returns the number of items actually dequeued, which will\n\t// always be at least one (this method blocks until the queue\n\t// is non-empty) and at most max.\n\t// Never allocates. Thread-safe.\n\ttemplate<typename It>\n\tinline size_t wait_dequeue_bulk(It itemFirst, size_t max)\n\t{\n\t\tsize_t count = 0;\n\t\tmax = (size_t)sema->waitMany((LightweightSemaphore::ssize_t)(ssize_t)max);\n\t\twhile (count != max) {\n\t\t\tcount += inner.template try_dequeue_bulk<It&>(itemFirst, max - count);\n\t\t}\n\t\treturn count;\n\t}\n\t\n\t// Attempts to dequeue several elements from the queue.\n\t// Returns the number of items actually dequeued, which can\n\t// be 0 if the timeout expires while waiting for elements,\n\t// and at most max.\n\t// Using a negative timeout indicates an indefinite timeout,\n\t// and is thus functionally equivalent to calling wait_dequeue_bulk.\n\t// Never allocates. Thread-safe.\n\ttemplate<typename It>\n\tinline size_t wait_dequeue_bulk_timed(It itemFirst, size_t max, std::int64_t timeout_usecs)\n\t{\n\t\tsize_t count = 0;\n\t\tmax = (size_t)sema->waitMany((LightweightSemaphore::ssize_t)(ssize_t)max, timeout_usecs);\n\t\twhile (count != max) {\n\t\t\tcount += inner.template try_dequeue_bulk<It&>(itemFirst, max - count);\n\t\t}\n\t\treturn count;\n\t}\n    \n    // Attempts to dequeue several elements from the queue.\n\t// Returns the number of items actually dequeued, which can\n\t// be 0 if the timeout expires while waiting for elements,\n\t// and at most max.\n\t// Never allocates. Thread-safe.\n\ttemplate<typename It, typename Rep, typename Period>\n\tinline size_t wait_dequeue_bulk_timed(It itemFirst, size_t max, std::chrono::duration<Rep, Period> const& timeout)\n    {\n        return wait_dequeue_bulk_timed<It&>(itemFirst, max, std::chrono::duration_cast<std::chrono::microseconds>(timeout).count());\n    }\n\t\n\t// Attempts to dequeue several elements from the queue using an explicit consumer token.\n\t// Returns the number of items actually dequeued, which will\n\t// always be at least one (this method blocks until the queue\n\t// is non-empty) and at most max.\n\t// Never allocates. Thread-safe.\n\ttemplate<typename It>\n\tinline size_t wait_dequeue_bulk(consumer_token_t& token, It itemFirst, size_t max)\n\t{\n\t\tsize_t count = 0;\n\t\tmax = (size_t)sema->waitMany((LightweightSemaphore::ssize_t)(ssize_t)max);\n\t\twhile (count != max) {\n\t\t\tcount += inner.template try_dequeue_bulk<It&>(token, itemFirst, max - count);\n\t\t}\n\t\treturn count;\n\t}\n\t\n\t// Attempts to dequeue several elements from the queue using an explicit consumer token.\n\t// Returns the number of items actually dequeued, which can\n\t// be 0 if the timeout expires while waiting for elements,\n\t// and at most max.\n\t// Using a negative timeout indicates an indefinite timeout,\n\t// and is thus functionally equivalent to calling wait_dequeue_bulk.\n\t// Never allocates. Thread-safe.\n\ttemplate<typename It>\n\tinline size_t wait_dequeue_bulk_timed(consumer_token_t& token, It itemFirst, size_t max, std::int64_t timeout_usecs)\n\t{\n\t\tsize_t count = 0;\n\t\tmax = (size_t)sema->waitMany((LightweightSemaphore::ssize_t)(ssize_t)max, timeout_usecs);\n\t\twhile (count != max) {\n\t\t\tcount += inner.template try_dequeue_bulk<It&>(token, itemFirst, max - count);\n\t\t}\n\t\treturn count;\n\t}\n\t\n\t// Attempts to dequeue several elements from the queue using an explicit consumer token.\n\t// Returns the number of items actually dequeued, which can\n\t// be 0 if the timeout expires while waiting for elements,\n\t// and at most max.\n\t// Never allocates. Thread-safe.\n\ttemplate<typename It, typename Rep, typename Period>\n\tinline size_t wait_dequeue_bulk_timed(consumer_token_t& token, It itemFirst, size_t max, std::chrono::duration<Rep, Period> const& timeout)\n    {\n        return wait_dequeue_bulk_timed<It&>(token, itemFirst, max, std::chrono::duration_cast<std::chrono::microseconds>(timeout).count());\n    }\n\t\n\t\n\t// Returns an estimate of the total number of elements currently in the queue. This\n\t// estimate is only accurate if the queue has completely stabilized before it is called\n\t// (i.e. all enqueue and dequeue operations have completed and their memory effects are\n\t// visible on the calling thread, and no further operations start while this method is\n\t// being called).\n\t// Thread-safe.\n\tinline size_t size_approx() const\n\t{\n\t\treturn (size_t)sema->availableApprox();\n\t}\n\t\n\t\n\t// Returns true if the underlying atomic variables used by\n\t// the queue are lock-free (they should be on most platforms).\n\t// Thread-safe.\n\tstatic constexpr bool is_lock_free()\n\t{\n\t\treturn ConcurrentQueue::is_lock_free();\n\t}\n\t\n\nprivate:\n\ttemplate<typename U, typename A1, typename A2>\n\tstatic inline U* create(A1&& a1, A2&& a2)\n\t{\n\t\tvoid* p = (Traits::malloc)(sizeof(U));\n\t\treturn p != nullptr ? new (p) U(std::forward<A1>(a1), std::forward<A2>(a2)) : nullptr;\n\t}\n\t\n\ttemplate<typename U>\n\tstatic inline void destroy(U* p)\n\t{\n\t\tif (p != nullptr) {\n\t\t\tp->~U();\n\t\t}\n\t\t(Traits::free)(p);\n\t}\n\t\nprivate:\n\tConcurrentQueue inner;\n\tstd::unique_ptr<LightweightSemaphore, void (*)(LightweightSemaphore*)> sema;\n};\n\n\ntemplate<typename T, typename Traits>\ninline void swap(BlockingConcurrentQueue<T, Traits>& a, BlockingConcurrentQueue<T, Traits>& b) MOODYCAMEL_NOEXCEPT\n{\n\ta.swap(b);\n}\n\n}\t// end namespace moodycamel\n"
  },
  {
    "path": "build/makefile",
    "content": "# ©2013-2014 Cameron Desrochers\n# Makefile to build main tests and benchmarks, suitable\n# for use on unixen and Windows with MinGW + GnuWin32\n\ninclude makefile.inc\n\nBASE_OPTS = -pthread\n\nDEBUG_OPTS = -g -O0   # -DMOODYCAMEL_QUEUE_INTERNAL_DEBUG\nRELEASE_OPTS = -O2 -g -DNDEBUG\n\nifeq ($(OS),Windows_NT)\n\tPLATFORM_OPTS = -static\n\tTBB_PLATFORM_OPTS = -DUSE_WINTHREAD\nelse\n\tUNAME_S := $(shell uname -s)\n\tifeq ($(UNAME_S),Linux)\n\t\tLD_PLATFORM_OPTS = -lrt\n\tendif\n\t# -fsanitize=address seems to have a slow memory leak when creating/destroying a lot of threads\n\t#DEBUG_OPTS += -fno-omit-frame-pointer -fsanitize=address\nendif\n\nOPTS = $(BASE_OPTS) $(PLATFORM_OPTS) $(DEBUG_OPTS)\nBENCH_OPTS = $(BASE_OPTS) $(PLATFORM_OPTS) $(RELEASE_OPTS)\nLD_OPTS = $(LD_PLATFORM_OPTS)\n\n\ndefault: tests benchmarks\n\ntests: bin/unittests$(EXT) bin/fuzztests$(EXT)\n\t\nbenchmarks: bin/benchmarks$(EXT)\n\nbin/unittests$(EXT): ../concurrentqueue.h ../blockingconcurrentqueue.h ../lightweightsemaphore.h ../tests/unittests/unittests.cpp ../tests/unittests/mallocmacro.cpp ../tests/common/simplethread.h ../tests/common/simplethread.cpp ../tests/common/systemtime.h ../tests/common/systemtime.cpp ../tests/corealgos.h ../tests/unittests/minitest.h ../c_api/blockingconcurrentqueue.cpp ../c_api/concurrentqueue.cpp makefile\n\ttest -d bin || mkdir bin\n\tg++ -c -std=c++11 -Wall -pedantic-errors -Wpedantic -Wconversion -DMOODYCAMEL_STATIC $(OPTS) -fno-elide-constructors -fno-exceptions ../c_api/blockingconcurrentqueue.cpp ../c_api/concurrentqueue.cpp\n\tg++ -std=c++11 -Wall -pedantic-errors -Wpedantic -Wconversion -DMOODYCAMEL_STATIC $(OPTS) -fno-elide-constructors ../tests/common/simplethread.cpp ../tests/common/systemtime.cpp ../tests/unittests/unittests.cpp blockingconcurrentqueue.o concurrentqueue.o -o bin/unittests$(EXT) $(LD_OPTS)\n\nbin/fuzztests$(EXT): ../concurrentqueue.h ../tests/fuzztests/fuzztests.cpp ../tests/common/simplethread.h ../tests/common/simplethread.cpp ../tests/common/systemtime.h ../tests/common/systemtime.cpp ../tests/corealgos.h makefile\n\ttest -d bin || mkdir bin\n\tg++ -std=c++11 -Wall -pedantic-errors -Wpedantic $(BENCH_OPTS) ../tests/common/simplethread.cpp ../tests/common/systemtime.cpp ../tests/fuzztests/fuzztests.cpp -o bin/fuzztests$(EXT) $(LD_OPTS)\n\nbin/benchmarks$(EXT): bin/libtbb.a ../concurrentqueue.h ../benchmarks/benchmarks.cpp ../benchmarks/cpuid.h ../benchmarks/cpuid.cpp ../benchmarks/lockbasedqueue.h ../benchmarks/simplelockfree.h ../tests/common/simplethread.h ../tests/common/simplethread.cpp ../tests/common/systemtime.h ../tests/common/systemtime.cpp ../benchmarks/dlib/test_for_odr_violations.cpp makefile\n\ttest -d bin || mkdir bin\n\tg++ -std=c++11 -Wall -pedantic-errors -Wpedantic $(BENCH_OPTS) -I../benchmarks ../benchmarks/cpuid.cpp ../tests/common/simplethread.cpp ../tests/common/systemtime.cpp ../benchmarks/dlib/test_for_odr_violations.cpp ../benchmarks/benchmarks.cpp -o bin/benchmarks$(EXT) -Lbin -ltbb $(LD_OPTS)\n\t\nbin/libtbb.a: makefile\n\ttest -d bin || mkdir bin\n\tg++ -std=c++11 -O2 -DNDEBUG -D__TBB_BUILD=1 $(TBB_PLATFORM_OPTS) -I../benchmarks -c ../benchmarks/tbb/cache_aligned_allocator.cpp ../benchmarks/tbb/concurrent_monitor.cpp ../benchmarks/tbb/concurrent_queue.cpp ../benchmarks/tbb/dynamic_link.cpp ../benchmarks/tbb/tbb_misc.cpp\n\tar -rc bin/libtbb.a cache_aligned_allocator.o concurrent_monitor.o concurrent_queue.o dynamic_link.o tbb_misc.o\n\trm -f cache_aligned_allocator.o concurrent_monitor.o concurrent_queue.o dynamic_link.o tbb_misc.o\n"
  },
  {
    "path": "build/makefile.inc",
    "content": "# ©2013 Cameron Desrochers\n\nifeq ($(OS),Windows_NT)\n\tEXT = .exe\nelse\n\tEXT =\nendif\n"
  },
  {
    "path": "build/msvc11/benchmarks.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project DefaultTargets=\"Build\" ToolsVersion=\"12.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup Label=\"ProjectConfigurations\">\r\n    <ProjectConfiguration Include=\"Debug|Win32\">\r\n      <Configuration>Debug</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Debug|x64\">\r\n      <Configuration>Debug</Configuration>\r\n      <Platform>x64</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Release|Win32\">\r\n      <Configuration>Release</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Release|x64\">\r\n      <Configuration>Release</Configuration>\r\n      <Platform>x64</Platform>\r\n    </ProjectConfiguration>\r\n  </ItemGroup>\r\n  <PropertyGroup Label=\"Globals\">\r\n    <ProjectGuid>{86870AC7-4A91-490A-A126-AFD6B0B24B7E}</ProjectGuid>\r\n    <Keyword>Win32Proj</Keyword>\r\n    <RootNamespace>benchmarks</RootNamespace>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>true</UseDebugLibraries>\r\n    <PlatformToolset>v110</PlatformToolset>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>true</UseDebugLibraries>\r\n    <PlatformToolset>v110</PlatformToolset>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>false</UseDebugLibraries>\r\n    <PlatformToolset>v110</PlatformToolset>\r\n    <WholeProgramOptimization>true</WholeProgramOptimization>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>false</UseDebugLibraries>\r\n    <PlatformToolset>v110</PlatformToolset>\r\n    <WholeProgramOptimization>true</WholeProgramOptimization>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\r\n  <ImportGroup Label=\"ExtensionSettings\">\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <PropertyGroup Label=\"UserMacros\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <LinkIncremental>false</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n    <LinkIncremental>false</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <LinkIncremental>false</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\r\n    <LinkIncremental>false</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <ClCompile>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <Optimization>Disabled</Optimization>\r\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <AdditionalIncludeDirectories>$(SolutionDir)\\..\\..\\benchmarks</AdditionalIncludeDirectories>\r\n      <WholeProgramOptimization>true</WholeProgramOptimization>\r\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <IgnoreSpecificDefaultLibraries>tbb_debug.lib</IgnoreSpecificDefaultLibraries>\r\n      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n    <ClCompile>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <Optimization>Disabled</Optimization>\r\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <AdditionalIncludeDirectories>$(SolutionDir)\\..\\..\\benchmarks</AdditionalIncludeDirectories>\r\n      <WholeProgramOptimization>true</WholeProgramOptimization>\r\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <IgnoreSpecificDefaultLibraries>tbb_debug.lib</IgnoreSpecificDefaultLibraries>\r\n      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <Optimization>MaxSpeed</Optimization>\r\n      <FunctionLevelLinking>true</FunctionLevelLinking>\r\n      <IntrinsicFunctions>true</IntrinsicFunctions>\r\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <AdditionalIncludeDirectories>$(SolutionDir)\\..\\..\\benchmarks</AdditionalIncludeDirectories>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r\n      <OptimizeReferences>true</OptimizeReferences>\r\n      <IgnoreSpecificDefaultLibraries>tbb.lib</IgnoreSpecificDefaultLibraries>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <Optimization>MaxSpeed</Optimization>\r\n      <FunctionLevelLinking>true</FunctionLevelLinking>\r\n      <IntrinsicFunctions>true</IntrinsicFunctions>\r\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <AdditionalIncludeDirectories>$(SolutionDir)\\..\\..\\benchmarks</AdditionalIncludeDirectories>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r\n      <OptimizeReferences>true</OptimizeReferences>\r\n      <IgnoreSpecificDefaultLibraries>tbb.lib</IgnoreSpecificDefaultLibraries>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\benchmarks.cpp\">\r\n      <DisableSpecificWarnings Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">4244;4800</DisableSpecificWarnings>\r\n      <DisableSpecificWarnings Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">4244;4800</DisableSpecificWarnings>\r\n      <DisableSpecificWarnings Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">4244;4800</DisableSpecificWarnings>\r\n      <DisableSpecificWarnings Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">4244;4800</DisableSpecificWarnings>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\cpuid.cpp\" />\r\n    <ClCompile Include=\"..\\..\\benchmarks\\dlib\\test_for_odr_violations.cpp\" />\r\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\cache_aligned_allocator.cpp\">\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n      </UndefinePreprocessorDefinitions>\r\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n      </UndefinePreprocessorDefinitions>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\concurrent_monitor.cpp\">\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n      </UndefinePreprocessorDefinitions>\r\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n      </UndefinePreprocessorDefinitions>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\concurrent_queue.cpp\">\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n      </UndefinePreprocessorDefinitions>\r\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n      </UndefinePreprocessorDefinitions>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\dynamic_link.cpp\">\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n      </UndefinePreprocessorDefinitions>\r\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n      </UndefinePreprocessorDefinitions>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\spin_mutex.cpp\">\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\tbb_misc.cpp\">\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n      </UndefinePreprocessorDefinitions>\r\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n      </UndefinePreprocessorDefinitions>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\tests\\common\\simplethread.cpp\" />\r\n    <ClCompile Include=\"..\\..\\tests\\common\\systemtime.cpp\" />\r\n    <ClCompile Include=\"..\\msvc12\\msvc_tbb_stubs.cpp\">\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n    </ClCompile>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClInclude Include=\"..\\..\\benchmarks\\boostqueue.h\" />\r\n    <ClInclude Include=\"..\\..\\benchmarks\\cpuid.h\" />\r\n    <ClInclude Include=\"..\\..\\benchmarks\\lockbasedqueue.h\" />\r\n    <ClInclude Include=\"..\\..\\benchmarks\\simplelockfree.h\" />\r\n    <ClInclude Include=\"..\\..\\benchmarks\\stdqueue.h\" />\r\n    <ClInclude Include=\"..\\..\\benchmarks\\tbbqueue.h\" />\r\n    <ClInclude Include=\"..\\..\\benchmarks\\wrappers.h\" />\r\n    <ClInclude Include=\"..\\..\\concurrentqueue.h\" />\r\n    <ClInclude Include=\"..\\..\\tests\\common\\simplethread.h\" />\r\n    <ClInclude Include=\"..\\..\\tests\\common\\systemtime.h\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"..\\..\\benchmarks\\extract_graph_data.py\" />\r\n  </ItemGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\r\n  <ImportGroup Label=\"ExtensionTargets\">\r\n  </ImportGroup>\r\n</Project>"
  },
  {
    "path": "build/msvc11/benchmarks.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup>\r\n    <Filter Include=\"Source Files\">\r\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\r\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\r\n    </Filter>\r\n    <Filter Include=\"Header Files\">\r\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\r\n      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>\r\n    </Filter>\r\n    <Filter Include=\"Source Files\\tbb\">\r\n      <UniqueIdentifier>{6d3507c8-0e7e-45de-90d5-9daacabc8d2b}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"Source Files\\dlib\">\r\n      <UniqueIdentifier>{3dfee594-40d0-4fea-992a-3958d8494fdd}</UniqueIdentifier>\r\n    </Filter>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\benchmarks.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\cpuid.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\cache_aligned_allocator.cpp\">\r\n      <Filter>Source Files\\tbb</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\concurrent_monitor.cpp\">\r\n      <Filter>Source Files\\tbb</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\concurrent_queue.cpp\">\r\n      <Filter>Source Files\\tbb</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\dynamic_link.cpp\">\r\n      <Filter>Source Files\\tbb</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\tbb_misc.cpp\">\r\n      <Filter>Source Files\\tbb</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\tests\\common\\simplethread.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\tests\\common\\systemtime.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\msvc12\\msvc_tbb_stubs.cpp\">\r\n      <Filter>Source Files\\tbb</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\spin_mutex.cpp\">\r\n      <Filter>Source Files\\tbb</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\dlib\\test_for_odr_violations.cpp\">\r\n      <Filter>Source Files\\dlib</Filter>\r\n    </ClCompile>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClInclude Include=\"..\\..\\tests\\common\\simplethread.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\..\\tests\\common\\systemtime.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\..\\concurrentqueue.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\..\\benchmarks\\boostqueue.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\..\\benchmarks\\cpuid.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\..\\benchmarks\\lockbasedqueue.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\..\\benchmarks\\simplelockfree.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\..\\benchmarks\\stdqueue.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\..\\benchmarks\\tbbqueue.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\..\\benchmarks\\wrappers.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"..\\..\\benchmarks\\extract_graph_data.py\" />\r\n  </ItemGroup>\r\n</Project>"
  },
  {
    "path": "build/msvc11/concurrentqueue.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 12.00\r\n# Visual Studio 2012\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"unittests\", \"unittests.vcxproj\", \"{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"benchmarks\", \"benchmarks.vcxproj\", \"{86870AC7-4A91-490A-A126-AFD6B0B24B7E}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"fuzztests\", \"fuzztests.vcxproj\", \"{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tDebug|x64 = Debug|x64\r\n\t\tRelease|Win32 = Release|Win32\r\n\t\tRelease|x64 = Release|x64\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Release|x64.Build.0 = Release|x64\r\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Release|x64.Build.0 = Release|x64\r\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Release|x64.Build.0 = Release|x64\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "build/msvc11/fuzztests.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project DefaultTargets=\"Build\" ToolsVersion=\"12.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup Label=\"ProjectConfigurations\">\r\n    <ProjectConfiguration Include=\"Debug|Win32\">\r\n      <Configuration>Debug</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Debug|x64\">\r\n      <Configuration>Debug</Configuration>\r\n      <Platform>x64</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Release|Win32\">\r\n      <Configuration>Release</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Release|x64\">\r\n      <Configuration>Release</Configuration>\r\n      <Platform>x64</Platform>\r\n    </ProjectConfiguration>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"..\\..\\tests\\common\\simplethread.cpp\" />\r\n    <ClCompile Include=\"..\\..\\tests\\common\\systemtime.cpp\" />\r\n    <ClCompile Include=\"..\\..\\tests\\fuzztests\\fuzztests.cpp\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClInclude Include=\"..\\..\\concurrentqueue.h\" />\r\n    <ClInclude Include=\"..\\..\\tests\\common\\simplethread.h\" />\r\n    <ClInclude Include=\"..\\..\\tests\\common\\systemtime.h\" />\r\n    <ClInclude Include=\"..\\..\\tests\\corealgos.h\" />\r\n  </ItemGroup>\r\n  <PropertyGroup Label=\"Globals\">\r\n    <ProjectGuid>{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}</ProjectGuid>\r\n    <Keyword>Win32Proj</Keyword>\r\n    <RootNamespace>fuzztests</RootNamespace>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>true</UseDebugLibraries>\r\n    <PlatformToolset>v110</PlatformToolset>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>true</UseDebugLibraries>\r\n    <PlatformToolset>v110</PlatformToolset>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>false</UseDebugLibraries>\r\n    <PlatformToolset>v110</PlatformToolset>\r\n    <WholeProgramOptimization>true</WholeProgramOptimization>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>false</UseDebugLibraries>\r\n    <PlatformToolset>v110</PlatformToolset>\r\n    <WholeProgramOptimization>true</WholeProgramOptimization>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\r\n  <ImportGroup Label=\"ExtensionSettings\">\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <PropertyGroup Label=\"UserMacros\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <LinkIncremental>true</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n    <LinkIncremental>true</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <LinkIncremental>false</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\r\n    <LinkIncremental>false</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <ClCompile>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <Optimization>Disabled</Optimization>\r\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <DisableSpecificWarnings>4800</DisableSpecificWarnings>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n    <ClCompile>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <Optimization>Disabled</Optimization>\r\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <DisableSpecificWarnings>4800</DisableSpecificWarnings>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <Optimization>MaxSpeed</Optimization>\r\n      <FunctionLevelLinking>true</FunctionLevelLinking>\r\n      <IntrinsicFunctions>true</IntrinsicFunctions>\r\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <DisableSpecificWarnings>4800</DisableSpecificWarnings>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r\n      <OptimizeReferences>true</OptimizeReferences>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <Optimization>MaxSpeed</Optimization>\r\n      <FunctionLevelLinking>true</FunctionLevelLinking>\r\n      <IntrinsicFunctions>true</IntrinsicFunctions>\r\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <DisableSpecificWarnings>4800</DisableSpecificWarnings>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r\n      <OptimizeReferences>true</OptimizeReferences>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\r\n  <ImportGroup Label=\"ExtensionTargets\">\r\n  </ImportGroup>\r\n</Project>"
  },
  {
    "path": "build/msvc11/fuzztests.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup>\r\n    <Filter Include=\"Source Files\">\r\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\r\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\r\n    </Filter>\r\n    <Filter Include=\"Header Files\">\r\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\r\n      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>\r\n    </Filter>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"..\\..\\tests\\common\\simplethread.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\tests\\common\\systemtime.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\tests\\fuzztests\\fuzztests.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClInclude Include=\"..\\..\\concurrentqueue.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\..\\tests\\corealgos.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\..\\tests\\common\\simplethread.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\..\\tests\\common\\systemtime.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n  </ItemGroup>\r\n</Project>"
  },
  {
    "path": "build/msvc11/unittests.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project DefaultTargets=\"Build\" ToolsVersion=\"12.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup Label=\"ProjectConfigurations\">\r\n    <ProjectConfiguration Include=\"Debug|Win32\">\r\n      <Configuration>Debug</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Debug|x64\">\r\n      <Configuration>Debug</Configuration>\r\n      <Platform>x64</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Release|Win32\">\r\n      <Configuration>Release</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Release|x64\">\r\n      <Configuration>Release</Configuration>\r\n      <Platform>x64</Platform>\r\n    </ProjectConfiguration>\r\n  </ItemGroup>\r\n  <PropertyGroup Label=\"Globals\">\r\n    <ProjectGuid>{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}</ProjectGuid>\r\n    <Keyword>Win32Proj</Keyword>\r\n    <RootNamespace>unittests</RootNamespace>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>true</UseDebugLibraries>\r\n    <PlatformToolset>v110</PlatformToolset>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>true</UseDebugLibraries>\r\n    <PlatformToolset>v110</PlatformToolset>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>false</UseDebugLibraries>\r\n    <PlatformToolset>v110</PlatformToolset>\r\n    <WholeProgramOptimization>true</WholeProgramOptimization>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>false</UseDebugLibraries>\r\n    <PlatformToolset>v110</PlatformToolset>\r\n    <WholeProgramOptimization>true</WholeProgramOptimization>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\r\n  <ImportGroup Label=\"ExtensionSettings\">\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <PropertyGroup Label=\"UserMacros\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <LinkIncremental>true</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n    <LinkIncremental>true</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <LinkIncremental>false</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\r\n    <LinkIncremental>false</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <ClCompile>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <Optimization>Disabled</Optimization>\r\n      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_LIB;MOODYCAMEL_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <DisableSpecificWarnings>4146</DisableSpecificWarnings>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n    <ClCompile>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <Optimization>Disabled</Optimization>\r\n      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_LIB;MOODYCAMEL_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <DisableSpecificWarnings>4146</DisableSpecificWarnings>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <Optimization>MaxSpeed</Optimization>\r\n      <FunctionLevelLinking>true</FunctionLevelLinking>\r\n      <IntrinsicFunctions>true</IntrinsicFunctions>\r\n      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_LIB;MOODYCAMEL_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <DisableSpecificWarnings>4146</DisableSpecificWarnings>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r\n      <OptimizeReferences>true</OptimizeReferences>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <Optimization>MaxSpeed</Optimization>\r\n      <FunctionLevelLinking>true</FunctionLevelLinking>\r\n      <IntrinsicFunctions>true</IntrinsicFunctions>\r\n      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_LIB;MOODYCAMEL_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <DisableSpecificWarnings>4146</DisableSpecificWarnings>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r\n      <OptimizeReferences>true</OptimizeReferences>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemGroup>\r\n    <ClInclude Include=\"..\\..\\concurrentqueue.h\" />\r\n    <ClInclude Include=\"..\\..\\tests\\common\\simplethread.h\" />\r\n    <ClInclude Include=\"..\\..\\tests\\common\\systemtime.h\" />\r\n    <ClInclude Include=\"..\\..\\tests\\corealgos.h\" />\r\n    <ClInclude Include=\"..\\..\\tests\\unittests\\minitest.h\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"..\\..\\c_api\\blockingconcurrentqueue.cpp\">\r\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">false</ExceptionHandling>\r\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">false</ExceptionHandling>\r\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">false</ExceptionHandling>\r\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">false</ExceptionHandling>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n\t</ClCompile>\r\n    <ClCompile Include=\"..\\..\\c_api\\concurrentqueue.cpp\">\r\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">false</ExceptionHandling>\r\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">false</ExceptionHandling>\r\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">false</ExceptionHandling>\r\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">false</ExceptionHandling>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n\t</ClCompile>\r\n    <ClCompile Include=\"..\\..\\tests\\common\\simplethread.cpp\" />\r\n    <ClCompile Include=\"..\\..\\tests\\common\\systemtime.cpp\" />\r\n    <ClCompile Include=\"..\\..\\tests\\unittests\\unittests.cpp\" />\r\n    <ClCompile Include=\"..\\..\\tests\\unittests\\mallocmacro.cpp\" />\r\n  </ItemGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\r\n  <ImportGroup Label=\"ExtensionTargets\">\r\n  </ImportGroup>\r\n</Project>"
  },
  {
    "path": "build/msvc11/unittests.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup>\r\n    <Filter Include=\"Source Files\">\r\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\r\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\r\n    </Filter>\r\n    <Filter Include=\"Header Files\">\r\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\r\n      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>\r\n    </Filter>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClInclude Include=\"..\\..\\tests\\common\\simplethread.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\..\\concurrentqueue.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\..\\tests\\corealgos.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\..\\tests\\unittests\\minitest.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\..\\tests\\common\\systemtime.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"..\\..\\tests\\common\\simplethread.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\tests\\common\\systemtime.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\tests\\unittests\\unittests.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n\t<ClCompile Include=\"..\\..\\tests\\unittests\\mallocmacro.cpp\">\r\n\t  <Filter>Source Files</Filter>\r\n\t</ClCompile>\r\n    <ClCompile Include=\"..\\..\\c_api\\blockingconcurrentqueue.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\c_api\\concurrentqueue.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n  </ItemGroup>\r\n</Project>"
  },
  {
    "path": "build/msvc12/benchmarks.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project DefaultTargets=\"Build\" ToolsVersion=\"12.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup Label=\"ProjectConfigurations\">\r\n    <ProjectConfiguration Include=\"Debug|Win32\">\r\n      <Configuration>Debug</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Debug|x64\">\r\n      <Configuration>Debug</Configuration>\r\n      <Platform>x64</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Release|Win32\">\r\n      <Configuration>Release</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Release|x64\">\r\n      <Configuration>Release</Configuration>\r\n      <Platform>x64</Platform>\r\n    </ProjectConfiguration>\r\n  </ItemGroup>\r\n  <PropertyGroup Label=\"Globals\">\r\n    <ProjectGuid>{86870AC7-4A91-490A-A126-AFD6B0B24B7E}</ProjectGuid>\r\n    <Keyword>Win32Proj</Keyword>\r\n    <RootNamespace>benchmarks</RootNamespace>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>true</UseDebugLibraries>\r\n    <PlatformToolset>v120</PlatformToolset>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>true</UseDebugLibraries>\r\n    <PlatformToolset>v120</PlatformToolset>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>false</UseDebugLibraries>\r\n    <PlatformToolset>v120</PlatformToolset>\r\n    <WholeProgramOptimization>true</WholeProgramOptimization>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>false</UseDebugLibraries>\r\n    <PlatformToolset>v120</PlatformToolset>\r\n    <WholeProgramOptimization>true</WholeProgramOptimization>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\r\n  <ImportGroup Label=\"ExtensionSettings\">\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <PropertyGroup Label=\"UserMacros\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <LinkIncremental>false</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n    <LinkIncremental>false</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <LinkIncremental>false</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\r\n    <LinkIncremental>false</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <ClCompile>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <Optimization>Disabled</Optimization>\r\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <AdditionalIncludeDirectories>$(SolutionDir)\\..\\..\\benchmarks</AdditionalIncludeDirectories>\r\n      <WholeProgramOptimization>true</WholeProgramOptimization>\r\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <IgnoreSpecificDefaultLibraries>tbb_debug.lib</IgnoreSpecificDefaultLibraries>\r\n      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n    <ClCompile>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <Optimization>Disabled</Optimization>\r\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <AdditionalIncludeDirectories>$(SolutionDir)\\..\\..\\benchmarks</AdditionalIncludeDirectories>\r\n      <WholeProgramOptimization>true</WholeProgramOptimization>\r\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <IgnoreSpecificDefaultLibraries>tbb_debug.lib</IgnoreSpecificDefaultLibraries>\r\n      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <Optimization>MaxSpeed</Optimization>\r\n      <FunctionLevelLinking>true</FunctionLevelLinking>\r\n      <IntrinsicFunctions>true</IntrinsicFunctions>\r\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <AdditionalIncludeDirectories>$(SolutionDir)\\..\\..\\benchmarks</AdditionalIncludeDirectories>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r\n      <OptimizeReferences>true</OptimizeReferences>\r\n      <IgnoreSpecificDefaultLibraries>tbb.lib</IgnoreSpecificDefaultLibraries>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <Optimization>MaxSpeed</Optimization>\r\n      <FunctionLevelLinking>true</FunctionLevelLinking>\r\n      <IntrinsicFunctions>true</IntrinsicFunctions>\r\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <AdditionalIncludeDirectories>$(SolutionDir)\\..\\..\\benchmarks</AdditionalIncludeDirectories>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r\n      <OptimizeReferences>true</OptimizeReferences>\r\n      <IgnoreSpecificDefaultLibraries>tbb.lib</IgnoreSpecificDefaultLibraries>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\benchmarks.cpp\">\r\n      <DisableSpecificWarnings Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">4244;4800</DisableSpecificWarnings>\r\n      <DisableSpecificWarnings Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">4244;4800</DisableSpecificWarnings>\r\n      <DisableSpecificWarnings Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">4244;4800</DisableSpecificWarnings>\r\n      <DisableSpecificWarnings Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">4244;4800</DisableSpecificWarnings>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\cpuid.cpp\" />\r\n    <ClCompile Include=\"..\\..\\benchmarks\\dlib\\test_for_odr_violations.cpp\" />\r\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\cache_aligned_allocator.cpp\">\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n      </UndefinePreprocessorDefinitions>\r\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n      </UndefinePreprocessorDefinitions>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\concurrent_monitor.cpp\">\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n      </UndefinePreprocessorDefinitions>\r\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n      </UndefinePreprocessorDefinitions>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\concurrent_queue.cpp\">\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n      </UndefinePreprocessorDefinitions>\r\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n      </UndefinePreprocessorDefinitions>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\dynamic_link.cpp\">\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n      </UndefinePreprocessorDefinitions>\r\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n      </UndefinePreprocessorDefinitions>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\spin_mutex.cpp\">\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\tbb_misc.cpp\">\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n      </UndefinePreprocessorDefinitions>\r\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n      </UndefinePreprocessorDefinitions>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\tests\\common\\simplethread.cpp\" />\r\n    <ClCompile Include=\"..\\..\\tests\\common\\systemtime.cpp\" />\r\n    <ClCompile Include=\"msvc_tbb_stubs.cpp\">\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n    </ClCompile>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClInclude Include=\"..\\..\\benchmarks\\boostqueue.h\" />\r\n    <ClInclude Include=\"..\\..\\benchmarks\\cpuid.h\" />\r\n    <ClInclude Include=\"..\\..\\benchmarks\\lockbasedqueue.h\" />\r\n    <ClInclude Include=\"..\\..\\benchmarks\\simplelockfree.h\" />\r\n    <ClInclude Include=\"..\\..\\benchmarks\\stdqueue.h\" />\r\n    <ClInclude Include=\"..\\..\\benchmarks\\tbbqueue.h\" />\r\n    <ClInclude Include=\"..\\..\\benchmarks\\wrappers.h\" />\r\n    <ClInclude Include=\"..\\..\\concurrentqueue.h\" />\r\n    <ClInclude Include=\"..\\..\\tests\\common\\simplethread.h\" />\r\n    <ClInclude Include=\"..\\..\\tests\\common\\systemtime.h\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"..\\..\\benchmarks\\extract_graph_data.py\" />\r\n  </ItemGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\r\n  <ImportGroup Label=\"ExtensionTargets\">\r\n  </ImportGroup>\r\n</Project>"
  },
  {
    "path": "build/msvc12/benchmarks.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup>\r\n    <Filter Include=\"Source Files\">\r\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\r\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\r\n    </Filter>\r\n    <Filter Include=\"Header Files\">\r\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\r\n      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>\r\n    </Filter>\r\n    <Filter Include=\"Source Files\\tbb\">\r\n      <UniqueIdentifier>{6d3507c8-0e7e-45de-90d5-9daacabc8d2b}</UniqueIdentifier>\r\n    </Filter>\r\n    <Filter Include=\"Source Files\\dlib\">\r\n      <UniqueIdentifier>{3dfee594-40d0-4fea-992a-3958d8494fdd}</UniqueIdentifier>\r\n    </Filter>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\benchmarks.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\cpuid.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\cache_aligned_allocator.cpp\">\r\n      <Filter>Source Files\\tbb</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\concurrent_monitor.cpp\">\r\n      <Filter>Source Files\\tbb</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\concurrent_queue.cpp\">\r\n      <Filter>Source Files\\tbb</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\dynamic_link.cpp\">\r\n      <Filter>Source Files\\tbb</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\tbb_misc.cpp\">\r\n      <Filter>Source Files\\tbb</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\tests\\common\\simplethread.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\tests\\common\\systemtime.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"msvc_tbb_stubs.cpp\">\r\n      <Filter>Source Files\\tbb</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\spin_mutex.cpp\">\r\n      <Filter>Source Files\\tbb</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\dlib\\test_for_odr_violations.cpp\">\r\n      <Filter>Source Files\\dlib</Filter>\r\n    </ClCompile>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClInclude Include=\"..\\..\\tests\\common\\simplethread.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\..\\tests\\common\\systemtime.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\..\\concurrentqueue.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\..\\benchmarks\\boostqueue.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\..\\benchmarks\\cpuid.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\..\\benchmarks\\lockbasedqueue.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\..\\benchmarks\\simplelockfree.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\..\\benchmarks\\stdqueue.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\..\\benchmarks\\tbbqueue.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\..\\benchmarks\\wrappers.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"..\\..\\benchmarks\\extract_graph_data.py\" />\r\n  </ItemGroup>\r\n</Project>"
  },
  {
    "path": "build/msvc12/concurrentqueue.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 12.00\r\n# Visual Studio 2013\r\nVisualStudioVersion = 12.0.31010.0\r\nMinimumVisualStudioVersion = 10.0.40219.1\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"unittests\", \"unittests.vcxproj\", \"{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"benchmarks\", \"benchmarks.vcxproj\", \"{86870AC7-4A91-490A-A126-AFD6B0B24B7E}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"fuzztests\", \"fuzztests.vcxproj\", \"{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tDebug|x64 = Debug|x64\r\n\t\tRelease|Win32 = Release|Win32\r\n\t\tRelease|x64 = Release|x64\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Release|x64.Build.0 = Release|x64\r\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Release|x64.Build.0 = Release|x64\r\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Release|x64.Build.0 = Release|x64\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "build/msvc12/fuzztests.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project DefaultTargets=\"Build\" ToolsVersion=\"12.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup Label=\"ProjectConfigurations\">\r\n    <ProjectConfiguration Include=\"Debug|Win32\">\r\n      <Configuration>Debug</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Debug|x64\">\r\n      <Configuration>Debug</Configuration>\r\n      <Platform>x64</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Release|Win32\">\r\n      <Configuration>Release</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Release|x64\">\r\n      <Configuration>Release</Configuration>\r\n      <Platform>x64</Platform>\r\n    </ProjectConfiguration>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"..\\..\\tests\\common\\simplethread.cpp\" />\r\n    <ClCompile Include=\"..\\..\\tests\\common\\systemtime.cpp\" />\r\n    <ClCompile Include=\"..\\..\\tests\\fuzztests\\fuzztests.cpp\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClInclude Include=\"..\\..\\concurrentqueue.h\" />\r\n    <ClInclude Include=\"..\\..\\tests\\common\\simplethread.h\" />\r\n    <ClInclude Include=\"..\\..\\tests\\common\\systemtime.h\" />\r\n    <ClInclude Include=\"..\\..\\tests\\corealgos.h\" />\r\n  </ItemGroup>\r\n  <PropertyGroup Label=\"Globals\">\r\n    <ProjectGuid>{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}</ProjectGuid>\r\n    <Keyword>Win32Proj</Keyword>\r\n    <RootNamespace>fuzztests</RootNamespace>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>true</UseDebugLibraries>\r\n    <PlatformToolset>v120</PlatformToolset>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>true</UseDebugLibraries>\r\n    <PlatformToolset>v120</PlatformToolset>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>false</UseDebugLibraries>\r\n    <PlatformToolset>v120</PlatformToolset>\r\n    <WholeProgramOptimization>true</WholeProgramOptimization>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>false</UseDebugLibraries>\r\n    <PlatformToolset>v120</PlatformToolset>\r\n    <WholeProgramOptimization>true</WholeProgramOptimization>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\r\n  <ImportGroup Label=\"ExtensionSettings\">\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <PropertyGroup Label=\"UserMacros\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <LinkIncremental>true</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n    <LinkIncremental>true</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <LinkIncremental>false</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\r\n    <LinkIncremental>false</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <ClCompile>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <Optimization>Disabled</Optimization>\r\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <DisableSpecificWarnings>4800</DisableSpecificWarnings>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n    <ClCompile>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <Optimization>Disabled</Optimization>\r\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <DisableSpecificWarnings>4800</DisableSpecificWarnings>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <Optimization>MaxSpeed</Optimization>\r\n      <FunctionLevelLinking>true</FunctionLevelLinking>\r\n      <IntrinsicFunctions>true</IntrinsicFunctions>\r\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <DisableSpecificWarnings>4800</DisableSpecificWarnings>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r\n      <OptimizeReferences>true</OptimizeReferences>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <Optimization>MaxSpeed</Optimization>\r\n      <FunctionLevelLinking>true</FunctionLevelLinking>\r\n      <IntrinsicFunctions>true</IntrinsicFunctions>\r\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <DisableSpecificWarnings>4800</DisableSpecificWarnings>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r\n      <OptimizeReferences>true</OptimizeReferences>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\r\n  <ImportGroup Label=\"ExtensionTargets\">\r\n  </ImportGroup>\r\n</Project>"
  },
  {
    "path": "build/msvc12/fuzztests.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup>\r\n    <Filter Include=\"Source Files\">\r\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\r\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\r\n    </Filter>\r\n    <Filter Include=\"Header Files\">\r\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\r\n      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>\r\n    </Filter>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"..\\..\\tests\\common\\simplethread.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\tests\\common\\systemtime.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\tests\\fuzztests\\fuzztests.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClInclude Include=\"..\\..\\concurrentqueue.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\..\\tests\\corealgos.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\..\\tests\\common\\simplethread.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\..\\tests\\common\\systemtime.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n  </ItemGroup>\r\n</Project>"
  },
  {
    "path": "build/msvc12/msvc_tbb_stubs.cpp",
    "content": "#include \"tbb/tbb_main.h\"\n#include \"tbb/itt_notify.h\"\n\n#include <atomic>\n\nnamespace tbb {\n\tnamespace internal {\n\t\t// Taken from tbb_main.cpp (which doesn't compile as-is)\n\n\t\tvoid call_itt_notify_v5(int /*t*/, void* /*ptr*/) {}\n\n\t\tvoid itt_store_pointer_with_release_v3(void* dst, void* src) {\n\t\t\tITT_NOTIFY(sync_releasing, dst);\n\t\t\t__TBB_store_with_release(*static_cast<void**>(dst), src);\n\t\t}\n\t}\n}\n\nextern \"C\" {\n#ifdef _WIN64\n\t__int8 __TBB_machine_cmpswp1(volatile void *ptr, __int8 value, __int8 comparand) {\n\t\treturn _InterlockedCompareExchange8((__int8*)ptr, value, comparand);\n\t}\n#else\n\t// Taken from tbb/machine/windows_intel64.h, which isn't included in 32-bit mode but is\n\t// still used for some reason\n\t__int64 __TBB_machine_cmpswp8(volatile void *ptr, __int64 value, __int64 comparand) {\n\t\treturn _InterlockedCompareExchange64((__int64*)ptr, value, comparand);\n\t}\n#endif\n}\n"
  },
  {
    "path": "build/msvc12/unittests.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project DefaultTargets=\"Build\" ToolsVersion=\"12.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup Label=\"ProjectConfigurations\">\r\n    <ProjectConfiguration Include=\"Debug|Win32\">\r\n      <Configuration>Debug</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Debug|x64\">\r\n      <Configuration>Debug</Configuration>\r\n      <Platform>x64</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Release|Win32\">\r\n      <Configuration>Release</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Release|x64\">\r\n      <Configuration>Release</Configuration>\r\n      <Platform>x64</Platform>\r\n    </ProjectConfiguration>\r\n  </ItemGroup>\r\n  <PropertyGroup Label=\"Globals\">\r\n    <ProjectGuid>{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}</ProjectGuid>\r\n    <Keyword>Win32Proj</Keyword>\r\n    <RootNamespace>unittests</RootNamespace>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>true</UseDebugLibraries>\r\n    <PlatformToolset>v120</PlatformToolset>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>true</UseDebugLibraries>\r\n    <PlatformToolset>v120</PlatformToolset>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>false</UseDebugLibraries>\r\n    <PlatformToolset>v120</PlatformToolset>\r\n    <WholeProgramOptimization>true</WholeProgramOptimization>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>false</UseDebugLibraries>\r\n    <PlatformToolset>v120</PlatformToolset>\r\n    <WholeProgramOptimization>true</WholeProgramOptimization>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\r\n  <ImportGroup Label=\"ExtensionSettings\">\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <PropertyGroup Label=\"UserMacros\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <LinkIncremental>true</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n    <LinkIncremental>true</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <LinkIncremental>false</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\r\n    <LinkIncremental>false</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <ClCompile>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <Optimization>Disabled</Optimization>\r\n      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_LIB;MOODYCAMEL_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <DisableSpecificWarnings>4146</DisableSpecificWarnings>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n    <ClCompile>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <Optimization>Disabled</Optimization>\r\n      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_LIB;MOODYCAMEL_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <DisableSpecificWarnings>4146</DisableSpecificWarnings>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <Optimization>MaxSpeed</Optimization>\r\n      <FunctionLevelLinking>true</FunctionLevelLinking>\r\n      <IntrinsicFunctions>true</IntrinsicFunctions>\r\n      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_LIB;MOODYCAMEL_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <DisableSpecificWarnings>4146</DisableSpecificWarnings>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r\n      <OptimizeReferences>true</OptimizeReferences>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <Optimization>MaxSpeed</Optimization>\r\n      <FunctionLevelLinking>true</FunctionLevelLinking>\r\n      <IntrinsicFunctions>true</IntrinsicFunctions>\r\n      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_LIB;MOODYCAMEL_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <DisableSpecificWarnings>4146</DisableSpecificWarnings>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r\n      <OptimizeReferences>true</OptimizeReferences>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemGroup>\r\n    <ClInclude Include=\"..\\..\\blockingconcurrentqueue.h\" />\r\n    <ClInclude Include=\"..\\..\\concurrentqueue.h\" />\r\n    <ClInclude Include=\"..\\..\\tests\\common\\simplethread.h\" />\r\n    <ClInclude Include=\"..\\..\\tests\\common\\systemtime.h\" />\r\n    <ClInclude Include=\"..\\..\\tests\\corealgos.h\" />\r\n    <ClInclude Include=\"..\\..\\tests\\unittests\\minitest.h\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"..\\..\\c_api\\blockingconcurrentqueue.cpp\">\r\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">false</ExceptionHandling>\r\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">false</ExceptionHandling>\r\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">false</ExceptionHandling>\r\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">false</ExceptionHandling>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n\t</ClCompile>\r\n    <ClCompile Include=\"..\\..\\c_api\\concurrentqueue.cpp\">\r\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">false</ExceptionHandling>\r\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">false</ExceptionHandling>\r\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">false</ExceptionHandling>\r\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">false</ExceptionHandling>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n\t</ClCompile>\r\n    <ClCompile Include=\"..\\..\\tests\\common\\simplethread.cpp\" />\r\n    <ClCompile Include=\"..\\..\\tests\\common\\systemtime.cpp\" />\r\n    <ClCompile Include=\"..\\..\\tests\\unittests\\mallocmacro.cpp\" />\r\n    <ClCompile Include=\"..\\..\\tests\\unittests\\unittests.cpp\" />\r\n  </ItemGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\r\n  <ImportGroup Label=\"ExtensionTargets\">\r\n  </ImportGroup>\r\n</Project>"
  },
  {
    "path": "build/msvc12/unittests.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup>\r\n    <Filter Include=\"Source Files\">\r\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\r\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\r\n    </Filter>\r\n    <Filter Include=\"Header Files\">\r\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\r\n      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>\r\n    </Filter>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClInclude Include=\"..\\..\\tests\\common\\simplethread.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\..\\concurrentqueue.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\..\\tests\\corealgos.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\..\\tests\\unittests\\minitest.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\..\\tests\\common\\systemtime.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"..\\..\\blockingconcurrentqueue.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"..\\..\\tests\\common\\simplethread.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\tests\\common\\systemtime.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\tests\\unittests\\unittests.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\tests\\unittests\\mallocmacro.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\c_api\\blockingconcurrentqueue.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\c_api\\concurrentqueue.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n  </ItemGroup>\r\n</Project>"
  },
  {
    "path": "build/msvc14/benchmarks.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"14.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{86870AC7-4A91-490A-A126-AFD6B0B24B7E}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>benchmarks</RootNamespace>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v140</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v140</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v140</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v140</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <LinkIncremental>false</LinkIncremental>\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <LinkIncremental>false</LinkIncremental>\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <LinkIncremental>false</LinkIncremental>\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <LinkIncremental>false</LinkIncremental>\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_ENABLE_ATOMIC_ALIGNMENT_FIX;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>$(SolutionDir)\\..\\..\\benchmarks</AdditionalIncludeDirectories>\n      <WholeProgramOptimization>true</WholeProgramOptimization>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <IgnoreSpecificDefaultLibraries>tbb_debug.lib</IgnoreSpecificDefaultLibraries>\n      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_ENABLE_ATOMIC_ALIGNMENT_FIX;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>$(SolutionDir)\\..\\..\\benchmarks</AdditionalIncludeDirectories>\n      <WholeProgramOptimization>true</WholeProgramOptimization>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <IgnoreSpecificDefaultLibraries>tbb_debug.lib</IgnoreSpecificDefaultLibraries>\n      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_ENABLE_ATOMIC_ALIGNMENT_FIX;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>$(SolutionDir)\\..\\..\\benchmarks</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <IgnoreSpecificDefaultLibraries>tbb.lib</IgnoreSpecificDefaultLibraries>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_ENABLE_ATOMIC_ALIGNMENT_FIX;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>$(SolutionDir)\\..\\..\\benchmarks</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <IgnoreSpecificDefaultLibraries>tbb.lib</IgnoreSpecificDefaultLibraries>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\benchmarks\\benchmarks.cpp\">\n      <DisableSpecificWarnings Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">4244;4800</DisableSpecificWarnings>\n      <DisableSpecificWarnings Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">4244;4800</DisableSpecificWarnings>\n      <DisableSpecificWarnings Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">4244;4800</DisableSpecificWarnings>\n      <DisableSpecificWarnings Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">4244;4800</DisableSpecificWarnings>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\cpuid.cpp\" />\n    <ClCompile Include=\"..\\..\\benchmarks\\dlib\\test_for_odr_violations.cpp\" />\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\cache_aligned_allocator.cpp\">\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n      </UndefinePreprocessorDefinitions>\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n      </UndefinePreprocessorDefinitions>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\concurrent_monitor.cpp\">\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n      </UndefinePreprocessorDefinitions>\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n      </UndefinePreprocessorDefinitions>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\concurrent_queue.cpp\">\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n      </UndefinePreprocessorDefinitions>\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n      </UndefinePreprocessorDefinitions>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\dynamic_link.cpp\">\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n      </UndefinePreprocessorDefinitions>\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n      </UndefinePreprocessorDefinitions>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\spin_mutex.cpp\">\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\tbb_misc.cpp\">\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n      </UndefinePreprocessorDefinitions>\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n      </UndefinePreprocessorDefinitions>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\tests\\common\\simplethread.cpp\" />\n    <ClCompile Include=\"..\\..\\tests\\common\\systemtime.cpp\" />\n    <ClCompile Include=\"msvc_tbb_stubs.cpp\">\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\..\\benchmarks\\boostqueue.h\" />\n    <ClInclude Include=\"..\\..\\benchmarks\\cpuid.h\" />\n    <ClInclude Include=\"..\\..\\benchmarks\\lockbasedqueue.h\" />\n    <ClInclude Include=\"..\\..\\benchmarks\\simplelockfree.h\" />\n    <ClInclude Include=\"..\\..\\benchmarks\\stdqueue.h\" />\n    <ClInclude Include=\"..\\..\\benchmarks\\tbbqueue.h\" />\n    <ClInclude Include=\"..\\..\\benchmarks\\wrappers.h\" />\n    <ClInclude Include=\"..\\..\\concurrentqueue.h\" />\n    <ClInclude Include=\"..\\..\\tests\\common\\simplethread.h\" />\n    <ClInclude Include=\"..\\..\\tests\\common\\systemtime.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"..\\..\\benchmarks\\extract_graph_data.py\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "build/msvc14/benchmarks.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Source Files\\tbb\">\n      <UniqueIdentifier>{6d3507c8-0e7e-45de-90d5-9daacabc8d2b}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"Source Files\\dlib\">\n      <UniqueIdentifier>{3dfee594-40d0-4fea-992a-3958d8494fdd}</UniqueIdentifier>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\benchmarks\\benchmarks.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\cpuid.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\cache_aligned_allocator.cpp\">\n      <Filter>Source Files\\tbb</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\concurrent_monitor.cpp\">\n      <Filter>Source Files\\tbb</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\concurrent_queue.cpp\">\n      <Filter>Source Files\\tbb</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\dynamic_link.cpp\">\n      <Filter>Source Files\\tbb</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\tbb_misc.cpp\">\n      <Filter>Source Files\\tbb</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\tests\\common\\simplethread.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\tests\\common\\systemtime.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"msvc_tbb_stubs.cpp\">\n      <Filter>Source Files\\tbb</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\spin_mutex.cpp\">\n      <Filter>Source Files\\tbb</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\dlib\\test_for_odr_violations.cpp\">\n      <Filter>Source Files\\dlib</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\..\\tests\\common\\simplethread.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\tests\\common\\systemtime.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\concurrentqueue.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\benchmarks\\boostqueue.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\benchmarks\\cpuid.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\benchmarks\\lockbasedqueue.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\benchmarks\\simplelockfree.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\benchmarks\\stdqueue.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\benchmarks\\tbbqueue.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\benchmarks\\wrappers.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"..\\..\\benchmarks\\extract_graph_data.py\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "build/msvc14/concurrentqueue.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.25123.0\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"unittests\", \"unittests.vcxproj\", \"{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"benchmarks\", \"benchmarks.vcxproj\", \"{86870AC7-4A91-490A-A126-AFD6B0B24B7E}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"fuzztests\", \"fuzztests.vcxproj\", \"{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Win32 = Debug|Win32\n\t\tDebug|x64 = Debug|x64\n\t\tRelease|Win32 = Release|Win32\n\t\tRelease|x64 = Release|x64\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Debug|x64.Build.0 = Debug|x64\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Release|Win32.Build.0 = Release|Win32\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Release|x64.ActiveCfg = Release|x64\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Release|x64.Build.0 = Release|x64\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Debug|x64.Build.0 = Debug|x64\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Release|Win32.Build.0 = Release|Win32\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Release|x64.ActiveCfg = Release|x64\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Release|x64.Build.0 = Release|x64\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Debug|x64.Build.0 = Debug|x64\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Release|Win32.Build.0 = Release|Win32\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Release|x64.ActiveCfg = Release|x64\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Release|x64.Build.0 = Release|x64\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "build/msvc14/fuzztests.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"14.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\tests\\common\\simplethread.cpp\" />\n    <ClCompile Include=\"..\\..\\tests\\common\\systemtime.cpp\" />\n    <ClCompile Include=\"..\\..\\tests\\fuzztests\\fuzztests.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\..\\concurrentqueue.h\" />\n    <ClInclude Include=\"..\\..\\tests\\common\\simplethread.h\" />\n    <ClInclude Include=\"..\\..\\tests\\common\\systemtime.h\" />\n    <ClInclude Include=\"..\\..\\tests\\corealgos.h\" />\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>fuzztests</RootNamespace>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v140</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v140</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v140</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v140</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <LinkIncremental>true</LinkIncremental>\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <LinkIncremental>true</LinkIncremental>\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <LinkIncremental>false</LinkIncremental>\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <LinkIncremental>false</LinkIncremental>\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <DisableSpecificWarnings>4800</DisableSpecificWarnings>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <DisableSpecificWarnings>4800</DisableSpecificWarnings>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <DisableSpecificWarnings>4800</DisableSpecificWarnings>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <DisableSpecificWarnings>4800</DisableSpecificWarnings>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "build/msvc14/fuzztests.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\tests\\common\\simplethread.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\tests\\common\\systemtime.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\tests\\fuzztests\\fuzztests.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\..\\concurrentqueue.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\tests\\corealgos.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\tests\\common\\simplethread.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\tests\\common\\systemtime.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "build/msvc14/msvc_tbb_stubs.cpp",
    "content": "#include \"tbb/tbb_main.h\"\n#include \"tbb/itt_notify.h\"\n\n#include <atomic>\n\nnamespace tbb {\n\tnamespace internal {\n\t\t// Taken from tbb_main.cpp (which doesn't compile as-is)\n\n\t\tvoid call_itt_notify_v5(int /*t*/, void* /*ptr*/) {}\n\n\t\tvoid itt_store_pointer_with_release_v3(void* dst, void* src) {\n\t\t\tITT_NOTIFY(sync_releasing, dst);\n\t\t\t__TBB_store_with_release(*static_cast<void**>(dst), src);\n\t\t}\n\t}\n}\n\nextern \"C\" {\n#ifdef _WIN64\n\t__int8 __TBB_machine_cmpswp1(volatile void *ptr, __int8 value, __int8 comparand) {\n\t\treturn _InterlockedCompareExchange8((__int8*)ptr, value, comparand);\n\t}\n#else\n\t// Taken from tbb/machine/windows_intel64.h, which isn't included in 32-bit mode but is\n\t// still used for some reason\n\t__int64 __TBB_machine_cmpswp8(volatile void *ptr, __int64 value, __int64 comparand) {\n\t\treturn _InterlockedCompareExchange64((__int64*)ptr, value, comparand);\n\t}\n#endif\n}\n"
  },
  {
    "path": "build/msvc14/unittests.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"14.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>unittests</RootNamespace>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v140</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v140</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v140</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v140</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <LinkIncremental>true</LinkIncremental>\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <LinkIncremental>true</LinkIncremental>\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <LinkIncremental>false</LinkIncremental>\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <LinkIncremental>false</LinkIncremental>\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_LIB;MOODYCAMEL_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <DisableSpecificWarnings>4146</DisableSpecificWarnings>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_LIB;MOODYCAMEL_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <DisableSpecificWarnings>4146</DisableSpecificWarnings>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_LIB;MOODYCAMEL_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <DisableSpecificWarnings>4146</DisableSpecificWarnings>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_LIB;MOODYCAMEL_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <DisableSpecificWarnings>4146</DisableSpecificWarnings>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\..\\blockingconcurrentqueue.h\" />\n    <ClInclude Include=\"..\\..\\concurrentqueue.h\" />\n    <ClInclude Include=\"..\\..\\tests\\common\\simplethread.h\" />\n    <ClInclude Include=\"..\\..\\tests\\common\\systemtime.h\" />\n    <ClInclude Include=\"..\\..\\tests\\corealgos.h\" />\n    <ClInclude Include=\"..\\..\\tests\\unittests\\minitest.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\c_api\\blockingconcurrentqueue.cpp\">\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">false</ExceptionHandling>\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">false</ExceptionHandling>\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">false</ExceptionHandling>\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">false</ExceptionHandling>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n\t</ClCompile>\n    <ClCompile Include=\"..\\..\\c_api\\concurrentqueue.cpp\">\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">false</ExceptionHandling>\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">false</ExceptionHandling>\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">false</ExceptionHandling>\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">false</ExceptionHandling>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n\t</ClCompile>\n    <ClCompile Include=\"..\\..\\tests\\common\\simplethread.cpp\" />\n    <ClCompile Include=\"..\\..\\tests\\common\\systemtime.cpp\" />\n    <ClCompile Include=\"..\\..\\tests\\unittests\\mallocmacro.cpp\" />\n    <ClCompile Include=\"..\\..\\tests\\unittests\\unittests.cpp\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "build/msvc14/unittests.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\..\\tests\\common\\simplethread.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\concurrentqueue.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\tests\\corealgos.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\tests\\unittests\\minitest.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\tests\\common\\systemtime.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\blockingconcurrentqueue.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\tests\\common\\simplethread.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\tests\\common\\systemtime.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\tests\\unittests\\unittests.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\tests\\unittests\\mallocmacro.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\c_api\\blockingconcurrentqueue.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\c_api\\concurrentqueue.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "build/msvc15/benchmarks.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{86870AC7-4A91-490A-A126-AFD6B0B24B7E}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>benchmarks</RootNamespace>\n    <WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v141</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v141</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v141</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v141</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <LinkIncremental>false</LinkIncremental>\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <LinkIncremental>false</LinkIncremental>\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <LinkIncremental>false</LinkIncremental>\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <LinkIncremental>false</LinkIncremental>\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_ENABLE_ATOMIC_ALIGNMENT_FIX;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>$(SolutionDir)\\..\\..\\benchmarks</AdditionalIncludeDirectories>\n      <WholeProgramOptimization>true</WholeProgramOptimization>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <IgnoreSpecificDefaultLibraries>tbb_debug.lib</IgnoreSpecificDefaultLibraries>\n      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_ENABLE_ATOMIC_ALIGNMENT_FIX;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>$(SolutionDir)\\..\\..\\benchmarks</AdditionalIncludeDirectories>\n      <WholeProgramOptimization>true</WholeProgramOptimization>\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <IgnoreSpecificDefaultLibraries>tbb_debug.lib</IgnoreSpecificDefaultLibraries>\n      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_ENABLE_ATOMIC_ALIGNMENT_FIX;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>$(SolutionDir)\\..\\..\\benchmarks</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <IgnoreSpecificDefaultLibraries>tbb.lib</IgnoreSpecificDefaultLibraries>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_ENABLE_ATOMIC_ALIGNMENT_FIX;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>$(SolutionDir)\\..\\..\\benchmarks</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <IgnoreSpecificDefaultLibraries>tbb.lib</IgnoreSpecificDefaultLibraries>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\benchmarks\\benchmarks.cpp\">\n      <DisableSpecificWarnings Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">4244;4800</DisableSpecificWarnings>\n      <DisableSpecificWarnings Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">4244;4800</DisableSpecificWarnings>\n      <DisableSpecificWarnings Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">4244;4800</DisableSpecificWarnings>\n      <DisableSpecificWarnings Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">4244;4800</DisableSpecificWarnings>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\cpuid.cpp\" />\n    <ClCompile Include=\"..\\..\\benchmarks\\dlib\\test_for_odr_violations.cpp\" />\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\cache_aligned_allocator.cpp\">\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n      </UndefinePreprocessorDefinitions>\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n      </UndefinePreprocessorDefinitions>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\concurrent_monitor.cpp\">\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n      </UndefinePreprocessorDefinitions>\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n      </UndefinePreprocessorDefinitions>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\concurrent_queue.cpp\">\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n      </UndefinePreprocessorDefinitions>\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n      </UndefinePreprocessorDefinitions>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\dynamic_link.cpp\">\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n      </UndefinePreprocessorDefinitions>\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n      </UndefinePreprocessorDefinitions>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\spin_mutex.cpp\">\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\tbb_misc.cpp\">\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n      </UndefinePreprocessorDefinitions>\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n      </UndefinePreprocessorDefinitions>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\tests\\common\\simplethread.cpp\" />\n    <ClCompile Include=\"..\\..\\tests\\common\\systemtime.cpp\" />\n    <ClCompile Include=\"msvc_tbb_stubs.cpp\">\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\..\\benchmarks\\boostqueue.h\" />\n    <ClInclude Include=\"..\\..\\benchmarks\\cpuid.h\" />\n    <ClInclude Include=\"..\\..\\benchmarks\\lockbasedqueue.h\" />\n    <ClInclude Include=\"..\\..\\benchmarks\\simplelockfree.h\" />\n    <ClInclude Include=\"..\\..\\benchmarks\\stdqueue.h\" />\n    <ClInclude Include=\"..\\..\\benchmarks\\tbbqueue.h\" />\n    <ClInclude Include=\"..\\..\\benchmarks\\wrappers.h\" />\n    <ClInclude Include=\"..\\..\\concurrentqueue.h\" />\n    <ClInclude Include=\"..\\..\\tests\\common\\simplethread.h\" />\n    <ClInclude Include=\"..\\..\\tests\\common\\systemtime.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"..\\..\\benchmarks\\extract_graph_data.py\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "build/msvc15/benchmarks.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Source Files\\tbb\">\n      <UniqueIdentifier>{6d3507c8-0e7e-45de-90d5-9daacabc8d2b}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"Source Files\\dlib\">\n      <UniqueIdentifier>{3dfee594-40d0-4fea-992a-3958d8494fdd}</UniqueIdentifier>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\benchmarks\\benchmarks.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\cpuid.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\cache_aligned_allocator.cpp\">\n      <Filter>Source Files\\tbb</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\concurrent_monitor.cpp\">\n      <Filter>Source Files\\tbb</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\concurrent_queue.cpp\">\n      <Filter>Source Files\\tbb</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\dynamic_link.cpp\">\n      <Filter>Source Files\\tbb</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\tbb_misc.cpp\">\n      <Filter>Source Files\\tbb</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\tests\\common\\simplethread.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\tests\\common\\systemtime.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"msvc_tbb_stubs.cpp\">\n      <Filter>Source Files\\tbb</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\spin_mutex.cpp\">\n      <Filter>Source Files\\tbb</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\dlib\\test_for_odr_violations.cpp\">\n      <Filter>Source Files\\dlib</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\..\\tests\\common\\simplethread.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\tests\\common\\systemtime.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\concurrentqueue.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\benchmarks\\boostqueue.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\benchmarks\\cpuid.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\benchmarks\\lockbasedqueue.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\benchmarks\\simplelockfree.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\benchmarks\\stdqueue.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\benchmarks\\tbbqueue.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\benchmarks\\wrappers.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"..\\..\\benchmarks\\extract_graph_data.py\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "build/msvc15/concurrentqueue.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.7.3\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"unittests\", \"unittests.vcxproj\", \"{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"benchmarks\", \"benchmarks.vcxproj\", \"{86870AC7-4A91-490A-A126-AFD6B0B24B7E}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"fuzztests\", \"fuzztests.vcxproj\", \"{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Win32 = Debug|Win32\n\t\tDebug|x64 = Debug|x64\n\t\tRelease|Win32 = Release|Win32\n\t\tRelease|x64 = Release|x64\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Debug|x64.Build.0 = Debug|x64\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Release|Win32.Build.0 = Release|Win32\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Release|x64.ActiveCfg = Release|x64\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Release|x64.Build.0 = Release|x64\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Debug|x64.Build.0 = Debug|x64\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Release|Win32.Build.0 = Release|Win32\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Release|x64.ActiveCfg = Release|x64\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Release|x64.Build.0 = Release|x64\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Debug|x64.Build.0 = Debug|x64\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Release|Win32.Build.0 = Release|Win32\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Release|x64.ActiveCfg = Release|x64\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Release|x64.Build.0 = Release|x64\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "build/msvc15/fuzztests.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\tests\\common\\simplethread.cpp\" />\n    <ClCompile Include=\"..\\..\\tests\\common\\systemtime.cpp\" />\n    <ClCompile Include=\"..\\..\\tests\\fuzztests\\fuzztests.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\..\\concurrentqueue.h\" />\n    <ClInclude Include=\"..\\..\\tests\\common\\simplethread.h\" />\n    <ClInclude Include=\"..\\..\\tests\\common\\systemtime.h\" />\n    <ClInclude Include=\"..\\..\\tests\\corealgos.h\" />\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>fuzztests</RootNamespace>\n    <WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v141</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v141</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v141</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v141</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <LinkIncremental>true</LinkIncremental>\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <LinkIncremental>true</LinkIncremental>\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <LinkIncremental>false</LinkIncremental>\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <LinkIncremental>false</LinkIncremental>\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <DisableSpecificWarnings>4800</DisableSpecificWarnings>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <DisableSpecificWarnings>4800</DisableSpecificWarnings>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <DisableSpecificWarnings>4800</DisableSpecificWarnings>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <DisableSpecificWarnings>4800</DisableSpecificWarnings>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "build/msvc15/fuzztests.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\tests\\common\\simplethread.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\tests\\common\\systemtime.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\tests\\fuzztests\\fuzztests.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\..\\concurrentqueue.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\tests\\corealgos.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\tests\\common\\simplethread.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\tests\\common\\systemtime.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "build/msvc15/msvc_tbb_stubs.cpp",
    "content": "#include \"tbb/tbb_main.h\"\n#include \"tbb/itt_notify.h\"\n\n#include <atomic>\n\nnamespace tbb {\n\tnamespace internal {\n\t\t// Taken from tbb_main.cpp (which doesn't compile as-is)\n\n\t\tvoid call_itt_notify_v5(int /*t*/, void* /*ptr*/) {}\n\n\t\tvoid itt_store_pointer_with_release_v3(void* dst, void* src) {\n\t\t\tITT_NOTIFY(sync_releasing, dst);\n\t\t\t__TBB_store_with_release(*static_cast<void**>(dst), src);\n\t\t}\n\t}\n}\n\nextern \"C\" {\n#ifdef _WIN64\n\t__int8 __TBB_machine_cmpswp1(volatile void *ptr, __int8 value, __int8 comparand) {\n\t\treturn _InterlockedCompareExchange8((__int8*)ptr, value, comparand);\n\t}\n#else\n\t// Taken from tbb/machine/windows_intel64.h, which isn't included in 32-bit mode but is\n\t// still used for some reason\n\t__int64 __TBB_machine_cmpswp8(volatile void *ptr, __int64 value, __int64 comparand) {\n\t\treturn _InterlockedCompareExchange64((__int64*)ptr, value, comparand);\n\t}\n#endif\n}\n"
  },
  {
    "path": "build/msvc15/unittests.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>unittests</RootNamespace>\n    <WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v141</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v141</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v141</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v141</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <LinkIncremental>true</LinkIncremental>\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <LinkIncremental>true</LinkIncremental>\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <LinkIncremental>false</LinkIncremental>\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <LinkIncremental>false</LinkIncremental>\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_LIB;MOODYCAMEL_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <DisableSpecificWarnings>4146</DisableSpecificWarnings>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_LIB;MOODYCAMEL_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <DisableSpecificWarnings>4146</DisableSpecificWarnings>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_LIB;MOODYCAMEL_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <DisableSpecificWarnings>4146</DisableSpecificWarnings>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_LIB;MOODYCAMEL_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <DisableSpecificWarnings>4146</DisableSpecificWarnings>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\..\\blockingconcurrentqueue.h\" />\n    <ClInclude Include=\"..\\..\\concurrentqueue.h\" />\n    <ClInclude Include=\"..\\..\\tests\\common\\simplethread.h\" />\n    <ClInclude Include=\"..\\..\\tests\\common\\systemtime.h\" />\n    <ClInclude Include=\"..\\..\\tests\\corealgos.h\" />\n    <ClInclude Include=\"..\\..\\tests\\unittests\\minitest.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\c_api\\blockingconcurrentqueue.cpp\">\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">false</ExceptionHandling>\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">false</ExceptionHandling>\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">false</ExceptionHandling>\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">false</ExceptionHandling>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n\t</ClCompile>\n    <ClCompile Include=\"..\\..\\c_api\\concurrentqueue.cpp\">\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">false</ExceptionHandling>\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">false</ExceptionHandling>\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">false</ExceptionHandling>\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">false</ExceptionHandling>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n\t</ClCompile>\n    <ClCompile Include=\"..\\..\\tests\\common\\simplethread.cpp\" />\n    <ClCompile Include=\"..\\..\\tests\\common\\systemtime.cpp\" />\n    <ClCompile Include=\"..\\..\\tests\\unittests\\mallocmacro.cpp\" />\n    <ClCompile Include=\"..\\..\\tests\\unittests\\unittests.cpp\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "build/msvc15/unittests.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\..\\tests\\common\\simplethread.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\concurrentqueue.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\tests\\corealgos.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\tests\\unittests\\minitest.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\tests\\common\\systemtime.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\blockingconcurrentqueue.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\tests\\common\\simplethread.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\tests\\common\\systemtime.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\tests\\unittests\\unittests.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\tests\\unittests\\mallocmacro.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\c_api\\blockingconcurrentqueue.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\c_api\\concurrentqueue.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "build/msvc16/benchmarks.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup Label=\"ProjectConfigurations\">\r\n    <ProjectConfiguration Include=\"Debug|Win32\">\r\n      <Configuration>Debug</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Debug|x64\">\r\n      <Configuration>Debug</Configuration>\r\n      <Platform>x64</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Release|Win32\">\r\n      <Configuration>Release</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Release|x64\">\r\n      <Configuration>Release</Configuration>\r\n      <Platform>x64</Platform>\r\n    </ProjectConfiguration>\r\n  </ItemGroup>\r\n  <PropertyGroup Label=\"Globals\">\r\n    <ProjectGuid>{86870AC7-4A91-490A-A126-AFD6B0B24B7E}</ProjectGuid>\r\n    <Keyword>Win32Proj</Keyword>\r\n    <RootNamespace>benchmarks</RootNamespace>\r\n    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>true</UseDebugLibraries>\r\n    <PlatformToolset>v142</PlatformToolset>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>true</UseDebugLibraries>\r\n    <PlatformToolset>v142</PlatformToolset>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>false</UseDebugLibraries>\r\n    <PlatformToolset>v142</PlatformToolset>\r\n    <WholeProgramOptimization>true</WholeProgramOptimization>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>false</UseDebugLibraries>\r\n    <PlatformToolset>v142</PlatformToolset>\r\n    <WholeProgramOptimization>true</WholeProgramOptimization>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\r\n  <ImportGroup Label=\"ExtensionSettings\">\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <PropertyGroup Label=\"UserMacros\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <LinkIncremental>false</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n    <LinkIncremental>false</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <LinkIncremental>false</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\r\n    <LinkIncremental>false</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <ClCompile>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <Optimization>Disabled</Optimization>\r\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_ENABLE_ATOMIC_ALIGNMENT_FIX;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <AdditionalIncludeDirectories>$(SolutionDir)\\..\\..\\benchmarks</AdditionalIncludeDirectories>\r\n      <WholeProgramOptimization>true</WholeProgramOptimization>\r\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <IgnoreSpecificDefaultLibraries>tbb_debug.lib</IgnoreSpecificDefaultLibraries>\r\n      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n    <ClCompile>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <Optimization>Disabled</Optimization>\r\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_ENABLE_ATOMIC_ALIGNMENT_FIX;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <AdditionalIncludeDirectories>$(SolutionDir)\\..\\..\\benchmarks</AdditionalIncludeDirectories>\r\n      <WholeProgramOptimization>true</WholeProgramOptimization>\r\n      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <IgnoreSpecificDefaultLibraries>tbb_debug.lib</IgnoreSpecificDefaultLibraries>\r\n      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <Optimization>MaxSpeed</Optimization>\r\n      <FunctionLevelLinking>true</FunctionLevelLinking>\r\n      <IntrinsicFunctions>true</IntrinsicFunctions>\r\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_ENABLE_ATOMIC_ALIGNMENT_FIX;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <AdditionalIncludeDirectories>$(SolutionDir)\\..\\..\\benchmarks</AdditionalIncludeDirectories>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r\n      <OptimizeReferences>true</OptimizeReferences>\r\n      <IgnoreSpecificDefaultLibraries>tbb.lib</IgnoreSpecificDefaultLibraries>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <Optimization>MaxSpeed</Optimization>\r\n      <FunctionLevelLinking>true</FunctionLevelLinking>\r\n      <IntrinsicFunctions>true</IntrinsicFunctions>\r\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_ENABLE_ATOMIC_ALIGNMENT_FIX;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <AdditionalIncludeDirectories>$(SolutionDir)\\..\\..\\benchmarks</AdditionalIncludeDirectories>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r\n      <OptimizeReferences>true</OptimizeReferences>\r\n      <IgnoreSpecificDefaultLibraries>tbb.lib</IgnoreSpecificDefaultLibraries>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\benchmarks.cpp\">\r\n      <DisableSpecificWarnings Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">4244;4800</DisableSpecificWarnings>\r\n      <DisableSpecificWarnings Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">4244;4800</DisableSpecificWarnings>\r\n      <DisableSpecificWarnings Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">4244;4800</DisableSpecificWarnings>\r\n      <DisableSpecificWarnings Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">4244;4800</DisableSpecificWarnings>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\cpuid.cpp\" />\r\n    <ClCompile Include=\"..\\..\\benchmarks\\dlib\\test_for_odr_violations.cpp\" />\r\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\cache_aligned_allocator.cpp\">\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n      </UndefinePreprocessorDefinitions>\r\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n      </UndefinePreprocessorDefinitions>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\concurrent_monitor.cpp\">\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n      </UndefinePreprocessorDefinitions>\r\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n      </UndefinePreprocessorDefinitions>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\concurrent_queue.cpp\">\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n      </UndefinePreprocessorDefinitions>\r\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n      </UndefinePreprocessorDefinitions>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\dynamic_link.cpp\">\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n      </UndefinePreprocessorDefinitions>\r\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n      </UndefinePreprocessorDefinitions>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\spin_mutex.cpp\">\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\tbb_misc.cpp\">\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n      </UndefinePreprocessorDefinitions>\r\n      <UndefinePreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n      </UndefinePreprocessorDefinitions>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\tests\\common\\simplethread.cpp\" />\r\n    <ClCompile Include=\"..\\..\\tests\\common\\systemtime.cpp\" />\r\n    <ClCompile Include=\"msvc_tbb_stubs.cpp\">\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">__TBB_BUILD=1;USE_WINTHREAD;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n    </ClCompile>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClInclude Include=\"..\\..\\benchmarks\\boostqueue.h\" />\r\n    <ClInclude Include=\"..\\..\\benchmarks\\cpuid.h\" />\r\n    <ClInclude Include=\"..\\..\\benchmarks\\lockbasedqueue.h\" />\r\n    <ClInclude Include=\"..\\..\\benchmarks\\simplelockfree.h\" />\r\n    <ClInclude Include=\"..\\..\\benchmarks\\stdqueue.h\" />\r\n    <ClInclude Include=\"..\\..\\benchmarks\\tbbqueue.h\" />\r\n    <ClInclude Include=\"..\\..\\benchmarks\\wrappers.h\" />\r\n    <ClInclude Include=\"..\\..\\concurrentqueue.h\" />\r\n    <ClInclude Include=\"..\\..\\tests\\common\\simplethread.h\" />\r\n    <ClInclude Include=\"..\\..\\tests\\common\\systemtime.h\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"..\\..\\benchmarks\\extract_graph_data.py\" />\r\n  </ItemGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\r\n  <ImportGroup Label=\"ExtensionTargets\">\r\n  </ImportGroup>\r\n</Project>"
  },
  {
    "path": "build/msvc16/benchmarks.vcxproj.filters",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Source Files\\tbb\">\n      <UniqueIdentifier>{6d3507c8-0e7e-45de-90d5-9daacabc8d2b}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"Source Files\\dlib\">\n      <UniqueIdentifier>{3dfee594-40d0-4fea-992a-3958d8494fdd}</UniqueIdentifier>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\benchmarks\\benchmarks.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\cpuid.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\cache_aligned_allocator.cpp\">\n      <Filter>Source Files\\tbb</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\concurrent_monitor.cpp\">\n      <Filter>Source Files\\tbb</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\concurrent_queue.cpp\">\n      <Filter>Source Files\\tbb</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\dynamic_link.cpp\">\n      <Filter>Source Files\\tbb</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\tbb_misc.cpp\">\n      <Filter>Source Files\\tbb</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\tests\\common\\simplethread.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\tests\\common\\systemtime.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"msvc_tbb_stubs.cpp\">\n      <Filter>Source Files\\tbb</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\tbb\\spin_mutex.cpp\">\n      <Filter>Source Files\\tbb</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\benchmarks\\dlib\\test_for_odr_violations.cpp\">\n      <Filter>Source Files\\dlib</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\..\\tests\\common\\simplethread.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\tests\\common\\systemtime.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\concurrentqueue.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\benchmarks\\boostqueue.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\benchmarks\\cpuid.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\benchmarks\\lockbasedqueue.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\benchmarks\\simplelockfree.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\benchmarks\\stdqueue.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\benchmarks\\tbbqueue.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\benchmarks\\wrappers.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"..\\..\\benchmarks\\extract_graph_data.py\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "build/msvc16/concurrentqueue.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 12.00\r\n# Visual Studio Version 16\r\nVisualStudioVersion = 16.0.29001.49\r\nMinimumVisualStudioVersion = 10.0.40219.1\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"unittests\", \"unittests.vcxproj\", \"{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"benchmarks\", \"benchmarks.vcxproj\", \"{86870AC7-4A91-490A-A126-AFD6B0B24B7E}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"fuzztests\", \"fuzztests.vcxproj\", \"{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tDebug|x64 = Debug|x64\r\n\t\tRelease|Win32 = Release|Win32\r\n\t\tRelease|x64 = Release|x64\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}.Release|x64.Build.0 = Release|x64\r\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{86870AC7-4A91-490A-A126-AFD6B0B24B7E}.Release|x64.Build.0 = Release|x64\r\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}.Release|x64.Build.0 = Release|x64\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\n\tGlobalSection(ExtensibilityGlobals) = postSolution\r\n\t\tSolutionGuid = {F6973AFD-2024-4669-8812-FE9A592FF522}\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "build/msvc16/fuzztests.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup Label=\"ProjectConfigurations\">\r\n    <ProjectConfiguration Include=\"Debug|Win32\">\r\n      <Configuration>Debug</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Debug|x64\">\r\n      <Configuration>Debug</Configuration>\r\n      <Platform>x64</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Release|Win32\">\r\n      <Configuration>Release</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Release|x64\">\r\n      <Configuration>Release</Configuration>\r\n      <Platform>x64</Platform>\r\n    </ProjectConfiguration>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"..\\..\\tests\\common\\simplethread.cpp\" />\r\n    <ClCompile Include=\"..\\..\\tests\\common\\systemtime.cpp\" />\r\n    <ClCompile Include=\"..\\..\\tests\\fuzztests\\fuzztests.cpp\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClInclude Include=\"..\\..\\concurrentqueue.h\" />\r\n    <ClInclude Include=\"..\\..\\tests\\common\\simplethread.h\" />\r\n    <ClInclude Include=\"..\\..\\tests\\common\\systemtime.h\" />\r\n    <ClInclude Include=\"..\\..\\tests\\corealgos.h\" />\r\n  </ItemGroup>\r\n  <PropertyGroup Label=\"Globals\">\r\n    <ProjectGuid>{D86EB0A1-CFDE-4177-87FE-A8337FFE6FA7}</ProjectGuid>\r\n    <Keyword>Win32Proj</Keyword>\r\n    <RootNamespace>fuzztests</RootNamespace>\r\n    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>true</UseDebugLibraries>\r\n    <PlatformToolset>v142</PlatformToolset>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>true</UseDebugLibraries>\r\n    <PlatformToolset>v142</PlatformToolset>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>false</UseDebugLibraries>\r\n    <PlatformToolset>v142</PlatformToolset>\r\n    <WholeProgramOptimization>true</WholeProgramOptimization>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>false</UseDebugLibraries>\r\n    <PlatformToolset>v142</PlatformToolset>\r\n    <WholeProgramOptimization>true</WholeProgramOptimization>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\r\n  <ImportGroup Label=\"ExtensionSettings\">\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <PropertyGroup Label=\"UserMacros\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <LinkIncremental>true</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n    <LinkIncremental>true</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <LinkIncremental>false</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\r\n    <LinkIncremental>false</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <ClCompile>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <WarningLevel>Level4</WarningLevel>\r\n      <Optimization>Disabled</Optimization>\r\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <DisableSpecificWarnings>4800</DisableSpecificWarnings>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n    <ClCompile>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <Optimization>Disabled</Optimization>\r\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <DisableSpecificWarnings>4800</DisableSpecificWarnings>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level4</WarningLevel>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <Optimization>MaxSpeed</Optimization>\r\n      <FunctionLevelLinking>true</FunctionLevelLinking>\r\n      <IntrinsicFunctions>true</IntrinsicFunctions>\r\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <DisableSpecificWarnings>4800</DisableSpecificWarnings>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r\n      <OptimizeReferences>true</OptimizeReferences>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <Optimization>MaxSpeed</Optimization>\r\n      <FunctionLevelLinking>true</FunctionLevelLinking>\r\n      <IntrinsicFunctions>true</IntrinsicFunctions>\r\n      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <DisableSpecificWarnings>4800</DisableSpecificWarnings>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r\n      <OptimizeReferences>true</OptimizeReferences>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\r\n  <ImportGroup Label=\"ExtensionTargets\">\r\n  </ImportGroup>\r\n</Project>"
  },
  {
    "path": "build/msvc16/fuzztests.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\tests\\common\\simplethread.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\tests\\common\\systemtime.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\tests\\fuzztests\\fuzztests.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\..\\concurrentqueue.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\tests\\corealgos.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\tests\\common\\simplethread.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\tests\\common\\systemtime.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "build/msvc16/msvc_tbb_stubs.cpp",
    "content": "#include \"tbb/tbb_main.h\"\n#include \"tbb/itt_notify.h\"\n\n#include <atomic>\n\nnamespace tbb {\n\tnamespace internal {\n\t\t// Taken from tbb_main.cpp (which doesn't compile as-is)\n\n\t\tvoid call_itt_notify_v5(int /*t*/, void* /*ptr*/) {}\n\n\t\tvoid itt_store_pointer_with_release_v3(void* dst, void* src) {\n\t\t\tITT_NOTIFY(sync_releasing, dst);\n\t\t\t__TBB_store_with_release(*static_cast<void**>(dst), src);\n\t\t}\n\t}\n}\n\nextern \"C\" {\n#ifdef _WIN64\n\t__int8 __TBB_machine_cmpswp1(volatile void *ptr, __int8 value, __int8 comparand) {\n\t\treturn _InterlockedCompareExchange8((__int8*)ptr, value, comparand);\n\t}\n#else\n\t// Taken from tbb/machine/windows_intel64.h, which isn't included in 32-bit mode but is\n\t// still used for some reason\n\t__int64 __TBB_machine_cmpswp8(volatile void *ptr, __int64 value, __int64 comparand) {\n\t\treturn _InterlockedCompareExchange64((__int64*)ptr, value, comparand);\n\t}\n#endif\n}\n"
  },
  {
    "path": "build/msvc16/unittests.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup Label=\"ProjectConfigurations\">\r\n    <ProjectConfiguration Include=\"Debug|Win32\">\r\n      <Configuration>Debug</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Debug|x64\">\r\n      <Configuration>Debug</Configuration>\r\n      <Platform>x64</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Release|Win32\">\r\n      <Configuration>Release</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Release|x64\">\r\n      <Configuration>Release</Configuration>\r\n      <Platform>x64</Platform>\r\n    </ProjectConfiguration>\r\n  </ItemGroup>\r\n  <PropertyGroup Label=\"Globals\">\r\n    <ProjectGuid>{4D9D3E37-3075-4A1A-8795-D6FA9B8F9A7D}</ProjectGuid>\r\n    <Keyword>Win32Proj</Keyword>\r\n    <RootNamespace>unittests</RootNamespace>\r\n    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>true</UseDebugLibraries>\r\n    <PlatformToolset>v142</PlatformToolset>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>true</UseDebugLibraries>\r\n    <PlatformToolset>v142</PlatformToolset>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>false</UseDebugLibraries>\r\n    <PlatformToolset>v142</PlatformToolset>\r\n    <WholeProgramOptimization>true</WholeProgramOptimization>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <UseDebugLibraries>false</UseDebugLibraries>\r\n    <PlatformToolset>v142</PlatformToolset>\r\n    <WholeProgramOptimization>true</WholeProgramOptimization>\r\n    <CharacterSet>Unicode</CharacterSet>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\r\n  <ImportGroup Label=\"ExtensionSettings\">\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n  </ImportGroup>\r\n  <PropertyGroup Label=\"UserMacros\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <LinkIncremental>true</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n    <LinkIncremental>true</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <LinkIncremental>false</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\r\n    <LinkIncremental>false</LinkIncremental>\r\n    <OutDir>$(SolutionDir)..\\bin\\</OutDir>\r\n    <IntDir>obj\\$(Configuration)$(Platform)\\$(ProjectName)\\</IntDir>\r\n  </PropertyGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <ClCompile>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <WarningLevel>Level4</WarningLevel>\r\n      <Optimization>Disabled</Optimization>\r\n      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_LIB;MOODYCAMEL_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <DisableSpecificWarnings>4146</DisableSpecificWarnings>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\r\n    <ClCompile>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <Optimization>Disabled</Optimization>\r\n      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_LIB;MOODYCAMEL_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <DisableSpecificWarnings>4146</DisableSpecificWarnings>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level4</WarningLevel>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <Optimization>MaxSpeed</Optimization>\r\n      <FunctionLevelLinking>true</FunctionLevelLinking>\r\n      <IntrinsicFunctions>true</IntrinsicFunctions>\r\n      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_LIB;MOODYCAMEL_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <DisableSpecificWarnings>4146</DisableSpecificWarnings>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r\n      <OptimizeReferences>true</OptimizeReferences>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\r\n    <ClCompile>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <PrecompiledHeader>\r\n      </PrecompiledHeader>\r\n      <Optimization>MaxSpeed</Optimization>\r\n      <FunctionLevelLinking>true</FunctionLevelLinking>\r\n      <IntrinsicFunctions>true</IntrinsicFunctions>\r\n      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_LIB;MOODYCAMEL_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <DisableSpecificWarnings>4146</DisableSpecificWarnings>\r\n    </ClCompile>\r\n    <Link>\r\n      <SubSystem>Console</SubSystem>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\r\n      <OptimizeReferences>true</OptimizeReferences>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemGroup>\r\n    <ClInclude Include=\"..\\..\\blockingconcurrentqueue.h\" />\r\n    <ClInclude Include=\"..\\..\\concurrentqueue.h\" />\r\n    <ClInclude Include=\"..\\..\\tests\\common\\simplethread.h\" />\r\n    <ClInclude Include=\"..\\..\\tests\\common\\systemtime.h\" />\r\n    <ClInclude Include=\"..\\..\\tests\\corealgos.h\" />\r\n    <ClInclude Include=\"..\\..\\tests\\unittests\\minitest.h\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"..\\..\\c_api\\blockingconcurrentqueue.cpp\">\r\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">false</ExceptionHandling>\r\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">false</ExceptionHandling>\r\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">false</ExceptionHandling>\r\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">false</ExceptionHandling>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\c_api\\concurrentqueue.cpp\">\r\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">false</ExceptionHandling>\r\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">false</ExceptionHandling>\r\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">false</ExceptionHandling>\r\n      <ExceptionHandling Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">false</ExceptionHandling>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <PreprocessorDefinitions Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">_HAS_EXCEPTIONS=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n    </ClCompile>\r\n    <ClCompile Include=\"..\\..\\tests\\common\\simplethread.cpp\" />\r\n    <ClCompile Include=\"..\\..\\tests\\common\\systemtime.cpp\" />\r\n    <ClCompile Include=\"..\\..\\tests\\unittests\\mallocmacro.cpp\" />\r\n    <ClCompile Include=\"..\\..\\tests\\unittests\\unittests.cpp\" />\r\n  </ItemGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\r\n  <ImportGroup Label=\"ExtensionTargets\">\r\n  </ImportGroup>\r\n</Project>"
  },
  {
    "path": "build/msvc16/unittests.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\..\\tests\\common\\simplethread.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\concurrentqueue.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\tests\\corealgos.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\tests\\unittests\\minitest.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\tests\\common\\systemtime.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\blockingconcurrentqueue.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\tests\\common\\simplethread.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\tests\\common\\systemtime.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\tests\\unittests\\unittests.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\tests\\unittests\\mallocmacro.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\c_api\\blockingconcurrentqueue.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"..\\..\\c_api\\concurrentqueue.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "build/xcode/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>${PRODUCT_NAME}</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1.0</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "build/xcode/concurrentqueue.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\tCFBF030B1C595BD60042518B /* simplethread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CFBF03011C595BD60042518B /* simplethread.cpp */; };\n\t\tCFBF030C1C595BD60042518B /* systemtime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CFBF03031C595BD60042518B /* systemtime.cpp */; };\n\t\tCFBF030E1C595BD60042518B /* mallocmacro.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CFBF03081C595BD60042518B /* mallocmacro.cpp */; };\n\t\tCFBF030F1C595BD60042518B /* unittests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CFBF030A1C595BD60042518B /* unittests.cpp */; };\n\t\tCFBF03101C595BD60042518B /* concurrentqueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CFBF031A1C595BD60042518B /* concurrentqueue.cpp */; };\n\t\tCFBF03111C595BD60042518B /* blockingconcurrentqueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CFBF031B1C595BD60042518B /* blockingconcurrentqueue.cpp */; };\n\t\tCFBF03121C5962CD0042518B /* main_ios.mm in Sources */ = {isa = PBXBuildFile; fileRef = CFBF03101C595FBF0042518B /* main_ios.mm */; };\n\t\tCFBF03141C5962E60042518B /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CFBF03131C5962E60042518B /* UIKit.framework */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\tCFBF02E41C595A0F0042518B /* concurrentqueue-unittests-ios.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"concurrentqueue-unittests-ios.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tCFBF03011C595BD60042518B /* simplethread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = simplethread.cpp; sourceTree = \"<group>\"; };\n\t\tCFBF03021C595BD60042518B /* simplethread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = simplethread.h; sourceTree = \"<group>\"; };\n\t\tCFBF03031C595BD60042518B /* systemtime.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = systemtime.cpp; sourceTree = \"<group>\"; };\n\t\tCFBF03041C595BD60042518B /* systemtime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = systemtime.h; sourceTree = \"<group>\"; };\n\t\tCFBF03081C595BD60042518B /* mallocmacro.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mallocmacro.cpp; sourceTree = \"<group>\"; };\n\t\tCFBF03091C595BD60042518B /* minitest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = minitest.h; sourceTree = \"<group>\"; };\n\t\tCFBF030A1C595BD60042518B /* unittests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = unittests.cpp; sourceTree = \"<group>\"; };\n\t\tCFBF031A1C595BD60042518B /* concurrentqueue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = concurrentqueue.cpp; sourceTree = \"<group>\"; };\n\t\tCFBF031B1C595BD60042518B /* blockingconcurrentqueue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = blockingconcurrentqueue.cpp; sourceTree = \"<group>\"; };\n\t\tCFBF03101C595FBF0042518B /* main_ios.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = main_ios.mm; sourceTree = \"<group>\"; };\n\t\tCFBF03131C5962E60042518B /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\tCFBF02E11C595A0F0042518B /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tCFBF03141C5962E60042518B /* UIKit.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\tCFBF02CB1C5959990042518B = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tCFBF03101C595FBF0042518B /* main_ios.mm */,\n\t\t\t\tCFBF03001C595BD60042518B /* c_api */,\n\t\t\t\tCFBF03001C595BD60042518B /* common */,\n\t\t\t\tCFBF03061C595BD60042518B /* unittests */,\n\t\t\t\tCFBF02D51C5959990042518B /* Products */,\n\t\t\t\tCFBF03131C5962E60042518B /* UIKit.framework */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tCFBF02D51C5959990042518B /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tCFBF02E41C595A0F0042518B /* concurrentqueue-unittests-ios.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tCFBF03001C595BD60042518B /* c_api */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tCFBF031A1C595BD60042518B /* concurrentqueue.cpp */,\n\t\t\t\tCFBF031B1C595BD60042518B /* blockingconcurrentqueue.cpp */,\n\t\t\t);\n\t\t\tname = c_api;\n\t\t\tpath = ../../c_api;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tCFBF03001C595BD60042518B /* common */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tCFBF03011C595BD60042518B /* simplethread.cpp */,\n\t\t\t\tCFBF03021C595BD60042518B /* simplethread.h */,\n\t\t\t\tCFBF03031C595BD60042518B /* systemtime.cpp */,\n\t\t\t\tCFBF03041C595BD60042518B /* systemtime.h */,\n\t\t\t);\n\t\t\tname = common;\n\t\t\tpath = ../../tests/common;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tCFBF03061C595BD60042518B /* unittests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tCFBF03081C595BD60042518B /* mallocmacro.cpp */,\n\t\t\t\tCFBF03091C595BD60042518B /* minitest.h */,\n\t\t\t\tCFBF030A1C595BD60042518B /* unittests.cpp */,\n\t\t\t);\n\t\t\tname = unittests;\n\t\t\tpath = ../../tests/unittests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\tCFBF02E31C595A0F0042518B /* concurrentqueue-unittests-ios */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = CFBF02F81C595A0F0042518B /* Build configuration list for PBXNativeTarget \"concurrentqueue-unittests-ios\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tCFBF02E01C595A0F0042518B /* Sources */,\n\t\t\t\tCFBF02E11C595A0F0042518B /* Frameworks */,\n\t\t\t\tCFBF02E21C595A0F0042518B /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"concurrentqueue-unittests-ios\";\n\t\t\tproductName = \"concurrentqueue-unittests-ios\";\n\t\t\tproductReference = CFBF02E41C595A0F0042518B /* concurrentqueue-unittests-ios.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\tCFBF02CC1C5959990042518B /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 0720;\n\t\t\t\tORGANIZATIONNAME = cameron314;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\tCFBF02E31C595A0F0042518B = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = CFBF02CF1C5959990042518B /* Build configuration list for PBXProject \"concurrentqueue\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = CFBF02CB1C5959990042518B;\n\t\t\tproductRefGroup = CFBF02D51C5959990042518B /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tCFBF02E31C595A0F0042518B /* concurrentqueue-unittests-ios */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\tCFBF02E21C595A0F0042518B /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\tCFBF02E01C595A0F0042518B /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tCFBF03121C5962CD0042518B /* main_ios.mm in Sources */,\n\t\t\t\tCFBF030C1C595BD60042518B /* systemtime.cpp in Sources */,\n\t\t\t\tCFBF030E1C595BD60042518B /* mallocmacro.cpp in Sources */,\n\t\t\t\tCFBF030B1C595BD60042518B /* simplethread.cpp in Sources */,\n\t\t\t\tCFBF030F1C595BD60042518B /* unittests.cpp in Sources */,\n\t\t\t\tCFBF03101C595BD60042518B /* concurrentqueue.cpp in Sources */,\n\t\t\t\tCFBF03111C595BD60042518B /* blockingconcurrentqueue.cpp in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\tCFBF02DB1C5959990042518B /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tCFBF02DC1C5959990042518B /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tCFBF02F91C595A0F0042518B /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_THREADSAFE_STATICS = NO;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"cameron314.concurrentqueue-unittests-ios\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tCFBF02FA1C595A0F0042518B /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = \"NDEBUG=1\";\n\t\t\t\tGCC_THREADSAFE_STATICS = NO;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"cameron314.concurrentqueue-unittests-ios\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\tCFBF02CF1C5959990042518B /* Build configuration list for PBXProject \"concurrentqueue\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tCFBF02DB1C5959990042518B /* Debug */,\n\t\t\t\tCFBF02DC1C5959990042518B /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tCFBF02F81C595A0F0042518B /* Build configuration list for PBXNativeTarget \"concurrentqueue-unittests-ios\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tCFBF02F91C595A0F0042518B /* Debug */,\n\t\t\t\tCFBF02FA1C595A0F0042518B /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = CFBF02CC1C5959990042518B /* Project object */;\n}\n"
  },
  {
    "path": "build/xcode/concurrentqueue.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:concurrentqueue.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "build/xcode/concurrentqueue.xcodeproj/xcshareddata/xcschemes/concurrentqueue-unittests-ios.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0720\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"CFBF02E31C595A0F0042518B\"\n               BuildableName = \"concurrentqueue-unittests-ios.app\"\n               BlueprintName = \"concurrentqueue-unittests-ios\"\n               ReferencedContainer = \"container:concurrentqueue.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"CFBF02E31C595A0F0042518B\"\n            BuildableName = \"concurrentqueue-unittests-ios.app\"\n            BlueprintName = \"concurrentqueue-unittests-ios\"\n            ReferencedContainer = \"container:concurrentqueue.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Release\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"CFBF02E31C595A0F0042518B\"\n            BuildableName = \"concurrentqueue-unittests-ios.app\"\n            BlueprintName = \"concurrentqueue-unittests-ios\"\n            ReferencedContainer = \"container:concurrentqueue.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"CFBF02E31C595A0F0042518B\"\n            BuildableName = \"concurrentqueue-unittests-ios.app\"\n            BlueprintName = \"concurrentqueue-unittests-ios\"\n            ReferencedContainer = \"container:concurrentqueue.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "build/xcode/main_ios.mm",
    "content": "#import <UIKit/UIKit.h>\n\n// runAllTests should be defined by the main unit test compilation\n// unit (unittests.cpp)\nbool runAllTests();\n\n// Define a minimal UIApplicationDelegate.\n@interface AppDelegate : NSObject <UIApplicationDelegate>\n@property (nonatomic, strong) UIWindow *window;\n@end\n\n@implementation AppDelegate\n\n- (BOOL)application:(__unused UIApplication *)application\n    didFinishLaunchingWithOptions:(__unused NSDictionary *)launchOptions {\n  // Xcode / iOS will complain unless a window and a root view\n  // controller is setup at application launch.\n  self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];\n  self.window.rootViewController = [[UIViewController alloc] initWithNibName:nil bundle:nil];\n  [self.window makeKeyAndVisible];\n  dispatch_async(dispatch_get_main_queue(), ^{\n    [self run];\n  });\n  return YES;\n}\n\n-(void) run {\n  NSLog(@\"Starting unittests run...\");\n  const bool result = runAllTests();\n  NSLog(@\"%@\", result ? @\"All tests passed\" : @\"Test(s) failed!\");\n}\n\n@end\n\nint main(int argc, char *argv[]) {\n  @autoreleasepool {\n    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));\n  }\n}\n"
  },
  {
    "path": "c_api/blockingconcurrentqueue.cpp",
    "content": "#include \"concurrentqueue.h\"\n#include \"../blockingconcurrentqueue.h\"\n\ntypedef moodycamel::BlockingConcurrentQueue<void*> MoodycamelBCQType, *MoodycamelBCQPtr;\n\nextern \"C\" {\n\t\nint moodycamel_bcq_create(MoodycamelBCQHandle* handle)\n{\n\tMoodycamelBCQPtr retval = new MoodycamelBCQType;\n\tif (retval == nullptr) {\n\t\treturn 0;\n\t}\n\t*handle = retval;\n\treturn 1;\n}\n\nint moodycamel_bcq_destroy(MoodycamelBCQHandle handle)\n{\n\tdelete reinterpret_cast<MoodycamelBCQPtr>(handle);\n\treturn 1;\n}\n\nint moodycamel_bcq_enqueue(MoodycamelBCQHandle handle, MoodycamelValue value)\n{\n\treturn reinterpret_cast<MoodycamelBCQPtr>(handle)->enqueue(value) ? 1 : 0;\n}\n\nint moodycamel_bcq_wait_dequeue(MoodycamelBCQHandle handle, MoodycamelValue* value)\n{\n\treinterpret_cast<MoodycamelBCQPtr>(handle)->wait_dequeue(*value);\n\treturn 1;\n}\n\nint moodycamel_bcq_try_dequeue(MoodycamelBCQHandle handle, MoodycamelValue* value)\n{\n\treturn reinterpret_cast<MoodycamelBCQPtr>(handle)->try_dequeue(*value) ? 1 : 0;\n}\n\n}"
  },
  {
    "path": "c_api/concurrentqueue.cpp",
    "content": "#include \"concurrentqueue.h\"\n#include \"../concurrentqueue.h\"\n\ntypedef moodycamel::ConcurrentQueue<void*> MoodycamelCQType, *MoodycamelCQPtr;\n\nextern \"C\" {\n\nint moodycamel_cq_create(MoodycamelCQHandle* handle)\n{\n\tMoodycamelCQPtr retval = new MoodycamelCQType;\n\tif (retval == nullptr) {\n\t\treturn 0;\n\t}\n\t*handle = retval;\n\treturn 1;\n}\n\nint moodycamel_cq_destroy(MoodycamelCQHandle handle)\n{\n\tdelete reinterpret_cast<MoodycamelCQPtr>(handle);\n\treturn 1;\n}\n\nint moodycamel_cq_enqueue(MoodycamelCQHandle handle, MoodycamelValue value)\n{\n\treturn reinterpret_cast<MoodycamelCQPtr>(handle)->enqueue(value) ? 1 : 0;\n}\n\nint moodycamel_cq_try_dequeue(MoodycamelCQHandle handle, MoodycamelValue* value)\n{\n\treturn reinterpret_cast<MoodycamelCQPtr>(handle)->try_dequeue(*value) ? 1 : 0;\n}\n\nsize_t moodycamel_cq_size_approx(MoodycamelCQHandle handle)\n{\n    return reinterpret_cast<MoodycamelCQPtr>(handle)->size_approx();\n}\n\n}\n"
  },
  {
    "path": "c_api/concurrentqueue.h",
    "content": "#pragma once\n\n#include <stddef.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef MOODYCAMEL_EXPORT\n#ifdef _WIN32\n#if defined(MOODYCAMEL_STATIC) //preferred way\n#define MOODYCAMEL_EXPORT\n#elif defined(DLL_EXPORT)\n#define MOODYCAMEL_EXPORT __declspec(dllexport)\n#else\n#define MOODYCAMEL_EXPORT __declspec(dllimport)\n#endif\n#else\n#define MOODYCAMEL_EXPORT\n#endif\n#endif\n\ntypedef void* MoodycamelCQHandle;\ntypedef void* MoodycamelBCQHandle;\ntypedef void* MoodycamelValue;\n\nMOODYCAMEL_EXPORT int moodycamel_cq_create(MoodycamelCQHandle* handle);\nMOODYCAMEL_EXPORT int moodycamel_cq_destroy(MoodycamelCQHandle handle);\nMOODYCAMEL_EXPORT int moodycamel_cq_enqueue(MoodycamelCQHandle handle, MoodycamelValue value);\nMOODYCAMEL_EXPORT int moodycamel_cq_try_dequeue(MoodycamelCQHandle handle, MoodycamelValue* value);\nMOODYCAMEL_EXPORT size_t moodycamel_cq_size_approx(MoodycamelCQHandle handle);\n\nMOODYCAMEL_EXPORT int moodycamel_bcq_create(MoodycamelBCQHandle* handle);\nMOODYCAMEL_EXPORT int moodycamel_bcq_destroy(MoodycamelBCQHandle handle);\nMOODYCAMEL_EXPORT int moodycamel_bcq_enqueue(MoodycamelBCQHandle handle, MoodycamelValue value);\nMOODYCAMEL_EXPORT int moodycamel_bcq_wait_dequeue(MoodycamelBCQHandle handle, MoodycamelValue* value);\nMOODYCAMEL_EXPORT int moodycamel_bcq_try_dequeue(MoodycamelBCQHandle handle, MoodycamelValue* value);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "concurrentqueue.h",
    "content": "// Provides a C++11 implementation of a multi-producer, multi-consumer lock-free queue.\n// An overview, including benchmark results, is provided here:\n//     http://moodycamel.com/blog/2014/a-fast-general-purpose-lock-free-queue-for-c++\n// The full design is also described in excruciating detail at:\n//    http://moodycamel.com/blog/2014/detailed-design-of-a-lock-free-queue\n\n// Simplified BSD license:\n// Copyright (c) 2013-2020, Cameron Desrochers.\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without modification,\n// are permitted provided that the following conditions are met:\n//\n// - Redistributions of source code must retain the above copyright notice, this list of\n// conditions and the following disclaimer.\n// - Redistributions in binary form must reproduce the above copyright notice, this list of\n// conditions and the following disclaimer in the documentation and/or other materials\n// provided with the distribution.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY\n// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL\n// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n// OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR\n// TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Also dual-licensed under the Boost Software License (see LICENSE.md)\n\n#pragma once\n\n#if defined(__GNUC__) && !defined(__INTEL_COMPILER)\n// Disable -Wconversion warnings (spuriously triggered when Traits::size_t and\n// Traits::index_t are set to < 32 bits, causing integer promotion, causing warnings\n// upon assigning any computed values)\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wconversion\"\n\n#ifdef MCDBGQ_USE_RELACY\n#pragma GCC diagnostic ignored \"-Wint-to-pointer-cast\"\n#endif\n#endif\n\n#if defined(_MSC_VER) && (!defined(_HAS_CXX17) || !_HAS_CXX17)\n// VS2019 with /W4 warns about constant conditional expressions but unless /std=c++17 or higher\n// does not support `if constexpr`, so we have no choice but to simply disable the warning\n#pragma warning(push)\n#pragma warning(disable: 4127)  // conditional expression is constant\n#endif\n\n#if defined(__APPLE__)\n#include \"TargetConditionals.h\"\n#endif\n\n#ifdef MCDBGQ_USE_RELACY\n#include \"relacy/relacy_std.hpp\"\n#include \"relacy_shims.h\"\n// We only use malloc/free anyway, and the delete macro messes up `= delete` method declarations.\n// We'll override the default trait malloc ourselves without a macro.\n#undef new\n#undef delete\n#undef malloc\n#undef free\n#else\n#include <atomic>\t\t// Requires C++11. Sorry VS2010.\n#include <cassert>\n#endif\n#include <cstddef>              // for max_align_t\n#include <cstdint>\n#include <cstdlib>\n#include <type_traits>\n#include <algorithm>\n#include <utility>\n#include <limits>\n#include <climits>\t\t// for CHAR_BIT\n#include <array>\n#include <thread>\t\t// partly for __WINPTHREADS_VERSION if on MinGW-w64 w/ POSIX threading\n#include <mutex>        // used for thread exit synchronization\n\n// Platform-specific definitions of a numeric thread ID type and an invalid value\nnamespace moodycamel { namespace details {\n\ttemplate<typename thread_id_t> struct thread_id_converter {\n\t\ttypedef thread_id_t thread_id_numeric_size_t;\n\t\ttypedef thread_id_t thread_id_hash_t;\n\t\tstatic thread_id_hash_t prehash(thread_id_t const& x) { return x; }\n\t};\n} }\n#if defined(MCDBGQ_USE_RELACY)\nnamespace moodycamel { namespace details {\n\ttypedef std::uint32_t thread_id_t;\n\tstatic const thread_id_t invalid_thread_id  = 0xFFFFFFFFU;\n\tstatic const thread_id_t invalid_thread_id2 = 0xFFFFFFFEU;\n\tstatic inline thread_id_t thread_id() { return rl::thread_index(); }\n} }\n#elif defined(_WIN32) || defined(__WINDOWS__) || defined(__WIN32__)\n// No sense pulling in windows.h in a header, we'll manually declare the function\n// we use and rely on backwards-compatibility for this not to break\nextern \"C\" __declspec(dllimport) unsigned long __stdcall GetCurrentThreadId(void);\nnamespace moodycamel { namespace details {\n\tstatic_assert(sizeof(unsigned long) == sizeof(std::uint32_t), \"Expected size of unsigned long to be 32 bits on Windows\");\n\ttypedef std::uint32_t thread_id_t;\n\tstatic const thread_id_t invalid_thread_id  = 0;\t\t\t// See http://blogs.msdn.com/b/oldnewthing/archive/2004/02/23/78395.aspx\n\tstatic const thread_id_t invalid_thread_id2 = 0xFFFFFFFFU;\t// Not technically guaranteed to be invalid, but is never used in practice. Note that all Win32 thread IDs are presently multiples of 4.\n\tstatic inline thread_id_t thread_id() { return static_cast<thread_id_t>(::GetCurrentThreadId()); }\n} }\n#elif defined(__arm__) || defined(_M_ARM) || defined(__aarch64__) || (defined(__APPLE__) && TARGET_OS_IPHONE) || defined(__MVS__) || defined(MOODYCAMEL_NO_THREAD_LOCAL)\nnamespace moodycamel { namespace details {\n\tstatic_assert(sizeof(std::thread::id) == 4 || sizeof(std::thread::id) == 8, \"std::thread::id is expected to be either 4 or 8 bytes\");\n\t\n\ttypedef std::thread::id thread_id_t;\n\tstatic const thread_id_t invalid_thread_id;         // Default ctor creates invalid ID\n\n\t// Note we don't define a invalid_thread_id2 since std::thread::id doesn't have one; it's\n\t// only used if MOODYCAMEL_CPP11_THREAD_LOCAL_SUPPORTED is defined anyway, which it won't\n\t// be.\n\tstatic inline thread_id_t thread_id() { return std::this_thread::get_id(); }\n\n\ttemplate<std::size_t> struct thread_id_size { };\n\ttemplate<> struct thread_id_size<4> { typedef std::uint32_t numeric_t; };\n\ttemplate<> struct thread_id_size<8> { typedef std::uint64_t numeric_t; };\n\n\ttemplate<> struct thread_id_converter<thread_id_t> {\n\t\ttypedef thread_id_size<sizeof(thread_id_t)>::numeric_t thread_id_numeric_size_t;\n#ifndef __APPLE__\n\t\ttypedef std::size_t thread_id_hash_t;\n#else\n\t\ttypedef thread_id_numeric_size_t thread_id_hash_t;\n#endif\n\n\t\tstatic thread_id_hash_t prehash(thread_id_t const& x)\n\t\t{\n#ifndef __APPLE__\n\t\t\treturn std::hash<std::thread::id>()(x);\n#else\n\t\t\treturn *reinterpret_cast<thread_id_hash_t const*>(&x);\n#endif\n\t\t}\n\t};\n} }\n#else\n// Use a nice trick from this answer: http://stackoverflow.com/a/8438730/21475\n// In order to get a numeric thread ID in a platform-independent way, we use a thread-local\n// static variable's address as a thread identifier :-)\n#if defined(__GNUC__) || defined(__INTEL_COMPILER)\n#define MOODYCAMEL_THREADLOCAL __thread\n#elif defined(_MSC_VER)\n#define MOODYCAMEL_THREADLOCAL __declspec(thread)\n#else\n// Assume C++11 compliant compiler\n#define MOODYCAMEL_THREADLOCAL thread_local\n#endif\nnamespace moodycamel { namespace details {\n\ttypedef std::uintptr_t thread_id_t;\n\tstatic const thread_id_t invalid_thread_id  = 0;\t\t// Address can't be nullptr\n\tstatic const thread_id_t invalid_thread_id2 = 1;\t\t// Member accesses off a null pointer are also generally invalid. Plus it's not aligned.\n\tinline thread_id_t thread_id() { static MOODYCAMEL_THREADLOCAL int x; return reinterpret_cast<thread_id_t>(&x); }\n} }\n#endif\n\n// Constexpr if\n#ifndef MOODYCAMEL_CONSTEXPR_IF\n#if (defined(_MSC_VER) && defined(_HAS_CXX17) && _HAS_CXX17) || __cplusplus > 201402L\n#define MOODYCAMEL_CONSTEXPR_IF if constexpr\n#define MOODYCAMEL_MAYBE_UNUSED [[maybe_unused]]\n#else\n#define MOODYCAMEL_CONSTEXPR_IF if\n#define MOODYCAMEL_MAYBE_UNUSED\n#endif\n#endif\n\n// Exceptions\n#ifndef MOODYCAMEL_EXCEPTIONS_ENABLED\n#if (defined(_MSC_VER) && defined(_CPPUNWIND)) || (defined(__GNUC__) && defined(__EXCEPTIONS)) || (!defined(_MSC_VER) && !defined(__GNUC__))\n#define MOODYCAMEL_EXCEPTIONS_ENABLED\n#endif\n#endif\n#ifdef MOODYCAMEL_EXCEPTIONS_ENABLED\n#define MOODYCAMEL_TRY try\n#define MOODYCAMEL_CATCH(...) catch(__VA_ARGS__)\n#define MOODYCAMEL_RETHROW throw\n#define MOODYCAMEL_THROW(expr) throw (expr)\n#else\n#define MOODYCAMEL_TRY MOODYCAMEL_CONSTEXPR_IF (true)\n#define MOODYCAMEL_CATCH(...) else MOODYCAMEL_CONSTEXPR_IF (false)\n#define MOODYCAMEL_RETHROW\n#define MOODYCAMEL_THROW(expr)\n#endif\n\n#ifndef MOODYCAMEL_NOEXCEPT\n#if !defined(MOODYCAMEL_EXCEPTIONS_ENABLED)\n#define MOODYCAMEL_NOEXCEPT\n#define MOODYCAMEL_NOEXCEPT_CTOR(type, valueType, expr) true\n#define MOODYCAMEL_NOEXCEPT_ASSIGN(type, valueType, expr) true\n#elif defined(_MSC_VER) && defined(_NOEXCEPT) && _MSC_VER < 1800\n// VS2012's std::is_nothrow_[move_]constructible is broken and returns true when it shouldn't :-(\n// We have to assume *all* non-trivial constructors may throw on VS2012!\n#define MOODYCAMEL_NOEXCEPT _NOEXCEPT\n#define MOODYCAMEL_NOEXCEPT_CTOR(type, valueType, expr) (std::is_rvalue_reference<valueType>::value && std::is_move_constructible<type>::value ? std::is_trivially_move_constructible<type>::value : std::is_trivially_copy_constructible<type>::value)\n#define MOODYCAMEL_NOEXCEPT_ASSIGN(type, valueType, expr) ((std::is_rvalue_reference<valueType>::value && std::is_move_assignable<type>::value ? std::is_trivially_move_assignable<type>::value || std::is_nothrow_move_assignable<type>::value : std::is_trivially_copy_assignable<type>::value || std::is_nothrow_copy_assignable<type>::value) && MOODYCAMEL_NOEXCEPT_CTOR(type, valueType, expr))\n#elif defined(_MSC_VER) && defined(_NOEXCEPT) && _MSC_VER < 1900\n#define MOODYCAMEL_NOEXCEPT _NOEXCEPT\n#define MOODYCAMEL_NOEXCEPT_CTOR(type, valueType, expr) (std::is_rvalue_reference<valueType>::value && std::is_move_constructible<type>::value ? std::is_trivially_move_constructible<type>::value || std::is_nothrow_move_constructible<type>::value : std::is_trivially_copy_constructible<type>::value || std::is_nothrow_copy_constructible<type>::value)\n#define MOODYCAMEL_NOEXCEPT_ASSIGN(type, valueType, expr) ((std::is_rvalue_reference<valueType>::value && std::is_move_assignable<type>::value ? std::is_trivially_move_assignable<type>::value || std::is_nothrow_move_assignable<type>::value : std::is_trivially_copy_assignable<type>::value || std::is_nothrow_copy_assignable<type>::value) && MOODYCAMEL_NOEXCEPT_CTOR(type, valueType, expr))\n#else\n#define MOODYCAMEL_NOEXCEPT noexcept\n#define MOODYCAMEL_NOEXCEPT_CTOR(type, valueType, expr) noexcept(expr)\n#define MOODYCAMEL_NOEXCEPT_ASSIGN(type, valueType, expr) noexcept(expr)\n#endif\n#endif\n\n#ifndef MOODYCAMEL_CPP11_THREAD_LOCAL_SUPPORTED\n#ifdef MCDBGQ_USE_RELACY\n#define MOODYCAMEL_CPP11_THREAD_LOCAL_SUPPORTED\n#else\n// VS2013 doesn't support `thread_local`, and MinGW-w64 w/ POSIX threading has a crippling bug: http://sourceforge.net/p/mingw-w64/bugs/445\n// g++ <=4.7 doesn't support thread_local either.\n// Finally, iOS/ARM doesn't have support for it either, and g++/ARM allows it to compile but it's unconfirmed to actually work\n#if (!defined(_MSC_VER) || _MSC_VER >= 1900) && (!defined(__MINGW32__) && !defined(__MINGW64__) || !defined(__WINPTHREADS_VERSION)) && (!defined(__GNUC__) || __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)) && (!defined(__APPLE__) || !TARGET_OS_IPHONE) && !defined(__arm__) && !defined(_M_ARM) && !defined(__aarch64__) && !defined(__MVS__) && !defined(MOODYCAMEL_NO_THREAD_LOCAL)\n// Assume `thread_local` is fully supported in all other C++11 compilers/platforms\n#define MOODYCAMEL_CPP11_THREAD_LOCAL_SUPPORTED    // tentatively enabled for now; years ago several users report having problems with it on\n#endif\n#endif\n#endif\n\n// VS2012 doesn't support deleted functions. \n// In this case, we declare the function normally but don't define it. A link error will be generated if the function is called.\n#ifndef MOODYCAMEL_DELETE_FUNCTION\n#if defined(_MSC_VER) && _MSC_VER < 1800\n#define MOODYCAMEL_DELETE_FUNCTION\n#else\n#define MOODYCAMEL_DELETE_FUNCTION = delete\n#endif\n#endif\n\nnamespace moodycamel { namespace details {\n#ifndef MOODYCAMEL_ALIGNAS\n// VS2013 doesn't support alignas or alignof, and align() requires a constant literal\n#if defined(_MSC_VER) && _MSC_VER <= 1800\n#define MOODYCAMEL_ALIGNAS(alignment) __declspec(align(alignment))\n#define MOODYCAMEL_ALIGNOF(obj) __alignof(obj)\n#define MOODYCAMEL_ALIGNED_TYPE_LIKE(T, obj) typename details::Vs2013Aligned<std::alignment_of<obj>::value, T>::type\n\ttemplate<int Align, typename T> struct Vs2013Aligned { };  // default, unsupported alignment\n\ttemplate<typename T> struct Vs2013Aligned<1, T> { typedef __declspec(align(1)) T type; };\n\ttemplate<typename T> struct Vs2013Aligned<2, T> { typedef __declspec(align(2)) T type; };\n\ttemplate<typename T> struct Vs2013Aligned<4, T> { typedef __declspec(align(4)) T type; };\n\ttemplate<typename T> struct Vs2013Aligned<8, T> { typedef __declspec(align(8)) T type; };\n\ttemplate<typename T> struct Vs2013Aligned<16, T> { typedef __declspec(align(16)) T type; };\n\ttemplate<typename T> struct Vs2013Aligned<32, T> { typedef __declspec(align(32)) T type; };\n\ttemplate<typename T> struct Vs2013Aligned<64, T> { typedef __declspec(align(64)) T type; };\n\ttemplate<typename T> struct Vs2013Aligned<128, T> { typedef __declspec(align(128)) T type; };\n\ttemplate<typename T> struct Vs2013Aligned<256, T> { typedef __declspec(align(256)) T type; };\n#else\n\ttemplate<typename T> struct identity { typedef T type; };\n#define MOODYCAMEL_ALIGNAS(alignment) alignas(alignment)\n#define MOODYCAMEL_ALIGNOF(obj) alignof(obj)\n#define MOODYCAMEL_ALIGNED_TYPE_LIKE(T, obj) alignas(alignof(obj)) typename details::identity<T>::type\n#endif\n#endif\n} }\n\n\n// TSAN can false report races in lock-free code.  To enable TSAN to be used from projects that use this one,\n// we can apply per-function compile-time suppression.\n// See https://clang.llvm.org/docs/ThreadSanitizer.html#has-feature-thread-sanitizer\n#define MOODYCAMEL_NO_TSAN\n#if defined(__has_feature)\n #if __has_feature(thread_sanitizer)\n  #undef MOODYCAMEL_NO_TSAN\n  #define MOODYCAMEL_NO_TSAN __attribute__((no_sanitize(\"thread\")))\n #endif // TSAN\n#endif // TSAN\n\n// Compiler-specific likely/unlikely hints\nnamespace moodycamel { namespace details {\n#if defined(__GNUC__)\n\tstatic inline bool (likely)(bool x) { return __builtin_expect((x), true); }\n\tstatic inline bool (unlikely)(bool x) { return __builtin_expect((x), false); }\n#else\n\tstatic inline bool (likely)(bool x) { return x; }\n\tstatic inline bool (unlikely)(bool x) { return x; }\n#endif\n} }\n\n#ifdef MOODYCAMEL_QUEUE_INTERNAL_DEBUG\n#include \"internal/concurrentqueue_internal_debug.h\"\n#endif\n\nnamespace moodycamel {\nnamespace details {\n\ttemplate<typename T>\n\tstruct const_numeric_max {\n\t\tstatic_assert(std::is_integral<T>::value, \"const_numeric_max can only be used with integers\");\n\t\tstatic const T value = std::numeric_limits<T>::is_signed\n\t\t\t? (static_cast<T>(1) << (sizeof(T) * CHAR_BIT - 1)) - static_cast<T>(1)\n\t\t\t: static_cast<T>(-1);\n\t};\n\n#if defined(__GLIBCXX__)\n\ttypedef ::max_align_t std_max_align_t;      // libstdc++ forgot to add it to std:: for a while\n#else\n\ttypedef std::max_align_t std_max_align_t;   // Others (e.g. MSVC) insist it can *only* be accessed via std::\n#endif\n\n\t// Some platforms have incorrectly set max_align_t to a type with <8 bytes alignment even while supporting\n\t// 8-byte aligned scalar values (*cough* 32-bit iOS). Work around this with our own union. See issue #64.\n\ttypedef union {\n\t\tstd_max_align_t x;\n\t\tlong long y;\n\t\tvoid* z;\n\t} max_align_t;\n}\n\n// Default traits for the ConcurrentQueue. To change some of the\n// traits without re-implementing all of them, inherit from this\n// struct and shadow the declarations you wish to be different;\n// since the traits are used as a template type parameter, the\n// shadowed declarations will be used where defined, and the defaults\n// otherwise.\nstruct ConcurrentQueueDefaultTraits\n{\n\t// General-purpose size type. std::size_t is strongly recommended.\n\ttypedef std::size_t size_t;\n\t\n\t// The type used for the enqueue and dequeue indices. Must be at least as\n\t// large as size_t. Should be significantly larger than the number of elements\n\t// you expect to hold at once, especially if you have a high turnover rate;\n\t// for example, on 32-bit x86, if you expect to have over a hundred million\n\t// elements or pump several million elements through your queue in a very\n\t// short space of time, using a 32-bit type *may* trigger a race condition.\n\t// A 64-bit int type is recommended in that case, and in practice will\n\t// prevent a race condition no matter the usage of the queue. Note that\n\t// whether the queue is lock-free with a 64-int type depends on the whether\n\t// std::atomic<std::uint64_t> is lock-free, which is platform-specific.\n\ttypedef std::size_t index_t;\n\t\n\t// Internally, all elements are enqueued and dequeued from multi-element\n\t// blocks; this is the smallest controllable unit. If you expect few elements\n\t// but many producers, a smaller block size should be favoured. For few producers\n\t// and/or many elements, a larger block size is preferred. A sane default\n\t// is provided. Must be a power of 2.\n\tstatic const size_t BLOCK_SIZE = 32;\n\t\n\t// For explicit producers (i.e. when using a producer token), the block is\n\t// checked for being empty by iterating through a list of flags, one per element.\n\t// For large block sizes, this is too inefficient, and switching to an atomic\n\t// counter-based approach is faster. The switch is made for block sizes strictly\n\t// larger than this threshold.\n\tstatic const size_t EXPLICIT_BLOCK_EMPTY_COUNTER_THRESHOLD = 32;\n\t\n\t// How many full blocks can be expected for a single explicit producer? This should\n\t// reflect that number's maximum for optimal performance. Must be a power of 2.\n\tstatic const size_t EXPLICIT_INITIAL_INDEX_SIZE = 32;\n\t\n\t// How many full blocks can be expected for a single implicit producer? This should\n\t// reflect that number's maximum for optimal performance. Must be a power of 2.\n\tstatic const size_t IMPLICIT_INITIAL_INDEX_SIZE = 32;\n\t\n\t// The initial size of the hash table mapping thread IDs to implicit producers.\n\t// Note that the hash is resized every time it becomes half full.\n\t// Must be a power of two, and either 0 or at least 1. If 0, implicit production\n\t// (using the enqueue methods without an explicit producer token) is disabled.\n\tstatic const size_t INITIAL_IMPLICIT_PRODUCER_HASH_SIZE = 32;\n\t\n\t// Controls the number of items that an explicit consumer (i.e. one with a token)\n\t// must consume before it causes all consumers to rotate and move on to the next\n\t// internal queue.\n\tstatic const std::uint32_t EXPLICIT_CONSUMER_CONSUMPTION_QUOTA_BEFORE_ROTATE = 256;\n\t\n\t// The maximum number of elements (inclusive) that can be enqueued to a sub-queue.\n\t// Enqueue operations that would cause this limit to be surpassed will fail. Note\n\t// that this limit is enforced at the block level (for performance reasons), i.e.\n\t// it's rounded up to the nearest block size.\n\tstatic const size_t MAX_SUBQUEUE_SIZE = details::const_numeric_max<size_t>::value;\n\n\t// The number of times to spin before sleeping when waiting on a semaphore.\n\t// Recommended values are on the order of 1000-10000 unless the number of\n\t// consumer threads exceeds the number of idle cores (in which case try 0-100).\n\t// Only affects instances of the BlockingConcurrentQueue.\n\tstatic const int MAX_SEMA_SPINS = 10000;\n\n\t// Whether to recycle dynamically-allocated blocks into an internal free list or\n\t// not. If false, only pre-allocated blocks (controlled by the constructor\n\t// arguments) will be recycled, and all others will be `free`d back to the heap.\n\t// Note that blocks consumed by explicit producers are only freed on destruction\n\t// of the queue (not following destruction of the token) regardless of this trait.\n\tstatic const bool RECYCLE_ALLOCATED_BLOCKS = false;\n\n\t\n#ifndef MCDBGQ_USE_RELACY\n\t// Memory allocation can be customized if needed.\n\t// malloc should return nullptr on failure, and handle alignment like std::malloc.\n#if defined(malloc) || defined(free)\n\t// Gah, this is 2015, stop defining macros that break standard code already!\n\t// Work around malloc/free being special macros:\n\tstatic inline void* WORKAROUND_malloc(size_t size) { return malloc(size); }\n\tstatic inline void WORKAROUND_free(void* ptr) { return free(ptr); }\n\tstatic inline void* (malloc)(size_t size) { return WORKAROUND_malloc(size); }\n\tstatic inline void (free)(void* ptr) { return WORKAROUND_free(ptr); }\n#else\n\tstatic inline void* malloc(size_t size) { return std::malloc(size); }\n\tstatic inline void free(void* ptr) { return std::free(ptr); }\n#endif\n#else\n\t// Debug versions when running under the Relacy race detector (ignore\n\t// these in user code)\n\tstatic inline void* malloc(size_t size) { return rl::rl_malloc(size, $); }\n\tstatic inline void free(void* ptr) { return rl::rl_free(ptr, $); }\n#endif\n};\n\n\n// When producing or consuming many elements, the most efficient way is to:\n//    1) Use one of the bulk-operation methods of the queue with a token\n//    2) Failing that, use the bulk-operation methods without a token\n//    3) Failing that, create a token and use that with the single-item methods\n//    4) Failing that, use the single-parameter methods of the queue\n// Having said that, don't create tokens willy-nilly -- ideally there should be\n// a maximum of one token per thread (of each kind).\nstruct ProducerToken;\nstruct ConsumerToken;\n\ntemplate<typename T, typename Traits> class ConcurrentQueue;\ntemplate<typename T, typename Traits> class BlockingConcurrentQueue;\nclass ConcurrentQueueTests;\n\n\nnamespace details\n{\n\tstruct ConcurrentQueueProducerTypelessBase\n\t{\n\t\tConcurrentQueueProducerTypelessBase* next;\n\t\tstd::atomic<bool> inactive;\n\t\tProducerToken* token;\n\t\t\n\t\tConcurrentQueueProducerTypelessBase()\n\t\t\t: next(nullptr), inactive(false), token(nullptr)\n\t\t{\n\t\t}\n\t};\n\t\n\ttemplate<bool use32> struct _hash_32_or_64 {\n\t\tstatic inline std::uint32_t hash(std::uint32_t h)\n\t\t{\n\t\t\t// MurmurHash3 finalizer -- see https://code.google.com/p/smhasher/source/browse/trunk/MurmurHash3.cpp\n\t\t\t// Since the thread ID is already unique, all we really want to do is propagate that\n\t\t\t// uniqueness evenly across all the bits, so that we can use a subset of the bits while\n\t\t\t// reducing collisions significantly\n\t\t\th ^= h >> 16;\n\t\t\th *= 0x85ebca6b;\n\t\t\th ^= h >> 13;\n\t\t\th *= 0xc2b2ae35;\n\t\t\treturn h ^ (h >> 16);\n\t\t}\n\t};\n\ttemplate<> struct _hash_32_or_64<1> {\n\t\tstatic inline std::uint64_t hash(std::uint64_t h)\n\t\t{\n\t\t\th ^= h >> 33;\n\t\t\th *= 0xff51afd7ed558ccd;\n\t\t\th ^= h >> 33;\n\t\t\th *= 0xc4ceb9fe1a85ec53;\n\t\t\treturn h ^ (h >> 33);\n\t\t}\n\t};\n\ttemplate<std::size_t size> struct hash_32_or_64 : public _hash_32_or_64<(size > 4)> {  };\n\t\n\tstatic inline size_t hash_thread_id(thread_id_t id)\n\t{\n\t\tstatic_assert(sizeof(thread_id_t) <= 8, \"Expected a platform where thread IDs are at most 64-bit values\");\n\t\treturn static_cast<size_t>(hash_32_or_64<sizeof(thread_id_converter<thread_id_t>::thread_id_hash_t)>::hash(\n\t\t\tthread_id_converter<thread_id_t>::prehash(id)));\n\t}\n\t\n\ttemplate<typename T>\n\tstatic inline bool circular_less_than(T a, T b)\n\t{\n\t\tstatic_assert(std::is_integral<T>::value && !std::numeric_limits<T>::is_signed, \"circular_less_than is intended to be used only with unsigned integer types\");\n\t\treturn static_cast<T>(a - b) > static_cast<T>(static_cast<T>(1) << (static_cast<T>(sizeof(T) * CHAR_BIT - 1)));\n\t\t// Note: extra parens around rhs of operator<< is MSVC bug: https://developercommunity2.visualstudio.com/t/C4554-triggers-when-both-lhs-and-rhs-is/10034931\n\t\t//       silencing the bug requires #pragma warning(disable: 4554) around the calling code and has no effect when done here.\n\t}\n\t\n\ttemplate<typename U>\n\tstatic inline char* align_for(char* ptr)\n\t{\n\t\tconst std::size_t alignment = std::alignment_of<U>::value;\n\t\treturn ptr + (alignment - (reinterpret_cast<std::uintptr_t>(ptr) % alignment)) % alignment;\n\t}\n\n\ttemplate<typename T>\n\tstatic inline T ceil_to_pow_2(T x)\n\t{\n\t\tstatic_assert(std::is_integral<T>::value && !std::numeric_limits<T>::is_signed, \"ceil_to_pow_2 is intended to be used only with unsigned integer types\");\n\n\t\t// Adapted from http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2\n\t\t--x;\n\t\tx |= x >> 1;\n\t\tx |= x >> 2;\n\t\tx |= x >> 4;\n\t\tfor (std::size_t i = 1; i < sizeof(T); i <<= 1) {\n\t\t\tx |= x >> (i << 3);\n\t\t}\n\t\t++x;\n\t\treturn x;\n\t}\n\t\n\ttemplate<typename T>\n\tstatic inline void swap_relaxed(std::atomic<T>& left, std::atomic<T>& right)\n\t{\n\t\tT temp = left.load(std::memory_order_relaxed);\n\t\tleft.store(right.load(std::memory_order_relaxed), std::memory_order_relaxed);\n\t\tright.store(temp, std::memory_order_relaxed);\n\t}\n\t\n\ttemplate<typename T>\n\tstatic inline T const& nomove(T const& x)\n\t{\n\t\treturn x;\n\t}\n\t\n\ttemplate<bool Enable>\n\tstruct nomove_if\n\t{\n\t\ttemplate<typename T>\n\t\tstatic inline T const& eval(T const& x)\n\t\t{\n\t\t\treturn x;\n\t\t}\n\t};\n\t\n\ttemplate<>\n\tstruct nomove_if<false>\n\t{\n\t\ttemplate<typename U>\n\t\tstatic inline auto eval(U&& x)\n\t\t\t-> decltype(std::forward<U>(x))\n\t\t{\n\t\t\treturn std::forward<U>(x);\n\t\t}\n\t};\n\t\n\ttemplate<typename It>\n\tstatic inline auto deref_noexcept(It& it) MOODYCAMEL_NOEXCEPT -> decltype(*it)\n\t{\n\t\treturn *it;\n\t}\n\t\n#if defined(__clang__) || !defined(__GNUC__) || __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)\n\ttemplate<typename T> struct is_trivially_destructible : std::is_trivially_destructible<T> { };\n#else\n\ttemplate<typename T> struct is_trivially_destructible : std::has_trivial_destructor<T> { };\n#endif\n\t\n#ifdef MOODYCAMEL_CPP11_THREAD_LOCAL_SUPPORTED\n#ifdef MCDBGQ_USE_RELACY\n\ttypedef RelacyThreadExitListener ThreadExitListener;\n\ttypedef RelacyThreadExitNotifier ThreadExitNotifier;\n#else\n\tclass ThreadExitNotifier;\n\n\tstruct ThreadExitListener\n\t{\n\t\ttypedef void (*callback_t)(void*);\n\t\tcallback_t callback;\n\t\tvoid* userData;\n\t\t\n\t\tThreadExitListener* next;\t\t// reserved for use by the ThreadExitNotifier\n\t\tThreadExitNotifier* chain;\t\t// reserved for use by the ThreadExitNotifier\n\t};\n\n\tclass ThreadExitNotifier\n\t{\n\tpublic:\n\t\tstatic void subscribe(ThreadExitListener* listener)\n\t\t{\n\t\t\tauto& tlsInst = instance();\n\t\t\tstd::lock_guard<std::mutex> guard(mutex());\n\t\t\tlistener->next = tlsInst.tail;\n\t\t\tlistener->chain = &tlsInst;\n\t\t\ttlsInst.tail = listener;\n\t\t}\n\t\t\n\t\tstatic void unsubscribe(ThreadExitListener* listener)\n\t\t{\n\t\t\tstd::lock_guard<std::mutex> guard(mutex());\n\t\t\tif (!listener->chain) {\n\t\t\t\treturn;  // race with ~ThreadExitNotifier\n\t\t\t}\n\t\t\tauto& tlsInst = *listener->chain;\n\t\t\tlistener->chain = nullptr;\n\t\t\tThreadExitListener** prev = &tlsInst.tail;\n\t\t\tfor (auto ptr = tlsInst.tail; ptr != nullptr; ptr = ptr->next) {\n\t\t\t\tif (ptr == listener) {\n\t\t\t\t\t*prev = ptr->next;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tprev = &ptr->next;\n\t\t\t}\n\t\t}\n\t\t\n\tprivate:\n\t\tThreadExitNotifier() : tail(nullptr) { }\n\t\tThreadExitNotifier(ThreadExitNotifier const&) MOODYCAMEL_DELETE_FUNCTION;\n\t\tThreadExitNotifier& operator=(ThreadExitNotifier const&) MOODYCAMEL_DELETE_FUNCTION;\n\t\t\n\t\t~ThreadExitNotifier()\n\t\t{\n\t\t\t// This thread is about to exit, let everyone know!\n\t\t\tassert(this == &instance() && \"If this assert fails, you likely have a buggy compiler! Change the preprocessor conditions such that MOODYCAMEL_CPP11_THREAD_LOCAL_SUPPORTED is no longer defined.\");\n\t\t\tstd::lock_guard<std::mutex> guard(mutex());\n\t\t\tfor (auto ptr = tail; ptr != nullptr; ptr = ptr->next) {\n\t\t\t\tptr->chain = nullptr;\n\t\t\t\tptr->callback(ptr->userData);\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Thread-local\n\t\tstatic inline ThreadExitNotifier& instance()\n\t\t{\n\t\t\tstatic thread_local ThreadExitNotifier notifier;\n\t\t\treturn notifier;\n\t\t}\n\n\t\tstatic inline std::mutex& mutex()\n\t\t{\n\t\t\t// Must be static because the ThreadExitNotifier could be destroyed while unsubscribe is called\n\t\t\tstatic std::mutex mutex;\n\t\t\treturn mutex;\n\t\t}\n\t\t\n\tprivate:\n\t\tThreadExitListener* tail;\n\t};\n#endif\n#endif\n\t\n\ttemplate<typename T> struct static_is_lock_free_num { enum { value = 0 }; };\n\ttemplate<> struct static_is_lock_free_num<signed char> { enum { value = ATOMIC_CHAR_LOCK_FREE }; };\n\ttemplate<> struct static_is_lock_free_num<short> { enum { value = ATOMIC_SHORT_LOCK_FREE }; };\n\ttemplate<> struct static_is_lock_free_num<int> { enum { value = ATOMIC_INT_LOCK_FREE }; };\n\ttemplate<> struct static_is_lock_free_num<long> { enum { value = ATOMIC_LONG_LOCK_FREE }; };\n\ttemplate<> struct static_is_lock_free_num<long long> { enum { value = ATOMIC_LLONG_LOCK_FREE }; };\n\ttemplate<typename T> struct static_is_lock_free : static_is_lock_free_num<typename std::make_signed<T>::type> {  };\n\ttemplate<> struct static_is_lock_free<bool> { enum { value = ATOMIC_BOOL_LOCK_FREE }; };\n\ttemplate<typename U> struct static_is_lock_free<U*> { enum { value = ATOMIC_POINTER_LOCK_FREE }; };\n}\n\n\nstruct ProducerToken\n{\n\ttemplate<typename T, typename Traits>\n\texplicit ProducerToken(ConcurrentQueue<T, Traits>& queue);\n\t\n\ttemplate<typename T, typename Traits>\n\texplicit ProducerToken(BlockingConcurrentQueue<T, Traits>& queue);\n\t\n\tProducerToken(ProducerToken&& other) MOODYCAMEL_NOEXCEPT\n\t\t: producer(other.producer)\n\t{\n\t\tother.producer = nullptr;\n\t\tif (producer != nullptr) {\n\t\t\tproducer->token = this;\n\t\t}\n\t}\n\t\n\tinline ProducerToken& operator=(ProducerToken&& other) MOODYCAMEL_NOEXCEPT\n\t{\n\t\tswap(other);\n\t\treturn *this;\n\t}\n\t\n\tvoid swap(ProducerToken& other) MOODYCAMEL_NOEXCEPT\n\t{\n\t\tstd::swap(producer, other.producer);\n\t\tif (producer != nullptr) {\n\t\t\tproducer->token = this;\n\t\t}\n\t\tif (other.producer != nullptr) {\n\t\t\tother.producer->token = &other;\n\t\t}\n\t}\n\t\n\t// A token is always valid unless:\n\t//     1) Memory allocation failed during construction\n\t//     2) It was moved via the move constructor\n\t//        (Note: assignment does a swap, leaving both potentially valid)\n\t//     3) The associated queue was destroyed\n\t// Note that if valid() returns true, that only indicates\n\t// that the token is valid for use with a specific queue,\n\t// but not which one; that's up to the user to track.\n\tinline bool valid() const { return producer != nullptr; }\n\t\n\t~ProducerToken()\n\t{\n\t\tif (producer != nullptr) {\n\t\t\tproducer->token = nullptr;\n\t\t\tproducer->inactive.store(true, std::memory_order_release);\n\t\t}\n\t}\n\t\n\t// Disable copying and assignment\n\tProducerToken(ProducerToken const&) MOODYCAMEL_DELETE_FUNCTION;\n\tProducerToken& operator=(ProducerToken const&) MOODYCAMEL_DELETE_FUNCTION;\n\t\nprivate:\n\ttemplate<typename T, typename Traits> friend class ConcurrentQueue;\n\tfriend class ConcurrentQueueTests;\n\t\nprotected:\n\tdetails::ConcurrentQueueProducerTypelessBase* producer;\n};\n\n\nstruct ConsumerToken\n{\n\ttemplate<typename T, typename Traits>\n\texplicit ConsumerToken(ConcurrentQueue<T, Traits>& q);\n\t\n\ttemplate<typename T, typename Traits>\n\texplicit ConsumerToken(BlockingConcurrentQueue<T, Traits>& q);\n\t\n\tConsumerToken(ConsumerToken&& other) MOODYCAMEL_NOEXCEPT\n\t\t: initialOffset(other.initialOffset), lastKnownGlobalOffset(other.lastKnownGlobalOffset), itemsConsumedFromCurrent(other.itemsConsumedFromCurrent), currentProducer(other.currentProducer), desiredProducer(other.desiredProducer)\n\t{\n\t}\n\t\n\tinline ConsumerToken& operator=(ConsumerToken&& other) MOODYCAMEL_NOEXCEPT\n\t{\n\t\tswap(other);\n\t\treturn *this;\n\t}\n\t\n\tvoid swap(ConsumerToken& other) MOODYCAMEL_NOEXCEPT\n\t{\n\t\tstd::swap(initialOffset, other.initialOffset);\n\t\tstd::swap(lastKnownGlobalOffset, other.lastKnownGlobalOffset);\n\t\tstd::swap(itemsConsumedFromCurrent, other.itemsConsumedFromCurrent);\n\t\tstd::swap(currentProducer, other.currentProducer);\n\t\tstd::swap(desiredProducer, other.desiredProducer);\n\t}\n\t\n\t// Disable copying and assignment\n\tConsumerToken(ConsumerToken const&) MOODYCAMEL_DELETE_FUNCTION;\n\tConsumerToken& operator=(ConsumerToken const&) MOODYCAMEL_DELETE_FUNCTION;\n\nprivate:\n\ttemplate<typename T, typename Traits> friend class ConcurrentQueue;\n\tfriend class ConcurrentQueueTests;\n\t\nprivate: // but shared with ConcurrentQueue\n\tstd::uint32_t initialOffset;\n\tstd::uint32_t lastKnownGlobalOffset;\n\tstd::uint32_t itemsConsumedFromCurrent;\n\tdetails::ConcurrentQueueProducerTypelessBase* currentProducer;\n\tdetails::ConcurrentQueueProducerTypelessBase* desiredProducer;\n};\n\n// Need to forward-declare this swap because it's in a namespace.\n// See http://stackoverflow.com/questions/4492062/why-does-a-c-friend-class-need-a-forward-declaration-only-in-other-namespaces\ntemplate<typename T, typename Traits>\ninline void swap(typename ConcurrentQueue<T, Traits>::ImplicitProducerKVP& a, typename ConcurrentQueue<T, Traits>::ImplicitProducerKVP& b) MOODYCAMEL_NOEXCEPT;\n\n\ntemplate<typename T, typename Traits = ConcurrentQueueDefaultTraits>\nclass ConcurrentQueue\n{\npublic:\n\ttypedef ::moodycamel::ProducerToken producer_token_t;\n\ttypedef ::moodycamel::ConsumerToken consumer_token_t;\n\t\n\ttypedef typename Traits::index_t index_t;\n\ttypedef typename Traits::size_t size_t;\n\t\n\tstatic const size_t BLOCK_SIZE = static_cast<size_t>(Traits::BLOCK_SIZE);\n\tstatic const size_t EXPLICIT_BLOCK_EMPTY_COUNTER_THRESHOLD = static_cast<size_t>(Traits::EXPLICIT_BLOCK_EMPTY_COUNTER_THRESHOLD);\n\tstatic const size_t EXPLICIT_INITIAL_INDEX_SIZE = static_cast<size_t>(Traits::EXPLICIT_INITIAL_INDEX_SIZE);\n\tstatic const size_t IMPLICIT_INITIAL_INDEX_SIZE = static_cast<size_t>(Traits::IMPLICIT_INITIAL_INDEX_SIZE);\n\tstatic const size_t INITIAL_IMPLICIT_PRODUCER_HASH_SIZE = static_cast<size_t>(Traits::INITIAL_IMPLICIT_PRODUCER_HASH_SIZE);\n\tstatic const std::uint32_t EXPLICIT_CONSUMER_CONSUMPTION_QUOTA_BEFORE_ROTATE = static_cast<std::uint32_t>(Traits::EXPLICIT_CONSUMER_CONSUMPTION_QUOTA_BEFORE_ROTATE);\n#ifdef _MSC_VER\n#pragma warning(push)\n#pragma warning(disable: 4307)\t\t// + integral constant overflow (that's what the ternary expression is for!)\n#pragma warning(disable: 4309)\t\t// static_cast: Truncation of constant value\n#endif\n\tstatic const size_t MAX_SUBQUEUE_SIZE = (details::const_numeric_max<size_t>::value - static_cast<size_t>(Traits::MAX_SUBQUEUE_SIZE) < BLOCK_SIZE) ? details::const_numeric_max<size_t>::value : ((static_cast<size_t>(Traits::MAX_SUBQUEUE_SIZE) + (BLOCK_SIZE - 1)) / BLOCK_SIZE * BLOCK_SIZE);\n#ifdef _MSC_VER\n#pragma warning(pop)\n#endif\n\n\tstatic_assert(!std::numeric_limits<size_t>::is_signed && std::is_integral<size_t>::value, \"Traits::size_t must be an unsigned integral type\");\n\tstatic_assert(!std::numeric_limits<index_t>::is_signed && std::is_integral<index_t>::value, \"Traits::index_t must be an unsigned integral type\");\n\tstatic_assert(sizeof(index_t) >= sizeof(size_t), \"Traits::index_t must be at least as wide as Traits::size_t\");\n\tstatic_assert((BLOCK_SIZE > 1) && !(BLOCK_SIZE & (BLOCK_SIZE - 1)), \"Traits::BLOCK_SIZE must be a power of 2 (and at least 2)\");\n\tstatic_assert((EXPLICIT_BLOCK_EMPTY_COUNTER_THRESHOLD > 1) && !(EXPLICIT_BLOCK_EMPTY_COUNTER_THRESHOLD & (EXPLICIT_BLOCK_EMPTY_COUNTER_THRESHOLD - 1)), \"Traits::EXPLICIT_BLOCK_EMPTY_COUNTER_THRESHOLD must be a power of 2 (and greater than 1)\");\n\tstatic_assert((EXPLICIT_INITIAL_INDEX_SIZE > 1) && !(EXPLICIT_INITIAL_INDEX_SIZE & (EXPLICIT_INITIAL_INDEX_SIZE - 1)), \"Traits::EXPLICIT_INITIAL_INDEX_SIZE must be a power of 2 (and greater than 1)\");\n\tstatic_assert((IMPLICIT_INITIAL_INDEX_SIZE > 1) && !(IMPLICIT_INITIAL_INDEX_SIZE & (IMPLICIT_INITIAL_INDEX_SIZE - 1)), \"Traits::IMPLICIT_INITIAL_INDEX_SIZE must be a power of 2 (and greater than 1)\");\n\tstatic_assert((INITIAL_IMPLICIT_PRODUCER_HASH_SIZE == 0) || !(INITIAL_IMPLICIT_PRODUCER_HASH_SIZE & (INITIAL_IMPLICIT_PRODUCER_HASH_SIZE - 1)), \"Traits::INITIAL_IMPLICIT_PRODUCER_HASH_SIZE must be a power of 2\");\n\tstatic_assert(INITIAL_IMPLICIT_PRODUCER_HASH_SIZE == 0 || INITIAL_IMPLICIT_PRODUCER_HASH_SIZE >= 1, \"Traits::INITIAL_IMPLICIT_PRODUCER_HASH_SIZE must be at least 1 (or 0 to disable implicit enqueueing)\");\n\npublic:\n\t// Creates a queue with at least `capacity` element slots; note that the\n\t// actual number of elements that can be inserted without additional memory\n\t// allocation depends on the number of producers and the block size (e.g. if\n\t// the block size is equal to `capacity`, only a single block will be allocated\n\t// up-front, which means only a single producer will be able to enqueue elements\n\t// without an extra allocation -- blocks aren't shared between producers).\n\t// This method is not thread safe -- it is up to the user to ensure that the\n\t// queue is fully constructed before it starts being used by other threads (this\n\t// includes making the memory effects of construction visible, possibly with a\n\t// memory barrier).\n\texplicit ConcurrentQueue(size_t capacity = 32 * BLOCK_SIZE)\n\t\t: producerListTail(nullptr),\n\t\tproducerCount(0),\n\t\tinitialBlockPoolIndex(0),\n\t\tnextExplicitConsumerId(0),\n\t\tglobalExplicitConsumerOffset(0)\n\t{\n\t\timplicitProducerHashResizeInProgress.clear(std::memory_order_relaxed);\n\t\tpopulate_initial_implicit_producer_hash();\n\t\tpopulate_initial_block_list(capacity / BLOCK_SIZE + ((capacity & (BLOCK_SIZE - 1)) == 0 ? 0 : 1));\n\t\t\n#ifdef MOODYCAMEL_QUEUE_INTERNAL_DEBUG\n\t\t// Track all the producers using a fully-resolved typed list for\n\t\t// each kind; this makes it possible to debug them starting from\n\t\t// the root queue object (otherwise wacky casts are needed that\n\t\t// don't compile in the debugger's expression evaluator).\n\t\texplicitProducers.store(nullptr, std::memory_order_relaxed);\n\t\timplicitProducers.store(nullptr, std::memory_order_relaxed);\n#endif\n\t}\n\t\n\t// Computes the correct amount of pre-allocated blocks for you based\n\t// on the minimum number of elements you want available at any given\n\t// time, and the maximum concurrent number of each type of producer.\n\tConcurrentQueue(size_t minCapacity, size_t maxExplicitProducers, size_t maxImplicitProducers)\n\t\t: producerListTail(nullptr),\n\t\tproducerCount(0),\n\t\tinitialBlockPoolIndex(0),\n\t\tnextExplicitConsumerId(0),\n\t\tglobalExplicitConsumerOffset(0)\n\t{\n\t\timplicitProducerHashResizeInProgress.clear(std::memory_order_relaxed);\n\t\tpopulate_initial_implicit_producer_hash();\n\t\tsize_t blocks = (((minCapacity + BLOCK_SIZE - 1) / BLOCK_SIZE) - 1) * (maxExplicitProducers + 1) + 2 * (maxExplicitProducers + maxImplicitProducers);\n\t\tpopulate_initial_block_list(blocks);\n\t\t\n#ifdef MOODYCAMEL_QUEUE_INTERNAL_DEBUG\n\t\texplicitProducers.store(nullptr, std::memory_order_relaxed);\n\t\timplicitProducers.store(nullptr, std::memory_order_relaxed);\n#endif\n\t}\n\t\n\t// Note: The queue should not be accessed concurrently while it's\n\t// being deleted. It's up to the user to synchronize this.\n\t// This method is not thread safe.\n\t~ConcurrentQueue()\n\t{\n\t\t// Destroy producers\n\t\tauto ptr = producerListTail.load(std::memory_order_relaxed);\n\t\twhile (ptr != nullptr) {\n\t\t\tauto next = ptr->next_prod();\n\t\t\tif (ptr->token != nullptr) {\n\t\t\t\tptr->token->producer = nullptr;\n\t\t\t}\n\t\t\tdestroy(ptr);\n\t\t\tptr = next;\n\t\t}\n\t\t\n\t\t// Destroy implicit producer hash tables\n\t\tMOODYCAMEL_CONSTEXPR_IF (INITIAL_IMPLICIT_PRODUCER_HASH_SIZE != 0) {\n\t\t\tauto hash = implicitProducerHash.load(std::memory_order_relaxed);\n\t\t\twhile (hash != nullptr) {\n\t\t\t\tauto prev = hash->prev;\n\t\t\t\tif (prev != nullptr) {\t\t// The last hash is part of this object and was not allocated dynamically\n\t\t\t\t\tfor (size_t i = 0; i != hash->capacity; ++i) {\n\t\t\t\t\t\thash->entries[i].~ImplicitProducerKVP();\n\t\t\t\t\t}\n\t\t\t\t\thash->~ImplicitProducerHash();\n\t\t\t\t\t(Traits::free)(hash);\n\t\t\t\t}\n\t\t\t\thash = prev;\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Destroy global free list\n\t\tauto block = freeList.head_unsafe();\n\t\twhile (block != nullptr) {\n\t\t\tauto next = block->freeListNext.load(std::memory_order_relaxed);\n\t\t\tif (block->dynamicallyAllocated) {\n\t\t\t\tdestroy(block);\n\t\t\t}\n\t\t\tblock = next;\n\t\t}\n\t\t\n\t\t// Destroy initial free list\n\t\tdestroy_array(initialBlockPool, initialBlockPoolSize);\n\t}\n\n\t// Disable copying and copy assignment\n\tConcurrentQueue(ConcurrentQueue const&) MOODYCAMEL_DELETE_FUNCTION;\n\tConcurrentQueue& operator=(ConcurrentQueue const&) MOODYCAMEL_DELETE_FUNCTION;\n\t\n\t// Moving is supported, but note that it is *not* a thread-safe operation.\n\t// Nobody can use the queue while it's being moved, and the memory effects\n\t// of that move must be propagated to other threads before they can use it.\n\t// Note: When a queue is moved, its tokens are still valid but can only be\n\t// used with the destination queue (i.e. semantically they are moved along\n\t// with the queue itself).\n\tConcurrentQueue(ConcurrentQueue&& other) MOODYCAMEL_NOEXCEPT\n\t\t: producerListTail(other.producerListTail.load(std::memory_order_relaxed)),\n\t\tproducerCount(other.producerCount.load(std::memory_order_relaxed)),\n\t\tinitialBlockPoolIndex(other.initialBlockPoolIndex.load(std::memory_order_relaxed)),\n\t\tinitialBlockPool(other.initialBlockPool),\n\t\tinitialBlockPoolSize(other.initialBlockPoolSize),\n\t\tfreeList(std::move(other.freeList)),\n\t\tnextExplicitConsumerId(other.nextExplicitConsumerId.load(std::memory_order_relaxed)),\n\t\tglobalExplicitConsumerOffset(other.globalExplicitConsumerOffset.load(std::memory_order_relaxed))\n\t{\n\t\t// Move the other one into this, and leave the other one as an empty queue\n\t\timplicitProducerHashResizeInProgress.clear(std::memory_order_relaxed);\n\t\tpopulate_initial_implicit_producer_hash();\n\t\tswap_implicit_producer_hashes(other);\n\t\t\n\t\tother.producerListTail.store(nullptr, std::memory_order_relaxed);\n\t\tother.producerCount.store(0, std::memory_order_relaxed);\n\t\tother.nextExplicitConsumerId.store(0, std::memory_order_relaxed);\n\t\tother.globalExplicitConsumerOffset.store(0, std::memory_order_relaxed);\n\t\t\n#ifdef MOODYCAMEL_QUEUE_INTERNAL_DEBUG\n\t\texplicitProducers.store(other.explicitProducers.load(std::memory_order_relaxed), std::memory_order_relaxed);\n\t\tother.explicitProducers.store(nullptr, std::memory_order_relaxed);\n\t\timplicitProducers.store(other.implicitProducers.load(std::memory_order_relaxed), std::memory_order_relaxed);\n\t\tother.implicitProducers.store(nullptr, std::memory_order_relaxed);\n#endif\n\t\t\n\t\tother.initialBlockPoolIndex.store(0, std::memory_order_relaxed);\n\t\tother.initialBlockPoolSize = 0;\n\t\tother.initialBlockPool = nullptr;\n\t\t\n\t\treown_producers();\n\t}\n\t\n\tinline ConcurrentQueue& operator=(ConcurrentQueue&& other) MOODYCAMEL_NOEXCEPT\n\t{\n\t\treturn swap_internal(other);\n\t}\n\t\n\t// Swaps this queue's state with the other's. Not thread-safe.\n\t// Swapping two queues does not invalidate their tokens, however\n\t// the tokens that were created for one queue must be used with\n\t// only the swapped queue (i.e. the tokens are tied to the\n\t// queue's movable state, not the object itself).\n\tinline void swap(ConcurrentQueue& other) MOODYCAMEL_NOEXCEPT\n\t{\n\t\tswap_internal(other);\n\t}\n\t\nprivate:\n\tConcurrentQueue& swap_internal(ConcurrentQueue& other)\n\t{\n\t\tif (this == &other) {\n\t\t\treturn *this;\n\t\t}\n\t\t\n\t\tdetails::swap_relaxed(producerListTail, other.producerListTail);\n\t\tdetails::swap_relaxed(producerCount, other.producerCount);\n\t\tdetails::swap_relaxed(initialBlockPoolIndex, other.initialBlockPoolIndex);\n\t\tstd::swap(initialBlockPool, other.initialBlockPool);\n\t\tstd::swap(initialBlockPoolSize, other.initialBlockPoolSize);\n\t\tfreeList.swap(other.freeList);\n\t\tdetails::swap_relaxed(nextExplicitConsumerId, other.nextExplicitConsumerId);\n\t\tdetails::swap_relaxed(globalExplicitConsumerOffset, other.globalExplicitConsumerOffset);\n\t\t\n\t\tswap_implicit_producer_hashes(other);\n\t\t\n\t\treown_producers();\n\t\tother.reown_producers();\n\t\t\n#ifdef MOODYCAMEL_QUEUE_INTERNAL_DEBUG\n\t\tdetails::swap_relaxed(explicitProducers, other.explicitProducers);\n\t\tdetails::swap_relaxed(implicitProducers, other.implicitProducers);\n#endif\n\t\t\n\t\treturn *this;\n\t}\n\t\npublic:\n\t// Enqueues a single item (by copying it).\n\t// Allocates memory if required. Only fails if memory allocation fails (or implicit\n\t// production is disabled because Traits::INITIAL_IMPLICIT_PRODUCER_HASH_SIZE is 0,\n\t// or Traits::MAX_SUBQUEUE_SIZE has been defined and would be surpassed).\n\t// Thread-safe.\n\tinline bool enqueue(T const& item)\n\t{\n\t\tMOODYCAMEL_CONSTEXPR_IF (INITIAL_IMPLICIT_PRODUCER_HASH_SIZE == 0) return false;\n\t\telse return inner_enqueue<CanAlloc>(item);\n\t}\n\t\n\t// Enqueues a single item (by moving it, if possible).\n\t// Allocates memory if required. Only fails if memory allocation fails (or implicit\n\t// production is disabled because Traits::INITIAL_IMPLICIT_PRODUCER_HASH_SIZE is 0,\n\t// or Traits::MAX_SUBQUEUE_SIZE has been defined and would be surpassed).\n\t// Thread-safe.\n\tinline bool enqueue(T&& item)\n\t{\n\t\tMOODYCAMEL_CONSTEXPR_IF (INITIAL_IMPLICIT_PRODUCER_HASH_SIZE == 0) return false;\n\t\telse return inner_enqueue<CanAlloc>(std::move(item));\n\t}\n\t\n\t// Enqueues a single item (by copying it) using an explicit producer token.\n\t// Allocates memory if required. Only fails if memory allocation fails (or\n\t// Traits::MAX_SUBQUEUE_SIZE has been defined and would be surpassed).\n\t// Thread-safe.\n\tinline bool enqueue(producer_token_t const& token, T const& item)\n\t{\n\t\treturn inner_enqueue<CanAlloc>(token, item);\n\t}\n\t\n\t// Enqueues a single item (by moving it, if possible) using an explicit producer token.\n\t// Allocates memory if required. Only fails if memory allocation fails (or\n\t// Traits::MAX_SUBQUEUE_SIZE has been defined and would be surpassed).\n\t// Thread-safe.\n\tinline bool enqueue(producer_token_t const& token, T&& item)\n\t{\n\t\treturn inner_enqueue<CanAlloc>(token, std::move(item));\n\t}\n\t\n\t// Enqueues several items.\n\t// Allocates memory if required. Only fails if memory allocation fails (or\n\t// implicit production is disabled because Traits::INITIAL_IMPLICIT_PRODUCER_HASH_SIZE\n\t// is 0, or Traits::MAX_SUBQUEUE_SIZE has been defined and would be surpassed).\n\t// Note: Use std::make_move_iterator if the elements should be moved instead of copied.\n\t// Thread-safe.\n\ttemplate<typename It>\n\tbool enqueue_bulk(It itemFirst, size_t count)\n\t{\n\t\tMOODYCAMEL_CONSTEXPR_IF (INITIAL_IMPLICIT_PRODUCER_HASH_SIZE == 0) return false;\n\t\telse return inner_enqueue_bulk<CanAlloc>(itemFirst, count);\n\t}\n\t\n\t// Enqueues several items using an explicit producer token.\n\t// Allocates memory if required. Only fails if memory allocation fails\n\t// (or Traits::MAX_SUBQUEUE_SIZE has been defined and would be surpassed).\n\t// Note: Use std::make_move_iterator if the elements should be moved\n\t// instead of copied.\n\t// Thread-safe.\n\ttemplate<typename It>\n\tbool enqueue_bulk(producer_token_t const& token, It itemFirst, size_t count)\n\t{\n\t\treturn inner_enqueue_bulk<CanAlloc>(token, itemFirst, count);\n\t}\n\t\n\t// Enqueues a single item (by copying it).\n\t// Does not allocate memory. Fails if not enough room to enqueue (or implicit\n\t// production is disabled because Traits::INITIAL_IMPLICIT_PRODUCER_HASH_SIZE\n\t// is 0).\n\t// Thread-safe.\n\tinline bool try_enqueue(T const& item)\n\t{\n\t\tMOODYCAMEL_CONSTEXPR_IF (INITIAL_IMPLICIT_PRODUCER_HASH_SIZE == 0) return false;\n\t\telse return inner_enqueue<CannotAlloc>(item);\n\t}\n\t\n\t// Enqueues a single item (by moving it, if possible).\n\t// Does not allocate memory (except for one-time implicit producer).\n\t// Fails if not enough room to enqueue (or implicit production is\n\t// disabled because Traits::INITIAL_IMPLICIT_PRODUCER_HASH_SIZE is 0).\n\t// Thread-safe.\n\tinline bool try_enqueue(T&& item)\n\t{\n\t\tMOODYCAMEL_CONSTEXPR_IF (INITIAL_IMPLICIT_PRODUCER_HASH_SIZE == 0) return false;\n\t\telse return inner_enqueue<CannotAlloc>(std::move(item));\n\t}\n\t\n\t// Enqueues a single item (by copying it) using an explicit producer token.\n\t// Does not allocate memory. Fails if not enough room to enqueue.\n\t// Thread-safe.\n\tinline bool try_enqueue(producer_token_t const& token, T const& item)\n\t{\n\t\treturn inner_enqueue<CannotAlloc>(token, item);\n\t}\n\t\n\t// Enqueues a single item (by moving it, if possible) using an explicit producer token.\n\t// Does not allocate memory. Fails if not enough room to enqueue.\n\t// Thread-safe.\n\tinline bool try_enqueue(producer_token_t const& token, T&& item)\n\t{\n\t\treturn inner_enqueue<CannotAlloc>(token, std::move(item));\n\t}\n\t\n\t// Enqueues several items.\n\t// Does not allocate memory (except for one-time implicit producer).\n\t// Fails if not enough room to enqueue (or implicit production is\n\t// disabled because Traits::INITIAL_IMPLICIT_PRODUCER_HASH_SIZE is 0).\n\t// Note: Use std::make_move_iterator if the elements should be moved\n\t// instead of copied.\n\t// Thread-safe.\n\ttemplate<typename It>\n\tbool try_enqueue_bulk(It itemFirst, size_t count)\n\t{\n\t\tMOODYCAMEL_CONSTEXPR_IF (INITIAL_IMPLICIT_PRODUCER_HASH_SIZE == 0) return false;\n\t\telse return inner_enqueue_bulk<CannotAlloc>(itemFirst, count);\n\t}\n\t\n\t// Enqueues several items using an explicit producer token.\n\t// Does not allocate memory. Fails if not enough room to enqueue.\n\t// Note: Use std::make_move_iterator if the elements should be moved\n\t// instead of copied.\n\t// Thread-safe.\n\ttemplate<typename It>\n\tbool try_enqueue_bulk(producer_token_t const& token, It itemFirst, size_t count)\n\t{\n\t\treturn inner_enqueue_bulk<CannotAlloc>(token, itemFirst, count);\n\t}\n\t\n\t\n\t\n\t// Attempts to dequeue from the queue.\n\t// Returns false if all producer streams appeared empty at the time they\n\t// were checked (so, the queue is likely but not guaranteed to be empty).\n\t// Never allocates. Thread-safe.\n\ttemplate<typename U>\n\tbool try_dequeue(U& item)\n\t{\n\t\t// Instead of simply trying each producer in turn (which could cause needless contention on the first\n\t\t// producer), we score them heuristically.\n\t\tsize_t nonEmptyCount = 0;\n\t\tProducerBase* best = nullptr;\n\t\tsize_t bestSize = 0;\n\t\tfor (auto ptr = producerListTail.load(std::memory_order_acquire); nonEmptyCount < 3 && ptr != nullptr; ptr = ptr->next_prod()) {\n\t\t\tauto size = ptr->size_approx();\n\t\t\tif (size > 0) {\n\t\t\t\tif (size > bestSize) {\n\t\t\t\t\tbestSize = size;\n\t\t\t\t\tbest = ptr;\n\t\t\t\t}\n\t\t\t\t++nonEmptyCount;\n\t\t\t}\n\t\t}\n\t\t\n\t\t// If there was at least one non-empty queue but it appears empty at the time\n\t\t// we try to dequeue from it, we need to make sure every queue's been tried\n\t\tif (nonEmptyCount > 0) {\n\t\t\tif ((details::likely)(best->dequeue(item))) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tfor (auto ptr = producerListTail.load(std::memory_order_acquire); ptr != nullptr; ptr = ptr->next_prod()) {\n\t\t\t\tif (ptr != best && ptr->dequeue(item)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t// Attempts to dequeue from the queue.\n\t// Returns false if all producer streams appeared empty at the time they\n\t// were checked (so, the queue is likely but not guaranteed to be empty).\n\t// This differs from the try_dequeue(item) method in that this one does\n\t// not attempt to reduce contention by interleaving the order that producer\n\t// streams are dequeued from. So, using this method can reduce overall throughput\n\t// under contention, but will give more predictable results in single-threaded\n\t// consumer scenarios. This is mostly only useful for internal unit tests.\n\t// Never allocates. Thread-safe.\n\ttemplate<typename U>\n\tbool try_dequeue_non_interleaved(U& item)\n\t{\n\t\tfor (auto ptr = producerListTail.load(std::memory_order_acquire); ptr != nullptr; ptr = ptr->next_prod()) {\n\t\t\tif (ptr->dequeue(item)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t// Attempts to dequeue from the queue using an explicit consumer token.\n\t// Returns false if all producer streams appeared empty at the time they\n\t// were checked (so, the queue is likely but not guaranteed to be empty).\n\t// Never allocates. Thread-safe.\n\ttemplate<typename U>\n\tbool try_dequeue(consumer_token_t& token, U& item)\n\t{\n\t\t// The idea is roughly as follows:\n\t\t// Every 256 items from one producer, make everyone rotate (increase the global offset) -> this means the highest efficiency consumer dictates the rotation speed of everyone else, more or less\n\t\t// If you see that the global offset has changed, you must reset your consumption counter and move to your designated place\n\t\t// If there's no items where you're supposed to be, keep moving until you find a producer with some items\n\t\t// If the global offset has not changed but you've run out of items to consume, move over from your current position until you find an producer with something in it\n\t\t\n\t\tif (token.desiredProducer == nullptr || token.lastKnownGlobalOffset != globalExplicitConsumerOffset.load(std::memory_order_relaxed)) {\n\t\t\tif (!update_current_producer_after_rotation(token)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\t\n\t\t// If there was at least one non-empty queue but it appears empty at the time\n\t\t// we try to dequeue from it, we need to make sure every queue's been tried\n\t\tif (static_cast<ProducerBase*>(token.currentProducer)->dequeue(item)) {\n\t\t\tif (++token.itemsConsumedFromCurrent == EXPLICIT_CONSUMER_CONSUMPTION_QUOTA_BEFORE_ROTATE) {\n\t\t\t\tglobalExplicitConsumerOffset.fetch_add(1, std::memory_order_relaxed);\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\tauto tail = producerListTail.load(std::memory_order_acquire);\n\t\tauto ptr = static_cast<ProducerBase*>(token.currentProducer)->next_prod();\n\t\tif (ptr == nullptr) {\n\t\t\tptr = tail;\n\t\t}\n\t\twhile (ptr != static_cast<ProducerBase*>(token.currentProducer)) {\n\t\t\tif (ptr->dequeue(item)) {\n\t\t\t\ttoken.currentProducer = ptr;\n\t\t\t\ttoken.itemsConsumedFromCurrent = 1;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tptr = ptr->next_prod();\n\t\t\tif (ptr == nullptr) {\n\t\t\t\tptr = tail;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\t\n\t// Attempts to dequeue several elements from the queue.\n\t// Returns the number of items actually dequeued.\n\t// Returns 0 if all producer streams appeared empty at the time they\n\t// were checked (so, the queue is likely but not guaranteed to be empty).\n\t// Never allocates. Thread-safe.\n\ttemplate<typename It>\n\tsize_t try_dequeue_bulk(It itemFirst, size_t max)\n\t{\n\t\tsize_t count = 0;\n\t\tfor (auto ptr = producerListTail.load(std::memory_order_acquire); ptr != nullptr; ptr = ptr->next_prod()) {\n\t\t\tcount += ptr->dequeue_bulk(itemFirst, max - count);\n\t\t\tif (count == max) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn count;\n\t}\n\t\n\t// Attempts to dequeue several elements from the queue using an explicit consumer token.\n\t// Returns the number of items actually dequeued.\n\t// Returns 0 if all producer streams appeared empty at the time they\n\t// were checked (so, the queue is likely but not guaranteed to be empty).\n\t// Never allocates. Thread-safe.\n\ttemplate<typename It>\n\tsize_t try_dequeue_bulk(consumer_token_t& token, It itemFirst, size_t max)\n\t{\n\t\tif (token.desiredProducer == nullptr || token.lastKnownGlobalOffset != globalExplicitConsumerOffset.load(std::memory_order_relaxed)) {\n\t\t\tif (!update_current_producer_after_rotation(token)) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t\t\n\t\tsize_t count = static_cast<ProducerBase*>(token.currentProducer)->dequeue_bulk(itemFirst, max);\n\t\tif (count == max) {\n\t\t\tif ((token.itemsConsumedFromCurrent += static_cast<std::uint32_t>(max)) >= EXPLICIT_CONSUMER_CONSUMPTION_QUOTA_BEFORE_ROTATE) {\n\t\t\t\tglobalExplicitConsumerOffset.fetch_add(1, std::memory_order_relaxed);\n\t\t\t}\n\t\t\treturn max;\n\t\t}\n\t\ttoken.itemsConsumedFromCurrent += static_cast<std::uint32_t>(count);\n\t\tmax -= count;\n\t\t\n\t\tauto tail = producerListTail.load(std::memory_order_acquire);\n\t\tauto ptr = static_cast<ProducerBase*>(token.currentProducer)->next_prod();\n\t\tif (ptr == nullptr) {\n\t\t\tptr = tail;\n\t\t}\n\t\twhile (ptr != static_cast<ProducerBase*>(token.currentProducer)) {\n\t\t\tauto dequeued = ptr->dequeue_bulk(itemFirst, max);\n\t\t\tcount += dequeued;\n\t\t\tif (dequeued != 0) {\n\t\t\t\ttoken.currentProducer = ptr;\n\t\t\t\ttoken.itemsConsumedFromCurrent = static_cast<std::uint32_t>(dequeued);\n\t\t\t}\n\t\t\tif (dequeued == max) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmax -= dequeued;\n\t\t\tptr = ptr->next_prod();\n\t\t\tif (ptr == nullptr) {\n\t\t\t\tptr = tail;\n\t\t\t}\n\t\t}\n\t\treturn count;\n\t}\n\t\n\t\n\t\n\t// Attempts to dequeue from a specific producer's inner queue.\n\t// If you happen to know which producer you want to dequeue from, this\n\t// is significantly faster than using the general-case try_dequeue methods.\n\t// Returns false if the producer's queue appeared empty at the time it\n\t// was checked (so, the queue is likely but not guaranteed to be empty).\n\t// Never allocates. Thread-safe.\n\ttemplate<typename U>\n\tinline bool try_dequeue_from_producer(producer_token_t const& producer, U& item)\n\t{\n\t\treturn static_cast<ExplicitProducer*>(producer.producer)->dequeue(item);\n\t}\n\t\n\t// Attempts to dequeue several elements from a specific producer's inner queue.\n\t// Returns the number of items actually dequeued.\n\t// If you happen to know which producer you want to dequeue from, this\n\t// is significantly faster than using the general-case try_dequeue methods.\n\t// Returns 0 if the producer's queue appeared empty at the time it\n\t// was checked (so, the queue is likely but not guaranteed to be empty).\n\t// Never allocates. Thread-safe.\n\ttemplate<typename It>\n\tinline size_t try_dequeue_bulk_from_producer(producer_token_t const& producer, It itemFirst, size_t max)\n\t{\n\t\treturn static_cast<ExplicitProducer*>(producer.producer)->dequeue_bulk(itemFirst, max);\n\t}\n\t\n\t\n\t// Returns an estimate of the total number of elements currently in the queue. This\n\t// estimate is only accurate if the queue has completely stabilized before it is called\n\t// (i.e. all enqueue and dequeue operations have completed and their memory effects are\n\t// visible on the calling thread, and no further operations start while this method is\n\t// being called).\n\t// Thread-safe.\n\tsize_t size_approx() const\n\t{\n\t\tsize_t size = 0;\n\t\tfor (auto ptr = producerListTail.load(std::memory_order_acquire); ptr != nullptr; ptr = ptr->next_prod()) {\n\t\t\tsize += ptr->size_approx();\n\t\t}\n\t\treturn size;\n\t}\n\t\n\t\n\t// Returns true if the underlying atomic variables used by\n\t// the queue are lock-free (they should be on most platforms).\n\t// Thread-safe.\n\tstatic constexpr bool is_lock_free()\n\t{\n\t\treturn\n\t\t\tdetails::static_is_lock_free<bool>::value == 2 &&\n\t\t\tdetails::static_is_lock_free<size_t>::value == 2 &&\n\t\t\tdetails::static_is_lock_free<std::uint32_t>::value == 2 &&\n\t\t\tdetails::static_is_lock_free<index_t>::value == 2 &&\n\t\t\tdetails::static_is_lock_free<void*>::value == 2 &&\n\t\t\tdetails::static_is_lock_free<typename details::thread_id_converter<details::thread_id_t>::thread_id_numeric_size_t>::value == 2;\n\t}\n\n\nprivate:\n\tfriend struct ProducerToken;\n\tfriend struct ConsumerToken;\n\tstruct ExplicitProducer;\n\tfriend struct ExplicitProducer;\n\tstruct ImplicitProducer;\n\tfriend struct ImplicitProducer;\n\tfriend class ConcurrentQueueTests;\n\t\t\n\tenum AllocationMode { CanAlloc, CannotAlloc };\n\t\n\t\n\t///////////////////////////////\n\t// Queue methods\n\t///////////////////////////////\n\t\n\ttemplate<AllocationMode canAlloc, typename U>\n\tinline bool inner_enqueue(producer_token_t const& token, U&& element)\n\t{\n\t\treturn static_cast<ExplicitProducer*>(token.producer)->ConcurrentQueue::ExplicitProducer::template enqueue<canAlloc>(std::forward<U>(element));\n\t}\n\t\n\ttemplate<AllocationMode canAlloc, typename U>\n\tinline bool inner_enqueue(U&& element)\n\t{\n\t\tauto producer = get_or_add_implicit_producer();\n\t\treturn producer == nullptr ? false : producer->ConcurrentQueue::ImplicitProducer::template enqueue<canAlloc>(std::forward<U>(element));\n\t}\n\t\n\ttemplate<AllocationMode canAlloc, typename It>\n\tinline bool inner_enqueue_bulk(producer_token_t const& token, It itemFirst, size_t count)\n\t{\n\t\treturn static_cast<ExplicitProducer*>(token.producer)->ConcurrentQueue::ExplicitProducer::template enqueue_bulk<canAlloc>(itemFirst, count);\n\t}\n\t\n\ttemplate<AllocationMode canAlloc, typename It>\n\tinline bool inner_enqueue_bulk(It itemFirst, size_t count)\n\t{\n\t\tauto producer = get_or_add_implicit_producer();\n\t\treturn producer == nullptr ? false : producer->ConcurrentQueue::ImplicitProducer::template enqueue_bulk<canAlloc>(itemFirst, count);\n\t}\n\t\n\tinline bool update_current_producer_after_rotation(consumer_token_t& token)\n\t{\n\t\t// Ah, there's been a rotation, figure out where we should be!\n\t\tauto tail = producerListTail.load(std::memory_order_acquire);\n\t\tif (token.desiredProducer == nullptr && tail == nullptr) {\n\t\t\treturn false;\n\t\t}\n\t\tauto prodCount = producerCount.load(std::memory_order_relaxed);\n\t\tauto globalOffset = globalExplicitConsumerOffset.load(std::memory_order_relaxed);\n\t\tif ((details::unlikely)(token.desiredProducer == nullptr)) {\n\t\t\t// Aha, first time we're dequeueing anything.\n\t\t\t// Figure out our local position\n\t\t\t// Note: offset is from start, not end, but we're traversing from end -- subtract from count first\n\t\t\tstd::uint32_t offset = prodCount - 1 - (token.initialOffset % prodCount);\n\t\t\ttoken.desiredProducer = tail;\n\t\t\tfor (std::uint32_t i = 0; i != offset; ++i) {\n\t\t\t\ttoken.desiredProducer = static_cast<ProducerBase*>(token.desiredProducer)->next_prod();\n\t\t\t\tif (token.desiredProducer == nullptr) {\n\t\t\t\t\ttoken.desiredProducer = tail;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tstd::uint32_t delta = globalOffset - token.lastKnownGlobalOffset;\n\t\tif (delta >= prodCount) {\n\t\t\tdelta = delta % prodCount;\n\t\t}\n\t\tfor (std::uint32_t i = 0; i != delta; ++i) {\n\t\t\ttoken.desiredProducer = static_cast<ProducerBase*>(token.desiredProducer)->next_prod();\n\t\t\tif (token.desiredProducer == nullptr) {\n\t\t\t\ttoken.desiredProducer = tail;\n\t\t\t}\n\t\t}\n\t\t\n\t\ttoken.lastKnownGlobalOffset = globalOffset;\n\t\ttoken.currentProducer = token.desiredProducer;\n\t\ttoken.itemsConsumedFromCurrent = 0;\n\t\treturn true;\n\t}\n\t\n\t\n\t///////////////////////////\n\t// Free list\n\t///////////////////////////\n\t\n\ttemplate <typename N>\n\tstruct FreeListNode\n\t{\n\t\tFreeListNode() : freeListRefs(0), freeListNext(nullptr) { }\n\t\t\n\t\tstd::atomic<std::uint32_t> freeListRefs;\n\t\tstd::atomic<N*> freeListNext;\n\t};\n\t\n\t// A simple CAS-based lock-free free list. Not the fastest thing in the world under heavy contention, but\n\t// simple and correct (assuming nodes are never freed until after the free list is destroyed), and fairly\n\t// speedy under low contention.\n\ttemplate<typename N>\t\t// N must inherit FreeListNode or have the same fields (and initialization of them)\n\tstruct FreeList\n\t{\n\t\tFreeList() : freeListHead(nullptr) { }\n\t\tFreeList(FreeList&& other) : freeListHead(other.freeListHead.load(std::memory_order_relaxed)) { other.freeListHead.store(nullptr, std::memory_order_relaxed); }\n\t\tvoid swap(FreeList& other) { details::swap_relaxed(freeListHead, other.freeListHead); }\n\t\t\n\t\tFreeList(FreeList const&) MOODYCAMEL_DELETE_FUNCTION;\n\t\tFreeList& operator=(FreeList const&) MOODYCAMEL_DELETE_FUNCTION;\n\t\t\n\t\tinline void add(N* node)\n\t\t{\n#ifdef MCDBGQ_NOLOCKFREE_FREELIST\n\t\t\tdebug::DebugLock lock(mutex);\n#endif\t\t\n\t\t\t// We know that the should-be-on-freelist bit is 0 at this point, so it's safe to\n\t\t\t// set it using a fetch_add\n\t\t\tif (node->freeListRefs.fetch_add(SHOULD_BE_ON_FREELIST, std::memory_order_acq_rel) == 0) {\n\t\t\t\t// Oh look! We were the last ones referencing this node, and we know\n\t\t\t\t// we want to add it to the free list, so let's do it!\n\t\t \t\tadd_knowing_refcount_is_zero(node);\n\t\t\t}\n\t\t}\n\t\t\n\t\tinline N* try_get()\n\t\t{\n#ifdef MCDBGQ_NOLOCKFREE_FREELIST\n\t\t\tdebug::DebugLock lock(mutex);\n#endif\t\t\n\t\t\tauto head = freeListHead.load(std::memory_order_acquire);\n\t\t\twhile (head != nullptr) {\n\t\t\t\tauto prevHead = head;\n\t\t\t\tauto refs = head->freeListRefs.load(std::memory_order_relaxed);\n\t\t\t\tif ((refs & REFS_MASK) == 0 || !head->freeListRefs.compare_exchange_strong(refs, refs + 1, std::memory_order_acquire)) {\n\t\t\t\t\thead = freeListHead.load(std::memory_order_acquire);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Good, reference count has been incremented (it wasn't at zero), which means we can read the\n\t\t\t\t// next and not worry about it changing between now and the time we do the CAS\n\t\t\t\tauto next = head->freeListNext.load(std::memory_order_relaxed);\n\t\t\t\tif (freeListHead.compare_exchange_strong(head, next, std::memory_order_acquire, std::memory_order_relaxed)) {\n\t\t\t\t\t// Yay, got the node. This means it was on the list, which means shouldBeOnFreeList must be false no\n\t\t\t\t\t// matter the refcount (because nobody else knows it's been taken off yet, it can't have been put back on).\n\t\t\t\t\tassert((head->freeListRefs.load(std::memory_order_relaxed) & SHOULD_BE_ON_FREELIST) == 0);\n\t\t\t\t\t\n\t\t\t\t\t// Decrease refcount twice, once for our ref, and once for the list's ref\n\t\t\t\t\thead->freeListRefs.fetch_sub(2, std::memory_order_release);\n\t\t\t\t\treturn head;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// OK, the head must have changed on us, but we still need to decrease the refcount we increased.\n\t\t\t\t// Note that we don't need to release any memory effects, but we do need to ensure that the reference\n\t\t\t\t// count decrement happens-after the CAS on the head.\n\t\t\t\trefs = prevHead->freeListRefs.fetch_sub(1, std::memory_order_acq_rel);\n\t\t\t\tif (refs == SHOULD_BE_ON_FREELIST + 1) {\n\t\t\t\t\tadd_knowing_refcount_is_zero(prevHead);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn nullptr;\n\t\t}\n\t\t\n\t\t// Useful for traversing the list when there's no contention (e.g. to destroy remaining nodes)\n\t\tN* head_unsafe() const { return freeListHead.load(std::memory_order_relaxed); }\n\t\t\n\tprivate:\n\t\tinline void add_knowing_refcount_is_zero(N* node)\n\t\t{\n\t\t\t// Since the refcount is zero, and nobody can increase it once it's zero (except us, and we run\n\t\t\t// only one copy of this method per node at a time, i.e. the single thread case), then we know\n\t\t\t// we can safely change the next pointer of the node; however, once the refcount is back above\n\t\t\t// zero, then other threads could increase it (happens under heavy contention, when the refcount\n\t\t\t// goes to zero in between a load and a refcount increment of a node in try_get, then back up to\n\t\t\t// something non-zero, then the refcount increment is done by the other thread) -- so, if the CAS\n\t\t\t// to add the node to the actual list fails, decrease the refcount and leave the add operation to\n\t\t\t// the next thread who puts the refcount back at zero (which could be us, hence the loop).\n\t\t\tauto head = freeListHead.load(std::memory_order_relaxed);\n\t\t\twhile (true) {\n\t\t\t\tnode->freeListNext.store(head, std::memory_order_relaxed);\n\t\t\t\tnode->freeListRefs.store(1, std::memory_order_release);\n\t\t\t\tif (!freeListHead.compare_exchange_strong(head, node, std::memory_order_release, std::memory_order_relaxed)) {\n\t\t\t\t\t// Hmm, the add failed, but we can only try again when the refcount goes back to zero\n\t\t\t\t\tif (node->freeListRefs.fetch_add(SHOULD_BE_ON_FREELIST - 1, std::memory_order_acq_rel) == 1) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t\n\tprivate:\n\t\t// Implemented like a stack, but where node order doesn't matter (nodes are inserted out of order under contention)\n\t\tstd::atomic<N*> freeListHead;\n\t\n\tstatic const std::uint32_t REFS_MASK = 0x7FFFFFFF;\n\tstatic const std::uint32_t SHOULD_BE_ON_FREELIST = 0x80000000;\n\t\t\n#ifdef MCDBGQ_NOLOCKFREE_FREELIST\n\t\tdebug::DebugMutex mutex;\n#endif\n\t};\n\t\n\t\n\t///////////////////////////\n\t// Block\n\t///////////////////////////\n\t\n\tenum InnerQueueContext { implicit_context = 0, explicit_context = 1 };\n\t\n\tstruct Block\n\t{\n\t\tBlock()\n\t\t\t: next(nullptr), elementsCompletelyDequeued(0), freeListRefs(0), freeListNext(nullptr), dynamicallyAllocated(true)\n\t\t{\n#ifdef MCDBGQ_TRACKMEM\n\t\t\towner = nullptr;\n#endif\n\t\t}\n\t\t\n\t\ttemplate<InnerQueueContext context>\n\t\tinline bool is_empty() const\n\t\t{\n\t\t\tMOODYCAMEL_CONSTEXPR_IF (context == explicit_context && BLOCK_SIZE <= EXPLICIT_BLOCK_EMPTY_COUNTER_THRESHOLD) {\n\t\t\t\t// Check flags\n\t\t\t\tfor (size_t i = 0; i < BLOCK_SIZE; ++i) {\n\t\t\t\t\tif (!emptyFlags[i].load(std::memory_order_relaxed)) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Aha, empty; make sure we have all other memory effects that happened before the empty flags were set\n\t\t\t\tstd::atomic_thread_fence(std::memory_order_acquire);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Check counter\n\t\t\t\tif (elementsCompletelyDequeued.load(std::memory_order_relaxed) == BLOCK_SIZE) {\n\t\t\t\t\tstd::atomic_thread_fence(std::memory_order_acquire);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tassert(elementsCompletelyDequeued.load(std::memory_order_relaxed) <= BLOCK_SIZE);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Returns true if the block is now empty (does not apply in explicit context)\n\t\ttemplate<InnerQueueContext context>\n\t\tinline bool set_empty(MOODYCAMEL_MAYBE_UNUSED index_t i)\n\t\t{\n\t\t\tMOODYCAMEL_CONSTEXPR_IF (context == explicit_context && BLOCK_SIZE <= EXPLICIT_BLOCK_EMPTY_COUNTER_THRESHOLD) {\n\t\t\t\t// Set flag\n\t\t\t\tassert(!emptyFlags[BLOCK_SIZE - 1 - static_cast<size_t>(i & static_cast<index_t>(BLOCK_SIZE - 1))].load(std::memory_order_relaxed));\n\t\t\t\temptyFlags[BLOCK_SIZE - 1 - static_cast<size_t>(i & static_cast<index_t>(BLOCK_SIZE - 1))].store(true, std::memory_order_release);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Increment counter\n\t\t\t\tauto prevVal = elementsCompletelyDequeued.fetch_add(1, std::memory_order_acq_rel);\n\t\t\t\tassert(prevVal < BLOCK_SIZE);\n\t\t\t\treturn prevVal == BLOCK_SIZE - 1;\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Sets multiple contiguous item statuses to 'empty' (assumes no wrapping and count > 0).\n\t\t// Returns true if the block is now empty (does not apply in explicit context).\n\t\ttemplate<InnerQueueContext context>\n\t\tinline bool set_many_empty(MOODYCAMEL_MAYBE_UNUSED index_t i, size_t count)\n\t\t{\n\t\t\tMOODYCAMEL_CONSTEXPR_IF (context == explicit_context && BLOCK_SIZE <= EXPLICIT_BLOCK_EMPTY_COUNTER_THRESHOLD) {\n\t\t\t\t// Set flags\n\t\t\t\tstd::atomic_thread_fence(std::memory_order_release);\n\t\t\t\ti = BLOCK_SIZE - 1 - static_cast<size_t>(i & static_cast<index_t>(BLOCK_SIZE - 1)) - count + 1;\n\t\t\t\tfor (size_t j = 0; j != count; ++j) {\n\t\t\t\t\tassert(!emptyFlags[i + j].load(std::memory_order_relaxed));\n\t\t\t\t\temptyFlags[i + j].store(true, std::memory_order_relaxed);\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Increment counter\n\t\t\t\tauto prevVal = elementsCompletelyDequeued.fetch_add(count, std::memory_order_acq_rel);\n\t\t\t\tassert(prevVal + count <= BLOCK_SIZE);\n\t\t\t\treturn prevVal + count == BLOCK_SIZE;\n\t\t\t}\n\t\t}\n\t\t\n\t\ttemplate<InnerQueueContext context>\n\t\tinline void set_all_empty()\n\t\t{\n\t\t\tMOODYCAMEL_CONSTEXPR_IF (context == explicit_context && BLOCK_SIZE <= EXPLICIT_BLOCK_EMPTY_COUNTER_THRESHOLD) {\n\t\t\t\t// Set all flags\n\t\t\t\tfor (size_t i = 0; i != BLOCK_SIZE; ++i) {\n\t\t\t\t\temptyFlags[i].store(true, std::memory_order_relaxed);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Reset counter\n\t\t\t\telementsCompletelyDequeued.store(BLOCK_SIZE, std::memory_order_relaxed);\n\t\t\t}\n\t\t}\n\t\t\n\t\ttemplate<InnerQueueContext context>\n\t\tinline void reset_empty()\n\t\t{\n\t\t\tMOODYCAMEL_CONSTEXPR_IF (context == explicit_context && BLOCK_SIZE <= EXPLICIT_BLOCK_EMPTY_COUNTER_THRESHOLD) {\n\t\t\t\t// Reset flags\n\t\t\t\tfor (size_t i = 0; i != BLOCK_SIZE; ++i) {\n\t\t\t\t\temptyFlags[i].store(false, std::memory_order_relaxed);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Reset counter\n\t\t\t\telementsCompletelyDequeued.store(0, std::memory_order_relaxed);\n\t\t\t}\n\t\t}\n\t\t\n\t\tinline T* operator[](index_t idx) MOODYCAMEL_NOEXCEPT { return static_cast<T*>(static_cast<void*>(elements)) + static_cast<size_t>(idx & static_cast<index_t>(BLOCK_SIZE - 1)); }\n\t\tinline T const* operator[](index_t idx) const MOODYCAMEL_NOEXCEPT { return static_cast<T const*>(static_cast<void const*>(elements)) + static_cast<size_t>(idx & static_cast<index_t>(BLOCK_SIZE - 1)); }\n\t\t\n\tprivate:\n\t\tstatic_assert(std::alignment_of<T>::value <= sizeof(T), \"The queue does not support types with an alignment greater than their size at this time\");\n\t\tMOODYCAMEL_ALIGNED_TYPE_LIKE(char[sizeof(T) * BLOCK_SIZE], T) elements;\n\tpublic:\n\t\tBlock* next;\n\t\tstd::atomic<size_t> elementsCompletelyDequeued;\n\t\tstd::atomic<bool> emptyFlags[BLOCK_SIZE <= EXPLICIT_BLOCK_EMPTY_COUNTER_THRESHOLD ? BLOCK_SIZE : 1];\n\tpublic:\n\t\tstd::atomic<std::uint32_t> freeListRefs;\n\t\tstd::atomic<Block*> freeListNext;\n\t\tbool dynamicallyAllocated;\t\t// Perhaps a better name for this would be 'isNotPartOfInitialBlockPool'\n\t\t\n#ifdef MCDBGQ_TRACKMEM\n\t\tvoid* owner;\n#endif\n\t};\n\tstatic_assert(std::alignment_of<Block>::value >= std::alignment_of<T>::value, \"Internal error: Blocks must be at least as aligned as the type they are wrapping\");\n\n\n#ifdef MCDBGQ_TRACKMEM\npublic:\n\tstruct MemStats;\nprivate:\n#endif\n\t\n\t///////////////////////////\n\t// Producer base\n\t///////////////////////////\n\t\n\tstruct ProducerBase : public details::ConcurrentQueueProducerTypelessBase\n\t{\n\t\tProducerBase(ConcurrentQueue* parent_, bool isExplicit_) :\n\t\t\ttailIndex(0),\n\t\t\theadIndex(0),\n\t\t\tdequeueOptimisticCount(0),\n\t\t\tdequeueOvercommit(0),\n\t\t\ttailBlock(nullptr),\n\t\t\tisExplicit(isExplicit_),\n\t\t\tparent(parent_)\n\t\t{\n\t\t}\n\t\t\n\t\tvirtual ~ProducerBase() { }\n\t\t\n\t\ttemplate<typename U>\n\t\tinline bool dequeue(U& element)\n\t\t{\n\t\t\tif (isExplicit) {\n\t\t\t\treturn static_cast<ExplicitProducer*>(this)->dequeue(element);\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn static_cast<ImplicitProducer*>(this)->dequeue(element);\n\t\t\t}\n\t\t}\n\t\t\n\t\ttemplate<typename It>\n\t\tinline size_t dequeue_bulk(It& itemFirst, size_t max)\n\t\t{\n\t\t\tif (isExplicit) {\n\t\t\t\treturn static_cast<ExplicitProducer*>(this)->dequeue_bulk(itemFirst, max);\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn static_cast<ImplicitProducer*>(this)->dequeue_bulk(itemFirst, max);\n\t\t\t}\n\t\t}\n\t\t\n\t\tinline ProducerBase* next_prod() const { return static_cast<ProducerBase*>(next); }\n\t\t\n\t\tinline size_t size_approx() const\n\t\t{\n\t\t\tauto tail = tailIndex.load(std::memory_order_relaxed);\n\t\t\tauto head = headIndex.load(std::memory_order_relaxed);\n\t\t\treturn details::circular_less_than(head, tail) ? static_cast<size_t>(tail - head) : 0;\n\t\t}\n\t\t\n\t\tinline index_t getTail() const { return tailIndex.load(std::memory_order_relaxed); }\n\tprotected:\n\t\tstd::atomic<index_t> tailIndex;\t\t// Where to enqueue to next\n\t\tstd::atomic<index_t> headIndex;\t\t// Where to dequeue from next\n\t\t\n\t\tstd::atomic<index_t> dequeueOptimisticCount;\n\t\tstd::atomic<index_t> dequeueOvercommit;\n\t\t\n\t\tBlock* tailBlock;\n\t\t\n\tpublic:\n\t\tbool isExplicit;\n\t\tConcurrentQueue* parent;\n\t\t\n\tprotected:\n#ifdef MCDBGQ_TRACKMEM\n\t\tfriend struct MemStats;\n#endif\n\t};\n\t\n\t\n\t///////////////////////////\n\t// Explicit queue\n\t///////////////////////////\n\t\t\n\tstruct ExplicitProducer : public ProducerBase\n\t{\n\t\texplicit ExplicitProducer(ConcurrentQueue* parent_) :\n\t\t\tProducerBase(parent_, true),\n\t\t\tblockIndex(nullptr),\n\t\t\tpr_blockIndexSlotsUsed(0),\n\t\t\tpr_blockIndexSize(EXPLICIT_INITIAL_INDEX_SIZE >> 1),\n\t\t\tpr_blockIndexFront(0),\n\t\t\tpr_blockIndexEntries(nullptr),\n\t\t\tpr_blockIndexRaw(nullptr)\n\t\t{\n\t\t\tsize_t poolBasedIndexSize = details::ceil_to_pow_2(parent_->initialBlockPoolSize) >> 1;\n\t\t\tif (poolBasedIndexSize > pr_blockIndexSize) {\n\t\t\t\tpr_blockIndexSize = poolBasedIndexSize;\n\t\t\t}\n\t\t\t\n\t\t\tnew_block_index(0);\t\t// This creates an index with double the number of current entries, i.e. EXPLICIT_INITIAL_INDEX_SIZE\n\t\t}\n\t\t\n\t\t~ExplicitProducer()\n\t\t{\n\t\t\t// Destruct any elements not yet dequeued.\n\t\t\t// Since we're in the destructor, we can assume all elements\n\t\t\t// are either completely dequeued or completely not (no halfways).\n\t\t\tif (this->tailBlock != nullptr) {\t\t// Note this means there must be a block index too\n\t\t\t\t// First find the block that's partially dequeued, if any\n\t\t\t\tBlock* halfDequeuedBlock = nullptr;\n\t\t\t\tif ((this->headIndex.load(std::memory_order_relaxed) & static_cast<index_t>(BLOCK_SIZE - 1)) != 0) {\n\t\t\t\t\t// The head's not on a block boundary, meaning a block somewhere is partially dequeued\n\t\t\t\t\t// (or the head block is the tail block and was fully dequeued, but the head/tail are still not on a boundary)\n\t\t\t\t\tsize_t i = (pr_blockIndexFront - pr_blockIndexSlotsUsed) & (pr_blockIndexSize - 1);\n\t\t\t\t\twhile (details::circular_less_than<index_t>(pr_blockIndexEntries[i].base + BLOCK_SIZE, this->headIndex.load(std::memory_order_relaxed))) {\n\t\t\t\t\t\ti = (i + 1) & (pr_blockIndexSize - 1);\n\t\t\t\t\t}\n\t\t\t\t\tassert(details::circular_less_than<index_t>(pr_blockIndexEntries[i].base, this->headIndex.load(std::memory_order_relaxed)));\n\t\t\t\t\thalfDequeuedBlock = pr_blockIndexEntries[i].block;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Start at the head block (note the first line in the loop gives us the head from the tail on the first iteration)\n\t\t\t\tauto block = this->tailBlock;\n\t\t\t\tdo {\n\t\t\t\t\tblock = block->next;\n\t\t\t\t\tif (block->ConcurrentQueue::Block::template is_empty<explicit_context>()) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tsize_t i = 0;\t// Offset into block\n\t\t\t\t\tif (block == halfDequeuedBlock) {\n\t\t\t\t\t\ti = static_cast<size_t>(this->headIndex.load(std::memory_order_relaxed) & static_cast<index_t>(BLOCK_SIZE - 1));\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// Walk through all the items in the block; if this is the tail block, we need to stop when we reach the tail index\n\t\t\t\t\tauto lastValidIndex = (this->tailIndex.load(std::memory_order_relaxed) & static_cast<index_t>(BLOCK_SIZE - 1)) == 0 ? BLOCK_SIZE : static_cast<size_t>(this->tailIndex.load(std::memory_order_relaxed) & static_cast<index_t>(BLOCK_SIZE - 1));\n\t\t\t\t\twhile (i != BLOCK_SIZE && (block != this->tailBlock || i != lastValidIndex)) {\n\t\t\t\t\t\t(*block)[i++]->~T();\n\t\t\t\t\t}\n\t\t\t\t} while (block != this->tailBlock);\n\t\t\t}\n\t\t\t\n\t\t\t// Destroy all blocks that we own\n\t\t\tif (this->tailBlock != nullptr) {\n\t\t\t\tauto block = this->tailBlock;\n\t\t\t\tdo {\n\t\t\t\t\tauto nextBlock = block->next;\n\t\t\t\t\tthis->parent->add_block_to_free_list(block);\n\t\t\t\t\tblock = nextBlock;\n\t\t\t\t} while (block != this->tailBlock);\n\t\t\t}\n\t\t\t\n\t\t\t// Destroy the block indices\n\t\t\tauto header = static_cast<BlockIndexHeader*>(pr_blockIndexRaw);\n\t\t\twhile (header != nullptr) {\n\t\t\t\tauto prev = static_cast<BlockIndexHeader*>(header->prev);\n\t\t\t\theader->~BlockIndexHeader();\n\t\t\t\t(Traits::free)(header);\n\t\t\t\theader = prev;\n\t\t\t}\n\t\t}\n\t\t\n\t\ttemplate<AllocationMode allocMode, typename U>\n\t\tinline bool enqueue(U&& element)\n\t\t{\n\t\t\tindex_t currentTailIndex = this->tailIndex.load(std::memory_order_relaxed);\n\t\t\tindex_t newTailIndex = 1 + currentTailIndex;\n\t\t\tif ((currentTailIndex & static_cast<index_t>(BLOCK_SIZE - 1)) == 0) {\n\t\t\t\t// We reached the end of a block, start a new one\n\t\t\t\tauto startBlock = this->tailBlock;\n\t\t\t\tauto originalBlockIndexSlotsUsed = pr_blockIndexSlotsUsed;\n\t\t\t\tif (this->tailBlock != nullptr && this->tailBlock->next->ConcurrentQueue::Block::template is_empty<explicit_context>()) {\n\t\t\t\t\t// We can re-use the block ahead of us, it's empty!\t\t\t\t\t\n\t\t\t\t\tthis->tailBlock = this->tailBlock->next;\n\t\t\t\t\tthis->tailBlock->ConcurrentQueue::Block::template reset_empty<explicit_context>();\n\t\t\t\t\t\n\t\t\t\t\t// We'll put the block on the block index (guaranteed to be room since we're conceptually removing the\n\t\t\t\t\t// last block from it first -- except instead of removing then adding, we can just overwrite).\n\t\t\t\t\t// Note that there must be a valid block index here, since even if allocation failed in the ctor,\n\t\t\t\t\t// it would have been re-attempted when adding the first block to the queue; since there is such\n\t\t\t\t\t// a block, a block index must have been successfully allocated.\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Whatever head value we see here is >= the last value we saw here (relatively),\n\t\t\t\t\t// and <= its current value. Since we have the most recent tail, the head must be\n\t\t\t\t\t// <= to it.\n\t\t\t\t\tauto head = this->headIndex.load(std::memory_order_relaxed);\n\t\t\t\t\tassert(!details::circular_less_than<index_t>(currentTailIndex, head));\n\t\t\t\t\tif (!details::circular_less_than<index_t>(head, currentTailIndex + BLOCK_SIZE)\n\t\t\t\t\t\t|| (MAX_SUBQUEUE_SIZE != details::const_numeric_max<size_t>::value && (MAX_SUBQUEUE_SIZE == 0 || MAX_SUBQUEUE_SIZE - BLOCK_SIZE < currentTailIndex - head))) {\n\t\t\t\t\t\t// We can't enqueue in another block because there's not enough leeway -- the\n\t\t\t\t\t\t// tail could surpass the head by the time the block fills up! (Or we'll exceed\n\t\t\t\t\t\t// the size limit, if the second part of the condition was true.)\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\t// We're going to need a new block; check that the block index has room\n\t\t\t\t\tif (pr_blockIndexRaw == nullptr || pr_blockIndexSlotsUsed == pr_blockIndexSize) {\n\t\t\t\t\t\t// Hmm, the circular block index is already full -- we'll need\n\t\t\t\t\t\t// to allocate a new index. Note pr_blockIndexRaw can only be nullptr if\n\t\t\t\t\t\t// the initial allocation failed in the constructor.\n\t\t\t\t\t\t\n\t\t\t\t\t\tMOODYCAMEL_CONSTEXPR_IF (allocMode == CannotAlloc) {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (!new_block_index(pr_blockIndexSlotsUsed)) {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// Insert a new block in the circular linked list\n\t\t\t\t\tauto newBlock = this->parent->ConcurrentQueue::template requisition_block<allocMode>();\n\t\t\t\t\tif (newBlock == nullptr) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n#ifdef MCDBGQ_TRACKMEM\n\t\t\t\t\tnewBlock->owner = this;\n#endif\n\t\t\t\t\tnewBlock->ConcurrentQueue::Block::template reset_empty<explicit_context>();\n\t\t\t\t\tif (this->tailBlock == nullptr) {\n\t\t\t\t\t\tnewBlock->next = newBlock;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tnewBlock->next = this->tailBlock->next;\n\t\t\t\t\t\tthis->tailBlock->next = newBlock;\n\t\t\t\t\t}\n\t\t\t\t\tthis->tailBlock = newBlock;\n\t\t\t\t\t++pr_blockIndexSlotsUsed;\n\t\t\t\t}\n\n\t\t\t\tMOODYCAMEL_CONSTEXPR_IF (!MOODYCAMEL_NOEXCEPT_CTOR(T, U, new (static_cast<T*>(nullptr)) T(std::forward<U>(element)))) {\n\t\t\t\t\t// The constructor may throw. We want the element not to appear in the queue in\n\t\t\t\t\t// that case (without corrupting the queue):\n\t\t\t\t\tMOODYCAMEL_TRY {\n\t\t\t\t\t\tnew ((*this->tailBlock)[currentTailIndex]) T(std::forward<U>(element));\n\t\t\t\t\t}\n\t\t\t\t\tMOODYCAMEL_CATCH (...) {\n\t\t\t\t\t\t// Revert change to the current block, but leave the new block available\n\t\t\t\t\t\t// for next time\n\t\t\t\t\t\tpr_blockIndexSlotsUsed = originalBlockIndexSlotsUsed;\n\t\t\t\t\t\tthis->tailBlock = startBlock == nullptr ? this->tailBlock : startBlock;\n\t\t\t\t\t\tMOODYCAMEL_RETHROW;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t(void)startBlock;\n\t\t\t\t\t(void)originalBlockIndexSlotsUsed;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Add block to block index\n\t\t\t\tauto& entry = blockIndex.load(std::memory_order_relaxed)->entries[pr_blockIndexFront];\n\t\t\t\tentry.base = currentTailIndex;\n\t\t\t\tentry.block = this->tailBlock;\n\t\t\t\tblockIndex.load(std::memory_order_relaxed)->front.store(pr_blockIndexFront, std::memory_order_release);\n\t\t\t\tpr_blockIndexFront = (pr_blockIndexFront + 1) & (pr_blockIndexSize - 1);\n\t\t\t\t\n\t\t\t\tMOODYCAMEL_CONSTEXPR_IF (!MOODYCAMEL_NOEXCEPT_CTOR(T, U, new (static_cast<T*>(nullptr)) T(std::forward<U>(element)))) {\n\t\t\t\t\tthis->tailIndex.store(newTailIndex, std::memory_order_release);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t// Enqueue\n\t\t\tnew ((*this->tailBlock)[currentTailIndex]) T(std::forward<U>(element));\n\t\t\t\n\t\t\tthis->tailIndex.store(newTailIndex, std::memory_order_release);\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\ttemplate<typename U>\n\t\tbool dequeue(U& element)\n\t\t{\n\t\t\tauto tail = this->tailIndex.load(std::memory_order_relaxed);\n\t\t\tauto overcommit = this->dequeueOvercommit.load(std::memory_order_relaxed);\n\t\t\tif (details::circular_less_than<index_t>(this->dequeueOptimisticCount.load(std::memory_order_relaxed) - overcommit, tail)) {\n\t\t\t\t// Might be something to dequeue, let's give it a try\n\t\t\t\t\n\t\t\t\t// Note that this if is purely for performance purposes in the common case when the queue is\n\t\t\t\t// empty and the values are eventually consistent -- we may enter here spuriously.\n\t\t\t\t\n\t\t\t\t// Note that whatever the values of overcommit and tail are, they are not going to change (unless we\n\t\t\t\t// change them) and must be the same value at this point (inside the if) as when the if condition was\n\t\t\t\t// evaluated.\n\n\t\t\t\t// We insert an acquire fence here to synchronize-with the release upon incrementing dequeueOvercommit below.\n\t\t\t\t// This ensures that whatever the value we got loaded into overcommit, the load of dequeueOptisticCount in\n\t\t\t\t// the fetch_add below will result in a value at least as recent as that (and therefore at least as large).\n\t\t\t\t// Note that I believe a compiler (signal) fence here would be sufficient due to the nature of fetch_add (all\n\t\t\t\t// read-modify-write operations are guaranteed to work on the latest value in the modification order), but\n\t\t\t\t// unfortunately that can't be shown to be correct using only the C++11 standard.\n\t\t\t\t// See http://stackoverflow.com/questions/18223161/what-are-the-c11-memory-ordering-guarantees-in-this-corner-case\n\t\t\t\tstd::atomic_thread_fence(std::memory_order_acquire);\n\t\t\t\t\n\t\t\t\t// Increment optimistic counter, then check if it went over the boundary\n\t\t\t\tauto myDequeueCount = this->dequeueOptimisticCount.fetch_add(1, std::memory_order_relaxed);\n\t\t\t\t\n\t\t\t\t// Note that since dequeueOvercommit must be <= dequeueOptimisticCount (because dequeueOvercommit is only ever\n\t\t\t\t// incremented after dequeueOptimisticCount -- this is enforced in the `else` block below), and since we now\n\t\t\t\t// have a version of dequeueOptimisticCount that is at least as recent as overcommit (due to the release upon\n\t\t\t\t// incrementing dequeueOvercommit and the acquire above that synchronizes with it), overcommit <= myDequeueCount.\n\t\t\t\t// However, we can't assert this since both dequeueOptimisticCount and dequeueOvercommit may (independently)\n\t\t\t\t// overflow; in such a case, though, the logic still holds since the difference between the two is maintained.\n\t\t\t\t\n\t\t\t\t// Note that we reload tail here in case it changed; it will be the same value as before or greater, since\n\t\t\t\t// this load is sequenced after (happens after) the earlier load above. This is supported by read-read\n\t\t\t\t// coherency (as defined in the standard), explained here: http://en.cppreference.com/w/cpp/atomic/memory_order\n\t\t\t\ttail = this->tailIndex.load(std::memory_order_acquire);\n\t\t\t\tif ((details::likely)(details::circular_less_than<index_t>(myDequeueCount - overcommit, tail))) {\n\t\t\t\t\t// Guaranteed to be at least one element to dequeue!\n\t\t\t\t\t\n\t\t\t\t\t// Get the index. Note that since there's guaranteed to be at least one element, this\n\t\t\t\t\t// will never exceed tail. We need to do an acquire-release fence here since it's possible\n\t\t\t\t\t// that whatever condition got us to this point was for an earlier enqueued element (that\n\t\t\t\t\t// we already see the memory effects for), but that by the time we increment somebody else\n\t\t\t\t\t// has incremented it, and we need to see the memory effects for *that* element, which is\n\t\t\t\t\t// in such a case is necessarily visible on the thread that incremented it in the first\n\t\t\t\t\t// place with the more current condition (they must have acquired a tail that is at least\n\t\t\t\t\t// as recent).\n\t\t\t\t\tauto index = this->headIndex.fetch_add(1, std::memory_order_acq_rel);\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t// Determine which block the element is in\n\t\t\t\t\t\n\t\t\t\t\tauto localBlockIndex = blockIndex.load(std::memory_order_acquire);\n\t\t\t\t\tauto localBlockIndexHead = localBlockIndex->front.load(std::memory_order_acquire);\n\t\t\t\t\t\n\t\t\t\t\t// We need to be careful here about subtracting and dividing because of index wrap-around.\n\t\t\t\t\t// When an index wraps, we need to preserve the sign of the offset when dividing it by the\n\t\t\t\t\t// block size (in order to get a correct signed block count offset in all cases):\n\t\t\t\t\tauto headBase = localBlockIndex->entries[localBlockIndexHead].base;\n\t\t\t\t\tauto blockBaseIndex = index & ~static_cast<index_t>(BLOCK_SIZE - 1);\n\t\t\t\t\tauto offset = static_cast<size_t>(static_cast<typename std::make_signed<index_t>::type>(blockBaseIndex - headBase) / static_cast<typename std::make_signed<index_t>::type>(BLOCK_SIZE));\n\t\t\t\t\tauto block = localBlockIndex->entries[(localBlockIndexHead + offset) & (localBlockIndex->size - 1)].block;\n\t\t\t\t\t\n\t\t\t\t\t// Dequeue\n\t\t\t\t\tauto& el = *((*block)[index]);\n\t\t\t\t\tif (!MOODYCAMEL_NOEXCEPT_ASSIGN(T, T&&, element = std::move(el))) {\n\t\t\t\t\t\t// Make sure the element is still fully dequeued and destroyed even if the assignment\n\t\t\t\t\t\t// throws\n\t\t\t\t\t\tstruct Guard {\n\t\t\t\t\t\t\tBlock* block;\n\t\t\t\t\t\t\tindex_t index;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t~Guard()\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t(*block)[index]->~T();\n\t\t\t\t\t\t\t\tblock->ConcurrentQueue::Block::template set_empty<explicit_context>(index);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} guard = { block, index };\n\n\t\t\t\t\t\telement = std::move(el); // NOLINT\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\telement = std::move(el); // NOLINT\n\t\t\t\t\t\tel.~T(); // NOLINT\n\t\t\t\t\t\tblock->ConcurrentQueue::Block::template set_empty<explicit_context>(index);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Wasn't anything to dequeue after all; make the effective dequeue count eventually consistent\n\t\t\t\t\tthis->dequeueOvercommit.fetch_add(1, std::memory_order_release);\t\t// Release so that the fetch_add on dequeueOptimisticCount is guaranteed to happen before this write\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\ttemplate<AllocationMode allocMode, typename It>\n\t\tbool MOODYCAMEL_NO_TSAN enqueue_bulk(It itemFirst, size_t count)\n\t\t{\n\t\t\t// First, we need to make sure we have enough room to enqueue all of the elements;\n\t\t\t// this means pre-allocating blocks and putting them in the block index (but only if\n\t\t\t// all the allocations succeeded).\n\t\t\tindex_t startTailIndex = this->tailIndex.load(std::memory_order_relaxed);\n\t\t\tauto startBlock = this->tailBlock;\n\t\t\tauto originalBlockIndexFront = pr_blockIndexFront;\n\t\t\tauto originalBlockIndexSlotsUsed = pr_blockIndexSlotsUsed;\n\t\t\t\n\t\t\tBlock* firstAllocatedBlock = nullptr;\n\t\t\t\n\t\t\t// Figure out how many blocks we'll need to allocate, and do so\n\t\t\tsize_t blockBaseDiff = ((startTailIndex + count - 1) & ~static_cast<index_t>(BLOCK_SIZE - 1)) - ((startTailIndex - 1) & ~static_cast<index_t>(BLOCK_SIZE - 1));\n\t\t\tindex_t currentTailIndex = (startTailIndex - 1) & ~static_cast<index_t>(BLOCK_SIZE - 1);\n\t\t\tif (blockBaseDiff > 0) {\n\t\t\t\t// Allocate as many blocks as possible from ahead\n\t\t\t\twhile (blockBaseDiff > 0 && this->tailBlock != nullptr && this->tailBlock->next != firstAllocatedBlock && this->tailBlock->next->ConcurrentQueue::Block::template is_empty<explicit_context>()) {\n\t\t\t\t\tblockBaseDiff -= static_cast<index_t>(BLOCK_SIZE);\n\t\t\t\t\tcurrentTailIndex += static_cast<index_t>(BLOCK_SIZE);\n\t\t\t\t\t\n\t\t\t\t\tthis->tailBlock = this->tailBlock->next;\n\t\t\t\t\tfirstAllocatedBlock = firstAllocatedBlock == nullptr ? this->tailBlock : firstAllocatedBlock;\n\t\t\t\t\t\n\t\t\t\t\tauto& entry = blockIndex.load(std::memory_order_relaxed)->entries[pr_blockIndexFront];\n\t\t\t\t\tentry.base = currentTailIndex;\n\t\t\t\t\tentry.block = this->tailBlock;\n\t\t\t\t\tpr_blockIndexFront = (pr_blockIndexFront + 1) & (pr_blockIndexSize - 1);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Now allocate as many blocks as necessary from the block pool\n\t\t\t\twhile (blockBaseDiff > 0) {\n\t\t\t\t\tblockBaseDiff -= static_cast<index_t>(BLOCK_SIZE);\n\t\t\t\t\tcurrentTailIndex += static_cast<index_t>(BLOCK_SIZE);\n\t\t\t\t\t\n\t\t\t\t\tauto head = this->headIndex.load(std::memory_order_relaxed);\n\t\t\t\t\tassert(!details::circular_less_than<index_t>(currentTailIndex, head));\n\t\t\t\t\tbool full = !details::circular_less_than<index_t>(head, currentTailIndex + BLOCK_SIZE) || (MAX_SUBQUEUE_SIZE != details::const_numeric_max<size_t>::value && (MAX_SUBQUEUE_SIZE == 0 || MAX_SUBQUEUE_SIZE - BLOCK_SIZE < currentTailIndex - head));\n\t\t\t\t\tif (pr_blockIndexRaw == nullptr || pr_blockIndexSlotsUsed == pr_blockIndexSize || full) {\n\t\t\t\t\t\tMOODYCAMEL_CONSTEXPR_IF (allocMode == CannotAlloc) {\n\t\t\t\t\t\t\t// Failed to allocate, undo changes (but keep injected blocks)\n\t\t\t\t\t\t\tpr_blockIndexFront = originalBlockIndexFront;\n\t\t\t\t\t\t\tpr_blockIndexSlotsUsed = originalBlockIndexSlotsUsed;\n\t\t\t\t\t\t\tthis->tailBlock = startBlock == nullptr ? firstAllocatedBlock : startBlock;\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (full || !new_block_index(originalBlockIndexSlotsUsed)) {\n\t\t\t\t\t\t\t// Failed to allocate, undo changes (but keep injected blocks)\n\t\t\t\t\t\t\tpr_blockIndexFront = originalBlockIndexFront;\n\t\t\t\t\t\t\tpr_blockIndexSlotsUsed = originalBlockIndexSlotsUsed;\n\t\t\t\t\t\t\tthis->tailBlock = startBlock == nullptr ? firstAllocatedBlock : startBlock;\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t// pr_blockIndexFront is updated inside new_block_index, so we need to\n\t\t\t\t\t\t// update our fallback value too (since we keep the new index even if we\n\t\t\t\t\t\t// later fail)\n\t\t\t\t\t\toriginalBlockIndexFront = originalBlockIndexSlotsUsed;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// Insert a new block in the circular linked list\n\t\t\t\t\tauto newBlock = this->parent->ConcurrentQueue::template requisition_block<allocMode>();\n\t\t\t\t\tif (newBlock == nullptr) {\n\t\t\t\t\t\tpr_blockIndexFront = originalBlockIndexFront;\n\t\t\t\t\t\tpr_blockIndexSlotsUsed = originalBlockIndexSlotsUsed;\n\t\t\t\t\t\tthis->tailBlock = startBlock == nullptr ? firstAllocatedBlock : startBlock;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\t\n#ifdef MCDBGQ_TRACKMEM\n\t\t\t\t\tnewBlock->owner = this;\n#endif\n\t\t\t\t\tnewBlock->ConcurrentQueue::Block::template set_all_empty<explicit_context>();\n\t\t\t\t\tif (this->tailBlock == nullptr) {\n\t\t\t\t\t\tnewBlock->next = newBlock;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tnewBlock->next = this->tailBlock->next;\n\t\t\t\t\t\tthis->tailBlock->next = newBlock;\n\t\t\t\t\t}\n\t\t\t\t\tthis->tailBlock = newBlock;\n\t\t\t\t\tfirstAllocatedBlock = firstAllocatedBlock == nullptr ? this->tailBlock : firstAllocatedBlock;\n\t\t\t\t\t\n\t\t\t\t\t++pr_blockIndexSlotsUsed;\n\t\t\t\t\t\n\t\t\t\t\tauto& entry = blockIndex.load(std::memory_order_relaxed)->entries[pr_blockIndexFront];\n\t\t\t\t\tentry.base = currentTailIndex;\n\t\t\t\t\tentry.block = this->tailBlock;\n\t\t\t\t\tpr_blockIndexFront = (pr_blockIndexFront + 1) & (pr_blockIndexSize - 1);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Excellent, all allocations succeeded. Reset each block's emptiness before we fill them up, and\n\t\t\t\t// publish the new block index front\n\t\t\t\tauto block = firstAllocatedBlock;\n\t\t\t\twhile (true) {\n\t\t\t\t\tblock->ConcurrentQueue::Block::template reset_empty<explicit_context>();\n\t\t\t\t\tif (block == this->tailBlock) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tblock = block->next;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tMOODYCAMEL_CONSTEXPR_IF (MOODYCAMEL_NOEXCEPT_CTOR(T, decltype(*itemFirst), new (static_cast<T*>(nullptr)) T(details::deref_noexcept(itemFirst)))) {\n\t\t\t\t\tblockIndex.load(std::memory_order_relaxed)->front.store((pr_blockIndexFront - 1) & (pr_blockIndexSize - 1), std::memory_order_release);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t// Enqueue, one block at a time\n\t\t\tindex_t newTailIndex = startTailIndex + static_cast<index_t>(count);\n\t\t\tcurrentTailIndex = startTailIndex;\n\t\t\tauto endBlock = this->tailBlock;\n\t\t\tthis->tailBlock = startBlock;\n\t\t\tassert((startTailIndex & static_cast<index_t>(BLOCK_SIZE - 1)) != 0 || firstAllocatedBlock != nullptr || count == 0);\n\t\t\tif ((startTailIndex & static_cast<index_t>(BLOCK_SIZE - 1)) == 0 && firstAllocatedBlock != nullptr) {\n\t\t\t\tthis->tailBlock = firstAllocatedBlock;\n\t\t\t}\n\t\t\twhile (true) {\n\t\t\t\tindex_t stopIndex = (currentTailIndex & ~static_cast<index_t>(BLOCK_SIZE - 1)) + static_cast<index_t>(BLOCK_SIZE);\n\t\t\t\tif (details::circular_less_than<index_t>(newTailIndex, stopIndex)) {\n\t\t\t\t\tstopIndex = newTailIndex;\n\t\t\t\t}\n\t\t\t\tMOODYCAMEL_CONSTEXPR_IF (MOODYCAMEL_NOEXCEPT_CTOR(T, decltype(*itemFirst), new (static_cast<T*>(nullptr)) T(details::deref_noexcept(itemFirst)))) {\n\t\t\t\t\twhile (currentTailIndex != stopIndex) {\n\t\t\t\t\t\tnew ((*this->tailBlock)[currentTailIndex++]) T(*itemFirst++);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tMOODYCAMEL_TRY {\n\t\t\t\t\t\twhile (currentTailIndex != stopIndex) {\n\t\t\t\t\t\t\t// Must use copy constructor even if move constructor is available\n\t\t\t\t\t\t\t// because we may have to revert if there's an exception.\n\t\t\t\t\t\t\t// Sorry about the horrible templated next line, but it was the only way\n\t\t\t\t\t\t\t// to disable moving *at compile time*, which is important because a type\n\t\t\t\t\t\t\t// may only define a (noexcept) move constructor, and so calls to the\n\t\t\t\t\t\t\t// cctor will not compile, even if they are in an if branch that will never\n\t\t\t\t\t\t\t// be executed\n\t\t\t\t\t\t\tnew ((*this->tailBlock)[currentTailIndex]) T(details::nomove_if<!MOODYCAMEL_NOEXCEPT_CTOR(T, decltype(*itemFirst), new (static_cast<T*>(nullptr)) T(details::deref_noexcept(itemFirst)))>::eval(*itemFirst));\n\t\t\t\t\t\t\t++currentTailIndex;\n\t\t\t\t\t\t\t++itemFirst;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tMOODYCAMEL_CATCH (...) {\n\t\t\t\t\t\t// Oh dear, an exception's been thrown -- destroy the elements that\n\t\t\t\t\t\t// were enqueued so far and revert the entire bulk operation (we'll keep\n\t\t\t\t\t\t// any allocated blocks in our linked list for later, though).\n\t\t\t\t\t\tauto constructedStopIndex = currentTailIndex;\n\t\t\t\t\t\tauto lastBlockEnqueued = this->tailBlock;\n\t\t\t\t\t\t\n\t\t\t\t\t\tpr_blockIndexFront = originalBlockIndexFront;\n\t\t\t\t\t\tpr_blockIndexSlotsUsed = originalBlockIndexSlotsUsed;\n\t\t\t\t\t\tthis->tailBlock = startBlock == nullptr ? firstAllocatedBlock : startBlock;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (!details::is_trivially_destructible<T>::value) {\n\t\t\t\t\t\t\tauto block = startBlock;\n\t\t\t\t\t\t\tif ((startTailIndex & static_cast<index_t>(BLOCK_SIZE - 1)) == 0) {\n\t\t\t\t\t\t\t\tblock = firstAllocatedBlock;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcurrentTailIndex = startTailIndex;\n\t\t\t\t\t\t\twhile (true) {\n\t\t\t\t\t\t\t\tstopIndex = (currentTailIndex & ~static_cast<index_t>(BLOCK_SIZE - 1)) + static_cast<index_t>(BLOCK_SIZE);\n\t\t\t\t\t\t\t\tif (details::circular_less_than<index_t>(constructedStopIndex, stopIndex)) {\n\t\t\t\t\t\t\t\t\tstopIndex = constructedStopIndex;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twhile (currentTailIndex != stopIndex) {\n\t\t\t\t\t\t\t\t\t(*block)[currentTailIndex++]->~T();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (block == lastBlockEnqueued) {\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tblock = block->next;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tMOODYCAMEL_RETHROW;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (this->tailBlock == endBlock) {\n\t\t\t\t\tassert(currentTailIndex == newTailIndex);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tthis->tailBlock = this->tailBlock->next;\n\t\t\t}\n\t\t\t\n\t\t\tMOODYCAMEL_CONSTEXPR_IF (!MOODYCAMEL_NOEXCEPT_CTOR(T, decltype(*itemFirst), new (static_cast<T*>(nullptr)) T(details::deref_noexcept(itemFirst)))) {\n\t\t\t\tif (firstAllocatedBlock != nullptr)\n\t\t\t\t\tblockIndex.load(std::memory_order_relaxed)->front.store((pr_blockIndexFront - 1) & (pr_blockIndexSize - 1), std::memory_order_release);\n\t\t\t}\n\t\t\t\n\t\t\tthis->tailIndex.store(newTailIndex, std::memory_order_release);\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\ttemplate<typename It>\n\t\tsize_t dequeue_bulk(It& itemFirst, size_t max)\n\t\t{\n\t\t\tauto tail = this->tailIndex.load(std::memory_order_relaxed);\n\t\t\tauto overcommit = this->dequeueOvercommit.load(std::memory_order_relaxed);\n\t\t\tauto desiredCount = static_cast<size_t>(tail - (this->dequeueOptimisticCount.load(std::memory_order_relaxed) - overcommit));\n\t\t\tif (details::circular_less_than<size_t>(0, desiredCount)) {\n\t\t\t\tdesiredCount = desiredCount < max ? desiredCount : max;\n\t\t\t\tstd::atomic_thread_fence(std::memory_order_acquire);\n\t\t\t\t\n\t\t\t\tauto myDequeueCount = this->dequeueOptimisticCount.fetch_add(desiredCount, std::memory_order_relaxed);\n\t\t\t\t\n\t\t\t\ttail = this->tailIndex.load(std::memory_order_acquire);\n\t\t\t\tauto actualCount = static_cast<size_t>(tail - (myDequeueCount - overcommit));\n\t\t\t\tif (details::circular_less_than<size_t>(0, actualCount)) {\n\t\t\t\t\tactualCount = desiredCount < actualCount ? desiredCount : actualCount;\n\t\t\t\t\tif (actualCount < desiredCount) {\n\t\t\t\t\t\tthis->dequeueOvercommit.fetch_add(desiredCount - actualCount, std::memory_order_release);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// Get the first index. Note that since there's guaranteed to be at least actualCount elements, this\n\t\t\t\t\t// will never exceed tail.\n\t\t\t\t\tauto firstIndex = this->headIndex.fetch_add(actualCount, std::memory_order_acq_rel);\n\t\t\t\t\t\n\t\t\t\t\t// Determine which block the first element is in\n\t\t\t\t\tauto localBlockIndex = blockIndex.load(std::memory_order_acquire);\n\t\t\t\t\tauto localBlockIndexHead = localBlockIndex->front.load(std::memory_order_acquire);\n\t\t\t\t\t\n\t\t\t\t\tauto headBase = localBlockIndex->entries[localBlockIndexHead].base;\n\t\t\t\t\tauto firstBlockBaseIndex = firstIndex & ~static_cast<index_t>(BLOCK_SIZE - 1);\n\t\t\t\t\tauto offset = static_cast<size_t>(static_cast<typename std::make_signed<index_t>::type>(firstBlockBaseIndex - headBase) / static_cast<typename std::make_signed<index_t>::type>(BLOCK_SIZE));\n\t\t\t\t\tauto indexIndex = (localBlockIndexHead + offset) & (localBlockIndex->size - 1);\n\t\t\t\t\t\n\t\t\t\t\t// Iterate the blocks and dequeue\n\t\t\t\t\tauto index = firstIndex;\n\t\t\t\t\tdo {\n\t\t\t\t\t\tauto firstIndexInBlock = index;\n\t\t\t\t\t\tindex_t endIndex = (index & ~static_cast<index_t>(BLOCK_SIZE - 1)) + static_cast<index_t>(BLOCK_SIZE);\n\t\t\t\t\t\tendIndex = details::circular_less_than<index_t>(firstIndex + static_cast<index_t>(actualCount), endIndex) ? firstIndex + static_cast<index_t>(actualCount) : endIndex;\n\t\t\t\t\t\tauto block = localBlockIndex->entries[indexIndex].block;\n\t\t\t\t\t\tif (MOODYCAMEL_NOEXCEPT_ASSIGN(T, T&&, details::deref_noexcept(itemFirst) = std::move((*(*block)[index])))) {\n\t\t\t\t\t\t\twhile (index != endIndex) {\n\t\t\t\t\t\t\t\tauto& el = *((*block)[index]);\n\t\t\t\t\t\t\t\t*itemFirst++ = std::move(el);\n\t\t\t\t\t\t\t\tel.~T();\n\t\t\t\t\t\t\t\t++index;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tMOODYCAMEL_TRY {\n\t\t\t\t\t\t\t\twhile (index != endIndex) {\n\t\t\t\t\t\t\t\t\tauto& el = *((*block)[index]);\n\t\t\t\t\t\t\t\t\t*itemFirst = std::move(el);\n\t\t\t\t\t\t\t\t\t++itemFirst;\n\t\t\t\t\t\t\t\t\tel.~T();\n\t\t\t\t\t\t\t\t\t++index;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tMOODYCAMEL_CATCH (...) {\n\t\t\t\t\t\t\t\t// It's too late to revert the dequeue, but we can make sure that all\n\t\t\t\t\t\t\t\t// the dequeued objects are properly destroyed and the block index\n\t\t\t\t\t\t\t\t// (and empty count) are properly updated before we propagate the exception\n\t\t\t\t\t\t\t\tdo {\n\t\t\t\t\t\t\t\t\tblock = localBlockIndex->entries[indexIndex].block;\n\t\t\t\t\t\t\t\t\twhile (index != endIndex) {\n\t\t\t\t\t\t\t\t\t\t(*block)[index++]->~T();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tblock->ConcurrentQueue::Block::template set_many_empty<explicit_context>(firstIndexInBlock, static_cast<size_t>(endIndex - firstIndexInBlock));\n\t\t\t\t\t\t\t\t\tindexIndex = (indexIndex + 1) & (localBlockIndex->size - 1);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tfirstIndexInBlock = index;\n\t\t\t\t\t\t\t\t\tendIndex = (index & ~static_cast<index_t>(BLOCK_SIZE - 1)) + static_cast<index_t>(BLOCK_SIZE);\n\t\t\t\t\t\t\t\t\tendIndex = details::circular_less_than<index_t>(firstIndex + static_cast<index_t>(actualCount), endIndex) ? firstIndex + static_cast<index_t>(actualCount) : endIndex;\n\t\t\t\t\t\t\t\t} while (index != firstIndex + actualCount);\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tMOODYCAMEL_RETHROW;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tblock->ConcurrentQueue::Block::template set_many_empty<explicit_context>(firstIndexInBlock, static_cast<size_t>(endIndex - firstIndexInBlock));\n\t\t\t\t\t\tindexIndex = (indexIndex + 1) & (localBlockIndex->size - 1);\n\t\t\t\t\t} while (index != firstIndex + actualCount);\n\t\t\t\t\t\n\t\t\t\t\treturn actualCount;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Wasn't anything to dequeue after all; make the effective dequeue count eventually consistent\n\t\t\t\t\tthis->dequeueOvercommit.fetch_add(desiredCount, std::memory_order_release);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn 0;\n\t\t}\n\t\t\n\tprivate:\n\t\tstruct BlockIndexEntry\n\t\t{\n\t\t\tindex_t base;\n\t\t\tBlock* block;\n\t\t};\n\t\t\n\t\tstruct BlockIndexHeader\n\t\t{\n\t\t\tsize_t size;\n\t\t\tstd::atomic<size_t> front;\t\t// Current slot (not next, like pr_blockIndexFront)\n\t\t\tBlockIndexEntry* entries;\n\t\t\tvoid* prev;\n\t\t};\n\t\t\n\t\t\n\t\tbool new_block_index(size_t numberOfFilledSlotsToExpose)\n\t\t{\n\t\t\tauto prevBlockSizeMask = pr_blockIndexSize - 1;\n\t\t\t\n\t\t\t// Create the new block\n\t\t\tpr_blockIndexSize <<= 1;\n\t\t\tauto newRawPtr = static_cast<char*>((Traits::malloc)(sizeof(BlockIndexHeader) + std::alignment_of<BlockIndexEntry>::value - 1 + sizeof(BlockIndexEntry) * pr_blockIndexSize));\n\t\t\tif (newRawPtr == nullptr) {\n\t\t\t\tpr_blockIndexSize >>= 1;\t\t// Reset to allow graceful retry\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t\n\t\t\tauto newBlockIndexEntries = reinterpret_cast<BlockIndexEntry*>(details::align_for<BlockIndexEntry>(newRawPtr + sizeof(BlockIndexHeader)));\n\t\t\t\n\t\t\t// Copy in all the old indices, if any\n\t\t\tsize_t j = 0;\n\t\t\tif (pr_blockIndexSlotsUsed != 0) {\n\t\t\t\tauto i = (pr_blockIndexFront - pr_blockIndexSlotsUsed) & prevBlockSizeMask;\n\t\t\t\tdo {\n\t\t\t\t\tnewBlockIndexEntries[j++] = pr_blockIndexEntries[i];\n\t\t\t\t\ti = (i + 1) & prevBlockSizeMask;\n\t\t\t\t} while (i != pr_blockIndexFront);\n\t\t\t}\n\t\t\t\n\t\t\t// Update everything\n\t\t\tauto header = new (newRawPtr) BlockIndexHeader;\n\t\t\theader->size = pr_blockIndexSize;\n\t\t\theader->front.store(numberOfFilledSlotsToExpose - 1, std::memory_order_relaxed);\n\t\t\theader->entries = newBlockIndexEntries;\n\t\t\theader->prev = pr_blockIndexRaw;\t\t// we link the new block to the old one so we can free it later\n\t\t\t\n\t\t\tpr_blockIndexFront = j;\n\t\t\tpr_blockIndexEntries = newBlockIndexEntries;\n\t\t\tpr_blockIndexRaw = newRawPtr;\n\t\t\tblockIndex.store(header, std::memory_order_release);\n\t\t\t\n\t\t\treturn true;\n\t\t}\n\t\t\n\tprivate:\n\t\tstd::atomic<BlockIndexHeader*> blockIndex;\n\t\t\n\t\t// To be used by producer only -- consumer must use the ones in referenced by blockIndex\n\t\tsize_t pr_blockIndexSlotsUsed;\n\t\tsize_t pr_blockIndexSize;\n\t\tsize_t pr_blockIndexFront;\t\t// Next slot (not current)\n\t\tBlockIndexEntry* pr_blockIndexEntries;\n\t\tvoid* pr_blockIndexRaw;\n\t\t\n#ifdef MOODYCAMEL_QUEUE_INTERNAL_DEBUG\n\tpublic:\n\t\tExplicitProducer* nextExplicitProducer;\n\tprivate:\n#endif\n\t\t\n#ifdef MCDBGQ_TRACKMEM\n\t\tfriend struct MemStats;\n#endif\n\t};\n\t\n\t\n\t//////////////////////////////////\n\t// Implicit queue\n\t//////////////////////////////////\n\t\n\tstruct ImplicitProducer : public ProducerBase\n\t{\t\t\t\n\t\tImplicitProducer(ConcurrentQueue* parent_) :\n\t\t\tProducerBase(parent_, false),\n\t\t\tnextBlockIndexCapacity(IMPLICIT_INITIAL_INDEX_SIZE),\n\t\t\tblockIndex(nullptr)\n\t\t{\n\t\t\tnew_block_index();\n\t\t}\n\t\t\n\t\t~ImplicitProducer()\n\t\t{\n\t\t\t// Note that since we're in the destructor we can assume that all enqueue/dequeue operations\n\t\t\t// completed already; this means that all undequeued elements are placed contiguously across\n\t\t\t// contiguous blocks, and that only the first and last remaining blocks can be only partially\n\t\t\t// empty (all other remaining blocks must be completely full).\n\t\t\t\n#ifdef MOODYCAMEL_CPP11_THREAD_LOCAL_SUPPORTED\n\t\t\t// Unregister ourselves for thread termination notification\n\t\t\tif (!this->inactive.load(std::memory_order_relaxed)) {\n\t\t\t\tdetails::ThreadExitNotifier::unsubscribe(&threadExitListener);\n\t\t\t}\n#endif\n\t\t\t\n\t\t\t// Destroy all remaining elements!\n\t\t\tauto tail = this->tailIndex.load(std::memory_order_relaxed);\n\t\t\tauto index = this->headIndex.load(std::memory_order_relaxed);\n\t\t\tBlock* block = nullptr;\n\t\t\tassert(index == tail || details::circular_less_than(index, tail));\n\t\t\tbool forceFreeLastBlock = index != tail;\t\t// If we enter the loop, then the last (tail) block will not be freed\n\t\t\twhile (index != tail) {\n\t\t\t\tif ((index & static_cast<index_t>(BLOCK_SIZE - 1)) == 0 || block == nullptr) {\n\t\t\t\t\tif (block != nullptr) {\n\t\t\t\t\t\t// Free the old block\n\t\t\t\t\t\tthis->parent->add_block_to_free_list(block);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tblock = get_block_index_entry_for_index(index)->value.load(std::memory_order_relaxed);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t((*block)[index])->~T();\n\t\t\t\t++index;\n\t\t\t}\n\t\t\t// Even if the queue is empty, there's still one block that's not on the free list\n\t\t\t// (unless the head index reached the end of it, in which case the tail will be poised\n\t\t\t// to create a new block).\n\t\t\tif (this->tailBlock != nullptr && (forceFreeLastBlock || (tail & static_cast<index_t>(BLOCK_SIZE - 1)) != 0)) {\n\t\t\t\tthis->parent->add_block_to_free_list(this->tailBlock);\n\t\t\t}\n\t\t\t\n\t\t\t// Destroy block index\n\t\t\tauto localBlockIndex = blockIndex.load(std::memory_order_relaxed);\n\t\t\tif (localBlockIndex != nullptr) {\n\t\t\t\tfor (size_t i = 0; i != localBlockIndex->capacity; ++i) {\n\t\t\t\t\tlocalBlockIndex->index[i]->~BlockIndexEntry();\n\t\t\t\t}\n\t\t\t\tdo {\n\t\t\t\t\tauto prev = localBlockIndex->prev;\n\t\t\t\t\tlocalBlockIndex->~BlockIndexHeader();\n\t\t\t\t\t(Traits::free)(localBlockIndex);\n\t\t\t\t\tlocalBlockIndex = prev;\n\t\t\t\t} while (localBlockIndex != nullptr);\n\t\t\t}\n\t\t}\n\t\t\n\t\ttemplate<AllocationMode allocMode, typename U>\n\t\tinline bool enqueue(U&& element)\n\t\t{\n\t\t\tindex_t currentTailIndex = this->tailIndex.load(std::memory_order_relaxed);\n\t\t\tindex_t newTailIndex = 1 + currentTailIndex;\n\t\t\tif ((currentTailIndex & static_cast<index_t>(BLOCK_SIZE - 1)) == 0) {\n\t\t\t\t// We reached the end of a block, start a new one\n\t\t\t\tauto head = this->headIndex.load(std::memory_order_relaxed);\n\t\t\t\tassert(!details::circular_less_than<index_t>(currentTailIndex, head));\n\t\t\t\tif (!details::circular_less_than<index_t>(head, currentTailIndex + BLOCK_SIZE) || (MAX_SUBQUEUE_SIZE != details::const_numeric_max<size_t>::value && (MAX_SUBQUEUE_SIZE == 0 || MAX_SUBQUEUE_SIZE - BLOCK_SIZE < currentTailIndex - head))) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n#ifdef MCDBGQ_NOLOCKFREE_IMPLICITPRODBLOCKINDEX\n\t\t\t\tdebug::DebugLock lock(mutex);\n#endif\n\t\t\t\t// Find out where we'll be inserting this block in the block index\n\t\t\t\tBlockIndexEntry* idxEntry;\n\t\t\t\tif (!insert_block_index_entry<allocMode>(idxEntry, currentTailIndex)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Get ahold of a new block\n\t\t\t\tauto newBlock = this->parent->ConcurrentQueue::template requisition_block<allocMode>();\n\t\t\t\tif (newBlock == nullptr) {\n\t\t\t\t\trewind_block_index_tail();\n\t\t\t\t\tidxEntry->value.store(nullptr, std::memory_order_relaxed);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n#ifdef MCDBGQ_TRACKMEM\n\t\t\t\tnewBlock->owner = this;\n#endif\n\t\t\t\tnewBlock->ConcurrentQueue::Block::template reset_empty<implicit_context>();\n\n\t\t\t\tMOODYCAMEL_CONSTEXPR_IF (!MOODYCAMEL_NOEXCEPT_CTOR(T, U, new (static_cast<T*>(nullptr)) T(std::forward<U>(element)))) {\n\t\t\t\t\t// May throw, try to insert now before we publish the fact that we have this new block\n\t\t\t\t\tMOODYCAMEL_TRY {\n\t\t\t\t\t\tnew ((*newBlock)[currentTailIndex]) T(std::forward<U>(element));\n\t\t\t\t\t}\n\t\t\t\t\tMOODYCAMEL_CATCH (...) {\n\t\t\t\t\t\trewind_block_index_tail();\n\t\t\t\t\t\tidxEntry->value.store(nullptr, std::memory_order_relaxed);\n\t\t\t\t\t\tthis->parent->add_block_to_free_list(newBlock);\n\t\t\t\t\t\tMOODYCAMEL_RETHROW;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Insert the new block into the index\n\t\t\t\tidxEntry->value.store(newBlock, std::memory_order_relaxed);\n\t\t\t\t\n\t\t\t\tthis->tailBlock = newBlock;\n\t\t\t\t\n\t\t\t\tMOODYCAMEL_CONSTEXPR_IF (!MOODYCAMEL_NOEXCEPT_CTOR(T, U, new (static_cast<T*>(nullptr)) T(std::forward<U>(element)))) {\n\t\t\t\t\tthis->tailIndex.store(newTailIndex, std::memory_order_release);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t// Enqueue\n\t\t\tnew ((*this->tailBlock)[currentTailIndex]) T(std::forward<U>(element));\n\t\t\t\n\t\t\tthis->tailIndex.store(newTailIndex, std::memory_order_release);\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\ttemplate<typename U>\n\t\tbool dequeue(U& element)\n\t\t{\n\t\t\t// See ExplicitProducer::dequeue for rationale and explanation\n\t\t\tindex_t tail = this->tailIndex.load(std::memory_order_relaxed);\n\t\t\tindex_t overcommit = this->dequeueOvercommit.load(std::memory_order_relaxed);\n\t\t\tif (details::circular_less_than<index_t>(this->dequeueOptimisticCount.load(std::memory_order_relaxed) - overcommit, tail)) {\n\t\t\t\tstd::atomic_thread_fence(std::memory_order_acquire);\n\t\t\t\t\n\t\t\t\tindex_t myDequeueCount = this->dequeueOptimisticCount.fetch_add(1, std::memory_order_relaxed);\n\t\t\t\ttail = this->tailIndex.load(std::memory_order_acquire);\n\t\t\t\tif ((details::likely)(details::circular_less_than<index_t>(myDequeueCount - overcommit, tail))) {\n\t\t\t\t\tindex_t index = this->headIndex.fetch_add(1, std::memory_order_acq_rel);\n\t\t\t\t\t\n\t\t\t\t\t// Determine which block the element is in\n\t\t\t\t\tauto entry = get_block_index_entry_for_index(index);\n\t\t\t\t\t\n\t\t\t\t\t// Dequeue\n\t\t\t\t\tauto block = entry->value.load(std::memory_order_relaxed);\n\t\t\t\t\tauto& el = *((*block)[index]);\n\t\t\t\t\t\n\t\t\t\t\tif (!MOODYCAMEL_NOEXCEPT_ASSIGN(T, T&&, element = std::move(el))) {\n#ifdef MCDBGQ_NOLOCKFREE_IMPLICITPRODBLOCKINDEX\n\t\t\t\t\t\t// Note: Acquiring the mutex with every dequeue instead of only when a block\n\t\t\t\t\t\t// is released is very sub-optimal, but it is, after all, purely debug code.\n\t\t\t\t\t\tdebug::DebugLock lock(producer->mutex);\n#endif\n\t\t\t\t\t\tstruct Guard {\n\t\t\t\t\t\t\tBlock* block;\n\t\t\t\t\t\t\tindex_t index;\n\t\t\t\t\t\t\tBlockIndexEntry* entry;\n\t\t\t\t\t\t\tConcurrentQueue* parent;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t~Guard()\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t(*block)[index]->~T();\n\t\t\t\t\t\t\t\tif (block->ConcurrentQueue::Block::template set_empty<implicit_context>(index)) {\n\t\t\t\t\t\t\t\t\tentry->value.store(nullptr, std::memory_order_relaxed);\n\t\t\t\t\t\t\t\t\tparent->add_block_to_free_list(block);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} guard = { block, index, entry, this->parent };\n\n\t\t\t\t\t\telement = std::move(el); // NOLINT\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\telement = std::move(el); // NOLINT\n\t\t\t\t\t\tel.~T(); // NOLINT\n\n\t\t\t\t\t\tif (block->ConcurrentQueue::Block::template set_empty<implicit_context>(index)) {\n\t\t\t\t\t\t\t{\n#ifdef MCDBGQ_NOLOCKFREE_IMPLICITPRODBLOCKINDEX\n\t\t\t\t\t\t\t\tdebug::DebugLock lock(mutex);\n#endif\n\t\t\t\t\t\t\t\t// Add the block back into the global free pool (and remove from block index)\n\t\t\t\t\t\t\t\tentry->value.store(nullptr, std::memory_order_relaxed);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis->parent->add_block_to_free_list(block);\t\t// releases the above store\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis->dequeueOvercommit.fetch_add(1, std::memory_order_release);\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\t\treturn false;\n\t\t}\n\t\t\n#ifdef _MSC_VER\n#pragma warning(push)\n#pragma warning(disable: 4706)  // assignment within conditional expression\n#endif\n\t\ttemplate<AllocationMode allocMode, typename It>\n\t\tbool enqueue_bulk(It itemFirst, size_t count)\n\t\t{\n\t\t\t// First, we need to make sure we have enough room to enqueue all of the elements;\n\t\t\t// this means pre-allocating blocks and putting them in the block index (but only if\n\t\t\t// all the allocations succeeded).\n\t\t\t\n\t\t\t// Note that the tailBlock we start off with may not be owned by us any more;\n\t\t\t// this happens if it was filled up exactly to the top (setting tailIndex to\n\t\t\t// the first index of the next block which is not yet allocated), then dequeued\n\t\t\t// completely (putting it on the free list) before we enqueue again.\n\t\t\t\n\t\t\tindex_t startTailIndex = this->tailIndex.load(std::memory_order_relaxed);\n\t\t\tauto startBlock = this->tailBlock;\n\t\t\tBlock* firstAllocatedBlock = nullptr;\n\t\t\tauto endBlock = this->tailBlock;\n\t\t\t\n\t\t\t// Figure out how many blocks we'll need to allocate, and do so\n\t\t\tsize_t blockBaseDiff = ((startTailIndex + count - 1) & ~static_cast<index_t>(BLOCK_SIZE - 1)) - ((startTailIndex - 1) & ~static_cast<index_t>(BLOCK_SIZE - 1));\n\t\t\tindex_t currentTailIndex = (startTailIndex - 1) & ~static_cast<index_t>(BLOCK_SIZE - 1);\n\t\t\tif (blockBaseDiff > 0) {\n#ifdef MCDBGQ_NOLOCKFREE_IMPLICITPRODBLOCKINDEX\n\t\t\t\tdebug::DebugLock lock(mutex);\n#endif\n\t\t\t\tdo {\n\t\t\t\t\tblockBaseDiff -= static_cast<index_t>(BLOCK_SIZE);\n\t\t\t\t\tcurrentTailIndex += static_cast<index_t>(BLOCK_SIZE);\n\t\t\t\t\t\n\t\t\t\t\t// Find out where we'll be inserting this block in the block index\n\t\t\t\t\tBlockIndexEntry* idxEntry = nullptr;  // initialization here unnecessary but compiler can't always tell\n\t\t\t\t\tBlock* newBlock;\n\t\t\t\t\tbool indexInserted = false;\n\t\t\t\t\tauto head = this->headIndex.load(std::memory_order_relaxed);\n\t\t\t\t\tassert(!details::circular_less_than<index_t>(currentTailIndex, head));\n\t\t\t\t\tbool full = !details::circular_less_than<index_t>(head, currentTailIndex + BLOCK_SIZE) || (MAX_SUBQUEUE_SIZE != details::const_numeric_max<size_t>::value && (MAX_SUBQUEUE_SIZE == 0 || MAX_SUBQUEUE_SIZE - BLOCK_SIZE < currentTailIndex - head));\n\n\t\t\t\t\tif (full || !(indexInserted = insert_block_index_entry<allocMode>(idxEntry, currentTailIndex)) || (newBlock = this->parent->ConcurrentQueue::template requisition_block<allocMode>()) == nullptr) {\n\t\t\t\t\t\t// Index allocation or block allocation failed; revert any other allocations\n\t\t\t\t\t\t// and index insertions done so far for this operation\n\t\t\t\t\t\tif (indexInserted) {\n\t\t\t\t\t\t\trewind_block_index_tail();\n\t\t\t\t\t\t\tidxEntry->value.store(nullptr, std::memory_order_relaxed);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcurrentTailIndex = (startTailIndex - 1) & ~static_cast<index_t>(BLOCK_SIZE - 1);\n\t\t\t\t\t\tfor (auto block = firstAllocatedBlock; block != nullptr; block = block->next) {\n\t\t\t\t\t\t\tcurrentTailIndex += static_cast<index_t>(BLOCK_SIZE);\n\t\t\t\t\t\t\tidxEntry = get_block_index_entry_for_index(currentTailIndex);\n\t\t\t\t\t\t\tidxEntry->value.store(nullptr, std::memory_order_relaxed);\n\t\t\t\t\t\t\trewind_block_index_tail();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis->parent->add_blocks_to_free_list(firstAllocatedBlock);\n\t\t\t\t\t\tthis->tailBlock = startBlock;\n\t\t\t\t\t\t\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\t\n#ifdef MCDBGQ_TRACKMEM\n\t\t\t\t\tnewBlock->owner = this;\n#endif\n\t\t\t\t\tnewBlock->ConcurrentQueue::Block::template reset_empty<implicit_context>();\n\t\t\t\t\tnewBlock->next = nullptr;\n\t\t\t\t\t\n\t\t\t\t\t// Insert the new block into the index\n\t\t\t\t\tidxEntry->value.store(newBlock, std::memory_order_relaxed);\n\t\t\t\t\t\n\t\t\t\t\t// Store the chain of blocks so that we can undo if later allocations fail,\n\t\t\t\t\t// and so that we can find the blocks when we do the actual enqueueing\n\t\t\t\t\tif ((startTailIndex & static_cast<index_t>(BLOCK_SIZE - 1)) != 0 || firstAllocatedBlock != nullptr) {\n\t\t\t\t\t\tassert(this->tailBlock != nullptr);\n\t\t\t\t\t\tthis->tailBlock->next = newBlock;\n\t\t\t\t\t}\n\t\t\t\t\tthis->tailBlock = newBlock;\n\t\t\t\t\tendBlock = newBlock;\n\t\t\t\t\tfirstAllocatedBlock = firstAllocatedBlock == nullptr ? newBlock : firstAllocatedBlock;\n\t\t\t\t} while (blockBaseDiff > 0);\n\t\t\t}\n\t\t\t\n\t\t\t// Enqueue, one block at a time\n\t\t\tindex_t newTailIndex = startTailIndex + static_cast<index_t>(count);\n\t\t\tcurrentTailIndex = startTailIndex;\n\t\t\tthis->tailBlock = startBlock;\n\t\t\tassert((startTailIndex & static_cast<index_t>(BLOCK_SIZE - 1)) != 0 || firstAllocatedBlock != nullptr || count == 0);\n\t\t\tif ((startTailIndex & static_cast<index_t>(BLOCK_SIZE - 1)) == 0 && firstAllocatedBlock != nullptr) {\n\t\t\t\tthis->tailBlock = firstAllocatedBlock;\n\t\t\t}\n\t\t\twhile (true) {\n\t\t\t\tindex_t stopIndex = (currentTailIndex & ~static_cast<index_t>(BLOCK_SIZE - 1)) + static_cast<index_t>(BLOCK_SIZE);\n\t\t\t\tif (details::circular_less_than<index_t>(newTailIndex, stopIndex)) {\n\t\t\t\t\tstopIndex = newTailIndex;\n\t\t\t\t}\n\t\t\t\tMOODYCAMEL_CONSTEXPR_IF (MOODYCAMEL_NOEXCEPT_CTOR(T, decltype(*itemFirst), new (static_cast<T*>(nullptr)) T(details::deref_noexcept(itemFirst)))) {\n\t\t\t\t\twhile (currentTailIndex != stopIndex) {\n\t\t\t\t\t\tnew ((*this->tailBlock)[currentTailIndex++]) T(*itemFirst++);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tMOODYCAMEL_TRY {\n\t\t\t\t\t\twhile (currentTailIndex != stopIndex) {\n\t\t\t\t\t\t\tnew ((*this->tailBlock)[currentTailIndex]) T(details::nomove_if<!MOODYCAMEL_NOEXCEPT_CTOR(T, decltype(*itemFirst), new (static_cast<T*>(nullptr)) T(details::deref_noexcept(itemFirst)))>::eval(*itemFirst));\n\t\t\t\t\t\t\t++currentTailIndex;\n\t\t\t\t\t\t\t++itemFirst;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tMOODYCAMEL_CATCH (...) {\n\t\t\t\t\t\tauto constructedStopIndex = currentTailIndex;\n\t\t\t\t\t\tauto lastBlockEnqueued = this->tailBlock;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (!details::is_trivially_destructible<T>::value) {\n\t\t\t\t\t\t\tauto block = startBlock;\n\t\t\t\t\t\t\tif ((startTailIndex & static_cast<index_t>(BLOCK_SIZE - 1)) == 0) {\n\t\t\t\t\t\t\t\tblock = firstAllocatedBlock;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcurrentTailIndex = startTailIndex;\n\t\t\t\t\t\t\twhile (true) {\n\t\t\t\t\t\t\t\tstopIndex = (currentTailIndex & ~static_cast<index_t>(BLOCK_SIZE - 1)) + static_cast<index_t>(BLOCK_SIZE);\n\t\t\t\t\t\t\t\tif (details::circular_less_than<index_t>(constructedStopIndex, stopIndex)) {\n\t\t\t\t\t\t\t\t\tstopIndex = constructedStopIndex;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twhile (currentTailIndex != stopIndex) {\n\t\t\t\t\t\t\t\t\t(*block)[currentTailIndex++]->~T();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (block == lastBlockEnqueued) {\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tblock = block->next;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tcurrentTailIndex = (startTailIndex - 1) & ~static_cast<index_t>(BLOCK_SIZE - 1);\n\t\t\t\t\t\tfor (auto block = firstAllocatedBlock; block != nullptr; block = block->next) {\n\t\t\t\t\t\t\tcurrentTailIndex += static_cast<index_t>(BLOCK_SIZE);\n\t\t\t\t\t\t\tauto idxEntry = get_block_index_entry_for_index(currentTailIndex);\n\t\t\t\t\t\t\tidxEntry->value.store(nullptr, std::memory_order_relaxed);\n\t\t\t\t\t\t\trewind_block_index_tail();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis->parent->add_blocks_to_free_list(firstAllocatedBlock);\n\t\t\t\t\t\tthis->tailBlock = startBlock;\n\t\t\t\t\t\tMOODYCAMEL_RETHROW;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (this->tailBlock == endBlock) {\n\t\t\t\t\tassert(currentTailIndex == newTailIndex);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tthis->tailBlock = this->tailBlock->next;\n\t\t\t}\n\t\t\tthis->tailIndex.store(newTailIndex, std::memory_order_release);\n\t\t\treturn true;\n\t\t}\n#ifdef _MSC_VER\n#pragma warning(pop)\n#endif\n\t\t\n\t\ttemplate<typename It>\n\t\tsize_t dequeue_bulk(It& itemFirst, size_t max)\n\t\t{\n\t\t\tauto tail = this->tailIndex.load(std::memory_order_relaxed);\n\t\t\tauto overcommit = this->dequeueOvercommit.load(std::memory_order_relaxed);\n\t\t\tauto desiredCount = static_cast<size_t>(tail - (this->dequeueOptimisticCount.load(std::memory_order_relaxed) - overcommit));\n\t\t\tif (details::circular_less_than<size_t>(0, desiredCount)) {\n\t\t\t\tdesiredCount = desiredCount < max ? desiredCount : max;\n\t\t\t\tstd::atomic_thread_fence(std::memory_order_acquire);\n\t\t\t\t\n\t\t\t\tauto myDequeueCount = this->dequeueOptimisticCount.fetch_add(desiredCount, std::memory_order_relaxed);\n\t\t\t\t\n\t\t\t\ttail = this->tailIndex.load(std::memory_order_acquire);\n\t\t\t\tauto actualCount = static_cast<size_t>(tail - (myDequeueCount - overcommit));\n\t\t\t\tif (details::circular_less_than<size_t>(0, actualCount)) {\n\t\t\t\t\tactualCount = desiredCount < actualCount ? desiredCount : actualCount;\n\t\t\t\t\tif (actualCount < desiredCount) {\n\t\t\t\t\t\tthis->dequeueOvercommit.fetch_add(desiredCount - actualCount, std::memory_order_release);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// Get the first index. Note that since there's guaranteed to be at least actualCount elements, this\n\t\t\t\t\t// will never exceed tail.\n\t\t\t\t\tauto firstIndex = this->headIndex.fetch_add(actualCount, std::memory_order_acq_rel);\n\t\t\t\t\t\n\t\t\t\t\t// Iterate the blocks and dequeue\n\t\t\t\t\tauto index = firstIndex;\n\t\t\t\t\tBlockIndexHeader* localBlockIndex;\n\t\t\t\t\tauto indexIndex = get_block_index_index_for_index(index, localBlockIndex);\n\t\t\t\t\tdo {\n\t\t\t\t\t\tauto blockStartIndex = index;\n\t\t\t\t\t\tindex_t endIndex = (index & ~static_cast<index_t>(BLOCK_SIZE - 1)) + static_cast<index_t>(BLOCK_SIZE);\n\t\t\t\t\t\tendIndex = details::circular_less_than<index_t>(firstIndex + static_cast<index_t>(actualCount), endIndex) ? firstIndex + static_cast<index_t>(actualCount) : endIndex;\n\t\t\t\t\t\t\n\t\t\t\t\t\tauto entry = localBlockIndex->index[indexIndex];\n\t\t\t\t\t\tauto block = entry->value.load(std::memory_order_relaxed);\n\t\t\t\t\t\tif (MOODYCAMEL_NOEXCEPT_ASSIGN(T, T&&, details::deref_noexcept(itemFirst) = std::move((*(*block)[index])))) {\n\t\t\t\t\t\t\twhile (index != endIndex) {\n\t\t\t\t\t\t\t\tauto& el = *((*block)[index]);\n\t\t\t\t\t\t\t\t*itemFirst++ = std::move(el);\n\t\t\t\t\t\t\t\tel.~T();\n\t\t\t\t\t\t\t\t++index;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tMOODYCAMEL_TRY {\n\t\t\t\t\t\t\t\twhile (index != endIndex) {\n\t\t\t\t\t\t\t\t\tauto& el = *((*block)[index]);\n\t\t\t\t\t\t\t\t\t*itemFirst = std::move(el);\n\t\t\t\t\t\t\t\t\t++itemFirst;\n\t\t\t\t\t\t\t\t\tel.~T();\n\t\t\t\t\t\t\t\t\t++index;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tMOODYCAMEL_CATCH (...) {\n\t\t\t\t\t\t\t\tdo {\n\t\t\t\t\t\t\t\t\tentry = localBlockIndex->index[indexIndex];\n\t\t\t\t\t\t\t\t\tblock = entry->value.load(std::memory_order_relaxed);\n\t\t\t\t\t\t\t\t\twhile (index != endIndex) {\n\t\t\t\t\t\t\t\t\t\t(*block)[index++]->~T();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tif (block->ConcurrentQueue::Block::template set_many_empty<implicit_context>(blockStartIndex, static_cast<size_t>(endIndex - blockStartIndex))) {\n#ifdef MCDBGQ_NOLOCKFREE_IMPLICITPRODBLOCKINDEX\n\t\t\t\t\t\t\t\t\t\tdebug::DebugLock lock(mutex);\n#endif\n\t\t\t\t\t\t\t\t\t\tentry->value.store(nullptr, std::memory_order_relaxed);\n\t\t\t\t\t\t\t\t\t\tthis->parent->add_block_to_free_list(block);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tindexIndex = (indexIndex + 1) & (localBlockIndex->capacity - 1);\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tblockStartIndex = index;\n\t\t\t\t\t\t\t\t\tendIndex = (index & ~static_cast<index_t>(BLOCK_SIZE - 1)) + static_cast<index_t>(BLOCK_SIZE);\n\t\t\t\t\t\t\t\t\tendIndex = details::circular_less_than<index_t>(firstIndex + static_cast<index_t>(actualCount), endIndex) ? firstIndex + static_cast<index_t>(actualCount) : endIndex;\n\t\t\t\t\t\t\t\t} while (index != firstIndex + actualCount);\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tMOODYCAMEL_RETHROW;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (block->ConcurrentQueue::Block::template set_many_empty<implicit_context>(blockStartIndex, static_cast<size_t>(endIndex - blockStartIndex))) {\n\t\t\t\t\t\t\t{\n#ifdef MCDBGQ_NOLOCKFREE_IMPLICITPRODBLOCKINDEX\n\t\t\t\t\t\t\t\tdebug::DebugLock lock(mutex);\n#endif\n\t\t\t\t\t\t\t\t// Note that the set_many_empty above did a release, meaning that anybody who acquires the block\n\t\t\t\t\t\t\t\t// we're about to free can use it safely since our writes (and reads!) will have happened-before then.\n\t\t\t\t\t\t\t\tentry->value.store(nullptr, std::memory_order_relaxed);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis->parent->add_block_to_free_list(block);\t\t// releases the above store\n\t\t\t\t\t\t}\n\t\t\t\t\t\tindexIndex = (indexIndex + 1) & (localBlockIndex->capacity - 1);\n\t\t\t\t\t} while (index != firstIndex + actualCount);\n\t\t\t\t\t\n\t\t\t\t\treturn actualCount;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis->dequeueOvercommit.fetch_add(desiredCount, std::memory_order_release);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\treturn 0;\n\t\t}\n\t\t\n\tprivate:\n\t\t// The block size must be > 1, so any number with the low bit set is an invalid block base index\n\t\tstatic const index_t INVALID_BLOCK_BASE = 1;\n\t\t\n\t\tstruct BlockIndexEntry\n\t\t{\n\t\t\tstd::atomic<index_t> key;\n\t\t\tstd::atomic<Block*> value;\n\t\t};\n\t\t\n\t\tstruct BlockIndexHeader\n\t\t{\n\t\t\tsize_t capacity;\n\t\t\tstd::atomic<size_t> tail;\n\t\t\tBlockIndexEntry* entries;\n\t\t\tBlockIndexEntry** index;\n\t\t\tBlockIndexHeader* prev;\n\t\t};\n\t\t\n\t\ttemplate<AllocationMode allocMode>\n\t\tinline bool insert_block_index_entry(BlockIndexEntry*& idxEntry, index_t blockStartIndex)\n\t\t{\n\t\t\tauto localBlockIndex = blockIndex.load(std::memory_order_relaxed);\t\t// We're the only writer thread, relaxed is OK\n\t\t\tif (localBlockIndex == nullptr) {\n\t\t\t\treturn false;  // this can happen if new_block_index failed in the constructor\n\t\t\t}\n\t\t\tsize_t newTail = (localBlockIndex->tail.load(std::memory_order_relaxed) + 1) & (localBlockIndex->capacity - 1);\n\t\t\tidxEntry = localBlockIndex->index[newTail];\n\t\t\tif (idxEntry->key.load(std::memory_order_relaxed) == INVALID_BLOCK_BASE ||\n\t\t\t\tidxEntry->value.load(std::memory_order_relaxed) == nullptr) {\n\t\t\t\t\n\t\t\t\tidxEntry->key.store(blockStartIndex, std::memory_order_relaxed);\n\t\t\t\tlocalBlockIndex->tail.store(newTail, std::memory_order_release);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t\n\t\t\t// No room in the old block index, try to allocate another one!\n\t\t\tMOODYCAMEL_CONSTEXPR_IF (allocMode == CannotAlloc) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse if (!new_block_index()) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlocalBlockIndex = blockIndex.load(std::memory_order_relaxed);\n\t\t\t\tnewTail = (localBlockIndex->tail.load(std::memory_order_relaxed) + 1) & (localBlockIndex->capacity - 1);\n\t\t\t\tidxEntry = localBlockIndex->index[newTail];\n\t\t\t\tassert(idxEntry->key.load(std::memory_order_relaxed) == INVALID_BLOCK_BASE);\n\t\t\t\tidxEntry->key.store(blockStartIndex, std::memory_order_relaxed);\n\t\t\t\tlocalBlockIndex->tail.store(newTail, std::memory_order_release);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t\n\t\tinline void rewind_block_index_tail()\n\t\t{\n\t\t\tauto localBlockIndex = blockIndex.load(std::memory_order_relaxed);\n\t\t\tlocalBlockIndex->tail.store((localBlockIndex->tail.load(std::memory_order_relaxed) - 1) & (localBlockIndex->capacity - 1), std::memory_order_relaxed);\n\t\t}\n\t\t\n\t\tinline BlockIndexEntry* get_block_index_entry_for_index(index_t index) const\n\t\t{\n\t\t\tBlockIndexHeader* localBlockIndex;\n\t\t\tauto idx = get_block_index_index_for_index(index, localBlockIndex);\n\t\t\treturn localBlockIndex->index[idx];\n\t\t}\n\t\t\n\t\tinline size_t get_block_index_index_for_index(index_t index, BlockIndexHeader*& localBlockIndex) const\n\t\t{\n#ifdef MCDBGQ_NOLOCKFREE_IMPLICITPRODBLOCKINDEX\n\t\t\tdebug::DebugLock lock(mutex);\n#endif\n\t\t\tindex &= ~static_cast<index_t>(BLOCK_SIZE - 1);\n\t\t\tlocalBlockIndex = blockIndex.load(std::memory_order_acquire);\n\t\t\tauto tail = localBlockIndex->tail.load(std::memory_order_acquire);\n\t\t\tauto tailBase = localBlockIndex->index[tail]->key.load(std::memory_order_relaxed);\n\t\t\tassert(tailBase != INVALID_BLOCK_BASE);\n\t\t\t// Note: Must use division instead of shift because the index may wrap around, causing a negative\n\t\t\t// offset, whose negativity we want to preserve\n\t\t\tauto offset = static_cast<size_t>(static_cast<typename std::make_signed<index_t>::type>(index - tailBase) / static_cast<typename std::make_signed<index_t>::type>(BLOCK_SIZE));\n\t\t\tsize_t idx = (tail + offset) & (localBlockIndex->capacity - 1);\n\t\t\tassert(localBlockIndex->index[idx]->key.load(std::memory_order_relaxed) == index && localBlockIndex->index[idx]->value.load(std::memory_order_relaxed) != nullptr);\n\t\t\treturn idx;\n\t\t}\n\t\t\n\t\tbool new_block_index()\n\t\t{\n\t\t\tauto prev = blockIndex.load(std::memory_order_relaxed);\n\t\t\tsize_t prevCapacity = prev == nullptr ? 0 : prev->capacity;\n\t\t\tauto entryCount = prev == nullptr ? nextBlockIndexCapacity : prevCapacity;\n\t\t\tauto raw = static_cast<char*>((Traits::malloc)(\n\t\t\t\tsizeof(BlockIndexHeader) +\n\t\t\t\tstd::alignment_of<BlockIndexEntry>::value - 1 + sizeof(BlockIndexEntry) * entryCount +\n\t\t\t\tstd::alignment_of<BlockIndexEntry*>::value - 1 + sizeof(BlockIndexEntry*) * nextBlockIndexCapacity));\n\t\t\tif (raw == nullptr) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t\n\t\t\tauto header = new (raw) BlockIndexHeader;\n\t\t\tauto entries = reinterpret_cast<BlockIndexEntry*>(details::align_for<BlockIndexEntry>(raw + sizeof(BlockIndexHeader)));\n\t\t\tauto index = reinterpret_cast<BlockIndexEntry**>(details::align_for<BlockIndexEntry*>(reinterpret_cast<char*>(entries) + sizeof(BlockIndexEntry) * entryCount));\n\t\t\tif (prev != nullptr) {\n\t\t\t\tauto prevTail = prev->tail.load(std::memory_order_relaxed);\n\t\t\t\tauto prevPos = prevTail;\n\t\t\t\tsize_t i = 0;\n\t\t\t\tdo {\n\t\t\t\t\tprevPos = (prevPos + 1) & (prev->capacity - 1);\n\t\t\t\t\tindex[i++] = prev->index[prevPos];\n\t\t\t\t} while (prevPos != prevTail);\n\t\t\t\tassert(i == prevCapacity);\n\t\t\t}\n\t\t\tfor (size_t i = 0; i != entryCount; ++i) {\n\t\t\t\tnew (entries + i) BlockIndexEntry;\n\t\t\t\tentries[i].key.store(INVALID_BLOCK_BASE, std::memory_order_relaxed);\n\t\t\t\tindex[prevCapacity + i] = entries + i;\n\t\t\t}\n\t\t\theader->prev = prev;\n\t\t\theader->entries = entries;\n\t\t\theader->index = index;\n\t\t\theader->capacity = nextBlockIndexCapacity;\n\t\t\theader->tail.store((prevCapacity - 1) & (nextBlockIndexCapacity - 1), std::memory_order_relaxed);\n\t\t\t\n\t\t\tblockIndex.store(header, std::memory_order_release);\n\t\t\t\n\t\t\tnextBlockIndexCapacity <<= 1;\n\t\t\t\n\t\t\treturn true;\n\t\t}\n\t\t\n\tprivate:\n\t\tsize_t nextBlockIndexCapacity;\n\t\tstd::atomic<BlockIndexHeader*> blockIndex;\n\n#ifdef MOODYCAMEL_CPP11_THREAD_LOCAL_SUPPORTED\n\tpublic:\n\t\tdetails::ThreadExitListener threadExitListener;\n\tprivate:\n#endif\n\t\t\n#ifdef MOODYCAMEL_QUEUE_INTERNAL_DEBUG\n\tpublic:\n\t\tImplicitProducer* nextImplicitProducer;\n\tprivate:\n#endif\n\n#ifdef MCDBGQ_NOLOCKFREE_IMPLICITPRODBLOCKINDEX\n\t\tmutable debug::DebugMutex mutex;\n#endif\n#ifdef MCDBGQ_TRACKMEM\n\t\tfriend struct MemStats;\n#endif\n\t};\n\t\n\t\n\t//////////////////////////////////\n\t// Block pool manipulation\n\t//////////////////////////////////\n\t\n\tvoid populate_initial_block_list(size_t blockCount)\n\t{\n\t\tinitialBlockPoolSize = blockCount;\n\t\tif (initialBlockPoolSize == 0) {\n\t\t\tinitialBlockPool = nullptr;\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tinitialBlockPool = create_array<Block>(blockCount);\n\t\tif (initialBlockPool == nullptr) {\n\t\t\tinitialBlockPoolSize = 0;\n\t\t}\n\t\tfor (size_t i = 0; i < initialBlockPoolSize; ++i) {\n\t\t\tinitialBlockPool[i].dynamicallyAllocated = false;\n\t\t}\n\t}\n\t\n\tinline Block* try_get_block_from_initial_pool()\n\t{\n\t\tif (initialBlockPoolIndex.load(std::memory_order_relaxed) >= initialBlockPoolSize) {\n\t\t\treturn nullptr;\n\t\t}\n\t\t\n\t\tauto index = initialBlockPoolIndex.fetch_add(1, std::memory_order_relaxed);\n\t\t\n\t\treturn index < initialBlockPoolSize ? (initialBlockPool + index) : nullptr;\n\t}\n\t\n\tinline void add_block_to_free_list(Block* block)\n\t{\n#ifdef MCDBGQ_TRACKMEM\n\t\tblock->owner = nullptr;\n#endif\n\t\tif (!Traits::RECYCLE_ALLOCATED_BLOCKS && block->dynamicallyAllocated) {\n\t\t\tdestroy(block);\n\t\t}\n\t\telse {\n\t\t\tfreeList.add(block);\n\t\t}\n\t}\n\t\n\tinline void add_blocks_to_free_list(Block* block)\n\t{\n\t\twhile (block != nullptr) {\n\t\t\tauto next = block->next;\n\t\t\tadd_block_to_free_list(block);\n\t\t\tblock = next;\n\t\t}\n\t}\n\t\n\tinline Block* try_get_block_from_free_list()\n\t{\n\t\treturn freeList.try_get();\n\t}\n\t\n\t// Gets a free block from one of the memory pools, or allocates a new one (if applicable)\n\ttemplate<AllocationMode canAlloc>\n\tBlock* requisition_block()\n\t{\n\t\tauto block = try_get_block_from_initial_pool();\n\t\tif (block != nullptr) {\n\t\t\treturn block;\n\t\t}\n\t\t\n\t\tblock = try_get_block_from_free_list();\n\t\tif (block != nullptr) {\n\t\t\treturn block;\n\t\t}\n\t\t\n\t\tMOODYCAMEL_CONSTEXPR_IF (canAlloc == CanAlloc) {\n\t\t\treturn create<Block>();\n\t\t}\n\t\telse {\n\t\t\treturn nullptr;\n\t\t}\n\t}\n\t\n\n#ifdef MCDBGQ_TRACKMEM\n\tpublic:\n\t\tstruct MemStats {\n\t\t\tsize_t allocatedBlocks;\n\t\t\tsize_t usedBlocks;\n\t\t\tsize_t freeBlocks;\n\t\t\tsize_t ownedBlocksExplicit;\n\t\t\tsize_t ownedBlocksImplicit;\n\t\t\tsize_t implicitProducers;\n\t\t\tsize_t explicitProducers;\n\t\t\tsize_t elementsEnqueued;\n\t\t\tsize_t blockClassBytes;\n\t\t\tsize_t queueClassBytes;\n\t\t\tsize_t implicitBlockIndexBytes;\n\t\t\tsize_t explicitBlockIndexBytes;\n\t\t\t\n\t\t\tfriend class ConcurrentQueue;\n\t\t\t\n\t\tprivate:\n\t\t\tstatic MemStats getFor(ConcurrentQueue* q)\n\t\t\t{\n\t\t\t\tMemStats stats = { 0 };\n\t\t\t\t\n\t\t\t\tstats.elementsEnqueued = q->size_approx();\n\t\t\t\n\t\t\t\tauto block = q->freeList.head_unsafe();\n\t\t\t\twhile (block != nullptr) {\n\t\t\t\t\t++stats.allocatedBlocks;\n\t\t\t\t\t++stats.freeBlocks;\n\t\t\t\t\tblock = block->freeListNext.load(std::memory_order_relaxed);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfor (auto ptr = q->producerListTail.load(std::memory_order_acquire); ptr != nullptr; ptr = ptr->next_prod()) {\n\t\t\t\t\tbool implicit = dynamic_cast<ImplicitProducer*>(ptr) != nullptr;\n\t\t\t\t\tstats.implicitProducers += implicit ? 1 : 0;\n\t\t\t\t\tstats.explicitProducers += implicit ? 0 : 1;\n\t\t\t\t\t\n\t\t\t\t\tif (implicit) {\n\t\t\t\t\t\tauto prod = static_cast<ImplicitProducer*>(ptr);\n\t\t\t\t\t\tstats.queueClassBytes += sizeof(ImplicitProducer);\n\t\t\t\t\t\tauto head = prod->headIndex.load(std::memory_order_relaxed);\n\t\t\t\t\t\tauto tail = prod->tailIndex.load(std::memory_order_relaxed);\n\t\t\t\t\t\tauto hash = prod->blockIndex.load(std::memory_order_relaxed);\n\t\t\t\t\t\tif (hash != nullptr) {\n\t\t\t\t\t\t\tfor (size_t i = 0; i != hash->capacity; ++i) {\n\t\t\t\t\t\t\t\tif (hash->index[i]->key.load(std::memory_order_relaxed) != ImplicitProducer::INVALID_BLOCK_BASE && hash->index[i]->value.load(std::memory_order_relaxed) != nullptr) {\n\t\t\t\t\t\t\t\t\t++stats.allocatedBlocks;\n\t\t\t\t\t\t\t\t\t++stats.ownedBlocksImplicit;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tstats.implicitBlockIndexBytes += hash->capacity * sizeof(typename ImplicitProducer::BlockIndexEntry);\n\t\t\t\t\t\t\tfor (; hash != nullptr; hash = hash->prev) {\n\t\t\t\t\t\t\t\tstats.implicitBlockIndexBytes += sizeof(typename ImplicitProducer::BlockIndexHeader) + hash->capacity * sizeof(typename ImplicitProducer::BlockIndexEntry*);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfor (; details::circular_less_than<index_t>(head, tail); head += BLOCK_SIZE) {\n\t\t\t\t\t\t\t//auto block = prod->get_block_index_entry_for_index(head);\n\t\t\t\t\t\t\t++stats.usedBlocks;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tauto prod = static_cast<ExplicitProducer*>(ptr);\n\t\t\t\t\t\tstats.queueClassBytes += sizeof(ExplicitProducer);\n\t\t\t\t\t\tauto tailBlock = prod->tailBlock;\n\t\t\t\t\t\tbool wasNonEmpty = false;\n\t\t\t\t\t\tif (tailBlock != nullptr) {\n\t\t\t\t\t\t\tauto block = tailBlock;\n\t\t\t\t\t\t\tdo {\n\t\t\t\t\t\t\t\t++stats.allocatedBlocks;\n\t\t\t\t\t\t\t\tif (!block->ConcurrentQueue::Block::template is_empty<explicit_context>() || wasNonEmpty) {\n\t\t\t\t\t\t\t\t\t++stats.usedBlocks;\n\t\t\t\t\t\t\t\t\twasNonEmpty = wasNonEmpty || block != tailBlock;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t++stats.ownedBlocksExplicit;\n\t\t\t\t\t\t\t\tblock = block->next;\n\t\t\t\t\t\t\t} while (block != tailBlock);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tauto index = prod->blockIndex.load(std::memory_order_relaxed);\n\t\t\t\t\t\twhile (index != nullptr) {\n\t\t\t\t\t\t\tstats.explicitBlockIndexBytes += sizeof(typename ExplicitProducer::BlockIndexHeader) + index->size * sizeof(typename ExplicitProducer::BlockIndexEntry);\n\t\t\t\t\t\t\tindex = static_cast<typename ExplicitProducer::BlockIndexHeader*>(index->prev);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tauto freeOnInitialPool = q->initialBlockPoolIndex.load(std::memory_order_relaxed) >= q->initialBlockPoolSize ? 0 : q->initialBlockPoolSize - q->initialBlockPoolIndex.load(std::memory_order_relaxed);\n\t\t\t\tstats.allocatedBlocks += freeOnInitialPool;\n\t\t\t\tstats.freeBlocks += freeOnInitialPool;\n\t\t\t\t\n\t\t\t\tstats.blockClassBytes = sizeof(Block) * stats.allocatedBlocks;\n\t\t\t\tstats.queueClassBytes += sizeof(ConcurrentQueue);\n\t\t\t\t\n\t\t\t\treturn stats;\n\t\t\t}\n\t\t};\n\t\t\n\t\t// For debugging only. Not thread-safe.\n\t\tMemStats getMemStats()\n\t\t{\n\t\t\treturn MemStats::getFor(this);\n\t\t}\n\tprivate:\n\t\tfriend struct MemStats;\n#endif\n\t\n\t\n\t//////////////////////////////////\n\t// Producer list manipulation\n\t//////////////////////////////////\t\n\t\n\tProducerBase* recycle_or_create_producer(bool isExplicit)\n\t{\n#ifdef MCDBGQ_NOLOCKFREE_IMPLICITPRODHASH\n\t\tdebug::DebugLock lock(implicitProdMutex);\n#endif\n\t\t// Try to re-use one first\n\t\tfor (auto ptr = producerListTail.load(std::memory_order_acquire); ptr != nullptr; ptr = ptr->next_prod()) {\n\t\t\tif (ptr->inactive.load(std::memory_order_relaxed) && ptr->isExplicit == isExplicit) {\n\t\t\t\tbool expected = true;\n\t\t\t\tif (ptr->inactive.compare_exchange_strong(expected, /* desired */ false, std::memory_order_acquire, std::memory_order_relaxed)) {\n\t\t\t\t\t// We caught one! It's been marked as activated, the caller can have it\n\t\t\t\t\treturn ptr;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn add_producer(isExplicit ? static_cast<ProducerBase*>(create<ExplicitProducer>(this)) : create<ImplicitProducer>(this));\n\t}\n\t\n\tProducerBase* add_producer(ProducerBase* producer)\n\t{\n\t\t// Handle failed memory allocation\n\t\tif (producer == nullptr) {\n\t\t\treturn nullptr;\n\t\t}\n\t\t\n\t\tproducerCount.fetch_add(1, std::memory_order_relaxed);\n\t\t\n\t\t// Add it to the lock-free list\n\t\tauto prevTail = producerListTail.load(std::memory_order_relaxed);\n\t\tdo {\n\t\t\tproducer->next = prevTail;\n\t\t} while (!producerListTail.compare_exchange_weak(prevTail, producer, std::memory_order_release, std::memory_order_relaxed));\n\t\t\n#ifdef MOODYCAMEL_QUEUE_INTERNAL_DEBUG\n\t\tif (producer->isExplicit) {\n\t\t\tauto prevTailExplicit = explicitProducers.load(std::memory_order_relaxed);\n\t\t\tdo {\n\t\t\t\tstatic_cast<ExplicitProducer*>(producer)->nextExplicitProducer = prevTailExplicit;\n\t\t\t} while (!explicitProducers.compare_exchange_weak(prevTailExplicit, static_cast<ExplicitProducer*>(producer), std::memory_order_release, std::memory_order_relaxed));\n\t\t}\n\t\telse {\n\t\t\tauto prevTailImplicit = implicitProducers.load(std::memory_order_relaxed);\n\t\t\tdo {\n\t\t\t\tstatic_cast<ImplicitProducer*>(producer)->nextImplicitProducer = prevTailImplicit;\n\t\t\t} while (!implicitProducers.compare_exchange_weak(prevTailImplicit, static_cast<ImplicitProducer*>(producer), std::memory_order_release, std::memory_order_relaxed));\n\t\t}\n#endif\n\t\t\n\t\treturn producer;\n\t}\n\t\n\tvoid reown_producers()\n\t{\n\t\t// After another instance is moved-into/swapped-with this one, all the\n\t\t// producers we stole still think their parents are the other queue.\n\t\t// So fix them up!\n\t\tfor (auto ptr = producerListTail.load(std::memory_order_relaxed); ptr != nullptr; ptr = ptr->next_prod()) {\n\t\t\tptr->parent = this;\n\t\t}\n\t}\n\t\n\t\n\t//////////////////////////////////\n\t// Implicit producer hash\n\t//////////////////////////////////\n\t\n\tstruct ImplicitProducerKVP\n\t{\n\t\tstd::atomic<details::thread_id_t> key;\n\t\tImplicitProducer* value;\t\t// No need for atomicity since it's only read by the thread that sets it in the first place\n\t\t\n\t\tImplicitProducerKVP() : value(nullptr) { }\n\t\t\n\t\tImplicitProducerKVP(ImplicitProducerKVP&& other) MOODYCAMEL_NOEXCEPT\n\t\t{\n\t\t\tkey.store(other.key.load(std::memory_order_relaxed), std::memory_order_relaxed);\n\t\t\tvalue = other.value;\n\t\t}\n\t\t\n\t\tinline ImplicitProducerKVP& operator=(ImplicitProducerKVP&& other) MOODYCAMEL_NOEXCEPT\n\t\t{\n\t\t\tswap(other);\n\t\t\treturn *this;\n\t\t}\n\t\t\n\t\tinline void swap(ImplicitProducerKVP& other) MOODYCAMEL_NOEXCEPT\n\t\t{\n\t\t\tif (this != &other) {\n\t\t\t\tdetails::swap_relaxed(key, other.key);\n\t\t\t\tstd::swap(value, other.value);\n\t\t\t}\n\t\t}\n\t};\n\t\n\ttemplate<typename XT, typename XTraits>\n\tfriend void moodycamel::swap(typename ConcurrentQueue<XT, XTraits>::ImplicitProducerKVP&, typename ConcurrentQueue<XT, XTraits>::ImplicitProducerKVP&) MOODYCAMEL_NOEXCEPT;\n\t\n\tstruct ImplicitProducerHash\n\t{\n\t\tsize_t capacity;\n\t\tImplicitProducerKVP* entries;\n\t\tImplicitProducerHash* prev;\n\t};\n\t\n\tinline void populate_initial_implicit_producer_hash()\n\t{\n\t\tMOODYCAMEL_CONSTEXPR_IF (INITIAL_IMPLICIT_PRODUCER_HASH_SIZE == 0) {\n\t\t\treturn;\n\t\t}\n\t\telse {\n\t\t\timplicitProducerHashCount.store(0, std::memory_order_relaxed);\n\t\t\tauto hash = &initialImplicitProducerHash;\n\t\t\thash->capacity = INITIAL_IMPLICIT_PRODUCER_HASH_SIZE;\n\t\t\thash->entries = &initialImplicitProducerHashEntries[0];\n\t\t\tfor (size_t i = 0; i != INITIAL_IMPLICIT_PRODUCER_HASH_SIZE; ++i) {\n\t\t\t\tinitialImplicitProducerHashEntries[i].key.store(details::invalid_thread_id, std::memory_order_relaxed);\n\t\t\t}\n\t\t\thash->prev = nullptr;\n\t\t\timplicitProducerHash.store(hash, std::memory_order_relaxed);\n\t\t}\n\t}\n\t\n\tvoid swap_implicit_producer_hashes(ConcurrentQueue& other)\n\t{\n\t\tMOODYCAMEL_CONSTEXPR_IF (INITIAL_IMPLICIT_PRODUCER_HASH_SIZE == 0) {\n\t\t\treturn;\n\t\t}\n\t\telse {\n\t\t\t// Swap (assumes our implicit producer hash is initialized)\n\t\t\tinitialImplicitProducerHashEntries.swap(other.initialImplicitProducerHashEntries);\n\t\t\tinitialImplicitProducerHash.entries = &initialImplicitProducerHashEntries[0];\n\t\t\tother.initialImplicitProducerHash.entries = &other.initialImplicitProducerHashEntries[0];\n\t\t\t\n\t\t\tdetails::swap_relaxed(implicitProducerHashCount, other.implicitProducerHashCount);\n\t\t\t\n\t\t\tdetails::swap_relaxed(implicitProducerHash, other.implicitProducerHash);\n\t\t\tif (implicitProducerHash.load(std::memory_order_relaxed) == &other.initialImplicitProducerHash) {\n\t\t\t\timplicitProducerHash.store(&initialImplicitProducerHash, std::memory_order_relaxed);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tImplicitProducerHash* hash;\n\t\t\t\tfor (hash = implicitProducerHash.load(std::memory_order_relaxed); hash->prev != &other.initialImplicitProducerHash; hash = hash->prev) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\thash->prev = &initialImplicitProducerHash;\n\t\t\t}\n\t\t\tif (other.implicitProducerHash.load(std::memory_order_relaxed) == &initialImplicitProducerHash) {\n\t\t\t\tother.implicitProducerHash.store(&other.initialImplicitProducerHash, std::memory_order_relaxed);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tImplicitProducerHash* hash;\n\t\t\t\tfor (hash = other.implicitProducerHash.load(std::memory_order_relaxed); hash->prev != &initialImplicitProducerHash; hash = hash->prev) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\thash->prev = &other.initialImplicitProducerHash;\n\t\t\t}\n\t\t}\n\t}\n\t\n\t// Only fails (returns nullptr) if memory allocation fails\n\tImplicitProducer* get_or_add_implicit_producer()\n\t{\n\t\t// Note that since the data is essentially thread-local (key is thread ID),\n\t\t// there's a reduced need for fences (memory ordering is already consistent\n\t\t// for any individual thread), except for the current table itself.\n\t\t\n\t\t// Start by looking for the thread ID in the current and all previous hash tables.\n\t\t// If it's not found, it must not be in there yet, since this same thread would\n\t\t// have added it previously to one of the tables that we traversed.\n\t\t\n\t\t// Code and algorithm adapted from http://preshing.com/20130605/the-worlds-simplest-lock-free-hash-table\n\t\t\n#ifdef MCDBGQ_NOLOCKFREE_IMPLICITPRODHASH\n\t\tdebug::DebugLock lock(implicitProdMutex);\n#endif\n\t\t\n\t\tauto id = details::thread_id();\n\t\tauto hashedId = details::hash_thread_id(id);\n\t\t\n\t\tauto mainHash = implicitProducerHash.load(std::memory_order_acquire);\n\t\tassert(mainHash != nullptr);  // silence clang-tidy and MSVC warnings (hash cannot be null)\n\t\tfor (auto hash = mainHash; hash != nullptr; hash = hash->prev) {\n\t\t\t// Look for the id in this hash\n\t\t\tauto index = hashedId;\n\t\t\twhile (true) {\t\t// Not an infinite loop because at least one slot is free in the hash table\n\t\t\t\tindex &= hash->capacity - 1u;\n\t\t\t\t\n\t\t\t\tauto probedKey = hash->entries[index].key.load(std::memory_order_relaxed);\n\t\t\t\tif (probedKey == id) {\n\t\t\t\t\t// Found it! If we had to search several hashes deep, though, we should lazily add it\n\t\t\t\t\t// to the current main hash table to avoid the extended search next time.\n\t\t\t\t\t// Note there's guaranteed to be room in the current hash table since every subsequent\n\t\t\t\t\t// table implicitly reserves space for all previous tables (there's only one\n\t\t\t\t\t// implicitProducerHashCount).\n\t\t\t\t\tauto value = hash->entries[index].value;\n\t\t\t\t\tif (hash != mainHash) {\n\t\t\t\t\t\tindex = hashedId;\n\t\t\t\t\t\twhile (true) {\n\t\t\t\t\t\t\tindex &= mainHash->capacity - 1u;\n\t\t\t\t\t\t\tauto empty = details::invalid_thread_id;\n#ifdef MOODYCAMEL_CPP11_THREAD_LOCAL_SUPPORTED\n\t\t\t\t\t\t\tauto reusable = details::invalid_thread_id2;\n\t\t\t\t\t\t\tif (mainHash->entries[index].key.compare_exchange_strong(empty,    id, std::memory_order_seq_cst, std::memory_order_relaxed) ||\n\t\t\t\t\t\t\t\tmainHash->entries[index].key.compare_exchange_strong(reusable, id, std::memory_order_seq_cst, std::memory_order_relaxed)) {\n#else\n\t\t\t\t\t\t\tif (mainHash->entries[index].key.compare_exchange_strong(empty,    id, std::memory_order_seq_cst, std::memory_order_relaxed)) {\n#endif\n\t\t\t\t\t\t\t\tmainHash->entries[index].value = value;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t++index;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t\tif (probedKey == details::invalid_thread_id) {\n\t\t\t\t\tbreak;\t\t// Not in this hash table\n\t\t\t\t}\n\t\t\t\t++index;\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Insert!\n\t\tauto newCount = 1 + implicitProducerHashCount.fetch_add(1, std::memory_order_relaxed);\n\t\twhile (true) {\n\t\t\t// NOLINTNEXTLINE(clang-analyzer-core.NullDereference)\n\t\t\tif (newCount >= (mainHash->capacity >> 1) && !implicitProducerHashResizeInProgress.test_and_set(std::memory_order_acquire)) {\n\t\t\t\t// We've acquired the resize lock, try to allocate a bigger hash table.\n\t\t\t\t// Note the acquire fence synchronizes with the release fence at the end of this block, and hence when\n\t\t\t\t// we reload implicitProducerHash it must be the most recent version (it only gets changed within this\n\t\t\t\t// locked block).\n\t\t\t\tmainHash = implicitProducerHash.load(std::memory_order_acquire);\n\t\t\t\tif (newCount >= (mainHash->capacity >> 1)) {\n\t\t\t\t\tsize_t newCapacity = mainHash->capacity << 1;\n\t\t\t\t\twhile (newCount >= (newCapacity >> 1)) {\n\t\t\t\t\t\tnewCapacity <<= 1;\n\t\t\t\t\t}\n\t\t\t\t\tauto raw = static_cast<char*>((Traits::malloc)(sizeof(ImplicitProducerHash) + std::alignment_of<ImplicitProducerKVP>::value - 1 + sizeof(ImplicitProducerKVP) * newCapacity));\n\t\t\t\t\tif (raw == nullptr) {\n\t\t\t\t\t\t// Allocation failed\n\t\t\t\t\t\timplicitProducerHashCount.fetch_sub(1, std::memory_order_relaxed);\n\t\t\t\t\t\timplicitProducerHashResizeInProgress.clear(std::memory_order_relaxed);\n\t\t\t\t\t\treturn nullptr;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tauto newHash = new (raw) ImplicitProducerHash;\n\t\t\t\t\tnewHash->capacity = static_cast<size_t>(newCapacity);\n\t\t\t\t\tnewHash->entries = reinterpret_cast<ImplicitProducerKVP*>(details::align_for<ImplicitProducerKVP>(raw + sizeof(ImplicitProducerHash)));\n\t\t\t\t\tfor (size_t i = 0; i != newCapacity; ++i) {\n\t\t\t\t\t\tnew (newHash->entries + i) ImplicitProducerKVP;\n\t\t\t\t\t\tnewHash->entries[i].key.store(details::invalid_thread_id, std::memory_order_relaxed);\n\t\t\t\t\t}\n\t\t\t\t\tnewHash->prev = mainHash;\n\t\t\t\t\timplicitProducerHash.store(newHash, std::memory_order_release);\n\t\t\t\t\timplicitProducerHashResizeInProgress.clear(std::memory_order_release);\n\t\t\t\t\tmainHash = newHash;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\timplicitProducerHashResizeInProgress.clear(std::memory_order_release);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t// If it's < three-quarters full, add to the old one anyway so that we don't have to wait for the next table\n\t\t\t// to finish being allocated by another thread (and if we just finished allocating above, the condition will\n\t\t\t// always be true)\n\t\t\tif (newCount < (mainHash->capacity >> 1) + (mainHash->capacity >> 2)) {\n\t\t\t\tauto producer = static_cast<ImplicitProducer*>(recycle_or_create_producer(false));\n\t\t\t\tif (producer == nullptr) {\n\t\t\t\t\timplicitProducerHashCount.fetch_sub(1, std::memory_order_relaxed);\n\t\t\t\t\treturn nullptr;\n\t\t\t\t}\n\t\t\t\t\n#ifdef MOODYCAMEL_CPP11_THREAD_LOCAL_SUPPORTED\n\t\t\t\tproducer->threadExitListener.callback = &ConcurrentQueue::implicit_producer_thread_exited_callback;\n\t\t\t\tproducer->threadExitListener.userData = producer;\n\t\t\t\tdetails::ThreadExitNotifier::subscribe(&producer->threadExitListener);\n#endif\n\t\t\t\t\n\t\t\t\tauto index = hashedId;\n\t\t\t\twhile (true) {\n\t\t\t\t\tindex &= mainHash->capacity - 1u;\n\t\t\t\t\tauto empty = details::invalid_thread_id;\n#ifdef MOODYCAMEL_CPP11_THREAD_LOCAL_SUPPORTED\n\t\t\t\t\tauto reusable = details::invalid_thread_id2;\n\t\t\t\t\tif (mainHash->entries[index].key.compare_exchange_strong(reusable, id, std::memory_order_seq_cst, std::memory_order_relaxed)) {\n\t\t\t\t\t\timplicitProducerHashCount.fetch_sub(1, std::memory_order_relaxed);  // already counted as a used slot\n\t\t\t\t\t\tmainHash->entries[index].value = producer;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n#endif\n\t\t\t\t\tif (mainHash->entries[index].key.compare_exchange_strong(empty,    id, std::memory_order_seq_cst, std::memory_order_relaxed)) {\n\t\t\t\t\t\tmainHash->entries[index].value = producer;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t++index;\n\t\t\t\t}\n\t\t\t\treturn producer;\n\t\t\t}\n\t\t\t\n\t\t\t// Hmm, the old hash is quite full and somebody else is busy allocating a new one.\n\t\t\t// We need to wait for the allocating thread to finish (if it succeeds, we add, if not,\n\t\t\t// we try to allocate ourselves).\n\t\t\tmainHash = implicitProducerHash.load(std::memory_order_acquire);\n\t\t}\n\t}\n\t\n#ifdef MOODYCAMEL_CPP11_THREAD_LOCAL_SUPPORTED\n\tvoid implicit_producer_thread_exited(ImplicitProducer* producer)\n\t{\n\t\t// Remove from hash\n#ifdef MCDBGQ_NOLOCKFREE_IMPLICITPRODHASH\n\t\tdebug::DebugLock lock(implicitProdMutex);\n#endif\n\t\tauto hash = implicitProducerHash.load(std::memory_order_acquire);\n\t\tassert(hash != nullptr);\t\t// The thread exit listener is only registered if we were added to a hash in the first place\n\t\tauto id = details::thread_id();\n\t\tauto hashedId = details::hash_thread_id(id);\n\t\tdetails::thread_id_t probedKey;\n\t\t\n\t\t// We need to traverse all the hashes just in case other threads aren't on the current one yet and are\n\t\t// trying to add an entry thinking there's a free slot (because they reused a producer)\n\t\tfor (; hash != nullptr; hash = hash->prev) {\n\t\t\tauto index = hashedId;\n\t\t\tdo {\n\t\t\t\tindex &= hash->capacity - 1u;\n\t\t\t\tprobedKey = id;\n\t\t\t\tif (hash->entries[index].key.compare_exchange_strong(probedKey, details::invalid_thread_id2, std::memory_order_seq_cst, std::memory_order_relaxed)) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t++index;\n\t\t\t} while (probedKey != details::invalid_thread_id);\t\t// Can happen if the hash has changed but we weren't put back in it yet, or if we weren't added to this hash in the first place\n\t\t}\n\t\t\n\t\t// Mark the queue as being recyclable\n\t\tproducer->inactive.store(true, std::memory_order_release);\n\t}\n\t\n\tstatic void implicit_producer_thread_exited_callback(void* userData)\n\t{\n\t\tauto producer = static_cast<ImplicitProducer*>(userData);\n\t\tauto queue = producer->parent;\n\t\tqueue->implicit_producer_thread_exited(producer);\n\t}\n#endif\n\t\n\t//////////////////////////////////\n\t// Utility functions\n\t//////////////////////////////////\n\n\ttemplate<typename TAlign>\n\tstatic inline void* aligned_malloc(size_t size)\n\t{\n\t\tMOODYCAMEL_CONSTEXPR_IF (std::alignment_of<TAlign>::value <= std::alignment_of<details::max_align_t>::value)\n\t\t\treturn (Traits::malloc)(size);\n\t\telse {\n\t\t\tsize_t alignment = std::alignment_of<TAlign>::value;\n\t\t\tvoid* raw = (Traits::malloc)(size + alignment - 1 + sizeof(void*));\n\t\t\tif (!raw)\n\t\t\t\treturn nullptr;\n\t\t\tchar* ptr = details::align_for<TAlign>(reinterpret_cast<char*>(raw) + sizeof(void*));\n\t\t\t*(reinterpret_cast<void**>(ptr) - 1) = raw;\n\t\t\treturn ptr;\n\t\t}\n\t}\n\n\ttemplate<typename TAlign>\n\tstatic inline void aligned_free(void* ptr)\n\t{\n\t\tMOODYCAMEL_CONSTEXPR_IF (std::alignment_of<TAlign>::value <= std::alignment_of<details::max_align_t>::value)\n\t\t\treturn (Traits::free)(ptr);\n\t\telse\n\t\t\t(Traits::free)(ptr ? *(reinterpret_cast<void**>(ptr) - 1) : nullptr);\n\t}\n\n\ttemplate<typename U>\n\tstatic inline U* create_array(size_t count)\n\t{\n\t\tassert(count > 0);\n\t\tU* p = static_cast<U*>(aligned_malloc<U>(sizeof(U) * count));\n\t\tif (p == nullptr)\n\t\t\treturn nullptr;\n\n\t\tfor (size_t i = 0; i != count; ++i)\n\t\t\tnew (p + i) U();\n\t\treturn p;\n\t}\n\n\ttemplate<typename U>\n\tstatic inline void destroy_array(U* p, size_t count)\n\t{\n\t\tif (p != nullptr) {\n\t\t\tassert(count > 0);\n\t\t\tfor (size_t i = count; i != 0; )\n\t\t\t\t(p + --i)->~U();\n\t\t}\n\t\taligned_free<U>(p);\n\t}\n\n\ttemplate<typename U>\n\tstatic inline U* create()\n\t{\n\t\tvoid* p = aligned_malloc<U>(sizeof(U));\n\t\treturn p != nullptr ? new (p) U : nullptr;\n\t}\n\n\ttemplate<typename U, typename A1>\n\tstatic inline U* create(A1&& a1)\n\t{\n\t\tvoid* p = aligned_malloc<U>(sizeof(U));\n\t\treturn p != nullptr ? new (p) U(std::forward<A1>(a1)) : nullptr;\n\t}\n\n\ttemplate<typename U>\n\tstatic inline void destroy(U* p)\n\t{\n\t\tif (p != nullptr)\n\t\t\tp->~U();\n\t\taligned_free<U>(p);\n\t}\n\nprivate:\n\tstd::atomic<ProducerBase*> producerListTail;\n\tstd::atomic<std::uint32_t> producerCount;\n\t\n\tstd::atomic<size_t> initialBlockPoolIndex;\n\tBlock* initialBlockPool;\n\tsize_t initialBlockPoolSize;\n\t\n#ifndef MCDBGQ_USEDEBUGFREELIST\n\tFreeList<Block> freeList;\n#else\n\tdebug::DebugFreeList<Block> freeList;\n#endif\n\t\n\tstd::atomic<ImplicitProducerHash*> implicitProducerHash;\n\tstd::atomic<size_t> implicitProducerHashCount;\t\t// Number of slots logically used\n\tImplicitProducerHash initialImplicitProducerHash;\n\tstd::array<ImplicitProducerKVP, INITIAL_IMPLICIT_PRODUCER_HASH_SIZE> initialImplicitProducerHashEntries;\n\tstd::atomic_flag implicitProducerHashResizeInProgress;\n\t\n\tstd::atomic<std::uint32_t> nextExplicitConsumerId;\n\tstd::atomic<std::uint32_t> globalExplicitConsumerOffset;\n\t\n#ifdef MCDBGQ_NOLOCKFREE_IMPLICITPRODHASH\n\tdebug::DebugMutex implicitProdMutex;\n#endif\n\t\n#ifdef MOODYCAMEL_QUEUE_INTERNAL_DEBUG\n\tstd::atomic<ExplicitProducer*> explicitProducers;\n\tstd::atomic<ImplicitProducer*> implicitProducers;\n#endif\n};\n\n\ntemplate<typename T, typename Traits>\nProducerToken::ProducerToken(ConcurrentQueue<T, Traits>& queue)\n\t: producer(queue.recycle_or_create_producer(true))\n{\n\tif (producer != nullptr) {\n\t\tproducer->token = this;\n\t}\n}\n\ntemplate<typename T, typename Traits>\nProducerToken::ProducerToken(BlockingConcurrentQueue<T, Traits>& queue)\n\t: producer(reinterpret_cast<ConcurrentQueue<T, Traits>*>(&queue)->recycle_or_create_producer(true))\n{\n\tif (producer != nullptr) {\n\t\tproducer->token = this;\n\t}\n}\n\ntemplate<typename T, typename Traits>\nConsumerToken::ConsumerToken(ConcurrentQueue<T, Traits>& queue)\n\t: itemsConsumedFromCurrent(0), currentProducer(nullptr), desiredProducer(nullptr)\n{\n\tinitialOffset = queue.nextExplicitConsumerId.fetch_add(1, std::memory_order_release);\n\tlastKnownGlobalOffset = static_cast<std::uint32_t>(-1);\n}\n\ntemplate<typename T, typename Traits>\nConsumerToken::ConsumerToken(BlockingConcurrentQueue<T, Traits>& queue)\n\t: itemsConsumedFromCurrent(0), currentProducer(nullptr), desiredProducer(nullptr)\n{\n\tinitialOffset = reinterpret_cast<ConcurrentQueue<T, Traits>*>(&queue)->nextExplicitConsumerId.fetch_add(1, std::memory_order_release);\n\tlastKnownGlobalOffset = static_cast<std::uint32_t>(-1);\n}\n\ntemplate<typename T, typename Traits>\ninline void swap(ConcurrentQueue<T, Traits>& a, ConcurrentQueue<T, Traits>& b) MOODYCAMEL_NOEXCEPT\n{\n\ta.swap(b);\n}\n\ninline void swap(ProducerToken& a, ProducerToken& b) MOODYCAMEL_NOEXCEPT\n{\n\ta.swap(b);\n}\n\ninline void swap(ConsumerToken& a, ConsumerToken& b) MOODYCAMEL_NOEXCEPT\n{\n\ta.swap(b);\n}\n\ntemplate<typename T, typename Traits>\ninline void swap(typename ConcurrentQueue<T, Traits>::ImplicitProducerKVP& a, typename ConcurrentQueue<T, Traits>::ImplicitProducerKVP& b) MOODYCAMEL_NOEXCEPT\n{\n\ta.swap(b);\n}\n\n}\n\n#if defined(_MSC_VER) && (!defined(_HAS_CXX17) || !_HAS_CXX17)\n#pragma warning(pop)\n#endif\n\n#if defined(__GNUC__) && !defined(__INTEL_COMPILER)\n#pragma GCC diagnostic pop\n#endif\n"
  },
  {
    "path": "concurrentqueueConfig.cmake.in",
    "content": "@PACKAGE_INIT@\n\ninclude(${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake)\n"
  },
  {
    "path": "internal/concurrentqueue_internal_debug.h",
    "content": "#pragma once\n\n//#define MCDBGQ_TRACKMEM 1\n//#define MCDBGQ_NOLOCKFREE_FREELIST 1\n//#define MCDBGQ_USEDEBUGFREELIST 1\n//#define MCDBGQ_NOLOCKFREE_IMPLICITPRODBLOCKINDEX 1\n//#define MCDBGQ_NOLOCKFREE_IMPLICITPRODHASH 1\n\n#if defined(_WIN32) || defined(__WINDOWS__) || defined(__WIN32__)\n#define WIN32_LEAN_AND_MEAN\n#include <windows.h>\nnamespace moodycamel { namespace debug {\n\tstruct DebugMutex {\n\t\tDebugMutex() { InitializeCriticalSectionAndSpinCount(&cs, 0x400); }\n\t\t~DebugMutex() { DeleteCriticalSection(&cs); }\n\t\t\n\t\tvoid lock() { EnterCriticalSection(&cs); }\n\t\tvoid unlock() { LeaveCriticalSection(&cs); }\n\t\t\n\tprivate:\n\t\tCRITICAL_SECTION cs;\n\t};\n} }\n#else\n#include <mutex>\nnamespace moodycamel { namespace debug {\n\tstruct DebugMutex {\n\t\tvoid lock() { m.lock(); }\n\t\tvoid unlock() { m.unlock(); }\n\t\t\n\tprivate:\n\t\tstd::mutex m;\n\t};\n} }\n#define\n#endif\n\nnamespace moodycamel { namespace debug {\n\tstruct DebugLock {\n\t\texplicit DebugLock(DebugMutex& mutex)\n\t\t\t: mutex(mutex)\n\t\t{\n\t\t\tmutex.lock();\n\t\t}\n\t\t\n\t\t~DebugLock()\n\t\t{\n\t\t\tmutex.unlock();\n\t\t}\n\t\t\n\tprivate:\n\t\tDebugMutex& mutex;\n\t};\n\t\n\t\n\ttemplate<typename N>\n\tstruct DebugFreeList {\n\t\tDebugFreeList() : head(nullptr) { }\n\t\tDebugFreeList(DebugFreeList&& other) : head(other.head) { other.head = nullptr; }\n\t\tvoid swap(DebugFreeList& other) { std::swap(head, other.head); }\n\t\t\n\t\tinline void add(N* node)\n\t\t{\n\t\t\tDebugLock lock(mutex);\n\t\t\tnode->freeListNext = head;\n\t\t\thead = node;\n\t\t}\n\t\t\n\t\tinline N* try_get()\n\t\t{\n\t\t\tDebugLock lock(mutex);\n\t\t\tif (head == nullptr) {\n\t\t\t\treturn nullptr;\n\t\t\t}\n\t\t\t\n\t\t\tauto prevHead = head;\n\t\t\thead = head->freeListNext;\n\t\t\treturn prevHead;\n\t\t}\n\t\t\n\t\tN* head_unsafe() const { return head; }\n\t\t\n\tprivate:\n\t\tN* head;\n\t\tDebugMutex mutex;\n\t};\n} }\n"
  },
  {
    "path": "lightweightsemaphore.h",
    "content": "// Provides an efficient implementation of a semaphore (LightweightSemaphore).\n// This is an extension of Jeff Preshing's sempahore implementation (licensed \n// under the terms of its separate zlib license) that has been adapted and\n// extended by Cameron Desrochers.\n\n#pragma once\n\n#include <atomic>\n#include <cassert> // assert\n#include <cerrno> // For EINTR\n#include <cstddef> // For std::size_t\n#include <cstdint> // For std::uint64_t\n#include <ctime> // For clock_gettime\n#include <type_traits> // For std::make_signed<T>\n\n#if defined(_WIN32)\n// Avoid including windows.h in a header; we only need a handful of\n// items, so we'll redeclare them here (this is relatively safe since\n// the API generally has to remain stable between Windows versions).\n// I know this is an ugly hack but it still beats polluting the global\n// namespace with thousands of generic names or adding a .cpp for nothing.\nextern \"C\" {\n\tstruct _SECURITY_ATTRIBUTES;\n\t__declspec(dllimport) void* __stdcall CreateSemaphoreW(_SECURITY_ATTRIBUTES* lpSemaphoreAttributes, long lInitialCount, long lMaximumCount, const wchar_t* lpName);\n\t__declspec(dllimport) int __stdcall CloseHandle(void* hObject);\n\t__declspec(dllimport) unsigned long __stdcall WaitForSingleObject(void* hHandle, unsigned long dwMilliseconds);\n\t__declspec(dllimport) int __stdcall ReleaseSemaphore(void* hSemaphore, long lReleaseCount, long* lpPreviousCount);\n}\n#elif defined(__MACH__)\n#include <mach/mach.h>\n#elif defined(__MVS__)\n#include <zos-semaphore.h>\n#elif defined(__unix__)\n#include <semaphore.h>\n\n#if defined(__GLIBC_PREREQ) && defined(_GNU_SOURCE)\n#if __GLIBC_PREREQ(2,30)\n#define MOODYCAMEL_LIGHTWEIGHTSEMAPHORE_MONOTONIC\n#endif\n#endif\n#endif\n\n#ifndef MOODYCAMEL_DELETE_FUNCTION\n#if __cplusplus >= 201103L || _MSC_VER >= 1900\n#define MOODYCAMEL_DELETE_FUNCTION = delete\n#else\n#define MOODYCAMEL_DELETE_FUNCTION\n#endif\n#endif\n\nnamespace moodycamel\n{\nnamespace details\n{\n\n// Code in the mpmc_sema namespace below is an adaptation of Jeff Preshing's\n// portable + lightweight semaphore implementations, originally from\n// https://github.com/preshing/cpp11-on-multicore/blob/master/common/sema.h\n// LICENSE:\n// Copyright (c) 2015 Jeff Preshing\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//\tclaim that you wrote the original software. If you use this software\n//\tin a product, an acknowledgement in the product documentation would be\n//\tappreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//\tmisrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n#if defined(_WIN32)\nclass Semaphore\n{\nprivate:\n\tvoid* m_hSema;\n\t\n\tSemaphore(const Semaphore& other) MOODYCAMEL_DELETE_FUNCTION;\n\tSemaphore& operator=(const Semaphore& other) MOODYCAMEL_DELETE_FUNCTION;\n\npublic:\n\tSemaphore(int initialCount = 0)\n\t{\n\t\tassert(initialCount >= 0);\n\t\tconst long maxLong = 0x7fffffff;\n\t\tm_hSema = CreateSemaphoreW(nullptr, initialCount, maxLong, nullptr);\n\t\tassert(m_hSema);\n\t}\n\n\t~Semaphore()\n\t{\n\t\tCloseHandle(m_hSema);\n\t}\n\n\tbool wait()\n\t{\n\t\tconst unsigned long infinite = 0xffffffff;\n\t\treturn WaitForSingleObject(m_hSema, infinite) == 0;\n\t}\n\t\n\tbool try_wait()\n\t{\n\t\treturn WaitForSingleObject(m_hSema, 0) == 0;\n\t}\n\t\n\tbool timed_wait(std::uint64_t usecs)\n\t{\n\t\treturn WaitForSingleObject(m_hSema, (unsigned long)(usecs / 1000)) == 0;\n\t}\n\n\tvoid signal(int count = 1)\n\t{\n\t\twhile (!ReleaseSemaphore(m_hSema, count, nullptr));\n\t}\n};\n#elif defined(__MACH__)\n//---------------------------------------------------------\n// Semaphore (Apple iOS and OSX)\n// Can't use POSIX semaphores due to http://lists.apple.com/archives/darwin-kernel/2009/Apr/msg00010.html\n//---------------------------------------------------------\nclass Semaphore\n{\nprivate:\n\tsemaphore_t m_sema;\n\n\tSemaphore(const Semaphore& other) MOODYCAMEL_DELETE_FUNCTION;\n\tSemaphore& operator=(const Semaphore& other) MOODYCAMEL_DELETE_FUNCTION;\n\npublic:\n\tSemaphore(int initialCount = 0)\n\t{\n\t\tassert(initialCount >= 0);\n\t\tkern_return_t rc = semaphore_create(mach_task_self(), &m_sema, SYNC_POLICY_FIFO, initialCount);\n\t\tassert(rc == KERN_SUCCESS);\n\t\t(void)rc;\n\t}\n\n\t~Semaphore()\n\t{\n\t\tsemaphore_destroy(mach_task_self(), m_sema);\n\t}\n\n\tbool wait()\n\t{\n\t\treturn semaphore_wait(m_sema) == KERN_SUCCESS;\n\t}\n\t\n\tbool try_wait()\n\t{\n\t\treturn timed_wait(0);\n\t}\n\t\n\tbool timed_wait(std::uint64_t timeout_usecs)\n\t{\n\t\tmach_timespec_t ts;\n\t\tts.tv_sec = static_cast<unsigned int>(timeout_usecs / 1000000);\n\t\tts.tv_nsec = static_cast<int>((timeout_usecs % 1000000) * 1000);\n\n\t\t// added in OSX 10.10: https://developer.apple.com/library/prerelease/mac/documentation/General/Reference/APIDiffsMacOSX10_10SeedDiff/modules/Darwin.html\n\t\tkern_return_t rc = semaphore_timedwait(m_sema, ts);\n\t\treturn rc == KERN_SUCCESS;\n\t}\n\n\tvoid signal()\n\t{\n\t\twhile (semaphore_signal(m_sema) != KERN_SUCCESS);\n\t}\n\n\tvoid signal(int count)\n\t{\n\t\twhile (count-- > 0)\n\t\t{\n\t\t\twhile (semaphore_signal(m_sema) != KERN_SUCCESS);\n\t\t}\n\t}\n};\n#elif defined(__unix__) || defined(__MVS__)\n//---------------------------------------------------------\n// Semaphore (POSIX, Linux, zOS)\n//---------------------------------------------------------\nclass Semaphore\n{\nprivate:\n\tsem_t m_sema;\n\n\tSemaphore(const Semaphore& other) MOODYCAMEL_DELETE_FUNCTION;\n\tSemaphore& operator=(const Semaphore& other) MOODYCAMEL_DELETE_FUNCTION;\n\npublic:\n\tSemaphore(int initialCount = 0)\n\t{\n\t\tassert(initialCount >= 0);\n\t\tint rc = sem_init(&m_sema, 0, static_cast<unsigned int>(initialCount));\n\t\tassert(rc == 0);\n\t\t(void)rc;\n\t}\n\n\t~Semaphore()\n\t{\n\t\tsem_destroy(&m_sema);\n\t}\n\n\tbool wait()\n\t{\n\t\t// http://stackoverflow.com/questions/2013181/gdb-causes-sem-wait-to-fail-with-eintr-error\n\t\tint rc;\n\t\tdo {\n\t\t\trc = sem_wait(&m_sema);\n\t\t} while (rc == -1 && errno == EINTR);\n\t\treturn rc == 0;\n\t}\n\n\tbool try_wait()\n\t{\n\t\tint rc;\n\t\tdo {\n\t\t\trc = sem_trywait(&m_sema);\n\t\t} while (rc == -1 && errno == EINTR);\n\t\treturn rc == 0;\n\t}\n\n\tbool timed_wait(std::uint64_t usecs)\n\t{\n\t\tstruct timespec ts;\n\t\tconst int usecs_in_1_sec = 1000000;\n\t\tconst int nsecs_in_1_sec = 1000000000;\n#ifdef MOODYCAMEL_LIGHTWEIGHTSEMAPHORE_MONOTONIC\n\t\tclock_gettime(CLOCK_MONOTONIC, &ts);\n#else\n\t\tclock_gettime(CLOCK_REALTIME, &ts);\n#endif\n\t\tts.tv_sec += (time_t)(usecs / usecs_in_1_sec);\n\t\tts.tv_nsec += (long)(usecs % usecs_in_1_sec) * 1000;\n\t\t// sem_timedwait bombs if you have more than 1e9 in tv_nsec\n\t\t// so we have to clean things up before passing it in\n\t\tif (ts.tv_nsec >= nsecs_in_1_sec) {\n\t\t\tts.tv_nsec -= nsecs_in_1_sec;\n\t\t\t++ts.tv_sec;\n\t\t}\n\n\t\tint rc;\n\t\tdo {\n#ifdef MOODYCAMEL_LIGHTWEIGHTSEMAPHORE_MONOTONIC\n\t\t\trc = sem_clockwait(&m_sema, CLOCK_MONOTONIC, &ts);\n#else\n\t\t\trc = sem_timedwait(&m_sema, &ts);\n#endif\n\t\t} while (rc == -1 && errno == EINTR);\n\t\treturn rc == 0;\n\t}\n\n\tvoid signal()\n\t{\n\t\twhile (sem_post(&m_sema) == -1);\n\t}\n\n\tvoid signal(int count)\n\t{\n\t\twhile (count-- > 0)\n\t\t{\n\t\t\twhile (sem_post(&m_sema) == -1);\n\t\t}\n\t}\n};\n#else\n#error Unsupported platform! (No semaphore wrapper available)\n#endif\n\n}\t// end namespace details\n\n\n//---------------------------------------------------------\n// LightweightSemaphore\n//---------------------------------------------------------\nclass LightweightSemaphore\n{\npublic:\n\ttypedef std::make_signed<std::size_t>::type ssize_t;\n\nprivate:\n\tstd::atomic<ssize_t> m_count;\n\tdetails::Semaphore m_sema;\n\tint m_maxSpins;\n\n\tbool waitWithPartialSpinning(std::int64_t timeout_usecs = -1)\n\t{\n\t\tssize_t oldCount;\n\t\tint spin = m_maxSpins;\n\t\twhile (--spin >= 0)\n\t\t{\n\t\t\toldCount = m_count.load(std::memory_order_relaxed);\n\t\t\tif ((oldCount > 0) && m_count.compare_exchange_strong(oldCount, oldCount - 1, std::memory_order_acquire, std::memory_order_relaxed))\n\t\t\t\treturn true;\n\t\t\tstd::atomic_signal_fence(std::memory_order_acquire);\t // Prevent the compiler from collapsing the loop.\n\t\t}\n\t\toldCount = m_count.fetch_sub(1, std::memory_order_acquire);\n\t\tif (oldCount > 0)\n\t\t\treturn true;\n\t\tif (timeout_usecs < 0)\n\t\t{\n\t\t\tif (m_sema.wait())\n\t\t\t\treturn true;\n\t\t}\n\t\tif (timeout_usecs > 0 && m_sema.timed_wait((std::uint64_t)timeout_usecs))\n\t\t\treturn true;\n\t\t// At this point, we've timed out waiting for the semaphore, but the\n\t\t// count is still decremented indicating we may still be waiting on\n\t\t// it. So we have to re-adjust the count, but only if the semaphore\n\t\t// wasn't signaled enough times for us too since then. If it was, we\n\t\t// need to release the semaphore too.\n\t\twhile (true)\n\t\t{\n\t\t\toldCount = m_count.load(std::memory_order_acquire);\n\t\t\tif (oldCount >= 0 && m_sema.try_wait())\n\t\t\t\treturn true;\n\t\t\tif (oldCount < 0 && m_count.compare_exchange_strong(oldCount, oldCount + 1, std::memory_order_relaxed, std::memory_order_relaxed))\n\t\t\t\treturn false;\n\t\t}\n\t}\n\n\tssize_t waitManyWithPartialSpinning(ssize_t max, std::int64_t timeout_usecs = -1)\n\t{\n\t\tassert(max > 0);\n\t\tssize_t oldCount;\n\t\tint spin = m_maxSpins;\n\t\twhile (--spin >= 0)\n\t\t{\n\t\t\toldCount = m_count.load(std::memory_order_relaxed);\n\t\t\tif (oldCount > 0)\n\t\t\t{\n\t\t\t\tssize_t newCount = oldCount > max ? oldCount - max : 0;\n\t\t\t\tif (m_count.compare_exchange_strong(oldCount, newCount, std::memory_order_acquire, std::memory_order_relaxed))\n\t\t\t\t\treturn oldCount - newCount;\n\t\t\t}\n\t\t\tstd::atomic_signal_fence(std::memory_order_acquire);\n\t\t}\n\t\toldCount = m_count.fetch_sub(1, std::memory_order_acquire);\n\t\tif (oldCount <= 0)\n\t\t{\n\t\t\tif ((timeout_usecs == 0) || (timeout_usecs < 0 && !m_sema.wait()) || (timeout_usecs > 0 && !m_sema.timed_wait((std::uint64_t)timeout_usecs)))\n\t\t\t{\n\t\t\t\twhile (true)\n\t\t\t\t{\n\t\t\t\t\toldCount = m_count.load(std::memory_order_acquire);\n\t\t\t\t\tif (oldCount >= 0 && m_sema.try_wait())\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tif (oldCount < 0 && m_count.compare_exchange_strong(oldCount, oldCount + 1, std::memory_order_relaxed, std::memory_order_relaxed))\n\t\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (max > 1)\n\t\t\treturn 1 + tryWaitMany(max - 1);\n\t\treturn 1;\n\t}\n\npublic:\n\tLightweightSemaphore(ssize_t initialCount = 0, int maxSpins = 10000) : m_count(initialCount), m_maxSpins(maxSpins)\n\t{\n\t\tassert(initialCount >= 0);\n\t\tassert(maxSpins >= 0);\n\t}\n\n\tbool tryWait()\n\t{\n\t\tssize_t oldCount = m_count.load(std::memory_order_relaxed);\n\t\twhile (oldCount > 0)\n\t\t{\n\t\t\tif (m_count.compare_exchange_weak(oldCount, oldCount - 1, std::memory_order_acquire, std::memory_order_relaxed))\n\t\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tbool wait()\n\t{\n\t\treturn tryWait() || waitWithPartialSpinning();\n\t}\n\n\tbool wait(std::int64_t timeout_usecs)\n\t{\n\t\treturn tryWait() || waitWithPartialSpinning(timeout_usecs);\n\t}\n\n\t// Acquires between 0 and (greedily) max, inclusive\n\tssize_t tryWaitMany(ssize_t max)\n\t{\n\t\tassert(max >= 0);\n\t\tssize_t oldCount = m_count.load(std::memory_order_relaxed);\n\t\twhile (oldCount > 0)\n\t\t{\n\t\t\tssize_t newCount = oldCount > max ? oldCount - max : 0;\n\t\t\tif (m_count.compare_exchange_weak(oldCount, newCount, std::memory_order_acquire, std::memory_order_relaxed))\n\t\t\t\treturn oldCount - newCount;\n\t\t}\n\t\treturn 0;\n\t}\n\n\t// Acquires at least one, and (greedily) at most max\n\tssize_t waitMany(ssize_t max, std::int64_t timeout_usecs)\n\t{\n\t\tassert(max >= 0);\n\t\tssize_t result = tryWaitMany(max);\n\t\tif (result == 0 && max > 0)\n\t\t\tresult = waitManyWithPartialSpinning(max, timeout_usecs);\n\t\treturn result;\n\t}\n\t\n\tssize_t waitMany(ssize_t max)\n\t{\n\t\tssize_t result = waitMany(max, -1);\n\t\tassert(result > 0);\n\t\treturn result;\n\t}\n\n\tvoid signal(ssize_t count = 1)\n\t{\n\t\tassert(count >= 0);\n\t\tssize_t oldCount = m_count.fetch_add(count, std::memory_order_release);\n\t\tssize_t toRelease = -oldCount < count ? -oldCount : count;\n\t\tif (toRelease > 0)\n\t\t{\n\t\t\tm_sema.signal((int)toRelease);\n\t\t}\n\t}\n\t\n\tstd::size_t availableApprox() const\n\t{\n\t\tssize_t count = m_count.load(std::memory_order_relaxed);\n\t\treturn count > 0 ? static_cast<std::size_t>(count) : 0;\n\t}\n};\n\n}   // end namespace moodycamel\n"
  },
  {
    "path": "samples.md",
    "content": "# Samples for moodycamel::ConcurrentQueue\n\nHere are some example usage scenarios with sample code. Note that most\nuse the simplest version of each available method for demonstration purposes,\nbut they can all be adapted to use tokens and/or the corresponding bulk methods for\nextra speed.\n\n\n## Hello queue\n```C++\nConcurrentQueue<int> q;\n\nfor (int i = 0; i != 123; ++i)\n\tq.enqueue(i);\n\nint item;\nfor (int i = 0; i != 123; ++i) {\n\tq.try_dequeue(item);\n\tassert(item == i);\n}\n```\n\n## Hello concurrency\n\nBasic example of how to use the queue from multiple threads, with no\nparticular goal (i.e. it does nothing, but in an instructive way).\n```C++\nConcurrentQueue<int> q;\nint dequeued[100] = { 0 };\nstd::thread threads[20];\n\n// Producers\nfor (int i = 0; i != 10; ++i) {\n\tthreads[i] = std::thread([&](int i) {\n\t\tfor (int j = 0; j != 10; ++j) {\n\t\t\tq.enqueue(i * 10 + j);\n\t\t}\n\t}, i);\n}\n\n// Consumers\nfor (int i = 10; i != 20; ++i) {\n\tthreads[i] = std::thread([&]() {\n\t\tint item;\n\t\tfor (int j = 0; j != 20; ++j) {\n\t\t\tif (q.try_dequeue(item)) {\n\t\t\t\t++dequeued[item];\n\t\t\t}\n\t\t}\n\t});\n}\n\n// Wait for all threads\nfor (int i = 0; i != 20; ++i) {\n\tthreads[i].join();\n}\n\n// Collect any leftovers (could be some if e.g. consumers finish before producers)\nint item;\nwhile (q.try_dequeue(item)) {\n\t++dequeued[item];\n}\n\n// Make sure everything went in and came back out!\nfor (int i = 0; i != 100; ++i) {\n\tassert(dequeued[i] == 1);\n}\n```\n\n## Bulk up\n\nSame as previous example, but runs faster.\n```C++\nConcurrentQueue<int> q;\nint dequeued[100] = { 0 };\nstd::thread threads[20];\n\n// Producers\nfor (int i = 0; i != 10; ++i) {\n\tthreads[i] = std::thread([&](int i) {\n\t\tint items[10];\n\t\tfor (int j = 0; j != 10; ++j) {\n\t\t\titems[j] = i * 10 + j;\n\t\t}\n\t\tq.enqueue_bulk(items, 10);\n\t}, i);\n}\n\n// Consumers\nfor (int i = 10; i != 20; ++i) {\n\tthreads[i] = std::thread([&]() {\n\t\tint items[20];\n\t\tfor (std::size_t count = q.try_dequeue_bulk(items, 20); count != 0; --count) {\n\t\t\t++dequeued[items[count - 1]];\n\t\t}\n\t});\n}\n\n// Wait for all threads\nfor (int i = 0; i != 20; ++i) {\n\tthreads[i].join();\n}\n\n// Collect any leftovers (could be some if e.g. consumers finish before producers)\nint items[10];\nstd::size_t count;\nwhile ((count = q.try_dequeue_bulk(items, 10)) != 0) {\n\tfor (std::size_t i = 0; i != count; ++i) {\n\t\t++dequeued[items[i]];\n\t}\n}\n\n// Make sure everything went in and came back out!\nfor (int i = 0; i != 100; ++i) {\n\tassert(dequeued[i] == 1);\n}\n```\n\n## Producer/consumer model (simultaneous)\n\nIn this model, one set of threads is producing items,\nand the other is consuming them concurrently until all of\nthem have been consumed. The counters are required to\nensure that all items eventually get consumed.\n```C++\nConcurrentQueue<Item> q;\nconst int ProducerCount = 8;\nconst int ConsumerCount = 8;\nstd::thread producers[ProducerCount];\nstd::thread consumers[ConsumerCount];\nstd::atomic<int> doneProducers(0);\nstd::atomic<int> doneConsumers(0);\nfor (int i = 0; i != ProducerCount; ++i) {\n\tproducers[i] = std::thread([&]() {\n\t\twhile (produce) {\n\t\t\tq.enqueue(produceItem());\n\t\t}\n\t\tdoneProducers.fetch_add(1, std::memory_order_release);\n\t});\n}\nfor (int i = 0; i != ConsumerCount; ++i) {\n\tconsumers[i] = std::thread([&]() {\n\t\tItem item;\n\t\tbool itemsLeft;\n\t\tdo {\n\t\t\t// It's important to fence (if the producers have finished) *before* dequeueing\n\t\t\titemsLeft = doneProducers.load(std::memory_order_acquire) != ProducerCount;\n\t\t\twhile (q.try_dequeue(item)) {\n\t\t\t\titemsLeft = true;\n\t\t\t\tconsumeItem(item);\n\t\t\t}\n\t\t} while (itemsLeft || doneConsumers.fetch_add(1, std::memory_order_acq_rel) + 1 == ConsumerCount);\n\t\t// The condition above is a bit tricky, but it's necessary to ensure that the\n\t\t// last consumer sees the memory effects of all the other consumers before it\n\t\t// calls try_dequeue for the last time\n\t});\n}\nfor (int i = 0; i != ProducerCount; ++i) {\n\tproducers[i].join();\n}\nfor (int i = 0; i != ConsumerCount; ++i) {\n\tconsumers[i].join();\n}\n```\n## Producer/consumer model (simultaneous, blocking)\n\nThe blocking version is different, since either the number of elements being produced needs\nto be known ahead of time, or some other coordination is required to tell the consumers when\nto stop calling wait_dequeue (not shown here). This is necessary because otherwise a consumer\ncould end up blocking forever -- and destroying a queue while a consumer is blocking on it leads\nto undefined behaviour.\n```C++\nBlockingConcurrentQueue<Item> q;\nconst int ProducerCount = 8;\nconst int ConsumerCount = 8;\nstd::thread producers[ProducerCount];\nstd::thread consumers[ConsumerCount];\nstd::atomic<int> promisedElementsRemaining(ProducerCount * 1000);\nfor (int i = 0; i != ProducerCount; ++i) {\n\tproducers[i] = std::thread([&]() {\n\t\tfor (int j = 0; j != 1000; ++j) {\n\t\t\tq.enqueue(produceItem());\n\t\t}\n\t});\n}\nfor (int i = 0; i != ConsumerCount; ++i) {\n\tconsumers[i] = std::thread([&]() {\n\t\tItem item;\n\t\twhile (promisedElementsRemaining.fetch_sub(1, std::memory_order_relaxed) > 0) {\n\t\t\tq.wait_dequeue(item);\n\t\t\tconsumeItem(item);\n\t\t}\n\t});\n}\nfor (int i = 0; i != ProducerCount; ++i) {\n\tproducers[i].join();\n}\nfor (int i = 0; i != ConsumerCount; ++i) {\n\tconsumers[i].join();\n}\n```\n\n## Producer/consumer model (separate stages)\n```C++\nConcurrentQueue<Item> q;\n\n// Production stage\nstd::thread threads[8];\nfor (int i = 0; i != 8; ++i) {\n\tthreads[i] = std::thread([&]() {\n\t\twhile (produce) {\n\t\t\tq.enqueue(produceItem());\n\t\t}\n\t});\n}\nfor (int i = 0; i != 8; ++i) {\n\tthreads[i].join();\n}\n\n// Consumption stage\nstd::atomic<int> doneConsumers(0);\nfor (int i = 0; i != 8; ++i) {\n\tthreads[i] = std::thread([&]() {\n\t\tItem item;\n\t\tdo {\n\t\t\twhile (q.try_dequeue(item)) {\n\t\t\t\tconsumeItem(item);\n\t\t\t}\n\t\t\t// Loop again one last time if we're the last producer (with the acquired\n\t\t\t// memory effects of the other producers):\n\t\t} while (doneConsumers.fetch_add(1, std::memory_order_acq_rel) + 1 == 8);\n\t});\n}\nfor (int i = 0; i != 8; ++i) {\n\tthreads[i].join();\n}\n```\nNote that there's no point trying to use the blocking queue with this model, since\nthere's no need to use the `wait` methods (all the elements are produced before any\nare consumed), and hence the complexity would be the same but with additional overhead.\n\n\n## Object pool\n\nIf you don't know what threads will be using the queue in advance,\nyou can't really declare any long-term tokens. The obvious solution\nis to use the implicit methods (that don't take any tokens):\n```C++\n// A pool of 'Something' objects that can be safely accessed\n// from any thread\nclass SomethingPool\n{\npublic:\n    Something getSomething()\n    {\n\tSomething obj;\n\tqueue.try_dequeue(obj);\n\n\t// If the dequeue succeeded, obj will be an object from the\n\t// thread pool, otherwise it will be the default-constructed\n\t// object as declared above\n\treturn obj;\n    }\n\n    void recycleSomething(Something&& obj)\n    {\n\tqueue.enqueue(std::move(obj));\n    }\n};\n```\n\n## Threadpool task queue\n```C++\nBlockingConcurrentQueue<Task> q;\n\n// To create a task from any thread:\nq.enqueue(...);\n\n// On threadpool threads:\nTask task;\nwhile (true) {\n\tq.wait_dequeue(task);\n\n\t// Process task...\n}\n```\n\n## Multithreaded game loop\n```C++\nBlockingConcurrentQueue<Task> q;\nstd::atomic<int> pendingTasks(0);\n\n// On threadpool threads:\nTask task;\nwhile (true) {\n\tq.wait_dequeue(task);\n\n\t// Process task...\n\n\tpendingTasks.fetch_add(-1, std::memory_order_release);\n}\n\n// Whenever a new task needs to be processed for the frame:\npendingTasks.fetch_add(1, std::memory_order_release);\nq.enqueue(...);\n\n// To wait for all the frame's tasks to complete before rendering:\nwhile (pendingTasks.load(std::memory_order_acquire) != 0)\n\tcontinue;\n\n// Alternatively you could help out the thread pool while waiting:\nwhile (pendingTasks.load(std::memory_order_acquire) != 0) {\n\tif (!q.try_dequeue(task)) {\n\t\tcontinue;\n\t}\n\n\t// Process task...\n\n\tpendingTasks.fetch_add(-1, std::memory_order_release);\n}\n```\n\n## Pump until empty\n\nThis might be useful if, for example, you want to process any remaining items\nin the queue before it's destroyed. Note that it is your responsibility\nto ensure that the memory effects of any enqueue operations you wish to see on\nthe dequeue thread are visible (i.e. if you're waiting for a certain set of elements,\nyou need to use memory fences to ensure that those elements are visible to the dequeue\nthread after they've been enqueued).\n```C++\nConcurrentQueue<Item> q;\n\n// Single-threaded pumping:\nItem item;\nwhile (q.try_dequeue(item)) {\n\t// Process item...\n}\n// q is guaranteed to be empty here, unless there is another thread enqueueing still or\n// there was another thread dequeueing at one point and its memory effects have not\n// yet been propagated to this thread.\n\n// Multi-threaded pumping:\nstd::thread threads[8];\nstd::atomic<int> doneConsumers(0);\nfor (int i = 0; i != 8; ++i) {\n\tthreads[i] = std::thread([&]() {\n\t\tItem item;\n\t\tdo {\n\t\t\twhile (q.try_dequeue(item)) {\n\t\t\t\t// Process item...\n\t\t\t}\n\t\t} while (doneConsumers.fetch_add(1, std::memory_order_acq_rel) + 1 == 8);\n\t\t// If there are still enqueue operations happening on other threads,\n\t\t// then the queue may not be empty at this point. However, if all enqueue\n\t\t// operations completed before we finished pumping (and the propagation of\n\t\t// their memory effects too), and all dequeue operations apart from those\n\t\t// our threads did above completed before we finished pumping (and the\n\t\t// propagation of their memory effects too), then the queue is guaranteed\n\t\t// to be empty at this point.\n\t});\n}\nfor (int i = 0; i != 8; ++i) {\n\tthreads[i].join();\n}\n```\n\n## Wait for a queue to become empty (without dequeueing)\n\nYou can't (robustly) :-) However, you can set up your own atomic counter and\npoll that instead (see the game loop example). If you're satisfied with merely an estimate, you can use\n`size_approx()`. Note that `size_approx()` may return 0 even if the queue is\nnot completely empty, unless the queue has already stabilized first (no threads\nare enqueueing or dequeueing, and all memory effects of any previous operations\nhave been propagated to the thread before it calls `size_approx()`).\n"
  },
  {
    "path": "tests/CDSChecker/README.txt",
    "content": "These tests require CDSChecker to be checked out into a subdirectory\r\nnamed 'model-checker'.\r\n\r\nCDSChecker can be obtained from: git://demsky.eecs.uci.edu/model-checker.git\r\nThe version last used for testing was: da671f78d0aa057272bb82f580b36a188b6331bd\r\n"
  },
  {
    "path": "tests/CDSChecker/corealgo.h",
    "content": "// ©2013 Cameron Desrochers\n\n// Provides the core enqueue/dequeue algorithm of moodycamel::ConcurrentQueue\n// for testing with CDSChecker (a C++11 memory model checking tool).\n// See http://demsky.eecs.uci.edu/c11modelchecker.html for more info.\n\n#pragma once\n\n#include \"model-checker/include/atomic\"\n#include \"model-checker/include/librace.h\"\n#include \"model-checker/include/model-assert.h\"\n\n#ifndef CHAR_BIT\n#define CHAR_BIT 8\n#endif\n\ntypedef unsigned int index_t;\nstatic std::atomic<index_t> headIndex;\nstatic std::atomic<index_t> tailIndex;\nstatic std::atomic<index_t> dequeueOvercommit;\nstatic std::atomic<index_t> dequeueOptimisticCount;\n\nstatic const unsigned int BLOCK_SIZE = 256;\nstatic int block[BLOCK_SIZE];\n\nstatic void init()\n{\n\theadIndex.store(0, std::memory_order_relaxed);\n\ttailIndex.store(0, std::memory_order_relaxed);\n\tdequeueOvercommit.store(0, std::memory_order_relaxed);\n\tdequeueOptimisticCount.store(0, std::memory_order_relaxed);\n}\n\ntemplate<typename T>\nstatic inline bool circular_less_than(T a, T b)\n{\n\treturn static_cast<T>(a - b) > static_cast<T>(static_cast<T>(1) << static_cast<T>(sizeof(T) * CHAR_BIT - 1));\n}\n\nstatic void enqueue(int element)\n{\n\tindex_t currentTailIndex = tailIndex.load(std::memory_order_relaxed);\n\tindex_t newTailIndex = 1 + currentTailIndex;\n\t\n\tstore_32(&block[currentTailIndex & (BLOCK_SIZE - 1)], element);\n\t\n\ttailIndex.store(newTailIndex, std::memory_order_release);\n}\n\nstatic bool try_dequeue(int& element)\n{\n\tauto tail = tailIndex.load(std::memory_order_relaxed);\n\tauto overcommit = dequeueOvercommit.load(std::memory_order_relaxed);\n\tif (circular_less_than<index_t>(dequeueOptimisticCount.load(std::memory_order_relaxed) - overcommit, tail)) {\n\t\t// Might be something to dequeue, let's give it a try\n\t\t\n\t\t// Note that this if is purely for performance purposes in the common case when the queue is\n\t\t// empty and the values are eventually consistent -- we may enter here spuriously.\n\t\t\n\t\t// Note that whatever the values of overcommit and tail are, they are not going to change (unless we\n\t\t// change them) and must be the same value at this point (inside the if) as when the if condition was\n\t\t// evaluated.\n\n\t\t// We insert an acquire fence here to synchronize-with the release upon incrementing dequeueOvercommit below.\n\t\t// This ensures that whatever the value we got loaded into overcommit, the load of dequeueOptisticCount in\n\t\t// the fetch_add below will result in a value at least as recent as that (and therefore at least as large).\n\t\t// Note that I believe a compiler (signal) fence here would be sufficient due to the nature of fetch_add (all\n\t\t// read-modify-write operations are guaranteed to work on the latest value in the modification order), but\n\t\t// unfortunately that can't be shown to be correct using only the C++11 standard.\n\t\t// See http://stackoverflow.com/questions/18223161/what-are-the-c11-memory-ordering-guarantees-in-this-corner-case\n\t\tstd::atomic_thread_fence(std::memory_order_acquire);\n\t\t\n\t\t// Increment optimistic counter, then check if it went over the boundary\n\t\tauto myDequeueCount = dequeueOptimisticCount.fetch_add(1, std::memory_order_relaxed);\n\t\t\n\t\t// Note that since dequeueOvercommit must be <= dequeueOptimisticCount (because dequeueOvercommit is only ever\n\t\t// incremented after dequeueOptimisticCount -- this is enforced in the `else` block below), and since we now\n\t\t// have a version of dequeueOptimisticCount that is at least as recent as overcommit (due to the release upon\n\t\t// incrementing dequeueOvercommit and the acquire above that synchronizes with it), overcommit <= myDequeueCount.\n\t\tMODEL_ASSERT(overcommit <= myDequeueCount);\n\t\t\n\t\t// Note that we reload tail here in case it changed; it will be the same value as before or greater, since\n\t\t// this load is sequenced after (happens after) the earlier load above. This is supported by read-read\n\t\t// coherance (as defined in the standard), explained here: http://en.cppreference.com/w/cpp/atomic/memory_order\n\t\tauto newTail = tailIndex.load(std::memory_order_acquire);\n\t\tMODEL_ASSERT(newTail >= tail);\n\t\ttail = newTail;\n\t\tif (circular_less_than<index_t>(myDequeueCount - overcommit, tail)) {\n\t\t\t// Guaranteed to be at least one element to dequeue!\n\t\t\t\n\t\t\t// Get the index. Note that since there's guaranteed to be at least one element, this\n\t\t\t// will never exceed the true value of tail (but may exceed the value we read above).\n\t\t\tauto index = headIndex.fetch_add(1, std::memory_order_acq_rel);\n\t\t\t\n\t\t\t// Dequeue\n\t\t\telement = load_32(&block[index & (BLOCK_SIZE - 1)]);\n\t\t\t\n\t\t\treturn true;\n\t\t}\n\t\telse {\n\t\t\t// Wasn't anything to dequeue after all; make the effective dequeue count eventually consistent\n\t\t\tdequeueOvercommit.fetch_add(1, std::memory_order_release);\t\t// Release so that the fetch_add on dequeueOptimisticCount is guaranteed to happen before this write\n\t\t}\n\t}\n\n\treturn false;\n}\n\nstatic int size_approx()\n{\n\tauto tail = tailIndex.load(std::memory_order_relaxed);\n\tauto head = headIndex.load(std::memory_order_relaxed);\n\treturn circular_less_than(head, tail) ? static_cast<int>(tail - head) : 0;\n}\n"
  },
  {
    "path": "tests/CDSChecker/enqueue_dequeue_many.cpp",
    "content": "// ©2013 Cameron Desrochers.\n// Distributed under the simplified BSD license (see the LICENSE file that\n// should have come with this file).\n\n#include \"model-checker/include/threads.h\"\n#include \"corealgo.h\"\n\nvoid consumer(void* param)\n{\n\tint id = *(int*)param;\n\tint& dequeueCount = *(int*)param;\n\tdequeueCount = 0;\n\t\n\tint last = 0;\n\t\n\tint element;\n\tbool success = try_dequeue(element);\n\tif (success) {\n\t\tMODEL_ASSERT(element > last);\n\t\tlast = element;\n\t\t++dequeueCount;\n\t}\n\tsuccess = try_dequeue(element);\n\tif (success) {\n\t\tMODEL_ASSERT(element > last);\n\t\tlast = element;\n\t\t++dequeueCount;\n\t}\n}\n\nvoid producer(void* param)\n{\n\tfor (int i = 1; i <= 8; ++i)\n\t\tenqueue(i);\n\n\tconsumer(param);\n}\n\nint user_main(int, char**)\n{\n\tinit();\n\t\n\t// Start out as thread IDs, but are re-used by the threads\n\t// to indicate the number of elements each one dequeued\n\tint w = 1, x = 2, y = 3, z = 4;\n\t\n\tthrd_t a, b, c, d;\n\t\n\tthrd_create(&a, &producer, &w);\n\tthrd_create(&b, &consumer, &x);\n\tthrd_create(&c, &consumer, &y);\n\tthrd_create(&d, &consumer, &z);\n\t\n\tthrd_join(a);\n\tthrd_join(b);\n\tthrd_join(c);\n\tthrd_join(d);\n\t\n\tMODEL_ASSERT(w + x + y + z + size_approx() == 8);\n\t\n\treturn 0;\n}\n"
  },
  {
    "path": "tests/CDSChecker/enqueue_dequeue_one.cpp",
    "content": "// ©2013 Cameron Desrochers.\n// Distributed under the simplified BSD license (see the LICENSE file that\n// should have come with this file).\n\n#include \"model-checker/include/threads.h\"\n#include \"corealgo.h\"\n\nvoid producer_thread(void*)\n{\n\tenqueue(1234);\n}\n\nvoid consumer_thread(void*)\n{\n\tint element;\n\tbool result = try_dequeue(element);\n\tMODEL_ASSERT(!result || element == 1234);\n\t\n\tif (result) {\n\t\tMODEL_ASSERT(!try_dequeue(element));\n\t}\n}\n\nint user_main(int, char**)\n{\n\tinit();\n\t\n\tthrd_t p, c;\n\t\n\tthrd_create(&p, &producer_thread, nullptr);\n\tthrd_create(&c, &consumer_thread, nullptr);\n\t\n\tthrd_join(p);\n\tthrd_join(c);\n\t\n\treturn 0;\n}\n"
  },
  {
    "path": "tests/CDSChecker/makefile",
    "content": "default: enqueue_dequeue_one.o enqueue_dequeue_many.o\n\nenqueue_dequeue_one.o: CDSChecker makefile enqueue_dequeue_many.cpp enqueue_dequeue_one.cpp corealgo.h\n\tg++ -std=c++11 -DNDEBUG -O3 enqueue_dequeue_one.cpp -o enqueue_dequeue_one.o -Lmodel-checker -lmodel\n\nenqueue_dequeue_many.o: CDSChecker makefile enqueue_dequeue_many.cpp corealgo.h\n\tg++ -std=c++11 -DNDEBUG -O3 enqueue_dequeue_many.cpp -o enqueue_dequeue_many.o -Lmodel-checker -lmodel\n\nCDSChecker:\n\t$(MAKE) -C model-checker\n\nrun: enqueue_dequeue_one.o enqueue_dequeue_many.o\n\tcd model-checker && ./run.sh ../enqueue_dequeue_one.o > ../enqueue_dequeue_one.log\n\tcd model-checker && ./run.sh ../enqueue_dequeue_many.o > ../enqueue_dequeue_many.log\n"
  },
  {
    "path": "tests/common/simplethread.cpp",
    "content": "// ©2013 Cameron Desrochers\r\n\r\n#include \"simplethread.h\"\r\n\r\n#if defined(_WIN32)\r\n#define WIN32_LEAN_AND_MEAN\r\n#include <windows.h>\r\n\r\nstruct SimpleThread::ThreadRef\r\n{\r\n\tHANDLE handle;\r\n\r\n\tstatic DWORD WINAPI ThreadProc(LPVOID param)\r\n\t{\r\n\t\tauto threadRef = static_cast<ThreadRef*>(param);\r\n\t\tthreadRef->callbackFunc(threadRef->callbackObj);\r\n\t\treturn 0;\r\n\t}\r\n\t\r\n\tThreadRef(void* callbackObj, CallbackFunc callbackFunc)\r\n\t\t: callbackObj(callbackObj), callbackFunc(callbackFunc)\r\n\t{\r\n\t}\r\n\t\r\n\tvoid* callbackObj;\r\n\tCallbackFunc callbackFunc;\r\n};\r\n\r\nvoid SimpleThread::startThread(void* callbackObj, CallbackFunc callbackFunc)\r\n{\r\n\tthread = new ThreadRef(callbackObj, callbackFunc);\r\n\tthread->handle = CreateThread(NULL, StackSize, &ThreadRef::ThreadProc, thread, 0, NULL);\r\n}\r\n\r\nvoid SimpleThread::join()\r\n{\r\n\tif (thread != nullptr && thread->handle != NULL) {\r\n\t\tWaitForSingleObject(thread->handle, INFINITE);\r\n\t\tCloseHandle(thread->handle);\r\n\t\tthread->handle = NULL;\r\n\t}\r\n}\r\n#else\r\n#include <thread>\r\n\r\nstruct SimpleThread::ThreadRef\r\n{\r\n\tstd::thread thread;\r\n\r\n\tstatic void threadProc(ThreadRef* threadRef)\r\n\t{\r\n\t\tthreadRef->callbackFunc(threadRef->callbackObj);\r\n\t}\r\n\t\r\n\tThreadRef(void* callbackObj, CallbackFunc callbackFunc)\r\n\t\t: callbackObj(callbackObj), callbackFunc(callbackFunc)\r\n\t{\r\n\t}\r\n\t\r\n\tvoid* callbackObj;\r\n\tCallbackFunc callbackFunc;\r\n};\r\n\r\nvoid SimpleThread::startThread(void* callbackObj, CallbackFunc callbackFunc)\r\n{\r\n\tthread = new ThreadRef(callbackObj, callbackFunc);\r\n\tthread->thread = std::thread(&ThreadRef::threadProc, thread);\r\n}\r\n\r\nvoid SimpleThread::join()\r\n{\r\n\tif (thread != nullptr && thread->thread.joinable()) {\r\n\t\tthread->thread.join();\r\n\t}\r\n}\r\n#endif\r\n\r\nSimpleThread::~SimpleThread()\r\n{\r\n\tif (thread != nullptr) {\r\n\t\tjoin();\r\n\t\tdelete thread;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "tests/common/simplethread.h",
    "content": "// ©2013 Cameron Desrochers\r\n\r\n#pragma once\r\n\r\n// Like C++11's std::thread, but with a reduced API, and works on Windows with MSVC2010+.\r\n// Wraps std::thread on other OSes. Perhaps the most significant departure between\r\n// std::thread and this mini-library is that join() is called implicitly in the destructor,\r\n// if the thread is joinable. The thread callback functions should not throw exceptions.\r\n\r\n#include <utility>\r\n#include <type_traits>\r\n\r\n\r\nnamespace details\r\n{\r\n\ttemplate<typename TArg1 = void, typename TArg2 = void, typename TArg3 = void>\r\n\tstruct ArgWrapper\r\n\t{\r\n\t\ttypename std::remove_reference<TArg1>::type arg1;\r\n\t\ttypename std::remove_reference<TArg2>::type arg2;\r\n\t\ttypename std::remove_reference<TArg3>::type arg3;\r\n\t\tArgWrapper(ArgWrapper const& o) : arg1(o.arg1), arg2(o.arg2), arg3(o.arg3) { }\r\n\t\tArgWrapper(ArgWrapper&& o) : arg1(std::move(o.arg1)), arg2(std::move(o.arg2)), arg3(std::move(o.arg3)) { }\r\n\t\ttemplate<typename T, typename U, typename V>\r\n\t\tArgWrapper(T&& a1, U&& a2, V&& a3) : arg1(std::forward<T>(a1)), arg2(std::forward<U>(a2)), arg3(std::forward<V>(a3)) { }\r\n\t\ttemplate<typename TCallback>\r\n\t\tvoid callCallback(TCallback&& callback) const { std::forward<TCallback>(callback)(std::move(arg1), std::move(arg2), std::move(arg3)); }\r\n\t};\r\n\t\r\n\ttemplate<typename TArg1, typename TArg2>\r\n\tstruct ArgWrapper<TArg1, TArg2, void>\r\n\t{\r\n\t\ttypename std::remove_reference<TArg1>::type arg1;\r\n\t\ttypename std::remove_reference<TArg2>::type arg2;\r\n\t\tArgWrapper(ArgWrapper const& o) : arg1(o.arg1), arg2(o.arg2) { }\r\n\t\tArgWrapper(ArgWrapper&& o) : arg1(std::move(o.arg1)), arg2(std::move(o.arg2)) { }\r\n\t\ttemplate<typename T, typename U>\r\n\t\tArgWrapper(T&& a1, U&& a2) : arg1(std::forward<T>(a1)), arg2(std::forward<U>(a2)) { }\r\n\t\ttemplate<typename TCallback>\r\n\t\tvoid callCallback(TCallback&& callback) const { std::forward<TCallback>(callback)(std::move(arg1), std::move(arg2)); }\r\n\t};\r\n\t\r\n\ttemplate<typename TArg1>\r\n\tstruct ArgWrapper<TArg1, void, void>\r\n\t{\r\n\t\ttypename std::remove_reference<TArg1>::type arg1;\r\n\t\tArgWrapper(ArgWrapper const& o) : arg1(o.arg1) { }\r\n\t\tArgWrapper(ArgWrapper&& o) : arg1(std::move(o.arg1)) { }\r\n\t\ttemplate<typename T>\r\n\t\tArgWrapper(T&& a1) : arg1(std::forward<T>(a1)) { }\r\n\t\ttemplate<typename TCallback>\r\n\t\tvoid callCallback(TCallback&& callback) const { std::forward<TCallback>(callback)(std::move(arg1)); }\r\n\t};\r\n\t\r\n\ttemplate<> struct ArgWrapper<void, void, void>\r\n\t{\r\n\t\ttemplate<typename TCallback> void callCallback(TCallback&& callback) const { std::forward<TCallback>(callback)(); }\r\n\t};\r\n}\r\n\r\n\r\nclass SimpleThread\r\n{\r\nprivate:\r\n\tstruct ThreadRef;\r\n\t\r\n\ttemplate<typename TCallback, typename TArgs>\r\n\tstruct CallbackWrapper\r\n\t{\r\n\t\ttemplate<typename U>\r\n\t\tCallbackWrapper(TCallback&& callback, U&& args)\r\n\t\t\t: callback(std::forward<TCallback>(callback)), args(std::forward<U>(args))\r\n\t\t{\r\n\t\t}\r\n\r\n\t\tstatic void callAndDelete(void* wrapper)\r\n\t\t{\r\n\t\t\tauto typedWrapper = static_cast<CallbackWrapper*>(wrapper);\r\n\t\t\ttypedWrapper->args.callCallback(std::move(typedWrapper->callback));\r\n\t\t\tdelete typedWrapper;\r\n\t\t}\r\n\r\n\t\ttypename std::decay<TCallback>::type callback;\r\n\t\tTArgs args;\r\n\t};\r\n\t\r\n\ttypedef void (*CallbackFunc)(void*);\r\n\r\n\tvoid startThread(void* callbackObj, CallbackFunc callbackFunc);\r\n\r\n\r\npublic:\r\n\tstatic const int StackSize = 4 * 1024;\t// bytes\r\n\r\n\tSimpleThread() : thread(nullptr) {  }\r\n\r\n\tSimpleThread(SimpleThread&& other)\r\n\t\t: thread(other.thread)\r\n\t{\r\n\t\tother.thread = nullptr;\r\n\t}\r\n\t\r\n\tSimpleThread& operator=(SimpleThread&& other)\r\n\t{\r\n\t\tthread = other.thread;\r\n\t\tother.thread = nullptr;\r\n\t\treturn *this;\r\n\t}\r\n\t\r\n\t// Disable copying and copy-assignment\r\nprivate:\r\n\tSimpleThread(SimpleThread const&);\r\n\tSimpleThread& operator=(SimpleThread const&);\r\npublic:\r\n\r\n\ttemplate<typename TCallback>\r\n\texplicit SimpleThread(TCallback&& callback)\r\n\t{\r\n\t\tauto wrapper = new CallbackWrapper<TCallback, ::details::ArgWrapper<>>(\r\n\t\t\tstd::forward<TCallback>(callback),\r\n\t\t\t::details::ArgWrapper<>()\r\n\t\t);\r\n\t\tstartThread(wrapper, &CallbackWrapper<TCallback, ::details::ArgWrapper<>>::callAndDelete);\r\n\t}\r\n\r\n\ttemplate<typename TCallback, typename TArg1>\r\n\texplicit SimpleThread(TCallback&& callback, TArg1&& arg1)\r\n\t{\r\n\t\tauto wrapper = new CallbackWrapper<TCallback, ::details::ArgWrapper<TArg1>>(\r\n\t\t\tstd::forward<TCallback>(callback),\r\n\t\t\t::details::ArgWrapper<TArg1>(std::forward<TArg1>(arg1))\r\n\t\t);\r\n\t\tstartThread(wrapper, &CallbackWrapper<TCallback, ::details::ArgWrapper<TArg1>>::callAndDelete);\r\n\t}\r\n\r\n\ttemplate<typename TCallback, typename TArg1, typename TArg2>\r\n\texplicit SimpleThread(TCallback&& callback, TArg1&& arg1, TArg2&& arg2)\r\n\t{\r\n\t\tauto wrapper = new CallbackWrapper<TCallback, ::details::ArgWrapper<TArg1, TArg2>>(\r\n\t\t\tstd::forward<TCallback>(callback),\r\n\t\t\t::details::ArgWrapper<TArg1, TArg2>(std::forward<TArg1>(arg1), std::forward<TArg2>(arg2))\r\n\t\t);\r\n\t\tstartThread(wrapper, &CallbackWrapper<TCallback, ::details::ArgWrapper<TArg1, TArg2>>::callAndDelete);\r\n\t}\r\n\r\n\ttemplate<typename TCallback, typename TArg1, typename TArg2, typename TArg3>\r\n\texplicit SimpleThread(TCallback&& callback, TArg1&& arg1, TArg2&& arg2, TArg3&& arg3)\r\n\t{\r\n\t\tauto wrapper = new CallbackWrapper<TCallback, ::details::ArgWrapper<TArg1, TArg2, TArg3>>(\r\n\t\t\tstd::forward<TCallback>(callback),\r\n\t\t\t::details::ArgWrapper<TArg1, TArg2, TArg3>(std::forward<TArg1>(arg1), std::forward<TArg2>(arg2), std::forward<TArg3>(arg3))\r\n\t\t);\r\n\t\tstartThread(wrapper, &CallbackWrapper<TCallback, ::details::ArgWrapper<TArg1, TArg2, TArg3>>::callAndDelete);\r\n\t}\r\n\t\r\n\t~SimpleThread();\r\n\r\n\tvoid join();\r\n\r\nprivate:\r\n\tThreadRef* thread;\r\n};\r\n"
  },
  {
    "path": "tests/common/systemtime.cpp",
    "content": "// ©2013-2014 Cameron Desrochers\r\n\r\n#include \"systemtime.h\"\r\n#include <climits>\r\n\r\n#if defined(_MSC_VER) && _MSC_VER < 1700\r\n#include <intrin.h>\r\n#define CompilerMemBar() _ReadWriteBarrier()\r\n#else\r\n#include <atomic>\r\n#define CompilerMemBar() std::atomic_signal_fence(std::memory_order_seq_cst)\r\n#endif\r\n\r\n#if defined(ST_WINDOWS)\r\n\r\n#include <windows.h>\r\n\r\nnamespace moodycamel\r\n{\r\n\r\nvoid sleep(int milliseconds)\r\n{\r\n\t::Sleep(milliseconds);\r\n}\r\n\r\nSystemTime getSystemTime()\r\n{\r\n\tLARGE_INTEGER t;\r\n\tCompilerMemBar();\r\n\tif (!QueryPerformanceCounter(&t)) {\r\n\t\treturn static_cast<SystemTime>(-1);\r\n\t}\r\n\tCompilerMemBar();\r\n\t\r\n\treturn static_cast<SystemTime>(t.QuadPart);\r\n}\r\n\r\ndouble getTimeDelta(SystemTime start)\r\n{\r\n\tLARGE_INTEGER t;\r\n\tCompilerMemBar();\r\n\tif (start == static_cast<SystemTime>(-1) || !QueryPerformanceCounter(&t)) {\r\n\t\treturn -1;\r\n\t}\r\n\tCompilerMemBar();\r\n\r\n\tauto now = static_cast<SystemTime>(t.QuadPart);\r\n\r\n\tLARGE_INTEGER f;\r\n\tif (!QueryPerformanceFrequency(&f)) {\r\n\t\treturn -1;\r\n\t}\r\n\r\n#if defined(__GNUC__)\r\n#pragma GCC diagnostic push\r\n#pragma GCC diagnostic ignored \"-Wconversion\"\r\n#endif\r\n\treturn static_cast<double>(static_cast<__int64>(now - start)) / f.QuadPart * 1000;\r\n#if defined(__GNUC__)\r\n#pragma GCC diagnostic pop\r\n#endif\r\n}\r\n\r\n}  // end namespace moodycamel\r\n\r\n#elif defined(ST_APPLE)\r\n\r\n#include <mach/mach.h>\r\n#include <mach/mach_time.h>\r\n#include <unistd.h>\r\n#include <time.h>\r\n\r\nnamespace moodycamel\r\n{\r\n\r\nvoid sleep(int milliseconds)\r\n{\r\n\t::usleep(milliseconds * 1000);\r\n}\r\n\r\nSystemTime getSystemTime()\r\n{\r\n\tCompilerMemBar();\r\n\tstd::uint64_t result = mach_absolute_time();\r\n\tCompilerMemBar();\r\n\t\r\n\treturn result;\r\n}\r\n\r\ndouble getTimeDelta(SystemTime start)\r\n{\r\n\tCompilerMemBar();\r\n\tstd::uint64_t end = mach_absolute_time();\r\n\tCompilerMemBar();\r\n\r\n\tmach_timebase_info_data_t tb = { 0 };\r\n\tmach_timebase_info(&tb);\r\n\tdouble toNano = static_cast<double>(tb.numer) / tb.denom;\r\n\t\r\n\treturn static_cast<double>(end - start) * toNano * 0.000001;\r\n}\r\n\r\n}  // end namespace moodycamel\r\n\r\n#elif defined(ST_NIX)\r\n\r\n#include <unistd.h>\r\n\r\nnamespace moodycamel\r\n{\r\n\r\nvoid sleep(int milliseconds)\r\n{\r\n\t::usleep(milliseconds * 1000);\r\n}\r\n\r\nSystemTime getSystemTime()\r\n{\r\n\ttimespec t;\r\n\tCompilerMemBar();\r\n\tif (clock_gettime(CLOCK_MONOTONIC_RAW, &t) != 0) {\r\n\t\tt.tv_sec = (time_t)-1;\r\n\t\tt.tv_nsec = -1;\r\n\t}\r\n\tCompilerMemBar();\r\n\t\r\n\treturn t;\r\n}\r\n\r\ndouble getTimeDelta(SystemTime start)\r\n{\r\n\ttimespec t;\r\n\tCompilerMemBar();\r\n\tif ((start.tv_sec == (time_t)-1 && start.tv_nsec == -1) || clock_gettime(CLOCK_MONOTONIC_RAW, &t) != 0) {\r\n\t\treturn -1;\r\n\t}\r\n\tCompilerMemBar();\r\n\r\n\treturn static_cast<double>(static_cast<long>(t.tv_sec) - static_cast<long>(start.tv_sec)) * 1000 + double(t.tv_nsec - start.tv_nsec) / 1000000;\r\n}\r\n\r\n}  // end namespace moodycamel\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/common/systemtime.h",
    "content": "// ©2013-2014 Cameron Desrochers\r\n\r\n#pragma once\r\n\r\n#if defined(_WIN32)\r\n#define ST_WINDOWS\r\n#elif defined(__APPLE__) && defined(__MACH__)\r\n#define ST_APPLE\r\n#elif defined(__linux__) || defined(__FreeBSD__) || defined(BSD)\r\n#define ST_NIX\r\n#else\r\n#error \"Unknown platform\"\r\n#endif\r\n\r\n#if defined(ST_WINDOWS)\r\nnamespace moodycamel { typedef unsigned long long SystemTime; }\r\n#elif defined(ST_APPLE)\r\n#include <cstdint>\r\nnamespace moodycamel { typedef std::uint64_t SystemTime; }\r\n#elif defined(ST_NIX)\r\n#include <time.h>\r\nnamespace moodycamel { typedef timespec SystemTime; }\r\n#endif\r\n\r\nnamespace moodycamel\r\n{\r\nvoid sleep(int milliseconds);\r\n\r\nSystemTime getSystemTime();\r\n\r\n// Returns the delta time, in milliseconds\r\ndouble getTimeDelta(SystemTime start);\r\n}\r\n"
  },
  {
    "path": "tests/corealgos.h",
    "content": "// ©2014 Cameron Desrochers\n\n// moodycamel::ConcurrentQueue contains many inner data structures which\n// are difficult to test in isolation. So, this file contains copies of\n// them, extracted and isolated so as to be independently testable.\n\n#pragma once\n\n#include <atomic>\n#include <cstdint>\n#include <cstdlib>\n#include <algorithm>\n#include <utility>\n#include <limits>\n#include <cassert>\n\n\n// Define corealgos_allocator before including this header in order to override the\n// default malloc/free functions\n#ifndef corealgos_allocator\nstruct corealgos_allocator\n{\n\tstatic inline void* malloc(std::size_t size) { return std::malloc(size); }\n\tstatic inline void free(void* ptr) { std::free(ptr); }\n};\n#endif\n\n\n////////////////////////////////////////////////////////////////////////////////\n// Lock-free add-only list (e.g. used to track producers)\n////////////////////////////////////////////////////////////////////////////////\n\nnamespace moodycamel { namespace corealgos {\n\nstruct ListItem\n{\n\tListItem()\n\t\t: concurrentListPrev(nullptr)\n\t{\n\t}\n\t\npublic:\n\tstd::atomic<ListItem*> concurrentListPrev;\n};\n\ntemplate<typename T>\t\t// T should inherit ListItem or implement the same interface\nstruct ConcurrentAddOnlyList\n{\n\tConcurrentAddOnlyList()\n\t\t: tail_(nullptr)\n\t{\n\t}\n\t\n\tinline T* tail() { return tail_.load(std::memory_order_acquire); }\n\t\n\tvoid add(T* element)\n\t{\n\t\tassert(element != nullptr);\n\t\t\n\t\t// Add it to the lock-free list\n\t\tauto prevTail = tail_.load(std::memory_order_relaxed);\n\t\tdo {\n\t\t\telement->concurrentListPrev = prevTail;\n\t\t} while (!tail_.compare_exchange_weak(prevTail, element, std::memory_order_release, std::memory_order_relaxed));\n\t}\n\t\nprivate:\n\tstd::atomic<T*> tail_;\n};\n\n} }\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// Thread local hash map\n////////////////////////////////////////////////////////////////////////////////\n\n#if defined(__APPLE__)\n#include \"TargetConditionals.h\" // Needed for TARGET_OS_IPHONE\n#endif\n\n// Platform-specific definitions of a numeric thread ID type and an invalid value\n#if defined(_WIN32) || defined(__WINDOWS__) || defined(__WIN32__)\n// No sense pulling in windows.h in a header, we'll manually declare the function\n// we use and rely on backwards-compatibility for this not to break\nextern \"C\" __declspec(dllimport) unsigned long __stdcall GetCurrentThreadId(void);\nnamespace moodycamel { namespace corealgos { namespace details {\n\tstatic_assert(sizeof(unsigned long) == sizeof(std::uint32_t), \"Expected size of unsigned long to be 32 bits on Windows\");\n\ttypedef std::uint32_t thread_id_t;\n\tstatic const thread_id_t invalid_thread_id = 0;\t\t// See http://blogs.msdn.com/b/oldnewthing/archive/2004/02/23/78395.aspx\n\tstatic inline thread_id_t thread_id() { return static_cast<thread_id_t>(::GetCurrentThreadId()); }\n} } }\n#elif defined(__arm__) || defined(_M_ARM) || defined(__aarch64__) || (defined(__APPLE__) && TARGET_OS_IPHONE)\nnamespace moodycamel { namespace corealgos { namespace details {\n\ttypedef std::uintptr_t thread_id_t;\n\tstatic const thread_id_t invalid_thread_id = 0;\n\tstatic inline thread_id_t thread_id() { return std::hash<std::thread::id>()(std::this_thread::get_id()); }\n} } }\n#else\n// Use a nice trick from this answer: http://stackoverflow.com/a/8438730/21475\n// In order to get a numeric thread ID in a platform-independent way, we use a thread-local\n// static variable's address as a thread identifier :-)\n#if defined(__GNUC__) || defined(__INTEL_COMPILER)\n#define MOODYCAMEL_COREALGO_THREADLOCAL __thread\n#elif defined(_MSC_VER)\n#define MOODYCAMEL_COREALGO_THREADLOCAL __declspec(thread)\n#else\n// Assume C++11 compliant compiler\n#define MOODYCAMEL_COREALGO_THREADLOCAL thread_local\n#endif\nnamespace moodycamel { namespace corealgos { namespace details {\n\ttypedef std::uintptr_t thread_id_t;\n\tstatic const thread_id_t invalid_thread_id = 0;\t\t// Address can't be nullptr\n\tstatic inline thread_id_t thread_id() { static MOODYCAMEL_COREALGO_THREADLOCAL int x; return reinterpret_cast<thread_id_t>(&x); }\n} } }\n#endif\n\nnamespace moodycamel { namespace corealgos {\n\nnamespace details\n{\n\ttemplate<bool use32> struct _hash_32_or_64 {\n\t\tstatic inline std::size_t hash(std::uint32_t h)\n\t\t{\n\t\t\t// MurmurHash3 finalizer -- see https://code.google.com/p/smhasher/source/browse/trunk/MurmurHash3.cpp\n\t\t\t// Since the thread ID is already unique, all we really want to do is propagate that\n\t\t\t// uniqueness evenly across all the bits, so that we can use a subset of the bits while\n\t\t\t// reducing collisions significantly\n\t\t\th ^= h >> 16;\n\t\t\th *= 0x85ebca6b;\n\t\t\th ^= h >> 13;\n\t\t\th *= 0xc2b2ae35;\n\t\t\treturn static_cast<std::size_t>(h ^ (h >> 16));\n\t\t}\n\t};\n\ttemplate<> struct _hash_32_or_64<1> {\n\t\tstatic inline std::size_t hash(std::uint64_t h)\n\t\t{\n\t\t\th ^= h >> 33;\n\t\t\th *= 0xff51afd7ed558ccd;\n\t\t\th ^= h >> 33;\n\t\t\th *= 0xc4ceb9fe1a85ec53;\n\t\t\treturn static_cast<std::size_t>(h ^ (h >> 33));\n\t\t}\n\t};\n\ttemplate<std::size_t size> struct hash_32_or_64 : public _hash_32_or_64<(size > 4)> {  };\n\t\n\tstatic inline std::size_t hash_thread_id(thread_id_t id)\n\t{\n\t\tstatic_assert(sizeof(thread_id_t) <= 8, \"Expected a platform where thread IDs are at most 64-bit values\");\n\t\treturn hash_32_or_64<sizeof(thread_id_t)>::hash(id);\n\t}\n\t\n\ttemplate<typename U>\n\tstatic inline char* align_for(char* ptr)\n\t{\n\t\tconst std::size_t alignment = std::alignment_of<U>::value;\n\t\treturn ptr + (alignment - (reinterpret_cast<std::uintptr_t>(ptr) % alignment)) % alignment;\n\t}\n}\n\n\ntemplate<typename T>\t\t// T should inherit ListItem or implement the same interface\nstruct ThreadLocal\n{\n\texplicit ThreadLocal(std::size_t initialHashSize)\n\t\t: initialHashEntries(initialHashSize)\n\t{\n\t\tassert(initialHashSize > 0 && (initialHashSize & (initialHashSize - 1)) == 0);\n\t\t\n\t\tresizeInProgress.clear();\n\t\tcurrentHashCount.store(0, std::memory_order_relaxed);\n\t\tauto hash = &initialHash;\n\t\thash->capacity = initialHashSize;\n\t\thash->entries = &initialHashEntries[0];\n\t\tfor (std::size_t i = 0; i != initialHashSize; ++i) {\n\t\t\tinitialHashEntries[i].key.store(details::invalid_thread_id, std::memory_order_relaxed);\n\t\t}\n\t\thash->prev = nullptr;\n\t\tcurrentHash.store(hash, std::memory_order_relaxed);\n\t}\n\t\n\t~ThreadLocal()\n\t{\n\t\t// Destroy items\n\t\tauto ptr = items.tail();\n\t\twhile (ptr != nullptr) {\n\t\t\tauto prev = static_cast<T*>(ptr->concurrentListPrev.load(std::memory_order_relaxed));\n\t\t\tptr->~T();\n\t\t\tcorealgos_allocator::free(ptr);\n\t\t\tptr = prev;\n\t\t}\n\t\t\n\t\t// Destroy hash tables\n\t\tauto hash = currentHash.load(std::memory_order_relaxed);\n\t\twhile (hash != nullptr) {\n\t\t\tauto prev = hash->prev;\n\t\t\tif (prev != nullptr) {\t\t// The last hash is part of this object and was not allocated dynamically\n\t\t\t\tfor (std::size_t i = 0; i != hash->capacity; ++i) {\n\t                hash->entries[i].~KeyValuePair();\n\t            }\n\t            hash->~InnerHash();\n\t\t\t\tcorealgos_allocator::free(hash);\n\t\t\t}\n\t\t\thash = prev;\n\t\t}\n\t}\n\t\n\t// Only fails (returns nullptr) if memory allocation fails\n\tT* get_or_create()\n\t{\n\t\t// Note that since the data is essentially thread-local (key is thread ID),\n\t\t// there's a reduced need for fences (memory ordering is already consistent\n\t\t// for any individual thread), except for the current table itself\n\t\t\n\t\t// Start by looking for the thread ID in the current and all previous hash tables.\n\t\t// If it's not found, it must not be in there yet, since this same thread would\n\t\t// have added it previously to one of the tables that we traversed.\n\t\t\n\t\t// Code and algorithm adapted from http://preshing.com/20130605/the-worlds-simplest-lock-free-hash-table\n\t\t\n\t\tauto id = details::thread_id();\n\t\tauto hashedId = details::hash_thread_id(id);\n\t\t\n\t\tauto mainHash = currentHash.load(std::memory_order_acquire);\n\t\tfor (auto hash = mainHash; hash != nullptr; hash = hash->prev) {\n\t\t\t// Look for the id in this hash\n\t\t\tauto index = hashedId;\n\t\t\twhile (true) {\t\t// Not an infinite loop because at least one slot is free in the hash table\n\t\t\t\tindex &= hash->capacity - 1;\n\t\t\t\t\n\t\t\t\tauto probedKey = hash->entries[index].key.load(std::memory_order_relaxed);\n\t\t\t\tif (probedKey == id) {\n\t\t\t\t\t// Found it! If we had to search several hashes deep, though, we should lazily add it\n\t\t\t\t\t// to the current main hash table to avoid the extended search next time.\n\t\t\t\t\t// Note there's guaranteed to be room in the current hash table since every subsequent\n\t\t\t\t\t// table implicitly reserves space for all previous tables (there's only one\n\t\t\t\t\t// currentHashCount).\n\t\t\t\t\tauto value = hash->entries[index].value;\n\t\t\t\t\tif (hash != mainHash) {\n\t\t\t\t\t\tindex = hashedId;\n\t\t\t\t\t\twhile (true) {\n\t\t\t\t\t\t\tindex &= mainHash->capacity - 1;\n\t\t\t\t\t\t\tprobedKey = mainHash->entries[index].key.load(std::memory_order_relaxed);\n\t\t\t\t\t\t\tauto expected = details::invalid_thread_id;\n\t\t\t\t\t\t\tif (probedKey == expected && mainHash->entries[index].key.compare_exchange_strong(expected, id, std::memory_order_relaxed)) {\n\t\t\t\t\t\t\t\tmainHash->entries[index].value = value;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t++index;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t\tif (probedKey == details::invalid_thread_id) {\n\t\t\t\t\tbreak;\t\t// Not in this hash table\n\t\t\t\t}\n\t\t        ++index;\n\t\t    }\n\t\t}\n\t\t\n\t\t// Insert!\n\t\tauto newCount = 1 + currentHashCount.fetch_add(1, std::memory_order_relaxed);\n\t\twhile (true) {\n\t\t\tif (newCount >= (mainHash->capacity >> 1) && !resizeInProgress.test_and_set(std::memory_order_acquire)) {\n\t\t\t\t// We've acquired the resize lock, try to allocate a bigger hash table.\n\t\t\t\t// Note the acquire fence synchronizes with the release fence at the end of this block, and hence when\n\t\t\t\t// we reload currentHash it must be the most recent version (it only gets changed within this\n\t\t\t\t// locked block).\n\t\t\t\tmainHash = currentHash.load(std::memory_order_acquire);\n\t\t\t\tauto newCapacity = mainHash->capacity << 1;\n\t\t\t\twhile (newCount >= (newCapacity >> 1)) {\n\t\t\t\t\tnewCapacity <<= 1;\n\t\t\t\t}\n\t\t\t\tauto raw = static_cast<char*>(corealgos_allocator::malloc(sizeof(InnerHash) + std::alignment_of<KeyValuePair>::value - 1 + sizeof(KeyValuePair) * newCapacity));\n\t\t\t\tif (raw == nullptr) {\n\t\t\t\t\t// Allocation failed\n\t\t\t\t\tcurrentHashCount.fetch_add((uint32_t)-1, std::memory_order_relaxed);\n\t\t\t\t\tresizeInProgress.clear(std::memory_order_relaxed);\n\t\t\t\t\treturn nullptr;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tauto newHash = new (raw) InnerHash;\n\t\t\t\tnewHash->capacity = newCapacity;\n\t\t\t\tnewHash->entries = reinterpret_cast<KeyValuePair*>(details::align_for<KeyValuePair>(raw + sizeof(InnerHash)));\n\t\t\t\tfor (std::size_t i = 0; i != newCapacity; ++i) {\n\t\t\t\t\tnew (newHash->entries + i) KeyValuePair;\n\t\t\t\t\tnewHash->entries[i].key.store(details::invalid_thread_id, std::memory_order_relaxed);\n\t\t\t\t}\n\t\t\t\tnewHash->prev = mainHash;\n\t\t\t\tcurrentHash.store(newHash, std::memory_order_release);\n\t\t\t\tresizeInProgress.clear(std::memory_order_release);\n\t\t\t\tmainHash = newHash;\n\t\t\t}\n\t\t\t\n\t\t\t// If it's < three-quarters full, add to the old one anyway so that we don't have to wait for the next table\n\t\t\t// to finish being allocated by another thread (and if we just finished allocating above, the condition will\n\t\t\t// always be true)\n\t\t\tif (newCount < (mainHash->capacity >> 1) + (mainHash->capacity >> 2)) {\n\t\t\t\tauto element = (T*)corealgos_allocator::malloc(sizeof(T));\n\t\t\t\tif (element == nullptr) {\n\t\t\t\t\treturn nullptr;\n\t\t\t\t}\n\t\t\t\tnew (element) T();\n\t\t\t\titems.add(element);\t\t// Track items so they can be destructed later\n\t\t\t\t\n\t\t\t\tauto index = hashedId;\n\t\t\t\twhile (true) {\n\t\t\t\t\tindex &= mainHash->capacity - 1;\n\t\t\t\t\tauto probedKey = mainHash->entries[index].key.load(std::memory_order_relaxed);\n\t\t\t\t\tauto expected = details::invalid_thread_id;\n\t\t\t\t\tif (probedKey == expected && mainHash->entries[index].key.compare_exchange_strong(expected, id, std::memory_order_relaxed)) {\n\t\t\t\t\t\tmainHash->entries[index].value = element;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t++index;\n\t\t\t\t}\n\t\t\t\treturn element;\n\t\t\t}\n\t\t\t\n\t\t\t// Hmm, the old hash is quite full and somebody else is busy allocating a new one.\n\t\t\t// We need to wait for the allocating thread to finish (if it succeeds, we add, if not,\n\t\t\t// we try to allocate ourselves).\n\t\t\tmainHash = currentHash.load(std::memory_order_acquire);\n\t\t}\n\t}\n\t\nprivate:\n\tstruct KeyValuePair\n\t{\n\t\tstd::atomic<details::thread_id_t> key;\n\t\tT* value;\t\t// No need for atomicity since it's only read by the thread that sets it in the first place\n\n\t\tKeyValuePair()\n\t\t{ }\n\n\t\tKeyValuePair(KeyValuePair const& other)\n\t\t\t: key(other.key.load()), value(other.value)\n\t\t{ }\n\n\t\tKeyValuePair& operator=(KeyValuePair const& other)\n\t\t{\n\t\t\tkey.store(other.key.load());\n\t\t\tvalue = other.value;\n\t\t\treturn *this;\n\t\t}\n\t};\n\t\n\tstruct InnerHash\n\t{\n\t\tstd::size_t capacity;\n\t\tKeyValuePair* entries;\n\t\tInnerHash* prev;\n\t};\n\t\n\tstd::atomic_flag resizeInProgress;\n\tstd::atomic<InnerHash*> currentHash;\n\tstd::atomic<std::size_t> currentHashCount;\t\t// Number of slots logically used\n\tInnerHash initialHash;\n\tstd::vector<KeyValuePair> initialHashEntries;\n\tConcurrentAddOnlyList<T> items;\n};\n\n\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// Lock-free free list\n////////////////////////////////////////////////////////////////////////////////\n\ntemplate <typename N>\nstruct FreeListNode\n{\n    FreeListNode() : freeListRefs(0), freeListNext(nullptr) { }\n\n    std::atomic<std::uint32_t> freeListRefs;\n    std::atomic<N*> freeListNext;\n\n\tFreeListNode(FreeListNode const& other)\n\t\t: freeListRefs(other.freeListRefs.load()), freeListNext(other.freeListNext.load())\n\t{ }\n\n\tFreeListNode& operator=(FreeListNode const& other)\n\t{\n\t\tfreeListRefs.store(other.freeListRefs.load());\n\t\tfreeListNext.store(other.freeListNext.load());\n\t\treturn *this;\n\t}\n};\n\n// A simple CAS-based lock-free free list. Not the fastest thing in the world under heavy contention,\n// but simple and correct (assuming nodes are never freed until after the free list is destroyed),\n// and fairly speedy under low contention.\ntemplate<typename N>    // N must inherit FreeListNode or have the same fields (and initialization)\nstruct FreeList\n{\n    FreeList() : freeListHead(nullptr) { }\n\n    inline void add(N* node)\n    {\n        // We know that the should-be-on-freelist bit is 0 at this point, so it's safe to\n        // set it using a fetch_add\n        if (node->freeListRefs.fetch_add(SHOULD_BE_ON_FREELIST, std::memory_order_acq_rel) == 0) {\n            // Oh look! We were the last ones referencing this node, and we know\n            // we want to add it to the free list, so let's do it!\n     \t    add_knowing_refcount_is_zero(node);\n        }\n    }\n\n    inline N* try_get()\n    {\n        auto head = freeListHead.load(std::memory_order_acquire);\n        while (head != nullptr) {\n            auto prevHead = head;\n            auto refs = head->freeListRefs.load(std::memory_order_relaxed);\n            if ((refs & REFS_MASK) == 0 || !head->freeListRefs.compare_exchange_strong(refs, refs + 1,\n                    std::memory_order_acquire, std::memory_order_relaxed)) {\n                head = freeListHead.load(std::memory_order_acquire);\n                continue;\n            }\n\n            // Good, reference count has been incremented (it wasn't at zero), which means\n            // we can read the next and not worry about it changing between now and the time\n            // we do the CAS\n            auto next = head->freeListNext.load(std::memory_order_relaxed);\n            if (freeListHead.compare_exchange_strong(head, next,\n                    std::memory_order_acquire, std::memory_order_relaxed)) {\n                // Yay, got the node. This means it was on the list, which means\n                // shouldBeOnFreeList must be false no matter the refcount (because\n                // nobody else knows it's been taken off yet, it can't have been put back on).\n           \t\tassert((head->freeListRefs.load(std::memory_order_relaxed) & SHOULD_BE_ON_FREELIST) == 0);\n\n                // Decrease refcount twice, once for our ref, and once for the list's ref\n                head->freeListRefs.fetch_add(-2u, std::memory_order_release);\n                return head;\n            }\n\n            // OK, the head must have changed on us, but we still need to decrease the refcount we\n            // increased.\n            // Note that we don't need to release any memory effects, but we do need to ensure that the reference\n\t\t\t// count decrement happens-after the CAS on the head.\n            refs = prevHead->freeListRefs.fetch_add(-1u, std::memory_order_acq_rel);\n            if (refs == SHOULD_BE_ON_FREELIST + 1) {\n                add_knowing_refcount_is_zero(prevHead);\n            }\n        }\n\n        return nullptr;\n    }\n\n    // Useful for traversing the list when there's no contention (e.g. to destroy remaining nodes)\n    N* head_unsafe() const { return freeListHead.load(std::memory_order_relaxed); }\n\nprivate:\n    inline void add_knowing_refcount_is_zero(N* node)\n    {\n        // Since the refcount is zero, and nobody can increase it once it's zero (except us, and we\n        // run only one copy of this method per node at a time, i.e. the single thread case), then we\n        // know we can safely change the next pointer of the node; however, once the refcount is back\n        // above zero, then other threads could increase it (happens under heavy contention, when the\n        // refcount goes to zero in between a load and a refcount increment of a node in try_get, then\n        // back up to something non-zero, then the refcount increment is done by the other thread) --\n        // so, if the CAS to add the node to the actual list fails, decrease the refcount and leave\n        // the add operation to the next thread who puts the refcount back at zero (which could be us,\n        // hence the loop).\n        auto head = freeListHead.load(std::memory_order_relaxed);\n        while (true) {\n            node->freeListNext.store(head, std::memory_order_relaxed);\n            node->freeListRefs.store(1, std::memory_order_release);\n            if (!freeListHead.compare_exchange_strong(head, node,\n                    std::memory_order_release, std::memory_order_relaxed)) {\n                // Hmm, the add failed, but we can only try again when the refcount goes back to zero\n                if (node->freeListRefs.fetch_add(SHOULD_BE_ON_FREELIST - 1, std::memory_order_release) == 1) {\n                    continue;\n                }\n            }\n            return;\n        }\n    }\n\nprivate:\n    static const std::uint32_t REFS_MASK = 0x7FFFFFFF;\n    static const std::uint32_t SHOULD_BE_ON_FREELIST = 0x80000000;\n\t\n    // Implemented like a stack, but where node order doesn't matter (nodes are\n    // inserted out of order under contention)\n    std::atomic<N*> freeListHead;\n};\n\n\n\n////////////////////////////////////////////////////////////////////////////////\n// Lock-free (single-producer, multi-consumer) numeric-key hash map of sorts;\n// there are many conditions that must be met, i.e. items have to be inserted\n// in increasing order by key (wrap-around is OK), and items cannot be searched\n// for or removed unless they are known to be in the map in the first place.\n////////////////////////////////////////////////////////////////////////////////\n\ntemplate<typename TValue>\nstruct SPMCSequentialHashMap\n{\n\texplicit SPMCSequentialHashMap(std::size_t initialSize)\n\t\t: nextCapacity(initialSize), index(nullptr)\n\t{\n\t\tnew_index();\n\t}\n\t\n\t~SPMCSequentialHashMap()\n\t{\n\t\tauto ptr = index.load(std::memory_order_relaxed);\n\t\tif (ptr != nullptr) {\n\t\t\tfor (std::size_t i = 0; i != ptr->capacity; ++i) {\n\t\t\t\tptr->index[i]->~IndexEntry();\n\t\t\t}\n\t\t\tdo {\n\t\t\t\tauto prev = ptr->prev;\n\t\t\t\tptr->~IndexHeader();\n\t\t\t\tcorealgos_allocator::free(ptr);\n\t\t\t\tptr = prev;\n\t\t\t} while (ptr != nullptr);\n\t\t}\n\t}\n\t\n\t// Not thread safe. Only call from single producer thread.\n\t// Note: key must *not* be in hash already, and must be exactly\n\t// one larger than the previously inserted key value.\n\tvoid insert(std::uint64_t key, TValue* value)\n\t{\n\t\tIndexEntry* idxEntry;\n\t\tinsert_index_entry(idxEntry, key);\n\t\tidxEntry->value.store(value, std::memory_order_release);\n\t}\n\t\n\t// Thread-safe, but if somebody can remove the key while find() is\n\t// in progress, then any returned value is not guaranteed to correspond\n\t// to that key. This also applies if the key was not already present but\n\t// once was. Elements can be found in any order.\n\tTValue* find(std::uint64_t key)\n\t{\n\t\tauto idxEntry = get_entry_for_key(key);\n\t\tif (idxEntry == nullptr)\n\t\t\treturn nullptr;\n\t\treturn idxEntry->value.load(std::memory_order_acquire);\n\t}\n\t\n\t// Thread-safe, but if somebody else can remove the same key while remove()\n\t// is in progress, then any removed value is not guaranteed to correspond\n\t// to that key This also applies if the key was not already present but\n\t// once was. Elements can be removed in an order.\n\tTValue* remove(std::uint64_t key)\n\t{\n\t\tauto idxEntry = get_entry_for_key(key);\n\t\tif (idxEntry == nullptr)\n\t\t\treturn nullptr;\n\t\tTValue* val = nullptr;\n\t\twhile (!idxEntry->value.compare_exchange_weak(val, nullptr, std::memory_order_acquire, std::memory_order_relaxed))\n\t\t\tcontinue;\n\t\treturn val;\n\t}\n\t\nprivate:\n\tstruct IndexEntry\n\t{\n\t\tstd::atomic<std::uint64_t> key;\n\t\tstd::atomic<TValue*> value;\n\t};\n\t\n\tstruct IndexHeader\n\t{\n\t\tstd::size_t capacity;\n\t\tstd::atomic<std::size_t> tail;\n\t\tIndexEntry* entries;\n\t\tIndexEntry** index;\n\t\tIndexHeader* prev;\n\t};\n\t\n\tinline void insert_index_entry(IndexEntry*& idxEntry, std::uint64_t key)\n\t{\n\t\tauto localIndex = index.load(std::memory_order_relaxed);\t\t// We're the only writer thread, relaxed is OK\n\t\tauto newTail = (localIndex->tail.load(std::memory_order_relaxed) + 1) & (localIndex->capacity - 1);\n\t\tidxEntry = localIndex->index[newTail];\n\t\tif (idxEntry->key.load(std::memory_order_relaxed) == INVALID_KEY ||\n\t\t\tidxEntry->value.load(std::memory_order_relaxed) == nullptr) {\n\t\t\t\n\t\t\tidxEntry->key.store(key, std::memory_order_relaxed);\n\t\t\tlocalIndex->tail.store(newTail, std::memory_order_release);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t// No room in the old index, try to allocate another one!\n\t\tnew_index();\n\t\tlocalIndex = index.load(std::memory_order_relaxed);\n\t\tnewTail = (localIndex->tail.load(std::memory_order_relaxed) + 1) & (localIndex->capacity - 1);\n\t\tidxEntry = localIndex->index[newTail];\n\t\tassert(idxEntry->key.load(std::memory_order_relaxed) == INVALID_KEY);\n\t\tidxEntry->key.store(key, std::memory_order_relaxed);\n\t\tlocalIndex->tail.store(newTail, std::memory_order_release);\n\t}\n\t\n\tinline IndexEntry* get_entry_for_key(std::uint64_t key) const\n\t{\n\t\tauto localIndex = index.load(std::memory_order_acquire);\n\t\tauto tail = localIndex->tail.load(std::memory_order_acquire);\n\t\tauto tailBase = localIndex->index[tail]->key.load(std::memory_order_relaxed);\n\t\tif (tailBase == INVALID_KEY) {\n\t\t\treturn nullptr;\n\t\t}\n\t\tauto offset = static_cast<std::size_t>(key - tailBase);\n\t\tstd::size_t idx = (tail + offset) & (localIndex->capacity - 1);\n\t\tauto entry = localIndex->index[idx];\n\t\treturn entry->key.load(std::memory_order_relaxed) == key ? entry : nullptr;\n\t}\n\t\n\tbool new_index()\n\t{\n\t\tauto prev = index.load(std::memory_order_relaxed);\n\t\tstd::size_t prevCapacity = prev == nullptr ? 0 : prev->capacity;\n\t\tauto entryCount = prev == nullptr ? nextCapacity : prevCapacity;\n\t\tauto raw = static_cast<char*>(corealgos_allocator::malloc(\n\t\t\tsizeof(IndexHeader) +\n\t\t\tstd::alignment_of<IndexEntry>::value - 1 + sizeof(IndexEntry) * entryCount +\n\t\t\tstd::alignment_of<IndexEntry*>::value - 1 + sizeof(IndexEntry*) * nextCapacity));\n\t\tif (raw == nullptr) {\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\tauto header = new (raw) IndexHeader;\n\t\tauto entries = reinterpret_cast<IndexEntry*>(details::align_for<IndexEntry>(raw + sizeof(IndexHeader)));\n\t\tauto idx = reinterpret_cast<IndexEntry**>(details::align_for<IndexEntry*>(reinterpret_cast<char*>(entries) + sizeof(IndexEntry) * entryCount));\n\t\tif (prev != nullptr) {\n\t\t\tauto prevTail = prev->tail.load(std::memory_order_relaxed);\n\t\t\tauto prevPos = prevTail;\n\t\t\tstd::size_t i = 0;\n\t\t\tdo {\n\t\t\t\tprevPos = (prevPos + 1) & (prev->capacity - 1);\n\t\t\t\tidx[i++] = prev->index[prevPos];\n\t\t\t} while (prevPos != prevTail);\n\t\t\tassert(i == prevCapacity);\n\t\t}\n\t\tfor (std::size_t i = 0; i != entryCount; ++i) {\n\t\t\tnew (entries + i) IndexEntry;\n\t\t\tentries[i].key.store(INVALID_KEY, std::memory_order_relaxed);\n\t\t\tentries[i].value.store(nullptr, std::memory_order_relaxed);\n\t\t\tidx[prevCapacity + i] = entries + i;\n\t\t}\n\t\theader->prev = prev;\n\t\theader->entries = entries;\n\t\theader->index = idx;\n\t\theader->capacity = nextCapacity;\n\t\theader->tail.store((prevCapacity - 1) & (nextCapacity - 1), std::memory_order_relaxed);\n\t\t\n\t\tindex.store(header, std::memory_order_release);\n\t\t\n\t\tnextCapacity <<= 1;\n\t\t\n\t\treturn true;\n\t}\n\t\t\n\tprivate:\n\t\tstd::size_t nextCapacity;\n\t\tstd::atomic<IndexHeader*> index;\n\t\t\n\t\tstatic const std::uint64_t INVALID_KEY = ~(std::uint64_t)0;\n};\n\n} }\n"
  },
  {
    "path": "tests/fuzztests/fuzztests.cpp",
    "content": "// ©2013-2014 Cameron Desrochers.\n// Distributed under the simplified BSD license (see the LICENSE file that\n// should have come with this file).\n\n// Fuzz (random) tests for moodycamel::ConcurrentQueue\n\n#include <cstdio>\n#include <cstdlib>\n#include <cstring>\n#include <cstdint>\n#include <ctime>\n#include <cassert>\n#include <string>\n#include <random>\n#include <atomic>\n#include <fstream>\n#include <iomanip>\n#include <vector>\n#include <csignal>\n#include <mutex>\n#include <exception>\n#include <cctype>\n\n#ifdef _WIN32\n#define WIN32_LEAN_AND_MEAN\n#ifndef NOMINMAX\n#define NOMINMAX\n#endif\n#include <windows.h>\n#endif\n\n#include \"../../concurrentqueue.h\"\n#include \"../common/simplethread.h\"\n#include \"../common/systemtime.h\"\n#include \"../corealgos.h\"\n\nvoid failHook()\n{\n\t(void)1;\t\t// Attach debuggers here\n}\n\n#define _STR(x) #x\n#define STR(x) _STR(x)\n#define ASSERT_OR_FAIL_THREAD(cond) if (!(cond)) { const char* n = nullptr; failReason.compare_exchange_strong(n, \"assertion failed on line \" STR(__LINE__) \": \" #cond, std::memory_order_relaxed, std::memory_order_relaxed); \\\n                                                   failed.store(true, std::memory_order_relaxed); failHook(); return; }\n#define FAIL_IF_THREAD_TIMEOUT() if (getTimeDelta(startTime) > 60000) { const char* n = nullptr; failReason.compare_exchange_strong(n, \"test timed out (detected on line \" STR(__LINE__) \")\", std::memory_order_relaxed, std::memory_order_relaxed); \\\n                                                                        failed.store(true, std::memory_order_relaxed); failHook(); return; }\n#define ASSERT_OR_FAIL(cond) if (!(cond)) { out_failReason = \"assertion failed on line \" STR(__LINE__) \": \" #cond; result = false; failHook(); break; }\n\n\nusing namespace moodycamel;\n\n\ntypedef std::minstd_rand RNG_t;\n\nenum test_type {\n\tmultithread_produce,\n\tmultithread_consume,\n\tmultithread_produce_and_consume,\n\tcompletely_random,\n\t\n\t// Core algo tests\n\tcore_add_only_list,\n\tcore_thread_local,\n\t\n\tTEST_TYPE_COUNT\n};\n\nstd::uint64_t test_count[TEST_TYPE_COUNT] = { 0 };\nstd::uint64_t fail_count[TEST_TYPE_COUNT] = { 0 };\nconst char* test_names[TEST_TYPE_COUNT] = {\n\t\"multithread_produce\",\n\t\"multithread_consume\",\n\t\"multithread_produce_and_consume\",\n\t\"completely_random\",\n\t\"core_add_only_list\",\n\t\"core_thread_local\",\n};\n\nconst int SINGLE_SEED_ITERATIONS = 100;\nconst char* LOG_FILE = \"fuzztests.log\";\n\n\nstruct FuzzTraits : public ConcurrentQueueDefaultTraits\n{\n\tstatic const size_t BLOCK_SIZE = 8;\n\tstatic const size_t EXPLICIT_INITIAL_INDEX_SIZE = 4;\n\tstatic const size_t IMPLICIT_INITIAL_INDEX_SIZE = 4;\n\tstatic const size_t INITIAL_IMPLCICIT_PRODUCER_HASH_SIZE = 1;\n\tstatic const std::uint32_t EXPLICIT_CONSUMER_CONSUMPTION_QUOTA_BEFORE_ROTATE = 24;\n};\n\nstruct TestListItem : corealgos::ListItem\n{\n\tint value;\n\t\n\tTestListItem() : value(0) { }\n\texplicit TestListItem(int value) : value(value) { }\n\t\n\tinline TestListItem* prev(std::memory_order order = std::memory_order_relaxed) const\n\t{\n\t\treturn static_cast<TestListItem*>(concurrentListPrev.load(order));\n\t}\n};\n\n\nbool run_test(uint64_t seed, int iterations, test_type& out_type, const char*& out_failReason)\n{\n\tbool result = true;\n\tRNG_t baseRng((unsigned int)seed);\n\t\n\tstd::uniform_int_distribution<int> randTest(0, TEST_TYPE_COUNT - 1);\n\tstd::uniform_int_distribution<int> randInitialSize(0, 70);\n\t\n\tauto type = static_cast<test_type>(randTest(baseRng));\n\tout_type = type;\n\tfor (int iteration = 0; iteration != iterations; ++iteration) {\n\t\tRNG_t rng(baseRng);\n\t\t\n\t\tstd::atomic<bool> failed(false);\n\t\tstd::atomic<const char*> failReason;\n\t\tfailReason = nullptr;\n\t\tSystemTime startTime = getSystemTime();\n\t\t\n\t\tswitch (type) {\n\t\tcase multithread_produce:\n\t\t{\n\t\t\tconst int countIncrement = std::uniform_int_distribution<int>(1, 1000)(rng);\n\t\t\tint count = std::uniform_int_distribution<int>(0, 500)(rng) * countIncrement;\n\t\t\tint prodCount = std::uniform_int_distribution<int>(0, 6)(rng);\n\t\t\tbool useConsumerToken = static_cast<bool>(std::uniform_int_distribution<int>(0, 1)(rng));\n\t\t\t\n\t\t\tConcurrentQueue<int, FuzzTraits> q(randInitialSize(rng));\n\t\t\t\n\t\t\tstd::vector<SimpleThread> producers(prodCount);\n\t\t\tstd::vector<bool> useProducerToken(prodCount);\n\t\t\tfor (int i = 0; i != prodCount; ++i) {\n\t\t\t\tuseProducerToken[i] = static_cast<bool>(std::uniform_int_distribution<int>(0, 1)(rng));\n\t\t\t\tproducers[i] = SimpleThread([&](int i) {\n\t\t\t\t\tProducerToken t(q);\n\t\t\t\t\tfor (int j = 0; j != count && !failed.load(std::memory_order_relaxed); j += countIncrement) {\n\t\t\t\t\t\tif (useProducerToken[i]) {\n\t\t\t\t\t\t\tfor (int k = 0; k != countIncrement; ++k) {\n\t\t\t\t\t\t\t\tASSERT_OR_FAIL_THREAD(q.enqueue(t, (i << 24) | (k + j)));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tfor (int k = 0; k != countIncrement; ++k) {\n\t\t\t\t\t\t\t\tASSERT_OR_FAIL_THREAD(q.enqueue((i << 24) | (k + j)));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tFAIL_IF_THREAD_TIMEOUT();\n\t\t\t\t\t}\n\t\t\t\t}, i);\n\t\t\t}\n\t\t\t\n\t\t\tSimpleThread consumer([&]() {\n\t\t\t\tint item;\n\t\t\t\tstd::vector<int> lastItems(prodCount);\n\t\t\t\tConsumerToken t(q);\n\t\t\t\t\n\t\t\t\tfor (int i = 0; i != prodCount; ++i) {\n\t\t\t\t\tlastItems[i] = -1;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfor (int i = 0; i != count * prodCount && !failed.load(std::memory_order_relaxed);) {\n\t\t\t\t\tif (useConsumerToken) {\n\t\t\t\t\t\tfor (int j = 0; j != 10000; ++j) {\n\t\t\t\t\t\t\tif (q.try_dequeue(t, item)) {\n\t\t\t\t\t\t\t\t++i;\n\t\t\t\t\t\t\t\tASSERT_OR_FAIL_THREAD((item & 0xFFFFFF) < count);\n\t\t\t\t\t\t\t\tASSERT_OR_FAIL_THREAD((item & 0xFFFFFF) == lastItems[item >> 24] + 1);\n\t\t\t\t\t\t\t\tlastItems[item >> 24] = (item & 0xFFFFFF);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (int j = 0; j != 10000; ++j) {\n\t\t\t\t\t\t\tif (q.try_dequeue(item)) {\n\t\t\t\t\t\t\t\t++i;\n\t\t\t\t\t\t\t\tASSERT_OR_FAIL_THREAD((item & 0xFFFFFF) < count);\n\t\t\t\t\t\t\t\tASSERT_OR_FAIL_THREAD((item & 0xFFFFFF) == lastItems[item >> 24] + 1);\n\t\t\t\t\t\t\t\tlastItems[item >> 24] = (item & 0xFFFFFF);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tFAIL_IF_THREAD_TIMEOUT();\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tfor (int i = 0; i != prodCount; ++i) {\n\t\t\t\tproducers[i].join();\n\t\t\t}\n\t\t\tconsumer.join();\n\t\t\t\n\t\t\tif (failed.load(std::memory_order_relaxed)) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tint item;\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t\t\n\t\t\tbreak;\n\t\t}\n\t\tcase multithread_consume:\n\t\t{\n\t\t\tconst int countIncrement = std::uniform_int_distribution<int>(1, 1000)(rng);\n\t\t\tint count = std::uniform_int_distribution<int>(0, 500)(rng) * countIncrement;\n\t\t\tint consCount = std::uniform_int_distribution<int>(0, 6)(rng);\n\t\t\tbool useProducerToken = static_cast<bool>(std::uniform_int_distribution<int>(0, 1)(rng));\n\t\t\tstd::atomic<bool> producerDone(false);\n\t\t\t\n\t\t\tConcurrentQueue<int, FuzzTraits> q(randInitialSize(rng));\n\t\t\t\n\t\t\tstd::vector<SimpleThread> consumers(consCount);\n\t\t\tstd::vector<bool> useConsumerToken(consCount);\n\t\t\tfor (int i = 0; i != consCount; ++i) {\n\t\t\t\tuseConsumerToken[i] = static_cast<bool>(std::uniform_int_distribution<int>(0, 1)(rng));\n\t\t\t\tconsumers[i] = SimpleThread([&](int i) {\n\t\t\t\t\tint item, lastItem = -1;\n\t\t\t\t\tConsumerToken t(q);\n\t\t\t\t\t\n\t\t\t\t\tbool doneConsuming = false;\n\t\t\t\t\twhile (!doneConsuming && !failed.load(std::memory_order_relaxed)) {\n\t\t\t\t\t\tauto producerDoneLocal = producerDone.load(std::memory_order_acquire);\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (useConsumerToken[i]) {\n\t\t\t\t\t\t\tfor (int j = 0; j != 10000; ++j) {\n\t\t\t\t\t\t\t\tif (q.try_dequeue(t, item)) {\n\t\t\t\t\t\t\t\t\tASSERT_OR_FAIL_THREAD(item >= 0 && item < count * consCount && item > lastItem);\n\t\t\t\t\t\t\t\t\tlastItem = item;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if (producerDoneLocal) {\n\t\t\t\t\t\t\t\t\tdoneConsuming = true;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tfor (int j = 0; j != 10000; ++j) {\n\t\t\t\t\t\t\t\tif (q.try_dequeue(item)) {\n\t\t\t\t\t\t\t\t\tASSERT_OR_FAIL_THREAD(item >= 0 && item < count * consCount && item > lastItem);\n\t\t\t\t\t\t\t\t\tlastItem = item;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if (producerDoneLocal)  {\n\t\t\t\t\t\t\t\t\tdoneConsuming = true;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tFAIL_IF_THREAD_TIMEOUT();\n\t\t\t\t\t}\n\t\t\t\t}, i);\n\t\t\t}\n\t\t\t\n\t\t\tSimpleThread producer([&]() {\n\t\t\t\tProducerToken t(q);\n\t\t\t\tfor (int i = 0; i != count * consCount && !failed.load(std::memory_order_relaxed); i += countIncrement) {\n\t\t\t\t\tif (useProducerToken) {\n\t\t\t\t\t\tfor (int j = 0; j != countIncrement; ++j) {\n\t\t\t\t\t\t\tASSERT_OR_FAIL_THREAD(q.enqueue(t, i + j));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (int j = 0; j != countIncrement; ++j) {\n\t\t\t\t\t\t\tASSERT_OR_FAIL_THREAD(q.enqueue(i + j));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tFAIL_IF_THREAD_TIMEOUT();\n\t\t\t\t}\n\t\t\t\tproducerDone.store(true, std::memory_order_release);\n\t\t\t});\n\t\t\t\n\t\t\tproducer.join();\n\t\t\tfor (int i = 0; i != consCount; ++i) {\n\t\t\t\tconsumers[i].join();\n\t\t\t}\n\t\t\t\n\t\t\tif (failed.load(std::memory_order_relaxed)) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tint item;\n\t\t\tASSERT_OR_FAIL(consCount == 0 || !q.try_dequeue(item));\n\t\t\t\n\t\t\tbreak;\n\t\t}\n\t\tcase multithread_produce_and_consume:\n\t\t{\n\t\t\tconst int countIncrement = std::uniform_int_distribution<int>(1, 1000)(rng);\n\t\t\tint count = std::uniform_int_distribution<int>(0, 500)(rng) * countIncrement;\n\t\t\tint prodCount = std::uniform_int_distribution<int>(0, 6)(rng);\n\t\t\tint consCount = std::uniform_int_distribution<int>(0, 6)(rng);\n\t\t\tstd::atomic<bool> producersDone(false);\n\t\t\t\n\t\t\tConcurrentQueue<int, FuzzTraits> q(randInitialSize(rng));\n\t\t\t\n\t\t\tstd::vector<SimpleThread> producers(prodCount);\n\t\t\tstd::vector<bool> useProducerToken(prodCount);\n\t\t\tfor (int i = 0; i != prodCount; ++i) {\n\t\t\t\tuseProducerToken[i] = static_cast<bool>(std::uniform_int_distribution<int>(0, 1)(rng));\n\t\t\t\tproducers[i] = SimpleThread([&](int i) {\n\t\t\t\t\tProducerToken t(q);\n\t\t\t\t\tfor (int j = 0; j != count && !failed.load(std::memory_order_relaxed); j += countIncrement) {\n\t\t\t\t\t\tif (useProducerToken[i]) {\n\t\t\t\t\t\t\tfor (int k = 0; k != countIncrement; ++k) {\n\t\t\t\t\t\t\t\tASSERT_OR_FAIL_THREAD(q.enqueue(t, (i << 24) | (k + j)));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tfor (int k = 0; k != countIncrement; ++k) {\n\t\t\t\t\t\t\t\tASSERT_OR_FAIL_THREAD(q.enqueue((i << 24) | (k + j)));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tFAIL_IF_THREAD_TIMEOUT();\n\t\t\t\t\t}\n\t\t\t\t}, i);\n\t\t\t}\n\t\t\t\n\t\t\tstd::vector<SimpleThread> consumers(consCount);\n\t\t\tstd::vector<bool> useConsumerToken(consCount);\n\t\t\tfor (int i = 0; i != consCount; ++i) {\n\t\t\t\tuseConsumerToken[i] = static_cast<bool>(std::uniform_int_distribution<int>(0, 1)(rng));\n\t\t\t\tconsumers[i] = SimpleThread([&](int i) {\n\t\t\t\t\tint item;\n\t\t\t\t\tstd::vector<int> lastItems(prodCount);\n\t\t\t\t\tConsumerToken t(q);\n\t\t\t\t\t\n\t\t\t\t\tfor (int j = 0; j != prodCount; ++j) {\n\t\t\t\t\t\tlastItems[j] = -1;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tbool doneConsuming = false;\n\t\t\t\t\twhile (!doneConsuming && !failed.load(std::memory_order_relaxed)) {\n\t\t\t\t\t\tauto producersDoneLocal = producersDone.load(std::memory_order_acquire);\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (useConsumerToken[i]) {\n\t\t\t\t\t\t\tfor (int j = 0; j != 10000; ++j) {\n\t\t\t\t\t\t\t\tif (q.try_dequeue(t, item)) {\n\t\t\t\t\t\t\t\t\tASSERT_OR_FAIL_THREAD((item & 0xFFFFFF) < count);\n\t\t\t\t\t\t\t\t\tASSERT_OR_FAIL_THREAD((item & 0xFFFFFF) > lastItems[item >> 24]);\n\t\t\t\t\t\t\t\t\tlastItems[item >> 24] = item & 0xFFFFFF;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if (producersDoneLocal) {\n\t\t\t\t\t\t\t\t\tdoneConsuming = true;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tfor (int j = 0; j != 10000; ++j) {\n\t\t\t\t\t\t\t\tif (q.try_dequeue(item)) {\n\t\t\t\t\t\t\t\t\tASSERT_OR_FAIL_THREAD((item & 0xFFFFFF) < count);\n\t\t\t\t\t\t\t\t\tASSERT_OR_FAIL_THREAD((item & 0xFFFFFF) > lastItems[item >> 24]);\n\t\t\t\t\t\t\t\t\tlastItems[item >> 24] = item & 0xFFFFFF;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if (producersDoneLocal)  {\n\t\t\t\t\t\t\t\t\tdoneConsuming = true;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tFAIL_IF_THREAD_TIMEOUT();\n\t\t\t\t\t}\n\t\t\t\t}, i);\n\t\t\t}\n\t\t\t\n\t\t\tfor (int i = 0; i != prodCount; ++i) {\n\t\t\t\tproducers[i].join();\n\t\t\t}\n\t\t\tproducersDone.store(true, std::memory_order_release);\n\t\t\tfor (int i = 0; i != consCount; ++i) {\n\t\t\t\tconsumers[i].join();\n\t\t\t}\n\t\t\t\n\t\t\tif (failed.load(std::memory_order_relaxed)) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tint item;\n\t\t\tASSERT_OR_FAIL(consCount == 0 || !q.try_dequeue(item));\n\t\t\t\n\t\t\tbreak;\n\t\t}\n\t\tcase completely_random:\n\t\t{\n\t\t\tint threadCount = std::uniform_int_distribution<int>(0, 32)(rng);\n\t\t\t\n\t\t\tConcurrentQueue<int, FuzzTraits> q(randInitialSize(rng));\n\t\t\t\n\t\t\tstd::vector<SimpleThread> threads(threadCount);\n\t\t\tstd::vector<unsigned int> seeds(threadCount);\n\t\t\tstd::vector<unsigned int> opCounts(threadCount);\n\t\t\tunsigned int largestOpCount = 0;\n\t\t\tfor (int i = 0; i != threadCount; ++i) {\n\t\t\t\topCounts[i] = std::uniform_int_distribution<unsigned int>(0, 500000)(rng);\n\t\t\t\tif (opCounts[i] > largestOpCount) {\n\t\t\t\t\tlargestOpCount = opCounts[i];\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Note: If you're wondering where all the memory goes, it's mostly here!\n\t\t\tstd::vector<unsigned int> itemStates(largestOpCount * threadCount * 2);\n\t\t\tfor (std::size_t j = 0; j != itemStates.size(); ++j) {\n\t\t\t\titemStates[j] = 0;\n\t\t\t}\n\t\t\tfor (int i = 0; i != threadCount; ++i) {\n\t\t\t\tseeds[i] = std::uniform_int_distribution<unsigned int>(0, 0xFFFFFFFF)(rng);\n\t\t\t\tthreads[i] = SimpleThread([&](int i) {\n\t\t\t\t\tRNG_t rng((unsigned int)seeds[i]);\n\t\t\t\t\tConsumerToken ct(q);\n\t\t\t\t\tProducerToken pt(q);\n\t\t\t\t\tint item;\n\t\t\t\t\tint opCount = opCounts[i];\n\t\t\t\t\tstd::vector<int> lastItems(threadCount * 2);\t\t// * 2 because there's two producer queues per thread (one implicit, one explicit)\n\t\t\t\t\tfor (int j = 0; j != threadCount * 2; ++j) {\n\t\t\t\t\t\tlastItems[j] = -1;\n\t\t\t\t\t}\n\t\t\t\t\tfor (int j = 0; j < opCount && !failed.load(std::memory_order_relaxed); ++j) {\n\t\t\t\t\t\tint op = std::uniform_int_distribution<int>(0, 7)(rng);\n\t\t\t\t\t\tunsigned int* state;\n\t\t\t\t\t\tswitch (op) {\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\tstate = &itemStates[(i * 2) * largestOpCount + j];\n\t\t\t\t\t\t\tASSERT_OR_FAIL_THREAD(*state == 0);\n\t\t\t\t\t\t\t*state = 1;\n\t\t\t\t\t\t\tASSERT_OR_FAIL_THREAD(q.enqueue(pt, ((i * 2) << 24) | j));\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\tstate = &itemStates[(i * 2 + 1) * largestOpCount + j];\n\t\t\t\t\t\t\tASSERT_OR_FAIL_THREAD(*state == 0);\n\t\t\t\t\t\t\t*state = 1;\n\t\t\t\t\t\t\tASSERT_OR_FAIL_THREAD(q.enqueue(((i * 2 + 1) << 24) | j));\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\tif (q.try_dequeue(ct, item)) {\n\t\t\t\t\t\t\t\tASSERT_OR_FAIL_THREAD((item & 0xFFFFFF) >= 0 && (item & 0xFFFFFF) < (int)largestOpCount);\n\t\t\t\t\t\t\t\tASSERT_OR_FAIL_THREAD((item & 0xFFFFFF) > lastItems[item >> 24]);\n\t\t\t\t\t\t\t\tlastItems[item >> 24] = item & 0xFFFFFF;\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tstate = &itemStates[(item >> 24) * largestOpCount + (item & 0xFFFFFF)];\n\t\t\t\t\t\t\t\tASSERT_OR_FAIL_THREAD(*state == 1);\n\t\t\t\t\t\t\t\t*state = 2;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\tif (q.try_dequeue(item)) {\n\t\t\t\t\t\t\t\tASSERT_OR_FAIL_THREAD((item & 0xFFFFFF) >= 0 && (item & 0xFFFFFF) < (int)largestOpCount);\n\t\t\t\t\t\t\t\tASSERT_OR_FAIL_THREAD((item & 0xFFFFFF) > lastItems[item >> 24]);\n\t\t\t\t\t\t\t\tlastItems[item >> 24] = item & 0xFFFFFF;\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tstate = &itemStates[(item >> 24) * largestOpCount + (item & 0xFFFFFF)];\n\t\t\t\t\t\t\t\tASSERT_OR_FAIL_THREAD(*state == 1);\n\t\t\t\t\t\t\t\t*state = 2;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\tcase 5: {\n\t\t\t\t\t\t\tstd::vector<int> bulkData(std::min(opCount - j, std::uniform_int_distribution<int>(0, 1024)(rng)));\n\t\t\t\t\t\t\tfor (std::size_t k = 0; k != bulkData.size(); ++k) {\n\t\t\t\t\t\t\t\tstate = &itemStates[(i * 2 + op - 4) * largestOpCount + j + k];\n\t\t\t\t\t\t\t\tASSERT_OR_FAIL_THREAD(*state == 0);\n\t\t\t\t\t\t\t\t*state = 1;\n\t\t\t\t\t\t\t\tbulkData[k] = ((i * 2 + op - 4) << 24) | (j + (int)k);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (op == 4) {\n\t\t\t\t\t\t\t\tASSERT_OR_FAIL_THREAD(q.enqueue_bulk(pt, bulkData.begin(), bulkData.size()));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tASSERT_OR_FAIL_THREAD(q.enqueue_bulk(bulkData.begin(), bulkData.size()));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tj += (int)bulkData.size() - 1;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\tcase 6:\n\t\t\t\t\t\tcase 7: {\n\t\t\t\t\t\t\tstd::vector<int> bulkData(std::min(opCount - j, std::uniform_int_distribution<int>(0, 1024)(rng)));\n\t\t\t\t\t\t\tstd::size_t count = 0;\n\t\t\t\t\t\t\tif (op == 6) {\n\t\t\t\t\t\t\t\tcount = q.try_dequeue_bulk(ct, bulkData.begin(), bulkData.size());\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tcount = q.try_dequeue_bulk(bulkData.begin(), bulkData.size());\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfor (std::size_t k = 0; k != count; ++k) {\n\t\t\t\t\t\t\t\titem = bulkData[k];\n\t\t\t\t\t\t\t\tASSERT_OR_FAIL_THREAD((item & 0xFFFFFF) >= 0 && (item & 0xFFFFFF) < (int)largestOpCount);\n\t\t\t\t\t\t\t\tASSERT_OR_FAIL_THREAD((item & 0xFFFFFF) > lastItems[item >> 24]);\n\t\t\t\t\t\t\t\tlastItems[item >> 24] = item & 0xFFFFFF;\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tstate = &itemStates[(item >> 24) * largestOpCount + (item & 0xFFFFFF)];\n\t\t\t\t\t\t\t\tASSERT_OR_FAIL_THREAD(*state == 1);\n\t\t\t\t\t\t\t\t*state = 2;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (count > 0) {\n\t\t\t\t\t\t\t\tj += (int)count - 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tassert(false);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tFAIL_IF_THREAD_TIMEOUT();\n\t\t\t\t\t}\n\t\t\t\t}, i);\n\t\t\t}\n\t\t\t\n\t\t\tfor (int i = 0; i != threadCount; ++i) {\n\t\t\t\tthreads[i].join();\n\t\t\t}\n#if MCDBGQ_TRACKMEM\n\t\t\tauto stats = q.getMemStats();\t\t// Make available under debugger\n\t\t\t((void)stats);\n#endif\t\t\n\t\t\t\n\t\t\tint item;\n\t\t\twhile (q.try_dequeue(item)) {\n\t\t\t\tunsigned int* state = &itemStates[(item >> 24) * largestOpCount + (item & 0xFFFFFF)];\n\t\t\t\tASSERT_OR_FAIL(*state == 1);\n\t\t\t\t*state = 2;\n\t\t\t}\n\t\t\tfor (std::size_t j = 0; j != itemStates.size(); ++j) {\n\t\t\t\tASSERT_OR_FAIL(itemStates[j] == 0 || itemStates[j] == 2);\n\t\t\t}\n\t\t\t\n\t\t\tif (failed.load(std::memory_order_relaxed)) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase core_add_only_list:\n\t\t{\n\t\t\tint threadCount = std::uniform_int_distribution<int>(0, 48)(rng);\n\t\t\tstd::vector<SimpleThread> threads(threadCount);\n\t\t\tstd::vector<int> opCounts(threadCount);\n\t\t\t\n\t\t\tfor (int i = 0; i != threadCount; ++i) {\n\t\t\t\topCounts[i] = std::uniform_int_distribution<int>(0, 500000)(rng);\n\t\t\t}\n\t\t\t\n\t\t\tstd::size_t expectedMemUsage = 0;\n\t\t\tfor (int i = 0; i != threadCount; ++i) {\n\t\t\t\texpectedMemUsage += opCounts[i] * sizeof(TestListItem);\n\t\t\t}\n\t\t\t\n\t\t\tcorealgos::ConcurrentAddOnlyList<TestListItem> list;\n\t\t\tfor (int i = 0; i != threadCount; ++i) {\n\t\t\t\tthreads[i] = SimpleThread([&](int tid) {\n\t\t\t\t\tauto temp = expectedMemUsage;\n\t\t\t\t\t((void)temp);\n\t\t\t\t\t\n\t\t\t\t\tint opCount = opCounts[tid];\n\t\t\t\t\tfor (int j = 0; j != opCount; ++j) {\n\t\t\t\t\t\tlist.add(new TestListItem((tid << 24) | j));\n\t\t\t\t\t}\n\t\t\t\t}, i);\n\t\t\t}\n\t\t\tfor (int i = 0; i != threadCount; ++i) {\n\t\t\t\tthreads[i].join();\n\t\t\t}\n\t\t\tstd::vector<int> lastItems(threadCount);\n\t\t\tfor (int i = 0; i != threadCount; ++i) {\n\t\t\t\tlastItems[i] = opCounts[i];\n\t\t\t}\n\t\t\tauto tail = list.tail();\n\t\t\twhile (tail != nullptr) {\n\t\t\t\tauto tid = tail->value >> 24;\n\t\t\t\tASSERT_OR_FAIL(lastItems[tid] - 1 == (tail->value & 0xFFFFFF));\n\t\t\t\t--lastItems[tid];\n\t\t\t\tauto next = tail->prev();\n\t\t\t\tdelete tail;\n\t\t\t\ttail = next;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase core_thread_local:\n\t\t{\n\t\t\tint threadCount = std::uniform_int_distribution<int>(32, 256)(rng);\n\t\t\tstd::vector<SimpleThread> threads(threadCount);\n\t\t\tstd::vector<int> opCounts(threadCount);\n\t\t\tstd::vector<int*> localData(threadCount);\n\t\t\t\n\t\t\tfor (int i = 0; i != threadCount; ++i) {\n\t\t\t\topCounts[i] = std::uniform_int_distribution<int>(10000, 250000)(rng);\n\t\t\t}\n\t\t\t\n\t\t\tcorealgos::ThreadLocal<TestListItem> tls(1);\n\t\t\tfor (int i = 0; i != threadCount; ++i) {\n\t\t\t\tthreads[i] = SimpleThread([&](int tid) {\n\t\t\t\t\tauto p = tls.get_or_create();\n\t\t\t\t\tASSERT_OR_FAIL_THREAD(p->value == 0);\n\t\t\t\t\tp->value = tid;\n\t\t\t\t\tlocalData[tid] = &p->value;\n\t\t\t\t\t\n\t\t\t\t\tint opCount = opCounts[tid];\n\t\t\t\t\tfor (int j = 0; j != opCount; ++j) {\n\t\t\t\t\t\tauto q = tls.get_or_create();\n\t\t\t\t\t\tASSERT_OR_FAIL_THREAD(q == p);\n\t\t\t\t\t\tASSERT_OR_FAIL_THREAD(q->value == tid);\n\t\t\t\t\t\tFAIL_IF_THREAD_TIMEOUT();\n\t\t\t\t\t}\n\t\t\t\t}, i);\n\t\t\t}\n\t\t\tfor (int i = 0; i != threadCount; ++i) {\n\t\t\t\tthreads[i].join();\n\t\t\t}\n\t\t\tfor (int i = 0; i != threadCount; ++i) {\n\t\t\t\tASSERT_OR_FAIL(localData[i] != nullptr);\n\t\t\t\tASSERT_OR_FAIL(*localData[i] == i);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tassert(false);\n\t\t}\n\t\t\n\t\t++test_count[type];\n\t\tif (failed.load(std::memory_order_relaxed)) {\n\t\t\tout_failReason = failReason.load(std::memory_order_relaxed);\n\t\t\tresult = false;\n\t\t}\n\t\tif (!result) {\n\t\t\t++fail_count[type];\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn result;\n}\n\n\nstatic const char* timestamp()\n{\n\tstatic char buf[32];\n\ttime_t time = std::time(NULL);\n\tstrcpy(buf, std::asctime(std::localtime(&time)));\n\tbuf[strlen(buf) - 1] = '\\0';\t// Remove trailing newline\n\treturn buf;\n}\n\nextern \"C\" { typedef void (*signal_handler_t)(int); }\nstatic std::atomic<std::uint64_t> g_seed(0);\nstatic std::atomic_flag reported_signal_error = ATOMIC_FLAG_INIT;\nstatic std::atomic<signal_handler_t> g_prev_sigsegv(nullptr);\nstatic std::atomic<signal_handler_t> g_prev_sigabrt(nullptr);\nstatic std::mutex g_signal_handler_mutex;\n\nvoid on_signal(int signal)\n{\n\tif (reported_signal_error.test_and_set()) {\n\t\treturn;\n\t}\n\t\n\tstd::unique_lock<std::mutex> lock(g_signal_handler_mutex);\n\tauto seed = g_seed.load(std::memory_order_acquire);\n\t\n\t// Technically undefined behaviour to use stdlib functions,\n\t// but oh well\n\tconst char* error = signal == SIGABRT ?\n\t\t\"Abort detected (assertion failed?)\" :\n\t\t\"Segmentation fault detected!\";\n\t\n\t{\n\t\tstd::ofstream fout(LOG_FILE, std::ios::app);\n\t\tfout << \"*** \" << error << \"\\n      Seed: \" << std::hex << seed << std::endl;\n\t}\n\tstd::printf(\"*** %s\\n      Seed: %08x%08x\\n\", error, (uint32_t)(seed >> 32), (uint32_t)(seed));\n\tstd::fflush(stdout);\n}\n\nextern \"C\" void signal_handler(int signal)\n{\n\ton_signal(signal);\n\tif (signal_handler_t handler_fn = g_prev_sigsegv.load(std::memory_order_relaxed)) {\n\t\thandler_fn(signal);\n\t}\n\telse {\n\t\tstd::exit(signal);\n\t}\n}\n\n#ifdef _WIN32\nLONG CALLBACK se_handler(PEXCEPTION_POINTERS info)\n{\n\tif (info->ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION) {\n\t\ton_signal(SIGSEGV);\n\t}\n\treturn EXCEPTION_CONTINUE_SEARCH;\n}\n#endif\n\nint main(int argc, char** argv)\n{\n\tbool singleSeed = false;\n\tuint64_t seed = 0;\n\t\n\t// Disable buffering (so that when run in, e.g., Sublime Text, the output appears as it is written)\n\tstd::setvbuf(stdout, nullptr, _IONBF, 0);\n\t\n\t// Isolate the executable name\n\tstd::string progName = argv[0];\n\tauto slash = progName.find_last_of(\"/\\\\\");\n\tif (slash != std::string::npos) {\n\t\tprogName = progName.substr(slash + 1);\n\t}\n\t\n\t// Parse command line options\n\tif (argc > 1) {\n\t\tbool printHelp = false;\n\t\tbool error = false;\n\t\tfor (int i = 1; i < argc; ++i) {\n\t\t\tif (std::strcmp(argv[i], \"--help\") == 0) {\n\t\t\t\tprintHelp = true;\n\t\t\t}\n\t\t\telse if (std::strcmp(argv[i], \"--seed\") == 0) {\n\t\t\t\tif (i + 1 == argc || argv[i + 1][0] == '-') {\n\t\t\t\t\tstd::printf(\"Expected seed number argument for --seed option.\\n\");\n\t\t\t\t\terror = true;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t++i;\n\t\t\t\tseed = 0;\n\t\t\t\t// hex\n\t\t\t\tfor (int j = 0; argv[i][j] != '\\0'; ++j) {\n\t\t\t\t\tchar ch = static_cast<char>(std::tolower(argv[i][j]));\n\t\t\t\t\tif (j == 1 && seed == 0 && ch == 'x') {\n\t\t\t\t\t\tcontinue;\t// Skip 0x, if any\n\t\t\t\t\t}\n\t\t\t\t\telse if (ch >= 'a' && ch <= 'f') {\n\t\t\t\t\t\tseed = (seed << 4) | (10 + ch - 'a');\n\t\t\t\t\t}\n\t\t\t\t\telse if (ch >= '0' && ch <= '9') {\n\t\t\t\t\t\tseed = (seed << 4) | (ch - '0');\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tstd::printf(\"Expected hex seed argument, found '%s' instead\\n\", argv[i]);\n\t\t\t\t\t\terror = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsingleSeed = true;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tstd::printf(\"Unrecognized option '%s'.\\n\\n\", argv[i]);\n\t\t\t\terror = true;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (error || printHelp) {\n\t\t\tstd::printf(\"%s\\n    Description: Runs fuzz tests (randomized stability tests) for moodycamel::ConcurrentQueue\\n\", progName.c_str());\n\t\t\tstd::printf(\"    An infinite series of random tests are run, each with a different seed.\\nIf a test fails, the seed for that test is reported.\\n\");\n\t\t\tstd::printf(\"    --help        Prints this help blurb\\n\");\n\t\t\tstd::printf(\"    --seed N      Runs one test with the given seed\\n\");\n\t\t\treturn error ? -1 : 0;\n\t\t}\n\t}\n\t\n\t\n\t{\n\t\tbool logExists = true;\n\t\t{\n\t\t\tstd::ifstream fin(LOG_FILE);\n\t\t\tif (!fin) {\n\t\t\t\tlogExists = false;\n\t\t\t}\n\t\t}\n\t\t\n\t\tstd::ofstream fout(LOG_FILE, std::ios::app);\n\t\tif (logExists) {\n\t\t\tfout << \"\\n\\n\";\n\t\t}\n\t\tif (singleSeed) {\n\t\t\tstd::printf(\"Running %d iterations of single test with seed %08x%08x.\\n\\n\", SINGLE_SEED_ITERATIONS, (uint32_t)(seed >> 32), (uint32_t)(seed));\n\t\t\t\n\t\t\tfout << \"--- New run (\" << timestamp() << \"): Executing \" << SINGLE_SEED_ITERATIONS << \" iterations of a single test with seed \" << std::hex << seed << \" ---\" << std::endl;\n\t\t}\n\t\telse {\n\t\t\tstd::printf(\"Running random fuzz tests for moodycamel::ConcurrentQueue.\\n\");\n\t\t\tstd::printf(\"Press CTRL+C to exit.\\n\");\n\t\t\tstd::printf(\"(Run %s --help for options.)\\n\\n\", progName.c_str());\n\t\t\t\n\t\t\tfout << \"--- New run (\" << timestamp() << \"): Executing random fuzz tests ---\" << std::endl;\n\t\t}\t\t\n\t}\n\t\n\tint exitCode = 0;\n\ttest_type test;\n\tconst char* failReason;\n\tif (singleSeed) {\n\t\tif (!run_test(seed, SINGLE_SEED_ITERATIONS, test, failReason)) {\n\t\t\texitCode = 1;\n\t\t\tstd::ofstream fout(LOG_FILE, std::ios::app);\n\t\t\tfout << test_names[test] << \" failed: \" << failReason << std::endl;\n\t\t\tstd::printf(\"    %s failed: %s\\n\", test_names[test], failReason);\n\t\t}\n\t\telse {\n\t\t\tstd::ofstream fout(LOG_FILE, std::ios::app);\n\t\t\tfout << test_names[test] << \" succeeded!\" << std::endl;\n\t\t\tstd::printf(\"    %s succeeded!\\n\", test_names[test]);\n\t\t}\n\t}\n\telse {\n#ifdef _WIN32\n\t\tAddVectoredExceptionHandler(1 /* first? */, &se_handler);\n#endif\n\t\t\n\t\tuint32_t iteration = 0;\n\t\twhile (true) {\n\t\t\tseed = (static_cast<uint64_t>(std::time(NULL)) << 32) | iteration++;\n\t\t\t// MurmurHash3 64-bit finalizer\n\t\t\tseed ^= seed >> 33;\n\t\t\tseed *= 0xff51afd7ed558ccd;\n\t\t\tseed ^= seed >> 33;\n\t\t\tseed *= 0xc4ceb9fe1a85ec53;\n\t\t\t\n\t\t\tg_seed.store(seed, std::memory_order_release);\n\t\t\tstd::signal(SIGSEGV, signal_handler);\n\t\t\tstd::signal(SIGABRT, signal_handler);\n\t\t\t\n\t\t\tbool result;\n\t\t\ttry {\n\t\t\t\tresult = run_test(seed, 2, test, failReason);\n\t\t\t}\n\t\t\tcatch (std::exception const& e) {\n\t\t\t\tstd::ofstream fout(LOG_FILE, std::ios::app);\n\t\t\t\tfout << \"*** Exception thrown: \" << e.what() << \"\\n      Seed: \" << std::hex << seed << \"\\n      Test: \" << test_names[test] << std::endl;\n\t\t\t\tstd::printf(\"*** Exception thrown: %s\\n      Seed: %08x%08x\\n      Test: %s\\n\\n\", e.what(), (uint32_t)(seed >> 32), (uint32_t)(seed), test_names[test]);\n\t\t\t\tstd::exit(2);\t\t// There shouldn't be any exceptions!\n\t\t\t}\n\t\t\tcatch (...) {\n\t\t\t\tstd::ofstream fout(LOG_FILE, std::ios::app);\n\t\t\t\tfout << \"*** Unknown exception thrown!\\n      Seed: \" << std::hex << seed << \"\\n      Test: \" << test_names[test] << std::endl;\n\t\t\t\tstd::printf(\"*** Unknown exception thrown!\\n      Seed: %08x%08x\\n      Test: %s\\n\\n\", (uint32_t)(seed >> 32), (uint32_t)(seed), test_names[test]);\n\t\t\t\tstd::exit(2);\n\t\t\t}\n\t\t\t\n\t\t\tstd::signal(SIGSEGV, SIG_DFL);\n\t\t\tstd::signal(SIGABRT, SIG_DFL);\n\t\t\t\n\t\t\tif (!result) {\n\t\t\t\texitCode = 1;\n\t\t\t\tstd::ofstream fout(LOG_FILE, std::ios::app);\n\t\t\t\tfout << \"*** Failure detected!\\n      Seed: \" << std::hex << seed << \"\\n      Test: \" << test_names[test] << \"\\n      Reason: \" << failReason << std::endl;\n\t\t\t\tstd::printf(\"*** Failure detected!\\n      Seed: %08x%08x\\n      Test: %s\\n      Reason: %s\\n\", (uint32_t)(seed >> 32), (uint32_t)(seed), test_names[test], failReason);\n\t\t\t}\n\t\t\t\n\t\t\tif ((iteration & 31) == 0) {\n\t\t\t\tstd::uint64_t total = 0;\n\t\t\t\t\n\t\t\t\tchar breakdown[128 * TEST_TYPE_COUNT];\n\t\t\t\tchar* ptr = breakdown;\n\t\t\t\tfor (int i = 0; i != TEST_TYPE_COUNT; ++i) {\n\t\t\t\t\tstd::sprintf(ptr, \"    %s: %llu successful, %llu failed\\n\", test_names[i], (unsigned long long)(test_count[i] - fail_count[i]), (unsigned long long)fail_count[i]);\n\t\t\t\t\tptr += std::strlen(ptr);\n\t\t\t\t\ttotal += test_count[i];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tstd::ofstream fout(LOG_FILE, std::ios::app);\n\t\t\t\tfout << \"Executed \" << total << \" tests so far:\\n\" << breakdown;\n\t\t\t\tstd::printf(\"Executed %llu tests so far:\\n%s\", (unsigned long long)total, breakdown);\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn exitCode;\n}\n"
  },
  {
    "path": "tests/fuzztests/makefile",
    "content": "# ©2013-2014 Cameron Desrochers\r\n\r\ninclude ../../build/makefile.inc\r\n\r\ndefault:\r\n\t$(MAKE) -C ../../build bin/fuzztests$(EXT)\r\n\r\nrun: default\r\n\t../../build/bin/fuzztests$(EXT)\r\n"
  },
  {
    "path": "tests/relacy/freelist.cpp",
    "content": "// ©2014 Cameron Desrochers\n\n#include \"relacy/relacy/relacy_std.hpp\"\n\n\ntemplate <typename N>\nstruct FreeListNode\n{\n    FreeListNode() : freeListRefs(0), freeListNext(nullptr) { }\n\n    std::atomic<std::uint32_t> freeListRefs;\n    std::atomic<N*> freeListNext;\n};\n\n// A simple CAS-based lock-free free list. Not the fastest thing in the world under heavy contention,\n// but simple and correct (assuming nodes are never freed until after the free list is destroyed),\n// and fairly speedy under low contention.\ntemplate<typename N>    // N must inherit FreeListNode or have the same fields (and initialization)\nstruct FreeList\n{\n    FreeList() : freeListHead(nullptr) { }\n\n    inline void add(N* node)\n    {\n    \t// We know that the should-be-on-freelist bit is 0 at this point, so it's safe to\n    \t// set it using a fetch_add\n        if (node->freeListRefs.fetch_add(SHOULD_BE_ON_FREELIST, std::memory_order_acq_rel) == 0) {\n            // Oh look! We were the last ones referencing this node, and we know\n            // we want to add it to the free list, so let's do it!\n     \t   add_knowing_refcount_is_zero(node);\n        }\n    }\n\n    inline N* try_get()\n    {\n        auto head = freeListHead.load(std::memory_order_acquire);\n        while (head != nullptr) {\n            auto prevHead = head;\n            auto refs = head->freeListRefs.load(std::memory_order_relaxed);\n            if ((refs & REFS_MASK) == 0 || !head->freeListRefs.compare_exchange_strong(refs, refs + 1,\n                    std::memory_order_acquire, std::memory_order_relaxed)) {\n                head = freeListHead.load(std::memory_order_acquire);\n                continue;\n            }\n\n            // Good, reference count has been incremented (it wasn't at zero), which means\n            // we can read the next and not worry about it changing between now and the time\n            // we do the CAS\n            auto next = head->freeListNext.load(std::memory_order_relaxed);\n            if (freeListHead.compare_exchange_strong(head, next,\n                    std::memory_order_acquire, std::memory_order_relaxed)) {\n                // Yay, got the node. This means it was on the list, which means\n                // shouldBeOnFreeList must be false no matter the refcount (because\n                // nobody else knows it's been taken off yet, it can't have been put back on).\n                RL_ASSERT((head->freeListRefs.load(std::memory_order_relaxed) & SHOULD_BE_ON_FREELIST) == 0);\n\n                // Decrease refcount twice, once for our ref, and once for the list's ref\n                head->freeListRefs.fetch_add(-2, std::memory_order_release);\n\n                return head;\n            }\n\n            // OK, the head must have changed on us, but we still need to decrease the refcount we\n            // increased.\n            // Note that we don't need to release any memory effects, but we do need to ensure that the reference\n\t\t\t// count decrement happens-after the CAS on the head.\n            refs = prevHead->freeListRefs.fetch_add(-1, std::memory_order_acq_rel);\n            if (refs == SHOULD_BE_ON_FREELIST + 1) {\n                add_knowing_refcount_is_zero(prevHead);\n            }\n        }\n\n        return nullptr;\n    }\n\n    // Useful for traversing the list when there's no contention (e.g. to destroy remaining nodes)\n    N* head_unsafe() const { return freeListHead.load(std::memory_order_relaxed); }\n\nprivate:\n    inline void add_knowing_refcount_is_zero(N* node)\n    {\n        // Since the refcount is zero, and nobody can increase it once it's zero (except us, and we\n        // run only one copy of this method per node at a time, i.e. the single thread case), then we\n        // know we can safely change the next pointer of the node; however, once the refcount is back\n        // above zero, then other threads could increase it (happens under heavy contention, when the\n        // refcount goes to zero in between a load and a refcount increment of a node in try_get, then\n        // back up to something non-zero, then the refcount increment is done by the other thread) --\n        // so, if the CAS to add the node to the actual list fails, decrease the refcount and leave\n        // the add operation to the next thread who puts the refcount back at zero (which could be us,\n        // hence the loop).\n        auto head = freeListHead.load(std::memory_order_relaxed);\n        while (true) {\n            node->freeListNext.store(head, std::memory_order_relaxed);\n            node->freeListRefs.store(1, std::memory_order_release);\n            if (!freeListHead.compare_exchange_strong(head, node,\n                    std::memory_order_release, std::memory_order_relaxed)) {\n                // Hmm, the add failed, but we can only try again when the refcount goes back to zero\n                if (node->freeListRefs.fetch_add(SHOULD_BE_ON_FREELIST - 1, std::memory_order_release) == 1) {\n                    continue;\n                }\n            }\n            return;\n        }\n    }\n\nprivate:\n\tstatic const std::uint32_t REFS_MASK = 0x7FFFFFFF;\n\tstatic const std::uint32_t SHOULD_BE_ON_FREELIST = 0x80000000;\n\t\n    // Implemented like a stack, but where node order doesn't matter (nodes are\n    // inserted out of order under contention)\n    std::atomic<N*> freeListHead;\n};\n\n\nstruct TestNode : FreeListNode<TestNode>\n{\n\tint value;\n\tTestNode() { }\n\texplicit TestNode(int value) : value(value) { }\n};\n\nstruct basic_test : rl::test_suite<basic_test, 2>\n{\n\tFreeList<TestNode> freeList;\n\tTestNode initialNodes[2];\n\t\n\tvoid before()\n\t{\n\t}\n\t\n\tvoid thread(unsigned int tid)\n\t{\n\t\tTestNode* node = &initialNodes[tid];\n\t\tnode->value = tid;\n\t\tfreeList.add(node);\n\t\t\n\t\tnode = freeList.try_get();\n\t\tif (node != nullptr) {\n\t\t\tfreeList.add(node);\n\t\t}\n\t}\n\t\n\tvoid after()\n\t{\n\t}\n\t\n\tvoid invariant()\n\t{\n\t}\n};\n\nstruct full_test : rl::test_suite<full_test, 4>\n{\n    FreeList<TestNode> freeList;\n    TestNode initialNodes[6];\n    \n    void before()\n    {\n    }\n    \n    void thread(unsigned int tid)\n    {\n        TestNode* node;\n        int myNodeCount = tid >= 4 ? 2 : 1;\n        for (int i = 0; i != myNodeCount; ++i) {\n            node = &initialNodes[tid + (tid >= 5 ? 1 : 0) + i];\n            node->value = tid;\n            freeList.add(node);\n        }\n        \n        for (int i = 0; i != 3; ++i) {\n            node = freeList.try_get();\n            if (node != nullptr) {\n                freeList.add(node);\n            }\n        }\n    }\n    \n    void after()\n    {\n    }\n    \n    void invariant()\n    {\n    }\n};\n\nint main()\n{\n\trl::test_params params;\n\t//params.search_type = rl::sched_full;\n\t//params.iteration_count = 100000000;\n\tparams.search_type = rl::sched_random;\n\tparams.iteration_count = 1000000;\n    rl::simulate<basic_test>(params);\n\trl::simulate<full_test>(params);\n\t\n\treturn 0;\n}\n"
  },
  {
    "path": "tests/relacy/integrated.cpp",
    "content": "// ©2015 Cameron Desrochers\n\n// Tests various parts of the queue using the actual\n// full implementation itself, instead of isolated\n// components. This is much slower, but provides much\n// better coverage too.\n\n#define MCDBGQ_USE_RELACY\n#include \"../../concurrentqueue.h\"\n\n#include <string>\n\nusing namespace moodycamel;\n\nstruct SmallConstantTraits : public ConcurrentQueueDefaultTraits\n{\n\tstatic const size_t BLOCK_SIZE = 2;\n\tstatic const size_t EXPLICIT_INITIAL_INDEX_SIZE = 2;\n\tstatic const size_t IMPLICIT_INITIAL_INDEX_SIZE = 2;\n\tstatic const size_t INITIAL_IMPLICIT_PRODUCER_HASH_SIZE = 1;\n\tstatic const std::uint32_t EXPLICIT_CONSUMER_CONSUMPTION_QUOTA_BEFORE_ROTATE = 2;\n};\n\nstruct MediumConstantTraits : public ConcurrentQueueDefaultTraits\n{\n\tstatic const size_t BLOCK_SIZE = 4;\n\tstatic const size_t EXPLICIT_INITIAL_INDEX_SIZE = 2;\n\tstatic const size_t IMPLICIT_INITIAL_INDEX_SIZE = 4;\n\tstatic const size_t INITIAL_IMPLICIT_PRODUCER_HASH_SIZE = 2;\n\tstatic const std::uint32_t EXPLICIT_CONSUMER_CONSUMPTION_QUOTA_BEFORE_ROTATE = 4;\n};\n\nstruct Foo {\n\tstatic int& ctorCount() { static int c; return c; }\n\tstatic int& dtorCount() { static int c; return c; }\n\tstatic void reset() { ctorCount() = 0; dtorCount() = 0; }\n\t\n\tFoo()\n\t\t: id(-2)\n\t{\n\t\t++ctorCount();\n\t}\n\t\n\tFoo(int id)\n\t\t: id(id)\n\t{\n\t\t++ctorCount();\n\t}\n\t\n\tFoo(Foo const& o)\n\t\t: id(o.id)\n\t{\n\t\t++ctorCount();\n\t}\n\t\n\t~Foo()\n\t{\n\t\tRL_ASSERT(id != -1);\n\t\t++dtorCount();\n\t\tid = -1;\n\t}\n\t\npublic:\n\tint id;\n};\n\n\n\nstruct enqueue_explicit_one : rl::test_suite<enqueue_explicit_one, 2>\n{\n\tConcurrentQueue<int, SmallConstantTraits> q;\n\t\n\tvoid before()\n\t{\n\t}\n\t\n\tvoid thread(unsigned int tid)\n\t{\n\t\tRelacyThreadExitNotifier::notify_relacy_thread_start();\n\t\t\n\t\tProducerToken t(q);\n\t\tq.enqueue(t, tid);\n\t\t\n\t\tRelacyThreadExitNotifier::notify_relacy_thread_exit();\n\t}\n\t\n\tvoid after()\n\t{\n\t\tint tid0, tid1;\n\t\tRL_ASSERT(q.try_dequeue(tid0));\n\t\tRL_ASSERT(tid0 == 0 || tid0 == 1);\n\t\tRL_ASSERT(q.try_dequeue(tid1));\n\t\tRL_ASSERT(tid1 == 0 || tid1 == 1);\n\t\tRL_ASSERT(tid0 != tid1);\n\t\tRL_ASSERT(!q.try_dequeue(tid0));\n\t}\n\t\n\tvoid invariant()\n\t{\n\t}\n};\n\n\nstruct enqueue_explicit_many : rl::test_suite<enqueue_explicit_many, 3>\n{\n\tConcurrentQueue<int, SmallConstantTraits> q;\n\t\n\tvoid before()\n\t{\n\t}\n\t\n\tvoid thread(unsigned int tid)\n\t{\n\t\tRelacyThreadExitNotifier::notify_relacy_thread_start();\n\t\t\n\t\tProducerToken t(q);\n\t\tfor (int i = 0; i != 5; ++i) {\n\t\t\tq.enqueue(t, tid * 10 + i);\n\t\t}\n\t\t\n\t\tRelacyThreadExitNotifier::notify_relacy_thread_exit();\n\t}\n\t\n\tvoid after()\n\t{\n\t\tint item;\n\t\tfor (int i = 0; i != 15; ++i) {\n\t\t\tRL_ASSERT(q.try_dequeue(item));\n\t\t}\n\t\tRL_ASSERT(!q.try_dequeue(item));\n\t}\n\t\n\tvoid invariant()\n\t{\n\t}\n};\n\n\n// This one caught a bug with the memory ordering in the core dequeue algorithm\nstruct dequeue_some_explicit : rl::test_suite<dequeue_some_explicit, 3>\n{\n\tConcurrentQueue<int, SmallConstantTraits> q;\n\t\n\tvoid before()\n\t{\n\t}\n\t\n\tvoid thread(unsigned int tid)\n\t{\n\t\tRelacyThreadExitNotifier::notify_relacy_thread_start();\n\t\t\n\t\tif (tid <= 1) {\n\t\t\tint item;\n\t\t\tConsumerToken t(q);\n\t\t\tfor (int i = 0; i != 5; ++i) {\n\t\t\t\tq.try_dequeue(t, item);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tProducerToken t(q);\n\t\t\tfor (int i = 0; i != 3; ++i) {\n\t\t\t\tq.enqueue(t, tid * 10 + i);\n\t\t\t}\n\t\t}\n\t\t\n\t\tRelacyThreadExitNotifier::notify_relacy_thread_exit();\n\t}\n\t\n\tvoid after()\n\t{\n\t}\n\t\n\tvoid invariant()\n\t{\n\t}\n};\n\n\n// Causes blocks to be reused\nstruct recycle_blocks_explicit : rl::test_suite<recycle_blocks_explicit, 3>\n{\n\tConcurrentQueue<int, SmallConstantTraits> q;\n\tstd::vector<bool> seen;\n\t\n\tvoid before()\n\t{\n\t\tseen.resize(8, false);\n\t}\n\t\n\tvoid thread(unsigned int tid)\n\t{\n\t\tRelacyThreadExitNotifier::notify_relacy_thread_start();\n\t\t\n\t\tif (tid == 0) {\n\t\t\tProducerToken t(q);\n\t\t\tfor (int i = 0; i != 8; ++i) {\n\t\t\t\tq.enqueue(t, i);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tint item;\n\t\t\tConsumerToken t(q);\n\t\t\tfor (int i = 0; i != 6; ++i) {\n\t\t\t\tif (q.try_dequeue(t, item)) {\n\t\t\t\t\tRL_ASSERT(!seen[item]);\n\t\t\t\t\tseen[item] = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tRelacyThreadExitNotifier::notify_relacy_thread_exit();\n\t}\n\t\n\tvoid after()\n\t{\n\t\tint item;\n\t\twhile (q.try_dequeue(item)) {\n\t\t\tRL_ASSERT(!seen[item]);\n\t\t\tseen[item] = true;\n\t\t}\n\t\tfor (auto s : seen) {\n\t\t\tRL_ASSERT(s);\n\t\t}\n\t}\n\t\n\tvoid invariant()\n\t{\n\t}\n};\n\n// Causes the explicit producer's block index to expand\nstruct expand_block_index_explicit : rl::test_suite<expand_block_index_explicit, 4>\n{\n\tConcurrentQueue<int, SmallConstantTraits> q;\n\tstd::vector<bool> seen;\n\t\n\tvoid before()\n\t{\n\t\tseen.resize(12, false);\n\t}\n\t\n\tvoid thread(unsigned int tid)\n\t{\n\t\tRelacyThreadExitNotifier::notify_relacy_thread_start();\n\t\t\n\t\tif (tid == 0) {\n\t\t\tProducerToken t(q);\n\t\t\tfor (int i = 0; i != 12; ++i) {\n\t\t\t\tq.enqueue(t, i);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tint item;\n\t\t\tConsumerToken t(q);\n\t\t\tfor (int i = 0; i != 3; ++i) {\n\t\t\t\tif (q.try_dequeue(t, item)) {\n\t\t\t\t\tRL_ASSERT(!seen[item]);\n\t\t\t\t\tseen[item] = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tRelacyThreadExitNotifier::notify_relacy_thread_exit();\n\t}\n\t\n\tvoid after()\n\t{\n\t\tint item;\n\t\twhile (q.try_dequeue(item)) {\n\t\t\tRL_ASSERT(!seen[item]);\n\t\t\tseen[item] = true;\n\t\t}\n\t\tfor (auto s : seen) {\n\t\t\tRL_ASSERT(s);\n\t\t}\n\t}\n\t\n\tvoid invariant()\n\t{\n\t}\n};\n\n\n// Tests that implicit producers work at a very basic level\nstruct enqueue_implicit_one : rl::test_suite<enqueue_implicit_one, 2>\n{\n\tConcurrentQueue<int, SmallConstantTraits> q;\n\t\n\tvoid before()\n\t{\n\t}\n\t\n\tvoid thread(unsigned int tid)\n\t{\n\t\tRelacyThreadExitNotifier::notify_relacy_thread_start();\n\t\t\n\t\tq.enqueue(tid);\n\t\t\n\t\tRelacyThreadExitNotifier::notify_relacy_thread_exit();\n\t}\n\t\n\tvoid after()\n\t{\n\t\tint tid0, tid1;\n\t\tRL_ASSERT(q.try_dequeue(tid0));\n\t\tRL_ASSERT(tid0 == 0 || tid0 == 1);\n\t\tRL_ASSERT(q.try_dequeue(tid1));\n\t\tRL_ASSERT(tid1 == 0 || tid1 == 1);\n\t\tRL_ASSERT(tid0 != tid1);\n\t\tRL_ASSERT(!q.try_dequeue(tid0));\n\t}\n\t\n\tvoid invariant()\n\t{\n\t}\n};\n\n// Tests implicit producer at a simple level\nstruct implicit_simple : rl::test_suite<implicit_simple, 3>\n{\n\tConcurrentQueue<int, SmallConstantTraits> q;\n\tstd::vector<bool> seen;\n\t\n\tvoid before()\n\t{\n\t\tseen.resize(5, false);\n\t}\n\t\n\tvoid thread(unsigned int tid)\n\t{\n\t\tRelacyThreadExitNotifier::notify_relacy_thread_start();\n\t\t\n\t\tif (tid == 0) {\n\t\t\tfor (int i = 0; i != 5; ++i) {\n\t\t\t\tq.enqueue(i);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tint item;\n\t\t\tfor (int i = 0; i != 3; ++i) {\n\t\t\t\tif (q.try_dequeue(item)) {\n\t\t\t\t\tRL_ASSERT(!seen[item]);\n\t\t\t\t\tseen[item] = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tRelacyThreadExitNotifier::notify_relacy_thread_exit();\n\t}\n\t\n\tvoid after()\n\t{\n\t\tint item;\n\t\twhile (q.try_dequeue(item)) {\n\t\t\tRL_ASSERT(!seen[item]);\n\t\t\tseen[item] = true;\n\t\t}\n\t\tfor (auto s : seen) {\n\t\t\tRL_ASSERT(s);\n\t\t}\n\t}\n\t\n\tvoid invariant()\n\t{\n\t}\n};\n\n\n// Tests multiple implicit producers being created (stresses the implicit producer hash map)\nstruct many_implicit_producers : rl::test_suite<many_implicit_producers, 6>\n{\n\tConcurrentQueue<int, SmallConstantTraits> q;\n\tstd::vector<bool> seen;\n\t\n\tvoid before()\n\t{\n\t\tseen.resize(18, false);\n\t}\n\t\n\tvoid thread(unsigned int tid)\n\t{\n\t\tRelacyThreadExitNotifier::notify_relacy_thread_start();\n\t\t\n\t\tq.enqueue(tid * 3 + 0);\n\t\tq.enqueue(tid * 3 + 1);\n\t\tq.enqueue(tid * 3 + 2);\n\t\t\n\t\tint item;\n\t\tfor (int i = 0; i != 2; ++i) {\n\t\t\tif (q.try_dequeue(item)) {\n\t\t\t\tRL_ASSERT(!seen[item]);\n\t\t\t\tseen[item] = true;\n\t\t\t}\n\t\t}\n\t\t\n\t\tRelacyThreadExitNotifier::notify_relacy_thread_exit();\n\t}\n\t\n\tvoid after()\n\t{\n\t\tint item;\n\t\twhile (q.try_dequeue(item)) {\n\t\t\tRL_ASSERT(!seen[item]);\n\t\t\tseen[item] = true;\n\t\t}\n\t\tfor (auto s : seen) {\n\t\t\tRL_ASSERT(s);\n\t\t}\n\t}\n\t\n\tvoid invariant()\n\t{\n\t}\n};\n\n// Tests multiple implicit producers being created (stresses the implicit producer hash map)\nstruct implicit_producer_reuse : rl::test_suite<implicit_producer_reuse, 9>\n{\n\tConcurrentQueue<int, SmallConstantTraits> q;\n\tstd::vector<bool> seen;\n\t\n\tvoid before()\n\t{\n\t\tseen.resize(9, false);\n\t}\n\t\n\tvoid thread(unsigned int tid)\n\t{\n\t\tRelacyThreadExitNotifier::notify_relacy_thread_start();\n\t\t\n\t\tq.enqueue(tid);\n\t\t\n\t\tRelacyThreadExitNotifier::notify_relacy_thread_exit();\n\t}\n\t\n\tvoid after()\n\t{\n\t\tint item;\n\t\twhile (q.try_dequeue(item)) {\n\t\t\tRL_ASSERT(!seen[item]);\n\t\t\tseen[item] = true;\n\t\t}\n\t\tfor (auto s : seen) {\n\t\t\tRL_ASSERT(s);\n\t\t}\n\t}\n\t\n\tvoid invariant()\n\t{\n\t}\n};\n\n// Tests implicit producer block recycling\nstruct implicit_block_reuse : rl::test_suite<implicit_block_reuse, 4>\n{\n\tConcurrentQueue<int, SmallConstantTraits> q;\n\tstd::vector<bool> seen;\n\t\n\tvoid before()\n\t{\n\t\tseen.resize(28, false);\n\t}\n\t\n\tvoid thread(unsigned int tid)\n\t{\n\t\tRelacyThreadExitNotifier::notify_relacy_thread_start();\n\t\t\n\t\tfor (int i = 0; i != 7; ++i) {\n\t\t\tq.enqueue(tid * 7 + i);\n\t\t}\n\t\t\n\t\tint item;\n\t\tConsumerToken t(q);\n\t\tfor (int i = 0; i != 7; ++i) {\n\t\t\tif (q.try_dequeue(t, item)) {\n\t\t\t\tRL_ASSERT(!seen[item]);\n\t\t\t\tseen[item] = true;\n\t\t\t}\n\t\t}\n\t\t\n\t\tRelacyThreadExitNotifier::notify_relacy_thread_exit();\n\t}\n\t\n\tvoid after()\n\t{\n\t\tint item;\n\t\twhile (q.try_dequeue(item)) {\n\t\t\tRL_ASSERT(!seen[item]);\n\t\t\tseen[item] = true;\n\t\t}\n\t\tfor (auto s : seen) {\n\t\t\tRL_ASSERT(s);\n\t\t}\n\t}\n\t\n\tvoid invariant()\n\t{\n\t}\n};\n\n// Tests consumption from mixed producers\nstruct mixed : rl::test_suite<mixed, 4>\n{\n\tConcurrentQueue<int, SmallConstantTraits> q;\n\tstd::vector<bool> seen;\n\t\n\tvoid before()\n\t{\n\t\tseen.resize(28, false);\n\t}\n\t\n\tvoid thread(unsigned int tid)\n\t{\n\t\tRelacyThreadExitNotifier::notify_relacy_thread_start();\n\t\t\n\t\tif (tid <= 1) {\n\t\t\tfor (int i = 0; i != 7; ++i) {\n\t\t\t\tq.enqueue(tid * 7 + i);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tProducerToken t(q);\n\t\t\tfor (int i = 0; i != 7; ++i) {\n\t\t\t\tq.enqueue(t, tid * 7 + i);\n\t\t\t}\n\t\t}\n\t\t\n\t\tint item;\n\t\tif (tid & 1) {\n\t\t\tfor (int i = 0; i != 4; ++i) {\n\t\t\t\tif (q.try_dequeue(item)) {\n\t\t\t\t\tRL_ASSERT(!seen[item]);\n\t\t\t\t\tseen[item] = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tConsumerToken t(q);\n\t\t\tfor (int i = 0; i != 4; ++i) {\n\t\t\t\tif (q.try_dequeue(t, item)) {\n\t\t\t\t\tRL_ASSERT(!seen[item]);\n\t\t\t\t\tseen[item] = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tRelacyThreadExitNotifier::notify_relacy_thread_exit();\n\t}\n\t\n\tvoid after()\n\t{\n\t\tint item;\n\t\twhile (q.try_dequeue(item)) {\n\t\t\tRL_ASSERT(!seen[item]);\n\t\t\tseen[item] = true;\n\t\t}\n\t\tfor (auto s : seen) {\n\t\t\tRL_ASSERT(s);\n\t\t}\n\t}\n\t\n\tvoid invariant()\n\t{\n\t}\n};\n\n// Test leftovers are being properly destroyed\nstruct leftovers_destroyed_explicit : rl::test_suite<leftovers_destroyed_explicit, 3>\n{\n\tConcurrentQueue<Foo, MediumConstantTraits>* q;\n\tstd::vector<bool> seen;\n\t\n\tvoid before()\n\t{\n\t\tseen.resize(rl::rand(32), false);\n\t\t\n\t\tq = new ConcurrentQueue<Foo, MediumConstantTraits>();\n\t\tFoo::reset();\n\t}\n\t\n\tvoid thread(unsigned int tid)\n\t{\n\t\tRelacyThreadExitNotifier::notify_relacy_thread_start();\n\t\t\n\t\tif (tid == 0) {\n\t\t\tProducerToken t(*q);\n\t\t\tfor (int i = 0; i != (int)seen.size(); ++i) {\n\t\t\t\tq->enqueue(t, Foo(i));\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tFoo item;\n\t\t\tConsumerToken t(*q);\n\t\t\tfor (int i = rl::rand(17); i > 0; --i) {\n\t\t\t\tif (q->try_dequeue(t, item)) {\n\t\t\t\t\tRL_ASSERT(!seen[item.id]);\n\t\t\t\t\tseen[item.id] = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tRelacyThreadExitNotifier::notify_relacy_thread_exit();\n\t}\n\t\n\tvoid after()\n\t{\n\t\tint seenCount = 0;\n\t\t{\n\t\t\tfor (auto s : seen) {\n\t\t\t\tif (s) {\n\t\t\t\t\t++seenCount;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tRL_ASSERT(Foo::ctorCount() == seen.size() * 2 + 2);\n\t\tRL_ASSERT(Foo::dtorCount() == seen.size() + seenCount + 2);\n\t\tdelete q;\n\t\t\n\t\tRL_ASSERT(Foo::ctorCount() == seen.size() * 2 + 2);\n\t\tRL_ASSERT(Foo::ctorCount() == Foo::dtorCount());\n\t}\n\t\n\tvoid invariant()\n\t{\n\t}\n};\n\n// implicit\nstruct leftovers_destroyed_implicit : rl::test_suite<leftovers_destroyed_implicit, 3>\n{\n\tConcurrentQueue<Foo, MediumConstantTraits>* q;\n\tstd::vector<bool> seen;\n\t\n\tvoid before()\n\t{\n\t\tseen.resize(rl::rand(32), false);\n\t\t\n\t\tq = new ConcurrentQueue<Foo, MediumConstantTraits>();\n\t\tFoo::reset();\n\t}\n\t\n\tvoid thread(unsigned int tid)\n\t{\n\t\tRelacyThreadExitNotifier::notify_relacy_thread_start();\n\t\t\n\t\tif (tid == 0) {\n\t\t\tfor (int i = 0; i != (int)seen.size(); ++i) {\n\t\t\t\tq->enqueue(Foo(i));\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tFoo item;\n\t\t\tfor (int i = rl::rand(17); i > 0; --i) {\n\t\t\t\tif (q->try_dequeue(item)) {\n\t\t\t\t\tRL_ASSERT(!seen[item.id]);\n\t\t\t\t\tseen[item.id] = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tRelacyThreadExitNotifier::notify_relacy_thread_exit();\n\t}\n\t\n\tvoid after()\n\t{\n\t\tint seenCount = 0;\n\t\t{\n\t\t\tfor (auto s : seen) {\n\t\t\t\tif (s) {\n\t\t\t\t\t++seenCount;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tRL_ASSERT(Foo::ctorCount() == seen.size() * 2 + 2);\n\t\tRL_ASSERT(Foo::dtorCount() == seen.size() + seenCount + 2);\n\t\tdelete q;\n\t\t\n\t\tRL_ASSERT(Foo::ctorCount() == seen.size() * 2 + 2);\n\t\tRL_ASSERT(Foo::ctorCount() == Foo::dtorCount());\n\t}\n\t\n\tvoid invariant()\n\t{\n\t}\n};\n\n\ntemplate<typename TTest>\nvoid simulate(int iterations)\n{\n\t// Note: There's no point using the full search params\n\t// Even with the simple enqueue_explicit_one test, it\n\t// would take a few millenia to complete(!)\n\t//rl::test_params fullParams;\n\t//fullParams.search_type = rl::sched_full;\n\t\n\trl::test_params randomParams;\n\trandomParams.search_type = rl::sched_random;\n\trandomParams.iteration_count = iterations;\n\trl::simulate<TTest>(randomParams);\n}\n\nint main()\n{\n\tsimulate<enqueue_explicit_one>(1000000);\n\tsimulate<enqueue_explicit_many>(1000000);\n\tsimulate<dequeue_some_explicit>(1000000);\n\tsimulate<recycle_blocks_explicit>(1000000);\n\tsimulate<expand_block_index_explicit>(1000000);\n\tsimulate<enqueue_implicit_one>(1000000);\n\tsimulate<implicit_simple>(1000000);\n\tsimulate<many_implicit_producers>(500000);\n\tsimulate<implicit_producer_reuse>(1000000);\n\tsimulate<implicit_block_reuse>(1000000);\n\tsimulate<mixed>(1000000);\n\tsimulate<leftovers_destroyed_explicit>(1000000);\n\tsimulate<leftovers_destroyed_implicit>(1000000);\n\t\n\treturn 0;\n}\n"
  },
  {
    "path": "tests/relacy/makefile",
    "content": "# ©2014-2015 Cameron Desrochers\n\ninclude ../../build/makefile.inc\n\nifeq ($(OS),Windows_NT)\n\tPLATFORM_OPTS = -static\nelse\n\tPLATFORM_OPTS = -lrt\nendif\n\nOPTS = -Wno-int-to-pointer-cast -pthread $(PLATFORM_OPTS) -O3 -g\n\ndefault: freelist$(EXT) spmchash$(EXT) integrated$(EXT)\n\nfreelist$(EXT): makefile freelist.cpp\n\tg++ -std=c++11 -fpermissive $(OPTS) freelist.cpp -o freelist$(EXT)\n\nspmchash$(EXT): makefile spmchash.cpp\n\tg++ -std=c++11 -fpermissive $(OPTS) spmchash.cpp -o spmchash$(EXT)\n\t\nintegrated$(EXT): makefile integrated.cpp ../../concurrentqueue.h relacy_shims.h\n\tg++ -std=c++11 -fpermissive $(OPTS) -Irelacy -I. integrated.cpp -o integrated$(EXT)\n\n#run: freelist$(EXT)\n#\t./freelist$(EXT)\n#run: spmchash$(EXT)\n#\t./spmchash$(EXT)\nrun: integrated$(EXT)\n\t./integrated$(EXT)\n"
  },
  {
    "path": "tests/relacy/relacy/CHANGES",
    "content": "Version 2.4\nFeatures:\n+ Support for futex(FUTEX_WAIT/FUTEX_WAKE) \n+ Linux/Darwin performance improved (2.5x for Linux, 7x for Darwin)\nFixes:\n+ Fixed a bunch of issues with WaitForMultipleObjects()/SignalObjectAndWait()\n+ Fixed rare spurious memory leak reports related to test progress reporting\n\nVersion 2.3\nFeatures:\n+ Support for FlushProcessWriteBuffers()\n\nVersion 2.2\nFeatures:\n+ Support for pthread_mutex_timedlock()\n+ Support for ETIMEDOUT, EINTR in pthread_cond_timedwait()/pthread_cond_wait()\n+ rl::hash_ptr(p, sz) function which provides deterministic hashing of pointers\nFixes:\n+ Win32 mutex is now recursive\n+ Compilation issue on MSVC x64 when RL_DEBUGBREAK_ON_ASSERT/RL_DEBUGBREAK_ON_FAILURE defined\n+ Fixed OOM crash when execution history is very large\n+ Fixed rare crash during iteration count estimation in context bound scheduler\n+ Fixed bug in pthread_rwlock/SRWLOCK that at most 2 readers may acquire it simultaneously\n+ Fixed bug regarding false race detection when simulation runs for very long time (int overflow)\n\n"
  },
  {
    "path": "tests/relacy/relacy/LICENSE",
    "content": "Relacy Race Detector\r\nCopyright (c) 2008-2013, Dmitry S. Vyukov\r\nAll rights reserved.\r\n\nRedistribution and use in source and binary forms, with or without modification,\r\nare permitted provided that the following conditions are met:\r\n  - Redistributions of source code must retain the above copyright notice,\r\n    this list of conditions and the following disclaimer.\r\n  - Redistributions in binary form must reproduce the above copyright notice, this list of conditions\r\n    and the following disclaimer in the documentation and/or other materials provided with the distribution.\r\n  - The name of the owner may not be used to endorse or promote products derived from this software\r\n    without specific prior written permission.\r\nTHIS SOFTWARE IS PROVIDED BY THE OWNER \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\r\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\r\nIN NO EVENT SHALL THE OWNER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,\r\nOR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\r\nSTRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\r\nEVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n"
  },
  {
    "path": "tests/relacy/relacy/VERSION",
    "content": "acc09bbe65a1837a08912774c7fed178547514e6\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/cli_ws_deque/cli_ws_deque.cpp",
    "content": "#include \"stdafx.h\"\r\n#include \"../../relacy/relacy_cli.hpp\"\r\n\r\n\r\nusing rl::nvar;\r\nusing rl::nvolatile;\r\nusing rl::mutex;\r\n\r\n\r\n\r\n\r\ntemplate<typename T>\r\nclass ws_deque\r\n{\r\npublic:\r\n    ws_deque()\r\n    {\r\n        m_mask($) = initial_size - 1;\r\n        m_headIndex($) = 0;\r\n        m_tailIndex($) = 0;\r\n        m_array($) = new nvar<T> [initial_size];\r\n        m_arraySize($) = initial_size;\r\n    }\r\n\r\n    bool IsEmpty()\r\n    {\r\n        return m_headIndex($) >= m_tailIndex($);\r\n    }\r\n\r\n    size_t Count()\r\n    {\r\n        return m_tailIndex($) - m_headIndex($);\r\n    }\r\n\r\n    void push(T item)\r\n    {\r\n        size_t tail = m_tailIndex($);\r\n        if (tail <= m_headIndex($) + m_mask($))\r\n        {\r\n            m_array($)[tail & m_mask($)]($) = item;\r\n            m_tailIndex($) = tail + 1;\r\n        }\r\n        else\r\n        {\r\n            m_foreignLock.lock($);\r\n            size_t head = m_headIndex($);\r\n            size_t count = Count();\r\n            if (count >= m_mask($))\r\n            {\r\n                size_t arraySize = m_arraySize($);\r\n                size_t mask = m_mask($);\r\n                nvar<T>* newArray = new nvar<T> [arraySize * 2];\r\n                nvar<T>* arr = m_array($);\r\n                for (size_t i = 0; i != count; ++i)\r\n                    newArray[i]($) = arr[(i + head) & mask]($);\r\n                m_array($) = newArray;\r\n                m_arraySize($) = arraySize * 2;\r\n                m_headIndex($) = 0;\r\n                m_tailIndex($) = count;\r\n                tail = count;\r\n                m_mask($) = (mask * 2) | 1;\r\n            }\r\n            m_array($)[tail & m_mask($)]($) = item;\r\n            m_tailIndex($) = tail + 1;\r\n            m_foreignLock.unlock($);\r\n        }\r\n    }\r\n\r\n    bool pop(T& item)\r\n    {\r\n        size_t tail = m_tailIndex($);\r\n        if (tail == 0)\r\n            return false;\r\n        tail -= 1;\r\n        rl::Interlocked::Exchange(m_tailIndex, tail, $);\r\n        if (m_headIndex($) <= tail)\r\n        {\r\n            item = m_array($)[tail & m_mask($)]($);\r\n            return true;\r\n        }\r\n        else\r\n        {\r\n            m_foreignLock.lock($);\r\n            if (m_headIndex($) <= tail)\r\n            {\r\n                item = m_array($)[tail & m_mask($)]($);\r\n                m_foreignLock.unlock($);\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                m_tailIndex($) = tail + 1;\r\n                m_foreignLock.unlock($);\r\n                return false;\r\n            }\r\n        }\r\n    }\r\n\r\n    bool steal(T& item)\r\n    {\r\n        if (false == m_foreignLock.try_lock($))\r\n            return false;\r\n        size_t head = m_headIndex($);\r\n        rl::Interlocked::Exchange(m_headIndex, head + 1, $);\r\n        if (head < m_tailIndex($))\r\n        {\r\n            item = m_array($)[head & m_mask($)]($);\r\n            m_foreignLock.unlock($);\r\n            return true;\r\n        }\r\n        else\r\n        {\r\n            m_headIndex($) = head;\r\n            m_foreignLock.unlock($);\r\n            return false;\r\n        }\r\n    }\r\n\r\nprivate:\r\n    static size_t const initial_size = 2;\r\n    nvar<nvar<T>*> m_array;\r\n    nvar<size_t> m_mask;\r\n    nvar<size_t> m_arraySize;\r\n    nvolatile<size_t> m_headIndex;\r\n    nvolatile<size_t> m_tailIndex;\r\n    mutex m_foreignLock;\r\n};\r\n\r\n\r\n\r\n\r\nstruct ws_deque_test : rl::test_suite<ws_deque_test, 2>\r\n{\r\n    ws_deque<int> q;\r\n    bool state [2];\r\n\r\n    void before()\r\n    {\r\n        state[0] = true;\r\n        state[1] = true;\r\n    }\r\n\r\n    void after()\r\n    {\r\n        RL_ASSERT(state[0] == false);\r\n        RL_ASSERT(state[1] == false);\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            q.push(1);\r\n            q.push(2);\r\n\r\n            int item = 0;\r\n            bool res = q.pop(item);\r\n            RL_ASSERT(res && item == 2);\r\n            RL_ASSERT(state[1]);\r\n            state[1] = false;\r\n\r\n            item = 0;\r\n            res = q.pop(item);\r\n            if (res)\r\n            {\r\n                RL_ASSERT(state[0]);\r\n                state[0] = false;\r\n            }\r\n\r\n            item = 0;\r\n            res = q.pop(item);\r\n            RL_ASSERT(res == false);\r\n        }\r\n        else\r\n        {\r\n            int item = 0;\r\n            bool res = q.steal(item);\r\n            if (res)\r\n            {\r\n                RL_ASSERT(item == 1);\r\n                RL_ASSERT(state[0]);\r\n                state[0] = false;\r\n            }\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nint main()\r\n{\r\n    rl::simulate<ws_deque_test>();\r\n}\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/cli_ws_deque/msvc8/cli_ws_deque.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 9.00\r\n# Visual Studio 2005\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"cli_ws_deque\", \"cli_ws_deque.vcproj\", \"{0B597F19-DEBB-4832-B520-9A93A286D595}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tRelease|Win32 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{0B597F19-DEBB-4832-B520-9A93A286D595}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{0B597F19-DEBB-4832-B520-9A93A286D595}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{0B597F19-DEBB-4832-B520-9A93A286D595}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{0B597F19-DEBB-4832-B520-9A93A286D595}.Release|Win32.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/cli_ws_deque/msvc8/cli_ws_deque.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"cli_ws_deque\"\r\n\tProjectGUID=\"{967F376B-BDBF-4AC8-9325-371CC8ABD8FD}\"\r\n\tRootNamespace=\"cli_ws_deque\"\r\n\tKeyword=\"Win32Proj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\cli_ws_deque.cpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.cpp\"\r\n\t\t\t>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\tObjectFile=\"$(IntDir)\\$(InputName)1.obj\"\r\n\t\t\t\t\tXMLDocumentationFileName=\"$(IntDir)\\$(InputName)1.xdc\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\tObjectFile=\"$(IntDir)\\$(InputName)1.obj\"\r\n\t\t\t\t\tXMLDocumentationFileName=\"$(IntDir)\\$(InputName)1.xdc\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/cli_ws_deque/stdafx.cpp",
    "content": "#include \"stdafx.h\"\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/cli_ws_deque/stdafx.h",
    "content": "#pragma once\r\n\r\n\r\n#include \"../../relacy/pch.hpp\"\r\n\r\n\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/condvar/condvar.cpp",
    "content": "#include \"stdafx.h\"\r\n#include \"../../relacy/relacy_std.hpp\"\r\n\r\n// THE TEST IS EXPECTED TO FAIL WITH \"DEADLOCK\"\r\n\r\nclass CondVar\r\n{\r\npublic:\r\n        CondVar();\r\n        ~CondVar();\r\n   void Enter();\r\n   void Wait();\r\n   void Release();\r\n   void ReleaseAll();\r\n   void Leave();\r\n\r\nprivate:\r\n    std::atomic<int>        m_lMutex;\r\n    std::atomic<unsigned>   m_dwWaitingForSignal;\r\n    HANDLE                  m_xhEvtEnter;\r\n    HANDLE                  m_xhSemRelease;\r\n};\r\n\r\nCondVar::CondVar()\r\n    : m_xhEvtEnter(CreateEvent(0, 0, 0, 0))\r\n    , m_xhSemRelease(CreateSemaphore(0, 0, 0x7FFFFFFF, 0))\r\n{\r\n    m_lMutex.store(0, std::memory_order_relaxed);\r\n    m_dwWaitingForSignal.store(0, std::memory_order_relaxed);\r\n}\r\n\r\nCondVar::~CondVar()\r\n{\r\n    CloseHandle(m_xhEvtEnter);\r\n    CloseHandle(m_xhSemRelease);\r\n}\r\n\r\nvoid CondVar::Enter()\r\n{\r\n   int lMutex = m_lMutex.load(std::memory_order_seq_cst);\r\n   for (;;)\r\n   {\r\n     if( lMutex >= 0 )\r\n     {\r\n         if (m_lMutex.compare_exchange_weak(lMutex, lMutex | 0x80000000u, std::memory_order_seq_cst))\r\n            break;\r\n     }\r\n     else\r\n     {\r\n        if (false == m_lMutex.compare_exchange_weak(lMutex, lMutex + 1, std::memory_order_seq_cst))\r\n            continue;\r\n        WaitForSingleObject(m_xhEvtEnter, INFINITE);\r\n        RL_ASSERT(m_lMutex.load(std::memory_order_seq_cst) < 0);\r\n        break;\r\n     }\r\n   }\r\n}\r\n\r\nvoid CondVar::Wait()\r\n{\r\n    unsigned dwWaitingForSignal = m_dwWaitingForSignal.load(std::memory_order_seq_cst);\r\n    m_dwWaitingForSignal.store(dwWaitingForSignal + 1, std::memory_order_seq_cst);\r\n    RL_ASSERT(m_lMutex.load(std::memory_order_seq_cst) < 0);\r\n\r\n    int lMutex = m_lMutex.load(std::memory_order_seq_cst);\r\n    for (;;)\r\n    {\r\n        unsigned dwWaitingToOwn = lMutex & 0x7FFFFFFFu;\r\n        RL_ASSERT(dwWaitingToOwn >= dwWaitingForSignal);\r\n        if (dwWaitingToOwn == dwWaitingForSignal)\r\n        {\r\n            if (m_lMutex.compare_exchange_weak(lMutex, dwWaitingToOwn + 1, std::memory_order_seq_cst))\r\n                break;\r\n        }\r\n        else\r\n        {\r\n            SetEvent(m_xhEvtEnter);\r\n            break;\r\n       }\r\n   }\r\n\r\n   WaitForSingleObject(m_xhSemRelease, INFINITE);\r\n   WaitForSingleObject(m_xhEvtEnter, INFINITE);\r\n\r\n   RL_ASSERT(m_lMutex.load(std::memory_order_seq_cst) < 0);\r\n}\r\n\r\nvoid CondVar::Release()\r\n{\r\n   RL_ASSERT(m_lMutex.load(std::memory_order_seq_cst) < 0);\r\n    unsigned dwWaitingForSignal = m_dwWaitingForSignal.load(std::memory_order_seq_cst);\r\n    if (dwWaitingForSignal != 0)\r\n    {\r\n        m_dwWaitingForSignal.store(dwWaitingForSignal - 1, std::memory_order_seq_cst);\r\n        ReleaseSemaphore(m_xhSemRelease, 1, 0);\r\n    }\r\n}\r\n\r\nvoid CondVar::ReleaseAll()\r\n{\r\n   RL_ASSERT(m_lMutex.load(std::memory_order_seq_cst) < 0);\r\n    unsigned dwWaitingForSignal = m_dwWaitingForSignal.load(std::memory_order_seq_cst);\r\n    if (dwWaitingForSignal != 0)\r\n    {\r\n        m_dwWaitingForSignal.store(0, std::memory_order_seq_cst);\r\n        ReleaseSemaphore(m_xhSemRelease, dwWaitingForSignal, 0);\r\n   }\r\n}\r\n\r\nvoid CondVar::Leave()\r\n{\r\n    int lMutex = m_lMutex.load(std::memory_order_seq_cst);\r\n    RL_ASSERT(lMutex < 0);\r\n    for (;;)\r\n    {\r\n        unsigned dwWaitingToOwn     = lMutex & 0x7FFFFFFFu;\r\n        unsigned dwWaitingForSignal = m_dwWaitingForSignal.load(std::memory_order_seq_cst);\r\n        RL_ASSERT(dwWaitingToOwn >= dwWaitingForSignal);\r\n        if (dwWaitingToOwn == dwWaitingForSignal)\r\n        {\r\n            if (m_lMutex.compare_exchange_weak(lMutex, lMutex & 0x7FFFFFFF, std::memory_order_seq_cst))\r\n                break;\r\n        }\r\n        else\r\n        {\r\n            if (false == m_lMutex.compare_exchange_weak(lMutex, lMutex - 1, std::memory_order_seq_cst))\r\n                continue;\r\n            SetEvent(m_xhEvtEnter);\r\n            break;\r\n        }\r\n    } \r\n}\r\n\r\nstruct CondVarTest : rl::test_suite<CondVarTest, 3>\r\n{\r\n    VAR_T(int) stage;\r\n    CondVar cv;\r\n\r\n    void before()\r\n    {\r\n        VAR(stage) = 0;\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            cv.Enter();\r\n            VAR(stage) += 1;\r\n            cv.ReleaseAll();\r\n            while (VAR(stage) != 2)\r\n                cv.Wait();\r\n            cv.Leave();\r\n        }\r\n        else if (1 == index)\r\n        {\r\n            cv.Enter();\r\n            while (VAR(stage) != 1)\r\n                cv.Wait();\r\n            VAR(stage) += 1;\r\n            cv.ReleaseAll();\r\n            cv.Leave();\r\n        }\r\n        else if (2 == index)\r\n        {\r\n            cv.Enter();\r\n            while (VAR(stage) != 2)\r\n                cv.Wait();\r\n            cv.Leave();\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nint main()\r\n{\r\n    rl::simulate<CondVarTest>();\r\n}\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/condvar/msvc8/condvar.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 9.00\r\n# Visual Studio 2005\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"condvar\", \"condvar.vcproj\", \"{D4756EE9-3953-4E17-B1B5-E89F853303C1}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tRelease|Win32 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Release|Win32.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/condvar/msvc8/condvar.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"condvar\"\r\n\tProjectGUID=\"{6CC59CF8-408B-441B-8F65-15651210CB82}\"\r\n\tRootNamespace=\"condvar\"\r\n\tKeyword=\"Win32Proj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\condvar.cpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.cpp\"\r\n\t\t\t>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\tObjectFile=\"$(IntDir)\\$(InputName)1.obj\"\r\n\t\t\t\t\tXMLDocumentationFileName=\"$(IntDir)\\$(InputName)1.xdc\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\tObjectFile=\"$(IntDir)\\$(InputName)1.obj\"\r\n\t\t\t\t\tXMLDocumentationFileName=\"$(IntDir)\\$(InputName)1.xdc\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/condvar/msvc9/condvar.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 10.00\r\n# Visual Studio 2008\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"condvar\", \"condvar.vcproj\", \"{D4756EE9-3953-4E17-B1B5-E89F853303C1}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tRelease|Win32 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Release|Win32.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/condvar/msvc9/condvar.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"9,00\"\r\n\tName=\"condvar\"\r\n\tProjectGUID=\"{6CC59CF8-408B-441B-8F65-15651210CB82}\"\r\n\tRootNamespace=\"condvar\"\r\n\tKeyword=\"Win32Proj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\condvar.cpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.cpp\"\r\n\t\t\t>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\tObjectFile=\"$(IntDir)\\$(InputName)1.obj\"\r\n\t\t\t\t\tXMLDocumentationFileName=\"$(IntDir)\\$(InputName)1.xdc\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\tObjectFile=\"$(IntDir)\\$(InputName)1.obj\"\r\n\t\t\t\t\tXMLDocumentationFileName=\"$(IntDir)\\$(InputName)1.xdc\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/condvar/stdafx.cpp",
    "content": "#include \"stdafx.h\"\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/condvar/stdafx.h",
    "content": "#pragma once\r\n\r\n#ifdef NDEBUG\r\n#   define _SECURE_SCL 0\r\n#endif\r\n\r\n#define RL_MSVC_OUTPUT\r\n//#define RL_DEBUGBREAK_ON_FAILURE\r\n\r\n#include \"../../relacy/pch.hpp\"\r\n#include \"../../relacy/relacy_std.hpp\"\r\n\r\n\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/eao_blocking/eao_blocking.cpp",
    "content": "/*\r\n#define BOOST_ALL_NO_LIB\r\n#pragma warning (push, 3)\r\n#include <boost/thread/mutex.hpp>\r\n#include <boost/thread/shared_mutex.hpp>\r\n#include \"C:\\boost_1_35_0\\libs\\thread\\src\\win32\\exceptions.cpp\"\r\n#pragma warning (pop)\r\n\r\n\r\nclass business_logic\r\n{\r\npublic:\r\n    typedef unsigned account_id_t;\r\n    typedef double balance_t;\r\n\r\n    bool add_account(account_id_t acc_id, balance_t balance)\r\n    {\r\n        accounts_guard.lock();\r\n        if (accounts.find(acc_id) != accounts.end())\r\n        {\r\n            accounts_guard.unlock();\r\n            return false;\r\n        }\r\n        accounts[acc_id].balance = balance;\r\n        accounts_guard.unlock();\r\n        return true;\r\n    }\r\n\r\n    bool transfer_balance(account_id_t acc_id1, account_id_t acc_id2, balance_t amount)\r\n    {\r\n        accounts_guard.lock_shared();\r\n        if (accounts.find(acc_id1) != accounts.end()\r\n            || accounts.find(acc_id2) != accounts.end())\r\n        {\r\n            accounts_guard.unlock_shared();\r\n            return false;\r\n        }\r\n        account_info& acc1 = accounts[acc_id1];\r\n        account_info& acc2 = accounts[acc_id2];\r\n        acc1.mtx.lock();\r\n        acc2.mtx.lock();\r\n        accounts_guard.unlock_shared();\r\n\r\n        acc1.balance -= amount;\r\n        acc2.balance += amount;\r\n\r\n        acc1.mtx.unlock();\r\n        acc2.mtx.unlock();\r\n        return true;\r\n    }\r\n\r\nprivate:\r\n    struct account_info\r\n    {\r\n        balance_t balance;\r\n        boost::mutex mtx;\r\n\r\n        account_info()\r\n            : balance()\r\n        {}\r\n\r\n        account_info(account_info const& acc)\r\n            : balance(acc.balance)\r\n        {}\r\n    };\r\n\r\n    typedef std::map<account_id_t, account_info> account_map_t;\r\n    account_map_t accounts;\r\n    boost::shared_mutex accounts_guard;\r\n};\r\n\r\n*/\r\n\r\n/*\r\n#undef RL_TEST\r\n\r\n#ifndef RL_TEST\r\n//#   define ASSERT assert\r\ntypedef boost::mutex mutex_t;\r\n#   define $$\r\n#else\r\n//#   define ASSERT RL_ASSERT\r\ntypedef rl::recursive_mutex mutex_t;\r\n#   define $$ $\r\n#endif\r\n\r\n\r\n\r\nclass business_logic\r\n{\r\npublic:\r\n    typedef unsigned account_id_t;\r\n    typedef double balance_t;\r\n\r\n    bool add_account(account_id_t acc_id, balance_t balance)\r\n    {\r\n        accounts_guard.lock($$);\r\n        if (accounts.find(acc_id) != accounts.end())\r\n        {\r\n            accounts_guard.unlock($$);\r\n            return false;\r\n        }\r\n        accounts[acc_id].balance = balance;\r\n        accounts_guard.unlock($$);\r\n        return true;\r\n    }\r\n\r\n    bool transfer_balance(account_id_t acc_id1, account_id_t acc_id2, balance_t amount)\r\n    {\r\n        accounts_guard.lock($$);\r\n        if (accounts.find(acc_id1) == accounts.end()\r\n            || accounts.find(acc_id2) == accounts.end())\r\n        {\r\n            accounts_guard.unlock($$);\r\n            return false;\r\n        }\r\n        account_info& acc1 = accounts[acc_id1];\r\n        account_info& acc2 = accounts[acc_id2];\r\n        acc1.mtx.lock($$);\r\n        acc2.mtx.lock($$);\r\n        accounts_guard.unlock($$);\r\n\r\n        acc1.balance -= amount;\r\n        acc2.balance += amount;\r\n\r\n        acc1.mtx.unlock($$);\r\n        acc2.mtx.unlock($$);\r\n\r\n        return true;\r\n    }\r\n\r\nprivate:\r\n    struct account_info\r\n    {\r\n        balance_t balance;\r\n        mutex_t mtx;\r\n\r\n        account_info()\r\n            : balance()\r\n        {}\r\n\r\n        account_info(account_info const& acc)\r\n            : balance(acc.balance)\r\n        {}\r\n    };\r\n\r\n    typedef std::map<account_id_t, account_info> account_map_t;\r\n    account_map_t accounts;\r\n    mutex_t accounts_guard;\r\n};\r\n\r\n*/\r\n\r\n/*\r\nstruct business_logic_test : rl::test_suite<business_logic_test, 2>\r\n{\r\n    business_logic bl;\r\n\r\n    static size_t const account_count = 10;\r\n\r\n    void before()\r\n    {\r\n        for (size_t i = 0; i != account_count; ++i)\r\n        {\r\n            bool rv = bl.add_account(i, i * 10.0);\r\n            RL_ASSERT(rv);\r\n        }\r\n    }\r\n\r\n    void thread(unsigned)\r\n    {\r\n        business_logic::account_id_t acc1 = rl::rand(account_count);\r\n        business_logic::account_id_t acc2 = rl::rand(account_count);\r\n        bool rv = bl.transfer_balance(acc1, acc2, 1.0);\r\n        RL_ASSERT(rv);\r\n    }\r\n};\r\n*/\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/eventcount/eventcount.cpp",
    "content": "#include \"stdafx.h\"\r\n\r\n#include \"../../relacy/windows.h\"\r\n\r\n#define HANDLE rl::HANDLE\r\n\r\n#define CreateSemaphoreA rl::RL_CreateSemaphore($)\r\n#define CreateSemaphoreW rl::RL_CreateSemaphore($)\r\n#ifndef CreateSemaphore\r\n#   define CreateSemaphore CreateSemaphoreW\r\n#endif\r\n\r\n\r\n#define CloseHandle rl::RL_CloseHandle($)\r\n\r\n\r\n#include <stddef.h>\r\n\r\n\r\n#if defined(WIN32) && defined(_MSC_VER)\r\n\r\n#include <windows.h>\r\n#include <intrin.h>\r\n\r\nclass semaphore\r\n{\r\npublic:\r\n    semaphore()\r\n    {\r\n        h_ = CreateSemaphore(0, 0, LONG_MAX, 0);\r\n    }\r\n\r\n    ~semaphore()\r\n    {\r\n        CloseHandle(h_);\r\n    }\r\n\r\n    void wait()\r\n    {\r\n        WaitForSingleObject(h_, INFINITE);\r\n    }\r\n\r\n    void post()\r\n    {\r\n        ReleaseSemaphore(h_, 1, 0);\r\n    }\r\n\r\nprivate:\r\n    HANDLE h_;\r\n\r\n    semaphore(semaphore const&);\r\n    semaphore& operator = (semaphore const&);\r\n};\r\n\r\nclass mutex\r\n{\r\npublic:\r\n    mutex()\r\n    {\r\n        InitializeCriticalSection(&cs_);\r\n    }\r\n\r\n    ~mutex()\r\n    {\r\n        DeleteCriticalSection(&cs_);\r\n    }\r\n\r\n    void lock()\r\n    {\r\n        EnterCriticalSection(&cs_);\r\n    }\r\n\r\n    void unlock()\r\n    {\r\n        LeaveCriticalSection(&cs_);\r\n    }\r\n\r\nprivate:\r\n    CRITICAL_SECTION    cs_;\r\n\r\n    mutex(mutex const&);\r\n    mutex& operator = (mutex const&);\r\n};\r\n\r\nvoid full_memory_fence()\r\n{\r\n    _mm_mfence();\r\n}\r\n\r\n#define THREAD_LOCAL __declspec(thread)\r\n\r\n#elif defined(POSIX) && defined(GCC)\r\n\r\n#include <pthread.h>\r\n#include <semaphore.h>\r\n\r\nclass semaphore\r\n{\r\npublic:\r\n    semaphore()\r\n    {\r\n        sem_init(&sem_, 0, 0);\r\n    }\r\n\r\n    ~semaphore()\r\n    {\r\n        sem_destroy(&sem_);\r\n    }\r\n\r\n    void wait()\r\n    {\r\n        sem_wait(&sem_);\r\n    }\r\n\r\n    void post()\r\n    {\r\n        sem_post(&sem_);\r\n    }\r\n\r\nprivate:\r\n    sem_t               sem_;\r\n\r\n    semaphore(semaphore const&);\r\n    semaphore& operator = (semaphore const&);\r\n};\r\n\r\nclass mutex\r\n{\r\npublic:\r\n    mutex()\r\n    {\r\n        pthread_mutex_init(&mutex_, 0);\r\n    }\r\n\r\n    ~mutex()\r\n    {\r\n        pthread_mutex_destroy(&mutex_);\r\n    }\r\n\r\n    void lock()\r\n    {\r\n        pthread_mutex_lock(&mutex_);\r\n    }\r\n\r\n    void unlock()\r\n    {\r\n        pthread_mutex_unlock(&mutex_);\r\n    }\r\n\r\nprivate:\r\n    pthread_mutex_t     mutex_;\r\n\r\n    mutex(mutex const&);\r\n    mutex& operator = (mutex const&);\r\n};\r\n\r\nvoid full_memory_fence()\r\n{\r\n    __sync_synchronize();\r\n}\r\n\r\n#define THREAD_LOCAL __thread\r\n\r\n#endif\r\n\r\n\r\n\r\nclass lock\r\n{\r\npublic:\r\n    lock(mutex& m)\r\n        : m_(m)\r\n    {\r\n        m.lock();\r\n    }\r\n\r\n    ~lock()\r\n    {\r\n        m_.unlock();\r\n    }\r\n\r\nprivate:\r\n    mutex&              m_;\r\n\r\n    lock(lock const&);\r\n    lock& operator = (lock const&);\r\n};\r\n\r\n\r\n\r\n\r\n/** simple single-threaded double-linked list\r\n *  nothing interesting\r\n */\r\nclass dlist\r\n{\r\npublic:\r\n    struct node\r\n    {\r\n        node*           prev_;\r\n        node*           next_;\r\n\r\n        node()\r\n        {\r\n            prev_ = 0;\r\n            next_ = 0;\r\n        }\r\n    };\r\n\r\n    dlist()\r\n    {\r\n        reset();\r\n    }\r\n\r\n    void push(node* n)\r\n    {\r\n        size_ += 1;\r\n        n->next_ = head_.next_;\r\n        n->prev_ = &head_;\r\n        head_.next_->prev_ = n;\r\n        head_.next_ = n;\r\n    }\r\n\r\n    node* pop()\r\n    {\r\n        if (size_ == 0)\r\n            return 0;\r\n        node* n = head_.next_;\r\n        remove(n);\r\n        return n;\r\n    }\r\n\r\n    void remove(node* n)\r\n    {\r\n        size_ -= 1;\r\n        n->prev_->next_ = n->next_;\r\n        n->next_->prev_ = n->prev_;\r\n    }\r\n\r\n    size_t size() const\r\n    {\r\n        return size_;\r\n    }\r\n\r\n    node* begin()\r\n    {\r\n        return head_.next_;\r\n    }\r\n\r\n    void flush_to(dlist& target)\r\n    {\r\n        if (size_)\r\n        {\r\n            target.size_ = size_;\r\n            target.head_.next_ = head_.next_;\r\n            target.head_.next_->prev_ = &target.head_;\r\n            target.tail_.prev_ = tail_.prev_;\r\n            target.tail_.prev_->next_ = &target.tail_;\r\n        }\r\n        else\r\n        {\r\n            target.reset();\r\n        }\r\n        reset();\r\n    }\r\n\r\n    static bool not_last(node* n)\r\n    {\r\n        return n->next_ != 0;\r\n    }\r\n\r\n    static node* get_next(node* n)\r\n    {\r\n        return n->next_;\r\n    }\r\n\r\nprivate:\r\n    size_t volatile     size_;\r\n    node                head_;\r\n    node                tail_;\r\n\r\n    void reset()\r\n    {\r\n        size_ = 0;\r\n        head_.next_ = &tail_;\r\n        head_.prev_ = 0;\r\n        tail_.next_ = 0;\r\n        tail_.prev_ = &head_;\r\n    }\r\n\r\n    dlist(dlist const&);\r\n    dlist& operator = (dlist const&);\r\n};\r\n\r\n\r\n\r\n/** pre-thread descriptor for eventcount\r\n */\r\nstruct ec_thread\r\n{\r\n    dlist::node         node_;\r\n    semaphore           sema_;\r\n    unsigned            epoch_;\r\n    bool volatile       in_waitset_;\r\n    bool                spurious_;\r\n    void*               ctx_;\r\n\r\n    ec_thread()\r\n    {\r\n        epoch_ = 0;\r\n        in_waitset_ = false;\r\n        spurious_ = false;\r\n        ctx_ = 0;\r\n    }\r\n\r\n    ~ec_thread()\r\n    {\r\n        if (spurious_)\r\n            sema_.wait();\r\n    }\r\n\r\n    static ec_thread* current()\r\n    {\r\n        static THREAD_LOCAL ec_thread* ec_thread_instance = 0;\r\n        ec_thread* instance = ec_thread_instance;\r\n        if (instance == 0)\r\n        {\r\n            instance = new ec_thread;\r\n            ec_thread_instance = instance;\r\n        }\r\n        return instance;\r\n        // instance must be destroyed in DllMain() callback\r\n        // or in pthread_key_create() callback\r\n    }\r\n\r\nprivate:\r\n    ec_thread(ec_thread const&);\r\n    ec_thread& operator = (ec_thread const&);\r\n};\r\n\r\n\r\n\r\n/** fine-grained eventcount implementation\r\n */\r\nclass eventcount\r\n{\r\npublic:\r\n    eventcount()\r\n    {\r\n        epoch_ = 0;\r\n    }\r\n\r\n    void prepare_wait(void* ctx = 0)\r\n    {\r\n        ec_thread* th = ec_thread::current();\r\n        // this is good place to pump previous spurious wakeup\r\n        if (th->spurious_)\r\n        {\r\n            th->spurious_ = false;\r\n            th->sema_.wait();\r\n        }\r\n        th->in_waitset_ = true;\r\n        th->ctx_ = ctx;\r\n        {\r\n            lock l (mtx_);\r\n            th->epoch_ = epoch_;\r\n            waitset_.push(&th->node_);\r\n        }\r\n        full_memory_fence();\r\n    }\r\n\r\n    void wait()\r\n    {\r\n        ec_thread* th = ec_thread::current();\r\n        // this check is just an optimization\r\n        if (th->epoch_ == epoch_)\r\n            th->sema_.wait();\r\n        else\r\n            retire_wait();\r\n    }\r\n\r\n    void retire_wait()\r\n    {\r\n        ec_thread* th = ec_thread::current();\r\n        // spurious wakeup will be pumped in following prepare_wait()\r\n        th->spurious_  = true;\r\n        // try to remove node from waitset\r\n        if (th->in_waitset_)\r\n        {\r\n            lock l (mtx_);\r\n            if (th->in_waitset_)\r\n            {\r\n                // successfully removed from waitset,\r\n                // so there will be no spurious wakeup\r\n                th->in_waitset_ = false;\r\n                th->spurious_ = false;\r\n                waitset_.remove(&th->node_);\r\n            }\r\n        }\r\n    }\r\n\r\n    void notify_one()\r\n    {\r\n        full_memory_fence();\r\n        notify_one_relaxed();\r\n    }\r\n\r\n    template<typename predicate_t>\r\n    void notify(predicate_t pred)\r\n    {\r\n        full_memory_fence();\r\n        notify_relaxed(pred);\r\n    }\r\n\r\n    void notify_all()\r\n    {\r\n        full_memory_fence();\r\n        notify_all_relaxed();\r\n    }\r\n\r\n    void notify_one_relaxed()\r\n    {\r\n        if (waitset_.size() == 0)\r\n            return;\r\n        dlist::node* n;\r\n        {\r\n            lock l (mtx_);\r\n            epoch_ += 1;\r\n            n = waitset_.pop();\r\n            if (n)\r\n                to_ec_thread(n)->in_waitset_ = false;\r\n        }\r\n        if (n)\r\n        {\r\n            to_ec_thread(n)->sema_.post();\r\n        }\r\n    }\r\n\r\n    template<typename predicate_t>\r\n    void notify_relaxed(predicate_t pred)\r\n    {\r\n        if (waitset_.size() == 0)\r\n            return;\r\n        dlist temp;\r\n        {\r\n            lock l (mtx_);\r\n            epoch_ += 1;\r\n            size_t size = waitset_.size();\r\n            size_t idx = 0;\r\n            dlist::node* n = waitset_.begin();\r\n            while (dlist::not_last(n))\r\n            {\r\n                dlist::node* next = dlist::get_next(n);\r\n                ec_thread* th = to_ec_thread(n);\r\n                if (pred(th->ctx_, size, idx))\r\n                {\r\n                    waitset_.remove(n);\r\n                    temp.push(n);\r\n                    th->in_waitset_ = false;\r\n                }\r\n                n = next;\r\n                idx += 1;\r\n            }\r\n        }\r\n        dlist::node* n = temp.begin();\r\n        while (dlist::not_last(n))\r\n        {\r\n            dlist::node* next = dlist::get_next(n);\r\n            to_ec_thread(n)->sema_.post();\r\n            n = next;\r\n        }\r\n    }\r\n\r\n    void notify_all_relaxed()\r\n    {\r\n        if (waitset_.size() == 0)\r\n            return;\r\n        dlist temp;\r\n        {\r\n            lock l (mtx_);\r\n            epoch_ += 1;\r\n            waitset_.flush_to(temp);\r\n            dlist::node* n = temp.begin();\r\n            while (dlist::not_last(n))\r\n            {\r\n                to_ec_thread(n)->in_waitset_ = false;\r\n                n = dlist::get_next(n);\r\n            }\r\n        }\r\n        dlist::node* n = temp.begin();\r\n        while (dlist::not_last(n))\r\n        {\r\n            dlist::node* next = dlist::get_next(n);\r\n            to_ec_thread(n)->sema_.post();\r\n            n = next;\r\n        }\r\n    }\r\n\r\nprivate:\r\n    mutex               mtx_;\r\n    dlist               waitset_;\r\n    volatile unsigned   epoch_;\r\n\r\n    ec_thread* to_ec_thread(dlist::node* n)\r\n    {\r\n        return (ec_thread*)((char*)n - offsetof(ec_thread, node_));\r\n    }\r\n\r\n    eventcount(eventcount const&);\r\n    eventcount& operator = (eventcount const&);\r\n};\r\n\r\n\r\n\r\n\r\n\r\nstruct scheduler\r\n{\r\n    struct tbb_thread {};\r\n\r\n    eventcount          ec_;\r\n    tbb_thread*         threads_;\r\n    bool volatile       is_permanently_open_;\r\n\r\n    void wait_while_pool_is_empty(tbb_thread* th)\r\n    {\r\n        if (is_permanently_open_)\r\n            return;\r\n        ec_.prepare_wait(th);\r\n        if (pool_is_empty())\r\n            ec_.wait();\r\n        else\r\n            ec_.retire_wait();\r\n    }\r\n\r\n    void notify_about_new_task_available()\r\n    {\r\n        ec_.notify_one_relaxed();\r\n    }\r\n\r\n    void notify_about_new_task_available_with_preference(tbb_thread* preference)\r\n    {\r\n        struct local\r\n        {\r\n            tbb_thread*     preference_;\r\n            bool            fired_;\r\n\r\n            bool operator () (void* ctx, size_t count, size_t idx)\r\n            {\r\n                tbb_thread* th = (tbb_thread*)ctx;\r\n                if (th == preference_)\r\n                {\r\n                    fired_ = true;\r\n                    return true;\r\n                }\r\n                else if (idx == count - 1 && fired_ == false)\r\n                {\r\n                    return true;\r\n                }\r\n                else\r\n                {\r\n                    return false;\r\n                }\r\n            }\r\n        }\r\n        pred = {preference};\r\n        ec_.notify_relaxed(pred);\r\n    }\r\n\r\n    void notify_about_list_of_tasks_available(size_t total_count, size_t preference_count, tbb_thread** preferences)\r\n    {\r\n        struct local\r\n        {\r\n            size_t          remain_to_signal_;\r\n            size_t          preference_count_;\r\n            tbb_thread**    preferences_;\r\n\r\n            bool operator () (void* ctx, size_t count, size_t idx)\r\n            {\r\n                tbb_thread* th = (tbb_thread*)ctx;\r\n                size_t remain_in_waitset = count - idx;\r\n                if (remain_in_waitset <= remain_to_signal_)\r\n                {\r\n                    return true;\r\n                }\r\n                else\r\n                {\r\n                    for (size_t i = 0; i != preference_count_; ++i)\r\n                    {\r\n                        if (preferences_[i] == th)\r\n                        {\r\n                            remain_to_signal_ -= 1;\r\n                            return true;\r\n                        }\r\n                    }\r\n                }\r\n                return false;\r\n            }\r\n        }\r\n        pred = {total_count, preference_count, preferences};\r\n        ec_.notify_relaxed(pred);\r\n    }\r\n\r\n    bool pool_is_empty()\r\n    {\r\n        return true;\r\n    }\r\n};\r\n\r\n\r\n\r\nstruct queue\r\n{\r\n    int                 producer_idx_;\r\n    int                 consumer_idx_;\r\n\r\n    void**              buffer_;\r\n\r\n    eventcount          ec_;\r\n\r\n    void enqueue(void* data)\r\n    {\r\n        int idx = ++producer_idx_; // atomic\r\n        buffer_[idx] = data;\r\n\r\n        struct local\r\n        {\r\n            int         idx_;\r\n            bool operator () (void* ctx, size_t /*count*/, size_t /*idx*/)\r\n            {\r\n                return idx_ == *(int*)ctx;\r\n            }\r\n        }\r\n        pred = {idx};\r\n        ec_.notify(pred); // not relaxed!!!\r\n    }\r\n\r\n    void* dequeue()\r\n    {\r\n        int idx = ++consumer_idx_; // atomic\r\n        void* data = buffer_[idx];\r\n        if (data)\r\n            return data;\r\n        for (;;)\r\n        {\r\n            ec_.prepare_wait(&idx);\r\n            data = buffer_[idx];\r\n            if (data)\r\n            {\r\n                ec_.retire_wait();\r\n                return data;\r\n            }\r\n            ec_.wait();\r\n            data = buffer_[idx];\r\n            if (data)\r\n            {\r\n                return data;\r\n            }\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\nclass condition_variable\r\n{\r\n    eventcount ec_;\r\n\r\npublic:\r\n    void wait(mutex& mtx)\r\n    {\r\n        ec_.prepare_wait();\r\n        mtx.unlock();\r\n        ec_.wait();\r\n        mtx.lock();\r\n    }\r\n\r\n    void signal()\r\n    {\r\n        ec_.notify_one();\r\n    }\r\n\r\n    void broadcast()\r\n    {\r\n        ec_.notify_all();\r\n    }\r\n}; \r\n\r\n\r\nstruct eventcount_test : rl::test_suite<eventcount_test, 2>\r\n{\r\n    void thread(unsigned index)\r\n    {\r\n        delete ec_thread::current();\r\n        (void)index;\r\n    }\r\n};\r\n\r\n\r\n\r\nint main()\r\n{\r\n    rl::test_params p;\r\n    //p.iteration_count = 1000000;\r\n    rl::simulate<eventcount_test>(p);\r\n}\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/eventcount/msvc8/eventcount.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 9.00\r\n# Visual Studio 2005\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"eventcount\", \"eventcount.vcproj\", \"{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E5}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tRelease|Win32 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E5}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E5}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E5}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E5}.Release|Win32.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/eventcount/msvc8/eventcount.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"eventcount\"\r\n\tProjectGUID=\"{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E54}\"\r\n\tRootNamespace=\"eventcount\"\r\n\tKeyword=\"Win32Proj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"false\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"false\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.cpp\"\r\n\t\t\t>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\eventcount.cpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/eventcount/msvc9/eventcount.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 10.00\r\n# Visual Studio 2005\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"eventcount\", \"eventcount.vcproj\", \"{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E5}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tRelease|Win32 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E4}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E4}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E4}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E4}.Release|Win32.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/eventcount/msvc9/eventcount.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"9,00\"\r\n\tName=\"eventcount\"\r\n\tProjectGUID=\"{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E54}\"\r\n\tRootNamespace=\"eventcount\"\r\n\tKeyword=\"Win32Proj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"false\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"false\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.cpp\"\r\n\t\t\t>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\eventcount.cpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/eventcount/stdafx.cpp",
    "content": "// stdafx.cpp : source file that includes just the standard includes\r\n// ws_deque.pch will be the pre-compiled header\r\n// stdafx.obj will contain the pre-compiled type information\r\n\r\n#include \"stdafx.h\"\r\n\r\n// TODO: reference any additional headers you need in STDAFX.H\r\n// and not in this file\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/eventcount/stdafx.h",
    "content": "#pragma once\r\n\r\n#define _WIN32_WINNT 0x0500\r\n#include <windows.h>\r\n#include <intrin.h>\r\n#include <stddef.h>\r\n\r\n#include \"../../relacy/pch.hpp\"\r\n#include \"../../relacy/relacy_std.hpp\"\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/examples/amp_condvar.hpp",
    "content": "#pragma once\r\n\r\n\r\nstruct amp_raw_condition_variable_s\r\n{\r\n    CRITICAL_SECTION access_waiting_threads_count_critsec;\r\n    HANDLE wake_waiting_threads_mutex;\r\n    HANDLE waking_waiting_threads_count_control_sem;\r\n    HANDLE finished_waking_waiting_threads_event;\r\n    VAR_T(LONG) waiting_thread_count;\r\n    VAR_T(BOOL) broadcast_in_progress;\r\n};\r\n\r\n\r\nstruct amp_raw_mutex_s\r\n{\r\n    CRITICAL_SECTION critical_section;\r\n    BOOL is_locked;\r\n};\r\n\r\ntypedef amp_raw_condition_variable_s* amp_raw_condition_variable_t;\r\ntypedef amp_raw_mutex_s* amp_raw_mutex_t;\r\n\r\nint const AMP_SUCCESS = 0;\r\n\r\n\r\nint amp_raw_mutex_init(amp_raw_mutex_t mutex)\r\n{\r\n    InitializeCriticalSectionAndSpinCount(&mutex->critical_section, 1);\r\n    \r\n    mutex->is_locked = FALSE;\r\n    \r\n    return AMP_SUCCESS;\r\n}\r\n \r\n \r\n \r\nint amp_raw_mutex_finalize(amp_raw_mutex_t mutex)\r\n{\r\n    assert(NULL != mutex);\r\n    \r\n    int retval = AMP_SUCCESS;\r\n    \r\n    DeleteCriticalSection(&mutex->critical_section);\r\n    \r\n    return retval;\r\n}\r\n \r\n \r\n \r\nint amp_raw_mutex_lock(amp_raw_mutex_t mutex)\r\n{\r\n    assert(NULL != mutex);\r\n    \r\n    EnterCriticalSection(&mutex->critical_section);\r\n    \r\n    mutex->is_locked = TRUE;\r\n    \r\n    return AMP_SUCCESS;\r\n}\r\n \r\nint amp_raw_mutex_unlock(amp_raw_mutex_t mutex)\r\n{\r\n    assert(NULL != mutex);\r\n \r\n    mutex->is_locked = FALSE;\r\n    LeaveCriticalSection(&mutex->critical_section);\r\n    \r\n    return AMP_SUCCESS;\r\n}\r\n\r\n\r\n\r\n\r\nint amp_raw_condition_variable_init(amp_raw_condition_variable_t cond)\r\n{\r\n    InitializeCriticalSectionAndSpinCount(&cond->access_waiting_threads_count_critsec, 1);\r\n    \r\n    cond->wake_waiting_threads_mutex = CreateMutex(0, 0, 0);\r\n\r\n    cond->waking_waiting_threads_count_control_sem = CreateSemaphore(NULL, /* No inheritance to child processes */\r\n                                                                     0, /* Initially no threads can pass */\r\n                                                                     LONG_MAX, /* Max semaphore count */\r\n                                                                     NULL); /* Only intra-process semaphore */\r\n\r\n    cond->finished_waking_waiting_threads_event = CreateEvent(NULL, /* Default security and no inheritance to child processes */\r\n                                                              FALSE, /* No manual reset */\r\n                                                              0, /* Initially not signaled */\r\n                                                              NULL /* Not inter-process available */\r\n                                                              );\r\n    \r\n    \r\n    cond->VAR(waiting_thread_count) = 0l;\r\n    cond->VAR(broadcast_in_progress) = FALSE;\r\n    \r\n    return AMP_SUCCESS;\r\n}\r\n \r\n \r\n \r\nint amp_raw_condition_variable_finalize(amp_raw_condition_variable_t cond)\r\n{\r\n    DeleteCriticalSection(&cond->access_waiting_threads_count_critsec);\r\n    \r\n    CloseHandle(cond->wake_waiting_threads_mutex);\r\n    CloseHandle(cond->waking_waiting_threads_count_control_sem);\r\n    CloseHandle(cond->finished_waking_waiting_threads_event);\r\n    \r\n    int ret_error_code = AMP_SUCCESS;\r\n    return ret_error_code;\r\n}\r\n \r\n\r\n\r\nint amp_raw_condition_variable_signal(amp_raw_condition_variable_t cond)\r\n{\r\n    WaitForSingleObject(cond->wake_waiting_threads_mutex,\r\n                                                  INFINITE);\r\n    BOOL at_least_one_waiting_thread = (0l != cond->VAR(waiting_thread_count));\r\n    \r\n    if (at_least_one_waiting_thread) {\r\n        LONG prev_sem_count = 0;\r\n        ReleaseSemaphore(cond->waking_waiting_threads_count_control_sem,\r\n                                                     1,\r\n                                                     &prev_sem_count /* No interest in the previous sem count. */\r\n                                                     );\r\n\r\n        WaitForSingleObject(cond->finished_waking_waiting_threads_event,\r\n                                                     INFINITE);\r\n    }\r\n    \r\n    ReleaseMutex(cond->wake_waiting_threads_mutex);\r\n    \r\n    return AMP_SUCCESS;\r\n}\r\n\r\n\r\nint amp_raw_condition_variable_broadcast(amp_raw_condition_variable_t cond)\r\n{\r\n    WaitForSingleObject(cond->wake_waiting_threads_mutex,\r\n                                                  INFINITE);\r\n    \r\n    LONG const waiting_thread_count = cond->VAR(waiting_thread_count);\r\n    \r\n    if (0 < waiting_thread_count) {\r\n        \r\n        cond->VAR(broadcast_in_progress) = TRUE;\r\n        /* Releasing the sem here and waiting on it should update the memory of\r\n* the waiting threads to see that a broadcast is in progress.\r\n*/\r\n        LONG prev_sem_count = 0;\r\n        /* Assuming that less threads exist than max possible semaphore count.\r\n* TODO: @todo Decide if to spin here if the assumption doesn't hold\r\n* true in the future?\r\n*/\r\n        ReleaseSemaphore(cond->waking_waiting_threads_count_control_sem,\r\n                                                     waiting_thread_count,\r\n                                                     &prev_sem_count /* No interest in the previous sem count. */\r\n                                                     );\r\n\r\n        WaitForSingleObject(cond->finished_waking_waiting_threads_event,\r\n                                                     INFINITE);\r\n        cond->VAR(broadcast_in_progress) = FALSE;\r\n        \r\n    }\r\n    \r\n    ReleaseMutex(cond->wake_waiting_threads_mutex);\r\n    \r\n    return AMP_SUCCESS;\r\n}\r\n\r\n\r\n\r\n\r\nint amp_raw_condition_variable_wait(amp_raw_condition_variable_t cond,\r\n                                    struct amp_raw_mutex_s *mutex)\r\n{\r\n    WaitForSingleObject(cond->wake_waiting_threads_mutex,\r\n                                                  INFINITE);\r\n    {\r\n        ++(cond->VAR(waiting_thread_count));\r\n    }\r\n    \r\n    amp_raw_mutex_unlock(mutex);\r\n\r\n    SignalObjectAndWait(cond->wake_waiting_threads_mutex, cond->waking_waiting_threads_count_control_sem, INFINITE, FALSE);\r\n \r\n    BOOL broadcast_in_progress = FALSE;\r\n    LONG count = 0;\r\n    EnterCriticalSection(&cond->access_waiting_threads_count_critsec);\r\n    {\r\n        count = --(cond->VAR(waiting_thread_count));\r\n        \r\n        broadcast_in_progress = cond->VAR(broadcast_in_progress);\r\n    }\r\n    LeaveCriticalSection(&cond->access_waiting_threads_count_critsec);\r\n    \r\n    BOOL all_waiting_threads_awake = TRUE;\r\n    if (TRUE == broadcast_in_progress && count > 0) {\r\n        all_waiting_threads_awake = FALSE;\r\n    }\r\n    \r\n    if (TRUE == all_waiting_threads_awake) {\r\n        SetEvent(cond->finished_waking_waiting_threads_event);\r\n    }\r\n    \r\n    \r\n    amp_raw_mutex_lock(mutex);\r\n    \r\n    return AMP_SUCCESS;\r\n}\r\n\r\n\r\nstruct amp_condvar_test : rl::test_suite<amp_condvar_test, 2>\r\n{\r\n    VAR_T(int) data;\r\n    amp_raw_mutex_s mtx;\r\n    amp_raw_condition_variable_s cv;\r\n\r\n    void before()\r\n    {\r\n        VAR(data) = 0;\r\n        amp_raw_mutex_init(&mtx);\r\n        amp_raw_condition_variable_init(&cv);\r\n    }\r\n\r\n    void after()\r\n    {\r\n        amp_raw_mutex_finalize(&mtx);\r\n        amp_raw_condition_variable_finalize(&cv);\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            amp_raw_mutex_lock(&mtx);\r\n            data($) += 1;\r\n            amp_raw_condition_variable_signal(&cv);\r\n            amp_raw_mutex_unlock(&mtx);\r\n        }\r\n        else\r\n        {\r\n            amp_raw_mutex_lock(&mtx);\r\n            while (0 == data($))\r\n            {\r\n                amp_raw_condition_variable_wait(&cv, &mtx);\r\n            }\r\n            amp_raw_mutex_unlock(&mtx);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct amp_condvar_test2 : rl::test_suite<amp_condvar_test2, 4>\r\n{\r\n    VAR_T(int) stage;\r\n    amp_raw_mutex_s mtx;\r\n    amp_raw_condition_variable_s cv;\r\n\r\n    void before()\r\n    {\r\n        VAR(stage) = 0;\r\n        amp_raw_mutex_init(&mtx);\r\n        amp_raw_condition_variable_init(&cv);\r\n    }\r\n\r\n    void after()\r\n    {\r\n        amp_raw_mutex_finalize(&mtx);\r\n        amp_raw_condition_variable_finalize(&cv);\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            amp_raw_mutex_lock(&mtx);\r\n            stage($) += 1;\r\n            amp_raw_condition_variable_broadcast(&cv);\r\n            while (stage($) < 2)\r\n                amp_raw_condition_variable_wait(&cv, &mtx);\r\n            amp_raw_mutex_unlock(&mtx);\r\n        }\r\n        else if (1 == index)\r\n        {\r\n            amp_raw_mutex_lock(&mtx);\r\n            while (stage($) != 1)\r\n                amp_raw_condition_variable_wait(&cv, &mtx);\r\n            stage($) += 1;\r\n            amp_raw_condition_variable_broadcast(&cv);\r\n            amp_raw_mutex_unlock(&mtx);\r\n        }\r\n        else if (2 == index)\r\n        {\r\n            amp_raw_mutex_lock(&mtx);\r\n            while (stage($) != 2)\r\n                amp_raw_condition_variable_wait(&cv, &mtx);\r\n            stage($) += 1;\r\n            //amp_raw_condition_variable_broadcast(&cv);\r\n            amp_raw_mutex_unlock(&mtx);\r\n            amp_raw_condition_variable_signal(&cv);\r\n        }\r\n        else if (3 == index)\r\n        {\r\n            amp_raw_mutex_lock(&mtx);\r\n            while (stage($) != 3)\r\n                amp_raw_condition_variable_wait(&cv, &mtx);\r\n            amp_raw_mutex_unlock(&mtx);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/examples/examples.cpp",
    "content": "#include \"stdafx.h\"\r\n#include \"spsc_overwrite_queue.hpp\"\r\n#include \"amp_condvar.hpp\"\r\n\r\n\r\nint main()\r\n{\r\n    rl::test_params p;\r\n    p.iteration_count = 10000;\r\n    //p.search_type = rl::sched_bound;\r\n    //p.context_bound = 3;\r\n\r\n    rl::execute<spsc_overwrite_queue_test, 2>(p);\r\n    rl::simulate<amp_condvar_test>(p);\r\n    rl::simulate<amp_condvar_test2>(p);\r\n}\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/examples/msvc9/examples.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 10.00\r\n# Visual Studio 2008\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"examples\", \"examples.vcproj\", \"{6CC59CF8-408B-441B-8F65-15651210CB82}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tRelease|Win32 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{6CC59CF8-408B-441B-8F65-15651210CB82}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{6CC59CF8-408B-441B-8F65-15651210CB82}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{6CC59CF8-408B-441B-8F65-15651210CB82}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{6CC59CF8-408B-441B-8F65-15651210CB82}.Release|Win32.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/examples/msvc9/examples.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"9.00\"\r\n\tName=\"examples\"\r\n\tProjectGUID=\"{1EB73A6F-7F94-4ED4-8EB3-C245E773207A}\"\r\n\tRootNamespace=\"examples\"\r\n\tKeyword=\"Win32Proj\"\r\n\tTargetFrameworkVersion=\"0\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\amp_condvar.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\examples.cpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\spsc_overwrite_queue.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.cpp\"\r\n\t\t\t>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\tObjectFile=\"$(IntDir)\\$(InputName)1.obj\"\r\n\t\t\t\t\tXMLDocumentationFileName=\"$(IntDir)\\$(InputName)1.xdc\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\tObjectFile=\"$(IntDir)\\$(InputName)1.obj\"\r\n\t\t\t\t\tXMLDocumentationFileName=\"$(IntDir)\\$(InputName)1.xdc\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/examples/spsc_overwrite_queue.hpp",
    "content": "#pragma once\r\n\r\n\r\ntemplate<typename T>\r\nclass queue\r\n{\r\npublic:\r\n    queue(size_t count)\r\n    {\r\n        assert(count >= 6);\r\n        sema = CreateSemaphore(0, 0, 1, 0);\r\n        waiting.store(false, std::memory_order_relaxed);\r\n        deq_node = 0;\r\n        block = new node [count];\r\n        block->next.store(0, std::memory_order_relaxed);\r\n        full_tail = block;\r\n        full_head.store(block, std::memory_order_relaxed);\r\n        free_head = block + 1;\r\n        free_tail.store(block + count - 1, std::memory_order_relaxed);\r\n        free_tail.load(std::memory_order_relaxed)->next.store(0, std::memory_order_relaxed);\r\n        for (size_t i = 1; i != count - 1; i += 1)\r\n            block[i].next.store(block + i + 1, std::memory_order_relaxed);\r\n    }\r\n\r\n    ~queue()\r\n    {\r\n        CloseHandle(sema);\r\n        delete [] block;\r\n    }\r\n\r\n    VAR_T(T)& enqueue_prepare()\r\n    {\r\n        return full_tail->data;\r\n    }\r\n\r\n    void enqueue_commit()\r\n    {\r\n        node* n = get_free_node();\r\n        n->next.store(0, std::memory_order_release);\r\n        full_tail->next.store(n, std::memory_order_seq_cst);\r\n        bool signal = waiting.load(std::memory_order_seq_cst);\r\n        full_tail = n;\r\n        if (signal)\r\n        {\r\n            waiting.store(false, std::memory_order_relaxed);\r\n            ReleaseSemaphore(sema, 1, 0);\r\n        }\r\n    }\r\n\r\n    VAR_T(T)& dequeue_prepare()\r\n    {\r\n        deq_node = get_full_node();\r\n        return deq_node->data;\r\n    }\r\n\r\n    void dequeue_commit()\r\n    {\r\n        deq_node->next.store(0, std::memory_order_release);\r\n        node* prev = free_tail.exchange(deq_node, std::memory_order_acq_rel);\r\n        prev->next.store(deq_node, std::memory_order_release);\r\n    }\r\n\r\nprivate:\r\n    struct node\r\n    {\r\n        std::atomic<node*>  next;\r\n        VAR_T(T)            data;\r\n    };\r\n\r\n    node*                   block;\r\n    node*                   full_tail;\r\n    node*                   free_head;\r\n    node*                   deq_node;\r\n    char                    pad [64];\r\n    std::atomic<node*>      full_head;\r\n    std::atomic<node*>      free_tail;\r\n    std::atomic<bool>       waiting;\r\n    HANDLE                  sema;\r\n\r\n    node* get_free_node()\r\n    {\r\n        for (;;)\r\n        {\r\n            node* n = free_head;\r\n            node* next = n->next.load(std::memory_order_acquire);\r\n            if (next)\r\n            {\r\n                free_head = next;\r\n                return n;\r\n            }\r\n\r\n            n = full_head.load(std::memory_order_acquire);\r\n            next = n->next.load(std::memory_order_acquire);\r\n            if (next)\r\n            {\r\n                if (full_head.compare_exchange_strong(n, next, std::memory_order_seq_cst))\r\n                {\r\n                    //node* n2 = free_head;\r\n                    //node* next2 = n2->next.load(std::memory_order_acquire);\r\n                    //if (next2)\r\n                    //{\r\n                    //    n->next.store(0, std::memory_order_release);\r\n                    //    node* prev = free_tail.exchange(n, std::memory_order_acq_rel);\r\n                    //    prev->next.store(n, std::memory_order_release);\r\n                    //    free_head = next2;\r\n                    //    return n2;\r\n                    //}\r\n                    //else\r\n                    {\r\n                        return n;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    node* get_full_node()\r\n    {\r\n        node* n = full_head.load(std::memory_order_acquire);\r\n        for (;;)\r\n        {\r\n            node* next = n->next.load(std::memory_order_acquire);\r\n            if (next == 0)\r\n            {\r\n                waiting.store(true, std::memory_order_seq_cst);\r\n                n = full_head.load(std::memory_order_seq_cst);\r\n                next = n->next.load(std::memory_order_acquire);\r\n                if (next)\r\n                {\r\n                    waiting.store(false, std::memory_order_relaxed);\r\n                }\r\n                else\r\n                {\r\n                    WaitForSingleObject(sema, INFINITE);\r\n                    n = full_head.load(std::memory_order_acquire);\r\n                    continue;\r\n                }\r\n            }\r\n            if (full_head.compare_exchange_strong(n, next, std::memory_order_acq_rel))\r\n                return n;\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\nunsigned RL_STDCALL consumer_thread(void* ctx)\r\n{\r\n    queue<int>* q = (queue<int>*)ctx;\r\n    int prev_data = -1;\r\n    for (;;)\r\n    {\r\n        VAR_T(int)& data0 = q->dequeue_prepare();\r\n        int data = VAR(data0);\r\n        assert(data > prev_data);\r\n        prev_data = data;\r\n        q->dequeue_commit();\r\n        //printf(\"%d\\n\", prev_data);\r\n        if (prev_data == 11)\r\n            break;\r\n        //Sleep(5);\r\n    }\r\n    return 0;\r\n}\r\n\r\nunsigned RL_STDCALL producer_thread(void* ctx)\r\n{\r\n    queue<int>* q = (queue<int>*)ctx;\r\n    for (int i = 0; i != 12; i += 1)\r\n    {\r\n        VAR_T(int)& data = q->enqueue_prepare();\r\n        VAR(data) = i;\r\n        q->enqueue_commit();\r\n        //Sleep(1);\r\n    }\r\n    return 0;\r\n}\r\n\r\nvoid spsc_overwrite_queue_test()\r\n{\r\n    queue<int> q (6);\r\n    HANDLE th [2];\r\n    th[0] = (HANDLE)_beginthreadex(0, 0, consumer_thread, &q, 0, 0);\r\n    th[1] = (HANDLE)_beginthreadex(0, 0, producer_thread, &q, 0, 0);\r\n    WaitForMultipleObjects(2, th, 1, INFINITE);\r\n\r\n    for (int i = 100; i != 104; i += 1)\r\n    {\r\n        VAR_T(int)& data = q.enqueue_prepare();\r\n        VAR(data) = i;\r\n        q.enqueue_commit();\r\n    }\r\n\r\n    for (int i = 100; i != 104; i += 1)\r\n    {\r\n        VAR_T(int)& data0 = q.dequeue_prepare();\r\n        int data = VAR(data0);\r\n        assert(data == i);\r\n        q.dequeue_commit();\r\n    }\r\n}\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/examples/stdafx.cpp",
    "content": "#include \"stdafx.h\"\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/examples/stdafx.h",
    "content": "#pragma once\r\n\r\n#ifdef NDEBUG\r\n#   define _SECURE_SCL 0\r\n#endif\r\n\r\n#define RL_FORCE_SEQ_CST\r\n#define RL_MSVC_OUTPUT\r\n//#define RL_DEBUGBREAK_ON_FAILURE\r\n\r\n#include \"../../relacy/pch.hpp\"\r\n#include \"../../relacy/relacy_std.hpp\"\r\n#include \"../../relacy/stdlib/windows.hpp\"\r\n\r\n\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/java_ws_deque/java_ws_deque.cpp",
    "content": "#include \"stdafx.h\"\r\n#include \"../../relacy/relacy_java.hpp\"\r\n\r\n\r\nusing rl::jvar;\r\nusing rl::jvolatile;\r\nusing rl::mutex;\r\n\r\n\r\n\r\n\r\ntemplate<typename T>\r\nclass ws_deque\r\n{\r\npublic:\r\n    ws_deque()\r\n    {\r\n        m_mask($) = initial_size - 1;\r\n        m_headIndex($) = 0;\r\n        m_tailIndex($) = 0;\r\n        m_array($) = new jvar<T> [initial_size];\r\n        m_arraySize($) = initial_size;\r\n    }\r\n\r\n    bool IsEmpty()\r\n    {\r\n        return m_headIndex($) >= m_tailIndex($);\r\n    }\r\n\r\n    size_t Count()\r\n    {\r\n        return m_tailIndex($) - m_headIndex($);\r\n    }\r\n\r\n    void push(T item)\r\n    {\r\n        size_t tail = m_tailIndex($);\r\n        if (tail <= m_headIndex($) + m_mask($))\r\n        {\r\n            m_array($)[tail & m_mask($)]($) = item;\r\n            m_tailIndex($) = tail + 1;\r\n        }\r\n        else\r\n        {\r\n            m_foreignLock.lock($);\r\n            size_t head = m_headIndex($);\r\n            size_t count = Count();\r\n            if (count >= m_mask($))\r\n            {\r\n                size_t arraySize = m_arraySize($);\r\n                size_t mask = m_mask($);\r\n                jvar<T>* newArray = new jvar<T> [arraySize * 2];\r\n                jvar<T>* arr = m_array($);\r\n                for (size_t i = 0; i != count; ++i)\r\n                    newArray[i]($) = arr[(i + head) & mask]($);\r\n                m_array($) = newArray;\r\n                m_arraySize($) = arraySize * 2;\r\n                m_headIndex($) = 0;\r\n                m_tailIndex($) = count;\r\n                tail = count;\r\n                m_mask($) = (mask * 2) | 1;\r\n            }\r\n            m_array($)[tail & m_mask($)]($) = item;\r\n            m_tailIndex($) = tail + 1;\r\n            m_foreignLock.unlock($);\r\n        }\r\n    }\r\n\r\n    bool pop(T& item)\r\n    {\r\n        size_t tail = m_tailIndex($);\r\n        if (tail == 0)\r\n            return false;\r\n        tail -= 1;\r\n        m_tailIndex($) = tail;\r\n        if (m_headIndex($) <= tail)\r\n        {\r\n            item = m_array($)[tail & m_mask($)]($);\r\n            return true;\r\n        }\r\n        else\r\n        {\r\n            m_foreignLock.lock($);\r\n            if (m_headIndex($) <= tail)\r\n            {\r\n                item = m_array($)[tail & m_mask($)]($);\r\n                m_foreignLock.unlock($);\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                m_tailIndex($) = tail + 1;\r\n                m_foreignLock.unlock($);\r\n                return false;\r\n            }\r\n        }\r\n    }\r\n\r\n    bool steal(T& item)\r\n    {\r\n        if (false == m_foreignLock.try_lock($))\r\n            return false;\r\n        size_t head = m_headIndex($);\r\n        m_headIndex($) = head + 1;\r\n        if (head < m_tailIndex($))\r\n        {\r\n            item = m_array($)[head & m_mask($)]($);\r\n            m_foreignLock.unlock($);\r\n            return true;\r\n        }\r\n        else\r\n        {\r\n            m_headIndex($) = head;\r\n            m_foreignLock.unlock($);\r\n            return false;\r\n        }\r\n    }\r\n\r\nprivate:\r\n    static size_t const initial_size = 2;\r\n    jvar<jvar<T>*> m_array;\r\n    jvar<size_t> m_mask;\r\n    jvar<size_t> m_arraySize;\r\n    jvolatile<size_t> m_headIndex;\r\n    jvolatile<size_t> m_tailIndex;\r\n    mutex m_foreignLock;\r\n};\r\n\r\n\r\n\r\n\r\nstruct ws_deque_test : rl::test_suite<ws_deque_test, 2>\r\n{\r\n    ws_deque<int> q;\r\n    bool state [2];\r\n\r\n    void before()\r\n    {\r\n        state[0] = true;\r\n        state[1] = true;\r\n    }\r\n\r\n    void after()\r\n    {\r\n        RL_ASSERT(state[0] == false);\r\n        RL_ASSERT(state[1] == false);\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            q.push(1);\r\n            q.push(2);\r\n\r\n            int item = 0;\r\n            bool res = q.pop(item);\r\n            RL_ASSERT(res && item == 2);\r\n            RL_ASSERT(state[1]);\r\n            state[1] = false;\r\n\r\n            item = 0;\r\n            res = q.pop(item);\r\n            if (res)\r\n            {\r\n                RL_ASSERT(state[0]);\r\n                state[0] = false;\r\n            }\r\n\r\n            item = 0;\r\n            res = q.pop(item);\r\n            RL_ASSERT(res == false);\r\n        }\r\n        else\r\n        {\r\n            int item = 0;\r\n            bool res = q.steal(item);\r\n            if (res)\r\n            {\r\n                RL_ASSERT(item == 1);\r\n                RL_ASSERT(state[0]);\r\n                state[0] = false;\r\n            }\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nint main()\r\n{\r\n    rl::simulate<ws_deque_test>();\r\n}\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/java_ws_deque/msvc8/java_ws_deque.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 9.00\r\n# Visual Studio 2005\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"java_ws_deque\", \"java_ws_deque.vcproj\", \"{D4756EE9-3953-4E17-B1B5-E89F853303C1}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tRelease|Win32 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Release|Win32.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/java_ws_deque/msvc8/java_ws_deque.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"java_ws_deque\"\r\n\tProjectGUID=\"{9E88433F-779E-4461-9963-35E3338873AC}\"\r\n\tRootNamespace=\"java_ws_deque\"\r\n\tKeyword=\"Win32Proj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\java_ws_deque.cpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.cpp\"\r\n\t\t\t>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\tObjectFile=\"$(IntDir)\\$(InputName)1.obj\"\r\n\t\t\t\t\tXMLDocumentationFileName=\"$(IntDir)\\$(InputName)1.xdc\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\tObjectFile=\"$(IntDir)\\$(InputName)1.obj\"\r\n\t\t\t\t\tXMLDocumentationFileName=\"$(IntDir)\\$(InputName)1.xdc\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/java_ws_deque/stdafx.cpp",
    "content": "#include \"stdafx.h\"\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/java_ws_deque/stdafx.h",
    "content": "#pragma once\r\n\r\n\r\n#include \"../../relacy/pch.hpp\"\r\n\r\n\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/mpmc/mpmc.cpp",
    "content": "#include \"stdafx.h\"\r\n\r\n\r\n#ifdef RL_TEST\r\n#define ATOMIC(x) rl::atomic<x>\r\n#define VAR(x) rl::var<x>\r\n#define ATOMIC_FETCH_ADD(x, v) x($).fetch_add(v)\r\n#define ATOMIC_COMPARE_EXCHANGE(x, c, v) x($).compare_exchange(c, v)\r\n#define LOAD_ACQ(x) x($).load(rl::memory_order_acquire)\r\n#define STORE_REL(x, v) x($).store(v, rl::memory_order_release)\r\n#else\r\n#define ATOMIC(x) x volatile\r\n#define VAR(x) x\r\n#define ATOMIC_FETCH_ADD(x, v) _InterlockedExchangeAdd((long*)&x, v)\r\n#define ATOMIC_COMPARE_EXCHANGE(x, c, v) interlocked_compare_exchange(x, c, v)\r\n#define LOAD_ACQ(x) x\r\n#define STORE_REL(x, v) x = v\r\n\r\ntemplate<typename T>\r\nbool interlocked_compare_exchange(T& x, T& c, T v)\r\n{\r\n    T c0 = _InterlockedCompareExchange((long*)&x), v, c);\r\n    if (c0 == c)\r\n    {\r\n        return true;\r\n    }\r\n    else\r\n    {\r\n        c = c0;\r\n        return false;\r\n    }\r\n}\r\n#endif\r\n\r\n//#include \"pcx.h\"\r\n\r\n\r\n/*\r\ntemplate<typename T>\r\nclass mpmcq\r\n{\r\npublic:\r\n\tmpmcq()\r\n\t{\r\n        STORE_REL(head_, alloc_block());\r\n        STORE_REL(tail_, LOAD_ACQ(head_));\r\n\t}\r\n\r\n\tvoid enqueue(T v)\r\n\t{\r\n        for (;;)\r\n        {\r\n            block* b = LOAD_ACQ(head_);\r\n            unsigned raw = ATOMIC_FETCH_ADD(b->state_, state_head_inc);\r\n            unsigned idx = raw >> state_head_pos;\r\n            if (idx < item_count)\r\n            {\r\n                STORE_REL(b->data_[idx], v);\r\n                return;\r\n            }\r\n            unsigned last = raw & state_last_msk;\r\n            if (0 == last)\r\n            {\r\n                ATOMIC_COMPARE_EXCHANGE(head_, b, b+1);\r\n            }\r\n            else\r\n            {\r\n                block* b2 = LOAD_ACQ(b->next_);\r\n                if (b2)\r\n                {\r\n                    ATOMIC_COMPARE_EXCHANGE(head_, b, b2);\r\n                }\r\n                else\r\n                {\r\n                    b2 = alloc_block();\r\n                    block* b3 = 0;\r\n                    if (ATOMIC_COMPARE_EXCHANGE(b->next_, b3, b2))\r\n                    {\r\n                        ATOMIC_COMPARE_EXCHANGE(head_, b, b2);\r\n                    }\r\n                    else\r\n                    {\r\n                        for (;;)\r\n                        {\r\n                            b = LOAD_ACQ(head_);\r\n                            while (0 == (LOAD_ACQ(b->state_) & state_last_msk))\r\n                                b = b + 1;\r\n                            while (LOAD_ACQ(b->next_))\r\n                                b = LOAD_ACQ(b->next_) + block_count - 1;\r\n                            b3 = 0;\r\n                            if (ATOMIC_COMPARE_EXCHANGE(b->next_, b3, b2))\r\n                                break;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\t}\r\n\r\n\tT dequeue()\r\n\t{\r\n        for (;;)\r\n        {\r\n            block* b = LOAD_ACQ(tail_);\r\n            unsigned cmp = LOAD_ACQ(b->state_);\r\n            unsigned tail = cmp & (state_last_msk - 1);\r\n            if (tail < item_count)\r\n            {\r\n                unsigned head = cmp >> state_head_pos;\r\n                if (tail < head)\r\n                {\r\n                    unsigned xchg = cmp + state_tail_inc;\r\n                    if (ATOMIC_COMPARE_EXCHANGE(b->state_, cmp, xchg))\r\n                    {\r\n                        for (;;)\r\n                        {\r\n                            T v = LOAD_ACQ(b->data_[tail]);\r\n                            if (v != T())\r\n                                return v;\r\n                            rl::yield($);\r\n                        }\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    return T();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                unsigned last = cmp & state_last_msk;\r\n                if (0 == last)\r\n                {\r\n                    ATOMIC_COMPARE_EXCHANGE(tail_, b, b+1);\r\n                }\r\n                else\r\n                {\r\n                    block* b2 = LOAD_ACQ(b->next_);\r\n                    if (0 == b2)\r\n                        return T();\r\n                    ATOMIC_COMPARE_EXCHANGE(tail_, b, b2);\r\n                }\r\n            }\r\n        }\r\n\t}\r\n\r\nprivate:\r\n    static unsigned const state_head_pos = 7;\r\n    static unsigned const state_head_inc = 1 << state_head_pos;\r\n    static unsigned const state_last_msk = 1 << 6;\r\n    static unsigned const state_tail_inc = 1 << 0;\r\n\r\n    static unsigned const item_count = 2;\r\n    static unsigned const block_count = 16;\r\n\r\n    struct block\r\n    {\r\n        //unsigned          head_ : 24;\r\n        //unsigned          last_ : 1;\r\n        //unsigned          tail_ : 7;\r\n        ATOMIC(unsigned)    state_;\r\n        ATOMIC(block*)      next_;\r\n        ATOMIC(T)           data_ [item_count];\r\n    };\r\n\r\n    struct superblock\r\n    {\r\n        block           blocks_ [block_count];\r\n    };\r\n\r\n\tchar                pad0_ [64];\r\n    ATOMIC(block*)      head_;\r\n\tchar                pad1_ [64];\r\n    ATOMIC(block*)      tail_;\r\n\tchar                pad2_ [64];\r\n\r\n    block* alloc_block()\r\n    {\r\n        superblock* sb = RL_NEW(superblock);\r\n        for (int x = 0; x != block_count; ++x)\r\n        {\r\n            block* b = &sb->blocks_[x];\r\n            STORE_REL(b->state_, 0);\r\n            STORE_REL(b->next_, 0);\r\n            for (int y = 0; y != item_count; ++y)\r\n            {\r\n                STORE_REL(b->data_[y], 0);\r\n            }\r\n        }\r\n        STORE_REL(sb->blocks_[block_count - 1].state_, 1 * state_head_inc + 1 * state_tail_inc + state_last_msk);\r\n        return &sb->blocks_[0];\r\n    }\r\n};\r\n\r\n\r\nstruct test_mpmc : rl::test_suite<test_mpmc, 6>\r\n{\r\n    mpmcq<int> q;\r\n\r\n    void thread(unsigned idx)\r\n    {\r\n        if (idx < thread_count / 2)\r\n        {\r\n            for (int i = 0; i != 2; ++i)\r\n                q.enqueue(1);\r\n        }\r\n        else\r\n        {\r\n            for (int i = 0; i != 2; ++i)\r\n                q.dequeue();\r\n        }\r\n    }\r\n};\r\n*/\r\n\r\n\r\n\r\nstruct thread_node\r\n{\r\n    rl::var<thread_node*>       next;\r\n    rl::var<size_t>             count;\r\n    rl::var<size_t>             unconsumed;\r\n    rl::HANDLE                  sema;\r\n    rl::CRITICAL_SECTION        mtx;\r\n};\r\n\r\n\r\nvoid on_thread_exit(thread_node*& t_thread_node)\r\n{\r\n    thread_node* head = t_thread_node;\r\n    thread_node* my = 0;\r\n    if (head)\r\n    {\r\n        rl::EnterCriticalSection(&head->mtx, $);\r\n        std::atomic_thread_fence($)(std::memory_order_seq_cst);\r\n        if (head->next($))\r\n        {\r\n            my = head->next($);\r\n            head->next($) = (thread_node*)my->next($);\r\n        }\r\n        else\r\n        {\r\n            my = head;\r\n        }\r\n        std::atomic_thread_fence($)(std::memory_order_seq_cst);\r\n        rl::LeaveCriticalSection(&head->mtx, $);\r\n\r\n        while (my->unconsumed($))\r\n        {\r\n            rl::WaitForSingleObject(my->sema, rl::RL_INFINITE, $);\r\n            my->unconsumed($) -= 1;\r\n        }\r\n\r\n        rl::DeleteCriticalSection(&my->mtx, $);\r\n        rl::CloseHandle(my->sema, $);\r\n        RL_DELETE(my);\r\n    }\r\n\r\n}\r\n\r\nstruct eventcount\r\n{\r\n    eventcount()\r\n    {\r\n        root($) = 0;\r\n        rl::InitializeCriticalSection(&mtx, $);\r\n    }\r\n\r\n    ~eventcount()\r\n    {\r\n        rl::DeleteCriticalSection(&mtx, $);\r\n    }\r\n\r\n    void prepare_wait(thread_node*& t_thread_node)\r\n    {\r\n        thread_node* my = 0;\r\n        thread_node* head = t_thread_node;\r\n        if (head)\r\n        {\r\n            rl::EnterCriticalSection(&head->mtx, $);\r\n            std::atomic_thread_fence($)(std::memory_order_seq_cst);\r\n            //RL_ASSERT(head->status == stat_root);\r\n            RL_ASSERT (root($) != head);\r\n            if (head->next($))\r\n            {\r\n                my = head->next($);\r\n                head->next($) = (thread_node*)my->next($);\r\n                my->next($) = 0;\r\n\r\n                //node_status st;\r\n                //if (stat_bucket != (st = (node_status)_InterlockedExchange(&my->status, stat_private)))\r\n                //    __asm int 3;\r\n                RL_ASSERT (0 == my->count($));\r\n            }\r\n            else\r\n            {\r\n                my = head;\r\n\r\n                //node_status st;\r\n                //if (stat_root != (st = (node_status)_InterlockedExchange(&my->status, stat_private)))\r\n                //    __asm int 3;\r\n                RL_ASSERT(0 == my->count($));\r\n            }\r\n            std::atomic_thread_fence($)(std::memory_order_seq_cst);\r\n            rl::LeaveCriticalSection(&head->mtx, $);\r\n        }\r\n        else\r\n        {\r\n            my = RL_NEW thread_node;\r\n            my->next($) = 0;\r\n            my->count($) = 0;\r\n            my->unconsumed($) = 0;\r\n            my->sema = rl::CreateSemaphore(0, 0, LONG_MAX, 0, $);\r\n            //my->status = stat_private;\r\n            rl::InitializeCriticalSection(&my->mtx, $);\r\n        }\r\n\r\n        while (my->unconsumed($))\r\n        {\r\n            rl::WaitForSingleObject(my->sema, rl::RL_INFINITE, $);\r\n            my->unconsumed($) -= 1;\r\n        }\r\n\r\n        RL_ASSERT(0 == my->next($));\r\n        RL_ASSERT(0 == my->count($));\r\n        //if (my->status != stat_private) __asm int 3;\r\n\r\n        rl::EnterCriticalSection(&mtx, $);\r\n        std::atomic_thread_fence($)(std::memory_order_seq_cst);\r\n        RL_ASSERT(root($) != my);\r\n        if (root($))\r\n        {\r\n            my->next($) = (thread_node*)((thread_node*)root($))->next($);\r\n            ((thread_node*)root($))->next($) = my;\r\n\r\n            //node_status st;\r\n            //if (stat_private != (st = (node_status)_InterlockedExchange(&my->status, stat_bucket)))\r\n            //    __asm int 3;\r\n\r\n            my = root($);\r\n        }\r\n        else\r\n        {\r\n            root($) = my;\r\n\r\n            //node_status st;\r\n            //if (stat_private != (st = (node_status)_InterlockedExchange(&my->status, stat_root)))\r\n            //    __asm int 3;\r\n        }\r\n        ((thread_node*)root($))->count($) += 1;\r\n        std::atomic_thread_fence($)(std::memory_order_seq_cst);\r\n        rl::LeaveCriticalSection(&mtx, $);\r\n        t_thread_node = my;\r\n    }\r\n\r\n    void wait(thread_node*& t_thread_node)\r\n    {\r\n        thread_node* head = t_thread_node;\r\n        if (head == root($))\r\n        {\r\n            rl::WaitForSingleObject(head->sema, rl::RL_INFINITE, $);\r\n        }\r\n        else\r\n        {\r\n            rl::EnterCriticalSection(&head->mtx, $);\r\n            std::atomic_thread_fence($)(std::memory_order_seq_cst);\r\n            head->unconsumed($) += 1;\r\n            std::atomic_thread_fence($)(std::memory_order_seq_cst);\r\n            rl::LeaveCriticalSection(&head->mtx, $);\r\n        }\r\n    }\r\n\r\n    void retire_wait(thread_node*& t_thread_node)\r\n    {\r\n        thread_node* head = t_thread_node;\r\n        if (head == root($))\r\n        {\r\n            rl::EnterCriticalSection(&mtx, $);\r\n            std::atomic_thread_fence($)(std::memory_order_seq_cst);\r\n            if (head == root($))\r\n            {\r\n                thread_node* my = 0;\r\n                head->count($) -= 1;\r\n                if (head->next($))\r\n                {\r\n                    my = head->next($);\r\n                    head->next($) = (thread_node*)my->next($);\r\n                    my->next($) = 0;\r\n                }\r\n                else\r\n                {\r\n                    my = head;\r\n                    root($) = 0;\r\n                }\r\n                std::atomic_thread_fence($)(std::memory_order_seq_cst);\r\n                rl::LeaveCriticalSection(&mtx, $);\r\n                //my->status = stat_root;\r\n                t_thread_node = my;\r\n                return;\r\n            }\r\n            std::atomic_thread_fence($)(std::memory_order_seq_cst);\r\n            rl::LeaveCriticalSection(&mtx, $);\r\n        }\r\n        rl::EnterCriticalSection(&head->mtx, $);\r\n        std::atomic_thread_fence($)(std::memory_order_seq_cst);\r\n        head->unconsumed($) += 1;\r\n        std::atomic_thread_fence($)(std::memory_order_seq_cst);\r\n        rl::LeaveCriticalSection(&head->mtx, $);\r\n    }\r\n\r\n    void signal_all()\r\n    {\r\n        //std::\r\n        //_mm_mfence();\r\n        thread_node* head = root($);\r\n        if (0 == head)\r\n            return;\r\n        rl::EnterCriticalSection(&mtx, $);\r\n        std::atomic_thread_fence($)(std::memory_order_seq_cst);\r\n        if (head != root($))\r\n        {\r\n            std::atomic_thread_fence($)(std::memory_order_seq_cst);\r\n            rl::LeaveCriticalSection(&mtx, $);\r\n            return;\r\n        }\r\n        size_t count = head->count($);\r\n        head->count($) = 0;\r\n        root($) = 0;\r\n        std::atomic_thread_fence($)(std::memory_order_seq_cst);\r\n        rl::LeaveCriticalSection(&mtx, $);\r\n        rl::ReleaseSemaphore(head->sema, count, 0, $);\r\n    }\r\n\r\n    std::atomic<thread_node*>       root;\r\n    rl::CRITICAL_SECTION            mtx;\r\n\r\n}; \r\n\r\n\r\n\r\n\r\nstruct test_ec : rl::test_suite<test_ec, 8>\r\n{\r\n    std::atomic<int> x [2];\r\n    eventcount ec;\r\n\r\n    void before()\r\n    {\r\n        x[0]($) = 0;\r\n        x[1]($) = 0;\r\n    }\r\n\r\n    void thread(unsigned idx)\r\n    {\r\n        if (idx < 4)\r\n        {\r\n            for (int i = 0; i != 3; ++i)\r\n            {\r\n                x[idx % 2]($).fetch_add(1);\r\n                ec.signal_all();\r\n            }\r\n        }\r\n        else\r\n        {\r\n            thread_node* my = 0;\r\n            for (int i = 0; i != 3; ++i)\r\n            {\r\n                for (;;)\r\n                {\r\n                    int cmp = x[idx % 2]($);\r\n                    if (cmp > 0)\r\n                    {\r\n                        if (x[idx % 2]($).compare_exchange(cmp, cmp - 1))\r\n                            break;\r\n                    }\r\n                    else\r\n                    {\r\n                        for (;;)\r\n                        {\r\n                            ec.prepare_wait(my);\r\n                            cmp = x[idx % 2]($);\r\n                            if (cmp > 0)\r\n                            {\r\n                                ec.retire_wait(my);\r\n                                break;\r\n                            }\r\n                            ec.wait(my);\r\n                            cmp = x[idx % 2]($);\r\n                            if (cmp > 0)\r\n                            {\r\n                                break;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            on_thread_exit(my);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\nint main()\r\n{\r\n    rl::test_params p;\r\n    p.iteration_count = 20000000;\r\n    p.initial_state = \"10000000\";\r\n    rl::simulate<test_ec>(p);\r\n}\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/mpmc/msvc8/mpmc.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 9.00\r\n# Visual Studio 2005\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"mpmc\", \"mpmc.vcproj\", \"{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E4}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tRelease|Win32 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E4}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E4}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E4}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E4}.Release|Win32.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/mpmc/msvc8/mpmc.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"mpmc\"\r\n\tProjectGUID=\"{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E4}\"\r\n\tRootNamespace=\"mpmc\"\r\n\tKeyword=\"Win32Proj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"false\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"false\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\mpmc.cpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\pcx.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.cpp\"\r\n\t\t\t>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/mpmc/pcx.h",
    "content": "#pragma once\r\n\r\n#include <intrin.h>\r\n#pragma intrinsic (_InterlockedExchangeAdd)\r\n#pragma intrinsic (_InterlockedCompareExchange)\r\n\r\n//#define PCX_DEBUG\r\n\r\n#ifdef PCX_DEBUG\r\n#include <sstream>\r\n#include <windows.h>\r\n#endif\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\nsize_t const cacheline_size = 64;\r\n\r\nstruct pcx_node\r\n{\r\n    typedef void            (*pcx_dtor_t)(pcx_node*);\r\n    ATOMIC(pcx_node*)       pcx_next_;\r\n    ATOMIC(pcx_dtor_t)      pcx_dtor_;\r\n};\r\n\r\nnamespace pcx_int\r\n{\r\n    unsigned const word_bits = 32;\r\n    unsigned const collector_bits = 4;\r\n    unsigned const collector_count = 1 << collector_bits;\r\n    unsigned const counter_inc = 1 << (collector_bits * 2);\r\n    unsigned const is_current_inc = 1;\r\n    unsigned const back_link_inc = 2;\r\n\r\n    struct master;\r\n    struct collector;\r\n\r\n    struct local_collector\r\n    {\r\n        pcx_node*               defer_head_;\r\n        pcx_node                defer_tail_;\r\n        unsigned                defer_size_;\r\n    };\r\n\r\n    struct thread_int\r\n    {\r\n        pcx_int::master*        master_;\r\n        pcx_int::collector*     collectors_;\r\n        unsigned                recursion_count_;\r\n        unsigned                is_acquired_;\r\n        unsigned                collector_index_;\r\n        unsigned                last_seen_collector_index_;\r\n        unsigned                flush_tail_;\r\n        pcx_node*               defer_head_;\r\n        pcx_node                defer_tail_;\r\n        unsigned                defer_size_;\r\n        unsigned                promote_;\r\n        local_collector         local_collectors_ [collector_count];\r\n    };\r\n}\r\n\r\nclass pcx_thread : private pcx_int::thread_int\r\n{\r\npublic:\r\n    static pcx_thread& get();\r\n\r\n    void acquire();\r\n    void release();\r\n    void defer(pcx_node* node, pcx_node::pcx_dtor_t dtor);\r\n    void flush();\r\n    void promote();\r\n    void quiescent();\r\n\r\n    void init();\r\n    void deinit();\r\n\r\nprivate:\r\n    unsigned acquire_impl();\r\n    void release_impl(unsigned, unsigned);\r\n    void flush_impl();\r\n    void local_flush();\r\n    void quiescent_impl();\r\n    friend void init();\r\n    friend void deinit();\r\n    friend void thread_callback(bool);\r\n};\r\n\r\nnamespace pcx_int\r\n{\r\n    struct master\r\n    {\r\n        char                pad0_ [64];\r\n\r\n        unsigned            garbage_threshold_;\r\n\r\n        char                pad1_ [64];\r\n\r\n        struct state_part\r\n        {\r\n            unsigned        current_collector_ : collector_bits;\r\n            unsigned        collector_tail_ : collector_bits;\r\n            unsigned        outer_counter_ : word_bits - 2 * collector_bits;\r\n        };\r\n\r\n        union state\r\n        {\r\n             long           whole_;\r\n             state_part     part_;\r\n        };\r\n\r\n        state               state_;\r\n\r\n        char                pad2_ [64];\r\n\r\n        state               state_copy_;\r\n\r\n        char                pad3_ [64];\r\n    };\r\n\r\n    struct collector\r\n    {\r\n        char                pad0_ [64];\r\n\r\n        pcx_node*           defer_list_head_;\r\n        unsigned            defer_list_size_;\r\n\r\n        char                pad1_ [64];\r\n\r\n        struct state_part\r\n        {\r\n            unsigned        is_current_ : 1;\r\n            unsigned        back_link_ : 1;\r\n            unsigned        pad_ : collector_bits * 2 - 2;\r\n            unsigned        inner_counter_ : word_bits - 2 * collector_bits;\r\n        };\r\n\r\n        union state\r\n        {\r\n             long           whole_;\r\n             state_part     part_;\r\n        };\r\n\r\n        state               state_;\r\n\r\n        char                pad2_ [64];\r\n    };\r\n\r\n    __declspec(selectany)\r\n    master                  g_master;\r\n    __declspec(selectany)\r\n    collector               g_collectors [collector_count];\r\n    __declspec(selectany, thread)\r\n    thread_int*             g_thread_instance;\r\n\r\n    typedef void (__stdcall nt_tls_cb_t)(void*, unsigned long, void*);\r\n    nt_tls_cb_t on_tls_callback;\r\n\r\n    #pragma data_seg(push, old_seg)\r\n    #pragma data_seg(\".CRT$XLB\")\r\n    __declspec(selectany, dllexport)\r\n    nt_tls_cb_t* volatile p_thread_callback = on_tls_callback;\r\n    #pragma data_seg(pop, old_seg)\r\n\r\n    inline void __stdcall on_tls_callback(void*, unsigned long reason, void*)\r\n    {\r\n        if (1 == reason)\r\n        {\r\n            init();\r\n            thread_callback(true);\r\n        }\r\n        else if (0 == reason)\r\n        {\r\n            thread_callback(false);\r\n            deinit();\r\n        }\r\n        if (2 == reason)\r\n        {\r\n            thread_callback(true);\r\n        }\r\n        else if (3 == reason)\r\n        {\r\n            thread_callback(false);\r\n        }\r\n    }\r\n}\r\n\r\ninline void init()\r\n{\r\n    using namespace pcx_int;\r\n    master& m = g_master;\r\n    m.garbage_threshold_ = 128;\r\n    m.state_.part_.current_collector_ = 0;\r\n    m.state_.part_.collector_tail_ = 0;\r\n    m.state_.part_.outer_counter_ = 0;\r\n    m.state_copy_.part_.current_collector_ = 0;\r\n    m.state_copy_.part_.collector_tail_ = 0;\r\n    m.state_copy_.part_.outer_counter_ = 0;\r\n    for (unsigned i = 0; i != collector_count; ++i)\r\n    {\r\n        collector& c = g_collectors[i];\r\n        c.defer_list_head_ = 0;\r\n        c.defer_list_size_ = 0;\r\n        c.state_.part_.is_current_ = 1;\r\n        c.state_.part_.back_link_ = 1;\r\n        c.state_.part_.inner_counter_ = 0;\r\n    }\r\n    g_collectors[0].state_.part_.back_link_ = 0;\r\n}\r\n\r\ninline void deinit()\r\n{\r\n    using namespace pcx_int;\r\n    pcx_thread::get().release_impl(g_master.state_.part_.current_collector_, is_current_inc);\r\n}\r\n\r\ninline void thread_callback(bool init)\r\n{\r\n    if (init)\r\n    {\r\n        g_thread_instance = RL_NEW pcx_thread ();\r\n        pcx_thread::get().init();\r\n    }\r\n    else\r\n    {\r\n        pcx_thread::get().deinit();\r\n        RL_DELETE(g_thread_instance);\r\n        g_thread_instance = 0;\r\n    }\r\n}\r\n\r\ninline pcx_thread& pcx_thread::get()\r\n{\r\n    return static_cast<pcx_thread&>(*pcx_int::g_thread_instance);\r\n}\r\n\r\ninline unsigned pcx_thread::acquire_impl()\r\n{\r\n    using namespace pcx_int;\r\n    long const prev =\r\n        _InterlockedExchangeAdd(\r\n            &master_->state_.whole_, counter_inc);\r\n    master::state_part u = {prev};\r\n\r\n#ifdef PCX_DEBUG\r\n    std::ostringstream ss;\r\n    ss << \"[PCX] thread \" << this << \" acquire \" << u.current_collector_ << \"\\n\";\r\n    OutputDebugStringA(ss.str().c_str());\r\n#endif\r\n\r\n    if (u.current_collector_ == flush_tail_\r\n        && local_collectors_[flush_tail_].defer_size_)\r\n    {\r\n        local_flush();\r\n    }\r\n\r\n    return u.current_collector_;\r\n}\r\n\r\ninline void pcx_thread::release_impl(unsigned index, unsigned count)\r\n{\r\n    using namespace pcx_int;\r\n    collector& c = collectors_[index];\r\n    unsigned const prev =\r\n        _InterlockedExchangeAdd(\r\n            &c.state_.whole_, (unsigned)-(int)count);\r\n\r\n#ifdef PCX_DEBUG\r\n    std::ostringstream ss;\r\n    ss << \"[PCX] thread \" << this << \" release \" << index << \"\\n\";\r\n    OutputDebugStringA(ss.str().c_str());\r\n#endif\r\n\r\n    if (0 == prev - count)\r\n    {\r\n        pcx_node* curr = c.defer_list_head_;\r\n        while (curr)\r\n        {\r\n            pcx_node* next = curr->pcx_next_;\r\n            curr->pcx_dtor_(curr);\r\n            curr = next;\r\n        }\r\n        c.defer_list_head_ = 0;\r\n        c.defer_list_size_ = 0;\r\n        c.state_.part_.back_link_ = 1;\r\n        c.state_.part_.is_current_ = 1;\r\n\r\n        long u;\r\n        if (index != collector_count - 1)\r\n            u = collector_count;\r\n        else\r\n            u = -(long)(collector_count * (collector_count - 1));\r\n        _InterlockedExchangeAdd(&master_->state_.whole_, u);\r\n\r\n        release_impl((index + 1) % collector_count, back_link_inc);\r\n    }\r\n}\r\n\r\ninline void pcx_thread::flush_impl()\r\n{\r\n    using namespace pcx_int;\r\n    _mm_mfence();\r\n    master::state state = master_->state_;\r\n    last_seen_collector_index_ = state.part_.current_collector_;\r\n    collector& gc = collectors_[state.part_.current_collector_];\r\n    local_collector& lc = local_collectors_[state.part_.current_collector_];\r\n    lc.defer_head_->pcx_next_ = defer_tail_.pcx_next_;\r\n    lc.defer_head_ = defer_tail_.pcx_next_;\r\n    lc.defer_size_ += defer_size_;\r\n    defer_head_ = &defer_tail_;\r\n    defer_tail_.pcx_next_ = 0;\r\n    defer_size_ = 0;\r\n    if (master_->garbage_threshold_ < lc.defer_size_ || promote_)\r\n    {\r\n        master::state cmp;\r\n        master::state val;\r\n        do\r\n        {\r\n            cmp = master_->state_;\r\n            if (cmp.part_.current_collector_ != last_seen_collector_index_)\r\n            {\r\n                promote_ = 0;\r\n                return;\r\n            }\r\n            unsigned next_index = (last_seen_collector_index_ + 1) % collector_count;\r\n            if (cmp.part_.collector_tail_ == next_index)\r\n                return;\r\n            val = cmp;\r\n            val.part_.current_collector_ += 1;\r\n            val.part_.outer_counter_ = 0;\r\n        }\r\n        while (cmp.whole_ != _InterlockedCompareExchange(\r\n          (long*)&master_->state_.whole_, val.whole_, cmp.whole_));\r\n        last_seen_collector_index_ = val.part_.current_collector_;\r\n        promote_ = 0;\r\n        _InterlockedIncrement((long*)&master_->state_copy_.whole_);\r\n        _InterlockedExchangeAdd((long*)&gc.state_.whole_,\r\n            cmp.part_.outer_counter_ * counter_inc - is_current_inc);\r\n    }\r\n}\r\n\r\n__declspec(noinline)\r\ninline void pcx_thread::local_flush()\r\n{\r\n    using namespace pcx_int;\r\n    if (flush_tail_ == master_->state_.part_.collector_tail_)\r\n        return;\r\n\r\n#ifdef PCX_DEBUG\r\n    std::ostringstream ss;\r\n    ss << \"[PCX] thread \" << this << \" flush   \" << flush_tail_ << \"\\n\";\r\n    OutputDebugStringA(ss.str().c_str());\r\n#endif\r\n\r\n    local_collector& lc = local_collectors_[flush_tail_];\r\n    pcx_node* curr = lc.defer_tail_.pcx_next_;\r\n    while (curr)\r\n    {\r\n#ifdef PCX_DEBUG\r\n    std::ostringstream ss;\r\n    ss << \"[PCX] thread \" << this << \" destroy \" << curr << \"\\n\";\r\n    OutputDebugStringA(ss.str().c_str());\r\n#endif\r\n\r\n        pcx_node* next = curr->pcx_next_;\r\n        curr->pcx_dtor_(curr);\r\n        curr = next;\r\n    }\r\n    lc.defer_head_ = &lc.defer_tail_;\r\n    lc.defer_tail_.pcx_next_ = 0;\r\n    lc.defer_size_ = 0;\r\n    flush_tail_ = (flush_tail_ + 1) % collector_count;\r\n}\r\n\r\n__declspec(noinline)\r\ninline void pcx_thread::quiescent_impl()\r\n{\r\n    using namespace pcx_int;\r\n    if (defer_size_)\r\n        flush_impl();\r\n    release_impl(collector_index_, counter_inc);\r\n    collector_index_ = acquire_impl();\r\n}\r\n\r\ninline void pcx_thread::acquire()\r\n{\r\n    using namespace pcx_int;\r\n    recursion_count_ += 1;\r\n    if (1 != recursion_count_)\r\n        return;\r\n    if (is_acquired_)\r\n        return;\r\n    collector_index_ = acquire_impl();\r\n    last_seen_collector_index_ = collector_index_;\r\n    is_acquired_ = 1;\r\n}\r\n\r\ninline void pcx_thread::release()\r\n{\r\n    using namespace pcx_int;\r\n    recursion_count_ -= 1;\r\n    if (0 == recursion_count_)\r\n    {\r\n        if (master_->state_copy_.part_.current_collector_ != collector_index_\r\n            || promote_)\r\n        {\r\n            if (defer_size_)\r\n                flush_impl();\r\n            release_impl(collector_index_, counter_inc);\r\n            is_acquired_ = 0;\r\n        }\r\n    }\r\n    if (flush_tail_ != last_seen_collector_index_)\r\n    {\r\n        local_flush();\r\n    }\r\n}\r\n\r\ninline void pcx_thread::quiescent()\r\n{\r\n    if (master_->state_copy_.part_.current_collector_ != collector_index_\r\n        || promote_)\r\n    {\r\n        quiescent_impl();\r\n    }\r\n    if (flush_tail_ != last_seen_collector_index_)\r\n    {\r\n        local_flush();\r\n    }\r\n}\r\n\r\ninline void pcx_thread::defer(pcx_node* node, pcx_node::pcx_dtor_t dtor)\r\n{\r\n    using namespace pcx_int;\r\n    node->pcx_next_ = 0;\r\n    node->pcx_dtor_ = dtor;\r\n    defer_head_->pcx_next_ = node;\r\n    defer_head_ = node;\r\n    defer_size_ += 1;\r\n}\r\n\r\ninline void pcx_thread::flush()\r\n{\r\n    using namespace pcx_int;\r\n    if (recursion_count_)\r\n        return;\r\n    if (0 == is_acquired_)\r\n        return;\r\n    if (defer_size_)\r\n        flush_impl();\r\n    release_impl(collector_index_, counter_inc);\r\n    is_acquired_ = 0;\r\n}\r\n\r\ninline void pcx_thread::promote()\r\n{\r\n    promote_ = 1;\r\n}\r\n\r\ninline void pcx_thread::init()\r\n{\r\n    using namespace pcx_int;\r\n    master_ = &g_master;\r\n    collectors_ = g_collectors;\r\n    defer_head_ = &defer_tail_;\r\n    defer_tail_.pcx_next_ = 0;\r\n    for (unsigned i = 0; i != collector_count; ++i)\r\n    {\r\n        local_collectors_[i].defer_head_ = &local_collectors_[i].defer_tail_;\r\n    }\r\n}\r\n\r\ninline void pcx_thread::deinit()\r\n{\r\n    flush();\r\n}\r\n\r\n}\r\n\r\n\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/mpmc/stdafx.cpp",
    "content": "// stdafx.cpp : source file that includes just the standard includes\r\n// ws_deque.pch will be the pre-compiled header\r\n// stdafx.obj will contain the pre-compiled type information\r\n\r\n#include \"stdafx.h\"\r\n\r\n// TODO: reference any additional headers you need in STDAFX.H\r\n// and not in this file\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/mpmc/stdafx.h",
    "content": "#pragma once\r\n\r\n#pragma warning (disable: 4201)\r\n\r\n//#define RL_GC\r\n#define RL_MSVC_OUTPUT\r\n\r\n#include \"../../relacy/pch.hpp\"\r\n#include \"../../relacy/relacy_std.hpp\"\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/mutex_business_logic/msvc8/mutex_business_logic.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 9.00\r\n# Visual Studio 2005\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"mutex_business_logic\", \"mutex_business_logic.vcproj\", \"{D4756EE9-3953-4E17-B1B5-E89F853303C1}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tRelease|Win32 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Release|Win32.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/mutex_business_logic/msvc8/mutex_business_logic.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"mutex_business_logic\"\r\n\tProjectGUID=\"{B03A7216-E196-44C6-8861-C77D90055512}\"\r\n\tRootNamespace=\"mutex_business_logic\"\r\n\tKeyword=\"Win32Proj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\mutex_business_logic.cpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.cpp\"\r\n\t\t\t>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\tObjectFile=\"$(IntDir)\\$(InputName)1.obj\"\r\n\t\t\t\t\tXMLDocumentationFileName=\"$(IntDir)\\$(InputName)1.xdc\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\tObjectFile=\"$(IntDir)\\$(InputName)1.obj\"\r\n\t\t\t\t\tXMLDocumentationFileName=\"$(IntDir)\\$(InputName)1.xdc\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/mutex_business_logic/mutex_business_logic.cpp",
    "content": "#include \"stdafx.h\"\r\n#include \"../../relacy/relacy_std.hpp\"\r\n\r\n\r\n\r\nclass business_logic\r\n{\r\npublic:\r\n    typedef unsigned account_id_t;\r\n    typedef double balance_t;\r\n\r\n    business_logic()\r\n    {\r\n        pthread_rwlock_init(&accounts_guard, 0);\r\n    }\r\n\r\n    ~business_logic()\r\n    {\r\n        pthread_rwlock_destroy(&accounts_guard);\r\n    }\r\n\r\n    bool add_account(account_id_t acc_id, balance_t balance)\r\n    {\r\n        pthread_rwlock_wrlock(&accounts_guard);\r\n        if (accounts.find(acc_id) != accounts.end())\r\n        {\r\n            pthread_rwlock_unlock(&accounts_guard);\r\n            return false;\r\n        }\r\n        accounts[acc_id].balance = balance;\r\n        pthread_rwlock_unlock(&accounts_guard);\r\n        return true;\r\n    }\r\n\r\n    bool transfer_balance(account_id_t acc_id1, account_id_t acc_id2, balance_t amount)\r\n    {\r\n        if (acc_id1 == acc_id2)\r\n            return true;\r\n        pthread_rwlock_rdlock(&accounts_guard);\r\n        if (accounts.find(acc_id1) == accounts.end()\r\n            || accounts.find(acc_id2) == accounts.end())\r\n        {\r\n            pthread_rwlock_unlock(&accounts_guard);\r\n            return false;\r\n        }\r\n        account_info& acc1 = accounts[acc_id1];\r\n        account_info& acc2 = accounts[acc_id2];\r\n        if (acc_id1 > acc_id2)\r\n        {\r\n            pthread_mutex_lock(&acc1.mtx);\r\n            pthread_mutex_lock(&acc2.mtx);\r\n        }\r\n        else\r\n        {\r\n            pthread_mutex_lock(&acc2.mtx);\r\n            pthread_mutex_lock(&acc1.mtx);\r\n        }\r\n        pthread_rwlock_unlock(&accounts_guard);\r\n\r\n        acc1.balance -= amount;\r\n        acc2.balance += amount;\r\n\r\n        pthread_mutex_unlock(&acc1.mtx);\r\n        pthread_mutex_unlock(&acc2.mtx);\r\n        return true;\r\n    }\r\n\r\nprivate:\r\n    struct account_info\r\n    {\r\n        balance_t balance;\r\n        pthread_mutex_t mtx;\r\n\r\n        account_info()\r\n            : balance()\r\n        {\r\n            pthread_mutex_init(&mtx, 0);\r\n        }\r\n\r\n        account_info(account_info const& acc)\r\n            : balance(acc.balance)\r\n        {\r\n            pthread_mutex_init(&mtx, 0);\r\n        }\r\n\r\n        ~account_info()\r\n        {\r\n            pthread_mutex_destroy(&mtx);\r\n        }\r\n    };\r\n\r\n    typedef std::map<account_id_t, account_info> account_map_t;\r\n    account_map_t accounts;\r\n    pthread_rwlock_t accounts_guard;\r\n};\r\n\r\n\r\n\r\n\r\nstruct business_logic_test : rl::test_suite<business_logic_test, 2>\r\n{\r\n    business_logic bl;\r\n\r\n    static size_t const account_count = 4;\r\n\r\n    void before()\r\n    {\r\n        for (size_t i = 0; i != account_count; ++i)\r\n        {\r\n            bool rv = bl.add_account(i, i * 10.0);\r\n            RL_ASSERT(rv);\r\n        }\r\n    }\r\n\r\n    void thread(unsigned /*index*/)\r\n    {\r\n        business_logic::account_id_t acc1 = rl::rand(account_count);\r\n        business_logic::account_id_t acc2 = rl::rand(account_count);\r\n        bool rv = bl.transfer_balance(acc1, acc2, 1.0);\r\n        RL_ASSERT(rv);\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nint main()\r\n{    \r\n    rl::simulate<business_logic_test>();\r\n}\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/mutex_business_logic/stdafx.cpp",
    "content": "#include \"stdafx.h\"\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/mutex_business_logic/stdafx.h",
    "content": "#pragma once\r\n\r\n#ifdef NDEBUG\r\n#   define _SECURE_SCL 0\r\n#endif\r\n\r\n#define RL_MSVC_OUTPUT\r\n//#define RL_DEBUGBREAK_ON_FAILURE\r\n\r\n#include \"../../relacy/pch.hpp\"\r\n#include \"../../relacy/relacy_std.hpp\"\r\n\r\n\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/peterson/msvc8/peterson.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 9.00\r\n# Visual Studio 2005\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"peterson\", \"peterson.vcproj\", \"{D4756EE9-3953-4E17-B1B5-E89F853303C1}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tRelease|Win32 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Release|Win32.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/peterson/msvc8/peterson.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"peterson\"\r\n\tProjectGUID=\"{D4756EE9-3953-4E17-B1B5-E89F853303C1}\"\r\n\tRootNamespace=\"peterson\"\r\n\tKeyword=\"Win32Proj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\peterson.cpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.cpp\"\r\n\t\t\t>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\tObjectFile=\"$(IntDir)\\$(InputName)1.obj\"\r\n\t\t\t\t\tXMLDocumentationFileName=\"$(IntDir)\\$(InputName)1.xdc\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\tObjectFile=\"$(IntDir)\\$(InputName)1.obj\"\r\n\t\t\t\t\tXMLDocumentationFileName=\"$(IntDir)\\$(InputName)1.xdc\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/peterson/msvc9/peterson.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 10.00\r\n# Visual Studio 2008\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"peterson\", \"peterson.vcproj\", \"{D4756EE9-3953-4E17-B1B5-E89F853303C1}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tRelease|Win32 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Release|Win32.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/peterson/msvc9/peterson.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"9,00\"\r\n\tName=\"peterson\"\r\n\tProjectGUID=\"{D4756EE9-3953-4E17-B1B5-E89F853303C1}\"\r\n\tRootNamespace=\"peterson\"\r\n\tKeyword=\"Win32Proj\"\r\n\tTargetFrameworkVersion=\"131072\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tRandomizedBaseAddress=\"1\"\r\n\t\t\t\tDataExecutionPrevention=\"0\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tRandomizedBaseAddress=\"1\"\r\n\t\t\t\tDataExecutionPrevention=\"0\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\peterson.cpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.cpp\"\r\n\t\t\t>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/peterson/peterson.cpp",
    "content": "#include \"stdafx.h\"\r\n#include \"../../relacy/relacy_std.hpp\"\r\n#include \"../../relacy/windows.h\"\r\n\r\n\r\nstruct peterson_mutex_test : rl::test_suite<peterson_mutex_test, 2>\r\n{\r\n    std::atomic<int> flag0;\r\n    std::atomic<int> flag1;\r\n    std::atomic<int> turn;\r\n\r\n    rl::var<int> data;\r\n\r\n    void before()\r\n    {\r\n        flag0($) = 0;\r\n        flag1($) = 0;\r\n        turn($) = 0;\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            flag0($).store(1);\r\n            turn($).store(1);\r\n\r\n            while (flag1($).load()\r\n                && 1 == turn($).load());\r\n\r\n            data($) = 1;\r\n\r\n            flag0($).store(0);\r\n        }\r\n        else\r\n        {\r\n            flag1($).store(1);\r\n            turn($).store(0);\r\n\r\n            while (flag0($).load()\r\n                && 0 == turn($).load());\r\n\r\n            data($) = 2;\r\n\r\n            flag1($).store(0);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct peterson_mutex_test2 : rl::test_suite<peterson_mutex_test2, 2>\r\n{\r\n    std::atomic<int> flag0;\r\n    std::atomic<int> flag1;\r\n    std::atomic<int> turn;\r\n\r\n    rl::var<int> data;\r\n\r\n    void before()\r\n    {\r\n        flag0($) = 0;\r\n        flag1($) = 0;\r\n        turn($) = 0;\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            flag0.store(1, rl::memory_order_relaxed);\r\n            turn.exchange(1, rl::memory_order_acq_rel);\r\n\r\n            while (flag1.load(rl::memory_order_acquire)\r\n                && 1 == turn.load(rl::memory_order_relaxed))\r\n                rl::yield(1, $);\r\n\r\n            data($) = 1;\r\n\r\n            flag0.store(0, rl::memory_order_release);\r\n        }\r\n        else\r\n        {\r\n            flag1.store(1, rl::memory_order_relaxed);\r\n            turn.exchange(0, rl::memory_order_acq_rel);\r\n\r\n            while (flag0.load(rl::memory_order_acquire)\r\n                && 0 == turn.load(rl::memory_order_relaxed))\r\n                rl::yield(1, $);\r\n\r\n            data($) = 2;\r\n\r\n            flag1.store(0, rl::memory_order_release);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct peterson_mutex_test3 : rl::test_suite<peterson_mutex_test3, 2>\r\n{\r\n    std::atomic<int> flag0;\r\n    std::atomic<int> flag1;\r\n    std::atomic<int> turn;\r\n\r\n    rl::var<int> data;\r\n\r\n    void before()\r\n    {\r\n        flag0($) = 0;\r\n        flag1($) = 0;\r\n        turn($) = 0;\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            flag0.store(1, std::memory_order_relaxed);\r\n            std::atomic_thread_fence(std::memory_order_seq_cst);\r\n            turn.store(1, std::memory_order_relaxed);\r\n            std::atomic_thread_fence(std::memory_order_seq_cst);\r\n\r\n            while (flag1.load(std::memory_order_acquire)\r\n                && 1 == turn.load(std::memory_order_relaxed));\r\n\r\n            data($) = 1;\r\n\r\n            flag0.store(0, std::memory_order_release);\r\n        }\r\n        else\r\n        {\r\n            flag1.store(1, std::memory_order_relaxed);\r\n            std::atomic_thread_fence(std::memory_order_seq_cst);\r\n            turn.store(0, std::memory_order_relaxed);\r\n            std::atomic_thread_fence(std::memory_order_seq_cst);\r\n\r\n            while (flag0.load(std::memory_order_acquire)\r\n                && 0 == turn.load(std::memory_order_relaxed));\r\n\r\n            data($) = 2;\r\n\r\n            flag1.store(0, std::memory_order_release);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n// FAILS WITH DATA RACE\r\nstruct peterson_mutex_test4 : rl::test_suite<peterson_mutex_test4, 2>\r\n{\r\n    std::atomic<int> flag0;\r\n    std::atomic<int> flag1;\r\n    std::atomic<int> turn;\r\n\r\n    rl::var<int> data;\r\n\r\n    void before()\r\n    {\r\n        flag0($) = 0;\r\n        flag1($) = 0;\r\n        turn($) = 0;\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            flag0.exchange(1, rl::memory_order_acq_rel);\r\n            turn.store(1, rl::memory_order_release);\r\n\r\n            while (flag1.load(rl::memory_order_acquire)\r\n                && 1 == turn.load(rl::memory_order_acquire))\r\n                rl::yield(1, $);\r\n\r\n            data($) = 1;\r\n\r\n            flag0.store(0, rl::memory_order_release);\r\n        }\r\n        else\r\n        {\r\n            flag1.exchange(1, rl::memory_order_acq_rel);\r\n            turn.store(0, rl::memory_order_release);\r\n\r\n            while (flag0.load(rl::memory_order_acquire)\r\n                && 0 == turn.load(rl::memory_order_relaxed))\r\n                rl::yield(1, $);\r\n\r\n            data($) = 2;\r\n\r\n            flag1.store(0, rl::memory_order_release);\r\n        }\r\n    }\r\n};\r\n\r\n\r\nclass eventcount\r\n{\r\npublic:\r\n    typedef unsigned state_t;\r\n\r\n    eventcount()\r\n    {\r\n        state_.store(0, std::memory_order_relaxed);\r\n        sema_ = CreateSemaphore(0, 0, LONG_MAX, 0);\r\n    }\r\n\r\n    ~eventcount()\r\n    {\r\n        CloseHandle(sema_);\r\n    }\r\n\r\n    state_t prepare()\r\n    {\r\n        return state_.fetch_add(waiters_inc, std::memory_order_seq_cst);\r\n    }\r\n\r\n    void retire()\r\n    {\r\n        state_.fetch_add((state_t)-(int)waiters_inc, std::memory_order_seq_cst);\r\n    }\r\n\r\n    void wait(state_t cmp)\r\n    {\r\n        WaitForSingleObject(sema_, INFINITE);\r\n        state_t cmp0 = state_.load(std::memory_order_seq_cst);\r\n        if ((cmp & generation_mask) == (cmp0 & generation_mask))\r\n        {\r\n            state_.fetch_add((state_t)-(int)waiters_inc, std::memory_order_seq_cst);\r\n            ReleaseSemaphore(sema_, 1, 0);\r\n            SwitchToThread();\r\n        }\r\n    }\r\n\r\n    void signal()\r\n    {\r\n        std::atomic_thread_fence(std::memory_order_seq_cst);\r\n        signal_relaxed();\r\n    }\r\n\r\n    void signal_relaxed()\r\n    {\r\n        state_t cmp = state_.load(std::memory_order_seq_cst);\r\n        if (0 == (cmp & waiters_mask))\r\n            return;\r\n        for (;;)\r\n        {\r\n            state_t xchg = (cmp & ~waiters_mask) + generation_inc;\r\n            if (state_.compare_exchange_weak(cmp, xchg, std::memory_order_seq_cst))\r\n            {\r\n                ReleaseSemaphore(sema_, cmp & waiters_mask, 0);\r\n                return;\r\n            }\r\n            if (0 == (cmp & waiters_mask))\r\n                return;\r\n        }\r\n    }\r\n    \r\nprivate:\r\n    std::atomic<state_t> state_;\r\n    HANDLE sema_;\r\n\r\n    static state_t const waiters_inc = 1;\r\n    static state_t const waiters_mask = (1 << 20) - 1;\r\n    static state_t const generation_inc = 1 << 20;\r\n    static state_t const generation_mask = ~waiters_mask;\r\n\r\n    eventcount(eventcount const&);\r\n    eventcount& operator = (eventcount const&);\r\n};\r\n\r\n\r\n\r\n\r\nclass eventcount_blocking\r\n{\r\npublic:\r\n    eventcount_blocking(eventcount& ec)\r\n        : ec_(ec)\r\n    {\r\n        cmp_ = ec_.prepare();\r\n        wait_ = false;\r\n    }\r\n\r\n    void wait()\r\n    {\r\n        RL_ASSERT(false == wait_);\r\n        wait_ = true;\r\n        ec_.wait(cmp_);\r\n    }\r\n\r\n    ~eventcount_blocking()\r\n    {\r\n        if (false == wait_)\r\n            ec_.retire();\r\n    }\r\n\r\nprivate:\r\n    eventcount& ec_;\r\n    eventcount::state_t cmp_;\r\n    bool wait_;\r\n\r\n    eventcount_blocking(eventcount_blocking const&);\r\n    eventcount_blocking& operator = (eventcount_blocking const&);\r\n};\r\n\r\n\r\n\r\n\r\n\r\nstruct signaling_test : rl::test_suite<signaling_test, 6>\r\n{\r\n    //rl::HANDLE              var_wait_for_items;\r\n    //rl::CRITICAL_SECTION    mtx_items_avail;\r\n    //std::atomic<unsigned>   n_waiting_consumers;\r\n    //rl::var<unsigned>       consumer_wait_generation;\r\n    //rl::var<unsigned>       n_consumers_to_wakeup;\r\n\r\n    eventcount ec_;\r\n\r\n    static int const max_queue_length = 4;\r\n    int queue [max_queue_length];\r\n    int queue_head;\r\n    int queue_tail;\r\n    int queue_head_data;\r\n    int queue_tail_data;\r\n\r\n    void before()\r\n    {\r\n        //var_wait_for_items = rl::CreateEvent(0, 1, 0, 0, $);\r\n        //rl::InitializeCriticalSection(&mtx_items_avail, $);\r\n        //n_waiting_consumers($) = 0;\r\n        //consumer_wait_generation($) = 0;\r\n        //n_consumers_to_wakeup($) = 0;\r\n        for (int i = 0; i != max_queue_length; ++i)\r\n            queue[i] = 0;\r\n        queue_head = 0;\r\n        queue_tail = 0;\r\n        queue_head_data = 0;\r\n        queue_tail_data = 0;\r\n    }\r\n\r\n    void after()\r\n    {\r\n        //rl::CloseHandle(var_wait_for_items, $);\r\n        //rl::DeleteCriticalSection(&mtx_items_avail, $);\r\n    }\r\n\r\n    struct enqueue_desc\r\n    {\r\n        int pos;\r\n\r\n        void output(std::ostream& s) const\r\n        {\r\n            s << \"enqueue \" << pos;\r\n        }\r\n    };\r\n\r\n    void enqueue()\r\n    {\r\n        queue[queue_head++] = ++queue_head_data;\r\n        RL_HIST_IMPL(rl::ctx(), $, enqueue_desc) {queue_head - 1} RL_HIST_END();\r\n        signal();\r\n    }\r\n\r\n    void dequeue()\r\n    {\r\n        int my_pos = queue_tail++;\r\n        for (;;)\r\n        {\r\n            if (queue[my_pos])\r\n            {\r\n                RL_ASSERT(queue[my_pos] == my_pos + 1);\r\n                return;\r\n            }\r\n            wait(my_pos);\r\n        }\r\n    }\r\n\r\n    void signal()\r\n    {\r\n        ec_.signal();\r\n        /*\r\n        std::atomic_thread_fence($)(std::memory_order_seq_cst);\r\n        if (n_waiting_consumers($).load(std::memory_order_relaxed))\r\n        {\r\n            rl::EnterCriticalSection(&mtx_items_avail, $);\r\n            if (n_waiting_consumers($).load(std::memory_order_relaxed) > 0)\r\n            {\r\n                consumer_wait_generation($) += 1;\r\n                //RL_ASSERT(n_consumers_to_wakeup($) == 0);\r\n                n_consumers_to_wakeup($) = n_waiting_consumers($).load(std::memory_order_relaxed);\r\n                rl::SetEvent(var_wait_for_items, $);\r\n            }\r\n            rl::LeaveCriticalSection(&mtx_items_avail, $);\r\n        }\r\n        */\r\n    }\r\n\r\n    void wait(int my_pos)\r\n    {\r\n        eventcount_blocking block (ec_);\r\n        if (queue[my_pos])\r\n            return;\r\n        block.wait();\r\n\r\n        /*\r\n        rl::EnterCriticalSection(&mtx_items_avail, $);\r\n        n_waiting_consumers($).store(n_waiting_consumers($).load(std::memory_order_relaxed) + 1, std::memory_order_relaxed);\r\n        std::atomic_thread_fence($)(std::memory_order_seq_cst);\r\n        while (0 == queue[my_pos])\r\n        {\r\n            unsigned my_generation = consumer_wait_generation($);\r\n            for (;;)\r\n            {\r\n                rl::LeaveCriticalSection(&mtx_items_avail, $);\r\n                rl::WaitForSingleObject(var_wait_for_items, rl::RL_INFINITE, $);\r\n                rl::EnterCriticalSection(&mtx_items_avail, $);\r\n                if (n_consumers_to_wakeup($) > 0 && consumer_wait_generation($) != my_generation)\r\n                    break;\r\n            }\r\n            if (--n_consumers_to_wakeup($) == 0)\r\n                rl::ResetEvent(var_wait_for_items, $);\r\n        }\r\n        n_waiting_consumers($).store(n_waiting_consumers($).load(std::memory_order_relaxed) - 1, std::memory_order_relaxed);\r\n        rl::LeaveCriticalSection(&mtx_items_avail, $);\r\n        */\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (index < rl::test_suite<signaling_test, 6>::params::thread_count/2+1)\r\n        {\r\n            enqueue();\r\n        }\r\n        else\r\n        {\r\n            dequeue();\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nint main()\r\n{\r\n    rl::test_params p;\r\n    //p.search_type = rl::fair_context_bound_scheduler_type;\r\n    p.search_type = rl::sched_bound;\r\n    //p.context_bound = 1;\r\n    //p.execution_depth_limit = 100;\r\n    //p.iteration_count = 5000;\r\n    //p.initial_state = \"280572\";\r\n    //rl::simulate<signaling_test>(p);\r\n\r\n    rl::simulate<peterson_mutex_test>();\r\n    rl::simulate<peterson_mutex_test2>(p);\r\n    rl::simulate<peterson_mutex_test3>();\r\n    rl::simulate<peterson_mutex_test4>(p);\r\n}\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/peterson/stdafx.cpp",
    "content": "#include \"stdafx.h\"\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/peterson/stdafx.h",
    "content": "#pragma once\r\n\r\n#ifdef NDEBUG\r\n#   define _SECURE_SCL 0\r\n#endif\r\n\r\n#define RL_MSVC_OUTPUT\r\n//#define RL_DEBUGBREAK_ON_FAILURE\r\n\r\n#include \"../../relacy/pch.hpp\"\r\n#include \"../../relacy/relacy_std.hpp\"\r\n\r\n\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/proxy_collector/msvc8/proxy_collector.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 9.00\r\n# Visual Studio 2005\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"proxy_collector\", \"proxy_collector.vcproj\", \"{31994C0C-3BAD-4F25-8BC8-3206FF349B29}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tRelease|Win32 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B29}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B29}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B29}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B29}.Release|Win32.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/proxy_collector/msvc8/proxy_collector.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"proxy_collector\"\r\n\tProjectGUID=\"{31994C0C-3BAD-4F25-8BC8-3206FF349B29}\"\r\n\tRootNamespace=\"ref_counting\"\r\n\tKeyword=\"Win32Proj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tInlineFunctionExpansion=\"2\"\r\n\t\t\t\tEnableIntrinsicFunctions=\"true\"\r\n\t\t\t\tFavorSizeOrSpeed=\"1\"\r\n\t\t\t\tOmitFramePointers=\"true\"\r\n\t\t\t\tEnableFiberSafeOptimizations=\"true\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tBufferSecurityCheck=\"false\"\r\n\t\t\t\tEnableEnhancedInstructionSet=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Profile|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"0\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tAdditionalOptions=\"/Ob0\"\r\n\t\t\t\tEnableIntrinsicFunctions=\"true\"\r\n\t\t\t\tFavorSizeOrSpeed=\"1\"\r\n\t\t\t\tOmitFramePointers=\"true\"\r\n\t\t\t\tEnableFiberSafeOptimizations=\"true\"\r\n\t\t\t\tWholeProgramOptimization=\"false\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tBufferSecurityCheck=\"false\"\r\n\t\t\t\tEnableEnhancedInstructionSet=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\proxy_collector.cpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.cpp\"\r\n\t\t\t>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/proxy_collector/msvc9/proxy_collector.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 10.00\r\n# Visual Studio 2008\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"proxy_collector\", \"proxy_collector.vcproj\", \"{31994C0C-3BAD-4F25-8BC8-3206FF349B29}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tRelease|Win32 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B29}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B29}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B29}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B29}.Release|Win32.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/proxy_collector/msvc9/proxy_collector.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"9,00\"\r\n\tName=\"proxy_collector\"\r\n\tProjectGUID=\"{31994C0C-3BAD-4F25-8BC8-3206FF349B29}\"\r\n\tRootNamespace=\"ref_counting\"\r\n\tKeyword=\"Win32Proj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tInlineFunctionExpansion=\"2\"\r\n\t\t\t\tEnableIntrinsicFunctions=\"true\"\r\n\t\t\t\tFavorSizeOrSpeed=\"1\"\r\n\t\t\t\tOmitFramePointers=\"true\"\r\n\t\t\t\tEnableFiberSafeOptimizations=\"true\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tBufferSecurityCheck=\"false\"\r\n\t\t\t\tEnableEnhancedInstructionSet=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Profile|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"0\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tAdditionalOptions=\"/Ob0\"\r\n\t\t\t\tEnableIntrinsicFunctions=\"true\"\r\n\t\t\t\tFavorSizeOrSpeed=\"1\"\r\n\t\t\t\tOmitFramePointers=\"true\"\r\n\t\t\t\tEnableFiberSafeOptimizations=\"true\"\r\n\t\t\t\tWholeProgramOptimization=\"false\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tBufferSecurityCheck=\"false\"\r\n\t\t\t\tEnableEnhancedInstructionSet=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\original.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\proxy_collector.cpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\rtl.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.cpp\"\r\n\t\t\t>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/proxy_collector/proxy_collector.cpp",
    "content": "#include \"stdafx.h\"\r\n#include <stdint.h>\r\n#include \"../../relacy/relacy_std.hpp\"\r\n\r\n\r\nstruct pc_sys_anchor;\r\nstruct pc_region;\r\nstruct pc_master;\r\ntypedef pc_region pc_node;\r\ntypedef void (pc_fp_dtor) (pc_region*);\r\n\r\nstruct pc_sys_anchor\r\n{\r\n    int refcnt;\r\n    pc_region* region;\r\n\r\n    pc_sys_anchor()\r\n    {\r\n    }\r\n\r\n    pc_sys_anchor(int rc, pc_region* r = 0)\r\n    {\r\n        refcnt = rc;\r\n        region = r;\r\n    }\r\n\r\n    bool operator == (pc_sys_anchor const& right) const\r\n    {\r\n        return refcnt == right.refcnt\r\n            && region == right.region;\r\n    }\r\n\r\n    pc_sys_anchor operator + (pc_sys_anchor const& right) const\r\n    {\r\n        pc_sys_anchor res;\r\n        res.refcnt = refcnt + right.refcnt;\r\n        res.region = (pc_region*)((intptr_t)region + (intptr_t)right.region);\r\n        return res;\r\n    }\r\n\r\n    pc_sys_anchor operator - (pc_sys_anchor const& right) const\r\n    {\r\n        pc_sys_anchor res;\r\n        res.refcnt = refcnt - right.refcnt;\r\n        res.region = (pc_region*)((intptr_t)region - (intptr_t)right.region);\r\n        return res;\r\n    }\r\n};\r\n\r\nstd::ostream& operator << (std::ostream& s, pc_sys_anchor const& right)\r\n{\r\n    return s << \"{\" << right.refcnt << \",\" << right.region << \"}\";\r\n}\r\n\r\nstruct pc_region\r\n{\r\n    std::atomic<pc_sys_anchor> next;\r\n    std::atomic<pc_region*> defer;\r\n\r\n    pc_region()\r\n    {\r\n        next($) = pc_sys_anchor(0, 0);\r\n        defer($) = 0;\r\n    }\r\n\r\n    void link(pc_region* next)\r\n    {\r\n        defer.store(next, rl::memory_order_relaxed);\r\n    }\r\n\r\n    void defer_node(pc_region* node)\r\n    {\r\n        pc_region* region = defer.exchange(node, rl::memory_order_release);\r\n        node->defer.store(region, rl::memory_order_relaxed);\r\n    }\r\n};\r\n\r\nstruct pc_master\r\n{\r\n    std::atomic<pc_sys_anchor> head;\r\n    pc_region stub_region;\r\n    pc_fp_dtor* fp_dtor;\r\n\r\n    pc_master(pc_fp_dtor* const dtor)\r\n    {\r\n        pc_sys_anchor src (0, &stub_region);\r\n        head.store(src, rl::memory_order_relaxed);\r\n        fp_dtor = dtor;\r\n    }\r\n\r\n    pc_region* acquire()\r\n    {\r\n        pc_sys_anchor cmp (head.load(rl::memory_order_relaxed));\r\n        pc_sys_anchor xchg;\r\n        do\r\n        {\r\n            xchg.refcnt = cmp.refcnt + 2;\r\n            xchg.region = cmp.region;\r\n        }\r\n        while (false == head.compare_exchange_weak(cmp, xchg, rl::memory_order_acquire));\r\n        return cmp.region;\r\n    }\r\n\r\n    void release(pc_region* region)\r\n    {\r\n        pc_sys_anchor prev = region->next.fetch_sub(2, rl::memory_order_acq_rel);\r\n        if (prev.refcnt == 3)\r\n            sys_dtor(region);\r\n    }\r\n\r\n    void mutate(pc_region* node)\r\n    {\r\n        pc_sys_anchor src (2, 0);\r\n        node->next.store(src, rl::memory_order_relaxed);\r\n        pc_sys_anchor xchg (0, node);\r\n        pc_sys_anchor cmp = head.load(rl::memory_order_relaxed);\r\n        while (false == head.compare_exchange_weak(cmp, xchg, std::memory_order_acq_rel));\r\n\r\n        pc_sys_anchor cmp2 = cmp.region->next.load(rl::memory_order_relaxed);\r\n        pc_sys_anchor xchg2;\r\n        do\r\n        {\r\n            xchg2 = pc_sys_anchor(cmp2.refcnt, node);\r\n        }\r\n        while (false == cmp.region->next.compare_exchange_weak(cmp2, xchg2, rl::memory_order_release));\r\n\r\n        pc_sys_anchor prev = cmp.region->next.fetch_add(cmp.refcnt + 1, rl::memory_order_acq_rel);\r\n        if (prev.refcnt == -cmp.refcnt)\r\n            sys_dtor(cmp.region);\r\n    }\r\n\r\n    void sys_dtor(pc_region* region)\r\n    {\r\n        int reset = 0;\r\n        pc_region* head = region;\r\n        pc_region* tail = region;\r\n        pc_sys_anchor nx = region->next.load(rl::memory_order_relaxed);\r\n        pc_region* next = nx.region;\r\n\r\n        while (next)\r\n        {\r\n            pc_sys_anchor prev = next->next.fetch_sub(2, rl::memory_order_acq_rel);\r\n            if (prev.refcnt != 3)\r\n                break;\r\n            tail = next;\r\n            nx = next->next.load(rl::memory_order_relaxed);\r\n            next = nx.region;\r\n        }\r\n\r\n        nx = tail->next.load(rl::memory_order_relaxed);\r\n        nx.region = 0;\r\n        tail->next.store(nx, rl::memory_order_relaxed);\r\n\r\n        while (head)\r\n        {\r\n            nx = head->next.load(rl::memory_order_relaxed);\r\n            pc_region* const next = nx.region;\r\n\r\n            pc_region* defer = head->defer.load(rl::memory_order_relaxed);\r\n\r\n            nx = head->next.load(rl::memory_order_relaxed);\r\n            RL_ASSERT(nx.refcnt == 1);\r\n\r\n            if (head != &stub_region)\r\n            {\r\n                head->defer.store(defer, rl::memory_order_relaxed);\r\n                defer = head;\r\n            }\r\n            else\r\n            {\r\n                reset = 1;\r\n            }\r\n\r\n            while (defer)\r\n            {\r\n                pc_region* const next = defer->defer.load(rl::memory_order_relaxed);\r\n                fp_dtor(defer);\r\n                defer = next;\r\n            }\r\n            head = next;\r\n        }\r\n\r\n        if (reset)\r\n        {\r\n            stub_region.defer.store(0, rl::memory_order_relaxed);\r\n            mutate(&stub_region);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct foo_node\r\n{\r\n    pc_node pcn;\r\n    std::atomic<foo_node*> next;\r\n    rl::var<int> data;\r\n};\r\n\r\nvoid foo_node_dtor(pc_node* pcn)\r\n{\r\n    // yes, very fragile\r\n    foo_node* const n = (foo_node*)pcn;\r\n    delete n;\r\n}\r\n\r\nstruct foo_list\r\n{\r\n    std::atomic<foo_node*> head;\r\n    pc_master pc;\r\n\r\n    foo_list()\r\n        : head(0)\r\n        , pc(foo_node_dtor)\r\n    {\r\n    }\r\n};\r\n\r\nstruct proxy_collector_test : rl::test_suite<proxy_collector_test, 4>\r\n{\r\n    foo_list m_list;\r\n\r\n    void before()\r\n    {\r\n        m_list.head($) = 0;\r\n    }\r\n\r\n    void after()\r\n    {\r\n        foo_node* node = new foo_node;\r\n        m_list.pc.mutate(&node->pcn);\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (index < 2)\r\n        {\r\n            pc_region* pcr = m_list.pc.acquire();\r\n            for (int i = 0; i != 4; ++i)\r\n            {\r\n                foo_node* node = m_list.head.load(rl::memory_order_acquire);\r\n                while (node)\r\n                {\r\n                    foo_node* const next = node->next.load(rl::memory_order_acquire);\r\n                    intptr_t volatile data = node->data($);\r\n                    (void)data;\r\n                    node = next;\r\n                }\r\n                if (2 == i)\r\n                {\r\n                    m_list.pc.release(pcr);\r\n                    pcr = m_list.pc.acquire();\r\n                }\r\n            }\r\n            m_list.pc.release(pcr);\r\n        }\r\n        else\r\n        {\r\n            pc_region* pcr = m_list.pc.acquire();\r\n            for (int i = 0; i != 4; ++i)\r\n            {\r\n                if (0 == (i % 2))\r\n                {\r\n                    foo_node* node = new foo_node;\r\n                    node->data($) = 1;\r\n                    foo_node* cmp = m_list.head.load(rl::memory_order_relaxed);\r\n                    do\r\n                    {\r\n                        node->next.store(cmp, rl::memory_order_relaxed);\r\n                    }\r\n                    while (false == m_list.head.compare_exchange_weak(cmp, node, rl::memory_order_release));\r\n                }\r\n                else\r\n                {\r\n                    foo_node* node = m_list.head.load(rl::memory_order_acquire);\r\n                    foo_node* next;\r\n                    do\r\n                    {\r\n                        if (0 == node)\r\n                            break;\r\n                        next = node->next.load(rl::memory_order_relaxed);\r\n                    }\r\n                    while (false == m_list.head.compare_exchange_weak(node, next, rl::memory_order_acquire));\r\n\r\n                    if (node)\r\n                    {\r\n                        //if (1 == i)\r\n                        {\r\n                            m_list.pc.mutate(&node->pcn);\r\n                        }\r\n                        //else\r\n                        //{\r\n                        //    pcr->defer_node(&node->pcn);\r\n                        //}\r\n                    }\r\n                }\r\n                if (i % 2)\r\n                {\r\n                    m_list.pc.release(pcr);\r\n                    pcr = m_list.pc.acquire();\r\n                }\r\n            }\r\n            m_list.pc.release(pcr);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nint main()\r\n{\r\n    rl::test_params params;\r\n    params.iteration_count = 1000;\r\n    rl::simulate<proxy_collector_test>(params);\r\n}\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/proxy_collector/stdafx.cpp",
    "content": "#include \"stdafx.h\"\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/proxy_collector/stdafx.h",
    "content": "#pragma once\r\n\r\n#ifdef NDEBUG\r\n#   define _SECURE_SCL 0\r\n#endif\r\n\r\n#include \"../../relacy/pch.hpp\"\r\n\r\n#include <sstream>\r\n\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/ref_counting/msvc8/ref_counting.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 9.00\r\n# Visual Studio 2005\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"ref_counting\", \"ref_counting.vcproj\", \"{31994C0C-3BAD-4F25-8BC8-3206FF349B28}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tRelease|Win32 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B28}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B28}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B28}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B28}.Release|Win32.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/ref_counting/msvc8/ref_counting.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"ref_counting\"\r\n\tProjectGUID=\"{31994C0C-3BAD-4F25-8BC8-3206FF349B28}\"\r\n\tRootNamespace=\"ref_counting\"\r\n\tKeyword=\"Win32Proj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tInlineFunctionExpansion=\"2\"\r\n\t\t\t\tEnableIntrinsicFunctions=\"true\"\r\n\t\t\t\tFavorSizeOrSpeed=\"1\"\r\n\t\t\t\tOmitFramePointers=\"true\"\r\n\t\t\t\tEnableFiberSafeOptimizations=\"true\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tBufferSecurityCheck=\"false\"\r\n\t\t\t\tEnableEnhancedInstructionSet=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\ref_counting.cpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.cpp\"\r\n\t\t\t>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/ref_counting/msvc9/ref_counting.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 10.00\r\n# Visual Studio 2008\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"ref_counting\", \"ref_counting.vcproj\", \"{31994C0C-3BAD-4F25-8BC8-3206FF349B28}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tRelease|Win32 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B28}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B28}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B28}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B28}.Release|Win32.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/ref_counting/msvc9/ref_counting.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"9,00\"\r\n\tName=\"ref_counting\"\r\n\tProjectGUID=\"{31994C0C-3BAD-4F25-8BC8-3206FF349B28}\"\r\n\tRootNamespace=\"ref_counting\"\r\n\tKeyword=\"Win32Proj\"\r\n\tTargetFrameworkVersion=\"131072\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tRandomizedBaseAddress=\"1\"\r\n\t\t\t\tDataExecutionPrevention=\"0\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tInlineFunctionExpansion=\"2\"\r\n\t\t\t\tEnableIntrinsicFunctions=\"true\"\r\n\t\t\t\tFavorSizeOrSpeed=\"1\"\r\n\t\t\t\tOmitFramePointers=\"true\"\r\n\t\t\t\tEnableFiberSafeOptimizations=\"true\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tBufferSecurityCheck=\"false\"\r\n\t\t\t\tEnableEnhancedInstructionSet=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tRandomizedBaseAddress=\"1\"\r\n\t\t\t\tDataExecutionPrevention=\"0\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\ref_counting.cpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.cpp\"\r\n\t\t\t>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/ref_counting/ref_counting.cpp",
    "content": "#include \"stdafx.h\"\r\n\r\n#include \"../../relacy/relacy_std.hpp\"\r\n\r\n\r\nstruct rc_object\r\n{\r\n    std::atomic<int> rc;\r\n    rl::var<int> data;\r\n\r\n    void acquire()\r\n    {\r\n        rc.fetch_add(1, rl::memory_order_acquire);\r\n    }\r\n\r\n    void release()\r\n    {\r\n        if (1 == rc.fetch_sub(1, rl::memory_order_release))\r\n        {\r\n            rc.load(rl::memory_order_acquire);\r\n            data($) = 0;\r\n            delete this;\r\n        }\r\n    }\r\n\r\n    rc_object(int data)\r\n        : rc(1)\r\n        , data(data)\r\n    {\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nvoid post_to_channel(rl::atomic<rc_object*>& ch, rc_object* obj)\r\n{\r\n    obj->acquire();\r\n    rl::backoff b;\r\n    for (;;)\r\n    {\r\n        rc_object* cmp = 0;\r\n        if (ch.compare_exchange_weak(cmp, obj, rl::memory_order_release))\r\n            break;\r\n        b.yield($);\r\n    }\r\n}\r\n\r\nrc_object* get_from_channel(rl::atomic<rc_object*>& ch)\r\n{\r\n    return ch.exchange(0, rl::memory_order_acquire);\r\n}\r\n\r\n\r\n\r\n\r\nstruct ref_counting_test : rl::test_suite<ref_counting_test, 2>\r\n{\r\n    std::atomic<rc_object*> channel;\r\n\r\n    void before()\r\n    {\r\n        channel($) = 0;\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            rc_object* obj = new rc_object (rand());\r\n            post_to_channel(channel, obj);\r\n            int data = obj->data($);\r\n            (void)data;\r\n            obj->release();\r\n        }\r\n        else if (1 == index)\r\n        {\r\n            rl::backoff b;\r\n            for (;;)\r\n            {\r\n                rc_object* obj = get_from_channel(channel);\r\n                if (obj)\r\n                {\r\n                    int data = obj->data($);\r\n                    (void)data;\r\n                    obj->release();\r\n                    break;\r\n                }\r\n                else\r\n                {\r\n                    b.yield($);\r\n                }\r\n            }\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct ref_counting_test2 : rl::test_suite<ref_counting_test2, 3>\r\n{\r\n    std::atomic<rc_object*> channel01;\r\n    std::atomic<rc_object*> channel02;\r\n    std::atomic<rc_object*> channel12;\r\n    std::atomic<rc_object*> channel21;\r\n\r\n    void before()\r\n    {\r\n        channel01($) = 0;\r\n        channel02($) = 0;\r\n        channel12($) = 0;\r\n        channel21($) = 0;\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            {\r\n                rc_object* obj1 = new rc_object (rand());\r\n                post_to_channel(channel01, obj1);\r\n                volatile int data = obj1->data($);\r\n                (void)data;\r\n                obj1->release();\r\n            }\r\n\r\n            {\r\n                rc_object* obj2 = new rc_object (rand());\r\n                post_to_channel(channel02, obj2);\r\n                volatile int data = obj2->data($);\r\n                (void)data;\r\n                obj2->release();\r\n            }\r\n        }\r\n        else if (1 == index)\r\n        {\r\n            rl::backoff b;\r\n            bool ch0 = false;\r\n            bool ch2 = false;\r\n            while (!ch0 || !ch2)\r\n            {\r\n                {\r\n                    rc_object* obj = get_from_channel(channel01);\r\n                    if (obj)\r\n                    {\r\n                        post_to_channel(channel12, obj);\r\n                        volatile int data = obj->data($);\r\n                        (void)data;\r\n                        obj->release();\r\n                        ch0 = true;\r\n                    }\r\n                    else\r\n                    {\r\n                        b.yield($);\r\n                    }\r\n                }\r\n                {\r\n                    rc_object* obj = get_from_channel(channel21);\r\n                    if (obj)\r\n                    {\r\n                        volatile int data = obj->data($);\r\n                        (void)data;\r\n                        obj->release();\r\n                        ch2 = true;\r\n                    }\r\n                    else\r\n                    {\r\n                        b.yield($);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        else\r\n        {\r\n            rl::backoff b;\r\n            bool ch0 = false;\r\n            bool ch1 = false;\r\n            while (!ch0 || !ch1)\r\n            {\r\n                {\r\n                    rc_object* obj = get_from_channel(channel02);\r\n                    if (obj)\r\n                    {\r\n                        post_to_channel(channel21, obj);\r\n                        volatile int data = obj->data($);\r\n                        (void)data;\r\n                        obj->release();\r\n                        ch0 = true;\r\n                    }\r\n                    else\r\n                    {\r\n                        b.yield($);\r\n                    }\r\n                }\r\n                {\r\n                    rc_object* obj = get_from_channel(channel12);\r\n                    if (obj)\r\n                    {\r\n                        volatile int data = obj->data($);\r\n                        (void)data;\r\n                        obj->release();\r\n                        ch1 = true;\r\n                    }\r\n                    else\r\n                    {\r\n                        b.yield($);\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct ref_counting_test3 : rl::test_suite<ref_counting_test3, 2>\r\n{\r\n    std::atomic<rc_object*> channel;\r\n\r\n    void before()\r\n    {\r\n        channel($) = 0;\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            rc_object* obj = new rc_object (rand());\r\n            post_to_channel(channel, obj);\r\n            volatile int data = obj->data($);\r\n            (void)data;\r\n            obj->release();\r\n        }\r\n        else if (1 == index)\r\n        {\r\n            rl::backoff b;\r\n            rc_object* obj = 0;\r\n            for (;;)\r\n            {\r\n                obj = get_from_channel(channel);\r\n                if (obj)\r\n                    break;\r\n                else\r\n                    b.yield($);\r\n            }\r\n            obj->acquire();\r\n            obj->release();\r\n            //volatile int data = obj->data($);\r\n            //(void)data;\r\n            obj->release();\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nint main()\r\n{\r\n    rl::test_params params;\r\n    params.context_bound = 2;\r\n    params.iteration_count = 10000;\r\n    rl::simulate<ref_counting_test>(params);\r\n    std::cout << \"count: \" << params.stop_iteration << std::endl;\r\n}\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/ref_counting/stdafx.cpp",
    "content": "#include \"stdafx.h\"\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/ref_counting/stdafx.h",
    "content": "#pragma once\r\n\r\n#ifdef NDEBUG\r\n#   define _SECURE_SCL 0\r\n#endif\r\n\r\n#include \"../../relacy/pch.hpp\"\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/smr/g++/Makefile",
    "content": "TARGET=smr\nSRC=smr.cpp\nHEADERS=stdafx.h\n\nall: ${TARGET}\n\n${TARGET}: Makefile ${SRC} ${HEADERS}\n\tg++ ${SRC} -O3 -g -o ${TARGET}\n\nclean:\n\trm ${TARGET}\n"
  },
  {
    "path": "tests/relacy/relacy/example/smr/msvc8/smr.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 9.00\r\n# Visual Studio 2005\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"smr\", \"smr.vcproj\", \"{BC168133-5E3D-4691-BA15-8E0FD61DFDB5}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tRelease|Win32 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{BC168133-5E3D-4691-BA15-8E0FD61DFDB5}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{BC168133-5E3D-4691-BA15-8E0FD61DFDB5}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{BC168133-5E3D-4691-BA15-8E0FD61DFDB5}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{BC168133-5E3D-4691-BA15-8E0FD61DFDB5}.Release|Win32.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/smr/msvc8/smr.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"smr\"\r\n\tProjectGUID=\"{BC168133-5E3D-4691-BA15-8E0FD61DFDB5}\"\r\n\tRootNamespace=\"smr\"\r\n\tKeyword=\"Win32Proj\"\r\n\tTargetFrameworkVersion=\"196613\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"2\"\r\n\t\t\t\tEnableIntrinsicFunctions=\"true\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tEnableFunctionLevelLinking=\"true\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\smr.cpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.cpp\"\r\n\t\t\t>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/smr/msvc9/smr.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 10.00\r\n# Visual Studio 2008\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"smr\", \"smr.vcproj\", \"{BC168133-5E3D-4691-BA15-8E0FD61DFDB5}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tRelease|Win32 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{BC168133-5E3D-4691-BA15-8E0FD61DFDB5}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{BC168133-5E3D-4691-BA15-8E0FD61DFDB5}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{BC168133-5E3D-4691-BA15-8E0FD61DFDB5}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{BC168133-5E3D-4691-BA15-8E0FD61DFDB5}.Release|Win32.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/smr/msvc9/smr.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"9,00\"\r\n\tName=\"smr\"\r\n\tProjectGUID=\"{BC168133-5E3D-4691-BA15-8E0FD61DFDB5}\"\r\n\tRootNamespace=\"smr\"\r\n\tKeyword=\"Win32Proj\"\r\n\tTargetFrameworkVersion=\"196613\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"2\"\r\n\t\t\t\tEnableIntrinsicFunctions=\"true\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tEnableFunctionLevelLinking=\"true\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\smr.cpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.cpp\"\r\n\t\t\t>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/smr/smr.cpp",
    "content": "#include \"stdafx.h\"\r\n\r\n#include \"../../relacy/relacy_std.hpp\"\r\n\r\n\r\nunsigned const thread_count = 3;\r\nunsigned const node_count = 6;\r\n\r\n\r\nstruct smr_test : rl::test_suite<smr_test, thread_count>\r\n{\r\n    struct node\r\n    {\r\n        std::atomic<node*> next_;\r\n        rl::var<int> data_;\r\n    };\r\n\r\n    std::atomic<node*> head_;\r\n\r\n    std::atomic<node*> hp_ [thread_count];\r\n    rl::var<node*> defer_ [thread_count][thread_count];\r\n    rl::var<int> defer_size_ [thread_count];\r\n\r\n    void before()\r\n    {\r\n        head_.store(0, std::memory_order_relaxed);\r\n\r\n        for (size_t i = 0; i != thread_count; ++i)\r\n        {\r\n            hp_[i].store(0, std::memory_order_relaxed);\r\n            VAR(defer_size_[i]) = 0;\r\n            for (size_t j = 0; j != thread_count; ++j)\r\n                VAR(defer_[i][j]) = 0;\r\n        }\r\n    }\r\n\r\n    void push(unsigned index, int data)\r\n    {\r\n        node* n = new node ();\r\n        n->VAR(data_) = data;\r\n        node* next = head_.load(std::memory_order_relaxed);\r\n        for (;;)\r\n        {\r\n            n->next_.store(next, rl::memory_order_relaxed);\r\n            if (head_.compare_exchange_weak(next, n, rl::memory_order_release))\r\n                break;\r\n        }\r\n    }\r\n\r\n    int pop(unsigned index)\r\n    {\r\n        node* n = 0;\r\n        for (;;)\r\n        {\r\n            n = smr_acquire(index, head_);\r\n            if (0 == n)\r\n                break;\r\n            node* next = n->next_.load(rl::memory_order_relaxed);\r\n            if (head_.compare_exchange_weak(n, next, rl::memory_order_acquire))\r\n                break;\r\n            smr_release(index);\r\n        }\r\n        smr_release(index);\r\n        if (n)\r\n        {\r\n            int data = n->VAR(data_);\r\n            smr_defer(index, n);\r\n            return data;\r\n        }\r\n        else\r\n        {\r\n            return 0;\r\n        }\r\n    }\r\n\r\n    void smr_pump(unsigned index)\r\n    {\r\n        node* hp [thread_count] = {};\r\n        for (size_t i = 0; i != thread_count; ++i)\r\n        {\r\n            hp[i] = hp_[i].load(std::memory_order_relaxed);\r\n        }\r\n\r\n        for (size_t i = 0; i != thread_count; ++i)\r\n        {\r\n            node* nn = VAR(defer_[index][i]);\r\n            if (nn)\r\n            {\r\n                for (size_t j = 0; j != thread_count; ++j)\r\n                {\r\n                    if (nn == hp[j])\r\n                    {\r\n                        nn = 0;\r\n                        break;\r\n                    }\r\n                }\r\n                if (nn)\r\n                {\r\n                    VAR(defer_[index][i]) = 0;\r\n                    VAR(defer_size_[index]) -= 1;\r\n                    delete nn;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    void smr_defer(unsigned index, node* n)\r\n    {\r\n        std::atomic_thread_fence(std::memory_order_seq_cst);\r\n\r\n        smr_pump(index);\r\n\r\n        if (VAR(defer_size_[index]) == thread_count)\r\n        {\r\n            delete n;\r\n        }\r\n        else\r\n        {\r\n            bool found = false;\r\n            for (size_t i = 0; i != thread_count; ++i)\r\n            {\r\n                if (VAR(defer_[index][i]) == 0)\r\n                {\r\n                    VAR(defer_[index][i]) = n;\r\n                    found = true;\r\n                    break;\r\n                }\r\n            }\r\n            RL_ASSERT(found);\r\n            VAR(defer_size_[index]) += 1;\r\n        }\r\n    }\r\n\r\n    node* smr_acquire(unsigned index, std::atomic<node*>& n)\r\n    {\r\n        node* v = 0;\r\n        for (;;)\r\n        {\r\n            v = n.load(std::memory_order_relaxed);\r\n            hp_[index].store(v, std::memory_order_relaxed);\r\n            std::atomic_thread_fence(std::memory_order_seq_cst);\r\n            node* v2 = n.load(std::memory_order_acquire);\r\n            if (v2 == v)\r\n                break;\r\n        }\r\n        return v;\r\n    }\r\n\r\n    void smr_release(unsigned index)\r\n    {\r\n        hp_[index].store(0, std::memory_order_relaxed);\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        for (unsigned i = 0; i != node_count; ++i)\r\n        {\r\n            push(index, index * thread_count + i + 1);\r\n        }\r\n        for (unsigned i = 0; i != node_count; ++i)\r\n        {\r\n            int data = pop(index);\r\n            RL_ASSERT(0 != data);\r\n        }\r\n    }\r\n\r\n    void after()\r\n    {\r\n        for (unsigned i = 0; i != ::thread_count; ++i)\r\n        {\r\n            smr_pump(i);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nint main()\r\n{\r\n    rl::test_params p;\r\n    //p.collect_history = true;\r\n    //p.output_history = true;\r\n    //p.initial_state = \"991172\";\r\n    p.iteration_count = 1000;\r\n    rl::simulate<smr_test>(p);\r\n}\r\n\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/smr/stdafx.cpp",
    "content": "#include \"stdafx.h\"\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/smr/stdafx.h",
    "content": "#pragma once\r\n\r\n#ifdef NDEBUG\r\n#   define _SECURE_SCL 0\r\n#endif\r\n\r\n#define RL_MSVC_OUTPUT\r\n\r\n#include \"../../relacy/pch.hpp\"\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/spsc_queue/msvc8/spsc_queue.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 9.00\r\n# Visual Studio 2005\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"spsc_queue\", \"spsc_queue.vcproj\", \"{2F0B1A3B-27CA-47D4-A9D1-5EC66BB0A85B}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tRelease|Win32 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{2F0B1A3B-27CA-47D4-A9D1-5EC66BB0A85B}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{2F0B1A3B-27CA-47D4-A9D1-5EC66BB0A85B}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{2F0B1A3B-27CA-47D4-A9D1-5EC66BB0A85B}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{2F0B1A3B-27CA-47D4-A9D1-5EC66BB0A85B}.Release|Win32.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/spsc_queue/msvc8/spsc_queue.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"spsc_queue\"\r\n\tProjectGUID=\"{2F0B1A3B-27CA-47D4-A9D1-5EC66BB0A85B}\"\r\n\tRootNamespace=\"spsc_queue\"\r\n\tKeyword=\"Win32Proj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"../..\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tAdditionalIncludeDirectories=\"../../..\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\spsc_queue.cpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.cpp\"\r\n\t\t\t>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\tObjectFile=\"$(IntDir)\\$(InputName)1.obj\"\r\n\t\t\t\t\tXMLDocumentationFileName=\"$(IntDir)\\$(InputName)1.xdc\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\tObjectFile=\"$(IntDir)\\$(InputName)1.obj\"\r\n\t\t\t\t\tXMLDocumentationFileName=\"$(IntDir)\\$(InputName)1.xdc\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/spsc_queue/msvc9/spsc_queue.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 10.00\r\n# Visual Studio 2008\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"spsc_queue\", \"spsc_queue.vcproj\", \"{D4756EE9-3953-4E17-B1B5-E89F853303C1}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tRelease|Win32 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Release|Win32.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/spsc_queue/msvc9/spsc_queue.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"9.00\"\r\n\tName=\"spsc_queue\"\r\n\tProjectGUID=\"{3F32C4FA-E451-42BC-9E65-74129120B6E4}\"\r\n\tRootNamespace=\"spsc_queue\"\r\n\tKeyword=\"Win32Proj\"\r\n\tTargetFrameworkVersion=\"131072\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tRandomizedBaseAddress=\"1\"\r\n\t\t\t\tDataExecutionPrevention=\"0\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tRandomizedBaseAddress=\"1\"\r\n\t\t\t\tDataExecutionPrevention=\"0\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\spsc_queue.cpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.cpp\"\r\n\t\t\t>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/spsc_queue/spsc_queue.cpp",
    "content": "#include \"stdafx.h\"\r\n#include \"../../relacy/relacy_std.hpp\"\r\n\r\ntemplate<typename T>\r\nclass nonblocking_spsc_queue\r\n{\r\npublic:\r\n    nonblocking_spsc_queue()\r\n    {\r\n        node* n = new node ();\r\n        VAR(head) = n;\r\n        VAR(tail) = n;\r\n    }\r\n\r\n    ~nonblocking_spsc_queue()\r\n    {\r\n        RL_ASSERT(VAR(head) == VAR(tail));\r\n        delete (node*)VAR(head);\r\n    }\r\n\r\n    void enqueue(T data)\r\n    {\r\n        node* n = new node (data);\r\n        VAR(head)->next.store(n, std::memory_order_release); \r\n        VAR(head) = n;\r\n    }\r\n\r\n    bool dequeue(T& data)\r\n    {\r\n        node* t = VAR(tail);\r\n        node* n = t->next.load(std::memory_order_acquire);\r\n        if (0 == n)\r\n            return false;\r\n        data = n->VAR(data);\r\n        delete t;\r\n        VAR(tail) = n;\r\n        return true;\r\n    }\r\n\r\nprivate:\r\n    struct node\r\n    {\r\n        std::atomic<node*> next;\r\n        VAR_T(T) data;\r\n\r\n        node(T data = T())\r\n            : next(0)\r\n            , data(data)\r\n        {}\r\n    };\r\n\r\n    VAR_T(node*) head;\r\n    VAR_T(node*) tail;\r\n};\r\n\r\nstruct nonblocking_spsc_queue_test : rl::test_suite<nonblocking_spsc_queue_test, 2>\r\n{\r\n    nonblocking_spsc_queue<int> q;\r\n\r\n    void thread(unsigned thread_index)\r\n    {\r\n        if (0 == thread_index)\r\n        {\r\n            q.enqueue(11);\r\n        }\r\n        else\r\n        {\r\n            int data = 0;\r\n            while (false == q.dequeue(data))\r\n            {}\r\n            RL_ASSERT(11 == data);\r\n        }\r\n    }\r\n};\r\n\r\n\r\nclass eventcount\r\n{\r\npublic:\r\n    eventcount()\r\n        : count(0)\r\n        , waiters(0)\r\n    {}\r\n\r\n    void signal_relaxed()\r\n    {\r\n        unsigned cmp = count.load(std::memory_order_relaxed);\r\n        signal_impl(cmp);\r\n    }\r\n\r\n    void signal()\r\n    {\r\n        unsigned cmp = count.fetch_add(0, std::memory_order_seq_cst);\r\n        signal_impl(cmp);\r\n    }\r\n\r\n    unsigned get()\r\n    {\r\n        unsigned cmp = count.fetch_or(0x80000000, std::memory_order_acquire);\r\n        return cmp & 0x7FFFFFFF;\r\n    }\r\n\r\n    void wait(unsigned cmp)\r\n    {\r\n        unsigned ec = count.load(std::memory_order_seq_cst);\r\n        if (cmp == (ec & 0x7FFFFFFF))\r\n        {\r\n            guard.lock($);\r\n            ec = count.load(std::memory_order_seq_cst);\r\n            if (cmp == (ec & 0x7FFFFFFF))\r\n            {\r\n                waiters($) += 1;\r\n                cv.wait(guard, $);\r\n            }\r\n            guard.unlock($);\r\n        }\r\n    }\r\n\r\nprivate:\r\n    std::atomic<unsigned> count;\r\n    VAR_T(unsigned) waiters;\r\n    std::mutex guard;\r\n    std::condition_variable cv;\r\n\r\n    void signal_impl(unsigned cmp)\r\n    {\r\n        if (cmp & 0x80000000)\r\n        {\r\n            guard.lock($);\r\n            while (false == count.compare_exchange_weak(cmp,\r\n                (cmp + 1) & 0x7FFFFFFF, std::memory_order_relaxed));\r\n            unsigned w = VAR(waiters);\r\n            VAR(waiters) = 0;\r\n            guard.unlock($);\r\n            if (w)\r\n                cv.notify_all($);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\ntemplate<typename T>\r\nclass spsc_queue : nonblocking_spsc_queue<T>\r\n{\r\npublic:\r\n    typedef nonblocking_spsc_queue<T> base_t;\r\n\r\n    void enqueue(T data)\r\n    {\r\n        base_t::enqueue(data);\r\n        ec.signal/*_relaxed*/();\r\n    }\r\n\r\n    T dequeue()\r\n    {\r\n        T data;\r\n        bool res = base_t::dequeue(data);\r\n        while (false == res)\r\n        {\r\n            int cmp = ec.get();\r\n            res = base_t::dequeue(data);\r\n            if (res)\r\n                break;\r\n            ec.wait(cmp);\r\n            res = base_t::dequeue(data);\r\n            if (res)\r\n                break;\r\n        }\r\n        return data;\r\n    }\r\n\r\nprivate:\r\n    eventcount ec;\r\n};\r\n\r\n\r\nstruct spsc_queue_test : rl::test_suite<spsc_queue_test, 2>\r\n{\r\n    spsc_queue<int> q;\r\n\r\n    void thread(unsigned thread_index)\r\n    {\r\n        if (0 == thread_index)\r\n        {\r\n            q.enqueue(11);\r\n        }\r\n        else\r\n        {\r\n            int d = q.dequeue();\r\n            RL_ASSERT(11 == d);\r\n        }\r\n    }\r\n};\r\n\r\n\r\nint main()\r\n{\r\n    rl::simulate<nonblocking_spsc_queue_test>();\r\n    rl::simulate<spsc_queue_test>();\r\n}\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/spsc_queue/stdafx.cpp",
    "content": "#include \"stdafx.h\"\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/spsc_queue/stdafx.h",
    "content": "#pragma once\r\n\r\n#ifdef NDEBUG\r\n#   define _SECURE_SCL 0\r\n#endif\r\n\r\n//#define RL_MSVC_OUTPUT\r\n\r\n#include \"../../relacy/pch.hpp\"\r\n#include \"../../relacy/relacy_std.hpp\"\r\n\r\n\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/stack/DESCRIPTION.TXT",
    "content": "lock-free stack\r\ncode contains several bugs: access to freed memory and ABA problem\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/stack/msvc8/stack.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 9.00\r\n# Visual Studio 2005\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"stack\", \"stack.vcproj\", \"{4D6D7FC3-66D1-4F80-B434-2FDCBBFBC9F5}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tRelease|Win32 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{4D6D7FC3-66D1-4F80-B434-2FDCBBFBC9F5}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{4D6D7FC3-66D1-4F80-B434-2FDCBBFBC9F5}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{4D6D7FC3-66D1-4F80-B434-2FDCBBFBC9F5}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{4D6D7FC3-66D1-4F80-B434-2FDCBBFBC9F5}.Release|Win32.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/stack/msvc8/stack.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"stack\"\r\n\tProjectGUID=\"{4D6D7FC3-66D1-4F80-B434-2FDCBBFBC9F5}\"\r\n\tRootNamespace=\"stack\"\r\n\tKeyword=\"Win32Proj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stack.cpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.cpp\"\r\n\t\t\t>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/stack/msvc9/stack.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 10.00\r\n# Visual Studio 2008\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"stack\", \"stack.vcproj\", \"{4D6D7FC3-66D1-4F80-B434-2FDCBBFBC9F5}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tRelease|Win32 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{4D6D7FC3-66D1-4F80-B434-2FDCBBFBC9F5}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{4D6D7FC3-66D1-4F80-B434-2FDCBBFBC9F5}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{4D6D7FC3-66D1-4F80-B434-2FDCBBFBC9F5}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{4D6D7FC3-66D1-4F80-B434-2FDCBBFBC9F5}.Release|Win32.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/stack/msvc9/stack.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"9.00\"\r\n\tName=\"stack\"\r\n\tProjectGUID=\"{4D6D7FC3-66D1-4F80-B434-2FDCBBFBC9F5}\"\r\n\tRootNamespace=\"stack\"\r\n\tKeyword=\"Win32Proj\"\r\n\tTargetFrameworkVersion=\"0\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"1\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"0\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stack.cpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.cpp\"\r\n\t\t\t>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/stack/stack.cpp",
    "content": "#include \"stdafx.h\"\r\n\r\n#include \"../../relacy/relacy_std.hpp\"\r\n\r\n\r\n// TEST FAILS WITH \"ACCESS TO FREED MEMORY\"\r\n\r\nclass stack\r\n{\r\npublic:\r\n    stack()\r\n        : head_(0)\r\n    {\r\n    }\r\n\r\n    void push(int data)\r\n    {\r\n        rl::var<node*> n = new node ();\r\n        n($)->data_($) = data;\r\n        node* next = head_.load(rl::memory_order_relaxed);\r\n        for (;;)\r\n        {\r\n            n($)->next_.store(next, rl::memory_order_relaxed);\r\n            if (head_.compare_exchange_weak(next, n($), rl::memory_order_release))\r\n                break;\r\n        }\r\n    }\r\n\r\n    int pop()\r\n    {\r\n        node* n = head_.load(rl::memory_order_relaxed);\r\n        for (;;)\r\n        {\r\n            if (0 == n)\r\n                break;\r\n            node* next = n->next_.load(rl::memory_order_relaxed);\r\n            if (head_.compare_exchange_weak(n, next, rl::memory_order_acquire))\r\n                break;\r\n        }\r\n        if (n)\r\n        {\r\n            int data = n->data_($);\r\n            delete n;\r\n            return data;\r\n        }\r\n        else\r\n        {\r\n            return 0;\r\n        }\r\n    }\r\n\r\nprivate:\r\n    struct node\r\n    {\r\n        std::atomic<node*> next_;\r\n        rl::var<int> data_;\r\n    };\r\n\r\n    std::atomic<node*> head_;\r\n\r\n    stack(stack const&);\r\n    stack& operator = (stack const&);\r\n};\r\n\r\n\r\n\r\n\r\nstruct stack_test : rl::test_suite<stack_test, 4>\r\n{\r\n    stack s_;\r\n\r\n    int produced_count_;\r\n    int consumed_count_;\r\n\r\n    void before()\r\n    {\r\n        produced_count_ = 0;\r\n        consumed_count_ = 0;\r\n    }\r\n\r\n    void after()\r\n    {\r\n        typedef rl::test_suite<stack_test, 4> base_t;\r\n        RL_ASSERT(base_t::params::thread_count == produced_count_);\r\n        RL_ASSERT(base_t::params::thread_count == consumed_count_);\r\n    }\r\n\r\n    void thread(unsigned /*index*/)\r\n    {\r\n        s_.push(rand() + 1);\r\n        produced_count_ += 1;\r\n        int data = s_.pop();\r\n        RL_ASSERT(data);\r\n        consumed_count_ += 1;\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nint main()\r\n{\r\n    rl::simulate<stack_test>();\r\n}\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/stack/stdafx.cpp",
    "content": "#include \"stdafx.h\"\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/stack/stdafx.h",
    "content": "#pragma once\r\n\r\n#ifdef NDEBUG\r\n#   define _SECURE_SCL 0\r\n#endif\r\n\r\n#include \"../../relacy/pch.hpp\"\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/tbb_eventcount/eventcount.cpp",
    "content": "#include \"stdafx.h\"\r\n\r\n#include \"../../relacy/windows.h\"\r\n\r\n/*\r\n#define HANDLE rl::HANDLE\r\n\r\n#define CreateSemaphoreA rl::RL_CreateSemaphore($)\r\n#define CreateSemaphoreW rl::RL_CreateSemaphore($)\r\n#ifndef CreateSemaphore\r\n#   define CreateSemaphore CreateSemaphoreW\r\n#endif\r\n\r\n//#define CRITICAL_SECTION rl::CRITICAL_SECTION\r\n//#define InitializeCriticalSection rl::InitializeCriticalSection($)\r\n\r\n#define CloseHandle rl::RL_CloseHandle($)\r\n*/\r\n\r\n#include <stddef.h>\r\n\r\n\r\n#if defined(WIN32) && defined(_MSC_VER)\r\n\r\n#include <windows.h>\r\n#include <intrin.h>\r\n\r\nclass semaphore\r\n{\r\npublic:\r\n    semaphore()\r\n    {\r\n        h_ = rl::CreateSemaphore(0, 0, LONG_MAX, 0, $);\r\n    }\r\n\r\n    ~semaphore()\r\n    {\r\n        rl::CloseHandle(h_, $);\r\n    }\r\n\r\n    void wait()\r\n    {\r\n        rl::WaitForSingleObject(h_, rl::RL_INFINITE, $);\r\n    }\r\n\r\n    void post()\r\n    {\r\n        rl::ReleaseSemaphore(h_, 1, 0, $);\r\n    }\r\n\r\nprivate:\r\n    rl::HANDLE h_;\r\n\r\n    semaphore(semaphore const&);\r\n    semaphore& operator = (semaphore const&);\r\n};\r\n\r\nclass mutex\r\n{\r\npublic:\r\n    mutex()\r\n    {\r\n        rl::InitializeCriticalSection(&cs_, $);\r\n    }\r\n\r\n    ~mutex()\r\n    {\r\n        rl::DeleteCriticalSection(&cs_, $);\r\n    }\r\n\r\n    void lock()\r\n    {\r\n        rl::EnterCriticalSection(&cs_, $);\r\n    }\r\n\r\n    void unlock()\r\n    {\r\n        rl::LeaveCriticalSection(&cs_, $);\r\n    }\r\n\r\nprivate:\r\n    rl::CRITICAL_SECTION    cs_;\r\n\r\n    mutex(mutex const&);\r\n    mutex& operator = (mutex const&);\r\n};\r\n\r\n//void full_memory_fence()\r\n//{\r\n//    _mm_mfence();\r\n//}\r\n\r\n//#define THREAD_LOCAL __declspec(thread)\r\n\r\n#elif defined(POSIX) && defined(GCC)\r\n\r\n#include <pthread.h>\r\n#include <semaphore.h>\r\n\r\nclass semaphore\r\n{\r\npublic:\r\n    semaphore()\r\n    {\r\n        sem_init(&sem_, 0, 0);\r\n    }\r\n\r\n    ~semaphore()\r\n    {\r\n        sem_destroy(&sem_);\r\n    }\r\n\r\n    void wait()\r\n    {\r\n        sem_wait(&sem_);\r\n    }\r\n\r\n    void post()\r\n    {\r\n        sem_post(&sem_);\r\n    }\r\n\r\nprivate:\r\n    sem_t               sem_;\r\n\r\n    semaphore(semaphore const&);\r\n    semaphore& operator = (semaphore const&);\r\n};\r\n\r\nclass mutex\r\n{\r\npublic:\r\n    mutex()\r\n    {\r\n        pthread_mutex_init(&mutex_, 0);\r\n    }\r\n\r\n    ~mutex()\r\n    {\r\n        pthread_mutex_destroy(&mutex_);\r\n    }\r\n\r\n    void lock()\r\n    {\r\n        pthread_mutex_lock(&mutex_);\r\n    }\r\n\r\n    void unlock()\r\n    {\r\n        pthread_mutex_unlock(&mutex_);\r\n    }\r\n\r\nprivate:\r\n    pthread_mutex_t     mutex_;\r\n\r\n    mutex(mutex const&);\r\n    mutex& operator = (mutex const&);\r\n};\r\n\r\nvoid full_memory_fence()\r\n{\r\n    __sync_synchronize();\r\n}\r\n\r\n//#define THREAD_LOCAL __thread\r\n\r\n#endif\r\n\r\n\r\n\r\nclass lock\r\n{\r\npublic:\r\n    lock(mutex& m)\r\n        : m_(m)\r\n    {\r\n        m.lock();\r\n    }\r\n\r\n    ~lock()\r\n    {\r\n        m_.unlock();\r\n    }\r\n\r\nprivate:\r\n    mutex&              m_;\r\n\r\n    lock(lock const&);\r\n    lock& operator = (lock const&);\r\n};\r\n\r\n\r\n\r\n\r\n/** simple single-threaded double-linked list\r\n *  nothing interesting\r\n */\r\nclass dlist\r\n{\r\npublic:\r\n    struct node\r\n    {\r\n        rl::var<node*>  prev_;\r\n        rl::var<node*>  next_;\r\n\r\n        node()\r\n        {\r\n            prev_($) = 0;\r\n            next_($) = 0;\r\n        }\r\n    };\r\n\r\n    dlist()\r\n    {\r\n        reset();\r\n    }\r\n\r\n    void push(node* n)\r\n    {\r\n        size_t s = size_($).load(rl::memory_order_relaxed);\r\n        size_($).store(s + 1, rl::memory_order_relaxed);\r\n        n->next_($) = head_.next_($);\r\n        n->prev_($) = &head_;\r\n        head_.next_($)->prev_($) = n;\r\n        head_.next_($) = n;\r\n    }\r\n\r\n    node* pop()\r\n    {\r\n        if (size_($).load(rl::memory_order_relaxed) == 0)\r\n            return 0;\r\n        node* n = head_.next_($);\r\n        remove(n);\r\n        return n;\r\n    }\r\n\r\n    void remove(node* n)\r\n    {\r\n        size_t s = size_($).load(rl::memory_order_relaxed);\r\n        size_($).store(s - 1, rl::memory_order_relaxed);\r\n        n->prev_($)->next_($) = n->next_($);\r\n        n->next_($)->prev_($) = n->prev_($);\r\n    }\r\n\r\n    size_t size() const\r\n    {\r\n        return size_($).load(rl::memory_order_relaxed);\r\n    }\r\n\r\n    node* begin()\r\n    {\r\n        return head_.next_($);\r\n    }\r\n\r\n    void flush_to(dlist& target)\r\n    {\r\n        if (size_($).load(rl::memory_order_relaxed))\r\n        {\r\n            target.size_($).store(size_($).load(rl::memory_order_relaxed));\r\n            target.head_.next_($) = head_.next_($);\r\n            target.head_.next_($)->prev_($) = &target.head_;\r\n            target.tail_.prev_($) = tail_.prev_($);\r\n            target.tail_.prev_($)->next_($) = &target.tail_;\r\n        }\r\n        else\r\n        {\r\n            target.reset();\r\n        }\r\n        reset();\r\n    }\r\n\r\n    static bool not_last(node* n)\r\n    {\r\n        return n->next_($) != 0;\r\n    }\r\n\r\n    static node* get_next(node* n)\r\n    {\r\n        return n->next_($);\r\n    }\r\n\r\nprivate:\r\n    rl::atomic<size_t>  size_;\r\n    node                head_;\r\n    node                tail_;\r\n\r\n    void reset()\r\n    {\r\n        size_($) = 0;\r\n        head_.next_($) = &tail_;\r\n        head_.prev_($) = 0;\r\n        tail_.next_($) = 0;\r\n        tail_.prev_($) = &head_;\r\n    }\r\n\r\n    dlist(dlist const&);\r\n    dlist& operator = (dlist const&);\r\n};\r\n\r\n\r\n\r\n/** pre-thread descriptor for eventcount\r\n */\r\nstruct ec_thread\r\n{\r\n    dlist::node         node_;\r\n    semaphore           sema_;\r\n    rl::var<unsigned>   epoch_;\r\n    rl::atomic<bool>    in_waitset_;\r\n    rl::var<bool>       spurious_;\r\n    rl::var<void*>      ctx_;\r\n\r\n    ec_thread()\r\n    {\r\n        epoch_($) = 0;\r\n        in_waitset_($) = false;\r\n        spurious_($) = false;\r\n        ctx_($) = 0;\r\n    }\r\n\r\n    ~ec_thread()\r\n    {\r\n        if (spurious_($))\r\n            sema_.wait();\r\n    }\r\n\r\n    /*\r\n    static ec_thread* current()\r\n    {\r\n        static THREAD_LOCAL ec_thread* ec_thread_instance = 0;\r\n        ec_thread* instance = ec_thread_instance;\r\n        if (instance == 0)\r\n        {\r\n            instance = new ec_thread;\r\n            ec_thread_instance = instance;\r\n        }\r\n        return instance;\r\n        // instance must be destroyed in DllMain() callback\r\n        // or in pthread_key_create() callback\r\n    }\r\n    */\r\n\r\nprivate:\r\n    ec_thread(ec_thread const&);\r\n    ec_thread& operator = (ec_thread const&);\r\n};\r\n\r\n\r\n\r\n/** fine-grained eventcount implementation\r\n */\r\nclass eventcount\r\n{\r\npublic:\r\n    eventcount()\r\n    {\r\n        epoch_($) = 0;\r\n    }\r\n\r\n    void prepare_wait(ec_thread* th = 0, void* ctx = 0)\r\n    {\r\n        RL_ASSERT(th);\r\n        // this is good place to pump previous spurious wakeup\r\n        if (th->spurious_($))\r\n        {\r\n            th->spurious_($) = false;\r\n            th->sema_.wait();\r\n        }\r\n        th->in_waitset_($).store(true, rl::memory_order_relaxed);\r\n        th->ctx_($) = ctx;\r\n        {\r\n            lock l (mtx_);\r\n            th->epoch_($) = epoch_($).load(rl::memory_order_relaxed);\r\n            waitset_.push(&th->node_);\r\n        }\r\n        rl::atomic_thread_fence($)(rl::memory_order_seq_cst);\r\n    }\r\n\r\n    void commit_wait(ec_thread* th = 0)\r\n    {\r\n        RL_ASSERT(th);\r\n        // this check is just an optimization\r\n        //if (th->epoch_($) == epoch_($).load(rl::memory_order_relaxed))\r\n        if (th->in_waitset_($).load(rl::memory_order_acquire))\r\n            th->sema_.wait();\r\n        else\r\n            cancel_wait(true, th); //!!! add 'th'\r\n    }\r\n\r\n    void cancel_wait(bool /*from_commit*/, ec_thread* th = 0)\r\n    {\r\n        RL_ASSERT(th);\r\n        // spurious wakeup will be pumped in the following prepare_wait()\r\n        th->spurious_($)  = true;\r\n        // try to remove node from waitset\r\n        if (th->in_waitset_($).load(rl::memory_order_acquire))\r\n        {\r\n            lock l (mtx_);\r\n            if (th->in_waitset_($).load(rl::memory_order_relaxed))\r\n            {\r\n                // successfully removed from waitset,\r\n                // so there will be no spurious wakeup\r\n                th->in_waitset_($).store(false, rl::memory_order_relaxed);\r\n                th->spurious_($) = false;\r\n                waitset_.remove(&th->node_);\r\n            }\r\n            else\r\n            {\r\n                //if (from_commit)\r\n                    //int volatile x = 0;\r\n            }\r\n        }\r\n        else\r\n        {\r\n            //RL_ASSERT(from_commit == false);\r\n            //if (from_commit)\r\n              //  int volatile x = 0;\r\n        }\r\n    }\r\n\r\n    void notify_one()\r\n    {\r\n        rl::atomic_thread_fence($)(rl::memory_order_seq_cst);\r\n        notify_one_relaxed();\r\n    }\r\n\r\n    template<typename predicate_t>\r\n    void notify(predicate_t pred)\r\n    {\r\n        rl::atomic_thread_fence($)(rl::memory_order_seq_cst);\r\n        notify_relaxed(pred);\r\n    }\r\n\r\n    void notify_all()\r\n    {\r\n        rl::atomic_thread_fence($)(rl::memory_order_seq_cst);\r\n        notify_all_relaxed();\r\n    }\r\n\r\n    void notify_one_relaxed()\r\n    {\r\n        if (waitset_.size() == 0)\r\n            return;\r\n        dlist::node* n;\r\n        {\r\n            lock l (mtx_);\r\n            unsigned ep = epoch_($).load(rl::memory_order_relaxed);\r\n            epoch_($).store(ep + 1, rl::memory_order_relaxed);\r\n            n = waitset_.pop();\r\n            if (n)\r\n                to_ec_thread(n)->in_waitset_($).store(false, rl::memory_order_release);\r\n        }\r\n        if (n)\r\n        {\r\n            to_ec_thread(n)->sema_.post();\r\n        }\r\n    }\r\n\r\n    template<typename predicate_t>\r\n    void notify_relaxed(predicate_t pred)\r\n    {\r\n        if (waitset_.size() == 0)\r\n            return;\r\n        dlist temp;\r\n        {\r\n            lock l (mtx_);\r\n            unsigned ep = epoch_($).load(rl::memory_order_relaxed);\r\n            epoch_($).store(ep + 1, rl::memory_order_relaxed);\r\n            size_t size = waitset_.size();\r\n            size_t idx = 0;\r\n            dlist::node* n = waitset_.begin();\r\n            while (dlist::not_last(n))\r\n            {\r\n                dlist::node* next = dlist::get_next(n);\r\n                ec_thread* th = to_ec_thread(n);\r\n                if (pred(th->ctx_($), size, idx))\r\n                {\r\n                    waitset_.remove(n);\r\n                    temp.push(n);\r\n                    th->in_waitset_($).store(false, rl::memory_order_release);\r\n                }\r\n                n = next;\r\n                idx += 1;\r\n            }\r\n        }\r\n        dlist::node* n = temp.begin();\r\n        while (dlist::not_last(n))\r\n        {\r\n            dlist::node* next = dlist::get_next(n);\r\n            to_ec_thread(n)->sema_.post();\r\n            n = next;\r\n        }\r\n    }\r\n\r\n    void notify_all_relaxed()\r\n    {\r\n        if (waitset_.size() == 0)\r\n            return;\r\n        dlist temp;\r\n        {\r\n            lock l (mtx_);\r\n            waitset_.flush_to(temp);\r\n            dlist::node* n = temp.begin();\r\n            while (dlist::not_last(n))\r\n            {\r\n                to_ec_thread(n)->in_waitset_($).store(false, rl::memory_order_release);\r\n                n = dlist::get_next(n);\r\n            }\r\n            unsigned ep = epoch_($).load(rl::memory_order_relaxed);\r\n            epoch_($).store(ep + 1, rl::memory_order_relaxed);\r\n        }\r\n        dlist::node* n = temp.begin();\r\n        while (dlist::not_last(n))\r\n        {\r\n            dlist::node* next = dlist::get_next(n);\r\n            to_ec_thread(n)->sema_.post();\r\n            n = next;\r\n        }\r\n    }\r\n\r\n    class wait_guard;\r\n\r\nprivate:\r\n    mutex               mtx_;\r\n    dlist               waitset_;\r\n    rl::atomic<unsigned>epoch_;\r\n\r\n    ec_thread* to_ec_thread(dlist::node* n)\r\n    {\r\n        return (ec_thread*)((char*)n - offsetof(ec_thread, node_));\r\n    }\r\n\r\n    eventcount(eventcount const&);\r\n    eventcount& operator = (eventcount const&);\r\n};\r\n\r\n\r\n\r\n\r\nclass eventcount::wait_guard\r\n{\r\npublic:\r\n    wait_guard(eventcount& ec, ec_thread* th = 0, void* ctx = 0)\r\n        : ec_(ec)\r\n        , th_(th)\r\n        , wait_(false)\r\n    {\r\n        ec_.prepare_wait(th_, ctx);\r\n    }\r\n\r\n    void commit_wait()\r\n    {\r\n        assert(false == wait_);\r\n        wait_ = true;\r\n        ec_.commit_wait(th_);\r\n    }\r\n\r\n    ~wait_guard()\r\n    {\r\n        if (false == wait_)\r\n            ec_.cancel_wait(false, th_);\r\n    }\r\n\r\nprivate:\r\n    eventcount& ec_;\r\n    ec_thread* th_;\r\n    bool wait_;\r\n\r\n    wait_guard(wait_guard const&);\r\n    wait_guard& operator = (wait_guard const&);\r\n};\r\n\r\n\r\n\r\n\r\n\r\nstruct scheduler\r\n{\r\n    struct tbb_thread\r\n    {\r\n        ec_thread       th;\r\n    };\r\n\r\n    eventcount          ec_;\r\n    tbb_thread*         threads_;\r\n    bool volatile       is_permanently_open_;\r\n\r\n    void wait_while_pool_is_empty(tbb_thread* th)\r\n    {\r\n        if (is_permanently_open_)\r\n            return;\r\n        eventcount::wait_guard wait (ec_, &th->th);\r\n        if (pool_is_empty())\r\n            wait.commit_wait();\r\n    }\r\n\r\n    void notify_about_new_task_available()\r\n    {\r\n        ec_.notify_one_relaxed();\r\n    }\r\n\r\n    void notify_about_new_task_available_with_preference(tbb_thread* preference)\r\n    {\r\n        struct local\r\n        {\r\n            tbb_thread*     preference_;\r\n            bool            fired_;\r\n\r\n            bool operator () (void* ctx, size_t count, size_t idx)\r\n            {\r\n                tbb_thread* th = (tbb_thread*)ctx;\r\n                if (th == preference_)\r\n                {\r\n                    fired_ = true;\r\n                    return true;\r\n                }\r\n                else if (idx == count - 1 && fired_ == false)\r\n                {\r\n                    return true;\r\n                }\r\n                else\r\n                {\r\n                    return false;\r\n                }\r\n            }\r\n        }\r\n        pred = {preference};\r\n        ec_.notify_relaxed(pred);\r\n    }\r\n\r\n    void notify_about_list_of_tasks_available(size_t total_count, size_t preference_count, tbb_thread** preferences)\r\n    {\r\n        struct local\r\n        {\r\n            size_t          remain_to_signal_;\r\n            size_t          preference_count_;\r\n            tbb_thread**    preferences_;\r\n\r\n            bool operator () (void* ctx, size_t count, size_t idx)\r\n            {\r\n                tbb_thread* th = (tbb_thread*)ctx;\r\n                size_t remain_in_waitset = count - idx;\r\n                if (remain_in_waitset <= remain_to_signal_)\r\n                {\r\n                    return true;\r\n                }\r\n                else\r\n                {\r\n                    for (size_t i = 0; i != preference_count_; ++i)\r\n                    {\r\n                        if (preferences_[i] == th)\r\n                        {\r\n                            remain_to_signal_ -= 1;\r\n                            return true;\r\n                        }\r\n                    }\r\n                }\r\n                return false;\r\n            }\r\n        }\r\n        pred = {total_count, preference_count, preferences};\r\n        ec_.notify_relaxed(pred);\r\n    }\r\n\r\n    bool pool_is_empty()\r\n    {\r\n        return true;\r\n    }\r\n};\r\n\r\n\r\n\r\nstruct queue\r\n{\r\n    rl::atomic<int>     producer_idx_;\r\n    rl::atomic<int>     consumer_idx_;\r\n\r\n    rl::atomic<void*>*  buffer_;\r\n\r\n    eventcount          ec_;\r\n\r\n    queue()\r\n    {\r\n        producer_idx_($) = 0;\r\n        consumer_idx_($) = 0;\r\n        buffer_ = RL_NEW_ARR(rl::atomic<void*>, 10);\r\n        for (size_t i = 0; i != 10; ++i)\r\n            buffer_[i]($) = 0;\r\n    }\r\n\r\n    ~queue()\r\n    {\r\n        RL_DELETE_ARR(buffer_);\r\n    }\r\n\r\n    void enqueue(void* data)\r\n    {\r\n        int idx = producer_idx_($).fetch_add(1) + 1; // atomic\r\n        buffer_[idx]($).store(data, rl::memory_order_relaxed);\r\n\r\n        struct local\r\n        {\r\n            int         idx_;\r\n            bool operator () (void* ctx, size_t /*count*/, size_t /*idx*/)\r\n            {\r\n                return idx_ == (*(rl::var<int>*)ctx)($);\r\n            }\r\n        }\r\n        pred = {idx};\r\n        ec_.notify(pred); // not relaxed!!!\r\n    }\r\n\r\n    void* dequeue(ec_thread* th)\r\n    {\r\n        int idx = consumer_idx_($).fetch_add(1) + 1; // atomic\r\n        void* data = buffer_[idx]($).load(rl::memory_order_relaxed);\r\n        if (data)\r\n            return data;\r\n        for (;;)\r\n        {\r\n            rl::var<int> idxv (idx);\r\n            eventcount::wait_guard wait (ec_, th, &idxv);\r\n            data = buffer_[idx]($).load(rl::memory_order_relaxed);\r\n            if (data)\r\n            {\r\n                return data;\r\n            }\r\n            wait.commit_wait();\r\n            idxv($) = 0;\r\n            data = buffer_[idx]($).load(rl::memory_order_relaxed);\r\n            if (data)\r\n            {\r\n                return data;\r\n            }\r\n            rl::yield($, 1);\r\n            //RL_ASSERT(false);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\nclass condition_variable\r\n{\r\n    eventcount ec_;\r\n\r\npublic:\r\n    void wait(mutex& mtx, ec_thread* th)\r\n    {\r\n        eventcount::wait_guard wait (ec_, th);\r\n        mtx.unlock();\r\n        wait.commit_wait();\r\n        mtx.lock();\r\n    }\r\n\r\n    void signal()\r\n    {\r\n        ec_.notify_one();\r\n    }\r\n\r\n    void broadcast()\r\n    {\r\n        ec_.notify_all();\r\n    }\r\n}; \r\n\r\n\r\nstruct queue_test : rl::test_suite<queue_test, 4>\r\n{\r\n    ec_thread threads_ [6];\r\n    queue q_;\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (index < 2)\r\n        {\r\n            q_.enqueue((void*)(index*2+1));\r\n            q_.enqueue((void*)(index*2+2));\r\n        }\r\n        else\r\n        {\r\n            int data1 = (int)q_.dequeue(&threads_[index]);\r\n            RL_ASSERT(data1 >= 1 && data1 <= 6);\r\n            int data2 = (int)q_.dequeue(&threads_[index]);\r\n            RL_ASSERT(data2 >= 1 && data2 <= 6);\r\n        }\r\n    }\r\n};\r\n\r\nstruct condvar_test : rl::test_suite<condvar_test, 3>\r\n{\r\n    rl::var<int> stage;\r\n    condition_variable cv;\r\n    mutex mtx;\r\n    ec_thread th [3];\r\n\r\n    void before()\r\n    {\r\n        stage($) = 0;\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            mtx.lock();\r\n            stage($) += 1;\r\n            cv.broadcast();\r\n            while (stage($) != 2)\r\n                cv.wait(mtx, &th[index]);\r\n            mtx.unlock();\r\n        }\r\n        else if (1 == index)\r\n        {\r\n            mtx.lock();\r\n            while (stage($) != 1)\r\n                cv.wait(mtx, &th[index]);\r\n            stage($) += 1;\r\n            cv.broadcast();\r\n            mtx.unlock();\r\n        }\r\n        else if (2 == index)\r\n        {\r\n            mtx.lock();\r\n            while (stage($) != 2)\r\n                cv.wait(mtx, &th[index]);\r\n            mtx.unlock();\r\n        }\r\n    }\r\n};\r\n\r\n\r\nint main()\r\n{\r\n    rl::test_params p;\r\n    p.iteration_count = 100000000;\r\n    //p.initial_state = \"30000000\";\r\n    //p.search_type = rl::fair_context_bound_scheduler_type;\r\n    rl::simulate<queue_test>(p);\r\n    //rl::simulate<condvar_test>(p);\r\n}\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/tbb_eventcount/msvc8/eventcount.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 9.00\r\n# Visual Studio 2005\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"eventcount\", \"eventcount.vcproj\", \"{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E5}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tRelease|Win32 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E5}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E5}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E5}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E5}.Release|Win32.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/tbb_eventcount/msvc8/eventcount.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"eventcount\"\r\n\tProjectGUID=\"{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E5}\"\r\n\tRootNamespace=\"eventcount\"\r\n\tKeyword=\"Win32Proj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"false\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"false\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.cpp\"\r\n\t\t\t>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\eventcount.cpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/tbb_eventcount/msvc9/eventcount.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 10.00\r\n# Visual Studio 2005\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"eventcount\", \"eventcount.vcproj\", \"{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E5}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tRelease|Win32 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E5}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E5}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E5}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E5}.Release|Win32.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/tbb_eventcount/msvc9/eventcount.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"9,00\"\r\n\tName=\"eventcount\"\r\n\tProjectGUID=\"{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E5}\"\r\n\tRootNamespace=\"eventcount\"\r\n\tKeyword=\"Win32Proj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"false\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"false\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.cpp\"\r\n\t\t\t>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\eventcount.cpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/tbb_eventcount/stdafx.cpp",
    "content": "// stdafx.cpp : source file that includes just the standard includes\r\n// ws_deque.pch will be the pre-compiled header\r\n// stdafx.obj will contain the pre-compiled type information\r\n\r\n#include \"stdafx.h\"\r\n\r\n// TODO: reference any additional headers you need in STDAFX.H\r\n// and not in this file\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/tbb_eventcount/stdafx.h",
    "content": "#pragma once\r\n\r\n\r\n#include \"../../relacy/pch.hpp\"\r\n#include \"../../relacy/relacy_std.hpp\"\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/ws_deque/msvc8/ws_deque.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 9.00\r\n# Visual Studio 2005\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"ws_deque\", \"ws_deque.vcproj\", \"{0B597F19-DEBB-4832-B520-9A93A286D595}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tRelease|Win32 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{0B597F19-DEBB-4832-B520-9A93A286D595}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{0B597F19-DEBB-4832-B520-9A93A286D595}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{0B597F19-DEBB-4832-B520-9A93A286D595}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{0B597F19-DEBB-4832-B520-9A93A286D595}.Release|Win32.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/ws_deque/msvc8/ws_deque.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"ws_deque\"\r\n\tProjectGUID=\"{0B597F19-DEBB-4832-B520-9A93A286D595}\"\r\n\tRootNamespace=\"ws_deque\"\r\n\tKeyword=\"Win32Proj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.cpp\"\r\n\t\t\t>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\tObjectFile=\"$(IntDir)\\$(InputName)1.obj\"\r\n\t\t\t\t\tXMLDocumentationFileName=\"$(IntDir)\\$(InputName)1.xdc\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\tObjectFile=\"$(IntDir)\\$(InputName)1.obj\"\r\n\t\t\t\t\tXMLDocumentationFileName=\"$(IntDir)\\$(InputName)1.xdc\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\ws_deque.cpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/ws_deque/msvc9/ws_deque.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 10.00\r\n# Visual Studio 2008\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"ws_deque\", \"ws_deque.vcproj\", \"{0B597F19-DEBB-4832-B520-9A93A286D595}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tRelease|Win32 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{0B597F19-DEBB-4832-B520-9A93A286D595}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{0B597F19-DEBB-4832-B520-9A93A286D595}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{0B597F19-DEBB-4832-B520-9A93A286D595}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{0B597F19-DEBB-4832-B520-9A93A286D595}.Release|Win32.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/ws_deque/msvc9/ws_deque.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"9,00\"\r\n\tName=\"ws_deque\"\r\n\tProjectGUID=\"{0B597F19-DEBB-4832-B520-9A93A286D595}\"\r\n\tRootNamespace=\"ws_deque\"\r\n\tKeyword=\"Win32Proj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.cpp\"\r\n\t\t\t>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\tObjectFile=\"$(IntDir)\\$(InputName)1.obj\"\r\n\t\t\t\t\tXMLDocumentationFileName=\"$(IntDir)\\$(InputName)1.xdc\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t\tObjectFile=\"$(IntDir)\\$(InputName)1.obj\"\r\n\t\t\t\t\tXMLDocumentationFileName=\"$(IntDir)\\$(InputName)1.xdc\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\ws_deque.cpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/ws_deque/stdafx.cpp",
    "content": "#include \"stdafx.h\"\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/ws_deque/stdafx.h",
    "content": "#pragma once\r\n\r\n#ifdef NDEBUG\r\n#   define _SECURE_SCL 0\r\n#endif\r\n\r\n#define RL_MSVC_OUTPUT\r\n//#define RL_DEBUGBREAK_ON_FAILURE\r\n\r\n#include \"../../relacy/pch.hpp\"\r\n#include \"../../relacy/relacy_std.hpp\"\r\n\r\n\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/ws_deque/ws_deque.cpp",
    "content": "#include \"stdafx.h\"\r\n#include \"../../relacy/relacy_std.hpp\"\r\n\r\n\r\nusing namespace std;\r\nusing rl::var;\r\n\r\n\r\n\r\n\r\ntemplate<typename T>\r\nclass ws_deque\r\n{\r\npublic:\r\n    ws_deque()\r\n    {\r\n        VAR(m_mask) = initial_size - 1;\r\n        m_headIndex.store(0, memory_order_relaxed);\r\n        m_tailIndex.store(0, memory_order_relaxed);\r\n        VAR(m_array) = new atomic<T> [initial_size];\r\n        VAR(m_arraySize) = initial_size;\r\n    }\r\n\r\n    ~ws_deque()\r\n    {\r\n        delete [] VAR(m_array);\r\n    }\r\n\r\n    bool IsEmpty() const\r\n    {\r\n        return m_headIndex.load(memory_order_acquire)\r\n            >= m_tailIndex.load(memory_order_acquire);\r\n    }\r\n\r\n    size_t Count() const\r\n    {\r\n        return m_tailIndex.load(memory_order_acquire)\r\n             - m_headIndex.load(memory_order_acquire);\r\n    }\r\n\r\n    void push(T item)\r\n    {\r\n        size_t tail = m_tailIndex.load(memory_order_acquire);\r\n        if (tail < m_headIndex.load(memory_order_acquire) + VAR(m_mask))\r\n        {\r\n            VAR(m_array)[tail & VAR(m_mask)].store(item, memory_order_relaxed);\r\n            m_tailIndex.store(tail + 1, memory_order_release);\r\n        }\r\n        else\r\n        {\r\n            m_foreignLock.lock($);\r\n            size_t head = m_headIndex.load(memory_order_acquire);\r\n            size_t count = Count();\r\n            if (count >= VAR(m_mask))\r\n            {\r\n                size_t arraySize = m_arraySize($);\r\n                size_t mask = VAR(m_mask);\r\n                atomic<T>* newArray = new atomic<T> [arraySize * 2];\r\n                atomic<T>* arr = m_array($);\r\n                //!!! for (size_t i = 0; i != arraySize; ++i)\r\n                for (size_t i = 0; i != count; ++i)\r\n                    newArray[i].store(arr[(i + head) & mask].load(memory_order_seq_cst), memory_order_relaxed);\r\n                delete [] VAR(m_array);\r\n                VAR(m_array) = newArray;\r\n                VAR(m_arraySize) = arraySize * 2;\r\n                m_headIndex.store(0, memory_order_release);\r\n                m_tailIndex.store(count, memory_order_release);\r\n                tail = count;\r\n                VAR(m_mask) = (mask * 2) | 1;\r\n            }\r\n            VAR(m_array)[tail & VAR(m_mask)].store(item, memory_order_relaxed);\r\n            m_tailIndex.store(tail + 1, memory_order_release);\r\n            m_foreignLock.unlock($);\r\n        }\r\n    }\r\n\r\n    bool pop(T& item)\r\n    {\r\n        size_t tail = m_tailIndex.load(memory_order_acquire);\r\n        if (tail == 0)\r\n            return false;\r\n        tail -= 1;\r\n        m_tailIndex.store(tail, memory_order_release);\r\n        atomic_thread_fence(memory_order_seq_cst);\r\n        if (m_headIndex.load(memory_order_acquire) <= tail)\r\n        {\r\n            item = VAR(m_array)[tail & VAR(m_mask)].load(memory_order_relaxed);\r\n            return true;\r\n        }\r\n        else\r\n        {\r\n            m_foreignLock.lock($);\r\n            if (m_headIndex.load(memory_order_acquire) <= tail)\r\n            {\r\n                item = VAR(m_array)[tail & VAR(m_mask)].load(memory_order_relaxed);\r\n                m_foreignLock.unlock($);\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                m_tailIndex.store(tail + 1, memory_order_release);\r\n                m_foreignLock.unlock($);\r\n                return false;\r\n            }\r\n        }\r\n    }\r\n\r\n    bool steal(T& item)\r\n    {\r\n        if (false == m_foreignLock.try_lock($))\r\n            return false;\r\n        size_t head = m_headIndex.load(memory_order_acquire);\r\n        m_headIndex.store(head + 1, memory_order_release);\r\n        atomic_thread_fence(memory_order_seq_cst);\r\n        if (head < m_tailIndex.load(memory_order_acquire))\r\n        {\r\n            item = VAR(m_array)[head & VAR(m_mask)].load(memory_order_relaxed);\r\n            m_foreignLock.unlock($);\r\n            return true;\r\n        }\r\n        else\r\n        {\r\n            m_headIndex.store(head, memory_order_release);\r\n            m_foreignLock.unlock($);\r\n            return false;\r\n        }\r\n    }\r\n\r\nprivate:\r\n    static size_t const initial_size = 2;\r\n    var<atomic<T>*> m_array;\r\n    var<size_t> m_mask;\r\n    var<size_t> m_arraySize;\r\n    atomic<size_t> m_headIndex;\r\n    atomic<size_t> m_tailIndex;\r\n    mutex m_foreignLock;\r\n};\r\n\r\n\r\n\r\n\r\nstruct ws_deque_test0 : rl::test_suite<ws_deque_test0, 4>\r\n{\r\n    ws_deque<int> q;\r\n\r\n    void before()\r\n    {\r\n    }\r\n\r\n    void after()\r\n    {\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            for (size_t i = 0; i != 4; ++i)\r\n            {\r\n                q.push(10);\r\n            }\r\n\r\n            for (size_t i = 0; i != 5; ++i)\r\n            {\r\n                int p = 0;\r\n                bool res = q.pop(p);\r\n                RL_ASSERT(10 == p || false == res);\r\n            }\r\n\r\n            for (size_t i = 0; i != 4; ++i)\r\n            {\r\n                q.push(10);\r\n                int p = 0;\r\n                bool res = q.pop(p);\r\n                RL_ASSERT(10 == p || false == res);\r\n            }\r\n\r\n            for (size_t i = 0; i != 4; ++i)\r\n            {\r\n                q.push(10);\r\n                q.push(10);\r\n                int p = 0;\r\n                bool res = q.pop(p);\r\n                RL_ASSERT(10 == p || false == res);\r\n                p = 0;\r\n                res = q.pop(p);\r\n                RL_ASSERT(10 == p || false == res);\r\n            }\r\n\r\n            for (size_t i = 0; i != 4; ++i)\r\n            {\r\n                q.push(10);\r\n                q.push(10);\r\n                q.push(10);\r\n                int p = 0;\r\n                bool res = q.pop(p);\r\n                RL_ASSERT(10 == p || false == res);\r\n            }\r\n\r\n            for (size_t i = 0; i != 14; ++i)\r\n            {\r\n                q.push(10);\r\n                int p = 0;\r\n                bool res = q.pop(p);\r\n                RL_ASSERT(10 == p || false == res);\r\n            }\r\n        }\r\n        else\r\n        {\r\n            for (size_t i = 0; i != 4; ++i)\r\n            {\r\n                int p = 0;\r\n                bool res = q.steal(p);\r\n                RL_ASSERT(10 == p || false == res);\r\n            }\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct ws_deque_test : rl::test_suite<ws_deque_test, 2>\r\n{\r\n    ws_deque<int> q;\r\n    bool state [2];\r\n\r\n    void before()\r\n    {\r\n        state[0] = true;\r\n        state[1] = true;\r\n    }\r\n\r\n    void after()\r\n    {\r\n        RL_ASSERT(state[0] == false);\r\n        RL_ASSERT(state[1] == false);\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            q.push(1);\r\n            q.push(2);\r\n\r\n            int item = 0;\r\n            bool res = q.pop(item);\r\n            RL_ASSERT(res && item == 2);\r\n            RL_ASSERT(state[1]);\r\n            state[1] = false;\r\n\r\n            item = 0;\r\n            res = q.pop(item);\r\n            if (res)\r\n            {\r\n                RL_ASSERT(state[0]);\r\n                state[0] = false;\r\n            }\r\n\r\n            item = 0;\r\n            res = q.pop(item);\r\n            RL_ASSERT(res == false);\r\n        }\r\n        else\r\n        {\r\n            int item = 0;\r\n            bool res = q.steal(item);\r\n            if (res)\r\n            {\r\n                RL_ASSERT(item == 1);\r\n                RL_ASSERT(state[0]);\r\n                state[0] = false;\r\n            }\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nint main()\r\n{\r\n    rl::simulate<ws_deque_test0>();\r\n    rl::simulate<ws_deque_test>();\r\n}\r\n \r\n"
  },
  {
    "path": "tests/relacy/relacy/example/ws_deque2/msvc8/ws_deque.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 9.00\r\n# Visual Studio 2005\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"ws_deque\", \"ws_deque.vcproj\", \"{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E4}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tRelease|Win32 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E4}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E4}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E4}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E4}.Release|Win32.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/ws_deque2/msvc8/ws_deque.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"ws_deque\"\r\n\tProjectGUID=\"{ECB64178-A35E-4EB2-9EB0-BD72D6F7B6E4}\"\r\n\tRootNamespace=\"ws_deque\"\r\n\tKeyword=\"Win32Proj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"false\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"false\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.cpp\"\r\n\t\t\t>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\ws_deque.cpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/ws_deque2/stdafx.cpp",
    "content": "// stdafx.cpp : source file that includes just the standard includes\r\n// ws_deque.pch will be the pre-compiled header\r\n// stdafx.obj will contain the pre-compiled type information\r\n\r\n#include \"stdafx.h\"\r\n\r\n// TODO: reference any additional headers you need in STDAFX.H\r\n// and not in this file\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/ws_deque2/stdafx.h",
    "content": "#pragma once\r\n\r\n\r\n#include \"../../relacy/pch.hpp\"\r\n#include \"../../relacy/relacy_std.hpp\"\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/example/ws_deque2/ws_deque.cpp",
    "content": "#include \"stdafx.h\"\r\n\r\n\r\nstruct pdr\r\n{\r\n    __declspec(thread) static pdr* instance;\r\n\r\n    static size_t const defer_limit = 1024;\r\n\r\n    typedef void(*dtor_f)(void*);\r\n    struct entry_t\r\n    {\r\n        dtor_f dtor;\r\n        void* ctx;\r\n    };\r\n    entry_t defer_list [defer_limit];\r\n    size_t pos;\r\n    size_t pos0;\r\n    size_t thread_count;\r\n\r\n    size_t th [4];\r\n\r\n    void init(size_t count)\r\n    {\r\n        //assert(0 == instance);\r\n        instance = this;\r\n\r\n        thread_count = count;\r\n        pos = 0;\r\n        pos0 = 0;\r\n        for (size_t i = 0; i != thread_count; ++i)\r\n        {\r\n            th[i] = defer_limit;\r\n        }\r\n    }\r\n\r\n    void fini()\r\n    {\r\n        for (size_t i = 0; i != thread_count; ++i)\r\n        {\r\n            assert(th[i] == defer_limit);\r\n        }\r\n\r\n        for (size_t i = pos0; i != pos; ++i)\r\n        {\r\n            assert(defer_list[i].dtor);\r\n            defer_list[i].dtor(defer_list[i].ctx);\r\n        }\r\n        assert(this == instance);\r\n        instance = 0;\r\n    }\r\n\r\n    void lock()\r\n    {\r\n        std::atomic_thread_fence($)(std::memory_order_seq_cst);\r\n\r\n        assert(th[rl::ctx().threadx_->index_] == defer_limit);\r\n        th[rl::ctx().threadx_->index_] = pos;\r\n    }\r\n\r\n    void unlock()\r\n    {\r\n        assert(th[rl::ctx().threadx_->index_] != defer_limit);\r\n        th[rl::ctx().threadx_->index_] = defer_limit;\r\n        pump();\r\n    }\r\n\r\n    template<typename T>\r\n    static void dtor_impl(void* p)\r\n    {\r\n        RL_DELETE(static_cast<T*>(p));\r\n    }\r\n\r\n    template<typename T>\r\n    void defer(T* p)\r\n    {\r\n        std::atomic_thread_fence($)(std::memory_order_seq_cst);\r\n\r\n        assert(pos < defer_limit);\r\n        entry_t& e = defer_list[pos++];\r\n        e.dtor = &pdr::dtor_impl<T>;\r\n        e.ctx = p;\r\n        pump();\r\n    }\r\n\r\n    void pump()\r\n    {\r\n        if (pos0 == pos)\r\n            return;\r\n        size_t min_pos = pos;\r\n        for (size_t i = 0; i != thread_count; ++i)\r\n        {\r\n            if (th[i] < min_pos)\r\n                min_pos = th[i];\r\n        }\r\n        for (size_t i = pos0; i != min_pos; ++i)\r\n        {\r\n            assert(defer_list[i].dtor);\r\n            defer_list[i].dtor(defer_list[i].ctx);\r\n        }\r\n        pos0 = min_pos;\r\n    }\r\n};\r\n\r\npdr* pdr::instance = 0;\r\n\r\nvoid pdr_lock()\r\n{\r\n    assert(pdr::instance);\r\n    pdr::instance->lock();\r\n}\r\n\r\nvoid pdr_unlock()\r\n{\r\n    assert(pdr::instance);\r\n    pdr::instance->unlock();\r\n}\r\n\r\ntemplate<typename T>\r\nvoid pdr_defer(T* p)\r\n{\r\n    assert(pdr::instance);\r\n    pdr::instance->defer(p);\r\n}\r\n\r\n\r\n\r\nclass ws_deque\r\n{\r\npublic:\r\n\r\n    ws_deque()\r\n    {\r\n\t\tbottom_.block_($) = 0;\r\n\t\tbottom_.real_block_id_ = 0;\r\n\t\tbottom_.real_index_ = 0;\r\n\t\tbottom_.block_id_ = 0;\r\n\t\tbottom_.index_ = 0;\r\n\t\tbottom_.block_seq_ = 0;\r\n\t\tbottom_.check_order_ = 1;\r\n\r\n        top::info t = {};\r\n\t\ttop_.block_($) = 0;\r\n        top_.info_($) = t;\r\n\r\n\t\talloc_block();\r\n\t\tbottom_.block_id_ = bottom_.block_($)->header_.id_;\r\n\t\ttop_.block_($) = bottom_.block_($);\r\n\t\tt.top_block_id_ = static_cast<unsigned short>(top_.block_($).load()->header_.id_);\r\n\t\tt.bottom_block_id_ = static_cast<unsigned short>(top_.block_($).load()->header_.id_);\r\n        top_.info_($) = t;\r\n    }\r\n\r\n\t~ws_deque()\r\n\t{\r\n\t\tfor (block* p = top_.block_($), *next; p; p = next)\r\n\t\t{\r\n\t\t\tnext = p->header_.next_($).load(std::memory_order_relaxed);\r\n            RL_DELETE(p);\r\n\t\t}\r\n\t}\r\n\r\n    void push(void* const& i)\r\n    {\r\n        pdr_lock();\r\n\r\n        push_unbalanced(i);\r\n        rebalance();\r\n\r\n        pdr_unlock();\r\n    }\r\n\r\n    void push_unbalanced(void* i)\r\n    {\r\n        RL_ASSERT(bottom_.block_($)->header_.id_);\r\n\r\n        bottom_.block_($)->data_[bottom_.real_index_]($).store(i, std::memory_order_release);\r\n\r\n\t\tif (block::item_count - 1 != bottom_.real_index_)\r\n\t\t{\r\n\t\t\tbottom_.real_index_ += 1;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\talloc_block();\r\n\t\t}\r\n    }\r\n\r\n    void rebalance()\r\n    {\r\n\t\tif (0 == --bottom_.check_order_)\r\n\t\t{\r\n\t\t\tcheck_bottom();\r\n\t\t}\r\n    }\r\n\r\n    void* pop()\r\n    {\r\n        pdr_lock();\r\n\r\n        rebalance();\r\n        void* p = pop_unbalanced();\r\n\r\n        pdr_unlock();\r\n\r\n        return p;\r\n    }\r\n\r\n    void* pop_unbalanced()\r\n    {\r\n\t\t//!!! optimize\r\n\r\n\t\t//! fast-path for empty deque\r\n\r\n\t\t//! make comparasion faster\r\n\r\n\t\tif ((bottom_.block_id_ != bottom_.real_block_id_\r\n            || bottom_.index_ != bottom_.real_index_)\r\n\t\t\t&& bottom_.real_index_)\r\n\t\t{\r\n\t\t\tbottom_.real_index_ -= 1;\r\n            void* i = bottom_.block_($)->data_[bottom_.real_index_]($).load(std::memory_order_consume);\r\n\t\t\treturn i;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\treturn pop_unbalanced_slow();\r\n\t\t}\r\n    }\r\n\r\n    void* pop_unbalanced_slow()\r\n\t{\r\n\t\tif (0 == bottom_.real_index_)\r\n\t\t{\r\n            if (bottom_.real_block_id_ > bottom_.block_id_)\r\n            {\r\n\t\t\t    return pop_slow();\r\n            }\r\n            else\r\n            {\r\n\t\t\t    return 0;\r\n            }\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tvoid* i;\r\n\t\t\tpop_check_result const rv = pop_check(i);\r\n\t\t\tif (pop_check_cont != rv)\r\n\t\t\t\treturn pop_check_succ == rv ? i : 0;\r\n\t\t\treturn pop_unbalanced(); // recursion, must succeed\r\n\t\t}\r\n\t}\r\n\r\n    void* steal()\r\n    {\r\n        pdr_lock();\r\n\r\nretry:\r\n\t\tfor (;;)\r\n\t\t{\r\n            block* old_b = top_.block_($).load(std::memory_order_acquire);\r\n\t\t    block* b = old_b;\r\n\t\t\ttop::info old = top_.info_($).load(std::memory_order_consume);\r\n\r\n\t\t\tif (old.top_index_ == old.bottom_index_\r\n\t\t\t\t&& old.top_block_id_ == old.bottom_block_id_)\r\n\t\t\t{\r\n                pdr_unlock();\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\r\n\t\t\tif (b->header_.id_ != old.top_block_id_)\r\n\t\t\t{\r\n\t\t\t\tdo\r\n\t\t\t\t{\r\n\t\t\t\t\tb = b->header_.next_($).load(std::memory_order_relaxed);\r\n                    //RL_ASSERT(b);\r\n                    //!!! temp stub - is it right?\r\n                    // it seems that we always return 0 after we hit this goto\r\n                    if (0 == b)\r\n                        goto retry;\r\n\t\t\t\t}\r\n\t\t\t\t//!!! AV\r\n\t\t\t\t// b == 0\r\n\t\t\t\twhile (b->header_.id_ != old.top_block_id_);\r\n\r\n                if (top_.block_($).compare_swap(old_b, b, std::memory_order_seq_cst))\r\n\t\t\t\t{\r\n\t\t\t\t\tblock* cur_b = old_b;\r\n\t\t\t\t\tdo\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tpdr_defer(cur_b);\r\n\t\t\t\t\t\tcur_b = cur_b->header_.next_($).load(std::memory_order_relaxed);\r\n\t\t\t\t\t}\r\n\t\t\t\t\twhile (cur_b != b);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tblock* next_block = 0;\r\n\t\t\ttop::info mod = old;\r\n\r\n            void* i = b->data_[mod.top_index_]($).load(std::memory_order_consume);\r\n\r\n\t\t\tif (block::item_count - 1 == mod.top_index_)\r\n\t\t\t{\r\n\t\t\t\tnext_block = b->header_.next_($).load(std::memory_order_relaxed);\r\n\t\t\t\tmod.top_block_id_ += 1;\r\n\t\t\t\tmod.top_index_ = 0;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tmod.top_index_ += 1;\r\n\t\t\t}\r\n\r\n\t\t\tif (top_.info_($).compare_swap(old, mod, std::memory_order_seq_cst))\r\n\t\t\t{\r\n\t\t\t\tif (next_block)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (top_.block_($).compare_swap(b, next_block))\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tpdr_defer(b);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n                pdr_unlock();\r\n\t\t\t\treturn i;\r\n\t\t\t}\r\n\t\t}\r\n    }\r\n\r\n\tunsigned size() const\r\n\t{\r\n        top::info const top = top_.info_($).load(std::memory_order_relaxed);\r\n\t\t//unsigned volatile const top_block_id = top_.info_.part_.top_block_id_;\r\n\t\t//unsigned volatile const top_index = top_.info_.part_.top_index_;\r\n\r\n\t\tif (bottom_.real_block_id_ == top.top_block_id_)\r\n\t\t{\r\n\t\t\tunsigned const size = bottom_.real_index_ - top.top_index_;\r\n\t\t\treturn size;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tunsigned size = bottom_.real_index_;\r\n\t\t\tsize += block::item_count - top.top_index_;\r\n\t\t\tsize += (bottom_.real_block_id_ - top.top_block_id_ - 1) * block::item_count;\r\n\t\t\treturn size;\r\n\t\t}\r\n\t}\r\n\r\nprivate:\r\n\tstruct block\r\n\t{\r\n\t\tstruct header\r\n\t\t{\r\n            std::atomic<block*> next_;\r\n            std::atomic<block*> prev_;\r\n\t\t\tws_deque* deque_;\r\n\t\t\tunsigned id_;\r\n\r\n            //!!!\r\n            ~header()\r\n            {\r\n                id_ = 0;\r\n            }\r\n\t\t};\r\n\t\tstatic unsigned const item_count = 2;\r\n\r\n\t\theader header_;\r\n        std::atomic<void*> data_ [item_count];\r\n\t};\r\n\r\n\tstruct bottom\r\n\t{\r\n        rl::var<block*> block_;\r\n\t\t\r\n\t\tunsigned check_order_;\r\n\r\n\t\tunsigned real_block_id_;\r\n\t\tunsigned real_index_;\r\n\r\n\t\tunsigned block_id_;\r\n\t\tunsigned index_;\r\n\r\n\t\tunsigned block_seq_;\r\n\t};\r\n\r\n\tstruct top\r\n\t{\r\n\t\tstruct info\r\n\t\t{\r\n\t\t\tunsigned short top_index_;\r\n\t\t\tunsigned short top_block_id_;\r\n\t\t\tunsigned short bottom_index_;\r\n\t\t\tunsigned short bottom_block_id_;\r\n\r\n            bool operator == (info const& x) const\r\n            {\r\n                return top_index_ == x.top_index_\r\n                    && top_block_id_ == x.top_block_id_\r\n                    && bottom_index_ == x.bottom_index_\r\n                    && bottom_block_id_ == x.bottom_block_id_;\r\n            }\r\n\r\n            friend std::ostream& operator << (std::ostream& ss, info const& x)\r\n            {\r\n                return ss << \"{\" << x.top_index_\r\n                    << \",\" << x.top_block_id_\r\n                    << \",\" << x.bottom_index_\r\n                    << \",\" << x.bottom_block_id_ << \"}\";\r\n            }\r\n\t\t};\r\n\r\n        std::atomic<block*> block_;\r\n        std::atomic<info> info_;\r\n\t};\r\n\r\n\tbottom bottom_;\r\n\r\n\tchar pad1 [64];\r\n\r\n\ttop top_;\r\n\r\n\tchar pad2 [64];\r\n\r\n\tvoid alloc_block()\r\n\t{\r\n\t\t//!!! check whether we already have next block in \r\n\t\t// bottom_.block_->header_.next_\r\n\t\tblock* b = bottom_.block_($) ? bottom_.block_($)->header_.next_($).load(std::memory_order_relaxed) : 0;\r\n\t\tif (0 == b)\r\n\t\t{\r\n\t\t\tb = RL_NEW block;\r\n\t\t\tb->header_.deque_ = this;\r\n\t\t\tbottom_.block_seq_ += 1;\r\n\r\n\t\t\t//!!!\r\n\t\t\tif (bottom_.block_seq_ > 0xffff) __asm int 3;\r\n\r\n\t\t\tbottom_.block_seq_ &= 0xffff;\r\n\t\t\tb->header_.id_ = bottom_.block_seq_;\r\n            b->header_.prev_($).store(bottom_.block_($), std::memory_order_relaxed);\r\n\t\t\tif (bottom_.block_($))\r\n\t\t\t\tbottom_.block_($)->header_.next_($).store(b, std::memory_order_relaxed);\r\n\t\t\tb->header_.next_($).store(0, std::memory_order_relaxed);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n            b = b;\r\n\t\t\tbottom_.block_seq_ += 1;\r\n\t\t\t//__asm int 3;\r\n\t\t}\r\n\t\tbottom_.block_($) = b;\r\n\t\tbottom_.real_block_id_ = b->header_.id_;\r\n\t\tbottom_.real_index_ = 0;\r\n\t}\r\n\r\n\tenum pop_check_result {pop_check_fail, pop_check_succ, pop_check_cont};\r\n\r\n\tpop_check_result pop_check(void*& i)\r\n\t{\r\n\t\tcheck_bottom();\r\n\r\n\t\tif (bottom_.block_id_ == bottom_.real_block_id_\r\n\t\t\t&& bottom_.index_ == bottom_.real_index_)\r\n\t\t{\r\n            top::info const top = top_.info_($).load(std::memory_order_seq_cst);\r\n\r\n\t\t\tif ((bottom_.block_id_ == top.top_block_id_\r\n\t\t\t\t\t&& bottom_.index_ == (unsigned)top.top_index_ + 1)\r\n\t\t\t\t|| (bottom_.block_id_ == (unsigned)top.top_block_id_ + 1\r\n\t\t\t\t\t&& block::item_count - 1 == top.top_index_\r\n\t\t\t\t\t&& 0 == bottom_.index_ ))\r\n\t\t\t{\r\n                __asm int 3;\r\n                i = steal();\r\n\t\t\t\tif (i)\r\n\t\t\t\t\treturn pop_check_succ;\r\n\t\t\t}\r\n\r\n\t\t\treturn pop_check_fail;\r\n\t\t}\r\n\r\n\t\treturn pop_check_cont;\r\n\t}\r\n\r\n\tvoid* pop_slow()\r\n\t{\r\n\t\tbottom_.block_seq_ -= 1;\r\n\t\tbottom_.block_seq_ &= 0xffff;\r\n        bottom_.block_($) = bottom_.block_($)->header_.prev_($).load(std::memory_order_relaxed);\r\n\r\n\t\t//!!! AV: when core count set to 16\r\n\t\t// bottom_.block_ = 0\r\n\t\t// bottom.real_block_id = 1\r\n\t\t// bottom.block_id = 8\r\n\r\n\t\t//!!! AV in xscale too (thread count is 4)\r\n\t\t// the same variables values\r\n\t\tbottom_.real_block_id_ = bottom_.block_($)->header_.id_;\r\n\t\tbottom_.real_index_ = block::item_count - 1;\r\n\r\n        top::info i = top_.info_($).load(std::memory_order_relaxed);\r\n\r\n        RL_ASSERT(bottom_.block_($)->header_.id_ == bottom_.block_seq_);\r\n        RL_ASSERT((bottom_.real_block_id_ == i.bottom_block_id_ && bottom_.real_index_ >= i.bottom_index_)\r\n            || (bottom_.real_block_id_ > i.bottom_block_id_));\r\n\r\n        void* v = bottom_.block_($)->data_[block::item_count - 1]($).load(std::memory_order_consume);\r\n        return v;\r\n\t}\r\n\r\n\tvoid check_bottom()\r\n\t{\r\n\t\t//!!! must leave at least 1 element unreserved\r\n\t\t// because owner have to steal it\r\n\r\n\t\tfor (;;)\r\n\t\t{\r\n            top::info old = top_.info_($).load(std::memory_order_relaxed);\r\n\r\n\t\t\tunsigned const top_block_id = old.top_block_id_;\r\n\t\t\tunsigned const top_index = old.top_index_;\r\n\r\n\t\t\tif (bottom_.real_block_id_ == top_block_id\r\n\t\t\t\t&& bottom_.real_index_ == top_index)\r\n\t\t\t{\r\n\t\t\t\tbottom_.check_order_ = 2;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tunsigned const s = size();\r\n\t\t\tunsigned const r = reserved();\r\n\t\t\tif (!(0 == r || (r > 1 && 4*r > 3*s)))\r\n\t\t\t{\r\n\t\t\t\t//bottom_.check_order_ = 2;\r\n\t\t\t\t//!!! bottom_.check_order_ = s / 8 + 2;\r\n\t\t\t\tbottom_.check_order_ = s / 2 + 2;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tunsigned r2 = s*3/4 + 1;\r\n\t\t\tif (r2 >= s)\r\n\t\t\t\tr2 = s - 1;\r\n\t\t\tunsigned bottom_block_id;\r\n\t\t\tunsigned bottom_index;\r\n\t\t\tif (r2 + top_index < block::item_count)\r\n\t\t\t{\r\n\t\t\t\tbottom_block_id = top_block_id;\r\n\t\t\t\tbottom_index = top_index + r2;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tunsigned const r3 = r2 + top_index;\r\n\t\t\t\tbottom_block_id = top_block_id + r3 / block::item_count;\r\n\t\t\t\tbottom_index = r3 % block::item_count;\r\n\t\t\t}\r\n\t\t\ttop::info i;\r\n\t\t\ti.top_block_id_ = static_cast<unsigned short>(top_block_id);\r\n\t\t\ti.top_index_ = static_cast<unsigned short>(top_index);\r\n\t\t\ti.bottom_block_id_ = static_cast<unsigned short>(bottom_block_id);\r\n\t\t\ti.bottom_index_ = static_cast<unsigned short>(bottom_index);\r\n\r\n\t\t\t/*\r\n\t\t\tbottom volatile btm = bottom_;\r\n\t\t\tif (i.part_.top_block_id_ > i.part_.bottom_block_id_)\r\n\t\t\t\t__asm int 3;\r\n\t\t\tif (i.part_.top_block_id_ == i.part_.bottom_block_id_\r\n\t\t\t\t&& i.part_.top_index_ >= i.part_.bottom_index_)\r\n\t\t\t\t__asm int 3;\r\n\t\t\tif (i.part_.bottom_block_id_ > btm.real_block_id_)\r\n\t\t\t\t__asm int 3;\r\n\t\t\tif (i.part_.bottom_block_id_ == btm.real_block_id_\r\n\t\t\t\t&& i.part_.bottom_index_ > btm.real_index_)\r\n\t\t\t\t__asm int 3;\r\n\t\t\t*/\r\n\r\n            if (top_.info_($).compare_swap(old, i, std::memory_order_seq_cst))\r\n\t\t\t{\r\n\t\t\t\tbottom_.block_id_ = bottom_block_id;\r\n\t\t\t\tbottom_.index_ = bottom_index;\r\n\t\t\t\t//!!! bottom_.check_order_ = s / 8 + 2;\r\n\t\t\t\tbottom_.check_order_ = s / 2 + 2;\r\n\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tunsigned reserved() const\r\n\t{\r\n\t\tif (bottom_.real_block_id_ == bottom_.block_id_)\r\n\t\t{\r\n\t\t\tunsigned const reserved = bottom_.real_index_ - bottom_.index_;\r\n\t\t\treturn reserved;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tunsigned reserved = bottom_.real_index_;\r\n\t\t\treserved += block::item_count - bottom_.index_;\r\n\t\t\treserved += (bottom_.real_block_id_ - bottom_.block_id_ - 1) * block::item_count;\r\n\t\t\treturn reserved;\r\n\t\t}\r\n\t}\r\n};\r\n\r\nint x = 0;\r\n\r\nstruct ws_deque_test : rl::test_suite<ws_deque_test, 4>\r\n{\r\n    ws_deque q;\r\n    pdr p;\r\n\r\n    void before()\r\n    {\r\n        p.init(4);\r\n    }\r\n\r\n    void after()\r\n    {\r\n        p.fini();\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            for (size_t i = 0; i != 4; ++i)\r\n            {\r\n                q.push((void*)10);\r\n            }\r\n\r\n            for (size_t i = 0; i != 5; ++i)\r\n            {\r\n                void* p = q.pop();\r\n                RL_ASSERT((void*)10 == p || 0 == p);\r\n            }\r\n\r\n            for (size_t i = 0; i != 4; ++i)\r\n            {\r\n                q.push((void*)10);\r\n                void* p = q.pop();\r\n                RL_ASSERT((void*)10 == p || 0 == p);\r\n            }\r\n\r\n            for (size_t i = 0; i != 4; ++i)\r\n            {\r\n                q.push((void*)10);\r\n                q.push((void*)10);\r\n                void* p = q.pop();\r\n                RL_ASSERT((void*)10 == p || 0 == p);\r\n                p = q.pop();\r\n                RL_ASSERT((void*)10 == p || 0 == p);\r\n            }\r\n\r\n            for (size_t i = 0; i != 4; ++i)\r\n            {\r\n                q.push((void*)10);\r\n                q.push((void*)10);\r\n                q.push((void*)10);\r\n                void* p = q.pop();\r\n                RL_ASSERT((void*)10 == p || 0 == p);\r\n            }\r\n\r\n            for (size_t i = 0; i != 14; ++i)\r\n            {\r\n                q.push((void*)10);\r\n                void* p = q.pop();\r\n                RL_ASSERT((void*)10 == p || 0 == p);\r\n            }\r\n        }\r\n        else\r\n        {\r\n            for (size_t i = 0; i != 4; ++i)\r\n            {\r\n                void* p = q.steal();\r\n                RL_ASSERT((void*)10 == p || 0 == p);\r\n            }\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nint main()\r\n{\r\n    rl::test_params p;\r\n    p.iteration_count = 1000000;\r\n    rl::simulate<ws_deque_test>(p);\r\n}\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/atomic.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_ATOMIC_HPP\r\n#define RL_ATOMIC_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n#include \"context.hpp\"\r\n#include \"memory_order.hpp\"\r\n#include \"signature.hpp\"\r\n#include \"atomic_events.hpp\"\r\n#include \"waitset.hpp\"\r\n#include \"rmw.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\n\r\ntemplate<typename T>\r\nclass atomic;\r\n\r\n\r\ntemplate<bool> struct bool_t {};\r\n\r\n\r\n\r\ntemplate<typename T>\r\nclass atomic_proxy_const\r\n{\r\npublic:\r\n    atomic_proxy_const(atomic<T> const /*volatile*/& var, debug_info_param info)\r\n        : var_(const_cast<atomic<T>&>(var))\r\n        , info_(info)\r\n    {\r\n    }\r\n\r\n    T load(memory_order mo = mo_seq_cst) const\r\n    {\r\n        return var_.load(mo, info_);\r\n    }\r\n\r\n    operator T () const\r\n    {\r\n        return load();\r\n    }\r\n\r\nprotected:\r\n    atomic<T>& var_;\r\n    debug_info info_;\r\n\r\n    atomic_proxy_const& operator = (atomic_proxy_const const&);\r\n};\r\n\r\n\r\n\r\n\r\ntemplate<typename T>\r\nclass atomic_proxy : public atomic_proxy_const<T>\r\n{\r\npublic:\r\n    typedef typename atomic_add_type<T>::type add_type;\r\n\r\n    atomic_proxy(atomic<T> /*volatile*/& var, debug_info_param info)\r\n        : atomic_proxy_const<T>(var, info)\r\n    {\r\n    }\r\n\r\n    void store(T value, memory_order mo = mo_seq_cst)\r\n    {\r\n        this->var_.store(value, mo, this->info_);\r\n    }\r\n\r\n    bool compare_exchange_weak(T& cmp, T xchg, memory_order mo = mo_seq_cst)\r\n    {\r\n        return this->var_.compare_exchange(bool_t<true>(), cmp, xchg, mo, this->info_);\r\n    }\r\n\r\n    bool compare_exchange_weak(T& cmp, T xchg, memory_order mo, memory_order failure_mo)\r\n    {\r\n        return this->var_.compare_exchange(bool_t<true>(), cmp, xchg, mo, failure_mo, this->info_);\r\n    }\r\n\r\n    bool compare_exchange_strong(T& cmp, T xchg, memory_order mo = mo_seq_cst)\r\n    {\r\n        return this->var_.compare_exchange(bool_t<false>(), cmp, xchg, mo, this->info_);\r\n    }\r\n\r\n    bool compare_exchange_strong(T& cmp, T xchg, memory_order mo, memory_order failure_mo)\r\n    {\r\n        return this->var_.compare_exchange(bool_t<false>(), cmp, xchg, mo, failure_mo, this->info_);\r\n    }\r\n\r\n    T exchange(T xchg, memory_order mo = mo_seq_cst)\r\n    {\r\n        return this->var_.rmw(rmw_type_t<rmw_type_swap>(), xchg, mo, this->info_);\r\n    }\r\n\r\n    T fetch_add(add_type value, memory_order mo = mo_seq_cst)\r\n    {\r\n        return this->var_.rmw(rmw_type_t<rmw_type_add>(), value, mo, this->info_);\r\n    }\r\n\r\n    T fetch_sub(add_type value, memory_order mo = mo_seq_cst)\r\n    {\r\n        return this->var_.rmw(rmw_type_t<rmw_type_sub>(), value, mo, this->info_);\r\n    }\r\n\r\n    T fetch_and(T value, memory_order mo = mo_seq_cst)\r\n    {\r\n        return this->var_.rmw(rmw_type_t<rmw_type_and>(), value, mo, this->info_);\r\n    }\r\n\r\n    T fetch_or(T value, memory_order mo = mo_seq_cst)\r\n    {\r\n        return this->var_.rmw(rmw_type_t<rmw_type_or>(), value, mo, this->info_);\r\n    }\r\n\r\n    T fetch_xor(T value, memory_order mo = mo_seq_cst)\r\n    {\r\n        return this->var_.rmw(rmw_type_t<rmw_type_xor>(), value, mo, this->info_);\r\n    }\r\n\r\n    T operator = (T value)\r\n    {\r\n        store(value);\r\n        return value;\r\n    }\r\n\r\n    T operator ++ (int)\r\n    {\r\n        return fetch_add(1);\r\n    }\r\n\r\n    T operator -- (int)\r\n    {\r\n        return fetch_sub(1);\r\n    }\r\n\r\n    T operator ++ ()\r\n    {\r\n        return fetch_add(1) + 1;\r\n    }\r\n\r\n    T operator -- ()\r\n    {\r\n        return fetch_sub(1) - 1;\r\n    }\r\n\r\n    T operator += (add_type value)\r\n    {\r\n        return fetch_add(value) + value;\r\n    }\r\n\r\n    T operator -= (add_type value)\r\n    {\r\n        return fetch_sub(value) + value;\r\n    }\r\n\r\n    T operator &= (T value)\r\n    {\r\n        return fetch_and(value) & value;\r\n    }\r\n\r\n    T operator |= (T value)\r\n    {\r\n        return fetch_or(value) | value;\r\n    }\r\n\r\n    T operator ^= (T value)\r\n    {\r\n        return fetch_xor(value) ^ value;\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\ntemplate<typename T, bool strong_init>\r\nclass generic_atomic\r\n{\r\npublic:\r\n    generic_atomic()\r\n    {\r\n        context& c = ctx();\r\n        RL_VERIFY(false == c.invariant_executing);\r\n        impl_ = c.atomic_ctor(this);\r\n        initialized_ = false;\r\n        value_ = T();\r\n        already_failed_ = false;\r\n\r\n        if (val(strong_init))\r\n        {\r\n            unsigned const index = c.threadx_->atomic_init(impl_);\r\n            last_index_ = index;\r\n            initialized_ = true;\r\n            history_[index] = T();\r\n            value_ = T();\r\n        }\r\n    }\r\n\r\n    ~generic_atomic()\r\n    {\r\n        context& c = ctx();\r\n        RL_VERIFY(false == c.invariant_executing);\r\n        sign_.check($);\r\n        c.atomic_dtor(impl_);\r\n    }\r\n\r\n    T debug_value() const\r\n    {\r\n        sign_.check($);\r\n        return value_;\r\n    }\r\n\r\n    RL_INLINE\r\n    T load(memory_order mo, debug_info_param info) const\r\n    {\r\n        RL_VERIFY(mo_release != mo);\r\n        RL_VERIFY(mo_acq_rel != mo);\r\n\r\n        switch (mo)\r\n        {\r\n        case mo_relaxed: return load_impl<mo_relaxed, &thread_info_base::atomic_load_relaxed>(info);\r\n        case mo_consume: return load_impl<mo_consume, &thread_info_base::atomic_load_acquire>(info);\r\n        case mo_acquire: return load_impl<mo_acquire, &thread_info_base::atomic_load_acquire>(info);\r\n        case mo_seq_cst: return load_impl<mo_seq_cst, &thread_info_base::atomic_load_seq_cst>(info);\r\n        default: break;\r\n        }\r\n\r\n        RL_VERIFY(false);\r\n        return T();\r\n    }\r\n\r\n    RL_INLINE\r\n    void store(T v, memory_order mo, debug_info_param info)\r\n    {\r\n        RL_VERIFY(mo_acquire != mo);\r\n        RL_VERIFY(mo_acq_rel != mo);\r\n\r\n        switch (mo)\r\n        {\r\n        case mo_relaxed: return store_impl<mo_relaxed, &thread_info_base::atomic_store_relaxed>(v, info);\r\n        case mo_release: return store_impl<mo_release, &thread_info_base::atomic_store_release>(v, info);\r\n        case mo_seq_cst: return store_impl< mo_seq_cst, &thread_info_base::atomic_store_seq_cst>(v, info);\r\n        default: break;\r\n        }\r\n\r\n        RL_VERIFY(false);\r\n    }\r\n\r\n    RL_INLINE\r\n    bool compare_exchange_weak(T& cmp, T xchg, memory_order mo, debug_info_param info)\r\n    {\r\n        return compare_exchange(bool_t<true>(), cmp, xchg, mo, info);\r\n    }\r\n\r\n    RL_INLINE\r\n    bool compare_exchange_strong(T& cmp, T xchg, memory_order mo, debug_info_param info)\r\n    {\r\n        return compare_exchange(bool_t<false>(), cmp, xchg, mo, info);\r\n    }\r\n\r\n    RL_INLINE\r\n    bool compare_exchange_weak(T& cmp, T xchg, memory_order mo, debug_info_param info, memory_order failure_mo, debug_info_param)\r\n    {\r\n        return compare_exchange(bool_t<true>(), cmp, xchg, mo, failure_mo, info);\r\n    }\r\n\r\n    RL_INLINE\r\n    bool compare_exchange_strong(T& cmp, T xchg, memory_order mo, debug_info_param info, memory_order failure_mo, debug_info_param)\r\n    {\r\n        return compare_exchange(bool_t<false>(), cmp, xchg, mo, failure_mo, info);\r\n    }\r\n\r\n    template<bool spurious_failures>\r\n    RL_INLINE\r\n    bool compare_exchange(bool_t<spurious_failures>, T& cmp, T xchg, memory_order mo, debug_info_param info)\r\n    {\r\n        switch (mo)\r\n        {\r\n        case mo_relaxed: return compare_swap_impl<spurious_failures, mo_relaxed, &thread_info_base::atomic_rmw_relaxed, mo_relaxed, &thread_info_base::atomic_load_relaxed_rmw>(cmp, xchg, info);\r\n        case mo_consume: return compare_swap_impl<spurious_failures, mo_consume, &thread_info_base::atomic_rmw_acquire, mo_consume, &thread_info_base::atomic_load_acquire_rmw>(cmp, xchg, info);\r\n        case mo_acquire: return compare_swap_impl<spurious_failures, mo_acquire, &thread_info_base::atomic_rmw_acquire, mo_acquire, &thread_info_base::atomic_load_acquire_rmw>(cmp, xchg, info);\r\n        case mo_release: return compare_swap_impl<spurious_failures, mo_release, &thread_info_base::atomic_rmw_release, mo_relaxed, &thread_info_base::atomic_load_relaxed_rmw>(cmp, xchg, info);\r\n        case mo_acq_rel: return compare_swap_impl<spurious_failures, mo_acq_rel, &thread_info_base::atomic_rmw_acq_rel, mo_acquire, &thread_info_base::atomic_load_acquire_rmw>(cmp, xchg, info);\r\n        case mo_seq_cst: return compare_swap_impl<spurious_failures, mo_seq_cst, &thread_info_base::atomic_rmw_seq_cst, mo_seq_cst, &thread_info_base::atomic_load_seq_cst_rmw>(cmp, xchg, info);\r\n        }\r\n\r\n        RL_VERIFY(false);\r\n        return false;\r\n    }\r\n\r\n    template<bool spurious_failures>\r\n    RL_INLINE\r\n    bool compare_exchange(bool_t<spurious_failures>, T& cmp, T xchg, memory_order mo, memory_order failure_mo, debug_info_param info)\r\n    {\r\n        switch (mo)\r\n        {\r\n        case mo_relaxed:\r\n            {\r\n                RL_VERIFY(mo_relaxed == failure_mo);\r\n                return compare_swap_impl<spurious_failures, mo_relaxed, &thread_info_base::atomic_rmw_relaxed, mo_relaxed, &thread_info_base::atomic_load_relaxed_rmw>(cmp, xchg, info);\r\n            }\r\n        case mo_consume:\r\n            {\r\n                RL_VERIFY(mo_relaxed == failure_mo || mo_consume == failure_mo);\r\n                switch (failure_mo)\r\n                {\r\n                case mo_relaxed: return compare_swap_impl<spurious_failures, mo_consume, &thread_info_base::atomic_rmw_acquire, mo_relaxed, &thread_info_base::atomic_load_relaxed_rmw>(cmp, xchg, info);\r\n                case mo_consume: return compare_swap_impl<spurious_failures, mo_consume, &thread_info_base::atomic_rmw_acquire, mo_consume, &thread_info_base::atomic_load_acquire_rmw>(cmp, xchg, info);\r\n                default: RL_VERIFY(false); return false;\r\n                }\r\n            }\r\n        case mo_acquire:\r\n            {\r\n                RL_VERIFY(mo_relaxed == failure_mo || mo_consume == failure_mo || mo_acquire == failure_mo);\r\n                switch (failure_mo)\r\n                {\r\n                case mo_relaxed: return compare_swap_impl<spurious_failures, mo_acquire, &thread_info_base::atomic_rmw_acquire, mo_relaxed, &thread_info_base::atomic_load_relaxed_rmw>(cmp, xchg, info);\r\n                case mo_consume: return compare_swap_impl<spurious_failures, mo_acquire, &thread_info_base::atomic_rmw_acquire, mo_consume, &thread_info_base::atomic_load_acquire_rmw>(cmp, xchg, info);\r\n                case mo_acquire: return compare_swap_impl<spurious_failures, mo_acquire, &thread_info_base::atomic_rmw_acquire, mo_acquire, &thread_info_base::atomic_load_acquire_rmw>(cmp, xchg, info);\r\n                default: RL_VERIFY(false); return false;\r\n                }\r\n            }\r\n        case mo_release:\r\n            {\r\n                RL_VERIFY(mo_relaxed == failure_mo);\r\n                return compare_swap_impl<spurious_failures, mo_release, &thread_info_base::atomic_rmw_release, mo_relaxed, &thread_info_base::atomic_load_relaxed_rmw>(cmp, xchg, info);\r\n            }\r\n        case mo_acq_rel:\r\n            {\r\n                RL_VERIFY(mo_relaxed == failure_mo || mo_consume == failure_mo || mo_acquire == failure_mo);\r\n                switch (failure_mo)\r\n                {\r\n                case mo_relaxed: return compare_swap_impl<spurious_failures, mo_acq_rel, &thread_info_base::atomic_rmw_acq_rel, mo_relaxed, &thread_info_base::atomic_load_relaxed_rmw>(cmp, xchg, info);\r\n                case mo_consume: return compare_swap_impl<spurious_failures, mo_acq_rel, &thread_info_base::atomic_rmw_acq_rel, mo_consume, &thread_info_base::atomic_load_acquire_rmw>(cmp, xchg, info);\r\n                case mo_acquire: return compare_swap_impl<spurious_failures, mo_acq_rel, &thread_info_base::atomic_rmw_acq_rel, mo_acquire, &thread_info_base::atomic_load_acquire_rmw>(cmp, xchg, info);\r\n                default: RL_VERIFY(false); return false;\r\n                }\r\n            }\r\n        case mo_seq_cst:\r\n            {\r\n                RL_VERIFY(mo_relaxed == failure_mo || mo_consume == failure_mo || mo_acquire == failure_mo || mo_seq_cst == failure_mo);\r\n                switch (failure_mo)\r\n                {\r\n                case mo_relaxed: return compare_swap_impl<spurious_failures, mo_seq_cst, &thread_info_base::atomic_rmw_seq_cst, mo_relaxed, &thread_info_base::atomic_load_relaxed_rmw>(cmp, xchg, info);\r\n                case mo_consume: return compare_swap_impl<spurious_failures, mo_seq_cst, &thread_info_base::atomic_rmw_seq_cst, mo_consume, &thread_info_base::atomic_load_acquire_rmw>(cmp, xchg, info);\r\n                case mo_acquire: return compare_swap_impl<spurious_failures, mo_seq_cst, &thread_info_base::atomic_rmw_seq_cst, mo_acquire, &thread_info_base::atomic_load_acquire_rmw>(cmp, xchg, info);\r\n                case mo_seq_cst: return compare_swap_impl<spurious_failures, mo_seq_cst, &thread_info_base::atomic_rmw_seq_cst, mo_seq_cst, &thread_info_base::atomic_load_seq_cst_rmw>(cmp, xchg, info);\r\n                default: RL_VERIFY(false); return false;\r\n                }\r\n            }\r\n        }\r\n\r\n        RL_VERIFY(false);\r\n        return false;\r\n    }\r\n\r\n    T exchange(T xchg, memory_order mo, debug_info_param info)\r\n    {\r\n        return rmw(rmw_type_t<rmw_type_swap>(), xchg, mo, info);\r\n    }\r\n\r\n    T fetch_add(typename atomic_add_type<T>::type value, memory_order mo, debug_info_param info)\r\n    {\r\n        return rmw(rmw_type_t<rmw_type_add>(), value, mo, info);\r\n    }\r\n\r\n    T fetch_sub(typename atomic_add_type<T>::type value, memory_order mo, debug_info_param info)\r\n    {\r\n        return rmw(rmw_type_t<rmw_type_sub>(), value, mo, info);\r\n    }\r\n\r\n    T fetch_and(T value, memory_order mo, debug_info_param info)\r\n    {\r\n        return rmw(rmw_type_t<rmw_type_and>(), value, mo, info);\r\n    }\r\n\r\n    T fetch_or(T value, memory_order mo, debug_info_param info)\r\n    {\r\n        return rmw(rmw_type_t<rmw_type_or>(), value, mo, info);\r\n    }\r\n\r\n    T fetch_xor(T value, memory_order mo, debug_info_param info)\r\n    {\r\n        return rmw(rmw_type_t<rmw_type_xor>(), value, mo, info);\r\n    }\r\n\r\n    template<typename Y, rmw_type_e type>\r\n    RL_INLINE\r\n    T rmw(rmw_type_t<type>, Y op, memory_order mo, debug_info_param info)\r\n    {\r\n        switch (mo)\r\n        {\r\n        case mo_relaxed: return rmw_impl<Y, mo_relaxed, &thread_info_base::atomic_rmw_relaxed>(rmw_type_t<type>(), op, info);\r\n        case mo_consume: return rmw_impl<Y, mo_consume, &thread_info_base::atomic_rmw_acquire>(rmw_type_t<type>(), op, info);\r\n        case mo_acquire: return rmw_impl<Y, mo_acquire, &thread_info_base::atomic_rmw_acquire>(rmw_type_t<type>(), op, info);\r\n        case mo_release: return rmw_impl<Y, mo_release, &thread_info_base::atomic_rmw_release>(rmw_type_t<type>(), op, info);\r\n        case mo_acq_rel: return rmw_impl<Y, mo_acq_rel, &thread_info_base::atomic_rmw_acq_rel>(rmw_type_t<type>(), op, info);\r\n        case mo_seq_cst: return rmw_impl<Y, mo_seq_cst, &thread_info_base::atomic_rmw_seq_cst>(rmw_type_t<type>(), op, info);\r\n        }\r\n\r\n        RL_VERIFY(false);\r\n        return T();\r\n    }\r\n\r\n    unpark_reason wait(context& c, bool is_timed, bool allow_spurious_wakeup, debug_info_param info)\r\n    {\r\n        sign_.check(info);\r\n        return c.threadx_->atomic_wait(impl_, is_timed, allow_spurious_wakeup, info);\r\n    }\r\n\r\n    thread_id_t wake(context& c, thread_id_t count, debug_info_param info)\r\n    {\r\n        sign_.check(info);\r\n        return c.threadx_->atomic_wake(impl_, count, info);\r\n    }\r\n\r\nprivate:\r\n    T value_;\r\n    T history_ [atomic_history_size];\r\n    atomic_data* impl_;\r\n    unsigned last_index_;\r\n    signature<987654321> sign_;\r\n    bool initialized_;\r\n    bool already_failed_;\r\n\r\n    template<memory_order mo, unsigned (thread_info_base::*impl)(atomic_data* RL_RESTRICT data)>\r\n    T load_impl(debug_info_param info) const\r\n    {\r\n        context& c = ctx();\r\n        c.sched();\r\n        sign_.check(info);\r\n\r\n        if (false == c.invariant_executing)\r\n        {\r\n            unsigned const index = (c.threadx_->*impl)(impl_);\r\n            if ((unsigned)-1 == index)\r\n            {\r\n                RL_HIST(atomic_load_event<T>) {this, T(), mo, false} RL_HIST_END();\r\n                RL_ASSERT_IMPL(false, test_result_unitialized_access, \"\", info);\r\n            }\r\n            T const v = history_[index];\r\n\r\n            RL_HIST(atomic_load_event<T>) {this, v, mo, last_index_ != index} RL_HIST_END();\r\n\r\n            return v;\r\n        }\r\n        else\r\n        {\r\n            if (false == initialized_)\r\n            {\r\n                RL_HIST(atomic_load_event<T>) {this, T(), mo, false} RL_HIST_END();\r\n                RL_ASSERT_IMPL(false, test_result_unitialized_access, \"\", info);\r\n            }\r\n            return value_;\r\n        }\r\n    }\r\n\r\n    template<memory_order mo, unsigned (thread_info_base::*impl)(atomic_data* RL_RESTRICT data)>\r\n    void store_impl(T v, debug_info_param info)\r\n    {\r\n        context& c = ctx();\r\n        RL_VERIFY(false == c.invariant_executing);\r\n        c.sched();\r\n        sign_.check(info);\r\n\r\n        unsigned const index = (c.threadx_->*impl)(impl_);\r\n        \r\n        T const prev = value_;\r\n        last_index_ = index;\r\n        history_[index] = v;\r\n        value_ = v;\r\n        initialized_ = true;\r\n        RL_HIST(atomic_store_event<T>) {this, prev, v, mo} RL_HIST_END();\r\n    }\r\n\r\n    template<bool spurious_failures, memory_order mo, unsigned (thread_info_base::*impl)(atomic_data* RL_RESTRICT data, bool&), memory_order failure_mo, unsigned (thread_info_base::*failure_impl)(atomic_data* RL_RESTRICT data)>\r\n    bool compare_swap_impl(T& cmp, T xchg, debug_info_param info)\r\n    {\r\n        context& c = ctx();\r\n        RL_VERIFY(false == c.invariant_executing);\r\n        c.sched();\r\n        sign_.check(info);\r\n\r\n        if (false == initialized_)\r\n        {\r\n            RL_HIST(atomic_load_event<T>) {this, T(), mo, false} RL_HIST_END();\r\n            RL_ASSERT_IMPL(false, test_result_unitialized_access, \"\", info);\r\n        }\r\n\r\n        bool success = false;\r\n        bool spurious_failure = false;\r\n        bool aba = false;\r\n\r\n        T const cmpv = cmp;\r\n        T const current = value_;\r\n        if (current == cmpv)\r\n        {\r\n            if (val(spurious_failures))\r\n            {\r\n                if (c.is_random_sched())\r\n                {\r\n                    spurious_failure = (0 == c.rand(4, sched_type_cas_fail));\r\n                }\r\n                else\r\n                {\r\n                    if (false == already_failed_)\r\n                    {\r\n                        spurious_failure = 0 == c.rand(2, sched_type_cas_fail);\r\n                        if (spurious_failure)\r\n                            already_failed_ = true;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (false == spurious_failure)\r\n            {\r\n                success = true;\r\n                unsigned const index = (c.threadx_->*impl)(impl_, aba);\r\n                value_ = xchg;\r\n                last_index_ = index;\r\n                history_[index] = xchg;\r\n            }\r\n        }\r\n\r\n        if (false == success)\r\n        {\r\n            (c.threadx_->*failure_impl)(impl_);\r\n            cmp = current;\r\n        }\r\n\r\n        RL_HIST(atomic_cas_event<T>) {RL_INFO, this, current, cmpv, xchg, mo, success, spurious_failure, aba} RL_HIST_END();\r\n\r\n        return success;\r\n    }\r\n\r\n    template<typename Y, memory_order mo, unsigned (thread_info_base::*impl)(atomic_data* RL_RESTRICT data, bool&), rmw_type_e type>\r\n    T rmw_impl(rmw_type_t<type>, Y op, debug_info_param info)\r\n    {\r\n        context& c = ctx();\r\n        RL_VERIFY(false == c.invariant_executing);\r\n        c.sched();\r\n        sign_.check(info);\r\n\r\n        if (false == initialized_)\r\n        {\r\n            RL_HIST(atomic_load_event<T>) {this, T(), mo, false} RL_HIST_END();\r\n            RL_ASSERT_IMPL(false, test_result_unitialized_access, \"\", info);\r\n        }\r\n\r\n        bool aba;\r\n        unsigned const index = (c.threadx_->*impl)(impl_, aba);\r\n\r\n        T const prev_value = value_;\r\n        T const new_value = perform_rmw(rmw_type_t<type>(), prev_value, op);\r\n        value_ = new_value;\r\n        last_index_ = index;\r\n        history_[index] = new_value;\r\n\r\n        typedef atomic_rmw_event<T, Y> atomic_rmw_event_t;\r\n        RL_HIST(atomic_rmw_event_t) {RL_INFO, this, prev_value, op, new_value, mo, type} RL_HIST_END();\r\n\r\n        return prev_value;\r\n    }\r\n\r\n    RL_NOCOPY(generic_atomic);\r\n};\r\n\r\n\r\n\r\n\r\n\r\ntemplate<typename T>\r\nclass atomic : public generic_atomic<T, false>\r\n{\r\npublic:\r\n    atomic()\r\n    {\r\n    }\r\n\r\n    /*explicit*/ atomic(T value)\r\n    {\r\n        this->store(value, mo_relaxed, $);\r\n    }\r\n\r\n    atomic_proxy_const<T> operator () (debug_info_param info) const /*volatile*/\r\n    {\r\n        return atomic_proxy_const<T>(*this, info);\r\n    }\r\n\r\n    atomic_proxy<T> operator () (debug_info_param info) /*volatile*/\r\n    {\r\n        return atomic_proxy<T>(*this, info);\r\n    }\r\n\r\n    bool is_lock_free() const /*volatile*/\r\n    {\r\n        return true;\r\n    }\r\n\r\n    friend class atomic_proxy<T>;\r\n    friend class atomic_proxy_const<T>;\r\n\r\n    RL_NOCOPY(atomic);\r\n};\r\n\r\n\r\n\r\n\r\ntypedef atomic<bool> atomic_bool;\r\ntypedef atomic<void*> atomic_address;\r\n\r\ntypedef atomic<char> atomic_char;\r\ntypedef atomic<signed char> atomic_schar;\r\ntypedef atomic<unsigned char> atomic_uchar;\r\ntypedef atomic<short> atomic_short;\r\ntypedef atomic<unsigned short> atomic_ushort;\r\ntypedef atomic<int> atomic_int;\r\ntypedef atomic<unsigned int> atomic_uint;\r\ntypedef atomic<long> atomic_long;\r\ntypedef atomic<unsigned long> atomic_ulong;\r\ntypedef atomic<long long> atomic_llong;\r\ntypedef atomic<unsigned long long> atomic_ullong;\r\n//typedef atomic<char16_t> atomic_char16_t;\r\n//typedef atomic<char32_t> atomic_char32_t;\r\ntypedef atomic<wchar_t> atomic_wchar_t;\r\n\r\n//typedef atomic<int_least8_t> atomic_int_least8_t;\r\n//typedef atomic<uint_least8_t> atomic_uint_least8_t;\r\n//typedef atomic<int_least16_t> atomic_int_least16_t;\r\n//typedef atomic<uint_least16_t> atomic_uint_least16_t;\r\n//typedef atomic<int_least32_t> atomic_int_least32_t;\r\n//typedef atomic<uint_least32_t> atomic_uint_least32_t;\r\n//typedef atomic<int_least64_t> atomic_int_least64_t;\r\n//typedef atomic<uint_least64_t> atomic_uint_least64_t;\r\n//typedef atomic<int_fast8_t> atomic_int_fast8_t;\r\n//typedef atomic<uint_fast8_t> atomic_uint_fast8_t;\r\n//typedef atomic<int_fast16_t> atomic_int_fast16_t;\r\n//typedef atomic<uint_fast16_t> atomic_uint_fast16_t;\r\n//typedef atomic<int_fast32_t> atomic_int_fast32_t;\r\n//typedef atomic<uint_fast32_t> atomic_uint_fast32_t;\r\n//typedef atomic<int_fast64_t> atomic_int_fast64_t;\r\n//typedef atomic<uint_fast64_t> atomic_uint_fast64_t;\r\ntypedef atomic<intptr_t> atomic_intptr_t;\r\ntypedef atomic<uintptr_t> atomic_uintptr_t;\r\ntypedef atomic<size_t> atomic_size_t;\r\n//typedef atomic<ssize_t> atomic_ssize_t;\r\ntypedef atomic<ptrdiff_t> atomic_ptrdiff_t;\r\n//typedef atomic<intmax_t> atomic_intmax_t;\r\n//typedef atomic<uintmax_t> atomic_uintmax_t;\r\n\r\n\r\n\r\n\r\ntemplate<thread_id_t thread_count>\r\nstruct atomic_data_impl : atomic_data\r\n{\r\n    typedef thread_info<thread_count> thread_info_t;\r\n\r\n    struct history_record\r\n    {\r\n        timestamp_t acq_rel_order_ [thread_count];\r\n        timestamp_t first_seen_order_ [thread_count];\r\n\r\n        bool busy_;\r\n        bool seq_cst_;\r\n        thread_id_t thread_id_;\r\n        timestamp_t acq_rel_timestamp_;\r\n    };\r\n\r\n    static size_t const history_size = atomic_history_size;\r\n    aligned<history_record> history_ [history_size];\r\n    unsigned current_index_;\r\n    waitset<thread_count> futex_ws_;\r\n    sync_var<thread_count> futex_sync_;\r\n\r\n    atomic_data_impl()\r\n    {\r\n        current_index_ = 0;\r\n        history_record& rec = history_[0];\r\n        history_[atomic_history_size - 1].busy_ = false;\r\n\r\n        rec.busy_ = false;\r\n        rec.seq_cst_ = false;\r\n        rec.thread_id_ = (thread_id_t)-1;\r\n    }\r\n\r\n    atomic_data_impl(thread_info_t& th)\r\n    {\r\n        current_index_ = 0;\r\n        history_[atomic_history_size - 1].busy_ = false;\r\n\r\n        history_record& rec = history_[0];\r\n        rec.busy_ = true;\r\n        rec.seq_cst_ = false;\r\n        rec.thread_id_ = th.index_;\r\n\r\n        th.own_acq_rel_order_ += 1;\r\n        rec.acq_rel_timestamp_ = th.own_acq_rel_order_;\r\n\r\n        foreach<thread_count>(rec.acq_rel_order_, assign_zero);\r\n        foreach<thread_count>(rec.first_seen_order_, assign<(timestamp_t)-1>);\r\n        rec.first_seen_order_[th.index_] = th.own_acq_rel_order_;\r\n    }\r\n};\r\n\r\n\r\n}\r\n\r\n\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/atomic_events.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_ATOMIC_EVENTS_HPP\r\n#define RL_ATOMIC_EVENTS_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n#include \"memory_order.hpp\"\r\n#include \"rmw.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\ntemplate<typename T> class atomic;\r\ntemplate<typename T, bool strong_init> class generic_atomic;\r\n\r\ntemplate<typename T>\r\nstruct atomic_add_type\r\n{\r\n    typedef T type;\r\n    typedef T output_type;\r\n};\r\n\r\ntemplate<typename T>\r\nstruct atomic_add_type<T*>\r\n{\r\n    typedef ptrdiff_t type;\r\n    typedef void* output_type;\r\n};\r\n\r\n\r\n\r\n\r\ntemplate<typename T>\r\nstruct atomic_cas_event\r\n{\r\n    typedef typename atomic_add_type<T>::output_type type;\r\n\r\n    debug_info var_info_;\r\n    void const* var_addr_;\r\n    type cur_value_;\r\n    type cmp_value_;\r\n    type xchg_value_;\r\n    memory_order mo_;\r\n    bool success_;\r\n    bool spurious_failure_;\r\n    bool aba_;\r\n\r\n    void output(std::ostream& s) const\r\n    {\r\n        s << \"<\" << std::hex << var_addr_ << std::dec << \">\"\r\n            << \" CAS \"\r\n            << (success_ ? \"succ \" : \"fail \")\r\n            << (spurious_failure_ ? \"[SPURIOUSLY] \" : \"\")\r\n            << (aba_ ? \"[ABA] \" : \"\")\r\n            << \"orig=\" << cur_value_\r\n            << \", cmp=\" << cmp_value_\r\n            << \", xchg=\" << xchg_value_\r\n            << \", order=\" << format(mo_);\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\ntemplate<typename T>\r\nstruct atomic_load_event\r\n{\r\n    typedef typename atomic_add_type<T>::output_type type;\r\n\r\n    void const* var_addr_;\r\n    type value_;\r\n    memory_order mo_;\r\n    bool not_current_;\r\n\r\n    void output(std::ostream& s) const\r\n    {\r\n        s << \"<\" << std::hex << var_addr_ << std::dec << \">\"\r\n            << \" atomic load, value=\" << value_\r\n            << (not_current_ ? \" [NOT CURRENT]\" : \"\")\r\n            << \", order=\" << format(mo_);\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\ntemplate<typename T>\r\nstruct atomic_store_event\r\n{\r\n    typedef typename atomic_add_type<T>::output_type type;\r\n\r\n    void const* var_addr_;\r\n    type prev_value_;\r\n    type value_;\r\n    memory_order mo_;\r\n\r\n    void output(std::ostream& s) const\r\n    {\r\n        s << \"<\" << std::hex << var_addr_ << std::dec << \">\"\r\n            << \" atomic store, value=\" << value_\r\n            << \", (prev value=\" << prev_value_ << \")\"\r\n            << \", order=\" << format(mo_);\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\ntemplate<typename T, typename Y>\r\nstruct atomic_rmw_event\r\n{\r\n    typedef typename atomic_add_type<T>::output_type type;\r\n\r\n    debug_info var_info_;\r\n    void const* var_addr_;\r\n    type prev_value_;\r\n    Y op_value_;\r\n    type new_value_;\r\n    memory_order mo_;\r\n    rmw_type_e type_;\r\n\r\n    void output(std::ostream& s) const\r\n    {\r\n        s << \"<\" << std::hex << var_addr_ << std::dec << \">\"\r\n            << \" \" << format(type_) << \" \"\r\n            << \", prev=\" << prev_value_\r\n            << \", arg=\" << op_value_\r\n            << \", new=\" << new_value_\r\n            << \", order=\" << format(mo_);\r\n    }\r\n};\r\n\r\n\r\n}\r\n\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/atomic_fence.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_FENCE_HPP\r\n#define RL_FENCE_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n#include \"context.hpp\"\r\n#include \"memory_order.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\n\r\nstruct atomic_fence_event\r\n{\r\n    memory_order mo_;\r\n    bool is_thread_fence_;\r\n\r\n    void output(std::ostream& s) const\r\n    {\r\n        s << (is_thread_fence_ ? \"\" : \"compiler \")\r\n            << format(mo_) << \" fence\";\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nRL_INLINE\r\nvoid atomic_thread_fence(memory_order mo, debug_info_param info)\r\n{\r\n    context& c = ctx();\r\n    RL_VERIFY(false == c.invariant_executing);\r\n\r\n    switch (mo)\r\n    {\r\n    case mo_relaxed:\r\n        RL_VERIFY(false);\r\n        break;\r\n    case mo_consume:\r\n    case mo_acquire:\r\n        c.atomic_thread_fence_acquire();\r\n        break;\r\n    case mo_release:\r\n        c.atomic_thread_fence_release();\r\n        break;\r\n    case mo_acq_rel:\r\n        c.atomic_thread_fence_acq_rel();\r\n        break;\r\n    case mo_seq_cst:\r\n        c.atomic_thread_fence_seq_cst();\r\n        break;\r\n    }\r\n\r\n    RL_HIST(atomic_fence_event) {mo, true} RL_HIST_END();\r\n}\r\n\r\n\r\n\r\n\r\nRL_INLINE\r\nvoid atomic_signal_fence(memory_order mo, debug_info_param info)\r\n{\r\n    context& c = ctx();\r\n    RL_HIST(atomic_fence_event) {mo, false} RL_HIST_END();\r\n}\r\n\r\n\r\n}\r\n\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/backoff.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_BACKOFF_HPP\r\n#define RL_BACKOFF_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n#include \"context_base.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\n\r\ninline void yield(unsigned count, debug_info_param info)\r\n{\r\n    ctx().yield(count, info);\r\n}\r\n\r\n\r\ntemplate<unsigned factor_t, unsigned add_t>\r\nclass backoff_t\r\n{\r\npublic:\r\n    backoff_t()\r\n        : count_(1)\r\n    {\r\n    }\r\n\r\n    void yield(debug_info_param info)\r\n    {\r\n        rl::yield(count_, info);\r\n        count_ = count_ * factor_t + add_t;\r\n    }\r\n\r\nprivate:\r\n    unsigned count_;\r\n};\r\n\r\n\r\ntypedef backoff_t<1, 0> backoff;\r\ntypedef backoff_t<1, 1> linear_backoff;\r\ntypedef backoff_t<2, 0> exp_backoff;\r\n\r\n\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/base.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_BASE_HPP\r\n#define RL_BASE_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"pch.hpp\"\r\n#include \"platform.hpp\"\r\n\r\nnamespace rl\r\n{\r\nsize_t const subsequent_timed_wait_limit = 4;\r\n}\r\n\r\n#define RL_TEST\r\n\r\n#ifdef RL_JAVA_MODE\r\n#   define RL_GC\r\n#   define RL_NO_MALLOC\r\n#   define RL_JAVA_API\r\n#   define RL_JAVA_MM\r\n#endif\r\n\r\n#ifdef RL_CLI_MODE\r\n#   define RL_GC\r\n#   define RL_NO_MALLOC\r\n#   define RL_CLI_API\r\n#   define RL_CLI_MM\r\n#endif\r\n\r\n#ifdef RL_POSIX_MODE\r\n#   define RL_POSIX_API\r\n#endif\r\n\r\n#ifdef RL_WIN_MODE\r\n#   define RL_WIN_API\r\n#endif\r\n\r\n#ifdef RL_CPP_MODE\r\n#   define RL_CPP_API\r\n#   define RL_CPP_MM\r\n#endif\r\n\r\n#if defined(RL_JAVA_MM) || defined(RL_CLI_MM)\r\n#   define RL_IMPROVED_SEQ_CST_FENCE\r\n#   define RL_IMPROVED_SEQ_CST_RMW\r\n#endif\r\n\r\nnamespace rl\r\n{\r\n\r\n#define RL_NOCOPY(CLASS) \\\r\n    private: \\\r\n    CLASS(CLASS const&); \\\r\n    CLASS& operator = (CLASS const&);\r\n/**/\r\n\r\n\r\ntemplate<typename T = void>\r\nclass nocopy\r\n{\r\n    nocopy(nocopy const&);\r\n    nocopy& operator = (nocopy const&);\r\n\r\nprotected:\r\n    nocopy() {}\r\n};\r\n\r\n\r\ntemplate<size_t sz, size_t base = 4>\r\nstruct align_pad\r\n{\r\n    template<bool perfect, bool fit, int fake> struct helper\r\n    {\r\n        struct type { char pad [base - sz]; };\r\n    };\r\n\r\n    template<int fake> struct helper<true, true, fake>\r\n    {\r\n        struct type {};\r\n    };\r\n\r\n    template<bool perfect, int fake> struct helper<perfect, false, fake>\r\n    {\r\n        typedef typename align_pad<sz, base * 2>::type type;\r\n    };\r\n\r\n    typedef typename helper<sz == base, sz <= base, 0>::type type;\r\n};\r\n\r\n\r\ntemplate<typename T>\r\nstruct aligned : T, align_pad<sizeof(T)>::type\r\n{};\r\n\r\ntemplate<typename T>\r\nT val(T x)\r\n{\r\n    return x;\r\n}\r\n\r\n}\r\n\r\n\r\n#include \"defs.hpp\"\r\n\r\n\r\n#define RL_INFO ::rl::debug_info(__FUNCTION__, __FILE__, __LINE__)\r\n#define $ RL_INFO\r\n\r\n\r\n#ifdef RL_DO_ASSERT\r\n#   if RL_DO_ASSERT\r\n#       define RL_DO_ASSERT_IMPL\r\n#   endif\r\n#else\r\n#   ifdef _DEBUG\r\n#       define RL_DO_ASSERT_IMPL\r\n#   endif\r\n#endif\r\n\r\n#ifdef _MSC_VER\r\n#   define RL_INT3() __debugbreak(); abort()\r\n#else\r\n#   define RL_INT3() abort()\r\n#endif\r\n\r\n#ifdef RL_DO_ASSERT_IMPL\r\n#   define RL_VERIFY(x) do { if (!((void)0, (x))) { \\\r\n        ::rl::assert_failed(#x, $); RL_INT3(); } } while ((void)0, 0)\r\n#else\r\n#   define RL_VERIFY(x) (void)0\r\n#endif\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/cli.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_CLI_HPP\r\n#define RL_CLI_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n#include \"context_base.hpp\"\r\n#include \"atomic_fence.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\n\r\nstruct Thread\r\n{\r\n    static void MemoryBarrier(debug_info_param info)\r\n    {\r\n        atomic_thread_fence(mo_seq_cst, info);\r\n    }\r\n\r\n    template<typename T>\r\n    static T VolatileRead(generic_atomic<T, true> const& v, debug_info_param info)\r\n    {\r\n        return v.load(mo_acquire, info);\r\n    }\r\n\r\n    template<typename T>\r\n    static void VolatileWrite(generic_atomic<T, true>& v, T x, debug_info_param info)\r\n    {\r\n        v.store(x, mo_release, info);\r\n    }\r\n\r\n    static void SpinWait(int iterations, debug_info_param info)\r\n    {\r\n        ctx().yield(iterations, info);\r\n    }\r\n};\r\n\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/cli_interlocked.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_CLI_INTERLOCKED_HPP\r\n#define RL_CLI_INTERLOCKED_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n#include \"atomic.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\n    struct Interlocked\r\n    {\r\n        template<typename T>\r\n        static T Add(generic_atomic<T, true>& v, T x, debug_info_param info)\r\n        {\r\n            T result = v.rmw(rmw_type_t<rmw_type_add>(), x, mo_seq_cst, info) + x;\r\n            return result;\r\n        }\r\n\r\n        template<typename T>\r\n        static T CompareExchange(generic_atomic<T, true>& v, T xchg, T cmp, debug_info_param info)\r\n        {\r\n            v.compare_exchange(bool_t<false>(), cmp, xchg, mo_seq_cst, mo_seq_cst, info);\r\n            return cmp;\r\n        }\r\n\r\n        template<typename T>\r\n        static T Increment(generic_atomic<T, true>& v, debug_info_param info)\r\n        {\r\n            return Add(v, (T)1, info);\r\n        }\r\n\r\n        template<typename T>\r\n        static T Decrement(generic_atomic<T, true>& v, debug_info_param info)\r\n        {\r\n            return Add(v, (T)-1, info);\r\n        }\r\n\r\n        template<typename T>\r\n        static T Exchange(generic_atomic<T, true>& v, T x, debug_info_param info)\r\n        {\r\n            T result = v.rmw(rmw_type_t<rmw_type_swap>(), x, mo_seq_cst, info);\r\n            return result;\r\n        }\r\n\r\n        template<typename T>\r\n        static T Read(generic_atomic<T, true> const& v, debug_info_param info)\r\n        {\r\n            return v.load(mo_acquire, info);\r\n        }\r\n    };\r\n\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/cli_var.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_CLI_VAR_HPP\r\n#define RL_CLI_VAR_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n#include \"atomic.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\ntemplate<typename T> class nvar;\r\n\r\n\r\ntemplate<typename T>\r\nclass nvar_proxy\r\n{\r\npublic:\r\n    typedef typename atomic_add_type<T>::type add_type;\r\n    template<typename Y> friend class nvar;\r\n\r\n    operator T () const\r\n    {\r\n        return load();\r\n    }\r\n\r\n    T operator = (T value)\r\n    {\r\n        store(value);\r\n        return value;\r\n    }\r\n\r\n    T operator = (nvar_proxy const& r)\r\n    {\r\n        T const value = r.load();\r\n        store(value);\r\n        return *this;\r\n    }\r\n\r\n    T operator ++ (int)\r\n    {\r\n        T tmp = load();\r\n        store(tmp + 1);\r\n        return tmp;\r\n    }\r\n\r\n    T operator -- (int)\r\n    {\r\n        T tmp = load();\r\n        store(tmp - 1);\r\n        return tmp;\r\n    }\r\n\r\n    T operator ++ ()\r\n    {\r\n        T tmp = load();\r\n        store(tmp + 1);\r\n        return tmp + 1;\r\n    }\r\n\r\n    T operator -- ()\r\n    {\r\n        T tmp = load();\r\n        store(tmp - 1);\r\n        return tmp - 1;\r\n    }\r\n\r\n    T operator += (add_type value)\r\n    {\r\n        T tmp = load();\r\n        store(tmp + value);\r\n        return tmp + value;\r\n    }\r\n\r\n    T operator -= (add_type value)\r\n    {\r\n        T tmp = load();\r\n        store(tmp - value);\r\n        return tmp - value;\r\n    }\r\n\r\nprivate:\r\n    nvar<T>& var_;\r\n    debug_info info_;\r\n\r\n    nvar_proxy(nvar<T>& var, debug_info_param info)\r\n        : var_(var)\r\n        , info_(info)\r\n    {\r\n    }\r\n\r\n    T load() const\r\n    {\r\n        return var_.load(mo_relaxed, info_);\r\n    }\r\n\r\n    void store(T value)\r\n    {\r\n        var_.store(value, mo_relaxed, info_);\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\ntemplate<typename T>\r\nclass nvar : public generic_atomic<T, true>\r\n{\r\npublic:\r\n    typedef nvar_proxy<T> proxy_t;\r\n    friend class nvar_proxy<T>;\r\n\r\n    nvar()\r\n    {\r\n    }\r\n\r\n    explicit nvar(T value)\r\n    {\r\n        this->store(value, mo_relaxed, $);\r\n    }\r\n\r\n    nvar(nvar const& r)\r\n    {\r\n        T const value = r.load(mo_relaxed, $);\r\n        this->store(value, mo_relaxed, $);\r\n    }\r\n\r\n    nvar(proxy_t const& r)\r\n    {\r\n        T const value = r.load();\r\n        this->store(value, mo_relaxed, r.info_);\r\n    }\r\n\r\n    proxy_t operator () (debug_info_param info)\r\n    {\r\n        return proxy_t(*this, info);\r\n    }\r\n\r\nprivate:\r\n    nvar& operator = (nvar const&);\r\n};\r\n\r\n\r\n\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/cli_volatile.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_CLI_VOLATILE_HPP\r\n#define RL_CLI_VOLATILE_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n#include \"atomic.hpp\"\r\n\r\n\r\n//!!! fix Java volatiles!\r\n// they must be modeled as seq_cst stores/loads\r\n\r\nnamespace rl\r\n{\r\n\r\ntemplate<typename T> class nvolatile;\r\n\r\n\r\ntemplate<typename T>\r\nclass nvolatile_proxy\r\n{\r\npublic:\r\n    typedef typename atomic_add_type<T>::type add_type;\r\n    template<typename Y> friend class nvolatile;\r\n\r\n    operator T () const\r\n    {\r\n        return load();\r\n    }\r\n\r\n    T operator = (T value)\r\n    {\r\n        store(value);\r\n        return value;\r\n    }\r\n\r\n    T operator = (nvolatile_proxy const& r)\r\n    {\r\n        T const value = r.load();\r\n        store(value);\r\n        return *this;\r\n    }\r\n\r\n    T operator ++ (int)\r\n    {\r\n        T tmp = load();\r\n        store(tmp + 1);\r\n        return tmp;\r\n    }\r\n\r\n    T operator -- (int)\r\n    {\r\n        T tmp = load();\r\n        store(tmp - 1);\r\n        return tmp;\r\n    }\r\n\r\n    T operator ++ ()\r\n    {\r\n        T tmp = load();\r\n        store(tmp + 1);\r\n        return tmp + 1;\r\n    }\r\n\r\n    T operator -- ()\r\n    {\r\n        T tmp = load();\r\n        store(tmp - 1);\r\n        return tmp - 1;\r\n    }\r\n\r\n    T operator += (add_type value)\r\n    {\r\n        T tmp = load();\r\n        store(tmp + value);\r\n        return tmp + value;\r\n    }\r\n\r\n    T operator -= (add_type value)\r\n    {\r\n        T tmp = load();\r\n        store(tmp - value);\r\n        return tmp - value;\r\n    }\r\n\r\nprivate:\r\n    nvolatile<T>& var_;\r\n    debug_info info_;\r\n\r\n    nvolatile_proxy(nvolatile<T>& var, debug_info_param info)\r\n        : var_(var)\r\n        , info_(info)\r\n    {\r\n    }\r\n\r\n    T load() const\r\n    {\r\n        return var_.load(mo_acquire, info_);\r\n    }\r\n\r\n    void store(T value)\r\n    {\r\n        var_.store(value, mo_release, info_);\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\ntemplate<typename T>\r\nclass nvolatile : public generic_atomic<T, true>\r\n{\r\npublic:\r\n    typedef nvolatile_proxy<T> proxy_t;\r\n    friend class nvolatile_proxy<T>;\r\n\r\n    nvolatile()\r\n    {\r\n    }\r\n\r\n    explicit nvolatile(T value)\r\n    {\r\n        //??? whether here must be mo_relaxed or mo_release?\r\n        this->store(value, mo_release, $);\r\n    }\r\n\r\n    nvolatile(nvolatile const& r)\r\n    {\r\n        T const value = r.load(mo_acquire, $);\r\n        //??? whether here must be mo_relaxed or mo_release?\r\n        this->store(value, mo_release, $);\r\n    }\r\n\r\n    nvolatile(proxy_t const& r)\r\n    {\r\n        T const value = r.var_.load(mo_acquire, r.info_);\r\n        //??? whether here must be mo_relaxed or mo_release?\r\n        this->store(value, mo_release, r.info_);\r\n    }\r\n\r\n    proxy_t operator () (debug_info_param info)\r\n    {\r\n        return proxy_t(*this, info);\r\n    }\r\n};\r\n\r\n\r\n\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/context.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_CONTEXT_HPP\r\n#define RL_CONTEXT_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n#include \"thread_local_ctx.hpp\"\r\n#include \"context_base.hpp\"\r\n#include \"thread.hpp\"\r\n#include \"history.hpp\"\r\n#include \"memory.hpp\"\r\n#include \"test_result.hpp\"\r\n#include \"slab_allocator.hpp\"\r\n#include \"test_params.hpp\"\r\n#include \"random.hpp\"\r\n#include \"foreach.hpp\"\r\n\r\n#include \"random_scheduler.hpp\"\r\n#include \"full_search_scheduler.hpp\"\r\n#include \"context_bound_scheduler.hpp\"\r\n\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\ntemplate<thread_id_t thread_count> class generic_mutex_data_impl;\r\ntemplate<thread_id_t thread_count> class condvar_data_impl;\r\ntemplate<thread_id_t thread_count> class sema_data_impl;\r\ntemplate<thread_id_t thread_count> class event_data_impl;\r\n\r\n\r\nstruct park_event\r\n{\r\n    bool is_timed_;\r\n    bool allow_spurious_;\r\n\r\n    void output(std::ostream& s) const\r\n    {\r\n        s << \"blocking current thread\" << (is_timed_ ? \" [timed]\" : \"\");\r\n    }\r\n};\r\n\r\nstruct unpark_event\r\n{\r\n    thread_id_t thread_;\r\n\r\n    void output(std::ostream& s) const\r\n    {\r\n        s << \"unblocking thread \" << thread_;\r\n    }\r\n};\r\n\r\nstruct yield_event\r\n{\r\n    unsigned count_;\r\n\r\n    void output(std::ostream& s) const\r\n    {\r\n        s << \"yield(\" << count_ << \")\";\r\n    }\r\n};\r\n\r\n\r\n/*\r\ntemplate<typename test_t, typename scheduler_t>\r\nstruct context_persistent\r\n{\r\n    static thread_id_t const        thread_count = test_t::params::thread_count;\r\n    fiber_t                         fibers_ [thread_count];\r\n    memory_mgr                      memory_;\r\n\r\n    context_persistent()\r\n    {\r\n        for (thread_id_t i = 0; i != thread_count; ++i)\r\n        {\r\n            create_fiber(fibers_[i], &context_impl<test_t, scheduler_t>::fiber_proc, (void*)(intptr_t)i);\r\n        }\r\n    }\r\n\r\n    ~context_persistent()\r\n    {\r\n        for (thread_id_t i = 0; i != thread_count; ++i)\r\n        {\r\n            delete_fiber(fibers_[i]);\r\n        }\r\n    }\r\n};\r\n*/\r\n\r\n\r\ntemplate<typename test_t, typename scheduler_t>\r\nclass context_impl\r\n    : thread_local_contxt_impl<context_addr_hash_impl<context, test_t::params::thread_count>, test_t::params::thread_count>\r\n{\r\nprivate:\r\n    typedef thread_local_contxt_impl\r\n        <context_addr_hash_impl<context, test_t::params::thread_count>,\r\n            test_t::params::thread_count>\r\n                base_t;\r\n    typedef typename scheduler_t::shared_context_t shared_context_t;\r\n\r\n    using base_t::params_;\r\n    using base_t::history_;\r\n    using base_t::threadx_;\r\n    using base_t::disable_preemption_;\r\n    using base_t::disable_alloc_;\r\n    using base_t::invariant_executing;\r\n\r\n    static thread_id_t const main_thread_id = -1;\r\n    static thread_id_t const static_thread_count = test_t::params::static_thread_count;\r\n    static thread_id_t const dynamic_thread_count = test_t::params::dynamic_thread_count;\r\n    static thread_id_t const thread_count = test_t::params::thread_count;\r\n\r\n    iteration_t                     current_iter_;\r\n    test_result_e                   test_result_;\r\n    string                          test_result_str_;\r\n    fiber_t                         main_fiber_;\r\n    bool                            special_function_executing;\r\n    memory_mgr                      memory_;\r\n    iteration_t                     start_iteration_;\r\n    size_t                          sched_count_;\r\n    scheduler_t                     sched_;\r\n    shared_context_t&               sctx_;\r\n    random_generator                rand_;\r\n    test_t*                         current_test_suite;\r\n    bool                            current_test_suite_constructed;\r\n    bool                            first_thread_;\r\n    timestamp_t                     seq_cst_fence_order_ [thread_count];\r\n\r\n    aligned<thread_info<thread_count> > threads_ [thread_count];\r\n\r\n    thread_info<thread_count>& threadi()\r\n    {\r\n        return *static_cast<thread_info<thread_count>*>(threadx_);\r\n    }\r\n\r\n    slab_allocator<atomic_data_impl<thread_count> >*        atomic_alloc_;\r\n    slab_allocator<var_data_impl<thread_count> >*           var_alloc_;\r\n    slab_allocator<generic_mutex_data_impl<thread_count> >* mutex_alloc_;\r\n    slab_allocator<condvar_data_impl<thread_count> >*       condvar_alloc_;\r\n    slab_allocator<sema_data_impl<thread_count> >*          sema_alloc_;\r\n    slab_allocator<event_data_impl<thread_count> >*         event_alloc_;\r\n\r\n    virtual atomic_data* atomic_ctor(void* ctx)\r\n    {\r\n        return new (atomic_alloc_->alloc(ctx)) atomic_data_impl<thread_count> ();\r\n    }\r\n\r\n    virtual void atomic_dtor(atomic_data* data)\r\n    {\r\n        static_cast<atomic_data_impl<thread_count>*>(data)->~atomic_data_impl<thread_count>();\r\n        atomic_alloc_->free(static_cast<atomic_data_impl<thread_count>*>(data));\r\n    }\r\n\r\n    virtual var_data* var_ctor()\r\n    {\r\n        return new (var_alloc_->alloc()) var_data_impl<thread_count> ();\r\n    }\r\n\r\n    virtual void var_dtor(var_data* data)\r\n    {\r\n        static_cast<var_data_impl<thread_count>*>(data)->~var_data_impl<thread_count>();\r\n        var_alloc_->free(static_cast<var_data_impl<thread_count>*>(data));\r\n    }\r\n\t\r\n    virtual unpark_reason wfmo_park(void** ws,\r\n                                    win_waitable_object** wo,\r\n                                    size_t count,\r\n                                    bool wait_all,\r\n                                    bool is_timed,\r\n                                    debug_info_param info)\r\n    {\r\n\t\t\t  return waitset<thread_count>::park_current(*this,\r\n                                                         reinterpret_cast<waitset<thread_count>**>(ws),\r\n                                                         wo, count, wait_all, is_timed, true, info);\r\n    }\r\n\r\npublic:\r\n    context_impl(test_params& params, shared_context_t& sctx)\r\n        : base_t(thread_count, params)\r\n        , current_iter_(0)\r\n        , start_iteration_(1)\r\n        , sched_(params, sctx, dynamic_thread_count)\r\n        , sctx_(sctx)\r\n    {\r\n        this->context::seq_cst_fence_order_ = this->seq_cst_fence_order_;\r\n\r\n        current_test_suite = (test_t*)(::malloc)(sizeof(test_t));\r\n        current_test_suite_constructed = false;\r\n\r\n        test_result_ = test_result_success;\r\n        threadx_ = 0;\r\n        special_function_executing = false;\r\n        invariant_executing = false;\r\n\r\n        create_main_fiber(main_fiber_);\r\n        set_low_thread_prio();\r\n\r\n        if (0 == val(thread_count))\r\n        {\r\n            throw std::logic_error(\"no threads created\");\r\n        }\r\n\r\n        atomic_alloc_ = new slab_allocator<atomic_data_impl<thread_count> >();\r\n        var_alloc_ = new slab_allocator<var_data_impl<thread_count> >();\r\n        mutex_alloc_ = new slab_allocator<generic_mutex_data_impl<thread_count> >();\r\n        condvar_alloc_ = new slab_allocator<condvar_data_impl<thread_count> >();\r\n        sema_alloc_ = new slab_allocator<sema_data_impl<thread_count> >();\r\n        event_alloc_ = new slab_allocator<event_data_impl<thread_count> >();\r\n\r\n        for (thread_id_t i = 0; i != thread_count; ++i)\r\n        {\r\n            new (&threads_[i]) thread_info<thread_count> (i);\r\n            threads_[i].ctx_ = this;\r\n        }\r\n\r\n        for (thread_id_t i = 0; i != thread_count; ++i)\r\n        {\r\n            //threads_[i].fiber_ = persistent.fibers_[i];\r\n            create_fiber(threads_[i].fiber_, &context_impl::fiber_proc, (void*)(intptr_t)i);\r\n        }\r\n\r\n        disable_alloc_ = 0;\r\n    }\r\n\r\n    ~context_impl()\r\n    {\r\n        disable_alloc_ += 1;\r\n\r\n        for (thread_id_t i = 0; i != thread_count; ++i)\r\n        {\r\n            delete_fiber(threads_[i].fiber_);\r\n        }\r\n\r\n        delete_main_fiber(main_fiber_);\r\n\r\n        // there can be atomic loads and stores etc\r\n        // it's not good place to calling user code\r\n        //destroy_current_test_suite();\r\n        //::free(current_test_suite);\r\n\r\n        delete atomic_alloc_;\r\n        delete var_alloc_;\r\n        delete mutex_alloc_;\r\n        delete condvar_alloc_;\r\n        delete sema_alloc_;\r\n        delete event_alloc_;\r\n    }\r\n\r\n    void construct_current_test_suite()\r\n    {\r\n        RL_VERIFY(false == current_test_suite_constructed);\r\n        new (current_test_suite) test_t ();\r\n        current_test_suite_constructed = true;\r\n    }\r\n\r\n    void destroy_current_test_suite()\r\n    {\r\n        if (current_test_suite_constructed)\r\n        {\r\n            current_test_suite->~test_t();\r\n            current_test_suite_constructed = false;\r\n        }\r\n    }\r\n\r\n    virtual void* alloc(size_t size, bool is_array, debug_info_param info)\r\n    {\r\n        disable_alloc_ += 1;\r\n#ifndef RL_GC\r\n        void* p = memory_.alloc(size);\r\n#else\r\n        void* p = memory_.alloc(size, (void(*)(void*))0);\r\n#endif\r\n        disable_alloc_ -= 1;\r\n        RL_HIST_CTX(memory_alloc_event) {p, size, is_array} RL_HIST_END();\r\n        return p;\r\n    }\r\n\r\n#ifdef RL_GC\r\n    virtual void* alloc(size_t size, bool is_array, void(*dtor)(void*), debug_info_param info)\r\n    {\r\n        disable_alloc_ += 1;\r\n        void* p = memory_.alloc(size, dtor);\r\n        disable_alloc_ -= 1;\r\n        RL_HIST_CTX(memory_alloc_event) {p, size, is_array} RL_HIST_END();\r\n        return p;\r\n    }\r\n#endif\r\n\r\n    virtual void free(void* p, bool is_array, debug_info_param info)\r\n    {\r\n        RL_HIST_CTX(memory_free_event) {p, is_array} RL_HIST_END();\r\n#ifndef RL_GC\r\n        bool const defer = (0 == sched_.rand(this->is_random_sched() ? 4 : 2, sched_type_mem_realloc));\r\n#else\r\n        bool const defer = false;\r\n#endif\r\n        disable_alloc_ += 1;\r\n        if (false == memory_.free(p, defer))\r\n            fail_test(\"incorrect address passed to free() function\", test_result_double_free, info);\r\n        disable_alloc_ -= 1;\r\n    }\r\n\r\n    size_t prev_alloc_size_;\r\n    debug_info last_info_;\r\n\r\n    virtual void* alloc(size_t size)\r\n    {\r\n        if (disable_alloc_)\r\n            return (::malloc)(size);\r\n\r\n        prev_alloc_size_ = size;\r\n        disable_alloc_ += 1;\r\n#ifndef RL_GC\r\n        void* p = (memory_.alloc)(size);\r\n#else\r\n        void* p = (memory_.alloc)(size, 0);\r\n#endif\r\n        disable_alloc_ -= 1;\r\n        return p;\r\n    }\r\n\r\n    virtual size_t prev_alloc_size()\r\n    {\r\n        size_t sz = prev_alloc_size_;\r\n        prev_alloc_size_ = 0;\r\n        return sz;\r\n    }\r\n\r\n    virtual void set_debug_info(debug_info_param info)\r\n    {\r\n        last_info_ = info;\r\n    }\r\n\r\n    virtual void free(void* p)\r\n    {\r\n        if (disable_alloc_)\r\n        {\r\n            (::free)(p);\r\n            return;\r\n        }\r\n        \r\n        disable_alloc_ += 1;\r\n        debug_info const& info = last_info_;\r\n        RL_HIST_CTX(memory_free_event) {p, false} RL_HIST_END();\r\n#ifndef RL_GC\r\n        bool const defer = (0 == sched_.rand(this->is_random_sched() ? 4 : 2, sched_type_mem_realloc));\r\n#else\r\n        bool const defer = false;\r\n#endif\r\n        if (false == memory_.free(p, defer))\r\n            fail_test(\"incorrect address passed to free() function\", test_result_double_free, info);\r\n        disable_alloc_ -= 1;\r\n    }\r\n\r\n    virtual unpark_reason park_current_thread(bool is_timed,\r\n                                              bool allow_spurious_wakeup,\r\n                                              bool do_switch,\r\n                                              debug_info_param info)\r\n    {\r\n        RL_VERIFY(false == special_function_executing);\r\n        RL_VERIFY(threadx_->saved_disable_preemption_ == -1);\r\n        unsigned dp = disable_preemption_;\r\n        disable_preemption_ = 0;\r\n        RL_HIST_CTX(park_event) {is_timed, allow_spurious_wakeup} RL_HIST_END();\r\n        if (false == sched_.park_current_thread(is_timed, allow_spurious_wakeup))\r\n        {\r\n            fail_test(\"deadlock detected\", test_result_deadlock, info);\r\n        }\r\n        schedule(1);\r\n        // otherwise it's restored in switch_back()\r\n        RL_VERIFY(threadx_->saved_disable_preemption_ == -1);\r\n        if (do_switch == false || threadx_->unpark_reason_ != unpark_reason_normal)\r\n            disable_preemption_ = dp;\r\n        else\r\n            threadx_->saved_disable_preemption_ = dp;\r\n        unpark_reason reason = threadx_->unpark_reason_;\r\n        return reason;\r\n    }\r\n\r\n    virtual void unpark_thread(thread_id_t th, bool do_switch, debug_info_param info)\r\n    {\r\n        RL_VERIFY(false == special_function_executing);\r\n        RL_HIST_CTX(unpark_event) {th} RL_HIST_END();\r\n        sched_.unpark_thread(th, do_switch);\r\n        if (do_switch)\r\n        {\r\n            threads_[th].unpark_reason_ = unpark_reason_normal;\r\n            threads_[th].temp_switch_from_ = threadx_->index_;\r\n            switch_to_fiber(th);\r\n        }\r\n    }\r\n\r\n    virtual void switch_back(debug_info_param info)\r\n    {\r\n//std::cout << \"switching back from \" << threadx_->index_ << \" to \" << threadx_->temp_switch_from_ << std::endl;\r\n        (void)info;\r\n        RL_VERIFY(threadx_->saved_disable_preemption_ != -1);\r\n        RL_VERIFY(threadx_->temp_switch_from_ != -1);\r\n        thread_id_t const tid = threadx_->temp_switch_from_;\r\n        threadx_->temp_switch_from_ = -1;\r\n        switch_to_fiber(tid);\r\n        RL_VERIFY(threadx_->saved_disable_preemption_ != -1);\r\n        disable_preemption_ = threadx_->saved_disable_preemption_;\r\n        threadx_->saved_disable_preemption_ = -1;\r\n    }\r\n\r\n    void ensure(bool cond, char const* desc, test_result_e res, debug_info_param info)\r\n    {\r\n        if (false == cond)\r\n            fail_test(desc, res, info);\r\n    }\r\n\r\n    virtual void fail_test(char const* desc, test_result_e res, debug_info_param info)\r\n    {\r\n\r\n        RL_DEBUGBREAK_ON_FAILURE_IMPL;\r\n\r\n        RL_VERIFY(test_result_success != res);\r\n\r\n        test_result_ = res;\r\n        if (test_result_user_assert_failed == res && invariant_executing)\r\n            test_result_ = test_result_user_invariant_failed;\r\n        if (0 == desc || 0 == desc[0])\r\n            test_result_str_ = test_result_str(test_result_);\r\n        else\r\n            test_result_str_ = string(test_result_str(test_result_)) + \" (\" + desc + \")\";\r\n\r\n        RL_HIST_CTX(user_event) {test_result_str_.c_str()} RL_HIST_END();\r\n\r\n        switch_to_main_fiber();\r\n    }\r\n\r\n    virtual void rl_until(char const* desc, debug_info_param info)\r\n    {\r\n        RL_HIST_CTX(user_event) {desc} RL_HIST_END();\r\n        test_result_ = test_result_until_condition_hit;\r\n        switch_to_main_fiber();\r\n    }\r\n\r\n    static void fiber_proc(void* thread_index);\r\n\r\n    virtual void fiber_proc_impl(int thread_index)\r\n    {\r\n        thread_info_base* param = &threads_[thread_index];\r\n        debug_info info = $;\r\n        for (;;)\r\n        {\r\n            if (first_thread_)\r\n            {\r\n                first_thread_ = false;\r\n                special_function_executing = true;\r\n                RL_HIST_CTX(user_event) {\"[CTOR BEGIN]\"} RL_HIST_END();\r\n                construct_current_test_suite();\r\n                RL_HIST_CTX(user_event) {\"[CTOR END]\"} RL_HIST_END();\r\n                RL_HIST_CTX(user_event) {\"[BEFORE BEGIN]\"} RL_HIST_END();\r\n                current_test_suite->before();\r\n                RL_HIST_CTX(user_event) {\"[BEFORE END]\"} RL_HIST_END();\r\n                rl_global_fence();\r\n                invariant_executing = true;\r\n                current_test_suite->invariant();\r\n                invariant_executing = false;\r\n                special_function_executing = false;\r\n            }\r\n\r\n//std::cout << \"thread \" << param->index_ << \" started\" << std::endl;\r\n            param->on_start();\r\n\r\n            if (param->index_ < static_thread_count)\r\n            {\r\n                current_test_suite->thread(param->index_);\r\n            }\r\n            else\r\n            {\r\n                if (param->dynamic_thread_func_)\r\n                    param->dynamic_thread_func_(param->dynamic_thread_param_);\r\n            }\r\n\r\n//std::cout << \"thread \" << param->index_ << \" finished\" << std::endl;\r\n            RL_HIST_CTX(user_event) {\"[THREAD FINISHED]\"} RL_HIST_END();\r\n            RL_VERIFY(disable_preemption_ == 0);\r\n            RL_VERIFY(threadx_->temp_switch_from_ == -1);\r\n            RL_VERIFY(threadx_->saved_disable_preemption_ == -1);\r\n\r\n            param->on_finish();\r\n\r\n            thread_finish_result res = sched_.thread_finished();\r\n//std::cout << \"thread \" << param->index_ << \" finished res=\" << res << std::endl;\r\n            if (thread_finish_result_normal == res)\r\n            {\r\n                sched();\r\n            }\r\n            else if (thread_finish_result_last == res)\r\n            {\r\n                special_function_executing = true;\r\n                invariant_executing = true;\r\n                current_test_suite->invariant();\r\n                invariant_executing = false;\r\n                rl_global_fence();\r\n                RL_HIST_CTX(user_event) {\"[AFTER BEGIN]\"} RL_HIST_END();\r\n                current_test_suite->after();\r\n                RL_HIST_CTX(user_event) {\"[AFTER END]\"} RL_HIST_END();\r\n                RL_HIST_CTX(user_event) {\"[DTOR BEGIN]\"} RL_HIST_END();\r\n                destroy_current_test_suite();\r\n                RL_HIST_CTX(user_event) {\"[DTOR END]\"} RL_HIST_END();\r\n                special_function_executing = false;\r\n\r\n                ensure(memory_.iteration_end(), \"memory leak detected\", test_result_memory_leak, $);\r\n                ensure(atomic_alloc_->iteration_end(), \"atomic leak\", test_result_resource_leak, $);\r\n                ensure(var_alloc_->iteration_end(), \"var leak\", test_result_resource_leak, $);\r\n                ensure(mutex_alloc_->iteration_end(), \"mutex leak\", test_result_resource_leak, $);\r\n                ensure(condvar_alloc_->iteration_end(), \"condition variable leak\", test_result_resource_leak, $);\r\n                ensure(sema_alloc_->iteration_end(), \"semaphore leak\", test_result_resource_leak, $);\r\n                ensure(event_alloc_->iteration_end(), \"event leak\", test_result_resource_leak, $);\r\n\r\n                switch_to_main_fiber();\r\n            }\r\n            else if (thread_finish_result_deadlock == res)\r\n            {\r\n                fail_test(\"deadlock detected\", test_result_deadlock, info);\r\n            }\r\n            else\r\n            {\r\n                RL_VERIFY(false);\r\n            }\r\n        }\r\n    }\r\n\r\n    virtual win_waitable_object* create_thread(void*(*fn)(void*), void* ctx)\r\n    {\r\n        RL_VERIFY(fn);\r\n        thread_id_t id = sched_.create_thread();\r\n        threads_[id].dynamic_thread_func_ = fn;\r\n        threads_[id].dynamic_thread_param_ = ctx;\r\n        threads_[id].sync_object_.on_create();\r\n        return &threads_[id].sync_object_;\r\n    }\r\n\r\n    virtual void yield(unsigned count, debug_info_param info)\r\n    {\r\n        RL_VERIFY(count);\r\n        RL_HIST_CTX(yield_event) {count} RL_HIST_END();\r\n        if (sched_count_++ > params_.execution_depth_limit)\r\n            fail_test(\"livelock\", test_result_livelock, RL_INFO);\r\n        schedule(count);\r\n    }\r\n\r\n    virtual void sched()\r\n    {\r\n        if (sched_count_++ > params_.execution_depth_limit)\r\n            fail_test(\"livelock\", test_result_livelock, RL_INFO);\r\n        if (disable_preemption_)\r\n            return;\r\n        schedule(0);\r\n    }\r\n\r\n    void schedule(unsigned yield)\r\n    {\r\n        RL_VERIFY(threadx_->temp_switch_from_ == -1);\r\n        RL_VERIFY(disable_preemption_ == 0);\r\n        if (special_function_executing)\r\n        {\r\n            threadx_->unpark_reason_ = unpark_reason_normal;\r\n            return;\r\n        }\r\n\r\n        special_function_executing = true;\r\n        invariant_executing = true;\r\n        current_test_suite->invariant();\r\n        invariant_executing = false;\r\n        special_function_executing = false;\r\n\r\n        if (yield)\r\n            threadx_->last_yield_ = threadi().own_acq_rel_order_;\r\n\r\n        unpark_reason reason = unpark_reason_normal;\r\n        thread_id_t const th = sched_.schedule(reason, yield);\r\n        threads_[th].unpark_reason_ = reason;\r\n\r\n        switch_to_fiber(th);\r\n        RL_VERIFY(0 == disable_preemption_);\r\n    }\r\n\r\n    test_result_e simulate(std::ostream& ss, std::istream& sss, bool second)\r\n    {\r\n        if (EOF != sss.peek())\r\n        {\r\n            sss >> start_iteration_;\r\n            sched_.set_state(sss);\r\n        }\r\n\r\n        test_result_e const res = simulate2(second);\r\n\r\n        if (test_result_success != res && false == params_.collect_history)\r\n        {\r\n            ss << params_.stop_iteration << \" \";\r\n            sched_.get_state(ss);\r\n        }\r\n\r\n        return res;\r\n    }\r\n\r\n    test_result_e simulate2(bool second)\r\n    {\r\n        debug_info info = $;\r\n\r\n        current_iter_ = start_iteration_;\r\n        for (; ; ++current_iter_)\r\n        {\r\n            rand_.seed(current_iter_);\r\n\r\n            iteration(current_iter_);\r\n\r\n            if (test_result_success != test_result_)\r\n            {\r\n                params_.test_result = test_result_;\r\n                params_.stop_iteration = current_iter_;\r\n                if (params_.collect_history)\r\n                    output_history();\r\n                return test_result_;\r\n            }\r\n\r\n            // If you hit assert here, then probably your test is non-deterministic\r\n            // Check whether you are using functions like ::rand()\r\n            // or static variables or values of object addresses (for hashing) in your test\r\n            // Replace ::rand() with rl::rand(), eliminate static variables in the test\r\n            RL_VERIFY(second == false);\r\n            (void)second;\r\n\r\n            RL_HIST_CTX(user_event) {\"ITERATION END\"} RL_HIST_END();\r\n\r\n            if (sched_.iteration_end())\r\n                break;\r\n        }\r\n\r\n        params_.test_result = test_result_success;\r\n        params_.stop_iteration = current_iter_;\r\n        return test_result_success;\r\n    }\r\n\r\n    RL_INLINE static void reset_thread(thread_info<thread_count>& ti)\r\n    {\r\n        foreach<thread_count>(\r\n            ti.acquire_fence_order_,\r\n            &assign_zero);\r\n        foreach<thread_count>(\r\n            ti.release_fence_order_,\r\n            &assign_zero);\r\n\r\n#ifdef RL_IMPROVED_SEQ_CST_FENCE\r\n        foreach<thread_count>(ti.imp_seq_cst_order_, &assign_zero);\r\n#endif\r\n    }\r\n\r\n    void iteration(iteration_t iter)\r\n    {\r\n        first_thread_ = true;\r\n        disable_preemption_ = 0;\r\n        sched_count_ = 0;\r\n\r\n        foreach<thread_count>(\r\n            threads_,\r\n            &context_impl::reset_thread);\r\n\r\n        foreach<thread_count>(\r\n            seq_cst_fence_order_,\r\n            &assign_zero);\r\n\r\n        base_t::iteration_begin();\r\n\r\n        for (thread_id_t i = 0; i != thread_count; ++i)\r\n        {\r\n            threads_[i].iteration_begin();\r\n        }\r\n\r\n        disable_alloc_ += 1;\r\n        thread_id_t const th = sched_.iteration_begin(iter);\r\n        disable_alloc_ -= 1;\r\n        switch_to_fiber(th);\r\n\r\n        if (0 == iter % progress_probe_period)\r\n        {\r\n            output_progress(iter);\r\n        }\r\n    }\r\n\r\nprivate:\r\n    void switch_to_fiber(thread_id_t th)\r\n    {\r\n        fiber_t& prev = threadx_ ? threadx_->fiber_ : main_fiber_;\r\n        threadx_ = &threads_[th];\r\n        ::switch_to_fiber(threadx_->fiber_, prev);\r\n    }\r\n\r\n    void switch_to_main_fiber()\r\n    {\r\n        fiber_t& prev = threadx_->fiber_;\r\n        threadx_ = 0;\r\n        ::switch_to_fiber(main_fiber_, prev);\r\n    }\r\n\r\n    void output_progress(iteration_t iter)\r\n    {\r\n        iteration_t const total = sched_.iteration_count();\r\n\r\n        if (0 == iter % (progress_probe_period * 16))\r\n        {\r\n            disable_alloc_ += 1;\r\n            *params_.progress_stream << iter * 100 / total << \"% (\"\r\n                << iter << \"/\" << total << \")\" << std::endl;\r\n            disable_alloc_ -= 1;\r\n        }\r\n    }\r\n\r\n    virtual unsigned rand(unsigned limit, sched_type t)\r\n    {\r\n        return sched_.rand(limit, t);\r\n    }\r\n\r\n    void output_history()\r\n    {\r\n        if (false == params_.output_history)\r\n        {\r\n            *params_.output_stream << test_result_str_ << std::endl;\r\n            *params_.output_stream << \"iteration: \" << params_.stop_iteration << std::endl;\r\n            *params_.output_stream << std::endl;\r\n        }\r\n        history_.print_exec_history(params_.output_history);\r\n\r\n#ifndef RL_GC\r\n        if (test_result_memory_leak == test_result_)\r\n        {\r\n            memory_.output_allocs(*params_.output_stream);\r\n        }\r\n#endif\r\n\r\n        //!!! output other leaked resources\r\n        if (test_result_ == test_result_resource_leak\r\n            && atomic_alloc_->iteration_end() == false)\r\n        {\r\n            *params_.output_stream << \"leaked atomics:\" << std::endl;\r\n            atomic_alloc_->output_allocs(*params_.output_stream);\r\n        }\r\n    }\r\n\r\n    void rl_global_fence()\r\n    {\r\n        timestamp_t max_acq_rel = 0;\r\n        for (thread_id_t i = 0; i != thread_count; ++i)\r\n        {\r\n            if (threads_[i].acq_rel_order_[i] > max_acq_rel)\r\n                max_acq_rel = threads_[i].acq_rel_order_[i];\r\n        }\r\n\r\n        for (thread_id_t i = 0; i != thread_count; ++i)\r\n        {\r\n            for (thread_id_t j = 0; j != thread_count; ++j)\r\n            {\r\n                threads_[i].acq_rel_order_[j] = max_acq_rel;\r\n            }\r\n        }\r\n    }\r\n\r\n    virtual void atomic_thread_fence_acquire()\r\n    {\r\n        threadi().atomic_thread_fence_acquire();\r\n    }\r\n\r\n    virtual void atomic_thread_fence_release()\r\n    {\r\n        threadi().atomic_thread_fence_release();\r\n    }\r\n\r\n    virtual void atomic_thread_fence_acq_rel()\r\n    {\r\n        threadi().atomic_thread_fence_acq_rel();\r\n    }\r\n\r\n    virtual void atomic_thread_fence_seq_cst()\r\n    {\r\n        sched();\r\n        threadi().atomic_thread_fence_seq_cst(seq_cst_fence_order_);\r\n    }\r\n\r\n    virtual thread_id_t get_thread_count() const\r\n    {\r\n        return thread_count;\r\n    }\r\n\r\n    virtual generic_mutex_data* mutex_ctor(bool is_rw, bool is_exclusive_recursive, bool is_shared_recursive, bool failing_try_lock)\r\n    {\r\n        return new (mutex_alloc_->alloc()) generic_mutex_data_impl<thread_count>(is_rw, is_exclusive_recursive, is_shared_recursive, failing_try_lock);\r\n    }\r\n\r\n    virtual void mutex_dtor(generic_mutex_data* m)\r\n    {\r\n        generic_mutex_data_impl<thread_count>* mm = static_cast<generic_mutex_data_impl<thread_count>*>(m);\r\n        mm->~generic_mutex_data_impl<thread_count>();\r\n        mutex_alloc_->free(mm);\r\n    }\r\n\r\n    virtual condvar_data* condvar_ctor(bool allow_spurious_wakeups)\r\n    {\r\n        return new (condvar_alloc_->alloc()) condvar_data_impl<thread_count>(allow_spurious_wakeups);\r\n    }\r\n\r\n    virtual void condvar_dtor(condvar_data* cv)\r\n    {\r\n        condvar_data_impl<thread_count>* mm = static_cast<condvar_data_impl<thread_count>*>(cv);\r\n        mm->~condvar_data_impl<thread_count>();\r\n        condvar_alloc_->free(mm);\r\n    }\r\n\r\n    virtual sema_data* sema_ctor(bool spurious_wakeups, unsigned initial_count, unsigned max_count)\r\n    {\r\n        return new (sema_alloc_->alloc()) sema_data_impl<thread_count>(spurious_wakeups, initial_count, max_count);\r\n    }\r\n\r\n    virtual void sema_dtor(sema_data* cv)\r\n    {\r\n        sema_data_impl<thread_count>* mm = static_cast<sema_data_impl<thread_count>*>(cv);\r\n        mm->~sema_data_impl<thread_count>();\r\n        sema_alloc_->free(mm);\r\n    }\r\n\r\n    virtual event_data* event_ctor(bool manual_reset, bool initial_state)\r\n    {\r\n        return new (event_alloc_->alloc()) event_data_impl<thread_count>(manual_reset, initial_state);\r\n    }\r\n\r\n    virtual void event_dtor(event_data* cv)\r\n    {\r\n        event_data_impl<thread_count>* mm = static_cast<event_data_impl<thread_count>*>(cv);\r\n        mm->~event_data_impl<thread_count>();\r\n        event_alloc_->free(mm);\r\n    }\r\n\r\n    context_impl(context_impl const&);\r\n    context_impl& operator = (context_impl const&);\r\n};\r\n\r\n/*\r\ntemplate<typename test_t, typename sched_t>\r\nstruct thread_params_t\r\n{\r\n    typedef context_impl<test_t, sched_t> context_t;\r\n\r\n    //HANDLE                  handle;\r\n    context_t*              ctx;\r\n    ostringstream      oss;\r\n    istringstream*     iss;\r\n\r\n    //RL_NOCOPY(thread_params_t);\r\n};\r\n\r\n\r\ntemplate<typename test_t, typename sched_t>\r\nunsigned __stdcall thread_func(void * ctx)\r\n{\r\n    typedef thread_params_t<test_t, sched_t> params_t;\r\n    params_t& p = *static_cast<params_t*>(ctx);\r\n    p.ctx->simulate(p.oss, *p.iss, false);\r\n    return 0;\r\n}\r\n*/\r\n\r\ntemplate<typename test_t, typename sched_t>\r\ntest_result_e run_test(test_params& params, std::ostream& oss, bool second)\r\n{\r\n    typedef context_impl<test_t, sched_t> context_t;\r\n    typedef typename sched_t::shared_context_t shared_context_t;\r\n    //typedef thread_params_t<test_t, sched_t> params_t;\r\n\r\n    //bool destroy_persistent = false;\r\n    //context_persistent<test_t, sched_t>* persistent = 0;\r\n    //if (persistent_ptr == 0)\r\n    //{\r\n    //    persistent = new context_persistent<test_t, sched_t>;\r\n    //    persistent_ptr = persistent;\r\n    //}\r\n    //else\r\n    //{\r\n    //    persistent = static_cast<context_persistent<test_t, sched_t>*>(persistent_ptr);\r\n    //    destroy_persistent = true;\r\n    //}\r\n\r\n    shared_context_t sctx;\r\n    test_result_e res;\r\n\r\n    //if (second == false)\r\n    {\r\n        istringstream iss (params.initial_state);\r\n        res = context_t(params, sctx).simulate(oss, iss, second);\r\n    }\r\n    //else\r\n    //{\r\n    //    size_t const thread_count = 2;\r\n    //    vector<params_t*>::type threads (thread_count);\r\n    //    for (size_t i = 0; i != thread_count; i += 1)\r\n    //    {\r\n    //        threads[i] = new params_t;\r\n    //        threads[i]->iss = new istringstream(params.initial_state);\r\n    //        threads[i]->ctx = new context_t(params, sctx);\r\n    //        threads[i]->handle = (HANDLE)(_beginthreadex)(0, 0, &thread_func<test_t, sched_t>, threads[i], 0, 0);\r\n    //    }\r\n\r\n    //    for (size_t i = 0; i != thread_count; i += 1)\r\n    //    {\r\n    //        (WaitForSingleObject)(threads[i]->handle, (INFINITE));\r\n    //    }\r\n\r\n    //    for (size_t i = 0; i != thread_count; i += 1)\r\n    //    {\r\n    //        delete threads[i]->ctx;\r\n    //        delete threads[i]->iss;\r\n    //        delete threads[i];\r\n    //    }\r\n\r\n    //    return test_result_success;\r\n    //}\r\n\r\n    //if (destroy_persistent)\r\n    //{\r\n    //    delete persistent;\r\n    //    persistent_ptr = 0;\r\n    //}\r\n\r\n    return res;\r\n}\r\n\r\n\r\ntemplate<typename test_t>\r\nbool simulate(test_params& params)\r\n{\r\n    char const* test_name = typeid(test_t).name();\r\n\t\twhile (test_name[0] >= '0' && test_name[0] <= '9')\r\n        test_name += 1;\r\n    params.test_name = test_name;\r\n    *params.output_stream << params.test_name << std::endl;\r\n\r\n    unsigned start_time = get_tick_count();\r\n\r\n    //void* persistent = 0;\r\n\r\n    ostringstream oss;\r\n    //istringstream iss (params.initial_state);\r\n    test_result_e res = test_result_success;\r\n    if (random_scheduler_type == params.search_type)\r\n        res = run_test<test_t, random_scheduler<test_t::params::thread_count> >(params, oss, false);\r\n    else if (fair_full_search_scheduler_type == params.search_type)\r\n        res = run_test<test_t, full_search_scheduler<test_t::params::thread_count> >(params, oss, false);\r\n    else if (fair_context_bound_scheduler_type == params.search_type)\r\n        res = run_test<test_t, context_bound_scheduler<test_t::params::thread_count> >(params, oss, false);\r\n    else\r\n        RL_VERIFY(false);\r\n\r\n    if (test_result_success == res)\r\n    {\r\n        unsigned t = get_tick_count() - start_time;\r\n        if (0 == t)\r\n            t = 1;\r\n\r\n        *params.output_stream << \"iterations: \" << params.stop_iteration << std::endl;\r\n        *params.output_stream << \"total time: \" << t << std::endl;\r\n        *params.output_stream << \"throughput: \" << (uint64_t)params.stop_iteration * 1000 / t << std::endl;\r\n        *params.output_stream << std::endl;\r\n    }\r\n    else if (false == params.output_history && false == params.collect_history)\r\n    {\r\n        ostringstream oss2;\r\n        params.initial_state = oss.str();\r\n        //istringstream iss2 (oss.str());\r\n        params.collect_history = true;\r\n        params.final_state = oss.str();\r\n        iteration_t const stop_iter = params.stop_iteration;\r\n        test_result_e res2 = test_result_success;\r\n        if (random_scheduler_type == params.search_type)\r\n            res2 = run_test<test_t, random_scheduler<test_t::params::thread_count> >(params, oss2, true);\r\n        else if (fair_full_search_scheduler_type == params.search_type)\r\n            res2 = run_test<test_t, full_search_scheduler<test_t::params::thread_count> >(params, oss2, true);\r\n        else if (fair_context_bound_scheduler_type == params.search_type)\r\n            res2 = run_test<test_t, context_bound_scheduler<test_t::params::thread_count> >(params, oss2, true);\r\n        else\r\n            RL_VERIFY(false);\r\n\r\n        // If you hit assert here, then probably your test is non-deterministic\r\n        // Check whether you are using functions like ::rand()\r\n        // or static variables or values of object addresses (for hashing) in your test\r\n        // Replace ::rand() with rl::rand(), eliminate static variables in the test\r\n        RL_VERIFY(res == res2);\r\n\r\n        RL_VERIFY(params.stop_iteration == stop_iter);\r\n        (void)stop_iter;\r\n        (void)res2;\r\n    }\r\n    return test_t::params::expected_result == res;\r\n}\r\n\r\ntemplate<typename test_t>\r\nbool simulate()\r\n{\r\n    test_params params;\r\n    return simulate<test_t>(params);\r\n}\r\n\r\ntemplate<void(*func)(), size_t thread_count>\r\nstruct simulate_thunk : test_suite<simulate_thunk<func, thread_count>, 1>\r\n{\r\n    static size_t const dynamic_thread_count = thread_count;\r\n    void thread(unsigned)\r\n    {\r\n        func();\r\n    }\r\n};\r\n\r\ntemplate<void(*func)(), size_t thread_count>\r\nbool execute(test_params& params)\r\n{\r\n    return simulate<simulate_thunk<func, thread_count> >(params);\r\n}\r\n\r\ntemplate<void(*func)(), size_t thread_count>\r\nbool execute()\r\n{\r\n    return simulate<simulate_thunk<func, thread_count> >();\r\n}\r\n\r\ntypedef bool (*simulate_f)(test_params&);\r\n\r\n\r\ntemplate<typename test_t, typename scheduler_t>\r\nvoid context_impl<test_t, scheduler_t>::fiber_proc(void* thread_index)\r\n{\r\n    ctx().fiber_proc_impl((int)(intptr_t)thread_index);\r\n}\r\n\r\ntemplate<typename type>\r\nvoid dtor_arr_impl(void* pp)\r\n{\r\n    type* p = (type*)((char*)pp + alignment);\r\n    size_t count = *(size_t*)pp;\r\n    for (size_t i = 0; i != count; ++i)\r\n    {\r\n       p->~type();\r\n       p += 1;\r\n    }\r\n}\r\n\r\ntemplate<typename type>\r\ntype* new_arr_impl(size_t count, rl::debug_info_param info)\r\n{\r\n    RL_VERIFY(alignment >= sizeof(size_t));\r\n    context& c = ctx();\r\n#ifndef RL_GC\r\n    void* mem = c.alloc(alignment + count * sizeof(type), true, info);\r\n#else\r\n    void* mem = c.alloc(alignment + count * sizeof(type), true, &dtor_arr_impl<type>, info);\r\n#endif\r\n    *(size_t*)mem = count;\r\n    size_t i = 0;\r\n    char* begin = (char*)mem + alignment;\r\n    char* pos = begin;\r\n    try\r\n    {\r\n        for (; i != count; ++i)\r\n        {\r\n            new (pos) type;\r\n            pos += sizeof(type);\r\n        }\r\n        return (type*)begin;\r\n    }\r\n    catch (...)\r\n    {\r\n        pos -= sizeof(type);\r\n        i -= 1;\r\n        for (; i < count; --i)\r\n        {\r\n            ((type*)pos)->~type();\r\n            pos -= sizeof(type);\r\n        }\r\n        ctx().free(mem, true, info);\r\n        throw;\r\n    }\r\n}\r\n\r\ntemplate<typename type>\r\nvoid delete_arr_impl(type* p, debug_info_param info)\r\n{\r\n    if (p == 0)\r\n        return;\r\n    context& c = ctx();\r\n    char* begin = (char*)p - alignment;\r\n    size_t count = *(size_t*)begin;\r\n    for (size_t i = 0; i != count; ++i)\r\n    {\r\n       p->~type();\r\n       p += 1;\r\n    }\r\n    c.free(begin, true, info);\r\n}\r\n\r\ntemplate<typename type>\r\nvoid delete_impl(type* p, debug_info_param info)\r\n{\r\n    p->~type();\r\n    ctx().free(p, false, info);\r\n}\r\n\r\ntemplate<typename type>\r\nvoid dtor_impl(void* p)\r\n{\r\n    static_cast<type*>(p)->~type();\r\n}\r\n\r\ninline unsigned rand(unsigned limit)\r\n{\r\n    return ctx().rand(limit, sched_type_user);\r\n}\r\n\r\ninline unsigned thread_index()\r\n{\r\n    return ctx().threadx_->index_;\r\n}\r\n\r\n\r\nstruct new_proxy\r\n{\r\n    debug_info info;\r\n    new_proxy(debug_info_param info)\r\n        : info(info)\r\n    {\r\n        //printf(__FUNCSIG__ \"\\n\");\r\n    }\r\n\r\n    template<typename T>\r\n    T* operator % (T* p)\r\n    {\r\n        context& c = ctx();\r\n        size_t sz = c.prev_alloc_size();\r\n        if (sz)\r\n        {\r\n            RL_HIST(memory_alloc_event) {p, sz, false} RL_HIST_END();\r\n        }\r\n        return p;\r\n    }\r\n};\r\n\r\nstruct delete_proxy\r\n{\r\n    //debug_info info_;\r\n    delete_proxy(debug_info_param info)\r\n        //: info_(info)\r\n    {\r\n        ctx().set_debug_info(info);\r\n        //printf(__FUNCSIG__ \"\\n\");\r\n    }\r\n};\r\n\r\ninline void* rl_malloc(size_t sz, debug_info_param info)\r\n{\r\n    return ctx().alloc(sz, false, info);\r\n}\r\n\r\ninline void* rl_calloc(size_t sz, size_t cnt, debug_info_param info)\r\n{\r\n    void* p = ctx().alloc(sz * cnt, false, info);\r\n    memset(p, 0, sz * cnt);\r\n    return p;\r\n}\r\n\r\ninline void* realloc(void* p, size_t sz, debug_info_param info)\r\n{\r\n    if (sz == 0)\r\n    {\r\n        ctx().free(p, false, info);\r\n        return 0;\r\n    }\r\n    else\r\n    {\r\n        void* pp = ctx().alloc(sz, false, info);\r\n        memcpy(pp, p, sz); //!!! how much memory to move?\r\n        ctx().free(p, false, info);\r\n        return pp;\r\n    }\r\n}\r\n\r\ninline void rl_free(void* p, debug_info_param info)\r\n{\r\n    ctx().free(p, false, info);\r\n}\r\n\r\ninline size_t hash_ptr(void const* p, size_t size)\r\n{\r\n    return ctx().get_addr_hash(p) % size;\r\n}\r\n\r\ninline void systemwide_fence(debug_info_param info)\r\n{\r\n    context& c = ctx();\r\n    RL_HIST(user_msg_event) {\"system-wide fence\"} RL_HIST_END();\r\n    c.rl_global_fence();\r\n}\r\n\r\n} // namespace rl\r\n\r\n\r\n#ifndef RL_GC\r\ninline void* operator new (size_t size, rl::debug_info_param info)\r\n{\r\n    return rl::ctx().alloc(size, false, info);\r\n}\r\n\r\ninline void* operator new [] (size_t size, rl::debug_info_param info)\r\n{\r\n    return rl::ctx().alloc(size, false, info);\r\n}\r\n\r\ninline void operator delete (void* p, rl::debug_info_param info)\r\n{\r\n    rl::ctx().free(p, false, info);\r\n}\r\n\r\ninline void operator delete [] (void* p, rl::debug_info_param info)\r\n{\r\n    rl::ctx().free(p, false, info);\r\n}\r\n#endif\r\n\r\n\r\n\r\n#ifdef RL_GC\r\ninline void* operator new (size_t size, void(*dtor)(void*), rl::debug_info_param info)\r\n{\r\n    return rl::ctx().alloc(size, false, dtor, info);\r\n}\r\n\r\ninline void operator delete (void* p, void(*dtor)(void*), rl::debug_info_param info)\r\n{\r\n    (void)p;\r\n    (void)dtor;\r\n    (void)info;\r\n}\r\n#endif\r\n\r\ninline void* operator new (size_t size) RL_THROW_SPEC(std::bad_alloc)\r\n{\r\n    if (rl::is_ctx())\r\n        return rl::ctx().alloc(size);\r\n    else\r\n        return (::malloc)(size);\r\n}\r\n\r\ninline void* operator new [] (size_t size) RL_THROW_SPEC(std::bad_alloc)\r\n{\r\n    if (rl::is_ctx())\r\n        return rl::ctx().alloc(size);\r\n    else\r\n        return (::malloc)(size);\r\n}\r\n\r\ninline void operator delete (void* p) throw()\r\n{\r\n    if (rl::is_ctx())\r\n        rl::ctx().free(p);\r\n    else\r\n        (::free)(p);\r\n}\r\n\r\ninline void operator delete [] (void* p) throw()\r\n{\r\n    if (rl::is_ctx())\r\n        rl::ctx().free(p);\r\n    else\r\n        (::free)(p);\r\n}\r\n\r\n#define RL_NEW_PROXY rl::new_proxy($) % new\r\n#define RL_DELETE_PROXY rl::delete_proxy($) , delete\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/context_addr_hash.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_CONTEXT_ADDR_HASH_HPP\r\n#define RL_CONTEXT_ADDR_HASH_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\n\r\nstruct context_addr_hash_iface\r\n{\r\n    virtual size_t      get_addr_hash               (void const* p) = 0;\r\n    virtual             ~context_addr_hash_iface    () {} // to calm down g++\r\n};\r\n\r\n\r\n\r\n\r\ntemplate<typename base_t, thread_id_t thread_count>\r\nclass context_addr_hash_impl : protected base_t\r\n{\r\npublic:\r\n    context_addr_hash_impl(thread_id_t thread_count_param, test_params& params)\r\n        : base_t(thread_count_param, params)\r\n    {\r\n    }\r\n\r\n    void iteration_begin()\r\n    {\r\n        base_t::iteration_begin();\r\n        hash_map_.clear();\r\n        hash_seq_ = 0;\r\n    }\r\n\r\nprivate:\r\n    struct entry\r\n    {\r\n        uintptr_t       ptr_;\r\n        size_t          hash_;\r\n    };\r\n    typedef map<void const*, size_t>::type  hash_map_t;\r\n    hash_map_t                              hash_map_;\r\n    size_t                                  hash_seq_;\r\n\r\n    virtual size_t      get_addr_hash               (void const* p)\r\n    {\r\n        //!!! accept 'table size' to do 'hash % table_size'\r\n        // will give more information for state exploration\r\n\r\n        hash_map_t::iterator iter (hash_map_.find(p));\r\n        if (iter != hash_map_.end() && iter->first == p)\r\n        {\r\n            return iter->second;\r\n        }\r\n        else\r\n        {\r\n            //!!! distribute hashes more randomly, use rand()\r\n            size_t hash = hash_seq_++;\r\n            hash_map_.insert(std::make_pair(p, hash));\r\n            return hash;\r\n        }\r\n    }\r\n};\r\n\r\n\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/context_base.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_CONTEXT_BASE_HPP\r\n#define RL_CONTEXT_BASE_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n#include \"history.hpp\"\r\n#include \"memory.hpp\"\r\n#include \"test_result.hpp\"\r\n#include \"slab_allocator.hpp\"\r\n#include \"test_params.hpp\"\r\n#include \"random.hpp\"\r\n#include \"foreach.hpp\"\r\n#include \"thread_base.hpp\"\r\n#include \"context_addr_hash.hpp\"\r\n\r\n\r\n#ifdef RL_DEBUGBREAK_ON_ASSERT\r\n#    ifdef _MSC_VER\r\n#        define RL_DEBUGBREAK_ON_ASSERT_IMPL {if (IsDebuggerPresent()) __debugbreak();}\r\n#    else\r\n#        define RL_DEBUGBREAK_ON_ASSERT_IMPL {__asm(\"int3\");}\r\n#    endif\r\n#else\r\n#   define RL_DEBUGBREAK_ON_ASSERT_IMPL\r\n#endif\r\n\r\n#ifdef RL_DEBUGBREAK_ON_FAILURE\r\n#    ifdef _MSC_VER\r\n#        define RL_DEBUGBREAK_ON_FAILURE_IMPL {if (IsDebuggerPresent()) __debugbreak();}\r\n#    else\r\n#        define RL_DEBUGBREAK_ON_FAILURE_IMPL {__asm(\"int3\");}\r\n#    endif\r\n#else\r\n#   define RL_DEBUGBREAK_ON_FAILURE_IMPL\r\n#endif\r\n\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\nclass thread_info_base;\r\n\r\nstruct atomic_data {};\r\nstruct var_data\r\n{\r\n    virtual void init(thread_info_base& th) = 0;\r\n    virtual bool store(thread_info_base& th) = 0;\r\n    virtual bool load(thread_info_base& th) = 0;\r\n    virtual ~var_data() {} // just to calm down gcc\r\n};\r\n\r\nstruct generic_mutex_data;\r\nstruct condvar_data;\r\nstruct sema_data;\r\nstruct event_data;\r\n\r\n\r\nstruct user_msg_event\r\n{\r\n    string msg_;\r\n\r\n    void output(std::ostream& s) const\r\n    {\r\n        s << msg_;\r\n    }            \r\n};\r\n\r\nclass context;\r\n\r\ntemplate<int fake = 0>\r\nstruct context_holder\r\n{\r\n    static context* instance_;\r\n\r\n    static long volatile ctx_seq;\r\n};\r\n\r\ntemplate<int fake>\r\nlong volatile context_holder<fake>::ctx_seq = 0;\r\n\r\nclass context\r\n    : public thread_local_context_iface\r\n    , public context_addr_hash_iface\r\n    , nocopy<>\r\n{\r\npublic:\r\n    static context& instance()\r\n    {\r\n        //!!! disabled for check in operator new RL_VERIFY(context_holder<>::instance_);\r\n        return *context_holder<>::instance_;\r\n    }\r\n\r\n    static bool is_instance()\r\n    {\r\n        return context_holder<>::instance_;\r\n    }\r\n\r\n    virtual atomic_data* atomic_ctor(void* ctx) = 0;\r\n    virtual void atomic_dtor(atomic_data* data) = 0;\r\n\r\n    virtual var_data* var_ctor() = 0;\r\n    virtual void var_dtor(var_data* data) = 0;\r\n\r\n    virtual generic_mutex_data* mutex_ctor(bool is_rw, bool is_exclusive_recursive, bool is_shared_recursive, bool failing_try_lock) = 0;\r\n    virtual void mutex_dtor(generic_mutex_data* m) = 0;\r\n\r\n    virtual condvar_data* condvar_ctor(bool allow_spurious_wakeups) = 0;\r\n    virtual void condvar_dtor(condvar_data* cv) = 0;\r\n\r\n    virtual sema_data* sema_ctor(bool spurious_wakeups, unsigned initial_count, unsigned max_count) = 0;\r\n    virtual void sema_dtor(sema_data* cv) = 0;\r\n\r\n    virtual event_data* event_ctor(bool manual_reset, bool initial_state) = 0;\r\n    virtual void event_dtor(event_data* cv) = 0;\r\n\r\n    virtual void rl_global_fence() = 0;\r\n    virtual void sched() = 0;\r\n    virtual void yield(unsigned count, debug_info_param info) = 0;\r\n    virtual void fail_test(char const* desc, test_result_e res, debug_info_param info) = 0;\r\n    virtual void rl_until(char const* desc, debug_info_param info) = 0;\r\n\r\n    virtual void* alloc(size_t size, bool is_array, debug_info_param info) = 0;\r\n#ifdef RL_GC\r\n    virtual void* alloc(size_t size, bool is_array, void(*dtor)(void*), debug_info_param info) = 0;\r\n#endif\r\n    virtual void free(void* p, bool is_array, debug_info_param info) = 0;\r\n\r\n    virtual void* alloc(size_t size) = 0;\r\n    virtual void free(void* p) = 0;\r\n    virtual size_t prev_alloc_size() = 0;\r\n    virtual void set_debug_info(debug_info_param info) = 0;\r\n\r\n    virtual void fiber_proc_impl(int thread_index) = 0;\r\n\r\n    virtual unpark_reason park_current_thread(bool is_timed,\r\n                                              bool allow_spurious_wakeup,\r\n                                              bool do_switch,\r\n                                              debug_info_param info) = 0;\r\n    virtual void unpark_thread(thread_id_t th, bool do_switch, debug_info_param info) = 0;\r\n    virtual void switch_back(debug_info_param info) = 0;\r\n\r\n    virtual void atomic_thread_fence_acquire() = 0;\r\n    virtual void atomic_thread_fence_release() = 0;\r\n    virtual void atomic_thread_fence_acq_rel() = 0;\r\n    virtual void atomic_thread_fence_seq_cst() = 0;\r\n\r\n    virtual unsigned rand(unsigned limit, sched_type t) = 0;\r\n\r\n    virtual win_waitable_object* create_thread(void*(*fn)(void*), void* ctx) = 0;\r\n\r\n    virtual unpark_reason wfmo_park(void** ws,\r\n                                    win_waitable_object** wo,\r\n                                    size_t count,\r\n                                    bool wait_all,\r\n                                    bool is_timed,\r\n                                    debug_info_param info) = 0;\r\n\t\r\n    int get_errno();\r\n    void set_errno(int value);\r\n\r\n    thread_info_base* threadx_;\r\n    timestamp_t* seq_cst_fence_order_;\r\n\r\n    bool invariant_executing;\r\n\r\n    RL_INLINE bool collecting_history() const\r\n    {\r\n        return params_.collect_history && false == invariant_executing;\r\n    }\r\n\r\n    template<typename event_t>\r\n    void exec_log(debug_info_param info, event_t const& ev);\r\n\r\n    void exec_log_msg(debug_info_param info, char const* msg)\r\n    {\r\n        user_msg_event ev = {msg};\r\n        exec_log(info, ev);\r\n    }\r\n\r\n    bool is_random_sched() const\r\n    {\r\n        return is_random_sched_;\r\n    }\r\n\r\n    unsigned get_ctx_seq() const\r\n    {\r\n        return ctx_seq_;\r\n    }\r\n\r\n    void disable_preemption();\r\n    void enable_preemption();\r\n\r\n    virtual thread_id_t get_thread_count() const = 0;\r\n\r\n    thread_id_t current_thread() const\r\n    {\r\n        return threadx_->index_;\r\n    }\r\n\r\n    void iteration_begin()\r\n    {\r\n    }\r\n\r\nprotected:\r\n    history_mgr history_;\r\n    test_params& params_;\r\n    unsigned disable_preemption_;\r\n    int                         disable_alloc_;\r\n\r\n    context(thread_id_t thread_count, test_params& params)\r\n        : history_(*params.output_stream, thread_count)\r\n        , params_(params)\r\n        , disable_alloc_(1)\r\n    {\r\n        RL_VERIFY(0 == context_holder<>::instance_);\r\n        context_holder<>::instance_ = this;\r\n\r\n        is_random_sched_ = params_.search_type == random_scheduler_type;\r\n\r\n#ifdef _MSC_VER\r\n        ctx_seq_ = _InterlockedExchangeAdd(&context_holder<>::ctx_seq, 1) + 1;\r\n#else\r\n        ctx_seq_ = __sync_fetch_and_add(&context_holder<>::ctx_seq, 1) + 1;\r\n#endif\r\n    }\r\n\r\n    virtual ~context()\r\n    {\r\n        RL_VERIFY(this == context_holder<>::instance_);\r\n        context_holder<>::instance_ = 0;\r\n    }\r\n    \r\nprivate:\r\n    bool is_random_sched_;\r\n    unsigned ctx_seq_;\r\n};\r\n\r\n\r\ntemplate<int fake>\r\ncontext* context_holder<fake>::instance_ = 0;\r\n\r\n\r\n\r\n\r\ninline context& ctx()\r\n{\r\n    return context::instance();\r\n}\r\n\r\ninline bool is_ctx()\r\n{\r\n    return context::is_instance();\r\n}\r\n\r\n\r\ninline int get_errno()\r\n{\r\n    return ctx().get_errno();\r\n}\r\n\r\ninline void set_errno(int value)\r\n{\r\n    return ctx().set_errno(value);\r\n}\r\n\r\nclass preemption_disabler : nocopy<>\r\n{\r\npublic:\r\n    preemption_disabler(context& c)\r\n        : c_(c)\r\n    {\r\n        c_.disable_preemption();\r\n    }\r\n\r\n    ~preemption_disabler()\r\n    {\r\n        c_.enable_preemption();\r\n    }\r\n\r\nprivate:\r\n    context& c_;\r\n};\r\n\r\n\r\n}\r\n\r\n\r\n#define RL_HIST_IMPL(C, INFO, TYPE) \\\r\n    do { \\\r\n        if (C.collecting_history()) { \\\r\n            rl::debug_info const& rl_info_c = INFO; \\\r\n            rl::context& rl_hist_c = C; \\\r\n            TYPE ev = \\\r\n/**/\r\n\r\n#define RL_HIST_END() \\\r\n                        ; \\\r\n            rl_hist_c.exec_log(rl_info_c, ev); \\\r\n        } \\\r\n    } while ((void)0, 0) \\\r\n/**/\r\n\r\n#define RL_HIST_CTX(TYPE) RL_HIST_IMPL((*this), info, TYPE)\r\n\r\n#define RL_HIST(TYPE) RL_HIST_IMPL(c, info, TYPE)\r\n\r\n#define RL_LOG(desc) rl::ctx().exec_log_msg(RL_INFO, desc)\r\n\r\n\r\n\r\n#ifdef _MSC_VER\r\n#   define RL_ASSERT_IMPL(x, res, str, info) do {if (!((void)0, (x))) {{RL_DEBUGBREAK_ON_ASSERT_IMPL} rl::ctx().fail_test(str, res, info);}} while ((void)0, 0)\r\n#else\r\n#   define RL_ASSERT_IMPL(x, res, str, info) do {if (!((void)0, (x))) rl::ctx().fail_test(str, res, info);} while ((void)0, 0)\r\n#endif\r\n#define RL_ASSERT(x) RL_ASSERT_IMPL(x, rl::test_result_user_assert_failed, \"assertion: \" #x, RL_INFO)\r\n#define RL_UNTIL(x) do {if ((x)) rl::ctx().rl_until(#x, RL_INFO);} while ((void)0, 0)\r\n\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/context_base_impl.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_CONTEXT_BASE_IMPL_HPP\r\n#define RL_CONTEXT_BASE_IMPL_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\n/*\r\ninline void context::disable_history()\r\n{\r\n    RL_VERIFY(threadx_);\r\n    threadx_->disable_history_ += 1;\r\n}\r\n\r\ninline void context::enable_history()\r\n{\r\n    RL_VERIFY(threadx_);\r\n    RL_VERIFY(threadx_->disable_history_);\r\n    threadx_->disable_history_ -= 1;\r\n}\r\n*/\r\n\r\ninline void context::disable_preemption()\r\n{\r\n    disable_preemption_ += 1;\r\n}\r\n\r\ninline void context::enable_preemption()\r\n{\r\n    disable_preemption_ -= 1;\r\n}\r\n\r\ninline int context::get_errno()\r\n{\r\n    RL_VERIFY(threadx_);\r\n    return threadx_->errno_;\r\n}\r\n\r\ninline void context::set_errno(int value)\r\n{\r\n    RL_VERIFY(threadx_);\r\n    threadx_->errno_ = value;\r\n}\r\n\r\ntemplate<typename event_t>\r\nvoid context::exec_log(debug_info_param info, event_t const& ev)\r\n{\r\n    RL_VERIFY(collecting_history());\r\n    disable_alloc_ += 1;\r\n    history_.exec_log(threadx_ ? threadx_->index_ : -1, info, ev, params_.output_history);\r\n    disable_alloc_ -= 1;\r\n}\r\n\r\n\r\n\r\n}\r\n\r\n\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/context_bound_scheduler.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_CONTEXT_BOUND_SCHEDULER_HPP\r\n#define RL_CONTEXT_BOUND_SCHEDULER_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n#include \"full_search_scheduler.hpp\"\r\n#include \"foreach.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\n\r\ntemplate<thread_id_t thread_count>\r\nstruct context_bound_scheduler_thread_info : tree_search_scheduler_thread_info<thread_count>\r\n{\r\n    unsigned sched_count_;\r\n    unsigned forced_context_switch_count_;\r\n\r\n    void reset(test_params& params)\r\n    {\r\n        tree_search_scheduler_thread_info<thread_count>::reset(params);\r\n        sched_count_ = 0;\r\n        forced_context_switch_count_ = 0;\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\ntemplate<thread_id_t thread_count>\r\nclass context_bound_scheduler\r\n    : public tree_search_scheduler<context_bound_scheduler<thread_count>\r\n        , context_bound_scheduler_thread_info<thread_count>, thread_count>\r\n{\r\npublic:\r\n    typedef tree_search_scheduler<context_bound_scheduler<thread_count>\r\n        , context_bound_scheduler_thread_info<thread_count>, thread_count> base_t;\r\n    typedef typename base_t::thread_info_t thread_info_t;\r\n    typedef typename base_t::shared_context_t shared_context_t;\r\n\r\n    context_bound_scheduler(test_params& params, shared_context_t& ctx, thread_id_t dynamic_thread_count)\r\n        : base_t(params, ctx, dynamic_thread_count)\r\n    {\r\n    }\r\n\r\n    thread_id_t iteration_begin_impl()\r\n    {\r\n        switches_remain_ = this->params_.context_bound;\r\n        return base_t::iteration_begin_impl();\r\n    }\r\n\r\n    bool can_switch(thread_info_t& t)\r\n    {\r\n        t.sched_count_ += 1;\r\n        return switches_remain_ != 0;\r\n    }\r\n\r\n    void on_switch(thread_info_t& t)\r\n    {\r\n        if (t.state_ == thread_state_running)\r\n        {\r\n            RL_VERIFY(switches_remain_);\r\n            switches_remain_ -= 1;\r\n        }\r\n        else\r\n        {\r\n            t.forced_context_switch_count_ += 1;\r\n        }\r\n    }\r\n\r\n    double iteration_count_approx()\r\n    {\r\n        return 1.0;\r\n        /*\r\n        iteration_t const P = thread_count;\r\n        iteration_t const C0 = this->params_.context_bound;\r\n        iteration_t total = 1;//factorial(P);// * power(P, P * C0);\r\n        for (iteration_t i = 0; i != P - 1; ++i)\r\n            total *= power(i + 1, C0 + 1);\r\n        //if (C0)\r\n        //    total *= power(P - 1, P - 1);\r\n        if (val(P) > 1)\r\n        {\r\n            for (iteration_t i = 0; i != P; ++i)\r\n            {\r\n                iteration_t const N = this->threads_[i].sched_count_;\r\n                iteration_t const C = C0 + this->threads_[i].forced_context_switch_count_;\r\n                //total *= (iteration_t)pow((double)(threads_[i].sched_count_ + 2) * (thread_count - 1), (int)(params_.context_bound + threads_[i].forced_context_switch_count_));\r\n                total *= factorial(N, C) / factorial(C);\r\n                //C$ += C + 1;\r\n                //total *= (int)(params_.context_bound + threads_[i].forced_context_switch_count_));\r\n            }\r\n            //total *= factorial(C$);\r\n        }\r\n        else\r\n        {\r\n            total = 1;\r\n        }\r\n        //iteration_t total = (iteration_t)pow((double)sched_count / thread_count + 1, (int)(params_.context_bound * thread_count + forced_context_switch_mean_ + 0.5));\r\n        //total *= thread_count;\r\n        //total *= (iteration_t)pow((double)thread_count - 1, thread_count);\r\n        for (size_t i = 0; i != this->stree_.size(); ++i)\r\n        {\r\n            if (this->stree_[i].type_ != sched_type_sched)\r\n            {\r\n                total *= this->stree_[i].count_;\r\n            }\r\n        }\r\n        return (double)total;\r\n        */\r\n    }\r\n\r\nprivate:\r\n    unsigned switches_remain_;\r\n\r\n    template<typename T>\r\n    static T factorial(T x, T i)\r\n    {\r\n        if (0 == i)\r\n            return 1;\r\n        T r = x;\r\n        for (--i; i; --i)\r\n            r *= x - i;\r\n        return r;\r\n    }\r\n\r\n    template<typename T>\r\n    static T factorial(T x)\r\n    {\r\n        if (0 == x)\r\n            return 1;\r\n        T r = x;\r\n        for (T i = x - 1; i; --i)\r\n            r *= i;\r\n        return r;\r\n    }\r\n\r\n    template<typename T>\r\n    static T power(T x, T y)\r\n    {\r\n        if (0 == y)\r\n            return 1;\r\n        T r = x;\r\n        for (T i = y - 1; i; --i)\r\n            r *= x;\r\n        return r;\r\n    }\r\n\r\n    RL_NOCOPY(context_bound_scheduler);\r\n};\r\n\r\n\r\n}\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/defs.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_DEFS_HPP\r\n#define RL_DEFS_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\ntypedef int thread_id_t;\r\ntypedef size_t timestamp_t;\r\ntypedef uint64_t iteration_t;\r\n\r\nsize_t const atomic_history_size = 3;\r\niteration_t const progress_probe_period = 4 * 1024;\r\n\r\nsize_t const alignment = 16;\r\n\r\nclass context;\r\nclass thread_base;\r\nstruct win_waitable_object;\r\n\r\nenum sched_type\r\n{\r\n    sched_type_sched,\r\n    sched_type_atomic_load,\r\n    sched_type_cas_fail,\r\n    sched_type_mem_realloc,\r\n    sched_type_user,\r\n};\r\n\r\nenum unpark_reason\r\n{\r\n    unpark_reason_normal,\r\n    unpark_reason_timeout,\r\n    unpark_reason_spurious,\r\n};\r\n\r\nstruct debug_info\r\n{\r\n    char const* func_;\r\n    char const* file_;\r\n    unsigned line_;\r\n\r\n    debug_info(char const* func = \"\", char const* file = \"\", unsigned line = 0)\r\n        : func_(func)\r\n        , file_(file)\r\n        , line_(line)\r\n    {\r\n    }\r\n};\r\n\r\ntypedef debug_info const& debug_info_param;\r\n\r\ninline void assert_failed(char const* cond, debug_info_param info)\r\n{\r\n    std::cout << \"RELACY INTERNAL ASSERT FAILED: '\" << cond\r\n    << \"' at \" << info.file_ << \":\" << info.line_ << \" (\" << info.func_ << \")\" << std::endl;\r\n}\r\n\r\ntemplate<typename T>\r\nstruct raw_allocator : std::allocator<T>\r\n{\r\n    template<class Y>\r\n    struct rebind\r\n    {\r\n        typedef raw_allocator<Y> other;\r\n    };\r\n\r\n    template<typename Y>\r\n    raw_allocator(raw_allocator<Y> const&)\r\n    {\r\n    }\r\n\r\n    raw_allocator(raw_allocator const& rhs)\r\n        : std::allocator<T>(rhs)\r\n    {\r\n    }\r\n\r\n    raw_allocator()\r\n        : std::allocator<T>()\r\n    {\r\n    }\r\n\r\n    T* allocate(size_t count, void* = 0)\r\n    {\r\n        return (T*)(::malloc)(count * sizeof(T));\r\n    }\r\n\r\n    void deallocate(T* p, size_t)\r\n    {\r\n        (::free)(p);\r\n    }\r\n};\r\n\r\n\r\ntemplate<typename T>\r\nstruct vector\r\n{\r\n    typedef std::vector<T, raw_allocator<T> > type;\r\n};\r\n\r\ntemplate<typename T>\r\nstruct queue\r\n{\r\n    typedef std::queue<T, std::deque<T, raw_allocator<T> > > type;\r\n};\r\n\r\ntemplate<typename T>\r\nstruct stack\r\n{\r\n    typedef std::stack<T, std::vector<T, raw_allocator<T> > > type;\r\n};\r\n\r\ntemplate<typename T>\r\nstruct set\r\n{\r\n    typedef std::set<T, std::less<T>, raw_allocator<T> > type;\r\n};\r\n\r\ntemplate<typename T, typename Y>\r\nstruct map\r\n{\r\n    typedef std::map<T, Y, std::less<T>, raw_allocator<std::pair<const T, Y> > > type;\r\n};\r\n\r\ntypedef std::basic_string<char, std::char_traits<char>, raw_allocator<char> > string;\r\ntypedef std::basic_ostringstream<char, std::char_traits<char>, raw_allocator<char> > ostringstream;\r\ntypedef std::basic_istringstream<char, std::char_traits<char>, raw_allocator<char> > istringstream;\r\n\r\n}\r\n\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/dyn_thread.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_DYN_THREAD_HPP\r\n#define RL_DYN_THREAD_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n#include \"context_base.hpp\"\r\n#include \"stdlib/semaphore.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\n\r\nclass dyn_thread : nocopy<>\r\n{\r\npublic:\r\n    dyn_thread()\r\n    {\r\n        handle_ = 0;\r\n    }\r\n\r\n    void start(void*(*fn)(void*), void* arg)\r\n    {\r\n        RL_VERIFY(handle_ == 0);\r\n        handle_ = ctx().create_thread(fn, arg);\r\n    }\r\n\r\n    void join()\r\n    {\r\n        RL_VERIFY(handle_);\r\n        handle_->wait(false, false, $);\r\n        handle_ = 0;\r\n    }\r\n\r\nprivate:\r\n    win_waitable_object* handle_;\r\n};\r\n\r\n\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/dyn_thread_ctx.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_DYN_THREAD_CTX_HPP\r\n#define RL_DYN_THREAD_CTX_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n\r\n#include \"base.hpp\"\r\n#include \"waitset.hpp\"\r\n#include \"sync_var.hpp\"\r\n#include \"stdlib/semaphore.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\n\r\ntemplate<thread_id_t thread_count>\r\nclass thread_sync_object : public win_waitable_object\r\n{\r\npublic:\r\n    thread_sync_object()\r\n    {\r\n    }\r\n\r\n    void iteration_begin()\r\n    {\r\n        finished_ = false;\r\n        sync_.iteration_begin();\r\n        RL_VERIFY(!ws_);\r\n    }\r\n\r\n    void on_create()\r\n    {\r\n        sync_.release(ctx().threadx_);\r\n    }\r\n\r\n    void on_start()\r\n    {\r\n        RL_VERIFY(finished_ == false);\r\n        context& c = ctx();\r\n        sync_.acquire(c.threadx_);\r\n    }\r\n    \r\n    void on_finish()\r\n    {\r\n        RL_VERIFY(finished_ == false);\r\n        context& c = ctx();\r\n        finished_ = true;\r\n        sync_.release(c.threadx_);\r\n        ws_.unpark_all(c, $);\r\n    }\r\n\r\nprivate:\r\n    bool finished_;\r\n    waitset<thread_count> ws_;\r\n    sync_var<thread_count> sync_;\r\n\r\n    virtual void deinit(debug_info_param info)\r\n    {\r\n        (void)info;\r\n    }\r\n\r\n    virtual sema_wakeup_reason wait(bool try_wait, bool is_timed, debug_info_param info)\r\n    {\r\n        context& c = ctx();\r\n        if (finished_)\r\n        {\r\n            sync_.acquire(c.threadx_);\r\n            return sema_wakeup_reason_success;\r\n        }\r\n        else if (try_wait)\r\n        {\r\n            sync_.acquire(c.threadx_);\r\n            return sema_wakeup_reason_failed;\r\n        }\r\n        else\r\n        {\r\n            unpark_reason reason = ws_.park_current(c, is_timed, false, false, info);\r\n            sync_.acquire(c.threadx_);\r\n            if (reason == unpark_reason_normal)\r\n                return sema_wakeup_reason_success;\r\n            else if (reason == unpark_reason_timeout)\r\n                return sema_wakeup_reason_timeout;\r\n            RL_VERIFY(false);\r\n            return sema_wakeup_reason_failed;\r\n        }\r\n    }\r\n\r\n    virtual bool signal(debug_info_param info)\r\n    {\r\n        RL_ASSERT_IMPL(false, test_result_thread_signal, \"trying to signal a thread\", info);\r\n        return false;\r\n    }\r\n\r\n    virtual bool is_signaled(debug_info_param info)\r\n    {\r\n        (void)info;\r\n        return finished_;\r\n    }\r\n\r\n    virtual void memory_acquire(debug_info_param info)\r\n    {\r\n        (void)info;\r\n        sync_.acquire(ctx().threadx_);\r\n    }\r\n\r\n    virtual void* prepare_wait(debug_info_param info)\r\n    {\r\n        (void)info;\r\n        return &ws_;\r\n    }\r\n};\r\n\r\n\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/foreach.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_FOREACH_HPP\r\n#define RL_FOREACH_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n\r\nnamespace rl\r\n{\r\n\r\n\r\ntemplate<typename T, thread_id_t i, thread_id_t index>\r\nstruct foreach_thread_impl\r\n{\r\n    template<typename F>\r\n    RL_INLINE static void exec(\r\n        T* v1,\r\n        F func)\r\n    {\r\n        (*func)(v1[i]);\r\n        foreach_thread_impl<T, i + 1, index - 1>::exec(v1, func);\r\n    }\r\n\r\n    RL_INLINE static void exec(\r\n        T* v1, T* v2,\r\n        void (*func)(T& e1, T& e2))\r\n    {\r\n        (*func)(v1[i], v2[i]);\r\n        foreach_thread_impl<T, i + 1, index - 1>::exec(v1, v2, func);\r\n    }\r\n\r\n    RL_INLINE static void exec(\r\n        T* v1, T* v2, T* v3,\r\n        void (*func)(T& e1, T& e2, T& e3))\r\n    {\r\n        (*func)(v1[i], v2[i], v3[i]);\r\n        foreach_thread_impl<T, i + 1, index - 1>::exec(v1, v2, v3, func);\r\n    }\r\n};\r\n\r\ntemplate<typename T, thread_id_t i>\r\nstruct foreach_thread_impl<T, i, 0>\r\n{\r\n    template<typename F>\r\n    RL_INLINE static void exec(\r\n        T*,\r\n        F)\r\n    {\r\n    }\r\n\r\n    RL_INLINE static void exec(\r\n        T*, T*,\r\n        void (*)(T&, T&))\r\n    {\r\n    }\r\n\r\n    RL_INLINE static void exec(\r\n        T*, T*, T*,\r\n        void (*)(T&, T&, T&))\r\n    {\r\n    }\r\n};\r\n\r\ntemplate<thread_id_t count, typename T, typename F>\r\nRL_INLINE void foreach(\r\n    T* v1,\r\n    F func)\r\n{\r\n    foreach_thread_impl<T, 0, count>::exec(v1, func);\r\n}\r\n\r\ntemplate<thread_id_t count, typename T>\r\nRL_INLINE void foreach(\r\n    T* v1, T* v2,\r\n    void (*func)(T& e1, T& e2))\r\n{\r\n    foreach_thread_impl<T, 0, count>::exec(v1, v2, func);\r\n}\r\n\r\ntemplate<thread_id_t count, typename T>\r\nRL_INLINE void foreach(\r\n    T* v1, T* v2, T* v3,\r\n    void (*func)(T& e1, T& e2, T& e3))\r\n{\r\n    foreach_thread_impl<T, 0, count>::exec(v1, v2, v3, func);\r\n}\r\n\r\nRL_INLINE void assign_zero(timestamp_t& elem)\r\n{\r\n    elem = 0;\r\n}\r\n\r\nRL_INLINE void assign_zero_u(unsigned& elem)\r\n{\r\n    elem = 0;\r\n}\r\n\r\ntemplate<timestamp_t value>\r\nRL_INLINE void assign(timestamp_t& elem)\r\n{\r\n    elem = value;\r\n}\r\n\r\nRL_INLINE void assign(timestamp_t& elem1, timestamp_t& elem2)\r\n{\r\n    elem1 = elem2;\r\n}\r\n\r\nRL_INLINE void assign_max(timestamp_t& elem1, timestamp_t& elem2)\r\n{\r\n    if (elem2 > elem1)\r\n        elem1 = elem2;\r\n}\r\n\r\nRL_INLINE void plus_one(timestamp_t& elem)\r\n{\r\n    elem += 1;\r\n}\r\n\r\n}\r\n\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/full_search_scheduler.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_FULL_SEARCH_SCHEDULER_HPP\r\n#define RL_FULL_SEARCH_SCHEDULER_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n#include \"scheduler.hpp\"\r\n#include \"foreach.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\n\r\ntemplate<thread_id_t thread_count>\r\nstruct tree_search_scheduler_thread_info : scheduler_thread_info\r\n{\r\n    unsigned                    yield_sched_count_ [thread_count];\r\n    unsigned                    yield_priority_ [thread_count];\r\n    unsigned                    total_yield_priority_;\r\n    //unsigned                    subsequent_timed_waits_;\r\n\r\n    void reset(test_params& params)\r\n    {\r\n        scheduler_thread_info::reset(params);\r\n        foreach<thread_count>(yield_sched_count_, &assign_zero_u);\r\n        foreach<thread_count>(yield_priority_, &assign_zero_u);\r\n        total_yield_priority_ = 0;\r\n        //subsequent_timed_waits_ = 0;\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\ntemplate<typename derived_t, typename thread_info_type, thread_id_t thread_count>\r\nclass tree_search_scheduler\r\n    : public scheduler<derived_t, thread_info_type, thread_count>\r\n{\r\npublic:\r\n    typedef scheduler<derived_t, thread_info_type, thread_count> base_t;\r\n    typedef typename base_t::thread_info_t thread_info_t;\r\n    typedef typename base_t::shared_context_t shared_context_t;\r\n\r\n    struct task_t\r\n    {\r\n    };\r\n\r\n    tree_search_scheduler(test_params& params, shared_context_t& ctx, thread_id_t dynamic_thread_count)\r\n        : base_t(params, ctx, dynamic_thread_count)\r\n        , stree_depth_()\r\n        , iteration_count_mean_()\r\n        , iteration_count_probe_count_()\r\n    {\r\n        stree_.reserve(128);\r\n    }\r\n\r\n    thread_id_t iteration_begin_impl()\r\n    {\r\n        stree_depth_ = 0;\r\n\r\n        unsigned const index = rand_impl(this->running_threads_count, sched_type_sched);\r\n        thread_id_t const th = this->running_threads[index];\r\n        return th;\r\n    }\r\n\r\n    bool iteration_end_impl()\r\n    {\r\n        RL_VERIFY(stree_depth_ == stree_.size());\r\n\r\n        for (size_t i = stree_.size(); i != 0; --i)\r\n        {\r\n            stree_node& n = stree_[i - 1];\r\n            if (n.index_ != n.count_ - 1)\r\n            {\r\n                stree_.resize(i);\r\n                n.index_ += 1;\r\n                RL_VERIFY(n.index_ < n.count_);\r\n                return false;\r\n            }\r\n        }\r\n        return true;\r\n    }\r\n\r\n    void yield_priority(unsigned yield)\r\n    {\r\n        RL_VERIFY(yield);\r\n\r\n        thread_info_t& t = *this->thread_;\r\n        thread_id_t const& running_thread_count = this->running_threads_count;\r\n\r\n        for (thread_id_t i = 0; i != thread_count; ++i)\r\n        {\r\n            thread_info_t& y = this->threads_[i];\r\n            RL_VERIFY(0 == y.yield_priority_[t.index_]);\r\n\r\n            if (t.index_ != i\r\n                && y.yield_sched_count_[t.index_] < yield\r\n                && y.state_ != thread_state_finished)\r\n            {\r\n                y.yield_priority_[t.index_] = yield;\r\n                y.total_yield_priority_ += yield;\r\n                this->block_thread(t.index_, false);\r\n            }\r\n            y.yield_sched_count_[t.index_] = 0;\r\n        }\r\n\r\n        if (0 == running_thread_count)\r\n            purge_blocked_threads();\r\n    }\r\n\r\n    thread_id_t schedule_impl(unpark_reason& reason, unsigned yield)\r\n    {\r\n        thread_info_t& t = *this->thread_;\r\n        thread_id_t const& running_thread_count = this->running_threads_count;\r\n\r\n#ifdef _DEBUG\r\n        {\r\n            unsigned tmp = 0;\r\n            for (thread_id_t i = 0; i != thread_count; ++i)\r\n                tmp += t.yield_priority_[i];\r\n            RL_VERIFY(t.total_yield_priority_ == tmp);\r\n        }\r\n#endif\r\n\r\n        if (t.total_yield_priority_)\r\n        {\r\n            for (thread_id_t i = 0; i != thread_count; ++i)\r\n            {\r\n                unsigned& prio = t.yield_priority_[i];\r\n                if (prio)\r\n                {\r\n                    prio -= 1;\r\n                    t.total_yield_priority_ -= 1;\r\n                    if (0 == prio)\r\n                    {\r\n                        this->unblock_thread(i);\r\n                    }\r\n                }\r\n                t.yield_sched_count_[i] += 1;\r\n            }\r\n        }\r\n\r\n        if (yield)\r\n            yield_priority(yield);\r\n\r\n        reason = unpark_reason_normal;\r\n        thread_id_t thread_index = 0;\r\n\r\n        if (self().can_switch(t)\r\n            || t.state_ != thread_state_running)\r\n        {\r\n            thread_id_t timed_thread_count = this->timed_thread_count_;\r\n            if (timed_thread_count)\r\n            {\r\n                thread_id_t cnt;\r\n                if (running_thread_count)\r\n                    cnt = timed_thread_count + 1;\r\n                else\r\n                    //!!! spurious thread will be never unblocked in such case - bad\r\n                    cnt = timed_thread_count;\r\n                thread_id_t idx = this->rand(cnt, sched_type_user);\r\n                if (idx < timed_thread_count)\r\n                {\r\n                    thread_info_t* thr = this->timed_threads_[idx];\r\n                    thread_index = thr->index_;\r\n                    //??? suboptimal state space exploration\r\n                    // if (1 != thr->block_count_) then we are making\r\n                    // superfluous rand()\r\n                    if (1 == thr->block_count_)\r\n                    {\r\n                        this->unpark_thread(thread_index);\r\n                        RL_VERIFY(thr->state_ == thread_state_running);\r\n                        reason = unpark_reason_timeout;\r\n                    }\r\n                }\r\n            }\r\n\r\n            RL_VERIFY(running_thread_count);\r\n\r\n            if (unpark_reason_normal == reason)\r\n            {\r\n                thread_id_t spurious_thread_count = this->spurious_thread_count_;\r\n                if (spurious_thread_count)\r\n                {\r\n                    thread_id_t cnt = spurious_thread_count + 1;\r\n                    thread_id_t idx = this->rand(cnt, sched_type_user);\r\n                    if (idx < spurious_thread_count)\r\n                    {\r\n                        thread_info_t* thr = this->spurious_threads_[idx];\r\n                        thread_index = thr->index_;\r\n                        //??? suboptimal state space exploration\r\n                        // if (1 != thr->block_count_) then we are making\r\n                        // superfluous rand()\r\n                        if (1 == thr->block_count_)\r\n                        {\r\n                            this->unpark_thread(thread_index);\r\n                            RL_VERIFY(thr->state_ == thread_state_running);\r\n                            reason = unpark_reason_spurious;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (unpark_reason_normal == reason)\r\n            {\r\n                if (1 != running_thread_count)\r\n                {\r\n                    unsigned const index = this->rand(running_thread_count, sched_type_sched);\r\n                    thread_index = this->running_threads[index];\r\n                }\r\n                else\r\n                {\r\n                    thread_index = this->running_threads[0];\r\n                }\r\n            }\r\n        }\r\n        else\r\n        {\r\n            RL_VERIFY(t.state_ == thread_state_running);\r\n            thread_index = t.index_;\r\n        }\r\n\r\n        if (t.index_ == thread_index)\r\n            return thread_index;\r\n\r\n        //t.subsequent_timed_waits_ = 0;\r\n        self().on_switch(t);\r\n\r\n        return thread_index;\r\n    }\r\n\r\n    void thread_finished_impl()\r\n    {\r\n    }\r\n\r\n    void purge_blocked_threads()\r\n    {\r\n        for (thread_id_t i = 0; i != thread_count; ++i)\r\n        {\r\n            on_thread_block(i, false);\r\n        }\r\n    }\r\n\r\n    unsigned rand_impl(unsigned limit, sched_type t)\r\n    {\r\n        unsigned result = 0;\r\n        size_t const size = stree_.size();\r\n        if (stree_depth_ == size)\r\n        {\r\n            stree_node n = {limit, 0, t};\r\n            stree_.push_back(n);\r\n        }\r\n        else\r\n        {\r\n            RL_VERIFY(size);\r\n            stree_node& n = stree_[stree_depth_];\r\n\r\n            // If you hit assert here, then probably your test is non-deterministic\r\n            // Check whether you are using functions like ::rand()\r\n            // or static variables or values of object addresses (for hashing) in your test\r\n            // Replace ::rand() with rl::rand(), eliminate static variables in the test\r\n            RL_VERIFY(n.type_ == t);\r\n\r\n            RL_VERIFY(n.count_ == limit);\r\n            RL_VERIFY(n.index_ < n.count_);\r\n            result = n.index_;\r\n        }\r\n        stree_depth_ += 1;\r\n        return result;\r\n    }\r\n\r\n    iteration_t iteration_count_impl()\r\n    {\r\n        double current = self().iteration_count_approx();\r\n        if (current <= this->iter_)\r\n            current = this->iter_ + 1.0;\r\n\r\n        iteration_count_mean_ *= iteration_count_probe_count_;\r\n        iteration_count_probe_count_ += 1;\r\n        iteration_count_mean_ /= iteration_count_probe_count_;\r\n        iteration_count_mean_ += current / iteration_count_probe_count_;\r\n\r\n        iteration_t result = (iteration_t)(iteration_count_mean_ + 0.5);\r\n        if (result <= this->iter_)\r\n            result = this->iter_ + 1;\r\n        return result;\r\n    }\r\n\r\n    void get_state_impl(std::ostream& ss)\r\n    {\r\n        ss << (unsigned)stree_.size() << \" \";\r\n        for (size_t i = 0; i != stree_.size(); ++i)\r\n        {\r\n            stree_node& n = stree_[i];\r\n            ss << n.count_ << \" \";\r\n            ss << n.index_ << \" \";\r\n            ss << static_cast<unsigned>(n.type_) << \" \";\r\n        }\r\n    }\r\n\r\n    void set_state_impl(std::istream& ss)\r\n    {\r\n        size_t size = 0;\r\n        ss >> size;\r\n        for (size_t i = 0; i != size; ++i)\r\n        {\r\n            stree_node n = {};\r\n            ss >> n.count_;\r\n            ss >> n.index_;\r\n            unsigned type = 0;\r\n            ss >> type;\r\n            n.type_ = static_cast<sched_type>(type);\r\n            stree_.push_back(n);\r\n        }\r\n    }\r\n\r\n    void on_thread_block(thread_id_t th, bool yield)\r\n    {\r\n        //!!! doubled in schedule_impl()\r\n        thread_info_t& t = this->threads_[th];\r\n        if (t.total_yield_priority_)\r\n        {\r\n            for (thread_id_t i = 0; i != thread_count; ++i)\r\n            {\r\n                if (t.yield_priority_[i])\r\n                {\r\n                    t.total_yield_priority_ -= t.yield_priority_[i];\r\n                    t.yield_priority_[i] = 0;\r\n                    this->unblock_thread(i);\r\n                }\r\n            }\r\n        }\r\n\r\n        (void)yield;\r\n        //if (yield)\r\n        //    yield_priority(1);\r\n    }\r\n\r\nprotected:\r\n    struct stree_node\r\n    {\r\n        unsigned    count_;\r\n        unsigned    index_;\r\n        sched_type  type_;\r\n        unsigned    pad_;\r\n    };\r\n\r\n    typedef typename vector<stree_node>::type stree_t;\r\n    stree_t         stree_;\r\n    size_t          stree_depth_;\r\n\r\nprivate:\r\n    double          iteration_count_mean_;\r\n    unsigned        iteration_count_probe_count_;\r\n\r\n    derived_t& self()\r\n    {\r\n        return *static_cast<derived_t*>(this);\r\n    }\r\n\r\n    RL_NOCOPY(tree_search_scheduler);\r\n};\r\n\r\n\r\n\r\n\r\ntemplate<thread_id_t thread_count>\r\nclass full_search_scheduler\r\n    : public tree_search_scheduler<full_search_scheduler<thread_count>\r\n        , tree_search_scheduler_thread_info<thread_count>, thread_count>\r\n{\r\npublic:\r\n    typedef tree_search_scheduler<full_search_scheduler<thread_count>\r\n        , tree_search_scheduler_thread_info<thread_count>, thread_count> base_t;\r\n    typedef typename base_t::thread_info_t thread_info_t;\r\n    typedef typename base_t::shared_context_t shared_context_t;\r\n\r\n    full_search_scheduler(test_params& params, shared_context_t& ctx, thread_id_t dynamic_thread_count)\r\n        : base_t(params, ctx, dynamic_thread_count)\r\n    {\r\n    }\r\n\r\n    bool can_switch(thread_info_t& /*t*/)\r\n    {\r\n        return true;\r\n    }\r\n\r\n    void on_switch(thread_info_t& /*t*/)\r\n    {\r\n    }\r\n\r\n    double iteration_count_approx()\r\n    {\r\n        double total = 1;\r\n        size_t const size = this->stree_.size();\r\n        for (size_t i = 0; i != size; ++i)\r\n        {\r\n            total *= this->stree_[i].count_;\r\n        }\r\n        return total;\r\n    }\r\n\r\n    RL_NOCOPY(full_search_scheduler);\r\n};\r\n\r\n\r\n}\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/history.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_HISTORY_HPP\r\n#define RL_HISTORY_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\n\r\ntypedef void (*event_output_f)(std::ostream& s, void const* ev);\r\ntypedef void (*event_dtor_f)(void* ev);\r\n\r\nstruct history_entry\r\n{\r\n    thread_id_t thread_index_;\r\n    debug_info info_;\r\n    void* ev_;\r\n    event_output_f output_;\r\n    event_dtor_f dtor_;\r\n\r\n    history_entry(thread_id_t thread_index, debug_info_param info, void* ev, event_output_f output, event_dtor_f dtor)\r\n        : thread_index_(thread_index)\r\n        , info_(info)\r\n        , ev_(ev)\r\n        , output_(output)\r\n        , dtor_(dtor)\r\n    {\r\n    }\r\n};\r\n\r\ntemplate<typename T>\r\nvoid event_output(std::ostream& s, void const* ev)\r\n{\r\n    static_cast<T const*>(ev)->output(s);\r\n}\r\n\r\ntemplate<typename T>\r\nvoid event_dtor(void* ev)\r\n{\r\n    delete static_cast<T*>(ev);\r\n}\r\n\r\n\r\nstruct user_event\r\n{\r\n    char const* desc_;\r\n\r\n    void output(std::ostream& s) const\r\n    {\r\n        s << desc_;\r\n    }\r\n};\r\n\r\ninline string strip_path(char const* filename)\r\n{\r\n    char const* slash = strrchr(filename, '\\\\');\r\n    if (slash)\r\n        return slash + 1;\r\n    else\r\n        return filename;\r\n}\r\n\r\ninline std::ostream& operator << (std::ostream& ss, debug_info_param info)\r\n{\r\n    /*\r\n    char const* func = info;\r\n    char const* file = info + strlen(info) + 1;\r\n    char const* line = file + strlen(file) + 1;\r\n    */\r\n\r\n#ifdef RL_MSVC_OUTPUT\r\n    ss << info.file_ << \"(\" << info.line_ << \") : \";\r\n#else\r\n    ss << info.func_ << \", \" << strip_path(info.file_) << \"(\" << info.line_ << \")\";\r\n#endif\r\n    return ss;\r\n}\r\n\r\n\r\n\r\nclass history_mgr : nocopy<>\r\n{\r\npublic:\r\n    history_mgr(std::ostream& stream, thread_id_t thread_count)\r\n        : thread_count_(thread_count)\r\n        , out_stream_(stream)\r\n    {\r\n    }\r\n\r\n    ~history_mgr()\r\n    {\r\n        clear();\r\n    }\r\n\r\n    template<typename event_t>\r\n    void exec_log(thread_id_t th, debug_info_param info, event_t const& ev, bool output_history)\r\n    {\r\n        exec_history_.push_back(history_entry(th, info, new event_t(ev), &event_output<event_t>, &event_dtor<event_t>));\r\n        if (output_history)\r\n        {\r\n            output(exec_history_.size() - 1);\r\n        }\r\n    }\r\n\r\n    void print_exec_history(bool output_history)\r\n    {\r\n        size_t const buf_size = 4096;\r\n        char buf [buf_size + 1];\r\n\r\n        size_t const count = exec_history_.size();\r\n        if (false == output_history)\r\n        {\r\n            sprintf(buf, \"execution history (%u):\\n\", (unsigned)count);\r\n            out_stream_ << buf;\r\n#if defined(_MSC_VER) && defined(RL_MSVC_OUTPUT)\r\n            OutputDebugStringA(buf);\r\n#endif\r\n\r\n            for (size_t i = 0; i != count; ++i)\r\n            {\r\n                output(i);\r\n            }\r\n        }\r\n        out_stream_ << \"\\n\";\r\n#if defined(_MSC_VER) && defined(RL_MSVC_OUTPUT)\r\n        OutputDebugStringA(\"\\n\");\r\n#endif\r\n\r\n        for (thread_id_t th = 0; th != thread_count_; ++th)\r\n        {\r\n            sprintf(buf, \"thread %u:\\n\", th);\r\n            out_stream_ << buf;\r\n#if defined(_MSC_VER) && defined(RL_MSVC_OUTPUT)\r\n            OutputDebugStringA(buf);\r\n#endif\r\n            for (size_t i = 0; i != count; ++i)\r\n            {\r\n                if (exec_history_[i].thread_index_ == th)\r\n                {\r\n                    output(i);\r\n                }\r\n            }\r\n            out_stream_ << \"\\n\";\r\n#if defined(_MSC_VER) && defined(RL_MSVC_OUTPUT)\r\n            OutputDebugStringA(\"\\n\");\r\n#endif\r\n        }\r\n    }\r\n\r\n    void clear()\r\n    {\r\n        for (size_t i = 0; i != exec_history_.size(); ++i)\r\n        {\r\n            history_entry const& ent = exec_history_[i];\r\n            ent.dtor_(ent.ev_);\r\n        }\r\n        exec_history_.clear();\r\n    }\r\n\r\nprivate:\r\n    vector<history_entry>::type exec_history_;\r\n    thread_id_t                 thread_count_;\r\n    std::ostream&               out_stream_;\r\n\r\n    void output(size_t i)\r\n    {\r\n        std::basic_ostringstream<char, std::char_traits<char>, raw_allocator<char> > stream;\r\n\r\n        history_entry const& ent = exec_history_[i];\r\n#ifdef RL_MSVC_OUTPUT\r\n        {\r\n            stream << ent.info_ << \"[\" << i << \"] \" << ent.thread_index_ << \": \";\r\n            ent.output_(stream, ent.ev_);\r\n            stream << std::endl;\r\n        }\r\n#else\r\n        stream << \"[\" << (unsigned)i << \"] \" << ent.thread_index_ << \": \";\r\n        ent.output_(stream, ent.ev_);\r\n        stream << \", in \" << ent.info_ << std::endl;\r\n#endif\r\n\r\n        out_stream_ << stream.str();\r\n#if defined(_MSC_VER) && defined(RL_MSVC_OUTPUT)\r\n        OutputDebugStringA(stream.str().c_str());\r\n#endif\r\n    }\r\n};\r\n\r\n\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/java.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_JAVA_HPP\r\n#define RL_JAVA_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\n/*\r\n\r\nHierarchy For Package java.util.concurrent.locks \r\n\r\nClass Hierarchy\r\n\r\n    * java.lang.Object\r\n          o java.util.concurrent.locks.AbstractQueuedSynchronizer (implements java.io.Serializable)\r\n          o java.util.concurrent.locks.AbstractQueuedSynchronizer.ConditionObject (implements java.util.concurrent.locks.Condition, java.io.Serializable)\r\n          o java.util.concurrent.locks.LockSupport\r\n          o java.util.concurrent.locks.ReentrantLock (implements java.util.concurrent.locks.Lock, java.io.Serializable)\r\n          o java.util.concurrent.locks.ReentrantReadWriteLock (implements java.util.concurrent.locks.ReadWriteLock, java.io.Serializable)\r\n          o java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock (implements java.util.concurrent.locks.Lock, java.io.Serializable)\r\n          o java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock (implements java.util.concurrent.locks.Lock, java.io.Serializable) \r\n\r\nInterface Hierarchy\r\n\r\n    * java.util.concurrent.locks.Condition\r\n    * java.util.concurrent.locks.Lock\r\n    * java.util.concurrent.locks.ReadWriteLock\r\n*/\r\n\r\n\r\n\r\n\r\n\r\n/*\r\n\r\njava.util.concurrent.Semaphore\r\n\r\n\r\n\r\nPublic Constructors\r\npublic Semaphore(int permits)\r\nCreates a Semaphore with the given number of permits and nonfair fairness setting.\r\nParameters\r\npermits     the initial number of permits available. This value may be negative, in which case releases must occur before any acquires will be granted.\r\npublic Semaphore(int permits, boolean fair)\r\nCreates a Semaphore with the given number of permits and the given fairness setting.\r\nParameters\r\npermits     the initial number of permits available. This value may be negative, in which case releases must occur before any acquires will be granted.\r\nfair     true if this semaphore will guarantee first-in first-out granting of permits under contention, else false.\r\nPublic Methods\r\npublic void acquire()\r\nAcquires a permit from this semaphore, blocking until one is available, or the thread is interrupted.\r\n\r\nAcquires a permit, if one is available and returns immediately, reducing the number of available permits by one.\r\n\r\nIf no permit is available then the current thread becomes disabled for thread scheduling purposes and lies dormant until one of two things happens:\r\n\r\n    * Some other thread invokes the release() method for this semaphore and the current thread is next to be assigned a permit; or\r\n    * Some other thread interrupts the current thread. \r\n\r\nIf the current thread:\r\n\r\n    * has its interrupted status set on entry to this method; or\r\n    * is interrupted while waiting for a permit, \r\n\r\nthen InterruptedException is thrown and the current thread's interrupted status is cleared.\r\nThrows\r\nInterruptedException     if the current thread is interrupted\r\nSee Also\r\n\r\n    * interrupt()\r\n\r\npublic void acquire(int permits)\r\nAcquires the given number of permits from this semaphore, blocking until all are available, or the thread is interrupted.\r\n\r\nAcquires the given number of permits, if they are available, and returns immediately, reducing the number of available permits by the given amount.\r\n\r\nIf insufficient permits are available then the current thread becomes disabled for thread scheduling purposes and lies dormant until one of two things happens:\r\n\r\n    * Some other thread invokes one of the release methods for this semaphore, the current thread is next to be assigned permits and the number of available permits satisfies this request; or\r\n    * Some other thread interrupts the current thread. \r\n\r\nIf the current thread:\r\n\r\n    * has its interrupted status set on entry to this method; or\r\n    * is interrupted while waiting for a permit, \r\n\r\nthen InterruptedException is thrown and the current thread's interrupted status is cleared. Any permits that were to be assigned to this thread are instead assigned to the next waiting thread(s), as if they had been made available by a call to release().\r\nParameters\r\npermits     the number of permits to acquire\r\nThrows\r\nInterruptedException     if the current thread is interrupted\r\nIllegalArgumentException     if permits less than zero.\r\nSee Also\r\n\r\n    * interrupt()\r\n\r\npublic void acquireUninterruptibly(int permits)\r\nAcquires the given number of permits from this semaphore, blocking until all are available.\r\n\r\nAcquires the given number of permits, if they are available, and returns immediately, reducing the number of available permits by the given amount.\r\n\r\nIf insufficient permits are available then the current thread becomes disabled for thread scheduling purposes and lies dormant until some other thread invokes one of the release methods for this semaphore, the current thread is next to be assigned permits and the number of available permits satisfies this request.\r\n\r\nIf the current thread is interrupted while waiting for permits then it will continue to wait and its position in the queue is not affected. When the thread does return from this method its interrupt status will be set.\r\nParameters\r\npermits     the number of permits to acquire\r\nThrows\r\nIllegalArgumentException     if permits less than zero.\r\npublic void acquireUninterruptibly()\r\nAcquires a permit from this semaphore, blocking until one is available.\r\n\r\nAcquires a permit, if one is available and returns immediately, reducing the number of available permits by one.\r\n\r\nIf no permit is available then the current thread becomes disabled for thread scheduling purposes and lies dormant until some other thread invokes the release() method for this semaphore and the current thread is next to be assigned a permit.\r\n\r\nIf the current thread is interrupted while waiting for a permit then it will continue to wait, but the time at which the thread is assigned a permit may change compared to the time it would have received the permit had no interruption occurred. When the thread does return from this method its interrupt status will be set.\r\npublic int availablePermits()\r\nReturns the current number of permits available in this semaphore.\r\n\r\nThis method is typically used for debugging and testing purposes.\r\nReturns\r\n\r\n    * the number of permits available in this semaphore. \r\n\r\npublic int drainPermits()\r\nAcquire and return all permits that are immediately available.\r\nReturns\r\n\r\n    * the number of permits \r\n\r\npublic final int getQueueLength()\r\nReturns an estimate of the number of threads waiting to acquire. The value is only an estimate because the number of threads may change dynamically while this method traverses internal data structures. This method is designed for use in monitoring of the system state, not for synchronization control.\r\nReturns\r\n\r\n    * the estimated number of threads waiting for this lock \r\n\r\npublic final boolean hasQueuedThreads()\r\nQueries whether any threads are waiting to acquire. Note that because cancellations may occur at any time, a true return does not guarantee that any other thread will ever acquire. This method is designed primarily for use in monitoring of the system state.\r\nReturns\r\n\r\n    * true if there may be other threads waiting to acquire the lock. \r\n\r\npublic boolean isFair()\r\nReturns true if this semaphore has fairness set true.\r\nReturns\r\n\r\n    * true if this semaphore has fairness set true. \r\n\r\npublic void release(int permits)\r\nReleases the given number of permits, returning them to the semaphore.\r\n\r\nReleases the given number of permits, increasing the number of available permits by that amount. If any threads are blocking trying to acquire permits, then the one that has been waiting the longest is selected and given the permits that were just released. If the number of available permits satisfies that thread's request then that thread is re-enabled for thread scheduling purposes; otherwise the thread continues to wait. If there are still permits available after the first thread's request has been satisfied, then those permits are assigned to the next waiting thread. If it is satisfied then it is re-enabled for thread scheduling purposes. This continues until there are insufficient permits to satisfy the next waiting thread, or there are no more waiting threads.\r\n\r\nThere is no requirement that a thread that releases a permit must have acquired that permit by calling acquire. Correct usage of a semaphore is established by programming convention in the application.\r\nParameters\r\npermits     the number of permits to release\r\nThrows\r\nIllegalArgumentException     if permits less than zero.\r\npublic void release()\r\nReleases a permit, returning it to the semaphore.\r\n\r\nReleases a permit, increasing the number of available permits by one. If any threads are blocking trying to acquire a permit, then one is selected and given the permit that was just released. That thread is re-enabled for thread scheduling purposes.\r\n\r\nThere is no requirement that a thread that releases a permit must have acquired that permit by calling acquire(). Correct usage of a semaphore is established by programming convention in the application.\r\npublic String toString()\r\nReturns a string identifying this semaphore, as well as its state. The state, in brackets, includes the String \"Permits =\" followed by the number of permits.\r\nReturns\r\n\r\n    * a string identifying this semaphore, as well as its state \r\n\r\npublic boolean tryAcquire(long timeout, TimeUnit unit)\r\nAcquires a permit from this semaphore, if one becomes available within the given waiting time and the current thread has not been interrupted.\r\n\r\nAcquires a permit, if one is available and returns immediately, with the value true, reducing the number of available permits by one.\r\n\r\nIf no permit is available then the current thread becomes disabled for thread scheduling purposes and lies dormant until one of three things happens:\r\n\r\n    * Some other thread invokes the release() method for this semaphore and the current thread is next to be assigned a permit; or\r\n    * Some other thread interrupts the current thread; or\r\n    * The specified waiting time elapses. \r\n\r\nIf a permit is acquired then the value true is returned.\r\n\r\nIf the current thread:\r\n\r\n    * has its interrupted status set on entry to this method; or\r\n    * is interrupted while waiting to acquire a permit, \r\n\r\nthen InterruptedException is thrown and the current thread's interrupted status is cleared.\r\n\r\nIf the specified waiting time elapses then the value false is returned. If the time is less than or equal to zero, the method will not wait at all.\r\nParameters\r\ntimeout     the maximum time to wait for a permit\r\nunit     the time unit of the timeout argument.\r\nReturns\r\n\r\n    * true if a permit was acquired and false if the waiting time elapsed before a permit was acquired.\r\n\r\nThrows\r\nInterruptedException     if the current thread is interrupted\r\nSee Also\r\n\r\n    * interrupt()\r\n\r\npublic boolean tryAcquire(int permits, long timeout, TimeUnit unit)\r\nAcquires the given number of permits from this semaphore, if all become available within the given waiting time and the current thread has not been interrupted.\r\n\r\nAcquires the given number of permits, if they are available and returns immediately, with the value true, reducing the number of available permits by the given amount.\r\n\r\nIf insufficient permits are available then the current thread becomes disabled for thread scheduling purposes and lies dormant until one of three things happens:\r\n\r\n    * Some other thread invokes one of the release methods for this semaphore, the current thread is next to be assigned permits and the number of available permits satisfies this request; or\r\n    * Some other thread interrupts the current thread; or\r\n    * The specified waiting time elapses. \r\n\r\nIf the permits are acquired then the value true is returned.\r\n\r\nIf the current thread:\r\n\r\n    * has its interrupted status set on entry to this method; or\r\n    * is interrupted while waiting to acquire the permits, \r\n\r\nthen InterruptedException is thrown and the current thread's interrupted status is cleared. Any permits that were to be assigned to this thread, are instead assigned to the next waiting thread(s), as if they had been made available by a call to release().\r\n\r\nIf the specified waiting time elapses then the value false is returned. If the time is less than or equal to zero, the method will not wait at all. Any permits that were to be assigned to this thread, are instead assigned to the next waiting thread(s), as if they had been made available by a call to release().\r\nParameters\r\npermits     the number of permits to acquire\r\ntimeout     the maximum time to wait for the permits\r\nunit     the time unit of the timeout argument.\r\nReturns\r\n\r\n    * true if all permits were acquired and false if the waiting time elapsed before all permits were acquired.\r\n\r\nThrows\r\nInterruptedException     if the current thread is interrupted\r\nIllegalArgumentException     if permits less than zero.\r\nSee Also\r\n\r\n    * interrupt()\r\n\r\npublic boolean tryAcquire(int permits)\r\nAcquires the given number of permits from this semaphore, only if all are available at the time of invocation.\r\n\r\nAcquires the given number of permits, if they are available, and returns immediately, with the value true, reducing the number of available permits by the given amount.\r\n\r\nIf insufficient permits are available then this method will return immediately with the value false and the number of available permits is unchanged.\r\n\r\nEven when this semaphore has been set to use a fair ordering policy, a call to tryAcquire will immediately acquire a permit if one is available, whether or not other threads are currently waiting. This \"barging\" behavior can be useful in certain circumstances, even though it breaks fairness. If you want to honor the fairness setting, then use tryAcquire(permits, 0, TimeUnit.SECONDS) which is almost equivalent (it also detects interruption).\r\nParameters\r\npermits     the number of permits to acquire\r\nReturns\r\n\r\n    * true if the permits were acquired and false otherwise.\r\n\r\nThrows\r\nIllegalArgumentException     if permits less than zero.\r\npublic boolean tryAcquire()\r\nAcquires a permit from this semaphore, only if one is available at the time of invocation.\r\n\r\nAcquires a permit, if one is available and returns immediately, with the value true, reducing the number of available permits by one.\r\n\r\nIf no permit is available then this method will return immediately with the value false.\r\n\r\nEven when this semaphore has been set to use a fair ordering policy, a call to tryAcquire() will immediately acquire a permit if one is available, whether or not other threads are currently waiting. This \"barging\" behavior can be useful in certain circumstances, even though it breaks fairness. If you want to honor the fairness setting, then use tryAcquire(0, TimeUnit.SECONDS) which is almost equivalent (it also detects interruption).\r\nReturns\r\n\r\n    * true if a permit was acquired and false otherwise. \r\n\r\nProtected Methods\r\nprotected Collection<Thread> getQueuedThreads()\r\nReturns a collection containing threads that may be waiting to acquire. Because the actual set of threads may change dynamically while constructing this result, the returned collection is only a best-effort estimate. The elements of the returned collection are in no particular order. This method is designed to facilitate construction of subclasses that provide more extensive monitoring facilities.\r\nReturns\r\n\r\n    * the collection of threads \r\n\r\nprotected void reducePermits(int reduction)\r\nShrinks the number of available permits by the indicated reduction. This method can be useful in subclasses that use semaphores to track resources that become unavailable. This method differs from acquire in that it does not block waiting for permits to become available.\r\nParameters\r\nreduction     the number of permits to remove\r\nThrows\r\nIllegalArgumentException     if reduction is negative \r\n*/\r\n\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/java_atomic.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_JAVA_ATOMIC_HPP\r\n#define RL_JAVA_ATOMIC_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n#include \"atomic.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\n\r\ntemplate<typename T> class jatomic;\r\n\r\n\r\ntemplate<typename T>\r\nclass jatomic_proxy\r\n{\r\npublic:\r\n    T get() const\r\n    {\r\n        return var_.load(mo_seq_cst, info_);\r\n    }\r\n\r\n    void set(T value)\r\n    {\r\n        var_.store(value, mo_seq_cst, info_);\r\n    }\r\n\r\n    T addAndGet(T delta)\r\n    {\r\n        return getAndAdd(delta) + delta;\r\n    }\r\n\r\n    bool compareAndSet(T expect, T update)\r\n    {\r\n        bool result = var_.compare_exchange(bool_t<false>(), expect, update, mo_seq_cst, info_);\r\n        return result;\r\n    }\r\n\r\n    bool weakCompareAndSet(T expect, T update)\r\n    {\r\n        bool result = var_.compare_exchange(bool_t<true>(), expect, update, mo_seq_cst, info_);\r\n        return result;\r\n    }\r\n\r\n    T decrementAndGet()\r\n    {\r\n        return getAndAdd(-1) - 1;\r\n    }\r\n\r\n    T getAndAdd(T delta)\r\n    {\r\n        T result = var_.rmw(rmw_type_t<rmw_type_add>(), delta, mo_seq_cst, info_);\r\n        return result;\r\n    }\r\n\r\n    T getAndDecrement()\r\n    {\r\n        return getAndAdd(-1);\r\n    }\r\n\r\n    T getAndIncrement()\r\n    {\r\n        return getAndAdd(+1);\r\n    }\r\n\r\n    T getAndSet(T newValue)\r\n    {\r\n        T result = var_.rmw(rmw_type_t<rmw_type_swap>(), newValue, mo_seq_cst, info_);\r\n        return result;\r\n    }\r\n\r\n    T incrementAndGet()\r\n    {\r\n        return getAndAdd(1) + 1;\r\n    }\r\n\r\nprivate:\r\n    jatomic<T>& var_;\r\n    debug_info info_;\r\n\r\n    //typedef typename atomic_add_type<T>::type add_type;\r\n    template<typename Y> friend class jatomic;\r\n\r\n    jatomic_proxy(jatomic<T>& var, debug_info_param info)\r\n        : var_(var)\r\n        , info_(info)\r\n    {\r\n    }\r\n\r\n    jatomic_proxy& operator = (jatomic_proxy const&);\r\n};\r\n\r\n\r\ntemplate<typename T>\r\nclass jatomic : generic_atomic<T, true>\r\n{\r\npublic:\r\n    typedef jatomic_proxy<T> proxy_t;\r\n    friend class jatomic_proxy<T>;\r\n\r\n    jatomic()\r\n    {\r\n    }\r\n\r\n    jatomic(T value)\r\n    {\r\n        //??? whether here must be mo_relaxed or mo_release?\r\n        this->store(value, mo_seq_cst, $);\r\n    }\r\n\r\n    jatomic(jatomic const& r)\r\n    {\r\n        T const value = r.load(mo_seq_cst, $);\r\n        //??? whether here must be mo_relaxed or mo_release?\r\n        this->store(value, mo_seq_cst, $);\r\n    }\r\n\r\n    jatomic(proxy_t const& r)\r\n    {\r\n        T const value = r.var_.load(mo_seq_cst, r.info_);\r\n        //??? whether here must be mo_relaxed or mo_release?\r\n        this->store(value, mo_seq_cst, r.info_);\r\n    }\r\n\r\n    proxy_t operator () (debug_info_param info)\r\n    {\r\n        return proxy_t(*this, info);\r\n    }\r\n};\r\n\r\n\r\ntypedef jatomic<int> AtomicInteger;\r\ntypedef jatomic<long> AtomicLong;\r\n\r\n\r\n\r\n\r\n\r\n\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/java_var.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_JAVA_VAR_HPP\r\n#define RL_JAVA_VAR_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n#include \"atomic.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\ntemplate<typename T> class jvar;\r\n\r\n\r\ntemplate<typename T>\r\nclass jvar_proxy\r\n{\r\npublic:\r\n    typedef typename atomic_add_type<T>::type add_type;\r\n    template<typename Y> friend class jvar;\r\n\r\n    operator T () const\r\n    {\r\n        return load();\r\n    }\r\n\r\n    T operator = (T value)\r\n    {\r\n        store(value);\r\n        return value;\r\n    }\r\n\r\n    T operator = (jvar_proxy const& r)\r\n    {\r\n        T const value = r.load();\r\n        store(value);\r\n        return *this;\r\n    }\r\n\r\n    T operator ++ (int)\r\n    {\r\n        T tmp = load();\r\n        store(tmp + 1);\r\n        return tmp;\r\n    }\r\n\r\n    T operator -- (int)\r\n    {\r\n        T tmp = load();\r\n        store(tmp - 1);\r\n        return tmp;\r\n    }\r\n\r\n    T operator ++ ()\r\n    {\r\n        T tmp = load();\r\n        store(tmp + 1);\r\n        return tmp + 1;\r\n    }\r\n\r\n    T operator -- ()\r\n    {\r\n        T tmp = load();\r\n        store(tmp - 1);\r\n        return tmp - 1;\r\n    }\r\n\r\n    T operator += (add_type value)\r\n    {\r\n        T tmp = load();\r\n        store(tmp + value);\r\n        return tmp + value;\r\n    }\r\n\r\n    T operator -= (add_type value)\r\n    {\r\n        T tmp = load();\r\n        store(tmp - value);\r\n        return tmp - value;\r\n    }\r\n\r\nprivate:\r\n    jvar<T>& var_;\r\n    debug_info info_;\r\n\r\n    jvar_proxy(jvar<T>& var, debug_info_param info)\r\n        : var_(var)\r\n        , info_(info)\r\n    {\r\n    }\r\n\r\n    T load() const\r\n    {\r\n        return var_.load(mo_relaxed, info_);\r\n    }\r\n\r\n    void store(T value)\r\n    {\r\n        var_.store(value, mo_relaxed, info_);\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\ntemplate<typename T>\r\nclass jvar : generic_atomic<T, true>\r\n{\r\npublic:\r\n    typedef jvar_proxy<T> proxy_t;\r\n    friend class jvar_proxy<T>;\r\n\r\n    jvar()\r\n    {\r\n    }\r\n\r\n    jvar(T value)\r\n    {\r\n        this->store(value, mo_relaxed, $);\r\n    }\r\n\r\n    jvar(jvar const& r)\r\n    {\r\n        T const value = r.load(mo_relaxed, $);\r\n        this->store(value, mo_relaxed, $);\r\n    }\r\n\r\n    jvar(proxy_t const& r)\r\n    {\r\n        T const value = r.load();\r\n        this->store(value, mo_relaxed, r.info_);\r\n    }\r\n\r\n    proxy_t operator () (debug_info_param info)\r\n    {\r\n        return proxy_t(*this, info);\r\n    }\r\n\r\nprivate:\r\n    jvar& operator = (jvar const&);\r\n};\r\n\r\n\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/java_volatile.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_JAVA_VOLATILE_HPP\r\n#define RL_JAVA_VOLATILE_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n#include \"atomic.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\ntemplate<typename T> class jvolatile;\r\n\r\n\r\ntemplate<typename T>\r\nclass jvolatile_proxy\r\n{\r\npublic:\r\n    typedef typename atomic_add_type<T>::type add_type;\r\n    template<typename Y> friend class jvolatile;\r\n\r\n    operator T () const\r\n    {\r\n        return load();\r\n    }\r\n\r\n    T operator = (T value)\r\n    {\r\n        store(value);\r\n        return value;\r\n    }\r\n\r\n    T operator = (jvolatile_proxy const& r)\r\n    {\r\n        T const value = r.load();\r\n        store(value);\r\n        return *this;\r\n    }\r\n\r\n    T operator ++ (int)\r\n    {\r\n        T tmp = load();\r\n        store(tmp + 1);\r\n        return tmp;\r\n    }\r\n\r\n    T operator -- (int)\r\n    {\r\n        T tmp = load();\r\n        store(tmp - 1);\r\n        return tmp;\r\n    }\r\n\r\n    T operator ++ ()\r\n    {\r\n        T tmp = load();\r\n        store(tmp + 1);\r\n        return tmp + 1;\r\n    }\r\n\r\n    T operator -- ()\r\n    {\r\n        T tmp = load();\r\n        store(tmp - 1);\r\n        return tmp - 1;\r\n    }\r\n\r\n    T operator += (add_type value)\r\n    {\r\n        T tmp = load();\r\n        store(tmp + value);\r\n        return tmp + value;\r\n    }\r\n\r\n    T operator -= (add_type value)\r\n    {\r\n        T tmp = load();\r\n        store(tmp - value);\r\n        return tmp - value;\r\n    }\r\n\r\nprivate:\r\n    jvolatile<T>& var_;\r\n    debug_info info_;\r\n\r\n    jvolatile_proxy(jvolatile<T>& var, debug_info_param info)\r\n        : var_(var)\r\n        , info_(info)\r\n    {\r\n    }\r\n\r\n    T load() const\r\n    {\r\n        return var_.load(mo_seq_cst, info_);\r\n    }\r\n\r\n    void store(T value)\r\n    {\r\n        var_.store(value, mo_seq_cst, info_);\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\ntemplate<typename T>\r\nclass jvolatile : generic_atomic<T, true>\r\n{\r\npublic:\r\n    typedef jvolatile_proxy<T> proxy_t;\r\n    friend class jvolatile_proxy<T>;\r\n\r\n    jvolatile()\r\n    {\r\n    }\r\n\r\n    explicit jvolatile(T value)\r\n    {\r\n        //??? whether here must be mo_relaxed or mo_release?\r\n        this->store(value, mo_seq_cst, $);\r\n    }\r\n\r\n    jvolatile(jvolatile const& r)\r\n    {\r\n        T const value = r.load(mo_seq_cst, $);\r\n        //??? whether here must be mo_relaxed or mo_release?\r\n        this->store(value, mo_seq_cst, $);\r\n    }\r\n\r\n    jvolatile(proxy_t const& r)\r\n    {\r\n        T const value = r.var_.load(mo_seq_cst, r.info_);\r\n        //??? whether here must be mo_relaxed or mo_release?\r\n        this->store(value, mo_seq_cst, r.info_);\r\n    }\r\n\r\n    proxy_t operator () (debug_info_param info)\r\n    {\r\n        return proxy_t(*this, info);\r\n    }\r\n};\r\n\r\n\r\n\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/memory.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_MEMORY_HPP\r\n#define RL_MEMORY_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\n\r\nclass memory_mgr : nocopy<>\r\n{\r\npublic:\r\n    memory_mgr()\r\n    {\r\n        memset(deferred_free_, 0, sizeof(deferred_free_));\r\n        memset(deferred_free_size_, 0, sizeof(deferred_free_size_));\r\n        deferred_index_ = 0;\r\n    }\r\n\r\n    ~memory_mgr()\r\n    {\r\n        /*\r\n        while (allocs_.size())\r\n        {\r\n            size_t* p = (size_t*)(allocs_.begin()->first);\r\n            free(p - 1, false);\r\n            allocs_.erase(allocs_.begin());\r\n        }\r\n        */\r\n    }\r\n\r\n#ifndef RL_GC\r\n    void* alloc(size_t size)\r\n#else\r\n    void* alloc(size_t size, void (*dtor)(void*))\r\n#endif\r\n    {\r\n        void* pp = 0;\r\n        for (size_t i = 0; i != alloc_cache_.size(); ++i)\r\n        {\r\n            if (alloc_cache_[i].first == size)\r\n            {\r\n                if (alloc_cache_[i].second.size())\r\n                {\r\n                    pp = alloc_cache_[i].second.top();\r\n                    alloc_cache_[i].second.pop();\r\n                }\r\n                break;\r\n            }\r\n        }\r\n        if (0 == pp)\r\n            pp = (::malloc)(size + alignment);\r\n\r\n        if (pp)\r\n        {\r\n            RL_VERIFY(alignment >= sizeof(void*));\r\n            *(size_t*)pp = size;\r\n            void* p = (char*)pp + alignment;\r\n#ifndef RL_GC\r\n            allocs_.insert(std::make_pair(p, size));\r\n#else\r\n            alloc_desc_t desc = {p, size, dtor};\r\n            gc_allocs_.push_back(desc);\r\n#endif\r\n            return p;\r\n        }\r\n        else\r\n        {\r\n            throw std::bad_alloc();\r\n        }\r\n    }\r\n\r\n    bool free(void* pp, bool defer)\r\n    {\r\n        if (0 == pp)\r\n            return true;\r\n\r\n#ifndef RL_GC\r\n        map<void*, size_t>::type::iterator iter = allocs_.find(pp);\r\n        if (allocs_.end() == iter)\r\n            return false;\r\n\r\n        allocs_.erase(iter);\r\n\r\n        void* p = (char*)pp - alignment;\r\n        size_t size = *(size_t*)p;\r\n\r\n        if (defer)\r\n        {\r\n            deferred_free_[deferred_index_ % deferred_count] = p;\r\n            deferred_free_size_[deferred_index_ % deferred_count] = size;\r\n            deferred_index_ += 1;\r\n            p = deferred_free_[deferred_index_ % deferred_count];\r\n            size = deferred_free_size_[deferred_index_ % deferred_count];\r\n            if (p)\r\n                rl_free_impl(p, size);\r\n        }\r\n        else\r\n        {\r\n            rl_free_impl(p, size);\r\n        }\r\n        return true;\r\n#else\r\n        (void)defer;\r\n        for (size_t i = 0; i != gc_allocs_.size(); ++i)\r\n        {\r\n            alloc_desc_t const& desc = gc_allocs_[i];\r\n            if (desc.addr == pp)\r\n            {\r\n                void* p = (char*)desc.addr - alignment;\r\n                rl_free_impl(p, desc.size);\r\n                gc_allocs_.erase(gc_allocs_.begin() + i);\r\n                return true;\r\n            }\r\n        }\r\n        return false;\r\n#endif\r\n    }\r\n\r\n    bool iteration_end()\r\n    {\r\n#ifndef RL_GC\r\n        return allocs_.empty();\r\n#else\r\n        for (size_t i = 0; i != gc_allocs_.size(); ++i)\r\n        {\r\n            alloc_desc_t const& desc = gc_allocs_[i];\r\n            if (desc.dtor)\r\n                desc.dtor(desc.addr);\r\n            void* p = (char*)desc.addr - alignment;\r\n            rl_free_impl(p, desc.size);\r\n        }\r\n        gc_allocs_.clear();\r\n        return true;\r\n#endif\r\n    }\r\n\r\n#ifndef RL_GC\r\n    void output_allocs(std::ostream& stream)\r\n    {\r\n        stream << \"memory allocations:\" << std::endl;\r\n        map<void*, size_t>::type::iterator iter = allocs_.begin();\r\n        map<void*, size_t>::type::iterator end = allocs_.end();\r\n        for (; iter != end; ++iter)\r\n        {\r\n            stream << iter->first << \" [\" << (unsigned)iter->second << \"]\" << std::endl;\r\n        }\r\n        stream << std::endl;\r\n    }\r\n#endif\r\n\r\nprivate:\r\n    typedef stack<void*>::type              freelist_t;\r\n    typedef std::pair<size_t, freelist_t>   alloc_entry_t;\r\n    typedef vector<alloc_entry_t>::type     alloc_t;\r\n\r\n    static size_t const deferred_count      = 64;\r\n\r\n    alloc_t alloc_cache_;\r\n    size_t deferred_index_;\r\n    void* deferred_free_ [deferred_count];\r\n    size_t deferred_free_size_ [deferred_count];\r\n\r\n#ifndef RL_GC\r\n    map<void*, size_t>::type allocs_;\r\n#else\r\n    struct alloc_desc_t\r\n    {\r\n        void*       addr;\r\n        size_t      size;\r\n        void        (*dtor)(void*);\r\n    };\r\n    vector<alloc_desc_t>::type gc_allocs_;\r\n#endif\r\n\r\n    void rl_free_impl(void* p, size_t size)\r\n    {\r\n        bool found = false;\r\n        for (size_t i = 0; i != alloc_cache_.size(); ++i)\r\n        {\r\n            if (alloc_cache_[i].first == size)\r\n            {\r\n                found = true;\r\n                alloc_cache_[i].second.push(p);\r\n                break;\r\n            }\r\n        }\r\n        if (!found)\r\n        {\r\n            alloc_cache_.push_back(std::make_pair(size, freelist_t()));\r\n            alloc_cache_.back().second.push(p);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct memory_alloc_event\r\n{\r\n    void*                       addr_;\r\n    size_t                      size_;\r\n    bool                        is_array_;\r\n\r\n    void output(std::ostream& s) const\r\n    {\r\n        s << \"memory allocation: addr=\" << std::hex << (void*)((char*)addr_ + (is_array_ ? alignment : 0)) << std::dec\r\n            << \", size=\" << (unsigned)size_;\r\n    }\r\n};\r\n\r\n\r\nstruct memory_free_event\r\n{\r\n    void*                       addr_;\r\n    bool                        is_array_;\r\n\r\n    void output(std::ostream& s) const\r\n    {\r\n        s << \"memory deallocation: addr=\" << std::hex << (void*)((char*)addr_ + (is_array_ ? alignment : 0)) << std::dec;\r\n    }\r\n};\r\n\r\n\r\n\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/memory_order.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_MEMORY_ORDER_HPP\r\n#define RL_MEMORY_ORDER_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\n\r\nenum memory_order\r\n{\r\n    mo_relaxed,\r\n    mo_consume,\r\n    mo_acquire,\r\n    mo_release,\r\n    mo_acq_rel,\r\n    mo_seq_cst,\r\n};\r\n\r\n\r\n\r\n\r\ninline char const* format(memory_order mo)\r\n{\r\n    switch (mo)\r\n    {\r\n    case mo_relaxed: return \"relaxed\";\r\n    case mo_consume: return \"consume\";\r\n    case mo_acquire: return \"acquire\";\r\n    case mo_release: return \"release\";\r\n    case mo_acq_rel: return \"acq_rel\";\r\n    case mo_seq_cst: return \"seq_cst\";\r\n    }\r\n    RL_VERIFY(!\"invalid value of memory order\");\r\n    throw std::logic_error(\"invalid value of memory order\");\r\n}\r\n\r\n\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/pch.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_PCH_HPP\r\n#define RL_PCH_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#ifndef _CRT_SECURE_NO_WARNINGS\r\n#   define _CRT_SECURE_NO_WARNINGS 1\r\n#endif\r\n\r\n#ifdef _FORTIFY_SOURCE\r\n#    undef _FORTIFY_SOURCE\r\n#endif\r\n\r\n#ifndef _XOPEN_SOURCE\r\n#    define _XOPEN_SOURCE\r\n#endif\r\n\r\n#include <stdlib.h>\r\n#include <stdio.h>\r\n#include <stddef.h>\r\n#include <limits.h>\r\n#include <memory.h>\r\n#include <string.h>\r\n\r\n#include <typeinfo>\r\n#include <iostream>\r\n#include <sstream>\r\n#include <algorithm>\r\n#include <stdexcept>\r\n#include <utility>\r\n#include <iterator>\r\n#include <memory>\r\n#include <vector>\r\n#include <queue>\r\n#include <string>\r\n#include <stack>\r\n#include <set>\r\n#include <map>\r\n#include <new>\r\n\r\n#if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64)\r\n#   define RL_WIN\r\n#endif\r\n\r\n#if defined(RL_WIN) || defined(_CYGWIN)\r\n#   ifndef _WIN32_WINNT\r\n#       define _WIN32_WINNT 0x0500\r\n#   endif\r\n#   define WIN32_LEAN_AND_MEAN\r\n#   include <windows.h>\r\n#   include <process.h>\r\n#   ifdef RL_WIN\r\n#       include <intrin.h>\r\n#   else\r\n#       include <stdint.h>\r\n#       include <sys/times.h>\r\n#   endif\r\n#else\r\n#   include <stdint.h>\r\n#   include <sys/times.h>\r\n#   include <unistd.h>\r\n#   include <ucontext.h>\r\n#   include <setjmp.h>\r\n#endif\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/platform.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_PLATFORM_HPP\r\n#define RL_PLATFORM_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"pch.hpp\"\r\n\r\n\r\n#if defined(RL_WIN) || defined(_CYGWIN)\r\n\r\ntypedef void* fiber_t;\r\n\r\ninline unsigned get_tick_count()\r\n{\r\n    return GetTickCount();\r\n}\r\n\r\ninline void set_low_thread_prio()\r\n{\r\n    SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_BELOW_NORMAL);\r\n}\r\n\r\ninline void create_main_fiber(fiber_t& fib)\r\n{\r\n    fib = ConvertThreadToFiber(0);\r\n    if (0 == fib)\r\n    {\r\n        unsigned long err = ::GetLastError(); (void)err;\r\n        throw std::logic_error(\"you must start simulation inside a thread (not a fiber)\");\r\n    }\r\n}\r\n\r\ninline void delete_main_fiber(fiber_t& fib)\r\n{\r\n    (void)fib;\r\n    HMODULE lib = LoadLibraryW(L\"kernel32.dll\");\r\n    if (lib)\r\n    {\r\n        void* proc = (void*)GetProcAddress(lib, \"ConvertFiberToThread\");\r\n        if (proc)\r\n        {\r\n            typedef BOOL (WINAPI * ConvertFiberToThreadT)();\r\n            ConvertFiberToThreadT ConvertFiberToThread = (ConvertFiberToThreadT)proc;\r\n            ConvertFiberToThread();\r\n        }\r\n        FreeLibrary(lib);\r\n    }\r\n}\r\n\r\ninline void create_fiber(fiber_t& fib, void(*fiber_proc)(void*), void* ctx)\r\n{\r\n    size_t const stack_size = 64*1024;\r\n    fib = CreateFiberEx(4*1024, stack_size, 0, (LPFIBER_START_ROUTINE)fiber_proc, ctx);\r\n    if (fib == 0)\r\n        throw std::runtime_error(\"error creating fiber\");\r\n}\r\n\r\ninline void delete_fiber(fiber_t& fib)\r\n{\r\n    DeleteFiber(fib);\r\n}\r\n\r\ninline void switch_to_fiber(fiber_t fib, fiber_t)\r\n{\r\n    SwitchToFiber(fib);\r\n}\r\n\r\n// work-around for some versions of cygwin\r\nextern \"C\" inline int __gxx_personality_v0()\r\n{\r\n    return 0;\r\n}\r\n\r\n#ifdef RL_WIN\r\n#else\r\n\r\n/*\r\ninline unsigned get_tick_count()\r\n{\r\n    return GetTickCount();\r\n}\r\n\r\ntypedef void* fiber_t;\r\n\r\nstruct ucontext_t\r\n{\r\n    struct stack_t\r\n    {\r\n        void* ss_sp;\r\n        size_t ss_size;\r\n    };\r\n    stack_t uc_stack;\r\n    void* uc_link;\r\n\r\n};\r\nvoid getcontext(void*) {}\r\nvoid makecontext(void*, void(*)(), int, void*) {}\r\nvoid swapcontext(void*, void*) {}\r\n\r\n*/\r\n\r\n#endif\r\n\r\n#else\r\n\r\ninline unsigned get_tick_count()\r\n{\r\n    struct tms tms;\r\n    return ((unsigned)(times (&tms) * (1000 / sysconf(_SC_CLK_TCK))));\r\n}\r\n\r\ninline void set_low_thread_prio()\r\n{\r\n}\r\n\r\n#if 0\r\n\r\ntypedef ucontext_t fiber_t;\r\n\r\ninline void create_main_fiber(fiber_t& fib)\r\n{\r\n    ucontext_t f = {};\r\n    fib = f;\r\n}\r\n\r\ninline void delete_main_fiber(fiber_t& fib)\r\n{\r\n    (void)fib;\r\n}\r\n\r\ninline void create_fiber(fiber_t& fib, void(*fiber_proc)(void*), void* ctx)\r\n{\r\n    size_t const stack_size = 64*1024;\r\n    getcontext(&fib);\r\n    fib.uc_stack.ss_sp = (::malloc)(stack_size);\r\n    fib.uc_stack.ss_size = stack_size;\r\n    fib.uc_link = 0;\r\n    typedef void(*fn_t)();\r\n    fn_t fn = (fn_t)fiber_proc;\r\n    makecontext(&fib, fn, 1, ctx);\r\n}\r\n\r\ninline void delete_fiber(fiber_t& fib)\r\n{\r\n    //(::free)(fib.uc_stack.ss_sp);\r\n}\r\n\r\ninline void switch_to_fiber(fiber_t& fib, fiber_t& prev)\r\n{\r\n    swapcontext(&prev, &fib);\r\n}\r\n\r\n#else\r\n\r\nstruct fiber_t\r\n{\r\n    ucontext_t  fib;\r\n    jmp_buf     jmp;\r\n};\r\n\r\nstruct fiber_ctx_t\r\n{\r\n    void(*      fnc)(void*);\r\n    void*       ctx;\r\n    jmp_buf*    cur;\r\n    ucontext_t* prv;\r\n};\r\n\r\nstatic void fiber_start_fnc(void* p)\r\n{\r\n    fiber_ctx_t* ctx = (fiber_ctx_t*)p;\r\n    void (*volatile ufnc)(void*) = ctx->fnc;\r\n    void* volatile uctx = ctx->ctx;\r\n    if (_setjmp(*ctx->cur) == 0)\r\n    {\r\n        ucontext_t tmp;\r\n        swapcontext(&tmp, ctx->prv);\r\n    }\r\n    ufnc(uctx);\r\n}\r\n\r\ninline void create_main_fiber(fiber_t& fib)\r\n{\r\n    memset(&fib, 0, sizeof(fib));\r\n}\r\n\r\ninline void delete_main_fiber(fiber_t& fib)\r\n{\r\n    (void)fib;\r\n}\r\n\r\ninline void create_fiber(fiber_t& fib, void(*ufnc)(void*), void* uctx)\r\n{\r\n    size_t const stack_size = 64*1024;\r\n    getcontext(&fib.fib);\r\n    fib.fib.uc_stack.ss_sp = (::malloc)(stack_size);\r\n    fib.fib.uc_stack.ss_size = stack_size;\r\n    fib.fib.uc_link = 0;\r\n    ucontext_t tmp;\r\n    fiber_ctx_t ctx = {ufnc, uctx, &fib.jmp, &tmp};\r\n    makecontext(&fib.fib, (void(*)())fiber_start_fnc, 1, &ctx);\r\n    swapcontext(&tmp, &fib.fib);\r\n}\r\n\r\ninline void delete_fiber(fiber_t& fib)\r\n{\r\n    //(::free)(fib.uc_stack.ss_sp);\r\n}\r\n\r\ninline void switch_to_fiber(fiber_t& fib, fiber_t& prv)\r\n{\r\n    if (_setjmp(prv.jmp) == 0)\r\n        _longjmp(fib.jmp, 1);\r\n}\r\n\r\n#endif\r\n\r\n#endif\r\n\r\n\r\n\r\n#ifdef _MSC_VER\r\n    typedef unsigned __int64 uint64_t;\r\n#   define RL_INLINE __forceinline\r\n#   define RL_NOINLINE __declspec(noinline)\r\n#   define RL_STRINGIZE(text) RL_STRINGIZE_A((text))\r\n#   define RL_STRINGIZE_I(text) #text\r\n#   define RL_STRINGIZE_A(arg) RL_STRINGIZE_I arg\r\n#   define RL_STDCALL __stdcall\r\n#else\r\n#   define RL_INLINE inline\r\n#   define RL_NOINLINE\r\n#   define RL_STRINGIZE_I(text) #text\r\n#   define RL_STRINGIZE(text) RL_STRINGIZE_I(text)\r\n#   define RL_STDCALL\r\n#endif\r\n\r\n\r\n#if defined(_MSC_VER)\r\n#   define RL_THROW_SPEC(ex)\r\n#elif __cplusplus >= 201103L\r\n#   define RL_THROW_SPEC(ex) noexcept(false)\r\n#else\r\n#   define RL_THROW_SPEC(ex) throw(ex)\r\n#endif\r\n\r\n\r\n#if defined (_MSC_VER) && (_MSC_VER >= 1400)\r\n#   define RL_RESTRICT __restrict\r\n#else\r\n#   define RL_RESTRICT\r\n#endif\r\n\r\n\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/pthread.h",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_PTHREAD_IFACE_HPP\r\n#define RL_PTHREAD_IFACE_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n\r\n#include \"relacy.hpp\"\r\n#include \"stdlib/pthread.hpp\"\r\n\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/random.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_RANDOM_HPP\r\n#define RL_RANDOM_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\n\r\nunsigned const primes[16] = {1, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53};\r\n\r\nstruct random_generator\r\n{\r\n    unsigned k;\r\n    unsigned c;\r\n    unsigned x;\r\n\r\n    void seed(iteration_t s)\r\n    {\r\n        k = ((unsigned)(s >> 32) & 0xf) + 8;\r\n        c = primes[((unsigned)(s >> 36) & 0xf)];\r\n        x = (unsigned)((s + 1) * 0x95949347 + c);\r\n    }\r\n\r\n    unsigned rand()\r\n    {\r\n        return ((x = x + c + (x << k)) >> 16);\r\n    }\r\n\r\n    template<typename T, T max>\r\n    RL_INLINE\r\n    T get()\r\n    {\r\n        return static_cast<T>(rand() % max);\r\n    }\r\n};\r\n\r\n\r\n\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/random_scheduler.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_RANDOM_SCHEDULER_HPP\r\n#define RL_RANDOM_SCHEDULER_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n#include \"scheduler.hpp\"\r\n#include \"random.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\n\r\ntemplate<thread_id_t thread_count>\r\nclass random_scheduler : public scheduler<random_scheduler<thread_count>, scheduler_thread_info, thread_count>\r\n{\r\npublic:\r\n    typedef scheduler<random_scheduler<thread_count>, scheduler_thread_info, thread_count> base_t;\r\n    typedef typename base_t::thread_info_t thread_info_t;\r\n    typedef typename base_t::shared_context_t shared_context_t;\r\n\r\n    struct task_t\r\n    {\r\n    };\r\n\r\n    random_scheduler(test_params& params, shared_context_t& ctx, thread_id_t dynamic_thread_count)\r\n        : base_t(params, ctx, dynamic_thread_count)\r\n    {\r\n    }\r\n\r\n    thread_id_t iteration_begin_impl()\r\n    {\r\n        rand_.seed(this->iter_);\r\n        unpark_reason reason;\r\n        return schedule_impl(reason, false);\r\n    }\r\n\r\n    bool iteration_end_impl()\r\n    {\r\n        return this->iter_ == this->params_.iteration_count;\r\n    }\r\n\r\n    thread_id_t schedule_impl(unpark_reason& reason, unsigned /*yield*/)\r\n    {\r\n        thread_id_t const running_thread_count = this->running_threads_count;\r\n\r\n        thread_id_t timed_thread_count = this->timed_thread_count_;\r\n        if (timed_thread_count)\r\n        {\r\n            thread_id_t cnt = running_thread_count ? timed_thread_count * 4 : timed_thread_count;\r\n            thread_id_t idx = rand_.rand() % cnt;\r\n            if (idx < timed_thread_count)\r\n            {\r\n                thread_info_t* thr = this->timed_threads_[idx];\r\n                thread_id_t th = thr->index_;\r\n                RL_VERIFY(1 == thr->block_count_);\r\n                this->unpark_thread(th);\r\n                RL_VERIFY(thr->state_ == thread_state_running);\r\n                reason = unpark_reason_timeout;\r\n                return th;\r\n            }\r\n        }\r\n\r\n        thread_id_t spurious_thread_count = this->spurious_thread_count_;\r\n        if (spurious_thread_count && running_thread_count)\r\n        {\r\n            thread_id_t cnt = spurious_thread_count * 8;\r\n            thread_id_t idx = rand_.rand() % cnt;\r\n            if (idx < spurious_thread_count)\r\n            {\r\n                thread_info_t* thr = this->spurious_threads_[idx];\r\n                thread_id_t th = thr->index_;\r\n                RL_VERIFY(1 == thr->block_count_);\r\n                this->unpark_thread(th);\r\n                RL_VERIFY(thr->state_ == thread_state_running);\r\n                reason = unpark_reason_spurious;\r\n                return th;\r\n            }\r\n        }\r\n\r\n        RL_VERIFY(running_thread_count);\r\n        unsigned index = rand_.rand() % running_thread_count;\r\n        thread_id_t th = this->running_threads[index];\r\n        reason = unpark_reason_normal;\r\n        return th;\r\n    }\r\n\r\n    unsigned rand_impl(unsigned limit, sched_type t)\r\n    {\r\n        (void)t;\r\n        unsigned r = rand_.rand() % limit;\r\n        ///!!!\r\n#ifdef RL_MY_TEST\r\n        if (this->iter_ == 8761115)\r\n        {\r\n            char buf [1024];\r\n            sprintf(buf, \"rand(%u, %u) = %u\\n\", t, limit, r);\r\n            OutputDebugStringA(buf);\r\n        }\r\n#endif\r\n        return r;\r\n    }\r\n\r\n    iteration_t iteration_count_impl()\r\n    {\r\n        return this->params_.iteration_count;\r\n    }\r\n\r\n    void get_state_impl(std::ostream& /*ss*/)\r\n    {\r\n    }\r\n\r\n    void set_state_impl(std::istream& /*ss*/)\r\n    {\r\n    }\r\n\r\n    void on_thread_block(thread_id_t /*th*/, bool /*yield*/)\r\n    {\r\n    }\r\n\r\nprivate:\r\n    random_generator rand_;\r\n\r\n    RL_NOCOPY(random_scheduler);\r\n};\r\n\r\n\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/relacy.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_RELACY_HPP\r\n#define RL_RELACY_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n\r\n#include \"base.hpp\"\r\n#include \"context.hpp\"\r\n#include \"context_base_impl.hpp\"\r\n#include \"backoff.hpp\"\r\n#include \"atomic_fence.hpp\"\r\n#include \"atomic.hpp\"\r\n#include \"var.hpp\"\r\n#include \"thread_local.hpp\"\r\n#include \"test_suite.hpp\"\r\n#include \"dyn_thread.hpp\"\r\n\r\n#include \"stdlib/mutex.hpp\"\r\n#include \"stdlib/condition_variable.hpp\"\r\n#include \"stdlib/semaphore.hpp\"\r\n#include \"stdlib/event.hpp\"\r\n\r\n#include \"stdlib/windows.hpp\"\r\n#include \"stdlib/pthread.hpp\"\r\n\r\n#define VAR_T(x) rl::var<x>\r\n#define TLS_T(T) rl::thread_local_var<T>\r\n#define VAR(x) x($)\r\n\r\n#ifndef RL_FORCE_SEQ_CST\r\n#define memory_order_relaxed mo_relaxed, $\r\n#define memory_order_consume mo_consume, $\r\n#define memory_order_acquire mo_acquire, $\r\n#define memory_order_release mo_release, $\r\n#define memory_order_acq_rel mo_acq_rel, $\r\n#define memory_order_seq_cst mo_seq_cst, $\r\n#else\r\n#define memory_order_relaxed mo_seq_cst, $\r\n#define memory_order_consume mo_seq_cst, $\r\n#define memory_order_acquire mo_seq_cst, $\r\n#define memory_order_release mo_seq_cst, $\r\n#define memory_order_acq_rel mo_seq_cst, $\r\n#define memory_order_seq_cst mo_seq_cst, $\r\n#endif\r\n\r\n#define new                 RL_NEW_PROXY\r\n#define delete              RL_DELETE_PROXY\r\n#define malloc(sz)          rl::rl_malloc((sz), $)\r\n#define calloc(sz, cnt)     rl::rl_calloc((sz), (cnt), $)\r\n#define realloc(p, sz)      rl::rl_realloc((p), (sz), $)\r\n#define free(p)             rl::rl_free((p), $)\r\n\r\n#ifdef assert\r\n#undef assert\r\n#endif\r\n#define assert              RL_ASSERT\r\n\r\n#ifdef errno\r\n#undef errno\r\n#endif\r\n#define errno               (rl::get_errno())\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/relacy_cli.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_RELACY_CLI_HPP\r\n#define RL_RELACY_CLI_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n\r\n#define RL_CLI_MODE\r\n\r\n#include \"relacy.hpp\"\r\n\r\n#include \"cli.hpp\"\r\n#include \"cli_interlocked.hpp\"\r\n#include \"cli_volatile.hpp\"\r\n#include \"cli_var.hpp\"\r\n\r\n\r\n\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/relacy_java.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_RELACY_JAVA_HPP\r\n#define RL_RELACY_JAVA_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n\r\n#define RL_JAVA_MODE\r\n\r\n#include \"relacy.hpp\"\r\n\r\n#include \"java.hpp\"\r\n#include \"java_atomic.hpp\"\r\n#include \"java_volatile.hpp\"\r\n#include \"java_var.hpp\"\r\n\r\n\r\n\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/relacy_std.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_RELACY_STD_HPP\r\n#define RL_RELACY_STD_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n// MOODYCAMEL BEGIN\r\n// Newer versions of GCC define std::memory_order and std::atomic even if their headers are not\r\n// explicitly included (it suffices to merely include <memory>)\r\n#ifdef __GNUC__\r\n#define memory_order std_memory_order\r\n#define atomic std_atomic\r\n#define atomic_flag std_atomic_flag\r\n#endif\r\n// MOODYCAMEL END\r\n\r\n#include \"relacy.hpp\"\r\n\r\n// MOODYCAMEL BEGIN\r\n#ifdef __GNUC__\r\n#undef memory_order\r\n#undef atomic\r\n#undef atomic_flag\r\nnamespace rl {\r\n    using memory_order = ::rl::std_memory_order;\r\n    template<typename T> using atomic = ::rl::std_atomic<T>;\r\n}\r\n#endif\r\n// MOODYCAMEL END\r\n\r\nnamespace std\r\n{\r\n    using memory_order = rl::memory_order;\r\n    using rl::mo_relaxed;\r\n    using rl::mo_consume;\r\n    using rl::mo_acquire;\r\n    using rl::mo_release;\r\n    using rl::mo_acq_rel;\r\n    using rl::mo_seq_cst;\r\n\r\n    using rl::atomic;\r\n    using rl::atomic_thread_fence;\r\n    using rl::atomic_signal_fence;\r\n\r\n    using rl::atomic_bool;\r\n    using rl::atomic_address;\r\n\r\n    using rl::atomic_char;\r\n    using rl::atomic_schar;\r\n    using rl::atomic_uchar;\r\n    using rl::atomic_short;\r\n    using rl::atomic_ushort;\r\n    using rl::atomic_int;\r\n    using rl::atomic_uint;\r\n    using rl::atomic_long;\r\n    using rl::atomic_ulong;\r\n    using rl::atomic_llong;\r\n    using rl::atomic_ullong;\r\n//    using rl::atomic_char16_t;\r\n//    using rl::atomic_char32_t;\r\n    using rl::atomic_wchar_t;\r\n\r\n//    using rl::atomic_int_least8_t;\r\n//    using rl::atomic_uint_least8_t;\r\n//    using rl::atomic_int_least16_t;\r\n//    using rl::atomic_uint_least16_t;\r\n//    using rl::atomic_int_least32_t;\r\n//    using rl::atomic_uint_least32_t;\r\n//    using rl::atomic_int_least64_t;\r\n//    using rl::atomic_uint_least64_t;\r\n//    using rl::atomic_int_fast8_t;\r\n//    using rl::atomic_uint_fast8_t;\r\n//    using rl::atomic_int_fast16_t;\r\n//    using rl::atomic_uint_fast16_t;\r\n//    using rl::atomic_int_fast32_t;\r\n//    using rl::atomic_uint_fast32_t;\r\n//    using rl::atomic_int_fast64_t;\r\n//    using rl::atomic_uint_fast64_t;\r\n    using rl::atomic_intptr_t;\r\n    using rl::atomic_uintptr_t;\r\n    using rl::atomic_size_t;\r\n//    using rl::atomic_ssize_t;\r\n    using rl::atomic_ptrdiff_t;\r\n//    using rl::atomic_intmax_t;\r\n//    using rl::atomic_uintmax_t;\r\n\r\n    using rl::mutex;\r\n    using rl::recursive_mutex;\r\n    using rl::condition_variable;\r\n    using rl::condition_variable_any;\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/rmw.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_RMW_HPP\r\n#define RL_RMW_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\n\r\nenum rmw_type_e\r\n{\r\n    rmw_type_swap,\r\n    rmw_type_add,\r\n    rmw_type_sub,\r\n    rmw_type_and,\r\n    rmw_type_or,\r\n    rmw_type_xor,\r\n};\r\n\r\n\r\n\r\n\r\ninline char const* format(rmw_type_e t)\r\n{\r\n    switch (t)\r\n    {\r\n    case rmw_type_swap: return \"exchange\";\r\n    case rmw_type_add: return \"fetch_add\";\r\n    case rmw_type_sub: return \"fetch_sub\";\r\n    case rmw_type_and: return \"fetch_and\";\r\n    case rmw_type_or: return \"fetch_or\";\r\n    case rmw_type_xor: return \"fetch_xor\";\r\n    }\r\n    RL_VERIFY(!\"invalid rmw type\");\r\n    throw std::logic_error(\"invalid rmw type\");\r\n}\r\n\r\n\r\n\r\n\r\ntemplate<rmw_type_e type> struct rmw_type_t {};\r\n\r\n\r\n\r\n\r\ntemplate<typename T, typename Y>\r\nT perform_rmw(rmw_type_t<rmw_type_swap>, T v, Y op)\r\n{\r\n    (void)v;\r\n    return op;\r\n}\r\n\r\ntemplate<typename T, typename Y>\r\nT perform_rmw(rmw_type_t<rmw_type_add>, T v, Y op)\r\n{\r\n    return v + op;\r\n}\r\n\r\ntemplate<typename T, typename Y>\r\nT perform_rmw(rmw_type_t<rmw_type_sub>, T v, Y op)\r\n{\r\n    return v - op;\r\n}\r\n\r\ntemplate<typename T, typename Y>\r\nT perform_rmw(rmw_type_t<rmw_type_and>, T v, Y op)\r\n{\r\n    return v & op;\r\n}\r\n\r\ntemplate<typename T, typename Y>\r\nT perform_rmw(rmw_type_t<rmw_type_or>, T v, Y op)\r\n{\r\n    return v | op;\r\n}\r\n\r\ntemplate<typename T, typename Y>\r\nT perform_rmw(rmw_type_t<rmw_type_xor>, T v, Y op)\r\n{\r\n    return v ^ op;\r\n}\r\n\r\n\r\n\r\n}\r\n\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/scheduler.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_SCHEDULER_HPP\r\n#define RL_SCHEDULER_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n#include \"context_base.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\n\r\nenum thread_state_e\r\n{\r\n    thread_state_running,\r\n    thread_state_blocked,\r\n    thread_state_finished,\r\n};\r\n\r\nenum thread_finish_result\r\n{\r\n    thread_finish_result_normal,\r\n    thread_finish_result_last,\r\n    thread_finish_result_deadlock,\r\n};\r\n\r\n\r\n\r\nstruct scheduler_thread_info\r\n{\r\n    thread_id_t             index_;\r\n    unsigned                block_count_;\r\n    thread_state_e          state_;\r\n\r\n    void reset(test_params& /*params*/)\r\n    {\r\n        block_count_ = 0;\r\n        state_ = thread_state_running;\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\ntemplate<typename derived_t, typename thread_info_type, thread_id_t thread_count>\r\nclass scheduler : nocopy<>\r\n{\r\npublic:\r\n    typedef thread_info_type                    thread_info_t;\r\n\r\n    struct shared_context_t\r\n    {\r\n        typedef typename derived_t::task_t      task_t;\r\n        //CRITICAL_SECTION                        guard_;\r\n        queue<task_t>                           queue_;\r\n    };\r\n\r\n    scheduler(test_params& params, shared_context_t& ctx, thread_id_t dynamic_thread_count)\r\n        : params_(params)\r\n        , ctx_(ctx)\r\n        , total_dynamic_threads_(dynamic_thread_count)\r\n        , iter_()\r\n        , thread_()\r\n    {\r\n        for (thread_id_t i = 0; i != thread_count; ++i)\r\n        {\r\n            threads_[i].index_ = i;\r\n        }\r\n    }\r\n\r\n    thread_id_t iteration_begin(iteration_t iter)\r\n    {\r\n        iter_ = iter;\r\n        running_threads_count = thread_count;\r\n        finished_thread_count_ = 0;\r\n        timed_thread_count_ = 0;\r\n        spurious_thread_count_ = 0;\r\n        dynamic_thread_count_ = 0;\r\n\r\n        for (thread_id_t i = 0; i != thread_count; ++i)\r\n        {\r\n            running_threads.push_back(i);\r\n            threads_[i].reset(params_);\r\n        }\r\n\r\n        for (thread_id_t i = thread_count - total_dynamic_threads_; i != thread_count; ++i)\r\n        {\r\n            dynamic_threads_[dynamic_thread_count_++] = &threads_[i];\r\n            block_thread(i, false);\r\n        }\r\n\r\n        thread_id_t const th = self().iteration_begin_impl();\r\n    \r\n        thread_ = &threads_[th];\r\n\r\n        return th;\r\n    }\r\n\r\n    bool iteration_end()\r\n    {\r\n        bool const finish = self().iteration_end_impl();\r\n\r\n        thread_ = 0;\r\n\r\n        return finish;\r\n    }\r\n\r\n    thread_id_t schedule(unpark_reason& reason, unsigned yield)\r\n    {\r\n        thread_id_t const th = self().schedule_impl(reason, yield);\r\n\r\n        RL_VERIFY(threads_[th].state_ == thread_state_running);\r\n        thread_ = &threads_[th];\r\n\r\n        return th;\r\n    }\r\n\r\n    RL_INLINE\r\n    unsigned rand(unsigned limit, sched_type t)\r\n    {\r\n        RL_VERIFY(limit);\r\n        return self().rand_impl(limit, t);\r\n    }\r\n\r\n    iteration_t iteration_count()\r\n    {\r\n        return self().iteration_count_impl();\r\n    }\r\n\r\n    bool park_current_thread(bool is_timed, bool allow_spurious_wakeup)\r\n    {\r\n        if (is_timed)\r\n        {\r\n            timed_threads_[timed_thread_count_++] = thread_;\r\n            RL_VERIFY(timed_thread_count_ <= thread_count);\r\n        }\r\n\r\n        if (allow_spurious_wakeup)\r\n        {\r\n            spurious_threads_[spurious_thread_count_++] = thread_;\r\n            RL_VERIFY(spurious_thread_count_ <= thread_count);\r\n        }\r\n\r\n        block_thread(thread_->index_, true);\r\n\r\n        return is_deadlock() ? false : true;\r\n    }\r\n\r\n    void unpark_thread(thread_id_t th, bool do_switch = false)\r\n    {\r\n        (void)do_switch;\r\n        unblock_thread(th);\r\n\r\n        thread_info_t& t = threads_[th];\r\n\r\n        //!!! store flag as to whether thread is spurious blocked in thread object\r\n        // (to eliminate iteration over all threads)\r\n        for (thread_id_t i = 0; i != spurious_thread_count_; ++i)\r\n        {\r\n            if (spurious_threads_[i] == &t)\r\n            {\r\n                for (thread_id_t j = i + 1; j != spurious_thread_count_; ++j)\r\n                    spurious_threads_[j - 1] = spurious_threads_[j];\r\n                spurious_thread_count_ -= 1;\r\n                break;\r\n            }\r\n        }\r\n\r\n        //!!! store flag as to whether thread is spurious blocked in thread object\r\n        for (thread_id_t i = 0; i != timed_thread_count_; ++i)\r\n        {\r\n            if (timed_threads_[i] == &t)\r\n            {\r\n                for (thread_id_t j = i + 1; j != timed_thread_count_; ++j)\r\n                    timed_threads_[j - 1] = timed_threads_[j];\r\n                timed_thread_count_ -= 1;\r\n                break;\r\n            }\r\n        }\r\n    }\r\n\r\n    thread_finish_result thread_finished()\r\n    {\r\n        RL_VERIFY(thread_->state_ == thread_state_running);\r\n        block_thread(thread_->index_, false);\r\n        thread_->state_ = thread_state_finished;\r\n        finished_thread_count_ += 1;\r\n        self().thread_finished_impl();\r\nretry:\r\n        if (finished_thread_count_ == thread_count)\r\n        {\r\n            return thread_finish_result_last;\r\n        }\r\n        else if (is_deadlock())\r\n        {\r\n            if (dynamic_thread_count_)\r\n            {\r\n                while (dynamic_thread_count_)\r\n                {\r\n                    thread_info_t* th = dynamic_threads_[--dynamic_thread_count_];\r\n                    unblock_thread(th->index_);\r\n                }\r\n                goto retry;\r\n            }\r\n            return thread_finish_result_deadlock;\r\n        }\r\n        else\r\n        {\r\n            return thread_finish_result_normal;\r\n        }\r\n    }\r\n\r\n    thread_id_t create_thread()\r\n    {\r\n        RL_VERIFY(dynamic_thread_count_);\r\n        thread_info_t* th = dynamic_threads_[--dynamic_thread_count_];\r\n        unblock_thread(th->index_);\r\n        return th->index_;\r\n    }\r\n\r\n    void get_state(std::ostream& ss)\r\n    {\r\n        self().get_state_impl(ss);\r\n    }\r\n\r\n    void set_state(std::istream& ss)\r\n    {\r\n        self().set_state_impl(ss);\r\n    }\r\n\r\nprotected:\r\n    test_params&                    params_;\r\n    shared_context_t&               ctx_;\r\n    thread_id_t const               total_dynamic_threads_;\r\n    iteration_t                     iter_;\r\n\r\n    aligned<thread_info_t>          threads_ [thread_count];\r\n    thread_info_t*                  thread_;\r\n\r\n    vector<thread_id_t>::type       running_threads;\r\n    thread_id_t                     running_threads_count;\r\n    thread_id_t                     finished_thread_count_;\r\n\r\n    //!!! doesn't timed/spurious waits must belong to full scheduler?\r\n    // hyphotesis: random scheduler can ignore timed/spurious waits\r\n    // (however must detect deadlock with spurious threads)\r\n    thread_info_t*                  timed_threads_ [thread_count];\r\n    thread_id_t                     timed_thread_count_;\r\n\r\n    thread_info_t*                  spurious_threads_ [thread_count];\r\n    thread_id_t                     spurious_thread_count_;\r\n\r\n    thread_info_t*                  dynamic_threads_ [thread_count];\r\n    thread_id_t                     dynamic_thread_count_;\r\n\r\n    void block_thread(thread_id_t th, bool yield)\r\n    {\r\n        RL_VERIFY(th < thread_count);\r\n        thread_info_t& t = threads_[th];\r\n        RL_VERIFY(t.state_ != thread_state_finished);\r\n        if (t.block_count_++)\r\n            return;\r\n\r\n        for (thread_id_t i = 0; i != running_threads_count; ++i)\r\n        {\r\n            if (running_threads[i] == th)\r\n            {\r\n                running_threads.erase(running_threads.begin() + i);\r\n                running_threads_count -= 1;\r\n                t.state_ = thread_state_blocked;\r\n                self().on_thread_block(th, yield);\r\n                return;\r\n            }\r\n        }\r\n        RL_VERIFY(false);\r\n    }\r\n\r\n    bool unblock_thread(thread_id_t th)\r\n    {\r\n        RL_VERIFY(th < thread_count);\r\n        thread_info_t& t = threads_[th];\r\n        RL_VERIFY(t.state_ == thread_state_blocked);\r\n        if (--t.block_count_)\r\n            return false;\r\n\r\n        running_threads.push_back(th);\r\n        running_threads_count += 1;\r\n        t.state_ = thread_state_running;\r\n        return true;\r\n    }\r\n\r\nprivate:\r\n    derived_t& self()\r\n    {\r\n        return *static_cast<derived_t*>(this);\r\n    }\r\n\r\n    bool is_deadlock()\r\n    {\r\n        if ((0 == running_threads_count) && (0 == timed_thread_count_))\r\n        {\r\n            self().purge_blocked_threads();\r\n            if ((0 == running_threads_count) && (0 == timed_thread_count_))\r\n                return true;\r\n        }\r\n        return false;\r\n    }\r\n\r\n    void thread_finished_impl()\r\n    {\r\n    }\r\n\r\n    void purge_blocked_threads()\r\n    {\r\n    }\r\n};\r\n\r\n\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/signature.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_SIGNATURE_HPP\r\n#define RL_SIGNATURE_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n#include \"test_result.hpp\"\r\n#include \"context_base.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\n\r\ntemplate<unsigned magic>\r\nclass signature\r\n{\r\npublic:\r\n    signature()\r\n        : magic_(magic)\r\n    {\r\n    }\r\n\r\n    signature(signature const&)\r\n        : magic_(magic)\r\n    {\r\n    }\r\n\r\n    ~signature()\r\n    {\r\n        check(RL_INFO);\r\n        magic_ = 0;\r\n    }\r\n\r\n    void check(debug_info_param info) const\r\n    {\r\n        if (\r\n            ((uintptr_t)this <= (uintptr_t)-1 - 4096) && \r\n            ((uintptr_t)this >= 4096) &&\r\n            ((uintptr_t)this % sizeof(unsigned) == 0) && (magic == magic_))\r\n        {\r\n            return;\r\n        }\r\n        else\r\n        {\r\n            fail(info);\r\n        }\r\n    }\r\n\r\nprivate:\r\n    unsigned magic_;\r\n\r\n    struct fault_event\r\n    {\r\n        void const* addr_;\r\n        void output(std::ostream& s) const\r\n        {\r\n            s << \"<\" << std::hex << addr_ << std::dec << \">\"\r\n                << \" access to freed memory\";\r\n        }\r\n    };\r\n\r\n    RL_NOINLINE void fail(debug_info_param info) const\r\n    {\r\n        context& c = ctx();\r\n        RL_HIST(fault_event) {this} RL_HIST_END();\r\n        rl::ctx().fail_test(\"access to freed memory\", test_result_access_to_freed_memory, info);\r\n    }\r\n};\r\n\r\n\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/slab_allocator.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_SLAB_ALLOCATOR_HPP\r\n#define RL_SLAB_ALLOCATOR_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\n\r\ntemplate<typename type>\r\nclass slab_allocator : nocopy<>\r\n{\r\npublic:\r\n    slab_allocator()\r\n        : freelist_()\r\n        , blocks_()\r\n        , alloc_count_()\r\n    {\r\n    }\r\n\r\n    ~slab_allocator()\r\n    {\r\n        char* pos = blocks_;\r\n        while (pos)\r\n        {\r\n            char* const next = *reinterpret_cast<char**>(pos);\r\n            ::free(pos);\r\n            pos = next;\r\n        }\r\n    }\r\n\r\n    type* alloc(void* ctx = 0)\r\n    {\r\n        if (freelist_)\r\n        {\r\n            type* p = freelist_;\r\n            freelist_ = *reinterpret_cast<type**>(p);\r\n            alloc_count_ += 1;\r\n            *(void**)p = ctx;\r\n            type* pp = reinterpret_cast<type*>((reinterpret_cast<void**>(p) + 1));\r\n            return pp;\r\n        }\r\n        else\r\n        {\r\n            return alloc_batch();\r\n        }\r\n    }\r\n\r\n    void free(type* p)\r\n    {\r\n        type** pos = reinterpret_cast<type**>((reinterpret_cast<void**>(p) - 1));\r\n        pos[0] = freelist_;\r\n        freelist_ = reinterpret_cast<type*>(pos);\r\n        alloc_count_ -= 1;\r\n    }\r\n\r\n    bool iteration_end()\r\n    {\r\n#ifndef RL_GC\r\n        return alloc_count_ == 0;\r\n#else\r\n        freelist_ = 0;\r\n        size_t elem_size = sizeof(void*) + sizeof(type);\r\n        elem_size = (elem_size + 15) & ~15;\r\n        char* pos = blocks_;\r\n        while (pos)\r\n        {\r\n            char* p = pos;\r\n            p += elem_size;\r\n            for (size_t i = 0; i != batch_size; ++i)\r\n            {\r\n                *reinterpret_cast<type**>(p) = freelist_;\r\n                freelist_ = reinterpret_cast<type*>(p);\r\n                p += elem_size;\r\n            }\r\n            pos = *reinterpret_cast<char**>(pos);\r\n        }\r\n        return true;\r\n#endif\r\n    }\r\n\r\n    void output_allocs(std::ostream& stream)\r\n    {\r\n        size_t elem_size = sizeof(void*) + sizeof(type);\r\n        elem_size = (elem_size + 15) & ~15;\r\n        set<void*>::type allocs;\r\n        char* pos = blocks_;\r\n        while (pos)\r\n        {\r\n            char* p = pos;\r\n            p += elem_size;\r\n            for (size_t i = 0; i != batch_size; ++i)\r\n            {\r\n                allocs.insert(p);\r\n                p += elem_size;\r\n            }\r\n            pos = *reinterpret_cast<char**>(pos);\r\n        }\r\n        set<void*>::type avail;\r\n        type* pos2 = freelist_;\r\n        while (pos2)\r\n        {\r\n            avail.insert(pos2);\r\n            pos2 = *reinterpret_cast<type**>(pos2);\r\n        }\r\n        vector<void*>::type diff;\r\n        std::set_difference(allocs.begin(), allocs.end(), avail.begin(), avail.end(), std::back_inserter(diff));\r\n        for (size_t i = 0; i != diff.size(); ++i)\r\n        {\r\n            stream << *(void**)diff[i] << std::endl;\r\n        }\r\n    }\r\n\r\nprivate:\r\n    static size_t const batch_size = 128;\r\n    type* freelist_;\r\n    char* blocks_;\r\n    size_t alloc_count_;\r\n\r\n    RL_NOINLINE type* alloc_batch()\r\n    {\r\n        size_t elem_size = sizeof(void*) + sizeof(type);\r\n        elem_size = (elem_size + 15) & ~15;\r\n        char* const batch = (char*)(::malloc)(elem_size * (batch_size + 1));\r\n        if (0 == batch)\r\n            throw std::bad_alloc();\r\n        *reinterpret_cast<char**>(batch) = blocks_;\r\n        blocks_ = batch;\r\n        char* p = batch;\r\n        p += elem_size;\r\n        for (size_t i = 0; i != batch_size; ++i)\r\n        {\r\n            *reinterpret_cast<type**>(p) = freelist_;\r\n            freelist_ = reinterpret_cast<type*>(p);\r\n            p += elem_size;\r\n        }\r\n        return alloc();\r\n    }\r\n};\r\n\r\n\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/stdlib/condition_variable.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_CONDITION_VARIABLE_HPP\r\n#define RL_CONDITION_VARIABLE_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"../base.hpp\"\r\n#include \"../context_base.hpp\"\r\n#include \"../waitset.hpp\"\r\n#include \"../signature.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\nstruct mutex_wrapper\r\n{\r\n    virtual void lock(debug_info_param info) const = 0;\r\n    virtual void unlock(debug_info_param info) const = 0;\r\n    virtual ~mutex_wrapper() {}\r\n};\r\n\r\ntemplate<typename mutex_t>\r\nclass mutex_wrapper_impl : public mutex_wrapper\r\n{\r\npublic:\r\n    mutex_wrapper_impl(mutex_t& m)\r\n        : m_(m)\r\n    {\r\n    }\r\n\r\nprivate:\r\n    mutex_t& m_;\r\n\r\n    virtual void lock(debug_info_param info) const\r\n    {\r\n        m_.lock(info);\r\n    }\r\n\r\n    virtual void unlock(debug_info_param info) const\r\n    {\r\n        m_.unlock(info);\r\n    }\r\n\r\n    RL_NOCOPY(mutex_wrapper_impl);\r\n};\r\n\r\nstruct pred_wrapper\r\n{\r\n    virtual bool exec() const = 0;\r\n    virtual ~pred_wrapper() {}\r\n};\r\n\r\ntemplate<typename pred_t>\r\nclass pred_wrapper_impl : public pred_wrapper\r\n{\r\npublic:\r\n    pred_wrapper_impl(pred_t p)\r\n        : p_(p)\r\n    {\r\n    }\r\n\r\nprivate:\r\n    mutable pred_t p_;\r\n\r\n    virtual bool exec() const\r\n    {\r\n        return p_();\r\n    }\r\n\r\n    RL_NOCOPY(pred_wrapper_impl);\r\n};\r\n\r\n\r\nstruct condvar_data\r\n{\r\n    virtual void notify_one(debug_info_param info) = 0;\r\n    virtual void notify_all(debug_info_param info) = 0;\r\n    virtual sema_wakeup_reason wait(mutex_wrapper const& lock, bool is_timed, debug_info_param info) = 0;\r\n    virtual bool wait(mutex_wrapper const& lock, pred_wrapper const& pred, bool is_timed, debug_info_param info) = 0;\r\n    virtual ~condvar_data() {} // just to calm down gcc\r\n};\r\n\r\ntemplate<thread_id_t thread_count>\r\nclass condvar_data_impl : public condvar_data\r\n{\r\npublic:\r\n    condvar_data_impl(bool allow_spurious_wakeups)\r\n    {\r\n        spurious_wakeup_limit_ = 0;\r\n        if (allow_spurious_wakeups && ctx().is_random_sched())\r\n            spurious_wakeup_limit_ = 10;\r\n    }\r\n\r\n    ~condvar_data_impl()\r\n    {\r\n        //!!! detect destoy when there are blocked threads\r\n    }\r\n\r\nprivate:\r\n    waitset<thread_count>           ws_;\r\n    signature<0xc0ffe3ad>           sign_;\r\n    int                             spurious_wakeup_limit_;\r\n\r\n    struct event_t\r\n    {\r\n        enum type_e\r\n        {\r\n            type_notify_one,\r\n            type_notify_all,\r\n            type_wait_enter,\r\n            type_wait_exit,\r\n            type_wait_pred_enter,\r\n            type_wait_pred_exit,\r\n        };\r\n\r\n        condvar_data_impl const*    var_addr_;\r\n        type_e                      type_;\r\n        thread_id_t                 thread_count_;\r\n        unpark_reason               reason_;\r\n\r\n        void output(std::ostream& s) const\r\n        {\r\n            s << \"<\" << std::hex << var_addr_ << std::dec << \"> cond_var: \";\r\n            switch (type_)\r\n            {\r\n            case type_notify_one:\r\n                s << \"notify one total_blocked=\" << thread_count_ << \" unblocked=\" << (thread_count_ ? 1 : 0);\r\n                break;\r\n            case type_notify_all:\r\n                s << \"notify all unblocked=\" << thread_count_;\r\n                break;\r\n            case type_wait_enter: s << \"wait enter\"; break;\r\n            case type_wait_exit:\r\n                s << \"wait exit\";\r\n                if (unpark_reason_normal == reason_)\r\n                    s << \" due to notified\";\r\n                else if (unpark_reason_timeout == reason_)\r\n                    s << \" due to timeout\";\r\n                else if (unpark_reason_spurious == reason_)\r\n                    s << \" spuriously\";\r\n                break;\r\n            case type_wait_pred_enter: s << \"wait pred enter\"; break;\r\n            case type_wait_pred_exit: s << \"wait pred exit\"; break;\r\n            }\r\n        }\r\n    };\r\n\r\n    virtual void notify_one(debug_info_param info)\r\n    {\r\n        context& c = ctx();\r\n        //??? do I need this scheduler call?\r\n        c.sched();\r\n        sign_.check(info);\r\n        RL_HIST(event_t) {this, event_t::type_notify_one, ws_.size()} RL_HIST_END();\r\n        ws_.unpark_one(c, info);\r\n    }\r\n\r\n    virtual void notify_all(debug_info_param info)\r\n    {\r\n        context& c = ctx();\r\n        //??? do I need this scheduler call?\r\n        c.sched();\r\n        sign_.check(info);\r\n        RL_HIST(event_t) {this, event_t::type_notify_all, ws_.size()} RL_HIST_END();\r\n        ws_.unpark_all(c, info);\r\n    }\r\n\r\n    virtual sema_wakeup_reason wait(mutex_wrapper const& lock, bool is_timed, debug_info_param info)\r\n    {\r\n        //!!! detect whether mutex is the same\r\n        context& c = ctx();\r\n        sign_.check(info);\r\n        RL_HIST(event_t) {this, event_t::type_wait_enter} RL_HIST_END();\r\n        lock.unlock(info);\r\n        sign_.check(info);\r\n        bool allow_spurious_wakeup = (spurious_wakeup_limit_ > 0);\r\n        unpark_reason reason = ws_.park_current(c, is_timed, allow_spurious_wakeup, false, info);\r\n        if (reason == unpark_reason_spurious)\r\n            spurious_wakeup_limit_ -= 1;\r\n        RL_HIST(event_t) {this, event_t::type_wait_exit, 0, reason} RL_HIST_END();\r\n        lock.lock(info);\r\n        sign_.check(info);\r\n        if (reason == unpark_reason_normal)\r\n            return sema_wakeup_reason_success;\r\n        else if (reason == unpark_reason_spurious)\r\n            return sema_wakeup_reason_spurious;\r\n        else //if (reason == unpark_reason_timeout)\r\n            return sema_wakeup_reason_timeout;\r\n    }\r\n\r\n    virtual bool wait(mutex_wrapper const& lock, pred_wrapper const& pred, bool is_timed, debug_info_param info)\r\n    {\r\n        context& c = ctx();\r\n        sign_.check(info);\r\n        RL_HIST(event_t) {this, event_t::type_wait_pred_enter} RL_HIST_END();\r\n        while (!pred.exec())\r\n        {\r\n            sema_wakeup_reason reason = wait(lock, is_timed, info);\r\n            if (reason == sema_wakeup_reason_timeout)\r\n            {\r\n                RL_HIST(event_t) {this, event_t::type_wait_pred_exit} RL_HIST_END();\r\n                return pred.exec();\r\n            }\r\n        }\r\n        RL_HIST(event_t) {this, event_t::type_wait_pred_exit} RL_HIST_END();\r\n        return true;\r\n    }\r\n};\r\n\r\n\r\ntemplate<typename tag_t>\r\nclass condvar\r\n{\r\npublic:\r\n    condvar()\r\n        : impl_()\r\n    {\r\n    }\r\n\r\n    condvar(condvar const&)\r\n        : impl_()\r\n    {\r\n    }\r\n\r\n    condvar& operator = (condvar const&)\r\n    {\r\n        return *this;\r\n    }\r\n\r\n    ~condvar()\r\n    {\r\n    }\r\n\r\n    void init(bool allow_spurious_wakeups, debug_info_param info)\r\n    {\r\n        context& c = ctx();\r\n        RL_ASSERT_IMPL(0 == impl_, test_result_double_initialization_of_condvar, \"\", info);\r\n        sign_.check(info);\r\n        impl_ = c.condvar_ctor(allow_spurious_wakeups);\r\n    }\r\n\r\n    void deinit(debug_info_param info)\r\n    {\r\n        context& c = ctx();\r\n        check(info);\r\n        c.condvar_dtor(impl_);\r\n        impl_ = 0;\r\n    }\r\n\r\n    void notify_one(debug_info_param info)\r\n    {\r\n        check(info);\r\n        impl_->notify_one(info);\r\n    }\r\n\r\n    void notify_all(debug_info_param info)\r\n    {\r\n        check(info);\r\n        impl_->notify_all(info);\r\n    }\r\n\r\n    template<typename lock_t>\r\n    sema_wakeup_reason wait(lock_t& lock, bool is_timed, debug_info_param info)\r\n    {\r\n        check(info);\r\n        mutex_wrapper_impl<lock_t> w (lock);\r\n        return impl_->wait(w, is_timed, info);\r\n    }\r\n\r\n    template<typename lock_t, typename pred_t>\r\n    bool wait(mutex_wrapper const& lock, pred_wrapper const& pred, bool is_timed, debug_info_param info)\r\n    {\r\n        check(info);\r\n        return impl_->wait(mutex_wrapper_impl<lock_t>(lock), pred_wrapper_impl<pred_t>(pred), is_timed, info);\r\n    }\r\n\r\nprivate:\r\n    condvar_data* impl_;\r\n    signature<0xbadc0ffe> sign_;\r\n\r\n    void check(debug_info_param info)\r\n    {\r\n        RL_ASSERT_IMPL(impl_, test_result_usage_of_non_initialized_condvar, \"\", info);\r\n        sign_.check(info);\r\n    }\r\n};\r\n\r\n\r\n\r\ntemplate<typename tag_t>\r\nclass condition_variable_std : condvar<tag_t>\r\n{\r\npublic:\r\n    condition_variable_std()\r\n    {\r\n        condvar<tag_t>::init(true, $);\r\n    }\r\n\r\n    ~condition_variable_std()\r\n    {\r\n        condvar<tag_t>::deinit($);\r\n    }\r\n\r\n    void notify_one(debug_info_param info)\r\n    {\r\n        condvar<tag_t>::notify_one(info);\r\n    }\r\n\r\n    void notify_all(debug_info_param info)\r\n    {\r\n        condvar<tag_t>::notify_all(info);\r\n    }\r\n\r\n    template<typename lock_t>\r\n    void wait(lock_t& lock, debug_info_param info)\r\n    {\r\n        condvar<tag_t>::wait(lock, false, info);\r\n    }\r\n\r\n    template<typename lock_t, typename pred_t>\r\n    void wait(lock_t& lock, pred_t pred, debug_info_param info)\r\n    {\r\n        condvar<tag_t>::wait(lock, pred, false, info);\r\n    }\r\n\r\n    template<typename lock_t, typename abs_time_t>\r\n    bool wait_until(lock_t& lock, abs_time_t const&, debug_info_param info)\r\n    {\r\n        return condvar<tag_t>::wait(lock, true, info);\r\n    }\r\n\r\n    template<typename lock_t, typename abs_time_t, typename pred_t>\r\n    bool wait_until(lock_t& lock, abs_time_t const&, pred_t pred, debug_info_param info)\r\n    {\r\n        return condvar<tag_t>::wait(lock, pred, true, info);\r\n    }\r\n    \r\n    template<typename lock_t, typename rel_time_t>\r\n    bool wait_for(lock_t& lock, rel_time_t const&, debug_info_param info)\r\n    {\r\n        sema_wakeup_reason reason = condvar<tag_t>::wait(lock, true, info);\r\n        return reason == sema_wakeup_reason_success;\r\n    }\r\n\r\n    template<typename lock_t, typename rel_time_t, typename pred_t>\r\n    bool wait_for(lock_t& lock, rel_time_t const&, pred_t pred, debug_info_param info)\r\n    {\r\n        return condvar<tag_t>::wait(lock, pred, true, info);\r\n    }\r\n\r\n    RL_NOCOPY(condition_variable_std);\r\n};\r\n\r\n\r\nstruct condvar_tag_std;\r\ntypedef condition_variable_std<condvar_tag_std> condition_variable;\r\nstruct condvar_tag_std_any;\r\ntypedef condition_variable_std<condvar_tag_std_any> condition_variable_any;\r\n\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/stdlib/event.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_EVENT_HPP\r\n#define RL_EVENT_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"../base.hpp\"\r\n#include \"../context_base.hpp\"\r\n#include \"../sync_var.hpp\"\r\n#include \"../waitset.hpp\"\r\n#include \"semaphore.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\n\r\nstruct event_data\r\n{\r\n    virtual void set(debug_info_param info) = 0;\r\n    virtual void reset(debug_info_param info) = 0;\r\n    virtual void pulse(debug_info_param info) = 0;\r\n    virtual sema_wakeup_reason wait(bool try_wait, bool is_timed, debug_info_param info) = 0;\r\n    virtual bool is_signaled(debug_info_param info) = 0;\r\n    virtual void memory_acquire(debug_info_param info) = 0;\r\n    virtual void* prepare_wait(debug_info_param info) = 0;\r\n    virtual ~event_data() {} // just to calm down gcc\r\n};\r\n\r\n\r\n\r\n\r\ntemplate<thread_id_t thread_count>\r\nclass event_data_impl : public event_data\r\n{\r\npublic:\r\n    event_data_impl(bool manual_reset, bool initial_state)\r\n        : manual_reset_(manual_reset)\r\n        , state_(initial_state)\r\n    {\r\n    }\r\n\r\n    ~event_data_impl()\r\n    {\r\n        //!!! detect destuction with waiters\r\n    }\r\n\r\nprivate:\r\n    signature<0xdada1234> sign_;\r\n    bool const manual_reset_;\r\n    bool state_;\r\n    waitset<thread_count> ws_;\r\n    sync_var<thread_count> sync_;\r\n\r\n    struct state_event\r\n    {\r\n        enum type\r\n        {\r\n            type_set,\r\n            type_reset,\r\n            type_pulse,\r\n        };\r\n\r\n        event_data_impl* addr_;\r\n        type type_;\r\n        bool initial_state_;\r\n        bool final_state_;\r\n        thread_id_t unblocked_;\r\n\r\n        void output(std::ostream& s) const\r\n        {\r\n            s << \"<\" << std::hex << addr_ << std::dec << \"> event: \";\r\n            if (type_set == type_)\r\n                s << \"set \";\r\n            else if (type_reset == type_)\r\n                s << \"reset \";\r\n            else\r\n                s << \"pulse \";\r\n            s << \"initial_state=\" << initial_state_\r\n                << \" final_state=\" << final_state_;\r\n            if (type_reset != type_)\r\n                s << \" unblocked=\" << unblocked_;\r\n        }\r\n\r\n    };\r\n\r\n    virtual void set(debug_info_param info)\r\n    {\r\n        context& c = ctx();\r\n        c.sched();\r\n        sign_.check(info);\r\n\r\n        bool initial_state = state_;\r\n        thread_id_t unblocked = 0;\r\n\r\n        if (state_)\r\n        {\r\n            //!!! probably can break if a thread waits in wfmo\r\n            RL_VERIFY(false == ws_);\r\n        }\r\n        else\r\n        {\r\n            sync_.release(c.threadx_);\r\n            state_ = true;\r\n\r\n            if (manual_reset_)\r\n            {\r\n                unblocked = ws_.unpark_all(c, info);\r\n            }\r\n            else\r\n            {\r\n                if (ws_.unpark_one(c, info))\r\n                    unblocked = 1;\r\n            }\r\n        }\r\n\r\n        RL_HIST(state_event) {this, state_event::type_set, initial_state, state_, unblocked} RL_HIST_END();\r\n    }\r\n\r\n    virtual void reset(debug_info_param info)\r\n    {\r\n        context& c = ctx();\r\n        c.sched();\r\n        sign_.check(info);\r\n\r\n        bool initial_state = state_;\r\n\r\n        if (state_)\r\n        {\r\n            RL_VERIFY(false == ws_);\r\n            sync_.release(c.threadx_);\r\n            state_ = false;\r\n        }\r\n\r\n        RL_HIST(state_event) {this, state_event::type_reset, initial_state, state_, 0} RL_HIST_END();\r\n    }\r\n\r\n    virtual void pulse(debug_info_param info)\r\n    {\r\n        context& c = ctx();\r\n        c.sched();\r\n        sign_.check(info);\r\n\r\n        //??? should I model nasty caveat described in MSDN\r\n        thread_id_t unblocked = 0;\r\n\r\n        if (state_)\r\n        {\r\n            //!!! probably can break if a thread waits in wfmo\r\n            RL_VERIFY(false == ws_);\r\n        }\r\n        else\r\n        {\r\n            sync_.release(c.threadx_);\r\n            state_ = true;\r\n            unblocked = ws_.unpark_all(c, info);\r\n            state_ = false;\r\n        }\r\n\r\n        RL_HIST(state_event) {this, state_event::type_pulse, state_, state_, unblocked} RL_HIST_END();\r\n    }\r\n\r\n    struct wait_event\r\n    {\r\n        event_data_impl* addr_;\r\n        bool try_wait_;\r\n        bool is_timed_;\r\n        bool initial_state_;\r\n        bool final_state_;\r\n        sema_wakeup_reason reason_;\r\n\r\n        void output(std::ostream& s) const\r\n        {\r\n            s << \"<\" << std::hex << addr_ << std::dec << \"> event: \";\r\n            if (try_wait_)\r\n                s << \"try_wait \";\r\n            else if (is_timed_)\r\n                s << \"timed wait \";\r\n            else\r\n                s << \"wait \";\r\n\r\n            if (reason_ == sema_wakeup_reason_success)\r\n                s << \"succeeded \";\r\n            else if (reason_ == sema_wakeup_reason_failed)\r\n                s << \"failed \";\r\n            else if (reason_ == sema_wakeup_reason_timeout)\r\n                s << \"timed out \";\r\n            else if (reason_ == sema_wakeup_reason_spurious)\r\n                s << \"spuriously failed \";\r\n\r\n            s << \"initial_state=\" << initial_state_\r\n                << \" final_state=\" << final_state_;\r\n        }\r\n    };\r\n\r\n    virtual sema_wakeup_reason wait(bool try_wait, bool is_timed, debug_info_param info)\r\n    {\r\n        context& c = ctx();\r\n        c.sched();\r\n        sign_.check(info);\r\n\r\n        bool initial_state = state_;\r\n        sema_wakeup_reason reason = sema_wakeup_reason_success;\r\n\r\n        for (;;)\r\n        {\r\n            if (state_)\r\n            {\r\n                if (manual_reset_)\r\n                {\r\n                    sync_.acquire(c.threadx_);\r\n                }\r\n                else\r\n                {\r\n                    state_ = false;\r\n                    sync_.acq_rel(c.threadx_);\r\n                }\r\n                reason = sema_wakeup_reason_success;\r\n                break;\r\n            }\r\n\r\n            if (try_wait)\r\n            {\r\n                sync_.acquire(c.threadx_);\r\n                reason = sema_wakeup_reason_failed;\r\n                break;\r\n            }\r\n\r\n            unpark_reason wr = ws_.park_current(c, is_timed, false, true, info);\r\n            initial_state = state_;\r\n            if (unpark_reason_timeout == wr)\r\n            {\r\n                sync_.acquire(c.threadx_);\r\n                reason = sema_wakeup_reason_timeout;\r\n                break;\r\n            }\r\n            else if (unpark_reason_normal == wr)\r\n            {\r\n                RL_VERIFY(state_ == true);\r\n                if (manual_reset_)\r\n                {\r\n                    sync_.acquire(c.threadx_);\r\n                }\r\n                else\r\n                {\r\n                    state_ = false;\r\n                    sync_.acq_rel(c.threadx_);\r\n                }\r\n                c.switch_back(info);\r\n                reason = sema_wakeup_reason_success;\r\n                break;\r\n            }\r\n            RL_VERIFY(false);\r\n        }\r\n\r\n        RL_HIST(wait_event) {this, try_wait, is_timed, initial_state, state_, reason} RL_HIST_END();\r\n        return reason;\r\n    }\r\n\r\n    virtual bool is_signaled(debug_info_param info)\r\n    {\r\n        (void)info;\r\n        return state_;\r\n    }\r\n\r\n    virtual void memory_acquire(debug_info_param info)\r\n    {\r\n        (void)info;\r\n        sync_.acquire(ctx().threadx_);\r\n    }\r\n\r\n    virtual void* prepare_wait(debug_info_param info)\r\n    {\r\n        (void)info;\r\n        return &ws_;\r\n    }\r\n\r\n    RL_NOCOPY(event_data_impl);\r\n};\r\n\r\n\r\n\r\nclass generic_event : public win_waitable_object\r\n{\r\npublic:\r\n    generic_event()\r\n        : impl_()\r\n    {\r\n    }\r\n\r\n    generic_event(generic_event const&)\r\n        : impl_()\r\n    {\r\n    }\r\n\r\n    generic_event& operator = (generic_event const&)\r\n    {\r\n        return *this;\r\n    }\r\n\r\n    void init(bool manual_reset, bool initial_state, debug_info_param info)\r\n    {\r\n        context& c = ctx();\r\n        RL_ASSERT_IMPL(0 == impl_, test_result_double_initialization_of_event, \"\", info);\r\n        sign_.check(info);\r\n        impl_ = c.event_ctor(manual_reset, initial_state);\r\n    }\r\n\r\n    void deinit(debug_info_param info)\r\n    {\r\n        context& c = ctx();\r\n        check(info);\r\n        c.event_dtor(impl_);\r\n        impl_ = 0;\r\n    }\r\n\r\n    void set(debug_info_param info)\r\n    {\r\n        check(info);\r\n        impl_->set(info);\r\n    }\r\n\r\n    void reset(debug_info_param info)\r\n    {\r\n        check(info);\r\n        impl_->reset(info);\r\n    }\r\n\r\n    void pulse(debug_info_param info)\r\n    {\r\n        check(info);\r\n        impl_->pulse(info);\r\n    }\r\n\r\n    virtual sema_wakeup_reason wait(bool try_wait, bool is_timed, debug_info_param info)\r\n    {\r\n        check(info);\r\n        return impl_->wait(try_wait, is_timed, info);\r\n    }\r\n\r\n    virtual bool signal(debug_info_param info)\r\n    {\r\n        set(info);\r\n        return true;\r\n    }\r\n\r\nprivate:\r\n    event_data* impl_;\r\n    signature<0x3390eeaa> sign_;\r\n\r\n    event_data* check(debug_info_param info)\r\n    {\r\n        RL_ASSERT_IMPL(impl_, test_result_usage_of_non_initialized_event, \"\", info);\r\n        sign_.check(info);\r\n        return impl_;\r\n    }\r\n\r\n    virtual bool is_signaled(debug_info_param info)\r\n    {\r\n        return check(info)->is_signaled(info);\r\n    }\r\n\r\n    virtual void memory_acquire(debug_info_param info)\r\n    {\r\n        check(info)->memory_acquire(info);\r\n    }\r\n\r\n    virtual void* prepare_wait(debug_info_param info)\r\n    {\r\n        return check(info)->prepare_wait(info);\r\n    }\r\n};\r\n\r\n\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/stdlib/mutex.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_MUTEX_HPP\r\n#define RL_MUTEX_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"../base.hpp\"\r\n#include \"../context.hpp\"\r\n#include \"../thread.hpp\"\r\n#include \"../atomic.hpp\"\r\n#include \"../waitset.hpp\"\r\n#include \"../signature.hpp\"\r\n#include \"../sync_var.hpp\"\r\n#include \"../foreach.hpp\"\r\n#include \"semaphore.hpp\"\r\n\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\nstruct generic_mutex_data : nocopy<>\r\n{\r\n    virtual bool lock_exclusive(bool is_timed, debug_info_param info) = 0;\r\n    virtual bool try_lock_exclusive(debug_info_param info) = 0;\r\n    virtual void unlock_exclusive(debug_info_param info) = 0;\r\n    virtual void lock_shared(debug_info_param info) = 0;\r\n    virtual bool try_lock_shared(debug_info_param info) = 0;\r\n    virtual void unlock_shared(debug_info_param info) = 0;\r\n    virtual void unlock_exclusive_or_shared(debug_info_param info) = 0;\r\n    virtual bool is_signaled(debug_info_param info) = 0;\r\n    virtual void memory_acquire(debug_info_param info) = 0;\r\n    virtual void* prepare_wait(debug_info_param info) = 0;\r\n    virtual ~generic_mutex_data() {} // just to calm down gcc\r\n};\r\n\r\n\r\ntemplate<thread_id_t thread_count>\r\nclass generic_mutex_data_impl : public generic_mutex_data\r\n{\r\npublic:\r\n    struct event_t\r\n    {\r\n        enum type_e\r\n        {\r\n            type_lock,\r\n            type_unlock,\r\n            type_recursive_lock,\r\n            type_recursive_unlock,\r\n            type_failed_try_lock,\r\n            type_spuriously_failed_try_lock,\r\n            type_lock_shared,\r\n            type_unlock_shared,\r\n            type_recursive_lock_shared,\r\n            type_recursive_unlock_shared,\r\n            type_failed_try_lock_shared,\r\n            type_spuriously_failed_try_lock_shared,\r\n            type_wait,\r\n            type_destroying_owned_mutex,\r\n        };\r\n\r\n        generic_mutex_data_impl const* var_addr_;\r\n        type_e type_;\r\n\r\n        void output(std::ostream& s) const\r\n        {\r\n            s << \"<\" << std::hex << var_addr_ << std::dec << \"> mutex: \";\r\n            switch (type_)\r\n            {\r\n            case type_lock: s << \"exclusive lock\"; break;\r\n            case type_unlock: s << \"exclusive unlock\"; break;\r\n            case type_recursive_lock: s << \"recursive exclusive lock\"; break;\r\n            case type_recursive_unlock: s << \"recursive exclusive unlock\"; break;\r\n            case type_failed_try_lock: s << \"failed exclusive try lock\"; break;\r\n            case type_spuriously_failed_try_lock: s << \"spuriously failed exclusive try lock\"; break;\r\n            case type_lock_shared: s << \"shared lock\"; break;\r\n            case type_unlock_shared: s << \"shared unlock\"; break;\r\n            case type_recursive_lock_shared: s << \"recursive shared lock\"; break;\r\n            case type_recursive_unlock_shared: s << \"recursive shared unlock\"; break;\r\n            case type_failed_try_lock_shared: s << \"failed shared try lock\"; break;\r\n            case type_spuriously_failed_try_lock_shared: s << \"spuriously failed shared try lock\"; break;\r\n            case type_wait: s << \"blocking\"; break;\r\n            case type_destroying_owned_mutex: s << \"destroying owned mutex\"; break;\r\n            }\r\n        }\r\n    };\r\n\r\n    generic_mutex_data_impl(bool is_rw, bool is_exclusive_recursive, bool is_shared_recursive, bool failing_try_lock)\r\n        : is_rw_(is_rw)\r\n        , is_exclusive_recursive_(is_exclusive_recursive)\r\n        , is_shared_recursive_(is_shared_recursive)\r\n        , failing_try_lock_(failing_try_lock)\r\n        , exclusive_owner_(state_free)\r\n        , exclusive_recursion_count_(0)\r\n        , shared_lock_count_(0)\r\n        , try_lock_failed_()\r\n    {\r\n        context& c = ctx();\r\n        (void)c;\r\n        RL_VERIFY(false == c.invariant_executing);\r\n        foreach<thread_count>(shared_owner_, &assign_zero);\r\n    }\r\n\r\n    ~generic_mutex_data_impl()\r\n    {\r\n        context& c = ctx();\r\n        RL_VERIFY(false == c.invariant_executing);\r\n        if (exclusive_owner_ != state_free\r\n            || exclusive_waitset_\r\n            || shared_waitset_)\r\n        {\r\n            debug_info info = $;\r\n            RL_HIST(event_t) {this, event_t::type_destroying_owned_mutex} RL_HIST_END();\r\n            RL_ASSERT_IMPL(false, test_result_destroying_owned_mutex, \"\", $);\r\n        }\r\n    }\r\n\r\n    virtual bool lock_exclusive(bool is_timed, debug_info_param info)\r\n    {\r\n        context& c = ctx();\r\n        c.sched();\r\n        sign_.check(info);\r\n        RL_VERIFY(false == c.invariant_executing);\r\n\r\n        thread_id_t const my_id = c.threadx_->index_;\r\n\r\n        if (exclusive_owner_ == state_shared && shared_owner_[my_id])\r\n        {\r\n            RL_HIST(event_t) {this, event_t::type_lock} RL_HIST_END();\r\n            RL_ASSERT_IMPL(false, test_result_mutex_read_to_write_upgrade, \"\", info);\r\n        }\r\n\r\n        if (exclusive_owner_ == my_id)\r\n        {\r\n            RL_HIST(event_t) {this, event_t::type_recursive_lock} RL_HIST_END();\r\n            if (is_exclusive_recursive_)\r\n            {\r\n                exclusive_recursion_count_ += 1;\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                RL_ASSERT_IMPL(false, test_result_recursion_on_nonrecursive_mutex, \"\", info);\r\n            }\r\n        }\r\n\r\n        for (;;)\r\n        {\r\n            if (exclusive_owner_ == state_free)\r\n            {\r\n                RL_VERIFY(exclusive_recursion_count_ == 0);\r\n                //!!! in some implementation here must be acq_rel\r\n                sync_.acquire(c.threadx_);\r\n                exclusive_recursion_count_ = 1;\r\n                exclusive_owner_ = my_id;\r\n                RL_HIST(event_t) {this, event_t::type_lock} RL_HIST_END();\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                RL_VERIFY(my_id != exclusive_owner_);\r\n                RL_HIST(event_t) {this, event_t::type_wait} RL_HIST_END();\r\n                unpark_reason reason = exclusive_waitset_.park_current(c, is_timed, false, false, info);\r\n                RL_VERIFY(reason != unpark_reason_spurious);\r\n                if (reason == unpark_reason_timeout)\r\n                {\r\n                    sync_.acquire(c.threadx_);\r\n                    return false;\r\n                }\r\n            }\r\n\r\n            //??? c.sched();\r\n            //sign_.check(info);\r\n        }\r\n    }\r\n\r\n    virtual bool try_lock_exclusive(debug_info_param info)\r\n    {\r\n        context& c = ctx();\r\n        c.sched();\r\n        sign_.check(info);\r\n        RL_VERIFY(false == c.invariant_executing);\r\n\r\n        thread_id_t const my_id = c.threadx_->index_;\r\n\r\n        if (exclusive_owner_ == state_shared && shared_owner_[my_id])\r\n        {\r\n            RL_HIST(event_t) {this, event_t::type_lock} RL_HIST_END();\r\n            RL_ASSERT_IMPL(false, test_result_mutex_read_to_write_upgrade, \"\", info);\r\n        }\r\n\r\n        if (exclusive_owner_ == my_id)\r\n        {\r\n            RL_HIST(event_t) {this, event_t::type_recursive_lock} RL_HIST_END();\r\n            if (is_exclusive_recursive_)\r\n            {\r\n                exclusive_recursion_count_ += 1;\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                RL_ASSERT_IMPL(false, test_result_recursion_on_nonrecursive_mutex, \"\", info);\r\n            }\r\n        }\r\n\r\n        if (exclusive_owner_ == state_free)\r\n        {\r\n            RL_VERIFY(exclusive_recursion_count_ == 0);\r\n            //!!! probability rand\r\n            if (true == failing_try_lock_\r\n                && false == try_lock_failed_\r\n                && c.rand(2, sched_type_user))\r\n            {\r\n                try_lock_failed_ = true;\r\n                RL_HIST(event_t) {this, event_t::type_spuriously_failed_try_lock} RL_HIST_END();\r\n                return false;\r\n            }\r\n            else\r\n            {\r\n                sync_.acquire(c.threadx_);\r\n                exclusive_recursion_count_ = 1;\r\n                exclusive_owner_ = my_id;\r\n                RL_HIST(event_t) {this, event_t::type_lock} RL_HIST_END();\r\n                return true;\r\n            }\r\n        }\r\n        else\r\n        {\r\n            //!!! in some implementation here must be acquire\r\n            //sync_.acquire(c.threadx_);\r\n\r\n            RL_VERIFY(my_id != exclusive_owner_);\r\n            RL_HIST(event_t) {this, event_t::type_failed_try_lock} RL_HIST_END();\r\n            return false;\r\n        }\r\n    }\r\n\r\n    virtual void unlock_exclusive(debug_info_param info)\r\n    {\r\n        context& c = ctx();\r\n        c.sched();\r\n        sign_.check(info);\r\n        RL_VERIFY(false == c.invariant_executing);\r\n\r\n        thread_id_t const my_id = c.threadx_->index_;\r\n\r\n        if (exclusive_owner_ != my_id)\r\n        {\r\n            RL_HIST(event_t) {this, event_t::type_unlock} RL_HIST_END();\r\n            RL_ASSERT_IMPL(false, test_result_unlocking_mutex_wo_ownership, \"\", info);\r\n        }\r\n\r\n        exclusive_recursion_count_ -= 1;\r\n        if (exclusive_recursion_count_)\r\n        {\r\n            RL_VERIFY(is_exclusive_recursive_);\r\n            RL_HIST(event_t) {this, event_t::type_recursive_unlock} RL_HIST_END();\r\n            return;\r\n        }\r\n\r\n        sync_.release(c.threadx_);\r\n        exclusive_owner_ = state_free;\r\n        RL_VERIFY(exclusive_recursion_count_ == 0);\r\n\r\n        if (false == exclusive_waitset_.unpark_one(c, info))\r\n            shared_waitset_.unpark_all(c, info);\r\n\r\n        RL_HIST(event_t) {this, event_t::type_unlock} RL_HIST_END();\r\n    }\r\n\r\n    virtual void lock_shared(debug_info_param info)\r\n    {\r\n        RL_VERIFY(is_rw_);\r\n        context& c = ctx();\r\n        c.sched();\r\n        sign_.check(info);\r\n        RL_VERIFY(false == c.invariant_executing);\r\n\r\n        thread_id_t const my_id = c.threadx_->index_;\r\n\r\n        if (exclusive_owner_ == my_id)\r\n        {\r\n            RL_HIST(event_t) {this, event_t::type_lock_shared} RL_HIST_END();\r\n            RL_ASSERT_IMPL(false, test_result_mutex_write_to_read_upgrade, \"\", info);\r\n        }\r\n\r\n        if (exclusive_owner_ == state_shared && shared_owner_[my_id])\r\n        {\r\n            RL_HIST(event_t) {this, event_t::type_recursive_lock_shared} RL_HIST_END();\r\n            if (is_shared_recursive_)\r\n            {\r\n                shared_owner_[my_id] += 1;\r\n                shared_lock_count_ += 1;\r\n                return;\r\n            }\r\n            else\r\n            {\r\n                RL_ASSERT_IMPL(false, test_result_recursion_on_nonrecursive_mutex, \"\", info);\r\n            }\r\n        }\r\n\r\n        for (;;)\r\n        {\r\n            if ((exclusive_owner_ == state_free)\r\n                || (exclusive_owner_ == state_shared\r\n                    && false == exclusive_waitset_))\r\n            {\r\n                sync_.acquire(c.threadx_);\r\n                shared_owner_[my_id] += 1;\r\n                shared_lock_count_ += 1;\r\n                exclusive_owner_ = state_shared;\r\n                RL_HIST(event_t) {this, event_t::type_lock_shared} RL_HIST_END();\r\n                break;\r\n            }\r\n            else\r\n            {\r\n                RL_VERIFY(my_id != exclusive_owner_);\r\n                RL_HIST(event_t) {this, event_t::type_wait} RL_HIST_END();\r\n                shared_waitset_.park_current(c, false, false, false, info);\r\n            }\r\n\r\n            //??? c.sched();\r\n            //sign_.check(info);\r\n        }\r\n    }\r\n\r\n    virtual bool try_lock_shared(debug_info_param info)\r\n    {\r\n        RL_VERIFY(is_rw_);\r\n        context& c = ctx();\r\n        c.sched();\r\n        sign_.check(info);\r\n        RL_VERIFY(false == c.invariant_executing);\r\n\r\n        thread_id_t const my_id = c.threadx_->index_;\r\n\r\n        if (exclusive_owner_ == my_id)\r\n        {\r\n            RL_HIST(event_t) {this, event_t::type_lock_shared} RL_HIST_END();\r\n            RL_ASSERT_IMPL(false, test_result_mutex_write_to_read_upgrade, \"\", info);\r\n        }\r\n\r\n        if (exclusive_owner_ == state_shared && shared_owner_[my_id])\r\n        {\r\n            RL_HIST(event_t) {this, event_t::type_recursive_lock_shared} RL_HIST_END();\r\n            if (is_shared_recursive_)\r\n            {\r\n                shared_owner_[my_id] += 1;\r\n                shared_lock_count_ += 1;\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                RL_ASSERT_IMPL(false, test_result_recursion_on_nonrecursive_mutex, \"\", info);\r\n            }\r\n        }\r\n\r\n        if ((exclusive_owner_ == state_free)\r\n            || (exclusive_owner_ == state_shared\r\n                && false == exclusive_waitset_))\r\n        {\r\n            //!!! probability rand\r\n            if (true == failing_try_lock_\r\n                && false == try_lock_failed_\r\n                && c.rand(2, sched_type_user))\r\n            {\r\n                try_lock_failed_ = true;\r\n                RL_HIST(event_t) {this, event_t::type_spuriously_failed_try_lock_shared} RL_HIST_END();\r\n                return false;\r\n            }\r\n            else\r\n            {\r\n                sync_.acquire(c.threadx_);\r\n                shared_owner_[my_id] += 1;\r\n                shared_lock_count_ += 1;\r\n                exclusive_owner_ = state_shared;\r\n                RL_HIST(event_t) {this, event_t::type_lock_shared} RL_HIST_END();\r\n                return true;\r\n            }\r\n        }\r\n        else\r\n        {\r\n            RL_VERIFY(my_id != exclusive_owner_);\r\n            RL_HIST(event_t) {this, event_t::type_failed_try_lock_shared} RL_HIST_END();\r\n            return false;\r\n        }\r\n    }\r\n\r\n    virtual void unlock_shared(debug_info_param info)\r\n    {\r\n        RL_VERIFY(is_rw_);\r\n        context& c = ctx();\r\n        c.sched();\r\n        sign_.check(info);\r\n        RL_VERIFY(false == c.invariant_executing);\r\n\r\n        thread_id_t const my_id = c.threadx_->index_;\r\n\r\n        if (exclusive_owner_ != state_shared || 0 == shared_owner_[my_id])\r\n        {\r\n            RL_HIST(event_t) {this, event_t::type_unlock_shared} RL_HIST_END();\r\n            RL_ASSERT_IMPL(false, test_result_unlocking_mutex_wo_ownership, \"\", info);\r\n        }\r\n\r\n        RL_VERIFY(shared_lock_count_);\r\n        shared_owner_[my_id] -= 1;\r\n        shared_lock_count_ -= 1;\r\n        if (shared_lock_count_ != 0)\r\n        {\r\n            if (shared_owner_[my_id])\r\n            {\r\n                RL_VERIFY(is_shared_recursive_);\r\n                RL_HIST(event_t) {this, event_t::type_recursive_unlock_shared} RL_HIST_END();\r\n            }\r\n            else\r\n            {\r\n                sync_.release(c.threadx_);\r\n                RL_HIST(event_t) {this, event_t::type_unlock_shared} RL_HIST_END();\r\n            }\r\n            return;\r\n        }\r\n\r\n        sync_.release(c.threadx_);\r\n        exclusive_owner_ = state_free;\r\n\r\n        exclusive_waitset_.unpark_one(c, info);\r\n\r\n        RL_HIST(event_t) {this, event_t::type_unlock_shared} RL_HIST_END();\r\n    }\r\n\r\n    virtual void unlock_exclusive_or_shared(debug_info_param info)\r\n    {\r\n        if (exclusive_owner_ == ctx().threadx_->index_)\r\n            unlock_exclusive(info);\r\n        else\r\n            unlock_shared(info);\r\n    }\r\n\r\n    virtual bool is_signaled(debug_info_param info)\r\n    {\r\n        (void)info;\r\n        return (exclusive_owner_ == state_free);\r\n    }\r\n\r\n    virtual void memory_acquire(debug_info_param info)\r\n    {\r\n        (void)info;\r\n        sync_.acquire(ctx().threadx_);\r\n    }\r\n\r\n    virtual void* prepare_wait(debug_info_param info)\r\n    {\r\n        (void)info;\r\n        return &exclusive_waitset_;\r\n    }\r\n\r\nprivate:\r\n    static thread_id_t const state_shared = (thread_id_t)-1;\r\n    static thread_id_t const state_free = (thread_id_t)-2;\r\n\r\n    signature<0xbabaf1f1> sign_;\r\n    bool is_rw_;\r\n    bool is_exclusive_recursive_;\r\n    bool is_shared_recursive_;\r\n    bool failing_try_lock_;\r\n    sync_var<thread_count> sync_;\r\n    thread_id_t exclusive_owner_;\r\n    unsigned exclusive_recursion_count_;\r\n    waitset<thread_count> exclusive_waitset_;\r\n    waitset<thread_count> shared_waitset_;\r\n    timestamp_t shared_owner_ [thread_count];\r\n    unsigned shared_lock_count_;\r\n    bool try_lock_failed_;\r\n\r\n    RL_NOCOPY(generic_mutex_data_impl);\r\n};\r\n\r\n\r\n\r\n\r\ntemplate<typename type>\r\nclass generic_mutex : public win_waitable_object\r\n{\r\npublic:\r\n    generic_mutex()\r\n        : impl_()\r\n    {\r\n    }\r\n\r\n    generic_mutex(generic_mutex const&)\r\n        : impl_()\r\n    {\r\n    }\r\n\r\n    generic_mutex& operator = (generic_mutex const&)\r\n    {\r\n        return *this;\r\n    }\r\n\r\n    ~generic_mutex()\r\n    {\r\n    }\r\n\r\n    void init(bool is_rw, bool is_exclusive_recursive, bool is_shared_recursive, bool failing_try_lock, debug_info_param info)\r\n    {\r\n        context& c = ctx();\r\n        RL_ASSERT_IMPL(0 == impl_, test_result_double_initialization_of_mutex, \"\", info);\r\n        sign_.check(info);\r\n        impl_ = c.mutex_ctor(is_rw, is_exclusive_recursive, is_shared_recursive, failing_try_lock);\r\n    }\r\n\r\n    void deinit(debug_info_param info)\r\n    {\r\n        context& c = ctx();\r\n        check(info);\r\n        c.mutex_dtor(impl_);\r\n        impl_ = 0;\r\n    }\r\n\r\n    void lock(debug_info_param info)\r\n    {\r\n        lock_exclusive(info);\r\n    }\r\n\r\n    bool lock_exclusive_timed(debug_info_param info)\r\n    {\r\n        return check(info)->lock_exclusive(true, info);\r\n    }\r\n\r\n    void unlock(debug_info_param info)\r\n    {\r\n        unlock_exclusive(info);\r\n    }\r\n\r\n    void lock_exclusive(debug_info_param info)\r\n    {\r\n        check(info)->lock_exclusive(false, info);\r\n    }\r\n\r\n    bool try_lock_exclusive(debug_info_param info)\r\n    {\r\n        return check(info)->try_lock_exclusive(info);\r\n    }\r\n\r\n    void unlock_exclusive(debug_info_param info)\r\n    {\r\n        check(info)->unlock_exclusive(info);\r\n    }\r\n\r\n    void lock_shared(debug_info_param info)\r\n    {\r\n        check(info)->lock_shared(info);\r\n    }\r\n\r\n    bool try_lock_shared(debug_info_param info)\r\n    {\r\n        return check(info)->try_lock_shared(info);\r\n    }\r\n\r\n    void unlock_shared(debug_info_param info)\r\n    {\r\n        check(info)->unlock_shared(info);\r\n    }\r\n\r\n    void unlock_exclusive_or_shared(debug_info_param info)\r\n    {\r\n        check(info)->unlock_exclusive_or_shared(info);\r\n    }\r\n\r\nprivate:\r\n    generic_mutex_data* impl_;\r\n    signature<0x6A6cB03A> sign_;\r\n\r\n    generic_mutex_data* check(debug_info_param info)\r\n    {\r\n        RL_ASSERT_IMPL(impl_, test_result_usage_of_non_initialized_mutex, \"\", info);\r\n        sign_.check(info);\r\n        return impl_;\r\n    }\r\n\r\n    virtual sema_wakeup_reason wait(bool try_wait, bool is_timed, debug_info_param info)\r\n    {\r\n        if (try_wait)\r\n        {\r\n            if (check(info)->try_lock_exclusive(info))\r\n                return sema_wakeup_reason_success;\r\n            else\r\n                return sema_wakeup_reason_failed;\r\n        }\r\n        else\r\n        {\r\n            if (check(info)->lock_exclusive(is_timed, info))\r\n                return sema_wakeup_reason_success;\r\n            else\r\n                return sema_wakeup_reason_timeout;\r\n\r\n        }\r\n    }\r\n\r\n    virtual bool signal(debug_info_param info)\r\n    {\r\n        check(info)->unlock_exclusive(info);\r\n        return true;\r\n    }\r\n\r\n    virtual bool is_signaled(debug_info_param info)\r\n    {\r\n        return check(info)->is_signaled(info);\r\n    }\r\n\r\n    virtual void memory_acquire(debug_info_param info)\r\n    {\r\n        check(info)->memory_acquire(info);\r\n    }\r\n\r\n    virtual void* prepare_wait(debug_info_param info)\r\n    {\r\n        return check(info)->prepare_wait(info);\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\ntemplate<typename tag, bool is_recursive>\r\nclass std_generic_mutex : generic_mutex<tag>, nocopy<>\r\n{\r\npublic:\r\n    std_generic_mutex()\r\n    {\r\n        generic_mutex<tag>::init(false, is_recursive, false, true, $);\r\n    }\r\n\r\n    ~std_generic_mutex()\r\n    {\r\n        generic_mutex<tag>::deinit($);\r\n    }\r\n\r\n    void lock(debug_info_param info)\r\n    {\r\n        generic_mutex<tag>::lock_exclusive(info);\r\n    }\r\n\r\n    bool try_lock(debug_info_param info)\r\n    {\r\n        return generic_mutex<tag>::try_lock_exclusive(info);\r\n    }\r\n\r\n    void unlock(debug_info_param info)\r\n    {\r\n        generic_mutex<tag>::unlock_exclusive(info);\r\n    }\r\n};\r\n\r\n\r\nstruct mutex_tag_std;\r\ntypedef std_generic_mutex<mutex_tag_std, false> mutex;\r\n\r\nstruct mutex_tag_std_recursive;\r\ntypedef std_generic_mutex<mutex_tag_std_recursive, true> recursive_mutex;\r\n\r\n\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/stdlib/pthread.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_PTHREAD_HPP\r\n#define RL_PTHREAD_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"mutex.hpp\"\r\n#include \"condition_variable.hpp\"\r\n#include \"semaphore.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\nenum RL_POSIX_ERROR_CODE\r\n{\r\n    RL_SUCCESS,\r\n    RL_EINVAL,\r\n    RL_ETIMEDOUT,\r\n    RL_EBUSY,\r\n    RL_EINTR,\r\n    RL_EAGAIN,\r\n    RL_EWOULDBLOCK,\r\n};\r\n\r\n\r\ninline void rl_sched_yield(debug_info_param info)\r\n{\r\n    yield(1, info);\r\n}\r\n\r\n\r\ntypedef win_waitable_object* rl_pthread_t;\r\ntypedef void* rl_pthread_attr_t;\r\n\r\ninline int rl_pthread_create(rl_pthread_t* th, rl_pthread_attr_t* attr, void* (*func) (void*), void* arg, debug_info_param info)\r\n{\r\n    (void)attr;\r\n    (void)info;//!!!\r\n    RL_VERIFY(th && func);\r\n    th[0] = ctx().create_thread(func, arg);\r\n    return 0;\r\n}\r\n\r\ninline int rl_pthread_join(rl_pthread_t th, void** res, debug_info_param info)\r\n{\r\n    RL_VERIFY(th && res);\r\n    res[0] = 0; //!!!\r\n    th->wait(false, false, info);\r\n    return 0;\r\n}\r\n\r\n\r\n\r\n\r\nstruct sem_tag_pthread;\r\ntypedef semaphore<sem_tag_pthread> rl_sem_t;\r\n\r\ninline int rl_sem_init(rl_sem_t* sema, int /*pshared*/, unsigned int initial_count, debug_info_param info)\r\n{\r\n    RL_VERIFY(initial_count >= 0);\r\n    sema->init(true, initial_count, INT_MAX, info);\r\n    return 0;\r\n}\r\n\r\ninline int rl_sem_destroy(rl_sem_t* sema, debug_info_param info)\r\n{\r\n    sema->deinit(info);\r\n    return 0;\r\n}\r\n\r\ninline int rl_sem_wait(rl_sem_t* sema, debug_info_param info)\r\n{\r\n    sema_wakeup_reason reason = sema->wait(false, false, info);\r\n    if (reason == sema_wakeup_reason_success)\r\n        return 0;\r\n    if (reason == sema_wakeup_reason_spurious)\r\n    {\r\n        set_errno(RL_EINTR);\r\n        return -1;\r\n    }\r\n    RL_VERIFY(false);\r\n    return -1;\r\n}\r\n\r\ninline int rl_sem_trywait(rl_sem_t* sema, debug_info_param info)\r\n{\r\n    sema_wakeup_reason reason = sema->wait(true, false, info);\r\n    if (sema_wakeup_reason_success == reason)\r\n        return 0;\r\n    if (sema_wakeup_reason_failed == reason)\r\n    {\r\n        set_errno(RL_EAGAIN);\r\n        return -1;\r\n    }\r\n    if (sema_wakeup_reason_spurious == reason)\r\n    {\r\n        set_errno(RL_EINTR);\r\n        return -1;\r\n    }\r\n    RL_VERIFY(false);\r\n    return -1;\r\n}\r\n\r\ninline int rl_sem_post(rl_sem_t* sema, debug_info_param info)\r\n{\r\n    unsigned prev_cout = 0;\r\n    bool result = sema->post(1, prev_cout, info);\r\n    RL_VERIFY(result);\r\n    (void)result;\r\n    return 0;\r\n}\r\n\r\ninline int rl_sem_getvalue(rl_sem_t* sema, int* value, debug_info_param info)\r\n{\r\n    RL_VERIFY(value);\r\n    if (value)\r\n        value[0] = sema->get_value(info);\r\n    return 0;\r\n}\r\n\r\n\r\n\r\n\r\nstruct mutex_tag_pthread_mtx;\r\ntypedef generic_mutex<mutex_tag_pthread_mtx> rl_pthread_mutex_t;\r\n\r\nstruct rl_pthread_mutexattr_t\r\n{\r\n    bool is_recursive_;\r\n};\r\n\r\nenum RL_PTHREAD_MUTEX_TYPE\r\n{\r\n    RL_PTHREAD_MUTEX_NORMAL,\r\n    RL_PTHREAD_MUTEX_ERRORCHECK,\r\n    RL_PTHREAD_MUTEX_RECURSIVE,\r\n    RL_PTHREAD_MUTEX_DEFAULT,\r\n};\r\n\r\ninline int rl_pthread_mutexattr_init(rl_pthread_mutexattr_t* attr, debug_info_param info)\r\n{\r\n    (void)info;\r\n    if (0 == attr)\r\n        return RL_EINVAL;\r\n    attr->is_recursive_ = false;\r\n    return 0;\r\n}\r\n\r\ninline int rl_pthread_mutexattr_destroy(rl_pthread_mutexattr_t* attr, debug_info_param info)\r\n{\r\n    (void)info;\r\n    if (0 == attr)\r\n        return RL_EINVAL;\r\n    return 0;\r\n}\r\n\r\ninline int rl_pthread_mutexattr_settype(rl_pthread_mutexattr_t* attr, int type, debug_info_param info)\r\n{\r\n    (void)info;\r\n    if (0 == attr)\r\n        return RL_EINVAL;\r\n    if (RL_PTHREAD_MUTEX_RECURSIVE == type)\r\n        attr->is_recursive_ = true;\r\n    return 0;\r\n}\r\n\r\ninline int rl_pthread_mutex_init(rl_pthread_mutex_t* m, rl_pthread_mutexattr_t const* attr, debug_info_param info)\r\n{\r\n    bool is_recursive = attr && attr->is_recursive_;\r\n    m->init(false, is_recursive, false, false, info);\r\n    return 0;\r\n}\r\n\r\ninline int rl_pthread_mutex_destroy(rl_pthread_mutex_t* m, debug_info_param info)\r\n{\r\n    m->deinit(info);\r\n    return 0;\r\n}\r\n\r\ninline int rl_pthread_mutex_lock(rl_pthread_mutex_t* m, debug_info_param info)\r\n{\r\n    m->lock_exclusive(info);\r\n    return 0;\r\n}\r\n\r\ninline int rl_pthread_mutex_timedlock(rl_pthread_mutex_t* m, const void* abs_timeout, debug_info_param info)\r\n{\r\n    (void)abs_timeout;\r\n    bool rv = m->lock_exclusive_timed(info);\r\n    return rv ? 0 : RL_ETIMEDOUT;\r\n}\r\n\r\ninline int rl_pthread_mutex_try_lock(rl_pthread_mutex_t* m, debug_info_param info)\r\n{\r\n    return m->try_lock_exclusive(info) ? 0 : 1;\r\n}\r\n\r\ninline int rl_pthread_mutex_unlock(rl_pthread_mutex_t* m, debug_info_param info)\r\n{\r\n    m->unlock_exclusive(info);\r\n    return 0;\r\n}\r\n\r\n\r\n\r\nstruct mutex_tag_pthread_rwlock;\r\ntypedef generic_mutex<mutex_tag_pthread_rwlock> rl_pthread_rwlock_t;\r\n\r\ninline int rl_pthread_rwlock_init(rl_pthread_rwlock_t* lock, void const* /*attr*/, debug_info_param info)\r\n{\r\n    lock->init(true, false, true, false, info);\r\n    return 0;\r\n}\r\n\r\ninline int rl_pthread_rwlock_destroy(rl_pthread_rwlock_t* lock, debug_info_param info)\r\n{\r\n    lock->deinit(info);\r\n    return 0;\r\n}\r\n\r\ninline int rl_pthread_rwlock_rdlock(rl_pthread_rwlock_t* lock, debug_info_param info)\r\n{\r\n    lock->lock_shared(info);\r\n    return 0;\r\n}\r\n\r\ninline int rl_pthread_rwlock_tryrdlock(rl_pthread_rwlock_t* lock, debug_info_param info)\r\n{\r\n    bool res = lock->try_lock_shared(info);\r\n    return res ? 0 : RL_EBUSY;\r\n}\r\n\r\ninline int rl_pthread_rwlock_wrlock(rl_pthread_rwlock_t* lock, debug_info_param info)\r\n{\r\n    lock->lock_exclusive(info);\r\n    return 0;\r\n}\r\n\r\ninline int rl_pthread_rwlock_trywrlock(rl_pthread_rwlock_t* lock, debug_info_param info)\r\n{\r\n    bool res = lock->try_lock_exclusive(info);\r\n    return res ? 0 : RL_EBUSY;\r\n}\r\n\r\ninline int rl_pthread_rwlock_unlock(rl_pthread_rwlock_t* lock, debug_info_param info)\r\n{\r\n    lock->unlock_exclusive_or_shared(info);\r\n    return 0;\r\n}\r\n\r\n\r\n\r\n\r\nstruct condvar_tag_pthread;\r\ntypedef condvar<condvar_tag_pthread> rl_pthread_cond_t;\r\ntypedef int rl_pthread_condattr_t;\r\n\r\ninline int rl_pthread_cond_init(rl_pthread_cond_t* cv, rl_pthread_condattr_t* /*condattr*/, debug_info_param info)\r\n{\r\n    cv->init(true, info);\r\n    return 0;\r\n}\r\n\r\ninline int rl_pthread_cond_destroy(rl_pthread_cond_t* cv, debug_info_param info)\r\n{\r\n    cv->deinit(info);\r\n    return 0;\r\n}\r\n\r\ninline int rl_pthread_cond_broadcast(rl_pthread_cond_t* cv, debug_info_param info)\r\n{\r\n    cv->notify_all(info);\r\n    return 0;\r\n}\r\n\r\ninline int rl_pthread_cond_signal(rl_pthread_cond_t* cv, debug_info_param info)\r\n{\r\n    cv->notify_one(info);\r\n    return 0;\r\n}\r\n\r\ninline int rl_pthread_cond_timedwait(rl_pthread_cond_t* cv, rl_pthread_mutex_t* m, void const* /*timespec*/, debug_info_param info)\r\n{\r\n    sema_wakeup_reason res = cv->wait(*m, true, info);\r\n    if (res == sema_wakeup_reason_success)\r\n        return 0;\r\n    else if (res == sema_wakeup_reason_timeout)\r\n        return RL_ETIMEDOUT;\r\n    else if (res == sema_wakeup_reason_spurious)\r\n        return RL_EINTR;\r\n    else \r\n        return RL_EINVAL;\r\n}\r\n\r\ninline int rl_pthread_cond_wait(rl_pthread_cond_t* cv, rl_pthread_mutex_t* m, debug_info_param info)\r\n{\r\n    sema_wakeup_reason res = cv->wait(*m, false, info);\r\n    if (res == sema_wakeup_reason_success)\r\n        return 0;\r\n    else if (res == sema_wakeup_reason_spurious)\r\n        return RL_EINTR;\r\n    else \r\n        return RL_EINVAL;\r\n}\r\n\r\n\t\r\n\t\r\n\t\r\nenum RL_FUTEX_OP\r\n{\r\n    RL_FUTEX_WAIT,\r\n    RL_FUTEX_WAKE,\r\n};\r\n\r\ninline int rl_int_futex_impl(context& c,\r\n                    atomic<int>* uaddr,\r\n                    int op,\r\n                    int val,\r\n                    struct timespec const* timeout,\r\n                    atomic<int>* uaddr2,\r\n                    int val3,\r\n                    debug_info_param info)\r\n{\r\n    (void)uaddr2;\r\n    (void)val3;\r\n    if (op == RL_FUTEX_WAIT)\r\n    {\r\n        c.sched();\r\n        c.atomic_thread_fence_seq_cst();\r\n        int v0;\r\n        {\r\n            preemption_disabler pd (c);\r\n            v0 = uaddr->load(mo_acquire, info);\r\n        }\r\n\tif (v0 != val)\r\n            return RL_EWOULDBLOCK;\r\n        unpark_reason reason = uaddr->wait(c, timeout != 0, true, info);\r\n        if (reason == unpark_reason_normal)\r\n            return 0;\r\n        else if (reason == unpark_reason_timeout)\r\n            return RL_ETIMEDOUT;\r\n        else if (reason == unpark_reason_spurious)\r\n            return RL_EINTR;\r\n        RL_VERIFY(false);\r\n        return RL_EINVAL;\r\n    }\r\n    else if (op == RL_FUTEX_WAKE)\r\n    {\r\n        if (val <= 0)\r\n            return 0;\r\n\r\n        c.sched();\r\n        c.atomic_thread_fence_seq_cst();\r\n        return uaddr->wake(c, val, info);\r\n    }\r\n    else\r\n    {\r\n        return RL_EINVAL;\r\n    }\r\n}\r\n\r\n    struct futex_event\r\n    {\r\n        void* addr_;\r\n        int   op_;\r\n        int   val_;\r\n        bool  timeout_;\r\n        int   res_;\r\n\r\n        void output(std::ostream& s) const\r\n        {\r\n            s << \"<\" << std::hex << addr_ << std::dec << \"> futex(\"\r\n              << (op_ == RL_FUTEX_WAIT ? \"FUTEX_WAIT\" : op_ == RL_FUTEX_WAKE ? \"FUTEX_WAKE\" : \"UNSUPPORTED\") << \", \"\r\n              << val_ << \", \" << timeout_ << \") = \";\r\n            if (op_ == RL_FUTEX_WAKE)\r\n                s << res_;\r\n            else\r\n                s << (res_ == RL_EWOULDBLOCK ? \"EWOULDBLOCK\" : res_ == RL_ETIMEDOUT ? \"ETIMEDOUT\" : res_ == RL_EINTR ? \"EINTR\" : \"UNKNOWN\");\r\n        }\r\n    };\r\n\t\r\ninline int rl_futex(atomic<int>* uaddr,\r\n                    int op,\r\n                    int val,\r\n                    struct timespec const* timeout,\r\n                    atomic<int>* uaddr2,\r\n                    int val3,\r\n                    debug_info_param info)\r\n{\r\n    context& c = ctx();\r\n    int res = rl_int_futex_impl(c, uaddr, op, val, timeout, uaddr2, val3, info);\r\n    RL_HIST(futex_event) {uaddr, op, val, timeout != 0, res} RL_HIST_END();\r\n    return res;    \r\n}\r\n\r\n}\r\n\r\n\r\n\r\n#ifdef EINVAL\r\n#   undef EINVAL\r\n#endif\r\n#define EINVAL                  rl::RL_EINVAL\r\n\r\n#ifdef ETIMEDOUT\r\n#   undef ETIMEDOUT\r\n#endif\r\n#define ETIMEDOUT               rl::RL_ETIMEDOUT\r\n\r\n#ifdef EBUSY\r\n#   undef EBUSY\r\n#endif\r\n#define EBUSY                   rl::RL_EBUSY\r\n\r\n#ifdef EINTR\r\n#   undef EINTR\r\n#endif\r\n#define EINTR                   rl::RL_EINTR\r\n\r\n#ifdef EAGAIN\r\n#   undef EAGAIN\r\n#endif\r\n#define EAGAIN                  rl::RL_EAGAIN\r\n\r\n#ifdef EWOULDBLOCK\r\n#   undef EWOULDBLOCK\r\n#endif\r\n#define EWOULDBLOCK                  rl::RL_EWOULDBLOCK\r\n\r\n#define sched_yield() \\\r\n rl::rl_sched_yield($)\r\n\r\n#define pthread_yield() \\\r\n rl::rl_sched_yield($)\r\n\r\n\r\n\r\n#define pthread_t rl::rl_pthread_t\r\n#define pthread_attr_t rl::rl_pthread_attr_t\r\n\r\n#define pthread_create(th, attr, func, arg) \\\r\n rl::rl_pthread_create(th, attr, func, arg, $)\r\n\r\n#define pthread_join(th, res) \\\r\n rl::rl_pthread_join(th, res, $)\r\n\r\n\r\n\r\n\r\n#define sem_t rl::rl_sem_t\r\n\r\n#define sem_init(sema, pshared, initial_count)\\\r\n rl::rl_sem_init(sema, pshared, initial_count, $)\r\n\r\n#define sem_destroy(sema)\\\r\n rl::rl_sem_destroy(sema, $)\r\n\r\n#define sem_wait(sema)\\\r\n rl::rl_sem_wait(sema, $)\r\n\r\n#define sem_trywait(sema)\\\r\n rl::rl_sem_trywait(sema, $)\r\n\r\n#define sem_post(sema)\\\r\nrl::rl_sem_post(sema, $)\r\n\r\n#define sem_getvalue(sema, pvalue)\\\r\n rl::rl_sem_getvalue(sema, pvalue, $)\r\n\r\n\r\n\r\n\r\n\r\n#define pthread_mutex_t             rl::rl_pthread_mutex_t\r\n#define pthread_mutexattr_t         rl::rl_pthread_mutexattr_t\r\n\r\n#ifdef PTHREAD_MUTEX_NORMAL\r\n#   undef PTHREAD_MUTEX_NORMAL\r\n#   undef PTHREAD_MUTEX_ERRORCHECK\r\n#   undef PTHREAD_MUTEX_RECURSIVE\r\n#   undef PTHREAD_MUTEX_DEFAULT\r\n#endif\r\n\r\n#define PTHREAD_MUTEX_NORMAL        rl::RL_PTHREAD_MUTEX_NORMAL\r\n#define PTHREAD_MUTEX_ERRORCHECK    rl::RL_PTHREAD_MUTEX_ERRORCHECK\r\n#define PTHREAD_MUTEX_RECURSIVE     rl::RL_PTHREAD_MUTEX_RECURSIVE\r\n#define PTHREAD_MUTEX_DEFAULT       rl::RL_PTHREAD_MUTEX_DEFAULT\r\n\r\n#define pthread_mutexattr_init(attr) \\\r\n rl::rl_pthread_mutexattr_init(attr, $)\r\n\r\n#define pthread_mutexattr_destroy(attr) \\\r\n rl::rl_pthread_mutexattr_destroy(attr, $)\r\n\r\n#define pthread_mutexattr_settype(attr, type) \\\r\n rl::rl_pthread_mutexattr_settype(attr, type, $)\r\n\r\n#define pthread_mutex_init(m, attr) \\\r\n rl::rl_pthread_mutex_init(m, attr, $)\r\n\r\n#define pthread_mutex_destroy(m) \\\r\n rl::rl_pthread_mutex_destroy(m, $)\r\n\r\n#define pthread_mutex_lock(m) \\\r\n rl::rl_pthread_mutex_lock(m, $)\r\n\r\n#define pthread_mutex_timedlock(m, abs_timeout) \\\r\n rl::rl_pthread_mutex_timedlock(m, abs_timeout, $)\r\n\r\n#define pthread_mutex_try_lock(m) \\\r\n rl::rl_pthread_mutex_try_lock(m, $)\r\n\r\n#define pthread_mutex_unlock(m) \\\r\n rl::rl_pthread_mutex_unlock(m, $)\r\n\r\n#define pthread_rwlock_t rl::rl_pthread_rwlock_t\r\n\r\n#define pthread_rwlock_init(lock, attr) \\\r\n rl::rl_pthread_rwlock_init(lock, attr, $)\r\n\r\n#define pthread_rwlock_destroy(lock) \\\r\n rl::rl_pthread_rwlock_destroy(lock, $)\r\n\r\n#define pthread_rwlock_rdlock(lock) \\\r\n rl::rl_pthread_rwlock_rdlock(lock, $)\r\n\r\n#define pthread_rwlock_tryrdlock(lock) \\\r\n rl::rl_pthread_rwlock_tryrdlock(lock, $)\r\n\r\n#define pthread_rwlock_wrlock(lock) \\\r\n rl::rl_pthread_rwlock_wrlock(lock, $)\r\n\r\n#define pthread_rwlock_trywrlock(lock) \\\r\n rl::rl_pthread_rwlock_trywrlock(lock, $)\r\n\r\n#define pthread_rwlock_unlock(lock) \\\r\n rl::rl_pthread_rwlock_unlock(lock, $)\r\n\r\n\r\n\r\n\r\n#define pthread_cond_t rl::rl_pthread_cond_t\r\n#define pthread_condattr_t rl::rl_pthread_condattr_t\r\n\r\n#define pthread_cond_init(cv, condattr) \\\r\n rl::rl_pthread_cond_init(cv, condattr, $)\r\n\r\n#define pthread_cond_destroy(cv) \\\r\n rl::rl_pthread_cond_destroy(cv, $)\r\n\r\n#define pthread_cond_broadcast(cv) \\\r\n rl::rl_pthread_cond_broadcast(cv, $)\r\n\r\n#define pthread_cond_signal(cv) \\\r\n rl::rl_pthread_cond_signal(cv, $)\r\n\r\n#define pthread_cond_timedwait(cv, m, timespec) \\\r\n rl::rl_pthread_cond_timedwait(cv, m, timespec, $)\r\n\r\n#define pthread_cond_wait(cv, m) \\\r\n rl::rl_pthread_cond_wait(cv, m, $)\r\n\r\n\r\n\r\n#ifdef FUTEX_WAKE\r\n#   undef FUTEX_WAKE\r\n#endif\r\n#define FUTEX_WAKE                  rl::RL_FUTEX_WAKE\r\n\r\n#ifdef FUTEX_WAIT\r\n#   undef FUTEX_WAIT\r\n#endif\r\n#define FUTEX_WAIT                  rl::RL_FUTEX_WAIT\r\n\r\n#define futex(uaddr, op, val, timeout, uaddr2, val3) \\\r\n rl::rl_futex(uaddr, op, val, timeout, uaddr2, val3, $)\r\n\r\n#endif\r\n\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/stdlib/semaphore.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_SEMAPHORE_HPP\r\n#define RL_SEMAPHORE_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"../base.hpp\"\r\n#include \"../context_base.hpp\"\r\n#include \"../sync_var.hpp\"\r\n#include \"../waitset.hpp\"\r\n#include \"../signature.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\nenum sema_wakeup_reason\r\n{\r\n    sema_wakeup_reason_success,\r\n    sema_wakeup_reason_failed,\r\n    sema_wakeup_reason_timeout,\r\n    sema_wakeup_reason_spurious,\r\n};\r\n\r\nstruct win_object\r\n{\r\n    virtual void deinit(debug_info_param info) = 0;\r\n    virtual ~win_object() {}\r\n};\r\n\r\nstruct win_waitable_object : win_object\r\n{\r\n    virtual sema_wakeup_reason wait(bool try_wait, bool is_timed, debug_info_param info) = 0;\r\n    virtual bool signal(debug_info_param info) = 0;\r\n\r\n    virtual bool is_signaled(debug_info_param info) = 0;\r\n    virtual void memory_acquire(debug_info_param info) = 0;\r\n    virtual void* prepare_wait(debug_info_param info) = 0;\r\n};\r\n\r\n\r\n\r\n\r\nstruct sema_data\r\n{\r\n    virtual sema_wakeup_reason wait(bool try_wait, bool is_timed, debug_info_param info) = 0;\r\n    virtual bool post(unsigned count, unsigned& prev_count, debug_info_param info) = 0;\r\n    virtual int get_value(debug_info_param info) = 0;\r\n    virtual bool is_signaled(debug_info_param info) = 0;\r\n    virtual void memory_acquire(debug_info_param info) = 0;\r\n    virtual void* prepare_wait(debug_info_param info) = 0;\r\n    virtual ~sema_data() {} // just to calm down gcc\r\n};\r\n\r\n\r\n\r\n\r\ntemplate<thread_id_t thread_count>\r\nclass sema_data_impl : public sema_data\r\n{\r\npublic:\r\n    sema_data_impl(bool spurious_wakeups, unsigned initial_count, unsigned max_count)\r\n        : spurious_wakeups_(spurious_wakeups)\r\n        , count_(initial_count)\r\n        , max_count_(max_count)\r\n    {\r\n        RL_VERIFY(max_count <= INT_MAX);\r\n    }\r\n\r\n    ~sema_data_impl()\r\n    {\r\n        //!!! detect destruction with waiters\r\n    }\r\n\r\n    struct wait_event\r\n    {\r\n        sema_data_impl*         addr_;\r\n        bool                    try_wait_;\r\n        bool                    is_timed_;\r\n        unsigned                count_;\r\n        sema_wakeup_reason      reason_;\r\n\r\n        void output(std::ostream& s) const\r\n        {\r\n            s << \"<\" << std::hex << addr_ << std::dec << \"> semaphore: \";\r\n            if (try_wait_)\r\n                s << \"try_wait \";\r\n            else if (is_timed_)\r\n                s << \"timed wait \";\r\n            else\r\n                s << \"wait \";\r\n\r\n            if (reason_ == sema_wakeup_reason_success)\r\n                s << \"succeeded \";\r\n            else if (reason_ == sema_wakeup_reason_failed)\r\n                s << \"failed \";\r\n            else if (reason_ == sema_wakeup_reason_timeout)\r\n                s << \"timed out \";\r\n            else if (reason_ == sema_wakeup_reason_spurious)\r\n                s << \"spuriously failed \";\r\n\r\n            s << \"new_count=\" << count_;\r\n        }\r\n    };\r\n\r\n    struct post_event\r\n    {\r\n        sema_data_impl*         addr_;\r\n        unsigned                value_;\r\n        unsigned                count_;\r\n        bool                    result_;\r\n        thread_id_t             unblocked_;\r\n\r\n        void output(std::ostream& s) const\r\n        {\r\n            s << \"<\" << std::hex << addr_ << std::dec << \"> semaphore: \";\r\n            if (result_)\r\n                s << \"post \";\r\n            else\r\n                s << \"post FAILED \";\r\n\r\n            s << \"value=\" << value_;\r\n            s << \" new_count=\" << count_;\r\n            s << \" unblocked=\" << unblocked_;\r\n        }\r\n    };\r\n\r\n    struct get_value_event\r\n    {\r\n        sema_data_impl* addr_;\r\n        unsigned count_;\r\n\r\n        void output(std::ostream& s) const\r\n        {\r\n            s << \"<\" << std::hex << addr_ << std::dec << \"> semaphore: \";\r\n            s << \"get_value count=\" << count_;\r\n        }\r\n    };\r\n\r\n    virtual sema_wakeup_reason wait(bool try_wait,\r\n                                    bool is_timed,\r\n                                    debug_info_param info)\r\n    {\r\n        context& c = ctx();\r\n        c.sched();\r\n        sign_.check(info);\r\n\r\n        sema_wakeup_reason reason = sema_wakeup_reason_success;\r\n        for (;;)\r\n        {\r\n            if (count_)\r\n            {\r\n                count_ -= 1;\r\n                sync_.acq_rel(c.threadx_);\r\n                reason = sema_wakeup_reason_success;\r\n                break;\r\n            }\r\n\r\n            if (try_wait)\r\n            {\r\n                sync_.acquire(c.threadx_);\r\n                reason = sema_wakeup_reason_failed;\r\n                break;\r\n            }\r\n\r\n            unpark_reason wr = ws_.park_current(c, is_timed, spurious_wakeups_, true, info);\r\n            if (unpark_reason_timeout == wr)\r\n            {\r\n                RL_VERIFY(is_timed);\r\n                sync_.acquire(c.threadx_);\r\n                reason = sema_wakeup_reason_timeout;\r\n                break;\r\n            }\r\n            else if (unpark_reason_spurious == wr)\r\n            {\r\n                RL_VERIFY(spurious_wakeups_);\r\n                sync_.acquire(c.threadx_);\r\n                reason = sema_wakeup_reason_spurious;\r\n                break;\r\n            }\r\n            else if (unpark_reason_normal == wr)\r\n            {\r\n                RL_VERIFY(count_ > 0);\r\n                count_ -= 1;\r\n                sync_.acq_rel(c.threadx_);\r\n                c.switch_back(info);\r\n                reason = sema_wakeup_reason_success;\r\n                break;\r\n            }\r\n            RL_VERIFY(false);\r\n        }\r\n\r\n        RL_HIST(wait_event) {this, try_wait, is_timed, count_, reason} RL_HIST_END();\r\n        return reason;\r\n    }\r\n\r\n    virtual bool post(unsigned count, unsigned& prev_count, debug_info_param info)\r\n    {\r\n        context& c = ctx();\r\n        c.sched();\r\n        sign_.check(info);\r\n\r\n        bool result = false;\r\n        prev_count = count_;\r\n        thread_id_t unblocked = 0;\r\n        if (false == (count >= INT_MAX || count + count_ > max_count_))\r\n        {\r\n            result = true;\r\n            count_ += count;\r\n            sync_.acq_rel(c.threadx_);\r\n            for (unsigned i = 0; i != count; ++i)\r\n            {\r\n                if (false == ws_.unpark_one(c, info))\r\n                    break;\r\n                unblocked += 1;\r\n            }\r\n        }\r\n        else\r\n        {\r\n            sync_.acquire(c.threadx_);\r\n        }\r\n        RL_HIST(post_event) {this, count, count_, result, unblocked} RL_HIST_END();\r\n        return result;\r\n    }\r\n\r\n    virtual int get_value(debug_info_param info)\r\n    {\r\n        context& c = ctx();\r\n        c.sched();\r\n        sign_.check(info);\r\n        \r\n        RL_VERIFY(count_ <= INT_MAX);\r\n        int result = (int)count_ - ws_.size();\r\n        sync_.acquire(c.threadx_);\r\n\r\n        RL_HIST(get_value_event) {this, (unsigned)result} RL_HIST_END();\r\n        return result;\r\n    }\r\n\r\nprivate:\r\n    signature<0xaabb6634> sign_;\r\n    bool const spurious_wakeups_;\r\n    unsigned count_;\r\n    unsigned const max_count_;\r\n    waitset<thread_count> ws_;\r\n    sync_var<thread_count> sync_;\r\n\r\n    virtual bool is_signaled(debug_info_param info)\r\n    {\r\n        (void)info;\r\n        return count_ > 0;\r\n    }\r\n\r\n    virtual void memory_acquire(debug_info_param info)\r\n    {\r\n        (void)info;\r\n        sync_.acquire(ctx().threadx_);\r\n    }\r\n\r\n    virtual void* prepare_wait(debug_info_param info)\r\n    {\r\n        (void)info;\r\n        return &ws_;\r\n    }\r\n\r\n    RL_NOCOPY(sema_data_impl);\r\n};\r\n\r\n\r\n\r\ntemplate<typename tag_t>\r\nclass semaphore : public win_waitable_object\r\n{\r\npublic:\r\n    semaphore()\r\n        : impl_()\r\n    {\r\n    }\r\n\r\n    semaphore(semaphore const&)\r\n        : impl_()\r\n    {\r\n    }\r\n\r\n    semaphore& operator = (semaphore const&)\r\n    {\r\n        return *this;\r\n    }\r\n\r\n    void init(bool spurious_wakeups, unsigned initial_count, unsigned max_count, debug_info_param info)\r\n    {\r\n        context& c = ctx();\r\n        RL_ASSERT_IMPL(0 == impl_, test_result_double_initialization_of_semaphore, \"\", info);\r\n        sign_.check(info);\r\n        impl_ = c.sema_ctor(spurious_wakeups, initial_count, max_count);\r\n    }\r\n\r\n    void deinit(debug_info_param info)\r\n    {\r\n        context& c = ctx();\r\n        check(info);\r\n        c.sema_dtor(impl_);\r\n        impl_ = 0;\r\n    }\r\n\r\n    virtual sema_wakeup_reason wait(bool try_wait, bool is_timed, debug_info_param info)\r\n    {\r\n        check(info);\r\n        return impl_->wait(try_wait, is_timed, info);\r\n    }\r\n\r\n    virtual bool signal(debug_info_param info)\r\n    {\r\n        unsigned prev_count = 0;\r\n        return post(1, prev_count, info);\r\n    }\r\n\r\n    bool post(unsigned count, unsigned& prev_count, debug_info_param info)\r\n    {\r\n        check(info);\r\n        return impl_->post(count, prev_count, info);\r\n    }\r\n\r\n    int get_value(debug_info_param info)\r\n    {\r\n        check(info);\r\n        return impl_->get_value(info);\r\n    }\r\n\r\nprivate:\r\n    sema_data* impl_;\r\n    signature<0x228855dd> sign_;\r\n\r\n    sema_data* check(debug_info_param info)\r\n    {\r\n        RL_ASSERT_IMPL(impl_, test_result_usage_of_non_initialized_semaphore, \"\", info);\r\n        sign_.check(info);\r\n        return impl_;\r\n    }\r\n\r\n    virtual bool is_signaled(debug_info_param info)\r\n    {\r\n        return check(info)->is_signaled(info);\r\n    }\r\n\r\n    virtual void memory_acquire(debug_info_param info)\r\n    {\r\n        check(info)->memory_acquire(info);\r\n    }\r\n\r\n    virtual void* prepare_wait(debug_info_param info)\r\n    {\r\n        return check(info)->prepare_wait(info);\r\n    }\r\n};\r\n\r\n\r\n\r\nstruct wfmo_event\r\n{\r\n    unsigned long               count_;\r\n    bool                        wait_all_;\r\n    bool                        try_wait_;\r\n    bool                        is_timed_;\r\n    sema_wakeup_reason          result_;\r\n    size_t                      signaled_;\r\n\r\n    void output(std::ostream& s) const\r\n    {\r\n        s   << \"WFMO: \"\r\n            << \"count=\" << count_\r\n            << \", wait_all=\" << wait_all_\r\n            << \", try_wait=\" << try_wait_\r\n            << \", is_timed=\" << is_timed_\r\n            << \", result=\";\r\n        if (sema_wakeup_reason_success == result_)\r\n        {\r\n            s << \"success\";\r\n            if (wait_all_ == false)\r\n                s << \", object=\" << signaled_;\r\n        }\r\n        else\r\n        {\r\n            s << \"timeout\";\r\n        }\r\n    }\r\n};\r\n\r\nsize_t const wfmo_max_objects = 32;\r\n\r\ninline sema_wakeup_reason wait_for_multiple_objects(\r\n    size_t& signaled,\r\n    size_t count,\r\n    win_waitable_object** wo,\r\n    bool wait_all,\r\n    bool try_wait,\r\n    bool is_timed,\r\n    debug_info_param info)\r\n{\r\n    context& c = ctx();\r\n    c.sched();\r\n\r\n    RL_VERIFY(count <= wfmo_max_objects);\r\n    void* ws [wfmo_max_objects];\r\n\r\n    sema_wakeup_reason result = sema_wakeup_reason_failed;\r\n    signaled = 0;\r\n\r\n    if (wait_all)\r\n    {\r\n        for (;;)\r\n        {\r\n            unsigned long i = 0;\r\n            for (i = 0; i != count; ++i)\r\n            {\r\n                if (false == wo[i]->is_signaled(info))\r\n                    break;\r\n            }\r\n            if (i == count)\r\n            {\r\n                preemption_disabler pd (c);\r\n                for (i = 0; i != count; ++i)\r\n                {\r\n                    sema_wakeup_reason r = wo[i]->wait(true, false, info);\r\n                    RL_VERIFY(r == sema_wakeup_reason_success);\r\n                    (void)r;\r\n                }\r\n                result = sema_wakeup_reason_success;\r\n                break;\r\n            }\r\n            else if (try_wait)\r\n            {\r\n                for (i = 0; i != count; ++i)\r\n                    wo[i]->memory_acquire(info);\r\n                result = sema_wakeup_reason_timeout;\r\n                break;\r\n            }\r\n            else\r\n            {\r\n                for (i = 0; i != count; ++i)\r\n                {\r\n                    ws[i] = wo[i]->prepare_wait(info);\r\n                }\r\n                unpark_reason reason = c.wfmo_park(ws, wo, (unsigned)count, !!wait_all, is_timed, info);\r\n                RL_VERIFY(unpark_reason_spurious != reason);\r\n                if (unpark_reason_timeout == reason)\r\n                {\r\n                    for (i = 0; i != count; ++i)\r\n                        wo[i]->memory_acquire(info);\r\n                    result = sema_wakeup_reason_timeout;\r\n                    break;\r\n                }\r\n                else if (unpark_reason_normal == reason)\r\n                {\r\n                    {\r\n                        preemption_disabler pd (c);\r\n                        for (unsigned long i = 0; i != count; ++i)\r\n                        {\r\n                            RL_VERIFY(wo[i]->is_signaled(info));\r\n                            sema_wakeup_reason r = wo[i]->wait(true, false, info);\r\n                            RL_VERIFY(r == sema_wakeup_reason_success);\r\n                            (void)r;\r\n                        }\r\n                    }\r\n                    c.switch_back(info);\r\n                    result = sema_wakeup_reason_success;\r\n                    break;\r\n                }\r\n                RL_VERIFY(false);\r\n            }\r\n        }\r\n    }\r\n    else\r\n    {\r\n        for (;;)\r\n        {\r\n            unsigned long i = 0;\r\n            for (i = 0; i != count; ++i)\r\n            {\r\n                if (true == wo[i]->is_signaled(info))\r\n                    break;\r\n            }\r\n            if (i != count)\r\n            {\r\n                preemption_disabler pd (c);\r\n                sema_wakeup_reason r = wo[i]->wait(true, false, info);\r\n                RL_VERIFY(r == sema_wakeup_reason_success);\r\n                (void)r;\r\n                signaled = i;\r\n                result = sema_wakeup_reason_success;\r\n                break;\r\n            }\r\n            else if (try_wait)\r\n            {\r\n                for (i = 0; i != count; ++i)\r\n                    wo[i]->memory_acquire(info);\r\n                result = sema_wakeup_reason_timeout;\r\n                break;\r\n            }\r\n            else\r\n            {\r\n                for (i = 0; i != count; ++i)\r\n                {\r\n                    ws[i] = wo[i]->prepare_wait(info);\r\n                }\r\n                unpark_reason reason = c.wfmo_park(ws, wo, (unsigned)count, !!wait_all, is_timed, info);\r\n                RL_VERIFY(unpark_reason_spurious != reason);\r\n                if (unpark_reason_timeout == reason)\r\n                {\r\n                    for (i = 0; i != count; ++i)\r\n                        wo[i]->memory_acquire(info);\r\n                    result = sema_wakeup_reason_timeout;\r\n                    break;\r\n                }\r\n                else if (unpark_reason_normal == reason)\r\n                {\r\n                    unsigned long i = 0;\r\n                    for (i = 0; i != count; ++i)\r\n                    {\r\n                        if (true == wo[i]->is_signaled(info))\r\n                            break;\r\n                    }\r\n                    RL_VERIFY(i != count);\r\n                    {\r\n                        preemption_disabler pd (c);\r\n                        sema_wakeup_reason r = wo[i]->wait(true, false, info);\r\n                        RL_VERIFY(r == sema_wakeup_reason_success);\r\n                        (void)r;\r\n                    }\r\n                    c.switch_back(info);\r\n                    signaled = i;\r\n                    result = sema_wakeup_reason_success;\r\n                    break;\r\n                }\r\n                RL_VERIFY(false);\r\n            }\r\n        }\r\n    }\r\n    \r\n    RL_HIST(wfmo_event) {(unsigned)count, wait_all, try_wait, is_timed, result, signaled} RL_HIST_END();\r\n    return result;\r\n}\r\n\r\n\r\n}\r\n\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/stdlib/windows.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2010, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE.TXT in this distribution.\r\n */\r\n\r\n#ifndef RL_WINDOWS_HPP\r\n#define RL_WINDOWS_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"mutex.hpp\"\r\n#include \"condition_variable.hpp\"\r\n#include \"semaphore.hpp\"\r\n#include \"event.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\ntypedef win_object* rl_HANDLE;\r\nunsigned long const rl_INFINITE = (unsigned long)-1;\r\n\r\nunsigned long const rl_WAIT_FAILED                = (unsigned long)-1;\r\nunsigned long const rl_WAIT_OBJECT_0              = 100;\r\nunsigned long const rl_WAIT_TIMEOUT               = 1;\r\nunsigned long const rl_WAIT_IO_COMPLETION         = 2;\r\nunsigned long const rl_MAXIMUM_WAIT_OBJECTS       = wfmo_max_objects;\r\n\r\n\r\ninline int rl_SwitchToThread(debug_info_param info)\r\n{\r\n    yield(1, info);\r\n    return 1;\r\n}\r\n\r\ninline void rl_Sleep(unsigned long milliseconds, debug_info_param info)\r\n{\r\n    yield(milliseconds ? milliseconds : 1, info);\r\n}\r\n\r\n\r\n\r\ninline unsigned long rl_WaitForSingleObjectEx(rl_HANDLE obj, unsigned long timeout, int alertable, debug_info_param info)\r\n{\r\n    (void)alertable; //!!! not yet supported  support it!\r\n    //!!! support WAIT_IO_COMPLETION\r\n    RL_VERIFY(false == alertable && \"Alertable wait is not supported in WaitForSingleObject() yet\");\r\n\r\n    bool try_wait = (timeout == 0);\r\n    bool is_timed = (timeout != rl_INFINITE);\r\n    sema_wakeup_reason reason = static_cast<win_waitable_object*>(obj)->wait(try_wait, is_timed, info);\r\n    if (reason == sema_wakeup_reason_success)\r\n        return rl_WAIT_OBJECT_0;\r\n    else if (reason == sema_wakeup_reason_timeout)\r\n        return rl_WAIT_TIMEOUT;\r\n    else if (reason == sema_wakeup_reason_failed)\r\n        return rl_WAIT_TIMEOUT;\r\n    RL_VERIFY(false);\r\n    return rl_WAIT_FAILED;\r\n}\r\n\r\ninline unsigned long rl_WaitForSingleObject(rl_HANDLE obj, unsigned long timeout, debug_info_param info)\r\n{\r\n    return rl_WaitForSingleObjectEx(obj, timeout, 0, info);\r\n}\r\n\r\ninline unsigned long rl_WaitForMultipleObjectsEx(unsigned long count, rl_HANDLE* objects, int wait_all, unsigned long timeout, int alertable, debug_info_param info)\r\n{\r\n    (void)alertable; //!!!\r\n    //!!! support WAIT_IO_COMPLETION\r\n    RL_VERIFY(false == alertable && \"Alertable wait is not supported in WaitForMultipleObjects() yet\");\r\n\r\n    bool try_wait = (timeout == 0);\r\n    bool is_timed = (timeout != rl_INFINITE);\r\n    win_waitable_object** obj = reinterpret_cast<win_waitable_object**>(objects);\r\n    size_t signaled = 0;\r\n    sema_wakeup_reason reason = wait_for_multiple_objects(signaled, count, obj, !!wait_all, try_wait, is_timed, info);\r\n    if (reason == sema_wakeup_reason_success)\r\n        return rl_WAIT_OBJECT_0 + (int)signaled;\r\n    else if (reason == sema_wakeup_reason_timeout)\r\n        return rl_WAIT_TIMEOUT;\r\n    RL_VERIFY(false);\r\n    return rl_WAIT_FAILED;\r\n}\r\n\r\ninline unsigned long rl_WaitForMultipleObjects(unsigned long count, rl_HANDLE* objects, int wait_all, unsigned long timeout, debug_info_param info)\r\n{\r\n    return rl_WaitForMultipleObjectsEx(count, objects, wait_all, timeout, 0, info);\r\n}\r\n\r\ninline unsigned long rl_SignalObjectAndWait(rl_HANDLE obj_to_signal,\r\n                                            rl_HANDLE obj_to_wait,\r\n                                            unsigned long timeout,\r\n                                            int alertable,\r\n                                            debug_info_param info)\r\n{\r\n    bool result = static_cast<win_waitable_object*>(obj_to_signal)->signal(info);\r\n    if (false == result)\r\n        return result ? 1 : 0;\r\n    preemption_disabler pd (ctx());\r\n    return rl_WaitForSingleObjectEx(obj_to_wait, timeout, alertable, info);\r\n}\r\n\r\n\r\n\r\nstruct sem_tag_win;\r\n\r\ninline rl_HANDLE rl_CreateSemaphore(void* /*security*/, long initial_count, long max_count, void const* /*name*/, debug_info_param info)\r\n{\r\n    void* mem = ctx().alloc(sizeof(semaphore<sem_tag_win>), false, info);\r\n    semaphore<sem_tag_win>* sema = new (mem) semaphore<sem_tag_win>;\r\n    sema->init(false, initial_count, max_count, info);\r\n    return sema;\r\n}\r\n\r\ninline int rl_CloseHandle(rl_HANDLE h, debug_info_param info)\r\n{\r\n    h->deinit(info);\r\n    h->~win_object();\r\n    (ctx().free)(h, false, info); //!!! rename free because of the define\r\n    return 1;\r\n}\r\n\r\ninline int rl_ReleaseSemaphore(rl_HANDLE sema, long count, long* prev_count, debug_info_param info)\r\n{\r\n    unsigned prev = 0;\r\n    bool result = static_cast<semaphore<sem_tag_win>*>(sema)->post(count, prev, info);\r\n    if (prev_count)\r\n        prev_count[0] = prev;\r\n    return result ? 1 : 0;\r\n}\r\n\r\n\r\n\r\n\r\ninline rl_HANDLE rl_CreateEvent(void* /*security*/, int manual_reset, int initial_state, void const* /*name*/, debug_info_param info)\r\n{\r\n    void* mem = ctx().alloc(sizeof(generic_event), false, info);\r\n    generic_event* ev = new (mem) generic_event;\r\n    ev->init(!!manual_reset, !!initial_state, info);\r\n    return ev;\r\n}\r\n\r\ninline int rl_SetEvent(rl_HANDLE ev, debug_info_param info)\r\n{\r\n    static_cast<generic_event*>(ev)->set(info);\r\n    return 1;\r\n}\r\n\r\ninline int rl_ResetEvent(rl_HANDLE ev, debug_info_param info)\r\n{\r\n    static_cast<generic_event*>(ev)->reset(info);\r\n    return 1;\r\n}\r\n\r\ninline int rl_PulseEvent(rl_HANDLE ev, debug_info_param info)\r\n{\r\n    static_cast<generic_event*>(ev)->pulse(info);\r\n    return 1;\r\n}\r\n\r\n\r\n\r\nstruct mutex_tag_win_cs;\r\ntypedef generic_mutex<mutex_tag_win_cs> rl_CRITICAL_SECTION;\r\n\r\ninline void rl_InitializeCriticalSection(rl_CRITICAL_SECTION* m, debug_info_param info)\r\n{\r\n    m->init(false, true, false, false, info);\r\n}\r\n\r\ninline int rl_InitializeCriticalSectionAndSpinCount(rl_CRITICAL_SECTION* m, unsigned long spin_count, debug_info_param info)\r\n{\r\n    (void)spin_count;\r\n    m->init(false, true, false, false, info);\r\n    return 1;\r\n}\r\n\r\ninline int rl_InitializeCriticalSectionEx(rl_CRITICAL_SECTION* m, unsigned long spin_count, unsigned long flags, debug_info_param info)\r\n{\r\n    (void)spin_count;\r\n    (void)flags;\r\n    m->init(false, true, false, false, info);\r\n    return 1;\r\n}\r\n\r\ninline void rl_DeleteCriticalSection(rl_CRITICAL_SECTION* m, debug_info_param info)\r\n{\r\n    m->deinit(info);\r\n}\r\n\r\ninline void rl_EnterCriticalSection(rl_CRITICAL_SECTION* m, debug_info_param info)\r\n{\r\n    m->lock_exclusive(info);\r\n}\r\n\r\ninline int rl_TryEnterCriticalSection(rl_CRITICAL_SECTION* m, debug_info_param info)\r\n{\r\n    return m->try_lock_exclusive(info) ? 1 : 0;\r\n}\r\n\r\ninline void rl_LeaveCriticalSection(rl_CRITICAL_SECTION* m, debug_info_param info)\r\n{\r\n    m->unlock_exclusive(info);\r\n}\r\n\r\nstruct mutex_tag_win_srwl;\r\ntypedef generic_mutex<mutex_tag_win_srwl> rl_SRWLOCK;\r\n\r\ninline void rl_InitializeSRWLock(rl_SRWLOCK* lock, debug_info_param info)\r\n{\r\n    lock->init(true, false, false, false, info);\r\n}\r\n\r\ninline void rl_AcquireSRWLockExclusive(rl_SRWLOCK* lock, debug_info_param info)\r\n{\r\n    lock->lock_exclusive(info);\r\n}\r\n\r\ninline void rl_AcquireSRWLockShared(rl_SRWLOCK* lock, debug_info_param info)\r\n{\r\n    lock->lock_shared(info);\r\n}\r\n\r\ninline void rl_ReleaseSRWLockExclusive(rl_SRWLOCK* lock, debug_info_param info)\r\n{\r\n    lock->unlock_exclusive(info);\r\n}\r\n\r\ninline void rl_ReleaseSRWLockShared(rl_SRWLOCK* lock, debug_info_param info)\r\n{\r\n    lock->unlock_shared(info);\r\n}\r\n\r\n//!!!\r\ninline void rl_DeleteSRWLock(rl_SRWLOCK* lock, debug_info_param info)\r\n{\r\n    lock->deinit(info);\r\n}\r\n\r\n\r\nstruct mutex_tag_win_mutex;\r\ntypedef generic_mutex<mutex_tag_win_mutex> rl_win_mutex;\r\n\r\n\r\ninline rl_HANDLE rl_CreateMutex(void* /*security*/, int initial_owner, void const* /*name*/, debug_info_param info)\r\n{\r\n    void* mem = ctx().alloc(sizeof(rl_win_mutex), false, info);\r\n    rl_win_mutex* mtx = new (mem) rl_win_mutex ();\r\n    mtx->init(false, true, false, false, info);\r\n    if (initial_owner)\r\n        mtx->lock_exclusive(info);\r\n    return mtx;\r\n}\r\n\r\ninline int rl_ReleaseMutex(rl_HANDLE mtx, debug_info_param info)\r\n{\r\n    static_cast<rl_win_mutex*>(mtx)->unlock_exclusive(info);\r\n    return 1;\r\n\r\n}\r\n\r\n\r\n\r\nstruct condvar_tag_win;\r\ntypedef condvar<condvar_tag_win> rl_CONDITION_VARIABLE;\r\nunsigned long const rl_CONDITION_VARIABLE_LOCKMODE_SHARED = 1;\r\n\r\ninline void rl_InitializeConditionVariable(rl_CONDITION_VARIABLE* cv, debug_info_param info)\r\n{\r\n    cv->init(false, info);\r\n}\r\n\r\ninline int rl_SleepConditionVariableCS(rl_CONDITION_VARIABLE* cv, rl_CRITICAL_SECTION* cs, unsigned long ms, debug_info_param info)\r\n{\r\n    cv->wait(*cs, ms != rl_INFINITE, info);\r\n    return 0;\r\n}\r\n\r\ninline int rl_SleepConditionVariableSRW(rl_CONDITION_VARIABLE* cv, rl_SRWLOCK* lock, unsigned long ms, unsigned long flags, debug_info_param info)\r\n{\r\n    //!!! CONDITION_VARIABLE_LOCKMODE_SHARED\r\n    (void)flags;\r\n    cv->wait(*lock, ms != rl_INFINITE, info);\r\n    return 0;\r\n}\r\n\r\ninline void rl_WakeAllConditionVariable(rl_CONDITION_VARIABLE* cv, debug_info_param info)\r\n{\r\n    cv->notify_all(info);\r\n}\r\n\r\ninline void rl_WakeConditionVariable(rl_CONDITION_VARIABLE* cv, debug_info_param info)\r\n{\r\n    cv->notify_one(info);\r\n}\r\n\r\ninline void rl_DeleteConditionVariable(rl_CONDITION_VARIABLE* cv, debug_info_param info)\r\n{\r\n    cv->deinit(info);\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\ntypedef unsigned long (RL_STDCALL *rl_WIN_START_ROUTINE)(void* param);\r\ntypedef unsigned (RL_STDCALL *rl_MSVCR_THREAD_ROUTINE)(void* param);\r\n\r\ntemplate<typename thread_fn_t>\r\nstruct win32_thread_helper\r\n{\r\n    thread_fn_t fn;\r\n    void* param;\r\n\r\n    static void* thread(void* p)\r\n    {\r\n        win32_thread_helper* self = (win32_thread_helper*)p;\r\n        void* result = (void*)(uintptr_t)(self->fn(self->param));\r\n        delete_impl(self, $);\r\n        return result;\r\n    }\r\n};\r\n\r\ninline rl_HANDLE rl_CreateThread(void* security, unsigned stack_size, rl_WIN_START_ROUTINE fn, void* param, unsigned long creation_flags, unsigned long* thread_id, debug_info_param info)\r\n{\r\n    (void)security;\r\n    (void)stack_size;\r\n    (void)creation_flags;\r\n    (void)thread_id;\r\n\r\n    void* mem =\r\n        ctx().alloc(sizeof(win32_thread_helper<rl_WIN_START_ROUTINE>), false, info);\r\n    win32_thread_helper<rl_WIN_START_ROUTINE>* arg =\r\n        new (mem) win32_thread_helper<rl_WIN_START_ROUTINE>;\r\n    arg->fn = fn;\r\n    arg->param = param;\r\n    win_waitable_object* handle = ctx().create_thread(&win32_thread_helper<rl_WIN_START_ROUTINE>::thread, arg);\r\n    return handle;\r\n}\r\n\r\n\r\ninline uintptr_t rl_beginthreadex(void *security, unsigned stack_size, rl_MSVCR_THREAD_ROUTINE start_address, void *arglist, unsigned initflag, unsigned* thrdaddr, debug_info_param info)\r\n{\r\n    (void)security;\r\n    (void)stack_size;\r\n    (void)initflag;\r\n    (void)thrdaddr;\r\n\r\n    void* mem = ctx().alloc(sizeof(win32_thread_helper<rl_MSVCR_THREAD_ROUTINE>), false, info);\r\n    win32_thread_helper<rl_MSVCR_THREAD_ROUTINE>* arg =\r\n        new (mem) win32_thread_helper<rl_MSVCR_THREAD_ROUTINE>;\r\n    arg->fn = start_address;\r\n    arg->param = arglist;\r\n    win_waitable_object* handle = ctx().create_thread(&win32_thread_helper<rl_MSVCR_THREAD_ROUTINE>::thread, arg);\r\n    return (uintptr_t)handle;\r\n}\r\n\r\ninline unsigned long rl_SetThreadAffinityMask(rl_HANDLE th, unsigned long affinity_mask, debug_info_param info)\r\n{\r\n    (void)(th);\r\n    (void)(affinity_mask);\r\n    (void)info;\r\n    return 0;\r\n}\r\n\r\ninline int rl_SuspendThread(rl_HANDLE th, debug_info_param info)\r\n{\r\n    (void)th;\r\n    (void)info;\r\n    return 1;\r\n}\r\n\r\ninline int rl_ResumeThread(rl_HANDLE th, debug_info_param info)\r\n{\r\n    (void)th;\r\n    (void)info;\r\n    return 1;\r\n}\r\n\r\ninline unsigned long GetLastError()\r\n{\r\n    return (unsigned long)get_errno();\r\n}\r\n\r\ninline void SetLastError(unsigned long value)\r\n{\r\n    set_errno((int)value);\r\n}\r\n\r\ninline void rl_FlushProcessWriteBuffers(debug_info_param info)\r\n{\r\n    systemwide_fence(info);\r\n}\r\n\r\n}\r\n\r\n\r\n#ifdef HANDLE\r\n#   undef HANDLE\r\n#endif\r\n#define HANDLE rl::rl_HANDLE\r\n\r\n#ifdef INFINITE\r\n#   undef INFINITE\r\n#endif\r\n#define INFINITE rl::rl_INFINITE\r\n\r\n\r\n#ifdef WAIT_FAILED\r\n#   undef WAIT_FAILED\r\n#endif\r\n#define WAIT_FAILED rl::rl_WAIT_FAILED\r\n\r\n#ifdef WAIT_OBJECT_0\r\n#   undef WAIT_OBJECT_0\r\n#endif\r\n#define WAIT_OBJECT_0 rl::rl_WAIT_OBJECT_0\r\n\r\n#ifdef WAIT_TIMEOUT\r\n#   undef WAIT_TIMEOUT\r\n#endif\r\n#define WAIT_TIMEOUT rl::rl_WAIT_TIMEOUT\r\n\r\n#ifdef WAIT_IO_COMPLETION\r\n#   undef WAIT_IO_COMPLETION\r\n#endif\r\n#define WAIT_IO_COMPLETION rl::rl_WAIT_IO_COMPLETION\r\n\r\n#ifdef MAXIMUM_WAIT_OBJECTS\r\n#   undef MAXIMUM_WAIT_OBJECTS\r\n#endif\r\n#define MAXIMUM_WAIT_OBJECTS rl::rl_MAXIMUM_WAIT_OBJECTS\r\n\r\n\r\n\r\n#define SwitchToThread() \\\r\n rl::rl_SwitchToThread($)\r\n\r\n#define Sleep(milliseconds) \\\r\n rl::rl_Sleep(milliseconds, $)\r\n\r\n\r\n\r\n#define CloseHandle(obj) \\\r\n rl::rl_CloseHandle(obj, $)\r\n\r\n#define WaitForSingleObject(obj, timeout) \\\r\n rl::rl_WaitForSingleObject(obj, timeout, $)\r\n\r\n#define WaitForMultipleObjects(count, objects, wait_all, timeout) \\\r\n rl::rl_WaitForMultipleObjects(count, objects, wait_all, timeout, $)\r\n\r\n#define WaitForMultipleObjectsEx(count, objects, wait_all, timeout, alertable)] \\\r\n rl::rl_WaitForMultipleObjectsEx(count, objects, wait_all, timeout, alertable, $)\r\n\r\n#define SignalObjectAndWait(obj_to_signal, obj_to_wait, timeout, alertable) \\\r\n rl::rl_SignalObjectAndWait(obj_to_signal, obj_to_wait, timeout, alertable, $)\r\n\r\n#ifdef CreateSemaphore\r\n#   undef CreateSemaphore\r\n#endif\r\n\r\n#ifdef CreateSemaphore\r\n#   undef ReleaseSemaphore\r\n#endif\r\n\r\n#define CreateSemaphoreA rl_CreateSemaphore\r\n#define CreateSemaphoreW rl_CreateSemaphore\r\n#define CreateSemaphore rl_CreateSemaphore\r\n#define rl_CreateSemaphore(security, initial_count, max_count, name) \\\r\n    rl::rl_CreateSemaphore(security, initial_count, max_count, name, $)\\\r\n\r\n#define ReleaseSemaphore(sema, count, prev_count) \\\r\n rl::rl_ReleaseSemaphore(sema, count, prev_count, $)\r\n\r\n\r\n\r\n#ifdef CreateEvent\r\n#   undef CreateEvent\r\n#endif\r\n#define CreateEventA rl_CreateEvent\r\n#define CreateEventW rl_CreateEvent\r\n#define CreateEvent rl_CreateEvent\r\n#define rl_CreateEvent(security, manual_reset, initial_state, name)\\\r\n    rl::rl_CreateEvent(security, manual_reset, initial_state, name, $)\r\n\r\n#define SetEvent(ev)\\\r\n rl::rl_SetEvent(ev, $)\r\n\r\n#define ResetEvent(ev)\\\r\n rl::rl_ResetEvent(ev, $)\r\n\r\n#define PulseEvent(ev)\\\r\n rl::rl_PulseEvent(ev, $)\r\n\r\n\r\n#ifdef CreateMutex\r\n#   undef CreateMutex\r\n#endif\r\n#define CreateMutexA rl_CreateMutex\r\n#define CreateMutexW rl_CreateMutex\r\n#define CreateMutex rl_CreateMutex\r\n#define rl_CreateMutex(security, initial_owner, name)\\\r\n    rl::rl_CreateMutex(security, initial_owner, name, $)\r\n\r\n#define ReleaseMutex(mtx)\\\r\n rl::rl_ReleaseMutex(mtx, $)\r\n\r\n\r\n\r\n#define CRITICAL_SECTION rl::rl_CRITICAL_SECTION\r\n\r\n#define InitializeCriticalSection(cs) \\\r\n rl::rl_InitializeCriticalSection(cs, $)\r\n\r\n#define InitializeCriticalSectionAndSpinCount(cs, spin) \\\r\n rl::rl_InitializeCriticalSectionAndSpinCount(cs, spin, $)\r\n\r\n#define InitializeCriticalSectionEx(cs, spin, flags) \\\r\n rl::rl_InitializeCriticalSectionEx(cs, spin, flags, $)\r\n\r\n#define DeleteCriticalSection(cs) \\\r\n rl::rl_DeleteCriticalSection(cs, $)\r\n\r\n#define EnterCriticalSection(cs) \\\r\n rl::rl_EnterCriticalSection(cs, $)\r\n\r\n#define TryEnterCriticalSection(cs) \\\r\n rl::rl_TryEnterCriticalSection(cs, $)\r\n\r\n#define LeaveCriticalSection(cs) \\\r\n rl::rl_LeaveCriticalSection(cs, $)\r\n\r\n\r\n\r\n\r\n#define SRWLOCK rl::rl_SRWLOCK\r\n\r\n#define InitializeSRWLock(lock) \\\r\n rl::rl_InitializeSRWLock(lock, $)\r\n\r\n#define AcquireSRWLockExclusive(lock) \\\r\n rl::rl_AcquireSRWLockExclusive(lock, $)\r\n\r\n#define AcquireSRWLockShared(lock) \\\r\n rl::rl_AcquireSRWLockShared(lock, $)\r\n\r\n#define ReleaseSRWLockExclusive(lock) \\\r\n rl::rl_ReleaseSRWLockExclusive(lock, $)\r\n\r\n#define ReleaseSRWLockShared(lock) \\\r\n rl::rl_ReleaseSRWLockShared(lock, $)\r\n\r\n//!!! no such function in WIN API\r\n#define DeleteSRWLock(lock) \\\r\n rl::rl_DeleteSRWLock(lock, $)\r\n\r\n\r\n\r\n\r\n\r\n\r\n#define CONDITION_VARIABLE rl::rl_CONDITION_VARIABLE\r\n\r\n#ifdef CONDITION_VARIABLE_LOCKMODE_SHARED\r\n#   undef CONDITION_VARIABLE_LOCKMODE_SHARED\r\n#endif\r\n#define CONDITION_VARIABLE_LOCKMODE_SHARED rl::rl_CONDITION_VARIABLE_LOCKMODE_SHARED\r\n\r\n#define InitializeConditionVariable(cv) \\\r\n rl::rl_InitializeConditionVariable(cv, $)\r\n\r\n#define SleepConditionVariableCS(cv, cs, ms) \\\r\n rl::rl_SleepConditionVariableCS(cv, cs, ms, $)\r\n\r\n#define SleepConditionVariableSRW(cv, lock, ms, flags) \\\r\n rl::rl_SleepConditionVariableSRW(cv, lock, ms, flags, $)\r\n\r\n#define WakeAllConditionVariable(cv) \\\r\n rl::rl_WakeAllConditionVariable(cv, $)\r\n\r\n#define WakeConditionVariable(cv) \\\r\n rl::rl_WakeConditionVariable(cv, $)\r\n\r\n//!!! no such function in WIN API\r\n#define DeleteConditionVariable(cv) \\\r\n rl::rl_DeleteConditionVariable(cv, $)\r\n\r\n\r\n\r\n#define CreateThread(security, stack_size, fn, param, creation_flags, thread_id) \\\r\n rl::rl_CreateThread(security, stack_size, fn, param, creation_flags, thread_id, $)\r\n\r\n#define _beginthreadex(security, stack_size, start_address, arglist, initflag, thrdaddr) \\\r\n  rl::rl_beginthreadex(security, stack_size, start_address, arglist, initflag, thrdaddr, $)\r\n\r\n#define SetThreadAffinityMask(th, affinity_mask) \\\r\n rl::rl_SetThreadAffinityMask(th, affinity_mask, $)\r\n\r\n#define SuspendThread(th) \\\r\n rl::rl_SuspendThread(th, $)\r\n\r\n#define ResumeThread(th) \\\r\n rl::rl_ResumeThread(th, $)\r\n\r\n#define FlushProcessWriteBuffers() \\\r\n rl::rl_FlushProcessWriteBuffers($)\r\n\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/sync_var.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_SYNC_VAR_HPP\r\n#define RL_SYNC_VAR_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n#include \"foreach.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\n\r\ntemplate<thread_id_t thread_count>\r\nclass sync_var : nocopy<>\r\n{\r\npublic:\r\n    sync_var()\r\n    {\r\n        iteration_begin();\r\n    }\r\n\r\n    void iteration_begin()\r\n    {\r\n        foreach<thread_count>(order_, &assign_zero);\r\n    }\r\n\r\n    void acquire(thread_info_base* th)\r\n    {\r\n        th->own_acq_rel_order_ += 1;\r\n        foreach<thread_count>(th->acq_rel_order_, order_, &assign_max);\r\n    }\r\n\r\n    void release(thread_info_base* th)\r\n    {\r\n        th->own_acq_rel_order_ += 1;\r\n        foreach<thread_count>(order_, th->acq_rel_order_, &assign_max);\r\n    }\r\n\r\n    void acq_rel(thread_info_base* th)\r\n    {\r\n        th->own_acq_rel_order_ += 1;\r\n        timestamp_t* acq_rel_order = th->acq_rel_order_;\r\n        timestamp_t* order = order_;\r\n        foreach<thread_count>(acq_rel_order, order, &assign_max);\r\n        foreach<thread_count>(order, acq_rel_order, &assign_max);\r\n    }\r\n\r\nprivate:\r\n    timestamp_t order_ [thread_count];\r\n};\r\n\r\n\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/test_params.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_TEST_PARAMS_HPP\r\n#define RL_TEST_PARAMS_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n#include \"test_result.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\nenum scheduler_type_e\r\n{\r\n    sched_random,\r\n    sched_bound,\r\n    sched_full,\r\n    sched_count,\r\n\r\n    random_scheduler_type = sched_random,\r\n    fair_context_bound_scheduler_type = sched_bound,\r\n    fair_full_search_scheduler_type = sched_full,\r\n    scheduler_type_count\r\n};\r\n\r\ninline char const* format(scheduler_type_e t)\r\n{\r\n    switch (t)\r\n    {\r\n    case sched_random: return \"random scheduler\";\r\n    case sched_bound: return \"context bound scheduler\";\r\n    case sched_full: return \"full search scheduler\";\r\n    default: break;\r\n    }\r\n    RL_VERIFY(false);\r\n    throw std::logic_error(\"invalid scheduler type\");\r\n}\r\n\r\n\r\nstruct test_params\r\n{\r\n    // input params\r\n    iteration_t                 iteration_count;\r\n    std::ostream*               output_stream;\r\n    std::ostream*               progress_stream;\r\n    unsigned                    progress_output_period;\r\n    bool                        collect_history;\r\n    bool                        output_history;\r\n    scheduler_type_e            search_type;\r\n    unsigned                    context_bound;\r\n    unsigned                    execution_depth_limit;\r\n    string                      initial_state;\r\n\r\n    // output params\r\n    test_result_e               test_result;\r\n    iteration_t                 stop_iteration;\r\n    string                      test_name;\r\n    string                      final_state;\r\n\r\n    test_params()\r\n    {\r\n        iteration_count         = 1000;\r\n        output_stream           = &std::cout;\r\n        progress_stream         = &std::cout;\r\n        progress_output_period  = 3;\r\n        collect_history         = false;\r\n        output_history          = false;\r\n        search_type             = random_scheduler_type;\r\n        context_bound           = 1;\r\n        execution_depth_limit   = 2000;\r\n\r\n        test_result             = test_result_success;\r\n        stop_iteration          = 0;\r\n    }\r\n};\r\n\r\n\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/test_result.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_TEST_RESULT_HPP\r\n#define RL_TEST_RESULT_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\n\r\nenum test_result_e\r\n{\r\n    test_result_success,\r\n    test_result_until_condition_hit,\r\n    test_result_inconsistent_test_suite,\r\n    test_result_user_assert_failed,\r\n    test_result_user_invariant_failed,\r\n    test_result_data_race,\r\n    test_result_access_to_freed_memory,\r\n    test_result_double_free,\r\n    test_result_memory_leak,\r\n    test_result_resource_leak,\r\n    test_result_unitialized_access,\r\n    test_result_deadlock,\r\n    test_result_livelock,\r\n\r\n    // mutex\r\n    test_result_recursion_on_nonrecursive_mutex,\r\n    test_result_unlocking_mutex_wo_ownership,\r\n    test_result_destroying_owned_mutex,\r\n    test_result_double_initialization_of_mutex,\r\n    test_result_usage_of_non_initialized_mutex,\r\n    test_result_mutex_write_to_read_upgrade,\r\n    test_result_mutex_read_to_write_upgrade,\r\n\r\n    //condvar\r\n    test_result_double_initialization_of_condvar,\r\n    test_result_usage_of_non_initialized_condvar,\r\n\r\n    //semaphore\r\n    test_result_double_initialization_of_semaphore,\r\n    test_result_usage_of_non_initialized_semaphore,\r\n\r\n    //event\r\n    test_result_double_initialization_of_event,\r\n    test_result_usage_of_non_initialized_event,\r\n\r\n    //dynamic thread\r\n    test_result_thread_signal,\r\n};\r\n\r\n\r\ninline char const* test_result_str(test_result_e r)\r\n{\r\n    switch (r)\r\n    {\r\n    case test_result_success: return \"SUCCESS\";\r\n    case test_result_until_condition_hit: return \"UNTIL CONDITION HIT\";\r\n    case test_result_inconsistent_test_suite: return \"INCONSISTENT TEST SUITE\";\r\n    case test_result_user_assert_failed: return \"USER ASSERT FAILED\";\r\n    case test_result_user_invariant_failed: return \"USER INVARIANT FAILED\";\r\n    case test_result_data_race: return \"DATA RACE\";\r\n    case test_result_access_to_freed_memory: return \"ACCESS TO FREED MEMORY\";\r\n    case test_result_double_free: return \"DOUBLE FREE\";\r\n    case test_result_memory_leak: return \"MEMORY LEAK\";\r\n    case test_result_resource_leak: return \"RESOURCE LEAK\";\r\n    case test_result_unitialized_access: return \"ACCESS TO UNINITIALIZED VARIABLE\";\r\n    case test_result_deadlock: return \"DEADLOCK\";\r\n    case test_result_livelock: return \"LIVELOCK\";\r\n\r\n    // mutex\r\n    case test_result_recursion_on_nonrecursive_mutex: return \"RECURSION ON NON-RECURSIVE MUTEX\";\r\n    case test_result_unlocking_mutex_wo_ownership: return \"UNLOCKING MUTEX W/O OWNERSHIP\";\r\n    case test_result_destroying_owned_mutex: return \"DESTROYING OWNED MUTEX\";\r\n    case test_result_double_initialization_of_mutex: return \"DOUBLE INITIALIZATION OF MUTEX\";\r\n    case test_result_usage_of_non_initialized_mutex: return \"USAGE OF NON INITIALIZED MUTEX\";\r\n    case test_result_mutex_write_to_read_upgrade: return \"ATTEMPT TO UPGRADE EXCLUSIVE MUTEX OWNERSHIP TO SHARED\";\r\n    case test_result_mutex_read_to_write_upgrade: return \"ATTEMPT TO UPGRADE SHARED MUTEX OWNERSHIP TO EXCLUSIVE\";\r\n\r\n    // condvar\r\n    case test_result_double_initialization_of_condvar: return \"DOUBLE INITIALIZATION OF CONDITION VARIABLE\";\r\n    case test_result_usage_of_non_initialized_condvar: return \"USAGE OF NON INITIALIZED CONDITION VARIABLE\";\r\n\r\n    // semaphore\r\n    case test_result_double_initialization_of_semaphore: return \"DOUBLE INITIALIZATION OF SEMAPHORE\";\r\n    case test_result_usage_of_non_initialized_semaphore: return \"USAGE OF NON INITIALIZED SEMAPHORE\";\r\n\r\n    // event\r\n    case test_result_double_initialization_of_event: return \"DOUBLE INITIALIZATION OF EVENT\";\r\n    case test_result_usage_of_non_initialized_event: return \"USAGE OF NON INITIALIZED EVENT\";\r\n\r\n    default: RL_VERIFY(false); return \"UNKNOWN ERROR\";\r\n    }\r\n}\r\n\r\n\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/test_suite.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_TEST_SUITE_HPP\r\n#define RL_TEST_SUITE_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n#include \"test_result.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\n\r\ntemplate<\r\n    typename derived_t,\r\n    thread_id_t static_thread_count_param,\r\n    test_result_e result = test_result_success>\r\nstruct test_suite : nocopy<>\r\n{\r\n    static thread_id_t const dynamic_thread_count = 0;\r\n\r\n    struct params\r\n    {\r\n        static thread_id_t const static_thread_count = static_thread_count_param;\r\n        static thread_id_t const dynamic_thread_count = derived_t::dynamic_thread_count;\r\n        static thread_id_t const thread_count = static_thread_count + dynamic_thread_count;\r\n        static test_result_e const expected_result = result;\r\n    };\r\n\r\n    void invariant() {}\r\n    void before() {}\r\n    void after() {}\r\n};\r\n\r\n\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/thread.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_THREAD_HPP\r\n#define RL_THREAD_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n#include \"context_base.hpp\"\r\n#include \"dyn_thread_ctx.hpp\"\r\n#include \"thread_base.hpp\"\r\n#include \"test_suite.hpp\"\r\n#include \"memory_order.hpp\"\r\n#include \"foreach.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\n\r\n\r\nstruct atomic_data;\r\nstruct var_data;\r\ntemplate<thread_id_t thread_count> struct atomic_data_impl;\r\ntemplate<thread_id_t thread_count> struct var_data_impl;\r\n\r\n\r\ntemplate<thread_id_t thread_count>\r\nstruct thread_info : thread_info_base\r\n{\r\n    thread_info(thread_id_t index = 0)\r\n        : thread_info_base(index, acq_rel_order_)\r\n    {\r\n    }\r\n\r\n    void iteration_begin()\r\n    {\r\n        sync_object_.iteration_begin();\r\n        last_yield_ = 0;\r\n        dynamic_thread_func_ = 0;\r\n        dynamic_thread_param_ = 0;\r\n        for (thread_id_t j = 0; j != thread_count; ++j)\r\n        {\r\n            acq_rel_order_[j] = 0;\r\n        }\r\n        acq_rel_order_[index_] = 1;\r\n        temp_switch_from_ = -1;\r\n        saved_disable_preemption_ = -1;\r\n    }\r\n\r\n    thread_sync_object<thread_count> sync_object_;\r\n\r\n    timestamp_t acq_rel_order_ [thread_count];\r\n    timestamp_t acquire_fence_order_ [thread_count];\r\n    timestamp_t release_fence_order_ [thread_count];\r\n\r\n#ifdef RL_IMPROVED_SEQ_CST_FENCE\r\n    timestamp_t imp_seq_cst_order_ [thread_count];\r\n#endif\r\n\r\n    virtual void on_start()\r\n    {\r\n        RL_VERIFY(temp_switch_from_ == -1);\r\n        RL_VERIFY(saved_disable_preemption_ == -1);\r\n        sync_object_.on_start();\r\n    }\r\n\r\n    virtual void on_finish()\r\n    {\r\n        RL_VERIFY(temp_switch_from_ == -1);\r\n        RL_VERIFY(saved_disable_preemption_ == -1);\r\n        sync_object_.on_finish();\r\n    }\r\n\r\n    void atomic_thread_fence_acquire()\r\n    {\r\n        foreach<thread_count>(\r\n            acq_rel_order_,\r\n            acquire_fence_order_,\r\n            &assign_max);\r\n    }\r\n\r\n    void atomic_thread_fence_release()\r\n    {\r\n        foreach<thread_count>(\r\n            release_fence_order_,\r\n            acq_rel_order_,\r\n            &assign);\r\n    }\r\n\r\n    void atomic_thread_fence_acq_rel()\r\n    {\r\n        atomic_thread_fence_acquire();\r\n        atomic_thread_fence_release();\r\n    }\r\n\r\n    void atomic_thread_fence_seq_cst(timestamp_t* seq_cst_fence_order)\r\n    {\r\n#ifdef RL_IMPROVED_SEQ_CST_FENCE\r\n        foreach<thread_count>(acq_rel_order_, imp_seq_cst_order_, assign_max);\r\n#endif\r\n\r\n        atomic_thread_fence_acquire();\r\n\r\n        foreach<thread_count>(\r\n            acq_rel_order_,\r\n            seq_cst_fence_order,\r\n            &assign_max);\r\n\r\n        foreach<thread_count>(\r\n            seq_cst_fence_order,\r\n            acq_rel_order_,\r\n            &assign);\r\n\r\n        atomic_thread_fence_release();\r\n    }\r\n\r\n    virtual ~thread_info() {} // just to calm down gcc\r\n\r\nprivate:\r\n    thread_info(thread_info const&);\r\n    thread_info& operator = (thread_info const&);\r\n\r\n    virtual unsigned atomic_load_relaxed(atomic_data* RL_RESTRICT data)\r\n    {\r\n        return atomic_load<mo_relaxed, false>(data);\r\n    }\r\n\r\n    virtual unsigned atomic_load_acquire(atomic_data* RL_RESTRICT data)\r\n    {\r\n        return atomic_load<mo_acquire, false>(data);\r\n    }\r\n\r\n    virtual unsigned atomic_load_seq_cst(atomic_data* RL_RESTRICT data)\r\n    {\r\n        return atomic_load<mo_seq_cst, false>(data);\r\n    }\r\n\r\n    virtual unsigned atomic_load_relaxed_rmw(atomic_data* RL_RESTRICT data)\r\n    {\r\n        return atomic_load<mo_relaxed, true>(data);\r\n    }\r\n\r\n    virtual unsigned atomic_load_acquire_rmw(atomic_data* RL_RESTRICT data)\r\n    {\r\n        return atomic_load<mo_acquire, true>(data);\r\n    }\r\n\r\n    virtual unsigned atomic_load_seq_cst_rmw(atomic_data* RL_RESTRICT data)\r\n    {\r\n        return atomic_load<mo_seq_cst, true>(data);\r\n    }\r\n\r\n    virtual unsigned atomic_store_relaxed(atomic_data* RL_RESTRICT data)\r\n    {\r\n        return atomic_store<mo_relaxed, false>(data);\r\n    }\r\n\r\n    virtual unsigned atomic_store_release(atomic_data* RL_RESTRICT data)\r\n    {\r\n        return atomic_store<mo_release, false>(data);\r\n    }\r\n\r\n    virtual unsigned atomic_store_seq_cst(atomic_data* RL_RESTRICT data)\r\n    {\r\n        return atomic_store<mo_seq_cst, false>(data);\r\n    }\r\n\r\n    virtual unsigned atomic_rmw_relaxed(atomic_data* RL_RESTRICT data, bool& aba)\r\n    {\r\n        return atomic_rmw<mo_relaxed>(data, aba);\r\n    }\r\n\r\n    virtual unsigned atomic_rmw_acquire(atomic_data* RL_RESTRICT data, bool& aba)\r\n    {\r\n        return atomic_rmw<mo_acquire>(data, aba);\r\n    }\r\n\r\n    virtual unsigned atomic_rmw_release(atomic_data* RL_RESTRICT data, bool& aba)\r\n    {\r\n        return atomic_rmw<mo_release>(data, aba);\r\n    }\r\n\r\n    virtual unsigned atomic_rmw_acq_rel(atomic_data* RL_RESTRICT data, bool& aba)\r\n    {\r\n        return atomic_rmw<mo_acq_rel>(data, aba);\r\n    }\r\n\r\n    virtual unsigned atomic_rmw_seq_cst(atomic_data* RL_RESTRICT data, bool& aba)\r\n    {\r\n        return atomic_rmw<mo_seq_cst>(data, aba);\r\n    }\r\n\r\n    template<memory_order mo, bool rmw>\r\n    unsigned get_load_index(atomic_data_impl<thread_count>& var)\r\n    {\r\n        typedef typename atomic_data_impl<thread_count>::history_record history_t;\r\n\r\n        unsigned index = var.current_index_;\r\n        context& c = ctx();\r\n\r\n        if (false == val(rmw))\r\n        {\r\n            size_t const limit = c.is_random_sched() ? atomic_history_size  - 1: 1;\r\n            for (size_t i = 0; i != limit; ++i, --index)\r\n            {\r\n                history_t const& rec = var.history_[index % atomic_history_size];\r\n                if (false == rec.busy_)\r\n                    return (unsigned)-1; // access to unitialized var\r\n\r\n                history_t const& prev = var.history_[(index - 1) % atomic_history_size];\r\n                if (prev.busy_ && prev.first_seen_order_[index_] <= last_yield_)\r\n                    break;\r\n\r\n                if (mo_seq_cst == val(mo) && rec.seq_cst_)\r\n                    break;\r\n\r\n                timestamp_t acq_rel_order =\r\n                    acq_rel_order_[rec.thread_id_];\r\n\r\n                if (acq_rel_order >= rec.acq_rel_timestamp_)\r\n                    break;\r\n\r\n                //  This check ensures read-read coherence, 1.10/16:\r\n                //  If a value computation A of an atomic object M happens before a value\r\n                //  computation B of M, and A takes its value from a side effect X on M,\r\n                //  then the value computed by B shall either be the value stored by X or\r\n                //  the value stored by a side effect Y on M, where Y follows X in the\r\n                //  modification order of M. \r\n                bool stop = false;\r\n                for (thread_id_t i = 0; i != thread_count; ++i)\r\n                {\r\n                    timestamp_t acq_rel_order2 = acq_rel_order_[i];\r\n                    if (acq_rel_order2 >= rec.first_seen_order_[i])\r\n                    {\r\n                        stop = true;\r\n                        break;\r\n                    }\r\n                }\r\n                if (stop)\r\n                    break;\r\n\r\n                if (0 == c.rand(2, sched_type_atomic_load))\r\n                    break;\r\n            }\r\n        }\r\n\r\n        if (false == var.history_[index % atomic_history_size].busy_)\r\n            return (unsigned)-1;\r\n\r\n        return index;\r\n    }\r\n\r\n    template<memory_order mo, bool rmw>\r\n    unsigned atomic_load(atomic_data* RL_RESTRICT data)\r\n    {\r\n        RL_VERIFY(mo_release != mo || rmw);\r\n        RL_VERIFY(mo_acq_rel != mo || rmw);\r\n\r\n        atomic_data_impl<thread_count>& var = \r\n            *static_cast<atomic_data_impl<thread_count>*>(data);\r\n\r\n        typedef typename atomic_data_impl<thread_count>::history_record history_t;\r\n\r\n        unsigned index = get_load_index<mo, rmw>(var);\r\n        if ((unsigned)-1 == index)\r\n            return (unsigned)-1;\r\n\r\n        index %= atomic_history_size;\r\n        history_t& rec = var.history_[index];\r\n        RL_VERIFY(rec.busy_);\r\n\r\n        own_acq_rel_order_ += 1;\r\n        if ((timestamp_t)-1 == rec.first_seen_order_[index_])\r\n            rec.first_seen_order_[index_] = own_acq_rel_order_;\r\n\r\n        bool const synch =\r\n            (mo_acquire == mo\r\n            || mo_acq_rel == mo\r\n            || mo_seq_cst == mo);\r\n\r\n        timestamp_t* acq_rel_order = (synch ? acq_rel_order_ : acquire_fence_order_);\r\n\r\n        foreach<thread_count>(acq_rel_order, rec.acq_rel_order_, assign_max);\r\n\r\n        return index;\r\n    }\r\n\r\n    virtual unsigned atomic_init(atomic_data* RL_RESTRICT data)\r\n    {\r\n        atomic_data_impl<thread_count>& var = \r\n            *static_cast<atomic_data_impl<thread_count>*>(data);\r\n\r\n        typedef typename atomic_data_impl<thread_count>::history_record history_t;\r\n\r\n        unsigned const idx = ++var.current_index_ % atomic_history_size;\r\n        history_t& rec = var.history_[idx];\r\n\r\n        rec.busy_ = true;\r\n        rec.thread_id_ = index_;\r\n        rec.seq_cst_ = false;\r\n        rec.acq_rel_timestamp_ = 0;\r\n\r\n        foreach<thread_count>(rec.acq_rel_order_, assign_zero);\r\n\r\n        return idx;\r\n    }\r\n\r\n    template<memory_order mo, bool rmw>\r\n    unsigned atomic_store(atomic_data* RL_RESTRICT data)\r\n    {\r\n        RL_VERIFY(mo_consume != mo || rmw);\r\n        RL_VERIFY(mo_acquire != mo || rmw);\r\n        RL_VERIFY(mo_acq_rel != mo || rmw);\r\n\r\n        atomic_data_impl<thread_count>& var = \r\n            *static_cast<atomic_data_impl<thread_count>*>(data);\r\n\r\n        typedef typename atomic_data_impl<thread_count>::history_record history_t;\r\n\r\n        unsigned const idx = ++var.current_index_ % atomic_history_size;\r\n        history_t& rec = var.history_[idx];\r\n\r\n        rec.busy_ = true;\r\n        rec.thread_id_ = index_;\r\n        rec.seq_cst_ = (mo_seq_cst == mo);\r\n\r\n        own_acq_rel_order_ += 1;\r\n        rec.acq_rel_timestamp_ = own_acq_rel_order_;\r\n\r\n        foreach<thread_count>(rec.first_seen_order_, assign<(timestamp_t)-1>);\r\n\r\n        rec.first_seen_order_[index_] = own_acq_rel_order_;\r\n\r\n        unsigned const prev_idx = (var.current_index_ - 1) % atomic_history_size;\r\n        history_t& prev = var.history_[prev_idx];\r\n\r\n#ifdef RL_IMPROVED_SEQ_CST_FENCE\r\n        if (val(mo) == mo_release && val(rmw) == false)\r\n            foreach<thread_count>(imp_seq_cst_order_, prev.acq_rel_order_, assign_max);\r\n#endif\r\n\r\n        bool const synch = \r\n            (mo_release == mo\r\n            || mo_acq_rel == mo\r\n            || mo_seq_cst == mo);\r\n\r\n        bool const preserve = \r\n            prev.busy_ && (rmw || (index_ == prev.thread_id_));\r\n\r\n        timestamp_t* acq_rel_order = (synch ? acq_rel_order_ : release_fence_order_);\r\n\r\n        if (preserve)\r\n        {\r\n            foreach<thread_count>(rec.acq_rel_order_, prev.acq_rel_order_, assign);\r\n            foreach<thread_count>(rec.acq_rel_order_, acq_rel_order, assign_max);\r\n        }\r\n        else\r\n        {\r\n            foreach<thread_count>(rec.acq_rel_order_, acq_rel_order, assign);\r\n        }\r\n\r\n        return idx;\r\n    }\r\n\r\n    template<memory_order mo>\r\n    unsigned atomic_rmw(atomic_data* RL_RESTRICT data, bool& aba)\r\n    {\r\n        atomic_data_impl<thread_count>& var = \r\n            *static_cast<atomic_data_impl<thread_count>*>(data);\r\n        timestamp_t const first_seen = var.history_[var.current_index_ % atomic_history_size].first_seen_order_[index_];\r\n        aba = ((timestamp_t)-1 == first_seen);\r\n        atomic_load<mo, true>(data);\r\n        unsigned result = atomic_store<mo, true>(data);\r\n\r\n#ifdef RL_IMPROVED_SEQ_CST_RMW\r\n        atomic_thread_fence_seq_cst(ctx_->seq_cst_fence_order_);\r\n#endif\r\n\r\n        return result;\r\n    }\r\n\r\n    virtual unpark_reason atomic_wait(atomic_data* RL_RESTRICT data, bool is_timed, bool allow_spurious_wakeup, debug_info_param info)\r\n    {\r\n        context& c = ctx();\r\n        atomic_data_impl<thread_count>& var = \r\n            *static_cast<atomic_data_impl<thread_count>*>(data);\r\n        unpark_reason const res = var.futex_ws_.park_current(c, is_timed, allow_spurious_wakeup, false, info);\r\n        if (res == unpark_reason_normal)\r\n            var.futex_sync_.acquire(this);\r\n        return res;\r\n    }\r\n\r\n    virtual thread_id_t atomic_wake(atomic_data* RL_RESTRICT data, thread_id_t count, debug_info_param info)\r\n    {\r\n        context& c = ctx();\r\n        atomic_data_impl<thread_count>& var = \r\n            *static_cast<atomic_data_impl<thread_count>*>(data);\r\n        thread_id_t unblocked = 0;\r\n        for (; count != 0; count -= 1, unblocked += 1)\r\n        {\r\n            if (var.futex_ws_.unpark_one(c, info) == false)\r\n                break;\r\n        }\r\n        if (unblocked != 0)\r\n            var.futex_sync_.release(this);\r\n        return unblocked;\r\n    }\r\n};\r\n\r\n\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/thread_base.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_THREAD_BASE_HPP\r\n#define RL_THREAD_BASE_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n#include \"context_base.hpp\"\r\n//#include \"test_suite.hpp\"\r\n//#include \"memory_order.hpp\"\r\n//#include \"foreach.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\n\r\n\r\nstruct atomic_data;\r\nstruct var_data;\r\ntemplate<thread_id_t thread_count> struct atomic_data_impl;\r\ntemplate<thread_id_t thread_count> struct var_data_impl;\r\n\r\n\r\nclass thread_info_base\r\n{\r\npublic:\r\n    virtual void on_start() = 0;\r\n    virtual void on_finish() = 0;\r\n\r\n    virtual unsigned atomic_init(atomic_data* RL_RESTRICT data) = 0;\r\n\r\n    virtual unsigned atomic_load_relaxed(atomic_data* RL_RESTRICT data) = 0;\r\n    virtual unsigned atomic_load_acquire(atomic_data* RL_RESTRICT data) = 0;\r\n    virtual unsigned atomic_load_seq_cst(atomic_data* RL_RESTRICT data) = 0;\r\n    virtual unsigned atomic_load_relaxed_rmw(atomic_data* RL_RESTRICT data) = 0;\r\n    virtual unsigned atomic_load_acquire_rmw(atomic_data* RL_RESTRICT data) = 0;\r\n    virtual unsigned atomic_load_seq_cst_rmw(atomic_data* RL_RESTRICT data) = 0;\r\n\r\n    virtual unsigned atomic_store_relaxed(atomic_data* RL_RESTRICT data) = 0;\r\n    virtual unsigned atomic_store_release(atomic_data* RL_RESTRICT data) = 0;\r\n    virtual unsigned atomic_store_seq_cst(atomic_data* RL_RESTRICT data) = 0;\r\n\r\n    virtual unsigned atomic_rmw_relaxed(atomic_data* RL_RESTRICT data, bool& aba) = 0;\r\n    virtual unsigned atomic_rmw_acquire(atomic_data* RL_RESTRICT data, bool& aba) = 0;\r\n    virtual unsigned atomic_rmw_release(atomic_data* RL_RESTRICT data, bool& aba) = 0;\r\n    virtual unsigned atomic_rmw_acq_rel(atomic_data* RL_RESTRICT data, bool& aba) = 0;\r\n    virtual unsigned atomic_rmw_seq_cst(atomic_data* RL_RESTRICT data, bool& aba) = 0;\r\n\r\n    virtual unpark_reason atomic_wait(atomic_data* RL_RESTRICT data, bool is_timed, bool allow_spurious_wakeup, debug_info_param info) = 0;\r\n    virtual thread_id_t atomic_wake(atomic_data* RL_RESTRICT data, thread_id_t count, debug_info_param info) = 0;\r\n\r\n    virtual ~thread_info_base() {} // just to calm down gcc\r\n\r\n    fiber_t fiber_;\r\n    thread_id_t const index_;\r\n    context* ctx_;\r\n    timestamp_t* const acq_rel_order_;\r\n    timestamp_t last_yield_;\r\n    timestamp_t& own_acq_rel_order_;\r\n    unpark_reason unpark_reason_;\r\n    thread_id_t temp_switch_from_;\r\n    int saved_disable_preemption_;\r\n    int errno_;\r\n    void* (*dynamic_thread_func_)(void*);\r\n    void* dynamic_thread_param_;\r\n    //unsigned disable_history_;\r\n\r\n    thread_info_base(thread_id_t index, timestamp_t* acq_rel_order)\r\n        : index_(index)\r\n        , acq_rel_order_(acq_rel_order)\r\n        , own_acq_rel_order_(acq_rel_order[index])\r\n    {\r\n    }\r\n\r\nprivate:\r\n    thread_info_base(thread_info_base const&);\r\n    thread_info_base& operator = (thread_info_base const&);\r\n};\r\n\r\n\r\n\r\n\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/thread_local.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_THREAD_LOCAL_HPP\r\n#define RL_THREAD_LOCAL_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n#include \"signature.hpp\"\r\n#include \"context.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\n\r\nclass generic_thread_local : nocopy<>\r\n{\r\npublic:\r\n    generic_thread_local()\r\n        : index_(-1)\r\n    {\r\n    }\r\n\r\n    ~generic_thread_local()\r\n    {\r\n    }\r\n\r\n    void init(void (*dtor)(intptr_t), debug_info_param info)\r\n    {\r\n        sign_.check(info);\r\n        //RL_ASSERT(index_ == -1);\r\n        index_ = ctx().thread_local_alloc(dtor);\r\n    }\r\n\r\n    void deinit(debug_info_param info)\r\n    {\r\n        sign_.check(info);\r\n        RL_ASSERT(index_ != -1);\r\n        ctx().thread_local_free(index_);\r\n        index_ = -1;\r\n    }\r\n\r\n    void set(intptr_t value, debug_info_param info)\r\n    {\r\n        sign_.check(info);\r\n        ctx().thread_local_set(index_, value);\r\n    }\r\n\r\n    intptr_t get(debug_info_param info)\r\n    {\r\n        sign_.check(info);\r\n        return ctx().thread_local_get(index_);\r\n    }\r\n\r\nprivate:\r\n    signature<0xf1724ae2> sign_;\r\n    int index_;\r\n};\r\n\r\n\r\ntemplate<typename T>\r\nclass thread_local_var;\r\n\r\n\r\ntemplate<typename T>\r\nclass thread_local_proxy\r\n{\r\npublic:\r\n    thread_local_proxy(thread_local_var<T>& var, debug_info_param info)\r\n        : var_(var)\r\n        , info_(info)\r\n    {}\r\n\r\n    operator T () const\r\n    {\r\n        return var_.get(info_);\r\n    }\r\n\r\n    T operator -> () const\r\n    {\r\n        return var_.get(info_);\r\n    }\r\n\r\n    thread_local_proxy operator = (T value)\r\n    {\r\n        var_.set(value, info_);\r\n        return *this;\r\n    }\r\n\r\nprivate:\r\n    thread_local_var<T>& var_;\r\n    debug_info info_;\r\n    thread_local_proxy& operator = (thread_local_proxy const&);\r\n};\r\n\r\n\r\ntemplate<typename T>\r\nclass thread_local_var : generic_thread_local\r\n{\r\npublic:\r\n    thread_local_var()\r\n        : ctx_seq_()\r\n    {\r\n    }\r\n\r\n    ~thread_local_var()\r\n    {\r\n        if (is_ctx() && ctx_seq_ == ctx().get_ctx_seq())\r\n        {\r\n            generic_thread_local::deinit($);\r\n        }\r\n    }\r\n\r\n    thread_local_proxy<T> operator () (debug_info_param info)\r\n    {\r\n        return thread_local_proxy<T>(*this, info);\r\n    }\r\n\r\n    void set(T value, debug_info_param info)\r\n    {\r\n        if (ctx_seq_ != ctx().get_ctx_seq())\r\n        {\r\n            ctx_seq_ = ctx().get_ctx_seq();\r\n            generic_thread_local::init(0, info);\r\n        }\r\n        generic_thread_local::set((intptr_t)value, info);\r\n    }\r\n\r\n    T get(debug_info_param info)\r\n    {\r\n        if (ctx_seq_ != ctx().get_ctx_seq())\r\n        {\r\n            ctx_seq_ = ctx().get_ctx_seq();\r\n            generic_thread_local::init(0, info);\r\n        }\r\n        return (T)generic_thread_local::get(info);\r\n    }\r\n\r\nprivate:\r\n    unsigned ctx_seq_;\r\n};\r\n\r\n\r\ninline unsigned long rl_TlsAlloc(debug_info_param info)\r\n{\r\n#ifndef RL_GC\r\n    //!!! may break on x64 platform\r\n    // TLS index is exactly DWORD (not DWORD_PTR), so one has to use indirection\r\n    return (unsigned long)new (info) thread_local_var<void*> ();\r\n#else\r\n    void* p = ctx().alloc(sizeof(thread_local_var<void*>), false, info);\r\n    new (p) thread_local_var<void*> ();\r\n    return (unsigned long)p;\r\n#endif\r\n}\r\n\r\ninline void rl_TlsFree(unsigned long slot, debug_info_param info)\r\n{\r\n#ifndef RL_GC\r\n    delete_impl((thread_local_var<void*>*)slot, info);\r\n#else\r\n    thread_local_var<void*>* t = (thread_local_var<void*>*)slot;\r\n    t->~thread_local_var<void*>();\r\n    ctx().free(t, false, info);\r\n#endif\r\n}\r\n\r\ninline void* rl_TlsGetValue(unsigned long slot, debug_info_param info)\r\n{\r\n    return ((thread_local_var<void*>*)slot)->get(info);\r\n}\r\n\r\ninline int rl_TlsSetValue(unsigned long slot, void* value, debug_info_param info)\r\n{\r\n    ((thread_local_var<void*>*)slot)->set(value, info);\r\n    return 1;\r\n}\r\n\r\n\r\n#define TlsAlloc() rl::rl_TlsAlloc($)\r\n#define TlsFree(slot) rl::rl_TlsFree((slot), $)\r\n#define TlsGetValue(slot) rl::rl_TlsGetValue((slot), $)\r\n#define TlsSetValue(slot, value) rl::rl_TlsSetValue((slot), (value), $)\r\n\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/thread_local_ctx.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_THREAD_LOCAL_CTX_HPP\r\n#define RL_THREAD_LOCAL_CTX_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n#include \"test_params.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\n\r\nstruct thread_local_context_iface\r\n{\r\n    virtual int         thread_local_alloc          (void (*dtor)(intptr_t)) = 0;\r\n    virtual void        thread_local_free           (int index) = 0;\r\n    virtual void        thread_local_set            (int index, intptr_t value) = 0;\r\n    virtual intptr_t    thread_local_get            (int index) = 0;\r\n    virtual             ~thread_local_context_iface () {} // to calm down g++\r\n};\r\n\r\n\r\n\r\n\r\ntemplate<typename base_t, thread_id_t thread_count>\r\nclass thread_local_contxt_impl : protected base_t\r\n{\r\npublic:\r\n    thread_local_contxt_impl(thread_id_t thread_count_param, test_params& params)\r\n        : base_t(thread_count_param, params)\r\n    {\r\n    }\r\n\r\n    void iteration_begin()\r\n    {\r\n        base_t::iteration_begin();\r\n\r\n        for (size_t ent = 0; ent != entries_.size(); ent += 1)\r\n        {\r\n            for (size_t th = 0; th != thread_count; th += 1)\r\n            {\r\n                entries_[ent].value_[th] = 0;\r\n            }\r\n        }\r\n    }\r\n\r\nprivate:\r\n    struct entry\r\n    {\r\n        bool            alive_;\r\n        intptr_t        value_ [thread_count];\r\n        void            (*dtor_) (intptr_t);\r\n    };\r\n\r\n    typename vector<entry>::type            entries_;\r\n    using base_t::current_thread;\r\n\r\n    virtual int         thread_local_alloc          (void (*dtor)(intptr_t))\r\n    {\r\n        int index = find_or_make_unused_entry_index();\r\n        entry& ent = entries_[index];\r\n        ent.alive_ = true;\r\n        ent.dtor_ = dtor;\r\n        for (size_t i = 0; i != thread_count; ++i)\r\n        {\r\n            ent.value_[i] = 0;\r\n        }\r\n        return index;\r\n    }\r\n\r\n    virtual void        thread_local_free           (int index)\r\n    {\r\n        RL_VERIFY(index >= 0 && (size_t)index < entries_.size());\r\n        entry& ent = entries_[index];\r\n        RL_VERIFY(ent.alive_);\r\n        ent.alive_ = false;\r\n        if (ent.dtor_)\r\n        {\r\n            for (size_t i = 0; i != thread_count; ++i)\r\n            {\r\n                if (ent.value_[i])\r\n                {\r\n                    ent.dtor_(ent.value_[i]);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    virtual void        thread_local_set            (int index, intptr_t value)\r\n    {\r\n        RL_VERIFY(index >= 0 && (size_t)index < entries_.size());\r\n        entry& ent = entries_[index];\r\n        RL_VERIFY(ent.alive_);\r\n        ent.value_[current_thread()] = value;\r\n    }\r\n\r\n    virtual intptr_t    thread_local_get            (int index)\r\n    {\r\n        RL_VERIFY(index >= 0 && (size_t)index < entries_.size());\r\n        entry& ent = entries_[index];\r\n        RL_VERIFY(ent.alive_);\r\n        return ent.value_[current_thread()];\r\n    }\r\n\r\n    int find_or_make_unused_entry_index()\r\n    {\r\n        int index;\r\n        for (index = 0; index < (int)entries_.size(); ++index)\r\n        {\r\n            if (!entries_[index].alive_)\r\n            {\r\n                return (int)index;\r\n            }\r\n        }\r\n        entries_.resize(index + 1);\r\n        return index;\r\n    }\r\n};\r\n\r\n\r\n\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/var.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_VAR_HPP\r\n#define RL_VAR_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n#include \"context.hpp\"\r\n#include \"signature.hpp\"\r\n#include \"atomic_events.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\ntemplate<typename T>\r\nclass var;\r\n\r\n\r\n\r\ntemplate<typename T>\r\nclass var_proxy_const\r\n{\r\npublic:\r\n    var_proxy_const(var<T> const& v, debug_info_param info)\r\n        : var_(const_cast<var<T>&>(v))\r\n        , info_(info)\r\n    {\r\n    }\r\n\r\n    T load() const\r\n    {\r\n        return var_.load(info_);\r\n    }\r\n\r\n    operator T () const\r\n    {\r\n        return this->load();\r\n    }\r\n\r\n    T const operator -> () const\r\n    {\r\n        return this->load();\r\n    }\r\n\r\nprotected:\r\n    var<T>& var_;\r\n    debug_info info_;\r\n\r\nprivate:\r\n    var_proxy_const& operator = (var_proxy_const const&);\r\n};\r\n\r\n\r\n\r\n\r\ntemplate<typename T>\r\nclass var_proxy : public var_proxy_const<T>\r\n{\r\npublic:\r\n    typedef typename atomic_add_type<T>::type add_type;\r\n\r\n    var_proxy(var<T>& v, debug_info_param info)\r\n        : var_proxy_const<T>(v, info)\r\n    {\r\n    }\r\n\r\n    void store(T value)\r\n    {\r\n        this->var_.store(value, this->info_);\r\n    }\r\n\r\n    template<typename Y>\r\n    T operator = (var_proxy_const<Y> const& v)\r\n    {\r\n        Y y = v.load();\r\n        T t = y;\r\n        store(t);\r\n        return t;\r\n    }\r\n\r\n    T operator = (var_proxy<T> const& v)\r\n    {\r\n        T t = v.load();\r\n        store(t);\r\n        return t;\r\n    }\r\n\r\n    T operator = (T value)\r\n    {\r\n        store(value);\r\n        return value;\r\n    }\r\n\r\n    T operator -> ()\r\n    {\r\n        return this->load();\r\n    }\r\n\r\n    T operator ++ (int)\r\n    {\r\n        T v = this->load();\r\n        T y = ++v;\r\n        this->store(y);\r\n        return v;\r\n    }\r\n\r\n    T operator -- (int)\r\n    {\r\n        T v = this->load();\r\n        T y = --v;\r\n        this->store(y);\r\n        return v;\r\n    }\r\n\r\n    T operator ++ ()\r\n    {\r\n        T v = this->load();\r\n        this->store(++v);\r\n        return v;\r\n    }\r\n\r\n    T operator -- ()\r\n    {\r\n        T v = this->load();\r\n        this->store(--v);\r\n        return v;\r\n    }\r\n\r\n    T operator += (add_type value)\r\n    {\r\n        T v = this->load();\r\n        v += value;\r\n        this->store(v);\r\n        return v;\r\n    }\r\n\r\n    T operator -= (add_type value)\r\n    {\r\n        T v = this->load();\r\n        v -= value;\r\n        this->store(v);\r\n        return v;\r\n    }\r\n\r\n    T operator &= (T value)\r\n    {\r\n        T v = this->load();\r\n        v &= value;\r\n        this->store(v);\r\n        return v;\r\n    }\r\n\r\n    T operator |= (T value)\r\n    {\r\n        T v = this->load();\r\n        v |= value;\r\n        this->store(v);\r\n        return v;\r\n    }\r\n\r\n    T operator ^= (T value)\r\n    {\r\n        T v = this->load();\r\n        v ^= value;\r\n        this->store(v);\r\n        return v;\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\ntemplate<typename T>\r\nstruct var_event\r\n{\r\n    debug_info var_info_;\r\n    var<T> const* var_addr_;\r\n    T value_;\r\n    bool load_;\r\n\r\n    template<typename Y>\r\n    struct map_type\r\n    {\r\n        typedef T result;\r\n    };\r\n\r\n    template<typename Y>\r\n    struct map_type<Y*>\r\n    {\r\n        typedef void* result;\r\n    };\r\n\r\n    void output(std::ostream& s) const\r\n    {\r\n        s << \"<\" << std::hex << var_addr_ << std::dec << \"> \"\r\n            << (load_ ? \"load\" : \"store\") << \", value=\" << (typename map_type<T>::result)value_;\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\ntemplate<typename T>\r\nclass var\r\n{\r\npublic:\r\n    var()\r\n    {\r\n        value_ = 0;\r\n        initialized_ = false;\r\n        data_ = ctx().var_ctor();\r\n    }\r\n\r\n    var(T value)\r\n    {\r\n        init(value);\r\n    }\r\n\r\n    var(var const& r)\r\n    {\r\n        init(r.load($));\r\n    }\r\n\r\n    ~var()\r\n    {\r\n        sign_.check($);\r\n        ctx().var_dtor(data_);\r\n    }\r\n\r\n    var_proxy_const<T> operator () (debug_info_param info) const\r\n    {\r\n        return var_proxy_const<T>(*this, info);\r\n    }\r\n\r\n    var_proxy<T> operator () (debug_info_param info)\r\n    {\r\n        return var_proxy<T>(*this, info);\r\n    }\r\n\r\nprivate:\r\n    T value_;\r\n    bool initialized_;\r\n\r\n    var_data* data_;\r\n\r\n    signature<123456789> sign_;\r\n    friend class var_proxy<T>;\r\n    friend class var_proxy_const<T>;\r\n\r\n    void init(T value)\r\n    {\r\n        context& c = ctx();\r\n        initialized_ = true;\r\n        value_ = value;\r\n        data_ = ctx().var_ctor();\r\n        data_->init(*c.threadx_);\r\n    }\r\n\r\n    T load(debug_info_param info) const\r\n    {\r\n        context& c = ctx();\r\n        sign_.check(info);\r\n\r\n        if (false == initialized_)\r\n        {\r\n            RL_HIST(var_event<T>) {RL_INFO, this, T(), true} RL_HIST_END();\r\n            RL_ASSERT_IMPL(false, test_result_unitialized_access, \"\", info);\r\n        }\r\n\r\n        if (false == c.invariant_executing)\r\n        {\r\n            if (false == data_->load(*c.threadx_))\r\n            {\r\n                RL_HIST(var_event<T>) {RL_INFO, this, T(), true} RL_HIST_END();\r\n                RL_ASSERT_IMPL(false, test_result_data_race, \"data race detected\", info);\r\n            }\r\n\r\n            T const v = value_;\r\n\r\n            RL_HIST(var_event<T>) {RL_INFO, this, v, true} RL_HIST_END();\r\n\r\n            return v;\r\n        }\r\n        else\r\n        {\r\n            return value_;\r\n        }\r\n    }\r\n\r\n    void store(T v, debug_info_param info)\r\n    {\r\n        context& c = ctx();\r\n        RL_VERIFY(false == c.invariant_executing);\r\n        sign_.check(info);\r\n\r\n        if (initialized_)\r\n        {\r\n            if (false == data_->store(*c.threadx_))\r\n            {\r\n                RL_HIST(var_event<T>) {RL_INFO, this, T(), false} RL_HIST_END();\r\n                RL_ASSERT_IMPL(false, test_result_data_race, \"data race detected\", info);\r\n            }\r\n        }\r\n        else\r\n        {\r\n            initialized_ = true;\r\n            data_->init(*c.threadx_);\r\n        }\r\n\r\n        value_ = v;\r\n\r\n        RL_HIST(var_event<T>) {RL_INFO, this, v, false} RL_HIST_END();\r\n    }\r\n\r\n    var& operator = (var const& r);\r\n};\r\n\r\n\r\n\r\n\r\ntemplate<thread_id_t thread_count>\r\nstruct var_data_impl : var_data\r\n{\r\n    typedef thread_info<thread_count> thread_info_t;\r\n\r\n    timestamp_t load_acq_rel_timestamp_ [thread_count];\r\n    timestamp_t store_acq_rel_timestamp_ [thread_count];\r\n\r\n    var_data_impl()\r\n    {\r\n        foreach<thread_count>(load_acq_rel_timestamp_, assign_zero);\r\n        foreach<thread_count>(store_acq_rel_timestamp_, assign_zero);\r\n    }\r\n\r\n    virtual void init(thread_info_base& th)\r\n    {\r\n        th.own_acq_rel_order_ += 1;\r\n        store_acq_rel_timestamp_[th.index_] = th.own_acq_rel_order_;\r\n    }\r\n\r\n    virtual bool store(thread_info_base& th)\r\n    {\r\n        for (thread_id_t i = 0; i != thread_count; ++i)\r\n        {\r\n            if (th.acq_rel_order_[i] < store_acq_rel_timestamp_[i])\r\n                return false;\r\n            if (th.acq_rel_order_[i] < load_acq_rel_timestamp_[i])\r\n                return false;\r\n        }\r\n\r\n        th.own_acq_rel_order_ += 1;\r\n        store_acq_rel_timestamp_[th.index_] = th.own_acq_rel_order_;\r\n        return true;\r\n    }\r\n\r\n    virtual bool load(thread_info_base& th)\r\n    {\r\n        for (thread_id_t i = 0; i != thread_count; ++i)\r\n        {\r\n            if (th.acq_rel_order_[i] < store_acq_rel_timestamp_[i])\r\n                return false;\r\n        }\r\n\r\n        th.own_acq_rel_order_ += 1;\r\n        load_acq_rel_timestamp_[th.index_] = th.own_acq_rel_order_;\r\n        return true;\r\n    }\r\n\r\n    virtual ~var_data_impl() {} // just to calm down gcc\r\n};\r\n\r\n\r\n\r\n}\r\n\r\n\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/volatile.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_VOLATILE_HPP\r\n#define RL_VOLATILE_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/waitset.hpp",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_WAITSET_HPP\r\n#define RL_WAITSET_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#include \"base.hpp\"\r\n#include \"thread_base.hpp\"\r\n#include \"context_base.hpp\"\r\n\r\n\r\nnamespace rl\r\n{\r\n\r\n\r\ntemplate<thread_id_t thread_count>\r\nclass waitset\r\n{\r\npublic:\r\n    waitset()\r\n    {\r\n        size_ = 0;\r\n    }\r\n\r\n    unpark_reason park_current(context& c,\r\n                               bool is_timed,\r\n                               bool allow_spurious_wakeup,\r\n                               bool do_switch,\r\n                               debug_info_param info)\r\n    {\r\n        RL_VERIFY(size_ < thread_count);\r\n        thread_info_base* th = c.threadx_;\r\n        thread_desc desc = {th, 0, 0, 0, false, do_switch};\r\n        set_[size_] = desc;\r\n        size_ += 1;\r\n        unpark_reason reason = c.park_current_thread(is_timed, allow_spurious_wakeup, do_switch, info);\r\n        if (reason == unpark_reason_normal)\r\n        {\r\n            if (do_switch)\r\n                RL_VERIFY(c.threadx_->temp_switch_from_ != -1);\r\n            else\r\n                RL_VERIFY(c.threadx_->temp_switch_from_ == -1);\r\n        }\r\n        else\r\n        {\r\n            remove(th);\r\n        }\r\n        return reason;\r\n    }\r\n\r\n    static unpark_reason park_current(context& c,\r\n                                      waitset** ws,\r\n                                      win_waitable_object** wo,\r\n                                      size_t count,\r\n                                      bool wait_all,\r\n                                      bool is_timed,\r\n                                      bool do_switch,\r\n                                      debug_info_param info)\r\n    {\r\n        thread_info_base* th = c.threadx_;\r\n        thread_desc desc = {th, (unsigned)count, ws, wo, wait_all, do_switch};\r\n        for (unsigned wsi = 0; wsi != count; ++wsi)\r\n        {\r\n            RL_VERIFY(ws[wsi]->size_ < thread_count);\r\n            ws[wsi]->set_[ws[wsi]->size_] = desc;\r\n            ws[wsi]->size_ += 1;\r\n        }\r\n        unpark_reason reason = c.park_current_thread(is_timed, false, do_switch, info);\r\n        if (reason == unpark_reason_normal)\r\n        {\r\n            if (do_switch)\r\n                RL_VERIFY(c.threadx_->temp_switch_from_ != -1);\r\n            else\r\n                RL_VERIFY(c.threadx_->temp_switch_from_ == -1);\r\n        }\r\n        else\r\n        {\r\n            remove(th, ws, (unsigned)count);\r\n        }\r\n        return reason;\r\n    }\r\n\r\n    bool unpark_one(context& c, debug_info_param info)\r\n    {\r\n        if (0 == size_)\r\n            return false;\r\n        //!!! too high preassure on full sched\r\n        thread_id_t idx = c.rand(size_, sched_type_user);\r\n        if (try_remove(c, idx, info))\r\n            return true;\r\n        for (idx = 0; idx != size_; idx += 1)\r\n        {\r\n            if (try_remove(c, idx, info))\r\n                return true;\r\n        }\r\n        return false;\r\n    }\r\n\r\n    thread_id_t unpark_all(context& c, debug_info_param info)\r\n    {\r\n        thread_id_t cnt = 0;\r\n        for (thread_id_t idx = 0; idx != size_; idx += 1)\r\n        {\r\n            if (try_remove(c, idx, info))\r\n            {\r\n                cnt += 1;\r\n                idx -= 1;\r\n            }\r\n        }\r\n        return cnt;\r\n    }\r\n\r\n    thread_id_t size() const\r\n    {\r\n        return size_;\r\n    }\r\n\r\n    operator bool () const\r\n    {\r\n        return 0 != size_;\r\n    }\r\n\r\nprivate:\r\n    struct thread_desc\r\n    {\r\n        thread_info_base*       th_;\r\n        unsigned                count_;     // 0 - wfso, !0 - wfmo\r\n        waitset**               ws_;        // 0 - wfso, !0 - wfmo\r\n        win_waitable_object**   wo_;        // 0 - wfso, !0 - wfmo\r\n        bool                    wait_all_;\r\n        bool                    do_switch_;\r\n    };\r\n\r\n    thread_desc                 set_ [thread_count];\r\n    thread_id_t                 size_;\r\n\r\n    bool try_remove(context& c, thread_id_t const idx, debug_info_param info)\r\n    {\r\n        RL_VERIFY(idx < size_);\r\n        thread_desc const& d = set_[idx];\r\n        if (d.count_ != 0 && d.wait_all_ == true)\r\n        {\r\n            for (size_t i = 0; i != d.count_; i += 1)\r\n            {\r\n                if (d.wo_[i]->is_signaled(info) == false)\r\n                    return false;\r\n            }\r\n        }\r\n        size_t const tid = d.th_->index_;\r\n        bool const do_switch = d.do_switch_;\r\n        if (d.ws_)\r\n            remove(d.th_, d.ws_, d.count_);\r\n        else\r\n            remove(d.th_);\r\n        c.unpark_thread(tid, do_switch, info);\r\n        return true;\r\n    }\r\n\r\n    void remove(thread_info_base* th)\r\n    {\r\n        thread_id_t size = size_;\r\n        thread_id_t i = 0;\r\n        for (; i != size; ++i)\r\n        {\r\n            if (set_[i].th_ == th)\r\n                break;\r\n        }\r\n        RL_VERIFY(i != size);\r\n        for (thread_id_t j = i + 1; j != size; ++j)\r\n        {\r\n            set_[j - 1] = set_[j];\r\n        }\r\n        size_ -= 1;\r\n    }\r\n\r\n    static void remove(thread_info_base* th, waitset** ws, unsigned count)\r\n    {\r\n        for (unsigned wsi = 0; wsi != count; ++wsi)\r\n        {\r\n            ws[wsi]->remove(th);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n}\r\n\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/relacy/windows.h",
    "content": "/*  Relacy Race Detector\r\n *  Copyright (c) 2008-2013, Dmitry S. Vyukov\r\n *  All rights reserved.\r\n *  This software is provided AS-IS with no warranty, either express or implied.\r\n *  This software is distributed under a license and may not be copied,\r\n *  modified or distributed except as expressly authorized under the\r\n *  terms of the license contained in the file LICENSE in this distribution.\r\n */\r\n\r\n#ifndef RL_WINDOWS_IFACE_HPP\r\n#define RL_WINDOWS_IFACE_HPP\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n\r\n#include \"relacy.hpp\"\r\n#include \"stdlib/windows.hpp\"\r\n\r\n\r\n#endif\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/addr_hash.hpp",
    "content": "#pragma once\r\n\r\n#include \"../relacy/relacy_std.hpp\"\r\n\r\n\r\n\r\nstruct test_addr_hash : rl::test_suite<test_addr_hash, 2>\r\n{\r\n    void* p1;\r\n    void* p2;\r\n    size_t h1, h2;\r\n    static size_t const table_size = 1000;\r\n\r\n    void before()\r\n    {\r\n        p1 = malloc(0);\r\n        h1 = rl::hash_ptr(p1, table_size);\r\n        p2 = malloc(0);\r\n        h2 = rl::hash_ptr(p2, table_size);\r\n    }\r\n\r\n    void after()\r\n    {\r\n        free(p1);\r\n        free(p2);\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        assert(h1 == rl::hash_ptr(p1, table_size));\r\n        assert(h2 == rl::hash_ptr(p2, table_size));\r\n        assert(rl::hash_ptr(&index, table_size) == rl::hash_ptr(&index,table_size));\r\n        assert(rl::hash_ptr(0, table_size) == rl::hash_ptr(0, table_size));\r\n\r\n    }\r\n};\r\n\r\n\r\nstruct test_addr_hash2 : rl::test_suite<test_addr_hash2, 2, rl::test_result_until_condition_hit>\r\n{\r\n    static size_t const table_size = 4;\r\n    std::atomic<int> table [table_size];\r\n\r\n    void before()\r\n    {\r\n        for (size_t i = 0; i != table_size; i += 1)\r\n            table[i].store(0, std::memory_order_relaxed);\r\n    }\r\n\r\n    void thread(unsigned)\r\n    {\r\n        for (size_t i = 0; i != table_size + 1; i += 1)\r\n        {\r\n            void* p = malloc(0);\r\n            size_t idx = rl::hash_ptr(p, table_size);\r\n            free(p);\r\n            int v = table[idx].exchange(1, std::memory_order_relaxed);\r\n            RL_UNTIL(v);\r\n        }\r\n    }\r\n};\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/advanced.txt",
    "content": "Test parameters. You can specify various parameters for test.\r\nrl::test_params p;\r\np.search_type = rl::fair_context_bound_scheduler_type;\r\np.context_bound = 1;\r\np.execution_depth_limit = 1000;\r\nrl::simulate<test_t>(p);\r\n\r\nThe main parameter is scheduler type used for simulation. There is 3 types of scheduler:\r\nrandom_scheduler_type - random exploration of state space\r\nfair_full_search_scheduler_type - exhaustive systematic exploration of state space\r\nfair_context_bound_scheduler_type - systematic exploration of state space with limit on context switches.\r\n\r\nFor random_scheduler_type you can specify 'iteration_count' parameter - number of explored executions.\r\nFor fair_context_bound_scheduler_type you can specify 'context_bound' parameter - limit on context switches.\r\n\r\nAlso you can specify 'execution_depth_limit' parameter - used for livelock detection. All executions with trace longer than execution_depth_limit will be treated as livelocked (or non-terminating).\r\n\r\nAlso from test_params structure you can receive output parameters from simulation. Main output parameter is 'test_result' which describes cause of test failure.\r\n\r\nIf you use fair_full_search_scheduler_type or fair_context_bound_scheduler_type, in order to ensure fairness of scheduler, you must use 'yield' calls in all 'spin-loops', otherwise simulation will report non-terminating execution. Example:\r\n\r\nstruct race_seq_ld_ld_test : rl::test_suite<race_seq_ld_ld_test, 2>\r\n{\r\n    std::atomic<int> a;\r\n    rl::var<int> x;\r\n\r\n    void before()\r\n    {\r\n        a($) = 0;\r\n        x($) = 0;\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (index)\r\n        {\r\n            x($).load();\r\n            a($).store(1, std::memory_order_relaxed);\r\n        }\r\n        else\r\n        {\r\n            rl::backoff b;\r\n            while (0 == a($).load(rl::memory_order_relaxed))\r\n                  b.yield($);\r\n            x($).load();\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/compare_swap.hpp",
    "content": "#pragma once\r\n\r\n#include \"../relacy/relacy_std.hpp\"\r\n\r\n\r\n\r\ntemplate<int T>\r\nstruct cas_spurious_fail_test : rl::test_suite<cas_spurious_fail_test<T>, 1, rl::test_result_until_condition_hit>\r\n{\r\n    std::atomic<int> x;\r\n    std::atomic<int> y;\r\n\r\n    void before()\r\n    {\r\n        x.store(0, std::memory_order_relaxed);\r\n        y.store(0, std::memory_order_relaxed);\r\n    }\r\n\r\n    void thread(unsigned /*index*/)\r\n    {\r\n        int cmp = 0;\r\n        if (x.compare_exchange_weak(cmp, 1, std::memory_order_seq_cst, std::memory_order_seq_cst))\r\n        {\r\n            cmp = 1;\r\n            if (x.compare_exchange_weak(cmp, 2, std::memory_order_seq_cst))\r\n            {\r\n                cmp = 0;\r\n                if (y.compare_exchange_weak(cmp, 1, std::memory_order_seq_cst))\r\n                {\r\n                }\r\n                else\r\n                {\r\n                    if (T == 2) RL_UNTIL(true);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if (T == 1) RL_UNTIL(true);\r\n            }\r\n        }\r\n        else\r\n        {\r\n            if (T == 0) RL_UNTIL(true);\r\n        }\r\n    }\r\n};\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/condvar.hpp",
    "content": "#pragma once\r\n\r\n#include \"../relacy/relacy_std.hpp\"\r\n\r\n\r\n\r\nstruct test_condvar : rl::test_suite<test_condvar, 2>\r\n{\r\n    std::mutex mtx;\r\n    std::condition_variable cv;\r\n    rl::var<int> data;\r\n\r\n    void before()\r\n    {\r\n        data($) = 0;\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            mtx.lock($);\r\n            data($) += 1;\r\n            mtx.unlock($);\r\n            cv.notify_one($);\r\n        }\r\n        else\r\n        {\r\n            mtx.lock($);\r\n            while (0 == data($))\r\n            {\r\n                cv.wait(mtx, $);\r\n            }\r\n            mtx.unlock($);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct test_condvar2 : rl::test_suite<test_condvar2, 3>\r\n{\r\n    rl::var<int> stage;\r\n    std::mutex mtx;\r\n    std::condition_variable cv;\r\n\r\n    void before()\r\n    {\r\n        stage($) = 0;\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            mtx.lock($);\r\n            stage($) += 1;\r\n            cv.notify_all($);\r\n            while (stage($) != 2)\r\n                cv.wait(mtx, $);\r\n            mtx.unlock($);\r\n        }\r\n        else if (1 == index)\r\n        {\r\n            mtx.lock($);\r\n            while (stage($) != 1)\r\n                cv.wait(mtx, $);\r\n            stage($) += 1;\r\n            cv.notify_all($);\r\n            mtx.unlock($);\r\n        }\r\n        else if (2 == index)\r\n        {\r\n            mtx.lock($);\r\n            while (stage($) != 2)\r\n                cv.wait(mtx, $);\r\n            mtx.unlock($);\r\n        }\r\n    }\r\n};\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/data_race.hpp",
    "content": "#pragma once\r\n\r\n#include \"../relacy/relacy_std.hpp\"\r\n\r\n\r\n\r\n\r\nstruct race_ld_ld_test : rl::test_suite<race_ld_ld_test, 2>\r\n{\r\n    rl::var<int> x;\r\n\r\n    void before()\r\n    {\r\n        x($) = 0;\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (index)\r\n            x($).load();\r\n        else\r\n            x($).load();\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct race_ld_st_test : rl::test_suite<race_ld_st_test, 2, rl::test_result_data_race>\r\n{\r\n    rl::var<int> x;\r\n\r\n    void before()\r\n    {\r\n        x($) = 0;\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (index)\r\n            x($).load();\r\n        else\r\n            x($).store(1);\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct race_st_st_test : rl::test_suite<race_st_st_test, 2, rl::test_result_data_race>\r\n{\r\n    rl::var<int> x;\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (index)\r\n            x($).store(1);\r\n        else\r\n            x($).store(1);\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct race_seq_ld_ld_test : rl::test_suite<race_seq_ld_ld_test, 2>\r\n{\r\n    std::atomic<int> a;\r\n    rl::var<int> x;\r\n\r\n    void before()\r\n    {\r\n        a($) = 0;\r\n        x($) = 0;\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (index)\r\n        {\r\n            x($).load();\r\n            a.store(1, std::memory_order_relaxed);\r\n        }\r\n        else\r\n        {\r\n            rl::backoff b;\r\n            while (0 == a.load(std::memory_order_relaxed))\r\n                b.yield($);\r\n            x($).load();\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct race_seq_ld_st_test : rl::test_suite<race_seq_ld_st_test, 2, rl::test_result_data_race>\r\n{\r\n    std::atomic<int> a;\r\n    rl::var<int> x;\r\n\r\n    void before()\r\n    {\r\n        a($) = 0;\r\n        x($) = 0;\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (index)\r\n        {\r\n            x($).load();\r\n            a.store(1, std::memory_order_relaxed);\r\n        }\r\n        else\r\n        {\r\n            rl::backoff b;\r\n            while (0 == a.load(std::memory_order_relaxed))\r\n                b.yield($);\r\n            x($).store(1);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct race_seq_st_ld_test : rl::test_suite<race_seq_st_ld_test, 2, rl::test_result_data_race>\r\n{\r\n    std::atomic<int> a;\r\n    rl::var<int> x;\r\n\r\n    void before()\r\n    {\r\n        a($) = 0;\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            x($).store(1);\r\n            a.store(1, std::memory_order_relaxed);\r\n        }\r\n        else\r\n        {\r\n            rl::backoff b;\r\n            while (0 == a.load(std::memory_order_relaxed))\r\n                b.yield($);\r\n            x($).load();\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct race_seq_st_st_test : rl::test_suite<race_seq_st_st_test, 2, rl::test_result_data_race>\r\n{\r\n    std::atomic<int> a;\r\n    rl::var<int> x;\r\n\r\n    void before()\r\n    {\r\n        a($) = 0;\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (index)\r\n        {\r\n            x($).store(1);\r\n            a.store(1, std::memory_order_relaxed);\r\n        }\r\n        else\r\n        {\r\n            rl::backoff b;\r\n            while (0 == a.load(std::memory_order_relaxed))\r\n                b.yield($);\r\n            VAR(x) = 1;\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct race_uninit_test : rl::test_suite<race_uninit_test, 2, rl::test_result_unitialized_access>\r\n{\r\n    std::atomic<int> a;\r\n    std::atomic<int> x;\r\n\r\n    void before()\r\n    {\r\n        a($) = 0;\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (index)\r\n        {\r\n            x.store(1, std::memory_order_relaxed);\r\n            a.store(1, std::memory_order_relaxed);\r\n        }\r\n        else\r\n        {\r\n            rl::backoff b;\r\n            while (0 == a.load(std::memory_order_relaxed))\r\n                b.yield($);\r\n            x.load(std::memory_order_seq_cst);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct race_indirect_test : rl::test_suite<race_indirect_test, 2, rl::test_result_data_race>\r\n{\r\n    std::atomic<int> a;\r\n    rl::var<int> x;\r\n\r\n    void before()\r\n    {\r\n        a($) = 0;\r\n        x($) = 0;\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            x($) = 1;\r\n            a.store(1, std::memory_order_release);\r\n            (void)(int)x($);\r\n        }\r\n        else\r\n        {\r\n            rl::backoff b;\r\n            while (0 == a.load(std::memory_order_acquire))\r\n                b.yield($);\r\n            (void)(int)x($);\r\n            x($) = 2;\r\n        }\r\n    }\r\n};\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/detection.txt",
    "content": " - Race condition (accoring to ISO C++0x)\r\n - Access to uninitialized variable\r\n - Access to freed memory\r\n - Double free\r\n - Memory leak\r\n - Deadlock\r\n - Livelock\r\n - User assert failed\r\n - User invariant failed\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/dyn_thread.hpp",
    "content": "#pragma once\r\n\r\n#include \"../relacy/relacy.hpp\"\r\n#include \"../relacy/dyn_thread.hpp\"\r\n\r\n\r\n\r\nstruct dyn_thread_basic_test : rl::test_suite<dyn_thread_basic_test, 2>\r\n{\r\n    static unsigned const dynamic_thread_count = 4;\r\n\r\n    rl::var<int> data1;\r\n    rl::var<int> data2;\r\n    rl::atomic<int> data3;\r\n\r\n    void before()\r\n    {\r\n        data3($) = 0;\r\n    }\r\n\r\n    static void* thread1(void* p)\r\n    {\r\n        dyn_thread_basic_test& self = *(dyn_thread_basic_test*)p;\r\n        self.data1($) = 1;\r\n        return 0;\r\n    }\r\n\r\n    static void* thread2(void* p)\r\n    {\r\n        dyn_thread_basic_test& self = *(dyn_thread_basic_test*)p;\r\n        self.data2($) = 2;\r\n        return 0;\r\n    }\r\n\r\n    static void* thread3(void* p)\r\n    {\r\n        dyn_thread_basic_test& self = *(dyn_thread_basic_test*)p;\r\n        self.data3.store(3, rl::memory_order_relaxed);\r\n        return 0;\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (index == 0)\r\n        {\r\n            rl::dyn_thread t1;\r\n            t1.start(&dyn_thread_basic_test::thread1, this);\r\n            rl::dyn_thread t2;\r\n            t2.start(&dyn_thread_basic_test::thread2, this);\r\n            t1.join();\r\n            t2.join();\r\n            RL_ASSERT(data1($) == 1);\r\n            RL_ASSERT(data2($) == 2);\r\n        }\r\n        else if (index == 1)\r\n        {\r\n            rl::dyn_thread t1;\r\n            t1.start(&dyn_thread_basic_test::thread3, this);\r\n            while (data3.load(rl::memory_order_relaxed) != 3)\r\n                rl::yield(1, $);\r\n            t1.join();\r\n        }\r\n        else\r\n        {\r\n            RL_ASSERT(false);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct dyn_thread_win32_test : rl::test_suite<dyn_thread_win32_test, 2>\r\n{\r\n    static unsigned const dynamic_thread_count = 4;\r\n\r\n    rl::var<int> data1;\r\n    rl::var<int> data2;\r\n    rl::atomic<int> data3;\r\n\r\n    void before()\r\n    {\r\n        data3($) = 0;\r\n    }\r\n\r\n    static unsigned long RL_STDCALL thread1(void* p)\r\n    {\r\n        dyn_thread_win32_test& self = *(dyn_thread_win32_test*)p;\r\n        self.data1($) = 1;\r\n        return 0;\r\n    }\r\n\r\n    static unsigned long RL_STDCALL thread2(void* p)\r\n    {\r\n        dyn_thread_win32_test& self = *(dyn_thread_win32_test*)p;\r\n        self.data2($) = 2;\r\n        return 0;\r\n    }\r\n\r\n    static unsigned long RL_STDCALL thread3(void* p)\r\n    {\r\n        dyn_thread_win32_test& self = *(dyn_thread_win32_test*)p;\r\n        self.data3.store(3, rl::memory_order_relaxed);\r\n        return 0;\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (index == 0)\r\n        {\r\n            HANDLE threads [2];\r\n            threads[0] = CreateThread(0, 0, &dyn_thread_win32_test::thread1, this, 0, 0);\r\n            threads[1] = CreateThread(0, 0, &dyn_thread_win32_test::thread2, this, 0, 0);\r\n            WaitForMultipleObjects(2, threads, 1, INFINITE);\r\n            RL_ASSERT(VAR(data1) == 1);\r\n            RL_ASSERT(VAR(data2) == 2);\r\n        }\r\n        else if (index == 1)\r\n        {\r\n            HANDLE th = CreateThread(0, 0, &dyn_thread_win32_test::thread3, this, 0, 0);\r\n            while (data3.load(rl::memory_order_relaxed) != 3)\r\n                rl::yield(1, $);\r\n            WaitForSingleObject(th, INFINITE);\r\n        }\r\n        else\r\n        {\r\n            RL_ASSERT(false);\r\n        }\r\n    }\r\n};\r\n\r\n\r\nstruct dyn_thread_visibility_test : rl::test_suite<dyn_thread_visibility_test, 1>\r\n{\r\n    static unsigned const dynamic_thread_count = 1;\r\n\r\n    rl::var<int> data;\r\n\r\n    static unsigned long RL_STDCALL thread(void* p)\r\n    {\r\n        dyn_thread_visibility_test& self = *(dyn_thread_visibility_test*)p;\r\n        RL_ASSERT(self.data($) == 1);\r\n        self.data($) = 2;\r\n        return 0;\r\n    }\r\n\r\n    void thread(unsigned /*index*/)\r\n    {\r\n        data($) = 1;\r\n        HANDLE th = CreateThread(0, 0, &dyn_thread_visibility_test::thread, this, 0, 0);\r\n        WaitForSingleObject(th, INFINITE);\r\n        RL_ASSERT(data($) == 2);\r\n    }\r\n};\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/event.hpp",
    "content": "#pragma once\r\n\r\n#include \"../relacy/relacy_std.hpp\"\r\n\r\n\r\n\r\nstruct test_event_auto : rl::test_suite<test_event_auto, 2>\r\n{\r\n    HANDLE ev;\r\n    VAR_T(int) data;\r\n\r\n    void before()\r\n    {\r\n        VAR(data) = 0;\r\n        ev = CreateEvent(0, 0, 0, 0);\r\n    }\r\n\r\n    void after()\r\n    {\r\n        CloseHandle(ev);\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            VAR(data) = 1;\r\n            SetEvent(ev);\r\n        }\r\n        else\r\n        {\r\n            unsigned rv = WaitForSingleObject(ev, INFINITE);\r\n            assert(rv == WAIT_OBJECT_0);\r\n            assert(VAR(data) == 1);\r\n\t\t\t\t\t\trv = WaitForSingleObject(ev, 0);\r\n\t\t\t\t\t\tassert(rv == WAIT_TIMEOUT);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct test_event_atomic : rl::test_suite<test_event_atomic, 2>\r\n{\r\n\tHANDLE ev1;\r\n\tHANDLE ev2;\r\n\t\r\n\tvoid before()\r\n\t{\r\n\t\tev1 = CreateEvent(0, 0, 0, 0);\r\n\t\tev2 = CreateEvent(0, 0, 0, 0);\r\n\t}\r\n\t\r\n\tvoid after()\r\n\t{\r\n\t\tCloseHandle(ev1);\r\n\t\tCloseHandle(ev2);\r\n\t}\r\n\t\r\n\tvoid thread(unsigned index)\r\n\t{\r\n\t\tif (0 == index)\r\n\t\t{\r\n\t\t\tunsigned rv = WaitForSingleObject(ev1, INFINITE);\r\n\t\t\tassert(rv == WAIT_OBJECT_0);\r\n\t\t\tSetEvent(ev2);\r\n\t\t\trv = WaitForSingleObject(ev2, 0);\r\n\t\t\tassert(rv == WAIT_TIMEOUT);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tunsigned rv = SignalObjectAndWait(ev1, ev2, INFINITE, 0);\r\n\t\t\tassert(rv == WAIT_OBJECT_0);\r\n\t\t\trv = WaitForSingleObject(ev2, 0);\r\n\t\t\tassert(rv == WAIT_TIMEOUT);\r\n\t\t}\r\n\t}\r\n};\r\n\r\n\r\n\r\n\r\nstruct test_event_manual : rl::test_suite<test_event_manual, 2>\r\n{\r\n\tHANDLE ev;\r\n\tVAR_T(int) data;\r\n\t\r\n\tvoid before()\r\n\t{\r\n\t\tVAR(data) = 0;\r\n\t\tev = CreateEvent(0, 1, 0, 0);\r\n\t}\r\n\t\r\n\tvoid after()\r\n\t{\r\n\t\tCloseHandle(ev);\r\n\t}\r\n\t\r\n\tvoid thread(unsigned index)\r\n\t{\r\n\t\tif (0 == index)\r\n\t\t{\r\n\t\t\tVAR(data) = 1;\r\n\t\t\tSetEvent(ev);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tunsigned rv = WaitForSingleObject(ev, INFINITE);\r\n\t\t\tassert(rv == WAIT_OBJECT_0);\r\n\t\t\tassert(VAR(data) == 1);\r\n\t\t\trv = WaitForSingleObject(ev, 0);\r\n\t\t\tassert(rv == WAIT_OBJECT_0);\r\n\t\t}\r\n\t}\r\n};\r\n\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/features.txt",
    "content": " - Relaxed ISO C++0x Memory Model. Relaxed/acquire/release/acq_rel/seq_cst memory operations. The only non-supported feature is memory_order_consume, it's simulated with memory_order_acquire.\r\n - Exhaustive automatic error checking (including ABA detection).\r\n - Full-fledged atomics library (with spurious failures in compare_exchange()).\r\n - Memory fences.\r\n - Arbitrary number of threads.\r\n - Detailed execution history for failed tests.\r\n - No false positives.\r\n - Before/after/invariant functions for test suites.\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/fence.hpp",
    "content": "#pragma once\r\n\r\n#include \"../relacy/relacy_std.hpp\"\r\n\r\n\r\ntemplate<int index, int mo_index>\r\nstruct fence_synch_test : rl::test_suite<fence_synch_test<index, mo_index>, 2>\r\n{\r\n    std::atomic<int> x;\r\n    rl::var<int> data;\r\n\r\n    void before()\r\n    {\r\n        x($) = 0;\r\n    }\r\n\r\n    void thread(unsigned th)\r\n    {\r\n        if (0 == th)\r\n        {\r\n            data($) = 1;\r\n            if (0 == index || 1 == index)\r\n            {\r\n                std::atomic_thread_fence(order().first, $);\r\n                x.store(1, std::memory_order_relaxed);\r\n            }\r\n            else\r\n            {\r\n                x.store(1, order().first, $);\r\n            }\r\n        }\r\n        else\r\n        {\r\n            if (0 == index || 2 == index)\r\n            {\r\n                if (x.load(std::memory_order_relaxed))\r\n                {\r\n                    std::atomic_thread_fence(order().second, $);\r\n                    data($).load();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if (x.load(order().second, $))\r\n                {\r\n                    data($).load();\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    std::pair<std::memory_order, std::memory_order> order()\r\n    {\r\n        switch (mo_index)\r\n        {\r\n        default: RL_VERIFY(false);\r\n        case 0: return std::make_pair(std::mo_release, std::mo_acquire);\r\n        case 1: return std::make_pair(std::mo_seq_cst, std::mo_seq_cst);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct two_fence_synch_test : rl::test_suite<two_fence_synch_test, 3>\r\n{\r\n    std::atomic<int> x0;\r\n    std::atomic<int> x1;\r\n    rl::var<int> data0;\r\n    rl::var<int> data1;\r\n\r\n    void before()\r\n    {\r\n        x0($) = 0;\r\n        x1($) = 0;\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            data0($) = 1;\r\n            std::atomic_thread_fence(std::memory_order_release);\r\n            x0.store(1, std::memory_order_relaxed);\r\n        }\r\n        else if (1 == index)\r\n        {\r\n            data1($) = 1;\r\n            std::atomic_thread_fence(std::memory_order_release);\r\n            x1.store(1, std::memory_order_relaxed);\r\n        }\r\n        else\r\n        {\r\n            int y0 = x0.load(std::memory_order_relaxed);\r\n            int y1 = x1.load(std::memory_order_relaxed);\r\n            if (y0 || y1)\r\n            {\r\n                std::atomic_thread_fence(std::memory_order_acquire);\r\n                if (y0)\r\n                    data0($).load();\r\n                if (y1)\r\n                    data1($).load();\r\n            }\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\ntemplate<int index>\r\nstruct seq_cst_fence_test : rl::test_suite<seq_cst_fence_test<index>, 2,\r\n    (rl::test_result_e)((0 == index) * rl::test_result_success\r\n    + (1 == index) * rl::test_result_until_condition_hit)>\r\n{\r\n    std::atomic<int> x0;\r\n    std::atomic<int> x1;\r\n    rl::var<int> r0;\r\n    rl::var<int> r1;\r\n\r\n    void before()\r\n    {\r\n        x0($) = 0;\r\n        x1($) = 0;\r\n    }\r\n\r\n    void thread(unsigned th)\r\n    {\r\n        if (0 == th)\r\n        {\r\n            x0.store(1, std::memory_order_relaxed);\r\n            std::atomic_thread_fence(std::memory_order_seq_cst);\r\n            r0($) = x1.load(std::memory_order_relaxed);\r\n        }\r\n        else\r\n        {\r\n            x1.store(1, std::memory_order_relaxed);\r\n            std::atomic_thread_fence(std::memory_order_seq_cst);\r\n            r1($) = x0.load(std::memory_order_relaxed);\r\n        }\r\n    }\r\n\r\n    void after()\r\n    {\r\n        if (0 == index)\r\n            RL_ASSERT(r0($) || r1($));\r\n        else if (1 == index)\r\n            RL_UNTIL(r0($) && r1($));\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/foo.cpp",
    "content": "#include \"stdafx.h\"\r\n#include \"../relacy/relacy_std.hpp\"\r\n#include \"../relacy/windows.h\"\r\n#include \"../relacy/pthread.h\"\r\n\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/futex.hpp",
    "content": "#pragma once\n\n#include \"../relacy/pthread.h\"\n\n\n\nstruct test_futex : rl::test_suite<test_futex, 2>\n{\n\trl::atomic<int> state;\n\tint wakeres;\n\tint waitres;\n\t\n\tvoid before()\n\t{\n\t\tstate.store(0, rl::memory_order_relaxed);\n\t\twakeres = 0;\n\t\twaitres = 0;\n\t}\n\t\n\tvoid after()\n\t{\n\t\tassert((waitres == 0 && wakeres == 1)\n\t\t\t\t\t || (waitres == EWOULDBLOCK && wakeres == 0)\n\t\t\t\t\t || (waitres == EINTR && wakeres == 0));\n\t}\n\t\n\tvoid thread(unsigned index)\n\t{\n\t\tif (index == 0)\n\t\t{\n\t\t\tstate.store(1, std::memory_order_relaxed);\n\t\t\twakeres = futex(&state, FUTEX_WAKE, 1, 0, 0, 0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\twaitres = EINTR;\n\t\t\twhile (state.load(rl::memory_order_relaxed) == 0)\n\t\t\t{\n\t\t\t\twaitres = futex(&state, FUTEX_WAIT, 0, 0, 0, 0);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\n\nstruct test_futex_deadlock : rl::test_suite<test_futex_deadlock, 1, rl::test_result_deadlock>\n{\n\trl::atomic<int> state;\n\t\n\tvoid thread(unsigned index)\n\t{\n\t\tstate.store(0, rl::memory_order_relaxed);\n\t\tint rv = futex(&state, FUTEX_WAIT, 0, 0, 0, 0);\n\t\tassert(rv == EINTR);\n\t}\n};\n\n\n\n\nstruct test_futex_sync1 : rl::test_suite<test_futex_sync1, 2, rl::test_result_until_condition_hit>\n{\n\trl::atomic<int> state;\n\tVAR_T(int) data;\n\t\n\tvoid before()\n\t{\n\t\tstate.store(0, rl::memory_order_relaxed);\n\t\tVAR(data) = 0;\n\t}\n\t\n\tvoid thread(unsigned index)\n\t{\n\t\tif (index == 0)\n\t\t{\n\t\t\tVAR(data) = 1;\n\t\t\tstate.store(1, std::memory_order_release);\n\t\t\tfutex(&state, FUTEX_WAKE, 1, 0, 0, 0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tint rv = futex(&state, FUTEX_WAIT, 0, 0, 0, 0);\n\t\t\tassert(rv == 0 || rv == EWOULDBLOCK || rv == EINTR);\n\t\t\tif (rv == 0)\n\t\t\t{\n\t\t\t\tassert(VAR(data) == 1);\n\t\t\t\tassert(state.load(rl::memory_order_relaxed) == 1);\n\t\t\t\tRL_UNTIL(true);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\n\nstruct test_futex_sync2 : rl::test_suite<test_futex_sync2, 2, rl::test_result_until_condition_hit>\n{\n\trl::atomic<int> state;\n\tVAR_T(int) data;\n\t\n\tvoid before()\n\t{\n\t\tstate.store(0, rl::memory_order_relaxed);\n\t\tVAR(data) = 0;\n\t}\n\t\n\tvoid thread(unsigned index)\n\t{\n\t\tif (index == 0)\n\t\t{\n\t\t\tVAR(data) = 1;\n\t\t\tstate.store(1, std::memory_order_release);\n\t\t\tfutex(&state, FUTEX_WAKE, 1, 0, 0, 0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tint rv = futex(&state, FUTEX_WAIT, 0, 0, 0, 0);\n\t\t\tassert(rv == 0 || rv == EWOULDBLOCK || rv == EINTR);\n\t\t\tif (rv == EWOULDBLOCK)\n\t\t\t{\n\t\t\t\tassert(VAR(data) == 1);\n\t\t\t\tassert(state.load(rl::memory_order_relaxed) == 1);\n\t\t\t\tRL_UNTIL(true);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\n\n\nstruct test_futex_intr : rl::test_suite<test_futex_intr, 2, rl::test_result_until_condition_hit>\n{\n\trl::atomic<int> state;\n\tVAR_T(int) data;\n\t\n\tvoid before()\n\t{\n\t\tstate.store(0, rl::memory_order_relaxed);\n\t\tVAR(data) = 0;\n\t}\n\t\n\tvoid thread(unsigned index)\n\t{\n\t\tif (index == 0)\n\t\t{\n\t\t\tVAR(data) = 1;\n\t\t\tstate.store(1, std::memory_order_release);\n\t\t\tfutex(&state, FUTEX_WAKE, 1, 0, 0, 0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tint rv = futex(&state, FUTEX_WAIT, 0, 0, 0, 0);\n\t\t\tassert(rv == 0 || rv == EWOULDBLOCK || rv == EINTR);\n\t\t\tRL_UNTIL(rv == EINTR);\n\t\t}\n\t}\n};\n\n"
  },
  {
    "path": "tests/relacy/relacy/test/g++/build_all_cygwin_debug.bat",
    "content": "g++ ../../jtest/jtest.cpp -c -o jtest_debug.exe -D_DEBUG -Wall -DRL_CYGWIN_STUB -march=i686\r\ng++ ../../ntest/ntest.cpp -c -o ntest_debug.exe -D_DEBUG -Wall -DRL_CYGWIN_STUB -march=i686\r\ng++ ../../example/peterson/peterson.cpp -c -o peterson_debug.exe -D_DEBUG -Wall -DRL_CYGWIN_STUB -march=i686\r\ng++ ../../example/proxy_collector/proxy_collector.cpp -c -o proxy_collector_debug.exe -D_DEBUG -Wall -DRL_CYGWIN_STUB -march=i686\r\ng++ ../../example/ref_counting/ref_counting.cpp -c -o ref_counting_debug.exe -D_DEBUG -Wall -DRL_CYGWIN_STUB -march=i686\r\ng++ ../../example/smr/smr.cpp -c -o smr_debug.exe -D_DEBUG -Wall -DRL_CYGWIN_STUB -march=i686\r\ng++ ../../example/spsc_queue/spsc_queue.cpp -c -o spsc_queue_debug.exe -D_DEBUG -Wall -DRL_CYGWIN_STUB -march=i686\r\ng++ ../../example/stack/stack.cpp -c -o stack_debug.exe -D_DEBUG -Wall -DRL_CYGWIN_STUB -march=i686\r\ng++ ../../example/condvar/condvar.cpp -c -o condvar_debug.exe -D_DEBUG -Wall -DRL_CYGWIN_STUB -march=i686\r\ng++ ../../example/mutex_business_logic/mutex_business_logic.cpp -c -o mutex_business_logic_debug.exe -D_DEBUG -Wall -DRL_CYGWIN_STUB -march=i686\r\ng++ ../../example/ws_deque/ws_deque.cpp -c -o ws_deque_debug.exe -D_DEBUG -Wall -DRL_CYGWIN_STUB -march=i686\r\ng++ ../../example/cli_ws_deque/cli_ws_deque.cpp -c -o cli_ws_deque_debug.exe -D_DEBUG -Wall -DRL_CYGWIN_STUB -march=i686\r\ng++ ../../example/java_ws_deque/java_ws_deque.cpp -c -o java_ws_deque_debug.exe -D_DEBUG -Wall -DRL_CYGWIN_STUB -march=i686\r\ng++ ../main.cpp -c -o test_debug.exe -D_DEBUG -Wall -DRL_CYGWIN_STUB -march=i686\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/g++/build_all_debug.bat",
    "content": "g++ ../../jtest/jtest.cpp -o jtest_debug.exe -D_DEBUG -Wall -Wno-deprecated -g\r\ng++ ../../ntest/ntest.cpp -o ntest_debug.exe -D_DEBUG -Wall -Wno-deprecated -g\r\ng++ ../../example/peterson/peterson.cpp -o peterson_debug.exe -D_DEBUG -Wall -Wno-deprecated -g\r\ng++ ../../example/proxy_collector/proxy_collector.cpp -o proxy_collector_debug.exe -D_DEBUG -Wall -Wno-deprecated -g\r\ng++ ../../example/ref_counting/ref_counting.cpp -o ref_counting_debug.exe -D_DEBUG -Wall -Wno-deprecated -g\r\ng++ ../../example/smr/smr.cpp -o smr_debug.exe -D_DEBUG -Wall -Wno-deprecated -g\r\ng++ ../../example/spsc_queue/spsc_queue.cpp -o spsc_queue_debug.exe -D_DEBUG -Wall -Wno-deprecated -g\r\ng++ ../../example/stack/stack.cpp -o stack_debug.exe -D_DEBUG -Wall -Wno-deprecated -g\r\ng++ ../../example/condvar/condvar.cpp -o condvar_debug.exe -D_DEBUG -Wall -Wno-deprecated -g\r\ng++ ../../example/mutex_business_logic/mutex_business_logic.cpp -o mutex_business_logic_debug.exe -D_DEBUG -Wall -Wno-deprecated -g\r\ng++ ../../example/ws_deque/ws_deque.cpp -o ws_deque_debug.exe -D_DEBUG -Wall -Wno-deprecated -g\r\ng++ ../../example/cli_ws_deque/cli_ws_deque.cpp -o cli_ws_deque_debug.exe -D_DEBUG -Wall -Wno-deprecated -g\r\ng++ ../../example/java_ws_deque/java_ws_deque.cpp -o java_ws_deque_debug.exe -D_DEBUG -Wall -Wno-deprecated -g\r\ng++ ../main.cpp -o test_debug.exe -D_DEBUG -Wall -Wno-deprecated -g\r\n\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/g++/build_all_release.sh",
    "content": "#!/bin/bash\nset -eux\n\n#g++ ../jtest/jtest.cpp -o jtest_release.exe -Wall -D_DEBUG -O2\n#g++ ../ntest/ntest.cpp -o ntest_release.exe -Wall -D_DEBUG -O2\n#g++ ../../example/peterson/peterson.cpp -o peterson_release.exe -Wall -D_DEBUG -O2\ng++ ../../example/proxy_collector/proxy_collector.cpp -o proxy_collector_release.exe -Wall -D_DEBUG -O2\ng++ ../../example/ref_counting/ref_counting.cpp -o ref_counting_release.exe -Wall -D_DEBUG -O2\ng++ ../../example/smr/smr.cpp -o smr_release.exe -Wall -D_DEBUG -O2\ng++ ../../example/spsc_queue/spsc_queue.cpp -o spsc_queue_release.exe -Wall -D_DEBUG -O2\ng++ ../../example/stack/stack.cpp -o stack_release.exe -Wall -D_DEBUG -O2\ng++ ../../example/condvar/condvar.cpp -o condvar_release.exe -Wall -D_DEBUG -O2\ng++ ../../example/mutex_business_logic/mutex_business_logic.cpp -o mutex_business_logic_release.exe -Wall -D_DEBUG -O2\ng++ ../../example/ws_deque/ws_deque.cpp -o ws_deque_release.exe -Wall -D_DEBUG -O2\ng++ ../../example/cli_ws_deque/cli_ws_deque.cpp -o cli_ws_deque_release.exe -Wall -D_DEBUG -O2\ng++ ../../example/java_ws_deque/java_ws_deque.cpp -o java_ws_deque_release.exe -Wall -D_DEBUG -O2\ng++ ../main.cpp -o test_release.exe -Wall -D_DEBUG -O2\n"
  },
  {
    "path": "tests/relacy/relacy/test/g++/build_cygwin_release.cmd",
    "content": "#!/bin/bash\ng++ ../main.cpp -o test_release.exe -DNDEBUG -DRL_CYGWIN_STUB -Wall -O3\n\n\n"
  },
  {
    "path": "tests/relacy/relacy/test/g++/build_debug.cmd",
    "content": "#!/bin/bash\ng++ ../main.cpp -o test_debug.exe -D_DEBUG -D_XOPEN_SOURCE -Wall -Wno-deprecated -g -O0 -fno-inline\n"
  },
  {
    "path": "tests/relacy/relacy/test/g++/build_release.cmd",
    "content": "#!/bin/bash\ng++ ../main.cpp -o test_release.exe -DNDEBUG -Wall -O3 -D_XOPEN_SOURCE -Wno-deprecated\n\n\n"
  },
  {
    "path": "tests/relacy/relacy/test/g++/test.cpp",
    "content": "//#ifdef _FORTIFY_SOURCE\n//#undef _FORTIFY_SOURCE\n//#endif\n//#define _FORTIFY_SOURCE 0\n\n#include \"../../relacy/pthread.h\"\n\nclass queue_t\n{\npublic:\n    queue_t()\n    {\n        VAR(head) = 0;\n        VAR(tail) = 0;\n        pthread_mutex_init(&mtx, 0);\n        pthread_cond_init(&cv, 0);\n    }\n    \n    ~queue_t()\n    {\n        pthread_mutex_destroy(&mtx);\n        pthread_cond_destroy(&cv);\n    }\n    \n    void enqueue(void* data)\n    {\n        node_t* n = new node_t;\n        n->VAR(next) = 0;\n        n->VAR(data) = data;\n        bool was_empty = false;\n        \n        pthread_mutex_lock(&mtx);\n        if (VAR(head) == 0)\n        {\n            was_empty = true;\n            VAR(head) = n;\n            VAR(tail) = n;\n        }\n        else\n        {\n            VAR(tail)->VAR(next) = n;\n            VAR(tail) = n;\n        }\n        pthread_mutex_unlock(&mtx);\n        \n        if (was_empty)\n            pthread_cond_broadcast(&cv);\n    }\n    \n    void* dequeue()\n    {\n        node_t* n = 0;\n        \n        pthread_mutex_lock(&mtx);\n        while (VAR(head) == 0)\n            pthread_cond_wait(&cv, &mtx);\n        n = VAR(head);\n        if (n->VAR(next) == 0)\n            VAR(tail) = 0;\n        VAR(head) = n->VAR(next);\n        pthread_mutex_unlock(&mtx);\n        \n        void* data = n->VAR(data);\n        delete n;\n        return data;\n    }\n    \nprivate:\n    struct node_t\n    {\n        VAR_T(node_t*) next;\n        VAR_T(void*) data;\n    };\n    \n    VAR_T(node_t*) head;\n    VAR_T(node_t*) tail;\n    \n    pthread_mutex_t mtx;\n    pthread_cond_t cv;\n};\n\nvoid* enqueue_thread(void* ctx)\n{\n    queue_t* q = static_cast<queue_t*>(ctx);\n    for (size_t i = 0; i != 4; i += 1)\n        q->enqueue((void*)(i + 1));\n    return 0;\n}\n\nvoid* dequeue_thread(void* ctx)\n{\n    queue_t* q = static_cast<queue_t*>(ctx);\n    for (size_t i = 0; i != 4; i += 1)\n    {\n        void* data = q->dequeue();\n        assert((int)(uintptr_t)data >= 1 && (int)(uintptr_t)data <= 4);\n    }\n    return 0;\n}\n\nvoid queue_test()\n{\n    queue_t q;\n    \n    pthread_t th [4];\n    for (size_t i = 0; i != 2; i += 1)\n        pthread_create(&th[i], 0, enqueue_thread, &q);\n    for (size_t i = 2; i != 4; i += 1)\n        pthread_create(&th[i], 0, dequeue_thread, &q);\n    \n    void* res = 0;\n    for (size_t i = 0; i != 4; i += 1)\n        pthread_join(th[i], &res);\n}\n\nint main()\n{\n    rl::test_params p;\n    p.iteration_count = 100000;\n    //p.search_type = rl::sched_full;\n    //p.context_bound = 5;\n    //p.execution_depth_limit = 200;\n    rl::execute<queue_test, 4>(p);\n}\n"
  },
  {
    "path": "tests/relacy/relacy/test/iriw.cpp",
    "content": "#include \"../relacy/relacy_std.hpp\"\n\nstruct test : rl::test_suite<test, 4> {\n  std::atomic<int> x_;\n  std::atomic<int> y_;\n  int r2x, r2y, r3x, r3y;\n\n  void before() {\n    x_.store(0, std::memory_order_relaxed);\n    y_.store(0, std::memory_order_relaxed);\n    r2x = r2y = r3x = r3y = 0;\n  }\n\n  void thread(unsigned thread_index) {\n    switch (thread_index) {\n      case 0:;\n        x_.store(1, std::memory_order_relaxed);\n        break;\n      case 1:\n        y_.store(1, std::memory_order_relaxed);\n        break;\n      case 2:\n        r2x = x_.load(std::memory_order_relaxed);\n        std::atomic_thread_fence(std::memory_order_seq_cst);\n        r2y = y_.load(std::memory_order_relaxed);\n        break;\n      case 3:\n        r3y = y_.load(std::memory_order_relaxed);\n        std::atomic_thread_fence(std::memory_order_seq_cst);\n        r3x = x_.load(std::memory_order_relaxed);\n        break;\n    }\n  }\n\n  void after() {\n    // This assert should fire according to C++ memory model,\n    // however it does not in the current relacy implementation.\n    RL_ASSERT(!(r2x == 1 && r3y == 1 && r2y == 0 && r3x == 0));\n  }\n};\n\nint main() {\n  rl::test_params p;\n  p.iteration_count = 1000000;\n  rl::simulate<test>(p);\n}\n"
  },
  {
    "path": "tests/relacy/relacy/test/jtest/jtest.cpp",
    "content": "#include \"stdafx.h\"\r\n\r\n#include \"../../relacy/relacy_java.hpp\"\r\n\r\n\r\n\r\n\r\n\r\nclass stack\r\n{\r\npublic:\r\n    stack()\r\n        : head_(0)\r\n    {\r\n    }\r\n\r\n    void push(int data)\r\n    {\r\n        rl::var<node*> n = new node ();\r\n        VAR(n)->VAR(data_) = data;\r\n        node* next = head_.load(rl::memory_order_relaxed);\r\n        for (;;)\r\n        {\r\n            VAR(n)->next_.store(next, rl::memory_order_relaxed);\r\n            if (head_.compare_exchange_weak(next, VAR(n), rl::memory_order_release))\r\n                break;\r\n        }\r\n    }\r\n\r\n    int pop()\r\n    {\r\n        node* n = head_.load(rl::memory_order_acquire);\r\n        for (;;)\r\n        {\r\n            if (0 == n)\r\n                break;\r\n            node* next = n->next_.load(rl::memory_order_relaxed);\r\n            if (head_.compare_exchange_weak(n, next, rl::memory_order_acquire))\r\n                break;\r\n        }\r\n        if (n)\r\n        {\r\n            int data = n->VAR(data_);\r\n            return data;\r\n        }\r\n        else\r\n        {\r\n            return 0;\r\n        }\r\n    }\r\n\r\nprivate:\r\n    struct node\r\n    {\r\n        rl::atomic<node*> next_;\r\n        rl::var<int> data_;\r\n    };\r\n\r\n    rl::atomic<node*> head_;\r\n\r\n    stack(stack const&);\r\n    stack& operator = (stack const&);\r\n};\r\n\r\n\r\n\r\n\r\nstruct stack_test : rl::test_suite<stack_test, 4>\r\n{\r\n    stack s_;\r\n\r\n    int produced_count_;\r\n    int consumed_count_;\r\n\r\n    void before()\r\n    {\r\n        produced_count_ = 0;\r\n        consumed_count_ = 0;\r\n    }\r\n\r\n    void after()\r\n    {\r\n        typedef rl::test_suite<stack_test, 4> base_t;\r\n        RL_ASSERT(base_t::params::thread_count == produced_count_);\r\n        RL_ASSERT(base_t::params::thread_count == consumed_count_);\r\n    }\r\n\r\n    void thread(unsigned /*index*/)\r\n    {\r\n        s_.push(rand() + 1);\r\n        produced_count_ += 1;\r\n        int data = s_.pop();\r\n        RL_ASSERT(data);\r\n        consumed_count_ += 1;\r\n    }\r\n};\r\n\r\n\r\nstruct test_api : rl::test_suite<test_api, 1>\r\n{\r\n    void thread(unsigned)\r\n    {\r\n        rl::jvolatile<int> jv1;\r\n        rl::jvolatile<int> jv2 (2);\r\n        rl::jvolatile<int> jv3 (jv2($));\r\n        rl::jvolatile<int> jv4 (jv1);\r\n        jv1($) = jv3($);\r\n        jv1($) = 2;\r\n        (int)jv1($);\r\n        jv1($) += 1;\r\n        jv1($) -= 1;\r\n        int x = jv1($)++;\r\n        x = jv1($)--;\r\n        x = --jv1($);\r\n        x = ++jv1($);\r\n\r\n        rl::AtomicInteger ai, ai2(1), ai3(x), ai4(ai($)), ai5(ai);\r\n        x = ai($).get();\r\n        ai($).set(1);\r\n        x = ai($).addAndGet(2);\r\n        bool b = ai($).compareAndSet(1, 2);\r\n        (void)b;\r\n        x = ai($).addAndGet(2);\r\n        x = ai($).getAndSet(2);\r\n    }\r\n};\r\n\r\nstruct test_seq_cst_volatiles : rl::test_suite<test_seq_cst_volatiles, 2>\r\n{\r\n    rl::jvolatile<int> flag0;\r\n    rl::jvolatile<int> flag1;\r\n    rl::jvolatile<int> turn;\r\n\r\n    rl::var<int> data;\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            flag0($) = 1;\r\n            turn($) = 1;\r\n            while (flag1($) && 1 == turn($))\r\n                rl::yield(1, $);\r\n            data($) = 1;\r\n            flag0($) = 0;\r\n        }\r\n        else\r\n        {\r\n            flag1($) = 1;\r\n            turn($) = 0;\r\n            while (flag0($) && 0 == turn($))\r\n                rl::yield(1, $);\r\n            data($) = 2;\r\n            flag1($) = 0;\r\n        }\r\n    }\r\n};\r\n\r\nstruct test_seq_cst_volatiles2 : rl::test_suite<test_seq_cst_volatiles2, 4>\r\n{\r\n    rl::jvolatile<int> x;\r\n    rl::jvolatile<int> y;\r\n\r\n    int r1, r2, r3, r4;\r\n\r\n    void before()\r\n    {\r\n        r1 = r2 = r3 = r4 = 0;\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            x($) = 0;\r\n        }\r\n        else if (1 == index)\r\n        {\r\n            y($) = 0;\r\n        }\r\n        else if (2 == index)\r\n        {\r\n            r1 = x($);\r\n            r2 = y($);\r\n        }\r\n        else if (3 == index)\r\n        {\r\n            r3 = y($);\r\n            r4 = x($);\r\n        }\r\n    }\r\n\r\n    void after()\r\n    {\r\n        RL_ASSERT(false == (r1 && !r2 && r3 && !r4));\r\n    }\r\n};\r\n\r\ntemplate<int expected>\r\nstruct test_unitialized_var : rl::test_suite<test_unitialized_var<expected>, 2, rl::test_result_until_condition_hit>\r\n{\r\n    rl::jvar<rl::jvar<int>*> www;\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            www($) = new rl::jvar<int> (1);\r\n        }\r\n        else\r\n        {\r\n            while (0 == www($))\r\n                rl::yield(1, $);\r\n            int x = (*www($))($);\r\n            RL_UNTIL(x == expected);\r\n        }\r\n    }\r\n};\r\n\r\n\r\nint main()\r\n{\r\n    rl::simulate_f tests[] = \r\n    {\r\n        //!!! broken &rl::simulate<test_unitialized_var<0> >,\r\n        &rl::simulate<test_unitialized_var<1> >,\r\n        &rl::simulate<test_seq_cst_volatiles>,\r\n        &rl::simulate<test_seq_cst_volatiles2>,\r\n        &rl::simulate<test_api>,\r\n        &rl::simulate<stack_test>,\r\n    };\r\n\r\n    for (size_t i = 0; i != sizeof(tests)/sizeof(*tests); ++i)\r\n    {\r\n        rl::ostringstream stream;\r\n        rl::test_params params;\r\n        params.iteration_count = 10000;\r\n        params.output_stream = &stream;\r\n        params.progress_stream = &stream;\r\n        params.context_bound = 2;\r\n        params.execution_depth_limit = 500;\r\n\r\n        if (false == tests[i](params))\r\n        {\r\n            std::cout << std::endl;\r\n            std::cout << \"FAILED\" << std::endl;\r\n            std::cout << stream.str();\r\n            return 1;\r\n        }\r\n        else\r\n        {\r\n            std::cout << params.test_name << \"...OK\" << std::endl;\r\n        }\r\n    }\r\n\r\n    std::cout << std::endl << \"SUCCESS\" << std::endl;\r\n}\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/jtest/msvc8/jtest.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 9.00\r\n# Visual Studio 2005\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"jtest\", \"jtest.vcproj\", \"{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"rrd\", \"..\\..\\test\\msvc8\\rrd.vcproj\", \"{D4F501D0-382D-4CBC-86F4-56181F383444}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tDebug|x64 = Debug|x64\r\n\t\tDebug64|Win32 = Debug64|Win32\r\n\t\tDebug64|x64 = Debug64|x64\r\n\t\tRelease|Win32 = Release|Win32\r\n\t\tRelease|x64 = Release|x64\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}.Debug|x64.ActiveCfg = Debug|Win32\r\n\t\t{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}.Debug64|Win32.ActiveCfg = Debug|Win32\r\n\t\t{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}.Debug64|Win32.Build.0 = Debug|Win32\r\n\t\t{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}.Debug64|x64.ActiveCfg = Debug|Win32\r\n\t\t{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}.Release|x64.ActiveCfg = Release|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug64|Win32.ActiveCfg = Debug64|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug64|Win32.Build.0 = Debug64|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug64|x64.ActiveCfg = Debug64|x64\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug64|x64.Build.0 = Debug64|x64\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Release|x64.Build.0 = Release|x64\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/jtest/msvc8/jtest.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"jtest\"\r\n\tProjectGUID=\"{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}\"\r\n\tRootNamespace=\"jtest\"\r\n\tKeyword=\"Win32Proj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"0\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tWholeProgramOptimization=\"false\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tLinkTimeCodeGeneration=\"0\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\jtest.cpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.cpp\"\r\n\t\t\t>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/jtest/msvc9/jtest.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 10.00\r\n# Visual Studio 2008\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"jtest\", \"jtest.vcproj\", \"{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"rrd\", \"..\\..\\test\\msvc9\\rrd.vcproj\", \"{D4F501D0-382D-4CBC-86F4-56181F383444}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tDebug|x64 = Debug|x64\r\n\t\tDebug64|Win32 = Debug64|Win32\r\n\t\tDebug64|x64 = Debug64|x64\r\n\t\tRelease|Win32 = Release|Win32\r\n\t\tRelease|x64 = Release|x64\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}.Debug|x64.ActiveCfg = Debug|Win32\r\n\t\t{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}.Debug64|Win32.ActiveCfg = Debug|Win32\r\n\t\t{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}.Debug64|Win32.Build.0 = Debug|Win32\r\n\t\t{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}.Debug64|x64.ActiveCfg = Debug|Win32\r\n\t\t{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}.Release|x64.ActiveCfg = Release|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug64|Win32.ActiveCfg = Debug64|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug64|Win32.Build.0 = Debug64|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug64|x64.ActiveCfg = Debug64|x64\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug64|x64.Build.0 = Debug64|x64\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Release|x64.Build.0 = Release|x64\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/jtest/msvc9/jtest.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"9,00\"\r\n\tName=\"jtest\"\r\n\tProjectGUID=\"{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}\"\r\n\tRootNamespace=\"jtest\"\r\n\tKeyword=\"Win32Proj\"\r\n\tTargetFrameworkVersion=\"131072\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tRandomizedBaseAddress=\"1\"\r\n\t\t\t\tDataExecutionPrevention=\"0\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tRandomizedBaseAddress=\"1\"\r\n\t\t\t\tDataExecutionPrevention=\"0\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\jtest.cpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.cpp\"\r\n\t\t\t>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/jtest/stdafx.cpp",
    "content": "#include \"stdafx.h\"\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/jtest/stdafx.h",
    "content": "#pragma once\r\n\r\n#define RL_JAVA_MODE\r\n\r\n#include \"../../relacy/pch.hpp\"\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/main.cpp",
    "content": "#include \"stdafx.h\"\r\n\r\n//#define RL_MSVC_OUTPUT\r\n\r\n#include \"../relacy/relacy_std.hpp\"\r\n#include \"memory_order.hpp\"\r\n#include \"fence.hpp\"\r\n#include \"data_race.hpp\"\r\n#include \"mutex.hpp\"\r\n#include \"condvar.hpp\"\r\n#include \"semaphore.hpp\"\r\n#include \"event.hpp\"\r\n#include \"scheduler.hpp\"\r\n#include \"compare_swap.hpp\"\r\n#include \"wfmo.hpp\"\r\n#include \"thread_local.hpp\"\r\n#include \"dyn_thread.hpp\"\r\n#include \"memory.hpp\"\r\n#include \"pthread.hpp\"\r\n#include \"windows.hpp\"\r\n#include \"addr_hash.hpp\"\r\n#include \"futex.hpp\"\r\n\r\n#include \"../relacy/windows.h\"\r\n#include \"../relacy/pthread.h\"\r\n\r\n#include <cstdio>\r\n#include <climits>\r\n\r\nclass queue_t\r\n{\r\npublic:\r\n    queue_t()\r\n    {\r\n        VAR(head) = 0;\r\n        VAR(tail) = 0;\r\n        pthread_mutex_init(&mtx, 0);\r\n        pthread_cond_init(&cv, 0);\r\n    }\r\n\r\n    ~queue_t()\r\n    {\r\n        pthread_mutex_destroy(&mtx);\r\n        pthread_cond_destroy(&cv);\r\n    }\r\n\r\n    void enqueue(void* data)\r\n    {\r\n        node_t* n = new node_t;\r\n        n->VAR(next) = 0;\r\n        n->VAR(data) = data;\r\n        bool was_empty = false;\r\n\r\n        pthread_mutex_lock(&mtx);\r\n        if (VAR(head) == 0)\r\n        {\r\n            was_empty = true;\r\n            VAR(head) = n;\r\n            VAR(tail) = n;\r\n        }\r\n        else\r\n        {\r\n            VAR(tail)->VAR(next) = n;\r\n            VAR(tail) = n;\r\n        }\r\n        pthread_mutex_unlock(&mtx);\r\n\r\n        if (was_empty)\r\n            pthread_cond_broadcast(&cv);\r\n    }\r\n\r\n    void* dequeue()\r\n    {\r\n        node_t* n = 0;\r\n\r\n        pthread_mutex_lock(&mtx);\r\n        while (VAR(head) == 0)\r\n            pthread_cond_wait(&cv, &mtx);\r\n        n = VAR(head);\r\n        if (n->VAR(next) == 0)\r\n            VAR(tail) = 0;\r\n        VAR(head) = n->VAR(next);\r\n        pthread_mutex_unlock(&mtx);\r\n\r\n        void* data = n->VAR(data);\r\n        delete n;\r\n        return data;\r\n    }\r\n\r\nprivate:\r\n    struct node_t\r\n    {\r\n        VAR_T(node_t*) next;\r\n        VAR_T(void*) data;\r\n    };\r\n\r\n    VAR_T(node_t*) head;\r\n    VAR_T(node_t*) tail;\r\n\r\n    pthread_mutex_t mtx;\r\n    pthread_cond_t cv;\r\n};\r\n\r\nvoid* enqueue_thread(void* ctx)\r\n{\r\n    queue_t* q = static_cast<queue_t*>(ctx);\r\n    for (size_t i = 0; i != 4; i += 1)\r\n        q->enqueue((void*)(i + 1));\r\n    return 0;\r\n}\r\n\r\nvoid* dequeue_thread(void* ctx)\r\n{\r\n    queue_t* q = static_cast<queue_t*>(ctx);\r\n    for (size_t i = 0; i != 4; i += 1)\r\n    {\r\n        void* data = q->dequeue();\r\n        assert((int)(uintptr_t)data >= 1 && (int)(uintptr_t)data <= 4);\r\n    }\r\n    return 0;\r\n}\r\n\r\nvoid queue_test()\r\n{\r\n    queue_t q;\r\n\r\n    pthread_t th [4];\r\n    for (size_t i = 0; i != 2; i += 1)\r\n        pthread_create(&th[i], 0, enqueue_thread, &q);\r\n    for (size_t i = 2; i != 4; i += 1)\r\n        pthread_create(&th[i], 0, dequeue_thread, &q);\r\n\r\n    void* res = 0;\r\n    for (size_t i = 0; i != 4; i += 1)\r\n        pthread_join(th[i], &res);\r\n}\r\n\r\n/*\r\nclass recursive_timed_mutex\r\n{\r\npublic:\r\n    recursive_timed_mutex()\r\n    {\r\n        sema.init(false, 1, 1, $);\r\n        owner = -1;\r\n        recursion_count = 0;\r\n    }\r\n\r\n    ~recursive_timed_mutex()\r\n    {\r\n        assert(owner == -1 && recursion_count == 0);\r\n        sema.deinit($);\r\n    }\r\n    \r\n    void lock(rl::debug_info_param info)\r\n    {\r\n        rl::context& c = rl::ctx();\r\n        if (owner == c.current_thread())\r\n        {\r\n            RL_HIST(rl::user_msg_event) {\"recursive mutex lock\"} RL_HIST_END();\r\n            assert(recursion_count > 0);\r\n            recursion_count += 1;\r\n        }\r\n        else\r\n        {\r\n            sema.wait(false, false, info);\r\n            assert(owner == -1 && recursion_count == 0);\r\n            owner = c.current_thread();\r\n            recursion_count = 1;\r\n        }\r\n    }\r\n\r\n    bool try_lock(rl::debug_info_param info)\r\n    {\r\n        rl::context& c = rl::ctx();\r\n        if (owner == c.current_thread())\r\n        {\r\n            RL_HIST(rl::user_msg_event) {\"recursive mutex try lock\"} RL_HIST_END();\r\n            assert(recursion_count > 0);\r\n            recursion_count += 1;\r\n            return true;\r\n        }\r\n        else\r\n        {\r\n            rl::sema_wakeup_reason r = sema.wait(true, false, info);\r\n            if (r == rl::sema_wakeup_reason_success)\r\n            {\r\n                assert(owner == -1 && recursion_count == 0);\r\n                owner = c.current_thread();\r\n                recursion_count = 1;\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n    }\r\n\r\n    void unlock(rl::debug_info_param info)\r\n    {\r\n        rl::context& c = rl::ctx();\r\n        assert(owner == c.current_thread() && recursion_count > 0);\r\n        RL_HIST(rl::user_msg_event) {\"recursive mutex unlock\"} RL_HIST_END();\r\n        recursion_count -= 1;\r\n        if (recursion_count == 0)\r\n        {\r\n            owner = -1;\r\n            unsigned prev;\r\n            sema.post(1, prev, info);\r\n        }\r\n    }\r\n\r\n    bool timed_lock(rl::debug_info_param info, ... )\r\n    {\r\n        rl::context& c = rl::ctx();\r\n        if (owner == c.current_thread())\r\n        {\r\n            RL_HIST(rl::user_msg_event) {\"recursive mutex timed lock\"} RL_HIST_END();\r\n            assert(recursion_count > 0);\r\n            recursion_count += 1;\r\n            return true;\r\n        }\r\n        else\r\n        {\r\n            rl::sema_wakeup_reason r = sema.wait(false, true, info);\r\n            if (r == rl::sema_wakeup_reason_success)\r\n            {\r\n                assert(owner == -1 && recursion_count == 0);\r\n                owner = c.current_thread();\r\n                recursion_count = 1;\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n    }\r\n\r\nprivate:\r\n    struct tag_t;\r\n    rl::semaphore<tag_t> sema;\r\n    rl::thread_id_t owner;\r\n    int recursion_count;\r\n\r\n    recursive_timed_mutex(recursive_timed_mutex const&);\r\n    recursive_timed_mutex& operator = (recursive_timed_mutex const&);\r\n};\r\n*/\r\n\r\nclass recursive_timed_mutex\r\n{\r\npublic:\r\n    recursive_timed_mutex()\r\n    {\r\n        mtx = CreateMutex(0, 0, 0);\r\n    }\r\n\r\n    ~recursive_timed_mutex()\r\n    {\r\n        CloseHandle(mtx);\r\n    }\r\n    \r\n    void lock(rl::debug_info_param info)\r\n    {\r\n        rl::rl_WaitForSingleObject(mtx, INFINITE, info);\r\n    }\r\n\r\n    bool try_lock(rl::debug_info_param info)\r\n    {\r\n        return WAIT_OBJECT_0 == rl::rl_WaitForSingleObject(mtx, 0, info);\r\n    }\r\n\r\n    void unlock(rl::debug_info_param info)\r\n    {\r\n        rl::rl_ReleaseMutex(mtx, info);\r\n    }\r\n\r\n    bool timed_lock(rl::debug_info_param info, ... /*abs_time*/)\r\n    {\r\n        return WAIT_OBJECT_0 == rl::rl_WaitForSingleObject(mtx, 1, info);\r\n    }\r\n\r\nprivate:\r\n    HANDLE mtx;\r\n\r\n    recursive_timed_mutex(recursive_timed_mutex const&);\r\n    recursive_timed_mutex& operator = (recursive_timed_mutex const&);\r\n};\r\n\r\n\r\n\r\nstruct recursive_timed_mutex_test : rl::test_suite<recursive_timed_mutex_test, 3>\r\n{\r\n    recursive_timed_mutex mtx;\r\n    VAR_T(int) data;\r\n\r\n    void thread(unsigned idx)\r\n    {\r\n        if (idx)\r\n        {\r\n            mtx.lock($);\r\n            mtx.lock($);\r\n            VAR(data) = 1;\r\n            mtx.unlock($);\r\n            mtx.unlock($);\r\n        }\r\n        else\r\n        {\r\n            if (mtx.timed_lock($))\r\n            {\r\n                VAR(data) = 2;\r\n                mtx.unlock($);\r\n            }\r\n        }\r\n    }\r\n\r\n    void after()\r\n    {\r\n        //assert(VAR(data) != 2);\r\n    }\r\n};\r\n\r\n\r\nint main()\r\n{\r\n    //rl::test_params p;\r\n    //p.search_type = rl::sched_full;\r\n    //p.context_bound = 5;\r\n    //p.execution_depth_limit = 200;\r\n    //rl::simulate<test_pthread_condvar>(p);\r\n    //if (rand() <= RAND_MAX) return 0;\r\n\r\n    //rl::execute<queue_test, 4>();\r\n    //if (rand() <= RAND_MAX) return 0;\r\n\r\n    //rl::test_params p;\r\n    //p.initial_state = \"1000000\";\r\n    //p.iteration_count = 2000000;\r\n    //p.collect_history = true;\r\n    //p.output_history = true;\r\n    //p.search_type = rl::sched_bound;\r\n    //p.search_type = rl::sched_full;\r\n    //p.execution_depth_limit = 500;\r\n    //p.context_bound = 1;\r\n    //rl::simulate<test_pthread_condvar>(p);\r\n    //std::cout << \"scheduler state = \\\"\" << p.final_state << \"\\\"\" << std::endl;\r\n    //std::cout << std::endl;\r\n    //if (rand() <= RAND_MAX) return 0;\r\n\r\n    //rl::test_params p;\r\n    //p.iteration_count = 80000000;\r\n    //p.initial_state = \"50000000\";\r\n    //p.search_type = rl::fair_context_bound_scheduler_type;\r\n    //p.context_bound = 1;\r\n    //p.collect_history = true;\r\n    //p.output_history = true;\r\n    //rl::simulate<test>(p);\r\n    //if (rand() <= RAND_MAX) return 0;\r\n\r\n    //rl::test_params p;\r\n    //p.context_bound = 1;\r\n    //p.iteration_count = 1000;\r\n    //p.search_type = rl::fair_full_search_scheduler_type;\r\n    //p.search_type = rl::random_scheduler_type;\r\n    //p.collect_history = true;\r\n    //p.output_history = true;\r\n    //p.execution_depth_limit = 1000;\r\n    //p.initial_state = \"550 24 3 0 0 3 0 0 3 0 0 3 0 0 2 0 4 2 0 0 2 0 4 2 1 0 2 0 4 3 1 0 3 0 0 2 0 0 1 0 4 2 0 4 3 0 0 3 0 0 2 0 4 3 1 0 3 0 0 2 1 0 2 0 4 2 1 0 2 1 0 2 1 4\";\r\n    //bool result = rl::simulate<test>(p);\r\n    //std::cout << \"result=\" << result << std::endl;\r\n    //simulate<my_test>();\r\n    //if (rand() <= RAND_MAX) return 0;\r\n\r\n    rl::simulate_f tests[] = \r\n    {\r\n#if 1\r\n        &rl::simulate<test_FlushProcessWriteBuffers>,\r\n\r\n        &rl::simulate<test_addr_hash>,\r\n        &rl::simulate<test_addr_hash2>,\r\n        //!!! fails &rl::simulate<sched_load_test>,\r\n        &rl::simulate<test_memory_allocation>,\r\n\r\n        // memory model\r\n        &rl::simulate<test_pthread_thread>,\r\n        &rl::simulate<test_pthread_mutex>,\r\n        &rl::simulate<test_pthread_rwlock>,\r\n        &rl::simulate<test_pthread_condvar>,\r\n        &rl::simulate<test_pthread_condvar2>,\r\n        &rl::simulate<test_pthread_sem>,\r\n        \r\n        &rl::simulate<coherent_read_read_test>,\r\n        &rl::simulate<order_relaxed_test<0> >,\r\n        &rl::simulate<order_relaxed_test<1> >,\r\n        &rl::simulate<order_relaxed_test<2> >,\r\n        &rl::simulate<order_relaxed_test<3> >,\r\n        &rl::simulate<order_relaxed_test<4> >,\r\n        &rl::simulate<reorder_single_var_test>,\r\n        &rl::simulate<acq_rel_test>,\r\n\r\n        &rl::simulate<seq_cst_test<0> >,\r\n        &rl::simulate<seq_cst_test<1> >,\r\n\r\n        &rl::simulate<reordering_test>,\r\n        &rl::simulate<reordering_test2>,\r\n\r\n        &rl::simulate<test_win_thread>,\r\n        &rl::simulate<test_win_mutex>,\r\n        &rl::simulate<test_win_cs>,\r\n        &rl::simulate<test_win_condvar>,\r\n        &rl::simulate<test_win_condvar_srw>,\r\n        &rl::simulate<test_win_sem>,\r\n        &rl::simulate<test_win_event>,\r\n\r\n        &rl::simulate<modification_order_test>,\r\n        &rl::simulate<transitive_test>,\r\n        &rl::simulate<cc_transitive_test>,\r\n        &rl::simulate<occasional_test>,\r\n\r\n        // fences\r\n        &rl::simulate<fence_synch_test<0, 0> >,\r\n        &rl::simulate<fence_synch_test<1, 0> >,\r\n        &rl::simulate<fence_synch_test<2, 0> >,\r\n        &rl::simulate<fence_synch_test<0, 1> >,\r\n        &rl::simulate<fence_synch_test<1, 1> >,\r\n        &rl::simulate<fence_synch_test<2, 1> >,\r\n  \r\n        &rl::simulate<two_fence_synch_test>,\r\n        &rl::simulate<seq_cst_fence_test<0> >,\r\n        &rl::simulate<seq_cst_fence_test<1> >,\r\n\r\n        // data races\r\n        &rl::simulate<race_ld_ld_test>,\r\n        &rl::simulate<race_ld_st_test>,\r\n        &rl::simulate<race_st_st_test>,\r\n\r\n        &rl::simulate<race_seq_ld_ld_test>,\r\n        &rl::simulate<race_seq_ld_st_test>,\r\n        &rl::simulate<race_seq_st_ld_test>,\r\n        &rl::simulate<race_seq_st_st_test>,\r\n\r\n        &rl::simulate<race_uninit_test>,\r\n        &rl::simulate<race_indirect_test>,\r\n\r\n        // compare_exchange\r\n        &rl::simulate<cas_spurious_fail_test<0> >,\r\n        &rl::simulate<cas_spurious_fail_test<1> >,\r\n        &rl::simulate<cas_spurious_fail_test<2> >,\r\n\r\n        // mutex\r\n        &rl::simulate<test_deadlock>,\r\n        &rl::simulate<test_deadlock2>,\r\n        &rl::simulate<test_mutex_destuction>,\r\n        &rl::simulate<test_mutex_destuction2>,\r\n        &rl::simulate<test_mutex_recursion>,\r\n        &rl::simulate<test_mutex_recursion_error>,\r\n        &rl::simulate<test_mutex_unlock_error>,\r\n        &rl::simulate<test_mutex_leak>,\r\n        &rl::simulate<test_mutex>,\r\n        &rl::simulate<test_mutex_try_lock>,\r\n\t\r\n        // futex\r\n        &rl::simulate<test_futex>,\r\n        &rl::simulate<test_futex_deadlock>,\r\n        &rl::simulate<test_futex_sync1>,\r\n        &rl::simulate<test_futex_sync2>,\r\n        &rl::simulate<test_futex_intr>,\r\n\r\n        // condition variable\r\n        &rl::simulate<test_condvar>,\r\n        &rl::simulate<test_condvar2>,\r\n\r\n        // semaphore\r\n        &rl::simulate<test_semaphore>,\r\n        &rl::simulate<test_semaphore_atomic>,\r\n\r\n        // event\r\n        &rl::simulate<test_event_auto>,\r\n        &rl::simulate<test_event_manual>,\r\n        &rl::simulate<test_event_atomic>,\r\n\r\n        //wfmo\r\n        &rl::simulate<test_wfmo_all>,\r\n        &rl::simulate<test_wfmo_single>,\r\n        &rl::simulate<test_wfmo_timeout>,\r\n        &rl::simulate<test_wfmo_try>,\r\n        &rl::simulate<test_wfmo_mixed>,\r\n        &rl::simulate<test_wfmo_mixed2>,\r\n        &rl::simulate<test_wfmo_event_all>,\r\n        &rl::simulate<test_wfmo_event_any>,\r\n        &rl::simulate<test_wfmo_atomic>,\r\n\r\n        // thread local storage\r\n        &rl::simulate<tls_basic_test>,\r\n        &rl::simulate<tls_reset_test>,\r\n        &rl::simulate<tls_global_test>,\r\n        &rl::simulate<tls_win32_test>,\r\n\r\n        // dynamic thread\r\n        &rl::simulate<dyn_thread_basic_test>,\r\n        &rl::simulate<dyn_thread_win32_test>,\r\n        &rl::simulate<dyn_thread_visibility_test>,\r\n#endif\r\n    };\r\n\r\n    for (size_t sched = 0; sched != rl::sched_count; ++sched)\r\n    {\r\n        std::cout << format((rl::scheduler_type_e)sched) << \" tests:\" << std::endl;\r\n\r\n        for (size_t i = 0; i != sizeof(tests)/sizeof(*tests); ++i)\r\n        {\r\n            //!!! make it work under sched_full\r\n            if (sched == rl::sched_full\r\n                && (tests[i] == (rl::simulate_f)&rl::simulate<test_pthread_condvar>\r\n                    || tests[i] == (rl::simulate_f)&rl::simulate<test_win_condvar>))\r\n                continue;\r\n\r\n            rl::ostringstream stream;\r\n            rl::test_params params;\r\n            params.search_type = (rl::scheduler_type_e)sched;\r\n            params.iteration_count =\r\n                (params.test_result == rl::test_result_success ? 100000 : 500);\r\n            params.output_stream = &stream;\r\n            params.progress_stream = &stream;\r\n            params.context_bound = 2;\r\n            params.execution_depth_limit = 500;\r\n\r\n            if (false == tests[i](params))\r\n            {\r\n                std::cout << std::endl;\r\n                std::cout << \"FAILED\" << std::endl;\r\n                std::cout << stream.str();\r\n                std::cout << std::endl;\r\n                return 1;\r\n            }\r\n            else\r\n            {\r\n                std::cout << params.test_name << \"...OK\" << std::endl;\r\n            }\r\n        }\r\n        std::cout << std::endl;\r\n    }\r\n\r\n    rl::simulate_f scheduler_tests[] = \r\n    {\r\n        &rl::simulate<livelock_test>,\r\n        &rl::simulate<yield_livelock_test>,\r\n    };\r\n\r\n    std::cout << \"full search scheduler tests:\" << std::endl;\r\n    for (size_t i = 0; i != sizeof(scheduler_tests)/sizeof(*scheduler_tests); ++i)\r\n    {\r\n        rl::ostringstream stream;\r\n        rl::test_params params;\r\n        params.search_type = rl::sched_full;\r\n        params.output_stream = &stream;\r\n        params.progress_stream = &stream;\r\n        params.context_bound = 2;\r\n        params.execution_depth_limit = 500;\r\n\r\n        if (false == scheduler_tests[i](params))\r\n        {\r\n            std::cout << std::endl;\r\n            std::cout << \"FAILED\" << std::endl;\r\n            std::cout << stream.str();\r\n            return 1;\r\n        }\r\n        else\r\n        {\r\n            std::cout << params.test_name << \"...OK\" << std::endl;\r\n        }\r\n    }\r\n    std::cout << std::endl;\r\n\r\n    std::cout << \"SUCCESS\" << std::endl;\r\n}\r\n\r\n\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/memory.hpp",
    "content": "#pragma once\r\n\r\n#include \"../relacy/relacy_std.hpp\"\r\n\r\n\r\nstruct test_memory_allocation : rl::test_suite<test_memory_allocation, 2>\r\n{\r\n    void thread(unsigned /*index*/)\r\n    {\r\n        VAR_T(int)* p1 = new VAR_T(int) (5), i1 = 5, * p11 = new VAR_T(int) (6);\r\n        VAR(p1[0]) = 1;\r\n        delete p1, delete p11;\r\n\r\n        VAR_T(int)* p2 = new VAR_T(int) [10], i2 = 6, *p22 = new VAR_T(int) [20];\r\n        VAR(p2[0]) = 1;\r\n        delete [] p2, delete [] p22;\r\n\r\n        void* p3 = malloc(10), *i3 = 0, *p33 = malloc(20);\r\n        free(p3), free(p33);\r\n\r\n        void* p4 = malloc(sizeof(int));\r\n        int* i4 = new (p4) int (11);\r\n        free(p4);\r\n\r\n        //RL_ASSERT(false);\r\n        (void)i1, (void)i2, (void)i3; (void)i4;\r\n    }\r\n};\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/memory_order.hpp",
    "content": "#pragma once\r\n\r\n#include \"../relacy/relacy_std.hpp\"\r\n\r\nstruct coherent_read_read_test : rl::test_suite<coherent_read_read_test, 3>\r\n{\r\n    std::atomic<int> x;\r\n    std::atomic<int> y;\r\n\r\n    void before()\r\n    {\r\n        x($) = 0;\r\n        y($) = 0;\r\n    }\r\n\r\n    void thread(unsigned th)\r\n    {\r\n        if (0 == th)\r\n            x.store(1, rl::memory_order_relaxed);\r\n        else if (1 == th)\r\n        {\r\n            if (0 == x.load(rl::memory_order_relaxed))\r\n                return;\r\n            y.store(1, rl::memory_order_release);\r\n            x.load(rl::memory_order_relaxed);\r\n        }\r\n        else\r\n        {\r\n            if (0 == y.load(rl::memory_order_acquire))\r\n                return;\r\n            RL_ASSERT(1 == x.load(rl::memory_order_relaxed));\r\n        }\r\n    }\r\n};\r\n\r\n\r\ntemplate<int index>\r\nstruct order_relaxed_test : rl::test_suite<order_relaxed_test<index>, 2>\r\n{\r\n    std::atomic<int> x1;\r\n    std::atomic<int> x2;\r\n\r\n    void before()\r\n    {\r\n        x1($) = 0;\r\n        x2($) = 0;\r\n    }\r\n\r\n    void thread(unsigned th)\r\n    {\r\n        if (th)\r\n        {\r\n            x1.store(1, order().first, $);\r\n            x2.store(1, order().first, $);\r\n        }\r\n        else\r\n        {\r\n            int y2 = x2.load(order().second, $);\r\n            int y1 = x1.load(order().second, $);\r\n            //RL_UNTIL(0 == y1 && 0 != y2);\r\n            (void)y2;\r\n            (void)y1;\r\n        }\r\n    }\r\n\r\n    std::pair<rl::memory_order, rl::memory_order> order()\r\n    {\r\n        switch (index)\r\n        {\r\n        default: RL_VERIFY(false);\r\n        case 0: return std::make_pair(rl::mo_relaxed, rl::mo_relaxed);\r\n        case 1: return std::make_pair(rl::mo_release, rl::mo_relaxed);\r\n        case 2: return std::make_pair(rl::mo_seq_cst, rl::mo_relaxed);\r\n        case 3: return std::make_pair(rl::mo_relaxed, rl::mo_acquire);\r\n        case 4: return std::make_pair(rl::mo_relaxed, rl::mo_seq_cst);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct reorder_single_var_test : rl::test_suite<reorder_single_var_test, 2>\r\n{\r\n    std::atomic<int> x;\r\n\r\n    void before()\r\n    {\r\n        x($) = 0;\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (index)\r\n        {\r\n            x.store(1, rl::memory_order_relaxed);\r\n        }\r\n        else\r\n        {\r\n            int y1 = x.load(rl::memory_order_relaxed);\r\n            int y2 = x.load(rl::memory_order_relaxed);\r\n            RL_ASSERT(y1 == 0 || y2 == 1);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct acq_rel_test : rl::test_suite<acq_rel_test, 2>\r\n{\r\n    std::atomic<int> x;\r\n    rl::var<int> y;\r\n\r\n    void before()\r\n    {\r\n        x($) = 0;\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (index)\r\n        {\r\n            VAR(y) = 1;\r\n            x.store(1, std::memory_order_release);\r\n        }\r\n        else\r\n        {\r\n            int f = x.load(rl::memory_order_acquire);\r\n            if (f)\r\n            {\r\n                int d = VAR(y);\r\n                RL_ASSERT(1 == d);\r\n            }\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\ntemplate<int index>\r\nstruct seq_cst_test : rl::test_suite<seq_cst_test<index>, 4,\r\n    (rl::test_result_e)((1 - index) * rl::test_result_until_condition_hit)>\r\n{\r\n    std::atomic<int> x1;\r\n    std::atomic<int> x2;\r\n\r\n    int res;\r\n\r\n    void before()\r\n    {\r\n        x1($) = 0;\r\n        x2($) = 0;\r\n        res = 0;\r\n    }\r\n\r\n    void thread(unsigned th)\r\n    {\r\n        if (0 == th)\r\n        {\r\n            x1.store(1, order().first, $);\r\n        }\r\n        else if (1 == th)\r\n        {\r\n            x2.store(1, order().first, $);\r\n        }\r\n        else if (2 == th)\r\n        {\r\n            int v1 = x1.load(order().second, $);\r\n            int v2 = x2.load(order().second, $);\r\n            res += (v1 == 1 && v2 == 0);\r\n        }\r\n        else if (3 == th)\r\n        {\r\n            int v2 = x2.load(order().second, $);\r\n            int v1 = x1.load(order().second, $);\r\n            res += (v2 == 1 && v1 == 0);\r\n        }\r\n    }\r\n\r\n    void after()\r\n    {\r\n        if ((void)0, 0 == index)\r\n        {\r\n            RL_UNTIL(2 == res);\r\n        }\r\n        else\r\n        {\r\n            RL_ASSERT(2 != res);\r\n        }\r\n    }\r\n\r\n    std::pair<rl::memory_order, rl::memory_order> order()\r\n    {\r\n        switch (index)\r\n        {\r\n        default: RL_VERIFY(false);\r\n        case 0: return std::make_pair(rl::mo_release, rl::mo_acquire);\r\n        case 1: return std::make_pair(rl::mo_seq_cst, rl::mo_seq_cst);\r\n        }\r\n    }\r\n};\r\n\r\nstruct modification_order_test : rl::test_suite<modification_order_test, 2>\r\n{\r\n    std::atomic<int> a;\r\n    rl::var<int> x;\r\n\r\n    void before()\r\n    {\r\n        a($) = 0;\r\n        x($) = 0;\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (index)\r\n        {\r\n            x($) = 1;\r\n            a.store(1, rl::memory_order_release);\r\n            a.store(2, rl::memory_order_relaxed);\r\n        }\r\n        else\r\n        {\r\n            if (a.load(rl::memory_order_acquire))\r\n                x($).load();\r\n        }\r\n    }\r\n};\r\n\r\nstruct reordering_test : rl::test_suite<reordering_test, 3>\r\n{\r\n    std::atomic<int> x;\r\n    std::atomic<int> y;\r\n    std::atomic<int> r;\r\n\r\n    void before()\r\n    {\r\n        x($) = 0;\r\n        y($) = 0;\r\n        r($) = 0;\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            x.store(1, rl::memory_order_relaxed);\r\n        }\r\n        else if (1 == index)\r\n        {\r\n            if (x.load(rl::memory_order_relaxed))\r\n                r.store(1, rl::memory_order_relaxed);\r\n            y.store(1, rl::memory_order_release);\r\n        }\r\n        else\r\n        {\r\n            if (y.load(rl::memory_order_acquire))\r\n            {\r\n                if (r.load(rl::memory_order_relaxed))\r\n                {\r\n                    RL_ASSERT(x.load(rl::memory_order_relaxed));\r\n                }\r\n            }\r\n        }\r\n    }\r\n};\r\n\r\nstruct reordering_test2 : rl::test_suite<reordering_test2, 3, rl::test_result_until_condition_hit>\r\n{\r\n    std::atomic<int> x1;\r\n    std::atomic<int> x2;\r\n    std::atomic<int> y;\r\n    std::atomic<int> r;\r\n\r\n    void before()\r\n    {\r\n        std::atomic<char*> x (0);\r\n        char* ch = 0;\r\n        x.compare_exchange_weak(ch, 0, std::memory_order_seq_cst);\r\n\r\n        x1($) = 0;\r\n        x2($) = 0;\r\n        y($) = 0;\r\n        r($) = 0;\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            x1.store(1, rl::memory_order_relaxed);\r\n            x2.store(1, rl::memory_order_relaxed);\r\n        }\r\n        else if (1 == index)\r\n        {\r\n            if (x2.load(rl::memory_order_relaxed))\r\n                r.store(1, rl::memory_order_relaxed);\r\n            y.store(1, rl::memory_order_release);\r\n        }\r\n        else\r\n        {\r\n            if (y.load(rl::memory_order_acquire))\r\n            {\r\n                if (r.load(rl::memory_order_relaxed))\r\n                {\r\n                    RL_UNTIL(0 == x1.load(rl::memory_order_relaxed));\r\n                }\r\n            }\r\n        }\r\n    }\r\n};\r\n\r\nstruct transitive_test : rl::test_suite<transitive_test, 3>\r\n{\r\n    std::atomic<int> x;\r\n    rl::var<int> y;\r\n\r\n    void before()\r\n    {\r\n        x($) = 0;\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            VAR(y) = 1;\r\n            x.fetch_add(1, rl::memory_order_release);\r\n        }\r\n        else if (1 == index)\r\n        {\r\n            x.fetch_add(2, rl::memory_order_acquire);\r\n        }\r\n        else\r\n        {\r\n            x.load(rl::memory_order_acquire);\r\n            int w = x.load(rl::memory_order_acquire);\r\n            if (1 == w || 3 == w)\r\n            {\r\n                y($).load();\r\n            }\r\n        }\r\n    }\r\n};\r\n\r\n\r\nstruct cc_transitive_test : rl::test_suite<cc_transitive_test, 3>\r\n{\r\n    std::atomic<int> x;\r\n    std::atomic<int> y;\r\n\r\n    void before()\r\n    {\r\n        x.store(0, std::memory_order_relaxed);\r\n        y.store(0, std::memory_order_relaxed);\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            x.store(1, std::memory_order_relaxed);\r\n        }\r\n        else if (1 == index)\r\n        {\r\n            if (x.load(std::memory_order_relaxed))\r\n                y.store(1, std::memory_order_release);\r\n        }\r\n        else\r\n        {\r\n            if (y.load(std::memory_order_acquire))\r\n                assert(x.load(std::memory_order_relaxed));\r\n        }\r\n    }\r\n};\r\n\r\n\r\nstruct occasional_test : rl::test_suite<occasional_test, 3, rl::test_result_until_condition_hit>\r\n{\r\n    std::atomic<int> x, y, z;\r\n\r\n    void before()\r\n    {\r\n        x.store(0, std::memory_order_relaxed);\r\n        y.store(0, std::memory_order_relaxed);\r\n        z.store(0, std::memory_order_relaxed);\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            x.store(1, rl::memory_order_relaxed);\r\n            y.store(1, rl::memory_order_release);\r\n        }\r\n        else if (1 == index)\r\n        {\r\n            if (y.load(rl::memory_order_relaxed))\r\n                z.store(1, rl::memory_order_release);\r\n        }\r\n        else\r\n        {\r\n            if (z.load(rl::memory_order_acquire))\r\n            {\r\n                RL_ASSERT(y.load(rl::memory_order_relaxed));\r\n                RL_UNTIL(0 == x.load(rl::memory_order_relaxed));\r\n            }\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/msvc71/test.sln",
    "content": "Microsoft Visual Studio Solution File, Format Version 8.00\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"test\", \"test.vcproj\", \"{8C8174E2-2B2E-484D-9EB4-85D29347F22F}\"\r\n\tProjectSection(ProjectDependencies) = postProject\r\n\tEndProjectSection\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfiguration) = preSolution\r\n\t\tDebug = Debug\r\n\t\tRelease = Release\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfiguration) = postSolution\r\n\t\t{8C8174E2-2B2E-484D-9EB4-85D29347F22F}.Debug.ActiveCfg = Debug|Win32\r\n\t\t{8C8174E2-2B2E-484D-9EB4-85D29347F22F}.Debug.Build.0 = Debug|Win32\r\n\t\t{8C8174E2-2B2E-484D-9EB4-85D29347F22F}.Release.ActiveCfg = Release|Win32\r\n\t\t{8C8174E2-2B2E-484D-9EB4-85D29347F22F}.Release.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ExtensibilityGlobals) = postSolution\r\n\tEndGlobalSection\r\n\tGlobalSection(ExtensibilityAddIns) = postSolution\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/msvc71/test.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"7.10\"\r\n\tName=\"test\"\r\n\tProjectGUID=\"{8C8174E2-2B2E-484D-9EB4-85D29347F22F}\"\r\n\tKeyword=\"Win32Proj\">\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"/>\r\n\t</Platforms>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"Debug\"\r\n\t\t\tIntermediateDirectory=\"Debug\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"2\">\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"TRUE\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"5\"\r\n\t\t\t\tUsePrecompiledHeader=\"3\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"TRUE\"\r\n\t\t\t\tDebugInformationFormat=\"4\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tOutputFile=\"$(OutDir)/test.exe\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"TRUE\"\r\n\t\t\t\tProgramDatabaseFile=\"$(OutDir)/test.pdb\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedWrapperGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAuxiliaryManagedWrapperGeneratorTool\"/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"Release\"\r\n\t\t\tIntermediateDirectory=\"Release\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"2\">\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"4\"\r\n\t\t\t\tUsePrecompiledHeader=\"3\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"TRUE\"\r\n\t\t\t\tDebugInformationFormat=\"3\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tOutputFile=\"$(OutDir)/test.exe\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"TRUE\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedWrapperGeneratorTool\"/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAuxiliaryManagedWrapperGeneratorTool\"/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\blocking_mutex.hpp\">\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\compare_swap.hpp\">\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\condvar.hpp\">\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\data_race.hpp\">\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\fence.hpp\">\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\foo.cpp\">\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\main.cpp\">\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\memory_order.hpp\">\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\scheduler.hpp\">\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.cpp\">\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|Win32\">\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|Win32\">\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"/>\r\n\t\t\t</FileConfiguration>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.h\">\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/msvc8/rrd.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 9.00\r\n# Visual Studio 2005\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"test\", \"test.vcproj\", \"{99882C71-3316-411F-A8AE-EC1E40702040}\"\r\n\tProjectSection(WebsiteProperties) = preProject\r\n\t\tDebug.AspNetCompiler.Debug = \"True\"\r\n\t\tRelease.AspNetCompiler.Debug = \"False\"\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"rrd\", \"rrd.vcproj\", \"{D4F501D0-382D-4CBC-86F4-56181F383444}\"\r\n\tProjectSection(WebsiteProperties) = preProject\r\n\t\tDebug.AspNetCompiler.Debug = \"True\"\r\n\t\tRelease.AspNetCompiler.Debug = \"False\"\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"peterson\", \"..\\..\\example\\peterson\\msvc8\\peterson.vcproj\", \"{D4756EE9-3953-4E17-B1B5-E89F853303C1}\"\r\n\tProjectSection(WebsiteProperties) = preProject\r\n\t\tDebug.AspNetCompiler.Debug = \"True\"\r\n\t\tRelease.AspNetCompiler.Debug = \"False\"\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"proxy_collector\", \"..\\..\\example\\proxy_collector\\msvc8\\proxy_collector.vcproj\", \"{31994C0C-3BAD-4F25-8BC8-3206FF349B29}\"\r\n\tProjectSection(WebsiteProperties) = preProject\r\n\t\tDebug.AspNetCompiler.Debug = \"True\"\r\n\t\tRelease.AspNetCompiler.Debug = \"False\"\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"ref_counting\", \"..\\..\\example\\ref_counting\\msvc8\\ref_counting.vcproj\", \"{31994C0C-3BAD-4F25-8BC8-3206FF349B28}\"\r\n\tProjectSection(WebsiteProperties) = preProject\r\n\t\tDebug.AspNetCompiler.Debug = \"True\"\r\n\t\tRelease.AspNetCompiler.Debug = \"False\"\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"stack\", \"..\\..\\example\\stack\\msvc8\\stack.vcproj\", \"{4D6D7FC3-66D1-4F80-B434-2FDCBBFBC9F5}\"\r\n\tProjectSection(WebsiteProperties) = preProject\r\n\t\tDebug.AspNetCompiler.Debug = \"True\"\r\n\t\tRelease.AspNetCompiler.Debug = \"False\"\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"spsc_queue\", \"..\\..\\example\\spsc_queue\\msvc8\\spsc_queue.vcproj\", \"{2F0B1A3B-27CA-47D4-A9D1-5EC66BB0A85B}\"\r\n\tProjectSection(WebsiteProperties) = preProject\r\n\t\tDebug.AspNetCompiler.Debug = \"True\"\r\n\t\tRelease.AspNetCompiler.Debug = \"False\"\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"condvar\", \"..\\..\\example\\condvar\\msvc8\\condvar.vcproj\", \"{6CC59CF8-408B-441B-8F65-15651210CB82}\"\r\n\tProjectSection(WebsiteProperties) = preProject\r\n\t\tDebug.AspNetCompiler.Debug = \"True\"\r\n\t\tRelease.AspNetCompiler.Debug = \"False\"\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"smr\", \"..\\..\\example\\smr\\msvc8\\smr.vcproj\", \"{BC168133-5E3D-4691-BA15-8E0FD61DFDB5}\"\r\n\tProjectSection(WebsiteProperties) = preProject\r\n\t\tDebug.AspNetCompiler.Debug = \"True\"\r\n\t\tRelease.AspNetCompiler.Debug = \"False\"\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"mutex_business_logic\", \"..\\..\\example\\mutex_business_logic\\msvc8\\mutex_business_logic.vcproj\", \"{B03A7216-E196-44C6-8861-C77D90055512}\"\r\n\tProjectSection(WebsiteProperties) = preProject\r\n\t\tDebug.AspNetCompiler.Debug = \"True\"\r\n\t\tRelease.AspNetCompiler.Debug = \"False\"\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"ws_deque\", \"..\\..\\example\\ws_deque\\msvc8\\ws_deque.vcproj\", \"{0B597F19-DEBB-4832-B520-9A93A286D595}\"\r\n\tProjectSection(WebsiteProperties) = preProject\r\n\t\tDebug.AspNetCompiler.Debug = \"True\"\r\n\t\tRelease.AspNetCompiler.Debug = \"False\"\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"jtest\", \"..\\..\\jtest\\msvc8\\jtest.vcproj\", \"{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}\"\r\n\tProjectSection(WebsiteProperties) = preProject\r\n\t\tDebug.AspNetCompiler.Debug = \"True\"\r\n\t\tRelease.AspNetCompiler.Debug = \"False\"\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"ntest\", \"..\\..\\ntest\\msvc8\\ntest.vcproj\", \"{D8A75C0E-3C9A-42E5-97EC-75AEBE64C372}\"\r\n\tProjectSection(WebsiteProperties) = preProject\r\n\t\tDebug.AspNetCompiler.Debug = \"True\"\r\n\t\tRelease.AspNetCompiler.Debug = \"False\"\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"cli_ws_deque\", \"..\\..\\example\\cli_ws_deque\\msvc8\\cli_ws_deque.vcproj\", \"{967F376B-BDBF-4AC8-9325-371CC8ABD8FD}\"\r\n\tProjectSection(WebsiteProperties) = preProject\r\n\t\tDebug.AspNetCompiler.Debug = \"True\"\r\n\t\tRelease.AspNetCompiler.Debug = \"False\"\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"java_ws_deque\", \"..\\..\\example\\java_ws_deque\\msvc8\\java_ws_deque.vcproj\", \"{9E88433F-779E-4461-9963-35E3338873AC}\"\r\n\tProjectSection(WebsiteProperties) = preProject\r\n\t\tDebug.AspNetCompiler.Debug = \"True\"\r\n\t\tRelease.AspNetCompiler.Debug = \"False\"\r\n\tEndProjectSection\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tProfile|Win32 = Profile|Win32\r\n\t\tRelease|Win32 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Profile|Win32.ActiveCfg = Profile|Win32\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Profile|Win32.ActiveCfg = Release|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Profile|Win32.Build.0 = Release|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Profile|Win32.ActiveCfg = Release|Win32\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Profile|Win32.Build.0 = Release|Win32\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B29}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B29}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B29}.Profile|Win32.ActiveCfg = Profile|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B29}.Profile|Win32.Build.0 = Profile|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B29}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B29}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B28}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B28}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B28}.Profile|Win32.ActiveCfg = Release|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B28}.Profile|Win32.Build.0 = Release|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B28}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B28}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{4D6D7FC3-66D1-4F80-B434-2FDCBBFBC9F5}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{4D6D7FC3-66D1-4F80-B434-2FDCBBFBC9F5}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{4D6D7FC3-66D1-4F80-B434-2FDCBBFBC9F5}.Profile|Win32.ActiveCfg = Release|Win32\r\n\t\t{4D6D7FC3-66D1-4F80-B434-2FDCBBFBC9F5}.Profile|Win32.Build.0 = Release|Win32\r\n\t\t{4D6D7FC3-66D1-4F80-B434-2FDCBBFBC9F5}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{4D6D7FC3-66D1-4F80-B434-2FDCBBFBC9F5}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{2F0B1A3B-27CA-47D4-A9D1-5EC66BB0A85B}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{2F0B1A3B-27CA-47D4-A9D1-5EC66BB0A85B}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{2F0B1A3B-27CA-47D4-A9D1-5EC66BB0A85B}.Profile|Win32.ActiveCfg = Release|Win32\r\n\t\t{2F0B1A3B-27CA-47D4-A9D1-5EC66BB0A85B}.Profile|Win32.Build.0 = Release|Win32\r\n\t\t{2F0B1A3B-27CA-47D4-A9D1-5EC66BB0A85B}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{2F0B1A3B-27CA-47D4-A9D1-5EC66BB0A85B}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{6CC59CF8-408B-441B-8F65-15651210CB82}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{6CC59CF8-408B-441B-8F65-15651210CB82}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{6CC59CF8-408B-441B-8F65-15651210CB82}.Profile|Win32.ActiveCfg = Release|Win32\r\n\t\t{6CC59CF8-408B-441B-8F65-15651210CB82}.Profile|Win32.Build.0 = Release|Win32\r\n\t\t{6CC59CF8-408B-441B-8F65-15651210CB82}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{6CC59CF8-408B-441B-8F65-15651210CB82}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{BC168133-5E3D-4691-BA15-8E0FD61DFDB5}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{BC168133-5E3D-4691-BA15-8E0FD61DFDB5}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{BC168133-5E3D-4691-BA15-8E0FD61DFDB5}.Profile|Win32.ActiveCfg = Release|Win32\r\n\t\t{BC168133-5E3D-4691-BA15-8E0FD61DFDB5}.Profile|Win32.Build.0 = Release|Win32\r\n\t\t{BC168133-5E3D-4691-BA15-8E0FD61DFDB5}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{BC168133-5E3D-4691-BA15-8E0FD61DFDB5}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{B03A7216-E196-44C6-8861-C77D90055512}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{B03A7216-E196-44C6-8861-C77D90055512}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{B03A7216-E196-44C6-8861-C77D90055512}.Profile|Win32.ActiveCfg = Release|Win32\r\n\t\t{B03A7216-E196-44C6-8861-C77D90055512}.Profile|Win32.Build.0 = Release|Win32\r\n\t\t{B03A7216-E196-44C6-8861-C77D90055512}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{B03A7216-E196-44C6-8861-C77D90055512}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{0B597F19-DEBB-4832-B520-9A93A286D595}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{0B597F19-DEBB-4832-B520-9A93A286D595}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{0B597F19-DEBB-4832-B520-9A93A286D595}.Profile|Win32.ActiveCfg = Release|Win32\r\n\t\t{0B597F19-DEBB-4832-B520-9A93A286D595}.Profile|Win32.Build.0 = Release|Win32\r\n\t\t{0B597F19-DEBB-4832-B520-9A93A286D595}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{0B597F19-DEBB-4832-B520-9A93A286D595}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}.Profile|Win32.ActiveCfg = Release|Win32\r\n\t\t{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}.Profile|Win32.Build.0 = Release|Win32\r\n\t\t{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{D8A75C0E-3C9A-42E5-97EC-75AEBE64C372}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{D8A75C0E-3C9A-42E5-97EC-75AEBE64C372}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{D8A75C0E-3C9A-42E5-97EC-75AEBE64C372}.Profile|Win32.ActiveCfg = Release|Win32\r\n\t\t{D8A75C0E-3C9A-42E5-97EC-75AEBE64C372}.Profile|Win32.Build.0 = Release|Win32\r\n\t\t{D8A75C0E-3C9A-42E5-97EC-75AEBE64C372}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{D8A75C0E-3C9A-42E5-97EC-75AEBE64C372}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{967F376B-BDBF-4AC8-9325-371CC8ABD8FD}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{967F376B-BDBF-4AC8-9325-371CC8ABD8FD}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{967F376B-BDBF-4AC8-9325-371CC8ABD8FD}.Profile|Win32.ActiveCfg = Release|Win32\r\n\t\t{967F376B-BDBF-4AC8-9325-371CC8ABD8FD}.Profile|Win32.Build.0 = Release|Win32\r\n\t\t{967F376B-BDBF-4AC8-9325-371CC8ABD8FD}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{967F376B-BDBF-4AC8-9325-371CC8ABD8FD}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{9E88433F-779E-4461-9963-35E3338873AC}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{9E88433F-779E-4461-9963-35E3338873AC}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{9E88433F-779E-4461-9963-35E3338873AC}.Profile|Win32.ActiveCfg = Release|Win32\r\n\t\t{9E88433F-779E-4461-9963-35E3338873AC}.Profile|Win32.Build.0 = Release|Win32\r\n\t\t{9E88433F-779E-4461-9963-35E3338873AC}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{9E88433F-779E-4461-9963-35E3338873AC}.Release|Win32.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/msvc8/rrd.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"rrd\"\r\n\tProjectGUID=\"{D4F501D0-382D-4CBC-86F4-56181F383444}\"\r\n\tRootNamespace=\"rrd\"\r\n\tKeyword=\"Win32Proj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t\t<Platform\r\n\t\t\tName=\"x64\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"4\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_LIB\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLibrarianTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|x64\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"4\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_LIB\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLibrarianTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"4\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_LIB\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLibrarianTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|x64\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"4\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_LIB\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLibrarianTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug64|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"4\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_LIB\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLibrarianTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug64|x64\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"4\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_LIB\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLibrarianTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<Filter\r\n\t\t\tName=\"front-end\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\atomic.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\atomic_events.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\atomic_fence.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\backoff.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\cli.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\cli_interlocked.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\cli_var.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\cli_volatile.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\java.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\java_atomic.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\java_var.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\java_volatile.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\var.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\volatile.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"scheduler\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\context_bound_scheduler.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\full_search_scheduler.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\random_scheduler.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\scheduler.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"base\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\base.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\foreach.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\pch.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\platform.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\random.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\signature.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"stdlib\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\stdlib\\condition_variable.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\stdlib\\event.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\stdlib\\mutex.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\stdlib\\recursive_mutex.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\stdlib\\semaphore.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\stdlib\\shared_mutex.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\context.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\context_base.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\context_base_impl.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\history.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\memory.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\memory_order.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\pthread.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\relacy.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\relacy_cli.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\relacy_java.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\relacy_std.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\rmw.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\slab_allocator.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\sync_var.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\test_params.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\test_result.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\test_suite.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\thread.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\waitset.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\windows.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/msvc8/test.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 9.00\r\n# Visual Studio 2005\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"test\", \"test.vcproj\", \"{99882C71-3316-411F-A8AE-EC1E40702040}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"rrd\", \"rrd.vcproj\", \"{D4F501D0-382D-4CBC-86F4-56181F383444}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tDebug|x64 = Debug|x64\r\n\t\tDebug64|Win32 = Debug64|Win32\r\n\t\tDebug64|x64 = Debug64|x64\r\n\t\tProfile|Win32 = Profile|Win32\r\n\t\tProfile|x64 = Profile|x64\r\n\t\tRelease|Win32 = Release|Win32\r\n\t\tRelease|x64 = Release|x64\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Debug64|Win32.ActiveCfg = Debug64|Win32\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Debug64|Win32.Build.0 = Debug64|Win32\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Debug64|x64.ActiveCfg = Debug64|x64\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Debug64|x64.Build.0 = Debug64|x64\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Profile|Win32.ActiveCfg = Profile|Win32\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Profile|Win32.Build.0 = Profile|Win32\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Profile|x64.ActiveCfg = Profile|x64\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Profile|x64.Build.0 = Profile|x64\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Release|x64.Build.0 = Release|x64\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug64|Win32.ActiveCfg = Debug64|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug64|Win32.Build.0 = Debug64|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug64|x64.ActiveCfg = Debug64|x64\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug64|x64.Build.0 = Debug64|x64\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Profile|Win32.ActiveCfg = Release|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Profile|Win32.Build.0 = Release|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Profile|x64.ActiveCfg = Debug64|x64\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Profile|x64.Build.0 = Debug64|x64\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Release|x64.Build.0 = Release|x64\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/msvc8/test.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"test\"\r\n\tProjectGUID=\"{99882C71-3316-411F-A8AE-EC1E40702040}\"\r\n\tRootNamespace=\"test\"\r\n\tKeyword=\"Win32Proj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t\t<Platform\r\n\t\t\tName=\"x64\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateManifest=\"true\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|x64\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateManifest=\"true\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"17\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"0\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tInlineFunctionExpansion=\"2\"\r\n\t\t\t\tEnableIntrinsicFunctions=\"true\"\r\n\t\t\t\tFavorSizeOrSpeed=\"1\"\r\n\t\t\t\tOmitFramePointers=\"true\"\r\n\t\t\t\tEnableFiberSafeOptimizations=\"true\"\r\n\t\t\t\tWholeProgramOptimization=\"false\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tBufferSecurityCheck=\"false\"\r\n\t\t\t\tEnableEnhancedInstructionSet=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"false\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateManifest=\"true\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tLinkTimeCodeGeneration=\"0\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|x64\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tInlineFunctionExpansion=\"2\"\r\n\t\t\t\tEnableIntrinsicFunctions=\"true\"\r\n\t\t\t\tFavorSizeOrSpeed=\"1\"\r\n\t\t\t\tOmitFramePointers=\"true\"\r\n\t\t\t\tEnableFiberSafeOptimizations=\"true\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tBufferSecurityCheck=\"false\"\r\n\t\t\t\tEnableEnhancedInstructionSet=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"false\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateManifest=\"true\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"17\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Profile|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"0\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tAdditionalOptions=\"/Ob0\"\r\n\t\t\t\tEnableIntrinsicFunctions=\"true\"\r\n\t\t\t\tFavorSizeOrSpeed=\"1\"\r\n\t\t\t\tOmitFramePointers=\"true\"\r\n\t\t\t\tEnableFiberSafeOptimizations=\"true\"\r\n\t\t\t\tWholeProgramOptimization=\"false\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tBufferSecurityCheck=\"false\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"false\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateManifest=\"true\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tLinkTimeCodeGeneration=\"0\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Profile|x64\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"0\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tAdditionalOptions=\"/Ob0\"\r\n\t\t\t\tEnableIntrinsicFunctions=\"true\"\r\n\t\t\t\tFavorSizeOrSpeed=\"1\"\r\n\t\t\t\tOmitFramePointers=\"true\"\r\n\t\t\t\tEnableFiberSafeOptimizations=\"true\"\r\n\t\t\t\tWholeProgramOptimization=\"false\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tBufferSecurityCheck=\"false\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"false\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateManifest=\"true\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tLinkTimeCodeGeneration=\"0\"\r\n\t\t\t\tTargetMachine=\"17\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug64|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateManifest=\"true\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug64|x64\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateManifest=\"true\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"17\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\compare_swap.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\condvar.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\data_race.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\event.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\fence.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\foo.cpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\main.cpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\memory_order.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\mutex.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\scheduler.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\semaphore.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.cpp\"\r\n\t\t\t>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Profile|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Profile|x64\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug64|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug64|x64\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\todo.txt\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\wfmo.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/msvc9/rrd.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 10.00\r\n# Visual Studio 2008\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"test\", \"test.vcproj\", \"{99882C71-3316-411F-A8AE-EC1E40702040}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"ref_counting\", \"..\\..\\example\\ref_counting\\msvc9\\ref_counting.vcproj\", \"{31994C0C-3BAD-4F25-8BC8-3206FF349B28}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"peterson\", \"..\\..\\example\\peterson\\msvc9\\peterson.vcproj\", \"{D4756EE9-3953-4E17-B1B5-E89F853303C1}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"stack\", \"..\\..\\example\\stack\\msvc9\\stack.vcproj\", \"{4D6D7FC3-66D1-4F80-B434-2FDCBBFBC9F5}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"proxy_collector\", \"..\\..\\example\\proxy_collector\\msvc9\\proxy_collector.vcproj\", \"{31994C0C-3BAD-4F25-8BC8-3206FF349B29}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"rrd\", \"rrd.vcproj\", \"{D4F501D0-382D-4CBC-86F4-56181F383444}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"ntest\", \"..\\..\\ntest\\msvc9\\ntest.vcproj\", \"{D8A75C0E-3C9A-42E5-97EC-75AEBE64C372}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"jtest\", \"..\\..\\jtest\\msvc9\\jtest.vcproj\", \"{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"smr\", \"..\\..\\example\\smr\\msvc9\\smr.vcproj\", \"{BC168133-5E3D-4691-BA15-8E0FD61DFDB5}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"spsc_queue\", \"..\\..\\example\\spsc_queue\\msvc9\\spsc_queue.vcproj\", \"{3F32C4FA-E451-42BC-9E65-74129120B6E4}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"condvar\", \"..\\..\\example\\condvar\\msvc9\\condvar.vcproj\", \"{6CC59CF8-408B-441B-8F65-15651210CB82}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"ws_deque\", \"..\\..\\example\\ws_deque\\msvc9\\ws_deque.vcproj\", \"{0B597F19-DEBB-4832-B520-9A93A286D595}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"examples\", \"..\\..\\example\\examples\\msvc9\\examples.vcproj\", \"{1EB73A6F-7F94-4ED4-8EB3-C245E773207A}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tProfile|Win32 = Profile|Win32\r\n\t\tRelease|Win32 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Profile|Win32.ActiveCfg = Profile|Win32\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B28}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B28}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B28}.Profile|Win32.ActiveCfg = Release|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B28}.Profile|Win32.Build.0 = Release|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B28}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B28}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Profile|Win32.ActiveCfg = Release|Win32\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Profile|Win32.Build.0 = Release|Win32\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{D4756EE9-3953-4E17-B1B5-E89F853303C1}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{4D6D7FC3-66D1-4F80-B434-2FDCBBFBC9F5}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{4D6D7FC3-66D1-4F80-B434-2FDCBBFBC9F5}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{4D6D7FC3-66D1-4F80-B434-2FDCBBFBC9F5}.Profile|Win32.ActiveCfg = Release|Win32\r\n\t\t{4D6D7FC3-66D1-4F80-B434-2FDCBBFBC9F5}.Profile|Win32.Build.0 = Release|Win32\r\n\t\t{4D6D7FC3-66D1-4F80-B434-2FDCBBFBC9F5}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{4D6D7FC3-66D1-4F80-B434-2FDCBBFBC9F5}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B29}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B29}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B29}.Profile|Win32.ActiveCfg = Profile|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B29}.Profile|Win32.Build.0 = Profile|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B29}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{31994C0C-3BAD-4F25-8BC8-3206FF349B29}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Profile|Win32.ActiveCfg = Release|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Profile|Win32.Build.0 = Release|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{D8A75C0E-3C9A-42E5-97EC-75AEBE64C372}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{D8A75C0E-3C9A-42E5-97EC-75AEBE64C372}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{D8A75C0E-3C9A-42E5-97EC-75AEBE64C372}.Profile|Win32.ActiveCfg = Release|Win32\r\n\t\t{D8A75C0E-3C9A-42E5-97EC-75AEBE64C372}.Profile|Win32.Build.0 = Release|Win32\r\n\t\t{D8A75C0E-3C9A-42E5-97EC-75AEBE64C372}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{D8A75C0E-3C9A-42E5-97EC-75AEBE64C372}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}.Profile|Win32.ActiveCfg = Release|Win32\r\n\t\t{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}.Profile|Win32.Build.0 = Release|Win32\r\n\t\t{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{1889E8F4-47F7-48B6-9FC7-61FD7CD000C8}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{BC168133-5E3D-4691-BA15-8E0FD61DFDB5}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{BC168133-5E3D-4691-BA15-8E0FD61DFDB5}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{BC168133-5E3D-4691-BA15-8E0FD61DFDB5}.Profile|Win32.ActiveCfg = Release|Win32\r\n\t\t{BC168133-5E3D-4691-BA15-8E0FD61DFDB5}.Profile|Win32.Build.0 = Release|Win32\r\n\t\t{BC168133-5E3D-4691-BA15-8E0FD61DFDB5}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{BC168133-5E3D-4691-BA15-8E0FD61DFDB5}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{3F32C4FA-E451-42BC-9E65-74129120B6E4}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{3F32C4FA-E451-42BC-9E65-74129120B6E4}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{3F32C4FA-E451-42BC-9E65-74129120B6E4}.Profile|Win32.ActiveCfg = Release|Win32\r\n\t\t{3F32C4FA-E451-42BC-9E65-74129120B6E4}.Profile|Win32.Build.0 = Release|Win32\r\n\t\t{3F32C4FA-E451-42BC-9E65-74129120B6E4}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{3F32C4FA-E451-42BC-9E65-74129120B6E4}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{6CC59CF8-408B-441B-8F65-15651210CB82}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{6CC59CF8-408B-441B-8F65-15651210CB82}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{6CC59CF8-408B-441B-8F65-15651210CB82}.Profile|Win32.ActiveCfg = Release|Win32\r\n\t\t{6CC59CF8-408B-441B-8F65-15651210CB82}.Profile|Win32.Build.0 = Release|Win32\r\n\t\t{6CC59CF8-408B-441B-8F65-15651210CB82}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{6CC59CF8-408B-441B-8F65-15651210CB82}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{0B597F19-DEBB-4832-B520-9A93A286D595}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{0B597F19-DEBB-4832-B520-9A93A286D595}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{0B597F19-DEBB-4832-B520-9A93A286D595}.Profile|Win32.ActiveCfg = Release|Win32\r\n\t\t{0B597F19-DEBB-4832-B520-9A93A286D595}.Profile|Win32.Build.0 = Release|Win32\r\n\t\t{0B597F19-DEBB-4832-B520-9A93A286D595}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{0B597F19-DEBB-4832-B520-9A93A286D595}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{1EB73A6F-7F94-4ED4-8EB3-C245E773207A}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{1EB73A6F-7F94-4ED4-8EB3-C245E773207A}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{1EB73A6F-7F94-4ED4-8EB3-C245E773207A}.Profile|Win32.ActiveCfg = Release|Win32\r\n\t\t{1EB73A6F-7F94-4ED4-8EB3-C245E773207A}.Profile|Win32.Build.0 = Release|Win32\r\n\t\t{1EB73A6F-7F94-4ED4-8EB3-C245E773207A}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{1EB73A6F-7F94-4ED4-8EB3-C245E773207A}.Release|Win32.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/msvc9/rrd.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"9.00\"\r\n\tName=\"rrd\"\r\n\tProjectGUID=\"{D4F501D0-382D-4CBC-86F4-56181F383444}\"\r\n\tRootNamespace=\"rrd\"\r\n\tKeyword=\"Win32Proj\"\r\n\tTargetFrameworkVersion=\"0\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t\t<Platform\r\n\t\t\tName=\"x64\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"4\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_LIB\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLibrarianTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|x64\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"4\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_LIB\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLibrarianTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"4\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_LIB\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLibrarianTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|x64\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"4\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_LIB\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"0\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDetect64BitPortabilityProblems=\"true\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLibrarianTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<Filter\r\n\t\t\tName=\"front-end\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\atomic.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\atomic_events.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\atomic_fence.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\backoff.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\cli.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\cli_interlocked.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\cli_var.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\cli_volatile.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\java.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\java_atomic.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\java_var.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\java_volatile.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\var.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\volatile.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"scheduler\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\context_bound_scheduler.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\full_search_scheduler.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\random_scheduler.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\scheduler.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"base\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\base.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\foreach.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\pch.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\platform.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\random.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\signature.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<Filter\r\n\t\t\tName=\"stdlib\"\r\n\t\t\t>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\stdlib\\condition_variable.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\stdlib\\event.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\stdlib\\mutex.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\stdlib\\pthread.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\stdlib\\semaphore.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t\t<File\r\n\t\t\t\tRelativePath=\"..\\..\\relacy\\stdlib\\windows.hpp\"\r\n\t\t\t\t>\r\n\t\t\t</File>\r\n\t\t</Filter>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\addr_hash.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\context.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\context_addr_hash.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\context_base.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\context_base_impl.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\defs.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\dyn_thread.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\dyn_thread_ctx.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\history.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\memory.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\memory_order.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\pthread.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\relacy.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\relacy_cli.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\relacy_java.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\relacy_std.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\rmw.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\slab_allocator.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\sync_var.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\test_params.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\test_result.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\test_suite.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\thread.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\thread_base.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\thread_local.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\thread_local_ctx.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\waitset.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\relacy\\windows.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/msvc9/test.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 10.00\r\n# Visual Studio 2008\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"test\", \"test.vcproj\", \"{99882C71-3316-411F-A8AE-EC1E40702040}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"rrd\", \"rrd.vcproj\", \"{D4F501D0-382D-4CBC-86F4-56181F383444}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tDebug|x64 = Debug|x64\r\n\t\tProfile|Win32 = Profile|Win32\r\n\t\tProfile|x64 = Profile|x64\r\n\t\tRelease|Win32 = Release|Win32\r\n\t\tRelease|x64 = Release|x64\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Profile|Win32.ActiveCfg = Profile|Win32\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Profile|Win32.Build.0 = Profile|Win32\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Profile|x64.ActiveCfg = Profile|x64\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Profile|x64.Build.0 = Profile|x64\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{99882C71-3316-411F-A8AE-EC1E40702040}.Release|x64.Build.0 = Release|x64\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug|x64.ActiveCfg = Debug|x64\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug|x64.Build.0 = Debug|x64\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Profile|Win32.ActiveCfg = Release|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Profile|Win32.Build.0 = Release|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Profile|x64.ActiveCfg = Release|x64\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Profile|x64.Build.0 = Release|x64\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Release|x64.ActiveCfg = Release|x64\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Release|x64.Build.0 = Release|x64\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/msvc9/test.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"9.00\"\r\n\tName=\"test\"\r\n\tProjectGUID=\"{99882C71-3316-411F-A8AE-EC1E40702040}\"\r\n\tRootNamespace=\"test\"\r\n\tKeyword=\"Win32Proj\"\r\n\tTargetFrameworkVersion=\"131072\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t\t<Platform\r\n\t\t\tName=\"x64\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t\tEnablePREfast=\"false\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateManifest=\"true\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tRandomizedBaseAddress=\"1\"\r\n\t\t\t\tDataExecutionPrevention=\"0\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t\tPageHeapConserveMemory=\"true\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|x64\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tAdditionalOptions=\"/bigobj\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t\tEnablePREfast=\"false\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateManifest=\"true\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tRandomizedBaseAddress=\"1\"\r\n\t\t\t\tDataExecutionPrevention=\"0\"\r\n\t\t\t\tTargetMachine=\"17\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t\tPageHeapConserveMemory=\"true\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tInlineFunctionExpansion=\"2\"\r\n\t\t\t\tEnableIntrinsicFunctions=\"true\"\r\n\t\t\t\tFavorSizeOrSpeed=\"1\"\r\n\t\t\t\tOmitFramePointers=\"true\"\r\n\t\t\t\tEnableFiberSafeOptimizations=\"true\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tBufferSecurityCheck=\"false\"\r\n\t\t\t\tEnableEnhancedInstructionSet=\"2\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateManifest=\"true\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tRandomizedBaseAddress=\"1\"\r\n\t\t\t\tDataExecutionPrevention=\"0\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|x64\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tAdditionalOptions=\"/bigobj\"\r\n\t\t\t\tInlineFunctionExpansion=\"2\"\r\n\t\t\t\tEnableIntrinsicFunctions=\"true\"\r\n\t\t\t\tFavorSizeOrSpeed=\"1\"\r\n\t\t\t\tOmitFramePointers=\"true\"\r\n\t\t\t\tEnableFiberSafeOptimizations=\"true\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tBufferSecurityCheck=\"false\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateManifest=\"true\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tRandomizedBaseAddress=\"1\"\r\n\t\t\t\tDataExecutionPrevention=\"0\"\r\n\t\t\t\tTargetMachine=\"17\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Profile|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"0\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tAdditionalOptions=\"/Ob0\"\r\n\t\t\t\tEnableIntrinsicFunctions=\"true\"\r\n\t\t\t\tFavorSizeOrSpeed=\"1\"\r\n\t\t\t\tOmitFramePointers=\"true\"\r\n\t\t\t\tEnableFiberSafeOptimizations=\"true\"\r\n\t\t\t\tWholeProgramOptimization=\"false\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tBufferSecurityCheck=\"false\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateManifest=\"true\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tLinkTimeCodeGeneration=\"0\"\r\n\t\t\t\tRandomizedBaseAddress=\"1\"\r\n\t\t\t\tDataExecutionPrevention=\"0\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Profile|x64\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(PlatformName)\\$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"0\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t\tTargetEnvironment=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tAdditionalOptions=\"/bigobj\"\r\n\t\t\t\tEnableIntrinsicFunctions=\"true\"\r\n\t\t\t\tFavorSizeOrSpeed=\"1\"\r\n\t\t\t\tOmitFramePointers=\"true\"\r\n\t\t\t\tEnableFiberSafeOptimizations=\"true\"\r\n\t\t\t\tWholeProgramOptimization=\"false\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tBufferSecurityCheck=\"false\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"4\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateManifest=\"true\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tLinkTimeCodeGeneration=\"0\"\r\n\t\t\t\tRandomizedBaseAddress=\"1\"\r\n\t\t\t\tDataExecutionPrevention=\"0\"\r\n\t\t\t\tTargetMachine=\"17\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\..\\CHANGES.TXT\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\compare_swap.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\condvar.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\data_race.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\dyn_thread.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\event.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\fence.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\main.cpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\memory.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\memory_order.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\mutex.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\pthread.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\scheduler.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\semaphore.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.cpp\"\r\n\t\t\t>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|x64\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|x64\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Profile|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Profile|x64\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\thread_local.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\todo.txt\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\wfmo.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\windows.hpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/mutex.hpp",
    "content": "#pragma once\r\n\r\n#include \"../relacy/relacy_std.hpp\"\r\n\r\n\r\n\r\nstruct test_mutex : rl::test_suite<test_mutex, 3>\r\n{\r\n    rl::mutex mtx;\r\n    rl::var<int> data;\r\n\r\n    void before()\r\n    {\r\n        data($) = 0;\r\n    }\r\n\r\n    void after()\r\n    {\r\n        RL_ASSERT(data($) == 3);\r\n    }\r\n\r\n    void thread(unsigned /*index*/)\r\n    {\r\n        mtx.lock($);\r\n        data($) += 1;\r\n        mtx.unlock($);\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct test_deadlock : rl::test_suite<test_deadlock, 2, rl::test_result_deadlock>\r\n{\r\n    rl::mutex mtx1;\r\n    rl::mutex mtx2;\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            mtx1.lock($);\r\n            mtx2.lock($);\r\n            mtx1.unlock($);\r\n            mtx2.unlock($);\r\n        }\r\n        else\r\n        {\r\n            mtx2.lock($);\r\n            mtx1.lock($);\r\n            mtx1.unlock($);\r\n            mtx2.unlock($);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\nstruct test_deadlock2 : rl::test_suite<test_deadlock2, 2, rl::test_result_deadlock>\r\n{\r\n    std::mutex m;\r\n    std::atomic<int> f;\r\n\r\n    void before()\r\n    {\r\n        f($) = 0;\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (index)\r\n        {\r\n            m.lock($);\r\n            f($) = 1;\r\n            for (int i = 0; i != 100; ++i)\r\n                rl::yield(1, $);\r\n        }\r\n        else\r\n        {\r\n            while (0 == f($))\r\n                rl::yield(1, $);\r\n            m.lock($);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\nstruct test_mutex_destuction : rl::test_suite<test_mutex_destuction, 1, rl::test_result_destroying_owned_mutex>\r\n{\r\n    void thread(unsigned)\r\n    {\r\n        std::mutex* m = new std::mutex;\r\n        m->lock($);\r\n        delete m;\r\n    }\r\n};\r\n\r\n\r\nstruct test_mutex_destuction2 : rl::test_suite<test_mutex_destuction2, 2, rl::test_result_destroying_owned_mutex>\r\n{\r\n    std::mutex* m;\r\n    std::atomic<int> f;\r\n\r\n    void before()\r\n    {\r\n        m = new std::mutex;\r\n        f($) = 0;\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            m->lock($);\r\n            f($) = 1;\r\n            while (1 == f($))\r\n                rl::yield(1, $);\r\n            m->unlock($);\r\n        }\r\n        else\r\n        {\r\n            while (0 == f($))\r\n                rl::yield(1, $);\r\n            delete m;\r\n            f($) = 2;\r\n        }\r\n    }\r\n};\r\n\r\n\r\nstruct test_mutex_recursion : rl::test_suite<test_mutex_recursion, 2>\r\n{\r\n    std::recursive_mutex mtx;\r\n    rl::var<int> data;\r\n\r\n    void before()\r\n    {\r\n        data($) = 0;\r\n    }\r\n\r\n    void after()\r\n    {\r\n        RL_ASSERT(data($) == 2);\r\n    }\r\n\r\n    void thread(unsigned /*index*/)\r\n    {\r\n        mtx.lock($);\r\n        mtx.lock($);\r\n        data($) += 1;\r\n        mtx.unlock($);\r\n        mtx.unlock($);\r\n    }\r\n};\r\n\r\n\r\n\r\nstruct test_mutex_try_lock : rl::test_suite<test_mutex_try_lock, 2>\r\n{\r\n    std::recursive_mutex mtx;\r\n    rl::var<int> data;\r\n\r\n    void before()\r\n    {\r\n        data($) = 0;\r\n    }\r\n\r\n    void after()\r\n    {\r\n        RL_ASSERT(data($) == 2);\r\n    }\r\n\r\n    void thread(unsigned /*index*/)\r\n    {\r\n        while (false == mtx.try_lock($))\r\n            rl::yield(1, $);\r\n        RL_ASSERT(mtx.try_lock($));\r\n        data($) += 1;\r\n        mtx.unlock($);\r\n        mtx.unlock($);\r\n    }\r\n};\r\n\r\n\r\n\r\nstruct test_mutex_recursion_error : rl::test_suite<test_mutex_recursion_error, 1, rl::test_result_recursion_on_nonrecursive_mutex>\r\n{\r\n    void thread(unsigned)\r\n    {\r\n        std::mutex m;\r\n        m.lock($);\r\n        m.lock($);\r\n    }\r\n};\r\n\r\n\r\n\r\nstruct test_mutex_unlock_error : rl::test_suite<test_mutex_unlock_error, 1, rl::test_result_unlocking_mutex_wo_ownership>\r\n{\r\n    void thread(unsigned)\r\n    {\r\n        std::mutex m;\r\n        m.lock($);\r\n        m.unlock($);\r\n        m.unlock($);\r\n    }\r\n};\r\n\r\n\r\nstruct test_mutex_leak : rl::test_suite<test_mutex_leak, 1, rl::test_result_resource_leak>\r\n{\r\n    void thread(unsigned)\r\n    {\r\n        char* p = new char [sizeof(std::mutex)];\r\n        new (p) std::mutex();\r\n        delete [] p;\r\n    }\r\n};\r\n\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/ntest/msvc8/ntest.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 9.00\r\n# Visual Studio 2008\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"ntest\", \"ntest.vcproj\", \"{D8A75C0E-3C9A-42E5-97EC-75AEBE64C372}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"rrd\", \"..\\..\\test\\msvc8\\rrd.vcproj\", \"{D4F501D0-382D-4CBC-86F4-56181F383444}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tRelease|Win32 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{D8A75C0E-3C9A-42E5-97EC-75AEBE64C372}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{D8A75C0E-3C9A-42E5-97EC-75AEBE64C372}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{D8A75C0E-3C9A-42E5-97EC-75AEBE64C372}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{D8A75C0E-3C9A-42E5-97EC-75AEBE64C372}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Release|Win32.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/ntest/msvc8/ntest.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"8,00\"\r\n\tName=\"ntest\"\r\n\tProjectGUID=\"{D8A75C0E-3C9A-42E5-97EC-75AEBE64C372}\"\r\n\tRootNamespace=\"ntest\"\r\n\tKeyword=\"Win32Proj\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"2\"\r\n\t\t\t\tEnableIntrinsicFunctions=\"true\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tEnableFunctionLevelLinking=\"true\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebDeploymentTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\ntest.cpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.cpp\"\r\n\t\t\t>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/ntest/msvc9/ntest.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 10.00\r\n# Visual Studio 2008\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"ntest\", \"ntest.vcproj\", \"{D8A75C0E-3C9A-42E5-97EC-75AEBE64C372}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"rrd\", \"..\\..\\test\\msvc9\\rrd.vcproj\", \"{D4F501D0-382D-4CBC-86F4-56181F383444}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|Win32 = Debug|Win32\r\n\t\tRelease|Win32 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{D8A75C0E-3C9A-42E5-97EC-75AEBE64C372}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{D8A75C0E-3C9A-42E5-97EC-75AEBE64C372}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{D8A75C0E-3C9A-42E5-97EC-75AEBE64C372}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{D8A75C0E-3C9A-42E5-97EC-75AEBE64C372}.Release|Win32.Build.0 = Release|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug|Win32.ActiveCfg = Debug|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Debug|Win32.Build.0 = Debug|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Release|Win32.ActiveCfg = Release|Win32\r\n\t\t{D4F501D0-382D-4CBC-86F4-56181F383444}.Release|Win32.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/ntest/msvc9/ntest.vcproj",
    "content": "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\r\n<VisualStudioProject\r\n\tProjectType=\"Visual C++\"\r\n\tVersion=\"9,00\"\r\n\tName=\"ntest\"\r\n\tProjectGUID=\"{D8A75C0E-3C9A-42E5-97EC-75AEBE64C372}\"\r\n\tRootNamespace=\"ntest\"\r\n\tKeyword=\"Win32Proj\"\r\n\tTargetFrameworkVersion=\"196613\"\r\n\t>\r\n\t<Platforms>\r\n\t\t<Platform\r\n\t\t\tName=\"Win32\"\r\n\t\t/>\r\n\t</Platforms>\r\n\t<ToolFiles>\r\n\t</ToolFiles>\r\n\t<Configurations>\r\n\t\t<Configuration\r\n\t\t\tName=\"Debug|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"0\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;_DEBUG;_CONSOLE\"\r\n\t\t\t\tMinimalRebuild=\"true\"\r\n\t\t\t\tBasicRuntimeChecks=\"3\"\r\n\t\t\t\tRuntimeLibrary=\"3\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDebugInformationFormat=\"4\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"2\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t\t<Configuration\r\n\t\t\tName=\"Release|Win32\"\r\n\t\t\tOutputDirectory=\"$(SolutionDir)$(ConfigurationName)\"\r\n\t\t\tIntermediateDirectory=\"$(ConfigurationName)\"\r\n\t\t\tConfigurationType=\"1\"\r\n\t\t\tCharacterSet=\"1\"\r\n\t\t\tWholeProgramOptimization=\"1\"\r\n\t\t\t>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreBuildEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCustomBuildTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXMLDataGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCWebServiceProxyGeneratorTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCMIDLTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\tOptimization=\"2\"\r\n\t\t\t\tEnableIntrinsicFunctions=\"true\"\r\n\t\t\t\tPreprocessorDefinitions=\"WIN32;NDEBUG;_CONSOLE\"\r\n\t\t\t\tRuntimeLibrary=\"2\"\r\n\t\t\t\tEnableFunctionLevelLinking=\"true\"\r\n\t\t\t\tUsePrecompiledHeader=\"2\"\r\n\t\t\t\tWarningLevel=\"3\"\r\n\t\t\t\tDebugInformationFormat=\"3\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManagedResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCResourceCompilerTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPreLinkEventTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCLinkerTool\"\r\n\t\t\t\tLinkIncremental=\"1\"\r\n\t\t\t\tGenerateDebugInformation=\"true\"\r\n\t\t\t\tSubSystem=\"1\"\r\n\t\t\t\tOptimizeReferences=\"2\"\r\n\t\t\t\tEnableCOMDATFolding=\"2\"\r\n\t\t\t\tTargetMachine=\"1\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCALinkTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCManifestTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCXDCMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCBscMakeTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCFxCopTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCAppVerifierTool\"\r\n\t\t\t/>\r\n\t\t\t<Tool\r\n\t\t\t\tName=\"VCPostBuildEventTool\"\r\n\t\t\t/>\r\n\t\t</Configuration>\r\n\t</Configurations>\r\n\t<References>\r\n\t</References>\r\n\t<Files>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\ntest.cpp\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.cpp\"\r\n\t\t\t>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Debug|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t\t<FileConfiguration\r\n\t\t\t\tName=\"Release|Win32\"\r\n\t\t\t\t>\r\n\t\t\t\t<Tool\r\n\t\t\t\t\tName=\"VCCLCompilerTool\"\r\n\t\t\t\t\tUsePrecompiledHeader=\"1\"\r\n\t\t\t\t/>\r\n\t\t\t</FileConfiguration>\r\n\t\t</File>\r\n\t\t<File\r\n\t\t\tRelativePath=\"..\\stdafx.h\"\r\n\t\t\t>\r\n\t\t</File>\r\n\t</Files>\r\n\t<Globals>\r\n\t</Globals>\r\n</VisualStudioProject>\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/ntest/ntest.cpp",
    "content": "#include \"stdafx.h\"\r\n#include \"../../relacy/relacy_cli.hpp\"\r\n\r\nusing rl::nvar;\r\nusing rl::nvolatile;\r\nusing rl::mutex;\r\n\r\ntemplate<typename T>\r\nclass ws_deque\r\n{\r\npublic:\r\n    ws_deque()\r\n    {\r\n        m_mask($) = initial_size - 1;\r\n        m_headIndex($) = 0;\r\n        m_tailIndex($) = 0;\r\n        m_array($) = new nvar<T> [initial_size];\r\n        m_arraySize($) = initial_size;\r\n    }\r\n\r\n    bool IsEmpty()\r\n    {\r\n        return m_headIndex($) >= m_tailIndex($);\r\n    }\r\n\r\n    size_t Count()\r\n    {\r\n        return m_tailIndex($) - m_headIndex($);\r\n    }\r\n\r\n    void push(T item)\r\n    {\r\n        size_t tail = m_tailIndex($);\r\n        // original version:\r\n        //if (tail < m_headIndex($) + m_mask($))\r\n        // corrected version:\r\n        if (tail <= m_headIndex($) + m_mask($))\r\n        {\r\n            m_array($)[tail & m_mask($)]($) = item;\r\n            m_tailIndex($) = tail + 1;\r\n        }\r\n        else\r\n        {\r\n            m_foreignLock.lock($);\r\n            size_t head = m_headIndex($);\r\n            size_t count = Count();\r\n            if (count >= m_mask($))\r\n            {\r\n                size_t arraySize = m_arraySize($);\r\n                size_t mask = m_mask($);\r\n                nvar<T>* newArray = new nvar<T> [arraySize * 2];\r\n                nvar<T>* arr = m_array($);\r\n                // original version:\r\n                //for (size_t i = 0; i != arraySize; ++i)\r\n                // corrected version:\r\n                for (size_t i = 0; i != count; ++i)\r\n                    newArray[i]($) = arr[(i + head) & mask]($);\r\n                m_array($) = newArray;\r\n                m_arraySize($) = arraySize * 2;\r\n                m_headIndex($) = 0;\r\n                m_tailIndex($) = count;\r\n                tail = count;\r\n                m_mask($) = (mask * 2) | 1;\r\n            }\r\n            m_array($)[tail & m_mask($)]($) = item;\r\n            m_tailIndex($) = tail + 1;\r\n            m_foreignLock.unlock($);\r\n        }\r\n    }\r\n\r\n    bool pop(T& item)\r\n    {\r\n        size_t tail = m_tailIndex($);\r\n        // original version:\r\n        //if (m_headIndex($) >= tail)\r\n        //    return false;\r\n        // corrected version:\r\n        if (tail == 0)\r\n            return false;\r\n        tail -= 1;\r\n        rl::Interlocked::Exchange(m_tailIndex, tail, $);\r\n        if (m_headIndex($) <= tail)\r\n        {\r\n            item = m_array($)[tail & m_mask($)]($);\r\n            return true;\r\n        }\r\n        else\r\n        {\r\n            m_foreignLock.lock($);\r\n            if (m_headIndex($) <= tail)\r\n            {\r\n                item = m_array($)[tail & m_mask($)]($);\r\n                m_foreignLock.unlock($);\r\n                return true;\r\n            }\r\n            else\r\n            {\r\n                m_tailIndex($) = tail + 1;\r\n                m_foreignLock.unlock($);\r\n                return false;\r\n            }\r\n        }\r\n    }\r\n\r\n    bool steal(T& item)\r\n    {\r\n        if (false == m_foreignLock.try_lock($))\r\n            return false;\r\n        size_t head = m_headIndex($);\r\n        rl::Interlocked::Exchange(m_headIndex, head + 1, $);\r\n        if (head < m_tailIndex($))\r\n        {\r\n            item = m_array($)[head & m_mask($)]($);\r\n            m_foreignLock.unlock($);\r\n            return true;\r\n        }\r\n        else\r\n        {\r\n            m_headIndex($) = head;\r\n            m_foreignLock.unlock($);\r\n            return false;\r\n        }\r\n    }\r\n\r\nprivate:\r\n    static size_t const initial_size = 2;\r\n    nvar<nvar<T>*> m_array;\r\n    nvar<size_t> m_mask;\r\n    nvar<size_t> m_arraySize;\r\n    nvolatile<size_t> m_headIndex;\r\n    nvolatile<size_t> m_tailIndex;\r\n    mutex m_foreignLock;\r\n};\r\n\r\nstruct ws_deque_test : rl::test_suite<ws_deque_test, 2>\r\n{\r\n    ws_deque<int> q;\r\n    bool state [2];\r\n\r\n    void before()\r\n    {\r\n        state[0] = true;\r\n        state[1] = true;\r\n    }\r\n\r\n    void after()\r\n    {\r\n        RL_ASSERT(state[0] == false);\r\n        RL_ASSERT(state[1] == false);\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            q.push(1);\r\n            q.push(2);\r\n\r\n            int item = 0;\r\n            bool res = q.pop(item);\r\n            RL_ASSERT(res && item == 2);\r\n            RL_ASSERT(state[1]);\r\n            state[1] = false;\r\n\r\n            item = 0;\r\n            res = q.pop(item);\r\n            if (res)\r\n            {\r\n                RL_ASSERT(state[0]);\r\n                state[0] = false;\r\n            }\r\n\r\n            item = 0;\r\n            res = q.pop(item);\r\n            RL_ASSERT(res == false);\r\n        }\r\n        else\r\n        {\r\n            int item = 0;\r\n            bool res = q.steal(item);\r\n            if (res)\r\n            {\r\n                RL_ASSERT(item == 1);\r\n                RL_ASSERT(state[0]);\r\n                state[0] = false;\r\n            }\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\nstruct test_api : rl::test_suite<test_api, 1>\r\n{\r\n    void thread(unsigned)\r\n    {\r\n        rl::nvar<int> cv1, cv2(3), cv3(cv1($)), cv4(cv1);\r\n        cv1($) = cv2($);\r\n        cv1($) = 1;\r\n        (int)cv1($);\r\n        cv1($) += 1;\r\n        cv1($) -= 1;\r\n        cv1($)++;\r\n        cv1($)--;\r\n        ++cv1($);\r\n        --cv1($);\r\n\r\n        int x = rl::Interlocked::Add(cv1, 3, $);\r\n        x = rl::Interlocked::CompareExchange(cv1, 3, x, $);\r\n        x = rl::Interlocked::Exchange(cv2, 6, $);\r\n        x = rl::Interlocked::Read(cv2, $);\r\n        x = rl::Interlocked::Increment(cv2, $);\r\n        x = rl::Interlocked::Decrement(cv2, $);\r\n\r\n        rl::Thread::MemoryBarrier($);\r\n        x = rl::Thread::VolatileRead(cv1, $);\r\n        rl::Thread::VolatileWrite(cv1, 5, $);\r\n        rl::Thread::SpinWait(1, $);\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\n\r\n\r\nstruct ws_deque_test0 : rl::test_suite<ws_deque_test0, 4>\r\n{\r\n    ws_deque<int> q;\r\n\r\n    void before()\r\n    {\r\n    }\r\n\r\n    void after()\r\n    {\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            for (size_t i = 0; i != 4; ++i)\r\n            {\r\n                q.push(10);\r\n            }\r\n\r\n            for (size_t i = 0; i != 5; ++i)\r\n            {\r\n                int p = 0;\r\n                bool res = q.pop(p);\r\n                RL_ASSERT(10 == p || false == res);\r\n            }\r\n\r\n            for (size_t i = 0; i != 4; ++i)\r\n            {\r\n                q.push(10);\r\n                int p = 0;\r\n                bool res = q.pop(p);\r\n                RL_ASSERT(10 == p || false == res);\r\n            }\r\n\r\n            for (size_t i = 0; i != 4; ++i)\r\n            {\r\n                q.push(10);\r\n                q.push(10);\r\n                int p = 0;\r\n                bool res = q.pop(p);\r\n                RL_ASSERT(10 == p || false == res);\r\n                p = 0;\r\n                res = q.pop(p);\r\n                RL_ASSERT(10 == p || false == res);\r\n            }\r\n\r\n            for (size_t i = 0; i != 4; ++i)\r\n            {\r\n                q.push(10);\r\n                q.push(10);\r\n                q.push(10);\r\n                int p = 0;\r\n                bool res = q.pop(p);\r\n                RL_ASSERT(10 == p || false == res);\r\n            }\r\n\r\n            for (size_t i = 0; i != 14; ++i)\r\n            {\r\n                q.push(10);\r\n                int p = 0;\r\n                bool res = q.pop(p);\r\n                RL_ASSERT(10 == p || false == res);\r\n            }\r\n        }\r\n        else\r\n        {\r\n            for (size_t i = 0; i != 4; ++i)\r\n            {\r\n                int p = 0;\r\n                bool res = q.steal(p);\r\n                RL_ASSERT(10 == p || false == res);\r\n            }\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nint main()\r\n{\r\n    rl::test_params p;\r\n    p.iteration_count = 1000;\r\n    rl::simulate<ws_deque_test0>(p);\r\n    rl::simulate<ws_deque_test>(p);\r\n    rl::simulate<test_api>();\r\n}\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/ntest/stdafx.cpp",
    "content": "#include \"stdafx.h\"\r\n\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/ntest/stdafx.h",
    "content": "#ifndef STDAFX_H\r\n#define STDAFX_H\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n\r\n#include \"../../relacy/pch.hpp\"\r\n\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/pthread.hpp",
    "content": "#pragma once\r\n\r\n#include \"../relacy/pthread.h\"\r\n\r\n\r\n\r\nstruct test_pthread_thread : rl::test_suite<test_pthread_thread, 1>\r\n{\r\n    static size_t const dynamic_thread_count = 2;\r\n\r\n    VAR_T(int) data;\r\n\r\n    static void* func(void* param)\r\n    {\r\n        static_cast<test_pthread_thread*>(param)->VAR(data) += 1;\r\n        return 0;\r\n    }\r\n\r\n    void thread(unsigned)\r\n    {\r\n        VAR(data) = 0;\r\n\r\n        pthread_t th1;\r\n        pthread_create(&th1, 0, &test_pthread_thread::func, this);\r\n        void* res1 = 0;\r\n        pthread_join(th1, &res1);\r\n\r\n        RL_ASSERT(VAR(data) == 1);\r\n\r\n        pthread_t th2;\r\n        pthread_create(&th2, 0, &test_pthread_thread::func, this);\r\n        void* res2 = 0;\r\n        pthread_join(th2, &res2);\r\n\r\n        RL_ASSERT(VAR(data) == 2);\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct test_pthread_mutex : rl::test_suite<test_pthread_mutex, 2>\r\n{\r\n    pthread_mutex_t mtx;\r\n    VAR_T(int) data;\r\n\r\n    void before()\r\n    {\r\n        pthread_mutexattr_t attr;\r\n        pthread_mutexattr_init(&attr);\r\n        pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);\r\n        pthread_mutex_init(&mtx, &attr);\r\n        pthread_mutexattr_destroy(&attr);\r\n        VAR(data) = 0;\r\n    }\r\n\r\n    void after()\r\n    {\r\n        pthread_mutex_destroy(&mtx);\r\n    }\r\n\r\n    void thread(unsigned /*index*/)\r\n    {\r\n        pthread_mutex_lock(&mtx);\r\n        VAR(data) += 1;\r\n        pthread_mutex_unlock(&mtx);\r\n\r\n        if (0 == pthread_mutex_try_lock(&mtx))\r\n        {\r\n            VAR(data) += 1;\r\n            pthread_mutex_unlock(&mtx);\r\n        }\r\n\r\n        //pthread_mutex_timedlock\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct test_pthread_condvar : rl::test_suite<test_pthread_condvar, 3>\r\n{\r\n    pthread_cond_t cv;\r\n    pthread_mutex_t mtx;\r\n    VAR_T(int) stage;\r\n\r\n    void before()\r\n    {\r\n        pthread_condattr_t attr;\r\n        pthread_cond_init(&cv, &attr);\r\n        pthread_mutex_init(&mtx, 0);\r\n        VAR(stage) = 0;\r\n    }\r\n\r\n    void after()\r\n    {\r\n        pthread_cond_destroy(&cv);\r\n        pthread_mutex_destroy(&mtx);\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            pthread_mutex_lock(&mtx);\r\n            VAR(stage) += 1;\r\n            pthread_cond_broadcast(&cv);\r\n            while (VAR(stage) != 2)\r\n                pthread_cond_wait(&cv, &mtx);\r\n            pthread_mutex_unlock(&mtx);\r\n        }\r\n        else if (1 == index)\r\n        {\r\n            pthread_mutex_lock(&mtx);\r\n            while (VAR(stage) != 1)\r\n            {\r\n                int ts = 1;\r\n                pthread_cond_timedwait(&cv, &mtx, &ts);\r\n            }\r\n            VAR(stage) += 1;\r\n            pthread_cond_broadcast(&cv);\r\n            pthread_mutex_unlock(&mtx);\r\n        }\r\n        else if (2 == index)\r\n        {\r\n            pthread_mutex_lock(&mtx);\r\n            while (VAR(stage) != 2)\r\n                pthread_cond_wait(&cv, &mtx);\r\n            pthread_mutex_unlock(&mtx);\r\n            pthread_cond_signal(&cv);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct test_pthread_condvar2 : rl::test_suite<test_pthread_condvar2, 2>\r\n{\r\n    pthread_cond_t cv1, cv2;\r\n    pthread_mutex_t mtx1, mtx2;\r\n    VAR_T(int) stage;\r\n\r\n    void before()\r\n    {\r\n        pthread_cond_init(&cv1, 0);\r\n        pthread_cond_init(&cv2, 0);\r\n        pthread_mutex_init(&mtx1, 0);\r\n        pthread_mutex_init(&mtx2, 0);\r\n        VAR(stage) = 0;\r\n    }\r\n\r\n    void after()\r\n    {\r\n        pthread_cond_destroy(&cv1);\r\n        pthread_cond_destroy(&cv2);\r\n        pthread_mutex_destroy(&mtx1);\r\n        pthread_mutex_destroy(&mtx2);\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            pthread_mutex_lock(&mtx1);\r\n            int ts = 1;\r\n            pthread_cond_timedwait(&cv1, &mtx1, &ts);\r\n            pthread_mutex_unlock(&mtx1);\r\n        }\r\n        else if (1 == index)\r\n        {\r\n            pthread_mutex_lock(&mtx2);\r\n            int ts = 1;\r\n            pthread_cond_timedwait(&cv2, &mtx2, &ts);\r\n            pthread_mutex_unlock(&mtx2);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct test_pthread_rwlock : rl::test_suite<test_pthread_rwlock, 3>\r\n{\r\n    pthread_rwlock_t mtx;\r\n    VAR_T(int) data;\r\n\r\n    void before()\r\n    {\r\n        pthread_mutexattr_t attr;\r\n        pthread_mutexattr_init(&attr);\r\n        pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK);\r\n        pthread_rwlock_init(&mtx, &attr);\r\n        pthread_mutexattr_destroy(&attr);\r\n        VAR(data) = 0;\r\n    }\r\n\r\n    void after()\r\n    {\r\n        pthread_rwlock_destroy(&mtx);\r\n    }\r\n\r\n    void thread(unsigned /*index*/)\r\n    {\r\n        pthread_rwlock_wrlock(&mtx);\r\n        VAR(data) += 1;\r\n        pthread_rwlock_unlock(&mtx);\r\n\r\n        if (0 == pthread_rwlock_trywrlock(&mtx))\r\n        {\r\n            VAR(data) += 1;\r\n            pthread_rwlock_unlock(&mtx);\r\n        }\r\n\r\n        pthread_rwlock_rdlock(&mtx);\r\n        (void)(int)VAR(data);\r\n        pthread_rwlock_unlock(&mtx);\r\n\r\n        if (0 == pthread_rwlock_tryrdlock(&mtx))\r\n        {\r\n            (void)(int)VAR(data);\r\n            pthread_rwlock_unlock(&mtx);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct test_pthread_sem : rl::test_suite<test_pthread_sem, 2>\r\n{\r\n    sem_t sem1, sem2;\r\n    VAR_T(int) data;\r\n\r\n    void before()\r\n    {\r\n        sem_init(&sem1, 0, 0);\r\n        sem_init(&sem2, 0, 0);\r\n        VAR(data) = 0;\r\n    }\r\n\r\n    void after()\r\n    {\r\n        sem_destroy(&sem1);\r\n        sem_destroy(&sem2);\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (index)\r\n        {\r\n            VAR(data) = 1;\r\n            sem_post(&sem1);\r\n            while (sem_trywait(&sem2))\r\n            {\r\n                assert(errno == EINTR || errno == EAGAIN);\r\n                pthread_yield();\r\n            }\r\n            RL_ASSERT(VAR(data) == 2);\r\n            VAR(data) = 3;\r\n            int count = -1;\r\n            sem_getvalue(&sem2, &count);\r\n            RL_ASSERT(count == 0);\r\n            sem_post(&sem2);\r\n            sem_getvalue(&sem2, &count);\r\n            RL_ASSERT(count == 1);\r\n        }\r\n        else\r\n        {\r\n            while (sem_wait(&sem1))\r\n                assert(errno == EINTR);\r\n            RL_ASSERT(VAR(data) == 1);\r\n            VAR(data) = 2;\r\n            sem_post(&sem2);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/scheduler.hpp",
    "content": "#pragma once\r\n\r\n#include \"../relacy/relacy_std.hpp\"\r\n\r\n\r\n\r\nstruct livelock_test : rl::test_suite<livelock_test, 2, rl::test_result_livelock>\r\n{\r\n    std::atomic<int> x;\r\n\r\n    void before()\r\n    {\r\n        x($) = 0;\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            for (;;)\r\n            {\r\n                int cmp = 1;\r\n                if (x($).compare_exchange_weak(cmp, 2))\r\n                    break;\r\n            }\r\n        }\r\n        else if (1 == index)\r\n        {\r\n            x($).store(1);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct yield_livelock_test : rl::test_suite<yield_livelock_test, 2, rl::test_result_livelock>\r\n{\r\n    std::atomic<int> x, y;\r\n\r\n    void before()\r\n    {\r\n        x($) = 0;\r\n        y($) = 0;\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            rl::backoff b;\r\n            for (;;)\r\n            {\r\n                int cmp = 0;\r\n                if (x($).compare_exchange_weak(cmp, 1))\r\n                {\r\n                    cmp = 0;\r\n                    if (y($).compare_exchange_weak(cmp, 1))\r\n                    {\r\n                        x($).store(0);\r\n                        y($).store(0);\r\n                        break;\r\n                    }\r\n                    else\r\n                    {\r\n                        x($).store(0);\r\n                    }\r\n                }\r\n                b.yield($);\r\n            }\r\n        }\r\n        else if (1 == index)\r\n        {\r\n            rl::backoff b;\r\n            for (;;)\r\n            {\r\n                int cmp = 0;\r\n                if (y($).compare_exchange_weak(cmp, 1))\r\n                {\r\n                    cmp = 0;\r\n                    if (x($).compare_exchange_weak(cmp, 1))\r\n                    {\r\n                        y($).store(0);\r\n                        x($).store(0);\r\n                        break;\r\n                    }\r\n                    else\r\n                    {\r\n                        y($).store(0);\r\n                    }\r\n                }\r\n                b.yield($);\r\n            }\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct sched_load_test : rl::test_suite<sched_load_test, 2>\r\n{\r\n    std::recursive_mutex mtx1, mtx2;\r\n    std::condition_variable_any cv1, cv2;\r\n    VAR_T(int) data1, data2;\r\n\r\n    void before()\r\n    {\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (index % 2)\r\n        {\r\n            mtx1.lock($);\r\n            VAR(data1) = 1;\r\n            mtx1.unlock($);\r\n\r\n            mtx2.lock($);\r\n            mtx2.lock($);\r\n            VAR(data2) = 1;\r\n            mtx2.unlock($);\r\n            mtx2.unlock($);\r\n\r\n            if (mtx1.try_lock($))\r\n            {\r\n                //mtx1.lock($);\r\n                VAR(data1) = 1;\r\n                //mtx1.unlock($);\r\n                mtx1.unlock($);\r\n            }\r\n\r\n            mtx1.lock($);\r\n            VAR(data1) = 2;\r\n            cv1.notify_all($);\r\n            mtx1.unlock($);\r\n\r\n            mtx2.lock($);\r\n            while (VAR(data2) != 2)\r\n            {\r\n                rl::yield(1, $);\r\n                cv2.wait_for(mtx2, 1, $);\r\n            }\r\n            mtx2.unlock($);\r\n        }\r\n        else\r\n        {\r\n            mtx2.lock($);\r\n            VAR(data2) = 1;\r\n            mtx2.unlock($);\r\n\r\n            mtx1.lock($);\r\n            mtx1.lock($);\r\n            VAR(data1) = 1;\r\n            mtx1.unlock($);\r\n            mtx1.unlock($);\r\n\r\n            if (mtx2.try_lock($))\r\n            {\r\n                //mtx2.lock($);\r\n                VAR(data2) = 1;\r\n                //mtx2.unlock($);\r\n                mtx2.unlock($);\r\n            }\r\n\r\n            mtx2.lock($);\r\n            VAR(data2) = 2;\r\n            mtx2.unlock($);\r\n            cv2.notify_all($);\r\n\r\n            mtx1.lock($);\r\n            while (VAR(data1) != 2)\r\n            {\r\n                rl::yield(1, $);\r\n                cv1.wait_for(mtx1, 1, $);\r\n            }\r\n            mtx1.unlock($);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/semaphore.hpp",
    "content": "#pragma once\r\n\r\n#include \"../relacy/relacy_std.hpp\"\r\n\r\n\r\n\r\nstruct test_semaphore : rl::test_suite<test_semaphore, 2>\r\n{\r\n    HANDLE sema;\r\n    VAR_T(int) data;\r\n\r\n    void before()\r\n    {\r\n        VAR(data) = 0;\r\n        sema = CreateSemaphore(0, 0, 2, 0);\r\n    }\r\n\r\n    void after()\r\n    {\r\n        CloseHandle(sema);\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            VAR(data) = 1;\r\n            ReleaseSemaphore(sema, 1, 0);\r\n        }\r\n        else\r\n        {\r\n            unsigned rv = WaitForSingleObject(sema, INFINITE);\r\n\t  \t\t\t\tassert(rv == WAIT_OBJECT_0);\r\n            assert(VAR(data) == 1);\r\n\t\t\t  \t\trv = WaitForSingleObject(sema, 0);\r\n\t\t\t\t\t  assert(rv == WAIT_TIMEOUT);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct test_semaphore_atomic : rl::test_suite<test_semaphore_atomic, 2>\r\n{\r\n\tHANDLE sem [2];\r\n\t\r\n\tvoid before()\r\n\t{\r\n\t\tsem[0] = CreateSemaphore(0, 0, 2, 0);\r\n\t\tsem[1] = CreateSemaphore(0, 0, 2, 0);\r\n\t}\r\n\t\r\n\tvoid after()\r\n\t{\r\n\t\tCloseHandle(sem[0]);\r\n\t\tCloseHandle(sem[1]);\r\n\t}\r\n\t\r\n\tvoid thread(unsigned index)\r\n\t{\r\n\t\tif (0 == index)\r\n\t\t{\r\n\t\t\tunsigned rv = WaitForSingleObject(sem[0], INFINITE);\r\n\t\t\tassert(rv == WAIT_OBJECT_0);\r\n\t\t\tReleaseSemaphore(sem[1], 1, 0);\r\n\t\t\trv = WaitForSingleObject(sem[1], 0);\r\n\t\t\tassert(rv == WAIT_TIMEOUT);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tunsigned rv = SignalObjectAndWait(sem[0], sem[1], INFINITE, 0);\r\n\t\t\tassert(rv == WAIT_OBJECT_0);\r\n\t\t\trv = WaitForSingleObject(sem[1], 0);\r\n\t\t\tassert(rv == WAIT_TIMEOUT);\r\n\t\t\trv = WaitForSingleObject(sem[0], 0);\r\n\t\t\tassert(rv == WAIT_TIMEOUT);\r\n\t\t}\r\n\t}\r\n};\r\n\r\n\r\n\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/stdafx.cpp",
    "content": "#include \"stdafx.h\"\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/stdafx.h",
    "content": "#ifndef STDAFX_H\r\n#define STDAFX_H\r\n#ifdef _MSC_VER\r\n#   pragma once\r\n#endif\r\n\r\n#ifdef _MSC_VER\r\n#    pragma warning (disable: 4127)\r\n#endif\r\n\r\n#if defined(_MSC_VER) && (_MSC_VER <= 1310)\r\n//#    pragma warning (disable: 4511)\r\n//#    pragma warning (disable: 4512)\r\n#endif\r\n\r\n\r\n#ifdef NDEBUG\r\n#   define _SECURE_SCL 0\r\n#endif\r\n\r\n#include \"../relacy/pch.hpp\"\r\n\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/thread_local.hpp",
    "content": "#pragma once\r\n\r\n#include \"../relacy/relacy.hpp\"\r\n\r\n\r\n\r\nstruct tls_basic_test : rl::test_suite<tls_basic_test, 3>\r\n{\r\n    rl::thread_local_var<unsigned> x;\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        RL_ASSERT(x.get($) == 0);\r\n        x.set(index + 10, $);\r\n        RL_ASSERT(x.get($) == index + 10);\r\n    }\r\n};\r\n\r\n\r\nstruct tls_basic_test2 : rl::test_suite<tls_basic_test2, 3>\r\n{\r\n    TLS_T(unsigned) x;\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        RL_ASSERT(VAR(x) == 0);\r\n        VAR(x) = index + 10;\r\n        RL_ASSERT(VAR(x) == index + 10);\r\n    }\r\n};\r\n\r\n\r\nstruct tls_reset_test : rl::test_suite<tls_reset_test, 3, rl::test_result_user_assert_failed>\r\n{\r\n    rl::thread_local_var<unsigned> x;\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        RL_ASSERT(x.get($) == 0);\r\n        x.set(index + 10, $);\r\n        RL_ASSERT(x.get($) == index + 10);\r\n        RL_ASSERT(false);\r\n    }\r\n};\r\n\r\n\r\nrl::thread_local_var<unsigned> tls_global_test_x;\r\nstruct tls_global_test : rl::test_suite<tls_global_test, 3, rl::test_result_user_assert_failed>\r\n{\r\n    void thread(unsigned index)\r\n    {\r\n        RL_ASSERT(tls_global_test_x.get($) == 0);\r\n        tls_global_test_x.set(index + 10, $);\r\n        RL_ASSERT(tls_global_test_x.get($) == index + 10);\r\n        RL_ASSERT(false);\r\n    }\r\n};\r\n\r\n\r\nstruct tls_win32_test : rl::test_suite<tls_win32_test, 3>\r\n{\r\n    unsigned long slot;\r\n\r\n    void before()\r\n    {\r\n        slot = TlsAlloc();\r\n    }\r\n\r\n    void after()\r\n    {\r\n        TlsFree(slot);\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        RL_ASSERT(TlsGetValue(slot) == 0);\r\n        TlsSetValue(slot, (void*)(uintptr_t)(index + 10));\r\n        RL_ASSERT(TlsGetValue(slot) == (void*)(uintptr_t)(index + 10));\r\n    }\r\n};\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/todo.txt",
    "content": "Relacy Race Detector Todo List:\r\n\r\n- use indirection and indices for TLS, because on Windows TLS index is DWORD (not DWORD_PTR) (eliminate pointers?)\r\n+ provide rl::hash_ptr()\r\n- support for fair timed waits\r\n+ remove iteration count estimation from full sched -> causes division by 0\r\n- history: memory allocation before object ctor (new T (...))\r\n+ code in test::after() affects iteration count with full scheduler -> final and estimated iteration counts are the same\r\n\r\n- non-deterministic sub-expression calculation:\r\nfoo(bar.load(std::memory_order_acquire), baz.load(std::memory_order_acquire));\r\n\r\n- post issue:\r\ncan't simulate some modification orders in presence of data-races-type-2 for atomic vars:\r\n//thread 1\r\nx.store(1, std::memory_order_relaxed);\r\ny.store(1, std::memory_order_relaxed);\r\n//thread 2\r\nwhile (y.load(std::memory_order_relaxed) == 0\r\n{}\r\nx.store(2, std::memory_order_relaxed);\r\n-> modification order of 'x' will never be \"2, 1\"\r\n\r\n\r\n [CORE]\r\n- initially run threads one by one\r\n- initially run some iterations twice, in order to check that unit-test is deterministic\r\n? add unique identifiers to atomics, vars, mutexes etc (address can be useful too)\r\n- example catalog (description, used techniques, what error is found)\r\n- do I need sched() before atomic loads?\r\n- do I need sched() before mutex unlock?\r\n- for loads output in history value of which store is loaded\r\n- detect dead-code\r\n- output which operations cause data race\r\n? output happens-before matrix, synchronizes-with matrix etc\r\n- SEH handler to catch paging faults\r\n- sched before malloc/free to allow more ABA\r\n\r\n [PERF]\r\n- implement performance simulation\r\n - cacheline transfers\r\n - atomic rmw operations\r\n - fences\r\n\r\n[OTHER]\r\n- parallelize the run-time for random scheduler\r\n- parallelize the run-time for tree search scheduler\r\n- manual control over scheduler\r\n- persistent checkpointing of scheduler state (to allow \"continue\")\r\n- atomic blocks (pdr implementation -> pdr component)\r\n? state space reductions (sleep sets, dynamic persistent sets)\r\n? what can I do with serialization points -> user specifies \"visible\" results\r\n    system checks for linearizablity -> \"visible\" results equal to some sequential execution\r\n? save program state inside iteration (save point), continue other iterations from this save point \r\n? partial order reductions by memorizing happens-before graphs, not program state\r\n? estimate progress by seeing how many iterations it gets to move 0->1 on some stree level\r\n? lower bound, upper bound, mean of progress\r\n\r\nO(X) = (P^(C + 3)) * (N^(P + C + 1)) * (P + C)!\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/trash/original.hpp",
    "content": "Here is a recent version of the revised pc_sample.c which uses inline x86\r\nASM and compiles under VC++ (I am planning on coding the entire thing in\r\npure assembly language):\r\n____________________________________________________________________\r\n#if ! defined(PC_SAMPLE_INCLUDE_H)\r\n#   define PC_SAMPLE_INCLUDE_H\r\n#   pragma warning(push)\r\n#   pragma warning (disable : 4100 4505 4706)\r\n#   if defined(__cplusplus)\r\n      extern \"C\" {\r\n#   endif\r\n/*===========================================================*/\r\n\r\n/* Very Simple x86 Atomic Operations API & Implmentation\r\n_____________________________________________________________*/\r\ntypedef __int32 atomicword;\r\ntypedef atomicword volatile* const atomicword_pthis;\r\n\r\nstatic int\r\nx86_DWCASPTR(\r\n void volatile* const,\r\n void* const,\r\n void const* const\r\n);\r\n\r\nstatic atomicword\r\nx86_XADDWORD(\r\n atomicword_pthis,\r\n atomicword const\r\n);\r\n\r\nstatic atomicword\r\nx86_XCHGWORD(\r\n atomicword_pthis,\r\n atomicword const\r\n);\r\n\r\n__declspec(naked) int\r\nx86_DWCASPTR(\r\n void volatile* const _pthis,\r\n void* const pcmp,\r\n void const* const pxhcg\r\n) {\r\n  _asm {\r\n    PUSH ESI\r\n    PUSH EBX\r\n    MOV ESI, [ESP + 16]\r\n    MOV EAX, [ESI]\r\n    MOV EDX, [ESI + 4]\r\n    MOV ESI, [ESP + 20]\r\n    MOV EBX, [ESI]\r\n    MOV ECX, [ESI + 4]\r\n    MOV ESI, [ESP + 12]\r\n    LOCK CMPXCHG8B QWORD PTR [ESI]\r\n    JNE x86_DWCASPTR_failed\r\n    MOV EAX, 1\r\n    POP EBX\r\n    POP ESI\r\n    RET\r\n\r\nx86_DWCASPTR_failed:\r\n    MOV ESI, [ESP + 16]\r\n    MOV [ESI], EAX\r\n    MOV [ESI + 4], EDX\r\n    MOV EAX, 0\r\n    POP EBX\r\n    POP ESI\r\n    RET\r\n  }\r\n\r\n}\r\n\r\n__declspec(naked) atomicword\r\nx86_XADDWORD(\r\n atomicword_pthis _pthis,\r\n atomicword const value\r\n) {\r\n  _asm {\r\n    MOV EDX, [ESP + 4]\r\n    MOV EAX, [ESP + 8]\r\n    LOCK XADD [EDX], EAX\r\n    RET\r\n  }\r\n\r\n}\r\n\r\n__declspec(naked) atomicword\r\nx86_XCHGWORD(\r\n atomicword_pthis _pthis,\r\n atomicword const value\r\n) {\r\n  _asm {\r\n    MOV EDX, [ESP + 4]\r\n    MOV EAX, [ESP + 8]\r\n    XCHG [EDX], EAX\r\n    RET\r\n  }\r\n\r\n}\r\n\r\n#define x86_XCHGPTR(mp_pdest, mp_src) ( \\\r\n  (void*)x86_XCHGWORD( \\\r\n    ((atomicword_pthis)(mp_pdest)), \\\r\n    ((atomicword const)(mp_src)) \\\r\n  ) \\\r\n)\r\n\r\n#define XCHGWORD x86_XCHGWORD\r\n#define XCHGPTR x86_XCHGPTR\r\n#define XADDWORD x86_XADDWORD\r\n#define DWCASPTR x86_DWCASPTR\r\n\r\n/* Proxy-Collector API & Implmentation (Revisited)  ;^)\r\n   Inventor: Chris M. Thomasson\r\n_____________________________________________________________*/\r\n#include <stddef.h>\r\n#include <assert.h>\r\n#if ! defined(NDEBUG)\r\n# include <stdio.h>\r\n#endif\r\n\r\n#define CONTAINER_OF(mp_this, mp_type, mp_member) ( \\\r\n  (mp_type*)(((unsigned char*)(mp_this)) - \\\r\n  offsetof(mp_type, mp_member)) \\\r\n)\r\n\r\ntypedef struct pc_region_s pc_region, pc_node;\r\ntypedef struct pc_master_s pc_master;\r\ntypedef void (pc_fp_dtor) (pc_node*);\r\ntypedef struct pc_sys_anchor_s pc_sys_anchor;\r\n\r\nstruct pc_sys_anchor_s {\r\n  atomicword refcnt;\r\n  pc_region* region;\r\n\r\n};\r\n\r\nstruct pc_region_s {\r\n  pc_sys_anchor next;\r\n  pc_node* defer;\r\n\r\n};\r\n\r\nstruct pc_master_s {\r\n  pc_sys_anchor head;\r\n  pc_region region;\r\n  pc_fp_dtor* fp_dtor;\r\n};\r\n\r\n#define PC_MASTER_STATICINIT(mp_this, mp_fp_dtor) { \\\r\n  { 0, &(mp_this)->region }, \\\r\n  { { 0, NULL }, NULL }, (mp_fp_dtor) \\\r\n\r\n}\r\n\r\nstatic void\r\npc_sys_dtor(\r\n pc_master* const,\r\n pc_region* const\r\n);\r\n\r\nstatic void\r\npc_init(\r\n pc_master* const,\r\n pc_fp_dtor* const\r\n);\r\n\r\nstatic void\r\npc_node_init(\r\n pc_node* const\r\n);\r\n\r\nstatic void\r\npc_node_link(\r\n pc_node* const,\r\n pc_node* const\r\n);\r\n\r\nstatic pc_region*\r\npc_acquire(\r\n pc_master* const\r\n);\r\n\r\nstatic void\r\npc_release(\r\n pc_master* const,\r\n pc_region* const\r\n);\r\n\r\nstatic void\r\npc_defer(\r\n pc_region* const,\r\n pc_node* const\r\n);\r\n\r\nstatic void\r\npc_mutate(\r\n pc_master* const,\r\n pc_node* const\r\n);\r\n\r\nvoid\r\npc_init(\r\n pc_master* const _this,\r\n pc_fp_dtor* const fp_dtor\r\n) {\r\n  pc_master src = { { 0 } };\r\n  *_this = src;\r\n  _this->head.region = &_this->region;\r\n  _this->fp_dtor = fp_dtor;\r\n\r\n}\r\n\r\npc_region*\r\npc_acquire(\r\n pc_master* const _this\r\n) {\r\n  pc_sys_anchor cmp = _this->head, xchg;\r\n  do {\r\n    xchg.refcnt = cmp.refcnt + 2;\r\n    xchg.region = cmp.region;\r\n  } while (! DWCASPTR(&_this->head, &cmp, &xchg));\r\n  return cmp.region;\r\n\r\n}\r\n\r\nvoid\r\npc_release(\r\n pc_master* const _this,\r\n pc_region* const region\r\n) {\r\n  if (XADDWORD(&region->next.refcnt, -2) == 3) {\r\n    pc_sys_dtor(_this, region);\r\n  }\r\n\r\n}\r\n\r\nvoid\r\npc_node_init(\r\n pc_node* const _this\r\n) {\r\n  pc_node src = { { 0 } };\r\n  *_this = src;\r\n\r\n}\r\n\r\nvoid\r\npc_node_link(\r\n pc_node* const _this,\r\n pc_node* const next\r\n) {\r\n  _this->defer = next;\r\n\r\n}\r\n\r\nvoid\r\npc_defer(\r\n pc_region* const _this,\r\n pc_node* const node\r\n) {\r\n  node->defer = XCHGPTR(&_this->defer, node);\r\n\r\n}\r\n\r\nvoid\r\npc_mutate(\r\n pc_master* const _this,\r\n pc_node* const node\r\n) {\r\n  pc_sys_anchor cmp = _this->head, xchg = { 0 };\r\n  node->next.refcnt = 2;\r\n  node->next.region = NULL;\r\n  xchg.region = node;\r\n  while (! DWCASPTR(&_this->head, &cmp, &xchg));\r\n  cmp.region->next.region = node;\r\n  if (XADDWORD(&cmp.region->next.refcnt,\r\n               cmp.refcnt + 1) == -cmp.refcnt) {\r\n    pc_sys_dtor(_this, cmp.region);\r\n  }\r\n\r\n}\r\n\r\nvoid\r\npc_sys_dtor(\r\n pc_master* const _this,\r\n pc_region* const region\r\n) {\r\n  int dtors = 0, reset = 0;\r\n  pc_region* head = region;\r\n  pc_region* tail = region;\r\n  pc_region* next = region->next.region;\r\n\r\n  while (next) {\r\n    if (XADDWORD(&next->next.refcnt, -2) != 3) {\r\n      break;\r\n    }\r\n    tail = next;\r\n    next = next->next.region;\r\n  }\r\n\r\n  tail->next.region = NULL;\r\n  while (head) {\r\n    pc_region* const next = head->next.region;\r\n    pc_node* defer = head->defer;\r\n    assert(head->next.refcnt == 1);\r\n    if (head != &_this->region) {\r\n      head->defer = defer;\r\n      defer = head;\r\n    } else {\r\n      reset = 1;\r\n    }\r\n    while (defer) {\r\n      pc_node* const next = defer->defer;\r\n      _this->fp_dtor(defer);\r\n      ++dtors;\r\n      defer = next;\r\n    }\r\n    head = next;\r\n  }\r\n\r\n  if (reset) {\r\n    _this->region.defer = NULL;\r\n    pc_mutate(_this, &_this->region);\r\n  }\r\n\r\n#if ! defined(NDEBUG)\r\n  {\r\n    static atomicword g_pc_sys_epoch = 0;\r\n    atomicword const epoch = XADDWORD(&g_pc_sys_epoch, 1);\r\n    if (dtors) {\r\n      printf(\"pc_sys_dtor::epoch/dtors(%d/%d)\\n\",\r\n             epoch, dtors);\r\n    }\r\n  }\r\n#endif\r\n\r\n}\r\n\r\n/*===========================================================*/\r\n#   if defined(__cplusplus)\r\n      }\r\n#   endif\r\n#   pragma warning(pop)\r\n#endif\r\n____________________________________________________________________\r\n\r\n\r\n struct foo_node {\r\n  foo_node* next;\r\n  pc_node pcn;\r\n\r\n};\r\n\r\nstruct foo_list {\r\n  foo_node* head;\r\n  pc_master pc;\r\n\r\n};\r\n\r\nstatic foo_list g_list = {\r\n  NULL, PC_MASTER_STATICINIT()\r\n\r\n};\r\n\r\nvoid foo_node_dtor(pc_node* pcn) {\r\n  foo_node* const _this = container_of(pcn, foo_node, pcn);\r\n  free(_this);\r\n\r\n}\r\n\r\nvoid foo_reader() {\r\n  int i;\r\n  foo_node* node;\r\n  pc_region* pcr = pc_acquire(&g_list.pc);\r\n  for (i = 1 ;; ++i) {\r\n    node = LOAD_DEPENDS(&g_list.head);\r\n    while (node) {\r\n      foo_node* const next = LOAD_MBDEPEND(&node->next);\r\n      [...];\r\n      node = next;\r\n    }\r\n    if (! (i % 1000)) {\r\n      pc_release(&g_list.pc, pcr);\r\n      pcr = pc_acquire(&g_list.pc);\r\n    }\r\n  }\r\n  pc_release(&g_list.pc, pcr);\r\n\r\n}\r\n\r\nvoid foo_writer() {\r\n  int i;\r\n  foo_node* node, *cmp;\r\n  pc_region* pcr = pc_acquire(&g_list.pc);\r\n  for (i = 1 ;; ++i) {\r\n    if (i % 10) {\r\n      node = malloc(sizeof(*node));\r\n      if (node) {\r\n        foo_node* cmp;\r\n        pc_node_init(node, NULL, foo_node_dtor);\r\n        cmp = g_list.head;\r\n        do {\r\n          node->next = cmp;\r\n        } while (! CASIBM_MBREL(&g_list.head, &cmp, node));\r\n      }\r\n    } else {\r\n      node = g_list.head;\r\n      do {\r\n        if (! node) { break; }\r\n      } while (! CASIBM_MBACQ(&g_list.head, &node, node->next));\r\n      if (node) {\r\n        if (! (i % 20)) {\r\n          pc_mutate(&g_list.pc, &node->pcn);\r\n        } else {\r\n          pc_defer(pcr, &node->pcn);\r\n        }\r\n      }\r\n    }\r\n    if (! (i % 500)) {\r\n      pc_release(&g_list.pc, pcr);\r\n      pcr = pc_acquire(&g_list.pc);\r\n    }\r\n  }\r\n  pc_release(&g_list.pc, pcr);\r\n} \r\n\r\n\r\n\r\n\r\n\r\n1. Region 1 is current\r\n2. Thread 1 acquires region 1\r\n3. Thread 2 executes pc_mutate()\r\n4. Region 2 is current\r\n5. Thread 3 acquires region 2\r\n6. Thread 3 loads pointer to node 1\r\n7. Thread 1 removes node 1 from data structure\r\n8. Thread 1 executes pc_defer() and defers node 1 to region 1\r\n9. Thread 1 releases region 1\r\n10. Dtor executed for region 1, node 1 is deleted\r\n11. Thread 3 accesses node 1\r\n12. Bang! \r\n\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/trash/rtl.hpp",
    "content": "#pragma once\r\n\r\n#include \"../../relacy/relacy_std.hpp\"\r\n\r\n\r\nintptr_t const lock_value\t\t        = (intptr_t)-1;\r\n\r\nstruct rdesc\r\n{\r\n    rl::var<std::atomic<intptr_t> const*> addr;\r\n    rl::var<intptr_t>           cmp;\r\n};\r\n\r\nstruct wdesc\r\n{\r\n    rl::var<std::atomic<intptr_t>*> addr;\r\n    rl::var<intptr_t>           cmp;\r\n    rl::var<intptr_t>           xchg;\r\n};\r\n\r\nstruct trx\r\n{\r\n\tstatic size_t const rset_max_size   = 64;\r\n\tstatic size_t const wset_max_size   = 32;\r\n\r\n\trl::var<size_t>             rset_idx;\r\n\trl::var<size_t>\t\t\t    wset_idx;\r\n    rdesc\t\t\trset\t            [rset_max_size];\r\n    wdesc\t\t\twset                [wset_max_size];\r\n\r\n    rl::var<rdesc*> read(std::atomic<intptr_t> const* addr, std::memory_order mo = std::memory_order_relaxed)\r\n    {\r\n        intptr_t value = (*addr)($).load(mo);\r\n\t\tif (lock_value == value)\r\n\t\t\treturn 0;\r\n        rdesc* desc = &rset[rset_idx($)];\r\n\t\t++rset_idx($);\r\n        desc->addr($) = addr;\r\n        desc->cmp($) = value;\r\n\t\treturn desc;\r\n    }\r\n\r\n    rl::var<wdesc*> write(std::atomic<intptr_t>* addr)\r\n    {\r\n        intptr_t value = (*addr)($).swap(lock_value, rl::memory_order_acq_rel);\r\n\t\tif (lock_value == value)\r\n\t\t\treturn 0;\r\n        wdesc* desc = &wset[wset_idx($)];\r\n\t\t++wset_idx($);\r\n\t\tdesc->addr($) = addr;\r\n\t\tdesc->cmp($) = value;\r\n\t\treturn desc;\r\n    }\r\n\r\n    bool begin()\r\n    {\r\n        std::atomic_signal_fence($)(std::memory_order_acquire);\r\n\t\trset_idx($) = 0;\r\n\t\twset_idx($) = 0;\r\n\t\treturn true;\r\n    }\r\n\r\n    bool commit()\r\n    {\r\n        std::atomic_signal_fence($)(std::memory_order_release);\r\n\r\n        size_t i;\r\n        for (i = 0; i != rset_idx($); ++i)\r\n        {\r\n            rdesc const* desc = &rset[i];\r\n            if ((*(desc->addr($)))($).load(std::memory_order_relaxed) != desc->cmp($))\r\n                break;\r\n        }\r\n        if (i != rset_idx($))\r\n        {\r\n            return rollback();\r\n        }\r\n\r\n        std::atomic_thread_fence($)(std::memory_order_release);\r\n\r\n        for (i = 0; i != wset_idx($); ++i)\r\n        {\r\n            wdesc const* desc = &wset[i];\r\n            (*(desc->addr($)))($).store(desc->xchg($), std::memory_order_relaxed);\r\n        }\r\n\r\n        //std::atomic_thread_fence(std::memory_order_acq_rel);\r\n\r\n        return true;\r\n    }\r\n\r\n    bool rollback()\r\n    {\r\n        for (size_t i = 0; i != wset_idx($); ++i)\r\n        {\r\n            wdesc const* desc = &wset[i];\r\n            (*(desc->addr($)))($).store(desc->cmp($), std::memory_order_relaxed);\r\n        }\r\n\t\twset_idx($) = 0;\r\n\t\trset_idx($) = 0;\r\n\t\treturn false;\r\n    }\r\n\r\n    /*\r\n\tbool readset_validate()\r\n    {\r\n        for (size_t i = 0; i != rset_idx; ++i)\r\n        {\r\n            rdesc const* desc = &rset[i];\r\n            if (*(intptr_t const volatile*)desc->addr != desc->cmp)\r\n                return true;\r\n        }\r\n        return false;\r\n    }\r\n\r\n    bool writeset_load(intptr_t* addr, intptr_t* value)\r\n    {\r\n        for (size_t i = 0; i != wset_idx; ++i)\r\n        {\r\n            wdesc const* desc = &wset[i];\r\n            if (desc->addr == addr)\r\n            {\r\n                *value = desc->xchg;\r\n                return true;\r\n            }\r\n        }\r\n        return false;\r\n    }\r\n    */\r\n};\r\n\r\n\r\n\r\n\r\ninline void pdr_lock()\r\n{\r\n}\r\n\r\ninline void pdr_unlock()\r\n{\r\n}\r\n\r\ninline void pdr_acquire(void*)\r\n{\r\n}\r\n\r\ninline void pdr_release(void*)\r\n{\r\n}\r\n\r\ninline void pdr_dispose(void*)\r\n{\r\n}\r\n\r\n\r\n\r\n\r\nstruct dlist_trx_node\r\n{\r\n    std::atomic<intptr_t> prev; // dlist_trx_node*\r\n    std::atomic<intptr_t> next; // dlist_trx_node*\r\n    rl::var<intptr_t> key;\r\n    rl::var<intptr_t> value;\r\n\r\n    dlist_trx_node(intptr_t key = 0, intptr_t value = 0)\r\n        : key(key)\r\n        , value(value)\r\n    {}\r\n};\r\n\r\n\r\n\r\n\r\n\r\nclass dlist_trx\r\n{\r\npublic:\r\n    dlist_trx()\r\n        : first(0, 0)\r\n        , last(0, 0)\r\n    {\r\n        first.prev($).store(0, std::memory_order_relaxed);\r\n        first.next($).store((intptr_t)&last, std::memory_order_relaxed);\r\n        last.prev($).store((intptr_t)&first, std::memory_order_relaxed);\r\n        last.next($).store(0, std::memory_order_relaxed);\r\n    }\r\n\r\n    __declspec(noinline) void remove(dlist_trx_node* node)\r\n    {\r\n        pdr_lock();\r\n\r\n        for (trx t; t.begin(); t.rollback())\r\n        {\r\n\t\t\trdesc* r1 = t.read(&node->prev)($);\r\n\t\t\tif (0 == r1)\r\n\t\t\t\tcontinue;\r\n\t\t\tdlist_trx_node* prev = (dlist_trx_node*)(intptr_t)r1->cmp($);\r\n\r\n\t\t\trdesc* r2 = t.read(&node->next)($);\r\n\t\t\tif (0 == r2)\r\n\t\t\t\tcontinue;\r\n\t\t\tdlist_trx_node* next = (dlist_trx_node*)(intptr_t)r2->cmp($);\r\n\r\n\t\t\twdesc* w1 = t.write(&prev->next)($);\r\n\t\t\tif (0 == w1)\r\n\t\t\t\tcontinue;\r\n\t\t\t//dlist_trx_node* prev_next = (dlist_trx_node*)w1->cmp;\r\n\r\n\t\t\twdesc* w2 = t.write(&next->prev)($);\r\n\t\t\tif (0 == w2)\r\n\t\t\t\tcontinue;\r\n\t\t\t//dlist_trx_node* next_prev = (dlist_trx_node*)w2->cmp;\r\n\r\n\t\t\tw1->xchg($) = (intptr_t)next;\r\n            w2->xchg($) = (intptr_t)prev;\r\n\r\n            if (t.commit())\r\n                break;\r\n        }\r\n\r\n        pdr_unlock();\r\n    }\r\n\r\n    __declspec(noinline) void insert(dlist_trx_node* node)\r\n    {\r\n        pdr_lock();\r\n\r\n\t\tfor (trx t; t.begin(); t.rollback())\r\n        {\r\n\t\t\twdesc* w1 = t.write(&first.next)($);\r\n            if (0 == w1)\r\n\t\t\t\tcontinue;\r\n\t\t\tdlist_trx_node* next = (dlist_trx_node*)(intptr_t)w1->cmp($);\r\n\r\n\t\t\twdesc* w2 = t.write(&next->prev)($);\r\n\t\t\tif (0 == w2)\r\n                continue;\r\n\t\t\tdlist_trx_node* const& prev = (dlist_trx_node*)(intptr_t)w2->cmp($);\r\n\r\n            if (prev != &first)\r\n                continue;\r\n\r\n            node->prev($).store((intptr_t)prev, std::memory_order_relaxed);\r\n            node->next($).store((intptr_t)next, std::memory_order_relaxed);\r\n\t\t\tw1->xchg($) = (intptr_t)node;\r\n\t\t\tw2->xchg($) = (intptr_t)node;\r\n\r\n            if (t.commit())\r\n                break;\r\n        }\r\n\r\n        pdr_unlock();\r\n    }\r\n\r\n    __declspec(noinline) void foreach(void (*f)(void*, dlist_trx_node*), void (*reset)(void*), void* ctx)\r\n    {\r\n        pdr_lock();\r\n\r\n        for (trx t; t.begin(); t.rollback())\r\n        {\r\n            reset(ctx);\r\n\r\n            rdesc* r1 = t.read(&first.next, std::memory_order_consume)($);\r\n            if (0 == r1)\r\n                continue;\r\n            dlist_trx_node* node = (dlist_trx_node*)(intptr_t)r1->cmp($);\r\n\r\n            while (node->next($).load(std::memory_order_consume))\r\n            {\r\n                rdesc* r = t.read(&node->next)($);\r\n\t\t\t\tif (0 == r)\r\n                    break;\r\n\t\t\t\tdlist_trx_node* next = (dlist_trx_node*)(intptr_t)r->cmp($);\r\n\r\n                f(ctx, node);\r\n                node = next;\r\n            }\r\n            if (node->next($).load(std::memory_order_relaxed))\r\n                continue;\r\n\r\n            if (t.commit())\r\n                break;\r\n        }\r\n\r\n        pdr_unlock();\r\n    }\r\n\r\n    dlist_trx_node first;\r\n    dlist_trx_node last;\r\n};\r\n\r\n\r\n\r\n\r\nstruct dlist_trx_test : rl::test_suite<dlist_trx_test, 4>\r\n{\r\n    dlist_trx list;\r\n\r\n    static int const count = 4;\r\n    dlist_trx_node nodes[2][count];\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index || 1 == index)\r\n        {\r\n            for (int i = 0; i != count; ++i)\r\n            {\r\n                dlist_trx_node* n = &nodes[index][i];\r\n                intptr_t value = 1 << ((index * count + i) * 4);\r\n                n->key($) = value;\r\n                n->value($) = value;\r\n                list.insert(n);\r\n            }\r\n            for (int i = 0; i != count; ++i)\r\n            {\r\n                dlist_trx_node* n = &nodes[index][i];\r\n                list.remove(n);\r\n            }\r\n        }\r\n        else if (2 == index || 3 == index)\r\n        {\r\n            struct local\r\n            {\r\n                static void reset(void* ctx)\r\n                {\r\n                    *(int*)ctx = 0;\r\n                }\r\n\r\n                static void apply(void* ctx, dlist_trx_node* n)\r\n                {\r\n                    *(int*)ctx += (int)n->value($);\r\n                }\r\n            };\r\n\r\n            int volatile sum = 0;\r\n            list.foreach(&local::apply, &local::reset, (void*)&sum);\r\n            int volatile x = sum;\r\n            (void)x;\r\n        }\r\n    }\r\n\r\n    void invariant()\r\n    {\r\n        int volatile sum = 0;\r\n        dlist_trx_node* n = (dlist_trx_node*)list.first.next($).load();\r\n        for (;;)\r\n        {\r\n            if (lock_value == (intptr_t)n)\r\n                break;\r\n            dlist_trx_node* next = (dlist_trx_node*)n->next($).load();\r\n            if (0 == next)\r\n                break;\r\n            sum += (int)n->value($);\r\n            n = next;\r\n        }\r\n    }\r\n};\r\n\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/tutorial.txt",
    "content": "1. Add\r\n#include <relacy/relacy_std.hpp>\r\n\r\n2. For atomic variables use type std::atomic<T>:\r\nstd::atomic<void*> head;\r\n\r\n3. For usual non-atomic variables use type rl::var<T>:\r\nrl::var<int> data;\r\nSuch vars will be checked for races and included into trace.\r\n\r\n4. All accesses to std::atomic<T> and rl::var<T> variables postfix with '($)':\r\nstd::atomic<void*> head;\r\nrl::var<int> data;\r\nhead($).store(0);\r\ndata($) = head($).load();\r\n\r\n5. Strictly thread-private variables use can leave as-is:\r\nfor (int i = 0; i != 10; ++i)\r\nSuch vars will be NOT checked for races NOR included into trace. But they will accelerate verification.\r\n\r\n6. Describe test-suite: number of threads, thread function, before/after/invariant functions. See example below.\r\n\r\n7. Place asserts:\r\nint x = g($).load();\r\nRL_ASSERT(x > 0);\r\n\r\n8. Start verification:\r\nrl::simulate<test_suite_t>();\r\n\r\nHere is complete example:\r\n\r\n#include <relacy/relacy_std.hpp>\r\n\r\n// template parameter '2' is number of threads\r\nstruct race_test : rl::test_suite<race_test, 2>\r\n{\r\n    std::atomic<int> a;\r\n    rl::var<int> x;\r\n\r\n    // executed in single thread before main thread function\r\n    void before()\r\n    {\r\n        a($) = 0;\r\n        x($) = 0;\r\n    }\r\n\r\n    // main thread function\r\n    void thread(unsigned thread_index)\r\n    {\r\n        if (0 == thread_index)\r\n        {\r\n            x($) = 1;\r\n            a($).store(1, rl::memory_order_relaxed);\r\n        }\r\n        else\r\n        {\r\n            if (1 == a($).load(rl::memory_order_relaxed))\r\n                x($) = 2;\r\n        }\r\n    }\r\n\r\n    // executed in single thread after main thread function\r\n    void after()\r\n    {\r\n    }\r\n\r\n    // executed in single thread after every 'visible' action in main threads\r\n    // disallowed to modify any state\r\n    void invariant()\r\n    {\r\n    }\r\n};\r\n\r\nint main()\r\n{\r\n    rl::simulate<race_test>();\r\n}\r\n\r\n\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/wfmo.hpp",
    "content": "#pragma once\r\n\r\n#include \"../relacy/relacy_std.hpp\"\r\n\r\n\r\n\r\nstruct test_wfmo_all : rl::test_suite<test_wfmo_all, 2>\r\n{\r\n    HANDLE sema1;\r\n    HANDLE sema2;\r\n    rl::var<int> data;\r\n\r\n    void before()\r\n    {\r\n        sema1 = CreateSemaphore(0, 0, 2, 0);\r\n        sema2 = CreateSemaphore(0, 0, 2, 0);\r\n        data($) = 0;\r\n    }\r\n\r\n    void after()\r\n    {\r\n        CloseHandle(sema1);\r\n        CloseHandle(sema2);\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            HANDLE handles [2] = {sema1, sema2};\r\n            WaitForMultipleObjects(2, handles, 1, INFINITE);\r\n            RL_ASSERT(data($) == 2);\r\n        }\r\n        else\r\n        {\r\n            data($) = 1;\r\n            ReleaseSemaphore(sema1, 1, 0);\r\n            data($) = 2;\r\n            ReleaseSemaphore(sema2, 1, 0);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct test_wfmo_single : rl::test_suite<test_wfmo_single, 2, rl::test_result_until_condition_hit>\r\n{\r\n    HANDLE sema1;\r\n    HANDLE sema2;\r\n    rl::atomic<int> data;\r\n\r\n    void before()\r\n    {\r\n        sema1 = CreateSemaphore(0, 0, 2, 0);\r\n        sema2 = CreateSemaphore(0, 0, 2, 0);\r\n        data($) = 0;\r\n    }\r\n\r\n    void after()\r\n    {\r\n        CloseHandle(sema1);\r\n        CloseHandle(sema2);\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            HANDLE handles [2] = {sema1, sema2};\r\n            WaitForMultipleObjects(2, handles, 0, INFINITE);\r\n            int d = data.load(rl::memory_order_relaxed);\r\n            RL_ASSERT(d == 1 || d == 2);\r\n            RL_UNTIL(d == 1);\r\n        }\r\n        else\r\n        {\r\n            data.store(1, rl::memory_order_relaxed);\r\n            ReleaseSemaphore(sema1, 1, 0);\r\n            data.store(2, rl::memory_order_relaxed);\r\n            ReleaseSemaphore(sema2, 1, 0);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct test_wfmo_timeout : rl::test_suite<test_wfmo_timeout, 2, rl::test_result_until_condition_hit>\r\n{\r\n    HANDLE sema1;\r\n    HANDLE sema2;\r\n    rl::atomic<int> data;\r\n\r\n    void before()\r\n    {\r\n        sema1 = CreateSemaphore(0, 0, 2, 0);\r\n        sema2 = CreateSemaphore(0, 0, 2, 0);\r\n        data($) = 0;\r\n    }\r\n\r\n    void after()\r\n    {\r\n        CloseHandle(sema1);\r\n        CloseHandle(sema2);\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            HANDLE handles [2] = {sema1, sema2};\r\n            WaitForMultipleObjects(2, handles, 0, 100);\r\n            int d = data.load(rl::memory_order_relaxed);\r\n            RL_ASSERT(d == 0 || d == 1 || d == 2);\r\n            RL_UNTIL(d == 0);\r\n        }\r\n        else\r\n        {\r\n            data.store(1, rl::memory_order_relaxed);\r\n            ReleaseSemaphore(sema1, 1, 0);\r\n            data.store(2, rl::memory_order_relaxed);\r\n            ReleaseSemaphore(sema2, 1, 0);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct test_wfmo_try : rl::test_suite<test_wfmo_try, 2>\r\n{\r\n    HANDLE sema1;\r\n    HANDLE sema2;\r\n    rl::atomic<int> d;\r\n    rl::atomic<int> d1;\r\n    rl::atomic<int> d2;\r\n\r\n    void before()\r\n    {\r\n        sema1 = CreateSemaphore(0, 1, 2, 0);\r\n        sema2 = CreateSemaphore(0, 1, 2, 0);\r\n        d1($) = 0;\r\n        d2($) = 0;\r\n    }\r\n\r\n    void after()\r\n    {\r\n        CloseHandle(sema1);\r\n        CloseHandle(sema2);\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            d1.store(1, rl::memory_order_relaxed);\r\n            HANDLE handles [2] = {sema1, sema2};\r\n            if (WAIT_TIMEOUT == WaitForMultipleObjects(2, handles, 1, 0))\r\n                RL_ASSERT(1 == d2.load(rl::memory_order_relaxed));\r\n        }\r\n        else if (1 == index)\r\n        {\r\n            d2.store(1, rl::memory_order_relaxed);\r\n            HANDLE handles [2] = {sema2, sema1};\r\n            if (WAIT_TIMEOUT == WaitForMultipleObjects(2, handles, 1, 0))\r\n                RL_ASSERT(1 == d1.load(rl::memory_order_relaxed));\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct test_wfmo_mixed : rl::test_suite<test_wfmo_mixed, 3>\r\n{\r\n\tHANDLE sem [2];\r\n\t\r\n\tvoid before()\r\n\t{\r\n\t\tsem[0] = CreateSemaphore(0, 0, 2, 0);\r\n\t\tsem[1] = CreateSemaphore(0, 0, 2, 0);\r\n\t}\r\n\t\r\n\tvoid after()\r\n\t{\r\n\t\tCloseHandle(sem[0]);\r\n\t\tCloseHandle(sem[1]);\r\n\t}\r\n\t\r\n\tvoid thread(unsigned index)\r\n\t{\r\n\t\tif (0 == index)\r\n\t\t{\r\n\t\t\tReleaseSemaphore(sem[0], 1, 0);\r\n\t\t\tReleaseSemaphore(sem[0], 1, 0);\r\n\t\t\tReleaseSemaphore(sem[1], 1, 0);\r\n\t\t}\r\n\t\telse if (1 == index)\r\n\t\t{\r\n\t\t\tunsigned rv = WaitForMultipleObjects(2, sem, 1, INFINITE);\r\n\t\t\tassert(rv == WAIT_OBJECT_0);\r\n\t\t}\r\n\t\telse if (2 == index)\r\n\t\t{\r\n\t\t\tunsigned rv = WaitForSingleObject(sem[0], INFINITE);\r\n\t\t\tassert(rv == WAIT_OBJECT_0);\r\n\t\t}\r\n\t}\r\n};\r\n\r\n\r\n\r\n\r\nstruct test_wfmo_mixed2 : rl::test_suite<test_wfmo_mixed2, 4>\r\n{\r\n\tHANDLE sem [2];\r\n\t\r\n\tvoid before()\r\n\t{\r\n\t\tsem[0] = CreateSemaphore(0, 0, 2, 0);\r\n\t\tsem[1] = CreateSemaphore(0, 0, 2, 0);\r\n\t}\r\n\t\r\n\tvoid after()\r\n\t{\r\n\t\tCloseHandle(sem[0]);\r\n\t\tCloseHandle(sem[1]);\r\n\t}\r\n\t\r\n\tvoid thread(unsigned index)\r\n\t{\r\n\t\tif (0 == index)\r\n\t\t{\r\n\t\t\tReleaseSemaphore(sem[1], 1, 0);\r\n\t\t\tReleaseSemaphore(sem[0], 1, 0);\r\n\t\t\tReleaseSemaphore(sem[0], 1, 0);\r\n\t\t}\r\n\t\telse if (1 == index)\r\n\t\t{\r\n\t\t\tunsigned rv = WaitForSingleObject(sem[0], INFINITE);\r\n\t\t\tassert(rv == WAIT_OBJECT_0);\r\n\t\t}\r\n\t\telse if (2 == index || 3 == index)\r\n\t\t{\r\n\t\t\tunsigned rv = WaitForMultipleObjects(2, sem, 1, 42);\r\n\t\t\tassert(rv == WAIT_OBJECT_0 || rv == WAIT_TIMEOUT);\r\n\t\t}\r\n\t}\r\n};\r\n\r\n\r\n\r\n\r\nstruct test_wfmo_event_all : rl::test_suite<test_wfmo_event_all, 2>\r\n{\r\n\tHANDLE ev [2];\r\n\trl::atomic<int> state;\r\n\t\r\n\tvoid before()\r\n\t{\r\n\t\tev[0] = CreateEvent(0, 0, 0, 0);\r\n\t\tev[1] = CreateEvent(0, 1, 0, 0);\r\n\t\tstate.store(0, rl::memory_order_relaxed);\r\n\t}\r\n\t\r\n\tvoid after()\r\n\t{\r\n\t\tCloseHandle(ev[0]);\r\n\t\tCloseHandle(ev[1]);\r\n\t}\r\n\t\r\n\tvoid thread(unsigned index)\r\n\t{\r\n\t\tif (0 == index)\r\n\t\t{\r\n\t\t\tunsigned rv = WaitForMultipleObjects(2, ev, 1, INFINITE);\r\n\t\t\tassert(rv == WAIT_OBJECT_0 + 0 || rv == WAIT_OBJECT_0 + 1);\r\n\t\t\tassert(state.load(rl::memory_order_relaxed) == 1);\r\n\t\t}\r\n\t\telse if (1 == index)\r\n\t\t{\r\n\t\t\tSetEvent(ev[0]);\r\n\t\t\tstate.store(1, rl::memory_order_relaxed);\r\n\t\t\tSetEvent(ev[1]);\r\n\t\t}\r\n\t}\r\n};\r\n\r\n\r\n\r\n\r\nstruct test_wfmo_event_any : rl::test_suite<test_wfmo_event_any, 2>\r\n{\r\n\tHANDLE ev [2];\r\n\trl::atomic<int> state;\r\n\t\r\n\tvoid before()\r\n\t{\r\n\t\tev[0] = CreateEvent(0, 0, 0, 0);\r\n\t\tev[1] = CreateEvent(0, 1, 0, 0);\r\n\t\tstate.store(0, rl::memory_order_relaxed);\r\n\t}\r\n\t\r\n\tvoid after()\r\n\t{\r\n\t\tCloseHandle(ev[0]);\r\n\t\tCloseHandle(ev[1]);\r\n\t}\r\n\t\r\n\tvoid thread(unsigned index)\r\n\t{\r\n\t\tif (0 == index)\r\n\t\t{\r\n\t\t\tunsigned rv = WaitForMultipleObjects(2, ev, 0, INFINITE);\r\n\t\t\tassert(rv == WAIT_OBJECT_0 + 0 || rv == WAIT_OBJECT_0 + 1);\r\n\t\t\tassert(state.load(rl::memory_order_relaxed) == 1);\r\n\t\t}\r\n\t\telse if (1 == index)\r\n\t\t{\r\n\t\t\tstate.store(1, rl::memory_order_relaxed);\r\n\t\t\tSetEvent(ev[0]);\r\n\t\t\tSetEvent(ev[1]);\r\n\t\t}\r\n\t}\r\n};\r\n\r\n\r\n\r\n\r\nstruct test_wfmo_atomic : rl::test_suite<test_wfmo_atomic, 2, rl::test_result_until_condition_hit>\r\n{\r\n\tHANDLE ev [2];\r\n\trl::atomic<int> state;\r\n\t\r\n\tvoid before()\r\n\t{\r\n\t\tev[0] = CreateEvent(0, 0, 0, 0);\r\n\t\tev[1] = CreateEvent(0, 0, 0, 0);\r\n\t}\r\n\t\r\n\tvoid after()\r\n\t{\r\n\t\tCloseHandle(ev[0]);\r\n\t\tCloseHandle(ev[1]);\r\n\t}\r\n\t\r\n\tvoid thread(unsigned index)\r\n\t{\r\n\t\tif (0 == index)\r\n\t\t{\r\n\t\t\tstate.store(1, rl::memory_order_relaxed);\r\n\t\t\tWaitForMultipleObjects(2, ev, 0, 1);\r\n\t\t}\r\n\t\telse if (1 == index)\r\n\t\t{\r\n\t\t\tSetEvent(ev[0]);\r\n\t\t\tSetEvent(ev[1]);\r\n\t\t\tunsigned rv = WaitForSingleObject(ev[0], 0);\r\n\t\t\tif (rv == WAIT_TIMEOUT) {\r\n\t\t\t\tassert(state.load(rl::memory_order_relaxed) == 1);\r\n\t\t\t\tRL_UNTIL(true);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\r\n\r\n\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy/test/windows.hpp",
    "content": "#pragma once\r\n\r\n#include \"../relacy/windows.h\"\r\n\r\n\r\nstruct test_win_thread : rl::test_suite<test_win_thread, 1>\r\n{\r\n    static size_t const dynamic_thread_count = 2;\r\n\r\n    VAR_T(int) data;\r\n\r\n    static unsigned long RL_STDCALL win_func(void* param)\r\n    {\r\n        static_cast<test_win_thread*>(param)->VAR(data) += 1;\r\n        return 0;\r\n    }\r\n\r\n    static unsigned RL_STDCALL msvc_func(void* param)\r\n    {\r\n        static_cast<test_win_thread*>(param)->VAR(data) += 1;\r\n        return 0;\r\n    }\r\n\r\n    void thread(unsigned)\r\n    {\r\n        VAR(data) = 0;\r\n\r\n        HANDLE th1 = CreateThread(0, 0, &test_win_thread::win_func, this, 0, 0);\r\n        WaitForSingleObject(th1, INFINITE);\r\n        RL_ASSERT(VAR(data) == 1);\r\n\r\n        HANDLE th2 = (HANDLE)_beginthreadex(0, 0, &test_win_thread::msvc_func, this, 0, 0);\r\n        WaitForSingleObject(th2, INFINITE);\r\n        RL_ASSERT(VAR(data) == 2);\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct test_win_mutex : rl::test_suite<test_win_mutex, 2>\r\n{\r\n    HANDLE mtx;\r\n    VAR_T(int) data;\r\n\r\n    void before()\r\n    {\r\n        mtx = CreateMutex(0, 0, 0);\r\n        VAR(data) = 0;\r\n    }\r\n\r\n    void after()\r\n    {\r\n        CloseHandle(mtx);\r\n    }\r\n\r\n    void thread(unsigned)\r\n    {\r\n        WaitForSingleObject(mtx, INFINITE);\r\n        WaitForSingleObject(mtx, INFINITE);\r\n        VAR(data) += 1;\r\n        ReleaseMutex(mtx);\r\n        ReleaseMutex(mtx);\r\n\r\n        if (WAIT_OBJECT_0 == WaitForSingleObject(mtx, 0))\r\n        {\r\n            VAR(data) += 1;\r\n            ReleaseMutex(mtx);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct test_win_cs : rl::test_suite<test_win_cs, 2>\r\n{\r\n    CRITICAL_SECTION mtx;\r\n    VAR_T(int) data;\r\n\r\n    void before()\r\n    {\r\n        InitializeCriticalSection(&mtx);\r\n        VAR(data) = 0;\r\n    }\r\n\r\n    void after()\r\n    {\r\n        DeleteCriticalSection(&mtx);\r\n    }\r\n\r\n    void thread(unsigned)\r\n    {\r\n        EnterCriticalSection(&mtx);\r\n        VAR(data) += 1;\r\n        LeaveCriticalSection(&mtx);\r\n\r\n        if (TryEnterCriticalSection(&mtx))\r\n        {\r\n            VAR(data) += 1;\r\n            LeaveCriticalSection(&mtx);\r\n        }\r\n    }\r\n};\r\n\r\n\r\nstruct test_win_condvar : rl::test_suite<test_win_condvar, 3>\r\n{\r\n    CONDITION_VARIABLE cv;\r\n    CRITICAL_SECTION mtx;\r\n    VAR_T(int) stage;\r\n\r\n    void before()\r\n    {\r\n        InitializeConditionVariable(&cv);\r\n        InitializeCriticalSection(&mtx);\r\n        VAR(stage) = 0;\r\n    }\r\n\r\n    void after()\r\n    {\r\n        DeleteCriticalSection(&mtx);\r\n        DeleteConditionVariable(&cv);\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            EnterCriticalSection(&mtx);\r\n            VAR(stage) += 1;\r\n            WakeAllConditionVariable(&cv);\r\n            while (VAR(stage) != 2)\r\n                SleepConditionVariableCS(&cv, &mtx, INFINITE);\r\n            LeaveCriticalSection(&mtx);\r\n        }\r\n        else if (1 == index)\r\n        {\r\n            EnterCriticalSection(&mtx);\r\n            while (VAR(stage) != 1)\r\n                SleepConditionVariableCS(&cv, &mtx, 1);\r\n            VAR(stage) += 1;\r\n            WakeAllConditionVariable(&cv);\r\n            LeaveCriticalSection(&mtx);\r\n        }\r\n        else if (2 == index)\r\n        {\r\n            EnterCriticalSection(&mtx);\r\n            while (VAR(stage) != 2)\r\n                SleepConditionVariableCS(&cv, &mtx, INFINITE);\r\n            LeaveCriticalSection(&mtx);\r\n            WakeConditionVariable(&cv);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\nstruct test_win_condvar_srw : rl::test_suite<test_win_condvar_srw, 2>\r\n{\r\n    CONDITION_VARIABLE cv;\r\n    SRWLOCK mtx;\r\n    VAR_T(int) stage;\r\n\r\n    void before()\r\n    {\r\n        InitializeConditionVariable(&cv);\r\n        InitializeSRWLock(&mtx);\r\n        VAR(stage) = 0;\r\n    }\r\n\r\n    void after()\r\n    {\r\n        DeleteSRWLock(&mtx);\r\n        DeleteConditionVariable(&cv);\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (0 == index)\r\n        {\r\n            AcquireSRWLockExclusive(&mtx);\r\n            VAR(stage) += 1;\r\n            WakeAllConditionVariable(&cv);\r\n            while (VAR(stage) != 2)\r\n                SleepConditionVariableSRW(&cv, &mtx, INFINITE, 0);\r\n            ReleaseSRWLockExclusive(&mtx);\r\n        }\r\n        else if (1 == index)\r\n        {\r\n            AcquireSRWLockExclusive(&mtx);\r\n            while (VAR(stage) != 1)\r\n                SleepConditionVariableSRW(&cv, &mtx, 1, 0);\r\n            VAR(stage) += 1;\r\n            WakeAllConditionVariable(&cv);\r\n            ReleaseSRWLockExclusive(&mtx);\r\n        }\r\n        else if (2 == index)\r\n        {\r\n            AcquireSRWLockExclusive(&mtx);\r\n            while (VAR(stage) != 2)\r\n                SleepConditionVariableSRW(&cv, &mtx, INFINITE, 0);\r\n            ReleaseSRWLockExclusive(&mtx);\r\n            WakeConditionVariable(&cv);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\nstruct test_win_sem : rl::test_suite<test_win_sem, 2>\r\n{\r\n    HANDLE sem1, sem2;\r\n    VAR_T(int) data;\r\n\r\n    void before()\r\n    {\r\n        sem1 = CreateSemaphore(0, 0, 1, 0);\r\n        sem2 = CreateSemaphore(0, 0, 1, 0);\r\n        VAR(data) = 0;\r\n    }\r\n\r\n    void after()\r\n    {\r\n        CloseHandle(sem1);\r\n        CloseHandle(sem2);\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (index)\r\n        {\r\n            VAR(data) = 1;\r\n            long count = -1;\r\n            ReleaseSemaphore(sem1, 1, &count);\r\n            assert(count == 0);\r\n            for (;;)\r\n            {\r\n                unsigned long rv = WaitForSingleObject(sem2, 0);\r\n                if (rv == WAIT_OBJECT_0)\r\n                    break;\r\n                RL_ASSERT(rv == WAIT_TIMEOUT);\r\n                Sleep(0);\r\n            }\r\n            RL_ASSERT(VAR(data) == 2);\r\n            VAR(data) = 3;\r\n            ReleaseSemaphore(sem2, 1, &count);\r\n            RL_ASSERT(count == 0);\r\n            ReleaseSemaphore(sem2, 1, &count);\r\n            RL_ASSERT(count == 1);\r\n        }\r\n        else\r\n        {\r\n            unsigned long rv = WaitForSingleObject(sem1, INFINITE);\r\n            assert(rv == WAIT_OBJECT_0);\r\n            RL_ASSERT(VAR(data) == 1);\r\n            VAR(data) = 2;\r\n            ReleaseSemaphore(sem2, 1, 0);\r\n        }\r\n    }\r\n};\r\n\r\n\r\n\r\n\r\nstruct test_win_event : rl::test_suite<test_win_event, 2>\r\n{\r\n\tHANDLE ev;\r\n\tVAR_T(int) data;\r\n\t\r\n\tvoid before()\r\n\t{\r\n\t\tVAR(data) = 0;\r\n\t\tev = CreateEvent(0, 0, 0, 0);\r\n\t}\r\n\t\r\n\tvoid after()\r\n\t{\r\n\t\tCloseHandle(ev);\r\n\t}\r\n\t\r\n\tvoid thread(unsigned index)\r\n\t{\r\n\t\tif (0 == index)\r\n\t\t{\r\n\t\t\tVAR(data) = 1;\r\n\t\t\tSetEvent(ev);\r\n\t\t\tPulseEvent(ev);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tunsigned rv = WaitForSingleObject(ev, INFINITE);\r\n\t\t\tassert(rv == WAIT_OBJECT_0);\r\n\t\t\tassert(VAR(data) == 1);\r\n\t\t\trv = WaitForSingleObject(ev, 0);\r\n\t\t\tassert(rv == WAIT_TIMEOUT);\r\n\t\t\tResetEvent(ev);\r\n\t\t}\r\n\t}\r\n};\r\n\r\n\r\n\r\n\r\nstruct test_FlushProcessWriteBuffers : rl::test_suite<test_FlushProcessWriteBuffers, 2>\r\n{\r\n    std::atomic<int> x1;\r\n    std::atomic<int> x2;\r\n    int r1;\r\n    int r2;\r\n\r\n    void before()\r\n    {\r\n        x1.store(0, std::memory_order_relaxed);\r\n        x2.store(0, std::memory_order_relaxed);\r\n        r1 = r2 = 0;\r\n    }\r\n\r\n    void after()\r\n    {\r\n        assert(r1 == 1 || r2 == 1);\r\n    }\r\n\r\n    void thread(unsigned index)\r\n    {\r\n        if (index)\r\n        {\r\n            x1.store(1, std::memory_order_relaxed);\r\n            r1 = x2.load(std::memory_order_relaxed);\r\n        }\r\n        else\r\n        {\r\n            x2.store(1, std::memory_order_relaxed);\r\n            FlushProcessWriteBuffers();\r\n            r2 = x1.load(std::memory_order_relaxed);\r\n        }\r\n    }\r\n};\r\n\r\n"
  },
  {
    "path": "tests/relacy/relacy_shims.h",
    "content": "#pragma once\n\n// Use relacy assertions\n#undef assert\n#ifdef NDEBUG\n#define assert(x)\n#else\n#define assert(x) RL_ASSERT(x)\n#endif\n\n\nstruct RelacyThreadExitListener\n{\n\ttypedef void (*callback_t)(void*);\n\tcallback_t callback;\n\tvoid* userData;\n\t\n\tRelacyThreadExitListener* next;\n};\n\nclass RelacyThreadExitNotifier\n{\npublic:\n\tstatic void subscribe(RelacyThreadExitListener* listener)\n\t{\n\t\tauto& tlsInst = instance();\n\t\tlistener->next = tlsInst.tail;\n\t\ttlsInst.tail = listener;\n\t}\n\t\n\tstatic void unsubscribe(RelacyThreadExitListener* listener)\n\t{\n\t\tauto& tlsInst = instance();\n\t\tRelacyThreadExitListener** prev = &tlsInst.tail;\n\t\tfor (auto ptr = tlsInst.tail; ptr != nullptr; ptr = ptr->next) {\n\t\t\tif (ptr == listener) {\n\t\t\t\t*prev = ptr->next;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tprev = &ptr->next;\n\t\t}\n\t}\n\t\n\tstatic void notify_relacy_thread_start()\n\t{\n\t\tinstance().tail = nullptr;\n\t}\n\t\n\tstatic void notify_relacy_thread_exit()\n\t{\n\t\tfor (auto ptr = instance().tail; ptr != nullptr; ptr = ptr->next) {\n\t\t\tptr->callback(ptr->userData);\n\t\t}\n\t}\n\t\n\t\nprivate:\n\tRelacyThreadExitNotifier() : tail(nullptr) { }\n\t\n\tstatic RelacyThreadExitNotifier& instance()\n\t{\n\t\tstatic RelacyThreadExitNotifier instances[1024];\n\t\t\n\t\tauto tid = rl::thread_index();\n\t\tassert(tid < 1024);\n\t\treturn instances[tid];\n\t}\n\t\nprivate:\n\tRelacyThreadExitListener* tail;\n};\n\nnamespace std\n{\n\t// Relacy doesn't wrap std::atomic_flag\n\tstruct atomic_flag {\n\tprivate:\n\t\tatomic_flag(atomic_flag const&);\n\t\tatomic_flag(atomic_flag&&);\n\t\tatomic_flag& operator=(atomic_flag const&);\n\t\tatomic_flag& operator=(atomic_flag&&);\n\t\n\tpublic:\n\t\tatomic_flag() { }\n\t\tatomic_flag(bool initialValue) : val(initialValue ? 1 : 0) { }\n\t\t\n\t\tvoid clear()\n\t\t{\n\t\t\tclear(std::memory_order_seq_cst);\n\t\t}\n\t\t\n\t\tvoid clear(rl::memory_order order, rl::debug_info_param d)\n\t\t{\n\t\t\tval.store(0, order, d);\n\t\t}\n\t\t\n\t\tbool test_and_set()\n\t\t{\n\t\t\treturn test_and_set(std::memory_order_seq_cst);\n\t\t}\n\t\t\n\t\tbool test_and_set(rl::memory_order order, rl::debug_info_param d)\n\t\t{\n\t\t\treturn val.fetch_or(1, order, d) != 0;\n\t\t}\n\t\t\n\tprivate:\n\t\tstd::atomic<int> val;\n\t};\n}\n"
  },
  {
    "path": "tests/relacy/spmchash.cpp",
    "content": "// ©2014 Cameron Desrochers\n\n#include \"relacy/relacy/relacy_std.hpp\"\n\nnamespace details\n{\n    template<typename U>\n    static inline char* align_for(char* ptr)\n    {\n        const std::size_t alignment = std::alignment_of<U>::value;\n        return ptr + (alignment - (reinterpret_cast<std::uintptr_t>(ptr) % alignment)) % alignment;\n    }\n}\n\ntemplate<typename TValue>\nstruct SPMCSequentialHashMap\n{\n    explicit SPMCSequentialHashMap(std::size_t initialSize)\n        : nextCapacity(initialSize), index(nullptr)\n    {\n        new_index();\n    }\n    \n    ~SPMCSequentialHashMap()\n    {\n        auto ptr = index.load(std::memory_order_relaxed);\n        if (ptr != nullptr) {\n            for (std::size_t i = 0; i != ptr->capacity; ++i) {\n                ptr->index[i]->~IndexEntry();\n            }\n            do {\n                auto prev = ptr->prev;\n                ptr->~IndexHeader();\n                free(ptr);\n                ptr = prev;\n            } while (ptr != nullptr);\n        }\n    }\n    \n    // Not thread safe. Only call from single producer thread.\n    // Note: key must *not* be in hash already, and must be exactly\n    // one larger than the previously inserted key value.\n    void insert(std::uint64_t key, TValue* value)\n    {\n        IndexEntry* idxEntry;\n        insert_index_entry(idxEntry, key);\n        idxEntry->value.store(value, std::memory_order_release);\n    }\n    \n    // Thread-safe, but if somebody can remove the key while find() is\n    // in progress, then any returned value is not guaranteed to correspond\n    // to that key. This also applies if the key was not already present but\n    // once was. Elements can be found in any order.\n    TValue* find(std::uint64_t key)\n    {\n        auto idxEntry = get_entry_for_key(key);\n        if (idxEntry == nullptr)\n            return nullptr;\n        return idxEntry->value.load(std::memory_order_acquire);\n    }\n    \n    // Thread-safe, but if somebody else can remove the same key while remove()\n    // is in progress, then any removed value is not guaranteed to correspond\n    // to that key This also applies if the key was not already present but\n    // once was. Elements can be removed in an order.\n    TValue* remove(std::uint64_t key)\n    {\n        auto idxEntry = get_entry_for_key(key);\n        if (idxEntry == nullptr)\n            return nullptr;\n        TValue* val = nullptr;\n        while (!idxEntry->value.compare_exchange_weak(val, nullptr, std::memory_order_acquire, std::memory_order_relaxed))\n            continue;\n        return val;\n    }\n    \nprivate:\n    struct IndexEntry\n    {\n        std::atomic<std::uint64_t> key;\n        std::atomic<TValue*> value;\n    };\n    \n    struct IndexHeader\n    {\n        std::size_t capacity;\n        std::atomic<std::size_t> tail;\n        IndexEntry* entries;\n        IndexEntry** index;\n        IndexHeader* prev;\n    };\n    \n    inline void insert_index_entry(IndexEntry*& idxEntry, std::uint64_t key)\n    {\n        auto localIndex = index.load(std::memory_order_relaxed);        // We're the only writer thread, relaxed is OK\n        auto newTail = (localIndex->tail.load(std::memory_order_relaxed) + 1) & (localIndex->capacity - 1);\n        idxEntry = localIndex->index[newTail];\n        if (idxEntry->key.load(std::memory_order_relaxed) == INVALID_KEY ||\n            idxEntry->value.load(std::memory_order_relaxed) == nullptr) {\n            \n            idxEntry->key.store(key, std::memory_order_relaxed);\n            localIndex->tail.store(newTail, std::memory_order_release);\n            return;\n        }\n        \n        // No room in the old index, try to allocate another one!\n        new_index();\n        localIndex = index.load(std::memory_order_relaxed);\n        newTail = (localIndex->tail.load(std::memory_order_relaxed) + 1) & (localIndex->capacity - 1);\n        idxEntry = localIndex->index[newTail];\n        assert(idxEntry->key.load(std::memory_order_relaxed) == INVALID_KEY);\n        idxEntry->key.store(key, std::memory_order_relaxed);\n        localIndex->tail.store(newTail, std::memory_order_release);\n    }\n    \n    inline IndexEntry* get_entry_for_key(std::uint64_t key) const\n    {\n        auto localIndex = index.load(std::memory_order_acquire);\n        auto tail = localIndex->tail.load(std::memory_order_acquire);\n        auto tailBase = localIndex->index[tail]->key.load(std::memory_order_relaxed);\n        if (tailBase == INVALID_KEY) {\n            return nullptr;\n        }\n        auto offset = static_cast<std::size_t>(key - tailBase);\n        std::size_t idx = (tail + offset) & (localIndex->capacity - 1);\n        auto entry = localIndex->index[idx];\n        return entry->key.load(std::memory_order_relaxed) == key ? entry : nullptr;\n    }\n    \n    bool new_index()\n    {\n        auto prev = index.load(std::memory_order_relaxed);\n        std::size_t prevCapacity = prev == nullptr ? 0 : prev->capacity;\n        auto entryCount = prev == nullptr ? nextCapacity : prevCapacity;\n        auto raw = static_cast<char*>(malloc(\n            sizeof(IndexHeader) +\n            std::alignment_of<IndexEntry>::value - 1 + sizeof(IndexEntry) * entryCount +\n            std::alignment_of<IndexEntry*>::value - 1 + sizeof(IndexEntry*) * nextCapacity));\n        if (raw == nullptr) {\n            return false;\n        }\n        \n        auto header = new (raw) IndexHeader;\n        auto entries = reinterpret_cast<IndexEntry*>(details::align_for<IndexEntry>(raw + sizeof(IndexHeader)));\n        auto idx = reinterpret_cast<IndexEntry**>(details::align_for<IndexEntry*>(reinterpret_cast<char*>(entries) + sizeof(IndexEntry) * entryCount));\n        if (prev != nullptr) {\n            auto prevTail = prev->tail.load(std::memory_order_relaxed);\n            auto prevPos = prevTail;\n            std::size_t i = 0;\n            do {\n                prevPos = (prevPos + 1) & (prev->capacity - 1);\n                idx[i++] = prev->index[prevPos];\n            } while (prevPos != prevTail);\n            assert(i == prevCapacity);\n        }\n        for (std::size_t i = 0; i != entryCount; ++i) {\n            new (entries + i) IndexEntry;\n            entries[i].key.store(INVALID_KEY, std::memory_order_relaxed);\n            entries[i].value.store(nullptr, std::memory_order_relaxed);\n            idx[prevCapacity + i] = entries + i;\n        }\n        header->prev = prev;\n        header->entries = entries;\n        header->index = idx;\n        header->capacity = nextCapacity;\n        header->tail.store((prevCapacity - 1) & (nextCapacity - 1), std::memory_order_relaxed);\n        \n        index.store(header, std::memory_order_release);\n        \n        nextCapacity <<= 1;\n        \n        return true;\n    }\n        \n    private:\n        std::size_t nextCapacity;\n        std::atomic<IndexHeader*> index;\n        \n        static const std::uint64_t INVALID_KEY = ~(std::uint64_t)0;\n};\n\n\n\ntemplate<int ThreadCount, int NUM_VALUES>\nstruct test : rl::test_suite<test<ThreadCount, NUM_VALUES>, ThreadCount>\n{\n\tSPMCSequentialHashMap<int>* hash;\n    int values[NUM_VALUES];\n    std::atomic<int> useCounts[NUM_VALUES];\n\tstd::atomic<bool> removed[NUM_VALUES];\n\t\n\tvoid before()\n\t{\n        hash = new SPMCSequentialHashMap<int>(2);\n        for (int i = 0; i != NUM_VALUES; ++i) {\n            values[i] = i;\n            useCounts[i].store(0, std::memory_order_relaxed);\n            removed[i].store(false, std::memory_order_relaxed);\n        }\n\t}\n\t\n\tvoid thread(unsigned int tid)\n\t{\n        if (tid == 0) {\n            // Producer\n            for (int i = 0; i != NUM_VALUES; ++i) {\n                hash->insert(i, &values[i]);\n                useCounts[i].store(ThreadCount / 2, std::memory_order_release);\n            }\n        }\n\t\telse {\n            // Consumer\n            for (int i = 0; i != NUM_VALUES; ++i) {\n                auto useCount = useCounts[i].fetch_add(-1, std::memory_order_acquire);\n                auto val = hash->find(i);\n                bool isRemoved = removed[i].load(std::memory_order_relaxed);\n                auto current = useCounts[i].fetch_add(0, std::memory_order_release);\n                if (useCount > 0 && (current > 0 || current == 0 && useCount == 1)) {\n                    RL_ASSERT(val != nullptr && *val == i && !isRemoved);\n                }\n                if (useCount == 1) {\n                    val = hash->remove(i);\n                    RL_ASSERT(val != nullptr && *val == i && !removed[i].load(std::memory_order_relaxed));\n                    removed[i].store(true, std::memory_order_release);\n                }\n            }\n        }\n\t}\n\t\n\tvoid after()\n\t{\n        delete hash;\n\t}\n\t\n\tvoid invariant()\n\t{\n\t}\n};\n\nint main()\n{\n\trl::test_params params;\n\t//params.search_type = rl::sched_full;\n\t//params.iteration_count = 100000000;\n\tparams.search_type = rl::sched_random;\n\tparams.iteration_count = 1000000;\n    rl::simulate<test<2, 4>>(params);\n    rl::simulate<test<3, 4>>(params);\n    rl::simulate<test<4, 8>>(params);\n\t\n\treturn 0;\n}\n"
  },
  {
    "path": "tests/unittests/makefile",
    "content": "# ©2013-2014 Cameron Desrochers\r\n\r\ninclude ../../build/makefile.inc\r\n\r\ndefault:\r\n\t$(MAKE) -C ../../build bin/unittests$(EXT)\r\n\r\nrun: default\r\n\t../../build/bin/unittests$(EXT)\r\n"
  },
  {
    "path": "tests/unittests/mallocmacro.cpp",
    "content": "#define malloc(x) malloc(x)\r\n#define free(x) free(x)\r\n\r\n#include \"../../blockingconcurrentqueue.h\"\r\n"
  },
  {
    "path": "tests/unittests/minitest.h",
    "content": "// ©2013-2014 Cameron Desrochers.\n// Distributed under the simplified BSD license (see the LICENSE file that\n// should have come with this header).\n\n// Provides an extremely basic unit testing framework.\n\n#pragma once\n\n#include <cstdio>\n#include <string>\n#include <map>\n#include <vector>\n#include <type_traits>\n#include <typeinfo>\n\n#ifdef __GNUG__\n#include <cxxabi.h>\n#include <cstdlib>\n#endif\n\n\n\n#define REGISTER_TEST(testName) registerTest(#testName, &subclass_t::testName)\n\n#define ASSERT_OR_FAIL(expr) { if (!(expr)) { notifyTestFailed(__LINE__, #expr); return false; } }\n#define SUCCEED() { return true; }\n\n\n\n// Uses CRTP\ntemplate<typename TSubclass>\nclass TestClass\n{\npublic:\n\tstatic void notifyTestFailed(int line, const char* expr)\n\t{\n\t\tstd::printf(\"    FAILED!\\n    ******* Assertion failed (line %d): %s\\n\\n\", line, expr);\n\t}\n\t\n\tbool validateTestName(std::string const& which) const\n\t{\n\t\treturn testMap.find(which) != testMap.end();\n\t}\n\t\n\tvoid getAllTestNames(std::vector<std::string>& names) const\n\t{\n\t\tfor (auto it = testMap.cbegin(); it != testMap.cend(); ++it) {\n\t\t\tnames.push_back(it->first);\n\t\t}\n\t}\n\t\n\tbool run(unsigned int iterations = 1)\n\t{\n\t\tbool success = true;\n\t\tfor (auto it = testVec.cbegin(); it != testVec.cend(); ++it) {\n\t\t\tif (!execTest(*it, iterations)) {\n\t\t\t\tsuccess = false;\n\t\t\t}\n\t\t}\n\t\treturn success;\n\t}\n\t\n\tbool run(std::vector<std::string> const& which, unsigned int iterations = 1)\n\t{\n\t\tbool success = true;\n\t\tfor (auto it = which.begin(); it != which.end(); ++it) {\n\t\t\tif (!execTest(*testMap.find(*it), iterations)) {\n\t\t\t\tsuccess = false;\n\t\t\t}\n\t\t}\n\t\treturn success;\n\t}\n\t\nprotected:\n\ttypedef TSubclass subclass_t;\n\n\tvoid registerTest(const char* name, bool (subclass_t::* method)())\n\t{\n\t\ttestVec.push_back(std::make_pair(std::string(name), method));\n\t\ttestMap[std::string(name)] = method;\n\t}\n\t\n\tvirtual bool preTest() { return true; }\n\tvirtual bool postTest(bool) { return true; }\n\t\n\tbool execTest(std::pair<std::string, bool (subclass_t::*)()> const& testRef, unsigned int iterations)\n\t{\n\t\tstd::printf(\"%s::%s... \\n\", demangle_type_name(typeid(subclass_t).name()).c_str(), testRef.first.c_str());\n\t\t\n\t\tbool result = true;\n\t\tfor (unsigned int i = 0; result && i != iterations; ++i) {\n\t\t\tresult = preTest();\n\t\t\ttry {\n\t\t\t\tresult = result && (static_cast<subclass_t*>(this)->*testRef.second)();\n\t\t\t}\n\t\t\tcatch (...) {\n\t\t\t\tstd::printf(\"    FAILED!\\n    ******* Unhandled exception thrown\\n\\n\");\n\t\t\t\tresult = false;\n\t\t\t}\n\t\t\tresult = postTest(result) && result;\n\t\t}\n\t\t\n\t\tif (result) {\n\t\t\tstd::printf(\"    passed\\n\\n\");\n\t\t}\n\t\treturn result;\n\t}\n\t\nprivate:\n\tstatic std::string demangle_type_name(const char* name)\n\t{\n#ifdef __GNUG__\n\t\t// Adapted from http://stackoverflow.com/a/4541470/21475\n\t\tint status = -4;\n\t\tchar* res = abi::__cxa_demangle(name, nullptr, nullptr, &status);\n\n\t\tconst char* const demangled_name = (status == 0) ? res : name;\n\t\tstd::string ret(demangled_name);\n\n\t\tstd::free(res);\n\t\treturn ret;\n#else\n\t\treturn name;\n#endif\n\t}\n\t\nprotected:\n\tstd::vector<std::pair<std::string, bool (TSubclass::*)()> > testVec;\n\tstd::map<std::string, bool (TSubclass::*)()> testMap;\n};\n"
  },
  {
    "path": "tests/unittests/unittests.cpp",
    "content": "// ©2013-2014 Cameron Desrochers.\n// Distributed under the simplified BSD license (see the LICENSE file that\n// should have come with this file).\n\n// Unit tests for moodycamel::ConcurrentQueue\n\n#define likely MAKE_SURE_LIKELY_MACRO_CAN_PEACEFULLY_COEXIST\n#define unlikely MAKE_SURE_UNLIKELY_MACRO_CAN_PEACEFULLY_COEXIST\n\n#include <cstdio>\n#include <cstdlib>\n#include <cstring>\n#include <string>\n#include <cstddef>\n#include <string>\n#include <iterator>\n\nstruct MakeSureCustomNewCanPeacefullyCoexist;\nvoid* operator new(size_t size, MakeSureCustomNewCanPeacefullyCoexist* x);\nvoid operator delete(void* ptr, MakeSureCustomNewCanPeacefullyCoexist* x);\n\n#ifdef _WIN32\n#ifndef NOMINMAX\n#define NOMINMAX\n#endif\n#include <windows.h>\t\t// Not because we need it, but to ensure no conflicts arise with the queue's declarations\n#endif\n\n#include \"minitest.h\"\n#include \"../common/simplethread.h\"\n#include \"../common/systemtime.h\"\n#include \"../../concurrentqueue.h\"\n#include \"../../blockingconcurrentqueue.h\"\n#include \"../../c_api/concurrentqueue.h\"\n\nnamespace {\n\tstruct tracking_allocator\n\t{\n\t\tunion tag {\n\t\t\tstd::size_t size;\n#ifdef __GNUC__\n\t\t\tmax_align_t dummy;\t\t// GCC forgot to add it to std:: for a while\n#else\n\t\t\tstd::max_align_t dummy;\t// Others (e.g. MSVC) insist it can *only* be accessed via std::\n#endif\n\t\t};\n\t\t\n\t\tstatic inline void* malloc(std::size_t size)\n\t\t{\n\t\t\tauto ptr = std::malloc(size + sizeof(tag));\n\t\t\tif (ptr) {\n\t\t\t\treinterpret_cast<tag*>(ptr)->size = size;\n\t\t\t\tusage.fetch_add(size, std::memory_order_relaxed);\n\t\t\t\treturn reinterpret_cast<char*>(ptr) + sizeof(tag);\n\t\t\t}\n\t\t\treturn nullptr;\n\t\t}\n\t\t\n\t\tstatic inline void free(void* ptr)\n\t\t{\n\t\t\tif (ptr) {\n\t\t\t\tptr = reinterpret_cast<char*>(ptr) - sizeof(tag);\n\t\t\t\tauto size = reinterpret_cast<tag*>(ptr)->size;\n\t\t\t\tusage.fetch_add(-size, std::memory_order_relaxed);\n\t\t\t}\n\t\t\tstd::free(ptr);\n\t\t}\n\t\t\n\t\tstatic inline std::size_t current_usage() { return usage.load(std::memory_order_relaxed); }\n\t\t\n\tprivate:\n\t\tstatic std::atomic<std::size_t> usage;\n\t};\n\t\n\tstd::atomic<std::size_t> tracking_allocator::usage(0);\n}\n\nstruct corealgos_allocator\n{\n\tstatic inline void* malloc(std::size_t size) { return tracking_allocator::malloc(size); }\n\tstatic inline void free(void* ptr) { tracking_allocator::free(ptr); }\n};\n\n#define corealgos_allocator corealgos_allocator\n\n#include \"../corealgos.h\"\n\nusing namespace moodycamel;\n\n\nnamespace moodycamel\n{\nstruct MallocTrackingTraits : public ConcurrentQueueDefaultTraits\n{\n\tstatic inline void* malloc(std::size_t size) { return tracking_allocator::malloc(size); }\n\tstatic inline void free(void* ptr) { tracking_allocator::free(ptr); }\n};\n\ntemplate<std::size_t BlockSize = ConcurrentQueueDefaultTraits::BLOCK_SIZE, std::size_t InitialIndexSize = ConcurrentQueueDefaultTraits::EXPLICIT_INITIAL_INDEX_SIZE, bool RecycleBlocks = ConcurrentQueueDefaultTraits::RECYCLE_ALLOCATED_BLOCKS>\nstruct TestTraits : public MallocTrackingTraits\n{\n\ttypedef std::size_t size_t;\n\ttypedef uint64_t index_t;\n\t\n\tstatic const size_t BLOCK_SIZE = BlockSize;\n\tstatic const size_t EXPLICIT_INITIAL_INDEX_SIZE = InitialIndexSize;\n\tstatic const size_t IMPLICIT_INITIAL_INDEX_SIZE = InitialIndexSize * 2;\n\tstatic const bool RECYCLE_ALLOCATED_BLOCKS = RecycleBlocks;\n\t\n\tstatic inline void reset() { _malloc_count() = 0; _free_count() = 0; }\n\tstatic inline std::atomic<int>& _malloc_count() { static std::atomic<int> c; return c; }\n\tstatic inline int malloc_count() { return _malloc_count().load(std::memory_order_seq_cst); }\n\tstatic inline std::atomic<int>& _free_count() { static std::atomic<int> c; return c; }\n\tstatic inline int free_count() { return _free_count().load(std::memory_order_seq_cst); }\n\t\n\tstatic inline void* malloc(ConcurrentQueueDefaultTraits::size_t bytes) { ++_malloc_count(); return tracking_allocator::malloc(bytes); }\n\tstatic inline void free(void* obj) { ++_free_count(); return tracking_allocator::free(obj); }\n};\n\nstruct SmallIndexTraits : public MallocTrackingTraits\n{\n\ttypedef uint16_t size_t;\n\ttypedef uint16_t index_t;\n};\n\nstruct ExtraSmallIndexTraits : public MallocTrackingTraits\n{\n\ttypedef uint8_t size_t;\n\ttypedef uint8_t index_t;\n};\n\nstruct LargeTraits : public MallocTrackingTraits\n{\n\tstatic const size_t BLOCK_SIZE = 128;\n\tstatic const size_t INITIAL_IMPLICIT_PRODUCER_HASH_SIZE = 128;\n\tstatic const size_t IMPLICIT_INITIAL_INDEX_SIZE = 128;\n};\n\n// Note: Not thread safe!\nstruct Foo\n{\n\tstatic int& nextId() { static int i; return i; }\n\tstatic int& createCount() { static int c; return c; }\n\tstatic int& destroyCount() { static int c; return c; }\n\tstatic bool& destroyedInOrder() { static bool d = true; return d; }\n\tstatic void reset() { createCount() = 0; destroyCount() = 0; nextId() = 0; destroyedInOrder() = true; lastDestroyedId() = -1; }\n\t\n\tFoo() { id = nextId()++; ++createCount(); }\n\tFoo(Foo const&) MOODYCAMEL_DELETE_FUNCTION;\n\tFoo(Foo&& other) { id = other.id; other.id = -1; }\n\tvoid operator=(Foo&& other) { id = other.id; other.id = -1; }\n\t~Foo()\n\t{\n\t\t++destroyCount();\n\t\tif (id == -2) {\n\t\t\t// Double free!\n\t\t\tdestroyedInOrder() = false;\n\t\t}\n\t\telse if (id != -1) {\n\t\t\tif (id <= lastDestroyedId()) {\n\t\t\t\tdestroyedInOrder() = false;\n\t\t\t}\n\t\t\tlastDestroyedId() = id;\n\t\t}\n\t\tid = -2;\n\t}\n\t\nprivate:\n\tint id;\n\tstatic int& lastDestroyedId() { static int i = -1; return i; }\n};\n\nstruct Copyable {\n\tCopyable(int id) : copied(false), id(id) { }\n\tCopyable(Copyable const& o) : copied(true), id(o.id) { }\n\tvoid operator=(Copyable const& o) { copied = true; id = o.id; }\n\tbool copied;\n\tint id;\n};\n\nstruct Moveable {\n\tMoveable(int id) : moved(false), copied(false), id(id) { }\n\tMoveable(Moveable&& o) MOODYCAMEL_NOEXCEPT : moved(true), copied(o.copied), id(o.id) { }\n\tvoid operator=(Moveable&& o) MOODYCAMEL_NOEXCEPT { moved = true; copied = o.copied; id = o.id; }\n\tbool moved;\n\tbool copied;\n\tint id;\n\n#if defined(_MSC_VER) && _MSC_VER < 1800\n\t// VS2012's std::is_nothrow_[move_]constructible is broken, so the queue never attempts to\n\t// move objects with that compiler. In this case, we don't know whether it's really a copy\n\t// or not being done, so give the benefit of the doubt (given the tests pass on other platforms)\n\t// and assume it would have done a move if it could have (don't set copied to true).\n\tMoveable(Moveable const& o) MOODYCAMEL_NOEXCEPT : moved(o.moved), copied(o.copied), id(o.id) { }\n\tvoid operator=(Moveable const& o) MOODYCAMEL_NOEXCEPT { moved = o.moved; copied = o.copied; id = o.id; }\n#else\n\tMoveable(Moveable const& o) MOODYCAMEL_NOEXCEPT : moved(o.moved), copied(true), id(o.id) { }\n\tvoid operator=(Moveable const& o) MOODYCAMEL_NOEXCEPT { moved = o.moved; copied = true; id = o.id; }\n#endif\n};\n\nstruct ThrowingMovable {\n\tstatic std::atomic<int>& ctorCount() { static std::atomic<int> c; return c; }\n\tstatic std::atomic<int>& destroyCount() { static std::atomic<int> c; return c; }\n\tstatic void reset() { ctorCount() = 0; destroyCount() = 0; }\n\t\n\texplicit ThrowingMovable(int id, bool throwOnCctor = false, bool throwOnAssignment = false, bool throwOnSecondCctor = false)\n\t\t: id(id), moved(false), copied(false), throwOnCctor(throwOnCctor), throwOnAssignment(throwOnAssignment), throwOnSecondCctor(throwOnSecondCctor)\n\t{\n\t\tctorCount().fetch_add(1, std::memory_order_relaxed);\n\t}\n\t\n\tThrowingMovable(ThrowingMovable const& o)\n\t\t: id(o.id), moved(false), copied(true), throwOnCctor(o.throwOnCctor), throwOnAssignment(o.throwOnAssignment), throwOnSecondCctor(false)\n\t{\n\t\tif (throwOnCctor) {\n\t\t\tthrow this;\n\t\t}\n\t\tctorCount().fetch_add(1, std::memory_order_relaxed);\n\t\tthrowOnCctor = o.throwOnSecondCctor;\n\t}\n\t\n\tThrowingMovable(ThrowingMovable&& o)\n\t\t: id(o.id), moved(true), copied(false), throwOnCctor(o.throwOnCctor), throwOnAssignment(o.throwOnAssignment), throwOnSecondCctor(false)\n\t{\n\t\tif (throwOnCctor) {\n\t\t\tthrow this;\n\t\t}\n\t\tctorCount().fetch_add(1, std::memory_order_relaxed);\n\t\tthrowOnCctor = o.throwOnSecondCctor;\n\t}\n\t\n\t~ThrowingMovable()\n\t{\n\t\tdestroyCount().fetch_add(1, std::memory_order_relaxed);\n\t}\n\t\n\tvoid operator=(ThrowingMovable const& o)\n\t{\n\t\tid = o.id;\n\t\tmoved = false;\n\t\tcopied = true;\n\t\tthrowOnCctor = o.throwOnCctor;\n\t\tthrowOnAssignment = o.throwOnAssignment;\n\t\tthrowOnSecondCctor = o.throwOnSecondCctor;\n\t\tif (throwOnAssignment) {\n\t\t\tthrow this;\n\t\t}\n\t}\n\t\n\tvoid operator=(ThrowingMovable&& o)\n\t{\n\t\tid = o.id;\n\t\tmoved = true;\n\t\tcopied = false;\n\t\tthrowOnCctor = o.throwOnCctor;\n\t\tthrowOnAssignment = o.throwOnAssignment;\n\t\tthrowOnSecondCctor = o.throwOnSecondCctor;\n\t\tif (throwOnAssignment) {\n\t\t\tthrow this;\n\t\t}\n\t}\n\t\n\tint id;\n\tbool moved;\n\tbool copied;\n\t\npublic:\n\tbool throwOnCctor;\n\tbool throwOnAssignment;\n\tbool throwOnSecondCctor;\n};\n\n#ifdef __arm__\n#define SUPER_ALIGNMENT 64\n#else\n#define SUPER_ALIGNMENT 128\n#endif\n\n#ifdef _MSC_VER\n#pragma warning(push)\n#pragma warning(disable: 4324)  // structure was padded due to alignment specifier\n#endif\n\nstruct MOODYCAMEL_ALIGNAS(SUPER_ALIGNMENT) VeryAligned {\n\tstatic size_t errors;\n\n\tint value;\n\n\tVeryAligned() MOODYCAMEL_NOEXCEPT : value(0) {\n\t\tif (reinterpret_cast<uintptr_t>(this) % SUPER_ALIGNMENT != 0)\n\t\t\t++errors;\n\t}\n\n\tVeryAligned(int value) MOODYCAMEL_NOEXCEPT : value(value) {\n\t\tif (reinterpret_cast<uintptr_t>(this) % SUPER_ALIGNMENT != 0)\n\t\t\t++errors;\n\t}\n\n\tVeryAligned(VeryAligned&& x) MOODYCAMEL_NOEXCEPT : value(x.value) {\n\t\tif (reinterpret_cast<uintptr_t>(this) % SUPER_ALIGNMENT != 0)\n\t\t\t++errors;\n\t\tx.value = 0;\n\t}\n\n\tVeryAligned& operator=(VeryAligned&& x) MOODYCAMEL_NOEXCEPT {\n\t\tstd::swap(value, x.value);\n\t\treturn *this;\n\t}\n\n\tVeryAligned(VeryAligned const&) MOODYCAMEL_DELETE_FUNCTION;\n\tVeryAligned& operator=(VeryAligned const&) MOODYCAMEL_DELETE_FUNCTION;\n};\nsize_t VeryAligned::errors = 0;\n\n#ifdef _MSC_VER\n#pragma warning(pop)\n#endif\n\n\n\nclass ConcurrentQueueTests : public TestClass<ConcurrentQueueTests>\n{\npublic:\n\tConcurrentQueueTests()\n\t{\n\t\tREGISTER_TEST(create_empty_queue);\n\t\tREGISTER_TEST(create_token);\n\t\tREGISTER_TEST(circular_less_than);\n\t\tREGISTER_TEST(enqueue_one_explicit);\n\t\tREGISTER_TEST(enqueue_and_dequeue_one_explicit);\n\t\tREGISTER_TEST(enqueue_one_implicit);\n\t\tREGISTER_TEST(enqueue_and_dequeue_one_implicit);\n\t\tREGISTER_TEST(enqueue_and_dequeue_a_few);\n\t\tREGISTER_TEST(enqueue_bulk);\n\t\tREGISTER_TEST(block_alloc);\n\t\tREGISTER_TEST(token_move);\n\t\tREGISTER_TEST(multi_producers);\n\t\tREGISTER_TEST(producer_reuse);\n\t\tREGISTER_TEST(block_reuse);\n\t\tREGISTER_TEST(block_recycling);\n\t\tREGISTER_TEST(leftovers_destroyed);\n\t\tREGISTER_TEST(block_index_resized);\n\t\tREGISTER_TEST(try_dequeue);\n\t\tREGISTER_TEST(try_dequeue_threaded);\n\t\tREGISTER_TEST(try_dequeue_bulk);\n\t\tREGISTER_TEST(try_dequeue_bulk_threaded);\n\t\tREGISTER_TEST(implicit_producer_hash);\n\t\tREGISTER_TEST(index_wrapping);\n\t\tREGISTER_TEST(subqueue_size_limit);\n\t\tREGISTER_TEST(exceptions);\n\t\tREGISTER_TEST(implicit_producer_churn);\n\t\tREGISTER_TEST(test_threaded);\n\t\tREGISTER_TEST(test_threaded_bulk);\n\t\tREGISTER_TEST(full_api<ConcurrentQueueDefaultTraits>);\n\t\tREGISTER_TEST(full_api<SmallIndexTraits>);\n\t\tREGISTER_TEST(blocking_wrappers);\n\t\tREGISTER_TEST(timed_blocking_wrappers);\n\n\t\t//c_api/concurrentqueue\n\t\tREGISTER_TEST(c_api_create);\n\t\tREGISTER_TEST(c_api_enqueue);\n\t\tREGISTER_TEST(c_api_try_dequeue);\n\t\tREGISTER_TEST(c_api_destroy);\n\t\t\n\t\t// Semaphore\n\t\tREGISTER_TEST(acquire_and_signal);\n\t\tREGISTER_TEST(try_acquire_and_signal);\n\t\t\n\t\t// Core algos\n\t\tREGISTER_TEST(core_add_only_list);\n\t\tREGISTER_TEST(core_thread_local);\n\t\tREGISTER_TEST(core_free_list);\n\t\tREGISTER_TEST(core_spmc_hash);\n\t\t\n\t\tREGISTER_TEST(explicit_strings_threaded);\n\t\tREGISTER_TEST(large_traits);\n\t}\n\t\n\tbool postTest(bool testSucceeded) override\n\t{\n\t\tif (testSucceeded) {\n\t\t\t// If this assertion fails, there's necessarily a memory leak somewhere!\n\t\t\tASSERT_OR_FAIL(tracking_allocator::current_usage() == 0);\n\t\t}\n\t\treturn true;\n\t}\n\t\n\t\n\tbool create_empty_queue()\n\t{\n\t\tConcurrentQueue<int, MallocTrackingTraits> q;\n\t\treturn true;\n\t}\n\t\n\t\n\tbool create_token()\n\t{\n\t\tConcurrentQueue<int, MallocTrackingTraits> q;\n\t\tProducerToken tok(q);\n\t\t\n\t\treturn true;\n\t}\n\t\n\tbool circular_less_than()\n\t{\n\t\t{\n\t\t\tuint32_t a, b;\n\t\t\t\n\t\t\ta = 0; b = 100;\n\t\t\tASSERT_OR_FAIL(details::circular_less_than(a, b));\n\t\t\tASSERT_OR_FAIL(!details::circular_less_than(b, a));\n\t\t\t\n\t\t\ta = 100; b = 0;\n\t\t\tASSERT_OR_FAIL(!details::circular_less_than(a, b));\n\t\t\tASSERT_OR_FAIL(details::circular_less_than(b, a));\n\t\t\t\n\t\t\ta = 0; b = 0;\n\t\t\tASSERT_OR_FAIL(!details::circular_less_than(a, b));\n\t\t\tASSERT_OR_FAIL(!details::circular_less_than(b, a));\n\t\t\t\n\t\t\ta = 100; b = 100;\n\t\t\tASSERT_OR_FAIL(!details::circular_less_than(a, b));\n\t\t\tASSERT_OR_FAIL(!details::circular_less_than(b, a));\n\t\t\t\n\t\t\ta = 0; b = 1u << 31;\n\t\t\tASSERT_OR_FAIL(!details::circular_less_than(a, b));\n\t\t\tASSERT_OR_FAIL(!details::circular_less_than(b, a));\n\t\t\t\n\t\t\ta = 1; b = 1u << 31;\n\t\t\tASSERT_OR_FAIL(details::circular_less_than(a, b));\n\t\t\tASSERT_OR_FAIL(!details::circular_less_than(b, a));\n\t\t\t\n\t\t\ta = 0; b = (1u << 31) + 1;\n\t\t\tASSERT_OR_FAIL(!details::circular_less_than(a, b));\n\t\t\tASSERT_OR_FAIL(details::circular_less_than(b, a));\n\t\t\t\n\t\t\ta = 100; b = (1u << 31) + 1;\n\t\t\tASSERT_OR_FAIL(details::circular_less_than(a, b));\n\t\t\tASSERT_OR_FAIL(!details::circular_less_than(b, a));\n\t\t\t\n\t\t\ta = (1u << 31) + 7; b = 5;\n\t\t\tASSERT_OR_FAIL(details::circular_less_than(a, b));\n\t\t\tASSERT_OR_FAIL(!details::circular_less_than(b, a));\n\t\t\t\n\t\t\ta = (1u << 16) + 7; b = (1 << 16) + 5;\n\t\t\tASSERT_OR_FAIL(!details::circular_less_than(a, b));\n\t\t\tASSERT_OR_FAIL(details::circular_less_than(b, a));\n\t\t\t\n\t\t\ta = 0xFFFFFFFFu; b = 0;\n\t\t\tASSERT_OR_FAIL(details::circular_less_than(a, b));\n\t\t\tASSERT_OR_FAIL(!details::circular_less_than(b, a));\n\t\t\t\n\t\t\ta = 0xFFFFFFFFu; b = 0xFFFFFFu;\n\t\t\tASSERT_OR_FAIL(details::circular_less_than(a, b));\n\t\t\tASSERT_OR_FAIL(!details::circular_less_than(b, a));\n\t\t}\n\t\t\n\t\t{\n\t\t\tuint16_t a, b;\n\t\t\t\n\t\t\ta = 0; b = 100;\n\t\t\tASSERT_OR_FAIL(details::circular_less_than(a, b));\n\t\t\tASSERT_OR_FAIL(!details::circular_less_than(b, a));\n\t\t\t\n\t\t\ta = 100; b = 0;\n\t\t\tASSERT_OR_FAIL(!details::circular_less_than(a, b));\n\t\t\tASSERT_OR_FAIL(details::circular_less_than(b, a));\n\t\t\t\n\t\t\ta = 0; b = 0;\n\t\t\tASSERT_OR_FAIL(!details::circular_less_than(a, b));\n\t\t\tASSERT_OR_FAIL(!details::circular_less_than(b, a));\n\t\t\t\n\t\t\ta = 100; b = 100;\n\t\t\tASSERT_OR_FAIL(!details::circular_less_than(a, b));\n\t\t\tASSERT_OR_FAIL(!details::circular_less_than(b, a));\n\t\t\t\n\t\t\ta = 0; b = 1 << 15;\n\t\t\tASSERT_OR_FAIL(!details::circular_less_than(a, b));\n\t\t\tASSERT_OR_FAIL(!details::circular_less_than(b, a));\n\t\t\t\n\t\t\ta = 1; b = 1 << 15;\n\t\t\tASSERT_OR_FAIL(details::circular_less_than(a, b));\n\t\t\tASSERT_OR_FAIL(!details::circular_less_than(b, a));\n\t\t\t\n\t\t\ta = 0; b = (1 << 15) + 1;\n\t\t\tASSERT_OR_FAIL(!details::circular_less_than(a, b));\n\t\t\tASSERT_OR_FAIL(details::circular_less_than(b, a));\n\t\t\t\n\t\t\ta = 100; b = (1 << 15) + 1;\n\t\t\tASSERT_OR_FAIL(details::circular_less_than(a, b));\n\t\t\tASSERT_OR_FAIL(!details::circular_less_than(b, a));\n\t\t\t\n\t\t\ta = (1 << 15) + 7; b = 5;\n\t\t\tASSERT_OR_FAIL(details::circular_less_than(a, b));\n\t\t\tASSERT_OR_FAIL(!details::circular_less_than(b, a));\n\t\t\t\n\t\t\ta = (1 << 15) + 7; b = (1 << 15) + 5;\n\t\t\tASSERT_OR_FAIL(!details::circular_less_than(a, b));\n\t\t\tASSERT_OR_FAIL(details::circular_less_than(b, a));\n\t\t\t\n\t\t\ta = 0xFFFF; b = 0;\n\t\t\tASSERT_OR_FAIL(details::circular_less_than(a, b));\n\t\t\tASSERT_OR_FAIL(!details::circular_less_than(b, a));\n\t\t\t\n\t\t\ta = 0xFFFF; b = 0xFFF;\n\t\t\tASSERT_OR_FAIL(details::circular_less_than(a, b));\n\t\t\tASSERT_OR_FAIL(!details::circular_less_than(b, a));\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\t\n\t\n\tbool enqueue_one_explicit()\n\t{\n\t\tConcurrentQueue<int, MallocTrackingTraits> q;\n\t\tProducerToken tok(q);\n\t\t\n\t\tbool result = q.enqueue(tok, 17);\n\t\t\n\t\tASSERT_OR_FAIL(result);\n\t\treturn true;\n\t}\n\t\n\tbool enqueue_and_dequeue_one_explicit()\n\t{\n\t\tConcurrentQueue<int, MallocTrackingTraits> q;\n\t\tProducerToken tok(q);\n\t\t\n\t\tint item = 0;\n\t\tASSERT_OR_FAIL(q.enqueue(tok, 123));\n\t\tASSERT_OR_FAIL(q.try_dequeue_from_producer(tok, item));\n\t\tASSERT_OR_FAIL(item == 123);\n\t\t\n\t\treturn true;\n\t}\n\t\n\tbool enqueue_one_implicit()\n\t{\n\t\tConcurrentQueue<int, MallocTrackingTraits> q;\n\t\t\n\t\tbool result = q.enqueue(17);\n\t\t\n\t\tASSERT_OR_FAIL(result);\n\t\treturn true;\n\t}\n\t\n\tbool enqueue_and_dequeue_one_implicit()\n\t{\n\t\tConcurrentQueue<int, MallocTrackingTraits> q;\n\t\t\n\t\tint item = 0;\n\t\tASSERT_OR_FAIL(q.enqueue(123));\n\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\tASSERT_OR_FAIL(item == 123);\n\t\t\n\t\treturn true;\n\t}\n\t\n\tbool enqueue_and_dequeue_a_few()\n\t{\n\t\t// Fairly straightforward mass enqueue and dequeue\n\t\t{\n\t\t\tConcurrentQueue<int, TestTraits<16>> q;\n\t\t\tProducerToken tok(q);\n\t\t\t\n\t\t\tfor (int i = 0; i != 99999; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q.enqueue(tok, i));\n\t\t\t}\n\t\t\t\n\t\t\tint item;\n\t\t\tfor (int i = 0; i != 99999; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q.try_dequeue_from_producer(tok, item));\n\t\t\t\tASSERT_OR_FAIL(item == i);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue_from_producer(tok, item));\n\t\t}\n\t\t\n\t\t// Interleaved enqueue and dequeue (though still no threads involved)\n\t\t{\n\t\t\tConcurrentQueue<int, TestTraits<16>> q;\n\t\t\tProducerToken tok(q);\n\t\t\t\n\t\t\tint item;\n\t\t\tfor (int i = 0; i != 99999; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q.enqueue(tok, i));\n\t\t\t\tASSERT_OR_FAIL(q.enqueue(tok, i * 2));\n\t\t\t\tASSERT_OR_FAIL(q.try_dequeue_from_producer(tok, item));\n\t\t\t\tASSERT_OR_FAIL(item == (i / 2) * (i % 2 == 0 ? 1 : 2));\n\t\t\t}\n\t\t\t\n\t\t\tfor (int i = 0; i != 99999; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q.try_dequeue_from_producer(tok, item));\n\t\t\t\tASSERT_OR_FAIL(item == ((i + 99999) / 2) * (i % 2 == 1 ? 1 : 2));\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue_from_producer(tok, item));\n\t\t}\n\t\t\n\t\t// Implicit usage\n\t\t{\n\t\t\tConcurrentQueue<int, TestTraits<16>> q;\n\t\t\t\n\t\t\tfor (int i = 0; i != 99999; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q.enqueue(i));\n\t\t\t}\n\t\t\t\n\t\t\tint item;\n\t\t\tfor (int i = 0; i != 99999; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\t\tASSERT_OR_FAIL(item == i);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\t{\n\t\t\tConcurrentQueue<int, TestTraits<16>> q;\n\t\t\t\n\t\t\tint item;\n\t\t\tfor (int i = 0; i != 99999; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q.enqueue(i));\n\t\t\t\tASSERT_OR_FAIL(q.enqueue(i * 2));\n\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\t\tASSERT_OR_FAIL(item == (i / 2) * (i % 2 == 0 ? 1 : 2));\n\t\t\t}\n\t\t\t\n\t\t\tfor (int i = 0; i != 99999; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\t\tASSERT_OR_FAIL(item == ((i + 99999) / 2) * (i % 2 == 1 ? 1 : 2));\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\t\n\tbool enqueue_bulk()\n\t{\n\t\ttypedef TestTraits<2> Traits2;\n\t\ttypedef TestTraits<4> Traits4;\n\t\t\n\t\tint arr123[] = { 1, 2, 3 };\n\t\tint arr1234[] = { 1, 2, 3, 4 };\n\t\tint arr123456[] = { 1, 2, 3, 4, 5, 6 };\n\t\t\n\t\tTraits2::reset();\n\t\t{\n\t\t\t// Implicit, block allocation required\n\t\t\tConcurrentQueue<int, Traits2> q(2);\n\t\t\tASSERT_OR_FAIL(Traits2::malloc_count() == 1);\n\t\t\t\n\t\t\tq.enqueue_bulk(arr123, 3);\n\t\t\tASSERT_OR_FAIL(Traits2::malloc_count() == 4);\t\t// One for producer, one for block index, one for block\n\t\t\t\n\t\t\tint item;\n\t\t\tfor (int i = 0; i != 3; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\t\tASSERT_OR_FAIL(item == i + 1);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\tTraits4::reset();\n\t\t{\n\t\t\t// Implicit, block allocation not required (end on block boundary)\n\t\t\tConcurrentQueue<int, Traits4> q(2);\n\t\t\tASSERT_OR_FAIL(Traits4::malloc_count() == 1);\n\t\t\t\n\t\t\tq.enqueue_bulk(arr1234, 4);\n\t\t\tASSERT_OR_FAIL(Traits4::malloc_count() == 3);\t\t// One for producer, one for block index\n\t\t\t\n\t\t\tint item;\n\t\t\tfor (int i = 0; i != 4; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\t\tASSERT_OR_FAIL(item == i + 1);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\tTraits2::reset();\n\t\t{\n\t\t\t// Implicit, allocation fail\n\t\t\tConcurrentQueue<int, Traits2> q(2);\n\t\t\tASSERT_OR_FAIL(Traits2::malloc_count() == 1);\n\t\t\t\n\t\t\tASSERT_OR_FAIL(!q.try_enqueue_bulk(arr123, 3));\n\t\t\tASSERT_OR_FAIL(Traits2::malloc_count() == 3);\t\t// Still has to allocate implicit producer and block index\n\t\t\t\n\t\t\tint item;\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.try_enqueue_bulk(arr123, 2));\n\t\t\tfor (int i = 0; i != 2; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\t\tASSERT_OR_FAIL(item == i + 1);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t\t\n\t\t}\n\t\t\n\t\tTraits2::reset();\n\t\t{\n\t\t\t// Implicit, block allocation not required\n\t\t\tConcurrentQueue<int, Traits2> q(4);\n\t\t\tASSERT_OR_FAIL(Traits2::malloc_count() == 1);\n\t\t\t\n\t\t\tq.enqueue_bulk(arr1234, 4);\n\t\t\tASSERT_OR_FAIL(Traits2::malloc_count() == 3);\t\t// One for producer, one for block index\n\t\t\t\n\t\t\tint item;\n\t\t\tfor (int i = 0; i != 4; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\t\tASSERT_OR_FAIL(item == i + 1);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\tTraits4::reset();\n\t\t{\n\t\t\t// Implicit, block allocation required (end not on block boundary)\n\t\t\tConcurrentQueue<int, Traits4> q(4);\n\t\t\tASSERT_OR_FAIL(Traits4::malloc_count() == 1);\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.enqueue(0));\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.enqueue_bulk(arr1234, 4));\n\t\t\tASSERT_OR_FAIL(Traits4::malloc_count() == 4);\t\t// One for producer, one for block index, one for block\n\t\t\t\n\t\t\tint item;\n\t\t\tfor (int i = 0; i != 5; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\t\tASSERT_OR_FAIL(item == i);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\tTraits4::reset();\n\t\t{\n\t\t\t// Implicit, block allocation not required (end not on block boundary)\n\t\t\tConcurrentQueue<int, Traits4> q(5);\n\t\t\tASSERT_OR_FAIL(Traits4::malloc_count() == 1);\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.enqueue(0));\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.enqueue_bulk(arr1234, 4));\n\t\t\tASSERT_OR_FAIL(Traits4::malloc_count() == 3);\t\t// One for producer, one for block index\n\t\t\t\n\t\t\tint item;\n\t\t\tfor (int i = 0; i != 5; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\t\tASSERT_OR_FAIL(item == i);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\tTraits2::reset();\n\t\t{\n\t\t\t// Implicit, block allocation fail (end not on block boundary) -- test rewind\n\t\t\tConcurrentQueue<int, Traits2> q(4);\n\t\t\tASSERT_OR_FAIL(Traits2::malloc_count() == 1);\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.enqueue(17));\n\t\t\tASSERT_OR_FAIL(Traits2::malloc_count() == 3);\t\t// One for producer, one for block index\n\t\t\t\n\t\t\tASSERT_OR_FAIL(!q.try_enqueue_bulk(arr123456, 6));\n\t\t\tASSERT_OR_FAIL(Traits2::malloc_count() == 3);\n\t\t\t\n\t\t\tint item;\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(item == 17);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\tTraits2::reset();\n\t\t{\n\t\t\t// Implicit, enqueue nothing\n\t\t\tConcurrentQueue<int, Traits2> q(3);\n\t\t\tASSERT_OR_FAIL(Traits2::malloc_count() == 1);\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.try_enqueue_bulk(arr123, 0));\n\t\t\tASSERT_OR_FAIL(Traits2::malloc_count() == 3);\t\t// One for producer, one for block index\n\t\t\t\n\t\t\tint item;\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\t////////\n\t\t\n\t\tTraits2::reset();\n\t\t{\n\t\t\t// Explicit, block allocation required\n\t\t\tConcurrentQueue<int, Traits2> q(2);\n\t\t\tASSERT_OR_FAIL(Traits2::malloc_count() == 1);\n\t\t\t\n\t\t\tProducerToken tok(q);\n\t\t\tASSERT_OR_FAIL(Traits2::malloc_count() == 3);\t\t// One for producer, one for block index\n\t\t\t\n\t\t\tq.enqueue_bulk(tok, arr123, 3);\n\t\t\tASSERT_OR_FAIL(Traits2::malloc_count() == 4);\t\t// One for block\n\t\t\t\n\t\t\tint item;\n\t\t\tfor (int i = 0; i != 3; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\t\tASSERT_OR_FAIL(item == i + 1);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\tTraits4::reset();\n\t\t{\n\t\t\t// Explicit, block allocation not required (end on block boundary)\n\t\t\tConcurrentQueue<int, Traits4> q(2);\n\t\t\tASSERT_OR_FAIL(Traits4::malloc_count() == 1);\n\t\t\t\n\t\t\tProducerToken tok(q);\n\t\t\tASSERT_OR_FAIL(Traits4::malloc_count() == 3);\t\t// One for producer, one for block index\n\t\t\t\n\t\t\tq.enqueue_bulk(tok, arr1234, 4);\n\t\t\tASSERT_OR_FAIL(Traits4::malloc_count() == 3);\n\t\t\t\n\t\t\tint item;\n\t\t\tfor (int i = 0; i != 4; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\t\tASSERT_OR_FAIL(item == i + 1);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\tTraits2::reset();\n\t\t{\n\t\t\t// Explicit, allocation fail\n\t\t\tConcurrentQueue<int, Traits2> q(2);\n\t\t\tASSERT_OR_FAIL(Traits2::malloc_count() == 1);\n\t\t\t\n\t\t\tProducerToken tok(q);\n\t\t\tASSERT_OR_FAIL(Traits2::malloc_count() == 3);\t\t// One for producer, one for block index\n\t\t\t\n\t\t\tASSERT_OR_FAIL(!q.try_enqueue_bulk(tok, arr123, 3));\n\t\t\tASSERT_OR_FAIL(Traits2::malloc_count() == 3);\n\t\t\t\n\t\t\tint item;\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.try_enqueue_bulk(tok, arr123, 2));\n\t\t\tfor (int i = 0; i != 2; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\t\tASSERT_OR_FAIL(item == i + 1);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(Traits2::malloc_count() == 3);\n\t\t}\n\t\t\n\t\tTraits2::reset();\n\t\t{\n\t\t\t// Explicit, block allocation not required\n\t\t\tConcurrentQueue<int, Traits2> q(4);\n\t\t\tASSERT_OR_FAIL(Traits2::malloc_count() == 1);\n\t\t\t\n\t\t\tProducerToken tok(q);\n\t\t\tASSERT_OR_FAIL(Traits2::malloc_count() == 3);\t\t// One for producer, one for block index\n\t\t\t\n\t\t\tq.enqueue_bulk(tok, arr1234, 4);\n\t\t\tASSERT_OR_FAIL(Traits2::malloc_count() == 3);\n\t\t\t\n\t\t\tint item;\n\t\t\tfor (int i = 0; i != 4; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\t\tASSERT_OR_FAIL(item == i + 1);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\tTraits4::reset();\n\t\t{\n\t\t\t// Explicit, block allocation required (end not on block boundary)\n\t\t\tConcurrentQueue<int, Traits4> q(4);\n\t\t\tASSERT_OR_FAIL(Traits4::malloc_count() == 1);\n\t\t\t\n\t\t\tProducerToken tok(q);\n\t\t\tASSERT_OR_FAIL(Traits4::malloc_count() == 3);\t\t// One for producer, one for block index\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.enqueue(tok, 0));\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.enqueue_bulk(tok, arr1234, 4));\n\t\t\tASSERT_OR_FAIL(Traits4::malloc_count() == 4);\t\t// One for block\n\t\t\t\n\t\t\tint item;\n\t\t\tfor (int i = 0; i != 5; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\t\tASSERT_OR_FAIL(item == i);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\tTraits4::reset();\n\t\t{\n\t\t\t// Explicit, block allocation not required (end not on block boundary)\n\t\t\tConcurrentQueue<int, Traits4> q(5);\n\t\t\tASSERT_OR_FAIL(Traits4::malloc_count() == 1);\n\t\t\t\n\t\t\tProducerToken tok(q);\n\t\t\tASSERT_OR_FAIL(Traits4::malloc_count() == 3);\t\t// One for producer, one for block index\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.enqueue(tok, 0));\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.enqueue_bulk(tok, arr1234, 4));\n\t\t\tASSERT_OR_FAIL(Traits4::malloc_count() == 3);\n\t\t\t\n\t\t\tint item;\n\t\t\tfor (int i = 0; i != 5; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\t\tASSERT_OR_FAIL(item == i);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\tTraits2::reset();\n\t\t{\n\t\t\t// Explicit, block allocation fail (end not on block boundary) -- test rewind\n\t\t\tConcurrentQueue<int, Traits2> q(4);\n\t\t\tASSERT_OR_FAIL(Traits2::malloc_count() == 1);\n\t\t\t\n\t\t\tProducerToken tok(q);\n\t\t\tASSERT_OR_FAIL(Traits2::malloc_count() == 3);\t\t// One for producer, one for block index\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.enqueue(tok, 17));\n\t\t\tASSERT_OR_FAIL(Traits2::malloc_count() == 3);\n\t\t\t\n\t\t\tASSERT_OR_FAIL(!q.try_enqueue_bulk(tok, arr123456, 6));\n\t\t\tASSERT_OR_FAIL(Traits2::malloc_count() == 3);\n\t\t\t\n\t\t\tint item;\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(item == 17);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\tTraits2::reset();\n\t\t{\n\t\t\t// Explicit, enqueue nothing\n\t\t\tConcurrentQueue<int, Traits2> q(3);\n\t\t\tASSERT_OR_FAIL(Traits2::malloc_count() == 1);\n\t\t\t\n\t\t\tProducerToken tok(q);\n\t\t\tASSERT_OR_FAIL(Traits2::malloc_count() == 3);\t\t// One for producer, one for block index\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.try_enqueue_bulk(tok, arr123, 0));\n\t\t\tASSERT_OR_FAIL(Traits2::malloc_count() == 3);\n\t\t\t\n\t\t\tint item;\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.enqueue(tok, 17));\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(item == 17);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\tTraits4::reset();\n\t\t{\n\t\t\t// Explicit, re-use empty blocks\n\t\t\tConcurrentQueue<int, Traits4> q(8);\n\t\t\tASSERT_OR_FAIL(Traits4::malloc_count() == 1);\n\t\t\t\n\t\t\tProducerToken tok(q);\n\t\t\tASSERT_OR_FAIL(Traits4::malloc_count() == 3);\t\t// One for producer, one for block index\n\t\t\t\n\t\t\tfor (int i = 0; i != 5; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q.enqueue(tok, i));\n\t\t\t}\n\t\t\tint item;\n\t\t\tfor (int i = 0; i != 5; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\t\tASSERT_OR_FAIL(item == i);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t\t\n\t\t\tASSERT_OR_FAIL(Traits4::malloc_count() == 3);\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.enqueue_bulk(tok, arr123456, 6));\n\t\t\tASSERT_OR_FAIL(Traits4::malloc_count() == 3);\n\t\t\t\n\t\t\tfor (int i = 0; i != 6; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\t\tASSERT_OR_FAIL(item == i + 1);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(Traits4::malloc_count() == 3);\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\t\n\tbool block_alloc()\n\t{\n\t\ttypedef TestTraits<2> Traits;\n\t\ttypedef TestTraits<2, 32, true> RecycleTraits;\n\t\tTraits::reset();\n\t\t\n\t\t// Explicit\n\t\t{\n\t\t\tConcurrentQueue<int, Traits> q(7);\n\t\t\tASSERT_OR_FAIL(q.initialBlockPoolSize == 4);\n\t\t\t\n\t\t\tASSERT_OR_FAIL(Traits::malloc_count() == 1);\n\t\t\tASSERT_OR_FAIL(Traits::free_count() == 0);\n\t\t\t\n\t\t\t{\n\t\t\t\tProducerToken tok(q);\n\t\t\t\tASSERT_OR_FAIL(Traits::malloc_count() == 3);\t\t// one for producer, one for its block index\n\t\t\t\tASSERT_OR_FAIL(Traits::free_count() == 0);\n\t\t\t\t\n\t\t\t\t// Enqueue one item too many (force extra block allocation)\n\t\t\t\tfor (int i = 0; i != 9; ++i) {\n\t\t\t\t\tASSERT_OR_FAIL(q.enqueue(tok, i));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tASSERT_OR_FAIL(Traits::malloc_count() == 4);\n\t\t\t\tASSERT_OR_FAIL(Traits::free_count() == 0);\n\t\t\t\t\n\t\t\t\t// Still room for one more...\n\t\t\t\tASSERT_OR_FAIL(q.enqueue(tok, 9));\n\t\t\t\tASSERT_OR_FAIL(Traits::malloc_count() == 4);\n\t\t\t\tASSERT_OR_FAIL(Traits::free_count() == 0);\n\t\t\t\t\n\t\t\t\t// No more room without further allocations\n\t\t\t\tASSERT_OR_FAIL(!q.try_enqueue(tok, 10));\n\t\t\t\tASSERT_OR_FAIL(Traits::malloc_count() == 4);\n\t\t\t\tASSERT_OR_FAIL(Traits::free_count() == 0);\n\t\t\t\t\n\t\t\t\t// Check items were enqueued properly\n\t\t\t\tint item;\n\t\t\t\tfor (int i = 0; i != 10; ++i) {\n\t\t\t\t\tASSERT_OR_FAIL(q.try_dequeue_from_producer(tok, item));\n\t\t\t\t\tASSERT_OR_FAIL(item == i);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Queue should be empty, but not freed\n\t\t\t\tASSERT_OR_FAIL(!q.try_dequeue_from_producer(tok, item));\n\t\t\t\tASSERT_OR_FAIL(Traits::free_count() == 0);\n\t\t\t}\n\t\t\t// Explicit producers are recycled, so block should still be allocated\n\t\t\tASSERT_OR_FAIL(Traits::free_count() == 0);\n\t\t}\n\t\t\n\t\tASSERT_OR_FAIL(Traits::malloc_count() == 4);\n\t\tASSERT_OR_FAIL(Traits::free_count() == 4);\n\t\t\n\t\t// Implicit\n\t\tTraits::reset();\n\t\t{\n\t\t\tConcurrentQueue<int, Traits> q(7);\n\t\t\tASSERT_OR_FAIL(q.initialBlockPoolSize == 4);\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.enqueue(39));\n\t\t\t\n\t\t\tASSERT_OR_FAIL(Traits::malloc_count() == 3);\t\t// one for producer, one for its block index\n\t\t\tASSERT_OR_FAIL(Traits::free_count() == 0);\n\t\t\t\n\t\t\t// Enqueue one item too many (force extra block allocation)\n\t\t\tfor (int i = 0; i != 8; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q.enqueue(i));\n\t\t\t}\n\t\t\t\n\t\t\tASSERT_OR_FAIL(Traits::malloc_count() == 4);\n\t\t\tASSERT_OR_FAIL(Traits::free_count() == 0);\n\t\t\t\n\t\t\t// Still room for one more...\n\t\t\tASSERT_OR_FAIL(q.enqueue(8));\n\t\t\tASSERT_OR_FAIL(Traits::malloc_count() == 4);\n\t\t\tASSERT_OR_FAIL(Traits::free_count() == 0);\n\t\t\t\n\t\t\t// No more room without further allocations\n\t\t\tASSERT_OR_FAIL(!q.try_enqueue(9));\n\t\t\tASSERT_OR_FAIL(Traits::malloc_count() == 4);\n\t\t\tASSERT_OR_FAIL(Traits::free_count() == 0);\n\t\t\t\n\t\t\t// Check items were enqueued properly\n\t\t\tint item;\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(item == 39);\n\t\t\tfor (int i = 0; i != 9; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\t\tASSERT_OR_FAIL(item == i);\n\t\t\t}\n\t\t\t\n\t\t\t// Queue should be empty, and extra block freed\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(Traits::free_count() == 1);\n\t\t}\n\t\t\n\t\tASSERT_OR_FAIL(Traits::malloc_count() == 4);\n\t\tASSERT_OR_FAIL(Traits::free_count() == 4);\n\t\t\n\t\t// Implicit\n\t\tRecycleTraits::reset();\n\t\t{\n\t\t\tConcurrentQueue<int, RecycleTraits> q(7);\n\t\t\tASSERT_OR_FAIL(q.initialBlockPoolSize == 4);\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.enqueue(39));\n\t\t\t\n\t\t\tASSERT_OR_FAIL(RecycleTraits::malloc_count() == 3);\t\t// one for producer, one for its block index\n\t\t\tASSERT_OR_FAIL(RecycleTraits::free_count() == 0);\n\t\t\t\n\t\t\t// Enqueue one item too many (force extra block allocation)\n\t\t\tfor (int i = 0; i != 8; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q.enqueue(i));\n\t\t\t}\n\t\t\t\n\t\t\tASSERT_OR_FAIL(RecycleTraits::malloc_count() == 4);\n\t\t\tASSERT_OR_FAIL(RecycleTraits::free_count() == 0);\n\t\t\t\n\t\t\t// Still room for one more...\n\t\t\tASSERT_OR_FAIL(q.enqueue(8));\n\t\t\tASSERT_OR_FAIL(RecycleTraits::malloc_count() == 4);\n\t\t\tASSERT_OR_FAIL(RecycleTraits::free_count() == 0);\n\t\t\t\n\t\t\t// No more room without further allocations\n\t\t\tASSERT_OR_FAIL(!q.try_enqueue(9));\n\t\t\tASSERT_OR_FAIL(RecycleTraits::malloc_count() == 4);\n\t\t\tASSERT_OR_FAIL(RecycleTraits::free_count() == 0);\n\t\t\t\n\t\t\t// Check items were enqueued properly\n\t\t\tint item;\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(item == 39);\n\t\t\tfor (int i = 0; i != 9; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\t\tASSERT_OR_FAIL(item == i);\n\t\t\t}\n\t\t\t\n\t\t\t// Queue should be empty, but extra block not freed\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(RecycleTraits::free_count() == 0);\n\t\t}\n\t\tASSERT_OR_FAIL(RecycleTraits::malloc_count() == 4);\n\t\tASSERT_OR_FAIL(RecycleTraits::free_count() == 4);\n\n\t\t// Super-aligned\n\t\tTraits::reset();\n\t\tVeryAligned::errors = 0;\n\t\t{\n\t\t\tConcurrentQueue<VeryAligned, Traits> q(7);\n\t\t\tASSERT_OR_FAIL(q.enqueue(39));\n\n\t\t\tASSERT_OR_FAIL(Traits::malloc_count() == 3);\t\t// one for producer, one for its block index\n\t\t\tASSERT_OR_FAIL(Traits::free_count() == 0);\n\t\t\tASSERT_OR_FAIL(VeryAligned::errors == 0);\n\n\t\t\t// Enqueue one item too many (force extra block allocation)\n\t\t\tfor (int i = 0; i != 8; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q.enqueue(i));\n\t\t\t\tASSERT_OR_FAIL(VeryAligned::errors == 0);\n\t\t\t}\n\n\t\t\tASSERT_OR_FAIL(Traits::malloc_count() == 4);\n\t\t\tASSERT_OR_FAIL(Traits::free_count() == 0);\n\n\t\t\t// Still room for one more...\n\t\t\tASSERT_OR_FAIL(q.enqueue(8));\n\t\t\tASSERT_OR_FAIL(Traits::malloc_count() == 4);\n\t\t\tASSERT_OR_FAIL(Traits::free_count() == 0);\n\t\t\tASSERT_OR_FAIL(VeryAligned::errors == 0);\n\n\t\t\t// No more room without further allocations\n\t\t\tASSERT_OR_FAIL(!q.try_enqueue(9));\n\t\t\tASSERT_OR_FAIL(Traits::malloc_count() == 4);\n\t\t\tASSERT_OR_FAIL(Traits::free_count() == 0);\n\t\t\tASSERT_OR_FAIL(VeryAligned::errors == 0);\n\n\t\t\t// Check items were enqueued properly\n\t\t\tVeryAligned item;\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(item.value == 39);\n\t\t\tfor (int i = 0; i != 9; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\t\tASSERT_OR_FAIL(item.value == i);\n\t\t\t\tASSERT_OR_FAIL(VeryAligned::errors == 0);\n\t\t\t}\n\n\t\t\t// Queue should be empty, and extra block freed\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(Traits::free_count() == 1);\n\t\t\tASSERT_OR_FAIL(VeryAligned::errors == 0);\n\t\t}\n\n\t\tASSERT_OR_FAIL(Traits::malloc_count() == 4);\n\t\tASSERT_OR_FAIL(Traits::free_count() == 4);\n\n\t\treturn true;\n\t}\n\t\n\tbool token_move()\n\t{\n\t\ttypedef TestTraits<16> Traits;\n\t\tTraits::reset();\n\t\t\n\t\t{\n\t\t\tConcurrentQueue<int, Traits> q;\n\t\t\tProducerToken t0(q);\n\t\t\t\n\t\t\tASSERT_OR_FAIL(t0.valid());\n\t\t\t\n\t\t\tProducerToken t1(std::move(t0));\n\t\t\tASSERT_OR_FAIL(t1.valid());\n\t\t\tASSERT_OR_FAIL(!t0.valid());\n\t\t\t\n\t\t\tt1 = std::move(t1);\n\t\t\tASSERT_OR_FAIL(t1.valid());\n\t\t\tASSERT_OR_FAIL(!t0.valid());\n\t\t\t\n\t\t\tProducerToken t2(q);\n\t\t\tt2 = std::move(t1);\n\t\t\tASSERT_OR_FAIL(t2.valid());\n\t\t\tASSERT_OR_FAIL(t1.valid());\n\t\t\tASSERT_OR_FAIL(!t0.valid());\n\t\t\t\n\t\t\tt0 = std::move(t1);\n\t\t\tASSERT_OR_FAIL(t2.valid());\n\t\t\tASSERT_OR_FAIL(!t1.valid());\n\t\t\tASSERT_OR_FAIL(t0.valid());\n\t\t}\n\n\t\tASSERT_OR_FAIL(Traits::malloc_count() == 5);\t\t// 2 for each producer + 1 for initial block pool\n\t\tASSERT_OR_FAIL(Traits::free_count() == Traits::malloc_count());\n\t\t\n\t\treturn true;\n\t}\n\t\n\tbool multi_producers()\n\t{\n\t\ttypedef TestTraits<16> Traits;\n\t\tTraits::reset();\n\t\t\n\t\t{\n\t\t\tConcurrentQueue<int, Traits> q;\n\t\t\tProducerToken t0(q);\n\t\t\tProducerToken t1(q);\n\t\t\tProducerToken t2(q);\n\t\t\tProducerToken t3(q);\n\t\t\tProducerToken t4(q);\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.enqueue(t0, 0));\n\t\t\tASSERT_OR_FAIL(q.enqueue(t1, 1));\n\t\t\tASSERT_OR_FAIL(q.enqueue(t2, 2));\n\t\t\tASSERT_OR_FAIL(q.enqueue(t3, 3));\n\t\t\tASSERT_OR_FAIL(q.enqueue(t4, 4));\n\t\t\t\n\t\t\tint item;\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_from_producer(t0, item) && item == 0 && !q.try_dequeue_from_producer(t0, item));\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_from_producer(t1, item) && item == 1 && !q.try_dequeue_from_producer(t1, item));\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_from_producer(t2, item) && item == 2 && !q.try_dequeue_from_producer(t2, item));\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_from_producer(t3, item) && item == 3 && !q.try_dequeue_from_producer(t3, item));\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_from_producer(t4, item) && item == 4 && !q.try_dequeue_from_producer(t4, item));\n\t\t}\n\t\t\n\t\tASSERT_OR_FAIL(Traits::malloc_count() == 11);\t\t// 2 for each producer + 1 for initial block pool\n\t\tASSERT_OR_FAIL(Traits::free_count() == Traits::malloc_count());\n\t\t\n\t\t// Implicit\n\t\tTraits::reset();\n\t\t{\n\t\t\tConcurrentQueue<int, Traits> q;\n\t\t\tstd::atomic<bool> success[5];\n\t\t\tstd::atomic<int> done(0);\n\t\t\t\n\t\t\tfor (int i = 0; i != 5; ++i) {\n\t\t\t\tsuccess[i].store(false, std::memory_order_relaxed);\n\t\t\t}\n\t\t\t\n\t\t\tfor (int i = 0; i != 5; ++i) {\n\t\t\t\tSimpleThread t([&](int j) {\n\t\t\t\t\tsuccess[j].store(q.enqueue(j), std::memory_order_relaxed);\n\t\t\t\t\tdone.fetch_add(1, std::memory_order_release);\n\t\t\t\t}, i);\n\t\t\t\tt.join();\n\t\t\t}\n\t\t\twhile (done.load(std::memory_order_acquire) != 5) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t\n\t\t\tfor (int i = 0; i != 5; ++i) {\n\t\t\t\tASSERT_OR_FAIL(success[i].load(std::memory_order_relaxed));\n\t\t\t}\n\t\t\t\n\t\t\t// Cannot rely on order that producers are added (there's a race condition), only that they are all there somewhere.\n\t\t\t// Also, all items may not be visible to this thread yet.\n\t\t\tbool itemDequeued[5] = { false, false, false, false, false };\n\t\t\tint item;\n\t\t\tfor (int i = 0; i != 5;) {\n\t\t\t\tif (q.try_dequeue(item)) {\n\t\t\t\t\titemDequeued[item] = true;\n\t\t\t\t\t++i;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (int i = 0; i != 5; ++i) {\n\t\t\t\tASSERT_OR_FAIL(itemDequeued[i]);\n\t\t\t}\n\t\t}\n\t\t\n\t\tASSERT_OR_FAIL(Traits::malloc_count() <= 11 && Traits::malloc_count() >= 3);\t\t// 2 for each producer (depending on thread ID re-use) + 1 for initial block pool\n\t\tASSERT_OR_FAIL(Traits::free_count() == Traits::malloc_count());\n\t\t\n\t\treturn true;\n\t}\n\t\n\tbool producer_reuse()\n\t{\n\t\ttypedef TestTraits<16> Traits;\n\t\t\n\t\tTraits::reset();\n\t\t{\n\t\t\t// Explicit\n\t\t\tConcurrentQueue<int, Traits> q;\n\t\t\t\n\t\t\t{\n\t\t\t\tProducerToken t0(q);\n\t\t\t}\n\t\t\t\n\t\t\t{\n\t\t\t\tProducerToken t1(q);\n\t\t\t}\n\t\t\t\n\t\t\t{\n\t\t\t\tProducerToken t2(q);\n\t\t\t\tProducerToken t3(q);\n\t\t\t\tProducerToken t4(q);\n\t\t\t\tProducerToken t5(q);\n\t\t\t}\n\t\t\t\n\t\t\t{\n\t\t\t\tProducerToken t6(q);\n\t\t\t\tProducerToken t7(q);\n\t\t\t}\n\t\t\t\n\t\t\t{\n\t\t\t\tProducerToken t8(q);\n\t\t\t\tProducerToken t9(q);\n\t\t\t}\n\n\t\t\t\n\t\t\t{\n\t\t\t\tProducerToken t10(q);\n\t\t\t\tProducerToken t11(q);\n\t\t\t}\n\t\t}\n\t\t\n\t\tASSERT_OR_FAIL(Traits::malloc_count() == 9);\t\t// 2 for max number of live producers + 1 for initial block pool\n\t\tASSERT_OR_FAIL(Traits::free_count() == Traits::malloc_count());\n\t\t\n#ifdef MOODYCAMEL_CPP11_THREAD_LOCAL_SUPPORTED\n\t\tTraits::reset();\n\t\t{\n\t\t\t// Implicit\n\t\t\tconst int MAX_THREADS = 48;\n\t\t\tConcurrentQueue<int, Traits> q(Traits::BLOCK_SIZE * (MAX_THREADS + 1));\n\t\t\tASSERT_OR_FAIL(Traits::malloc_count() == 1);\t\t// Initial block pool\n\t\t\t\n\t\t\tSimpleThread t0([&]() { q.enqueue(0); });\n\t\t\tt0.join();\n\t\t\tASSERT_OR_FAIL(Traits::malloc_count() == 3);\t\t// Implicit producer\n\t\t\t\n\t\t\tSimpleThread t1([&]() { q.enqueue(1); });\n\t\t\tt1.join();\n\t\t\tASSERT_OR_FAIL(Traits::malloc_count() == 3);\n\t\t\t\n\t\t\tSimpleThread t2([&]() { q.enqueue(2); });\n\t\t\tt2.join();\n\t\t\tASSERT_OR_FAIL(Traits::malloc_count() == 3);\n\t\t\t\n\t\t\tq.enqueue(3);\n\t\t\tASSERT_OR_FAIL(Traits::malloc_count() == 3);\n\t\t\t\n\t\t\tint item;\n\t\t\tint i = 0;\n\t\t\twhile (q.try_dequeue(item)) {\n\t\t\t\tASSERT_OR_FAIL(item == i);\n\t\t\t\t++i;\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(i == 4);\n\t\t\tASSERT_OR_FAIL(Traits::malloc_count() == 3);\n\t\t\t\n\t\t\tstd::vector<SimpleThread> threads(MAX_THREADS);\n\t\t\tfor (int rep = 0; rep != 2; ++rep) {\n\t\t\t\tfor (std::size_t tid = 0; tid != threads.size(); ++tid) {\n\t\t\t\t\tthreads[tid] = SimpleThread([&](std::size_t tid) {\n\t\t\t\t\t\tfor (volatile int i = 0; i != 4096; ++i) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tq.enqueue((int)tid);\n\t\t\t\t\t\tfor (volatile int i = 0; i != 4096; ++i) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}, tid);\n\t\t\t\t}\n\t\t\t\tfor (std::size_t tid = 0; tid != threads.size(); ++tid) {\n\t\t\t\t\tthreads[tid].join();\n\t\t\t\t}\n\t\t\t\tstd::vector<bool> seenIds(threads.size());\n\t\t\t\tfor (std::size_t i = 0; i != threads.size(); ++i) {\n\t\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\t\t\tASSERT_OR_FAIL(!seenIds[item]);\n\t\t\t\t\tseenIds[item] = true;\n\t\t\t\t}\n\t\t\t\tfor (std::size_t i = 0; i != seenIds.size(); ++i) {\n\t\t\t\t\tASSERT_OR_FAIL(seenIds[i]);\n\t\t\t\t}\n\t\t\t\tASSERT_OR_FAIL(Traits::malloc_count() <= 2 * MAX_THREADS + 1);\n\t\t\t}\n\t\t}\n\t\tASSERT_OR_FAIL(Traits::free_count() == Traits::malloc_count());\t\n\t\t\n\t\t\n\t\tTraits::reset();\n\t\t{\n\t\t\t// Test many threads and implicit queues being created and destroyed concurrently\n\t\t\tstd::vector<SimpleThread> threads(32);\n\t\t\tstd::vector<bool> success(threads.size(), true);\n\t\t\tfor (std::size_t tid = 0; tid != threads.size(); ++tid) {\n\t\t\t\tthreads[tid] = SimpleThread([&](std::size_t tid) {\n\t\t\t\t\tfor (int i = 0; i != 5; ++i) {\n\t\t\t\t\t\tConcurrentQueue<int, MallocTrackingTraits> q(1);\n\t\t\t\t\t\tq.enqueue(i);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tConcurrentQueue<int, MallocTrackingTraits> q(15);\n\t\t\t\t\tfor (int i = 0; i != 100; ++i) {\n\t\t\t\t\t\tq.enqueue(i);\n\t\t\t\t\t}\n\t\t\t\t\tint item;\n\t\t\t\t\tfor (int i = 0; i != 100; ++i) {\n\t\t\t\t\t\tif (!q.try_dequeue(item) || item != i) {\n\t\t\t\t\t\t\tsuccess[tid] = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (q.size_approx() != 0) {\n\t\t\t\t\t\tsuccess[tid] = false;\n\t\t\t\t\t}\n\t\t\t\t}, tid);\n\t\t\t}\n\t\t\tfor (std::size_t tid = 0; tid != threads.size(); ++tid) {\n\t\t\t\tthreads[tid].join();\n\t\t\t\tASSERT_OR_FAIL(success[tid]);\n\t\t\t}\n\t\t}\n\t\tASSERT_OR_FAIL(Traits::free_count() == Traits::malloc_count());\t\n#endif\n\t\t\n\t\treturn true;\n\t}\n\t\n\tbool block_reuse()\n\t{\n\t\tint item;\n\t\t\n\t\ttypedef TestTraits<4> SmallBlocks;\n\t\tSmallBlocks::reset();\n\t\t{\n\t\t\tConcurrentQueue<int, SmallBlocks> q(8);\t\t// 2 blocks\n\t\t\tProducerToken t(q);\n\t\t\t\n\t\t\tfor (int j = 0; j != 3; ++j) {\n\t\t\t\tfor (int i = 0; i != 4; ++i) {\n\t\t\t\t\tASSERT_OR_FAIL(q.enqueue(t, i));\n\t\t\t\t}\n\t\t\t\tfor (int i = 0; i != 4; ++i) {\n\t\t\t\t\tASSERT_OR_FAIL(q.try_dequeue_from_producer(t, item));\n\t\t\t\t\tASSERT_OR_FAIL(item == i);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfor (int i = 0; i != 8; ++i) {\n\t\t\t\t\tASSERT_OR_FAIL(q.enqueue(t, i));\n\t\t\t\t}\n\t\t\t\tfor (int i = 0; i != 4; ++i) {\n\t\t\t\t\tASSERT_OR_FAIL(q.try_dequeue_from_producer(t, item));\n\t\t\t\t\tASSERT_OR_FAIL(item == i);\n\t\t\t\t}\n\t\t\t\tfor (int i = 0; i != 4; ++i) {\n\t\t\t\t\tASSERT_OR_FAIL(q.enqueue(t, i));\n\t\t\t\t}\n\t\t\t\tfor (int i = 0; i != 8; ++i) {\n\t\t\t\t\tASSERT_OR_FAIL(q.try_dequeue_from_producer(t, item));\n\t\t\t\t\tASSERT_OR_FAIL(item == ((i + 4) & 7));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tASSERT_OR_FAIL(!q.try_dequeue_from_producer(t, item));\n\t\t\t}\n\t\t}\n\t\t\n\t\tASSERT_OR_FAIL(SmallBlocks::malloc_count() == 3);\n\t\tASSERT_OR_FAIL(SmallBlocks::free_count() == SmallBlocks::malloc_count());\n\t\t\n\t\t\n\t\ttypedef TestTraits<8192> HugeBlocks;\n\t\tHugeBlocks::reset();\n\t\t{\n\t\t\tConcurrentQueue<int, HugeBlocks> q(8192 * 2);\t\t// 2 blocks\n\t\t\tProducerToken t(q);\n\t\t\t\n\t\t\tfor (int j = 0; j != 3; ++j) {\n\t\t\t\tfor (int i = 0; i != 8192; ++i) {\n\t\t\t\t\tASSERT_OR_FAIL(q.enqueue(t, i));\n\t\t\t\t}\n\t\t\t\tfor (int i = 0; i != 8192; ++i) {\n\t\t\t\t\tASSERT_OR_FAIL(q.try_dequeue_from_producer(t, item));\n\t\t\t\t\tASSERT_OR_FAIL(item == i);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfor (int i = 0; i != 8192 * 2; ++i) {\n\t\t\t\t\tASSERT_OR_FAIL(q.enqueue(t, i));\n\t\t\t\t}\n\t\t\t\tfor (int i = 0; i != 8192; ++i) {\n\t\t\t\t\tASSERT_OR_FAIL(q.try_dequeue_from_producer(t, item));\n\t\t\t\t\tASSERT_OR_FAIL(item == i);\n\t\t\t\t}\n\t\t\t\tfor (int i = 0; i != 8192; ++i) {\n\t\t\t\t\tASSERT_OR_FAIL(q.enqueue(t, i));\n\t\t\t\t}\n\t\t\t\tfor (int i = 0; i != 8192 * 2; ++i) {\n\t\t\t\t\tASSERT_OR_FAIL(q.try_dequeue_from_producer(t, item));\n\t\t\t\t\tASSERT_OR_FAIL(item == ((i + 8192) & (8192 * 2 - 1)));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tASSERT_OR_FAIL(!q.try_dequeue_from_producer(t, item));\n\t\t\t}\n\t\t}\n\t\t\n\t\tASSERT_OR_FAIL(HugeBlocks::malloc_count() == 3);\n\t\tASSERT_OR_FAIL(HugeBlocks::free_count() == HugeBlocks::malloc_count());\n\t\t\n\t\t\n\t\t// Implicit\n\t\tSmallBlocks::reset();\n\t\t{\n\t\t\tConcurrentQueue<int, SmallBlocks> q(8);\t\t// 2 blocks\n\t\t\t\n\t\t\tfor (int j = 0; j != 3; ++j) {\n\t\t\t\tfor (int i = 0; i != 4; ++i) {\n\t\t\t\t\tASSERT_OR_FAIL(q.enqueue(i));\n\t\t\t\t}\n\t\t\t\tfor (int i = 0; i != 4; ++i) {\n\t\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\t\t\tASSERT_OR_FAIL(item == i);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfor (int i = 0; i != 8; ++i) {\n\t\t\t\t\tASSERT_OR_FAIL(q.enqueue(i));\n\t\t\t\t}\n\t\t\t\tfor (int i = 0; i != 4; ++i) {\n\t\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\t\t\tASSERT_OR_FAIL(item == i);\n\t\t\t\t}\n\t\t\t\tfor (int i = 0; i != 4; ++i) {\n\t\t\t\t\tASSERT_OR_FAIL(q.enqueue(i));\n\t\t\t\t}\n\t\t\t\tfor (int i = 0; i != 8; ++i) {\n\t\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\t\t\tASSERT_OR_FAIL(item == ((i + 4) & 7));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t\t}\n\t\t}\n\t\t\n\t\tASSERT_OR_FAIL(SmallBlocks::malloc_count() == 3);\n\t\tASSERT_OR_FAIL(SmallBlocks::free_count() == SmallBlocks::malloc_count());\n\t\t\n\t\tHugeBlocks::reset();\n\t\t{\n\t\t\tConcurrentQueue<int, HugeBlocks> q(8192 * 2);\t\t// 2 blocks\n\t\t\t\n\t\t\tfor (int j = 0; j != 3; ++j) {\n\t\t\t\tfor (int i = 0; i != 8192; ++i) {\n\t\t\t\t\tASSERT_OR_FAIL(q.enqueue(i));\n\t\t\t\t}\n\t\t\t\tfor (int i = 0; i != 8192; ++i) {\n\t\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\t\t\tASSERT_OR_FAIL(item == i);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfor (int i = 0; i != 8192 * 2; ++i) {\n\t\t\t\t\tASSERT_OR_FAIL(q.enqueue(i));\n\t\t\t\t}\n\t\t\t\tfor (int i = 0; i != 8192; ++i) {\n\t\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\t\t\tASSERT_OR_FAIL(item == i);\n\t\t\t\t}\n\t\t\t\tfor (int i = 0; i != 8192; ++i) {\n\t\t\t\t\tASSERT_OR_FAIL(q.enqueue(i));\n\t\t\t\t}\n\t\t\t\tfor (int i = 0; i != 8192 * 2; ++i) {\n\t\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\t\t\tASSERT_OR_FAIL(item == ((i + 8192) & (8192 * 2 - 1)));\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t\t}\n\t\t}\n\t\t\n\t\tASSERT_OR_FAIL(HugeBlocks::malloc_count() == 3);\n\t\tASSERT_OR_FAIL(HugeBlocks::free_count() == HugeBlocks::malloc_count());\n\t\t\n\t\treturn true;\n\t}\n\t\n\tbool block_recycling()\n\t{\n\t\ttypedef TestTraits<4> SmallBlocks;\n\t\tSmallBlocks::reset();\n\t\t\n\t\tConcurrentQueue<int, SmallBlocks> q(24);\t\t// 6 blocks\n\t\tSimpleThread threads[4];\n\t\tstd::atomic<bool> success(true);\n\t\t\n\t\tfor (int i = 0; i != 4; ++i) {\n\t\t\tthreads[i] = SimpleThread([&](int i) {\n\t\t\t\tint item;\n\t\t\t\tint next = 0;\n\t\t\t\tint prevItems[4] = { -1, -1, -1, -1 };\n\t\t\t\tfor (int successfulEnqueues = 0; successfulEnqueues < 10000;) {\n\t\t\t\t\tfor (int j = 0; j != 12; ++j) {\n\t\t\t\t\t\tif (q.try_enqueue((i << 28) | next++)) {\n\t\t\t\t\t\t\t++successfulEnqueues;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor (int j = 0; j != 12; ++j) {\n\t\t\t\t\t\tif (q.try_dequeue(item)) {\n\t\t\t\t\t\t\tif ((item & 0x0FFFFFFF) <= prevItems[item >> 28]) {\n\t\t\t\t\t\t\t\tsuccess.store(false, std::memory_order_relaxed);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tprevItems[item >> 28] = item & 0x0FFFFFFF;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, i);\n\t\t}\n\t\tfor (int i = 0; i != 4; ++i) {\n\t\t\tthreads[i].join();\n\t\t}\n\t\t\n\t\tint item;\n\t\tint prevItems[4] = { -1, -1, -1, -1 };\n\t\twhile (q.try_dequeue(item)) {\n\t\t\tASSERT_OR_FAIL((item & 0x0FFFFFFF) > prevItems[item >> 28]);\n\t\t\tprevItems[item >> 28] = item & 0x0FFFFFFF;\n\t\t}\n\t\t\n\t\tASSERT_OR_FAIL(success.load(std::memory_order_relaxed));\n\t\t\n\t\treturn true;\n\t}\n\t\n\tbool leftovers_destroyed()\n\t{\n\t\ttypedef TestTraits<4> Traits;\n\t\tTraits::reset();\n\t\tFoo::reset();\n\t\t{\n\t\t\tConcurrentQueue<Foo, Traits> q(4);\t\t// One block\n\t\t\tProducerToken t(q);\n\t\t\t\n\t\t\tFoo item;\n\t\t\tq.enqueue(t, Foo());\n\t\t\tq.enqueue(t, Foo());\n\t\t\tq.enqueue(t, Foo());\n\t\t\tq.try_dequeue_from_producer(t, item);\n\t\t}\n\t\tASSERT_OR_FAIL(Foo::createCount() == 4);\n\t\tASSERT_OR_FAIL(Foo::destroyCount() == 7);\n\t\tASSERT_OR_FAIL(Foo::destroyedInOrder());\n\t\t\n\t\tTraits::reset();\n\t\tFoo::reset();\n\t\t{\n\t\t\tConcurrentQueue<Foo, Traits> q(4);\t\t// One block\n\t\t\tProducerToken t(q);\n\t\t\t\n\t\t\tq.enqueue(t, Foo());\n\t\t\tq.enqueue(t, Foo());\n\t\t\tq.enqueue(t, Foo());\n\t\t\tq.enqueue(t, Foo());\n\t\t}\n\t\tASSERT_OR_FAIL(Foo::createCount() == 4);\n\t\tASSERT_OR_FAIL(Foo::destroyCount() == 8);\n\t\tASSERT_OR_FAIL(Foo::destroyedInOrder());\n\t\t\n\t\tTraits::reset();\n\t\tFoo::reset();\n\t\t{\n\t\t\tConcurrentQueue<Foo, Traits> q(8);\t\t// Two blocks\n\t\t\tProducerToken t(q);\n\t\t\t\n\t\t\tfor (int i = 0; i != 8; ++i) {\n\t\t\t\tq.enqueue(t, Foo());\n\t\t\t}\n\t\t}\n\t\tASSERT_OR_FAIL(Foo::createCount() == 8);\n\t\tASSERT_OR_FAIL(Foo::destroyCount() == 16);\n\t\tASSERT_OR_FAIL(Foo::destroyedInOrder());\n\t\t\n\t\tTraits::reset();\n\t\tFoo::reset();\n\t\t{\n\t\t\tConcurrentQueue<Foo, Traits> q(12);\t\t// Three blocks\n\t\t\tProducerToken t(q);\n\t\t\t\n\t\t\t// Last block only partially full\n\t\t\tfor (int i = 0; i != 10; ++i) {\n\t\t\t\tq.enqueue(t, Foo());\n\t\t\t}\n\t\t\t\n\t\t\t// First block only partially full\n\t\t\tFoo item;\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_from_producer(t, item));\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_from_producer(t, item));\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_from_producer(t, item));\n\t\t}\n\t\tASSERT_OR_FAIL(Foo::createCount() == 11);\n\t\tASSERT_OR_FAIL(Foo::destroyCount() == 21);\n\t\tASSERT_OR_FAIL(Foo::destroyedInOrder());\n\t\t\n\t\t\n\t\t// Implicit\n\t\tTraits::reset();\n\t\tFoo::reset();\n\t\t{\n\t\t\tConcurrentQueue<Foo, Traits> q(4);\t\t// One block\n\t\t\t\n\t\t\tFoo item;\n\t\t\tq.enqueue(Foo());\n\t\t\tq.enqueue(Foo());\n\t\t\tq.enqueue(Foo());\n\t\t\tq.try_dequeue(item);\n\t\t}\n\t\tASSERT_OR_FAIL(Foo::createCount() == 4);\n\t\tASSERT_OR_FAIL(Foo::destroyCount() == 7);\n\t\tASSERT_OR_FAIL(Foo::destroyedInOrder());\n\t\t\n\t\tTraits::reset();\n\t\tFoo::reset();\n\t\t{\n\t\t\tConcurrentQueue<Foo, Traits> q(4);\t\t// One block\n\t\t\t\n\t\t\tq.enqueue(Foo());\n\t\t\tq.enqueue(Foo());\n\t\t\tq.enqueue(Foo());\n\t\t\tq.enqueue(Foo());\n\t\t}\n\t\tASSERT_OR_FAIL(Foo::createCount() == 4);\n\t\tASSERT_OR_FAIL(Foo::destroyCount() == 8);\n\t\tASSERT_OR_FAIL(Foo::destroyedInOrder());\n\t\t\n\t\tTraits::reset();\n\t\tFoo::reset();\n\t\t{\n\t\t\tConcurrentQueue<Foo, Traits> q(8);\t\t// Two blocks\n\t\t\t\n\t\t\tfor (int i = 0; i != 8; ++i) {\n\t\t\t\tq.enqueue(Foo());\n\t\t\t}\n\t\t}\n\t\tASSERT_OR_FAIL(Foo::createCount() == 8);\n\t\tASSERT_OR_FAIL(Foo::destroyCount() == 16);\n\t\tASSERT_OR_FAIL(Foo::destroyedInOrder());\n\t\t\n\t\tTraits::reset();\n\t\tFoo::reset();\n\t\t{\n\t\t\tConcurrentQueue<Foo, Traits> q(12);\t\t// Three blocks\n\t\t\t\n\t\t\t// Last block only partially full\n\t\t\tfor (int i = 0; i != 10; ++i) {\n\t\t\t\tq.enqueue(Foo());\n\t\t\t}\n\t\t\t\n\t\t\t// First block only partially full\n\t\t\tFoo item;\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t}\n\t\tASSERT_OR_FAIL(Foo::createCount() == 11);\n\t\tASSERT_OR_FAIL(Foo::destroyCount() == 21);\n\t\tASSERT_OR_FAIL(Foo::destroyedInOrder());\n\t\t\n\t\treturn true;\n\t}\n\t\n\tbool block_index_resized()\n\t{\n\t\ttypedef TestTraits<4, 2> Traits;\n\t\tTraits::reset();\n\t\tFoo::reset();\n\t\t\n\t\t{\n\t\t\tConcurrentQueue<Foo, Traits> q(8);\t\t// 2 blocks, matches initial index size\n\t\t\tProducerToken t(q);\n\t\t\t\n\t\t\tfor (int i = 0; i != 1024; ++i) {\n\t\t\t\tq.enqueue(t, Foo());\n\t\t\t}\n\t\t\t\n\t\t\tfor (int i = 0; i != 1024; ++i) {\n\t\t\t\tFoo item;\n\t\t\t\tq.try_dequeue_from_producer(t, item);\n\t\t\t}\n\t\t}\n\t\t\n\t\tASSERT_OR_FAIL(Traits::malloc_count() == 1 + 2 + 254 + 7);\n\t\tASSERT_OR_FAIL(Traits::free_count() == Traits::malloc_count());\n\t\t\n\t\tASSERT_OR_FAIL(Foo::createCount() == 2048);\n\t\tASSERT_OR_FAIL(Foo::destroyCount() == 3072);\n\t\tASSERT_OR_FAIL(Foo::destroyedInOrder());\n\t\t\n\t\t// Implicit\n\t\tTraits::reset();\n\t\tFoo::reset();\n\t\t{\n\t\t\tConcurrentQueue<Foo, Traits> q(8);\t\t// 2 blocks\n\t\t\t\n\t\t\tfor (int i = 0; i != 1024; ++i) {\n\t\t\t\tq.enqueue(Foo());\n\t\t\t}\n\t\t\t\n\t\t\tfor (int i = 0; i != 1024; ++i) {\n\t\t\t\tFoo item;\n\t\t\t\tq.try_dequeue(item);\n\t\t\t}\n\t\t}\n\t\t\n\t\tASSERT_OR_FAIL(Traits::malloc_count() == 1 + 2 + 254 + 6);\n\t\tASSERT_OR_FAIL(Traits::free_count() == Traits::malloc_count());\n\t\t\n\t\tASSERT_OR_FAIL(Foo::createCount() == 2048);\n\t\tASSERT_OR_FAIL(Foo::destroyCount() == 3072);\n\t\tASSERT_OR_FAIL(Foo::destroyedInOrder());\n\t\t\n\t\treturn true;\n\t}\n\t\n\tbool try_dequeue()\n\t{\n\t\tConcurrentQueue<int, MallocTrackingTraits> q;\n\t\tint item;\n\t\t\n\t\t// Producer token\n\t\t{\n\t\t\tfor (int i = 0; i != 50; ++i) {\n\t\t\t\tProducerToken t(q);\n\t\t\t\tfor (int j = 0; j != 100; ++j) {\n\t\t\t\t\tASSERT_OR_FAIL(q.enqueue(t, i * 100 + j));\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\tfor (int i = 0; i != 50; ++i) {\n\t\t\t\tfor (int j = 0; j != 100; ++j) {\n\t\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\t\t\tASSERT_OR_FAIL(item == i * 100 + j);\n\t\t\t\t}\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\t// Mixed producer types\n\t\t{\n\t\t\tfor (int i = 0; i != 25; ++i) {\n\t\t\t\tfor (int j = 0; j != 100; ++j) {\n\t\t\t\t\tASSERT_OR_FAIL(q.enqueue(i * 100 + j));\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (int i = 25; i != 50; ++i) {\n\t\t\t\tProducerToken t(q);\n\t\t\t\tfor (int j = 0; j != 100; ++j) {\n\t\t\t\t\tASSERT_OR_FAIL(q.enqueue(t, i * 100 + j));\n\t\t\t\t}\n\t\t\t}\n\t\t\tbool success[5000];\n\t\t\tstd::memset(success, 0, sizeof(success));\n\t\t\tfor (int i = 0; i != 50; ++i) {\n\t\t\t\tfor (int j = 0; j != 100; ++j) {\n\t\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\t\t\tsuccess[item] = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (int i = 0; i != 5000; ++i) {\n\t\t\t\tASSERT_OR_FAIL(success[i]);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\t// Mixed producer types with consumer token\n\t\t{\n\t\t\tfor (int i = 0; i != 25; ++i) {\n\t\t\t\tfor (int j = 0; j != 100; ++j) {\n\t\t\t\t\tASSERT_OR_FAIL(q.enqueue(i * 100 + j));\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (int i = 25; i != 50; ++i) {\n\t\t\t\tProducerToken t(q);\n\t\t\t\tfor (int j = 0; j != 100; ++j) {\n\t\t\t\t\tASSERT_OR_FAIL(q.enqueue(t, i * 100 + j));\n\t\t\t\t}\n\t\t\t}\n\t\t\tbool success[5000];\n\t\t\tstd::memset(success, 0, sizeof(success));\n\t\t\tfor (int i = 0; i != 50; ++i) {\n\t\t\t\tConsumerToken t(q);\n\t\t\t\tfor (int j = 0; j != 100; ++j) {\n\t\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(t, item));\n\t\t\t\t\tsuccess[item] = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (int i = 0; i != 5000; ++i) {\n\t\t\t\tASSERT_OR_FAIL(success[i]);\n\t\t\t}\n\t\t\tConsumerToken t(q);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(t, item));\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(t, item));\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\t\n\tbool try_dequeue_threaded()\n\t{\n\t\tint item;\n\t\tConcurrentQueue<int, MallocTrackingTraits> q;\n\t\t\n\t\t// Threaded consumption with tokens\n\t\t{\n\t\t\tSimpleThread threads[20];\n\t\t\tfor (int i = 0; i != 10; ++i) {\n\t\t\t\tthreads[i] = SimpleThread([&](int i) {\n\t\t\t\t\tProducerToken t(q);\n\t\t\t\t\tfor (int j = 0; j != 100; ++j) {\n\t\t\t\t\t\tq.enqueue(t, i * 10 + j);\n\t\t\t\t\t}\n\t\t\t\t}, i);\n\t\t\t}\n\n\t\t\tstd::atomic<int> dequeueCount(0);\n\t\t\tfor (int i = 10; i != 20; ++i) {\n\t\t\t\tthreads[i] = SimpleThread([&]() {\n\t\t\t\t\tint item;\n\t\t\t\t\tConsumerToken t(q);\n\t\t\t\t\twhile (dequeueCount.load(std::memory_order_relaxed) != 1000) {\n\t\t\t\t\t\tif (q.try_dequeue(t, item)) {\n\t\t\t\t\t\t\tdequeueCount.fetch_add(1, std::memory_order_relaxed);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\t\n\t\t\tfor (int i = 0; i != 20; ++i) {\n\t\t\t\tthreads[i].join();\n\t\t\t}\n\t\t\t\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\t// Threaded consumption\n\t\t{\n\t\t\tSimpleThread threads[20];\n\t\t\tfor (int i = 0; i != 10; ++i) {\n\t\t\t\tthreads[i] = SimpleThread([&](int i) {\n\t\t\t\t\tfor (int j = 0; j != 100; ++j) {\n\t\t\t\t\t\tq.enqueue(i * 10 + j);\n\t\t\t\t\t}\n\t\t\t\t}, i);\n\t\t\t}\n\n\t\t\tstd::atomic<int> dequeueCount(0);\n\t\t\tfor (int i = 10; i != 20; ++i) {\n\t\t\t\tthreads[i] = SimpleThread([&]() {\n\t\t\t\t\tint item;\n\t\t\t\t\twhile (dequeueCount.load(std::memory_order_relaxed) != 1000) {\n\t\t\t\t\t\tif (q.try_dequeue(item)) {\n\t\t\t\t\t\t\tdequeueCount.fetch_add(1, std::memory_order_relaxed);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\t\n\t\t\tfor (int i = 0; i != 20; ++i) {\n\t\t\t\tthreads[i].join();\n\t\t\t}\n\t\t\t\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\t\n\tbool try_dequeue_bulk()\n\t{\n\t\ttypedef TestTraits<4> Traits;\n\t\tint items[5];\n\t\t\n\t\t// Explicit producer\n\t\t{\n\t\t\tTraits::reset();\n\t\t\tConcurrentQueue<int, Traits> q;\n\t\t\tProducerToken tok(q);\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_bulk(items, 5) == 0);\n\t\t\t\n\t\t\tq.enqueue(tok, 17);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_bulk(items, 5) == 1);\n\t\t\tASSERT_OR_FAIL(items[0] == 17);\n\t\t\t\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(items[0]));\n\t\t\t\n\t\t\tfor (int i = 0; i != 4; ++i) {\n\t\t\t\tq.enqueue(tok, i + 1);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_bulk(items, 5) == 4);\n\t\t\tfor (int i = 0; i != 4; ++i) {\n\t\t\t\tASSERT_OR_FAIL(items[i] == i + 1);\n\t\t\t}\n\t\t\t\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(items[0]));\n\t\t\t\n\t\t\tfor (int i = 0; i != 5; ++i) {\n\t\t\t\tq.enqueue(tok, i + 1);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_bulk(items, 5) == 5);\n\t\t\tfor (int i = 0; i != 5; ++i) {\n\t\t\t\tASSERT_OR_FAIL(items[i] == i + 1);\n\t\t\t}\n\t\t\t\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(items[0]));\n\t\t\t\n\t\t\tfor (int i = 0; i != 6; ++i) {\n\t\t\t\tq.enqueue(tok, i + 1);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_bulk(items, 5) == 5);\n\t\t\tfor (int i = 0; i != 5; ++i) {\n\t\t\t\tASSERT_OR_FAIL(items[i] == i + 1);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(items[0]));\n\t\t\tASSERT_OR_FAIL(items[0] == 6);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(items[0]));\n\t\t\t\n\t\t\tfor (int i = 0; i != 10; ++i) {\n\t\t\t\tq.enqueue(tok, i + 1);\n\t\t\t}\n\t\t\tfor (int k = 0; k != 2; ++k) {\n\t\t\t\tASSERT_OR_FAIL(q.try_dequeue_bulk(items, 5) == 5);\n\t\t\t\tfor (int i = 0; i != 5; ++i) {\n\t\t\t\t\tASSERT_OR_FAIL(items[i] == k * 5 + i + 1);\n\t\t\t\t}\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(items[0]));\n\t\t}\n\t\t\n\t\t// Implicit producer\n\t\t{\n\t\t\tTraits::reset();\n\t\t\tConcurrentQueue<int, Traits> q;\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_bulk(items, 5) == 0);\n\t\t\t\n\t\t\tq.enqueue(17);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_bulk(items, 5) == 1);\n\t\t\tASSERT_OR_FAIL(items[0] == 17);\n\t\t\t\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(items[0]));\n\t\t\t\n\t\t\tfor (int i = 0; i != 4; ++i) {\n\t\t\t\tq.enqueue(i + 1);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_bulk(items, 5) == 4);\n\t\t\tfor (int i = 0; i != 4; ++i) {\n\t\t\t\tASSERT_OR_FAIL(items[i] == i + 1);\n\t\t\t}\n\t\t\t\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(items[0]));\n\t\t\t\n\t\t\tfor (int i = 0; i != 5; ++i) {\n\t\t\t\tq.enqueue(i + 1);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_bulk(items, 5) == 5);\n\t\t\tfor (int i = 0; i != 5; ++i) {\n\t\t\t\tASSERT_OR_FAIL(items[i] == i + 1);\n\t\t\t}\n\t\t\t\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(items[0]));\n\t\t\t\n\t\t\tfor (int i = 0; i != 6; ++i) {\n\t\t\t\tq.enqueue(i + 1);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_bulk(items, 5) == 5);\n\t\t\tfor (int i = 0; i != 5; ++i) {\n\t\t\t\tASSERT_OR_FAIL(items[i] == i + 1);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(items[0]));\n\t\t\tASSERT_OR_FAIL(items[0] == 6);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(items[0]));\n\t\t\t\n\t\t\tfor (int i = 0; i != 10; ++i) {\n\t\t\t\tq.enqueue(i + 1);\n\t\t\t}\n\t\t\tfor (int k = 0; k != 2; ++k) {\n\t\t\t\tASSERT_OR_FAIL(q.try_dequeue_bulk(items, 5) == 5);\n\t\t\t\tfor (int i = 0; i != 5; ++i) {\n\t\t\t\t\tASSERT_OR_FAIL(items[i] == k * 5 + i + 1);\n\t\t\t\t}\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(items[0]));\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\t\n\tbool try_dequeue_bulk_threaded()\n\t{\n\t\ttypedef TestTraits<2> Traits;\n\t\tint dummy;\n\t\t\n\t\t// Explicit producer\n\t\t{\n\t\t\tTraits::reset();\n\t\t\tConcurrentQueue<int, Traits> q;\n\t\t\tSimpleThread threads[2];\n\t\t\tbool success[2] = { true, true };\n\t\t\tfor (int i = 0; i != 2; ++i) {\n\t\t\t\tif (i == 0) {\n\t\t\t\t\tthreads[i] = SimpleThread([&](int) {\n\t\t\t\t\t\t// Producer\n\t\t\t\t\t\tProducerToken tok(q);\n\t\t\t\t\t\tfor (int i = 0; i != 32*1024; ++i) {\n\t\t\t\t\t\t\tq.enqueue(tok, i);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, i);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthreads[i] = SimpleThread([&](int) {\n\t\t\t\t\t\t// Consumer\n\t\t\t\t\t\tint items[5];\n\t\t\t\t\t\tint prevItem = -1;\n\t\t\t\t\t\tfor (int i = 0; i != 32*1024;) {\n\t\t\t\t\t\t\tauto dequeued = q.try_dequeue_bulk(items, 5);\n\t\t\t\t\t\t\tif (dequeued > 0) {\n\t\t\t\t\t\t\t\tif (dequeued > 5) {\n\t\t\t\t\t\t\t\t\tsuccess[i] = false;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tfor (std::size_t j = 0; j != dequeued; ++j) {\n\t\t\t\t\t\t\t\t\tif (items[j] != prevItem + 1) {\n\t\t\t\t\t\t\t\t\t\tsuccess[i] = false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tprevItem = items[j];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\ti += (int)dequeued;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}, i);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (int i = 0; i != 2; ++i) {\n\t\t\t\tthreads[i].join();\n\t\t\t}\n\t\t\t\n\t\t\tASSERT_OR_FAIL(success[0]);\n\t\t\tASSERT_OR_FAIL(success[1]);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(dummy));\n\t\t}\n\t\t\n\t\t// Implicit producer\n\t\t{\n\t\t\tTraits::reset();\n\t\t\tConcurrentQueue<int, Traits> q;\n\t\t\tSimpleThread threads[2];\n\t\t\tbool success[2] = { true, true };\n\t\t\tfor (int i = 0; i != 2; ++i) {\n\t\t\t\tif (i == 0) {\n\t\t\t\t\tthreads[i] = SimpleThread([&](int) {\n\t\t\t\t\t\t// Producer\n\t\t\t\t\t\tfor (int i = 0; i != 32*1024; ++i) {\n\t\t\t\t\t\t\tq.enqueue(i);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, i);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthreads[i] = SimpleThread([&](int) {\n\t\t\t\t\t\t// Consumer\n\t\t\t\t\t\tint items[5];\n\t\t\t\t\t\tint prevItem = -1;\n\t\t\t\t\t\tfor (int i = 0; i != 32*1024;) {\n\t\t\t\t\t\t\tauto dequeued = q.try_dequeue_bulk(items, 5);\n\t\t\t\t\t\t\tif (dequeued > 0) {\n\t\t\t\t\t\t\t\tif (dequeued > 5) {\n\t\t\t\t\t\t\t\t\tsuccess[i] = false;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tfor (std::size_t j = 0; j != dequeued; ++j) {\n\t\t\t\t\t\t\t\t\tif (items[j] != prevItem + 1) {\n\t\t\t\t\t\t\t\t\t\tsuccess[i] = false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tprevItem = items[j];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\ti += (int)dequeued;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}, i);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (int i = 0; i != 2; ++i) {\n\t\t\t\tthreads[i].join();\n\t\t\t}\n\t\t\t\n\t\t\tASSERT_OR_FAIL(success[0]);\n\t\t\tASSERT_OR_FAIL(success[1]);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(dummy));\n\t\t}\n\t\t\n\t\t// Multithreaded consumption\n\t\t{\n\t\t\tTraits::reset();\n\t\t\tConcurrentQueue<int, Traits> q;\n\t\t\t\n\t\t\tbool success[20];\n\t\t\tSimpleThread threads[20];\n\t\t\tfor (int i = 0; i != 10; ++i) {\n\t\t\t\tsuccess[i] = true;\n\t\t\t\tthreads[i] = SimpleThread([&](int i) {\n\t\t\t\t\tProducerToken t(q);\n\t\t\t\t\tif ((i & 1) == 1) {\n\t\t\t\t\t\tfor (int j = 0; j != 100; ++j) {\n\t\t\t\t\t\t\tq.enqueue(t, i * 128 + j);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (int j = 0; j != 100; ++j) {\n\t\t\t\t\t\t\tq.enqueue(i * 128 + j);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}, i);\n\t\t\t}\n\t\t\t\n\t\t\tstd::atomic<size_t> dequeueCount(0);\n\t\t\tfor (int i = 10; i != 20; ++i) {\n\t\t\t\tsuccess[i] = true;\n\t\t\t\tthreads[i] = SimpleThread([&](int i) {\n\t\t\t\t\tint prevItems[10];\n\t\t\t\t\tfor (int j = 0; j != 10; ++j) {\n\t\t\t\t\t\tprevItems[j] = -1;\n\t\t\t\t\t}\n\t\t\t\t\tint items[15];\n\t\t\t\t\tConsumerToken t(q);\n\t\t\t\t\t\n\t\t\t\t\twhile (dequeueCount.load(std::memory_order_relaxed) != 1000) {\n\t\t\t\t\t\tsize_t count;\n\t\t\t\t\t\tif ((i & 1) == 1) {\n\t\t\t\t\t\t\tcount = q.try_dequeue_bulk(items, 15);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tcount = q.try_dequeue_bulk(t, items, 15);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (count > 15) {\n\t\t\t\t\t\t\tsuccess[i] = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfor (size_t k = 0; k != count; ++k) {\n\t\t\t\t\t\t\tif (prevItems[items[k] / 128] >= (items[k] & 127)) {\n\t\t\t\t\t\t\t\tsuccess[i] = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tprevItems[items[k] / 128] = items[k] & 127;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdequeueCount.fetch_add(count, std::memory_order_relaxed);\n\t\t\t\t\t}\n\t\t\t\t}, i);\n\t\t\t}\n\t\t\t\n\t\t\tfor (int i = 0; i != 20; ++i) {\n\t\t\t\tthreads[i].join();\n\t\t\t}\n\t\t\t\n\t\t\tint item;\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t\tfor (int i = 0; i != 20; ++i) {\n\t\t\t\tASSERT_OR_FAIL(success[i]);\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\t\n\tbool implicit_producer_hash()\n\t{\n\t\tfor (int j = 0; j != 5; ++j) {\n\t\t\tConcurrentQueue<int, MallocTrackingTraits> q;\n\t\t\tstd::vector<SimpleThread> threads;\n\t\t\tfor (int i = 0; i != 20; ++i) {\n\t\t\t\tthreads.push_back(SimpleThread([&]() {\n\t\t\t\t\tq.enqueue(7);\n\t\t\t\t}));\n\t\t\t}\n\t\t\t\n\t\t\tfor (auto it = threads.begin(); it != threads.end(); ++it) {\n\t\t\t\tit->join();\n\t\t\t}\n\t\t\t\n\t\t\tint item;\n\t\t\tConsumerToken t(q);\n\t\t\tfor (auto i = 0; i != 20; ++i) {\n\t\t\t\tif ((j & 1) == 0) {\n\t\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(t, item));\n\t\t\t\t}\n\t\t\t\tASSERT_OR_FAIL(item == 7);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\t\n\tbool index_wrapping()\n\t{\n\t\t{\n\t\t\t// Implicit\n\t\t\tConcurrentQueue<int, SmallIndexTraits> q(16);\n\t\t\tint item;\n\t\t\t\n\t\t\tfor (int i = 0; i != (1 << 18); ++i) {\n\t\t\t\tif ((i & 16) == 0) {\n\t\t\t\t\tASSERT_OR_FAIL(q.try_enqueue(i));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\t\t\tASSERT_OR_FAIL(item == (i - 16));\n\t\t\t\t}\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\t{\n\t\t\t// Explicit\n\t\t\tConcurrentQueue<int, SmallIndexTraits> q(16);\n\t\t\tProducerToken tok(q);\n\t\t\tint item;\n\t\t\t\n\t\t\tfor (int i = 0; i != (1 << 18); ++i) {\n\t\t\t\tif ((i & 16) == 0) {\n\t\t\t\t\tASSERT_OR_FAIL(q.try_enqueue(tok, i));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tASSERT_OR_FAIL(q.try_dequeue_from_producer(tok, item));\n\t\t\t\t\tASSERT_OR_FAIL(item == (i - 16));\n\t\t\t\t}\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\t{\n\t\t\t// Implicit extra small\n\t\t\tConcurrentQueue<int, ExtraSmallIndexTraits> q(1);\n\t\t\tint item;\n\t\t\t\n\t\t\tfor (int i = 0; i != 4097; ++i) {\n\t\t\t\tq.enqueue(i);\n\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\t\tASSERT_OR_FAIL(item == i);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\t{\n\t\t\t// Explicit extra small\n\t\t\tConcurrentQueue<int, ExtraSmallIndexTraits> q(1);\n\t\t\tProducerToken tok(q);\n\t\t\tint item;\n\t\t\t\n\t\t\tfor (int i = 0; i != 4097; ++i) {\n\t\t\t\tq.enqueue(tok, i);\n\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\t\tASSERT_OR_FAIL(item == i);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\t\n\tstruct SizeLimitTraits : public MallocTrackingTraits\n\t{\n\t\tstatic const size_t BLOCK_SIZE = 2;\n\t\tstatic const size_t MAX_SUBQUEUE_SIZE = 5;\t\t// Will round up to 6 because of block size\n\t};\n\t\n\tbool subqueue_size_limit()\n\t{\n\t\t{\n\t\t\t// Explicit\n\t\t\tConcurrentQueue<int, SizeLimitTraits> q;\n\t\t\tProducerToken t(q);\n\t\t\tint item;\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.enqueue(t, 1));\n\t\t\tASSERT_OR_FAIL(q.enqueue(t, 2));\n\t\t\tASSERT_OR_FAIL(q.enqueue(t, 3));\n\t\t\tASSERT_OR_FAIL(q.enqueue(t, 4));\n\t\t\tASSERT_OR_FAIL(q.enqueue(t, 5));\n\t\t\tASSERT_OR_FAIL(q.enqueue(t, 6));\n\t\t\tASSERT_OR_FAIL(!q.enqueue(t, 7));\n\t\t\tASSERT_OR_FAIL(!q.enqueue(t, 8));\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item) && item == 1);\n\t\t\tASSERT_OR_FAIL(!q.enqueue(t, 7));\t\t// Can't reuse block until it's completely empty\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item) && item == 2);\n\t\t\tASSERT_OR_FAIL(q.enqueue(t, 7));\n\t\t\tASSERT_OR_FAIL(q.enqueue(t, 8));\n\t\t\tASSERT_OR_FAIL(!q.enqueue(t, 9));\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item) && item == 3);\n\t\t\tASSERT_OR_FAIL(!q.enqueue(t, 9));\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item) && item == 4);\n\t\t\tASSERT_OR_FAIL(q.enqueue(t, 9));\n\t\t\t\n\t\t\tfor (int i = 5; i <= 9; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item) && item == i);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(q.enqueue(t, 10));\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item) && item == 10);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t\tfor (int i = 0; i != 6; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q.try_enqueue(t, i));\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(!q.try_enqueue(t, 7));\n\t\t\tASSERT_OR_FAIL(!q.enqueue(t, 7));\n\t\t\t\n\t\t\t// Bulk\n\t\t\tint items[6];\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_bulk(items, 6) == 6);\n\t\t\tASSERT_OR_FAIL(!q.try_enqueue_bulk(t, items, 7));\n\t\t\tASSERT_OR_FAIL(!q.enqueue_bulk(t, items, 7));\n\t\t\tASSERT_OR_FAIL(q.enqueue_bulk(t, items, 6));\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_bulk(items, 6) == 6);\n\t\t\tASSERT_OR_FAIL(q.enqueue_bulk(t, items, 3));\n\t\t\tASSERT_OR_FAIL(!q.enqueue_bulk(t, items, 4));\n\t\t\tASSERT_OR_FAIL(q.enqueue_bulk(t, items, 3));\n\t\t\tASSERT_OR_FAIL(!q.enqueue_bulk(t, items, 1));\n\t\t\tASSERT_OR_FAIL(!q.enqueue(t, 100));\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_bulk(items, 1) == 1);\n\t\t\tASSERT_OR_FAIL(!q.enqueue(t, 100));\n\t\t}\n\t\t\n\t\t{\n\t\t\t// Implicit\n\t\t\tConcurrentQueue<int, SizeLimitTraits> q;\n\t\t\tint item;\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.enqueue(1));\n\t\t\tASSERT_OR_FAIL(q.enqueue(2));\n\t\t\tASSERT_OR_FAIL(q.enqueue(3));\n\t\t\tASSERT_OR_FAIL(q.enqueue(4));\n\t\t\tASSERT_OR_FAIL(q.enqueue(5));\n\t\t\tASSERT_OR_FAIL(q.enqueue(6));\n\t\t\tASSERT_OR_FAIL(!q.enqueue(7));\n\t\t\tASSERT_OR_FAIL(!q.enqueue(8));\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item) && item == 1);\n\t\t\tASSERT_OR_FAIL(!q.enqueue(7));\t\t// Can't reuse block until it's completely empty\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item) && item == 2);\n\t\t\tASSERT_OR_FAIL(q.enqueue(7));\n\t\t\tASSERT_OR_FAIL(q.enqueue(8));\n\t\t\tASSERT_OR_FAIL(!q.enqueue(9));\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item) && item == 3);\n\t\t\tASSERT_OR_FAIL(!q.enqueue(9));\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item) && item == 4);\n\t\t\tASSERT_OR_FAIL(q.enqueue(9));\n\t\t\t\n\t\t\tfor (int i = 5; i <= 9; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(item) && item == i);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(q.enqueue(10));\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item) && item == 10);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t\tfor (int i = 0; i != 6; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q.try_enqueue(i));\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(!q.try_enqueue(7));\n\t\t\tASSERT_OR_FAIL(!q.enqueue(7));\n\t\t\t\n\t\t\t// Bulk\n\t\t\tint items[6];\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_bulk(items, 6) == 6);\n\t\t\tASSERT_OR_FAIL(!q.try_enqueue_bulk(items, 7));\n\t\t\tASSERT_OR_FAIL(!q.enqueue_bulk(items, 7));\n\t\t\tASSERT_OR_FAIL(q.enqueue_bulk(items, 6));\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_bulk(items, 6) == 6);\n\t\t\tASSERT_OR_FAIL(q.enqueue_bulk(items, 3));\n\t\t\tASSERT_OR_FAIL(!q.enqueue_bulk(items, 4));\n\t\t\tASSERT_OR_FAIL(q.enqueue_bulk(items, 3));\n\t\t\tASSERT_OR_FAIL(!q.enqueue_bulk(items, 1));\n\t\t\tASSERT_OR_FAIL(!q.enqueue(100));\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_bulk(items, 1) == 1);\n\t\t\tASSERT_OR_FAIL(!q.enqueue(100));\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\t\n\tbool exceptions()\n\t{\n\t\ttypedef TestTraits<4, 2> Traits;\n\t\t\n\t\t{\n\t\t\t// Explicit, basic\n\t\t\t// enqueue\n\t\t\tConcurrentQueue<ThrowingMovable, Traits> q;\n\t\t\tProducerToken tok(q);\n\t\t\t\n\t\t\tThrowingMovable::reset();\n\t\t\t\n\t\t\tbool threw = false;\n\t\t\ttry {\n\t\t\t\tq.enqueue(tok, ThrowingMovable(1, true));\n\t\t\t}\n\t\t\tcatch (ThrowingMovable* m) {\n\t\t\t\tthrew = true;\n\t\t\t\tASSERT_OR_FAIL(m->id == 1);\n\t\t\t\tASSERT_OR_FAIL(m->moved);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(threw);\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 0);\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.enqueue(tok, ThrowingMovable(2)));\n\t\t\tThrowingMovable result(-1);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(result));\n\t\t\tASSERT_OR_FAIL(result.id == 2);\n\t\t\tASSERT_OR_FAIL(result.moved);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(result));\n\t\t\t\n\t\t\tASSERT_OR_FAIL(ThrowingMovable::destroyCount() == 3);\n\t\t\t\n\t\t\t// dequeue\n\t\t\tThrowingMovable::reset();\n\t\t\tq.enqueue(tok, ThrowingMovable(10));\n\t\t\tq.enqueue(tok, ThrowingMovable(11, false, true));\n\t\t\tq.enqueue(tok, ThrowingMovable(12));\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 3);\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(result));\n\t\t\tASSERT_OR_FAIL(result.id == 10);\n\t\t\tthrew = false;\n\t\t\ttry {\n\t\t\t\tq.try_dequeue(result);\n\t\t\t}\n\t\t\tcatch (ThrowingMovable* m) {\n\t\t\t\tASSERT_OR_FAIL(m->id == 11);\n\t\t\t\tthrew = true;\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(threw);\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 1);\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(result));\n\t\t\tASSERT_OR_FAIL(result.id == 12);\n\t\t\tASSERT_OR_FAIL(result.moved);\n\t\t\t\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(result));\n\t\t\tq.enqueue(tok, ThrowingMovable(13));\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 1);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(result));\n\t\t\tASSERT_OR_FAIL(result.id == 13);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(result));\n\t\t\t\n\t\t\tASSERT_OR_FAIL(ThrowingMovable::destroyCount() == 8);\n\t\t}\n\t\t\n\t\t{\n\t\t\t// Explicit, on and off block boundaries\n\t\t\t// enqueue\n\t\t\tConcurrentQueue<ThrowingMovable, Traits> q;\n\t\t\tProducerToken tok(q);\n\t\t\t\n\t\t\tThrowingMovable::reset();\n\t\t\t\n\t\t\tfor (int i = 0; i != 3; ++i) {\n\t\t\t\tq.enqueue(tok, ThrowingMovable(i));\n\t\t\t}\n\t\t\tbool threw = false;\n\t\t\ttry {\n\t\t\t\tq.enqueue(tok, ThrowingMovable(3, true));\n\t\t\t}\n\t\t\tcatch (ThrowingMovable* m) {\n\t\t\t\tthrew = true;\n\t\t\t\tASSERT_OR_FAIL(m->id == 3);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(threw);\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 3);\n\t\t\t\n\t\t\tq.enqueue(tok, ThrowingMovable(4));\n\t\t\tthrew = false;\n\t\t\ttry {\n\t\t\t\tq.enqueue(tok, ThrowingMovable(5, true));\n\t\t\t}\n\t\t\tcatch (ThrowingMovable* m) {\n\t\t\t\tthrew = true;\n\t\t\t\tASSERT_OR_FAIL(m->id == 5);\n\t\t\t\tASSERT_OR_FAIL(m->moved);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(threw);\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 4);\n\t\t\tq.enqueue(tok, ThrowingMovable(6));\n\t\t\t\n\t\t\tThrowingMovable result(-1);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(result));\n\t\t\tASSERT_OR_FAIL(result.id == 0);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(result));\n\t\t\tASSERT_OR_FAIL(result.id == 1);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(result));\n\t\t\tASSERT_OR_FAIL(result.id == 2);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(result));\n\t\t\tASSERT_OR_FAIL(result.id == 4);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(result));\n\t\t\tASSERT_OR_FAIL(result.id == 6);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(result));\n\t\t\t\n\t\t\tASSERT_OR_FAIL(ThrowingMovable::destroyCount() == 12);\n\t\t\t\n\t\t\t// dequeue\n\t\t\tThrowingMovable::reset();\n\t\t\tq.enqueue(tok, ThrowingMovable(10, false, true));\n\t\t\tq.enqueue(tok, ThrowingMovable(11));\n\t\t\tq.enqueue(tok, ThrowingMovable(12));\n\t\t\tq.enqueue(tok, ThrowingMovable(13, false, true));\n\t\t\tq.enqueue(tok, ThrowingMovable(14, false, true));\n\t\t\tq.enqueue(tok, ThrowingMovable(15, false, true));\n\t\t\tq.enqueue(tok, ThrowingMovable(16));\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 7);\n\t\t\t\n\t\t\tfor (int i = 10; i != 17; ++i) {\n\t\t\t\tif (i == 10 || (i >= 13 && i <= 15)) {\n\t\t\t\t\tthrew = false;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tq.try_dequeue(result);\n\t\t\t\t\t}\n\t\t\t\t\tcatch (ThrowingMovable* m) {\n\t\t\t\t\t\tASSERT_OR_FAIL(m->id == i);\n\t\t\t\t\t\tASSERT_OR_FAIL(m->moved);\n\t\t\t\t\t\tthrew = true;\n\t\t\t\t\t}\n\t\t\t\t\tASSERT_OR_FAIL(threw);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(result));\n\t\t\t\t\tASSERT_OR_FAIL(result.id == i);\n\t\t\t\t\tASSERT_OR_FAIL(result.moved);\n\t\t\t\t}\n\t\t\t\tASSERT_OR_FAIL(q.size_approx() == (std::uint32_t)(16 - i));\n\t\t\t}\n\t\t\t\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(result));\n\t\t\tq.enqueue(tok, ThrowingMovable(20));\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 1);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(result));\n\t\t\tASSERT_OR_FAIL(result.id == 20);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(result));\n\t\t\t\n\t\t\tASSERT_OR_FAIL(ThrowingMovable::destroyCount() == 16);\n\t\t}\n\t\t\n\t\t{\n\t\t\t// Explicit bulk\n\t\t\t// enqueue\n\t\t\tConcurrentQueue<ThrowingMovable, Traits> q;\n\t\t\tProducerToken tok(q);\n\t\t\t\n\t\t\tThrowingMovable::reset();\n\t\t\tstd::vector<ThrowingMovable> items;\n\t\t\titems.reserve(5);\n\t\t\titems.push_back(ThrowingMovable(1));\n\t\t\titems.push_back(ThrowingMovable(2));\n\t\t\titems.push_back(ThrowingMovable(3));\n\t\t\titems.push_back(ThrowingMovable(4));\n\t\t\titems.push_back(ThrowingMovable(5));\n\t\t\titems.back().throwOnCctor = true;\n\t\t\t\n\t\t\tbool threw = false;\n\t\t\ttry {\n\t\t\t\tq.enqueue_bulk(tok, std::make_move_iterator(items.begin()), 5);\n\t\t\t}\n\t\t\tcatch (ThrowingMovable* m) {\n\t\t\t\tthrew = true;\n\t\t\t\tASSERT_OR_FAIL(m->id == 5);\n\t\t\t\tASSERT_OR_FAIL(m->copied);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(threw);\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 0);\n\t\t\tq.enqueue(tok, ThrowingMovable(6));\n\t\t\t\n\t\t\tthrew = false;\n\t\t\ttry {\n\t\t\t\tq.enqueue_bulk(tok, std::make_move_iterator(items.begin()), 5);\n\t\t\t}\n\t\t\tcatch (ThrowingMovable* m) {\n\t\t\t\tthrew = true;\n\t\t\t\tASSERT_OR_FAIL(m->id == 5);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(threw);\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 1);\n\t\t\t\n\t\t\tThrowingMovable result(-1);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(result));\n\t\t\tASSERT_OR_FAIL(result.id == 6);\n\t\t\tASSERT_OR_FAIL(result.moved);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(result));\n\t\t\t\n\t\t\tASSERT_OR_FAIL(ThrowingMovable::destroyCount() == 15);\n\t\t\t\n\t\t\t// dequeue\n\t\t\tThrowingMovable::reset();\n\t\t\tq.enqueue(tok, ThrowingMovable(10));\n\t\t\tq.enqueue(tok, ThrowingMovable(11));\n\t\t\tq.enqueue(tok, ThrowingMovable(12));\n\t\t\tq.enqueue(tok, ThrowingMovable(13));\n\t\t\tq.enqueue(tok, ThrowingMovable(14, false, true, true));\t\t// std::back_inserter turns an assignment into a ctor call\n\t\t\tq.enqueue(tok, ThrowingMovable(15));\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 6);\n\t\t\t\n\t\t\tstd::vector<ThrowingMovable> results;\n\t\t\tresults.reserve(5);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_bulk(std::back_inserter(results), 2));\n\t\t\tASSERT_OR_FAIL(results.size() == 2);\n\t\t\tASSERT_OR_FAIL(results[0].id == 10);\n\t\t\tASSERT_OR_FAIL(results[1].id == 11);\n\t\t\tASSERT_OR_FAIL(results[0].moved);\n\t\t\tASSERT_OR_FAIL(results[1].moved);\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 4);\n\t\t\tthrew = false;\n\t\t\ttry {\n\t\t\t\tq.try_dequeue_bulk(std::back_inserter(results), 4);\n\t\t\t}\n\t\t\tcatch (ThrowingMovable*) {\n\t\t\t\t// Note: Can't inspect thrown value since it points to an object whose construction was attempted on the vector and\n\t\t\t\t// no longer exists\n\t\t\t\tthrew = true;\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(threw);\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 0);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(result));\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_bulk(std::back_inserter(results), 1) == 0);\n\t\t\t\n\t\t\tASSERT_OR_FAIL(results.size() == 4);\n\t\t\tASSERT_OR_FAIL(results[2].id == 12);\n\t\t\tASSERT_OR_FAIL(results[3].id == 13);\n\t\t\t\n\t\t\tASSERT_OR_FAIL(ThrowingMovable::destroyCount() == 12);\n\t\t}\n\t\t\n\t\t\n\t\t{\n\t\t\t// Implicit, basic\n\t\t\t// enqueue\n\t\t\tConcurrentQueue<ThrowingMovable, Traits> q;\n\t\t\t\n\t\t\tThrowingMovable::reset();\n\t\t\t\n\t\t\tbool threw = false;\n\t\t\ttry {\n\t\t\t\tq.enqueue(ThrowingMovable(1, true));\n\t\t\t}\n\t\t\tcatch (ThrowingMovable* m) {\n\t\t\t\tthrew = true;\n\t\t\t\tASSERT_OR_FAIL(m->id == 1);\n\t\t\t\tASSERT_OR_FAIL(m->moved);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(threw);\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 0);\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.enqueue(ThrowingMovable(2)));\n\t\t\tThrowingMovable result(-1);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(result));\n\t\t\tASSERT_OR_FAIL(result.id == 2);\n\t\t\tASSERT_OR_FAIL(result.moved);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(result));\n\t\t\t\n\t\t\tASSERT_OR_FAIL(ThrowingMovable::destroyCount() == 3);\n\t\t\t\n\t\t\t// dequeue\n\t\t\tThrowingMovable::reset();\n\t\t\tq.enqueue(ThrowingMovable(10));\n\t\t\tq.enqueue(ThrowingMovable(11, false, true));\n\t\t\tq.enqueue(ThrowingMovable(12));\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 3);\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(result));\n\t\t\tASSERT_OR_FAIL(result.id == 10);\n\t\t\tthrew = false;\n\t\t\ttry {\n\t\t\t\tq.try_dequeue(result);\n\t\t\t}\n\t\t\tcatch (ThrowingMovable* m) {\n\t\t\t\tASSERT_OR_FAIL(m->id == 11);\n\t\t\t\tthrew = true;\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(threw);\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 1);\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(result));\n\t\t\tASSERT_OR_FAIL(result.id == 12);\n\t\t\tASSERT_OR_FAIL(result.moved);\n\t\t\t\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(result));\n\t\t\tq.enqueue(ThrowingMovable(13));\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 1);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(result));\n\t\t\tASSERT_OR_FAIL(result.id == 13);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(result));\n\t\t\t\n\t\t\tASSERT_OR_FAIL(ThrowingMovable::destroyCount() == 8);\n\t\t}\n\t\t\n\t\t{\n\t\t\t// Implicit, on and off block boundaries\n\t\t\t// enqueue\n\t\t\tConcurrentQueue<ThrowingMovable, Traits> q;\n\t\t\t\n\t\t\tThrowingMovable::reset();\n\t\t\t\n\t\t\tfor (int i = 0; i != 3; ++i) {\n\t\t\t\tq.enqueue(ThrowingMovable(i));\n\t\t\t}\n\t\t\tbool threw = false;\n\t\t\ttry {\n\t\t\t\tq.enqueue(ThrowingMovable(3, true));\n\t\t\t}\n\t\t\tcatch (ThrowingMovable* m) {\n\t\t\t\tthrew = true;\n\t\t\t\tASSERT_OR_FAIL(m->id == 3);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(threw);\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 3);\n\t\t\t\n\t\t\tq.enqueue(ThrowingMovable(4));\n\t\t\tthrew = false;\n\t\t\ttry {\n\t\t\t\tq.enqueue(ThrowingMovable(5, true));\n\t\t\t}\n\t\t\tcatch (ThrowingMovable* m) {\n\t\t\t\tthrew = true;\n\t\t\t\tASSERT_OR_FAIL(m->id == 5);\n\t\t\t\tASSERT_OR_FAIL(m->moved);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(threw);\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 4);\n\t\t\tq.enqueue(ThrowingMovable(6));\n\t\t\t\n\t\t\tThrowingMovable result(-1);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(result));\n\t\t\tASSERT_OR_FAIL(result.id == 0);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(result));\n\t\t\tASSERT_OR_FAIL(result.id == 1);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(result));\n\t\t\tASSERT_OR_FAIL(result.id == 2);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(result));\n\t\t\tASSERT_OR_FAIL(result.id == 4);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(result));\n\t\t\tASSERT_OR_FAIL(result.id == 6);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(result));\n\t\t\t\n\t\t\tASSERT_OR_FAIL(ThrowingMovable::destroyCount() == 12);\n\t\t\t\n\t\t\t// dequeue\n\t\t\tThrowingMovable::reset();\n\t\t\tq.enqueue(ThrowingMovable(10, false, true));\n\t\t\tq.enqueue(ThrowingMovable(11));\n\t\t\tq.enqueue(ThrowingMovable(12));\n\t\t\tq.enqueue(ThrowingMovable(13, false, true));\n\t\t\tq.enqueue(ThrowingMovable(14, false, true));\n\t\t\tq.enqueue(ThrowingMovable(15, false, true));\n\t\t\tq.enqueue(ThrowingMovable(16));\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 7);\n\t\t\t\n\t\t\tfor (int i = 10; i != 17; ++i) {\n\t\t\t\tif (i == 10 || (i >= 13 && i <= 15)) {\n\t\t\t\t\tthrew = false;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tq.try_dequeue(result);\n\t\t\t\t\t}\n\t\t\t\t\tcatch (ThrowingMovable* m) {\n\t\t\t\t\t\tASSERT_OR_FAIL(m->id == i);\n\t\t\t\t\t\tASSERT_OR_FAIL(m->moved);\n\t\t\t\t\t\tthrew = true;\n\t\t\t\t\t}\n\t\t\t\t\tASSERT_OR_FAIL(threw);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tASSERT_OR_FAIL(q.try_dequeue(result));\n\t\t\t\t\tASSERT_OR_FAIL(result.id == i);\n\t\t\t\t\tASSERT_OR_FAIL(result.moved);\n\t\t\t\t}\n\t\t\t\tASSERT_OR_FAIL(q.size_approx() == (std::uint32_t)(16 - i));\n\t\t\t}\n\t\t\t\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(result));\n\t\t\tq.enqueue(ThrowingMovable(20));\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 1);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(result));\n\t\t\tASSERT_OR_FAIL(result.id == 20);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(result));\n\t\t\t\n\t\t\tASSERT_OR_FAIL(ThrowingMovable::destroyCount() == 16);\n\t\t}\n\t\t\n\t\t{\n\t\t\t// Impplicit bulk\n\t\t\t// enqueue\n\t\t\tConcurrentQueue<ThrowingMovable, Traits> q;\n\t\t\t\n\t\t\tThrowingMovable::reset();\n\t\t\tstd::vector<ThrowingMovable> items;\n\t\t\titems.reserve(5);\n\t\t\titems.push_back(ThrowingMovable(1));\n\t\t\titems.push_back(ThrowingMovable(2));\n\t\t\titems.push_back(ThrowingMovable(3));\n\t\t\titems.push_back(ThrowingMovable(4));\n\t\t\titems.push_back(ThrowingMovable(5));\n\t\t\titems.back().throwOnCctor = true;\n\t\t\t\n\t\t\tbool threw = false;\n\t\t\ttry {\n\t\t\t\tq.enqueue_bulk(std::make_move_iterator(items.begin()), 5);\n\t\t\t}\n\t\t\tcatch (ThrowingMovable* m) {\n\t\t\t\tthrew = true;\n\t\t\t\tASSERT_OR_FAIL(m->id == 5);\n\t\t\t\tASSERT_OR_FAIL(m->copied);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(threw);\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 0);\n\t\t\tq.enqueue(ThrowingMovable(6));\n\t\t\t\n\t\t\tthrew = false;\n\t\t\ttry {\n\t\t\t\tq.enqueue_bulk(std::make_move_iterator(items.begin()), 5);\n\t\t\t}\n\t\t\tcatch (ThrowingMovable* m) {\n\t\t\t\tthrew = true;\n\t\t\t\tASSERT_OR_FAIL(m->id == 5);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(threw);\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 1);\n\t\t\t\n\t\t\tThrowingMovable result(-1);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(result));\n\t\t\tASSERT_OR_FAIL(result.id == 6);\n\t\t\tASSERT_OR_FAIL(result.moved);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(result));\n\t\t\t\n\t\t\tASSERT_OR_FAIL(ThrowingMovable::destroyCount() == 15);\n\t\t\t\n\t\t\t// dequeue\n\t\t\tThrowingMovable::reset();\n\t\t\tq.enqueue(ThrowingMovable(10));\n\t\t\tq.enqueue(ThrowingMovable(11));\n\t\t\tq.enqueue(ThrowingMovable(12));\n\t\t\tq.enqueue(ThrowingMovable(13));\n\t\t\tq.enqueue(ThrowingMovable(14, false, true, true));\t\t// std::back_inserter turns an assignment into a ctor call\n\t\t\tq.enqueue(ThrowingMovable(15));\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 6);\n\t\t\t\n\t\t\tstd::vector<ThrowingMovable> results;\n\t\t\tresults.reserve(5);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_bulk(std::back_inserter(results), 2));\n\t\t\tASSERT_OR_FAIL(results.size() == 2);\n\t\t\tASSERT_OR_FAIL(results[0].id == 10);\n\t\t\tASSERT_OR_FAIL(results[1].id == 11);\n\t\t\tASSERT_OR_FAIL(results[0].moved);\n\t\t\tASSERT_OR_FAIL(results[1].moved);\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 4);\n\t\t\tthrew = false;\n\t\t\ttry {\n\t\t\t\tq.try_dequeue_bulk(std::back_inserter(results), 4);\n\t\t\t}\n\t\t\tcatch (ThrowingMovable*) {\n\t\t\t\tthrew = true;\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(threw);\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 0);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(result));\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_bulk(std::back_inserter(results), 1) == 0);\n\t\t\t\n\t\t\tASSERT_OR_FAIL(results.size() == 4);\n\t\t\tASSERT_OR_FAIL(results[2].id == 12);\n\t\t\tASSERT_OR_FAIL(results[3].id == 13);\n\t\t\t\n\t\t\tASSERT_OR_FAIL(ThrowingMovable::destroyCount() == 12);\n\t\t}\n\t\t\n\t\t{\n\t\t\t// Threaded\n\t\t\tConcurrentQueue<ThrowingMovable, Traits> q;\n\t\t\tThrowingMovable::reset();\n\t\t\t\n\t\t\tstd::vector<SimpleThread> threads(6);\n\t\t\tfor (std::size_t tid = 0; tid != threads.size(); ++tid) {\n\t\t\t\tthreads[tid] = SimpleThread([&](std::size_t tid) {\n\t\t\t\t\tstd::vector<ThrowingMovable> inVec;\n\t\t\t\t\tinVec.push_back(ThrowingMovable(1));\n\t\t\t\t\tinVec.push_back(ThrowingMovable(2));\n\t\t\t\t\tinVec.push_back(ThrowingMovable(3));\n\t\t\t\t\t\n\t\t\t\t\tstd::vector<ThrowingMovable> outVec;\n\t\t\t\t\toutVec.push_back(ThrowingMovable(-1));\n\t\t\t\t\toutVec.push_back(ThrowingMovable(-1));\n\t\t\t\t\toutVec.push_back(ThrowingMovable(-1));\n\t\t\t\t\t\n\t\t\t\t\tProducerToken tok(q);\n\t\t\t\t\tThrowingMovable result(-1);\n\t\t\t\t\t\n\t\t\t\t\tfor (std::size_t i = 0; i != 8192; ++i) {\n\t\t\t\t\t\tauto magic = (tid + 1) * i + tid * 17 + i;\n\t\t\t\t\t\tauto op = magic & 7;\n\t\t\t\t\t\tauto ctorThrow = (magic & 0x10) != 0;\n\t\t\t\t\t\tauto assignThrow = (magic & 0x20) != 0;\n\t\t\t\t\t\tauto throwOnNextCctor = (magic & 0x40) != 0;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tswitch (op) {\n\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\tq.enqueue(tok, ThrowingMovable((int)i, ctorThrow, assignThrow, throwOnNextCctor));\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\tinVec[i & 3].throwOnCctor = ctorThrow;\n\t\t\t\t\t\t\t\tinVec[i & 3].throwOnAssignment = assignThrow;\n\t\t\t\t\t\t\t\tinVec[i & 3].throwOnSecondCctor = throwOnNextCctor;\n\t\t\t\t\t\t\t\tq.enqueue_bulk(tok, inVec.begin(), 3);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\tq.enqueue(ThrowingMovable((int)i, ctorThrow, assignThrow, throwOnNextCctor));\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\tinVec[i & 3].throwOnCctor = ctorThrow;\n\t\t\t\t\t\t\t\tinVec[i & 3].throwOnAssignment = assignThrow;\n\t\t\t\t\t\t\t\tinVec[i & 3].throwOnSecondCctor = throwOnNextCctor;\n\t\t\t\t\t\t\t\tq.enqueue_bulk(inVec.begin(), 3);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\tcase 5:\n\t\t\t\t\t\t\t\tq.try_dequeue(result);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 6:\n\t\t\t\t\t\t\tcase 7:\n\t\t\t\t\t\t\t\tq.try_dequeue_bulk(outVec.data(), 3);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch (ThrowingMovable*) {\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}, tid);\n\t\t\t}\n\t\t\tfor (std::size_t i = 0; i != threads.size(); ++i) {\n\t\t\t\tthreads[i].join();\n\t\t\t}\n\t\t\t\n\t\t\tThrowingMovable result(-1);\n\t\t\twhile (true) {\n\t\t\t\ttry {\n\t\t\t\t\tif (!q.try_dequeue(result)) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch (ThrowingMovable*) {\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tASSERT_OR_FAIL(ThrowingMovable::destroyCount() + 1 == ThrowingMovable::ctorCount());\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\n\tbool implicit_producer_churn()\n\t{\n\t\ttypedef TestTraits<4> Traits;\n\n\t\tfor (int i = 0; i != 256; ++i) {\n\t\t\tstd::vector<SimpleThread> threads(32);\n\t\t\tConcurrentQueue<int, Traits> q;\n\t\t\tfor (auto& thread : threads) {\n\t\t\t\tthread = SimpleThread([&] {\n\t\t\t\t\tint x;\n\t\t\t\t\tfor (int j = 0; j != 16; ++j) {\n\t\t\t\t\t\tq.enqueue(0);\n\t\t\t\t\t\tq.try_dequeue(x);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tfor (auto& thread : threads) {\n\t\t\t\tthread.join();\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\t\n\tbool test_threaded()\n\t{\n\t\ttypedef TestTraits<4> Traits;\n\t\tTraits::reset();\n\t\t\n\t\tbool inOrder = true;\n\t\t\n\t\t{\n\t\t\t// Single producer, single consumer\n\t\t\tConcurrentQueue<int, Traits> q;\n\t\t\tProducerToken t(q);\n\t\t\tSimpleThread a([&]() {\n\t\t\t\tfor (int i = 0; i != 123456; ++i) {\n\t\t\t\t\tq.enqueue(t, i);\n\t\t\t\t}\n\t\t\t});\n\t\t\tSimpleThread b([&]() {\n\t\t\t\tint item;\n\t\t\t\tint prevItem = -1;\n\t\t\t\twhile (true) {\n\t\t\t\t\tif (q.try_dequeue_from_producer(t, item)) {\n\t\t\t\t\t\tif (item == 123455) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tinOrder = item == prevItem + 1 && inOrder;\n\t\t\t\t\t\tprevItem = item;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\ta.join();\n\t\t\tb.join();\n\t\t}\n\t\tASSERT_OR_FAIL(inOrder);\n\t\t\n\t\t{\n\t\t\t// Single producer, multi consumer\n\t\t\tConcurrentQueue<int, Traits> q;\n\t\t\tProducerToken t(q);\n\t\t\tSimpleThread a([&]() {\n\t\t\t\tfor (int i = 0; i != 123456; ++i) {\n\t\t\t\t\tq.enqueue(t, i);\n\t\t\t\t}\n\t\t\t});\n\t\t\tSimpleThread b([&]() {\n\t\t\t\tint item, prevItem = -1;\n\t\t\t\tfor (int i = 0; i != 123456; ++i) {\n\t\t\t\t\tif (q.try_dequeue_from_producer(t, item)) {\n\t\t\t\t\t\tinOrder = item > prevItem && inOrder;\n\t\t\t\t\t\tprevItem = item;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tSimpleThread c([&]() {\n\t\t\t\tint item;\n\t\t\t\tfor (int i = 0; i != 123456; ++i) q.try_dequeue_from_producer(t, item);\n\t\t\t});\n\t\t\tSimpleThread d([&]() {\n\t\t\t\tint item;\n\t\t\t\tfor (int i = 0; i != 123456; ++i) q.try_dequeue_from_producer(t, item);\n\t\t\t});\n\t\t\t\n\t\t\ta.join();\n\t\t\tb.join();\n\t\t\tc.join();\n\t\t\td.join();\n\t\t}\n\t\tASSERT_OR_FAIL(inOrder);\n\t\t\n\t\tASSERT_OR_FAIL(Traits::malloc_count() == Traits::free_count());\n\t\t\n\t\treturn true;\n\t}\n\t\n\tbool test_threaded_bulk()\n\t{\n\t\ttypedef TestTraits<2> Traits;\n\t\t\n\t\t// Enqueue bulk (implicit)\n\t\tTraits::reset();\n\t\t{\n\t\t\tConcurrentQueue<int, Traits> q;\n\t\t\tSimpleThread threads[2];\n\t\t\tbool success[2];\n\t\t\t\n\t\t\tint stuff[] = { 1, 2, 3, 4, 5 };\n\t\t\tfor (int i = 0; i != 2; ++i) {\n\t\t\t\tsuccess[i] = true;\n\t\t\t\t\n\t\t\t\tif (i == 0) {\n\t\t\t\t\t// Enqueue bulk\n\t\t\t\t\tthreads[i] = SimpleThread([&](int j) {\n\t\t\t\t\t\tfor (int k = 0; k != 2048; ++k) {\n\t\t\t\t\t\t\tsuccess[j] = q.enqueue_bulk(stuff, 5) && success[j];\n\t\t\t\t\t\t}\n\t\t\t\t\t}, i);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Dequeue\n\t\t\t\t\tthreads[i] = SimpleThread([&](int j) {\n\t\t\t\t\t\tint item;\n\t\t\t\t\t\tint prevItem = 0;\n\t\t\t\t\t\tfor (int k = 0; k != 2048 * 5;) {\n\t\t\t\t\t\t\tif (q.try_dequeue(item)) {\n\t\t\t\t\t\t\t\tif (item != prevItem + 1) {\n\t\t\t\t\t\t\t\t\tsuccess[j] = false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tprevItem = item;\n\t\t\t\t\t\t\t\tif (item == 5) {\n\t\t\t\t\t\t\t\t\tprevItem = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t++k;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}, i);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (int i = 0; i != 2; ++i) {\n\t\t\t\tthreads[i].join();\n\t\t\t}\n\t\t\t\n\t\t\tASSERT_OR_FAIL(success[0]);\n\t\t\tASSERT_OR_FAIL(success[1]);\n\t\t}\n\t\t\n\t\t// Enqueue bulk (while somebody is dequeueing (with tokens))\n\t\tTraits::reset();\n\t\t{\n\t\t\tConcurrentQueue<int, Traits> q;\n\t\t\tSimpleThread threads[2];\n\t\t\tbool success[2];\n\t\t\t\n\t\t\tint stuff[] = { 1, 2, 3, 4, 5 };\n\t\t\tfor (int i = 0; i != 2; ++i) {\n\t\t\t\tsuccess[i] = true;\n\t\t\t\t\n\t\t\t\tif (i == 0) {\n\t\t\t\t\t// Enqueue bulk\n\t\t\t\t\tthreads[i] = SimpleThread([&](int j) {\n\t\t\t\t\t\tProducerToken tok(q);\n\t\t\t\t\t\tfor (int k = 0; k != 2048; ++k) {\n\t\t\t\t\t\t\tsuccess[j] = q.enqueue_bulk(tok, stuff, 5) && success[j];\n\t\t\t\t\t\t}\n\t\t\t\t\t}, i);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Dequeue\n\t\t\t\t\tthreads[i] = SimpleThread([&](int j) {\n\t\t\t\t\t\tConsumerToken tok(q);\n\t\t\t\t\t\tint item;\n\t\t\t\t\t\tint prevItem = 0;\n\t\t\t\t\t\tfor (int k = 0; k != 2048 * 5;) {\n\t\t\t\t\t\t\tif (q.try_dequeue(tok, item)) {\n\t\t\t\t\t\t\t\tif (item != prevItem + 1) {\n\t\t\t\t\t\t\t\t\tsuccess[j] = false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tprevItem = item;\n\t\t\t\t\t\t\t\tif (item == 5) {\n\t\t\t\t\t\t\t\t\tprevItem = 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t++k;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}, i);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (int i = 0; i != 2; ++i) {\n\t\t\t\tthreads[i].join();\n\t\t\t}\n\t\t\t\n\t\t\tASSERT_OR_FAIL(success[0]);\n\t\t\tASSERT_OR_FAIL(success[1]);\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\t\n\ttemplate<typename Traits>\n\tbool full_api()\n\t{\n\t\t// A simple test that exercises the full public API (just to make sure every function is implemented\n\t\t// and works on at least the most basic level)\n\t\t\n\t\t// enqueue(T const&)\n\t\t{\n\t\t\tConcurrentQueue<Copyable, Traits> q;\n\t\t\tCopyable original(12345);\n\t\t\tASSERT_OR_FAIL(q.enqueue(original));\n\t\t\tCopyable item(0);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\t// enqueue(T&&)\n\t\t{\n\t\t\tConcurrentQueue<Moveable, Traits> q;\n\t\t\tASSERT_OR_FAIL(q.enqueue(Moveable(12345)));\n\t\t\tMoveable item(0);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.moved);\n\t\t\tASSERT_OR_FAIL(!item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t{\n\t\t\tConcurrentQueue<Moveable, Traits> q;\n\t\t\tMoveable original(12345);\n\t\t\tASSERT_OR_FAIL(q.enqueue(std::move(original)));\n\t\t\tMoveable item(0);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.moved);\n\t\t\tASSERT_OR_FAIL(!item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t{\n\t\t\tConcurrentQueue<Copyable, Traits> q;\n\t\t\tASSERT_OR_FAIL(q.enqueue(Copyable(12345)));\n\t\t\tCopyable item(0);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\t// enqueue(Token, T const&)\n\t\t{\n\t\t\tConcurrentQueue<Copyable, Traits> q;\n\t\t\tProducerToken t(q);\n\t\t\tCopyable original(12345);\n\t\t\tASSERT_OR_FAIL(q.enqueue(t, original));\n\t\t\tCopyable item(0);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\t// enqueue(Token, T&&)\n\t\t{\n\t\t\tConcurrentQueue<Moveable, Traits> q;\n\t\t\tProducerToken t(q);\n\t\t\tASSERT_OR_FAIL(q.enqueue(t, Moveable(12345)));\n\t\t\tMoveable item(0);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.moved);\n\t\t\tASSERT_OR_FAIL(!item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t{\n\t\t\tConcurrentQueue<Moveable, Traits> q;\n\t\t\tProducerToken t(q);\n\t\t\tMoveable original(12345);\n\t\t\tASSERT_OR_FAIL(q.enqueue(t, std::move(original)));\n\t\t\tMoveable item(0);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.moved);\n\t\t\tASSERT_OR_FAIL(!item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t{\n\t\t\tConcurrentQueue<Copyable, Traits> q;\n\t\t\tProducerToken t(q);\n\t\t\tASSERT_OR_FAIL(q.enqueue(t, Copyable(12345)));\n\t\t\tCopyable item(0);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\t// try_enqueue(T const&)\n\t\t{\n\t\t\tConcurrentQueue<Copyable, Traits> q;\n\t\t\tCopyable original(12345);\n\t\t\tASSERT_OR_FAIL(q.try_enqueue(original));\n\t\t\tCopyable item(0);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\t// try_enqueue(T&&)\n\t\t{\n\t\t\tConcurrentQueue<Moveable, Traits> q;\n\t\t\tASSERT_OR_FAIL(q.try_enqueue(Moveable(12345)));\n\t\t\tMoveable item(0);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.moved);\n\t\t\tASSERT_OR_FAIL(!item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t{\n\t\t\tConcurrentQueue<Moveable, Traits> q;\n\t\t\tMoveable original(12345);\n\t\t\tASSERT_OR_FAIL(q.try_enqueue(std::move(original)));\n\t\t\tMoveable item(0);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.moved);\n\t\t\tASSERT_OR_FAIL(!item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t{\n\t\t\tConcurrentQueue<Copyable, Traits> q;\n\t\t\tASSERT_OR_FAIL(q.try_enqueue(Copyable(12345)));\n\t\t\tCopyable item(0);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\t// try_enqueue(Token, T const&)\n\t\t{\n\t\t\tConcurrentQueue<Copyable, Traits> q;\n\t\t\tProducerToken t(q);\n\t\t\tCopyable original(12345);\n\t\t\tASSERT_OR_FAIL(q.try_enqueue(t, original));\n\t\t\tCopyable item(0);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\t// try_enqueue(Token, T&&)\n\t\t{\n\t\t\tConcurrentQueue<Moveable, Traits> q;\n\t\t\tProducerToken t(q);\n\t\t\tASSERT_OR_FAIL(q.try_enqueue(t, Moveable(12345)));\n\t\t\tMoveable item(0);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.moved);\n\t\t\tASSERT_OR_FAIL(!item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t{\n\t\t\tConcurrentQueue<Moveable, Traits> q;\n\t\t\tProducerToken t(q);\n\t\t\tMoveable original(12345);\n\t\t\tASSERT_OR_FAIL(q.try_enqueue(t, std::move(original)));\n\t\t\tMoveable item(0);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.moved);\n\t\t\tASSERT_OR_FAIL(!item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t{\n\t\t\tConcurrentQueue<Copyable, Traits> q;\n\t\t\tProducerToken t(q);\n\t\t\tASSERT_OR_FAIL(q.try_enqueue(t, Copyable(12345)));\n\t\t\tCopyable item(0);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\t// enqueue_bulk(It itemFirst, size_t count)\n\t\t{\n\t\t\tConcurrentQueue<Copyable, Traits> q;\n\t\t\tCopyable original(12345);\n\t\t\tASSERT_OR_FAIL(q.enqueue_bulk(&original, 1));\n\t\t\tCopyable item(0);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t{\n\t\t\tConcurrentQueue<Moveable, Traits> q;\n\t\t\tMoveable original(12345);\n\t\t\tASSERT_OR_FAIL(q.enqueue_bulk(std::make_move_iterator(&original), 1));\n\t\t\tMoveable item(0);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.moved);\n\t\t\tASSERT_OR_FAIL(!item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\t// enqueue_bulk(Token, It itemFirst, size_t count)\n\t\t{\n\t\t\tConcurrentQueue<Copyable, Traits> q;\n\t\t\tProducerToken t(q);\n\t\t\tCopyable original(12345);\n\t\t\tASSERT_OR_FAIL(q.enqueue_bulk(t, &original, 1));\n\t\t\tCopyable item(0);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t{\n\t\t\tConcurrentQueue<Moveable, Traits> q;\n\t\t\tProducerToken t(q);\n\t\t\tMoveable original(12345);\n\t\t\tASSERT_OR_FAIL(q.enqueue_bulk(t, std::make_move_iterator(&original), 1));\n\t\t\tMoveable item(0);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.moved);\n\t\t\tASSERT_OR_FAIL(!item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\t// try_enqueue_bulk(It itemFirst, size_t count)\n\t\t{\n\t\t\tConcurrentQueue<Copyable, Traits> q;\n\t\t\tCopyable original(12345);\n\t\t\tASSERT_OR_FAIL(q.try_enqueue_bulk(&original, 1));\n\t\t\tCopyable item(0);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t{\n\t\t\tConcurrentQueue<Moveable, Traits> q;\n\t\t\tMoveable original(12345);\n\t\t\tASSERT_OR_FAIL(q.try_enqueue_bulk(std::make_move_iterator(&original), 1));\n\t\t\tMoveable item(0);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.moved);\n\t\t\tASSERT_OR_FAIL(!item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\t// try_enqueue_bulk(Token, It itemFirst, size_t count)\n\t\t{\n\t\t\tConcurrentQueue<Copyable, Traits> q;\n\t\t\tProducerToken t(q);\n\t\t\tCopyable original(12345);\n\t\t\tASSERT_OR_FAIL(q.try_enqueue_bulk(t, &original, 1));\n\t\t\tCopyable item(0);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t{\n\t\t\tConcurrentQueue<Moveable, Traits> q;\n\t\t\tProducerToken t(q);\n\t\t\tMoveable original(12345);\n\t\t\tASSERT_OR_FAIL(q.try_enqueue_bulk(t, std::make_move_iterator(&original), 1));\n\t\t\tMoveable item(0);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.moved);\n\t\t\tASSERT_OR_FAIL(!item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\t// try_dequeue(T&)\n\t\t{\n\t\t\tConcurrentQueue<Copyable, Traits> q;\n\t\t\tASSERT_OR_FAIL(q.enqueue(Copyable(12345)));\n\t\t\tCopyable item(0);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t{\n\t\t\tConcurrentQueue<Moveable, Traits> q;\n\t\t\tASSERT_OR_FAIL(q.enqueue(Moveable(12345)));\n\t\t\tMoveable item(0);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.moved);\n\t\t\tASSERT_OR_FAIL(!item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\t// try_dequeue(Token, T&)\n\t\t{\n\t\t\tConcurrentQueue<Copyable, Traits> q;\n\t\t\tASSERT_OR_FAIL(q.enqueue(Copyable(12345)));\n\t\t\tCopyable item(0);\n\t\t\tConsumerToken t(q);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(t, item));\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(t, item));\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t{\n\t\t\tConcurrentQueue<Moveable, Traits> q;\n\t\t\tASSERT_OR_FAIL(q.enqueue(Moveable(12345)));\n\t\t\tMoveable item(0);\n\t\t\tConsumerToken t(q);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(t, item));\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.moved);\n\t\t\tASSERT_OR_FAIL(!item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(t, item));\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\t// try_dequeue_from_producer(Token, T&)\n\t\t{\n\t\t\tConcurrentQueue<Copyable, Traits> q;\n\t\t\tProducerToken t(q);\n\t\t\tASSERT_OR_FAIL(q.enqueue(t, Copyable(12345)));\n\t\t\tCopyable item(0);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_from_producer(t, item));\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue_from_producer(t, item));\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t{\n\t\t\tConcurrentQueue<Moveable, Traits> q;\n\t\t\tProducerToken t(q);\n\t\t\tASSERT_OR_FAIL(q.enqueue(t, Moveable(12345)));\n\t\t\tMoveable item(0);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_from_producer(t, item));\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.moved);\n\t\t\tASSERT_OR_FAIL(!item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue_from_producer(t, item));\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\t// try_dequeue_bulk(T&)\n\t\t{\n\t\t\tConcurrentQueue<Copyable, Traits> q;\n\t\t\tASSERT_OR_FAIL(q.enqueue(Copyable(12345)));\n\t\t\tCopyable item(0);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_bulk(&item, 1) == 1);\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue_bulk(&item, 1));\n\t\t}\n\t\t{\n\t\t\tConcurrentQueue<Moveable, Traits> q;\n\t\t\tASSERT_OR_FAIL(q.enqueue(Moveable(12345)));\n\t\t\tMoveable item(0);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_bulk(&item, 1) == 1);\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.moved);\n\t\t\tASSERT_OR_FAIL(!item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue_bulk(&item, 1));\n\t\t}\n\t\t\n\t\t// try_dequeue_bulk(Token, T&)\n\t\t{\n\t\t\tConcurrentQueue<Copyable, Traits> q;\n\t\t\tASSERT_OR_FAIL(q.enqueue(Copyable(12345)));\n\t\t\tCopyable item(0);\n\t\t\tConsumerToken t(q);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_bulk(t, &item, 1));\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue_bulk(t, &item, 1));\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue_bulk(&item, 1));\n\t\t}\n\t\t{\n\t\t\tConcurrentQueue<Moveable, Traits> q;\n\t\t\tASSERT_OR_FAIL(q.enqueue(Moveable(12345)));\n\t\t\tMoveable item(0);\n\t\t\tConsumerToken t(q);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_bulk(t, &item, 1));\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.moved);\n\t\t\tASSERT_OR_FAIL(!item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue_bulk(t, &item, 1));\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue_bulk(&item, 1));\n\t\t}\n\t\t\n\t\t// try_dequeue_bulk_from_producer(Token, T&)\n\t\t{\n\t\t\tConcurrentQueue<Copyable, Traits> q;\n\t\t\tProducerToken t(q);\n\t\t\tASSERT_OR_FAIL(q.enqueue(t, Copyable(12345)));\n\t\t\tCopyable item(0);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_bulk_from_producer(t, &item, 1));\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue_bulk_from_producer(t, &item, 1));\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t{\n\t\t\tConcurrentQueue<Moveable, Traits> q;\n\t\t\tProducerToken t(q);\n\t\t\tASSERT_OR_FAIL(q.enqueue(t, Moveable(12345)));\n\t\t\tMoveable item(0);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue_bulk_from_producer(t, &item, 1));\n\t\t\tASSERT_OR_FAIL(item.id == 12345);\n\t\t\tASSERT_OR_FAIL(item.moved);\n\t\t\tASSERT_OR_FAIL(!item.copied);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue_bulk_from_producer(t, &item, 1));\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t}\n\t\t\n\t\t// size_approx()\n\t\t{\n\t\t\tConcurrentQueue<Foo, Traits> q;\n\t\t\tfor (int i = 0; i != 1234; ++i) {\n\t\t\t\tq.enqueue(Foo());\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 1234);\n\t\t}\n\t\t\n\t\t// is_lock_free()\n\t\t{\n\t\t\tconstexpr bool lockFree = ConcurrentQueue<Foo, Traits>::is_lock_free();\n#if defined(__amd64__) || defined(_M_X64) || defined(__x86_64__) || defined(_M_IX86) || defined(__i386__) || defined(_M_PPC) || defined(__powerpc__)\n\t\t\tstatic_assert(lockFree, \"is_lock_free should be true\");\n#else\n\t\t\t(void)lockFree;\n#endif\n\t\t}\n\t\t\n\t\t// moving\n\t\t{\n\t\t\tConcurrentQueue<int, MallocTrackingTraits> q(4);\n\t\t\tProducerToken t(q);\n\t\t\tfor (int i = 0; i != 1233; ++i) {\n\t\t\t\tq.enqueue(i);\n\t\t\t}\n\t\t\tfor (int i = 1234; i != 5678; ++i) {\n\t\t\t\tq.enqueue(t, i);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 5677);\n\t\t\t\n\t\t\tConcurrentQueue<int, MallocTrackingTraits> q2(std::move(q));\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 0);\n\t\t\tASSERT_OR_FAIL(q2.size_approx() == 5677);\n\t\t\t\n\t\t\tq2.enqueue(t, 5678);\n\t\t\tq2.enqueue(1233);\n\t\t\tASSERT_OR_FAIL(q2.size_approx() == 5679);\n\t\t\t\n\t\t\tfor (int i = 1234; i != 0; --i) {\n\t\t\t\tq.enqueue(i);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 1234);\n\t\t\t\n\t\t\tint item;\n\t\t\tfor (int i = 0; i <= 5678; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q2.try_dequeue_non_interleaved(item));\n\t\t\t\tASSERT_OR_FAIL(item == i);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(!q2.try_dequeue_non_interleaved(item));\n\t\t\tASSERT_OR_FAIL(q2.size_approx() == 0);\n\t\t\t\n\t\t\tfor (int i = 1234; i != 0; --i) {\n\t\t\t\tASSERT_OR_FAIL(q.try_dequeue_non_interleaved(item));\n\t\t\t\tASSERT_OR_FAIL(item == i);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue_non_interleaved(item));\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 0);\n\t\t}\n\t\t\n\t\t// swapping\n\t\t{\n\t\t\tConcurrentQueue<int, MallocTrackingTraits> q1, q2, q3;\n\t\t\tProducerToken t1(q1), t2(q2), t3(q3);\n\t\t\t\n\t\t\tfor (int i = 1234; i != 5678; ++i) {\n\t\t\t\tq1.enqueue(t1, i);\n\t\t\t}\n\t\t\tfor (int i = 21234; i != 25678; ++i) {\n\t\t\t\tq2.enqueue(t2, i);\n\t\t\t}\n\t\t\tfor (int i = 31234; i != 35678; ++i) {\n\t\t\t\tq3.enqueue(t3, i);\n\t\t\t}\n\t\t\t\n\t\t\tfor (int i = 0; i != 1234; ++i) {\n\t\t\t\tq1.enqueue(i);\n\t\t\t}\n\t\t\tfor (int i = 20000; i != 21234; ++i) {\n\t\t\t\tq2.enqueue(i);\n\t\t\t}\n\t\t\tfor (int i = 30000; i != 31234; ++i) {\n\t\t\t\tq3.enqueue(i);\n\t\t\t}\n\t\t\t\n\t\t\t{\n\t\t\t\tConcurrentQueue<int, MallocTrackingTraits> temp;\n\t\t\t\ttemp = std::move(q1);\n\t\t\t\tq1 = std::move(q2);\n\t\t\t\tq2 = std::move(temp);\n\t\t\t}\n\t\t\t// q1 in q2, q2 in q1\n\t\t\t\n\t\t\tswap(q2, q3);\t// q1 in q3, q3 in q2\n\t\t\tq1.swap(q2);\t// q2 in q2, q3 in q1\n\t\t\tq1.swap(q2);\t// q3 in q2, q2 in q1\n\t\t\tq1.swap(q2);\t// q2 in q2, q3 in q1\n\t\t\tq2.swap(q3);\t// q1 in q2, q2 in q3\n\t\t\t\n\t\t\t// So now q1 is in q2, q2 is in q3, and q3 is in q1\n\t\t\tint item;\n\t\t\tfor (int i = 30000; i != 35678; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q1.try_dequeue_non_interleaved(item));\n\t\t\t\tASSERT_OR_FAIL(item == i);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(!q1.try_dequeue_non_interleaved(item));\n\t\t\tASSERT_OR_FAIL(q1.size_approx() == 0);\n\t\t\t\n\t\t\tfor (int i = 0; i != 5678; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q2.try_dequeue_non_interleaved(item));\n\t\t\t\tASSERT_OR_FAIL(item == i);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(!q2.try_dequeue_non_interleaved(item));\n\t\t\tASSERT_OR_FAIL(q2.size_approx() == 0);\n\t\t\t\n\t\t\tfor (int i = 20000; i != 25678; ++i) {\n\t\t\t\tASSERT_OR_FAIL(q3.try_dequeue_non_interleaved(item));\n\t\t\t\tASSERT_OR_FAIL(item == i);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(!q3.try_dequeue_non_interleaved(item));\n\t\t\tASSERT_OR_FAIL(q3.size_approx() == 0);\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\t\n\t\n\tbool blocking_wrappers()\n\t{\n\t\ttypedef BlockingConcurrentQueue<int, MallocTrackingTraits> Q;\n\t\tASSERT_OR_FAIL((Q::is_lock_free() == ConcurrentQueue<int, MallocTrackingTraits>::is_lock_free()));\n\t\t\n\t\t// Moving\n\t\t{\n\t\t\tQ a, b, c;\n\t\t\ta = std::move(b);\n\t\t\tb = std::move(c);\n\t\t\ta = std::move(a);\n\t\t\tc = std::move(b);\n\t\t\tb = Q(std::move(b));\n\t\t\tusing std::swap;\n\t\t\tswap(a, b);\n\t\t\ta.swap(c);\n\t\t\tc.swap(c);\n\t\t}\n\t\t\n\t\t// Implicit\n\t\t{\n\t\t\tQ q;\n\t\t\tASSERT_OR_FAIL(q.enqueue(1));\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 1);\n\t\t\tint item;\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(item == 1);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 0);\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.enqueue(2));\n\t\t\tASSERT_OR_FAIL(q.enqueue(3));\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 2);\n\t\t\tq.wait_dequeue(item);\n\t\t\tASSERT_OR_FAIL(item == 2);\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 1);\n\t\t\tq.wait_dequeue(item);\n\t\t\tASSERT_OR_FAIL(item == 3);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(item));\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 0);\n\t\t}\n\t\t\n\t\t// Implicit threaded\n\t\t{\n\t\t\tQ q;\n\t\t\tconst int THREADS = 8;\n\t\t\tSimpleThread threads[THREADS];\n\t\t\tbool success[THREADS];\n\t\t\t\n\t\t\tfor (int i = 0; i != THREADS; ++i) {\n\t\t\t\tsuccess[i] = true;\n\t\t\t\t\n\t\t\t\tif (i % 2 == 0) {\n\t\t\t\t\t// Enqueue\n\t\t\t\t\tif (i % 4 == 0) {\n\t\t\t\t\t\tthreads[i] = SimpleThread([&](int j) {\n\t\t\t\t\t\t\tint stuff[5];\n\t\t\t\t\t\t\tfor (int k = 0; k != 2048; ++k) {\n\t\t\t\t\t\t\t\tfor (int x = 0; x != 5; ++x) {\n\t\t\t\t\t\t\t\t\tstuff[x] = (j << 16) | (k * 5 + x);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tsuccess[j] = q.enqueue_bulk(stuff, 5) && success[j];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, i);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthreads[i] = SimpleThread([&](int j) {\n\t\t\t\t\t\t\tfor (int k = 0; k != 4096; ++k) {\n\t\t\t\t\t\t\t\tsuccess[j] = q.enqueue((j << 16) | k) && success[j];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, i);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Dequeue\n\t\t\t\t\tthreads[i] = SimpleThread([&](int j) {\n\t\t\t\t\t\tint item;\n\t\t\t\t\t\tstd::vector<int> prevItems(THREADS, -1);\n\t\t\t\t\t\tif (j % 4 == 1) {\n\t\t\t\t\t\t\tfor (int k = 0; k != 2048 * 5; ++k) {\n\t\t\t\t\t\t\t\tif (q.try_dequeue(item)) {\n\t\t\t\t\t\t\t\t\tint thread = item >> 16;\n\t\t\t\t\t\t\t\t\titem &= 0xffff;\n\t\t\t\t\t\t\t\t\tif (item <= prevItems[thread]) {\n\t\t\t\t\t\t\t\t\t\tsuccess[j] = false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tprevItems[thread] = item;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tint items[6];\n\t\t\t\t\t\t\tfor (int k = 0; k < 4096;  ++k) {\n\t\t\t\t\t\t\t\tif (std::size_t dequeued = q.try_dequeue_bulk(items, 6)) {\n\t\t\t\t\t\t\t\t\tfor (std::size_t x = 0; x != dequeued; ++x) {\n\t\t\t\t\t\t\t\t\t\titem = items[x];\n\t\t\t\t\t\t\t\t\t\tint thread = item >> 16;\n\t\t\t\t\t\t\t\t\t\titem &= 0xffff;\n\t\t\t\t\t\t\t\t\t\tif (item <= prevItems[thread]) {\n\t\t\t\t\t\t\t\t\t\t\tsuccess[j] = false;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tprevItems[thread] = item;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}, i);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (int i = 0; i != THREADS; ++i) {\n\t\t\t\tthreads[i].join();\n\t\t\t}\n\t\t\t\n\t\t\tfor (int i = 0; i != THREADS; ++i) {\n\t\t\t\tASSERT_OR_FAIL(success[i]);\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Implicit threaded, blocking\n\t\t{\n\t\t\tQ q;\n\t\t\tconst int THREADS = 8;\n\t\t\tSimpleThread threads[THREADS];\n\t\t\tbool success[THREADS];\n\t\t\t\n\t\t\tfor (int i = 0; i != THREADS; ++i) {\n\t\t\t\tsuccess[i] = true;\n\t\t\t\t\n\t\t\t\tif (i % 2 == 0) {\n\t\t\t\t\t// Enqueue\n\t\t\t\t\tif (i % 4 == 0) {\n\t\t\t\t\t\tthreads[i] = SimpleThread([&](int j) {\n\t\t\t\t\t\t\tint stuff[5];\n\t\t\t\t\t\t\tfor (int k = 0; k != 2048; ++k) {\n\t\t\t\t\t\t\t\tfor (int x = 0; x != 5; ++x) {\n\t\t\t\t\t\t\t\t\tstuff[x] = (j << 16) | (k * 5 + x);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tsuccess[j] = q.enqueue_bulk(stuff, 5) && success[j];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, i);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthreads[i] = SimpleThread([&](int j) {\n\t\t\t\t\t\t\tfor (int k = 0; k != 4096; ++k) {\n\t\t\t\t\t\t\t\tsuccess[j] = q.enqueue((j << 16) | k) && success[j];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, i);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Dequeue\n\t\t\t\t\tthreads[i] = SimpleThread([&](int j) {\n\t\t\t\t\t\tint item;\n\t\t\t\t\t\tstd::vector<int> prevItems(THREADS, -1);\n\t\t\t\t\t\tif (j % 4 == 1) {\n\t\t\t\t\t\t\tfor (int k = 0; k != 2048 * 5; ++k) {\n\t\t\t\t\t\t\t\tq.wait_dequeue(item);\n\t\t\t\t\t\t\t\tint thread = item >> 16;\n\t\t\t\t\t\t\t\titem &= 0xffff;\n\t\t\t\t\t\t\t\tif (item <= prevItems[thread]) {\n\t\t\t\t\t\t\t\t\tsuccess[j] = false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tprevItems[thread] = item;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tint items[6];\n\t\t\t\t\t\t\tint k;\n\t\t\t\t\t\t\tfor (k = 0; k < 4090; ) {\n\t\t\t\t\t\t\t\tif (std::size_t dequeued = q.wait_dequeue_bulk(items, 6)) {\n\t\t\t\t\t\t\t\t\tfor (std::size_t x = 0; x != dequeued; ++x) {\n\t\t\t\t\t\t\t\t\t\titem = items[x];\n\t\t\t\t\t\t\t\t\t\tint thread = item >> 16;\n\t\t\t\t\t\t\t\t\t\titem &= 0xffff;\n\t\t\t\t\t\t\t\t\t\tif (item <= prevItems[thread]) {\n\t\t\t\t\t\t\t\t\t\t\tsuccess[j] = false;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tprevItems[thread] = item;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tk += (int)dequeued;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tsuccess[j] = false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfor (; k != 4096; ++k) {\n\t\t\t\t\t\t\t\tq.wait_dequeue(item);\n\t\t\t\t\t\t\t\tint thread = item >> 16;\n\t\t\t\t\t\t\t\titem &= 0xffff;\n\t\t\t\t\t\t\t\tif (item <= prevItems[thread]) {\n\t\t\t\t\t\t\t\t\tsuccess[j] = false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tprevItems[thread] = item;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}, i);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (int i = 0; i != THREADS; ++i) {\n\t\t\t\tthreads[i].join();\n\t\t\t}\n\t\t\t\n\t\t\tfor (int i = 0; i != THREADS; ++i) {\n\t\t\t\tASSERT_OR_FAIL(success[i]);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 0);\n\t\t}\n\t\t\n\t\t// Explicit\n\t\t{\n\t\t\tQ q;\n\t\t\tProducerToken pt(q);\n\t\t\tASSERT_OR_FAIL(q.enqueue(pt, 1));\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 1);\n\t\t\tint item;\n\t\t\tConsumerToken ct(q);\n\t\t\tASSERT_OR_FAIL(q.try_dequeue(ct, item));\n\t\t\tASSERT_OR_FAIL(item == 1);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(ct, item));\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 0);\n\t\t\t\n\t\t\tASSERT_OR_FAIL(q.enqueue(pt, 2));\n\t\t\tASSERT_OR_FAIL(q.enqueue(pt, 3));\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 2);\n\t\t\tq.wait_dequeue(ct, item);\n\t\t\tASSERT_OR_FAIL(item == 2);\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 1);\n\t\t\tq.wait_dequeue(ct, item);\n\t\t\tASSERT_OR_FAIL(item == 3);\n\t\t\tASSERT_OR_FAIL(!q.try_dequeue(ct, item));\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 0);\n\t\t}\n\t\t\n\t\t// Explicit threaded\n\t\t{\n\t\t\tQ q;\n\t\t\tconst int THREADS = 8;\n\t\t\tSimpleThread threads[THREADS];\n\t\t\tbool success[THREADS];\n\t\t\t\n\t\t\tfor (int i = 0; i != THREADS; ++i) {\n\t\t\t\tsuccess[i] = true;\n\t\t\t\t\n\t\t\t\tif (i % 2 == 0) {\n\t\t\t\t\t// Enqueue\n\t\t\t\t\tif (i % 4 == 0) {\n\t\t\t\t\t\tthreads[i] = SimpleThread([&](int j) {\n\t\t\t\t\t\t\tProducerToken t(q);\n\t\t\t\t\t\t\tint stuff[5];\n\t\t\t\t\t\t\tfor (int k = 0; k != 2048; ++k) {\n\t\t\t\t\t\t\t\tfor (int x = 0; x != 5; ++x) {\n\t\t\t\t\t\t\t\t\tstuff[x] = (j << 16) | (k * 5 + x);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tsuccess[j] = q.enqueue_bulk(t, stuff, 5) && success[j];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, i);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthreads[i] = SimpleThread([&](int j) {\n\t\t\t\t\t\t\tProducerToken t(q);\n\t\t\t\t\t\t\tfor (int k = 0; k != 4096; ++k) {\n\t\t\t\t\t\t\t\tsuccess[j] = q.enqueue(t, (j << 16) | k) && success[j];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, i);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Dequeue\n\t\t\t\t\tthreads[i] = SimpleThread([&](int j) {\n\t\t\t\t\t\tConsumerToken t(q);\n\t\t\t\t\t\tint item;\n\t\t\t\t\t\tstd::vector<int> prevItems(THREADS, -1);\n\t\t\t\t\t\tif (j % 4 == 1) {\n\t\t\t\t\t\t\tfor (int k = 0; k != 2048 * 5; ++k) {\n\t\t\t\t\t\t\t\tif (q.try_dequeue(t, item)) {\n\t\t\t\t\t\t\t\t\tint thread = item >> 16;\n\t\t\t\t\t\t\t\t\titem &= 0xffff;\n\t\t\t\t\t\t\t\t\tif (item <= prevItems[thread]) {\n\t\t\t\t\t\t\t\t\t\tsuccess[j] = false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tprevItems[thread] = item;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tint items[6];\n\t\t\t\t\t\t\tfor (int k = 0; k < 4096;  ++k) {\n\t\t\t\t\t\t\t\tif (std::size_t dequeued = q.try_dequeue_bulk(t, items, 6)) {\n\t\t\t\t\t\t\t\t\tfor (std::size_t x = 0; x != dequeued; ++x) {\n\t\t\t\t\t\t\t\t\t\titem = items[x];\n\t\t\t\t\t\t\t\t\t\tint thread = item >> 16;\n\t\t\t\t\t\t\t\t\t\titem &= 0xffff;\n\t\t\t\t\t\t\t\t\t\tif (item <= prevItems[thread]) {\n\t\t\t\t\t\t\t\t\t\t\tsuccess[j] = false;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tprevItems[thread] = item;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}, i);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (int i = 0; i != THREADS; ++i) {\n\t\t\t\tthreads[i].join();\n\t\t\t}\n\t\t\t\n\t\t\tfor (int i = 0; i != THREADS; ++i) {\n\t\t\t\tASSERT_OR_FAIL(success[i]);\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Explicit threaded, blocking\n\t\t{\n\t\t\tQ q;\n\t\t\tconst int THREADS = 8;\n\t\t\tSimpleThread threads[THREADS];\n\t\t\tbool success[THREADS];\n\t\t\t\n\t\t\tfor (int i = 0; i != THREADS; ++i) {\n\t\t\t\tsuccess[i] = true;\n\t\t\t\t\n\t\t\t\tif (i % 2 == 0) {\n\t\t\t\t\t// Enqueue\n\t\t\t\t\tif (i % 4 == 0) {\n\t\t\t\t\t\tthreads[i] = SimpleThread([&](int j) {\n\t\t\t\t\t\t\tProducerToken t(q);\n\t\t\t\t\t\t\tint stuff[5];\n\t\t\t\t\t\t\tfor (int k = 0; k != 2048; ++k) {\n\t\t\t\t\t\t\t\tfor (int x = 0; x != 5; ++x) {\n\t\t\t\t\t\t\t\t\tstuff[x] = (j << 16) | (k * 5 + x);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tsuccess[j] = q.enqueue_bulk(t, stuff, 5) && success[j];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, i);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthreads[i] = SimpleThread([&](int j) {\n\t\t\t\t\t\t\tProducerToken t(q);\n\t\t\t\t\t\t\tfor (int k = 0; k != 4096; ++k) {\n\t\t\t\t\t\t\t\tsuccess[j] = q.enqueue(t, (j << 16) | k) && success[j];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, i);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Dequeue\n\t\t\t\t\tthreads[i] = SimpleThread([&](int j) {\n\t\t\t\t\t\tConsumerToken t(q);\n\t\t\t\t\t\tint item;\n\t\t\t\t\t\tstd::vector<int> prevItems(THREADS, -1);\n\t\t\t\t\t\tif (j % 4 == 1) {\n\t\t\t\t\t\t\tfor (int k = 0; k != 2048 * 5; ++k) {\n\t\t\t\t\t\t\t\tq.wait_dequeue(t, item);\n\t\t\t\t\t\t\t\tint thread = item >> 16;\n\t\t\t\t\t\t\t\titem &= 0xffff;\n\t\t\t\t\t\t\t\tif (item <= prevItems[thread]) {\n\t\t\t\t\t\t\t\t\tsuccess[j] = false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tprevItems[thread] = item;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tint items[6];\n\t\t\t\t\t\t\tint k;\n\t\t\t\t\t\t\tfor (k = 0; k < 4090; ) {\n\t\t\t\t\t\t\t\tif (std::size_t dequeued = q.wait_dequeue_bulk(t, items, 6)) {\n\t\t\t\t\t\t\t\t\tfor (std::size_t x = 0; x != dequeued; ++x) {\n\t\t\t\t\t\t\t\t\t\titem = items[x];\n\t\t\t\t\t\t\t\t\t\tint thread = item >> 16;\n\t\t\t\t\t\t\t\t\t\titem &= 0xffff;\n\t\t\t\t\t\t\t\t\t\tif (item <= prevItems[thread]) {\n\t\t\t\t\t\t\t\t\t\t\tsuccess[j] = false;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tprevItems[thread] = item;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tk += (int)dequeued;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tsuccess[j] = false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfor (; k != 4096; ++k) {\n\t\t\t\t\t\t\t\tq.wait_dequeue(t, item);\n\t\t\t\t\t\t\t\tint thread = item >> 16;\n\t\t\t\t\t\t\t\titem &= 0xffff;\n\t\t\t\t\t\t\t\tif (item <= prevItems[thread]) {\n\t\t\t\t\t\t\t\t\tsuccess[j] = false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tprevItems[thread] = item;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}, i);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (int i = 0; i != THREADS; ++i) {\n\t\t\t\tthreads[i].join();\n\t\t\t}\n\t\t\t\n\t\t\tfor (int i = 0; i != THREADS; ++i) {\n\t\t\t\tASSERT_OR_FAIL(success[i]);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 0);\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\t\n\tbool timed_blocking_wrappers()\n\t{\n\t\ttypedef BlockingConcurrentQueue<int, MallocTrackingTraits> Q;\n\t\t\n\t\t// Implicit\n\t\t{\n\t\t\tQ q;\n\t\t\tint item;\n\t\t\tASSERT_OR_FAIL(!q.wait_dequeue_timed(item, 0));\n\t\t\tASSERT_OR_FAIL(!q.wait_dequeue_timed(item, 1));\n\t\t\tASSERT_OR_FAIL(!q.wait_dequeue_timed(item, 100));\n\t\t\tASSERT_OR_FAIL(!q.wait_dequeue_timed(item, std::chrono::milliseconds(1)));\n\t\t\tq.enqueue(123);\n\t\t\tASSERT_OR_FAIL(q.wait_dequeue_timed(item, 0));\n\t\t\tASSERT_OR_FAIL(item == 123);\n\t\t}\n\t\t\n\t\t// Implicit, threaded\n\t\t{\n\t\t\tQ q;\n\t\t\tconst int THREADS = 8;\n\t\t\tSimpleThread threads[THREADS];\n\t\t\tbool success[THREADS];\n\t\t\t\n\t\t\tfor (int i = 0; i != THREADS; ++i) {\n\t\t\t\tsuccess[i] = true;\n\t\t\t\t\n\t\t\t\tif (i % 2 == 0) {\n\t\t\t\t\t// Enqueue\n\t\t\t\t\tif (i % 4 == 0) {\n\t\t\t\t\t\tthreads[i] = SimpleThread([&](int j) {\n\t\t\t\t\t\t\tint stuff[5];\n\t\t\t\t\t\t\tfor (int k = 0; k != 2048; ++k) {\n\t\t\t\t\t\t\t\tfor (int x = 0; x != 5; ++x) {\n\t\t\t\t\t\t\t\t\tstuff[x] = (j << 16) | (k * 5 + x);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tsuccess[j] = q.enqueue_bulk(stuff, 5) && success[j];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, i);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthreads[i] = SimpleThread([&](int j) {\n\t\t\t\t\t\t\tfor (int k = 0; k != 4096; ++k) {\n\t\t\t\t\t\t\t\tsuccess[j] = q.enqueue((j << 16) | k) && success[j];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, i);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Dequeue\n\t\t\t\t\tthreads[i] = SimpleThread([&](int j) {\n\t\t\t\t\t\tint item;\n\t\t\t\t\t\tstd::vector<int> prevItems(THREADS, -1);\n\t\t\t\t\t\tif (j % 4 == 1) {\n\t\t\t\t\t\t\tfor (int k = 0; k != 2048 * 5; ++k) {\n\t\t\t\t\t\t\t\tif (!q.wait_dequeue_timed(item, 1000)) {\n\t\t\t\t\t\t\t\t\t--k;\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tint thread = item >> 16;\n\t\t\t\t\t\t\t\titem &= 0xffff;\n\t\t\t\t\t\t\t\tif (item <= prevItems[thread]) {\n\t\t\t\t\t\t\t\t\tsuccess[j] = false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tprevItems[thread] = item;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tint items[6];\n\t\t\t\t\t\t\tint k;\n\t\t\t\t\t\t\tfor (k = 0; k < 4090; ) {\n\t\t\t\t\t\t\t\tif (std::size_t dequeued = q.wait_dequeue_bulk_timed(items, 6, 1000)) {\n\t\t\t\t\t\t\t\t\tfor (std::size_t x = 0; x != dequeued; ++x) {\n\t\t\t\t\t\t\t\t\t\titem = items[x];\n\t\t\t\t\t\t\t\t\t\tint thread = item >> 16;\n\t\t\t\t\t\t\t\t\t\titem &= 0xffff;\n\t\t\t\t\t\t\t\t\t\tif (item <= prevItems[thread]) {\n\t\t\t\t\t\t\t\t\t\t\tsuccess[j] = false;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tprevItems[thread] = item;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tk += (int)dequeued;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfor (; k != 4096; ++k) {\n\t\t\t\t\t\t\t\tif (!q.wait_dequeue_timed(item, std::chrono::hours(1))) {\n\t\t\t\t\t\t\t\t\tsuccess[j] = false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tint thread = item >> 16;\n\t\t\t\t\t\t\t\titem &= 0xffff;\n\t\t\t\t\t\t\t\tif (item <= prevItems[thread]) {\n\t\t\t\t\t\t\t\t\tsuccess[j] = false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tprevItems[thread] = item;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}, i);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (int i = 0; i != THREADS; ++i) {\n\t\t\t\tthreads[i].join();\n\t\t\t}\n\t\t\t\n\t\t\tfor (int i = 0; i != THREADS; ++i) {\n\t\t\t\tASSERT_OR_FAIL(success[i]);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 0);\n\t\t\t\n\t\t\tint item;\n\t\t\tASSERT_OR_FAIL(!q.wait_dequeue_timed(item, 0));\n\t\t}\n\t\t\n\t\t// Explicit\n\t\t{\n\t\t\tQ q;\n\t\t\tProducerToken ptok(q);\n\t\t\tConsumerToken ctok(q);\n\t\t\tint item;\n\t\t\tASSERT_OR_FAIL(!q.wait_dequeue_timed(ctok, item, 0));\n\t\t\tASSERT_OR_FAIL(!q.wait_dequeue_timed(ctok, item, 1));\n\t\t\tASSERT_OR_FAIL(!q.wait_dequeue_timed(ctok, item, 100));\n\t\t\tASSERT_OR_FAIL(!q.wait_dequeue_timed(ctok, item, std::chrono::milliseconds(1)));\n\t\t\tq.enqueue(ptok, 123);\n\t\t\tASSERT_OR_FAIL(q.wait_dequeue_timed(ctok, item, 0));\n\t\t\tASSERT_OR_FAIL(item == 123);\n\t\t}\n\t\t\n\t\t// Explicit, threaded\n\t\t{\n\t\t\tQ q;\n\t\t\tconst int THREADS = 8;\n\t\t\tSimpleThread threads[THREADS];\n\t\t\tbool success[THREADS];\n\t\t\t\n\t\t\tfor (int i = 0; i != THREADS; ++i) {\n\t\t\t\tsuccess[i] = true;\n\t\t\t\t\n\t\t\t\tif (i % 2 == 0) {\n\t\t\t\t\t// Enqueue\n\t\t\t\t\tif (i % 4 == 0) {\n\t\t\t\t\t\tthreads[i] = SimpleThread([&](int j) {\n\t\t\t\t\t\t\tProducerToken tok(q);\n\t\t\t\t\t\t\tint stuff[5];\n\t\t\t\t\t\t\tfor (int k = 0; k != 2048; ++k) {\n\t\t\t\t\t\t\t\tfor (int x = 0; x != 5; ++x) {\n\t\t\t\t\t\t\t\t\tstuff[x] = (j << 16) | (k * 5 + x);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tsuccess[j] = q.enqueue_bulk(tok, stuff, 5) && success[j];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, i);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthreads[i] = SimpleThread([&](int j) {\n\t\t\t\t\t\t\tProducerToken tok(q);\n\t\t\t\t\t\t\tfor (int k = 0; k != 4096; ++k) {\n\t\t\t\t\t\t\t\tsuccess[j] = q.enqueue(tok, (j << 16) | k) && success[j];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, i);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Dequeue\n\t\t\t\t\tthreads[i] = SimpleThread([&](int j) {\n\t\t\t\t\t\tint item;\n\t\t\t\t\t\tstd::vector<int> prevItems(THREADS, -1);\n\t\t\t\t\t\tConsumerToken tok(q);\n\t\t\t\t\t\tif (j % 4 == 1) {\n\t\t\t\t\t\t\tfor (int k = 0; k != 2048 * 5; ++k) {\n\t\t\t\t\t\t\t\tif (!q.wait_dequeue_timed(tok, item, 1000)) {\n\t\t\t\t\t\t\t\t\t--k;\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tint thread = item >> 16;\n\t\t\t\t\t\t\t\titem &= 0xffff;\n\t\t\t\t\t\t\t\tif (item <= prevItems[thread]) {\n\t\t\t\t\t\t\t\t\tsuccess[j] = false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tprevItems[thread] = item;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tint items[6];\n\t\t\t\t\t\t\tint k;\n\t\t\t\t\t\t\tfor (k = 0; k < 4090; ) {\n\t\t\t\t\t\t\t\tif (std::size_t dequeued = q.wait_dequeue_bulk_timed(tok, items, 6, 1000)) {\n\t\t\t\t\t\t\t\t\tfor (std::size_t x = 0; x != dequeued; ++x) {\n\t\t\t\t\t\t\t\t\t\titem = items[x];\n\t\t\t\t\t\t\t\t\t\tint thread = item >> 16;\n\t\t\t\t\t\t\t\t\t\titem &= 0xffff;\n\t\t\t\t\t\t\t\t\t\tif (item <= prevItems[thread]) {\n\t\t\t\t\t\t\t\t\t\t\tsuccess[j] = false;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tprevItems[thread] = item;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tk += (int)dequeued;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfor (; k != 4096; ++k) {\n\t\t\t\t\t\t\t\tif (!q.wait_dequeue_timed(tok, item, std::chrono::hours(1))) {\n\t\t\t\t\t\t\t\t\tsuccess[j] = false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tint thread = item >> 16;\n\t\t\t\t\t\t\t\titem &= 0xffff;\n\t\t\t\t\t\t\t\tif (item <= prevItems[thread]) {\n\t\t\t\t\t\t\t\t\tsuccess[j] = false;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tprevItems[thread] = item;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}, i);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (int i = 0; i != THREADS; ++i) {\n\t\t\t\tthreads[i].join();\n\t\t\t}\n\t\t\t\n\t\t\tfor (int i = 0; i != THREADS; ++i) {\n\t\t\t\tASSERT_OR_FAIL(success[i]);\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(q.size_approx() == 0);\n\t\t\t\n\t\t\tint item;\n\t\t\tConsumerToken tok(q);\n\t\t\tASSERT_OR_FAIL(!q.wait_dequeue_timed(tok, item, 0));\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\n\t\n\tbool c_api_create()\n\t{\n\t\tMoodycamelCQHandle handle;\n\t\tint rc = moodycamel_cq_create(&handle);\n\t\tASSERT_OR_FAIL(rc == 1);\n\t\tASSERT_OR_FAIL(handle != nullptr);\n\t\tmoodycamel_cq_destroy(handle);\n\t\treturn true;\n\t}\n\n\tbool c_api_enqueue()\n\t{\n\t\tMoodycamelCQHandle handle;\n\t\tint rc = moodycamel_cq_create(&handle);\n\t\tint i = 10;\n\t\trc = moodycamel_cq_enqueue(handle, &i);\n\t\tASSERT_OR_FAIL(rc == 1);\n\t\tmoodycamel_cq_destroy(handle);\n\t\treturn true;\n\t}\n\t\n\tbool c_api_try_dequeue()\n\t{\n\t\tMoodycamelCQHandle handle;\n\t\tint rc = moodycamel_cq_create(&handle);\n\t\t{\n\t\t\tMoodycamelValue n;\n\t\t\trc = moodycamel_cq_try_dequeue(handle, &n);\n\t\t\tASSERT_OR_FAIL(rc == 0);\n\t\t}\n\t\tint i = 10;\n\t\trc = moodycamel_cq_enqueue(handle, &i);\n\t\t{\n\t\t\tMoodycamelValue value;\n\t\t\trc = moodycamel_cq_try_dequeue(handle, &value);\n\t\t\tint n = *reinterpret_cast<int*>(value);\n\t\t\tASSERT_OR_FAIL(rc == 1);\n\t\t\tASSERT_OR_FAIL(n == 10);\n\t\t}\n\t\tmoodycamel_cq_destroy(handle);\n\t\treturn true;\n\t}\n\t\n\tbool c_api_destroy()\n\t{\n\t\tMoodycamelCQHandle handle;\n\t\tmoodycamel_cq_create(&handle);\t\t\n\t\tmoodycamel_cq_destroy(handle);\n\t\treturn true;\n\t}\n\n\tbool acquire_and_signal()\n\t{\n\t\tconst unsigned TIMEOUT_US = 10 * 1000 * 1000;  // 10s\n\n\t\t// Test resource acquisition from one other thread\n\t\t{\n\t\t\tLightweightSemaphore s;\n\t\t\ts.signal(); // Single resource available\n\n\t\t\tauto fnTestSingleAcquire = [&]() {\n\t\t\t\tfor (std::size_t k = 0; k < 200000; ++k) {\n\t\t\t\t\ts.wait(TIMEOUT_US);\n\t\t\t\t\ts.signal();\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tSimpleThread t1(fnTestSingleAcquire);\n\t\t\tSimpleThread t2(fnTestSingleAcquire);\n\n\t\t\tt1.join();\n\t\t\tt2.join();\n\n\t\t\tASSERT_OR_FAIL(s.availableApprox() == 1);\n\t\t}\n\n\t\t// Test resource acquisition from multiple threads\n\t\t{\n\t\t\tconst int THREADS = 4;\n\t\t\tconst std::size_t ITERATIONS = 200000;\n\t\t\tSimpleThread threads[THREADS];\n\t\t\tconst std::size_t arrayItemsToWait[THREADS] = { 1, 2, 3, 7 };\n\t\t\tLightweightSemaphore s;\n\n\t\t\tfor (int i = 0; i != THREADS; ++i)\n\t\t\t\ts.signal(ITERATIONS * arrayItemsToWait[i]);\n\n\t\t\tfor (int i = 0; i != THREADS; ++i) {\n\t\t\t\tthreads[i] = SimpleThread([&](int tid) {\n\t\t\t\t\tfor (std::size_t k = 0; k < ITERATIONS; ++k)\n\t\t\t\t\t\ts.waitMany(arrayItemsToWait[tid], TIMEOUT_US);\n\t\t\t\t}, i);\n\t\t\t}\n\t\t\tfor (int i = 0; i != THREADS; ++i)\n\t\t\t\tthreads[i].join();\n\n\t\t\tASSERT_OR_FAIL(s.availableApprox() == 0);\n\t\t}\n\t\t{\n\t\t\tconst int THREADS = 5;\n\t\t\tconst std::size_t ITERATIONS = 100000;\n\t\t\tSimpleThread threads[THREADS];\n\t\t\tconst std::size_t arrayItemsToWait[THREADS] = { 0, 1, 2, 3, 7 };\n\t\t\tLightweightSemaphore s;\n\n\t\t\tfor (int i = 0; i != THREADS; ++i)\n\t\t\t\ts.signal(ITERATIONS * arrayItemsToWait[i]);\n\n\t\t\tfor (int i = 0; i != THREADS; ++i) {\n\t\t\t\tthreads[i] = SimpleThread([&](int tid) {\n\t\t\t\t\tif (tid == 0) {\n\t\t\t\t\t\tfor (std::size_t k = 0; k < ITERATIONS * (THREADS - 1); ++k)\n\t\t\t\t\t\t\ts.wait(TIMEOUT_US);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tfor (std::size_t k = 0; k < ITERATIONS; ++k) {\n\t\t\t\t\t\t\ts.signal();\n\t\t\t\t\t\t\ts.waitMany(arrayItemsToWait[tid], TIMEOUT_US);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}, i);\n\t\t\t}\n\t\t\tfor (int i = 0; i != THREADS; ++i)\n\t\t\t\tthreads[i].join();\n\n\t\t\tASSERT_OR_FAIL(s.availableApprox() == 0);\n\t\t}\n\n\t\tLightweightSemaphore s;\n\t\tASSERT_OR_FAIL(s.availableApprox() == 0);\n\t\ts.signal();\n\t\tASSERT_OR_FAIL(s.availableApprox() == 1);\n\t\ts.signal();\n\t\tASSERT_OR_FAIL(s.availableApprox() == 2);\n\t\ts.signal(10);\n\t\tASSERT_OR_FAIL(s.availableApprox() == 12);\n\t\ts.signal(10);\n\t\tASSERT_OR_FAIL(s.availableApprox() == 22);\n\n\t\tASSERT_OR_FAIL(s.wait());\n\t\tASSERT_OR_FAIL(s.availableApprox() == 21);\n\t\tASSERT_OR_FAIL(s.wait());\n\t\tASSERT_OR_FAIL(s.availableApprox() == 20);\n\t\tASSERT_OR_FAIL(s.waitMany(10) == 10);\n\t\tASSERT_OR_FAIL(s.availableApprox() == 10);\n\t\tASSERT_OR_FAIL(s.waitMany(11) == 10);\n\t\tASSERT_OR_FAIL(s.availableApprox() == 0);\n\n\t\treturn true;\n\t}\n\n\tbool try_acquire_and_signal()\n\t{\n\t\tLightweightSemaphore s;\n\n\t\tASSERT_OR_FAIL(s.availableApprox() == 0);\n\n\t\ts.signal();\n\t\tASSERT_OR_FAIL(s.availableApprox() == 1);\n\t\tASSERT_OR_FAIL(s.tryWaitMany(2) == 1);\n\t\tASSERT_OR_FAIL(s.availableApprox() == 0);\n\n\t\ts.signal();\n\t\tASSERT_OR_FAIL(s.availableApprox() == 1);\n\t\tASSERT_OR_FAIL(s.tryWaitMany(3) == 1);\n\t\tASSERT_OR_FAIL(s.availableApprox() == 0);\n\n\t\ts.signal(10);\n\t\tASSERT_OR_FAIL(s.availableApprox() == 10);\n\t\tASSERT_OR_FAIL(s.tryWaitMany(100) == 10);\n\t\tASSERT_OR_FAIL(s.availableApprox() == 0);\n\n\t\ts.signal(10);\n\t\tASSERT_OR_FAIL(s.availableApprox() == 10);\n\t\tASSERT_OR_FAIL(s.tryWaitMany(5) == 5);\n\t\tASSERT_OR_FAIL(s.availableApprox() == 5);\n\n\t\tASSERT_OR_FAIL(s.tryWait());\n\t\tASSERT_OR_FAIL(s.availableApprox() == 4);\n\n\t\tASSERT_OR_FAIL(s.tryWait());\n\t\tASSERT_OR_FAIL(s.availableApprox() == 3);\n\n\t\treturn true;\n\t}\n\t\n\tstruct TestListItem : corealgos::ListItem\n\t{\n\t\tint value;\n\t\t\n\t\tTestListItem()\n\t\t\t: value(0)\n\t\t{\n\t\t\tctorCount().fetch_add(1, std::memory_order_relaxed);\n\t\t}\n\t\t\n\t\texplicit TestListItem(int value)\n\t\t\t: value(value)\n\t\t{\n\t\t\tctorCount().fetch_add(1, std::memory_order_relaxed);\n\t\t}\n\t\t\n\t\t~TestListItem()\n\t\t{\n\t\t\tdtorCount().fetch_add(1, std::memory_order_relaxed);\n\t\t}\n\t\t\n\t\tinline TestListItem* prev(std::memory_order order = std::memory_order_relaxed) const\n\t\t{\n\t\t\treturn static_cast<TestListItem*>(concurrentListPrev.load(order));\n\t\t}\n\t\t\n\t\t\n\t\tinline static void reset()\n\t\t{\n\t\t\tctorCount().store(0, std::memory_order_relaxed);\n\t\t\tdtorCount().store(0, std::memory_order_relaxed);\n\t\t}\n\t\t\n\t\tinline static size_t constructed() { return ctorCount().load(std::memory_order_relaxed); }\n\t\tinline static size_t destructed() { return dtorCount().load(std::memory_order_relaxed); }\n\t\t\n\tprivate:\n\t\tinline static std::atomic<size_t>& ctorCount() { static std::atomic<size_t> count(0); return count; }\n\t\tinline static std::atomic<size_t>& dtorCount() { static std::atomic<size_t> count(0); return count; }\n\t};\n\t\n\tbool core_add_only_list()\n\t{\n\t\tauto destroyList = [](corealgos::ConcurrentAddOnlyList<TestListItem>& list) {\n\t\t\tsize_t count = 0;\n\t\t\t\n\t\t\tauto tail = list.tail();\n\t\t\twhile (tail != nullptr) {\n\t\t\t\tauto next = tail->prev();\n\t\t\t\tdelete tail;\n\t\t\t\t++count;\n\t\t\t\ttail = next;\n\t\t\t}\n\t\t\treturn count;\n\t\t};\n\t\t\n\t\t{\n\t\t\tcorealgos::ConcurrentAddOnlyList<TestListItem> list;\n\t\t\tASSERT_OR_FAIL(list.tail() == nullptr);\n\t\t\t\n\t\t\tASSERT_OR_FAIL(destroyList(list) == 0);\n\t\t}\n\t\t\n\t\t{\n\t\t\tcorealgos::ConcurrentAddOnlyList<TestListItem> list;\n\t\t\tfor (int i = 0; i != 1000; ++i) {\n\t\t\t\tlist.add(new TestListItem(i));\n\t\t\t}\n\t\t\tint i = 999;\n\t\t\tfor (auto tail = list.tail(); tail != nullptr; tail = tail->prev()) {\n\t\t\t\tASSERT_OR_FAIL(i == tail->value);\n\t\t\t\t--i;\n\t\t\t}\n\t\t\tASSERT_OR_FAIL(i == -1);\n\t\t\t\n\t\t\tASSERT_OR_FAIL(destroyList(list) == 1000);\n\t\t}\n\t\t\n\t\tfor (int repeats = 0; repeats != 10; ++repeats) {\n\t\t\tcorealgos::ConcurrentAddOnlyList<TestListItem> list;\n\t\t\tstd::vector<SimpleThread> threads(8);\n\t\t\tfor (size_t tid = 0; tid != threads.size(); ++tid) {\n\t\t\t\tthreads[tid] = SimpleThread([&](size_t tid) {\n\t\t\t\t\tfor (int i = 0; i != 1000; ++i) {\n\t\t\t\t\t\tlist.add(new TestListItem((int)((tid << 16) | i)));\n\t\t\t\t\t}\n\t\t\t\t}, tid);\n\t\t\t}\n\t\t\tfor (size_t tid = 0; tid != threads.size(); ++tid) {\n\t\t\t\tthreads[tid].join();\n\t\t\t}\n\t\t\t\n\t\t\tstd::vector<int> prevItems(threads.size());\n\t\t\tfor (size_t i = 0; i != prevItems.size(); ++i) {\n\t\t\t\tprevItems[i] = 1000;\n\t\t\t}\n\t\t\tfor (auto tail = list.tail(); tail != nullptr; tail = tail->prev()) {\n\t\t\t\tauto tid = tail->value >> 16;\n\t\t\t\tauto i = tail->value & ((1 << 16) - 1);\n\t\t\t\tASSERT_OR_FAIL(prevItems[tid] == i + 1);\n\t\t\t\tprevItems[tid] = i;\n\t\t\t}\n\t\t\t\n\t\t\tASSERT_OR_FAIL(destroyList(list) == 1000 * threads.size());\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\t\n\tbool core_thread_local()\n\t{\n\t\tTestListItem::reset();\n\t\t{\n\t\t\tcorealgos::ThreadLocal<TestListItem> local(4);\n\t\t}\n\t\tASSERT_OR_FAIL(TestListItem::constructed() == 0);\n\t\tASSERT_OR_FAIL(TestListItem::destructed() == 0);\n\t\t\n\t\tTestListItem::reset();\n\t\t{\n\t\t\tcorealgos::ThreadLocal<TestListItem> local(4);\n\t\t\tlocal.get_or_create();\n\t\t}\n\t\tASSERT_OR_FAIL(TestListItem::constructed() == 1);\n\t\tASSERT_OR_FAIL(TestListItem::destructed() == 1);\n\t\t\n\t\tTestListItem::reset();\n\t\t{\n\t\t\tcorealgos::ThreadLocal<TestListItem> local(4);\n\t\t\tauto item = local.get_or_create();\n\t\t\titem->value = 7;\n\t\t\titem = local.get_or_create();\n\t\t\tASSERT_OR_FAIL(item->value == 7);\n\t\t}\n\t\tASSERT_OR_FAIL(TestListItem::constructed() == 1);\n\t\tASSERT_OR_FAIL(TestListItem::destructed() == 1);\n\t\t\n\t\t\n\t\tfor (size_t initialSize = 1; initialSize <= 4; initialSize <<= 1) {\n\t\t\tfor (int reps = 0; reps != 20; ++reps) {\n\t\t\t\tTestListItem::reset();\n\t\t\t\t{\n\t\t\t\t\tcorealgos::ThreadLocal<TestListItem> local(initialSize);\n\t\t\t\t\tstd::vector<SimpleThread> threads(5 * initialSize);\n\t\t\t\t\tstd::vector<bool> failed(threads.size());\n\t\t\t\t\tstd::atomic<std::size_t> done(0);\n\t\t\t\t\tfor (size_t tid = 0; tid != threads.size(); ++tid) {\n\t\t\t\t\t\tthreads[tid] = SimpleThread([&](size_t tid) {\n\t\t\t\t\t\t\tfailed[tid] = false;\n\t\t\t\t\t\t\tauto item = local.get_or_create();\n\t\t\t\t\t\t\titem->value = (int)tid;\n\t\t\t\t\t\t\tfor (int i = 0; i != 1024; ++i) {\n\t\t\t\t\t\t\t\titem = local.get_or_create();\n\t\t\t\t\t\t\t\tif (item->value != (int)tid) {\n\t\t\t\t\t\t\t\t\tfailed[tid] = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tdone.fetch_add(1, std::memory_order_seq_cst);\n\t\t\t\t\t\t\twhile (done.load(std::memory_order_relaxed) != threads.size()) {\n\t\t\t\t\t\t\t\tmoodycamel::sleep(1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, tid);\n\t\t\t\t\t}\n\t\t\t\t\tfor (size_t tid = 0; tid != threads.size(); ++tid) {\n\t\t\t\t\t\tthreads[tid].join();\n\t\t\t\t\t\tASSERT_OR_FAIL(!failed[tid]);\n\t\t\t\t\t}\n\t\t\t\t\tASSERT_OR_FAIL(TestListItem::constructed() == 5 * initialSize);\n\t\t\t\t}\n\t\t\t\tASSERT_OR_FAIL(TestListItem::destructed() == 5 * initialSize);\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\t\n\tstruct TestNode : corealgos::FreeListNode<TestNode>\n\t{\n\t\tint value;\n\t\tTestNode() { }\n\t\texplicit TestNode(int value) : value(value) { }\n\t};\n\t\n\tbool core_free_list()\n\t{\n\t\t{\n\t\t\t// Basic\n\t\t\tcorealgos::FreeList<TestNode> freeList;\n\t\t\tASSERT_OR_FAIL(freeList.try_get() == nullptr);\n\t\t\t\n\t\t\tfreeList.add(new TestNode(7));\n\t\t\tTestNode* node = freeList.try_get();\n\t\t\tASSERT_OR_FAIL(node != nullptr);\n\t\t\tASSERT_OR_FAIL(node->value == 7);\n\t\t\tASSERT_OR_FAIL(freeList.try_get() == nullptr);\n\t\t\t\n\t\t\tfreeList.add(node);\n\t\t\tnode = freeList.try_get();\n\t\t\tASSERT_OR_FAIL(node != nullptr);\n\t\t\tASSERT_OR_FAIL(node->value == 7);\n\t\t\tASSERT_OR_FAIL(freeList.try_get() == nullptr);\n\t\t\tdelete node;\n\t\t}\n\t\t\n\t\t{\n\t\t\t// Multi-threaded. Tests ABA too.\n\t\t\tfor (int rep = 0; rep != 10; ++rep) {\n\t\t\t\tcorealgos::FreeList<TestNode> freeList;\n\t\t\t\tstd::vector<SimpleThread> threads(rep < 8 ? 4 : 16);\n\t\t\t\tstd::vector<bool> failed(threads.size());\n\t\t\t\tstd::vector<TestNode> initialNodes(threads.size());\n\t\t\t\tconst int OP_COUNT = 2048;\n\t\t\t\tfor (size_t tid = 0; tid != threads.size(); ++tid) {\n\t\t\t\t\tthreads[tid] = SimpleThread([&](size_t tid) {\n\t\t\t\t\t\tstd::vector<bool> seenValues(threads.size() * OP_COUNT, false);\n\t\t\t\t\t\tfailed[tid] = false;\n\t\t\t\t\t\tTestNode* node = &initialNodes[tid];\n\t\t\t\t\t\tnode->value = ((int)tid << 20) | 1;\n\t\t\t\t\t\tfreeList.add(node);\n\t\t\t\t\t\tfor (int i = 1; i != OP_COUNT - 1; ++i) {\n\t\t\t\t\t\t\tnode = freeList.try_get();\n\t\t\t\t\t\t\tif (node != nullptr) {\n\t\t\t\t\t\t\t\tauto seen = seenValues.begin() + ((node->value >> 20) * OP_COUNT + (node->value & 0xFFFFF));\n\t\t\t\t\t\t\t\tif (*seen) {\n\t\t\t\t\t\t\t\t\tfailed[tid] = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t*seen = true;\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tnode->value = ((int)tid << 20) | (i + 1);\n\t\t\t\t\t\t\t\tfreeList.add(node);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}, tid);\n\t\t\t\t}\n\t\t\t\tfor (size_t tid = 0; tid != threads.size(); ++tid) {\n\t\t\t\t\tthreads[tid].join();\n\t\t\t\t\tASSERT_OR_FAIL(!failed[tid]);\n\t\t\t\t}\n\t\t\t\tfor (size_t tid = 0; tid != threads.size(); ++tid) {\n\t\t\t\t\tauto node = freeList.try_get();\n\t\t\t\t\tASSERT_OR_FAIL(node != nullptr);\n\t\t\t\t\tASSERT_OR_FAIL(node->value != -1);\n\t\t\t\t\tnode->value = -1;\n\t\t\t\t}\n\t\t\t\tauto node = freeList.try_get();\n\t\t\t\tASSERT_OR_FAIL(node == nullptr);\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\t\n\tbool core_spmc_hash()\n\t{\n\t\t{\n\t\t\tfor (int rep = 0; rep != 20; ++rep) {\n\t\t\t\tcorealgos::SPMCSequentialHashMap<int> hash(rep < 10 ? 2 : 4);\n\t\t\t\tstd::vector<SimpleThread> threads(rep < 12 ? 4 : 16);\n\t\t\t\tstd::vector<bool> failed(threads.size());\n\t\t\t\t\n\t\t\t\tconst int MAX_ENTRIES = 4096;\n\t\t\t\tstd::vector<int> values(MAX_ENTRIES);\n\t\t\t\tstd::array<std::atomic<int>, MAX_ENTRIES> useCounts;\n\t\t\t\tstd::array<std::atomic<bool>, MAX_ENTRIES> removed;\n\t\t\t\t\n\t\t\t\tfor (std::size_t i = 0; i != useCounts.size(); ++i) {\n\t\t\t\t\tuseCounts[i].store(0, std::memory_order_relaxed);\n\t\t\t\t\tremoved[i].store(false, std::memory_order_relaxed);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfor (size_t tid = 0; tid != threads.size(); ++tid) {\n\t\t\t\t\tthreads[tid] = SimpleThread([&](size_t tid) {\n\t\t\t\t\t\tfailed[tid] = false;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (tid == 0) {\n\t\t\t\t\t\t\t// Producer thread\n\t\t\t\t\t\t\tfor (int i = 0; i != MAX_ENTRIES; ++i) {\n\t\t\t\t\t\t\t\tvalues[i] = i;\n\t\t\t\t\t\t\t\thash.insert(i, &values[i]);\n\t\t\t\t\t\t\t\tuseCounts[i].store((int)threads.size() / 2, std::memory_order_release);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t// One of the consumer threads\n\t\t\t\t\t\t\tfor (int i = MAX_ENTRIES * 2; i != 0; --i) {\t// Purposefully off-by-lots\n\t\t\t\t\t\t\t\tint useCount = -1;\n\t\t\t\t\t\t\t\tif (i < MAX_ENTRIES) {\n\t\t\t\t\t\t\t\t\tuseCount = useCounts[i].fetch_add(-1, std::memory_order_acquire);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tint* val;\n\t\t\t\t\t\t\t\tif (useCount > 0) {\n\t\t\t\t\t\t\t\t\tval = hash.find(i);\n\t\t\t\t\t\t\t\t\tbool isRemoved = removed[i].load(std::memory_order_relaxed);\n\t\t\t\t\t\t\t\t\tassert(val == nullptr || *val == *val);\t\t// Find segfaults\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t// We read the use count again; if it's still > 0, the item must have been in\n\t\t\t\t\t\t\t\t\t// the hash during the entire call to find(), so we can check its value\n\t\t\t\t\t\t\t\t\tauto currentUseCount = useCounts[i].fetch_add(0, std::memory_order_release);\n\t\t\t\t\t\t\t\t\tif ((currentUseCount > 0 || (currentUseCount == 0 && useCount == 1)) && (val == nullptr || *val != i || isRemoved)) {\n\t\t\t\t\t\t\t\t\t\tfailed[tid] = true;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (useCount == 1) {\n\t\t\t\t\t\t\t\t\tval = hash.remove(i);\n\t\t\t\t\t\t\t\t\tif (val == nullptr || *val != i || removed[i].load(std::memory_order_relaxed)) {\n\t\t\t\t\t\t\t\t\t\tfailed[tid] = true;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tremoved[i].store(true, std::memory_order_release);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}, tid);\n\t\t\t\t}\n\t\t\t\tfor (size_t tid = 0; tid != threads.size(); ++tid) {\n\t\t\t\t\tthreads[tid].join();\n\t\t\t\t\tASSERT_OR_FAIL(!failed[tid]);\n\t\t\t\t}\n\t\t\t\tfor (int i = 0; i != MAX_ENTRIES; ++i) {\n\t\t\t\t\tauto val = hash.find(i);\n\t\t\t\t\tif (val != nullptr) {\n\t\t\t\t\t\tASSERT_OR_FAIL(&values[i] == val && *val == i && !removed[i].load(std::memory_order_relaxed));\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tASSERT_OR_FAIL(removed[i].load(std::memory_order_relaxed));\n\t\t\t\t\t}\n\t\t\t\t\tauto removedVal = hash.remove(i);\n\t\t\t\t\tASSERT_OR_FAIL(removedVal == val);\n\t\t\t\t}\n\t\t\t\tfor (int i = 0; i != MAX_ENTRIES; ++i) {\n\t\t\t\t\tASSERT_OR_FAIL(hash.find(i) == nullptr);\n\t\t\t\t\tASSERT_OR_FAIL(hash.remove(i) == nullptr);\n\t\t\t\t}\n\t\t\t\tASSERT_OR_FAIL(hash.find(MAX_ENTRIES) == nullptr);\n\t\t\t\tASSERT_OR_FAIL(hash.remove(MAX_ENTRIES) == nullptr);\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\t\n\tbool explicit_strings_threaded()\n\t{\n\t\tstd::vector<SimpleThread> threads(8);\n\t\tConcurrentQueue<std::string, MallocTrackingTraits> q(1024 * 1024);\n\t\t\n\t\tfor (size_t tid = 0; tid != threads.size(); ++tid) {\n\t\t\tthreads[tid] = SimpleThread([&](size_t tid) {\n\t\t\t\tconst size_t ITERATIONS = 100 * 1024;\n\t\t\t\tif (tid % 2 == 0) {\n\t\t\t\t\t// Produce\n\t\t\t\t\tProducerToken t(q);\n\t\t\t\t\tfor (size_t i = 0; i != ITERATIONS; ++i) {\n\t\t\t\t\t\tq.enqueue(t, std::string(\"banana\", i % 6));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Consume\n\t\t\t\t\tstd::string item;\n\t\t\t\t\tfor (size_t i = 0; i != ITERATIONS / 2; ++i) {\n\t\t\t\t\t\tq.try_dequeue(item);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, tid);\n\t\t}\n\t\tfor (size_t tid = 0; tid != threads.size(); ++tid) {\n\t\t\tthreads[tid].join();\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\n\tbool large_traits()\n\t{\n\t\tunion Elem { uint32_t x; char dummy[156]; };\n\n\t\tConcurrentQueue<Elem, LargeTraits> q(10000, 0, 48);\n\t\tstd::vector<SimpleThread> threads(48);\n\t\tfor (size_t tid = 0; tid != threads.size(); ++tid) {\n\t\t\tthreads[tid] = SimpleThread([&](size_t tid) {\n\t\t\t\tconst size_t ELEMENTS = 5000;\n\t\t\t\tif (tid != 0) {\n\t\t\t\t\t// Produce\n\t\t\t\t\tfor (uint32_t i = 0; i != ELEMENTS; ++i)\n\t\t\t\t\t\tq.try_enqueue(Elem { ((uint32_t)tid << 16) | i });\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Consume\n\t\t\t\t\tElem item[256];\n\t\t\t\t\tfor (size_t i = 0; i != ELEMENTS * 200; ++i)\n\t\t\t\t\t\tq.try_dequeue_bulk(item, sizeof(item) / sizeof(item[0]));\n\t\t\t\t}\n\t\t\t}, tid);\n\t\t}\n\t\tfor (size_t tid = 0; tid != threads.size(); ++tid) {\n\t\t\tthreads[tid].join();\n\t\t}\n\n\t\treturn true;\n\t}\n};\n\n}\n\n\nvoid printTests(ConcurrentQueueTests const& tests)\n{\n\tstd::printf(\"   Supported tests are:\\n\");\n\t\n\tstd::vector<std::string> names;\n\ttests.getAllTestNames(names);\n\tfor (auto it = names.cbegin(); it != names.cend(); ++it) {\n\t\tstd::printf(\"      %s\\n\", it->c_str());\n\t}\n}\n\n\n// Basic test harness\n#if !defined(TARGET_OS_IPHONE)\nint main(int argc, char** argv)\n{\n\tbool disablePrompt = false;\n\tunsigned int iterations = 8;\n\tstd::vector<std::string> selectedTests;\n\t\n\t// Disable buffering (so that when run in, e.g., Sublime Text, the output appears as it is written)\n\tstd::setvbuf(stdout, nullptr, _IONBF, 0);\n\t\n\t// Isolate the executable name\n\tstd::string progName = argv[0];\n\tauto slash = progName.find_last_of(\"/\\\\\");\n\tif (slash != std::string::npos) {\n\t\tprogName = progName.substr(slash + 1);\n\t}\n\t\n\tConcurrentQueueTests tests;\n\t\n\t// Parse command line options\n\tif (argc > 1) {\n\t\tbool printHelp = false;\n\t\tbool printedTests = false;\n\t\tbool error = false;\n\t\tfor (int i = 1; i < argc; ++i) {\n\t\t\tif (std::strcmp(argv[i], \"--help\") == 0) {\n\t\t\t\tprintHelp = true;\n\t\t\t}\n\t\t\telse if (std::strcmp(argv[i], \"--disable-prompt\") == 0) {\n\t\t\t\tdisablePrompt = true;\n\t\t\t}\n\t\t\telse if (std::strcmp(argv[i], \"--run\") == 0) {\n\t\t\t\tif (i + 1 == argc || argv[i + 1][0] == '-') {\n\t\t\t\t\tstd::printf(\"Expected test name argument for --run option.\\n\");\n\t\t\t\t\tif (!printedTests) {\n\t\t\t\t\t\tprintTests(tests);\n\t\t\t\t\t\tprintedTests = true;\n\t\t\t\t\t}\n\t\t\t\t\terror = true;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (!tests.validateTestName(argv[++i])) {\n\t\t\t\t\tstd::printf(\"Unrecognized test '%s'.\\n\", argv[i]);\n\t\t\t\t\tif (!printedTests) {\n\t\t\t\t\t\tprintTests(tests);\n\t\t\t\t\t\tprintedTests = true;\n\t\t\t\t\t}\n\t\t\t\t\terror = true;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tselectedTests.push_back(argv[i]);\n\t\t\t}\n\t\t\telse if (std::strcmp(argv[i], \"--iterations\") == 0) {\n\t\t\t\tif (i + 1 == argc || argv[i + 1][0] == '-') {\n\t\t\t\t\tstd::printf(\"Expected iteration count argument for --iterations option.\\n\");\n\t\t\t\t\terror = true;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\titerations = static_cast<unsigned int>(std::atoi(argv[++i]));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tstd::printf(\"Unrecognized option '%s'.\\n\", argv[i]);\n\t\t\t\terror = true;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (error || printHelp) {\n\t\t\tif (error) {\n\t\t\t\tstd::printf(\"\\n\");\n\t\t\t}\n\t\t\tstd::printf(\"%s\\n    Description: Runs unit tests for moodycamel::ConcurrentQueue\\n\", progName.c_str());\n\t\t\tstd::printf(\"    --help            Prints this help blurb\\n\");\n\t\t\tstd::printf(\"    --run test        Runs only the specified test(s)\\n\");\n\t\t\tstd::printf(\"    --iterations N    Do N iterations of each test\\n\");\n\t\t\tstd::printf(\"    --disable-prompt  Disables prompt before exit when the tests finish\\n\");\n\t\t\treturn error ? -1 : 0;\n\t\t}\n\t}\n\t\n\tint exitCode = 0;\n\t\n\tbool result;\n\tif (selectedTests.size() > 0) {\n\t\tstd::printf(\"Running %d iteration%s of selected unit test%s for moodycamel::ConcurrentQueue.\\n\\n\", iterations, iterations == 1 ? \"\" : \"s\", selectedTests.size() == 1 ? \"\" : \"s\");\n\t\tresult = tests.run(selectedTests, iterations);\n\t}\n\telse {\n\t\tstd::printf(\"Running %d iteration%s of all unit tests for moodycamel::ConcurrentQueue.\\n(Run %s --help for other options.)\\n\\n\", iterations, iterations == 1 ? \"\" : \"s\", progName.c_str());\n\t\tresult = tests.run(iterations);\n\t}\n\t\n\tif (result) {\n\t\tstd::printf(\"All %stests passed.\\n\", (selectedTests.size() > 0 ? \"selected \" : \"\"));\n\t}\n\telse {\n\t\tstd::printf(\"Test(s) failed!\\n\");\n\t\texitCode = 2;\n\t}\n\t\n\tif (!disablePrompt) {\n\t\tstd::printf(\"Press ENTER to exit.\\n\");\n\t\tgetchar();\n\t}\n\treturn exitCode;\n}\n#else\n// Provide entry function that can be invoked\n// by a test host (iOS app / test runner)\nbool runAllTests() {\n  unsigned int iterations = 8;\n  ConcurrentQueueTests tests;\n  return tests.run(iterations);\n}\n#endif // !defined(TARGET_OS_IPHONE)\n"
  }
]